1Sereal::Decoder(3)    User Contributed Perl Documentation   Sereal::Decoder(3)
2
3
4

NAME

6       Sereal::Decoder - Fast, compact, powerful binary deserialization
7

SYNOPSIS

9         use Sereal::Decoder
10           qw(decode_sereal sereal_decode_with_object scalar_looks_like_sereal);
11
12         my $decoder = Sereal::Decoder->new({...options...});
13
14         my $structure;
15         $decoder->decode($blob, $structure); # deserializes into $structure
16
17         # or if you don't have references to the top level structure, this works, too:
18         $structure = $decoder->decode($blob);
19
20         # alternatively functional interface: (See Sereal::Performance)
21         sereal_decode_with_object($decoder, $blob, $structure);
22         $structure = sereal_decode_with_object($decoder, $blob);
23
24         # much slower functional interface with no persistent objects:
25         decode_sereal($blob, {... options ...}, $structure);
26         $structure = decode_sereal($blob, {... options ...});
27
28         # Not a full validation, but just a quick check for a reasonable header:
29         my $is_likely_sereal = scalar_looks_like_sereal($some_string);
30         # or:
31         $is_likely_sereal = $decoder->looks_like_sereal($some_string);
32

DESCRIPTION

34       This library implements a deserializer for an efficient, compact-
35       output, and feature-rich binary protocol called Sereal.  Its sister
36       module Sereal::Encoder implements an encoder for this format.  The two
37       are released separately to allow for independent and safer upgrading.
38
39       The Sereal protocol versions that are compatible with this decoder
40       implementation are currently protocol versions 1, 2, 3 and 4. As it
41       stands, it will refuse to attempt to decode future versions of the
42       protocol, but if necessary there is likely going to be an option to
43       decode the parts of the input that are compatible with version 4 of the
44       protocol. The protocol was designed to allow for this.
45
46       The protocol specification and many other bits of documentation can be
47       found in the github repository. Right now, the specification is at
48       <https://github.com/Sereal/Sereal/blob/master/sereal_spec.pod>, there
49       is a discussion of the design objectives in
50       <https://github.com/Sereal/Sereal/blob/master/README.pod>, and the
51       output of our benchmarks can be seen at
52       <https://github.com/Sereal/Sereal/wiki/Sereal-Comparison-Graphs>.
53

CLASS METHODS

55   new
56       Constructor. Optionally takes a hash reference as first parameter. This
57       hash reference may contain any number of options that influence the
58       behaviour of the encoder.
59
60       Currently, the following options are recognized, none of them are on by
61       default.
62
63       refuse_snappy
64
65       If set, the decoder will refuse Snappy-compressed input data. This can
66       be desirable for robustness. See the section "ROBUSTNESS" below.
67
68       refuse_objects
69
70       If set, the decoder will refuse deserializing any objects in the input
71       stream and instead throw an exception. Defaults to off. See the section
72       "ROBUSTNESS" below.
73
74       no_bless_objects
75
76       If set, the decoder will deserialize any objects in the input stream
77       but without blessing them. Defaults to off. See the section
78       "ROBUSTNESS" below.
79
80       no_thaw_objects
81
82       If set, the decoder will deserialize frozen objects in the objects
83       stream as an array ref of arguments that would be passed into the THAW
84       subroutine instead of calling THAW itself.
85
86       validate_utf8
87
88       If set, the decoder will refuse invalid UTF-8 byte sequences. This is
89       off by default, but it's strongly encouraged to be turned on if you're
90       dealing with any data that has been encoded by an external source (e.g.
91       http cookies).
92
93       max_recursion_depth
94
95       "Sereal::Decoder" is recursive. If you pass it a Sereal document that
96       is deeply nested, it will eventually exhaust the C stack. Therefore,
97       there is a limit on the depth of recursion that is accepted. It
98       defaults to 10000 nested calls. You may choose to override this value
99       with the "max_recursion_depth" option.  Beware that setting it too high
100       can cause hard crashes.
101
102       Do note that the setting is somewhat approximate. Setting it to 10000
103       may break at somewhere between 9997 and 10003 nested structures
104       depending on their types.
105
106       max_num_hash_entries
107
108       If set to a non-zero value (default: 0), then "Sereal::Decoder" will
109       refuse to deserialize any hash/dictionary (or hash-based object) with
110       more than that number of entries. This is to be able to respond quickly
111       to any future hash-collision attacks on Perl's hash function, and also
112       the memory exhaustion attacks on Sereal itself. For a gentle
113       introduction to the topic from the cryptographic point of view, see
114       <http://en.wikipedia.org/wiki/Collision_attack>.
115
116       max_num_array_entries
117
118       If set to a non-zero value (default: 0), then "Sereal::Decoder" will
119       refuse to deserialize any array with more than that number of entries.
120       This is to be able to respond quickly to any future memory exhaustion
121       attacks on Sereal.
122
123       max_string_length
124
125       If set to a non-zero value (default: 0), then "Sereal::Decoder" will
126       refuse to deserialize any string with more than that number of
127       characters.  This is to be able to respond quickly to any future memory
128       exhaustion attacks on Sereal.
129
130       max_uncompressed_size
131
132       If set to a non-zero value (default: 0), then "Sereal::Decoder" will
133       refuse to deserialize any blob with a size that exceds the value when
134       uncompressed.  This is to be able to respond quickly to any future
135       memory exhaustion attacks on Sereal.
136
137       incremental
138
139       If set to a non-zero value (default: 0), then "Sereal::Decoder" will
140       destructively parse Sereal documents out of a variable. Every time a
141       Sereal document is successfully parsed it is removed from the front of
142       the string it is parsed from.
143
144       This means you can do this:
145
146           while (length $buffer) {
147               my $data= decode_sereal($buffer,{incremental=>1});
148           }
149
150       alias_smallint
151
152       If set to a true value then "Sereal::Decoder" will share integers from
153       -16 to 15 (encoded as either SRL_HDR_NEG and SRL_HDR_POS) as read-only
154       aliases to a common SV.
155
156       The result of this may be significant space savings in data structures
157       with many integers in the specified range. The cost is more memory used
158       by the decoder and a very modest speed penalty when deserializing.
159
160       Note this option changes the structure of the dumped data. Use with
161       caution.
162
163       See also the "alias_varint_under" option.
164
165       alias_varint_under
166
167       If set to a true positive integer smaller than 16 then this option is
168       similar to setting "alias_smallint" and causes all integers from -16 to
169       15 to be shared as read-only aliases to the same SV, except that this
170       treatment ALSO applies to SRL_HDR_VARINT. If set to a value larger than
171       16 then this applies to all varints varints under the value set. (In
172       general SRL_HDR_VARINT is used only for integers larger than 15, and
173       SRL_HDR_NEG and SRL_HDR_POS are used for -16 to -1  and 0 to 15
174       respectively.)
175
176       In simple terms if you want to share values larger than 16 then you
177       should use this option, if you want to share only values in the -16 to
178       15 range then you should use the "alias_smallint" option instead.
179
180       The result of this may be significant space savings in data structures
181       with many integers in the desire range. The cost is more memory used by
182       the decoder and a very modest speed penalty when deserializing.
183
184       Note this option changes the structure of the dumped data. Use with
185       caution.
186
187       use_undef
188
189       If set to a true value then this any undef value to be deserialized as
190       PL_sv_undef. This may change the structure of the data structure being
191       dumped, do not enable this unless you know what you are doing.
192
193       set_readonly
194
195       If set to a true value then the output will be completely readonly
196       (deeply).
197
198       set_readonly_scalars
199
200       If set to a true value then scalars in the output will be readonly
201       (deeply).  References won't be readonly.
202

INSTANCE METHODS

204   decode
205       Given a byte string of Sereal data, the "decode" call deserializes that
206       data structure. The result can be obtained in one of two ways: "decode"
207       accepts a second parameter, which is a scalar to write the result to,
208       AND "decode" will return the resulting data structure.
209
210       The two are subtly different in case of data structures that contain
211       references to the root element. In that case, the return value will be
212       a (non-recursive) copy of the reference. The pass-in style is more
213       correct.  In other words,
214
215         $decoder->decode($sereal_string, my $out);
216         # is almost the same but safer than:
217         my $out = $decoder->decode($sereal_string);
218
219       This is an unfortunate side-effect of perls standard copy semantics of
220       assignment. Possibly one day we will have an alternative to this.
221
222   decode_with_header
223       Given a byte string of Sereal data, the "decode_with_header" call
224       deserializes that data structure as "decode" would do, however it also
225       decodes the optional user data structure that can be embedded into a
226       Sereal document, inside the header  (see Sereal::Encoder::encode).
227
228       It accepts an optional second parameter, which is a scalar to write the
229       body to, and an optional third parameter, which is a scalar to write
230       the header to.
231
232       Regardless of the number of parameters received, "decode_with_header"
233       returns an ArrayRef containing the deserialized header, and the
234       deserialized body, in this order.
235
236       See "decode" for the subtle difference between the one, two and three
237       parameters versions.
238
239       If there is no header in a Sereal document, corresponding variable or
240       return value will be set to undef.
241
242   decode_only_header
243       Given a byte string of Sereal data, the "decode_only_header"
244       deserializes only the optional user data structure that can be embedded
245       into a Sereal document, inside the header (see
246       Sereal::Encoder::encode).
247
248       It accepts an optional second parameter, which is a scalar to write the
249       header to.
250
251       Regardless of the number of parameters received, "decode_only_header"
252       returns the resulting data structure.
253
254       See "decode" for the subtle difference between the one and two
255       parameters versions.
256
257       If there is no header in a Sereal document, corresponding variable or
258       return value will be set to undef.
259
260   decode_with_offset
261       Same as the "decode" method, except as second parameter, you must pass
262       an integer offset into the input string, at which the decoding is to
263       start. The optional "pass-in" style scalar (see "decode" above) is
264       relegated to being the third parameter.
265
266   decode_only_header_with_offset
267       Same as the "decode_only_header" method, except as second parameter,
268       you must pass an integer offset into the input string, at which the
269       decoding is to start. The optional "pass-in" style scalar (see
270       "decode_only_header" above) is relegated to being the third parameter.
271
272   decode_with_header_and_offset
273       Same as the "decode_with_header" method, except as second parameter,
274       you must pass an integer offset into the input string, at which the
275       decoding is to start. The optional "pass-in" style scalars (see
276       "decode_with_header" above) are relegated to being the third and fourth
277       parameters.
278
279   bytes_consumed
280       After using the various "decode" methods documented previously,
281       "bytes_consumed" can return the number of bytes from the body of the
282       input string that were actually consumed by the decoder. That is, if
283       you append random garbage to a valid Sereal document, "decode" will
284       happily decode the data and ignore the garbage. If that is an error in
285       your use case, you can use "bytes_consumed" to catch it.
286
287         my $out = $decoder->decode($sereal_string);
288         if (length($sereal_string) != $decoder->bytes_consumed) {
289           die "Not all input data was consumed!";
290         }
291
292       Chances are that if you do this, you're violating UNIX philosophy in
293       "be strict in what you emit but lenient in what you accept".
294
295       You can also use this to deserialize a list of Sereal documents that is
296       concatenated into the same string (code not very robust...):
297
298         my @out;
299         my $pos = 0;
300         eval {
301           while (1) {
302             push @out, $decoder->decode_with_offset($sereal_string, $pos);
303             $pos += $decoder->bytes_consumed;
304             last if $pos >= length($sereal_string)
305                  or not $decoder->bytes_consumed;
306           }
307         };
308
309       As mentioned, only the bytes consumed from the body are considered. So
310       the following example is correct, as only the header is deserialized:
311
312         my $header = $decoder->decode_only_header($sereal_string);
313         my $count = $decoder->bytes_consumed;
314         # $count is 0
315
316   decode_from_file
317           Sereal::Decoder->decode_from_file($file);
318           $decoder->decode_from_file($file);
319
320       Read and decode the file specified. If called in list context and
321       incremental mode is enabled then decodes all packets contained in the
322       file and returns a list, otherwise decodes the first (or only) packet
323       in the file. Accepts an optinal "target" variable as a second argument.
324
325   looks_like_sereal
326       Performs some rudimentary check to determine if the argument appears to
327       be a valid Sereal packet or not. These tests are not comprehensive and
328       a true result does not mean that the document is valid, merely that it
329       appears to be valid. On the other hand a false result is always
330       reliable.
331
332       The return of this method may be treated as a simple boolean but is in
333       fact a more complex return. When the argument does not look anything
334       like a Sereal document then the return is perl's FALSE, which has the
335       property of being string equivalent to "" and numerically equivalent to
336       0. However when the argument appears to be a UTF-8 encoded protocol 3
337       Sereal document (by noticing that the \xF3 in the magic string has been
338       replaced by \xC3\xB3) then it returns 0 (the number, which is string
339       equivalent to "0"), and otherwise returns the protocol version of the
340       document. This means you can write something like this:
341
342           $type= Sereal::Decoder->looks_like_sereal($thing);
343           if ($type eq '') {
344               say "Not a Sereal document";
345           } elsif ($type eq '0') {
346               say "Possibly utf8 encoded Sereal document";
347           } else {
348               say "Sereal document version $type";
349           }
350
351       For reference, Sereal's magic value is a four byte string which is
352       either "=srl" for protocol version 1 and 2 or "=\xF3rl" for protocol
353       version 3 and later. This function checks that the magic string
354       corresponds with the reported version number, as well as other checks,
355       which may be enhanced in the future.
356
357       Note that looks_like_sereal() may be called as a class or object
358       method, and may also be called as a single argument function. See the
359       related scalar_looks_like_sereal() for a version which may ONLY be
360       called as a function, not as a method (and which is typically much
361       faster).
362

EXPORTABLE FUNCTIONS

364   sereal_decode_with_object
365       The functional interface that is equivalent to using "decode". Takes a
366       decoder object reference as first parameter, followed by a byte string
367       to deserialize.  Optionally takes a third parameter, which is the
368       output scalar to write to. See the documentation for "decode" above for
369       details.
370
371       This functional interface is marginally faster than the OO interface
372       since it avoids method resolution overhead and, on sufficiently modern
373       Perl versions, can usually avoid subroutine call overhead. See
374       Sereal::Performance for a discussion on how to tune Sereal for maximum
375       performance if you need to.
376
377   sereal_decode_with_header_with_object
378       The functional interface that is equivalent to using
379       "decode_with_header".  Takes a decoder object reference as first
380       parameter, followed by a byte string to deserialize. Optionally takes
381       third and fourth parameters, which are the output scalars to write to.
382       See the documentation for "decode_with_header" above for details.
383
384       This functional interface is marginally faster than the OO interface
385       since it avoids method resolution overhead and, on sufficiently modern
386       Perl versions, can usually avoid subroutine call overhead. See
387       Sereal::Performance for a discussion on how to tune Sereal for maximum
388       performance if you need to.
389
390   sereal_decode_only_header_with_object
391       The functional interface that is equivalent to using
392       "decode_only_header".  Takes a decoder object reference as first
393       parameter, followed by a byte string to deserialize. Optionally takes a
394       third parameters, which outputs scalars to write to.  See the
395       documentation for "decode_with_header" above for details.
396
397       This functional interface is marginally faster than the OO interface
398       since it avoids method resolution overhead and, on sufficiently modern
399       Perl versions, can usually avoid subroutine call overhead. See
400       Sereal::Performance for a discussion on how to tune Sereal for maximum
401       performance if you need to.
402
403   sereal_decode_only_header_with_offset_with_object
404       The functional interface that is equivalent to using
405       "decode_only_header_with_offset".  Same as the
406       "sereal_decode_only_header_with_object" function, except as the third
407       parameter, you must pass an integer offset into the input string, at
408       which the decoding is to start. The optional "pass-in" style scalar
409       (see "sereal_decode_only_header_with_object" above) is relegated to
410       being the fourth parameter.
411
412       This functional interface is marginally faster than the OO interface
413       since it avoids method resolution overhead and, on sufficiently modern
414       Perl versions, can usually avoid subroutine call overhead. See
415       Sereal::Performance for a discussion on how to tune Sereal for maximum
416       performance if you need to.
417
418   sereal_decode_with_header_and_offset_with_object
419       The functional interface that is equivalent to using
420       "decode_with_header_and_offset".  Same as the
421       "sereal_decode_with_header_with_object" function, except as the third
422       parameter, you must pass an integer offset into the input string, at
423       which the decoding is to start. The optional "pass-in" style scalars
424       (see "sereal_decode_with_header_with_object" above) are relegated to
425       being the fourth and fifth parameters.
426
427       This functional interface is marginally faster than the OO interface
428       since it avoids method resolution overhead and, on sufficiently modern
429       Perl versions, can usually avoid subroutine call overhead. See
430       Sereal::Performance for a discussion on how to tune Sereal for maximum
431       performance if you need to.
432
433   sereal_decode_with_offset_with_object
434       The functional interface that is equivalent to using
435       "decode_with_offset".  Same as the "sereal_decode_with_object"
436       function, except as the third parameter, you must pass an integer
437       offset into the input string, at which the decoding is to start. The
438       optional "pass-in" style scalar (see "sereal_decode_with_object" above)
439       is relegated to being the third parameter.
440
441       This functional interface is marginally faster than the OO interface
442       since it avoids method resolution overhead and, on sufficiently modern
443       Perl versions, can usually avoid subroutine call overhead. See
444       Sereal::Performance for a discussion on how to tune Sereal for maximum
445       performance if you need to.
446
447   decode_sereal
448       The functional interface that is equivalent to using "new" and
449       "decode".  Expects a byte string to deserialize as first argument,
450       optionally followed by a hash reference of options (see documentation
451       for new()). Finally, "decode_sereal" supports a third parameter, which
452       is the output scalar to write to. See the documentation for "decode"
453       above for details.
454
455       This functional interface is significantly slower than the OO interface
456       since it cannot reuse the decoder object.
457
458   decode_sereal_with_header_data
459       The functional interface that is equivalent to using "new" and
460       "decode_with_header".  Expects a byte string to deserialize as first
461       argument, optionally followed by a hash reference of options (see
462       documentation for new()). Finally, "decode_sereal" supports third and
463       fourth parameters, which are the output scalars to write to. See the
464       documentation for "decode_with_header" above for details.
465
466       This functional interface is significantly slower than the OO interface
467       since it cannot reuse the decoder object.
468
469   scalar_looks_like_sereal
470       The functional interface that is equivalent to using
471       "looks_like_sereal".
472
473       Note that this version cannot be called as a method. It is normally
474       executed as a custom opcode, as such errors about its usage may be
475       caught at compile time, and it should be much faster than
476       looks_like_sereal.
477

ROBUSTNESS

479       This implementation of a Sereal decoder tries to be as robust to
480       invalid input data as reasonably possible. This means that it should
481       never (though read on) segfault. It may, however, cause a large malloc
482       to fail. Generally speaking, invalid data should cause a Perl-trappable
483       exception. The one exception is that for Snappy-compressed Sereal
484       documents, the Snappy library may cause segmentation faults (invalid
485       reads or writes).  This should only be a problem if you do not checksum
486       your data (internal checksum support is a To-Do) or if you accept data
487       from potentially malicious sources.
488
489       It requires a lot of run-time boundary checks to prevent decoder
490       segmentation faults on invalid data. We implemented them in the
491       lightest way possible. Adding robustness against running out of memory
492       would cause an very significant run-time overhead. In most cases of
493       random garbage (with valid header no less) when a malloc() fails due to
494       invalid data, the problem was caused by a very large array or string
495       length. This kind of very large malloc can then fail, being trappable
496       from Perl. Only when packet causes many repeated allocations do you
497       risk causing a hard OOM error from the kernel that cannot be trapped
498       because Perl may require some small allocations to succeed before the
499       now-invalid memory is released. It is at least not entirely trivial to
500       craft a Sereal document that causes this behaviour.
501
502       Finally, deserializing proper objects is potentially a problem because
503       classes can define a destructor. Thus, the data fed to the decoder can
504       cause the (deferred) execution of any destructor in your application.
505       That's why the "refuse_objects" option exists and what the
506       "no_bless_objects" can be used for as well. Later on, we may or may not
507       provide a facility to whitelist classes. Furthermore, if the encoder
508       emitted any objects using "FREEZE" callbacks, the "THAW" class method
509       may be invoked on the respective classes. If you can't trust the source
510       of your Sereal documents, you may want to use the "refuse_objects"
511       option. For more details on the "FREEZE/THAW" mechanism, please refer
512       to Sereal::Encoder.
513

FREEZE/THAW CALLBACK MECHANISM

515       Some objects do not lend themselves naturally to naive perl
516       datastructure level serialization. For instance XS code might use a
517       hidden structure that would not get serialized, or an object may
518       contain volatile data like a filehandle that would not be reconstituted
519       properly. To support cases like this "Sereal" supports a FREEZE and
520       THAW api. When objects are serialized their FREEZE method is asked for
521       a replacement representation, and when objects are deserialized their
522       THAW method is asked to convert that replacement back to something
523       useful.
524
525       For security reasons decoding an object will NOT autoload any modules
526       to support THAW, however if the classes and methods are preloaded it
527       will invoke THAW as required and an exception will be thrown if the
528       class has not been loaded. It is possible to disable THAW in the
529       decoder by using the "no_thaw_objects" option, which when true causes
530       frozen objects to be blessed into a special utility class
531       "Sereal::Decoder::THAW_args" for debugging. The objects themselves are
532       an array, whose last member will contain the class name the arguments
533       are for.
534
535       Prior to v4.024 the decoder had issues with frozen representations that
536       contained other objects and did not define a specific order that items
537       would be thawed and blessed, making it impractical to put an object
538       inside of the frozen representation of another object.
539
540       As of v4.024 frozen representations may contain other objects, and the
541       order in which they are thawed is defined to be LIFO, thus the
542       arguments to a THAW method will themselves be thawed (if need be)
543       before the call to the containing objects THAW method. Thawing occurs
544       only after all simple objects have been blessed into their appropriate
545       object form.
546
547       The FREEZE/THAW mechanism is inspired by the equivalent mechanism in
548       CBOR::XS. The general mechanism is documented in the A GENERIC OBJECT
549       SERIALIATION PROTOCOL section of Types::Serialiser.  Similar to CBOR
550       using "CBOR", Sereal uses the string "Sereal" as a serializer
551       identifier for the callbacks.
552

PERFORMANCE

554       Please refer to the Sereal::Performance document that has more detailed
555       information about Sereal performance and tuning thereof.
556

THREAD-SAFETY

558       "Sereal::Decoder" is thread-safe on Perl's 5.8.7 and higher. This means
559       "thread-safe" in the sense that if you create a new thread, all
560       "Sereal::Decoder" objects will become a reference to undef in the new
561       thread. This might change in a future release to become a full clone of
562       the decoder object.
563

BUGS, CONTACT AND SUPPORT

565       For reporting bugs, please use the github bug tracker at
566       <http://github.com/Sereal/Sereal/issues>.
567
568       For support and discussion of Sereal, there are two Google Groups:
569
570       Announcements around Sereal (extremely low volume):
571       <https://groups.google.com/forum/?fromgroups#!forum/sereal-announce>
572
573       Sereal development list:
574       <https://groups.google.com/forum/?fromgroups#!forum/sereal-dev>
575

AUTHORS AND CONTRIBUTORS

577       Yves Orton <demerphq@gmail.com>
578
579       Damian Gryski
580
581       Steffen Mueller <smueller@cpan.org>
582
583       Rafaël Garcia-Suarez
584
585       Ævar Arnfjörð Bjarmason <avar@cpan.org>
586
587       Tim Bunce
588
589       Daniel Dragan <bulkdd@cpan.org> (Windows support and bugfixes)
590
591       Zefram
592
593       Borislav Nikolov
594
595       Ivan Kruglov <ivan.kruglov@yahoo.com>
596
597       Eric Herman <eric@freesa.org>
598
599       Some inspiration and code was taken from Marc Lehmann's excellent
600       JSON::XS module due to obvious overlap in problem domain.
601

ACKNOWLEDGMENT

603       This module was originally developed for Booking.com.  With approval
604       from Booking.com, this module was generalized and published on CPAN,
605       for which the authors would like to express their gratitude.
606
608       Copyright (C) 2012, 2013, 2014 by Steffen Mueller Copyright (C) 2012,
609       2013, 2014 by Yves Orton
610
611       The license for the code in this distribution is the following, with
612       the exceptions listed below:
613
614       This library is free software; you can redistribute it and/or modify it
615       under the same terms as Perl itself.
616
617       Except portions taken from Marc Lehmann's code for the JSON::XS module,
618       which is licensed under the same terms as this module.  (Many thanks to
619       Marc for inspiration, and code.)
620
621       Also except the code for Snappy compression library, whose license is
622       reproduced below and which, to the best of our knowledge, is compatible
623       with this module's license. The license for the enclosed Snappy code
624       is:
625
626         Copyright 2011, Google Inc.
627         All rights reserved.
628
629         Redistribution and use in source and binary forms, with or without
630         modification, are permitted provided that the following conditions are
631         met:
632
633           * Redistributions of source code must retain the above copyright
634         notice, this list of conditions and the following disclaimer.
635           * Redistributions in binary form must reproduce the above
636         copyright notice, this list of conditions and the following disclaimer
637         in the documentation and/or other materials provided with the
638         distribution.
639           * Neither the name of Google Inc. nor the names of its
640         contributors may be used to endorse or promote products derived from
641         this software without specific prior written permission.
642
643         THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
644         "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
645         LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
646         A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
647         OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
648         SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
649         LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
650         DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
651         THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
652         (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
653         OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
654
655
656
657perl v5.38.0                      2023-07-21                Sereal::Decoder(3)
Impressum