crypto-message 1.1.16

Unified data structures for all cryptocurrency exchanges.
Documentation
// This file is generated by rust-protobuf 3.2.0. Do not edit
// .proto file is parsed by protoc --rust-out=...
// @generated

// https://github.com/rust-lang/rust-clippy/issues/702
#![allow(unknown_lints)]
#![allow(clippy::all)]

#![allow(unused_attributes)]
#![cfg_attr(rustfmt, rustfmt::skip)]

#![allow(box_pointers)]
#![allow(dead_code)]
#![allow(missing_docs)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
#![allow(trivial_casts)]
#![allow(unused_results)]
#![allow(unused_mut)]

//! Generated file from `message.proto`

/// Generated files are compatible only with the same version
/// of protobuf runtime.
const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_3_2_0;

///  Tick-by-tick trade message.
#[derive(PartialEq,Clone,Default,Debug)]
// @@protoc_insertion_point(message:crypto_crawler.Trade)
pub struct Trade {
    // message fields
    // @@protoc_insertion_point(field:crypto_crawler.Trade.timestamp)
    pub timestamp: ::protobuf::MessageField<::protobuf::well_known_types::timestamp::Timestamp>,
    ///  Which side is taker? True, seller is taker; False, buyer is taker
    // @@protoc_insertion_point(field:crypto_crawler.Trade.side)
    pub side: bool,
    // @@protoc_insertion_point(field:crypto_crawler.Trade.price)
    pub price: f32,
    ///  Number of base coins, 0 means delete
    // @@protoc_insertion_point(field:crypto_crawler.Trade.quantity_base)
    pub quantity_base: f32,
    ///  Number of quote coins, 0 means delete
    // @@protoc_insertion_point(field:crypto_crawler.Trade.quantity_quote)
    pub quantity_quote: f32,
    ///  Number of contracts, empty for spot markets
    // @@protoc_insertion_point(field:crypto_crawler.Trade.quantity_contract)
    pub quantity_contract: ::std::option::Option<f32>,
    // special fields
    // @@protoc_insertion_point(special_field:crypto_crawler.Trade.special_fields)
    pub special_fields: ::protobuf::SpecialFields,
}

impl<'a> ::std::default::Default for &'a Trade {
    fn default() -> &'a Trade {
        <Trade as ::protobuf::Message>::default_instance()
    }
}

impl Trade {
    pub fn new() -> Trade {
        ::std::default::Default::default()
    }

    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
        let mut fields = ::std::vec::Vec::with_capacity(6);
        let mut oneofs = ::std::vec::Vec::with_capacity(0);
        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ::protobuf::well_known_types::timestamp::Timestamp>(
            "timestamp",
            |m: &Trade| { &m.timestamp },
            |m: &mut Trade| { &mut m.timestamp },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "side",
            |m: &Trade| { &m.side },
            |m: &mut Trade| { &mut m.side },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "price",
            |m: &Trade| { &m.price },
            |m: &mut Trade| { &mut m.price },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "quantity_base",
            |m: &Trade| { &m.quantity_base },
            |m: &mut Trade| { &mut m.quantity_base },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "quantity_quote",
            |m: &Trade| { &m.quantity_quote },
            |m: &mut Trade| { &mut m.quantity_quote },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "quantity_contract",
            |m: &Trade| { &m.quantity_contract },
            |m: &mut Trade| { &mut m.quantity_contract },
        ));
        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Trade>(
            "Trade",
            fields,
            oneofs,
        )
    }
}

impl ::protobuf::Message for Trade {
    const NAME: &'static str = "Trade";

    fn is_initialized(&self) -> bool {
        true
    }

    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
        while let Some(tag) = is.read_raw_tag_or_eof()? {
            match tag {
                10 => {
                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.timestamp)?;
                },
                16 => {
                    self.side = is.read_bool()?;
                },
                29 => {
                    self.price = is.read_float()?;
                },
                37 => {
                    self.quantity_base = is.read_float()?;
                },
                45 => {
                    self.quantity_quote = is.read_float()?;
                },
                53 => {
                    self.quantity_contract = ::std::option::Option::Some(is.read_float()?);
                },
                tag => {
                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                },
            };
        }
        ::std::result::Result::Ok(())
    }

    // Compute sizes of nested messages
    #[allow(unused_variables)]
    fn compute_size(&self) -> u64 {
        let mut my_size = 0;
        if let Some(v) = self.timestamp.as_ref() {
            let len = v.compute_size();
            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
        }
        if self.side != false {
            my_size += 1 + 1;
        }
        if self.price != 0. {
            my_size += 1 + 4;
        }
        if self.quantity_base != 0. {
            my_size += 1 + 4;
        }
        if self.quantity_quote != 0. {
            my_size += 1 + 4;
        }
        if let Some(v) = self.quantity_contract {
            my_size += 1 + 4;
        }
        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
        self.special_fields.cached_size().set(my_size as u32);
        my_size
    }

    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
        if let Some(v) = self.timestamp.as_ref() {
            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
        }
        if self.side != false {
            os.write_bool(2, self.side)?;
        }
        if self.price != 0. {
            os.write_float(3, self.price)?;
        }
        if self.quantity_base != 0. {
            os.write_float(4, self.quantity_base)?;
        }
        if self.quantity_quote != 0. {
            os.write_float(5, self.quantity_quote)?;
        }
        if let Some(v) = self.quantity_contract {
            os.write_float(6, v)?;
        }
        os.write_unknown_fields(self.special_fields.unknown_fields())?;
        ::std::result::Result::Ok(())
    }

    fn special_fields(&self) -> &::protobuf::SpecialFields {
        &self.special_fields
    }

    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
        &mut self.special_fields
    }

    fn new() -> Trade {
        Trade::new()
    }

    fn clear(&mut self) {
        self.timestamp.clear();
        self.side = false;
        self.price = 0.;
        self.quantity_base = 0.;
        self.quantity_quote = 0.;
        self.quantity_contract = ::std::option::Option::None;
        self.special_fields.clear();
    }

    fn default_instance() -> &'static Trade {
        static instance: Trade = Trade {
            timestamp: ::protobuf::MessageField::none(),
            side: false,
            price: 0.,
            quantity_base: 0.,
            quantity_quote: 0.,
            quantity_contract: ::std::option::Option::None,
            special_fields: ::protobuf::SpecialFields::new(),
        };
        &instance
    }
}

impl ::protobuf::MessageFull for Trade {
    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
        descriptor.get(|| file_descriptor().message_by_package_relative_name("Trade").unwrap()).clone()
    }
}

impl ::std::fmt::Display for Trade {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        ::protobuf::text_format::fmt(self, f)
    }
}

impl ::protobuf::reflect::ProtobufValue for Trade {
    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}

///  Level2 orderbook.
#[derive(PartialEq,Clone,Default,Debug)]
// @@protoc_insertion_point(message:crypto_crawler.Orderbook)
pub struct Orderbook {
    // message fields
    // @@protoc_insertion_point(field:crypto_crawler.Orderbook.timestamp)
    pub timestamp: ::protobuf::MessageField<::protobuf::well_known_types::timestamp::Timestamp>,
    ///  snapshot or updates
    // @@protoc_insertion_point(field:crypto_crawler.Orderbook.snapshot)
    pub snapshot: bool,
    ///  sorted in ascending order by price if snapshot=true, otherwise not sorted
    // @@protoc_insertion_point(field:crypto_crawler.Orderbook.asks)
    pub asks: ::std::vec::Vec<orderbook::Order>,
    ///  sorted in descending order by price if snapshot=true, otherwise not sorted
    // @@protoc_insertion_point(field:crypto_crawler.Orderbook.bids)
    pub bids: ::std::vec::Vec<orderbook::Order>,
    // special fields
    // @@protoc_insertion_point(special_field:crypto_crawler.Orderbook.special_fields)
    pub special_fields: ::protobuf::SpecialFields,
}

impl<'a> ::std::default::Default for &'a Orderbook {
    fn default() -> &'a Orderbook {
        <Orderbook as ::protobuf::Message>::default_instance()
    }
}

impl Orderbook {
    pub fn new() -> Orderbook {
        ::std::default::Default::default()
    }

    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
        let mut fields = ::std::vec::Vec::with_capacity(4);
        let mut oneofs = ::std::vec::Vec::with_capacity(0);
        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ::protobuf::well_known_types::timestamp::Timestamp>(
            "timestamp",
            |m: &Orderbook| { &m.timestamp },
            |m: &mut Orderbook| { &mut m.timestamp },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "snapshot",
            |m: &Orderbook| { &m.snapshot },
            |m: &mut Orderbook| { &mut m.snapshot },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
            "asks",
            |m: &Orderbook| { &m.asks },
            |m: &mut Orderbook| { &mut m.asks },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_vec_simpler_accessor::<_, _>(
            "bids",
            |m: &Orderbook| { &m.bids },
            |m: &mut Orderbook| { &mut m.bids },
        ));
        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Orderbook>(
            "Orderbook",
            fields,
            oneofs,
        )
    }
}

impl ::protobuf::Message for Orderbook {
    const NAME: &'static str = "Orderbook";

    fn is_initialized(&self) -> bool {
        true
    }

    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
        while let Some(tag) = is.read_raw_tag_or_eof()? {
            match tag {
                10 => {
                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.timestamp)?;
                },
                16 => {
                    self.snapshot = is.read_bool()?;
                },
                26 => {
                    self.asks.push(is.read_message()?);
                },
                34 => {
                    self.bids.push(is.read_message()?);
                },
                tag => {
                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                },
            };
        }
        ::std::result::Result::Ok(())
    }

    // Compute sizes of nested messages
    #[allow(unused_variables)]
    fn compute_size(&self) -> u64 {
        let mut my_size = 0;
        if let Some(v) = self.timestamp.as_ref() {
            let len = v.compute_size();
            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
        }
        if self.snapshot != false {
            my_size += 1 + 1;
        }
        for value in &self.asks {
            let len = value.compute_size();
            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
        };
        for value in &self.bids {
            let len = value.compute_size();
            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
        };
        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
        self.special_fields.cached_size().set(my_size as u32);
        my_size
    }

    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
        if let Some(v) = self.timestamp.as_ref() {
            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
        }
        if self.snapshot != false {
            os.write_bool(2, self.snapshot)?;
        }
        for v in &self.asks {
            ::protobuf::rt::write_message_field_with_cached_size(3, v, os)?;
        };
        for v in &self.bids {
            ::protobuf::rt::write_message_field_with_cached_size(4, v, os)?;
        };
        os.write_unknown_fields(self.special_fields.unknown_fields())?;
        ::std::result::Result::Ok(())
    }

    fn special_fields(&self) -> &::protobuf::SpecialFields {
        &self.special_fields
    }

    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
        &mut self.special_fields
    }

    fn new() -> Orderbook {
        Orderbook::new()
    }

    fn clear(&mut self) {
        self.timestamp.clear();
        self.snapshot = false;
        self.asks.clear();
        self.bids.clear();
        self.special_fields.clear();
    }

    fn default_instance() -> &'static Orderbook {
        static instance: Orderbook = Orderbook {
            timestamp: ::protobuf::MessageField::none(),
            snapshot: false,
            asks: ::std::vec::Vec::new(),
            bids: ::std::vec::Vec::new(),
            special_fields: ::protobuf::SpecialFields::new(),
        };
        &instance
    }
}

impl ::protobuf::MessageFull for Orderbook {
    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
        descriptor.get(|| file_descriptor().message_by_package_relative_name("Orderbook").unwrap()).clone()
    }
}

impl ::std::fmt::Display for Orderbook {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        ::protobuf::text_format::fmt(self, f)
    }
}

impl ::protobuf::reflect::ProtobufValue for Orderbook {
    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}

/// Nested message and enums of message `Orderbook`
pub mod orderbook {
    #[derive(PartialEq,Clone,Default,Debug)]
    // @@protoc_insertion_point(message:crypto_crawler.Orderbook.Order)
    pub struct Order {
        // message fields
        // @@protoc_insertion_point(field:crypto_crawler.Orderbook.Order.price)
        pub price: f32,
        ///  Number of base coins, 0 means delete
        // @@protoc_insertion_point(field:crypto_crawler.Orderbook.Order.quantity_base)
        pub quantity_base: f32,
        ///  Number of quote coins, 0 means delete
        // @@protoc_insertion_point(field:crypto_crawler.Orderbook.Order.quantity_quote)
        pub quantity_quote: f32,
        ///  Number of contracts, empty for spot markets
        // @@protoc_insertion_point(field:crypto_crawler.Orderbook.Order.quantity_contract)
        pub quantity_contract: ::std::option::Option<f32>,
        // special fields
        // @@protoc_insertion_point(special_field:crypto_crawler.Orderbook.Order.special_fields)
        pub special_fields: ::protobuf::SpecialFields,
    }

    impl<'a> ::std::default::Default for &'a Order {
        fn default() -> &'a Order {
            <Order as ::protobuf::Message>::default_instance()
        }
    }

    impl Order {
        pub fn new() -> Order {
            ::std::default::Default::default()
        }

        pub(in super) fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
            let mut fields = ::std::vec::Vec::with_capacity(4);
            let mut oneofs = ::std::vec::Vec::with_capacity(0);
            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
                "price",
                |m: &Order| { &m.price },
                |m: &mut Order| { &mut m.price },
            ));
            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
                "quantity_base",
                |m: &Order| { &m.quantity_base },
                |m: &mut Order| { &mut m.quantity_base },
            ));
            fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
                "quantity_quote",
                |m: &Order| { &m.quantity_quote },
                |m: &mut Order| { &mut m.quantity_quote },
            ));
            fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
                "quantity_contract",
                |m: &Order| { &m.quantity_contract },
                |m: &mut Order| { &mut m.quantity_contract },
            ));
            ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Order>(
                "Orderbook.Order",
                fields,
                oneofs,
            )
        }
    }

    impl ::protobuf::Message for Order {
        const NAME: &'static str = "Order";

        fn is_initialized(&self) -> bool {
            true
        }

        fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
            while let Some(tag) = is.read_raw_tag_or_eof()? {
                match tag {
                    13 => {
                        self.price = is.read_float()?;
                    },
                    21 => {
                        self.quantity_base = is.read_float()?;
                    },
                    29 => {
                        self.quantity_quote = is.read_float()?;
                    },
                    37 => {
                        self.quantity_contract = ::std::option::Option::Some(is.read_float()?);
                    },
                    tag => {
                        ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                    },
                };
            }
            ::std::result::Result::Ok(())
        }

        // Compute sizes of nested messages
        #[allow(unused_variables)]
        fn compute_size(&self) -> u64 {
            let mut my_size = 0;
            if self.price != 0. {
                my_size += 1 + 4;
            }
            if self.quantity_base != 0. {
                my_size += 1 + 4;
            }
            if self.quantity_quote != 0. {
                my_size += 1 + 4;
            }
            if let Some(v) = self.quantity_contract {
                my_size += 1 + 4;
            }
            my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
            self.special_fields.cached_size().set(my_size as u32);
            my_size
        }

        fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
            if self.price != 0. {
                os.write_float(1, self.price)?;
            }
            if self.quantity_base != 0. {
                os.write_float(2, self.quantity_base)?;
            }
            if self.quantity_quote != 0. {
                os.write_float(3, self.quantity_quote)?;
            }
            if let Some(v) = self.quantity_contract {
                os.write_float(4, v)?;
            }
            os.write_unknown_fields(self.special_fields.unknown_fields())?;
            ::std::result::Result::Ok(())
        }

        fn special_fields(&self) -> &::protobuf::SpecialFields {
            &self.special_fields
        }

        fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
            &mut self.special_fields
        }

        fn new() -> Order {
            Order::new()
        }

        fn clear(&mut self) {
            self.price = 0.;
            self.quantity_base = 0.;
            self.quantity_quote = 0.;
            self.quantity_contract = ::std::option::Option::None;
            self.special_fields.clear();
        }

        fn default_instance() -> &'static Order {
            static instance: Order = Order {
                price: 0.,
                quantity_base: 0.,
                quantity_quote: 0.,
                quantity_contract: ::std::option::Option::None,
                special_fields: ::protobuf::SpecialFields::new(),
            };
            &instance
        }
    }

    impl ::protobuf::MessageFull for Order {
        fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
            static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
            descriptor.get(|| super::file_descriptor().message_by_package_relative_name("Orderbook.Order").unwrap()).clone()
        }
    }

    impl ::std::fmt::Display for Order {
        fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
            ::protobuf::text_format::fmt(self, f)
        }
    }

    impl ::protobuf::reflect::ProtobufValue for Order {
        type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
    }
}

///  Best bid and offer.
#[derive(PartialEq,Clone,Default,Debug)]
// @@protoc_insertion_point(message:crypto_crawler.Bbo)
pub struct Bbo {
    // message fields
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.timestamp)
    pub timestamp: ::protobuf::MessageField<::protobuf::well_known_types::timestamp::Timestamp>,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.bid_price)
    pub bid_price: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.bid_quantity_base)
    pub bid_quantity_base: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.bid_quantity_quote)
    pub bid_quantity_quote: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.bid_quantity_contract)
    pub bid_quantity_contract: ::std::option::Option<f32>,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.ask_price)
    pub ask_price: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.ask_quantity_base)
    pub ask_quantity_base: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.ask_quantity_quote)
    pub ask_quantity_quote: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Bbo.ask_quantity_contract)
    pub ask_quantity_contract: ::std::option::Option<f32>,
    // special fields
    // @@protoc_insertion_point(special_field:crypto_crawler.Bbo.special_fields)
    pub special_fields: ::protobuf::SpecialFields,
}

impl<'a> ::std::default::Default for &'a Bbo {
    fn default() -> &'a Bbo {
        <Bbo as ::protobuf::Message>::default_instance()
    }
}

impl Bbo {
    pub fn new() -> Bbo {
        ::std::default::Default::default()
    }

    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
        let mut fields = ::std::vec::Vec::with_capacity(9);
        let mut oneofs = ::std::vec::Vec::with_capacity(0);
        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ::protobuf::well_known_types::timestamp::Timestamp>(
            "timestamp",
            |m: &Bbo| { &m.timestamp },
            |m: &mut Bbo| { &mut m.timestamp },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "bid_price",
            |m: &Bbo| { &m.bid_price },
            |m: &mut Bbo| { &mut m.bid_price },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "bid_quantity_base",
            |m: &Bbo| { &m.bid_quantity_base },
            |m: &mut Bbo| { &mut m.bid_quantity_base },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "bid_quantity_quote",
            |m: &Bbo| { &m.bid_quantity_quote },
            |m: &mut Bbo| { &mut m.bid_quantity_quote },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "bid_quantity_contract",
            |m: &Bbo| { &m.bid_quantity_contract },
            |m: &mut Bbo| { &mut m.bid_quantity_contract },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "ask_price",
            |m: &Bbo| { &m.ask_price },
            |m: &mut Bbo| { &mut m.ask_price },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "ask_quantity_base",
            |m: &Bbo| { &m.ask_quantity_base },
            |m: &mut Bbo| { &mut m.ask_quantity_base },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "ask_quantity_quote",
            |m: &Bbo| { &m.ask_quantity_quote },
            |m: &mut Bbo| { &mut m.ask_quantity_quote },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "ask_quantity_contract",
            |m: &Bbo| { &m.ask_quantity_contract },
            |m: &mut Bbo| { &mut m.ask_quantity_contract },
        ));
        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Bbo>(
            "Bbo",
            fields,
            oneofs,
        )
    }
}

impl ::protobuf::Message for Bbo {
    const NAME: &'static str = "Bbo";

    fn is_initialized(&self) -> bool {
        true
    }

    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
        while let Some(tag) = is.read_raw_tag_or_eof()? {
            match tag {
                10 => {
                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.timestamp)?;
                },
                21 => {
                    self.bid_price = is.read_float()?;
                },
                29 => {
                    self.bid_quantity_base = is.read_float()?;
                },
                37 => {
                    self.bid_quantity_quote = is.read_float()?;
                },
                45 => {
                    self.bid_quantity_contract = ::std::option::Option::Some(is.read_float()?);
                },
                53 => {
                    self.ask_price = is.read_float()?;
                },
                61 => {
                    self.ask_quantity_base = is.read_float()?;
                },
                69 => {
                    self.ask_quantity_quote = is.read_float()?;
                },
                77 => {
                    self.ask_quantity_contract = ::std::option::Option::Some(is.read_float()?);
                },
                tag => {
                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                },
            };
        }
        ::std::result::Result::Ok(())
    }

    // Compute sizes of nested messages
    #[allow(unused_variables)]
    fn compute_size(&self) -> u64 {
        let mut my_size = 0;
        if let Some(v) = self.timestamp.as_ref() {
            let len = v.compute_size();
            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
        }
        if self.bid_price != 0. {
            my_size += 1 + 4;
        }
        if self.bid_quantity_base != 0. {
            my_size += 1 + 4;
        }
        if self.bid_quantity_quote != 0. {
            my_size += 1 + 4;
        }
        if let Some(v) = self.bid_quantity_contract {
            my_size += 1 + 4;
        }
        if self.ask_price != 0. {
            my_size += 1 + 4;
        }
        if self.ask_quantity_base != 0. {
            my_size += 1 + 4;
        }
        if self.ask_quantity_quote != 0. {
            my_size += 1 + 4;
        }
        if let Some(v) = self.ask_quantity_contract {
            my_size += 1 + 4;
        }
        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
        self.special_fields.cached_size().set(my_size as u32);
        my_size
    }

    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
        if let Some(v) = self.timestamp.as_ref() {
            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
        }
        if self.bid_price != 0. {
            os.write_float(2, self.bid_price)?;
        }
        if self.bid_quantity_base != 0. {
            os.write_float(3, self.bid_quantity_base)?;
        }
        if self.bid_quantity_quote != 0. {
            os.write_float(4, self.bid_quantity_quote)?;
        }
        if let Some(v) = self.bid_quantity_contract {
            os.write_float(5, v)?;
        }
        if self.ask_price != 0. {
            os.write_float(6, self.ask_price)?;
        }
        if self.ask_quantity_base != 0. {
            os.write_float(7, self.ask_quantity_base)?;
        }
        if self.ask_quantity_quote != 0. {
            os.write_float(8, self.ask_quantity_quote)?;
        }
        if let Some(v) = self.ask_quantity_contract {
            os.write_float(9, v)?;
        }
        os.write_unknown_fields(self.special_fields.unknown_fields())?;
        ::std::result::Result::Ok(())
    }

    fn special_fields(&self) -> &::protobuf::SpecialFields {
        &self.special_fields
    }

    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
        &mut self.special_fields
    }

    fn new() -> Bbo {
        Bbo::new()
    }

    fn clear(&mut self) {
        self.timestamp.clear();
        self.bid_price = 0.;
        self.bid_quantity_base = 0.;
        self.bid_quantity_quote = 0.;
        self.bid_quantity_contract = ::std::option::Option::None;
        self.ask_price = 0.;
        self.ask_quantity_base = 0.;
        self.ask_quantity_quote = 0.;
        self.ask_quantity_contract = ::std::option::Option::None;
        self.special_fields.clear();
    }

    fn default_instance() -> &'static Bbo {
        static instance: Bbo = Bbo {
            timestamp: ::protobuf::MessageField::none(),
            bid_price: 0.,
            bid_quantity_base: 0.,
            bid_quantity_quote: 0.,
            bid_quantity_contract: ::std::option::Option::None,
            ask_price: 0.,
            ask_quantity_base: 0.,
            ask_quantity_quote: 0.,
            ask_quantity_contract: ::std::option::Option::None,
            special_fields: ::protobuf::SpecialFields::new(),
        };
        &instance
    }
}

impl ::protobuf::MessageFull for Bbo {
    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
        descriptor.get(|| file_descriptor().message_by_package_relative_name("Bbo").unwrap()).clone()
    }
}

impl ::std::fmt::Display for Bbo {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        ::protobuf::text_format::fmt(self, f)
    }
}

impl ::protobuf::reflect::ProtobufValue for Bbo {
    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}

///  24hr rolling window ticker.
#[derive(PartialEq,Clone,Default,Debug)]
// @@protoc_insertion_point(message:crypto_crawler.Ticker)
pub struct Ticker {
    // message fields
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.timestamp)
    pub timestamp: ::protobuf::MessageField<::protobuf::well_known_types::timestamp::Timestamp>,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.open)
    pub open: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.high)
    pub high: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.low)
    pub low: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.close)
    pub close: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.volume)
    pub volume: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.quote_volume)
    pub quote_volume: f32,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.last_quantity)
    pub last_quantity: ::std::option::Option<f32>,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.best_bid_price)
    pub best_bid_price: ::std::option::Option<f32>,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.best_bid_quantity)
    pub best_bid_quantity: ::std::option::Option<f32>,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.best_ask_price)
    pub best_ask_price: ::std::option::Option<f32>,
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.best_ask_quantity)
    pub best_ask_quantity: ::std::option::Option<f32>,
    ///  availale in Futures and Swap markets
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.open_interest)
    pub open_interest: ::std::option::Option<f32>,
    ///  availale in Futures and Swap markets
    // @@protoc_insertion_point(field:crypto_crawler.Ticker.open_interest_quote)
    pub open_interest_quote: ::std::option::Option<f32>,
    // special fields
    // @@protoc_insertion_point(special_field:crypto_crawler.Ticker.special_fields)
    pub special_fields: ::protobuf::SpecialFields,
}

impl<'a> ::std::default::Default for &'a Ticker {
    fn default() -> &'a Ticker {
        <Ticker as ::protobuf::Message>::default_instance()
    }
}

impl Ticker {
    pub fn new() -> Ticker {
        ::std::default::Default::default()
    }

    fn generated_message_descriptor_data() -> ::protobuf::reflect::GeneratedMessageDescriptorData {
        let mut fields = ::std::vec::Vec::with_capacity(14);
        let mut oneofs = ::std::vec::Vec::with_capacity(0);
        fields.push(::protobuf::reflect::rt::v2::make_message_field_accessor::<_, ::protobuf::well_known_types::timestamp::Timestamp>(
            "timestamp",
            |m: &Ticker| { &m.timestamp },
            |m: &mut Ticker| { &mut m.timestamp },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "open",
            |m: &Ticker| { &m.open },
            |m: &mut Ticker| { &mut m.open },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "high",
            |m: &Ticker| { &m.high },
            |m: &mut Ticker| { &mut m.high },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "low",
            |m: &Ticker| { &m.low },
            |m: &mut Ticker| { &mut m.low },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "close",
            |m: &Ticker| { &m.close },
            |m: &mut Ticker| { &mut m.close },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "volume",
            |m: &Ticker| { &m.volume },
            |m: &mut Ticker| { &mut m.volume },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_simpler_field_accessor::<_, _>(
            "quote_volume",
            |m: &Ticker| { &m.quote_volume },
            |m: &mut Ticker| { &mut m.quote_volume },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "last_quantity",
            |m: &Ticker| { &m.last_quantity },
            |m: &mut Ticker| { &mut m.last_quantity },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "best_bid_price",
            |m: &Ticker| { &m.best_bid_price },
            |m: &mut Ticker| { &mut m.best_bid_price },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "best_bid_quantity",
            |m: &Ticker| { &m.best_bid_quantity },
            |m: &mut Ticker| { &mut m.best_bid_quantity },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "best_ask_price",
            |m: &Ticker| { &m.best_ask_price },
            |m: &mut Ticker| { &mut m.best_ask_price },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "best_ask_quantity",
            |m: &Ticker| { &m.best_ask_quantity },
            |m: &mut Ticker| { &mut m.best_ask_quantity },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "open_interest",
            |m: &Ticker| { &m.open_interest },
            |m: &mut Ticker| { &mut m.open_interest },
        ));
        fields.push(::protobuf::reflect::rt::v2::make_option_accessor::<_, _>(
            "open_interest_quote",
            |m: &Ticker| { &m.open_interest_quote },
            |m: &mut Ticker| { &mut m.open_interest_quote },
        ));
        ::protobuf::reflect::GeneratedMessageDescriptorData::new_2::<Ticker>(
            "Ticker",
            fields,
            oneofs,
        )
    }
}

impl ::protobuf::Message for Ticker {
    const NAME: &'static str = "Ticker";

    fn is_initialized(&self) -> bool {
        true
    }

    fn merge_from(&mut self, is: &mut ::protobuf::CodedInputStream<'_>) -> ::protobuf::Result<()> {
        while let Some(tag) = is.read_raw_tag_or_eof()? {
            match tag {
                10 => {
                    ::protobuf::rt::read_singular_message_into_field(is, &mut self.timestamp)?;
                },
                21 => {
                    self.open = is.read_float()?;
                },
                29 => {
                    self.high = is.read_float()?;
                },
                37 => {
                    self.low = is.read_float()?;
                },
                45 => {
                    self.close = is.read_float()?;
                },
                53 => {
                    self.volume = is.read_float()?;
                },
                61 => {
                    self.quote_volume = is.read_float()?;
                },
                69 => {
                    self.last_quantity = ::std::option::Option::Some(is.read_float()?);
                },
                77 => {
                    self.best_bid_price = ::std::option::Option::Some(is.read_float()?);
                },
                85 => {
                    self.best_bid_quantity = ::std::option::Option::Some(is.read_float()?);
                },
                93 => {
                    self.best_ask_price = ::std::option::Option::Some(is.read_float()?);
                },
                101 => {
                    self.best_ask_quantity = ::std::option::Option::Some(is.read_float()?);
                },
                109 => {
                    self.open_interest = ::std::option::Option::Some(is.read_float()?);
                },
                117 => {
                    self.open_interest_quote = ::std::option::Option::Some(is.read_float()?);
                },
                tag => {
                    ::protobuf::rt::read_unknown_or_skip_group(tag, is, self.special_fields.mut_unknown_fields())?;
                },
            };
        }
        ::std::result::Result::Ok(())
    }

    // Compute sizes of nested messages
    #[allow(unused_variables)]
    fn compute_size(&self) -> u64 {
        let mut my_size = 0;
        if let Some(v) = self.timestamp.as_ref() {
            let len = v.compute_size();
            my_size += 1 + ::protobuf::rt::compute_raw_varint64_size(len) + len;
        }
        if self.open != 0. {
            my_size += 1 + 4;
        }
        if self.high != 0. {
            my_size += 1 + 4;
        }
        if self.low != 0. {
            my_size += 1 + 4;
        }
        if self.close != 0. {
            my_size += 1 + 4;
        }
        if self.volume != 0. {
            my_size += 1 + 4;
        }
        if self.quote_volume != 0. {
            my_size += 1 + 4;
        }
        if let Some(v) = self.last_quantity {
            my_size += 1 + 4;
        }
        if let Some(v) = self.best_bid_price {
            my_size += 1 + 4;
        }
        if let Some(v) = self.best_bid_quantity {
            my_size += 1 + 4;
        }
        if let Some(v) = self.best_ask_price {
            my_size += 1 + 4;
        }
        if let Some(v) = self.best_ask_quantity {
            my_size += 1 + 4;
        }
        if let Some(v) = self.open_interest {
            my_size += 1 + 4;
        }
        if let Some(v) = self.open_interest_quote {
            my_size += 1 + 4;
        }
        my_size += ::protobuf::rt::unknown_fields_size(self.special_fields.unknown_fields());
        self.special_fields.cached_size().set(my_size as u32);
        my_size
    }

    fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::Result<()> {
        if let Some(v) = self.timestamp.as_ref() {
            ::protobuf::rt::write_message_field_with_cached_size(1, v, os)?;
        }
        if self.open != 0. {
            os.write_float(2, self.open)?;
        }
        if self.high != 0. {
            os.write_float(3, self.high)?;
        }
        if self.low != 0. {
            os.write_float(4, self.low)?;
        }
        if self.close != 0. {
            os.write_float(5, self.close)?;
        }
        if self.volume != 0. {
            os.write_float(6, self.volume)?;
        }
        if self.quote_volume != 0. {
            os.write_float(7, self.quote_volume)?;
        }
        if let Some(v) = self.last_quantity {
            os.write_float(8, v)?;
        }
        if let Some(v) = self.best_bid_price {
            os.write_float(9, v)?;
        }
        if let Some(v) = self.best_bid_quantity {
            os.write_float(10, v)?;
        }
        if let Some(v) = self.best_ask_price {
            os.write_float(11, v)?;
        }
        if let Some(v) = self.best_ask_quantity {
            os.write_float(12, v)?;
        }
        if let Some(v) = self.open_interest {
            os.write_float(13, v)?;
        }
        if let Some(v) = self.open_interest_quote {
            os.write_float(14, v)?;
        }
        os.write_unknown_fields(self.special_fields.unknown_fields())?;
        ::std::result::Result::Ok(())
    }

    fn special_fields(&self) -> &::protobuf::SpecialFields {
        &self.special_fields
    }

    fn mut_special_fields(&mut self) -> &mut ::protobuf::SpecialFields {
        &mut self.special_fields
    }

    fn new() -> Ticker {
        Ticker::new()
    }

    fn clear(&mut self) {
        self.timestamp.clear();
        self.open = 0.;
        self.high = 0.;
        self.low = 0.;
        self.close = 0.;
        self.volume = 0.;
        self.quote_volume = 0.;
        self.last_quantity = ::std::option::Option::None;
        self.best_bid_price = ::std::option::Option::None;
        self.best_bid_quantity = ::std::option::Option::None;
        self.best_ask_price = ::std::option::Option::None;
        self.best_ask_quantity = ::std::option::Option::None;
        self.open_interest = ::std::option::Option::None;
        self.open_interest_quote = ::std::option::Option::None;
        self.special_fields.clear();
    }

    fn default_instance() -> &'static Ticker {
        static instance: Ticker = Ticker {
            timestamp: ::protobuf::MessageField::none(),
            open: 0.,
            high: 0.,
            low: 0.,
            close: 0.,
            volume: 0.,
            quote_volume: 0.,
            last_quantity: ::std::option::Option::None,
            best_bid_price: ::std::option::Option::None,
            best_bid_quantity: ::std::option::Option::None,
            best_ask_price: ::std::option::Option::None,
            best_ask_quantity: ::std::option::Option::None,
            open_interest: ::std::option::Option::None,
            open_interest_quote: ::std::option::Option::None,
            special_fields: ::protobuf::SpecialFields::new(),
        };
        &instance
    }
}

impl ::protobuf::MessageFull for Ticker {
    fn descriptor() -> ::protobuf::reflect::MessageDescriptor {
        static descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::MessageDescriptor> = ::protobuf::rt::Lazy::new();
        descriptor.get(|| file_descriptor().message_by_package_relative_name("Ticker").unwrap()).clone()
    }
}

impl ::std::fmt::Display for Ticker {
    fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
        ::protobuf::text_format::fmt(self, f)
    }
}

impl ::protobuf::reflect::ProtobufValue for Ticker {
    type RuntimeType = ::protobuf::reflect::rt::RuntimeTypeMessage<Self>;
}

static file_descriptor_proto_data: &'static [u8] = b"\
    \n\rmessage.proto\x12\x0ecrypto_crawler\x1a\x1fgoogle/protobuf/timestamp\
    .proto\"\xff\x01\n\x05Trade\x128\n\ttimestamp\x18\x01\x20\x01(\x0b2\x1a.\
    google.protobuf.TimestampR\ttimestamp\x12\x12\n\x04side\x18\x02\x20\x01(\
    \x08R\x04side\x12\x14\n\x05price\x18\x03\x20\x01(\x02R\x05price\x12#\n\r\
    quantity_base\x18\x04\x20\x01(\x02R\x0cquantityBase\x12%\n\x0equantity_q\
    uote\x18\x05\x20\x01(\x02R\rquantityQuote\x120\n\x11quantity_contract\
    \x18\x06\x20\x01(\x02H\0R\x10quantityContract\x88\x01\x01B\x14\n\x12_qua\
    ntity_contract\"\xff\x02\n\tOrderbook\x128\n\ttimestamp\x18\x01\x20\x01(\
    \x0b2\x1a.google.protobuf.TimestampR\ttimestamp\x12\x1a\n\x08snapshot\
    \x18\x02\x20\x01(\x08R\x08snapshot\x123\n\x04asks\x18\x03\x20\x03(\x0b2\
    \x1f.crypto_crawler.Orderbook.OrderR\x04asks\x123\n\x04bids\x18\x04\x20\
    \x03(\x0b2\x1f.crypto_crawler.Orderbook.OrderR\x04bids\x1a\xb1\x01\n\x05\
    Order\x12\x14\n\x05price\x18\x01\x20\x01(\x02R\x05price\x12#\n\rquantity\
    _base\x18\x02\x20\x01(\x02R\x0cquantityBase\x12%\n\x0equantity_quote\x18\
    \x03\x20\x01(\x02R\rquantityQuote\x120\n\x11quantity_contract\x18\x04\
    \x20\x01(\x02H\0R\x10quantityContract\x88\x01\x01B\x14\n\x12_quantity_co\
    ntract\"\xd3\x03\n\x03Bbo\x128\n\ttimestamp\x18\x01\x20\x01(\x0b2\x1a.go\
    ogle.protobuf.TimestampR\ttimestamp\x12\x1b\n\tbid_price\x18\x02\x20\x01\
    (\x02R\x08bidPrice\x12*\n\x11bid_quantity_base\x18\x03\x20\x01(\x02R\x0f\
    bidQuantityBase\x12,\n\x12bid_quantity_quote\x18\x04\x20\x01(\x02R\x10bi\
    dQuantityQuote\x127\n\x15bid_quantity_contract\x18\x05\x20\x01(\x02H\0R\
    \x13bidQuantityContract\x88\x01\x01\x12\x1b\n\task_price\x18\x06\x20\x01\
    (\x02R\x08askPrice\x12*\n\x11ask_quantity_base\x18\x07\x20\x01(\x02R\x0f\
    askQuantityBase\x12,\n\x12ask_quantity_quote\x18\x08\x20\x01(\x02R\x10as\
    kQuantityQuote\x127\n\x15ask_quantity_contract\x18\t\x20\x01(\x02H\x01R\
    \x13askQuantityContract\x88\x01\x01B\x18\n\x16_bid_quantity_contractB\
    \x18\n\x16_ask_quantity_contract\"\x9c\x05\n\x06Ticker\x128\n\ttimestamp\
    \x18\x01\x20\x01(\x0b2\x1a.google.protobuf.TimestampR\ttimestamp\x12\x12\
    \n\x04open\x18\x02\x20\x01(\x02R\x04open\x12\x12\n\x04high\x18\x03\x20\
    \x01(\x02R\x04high\x12\x10\n\x03low\x18\x04\x20\x01(\x02R\x03low\x12\x14\
    \n\x05close\x18\x05\x20\x01(\x02R\x05close\x12\x16\n\x06volume\x18\x06\
    \x20\x01(\x02R\x06volume\x12!\n\x0cquote_volume\x18\x07\x20\x01(\x02R\
    \x0bquoteVolume\x12(\n\rlast_quantity\x18\x08\x20\x01(\x02H\0R\x0clastQu\
    antity\x88\x01\x01\x12)\n\x0ebest_bid_price\x18\t\x20\x01(\x02H\x01R\x0c\
    bestBidPrice\x88\x01\x01\x12/\n\x11best_bid_quantity\x18\n\x20\x01(\x02H\
    \x02R\x0fbestBidQuantity\x88\x01\x01\x12)\n\x0ebest_ask_price\x18\x0b\
    \x20\x01(\x02H\x03R\x0cbestAskPrice\x88\x01\x01\x12/\n\x11best_ask_quant\
    ity\x18\x0c\x20\x01(\x02H\x04R\x0fbestAskQuantity\x88\x01\x01\x12(\n\rop\
    en_interest\x18\r\x20\x01(\x02H\x05R\x0copenInterest\x88\x01\x01\x123\n\
    \x13open_interest_quote\x18\x0e\x20\x01(\x02H\x06R\x11openInterestQuote\
    \x88\x01\x01B\x10\n\x0e_last_quantityB\x11\n\x0f_best_bid_priceB\x14\n\
    \x12_best_bid_quantityB\x11\n\x0f_best_ask_priceB\x14\n\x12_best_ask_qua\
    ntityB\x10\n\x0e_open_interestB\x16\n\x14_open_interest_quoteJ\x9f\x18\n\
    \x06\x12\x04\0\0G\x01\n\x08\n\x01\x0c\x12\x03\0\0\x12\n\x08\n\x01\x02\
    \x12\x03\x01\0\x17\n\t\n\x02\x03\0\x12\x03\x03\0)\n)\n\x02\x04\0\x12\x04\
    \x07\0\x12\x01\x1a\x1d\x20Tick-by-tick\x20trade\x20message.\n\n\n\n\x03\
    \x04\0\x01\x12\x03\x07\x08\r\n\x0b\n\x04\x04\0\x02\0\x12\x03\x08\x02*\n\
    \x0c\n\x05\x04\0\x02\0\x06\x12\x03\x08\x02\x1b\n\x0c\n\x05\x04\0\x02\0\
    \x01\x12\x03\x08\x1c%\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x08()\nP\n\x04\
    \x04\0\x02\x01\x12\x03\n\x02\x10\x1aC\x20Which\x20side\x20is\x20taker?\
    \x20True,\x20seller\x20is\x20taker;\x20False,\x20buyer\x20is\x20taker\n\
    \n\x0c\n\x05\x04\0\x02\x01\x05\x12\x03\n\x02\x06\n\x0c\n\x05\x04\0\x02\
    \x01\x01\x12\x03\n\x07\x0b\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\n\x0e\
    \x0f\n\x0b\n\x04\x04\0\x02\x02\x12\x03\x0b\x02\x12\n\x0c\n\x05\x04\0\x02\
    \x02\x05\x12\x03\x0b\x02\x07\n\x0c\n\x05\x04\0\x02\x02\x01\x12\x03\x0b\
    \x08\r\n\x0c\n\x05\x04\0\x02\x02\x03\x12\x03\x0b\x10\x11\n3\n\x04\x04\0\
    \x02\x03\x12\x03\r\x02\x1a\x1a&\x20Number\x20of\x20base\x20coins,\x200\
    \x20means\x20delete\n\n\x0c\n\x05\x04\0\x02\x03\x05\x12\x03\r\x02\x07\n\
    \x0c\n\x05\x04\0\x02\x03\x01\x12\x03\r\x08\x15\n\x0c\n\x05\x04\0\x02\x03\
    \x03\x12\x03\r\x18\x19\n4\n\x04\x04\0\x02\x04\x12\x03\x0f\x02\x1b\x1a'\
    \x20Number\x20of\x20quote\x20coins,\x200\x20means\x20delete\n\n\x0c\n\
    \x05\x04\0\x02\x04\x05\x12\x03\x0f\x02\x07\n\x0c\n\x05\x04\0\x02\x04\x01\
    \x12\x03\x0f\x08\x16\n\x0c\n\x05\x04\0\x02\x04\x03\x12\x03\x0f\x19\x1a\n\
    :\n\x04\x04\0\x02\x05\x12\x03\x11\x02'\x1a-\x20Number\x20of\x20contracts\
    ,\x20empty\x20for\x20spot\x20markets\n\n\x0c\n\x05\x04\0\x02\x05\x04\x12\
    \x03\x11\x02\n\n\x0c\n\x05\x04\0\x02\x05\x05\x12\x03\x11\x0b\x10\n\x0c\n\
    \x05\x04\0\x02\x05\x01\x12\x03\x11\x11\"\n\x0c\n\x05\x04\0\x02\x05\x03\
    \x12\x03\x11%&\n\x1f\n\x02\x04\x01\x12\x04\x15\0&\x01\x1a\x13\x20Level2\
    \x20orderbook.\n\n\n\n\x03\x04\x01\x01\x12\x03\x15\x08\x11\n\x0c\n\x04\
    \x04\x01\x03\0\x12\x04\x16\x02\x1e\x03\n\x0c\n\x05\x04\x01\x03\0\x01\x12\
    \x03\x16\n\x0f\n\r\n\x06\x04\x01\x03\0\x02\0\x12\x03\x17\x04\x14\n\x0e\n\
    \x07\x04\x01\x03\0\x02\0\x05\x12\x03\x17\x04\t\n\x0e\n\x07\x04\x01\x03\0\
    \x02\0\x01\x12\x03\x17\n\x0f\n\x0e\n\x07\x04\x01\x03\0\x02\0\x03\x12\x03\
    \x17\x12\x13\n5\n\x06\x04\x01\x03\0\x02\x01\x12\x03\x19\x04\x1c\x1a&\x20\
    Number\x20of\x20base\x20coins,\x200\x20means\x20delete\n\n\x0e\n\x07\x04\
    \x01\x03\0\x02\x01\x05\x12\x03\x19\x04\t\n\x0e\n\x07\x04\x01\x03\0\x02\
    \x01\x01\x12\x03\x19\n\x17\n\x0e\n\x07\x04\x01\x03\0\x02\x01\x03\x12\x03\
    \x19\x1a\x1b\n6\n\x06\x04\x01\x03\0\x02\x02\x12\x03\x1b\x04\x1d\x1a'\x20\
    Number\x20of\x20quote\x20coins,\x200\x20means\x20delete\n\n\x0e\n\x07\
    \x04\x01\x03\0\x02\x02\x05\x12\x03\x1b\x04\t\n\x0e\n\x07\x04\x01\x03\0\
    \x02\x02\x01\x12\x03\x1b\n\x18\n\x0e\n\x07\x04\x01\x03\0\x02\x02\x03\x12\
    \x03\x1b\x1b\x1c\n<\n\x06\x04\x01\x03\0\x02\x03\x12\x03\x1d\x04)\x1a-\
    \x20Number\x20of\x20contracts,\x20empty\x20for\x20spot\x20markets\n\n\
    \x0e\n\x07\x04\x01\x03\0\x02\x03\x04\x12\x03\x1d\x04\x0c\n\x0e\n\x07\x04\
    \x01\x03\0\x02\x03\x05\x12\x03\x1d\r\x12\n\x0e\n\x07\x04\x01\x03\0\x02\
    \x03\x01\x12\x03\x1d\x13$\n\x0e\n\x07\x04\x01\x03\0\x02\x03\x03\x12\x03\
    \x1d'(\n\x0b\n\x04\x04\x01\x02\0\x12\x03\x1f\x02*\n\x0c\n\x05\x04\x01\
    \x02\0\x06\x12\x03\x1f\x02\x1b\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03\x1f\
    \x1c%\n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03\x1f()\n\"\n\x04\x04\x01\x02\
    \x01\x12\x03!\x02\x14\x1a\x15\x20snapshot\x20or\x20updates\n\n\x0c\n\x05\
    \x04\x01\x02\x01\x05\x12\x03!\x02\x06\n\x0c\n\x05\x04\x01\x02\x01\x01\
    \x12\x03!\x07\x0f\n\x0c\n\x05\x04\x01\x02\x01\x03\x12\x03!\x12\x13\nX\n\
    \x04\x04\x01\x02\x02\x12\x03#\x02\x1a\x1aK\x20sorted\x20in\x20ascending\
    \x20order\x20by\x20price\x20if\x20snapshot=true,\x20otherwise\x20not\x20\
    sorted\n\n\x0c\n\x05\x04\x01\x02\x02\x04\x12\x03#\x02\n\n\x0c\n\x05\x04\
    \x01\x02\x02\x06\x12\x03#\x0b\x10\n\x0c\n\x05\x04\x01\x02\x02\x01\x12\
    \x03#\x11\x15\n\x0c\n\x05\x04\x01\x02\x02\x03\x12\x03#\x18\x19\nY\n\x04\
    \x04\x01\x02\x03\x12\x03%\x02\x1a\x1aL\x20sorted\x20in\x20descending\x20\
    order\x20by\x20price\x20if\x20snapshot=true,\x20otherwise\x20not\x20sort\
    ed\n\n\x0c\n\x05\x04\x01\x02\x03\x04\x12\x03%\x02\n\n\x0c\n\x05\x04\x01\
    \x02\x03\x06\x12\x03%\x0b\x10\n\x0c\n\x05\x04\x01\x02\x03\x01\x12\x03%\
    \x11\x15\n\x0c\n\x05\x04\x01\x02\x03\x03\x12\x03%\x18\x19\n!\n\x02\x04\
    \x02\x12\x04)\03\x01\x1a\x15\x20Best\x20bid\x20and\x20offer.\n\n\n\n\x03\
    \x04\x02\x01\x12\x03)\x08\x0b\n\x0b\n\x04\x04\x02\x02\0\x12\x03*\x02*\n\
    \x0c\n\x05\x04\x02\x02\0\x06\x12\x03*\x02\x1b\n\x0c\n\x05\x04\x02\x02\0\
    \x01\x12\x03*\x1c%\n\x0c\n\x05\x04\x02\x02\0\x03\x12\x03*()\n\x0b\n\x04\
    \x04\x02\x02\x01\x12\x03+\x02\x16\n\x0c\n\x05\x04\x02\x02\x01\x05\x12\
    \x03+\x02\x07\n\x0c\n\x05\x04\x02\x02\x01\x01\x12\x03+\x08\x11\n\x0c\n\
    \x05\x04\x02\x02\x01\x03\x12\x03+\x14\x15\n\x0b\n\x04\x04\x02\x02\x02\
    \x12\x03,\x02\x1e\n\x0c\n\x05\x04\x02\x02\x02\x05\x12\x03,\x02\x07\n\x0c\
    \n\x05\x04\x02\x02\x02\x01\x12\x03,\x08\x19\n\x0c\n\x05\x04\x02\x02\x02\
    \x03\x12\x03,\x1c\x1d\n\x0b\n\x04\x04\x02\x02\x03\x12\x03-\x02\x1f\n\x0c\
    \n\x05\x04\x02\x02\x03\x05\x12\x03-\x02\x07\n\x0c\n\x05\x04\x02\x02\x03\
    \x01\x12\x03-\x08\x1a\n\x0c\n\x05\x04\x02\x02\x03\x03\x12\x03-\x1d\x1e\n\
    \x0b\n\x04\x04\x02\x02\x04\x12\x03.\x02+\n\x0c\n\x05\x04\x02\x02\x04\x04\
    \x12\x03.\x02\n\n\x0c\n\x05\x04\x02\x02\x04\x05\x12\x03.\x0b\x10\n\x0c\n\
    \x05\x04\x02\x02\x04\x01\x12\x03.\x11&\n\x0c\n\x05\x04\x02\x02\x04\x03\
    \x12\x03.)*\n\x0b\n\x04\x04\x02\x02\x05\x12\x03/\x02\x16\n\x0c\n\x05\x04\
    \x02\x02\x05\x05\x12\x03/\x02\x07\n\x0c\n\x05\x04\x02\x02\x05\x01\x12\
    \x03/\x08\x11\n\x0c\n\x05\x04\x02\x02\x05\x03\x12\x03/\x14\x15\n\x0b\n\
    \x04\x04\x02\x02\x06\x12\x030\x02\x1e\n\x0c\n\x05\x04\x02\x02\x06\x05\
    \x12\x030\x02\x07\n\x0c\n\x05\x04\x02\x02\x06\x01\x12\x030\x08\x19\n\x0c\
    \n\x05\x04\x02\x02\x06\x03\x12\x030\x1c\x1d\n\x0b\n\x04\x04\x02\x02\x07\
    \x12\x031\x02\x1f\n\x0c\n\x05\x04\x02\x02\x07\x05\x12\x031\x02\x07\n\x0c\
    \n\x05\x04\x02\x02\x07\x01\x12\x031\x08\x1a\n\x0c\n\x05\x04\x02\x02\x07\
    \x03\x12\x031\x1d\x1e\n\x0b\n\x04\x04\x02\x02\x08\x12\x032\x02+\n\x0c\n\
    \x05\x04\x02\x02\x08\x04\x12\x032\x02\n\n\x0c\n\x05\x04\x02\x02\x08\x05\
    \x12\x032\x0b\x10\n\x0c\n\x05\x04\x02\x02\x08\x01\x12\x032\x11&\n\x0c\n\
    \x05\x04\x02\x02\x08\x03\x12\x032)*\n)\n\x02\x04\x03\x12\x046\0G\x01\x1a\
    \x1d\x2024hr\x20rolling\x20window\x20ticker.\n\n\n\n\x03\x04\x03\x01\x12\
    \x036\x08\x0e\n\x0b\n\x04\x04\x03\x02\0\x12\x037\x02*\n\x0c\n\x05\x04\
    \x03\x02\0\x06\x12\x037\x02\x1b\n\x0c\n\x05\x04\x03\x02\0\x01\x12\x037\
    \x1c%\n\x0c\n\x05\x04\x03\x02\0\x03\x12\x037()\n\x0b\n\x04\x04\x03\x02\
    \x01\x12\x038\x02\x11\n\x0c\n\x05\x04\x03\x02\x01\x05\x12\x038\x02\x07\n\
    \x0c\n\x05\x04\x03\x02\x01\x01\x12\x038\x08\x0c\n\x0c\n\x05\x04\x03\x02\
    \x01\x03\x12\x038\x0f\x10\n\x0b\n\x04\x04\x03\x02\x02\x12\x039\x02\x11\n\
    \x0c\n\x05\x04\x03\x02\x02\x05\x12\x039\x02\x07\n\x0c\n\x05\x04\x03\x02\
    \x02\x01\x12\x039\x08\x0c\n\x0c\n\x05\x04\x03\x02\x02\x03\x12\x039\x0f\
    \x10\n\x0b\n\x04\x04\x03\x02\x03\x12\x03:\x02\x10\n\x0c\n\x05\x04\x03\
    \x02\x03\x05\x12\x03:\x02\x07\n\x0c\n\x05\x04\x03\x02\x03\x01\x12\x03:\
    \x08\x0b\n\x0c\n\x05\x04\x03\x02\x03\x03\x12\x03:\x0e\x0f\n\x0b\n\x04\
    \x04\x03\x02\x04\x12\x03;\x02\x12\n\x0c\n\x05\x04\x03\x02\x04\x05\x12\
    \x03;\x02\x07\n\x0c\n\x05\x04\x03\x02\x04\x01\x12\x03;\x08\r\n\x0c\n\x05\
    \x04\x03\x02\x04\x03\x12\x03;\x10\x11\n\x0b\n\x04\x04\x03\x02\x05\x12\
    \x03<\x02\x13\n\x0c\n\x05\x04\x03\x02\x05\x05\x12\x03<\x02\x07\n\x0c\n\
    \x05\x04\x03\x02\x05\x01\x12\x03<\x08\x0e\n\x0c\n\x05\x04\x03\x02\x05\
    \x03\x12\x03<\x11\x12\n\x0b\n\x04\x04\x03\x02\x06\x12\x03=\x02\x19\n\x0c\
    \n\x05\x04\x03\x02\x06\x05\x12\x03=\x02\x07\n\x0c\n\x05\x04\x03\x02\x06\
    \x01\x12\x03=\x08\x14\n\x0c\n\x05\x04\x03\x02\x06\x03\x12\x03=\x17\x18\n\
    \x0b\n\x04\x04\x03\x02\x07\x12\x03>\x02#\n\x0c\n\x05\x04\x03\x02\x07\x04\
    \x12\x03>\x02\n\n\x0c\n\x05\x04\x03\x02\x07\x05\x12\x03>\x0b\x10\n\x0c\n\
    \x05\x04\x03\x02\x07\x01\x12\x03>\x11\x1e\n\x0c\n\x05\x04\x03\x02\x07\
    \x03\x12\x03>!\"\n\x0b\n\x04\x04\x03\x02\x08\x12\x03?\x02$\n\x0c\n\x05\
    \x04\x03\x02\x08\x04\x12\x03?\x02\n\n\x0c\n\x05\x04\x03\x02\x08\x05\x12\
    \x03?\x0b\x10\n\x0c\n\x05\x04\x03\x02\x08\x01\x12\x03?\x11\x1f\n\x0c\n\
    \x05\x04\x03\x02\x08\x03\x12\x03?\"#\n\x0b\n\x04\x04\x03\x02\t\x12\x03@\
    \x02(\n\x0c\n\x05\x04\x03\x02\t\x04\x12\x03@\x02\n\n\x0c\n\x05\x04\x03\
    \x02\t\x05\x12\x03@\x0b\x10\n\x0c\n\x05\x04\x03\x02\t\x01\x12\x03@\x11\"\
    \n\x0c\n\x05\x04\x03\x02\t\x03\x12\x03@%'\n\x0b\n\x04\x04\x03\x02\n\x12\
    \x03A\x02%\n\x0c\n\x05\x04\x03\x02\n\x04\x12\x03A\x02\n\n\x0c\n\x05\x04\
    \x03\x02\n\x05\x12\x03A\x0b\x10\n\x0c\n\x05\x04\x03\x02\n\x01\x12\x03A\
    \x11\x1f\n\x0c\n\x05\x04\x03\x02\n\x03\x12\x03A\"$\n\x0b\n\x04\x04\x03\
    \x02\x0b\x12\x03B\x02(\n\x0c\n\x05\x04\x03\x02\x0b\x04\x12\x03B\x02\n\n\
    \x0c\n\x05\x04\x03\x02\x0b\x05\x12\x03B\x0b\x10\n\x0c\n\x05\x04\x03\x02\
    \x0b\x01\x12\x03B\x11\"\n\x0c\n\x05\x04\x03\x02\x0b\x03\x12\x03B%'\n3\n\
    \x04\x04\x03\x02\x0c\x12\x03D\x02$\x1a&\x20availale\x20in\x20Futures\x20\
    and\x20Swap\x20markets\n\n\x0c\n\x05\x04\x03\x02\x0c\x04\x12\x03D\x02\n\
    \n\x0c\n\x05\x04\x03\x02\x0c\x05\x12\x03D\x0b\x10\n\x0c\n\x05\x04\x03\
    \x02\x0c\x01\x12\x03D\x11\x1e\n\x0c\n\x05\x04\x03\x02\x0c\x03\x12\x03D!#\
    \n3\n\x04\x04\x03\x02\r\x12\x03F\x02*\x1a&\x20availale\x20in\x20Futures\
    \x20and\x20Swap\x20markets\n\n\x0c\n\x05\x04\x03\x02\r\x04\x12\x03F\x02\
    \n\n\x0c\n\x05\x04\x03\x02\r\x05\x12\x03F\x0b\x10\n\x0c\n\x05\x04\x03\
    \x02\r\x01\x12\x03F\x11$\n\x0c\n\x05\x04\x03\x02\r\x03\x12\x03F')b\x06pr\
    oto3\
";

/// `FileDescriptorProto` object which was a source for this generated file
fn file_descriptor_proto() -> &'static ::protobuf::descriptor::FileDescriptorProto {
    static file_descriptor_proto_lazy: ::protobuf::rt::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::Lazy::new();
    file_descriptor_proto_lazy.get(|| {
        ::protobuf::Message::parse_from_bytes(file_descriptor_proto_data).unwrap()
    })
}

/// `FileDescriptor` object which allows dynamic access to files
pub fn file_descriptor() -> &'static ::protobuf::reflect::FileDescriptor {
    static generated_file_descriptor_lazy: ::protobuf::rt::Lazy<::protobuf::reflect::GeneratedFileDescriptor> = ::protobuf::rt::Lazy::new();
    static file_descriptor: ::protobuf::rt::Lazy<::protobuf::reflect::FileDescriptor> = ::protobuf::rt::Lazy::new();
    file_descriptor.get(|| {
        let generated_file_descriptor = generated_file_descriptor_lazy.get(|| {
            let mut deps = ::std::vec::Vec::with_capacity(1);
            deps.push(::protobuf::well_known_types::timestamp::file_descriptor().clone());
            let mut messages = ::std::vec::Vec::with_capacity(5);
            messages.push(Trade::generated_message_descriptor_data());
            messages.push(Orderbook::generated_message_descriptor_data());
            messages.push(Bbo::generated_message_descriptor_data());
            messages.push(Ticker::generated_message_descriptor_data());
            messages.push(orderbook::Order::generated_message_descriptor_data());
            let mut enums = ::std::vec::Vec::with_capacity(0);
            ::protobuf::reflect::GeneratedFileDescriptor::new_generated(
                file_descriptor_proto(),
                deps,
                messages,
                enums,
            )
        });
        ::protobuf::reflect::FileDescriptor::new_generated_2(generated_file_descriptor)
    })
}