protobuf 3.7.5 → 3.8.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,168 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Protobuf::Field::FieldHash do
4
+
5
+ let(:basic_message) do
6
+ Class.new(::Protobuf::Message) do
7
+ optional :string, :field, 1
8
+ end
9
+ end
10
+
11
+ let(:more_complex_message) do
12
+ Class.new(BasicMessage) do
13
+ end
14
+ end
15
+
16
+ let(:some_enum) do
17
+ Class.new(::Protobuf::Enum) do
18
+ define :FOO, 1
19
+ define :BAR, 2
20
+ define :BAZ, 3
21
+ end
22
+ end
23
+
24
+ let(:map_message) do
25
+ Class.new(::Protobuf::Message) do
26
+ optional :string, :some_string, 1
27
+ map :int32, :string, :map_int32_to_string, 2
28
+ map :string, BasicMessage, :map_string_to_msg, 3
29
+ map :string, SomeEnum, :map_string_to_enum, 4
30
+ end
31
+ end
32
+
33
+ before do
34
+ stub_const('BasicMessage', basic_message)
35
+ stub_const('MoreComplexMessage', more_complex_message)
36
+ stub_const('SomeEnum', some_enum)
37
+ stub_const('SomeMapMessage', map_message)
38
+ end
39
+
40
+ let(:instance) { SomeMapMessage.new }
41
+
42
+ %w([]= store).each do |method|
43
+ describe "##{method}" do
44
+ context 'when applied to an int32->string field hash' do
45
+ it 'adds an int -> string entry' do
46
+ expect(instance.map_int32_to_string).to be_empty
47
+ instance.map_int32_to_string.send(method, 1, 'string 1')
48
+ expect(instance.map_int32_to_string).to eq(1 => 'string 1')
49
+ instance.map_int32_to_string.send(method, 2, 'string 2')
50
+ expect(instance.map_int32_to_string).to eq(1 => 'string 1', 2 => 'string 2')
51
+ end
52
+
53
+ it 'fails if not adding an int -> string' do
54
+ expect { instance.map_int32_to_string.send(method, 1, 100.0) }.to raise_error(TypeError)
55
+ expect { instance.map_int32_to_string.send(method, 'foo', 100.0) }.to raise_error(TypeError)
56
+ expect { instance.map_int32_to_string.send(method, BasicMessage.new, 100.0) }.to raise_error(TypeError)
57
+ expect { instance.map_int32_to_string.send(method, 'foo', 'bar') }.to raise_error(TypeError)
58
+ expect { instance.map_int32_to_string.send(method, nil, 'foo') }.to raise_error(TypeError)
59
+ expect { instance.map_int32_to_string.send(method, 1, nil) }.to raise_error(TypeError)
60
+ end
61
+ end
62
+
63
+ context 'when applied to a string->MessageField field hash' do
64
+ it 'adds a string -> MessageField entry' do
65
+ expect(instance.map_string_to_msg).to be_empty
66
+ basic_msg1 = BasicMessage.new
67
+ instance.map_string_to_msg.send(method, 'msg1', basic_msg1)
68
+ expect(instance.map_string_to_msg).to eq('msg1' => basic_msg1)
69
+ basic_msg2 = BasicMessage.new
70
+ instance.map_string_to_msg.send(method, 'msg2', basic_msg2)
71
+ expect(instance.map_string_to_msg).to eq('msg1' => basic_msg1, 'msg2' => basic_msg2)
72
+ end
73
+
74
+ it 'fails if not adding a string -> MessageField entry' do
75
+ expect { instance.map_string_to_msg.send(method, 1, 100.0) }.to raise_error(TypeError)
76
+ expect { instance.map_string_to_msg.send(method, 'foo', SomeEnum::FOO) }.to raise_error(TypeError)
77
+ expect { instance.map_string_to_msg.send(method, SomeEnum::FOO, BasicMessage.new) }.to raise_error(TypeError)
78
+ expect { instance.map_string_to_msg.send(method, nil, BasicMessage.new) }.to raise_error(TypeError)
79
+ expect { instance.map_string_to_msg.send(method, 'foo', nil) }.to raise_error(TypeError)
80
+ end
81
+
82
+ it 'adds a Hash from a MessageField object' do
83
+ expect(instance.map_string_to_msg).to be_empty
84
+ basic_msg1 = BasicMessage.new
85
+ basic_msg1.field = 'my value'
86
+ instance.map_string_to_msg.send(method, 'foo', basic_msg1.to_hash)
87
+ expect(instance.map_string_to_msg).to eq('foo' => basic_msg1)
88
+ end
89
+
90
+ it 'does not downcast a MessageField' do
91
+ expect(instance.map_string_to_msg).to be_empty
92
+ basic_msg1 = MoreComplexMessage.new
93
+ instance.map_string_to_msg.send(method, 'foo', basic_msg1)
94
+ expect(instance.map_string_to_msg).to eq('foo' => basic_msg1)
95
+ expect(instance.map_string_to_msg['foo']).to be_a(MoreComplexMessage)
96
+ end
97
+ end
98
+
99
+ context 'when applied to a string->EnumField field hash' do
100
+ it 'adds a string -> EnumField entry' do
101
+ expect(instance.map_string_to_enum).to be_empty
102
+ instance.map_string_to_enum.send(method, 'msg1', SomeEnum::FOO)
103
+ expect(instance.map_string_to_enum).to eq('msg1' => SomeEnum::FOO)
104
+ instance.map_string_to_enum.send(method, 'msg2', SomeEnum::BAR)
105
+ expect(instance.map_string_to_enum).to eq('msg1' => SomeEnum::FOO, 'msg2' => SomeEnum::BAR)
106
+ end
107
+
108
+ it 'fails if not adding a string -> EnumField entry' do
109
+ expect { instance.map_string_to_enum.send(method, 1, 100.0) }.to raise_error(TypeError)
110
+ expect { instance.map_string_to_enum.send(method, nil, 100.0) }.to raise_error(TypeError)
111
+ expect { instance.map_string_to_enum.send(method, 1, nil) }.to raise_error(TypeError)
112
+ expect { instance.map_string_to_enum.send(method, 'foo', BasicMessage.new) }.to raise_error(TypeError)
113
+ expect { instance.map_string_to_enum.send(method, 1, SomeEnum::FOO) }.to raise_error(TypeError)
114
+ expect { instance.map_string_to_enum.send(method, nil, SomeEnum::FOO) }.to raise_error(TypeError)
115
+ expect { instance.map_string_to_enum.send(method, 'foo', nil) }.to raise_error(TypeError)
116
+ end
117
+ end
118
+ end
119
+
120
+ describe '#to_hash_value' do
121
+ context 'when applied to an int32->string field hash' do
122
+ before do
123
+ instance.map_int32_to_string[1] = 'string 1'
124
+ instance.map_int32_to_string[2] = 'string 2'
125
+ end
126
+
127
+ it 'converts properly' do
128
+ expect(instance.to_hash_value).to eq(:map_int32_to_string => {
129
+ 1 => 'string 1',
130
+ 2 => 'string 2',
131
+ })
132
+ end
133
+ end
134
+
135
+ context 'when applied to a string->MessageField field hash' do
136
+ before do
137
+ instance.map_string_to_msg['msg1'] = BasicMessage.new(:field => 'string 1')
138
+ instance.map_string_to_msg['msg2'] = BasicMessage.new(:field => 'string 2')
139
+ end
140
+
141
+ it 'converts properly' do
142
+ expect(instance.to_hash_value).to eq(:map_string_to_msg => {
143
+ 'msg1' => {
144
+ :field => 'string 1',
145
+ },
146
+ 'msg2' => {
147
+ :field => 'string 2',
148
+ },
149
+ })
150
+ end
151
+ end
152
+
153
+ context 'when applied to a string->EnumField field hash' do
154
+ before do
155
+ instance.map_string_to_enum['msg1'] = SomeEnum::FOO
156
+ instance.map_string_to_enum['msg2'] = SomeEnum::BAR
157
+ end
158
+
159
+ it 'converts properly' do
160
+ expect(instance.to_hash_value).to eq(:map_string_to_enum => {
161
+ 'msg1' => 1,
162
+ 'msg2' => 2,
163
+ })
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end
@@ -15,9 +15,9 @@ RSpec.describe ::Protobuf::Generators::ExtensionGenerator do
15
15
  let(:message_type) { 'FooBar' }
16
16
 
17
17
  before do
18
- expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[0], 1).and_return(field_descriptors[0])
19
- expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[1], 1).and_return(field_descriptors[1])
20
- expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[2], 1).and_return(field_descriptors[2])
18
+ expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[0], nil, 1).and_return(field_descriptors[0])
19
+ expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[1], nil, 1).and_return(field_descriptors[1])
20
+ expect(::Protobuf::Generators::FieldGenerator).to receive(:new).with(field_descriptors[2], nil, 1).and_return(field_descriptors[2])
21
21
  end
22
22
 
23
23
  subject { described_class.new(message_type, field_descriptors, 0) }
@@ -25,32 +25,41 @@ RSpec.describe ::Protobuf::Generators::FieldGenerator do
25
25
  :options => field_options,
26
26
  }
27
27
  end
28
-
29
28
  let(:field) { ::Google::Protobuf::FieldDescriptorProto.new(field_fields) }
30
29
 
30
+ let(:nested_types) { [] }
31
+ let(:owner_fields) do
32
+ {
33
+ :name => 'Baz',
34
+ :field => [field],
35
+ :nested_type => nested_types,
36
+ }
37
+ end
38
+ let(:owner_msg) { ::Google::Protobuf::DescriptorProto.new(owner_fields) }
39
+
31
40
  describe '#compile' do
32
- subject { described_class.new(field).to_s }
41
+ subject { described_class.new(field, owner_msg, 1).to_s }
33
42
 
34
- specify { expect(subject).to eq "optional :string, :foo_bar, 3\n" }
43
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3\n" }
35
44
 
36
45
  context 'when the type is another message' do
37
46
  let(:type_enum) { :TYPE_MESSAGE }
38
47
  let(:type_name) { '.foo.bar.Baz' }
39
48
 
40
- specify { expect(subject).to eq "optional ::Foo::Bar::Baz, :foo_bar, 3\n" }
49
+ specify { expect(subject).to eq " optional ::Foo::Bar::Baz, :foo_bar, 3\n" }
41
50
  end
42
51
 
43
52
  context 'when a default value is used' do
44
53
  let(:type_enum) { :TYPE_INT32 }
45
54
  let(:default_value) { '42' }
46
- specify { expect(subject).to eq "optional :int32, :foo_bar, 3, :default => 42\n" }
55
+ specify { expect(subject).to eq " optional :int32, :foo_bar, 3, :default => 42\n" }
47
56
 
48
57
  context 'when type is an enum' do
49
58
  let(:type_enum) { :TYPE_ENUM }
50
59
  let(:type_name) { '.foo.bar.Baz' }
51
60
  let(:default_value) { 'QUUX' }
52
61
 
53
- specify { expect(subject).to eq "optional ::Foo::Bar::Baz, :foo_bar, 3, :default => ::Foo::Bar::Baz::QUUX\n" }
62
+ specify { expect(subject).to eq " optional ::Foo::Bar::Baz, :foo_bar, 3, :default => ::Foo::Bar::Baz::QUUX\n" }
54
63
  end
55
64
 
56
65
  context 'when type is an enum with lowercase default value with PB_UPCASE_ENUMS set' do
@@ -59,14 +68,14 @@ RSpec.describe ::Protobuf::Generators::FieldGenerator do
59
68
  let(:default_value) { 'quux' }
60
69
  before { allow(ENV).to receive(:key?).with('PB_UPCASE_ENUMS').and_return(true) }
61
70
 
62
- specify { expect(subject).to eq "optional ::Foo::Bar::Baz, :foo_bar, 3, :default => ::Foo::Bar::Baz::QUUX\n" }
71
+ specify { expect(subject).to eq " optional ::Foo::Bar::Baz, :foo_bar, 3, :default => ::Foo::Bar::Baz::QUUX\n" }
63
72
  end
64
73
 
65
74
  context 'when the type is a string' do
66
75
  let(:type_enum) { :TYPE_STRING }
67
76
  let(:default_value) { "a default \"string\"" }
68
77
 
69
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :default => \"a default \"string\"\"\n" }
78
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :default => \"a default \"string\"\"\n" }
70
79
  end
71
80
 
72
81
  context 'when float or double field type' do
@@ -92,19 +101,47 @@ RSpec.describe ::Protobuf::Generators::FieldGenerator do
92
101
  context 'when the field is an extension' do
93
102
  let(:extendee) { 'foo.bar.Baz' }
94
103
 
95
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :extension => true\n" }
104
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :extension => true\n" }
96
105
  end
97
106
 
98
107
  context 'when field is packed' do
99
108
  let(:field_options) { { :packed => true } }
100
109
 
101
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :packed => true\n" }
110
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :packed => true\n" }
111
+ end
112
+
113
+ context 'when field is a map' do
114
+ let(:type_enum) { :TYPE_MESSAGE }
115
+ let(:type_name) { '.foo.bar.Baz.FooBarEntry' }
116
+ let(:label_enum) { :LABEL_REPEATED }
117
+ let(:nested_types) do
118
+ [::Google::Protobuf::DescriptorProto.new(
119
+ :name => 'FooBarEntry',
120
+ :field => [
121
+ ::Google::Protobuf::FieldDescriptorProto.new(
122
+ :label => :LABEL_OPTIONAL,
123
+ :name => 'key',
124
+ :number => 1,
125
+ :type => :TYPE_STRING,
126
+ :type_name => nil),
127
+ ::Google::Protobuf::FieldDescriptorProto.new(
128
+ :label => :LABEL_OPTIONAL,
129
+ :name => 'value',
130
+ :number => 2,
131
+ :type => :TYPE_ENUM,
132
+ :type_name => '.foo.bar.SnafuState'),
133
+ ],
134
+ :options => ::Google::Protobuf::MessageOptions.new(:map_entry => true)),
135
+ ]
136
+ end
137
+
138
+ specify { expect(subject).to eq " map :string, ::Foo::Bar::SnafuState, :foo_bar, 3\n" }
102
139
  end
103
140
 
104
141
  context 'when field is deprecated' do
105
142
  let(:field_options) { { :deprecated => true } }
106
143
 
107
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :deprecated => true\n" }
144
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :deprecated => true\n" }
108
145
  end
109
146
 
110
147
  context 'when field uses a custom option that is an extension' do
@@ -128,31 +165,31 @@ RSpec.describe ::Protobuf::Generators::FieldGenerator do
128
165
  describe 'option has a string value' do
129
166
  let(:field_options) { { :custom_string_option => 'boom' } }
130
167
 
131
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :custom_string_option => \"boom\"\n" }
168
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :custom_string_option => \"boom\"\n" }
132
169
  end
133
170
 
134
171
  describe 'option has a bool value' do
135
172
  let(:field_options) { { :custom_bool_option => true } }
136
173
 
137
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :custom_bool_option => true\n" }
174
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :custom_bool_option => true\n" }
138
175
  end
139
176
 
140
177
  describe 'option has a int32 value' do
141
178
  let(:field_options) { { :custom_int32_option => 123 } }
142
179
 
143
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :custom_int32_option => 123\n" }
180
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :custom_int32_option => 123\n" }
144
181
  end
145
182
 
146
183
  describe 'option has a message value' do
147
184
  let(:field_options) { { :custom_message_option => CustomFieldMessage.new(:foo => 'boom') } }
148
185
 
149
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :custom_message_option => { :foo => \"boom\" }\n" }
186
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :custom_message_option => { :foo => \"boom\" }\n" }
150
187
  end
151
188
 
152
189
  describe 'option has a enum value' do
153
190
  let(:field_options) { { :custom_enum_option => CustomFieldEnum::BAM } }
154
191
 
155
- specify { expect(subject).to eq "optional :string, :foo_bar, 3, :custom_enum_option => ::CustomFieldEnum::BAM\n" }
192
+ specify { expect(subject).to eq " optional :string, :foo_bar, 3, :custom_enum_option => ::CustomFieldEnum::BAM\n" }
156
193
  end
157
194
  end
158
195
  end
@@ -715,6 +715,43 @@ RSpec.describe Protobuf::Message do
715
715
  end
716
716
  end
717
717
 
718
+ describe 'map fields' do
719
+ it 'serializes the same as equivalent non-map-field' do
720
+ class MessageWithMapField < ::Protobuf::Message
721
+ map :int32, :string, :map, 1
722
+ end
723
+
724
+ class MessageWithoutMapField < ::Protobuf::Message
725
+ class MapEntry < ::Protobuf::Message
726
+ optional :int32, :key, 1
727
+ optional :string, :value, 2
728
+ end
729
+ repeated MapEntry, :map, 1
730
+ end
731
+
732
+ map_msg = MessageWithMapField.new(:map =>
733
+ {
734
+ 1 => 'one',
735
+ 2 => 'two',
736
+ 3 => 'three',
737
+ 4 => 'four',
738
+ })
739
+ mapless_msg = MessageWithoutMapField.new(:map =>
740
+ [{ :key => 1, :value => 'one' },
741
+ { :key => 2, :value => 'two' },
742
+ { :key => 3, :value => 'three' },
743
+ { :key => 4, :value => 'four' },
744
+ ])
745
+
746
+ map_bytes = map_msg.encode
747
+ mapless_bytes = mapless_msg.encode
748
+ expect(map_bytes).to eq(mapless_bytes)
749
+
750
+ expect(MessageWithMapField.decode(mapless_bytes)).to eq(map_msg)
751
+ expect(MessageWithoutMapField.decode(map_bytes)).to eq(mapless_msg)
752
+ end
753
+ end
754
+
718
755
  describe '.[]=' do
719
756
  context 'clearing fields' do
720
757
  it 'clears repeated fields with an empty array' do
@@ -86,7 +86,7 @@ RSpec.describe Protobuf::Rpc::Middleware::RequestDecoder do
86
86
  let(:request_wrapper) do
87
87
  ::Protobuf::Socketrpc::Request.new(
88
88
  :caller => client_host,
89
- :service_name => 'Foo',
89
+ :service_name => 'NonexistantService',
90
90
  :method_name => method_name.to_s,
91
91
  :request_proto => request,
92
92
  )
@@ -0,0 +1,157 @@
1
+
2
+ �!
3
+ map-test.protofoo"�
4
+ Baz2
5
+ looks_like_map ( 2.foo.Baz.LooksLikeMapEntry@
6
+ does_not_look_like_map ( 2 .foo.Baz.DoesNotLookLikeMapEntry3
7
+ LooksLikeMapEntry
8
+ key ( 
9
+ value ( :85
10
+ DoesNotLookLikeMapEntry
11
+ key ( 
12
+ value ( "�
13
+ Bar0
14
+
15
+
16
+ int32_to_baz ( 2.foo.Bar.Int32ToBazEntry.
17
+ int64_to_baz ( 2.foo.Bar.Int64ToBazEntry0
18
+
19
+
20
+
21
+ sint32_to_frobnitz ( 2.foo.Bar.Sint32ToFrobnitzEntry:
22
+ sint64_to_frobnitz ( 2.foo.Bar.Sint64ToFrobnitzEntry8
23
+ int32_to_frobnitz
24
+ ( 2.foo.Bar.Int32ToFrobnitzEntry8
25
+ int64_to_frobnitz ( 2.foo.Bar.Int64ToFrobnitzEntry:
26
+ uint32_to_frobnitz ( 2.foo.Bar.Uint32ToFrobnitzEntry:
27
+ uint64_to_frobnitz
28
  ( 2.foo.Bar.Uint64ToFrobnitzEntry:
29
+ string_to_frobnitz ( 2.foo.Bar.StringToFrobnitzEntry6
30
+ sint32_to_string ( 2.foo.Bar.Sint32ToStringEntry6
31
+ sint64_to_string ( 2.foo.Bar.Sint64ToStringEntry4
32
+ int32_to_string ( 2.foo.Bar.Int32ToStringEntry4
33
+ int64_to_string ( 2.foo.Bar.Int64ToStringEntry6
34
+ uint32_to_string ( 2.foo.Bar.Uint32ToStringEntry6
35
+ uint64_to_string ( 2.foo.Bar.Uint64ToStringEntry6
36
+ string_to_string ( 2.foo.Bar.StringToStringEntry4
37
+ sint32_to_float ( 2.foo.Bar.Sint32ToFloatEntry4
38
+ sint64_to_float ( 2.foo.Bar.Sint64ToFloatEntry2
39
+ int32_to_float ( 2.foo.Bar.Int32ToFloatEntry2
40
+ int64_to_float ( 2.foo.Bar.Int64ToFloatEntry4
41
+ uint32_to_float ( 2.foo.Bar.Uint32ToFloatEntry4
42
+ uint64_to_float ( 2.foo.Bar.Uint64ToFloatEntry4
43
+ string_to_float ( 2.foo.Bar.StringToFloatEntry6
44
+ sint32_to_double ( 2.foo.Bar.Sint32ToDoubleEntry6
45
+ sint64_to_double ( 2.foo.Bar.Sint64ToDoubleEntry4
46
+ int32_to_double ( 2.foo.Bar.Int32ToDoubleEntry4
47
+ int64_to_double ( 2.foo.Bar.Int64ToDoubleEntry6
48
+ uint32_to_double! ( 2.foo.Bar.Uint32ToDoubleEntry6
49
+ uint64_to_double" ( 2.foo.Bar.Uint64ToDoubleEntry6
50
+ string_to_double# ( 2.foo.Bar.StringToDoubleEntry<
51
+ Sint32ToBazEntry
52
+ key (
53
+ value ( 2.foo.Baz:8<
54
+ Sint64ToBazEntry
55
+ key (
56
+ value ( 2.foo.Baz:8;
57
+ Int32ToBazEntry
58
+ key (
59
+ value ( 2.foo.Baz:8;
60
+ Int64ToBazEntry
61
+ key (
62
+ value ( 2.foo.Baz:8<
63
+ Uint32ToBazEntry
64
+ key (
65
+ value ( 2.foo.Baz:8<
66
+ Uint64ToBazEntry
67
+ key (
68
+ value ( 2.foo.Baz:8<
69
+ StringToBazEntry
70
+ key ( 
71
+ value ( 2.foo.Baz:8F
72
+ Sint32ToFrobnitzEntry
73
+ key (
74
+ value (2
75
+ Sint64ToFrobnitzEntry
76
+ key (
77
+ value (2
78
+ Int32ToFrobnitzEntry
79
+ key (
80
+ value (2
81
+ Int64ToFrobnitzEntry
82
+ key (
83
+ value (2
84
+ Uint32ToFrobnitzEntry
85
+ key (
86
+ value (2
87
+ Uint64ToFrobnitzEntry
88
+ key (
89
+ value (2
90
+ StringToFrobnitzEntry
91
+ key ( 
92
+ value (2
93
+ Sint32ToStringEntry
94
+ key (
95
+ value ( :85
96
+ Sint64ToStringEntry
97
+ key (
98
+ value ( :84
99
+ Int32ToStringEntry
100
+ key (
101
+ value ( :84
102
+ Int64ToStringEntry
103
+ key (
104
+ value ( :85
105
+ Uint32ToStringEntry
106
+ key (
107
+ value ( :85
108
+ Uint64ToStringEntry
109
+ key (
110
+ value ( :85
111
+ StringToStringEntry
112
+ key ( 
113
+ value ( :84
114
+ Sint32ToFloatEntry
115
+ key (
116
+ value (:84
117
+ Sint64ToFloatEntry
118
+ key (
119
+ value (:83
120
+ Int32ToFloatEntry
121
+ key (
122
+ value (:83
123
+ Int64ToFloatEntry
124
+ key (
125
+ value (:84
126
+ Uint32ToFloatEntry
127
+ key (
128
+ value (:84
129
+ Uint64ToFloatEntry
130
+ key (
131
+ value (:84
132
+ StringToFloatEntry
133
+ key ( 
134
+ value (:85
135
+ Sint32ToDoubleEntry
136
+ key (
137
+ value (:85
138
+ Sint64ToDoubleEntry
139
+ key (
140
+ value (:84
141
+ Int32ToDoubleEntry
142
+ key (
143
+ value (:84
144
+ Int64ToDoubleEntry
145
+ key (
146
+ value (:85
147
+ Uint32ToDoubleEntry
148
+ key (
149
+ value (:85
150
+ Uint64ToDoubleEntry
151
+ key (
152
+ value (:85
153
+ StringToDoubleEntry
154
+ key ( 
155
+ value (:8*
156
+ Frobnitz
157
+ FROB
158
+ NITZ