root/trunk/whispercast/rtmp_client.cc

Revision 7, 43.6 kB (checked in by whispercastorg, 2 years ago)

version 0.2.0

Line 
1 // Copyright (c) 2009, Whispersoft s.r.l.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are
6 // met:
7 //
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above
11 // copyright notice, this list of conditions and the following disclaimer
12 // in the documentation and/or other materials provided with the
13 // distribution.
14 // * Neither the name of Whispersoft s.r.l. nor the names of its
15 // contributors may be used to endorse or promote products derived from
16 // this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: Catalin Popescu
31 //
32 // A simple client that talks with the rtmp server -- not much ..
33 //
34 #include <whisperlib/common/base/types.h>
35 #include <whisperlib/common/base/log.h>
36 #include <whisperlib/common/base/system.h>
37 #include <whisperlib/common/base/gflags.h>
38 #include <whisperlib/common/base/errno.h>
39 #include <whisperlib/common/base/strutil.h>
40 #include <whisperlib/common/io/file/file.h>
41
42 #include <whisperlib/net/base/selector.h>
43 #include <whisperlib/net/base/connection.h>
44 #include <whisperstreamlib/rtmp/rtmp_protocol_data.h>
45 #include <whisperstreamlib/rtmp/rtmp_coder.h>
46 #include <whisperstreamlib/rtmp/events/rtmp_event.h>
47 #include <whisperstreamlib/rtmp/events/rtmp_event_invoke.h>
48 #include <whisperstreamlib/rtmp/events/rtmp_call.h>
49 #include <whisperstreamlib/rtmp/events/rtmp_event_ping.h>
50 #include <whisperstreamlib/rtmp/objects/rtmp_objects.h>
51 #include <whisperstreamlib/rtmp/objects/amf/amf_util.h>
52
53 #include <whisperstreamlib/flv/flv_tag.h>
54
55 using namespace rtmp;
56
57 //////////////////////////////////////////////////////////////////////
58 //
59 // Some static handshake data - definition
60 //
61 extern const uint8 kFirstHandshake[kHandshakeSize];
62 extern const uint8 kSecondHandshake[kHandshakeSize];
63
64 static int32 glb_num_connections = 0;
65
66 //////////////////////////////////////////////////////////////////////
67
68 DEFINE_int32(server_port,
69              1935,
70              "Where to connect (port)");
71 DEFINE_string(server_host,
72               "127.0.0.1",
73               "Where to connect (host)");
74 DEFINE_string(stream_name,
75               "camera",
76               "The stream to play");
77 DEFINE_int32(num_connections,
78              1,
79              "Number of connections for our test");
80 DEFINE_int32(time_between_connections_ms,
81              100,
82              "Start a new connection after this time ... ");
83 DEFINE_int32(connection_run_time_sec,
84              0,
85              "Run a connection for this long (if non zero)... ");
86 DEFINE_int32(seek_pos_ms,
87              0,
88              "If non zero it issues a seek at the specified position "
89              "in miliseconds, after receiving --seek_after_events rtmp "
90              "events");
91 DEFINE_int32(seek_after_events,
92              100,
93              "When to performt the seek if --seek_pos_ms is non-zero. We "
94              "do the seek after receiving these many events");
95 DEFINE_string(dump_video_file,
96               "",
97               "Dumps the received flv to a file (if specified)");
98 DEFINE_bool(log_received_events,
99             false,
100             "Should we log the events  that we receive ?");
101 DEFINE_bool(log_detailed_media_events,
102             false,
103             "Log in detail the content of a media rtmp event");
104 DEFINE_bool(loop,
105             false,
106             "Run requests in loops ?");
107
108 //////////////////////////////////////////////////////////////////////
109
110 class TestConnection {
111   static const int kConnectEvent = 1;
112   static const int kReadEvent = 2;
113   static const int kWriteEvent = 3;
114
115   static const int kConnectTimeout = 1000000;
116   static const int kReadTimeout = 1000000;
117   static const int kWriteTimeout = 1000000;
118  public:
119   TestConnection(net::Selector* selector,
120                  int id,
121                  io::File* trace_file)
122     : selector_(selector),
123       net_connection_(new net::TcpConnection(
124                                 selector,
125                                 net::TcpConnectionParams(common::BIGENDIAN))),
126       id_(id),
127       trace_file_(trace_file),
128       serializer_(trace_file_ == NULL ? NULL :
129                   new streaming::FlvTagSerializer()),
130       saved_(trace_file_ == NULL ? NULL :
131              new io::MemoryStream(common::BIGENDIAN)),
132       handshake_passed_(false),
133       protocol_(new rtmp::ProtocolData()),
134       coder_(new rtmp::Coder(protocol_, 1 << 20)),
135       state_(0),
136       seek_sent_(false),
137       num_events_(0),
138       timestamp_(0),
139       events_size_(0),
140       timeouter_(selector, NewPermanentCallback(
141           this, &TestConnection::TimeoutHandler)) {
142     LOG_INFO << " New client: " << id;
143     net_connection_->SetReadHandler(NewPermanentCallback(
144         this, &TestConnection::ConnectionReadHandler), true);
145     net_connection_->SetWriteHandler(NewPermanentCallback(
146         this, &TestConnection::ConnectionWriteHandler), true);
147     net_connection_->SetConnectHandler(NewPermanentCallback(
148         this, &TestConnection::ConnectionConnectHandler), true);
149     net_connection_->SetCloseHandler(NewPermanentCallback(
150         this, &TestConnection::ConnectionCloseHandler), true);
151     selector->RunInSelectLoop(
152       NewCallback(this, &TestConnection::StartClient,
153                   net::HostPort(FLAGS_server_host.c_str(),
154                                 FLAGS_server_port)));
155     if ( FLAGS_connection_run_time_sec > 0 ) {
156       selector->RegisterAlarm(NewCallback(this, &TestConnection::FlushAndClose),
157                               FLAGS_connection_run_time_sec * 1000);
158     }
159     if ( serializer_ ) {
160       serializer_->Initialize(saved_);
161     }
162     glb_num_connections++;
163   }
164   virtual ~TestConnection() {
165     LOG_INFO << " Deleting ====> " << id_;
166     delete net_connection_;
167     net_connection_ = NULL;
168     if ( FLAGS_loop ) {
169       new TestConnection(selector_, id_, NULL);
170     } else {
171       glb_num_connections--;
172       if ( glb_num_connections == 0 ) {
173         selector_->RunInSelectLoop(NewCallback(selector_,
174                                                &net::Selector::MakeLoopExit));
175       }
176     }
177   }
178  private:
179   void TimeoutHandler(int64 timeout_id) {
180     LOG_ERROR << "Timeout timeout_id: " << timeout_id
181               << " , closing connection...";
182     net_connection_->ForceClose();
183   }
184  protected:
185   void FlushAndClose() {
186     net_connection_->FlushAndClose();
187   }
188
189   void ConnectionConnectHandler() {
190     LOG_INFO << " CONNECTED !";
191     timeouter_.UnsetTimeout(kConnectEvent);
192     SendRequest();
193   }
194   bool ConnectionReadHandler() {
195     timeouter_.SetTimeout(kReadEvent, kReadTimeout);
196     // RequestReadEvents(true);
197     if ( !handshake_passed_ ) {
198       LOG_INFO << "Handshaking A: @" << net_connection_->inbuf()->Size();
199       if ( net_connection_->inbuf()->Size() < 2 * kHandshakeSize + 1 ) {
200         return true;
201       }
202       handshake_passed_ = true;
203       net_connection_->inbuf()->Skip(2 * kHandshakeSize + 1);
204       net_connection_->Write(kSecondHandshake, sizeof(kSecondHandshake));
205     }
206     if ( state_ == 0 ) {
207       rtmp::EventInvoke connect(protocol_, 3, 0);
208       connect.set_call(new rtmp::PendingCall());
209       connect.set_invoke_id(1);
210       connect.mutable_call()->set_method_name("connect");
211       CStringMap* params = new CStringMap;
212       params->append("fpad", new CBoolean(false));
213       params->append("flashVer", new CString("LNX 9,0,124,0"));
214       params->append("capabilities", new CNumber(15));
215       params->append("audioCodecs", new CNumber(1639));
216       params->append("videoCodecs", new CNumber(252));
217       params->append("videoFunction", new CNumber(1));
218       connect.set_connection_params(params);
219
220       state_ = 1;
221       LOG_INFO << " Handshaked - sending: " << connect.ToString();
222
223       coder_->Encode(net_connection_->outbuf(),
224                      AmfUtil::AMF0_VERSION, &connect);
225
226       // Buffer should clean quite fast..
227       timeouter_.SetTimeout(kWriteEvent, kWriteTimeout);
228       net_connection_->RequestWriteEvents(true);
229       // And we should get some data from the server back
230       timeouter_.SetTimeout(kReadEvent, kReadTimeout);
231     }
232
233     AmfUtil::ReadStatus err;
234     do {
235       rtmp::Event* event = NULL;
236       err = coder_->Decode(net_connection_->inbuf(),
237                            AmfUtil::AMF0_VERSION, &event);
238       if ( err != AmfUtil::READ_OK && err != AmfUtil::READ_NO_DATA ) {
239         LOG_FATAL << " Wrong data received from server !!" << err
240                   << " id_: " << id_ << " @ size: " << events_size_;
241       }
242       if ( event != NULL ) {
243         events_size_ += event->header()->event_size();
244         if ( FLAGS_log_received_events ) {
245           printf(" Event: %s -> %s\n",
246                  event->header()->ToString().c_str(),
247                  event->ToString().c_str());
248           if ( event->event_type() == rtmp::EVENT_MEDIA_DATA &&
249                FLAGS_log_detailed_media_events ) {
250             rtmp::BulkDataEvent* bd  =
251                 reinterpret_cast< rtmp::BulkDataEvent* >(event);
252             io::MemoryStream* ms = bd->mutable_data();
253             ms->MarkerSet();
254             int i = 0;
255             do {
256               int8 type = io::NumStreamer::ReadByte(ms);
257               int32 size = io::NumStreamer::ReadUInt24(ms, common::BIGENDIAN);
258               int32 timestamp_delta_low =
259                   io::NumStreamer::ReadUInt24(ms, common::BIGENDIAN);
260               int32 timestamp_delta_hi = io::NumStreamer::ReadByte(ms);
261               int32 timestamp = ((timestamp_delta_low & 0xFFFFFF) |
262                                  ((timestamp_delta_hi & 0xFF) << 24));
263               int32 stream_id =
264                   io::NumStreamer::ReadUInt24(ms, common::BIGENDIAN);
265               printf("    -> Inner %03d: @%10d: %d [ %10d on %3d ]\n",
266                      i,
267                      static_cast<int>(timestamp),
268                      static_cast<int>(type),
269                      static_cast<int>(size),
270                      static_cast<int>(stream_id));
271               ms->Skip(size + sizeof(int32));
272               ++i;
273             } while ( !ms->IsEmpty() );
274             ms->MarkerRestore();
275           }
276         }
277         if ( event->event_type() == rtmp::EVENT_INVOKE ) {
278           if ( state_ < 3 ) {
279             if ( state_ == 1 )  {
280               rtmp::EventInvoke createStream(protocol_, 3, 0);
281               createStream.set_call(new rtmp::PendingCall());
282               createStream.set_invoke_id(2);
283               createStream.mutable_call()->set_method_name("createStream");
284               coder_->Encode(net_connection_->outbuf(),
285                              AmfUtil::AMF0_VERSION,
286                              &createStream);
287               LOG_INFO << " Sending createStream: " << createStream.ToString();
288             } else if ( state_ == 2 ) {
289               rtmp::EventInvoke* invoke =
290                 reinterpret_cast<rtmp::EventInvoke *>(event);
291               if ( invoke->invoke_id() != 2 ) {
292                 LOG_INFO << " Skipping - waiting for createStream answer";
293                 continue;
294               }
295               if ( !invoke->call()->arguments().empty() &&
296                    invoke->call()->arguments()[0]->object_type() ==
297                    CObject::CORE_NUMBER ) {
298                 const CNumber* id = reinterpret_cast<const CNumber*>(
299                   invoke->call()->arguments()[0]);
300                 stream_id_ = int(id->value());
301                 LOG_INFO << " Setting stream id to: " << stream_id_;
302               }
303               rtmp::EventInvoke play(protocol_, 2, stream_id_);
304               play.set_call(new rtmp::PendingCall());
305               play.set_invoke_id(0);
306               play.mutable_call()->set_method_name("play");
307               CString* stream_name = new CString(
308                 strutil::StringPrintf(FLAGS_stream_name.c_str(), id_));
309               play.mutable_call()->AddArgument(stream_name);
310               coder_->Encode(net_connection_->outbuf(),
311                              AmfUtil::AMF0_VERSION,
312                              &play);
313               LOG_INFO << " Sending play: " << play.ToString();
314             }
315             state_++;
316             // Buffer should clean quite fast..
317             timeouter_.SetTimeout(kWriteEvent, kWriteTimeout);
318             net_connection_->RequestWriteEvents(true);
319             // And we should get some data from the server back
320             timeouter_.SetTimeout(kReadEvent, kReadTimeout);
321             net_connection_->RequestReadEvents(true);
322           }
323         }
324         if ( FLAGS_seek_pos_ms > 0 &&
325              num_events_ > FLAGS_seek_after_events &&
326              !seek_sent_ ) {
327           rtmp::EventInvoke pause(protocol_, 8, stream_id_);
328           pause.mutable_header()->set_timestamp_ms(timestamp_ + 100);
329           pause.set_call(new rtmp::PendingCall());
330           pause.set_invoke_id(0);
331           pause.mutable_call()->set_method_name("pause");
332           CBoolean* arg0 = new CBoolean(true);
333           CNumber* arg1 = new CNumber(timestamp_);
334           pause.mutable_call()->AddArgument(arg0);
335           pause.mutable_call()->AddArgument(arg1);
336           coder_->Encode(net_connection_->outbuf(),
337                          AmfUtil::AMF0_VERSION,
338                          &pause);
339           LOG_INFO << " Sending pause: " << *pause.header() << " - "
340                    << pause;
341           seek_sent_ = true;
342           rtmp::EventInvoke seek(protocol_, 8, stream_id_);
343           seek.set_call(new rtmp::PendingCall());
344           seek.set_invoke_id(0);
345           seek.mutable_call()->set_method_name("seek");
346           CNumber* position = new CNumber(FLAGS_seek_pos_ms);
347           seek.mutable_call()->AddArgument(position);
348           coder_->Encode(net_connection_->outbuf(),
349                          AmfUtil::AMF0_VERSION,
350                          &seek);
351           LOG_INFO << " Sending seek: " << seek.ToString();
352         }
353         num_events_++;
354         if ( event->header()->is_timestamp_relative() ) {
355           timestamp_ += event->header()->timestamp_ms();
356         } else {
357           timestamp_ = event->header()->timestamp_ms();
358         }
359         if ( trace_file_ ) {
360           streaming::FlvTag* tag = NULL;
361           if ( event->header()->channel_id() == 7 &&
362                event->event_type() == rtmp::EVENT_NOTIFY ) {
363             tag = new streaming::FlvTag();
364             tag->set_use_relative_timestamps(
365               event->header()->is_timestamp_relative());
366             tag->set_timestamp(
367               event->header()->timestamp_ms());
368             tag->set_data_type(streaming::FLV_FRAMETYPE_METADATA);
369             event->WriteToMemoryStream(tag->mutable_data(),
370                                        AmfUtil::AMF0_VERSION);
371           }
372           if ( event->event_type() == rtmp::EVENT_VIDEO_DATA ) {
373             rtmp::BulkDataEvent* bd  =
374               reinterpret_cast< rtmp::BulkDataEvent* >(event);
375             tag = new streaming::FlvTag();
376             tag->set_use_relative_timestamps(
377               event->header()->is_timestamp_relative());
378             tag->set_timestamp(
379               event->header()->timestamp_ms());
380             tag->set_data_type(streaming::FLV_FRAMETYPE_VIDEO);
381             tag->set_data(bd->mutable_data());
382           }
383           if ( event->event_type() == rtmp::EVENT_AUDIO_DATA ) {
384             rtmp::BulkDataEvent* bd =
385               reinterpret_cast< rtmp::BulkDataEvent* >(event);
386
387             tag = new streaming::FlvTag();
388             tag->set_use_relative_timestamps(
389               event->header()->is_timestamp_relative());
390             tag->set_timestamp(
391               event->header()->timestamp_ms());
392             tag->set_data_type(streaming::FLV_FRAMETYPE_AUDIO);
393             tag->set_data(bd->mutable_data());
394           }
395           if ( tag != NULL ) {
396             serializer_->SerializeFlvTag(tag, saved_);
397             string s;
398             saved_->ReadString(&s);
399             trace_file_->Write(s.data(), s.size());
400             delete tag;
401           }
402         }
403         if ( event->event_type() == rtmp::EVENT_CHUNK_SIZE ) {
404           rtmp::EventChunkSize* const cs_event =
405             reinterpret_cast<rtmp::EventChunkSize*>(event);
406           protocol_->set_write_chunk_size(cs_event->chunk_size());
407           protocol_->set_read_chunk_size(cs_event->chunk_size());
408         }
409         delete event;
410       }
411     } while ( err == AmfUtil::READ_OK );
412     return true;
413   }
414   bool ConnectionWriteHandler() {
415     if ( net_connection_->outbuf()->IsEmpty() ) {
416       timeouter_.UnsetTimeout(kWriteEvent);
417     } else {
418       timeouter_.SetTimeout(kWriteEvent, kWriteTimeout);
419     }
420     return true;
421   }
422
423   void ConnectionCloseHandler(int err, net::NetConnection::CloseWhat what) {
424     LOG_INFO << "ConnectionCloseHandler : "
425              << net::NetConnection::CloseWhatName(what);
426     if ( what != net::NetConnection::CLOSE_READ_WRITE ) {
427       FlushAndClose();
428       return;
429     }
430     LOG_WARNING << "Auto deleting TestConnection id_=" << id_;
431     selector_->DeleteInSelectLoop(this);
432   }
433
434   void SendRequest() {
435     io::NumStreamer::WriteByte(net_connection_->outbuf(), kHandshakeLeadByte);
436     net_connection_->Write(kFirstHandshake, kHandshakeSize);
437
438     // Buffer should clean quite fast..
439     timeouter_.SetTimeout(kWriteEvent, kWriteTimeout);
440     // And we should get some data from the server back
441     timeouter_.SetTimeout(kReadEvent, kReadTimeout);
442   }
443   void StartClient(net::HostPort remote_address) {
444     if ( !net_connection_->Connect(remote_address) ) {
445       return;  // Nothing to do ..
446     }
447     timeouter_.SetTimeout(kConnectEvent, kConnectTimeout);
448   }
449  private:
450   net::Selector * selector_;
451   net::NetConnection* net_connection_;
452   int id_;
453   io::File* trace_file_;
454   streaming::FlvTagSerializer* serializer_;
455   io::MemoryStream* saved_;
456   bool handshake_passed_;
457   rtmp::ProtocolData* protocol_;
458   rtmp::Coder* coder_;
459
460   int state_;
461   int stream_id_;
462   bool seek_sent_;
463   int num_events_;
464   int64 timestamp_;
465   int64 events_size_;
466
467   net::Timeouter timeouter_;
468 };
469
470 void StartRtmpConnection(int32 num_to_start,
471                          net::Selector* selector) {
472   LOG_INFO << "Starting a new rtmp client..";
473   if ( !FLAGS_dump_video_file.empty() && num_to_start == 1 ) {
474     new TestConnection(
475       selector, num_to_start,
476       io::File::CreateFileOrDie(FLAGS_dump_video_file.c_str()));
477   } else {
478     new TestConnection(selector, num_to_start, NULL);
479   }
480   num_to_start--;
481   if ( num_to_start > 0 ) {
482     selector->RegisterAlarm(NewCallback(&StartRtmpConnection,
483                                         num_to_start, selector),
484                             FLAGS_time_between_connections_ms);
485   }
486 }
487
488 int main(int argc, char* argv[]) {
489   common::Init(argc, argv);
490   net::Selector selector;
491   int32 num_conns = FLAGS_num_connections;
492   selector.RunInSelectLoop(NewCallback(&StartRtmpConnection,
493                                        num_conns, &selector));
494
495   selector.Loop();
496
497   LOG_INFO << "PASS";
498   common::Exit(0);
499 }
500
501 //////////////////////////////////////////////////////////////////////
502
503 // Long static data..
504
505 const uint8 kFirstHandshake[kHandshakeSize] = {
506   0x14,   0xf0,   0xd1,   0xbc,   0x03,   0x00,   0x01,   0x01,
507   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
508   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
509   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
510   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
511   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
512   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
513   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
514   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
515   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
516   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
517   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
518   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
519   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
520   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
521   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
522   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
523   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
524   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
525   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
526   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
527   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
528   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
529   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
530   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
531   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
532   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
533   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
534   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
535   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
536   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
537   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
538   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
539   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
540   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
541   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
542   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
543   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
544   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
545   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
546   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
547   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
548   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
549   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
550   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
551   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
552   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
553   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
554   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
555   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
556   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
557   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
558   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
559   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
560   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
561   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
562   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
563   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
564   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
565   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
566   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
567   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
568   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
569   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
570   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
571   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
572   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
573   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
574   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
575   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
576   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
577   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
578   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
579   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
580   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
581   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
582   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
583   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
584   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
585   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
586   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
587   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
588   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
589   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
590   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
591   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
592   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
593   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
594   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
595   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
596   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
597   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
598   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
599   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
600   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
601   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
602   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
603   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
604   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
605   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
606   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
607   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
608   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
609   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
610   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
611   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
612   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
613   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
614   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
615   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
616   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
617   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
618   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
619   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
620   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
621   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
622   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
623   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
624   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
625   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
626   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
627   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
628   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
629   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
630   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
631   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
632   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
633   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
634   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
635   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
636   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
637   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
638   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
639   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
640   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
641   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
642   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
643   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
644   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
645   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
646   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
647   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
648   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
649   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
650   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
651   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
652   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
653   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
654   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
655   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
656   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
657   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
658   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
659   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
660   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
661   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
662   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
663   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
664   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
665   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
666   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
667   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
668   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
669   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
670   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
671   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
672   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
673   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
674   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
675   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
676   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
677   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
678   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
679   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
680   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
681   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
682   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
683   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
684   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
685   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
686   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
687   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
688   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
689   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
690   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
691   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
692   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
693   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
694   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
695   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
696   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,
697   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00,   0x00
698 };
699
700 const uint8 kSecondHandshake[kHandshakeSize] = {
701   0x2a,   0x9d,   0x47,   0x03,   0x6d,   0x54,   0x9c,   0xb1,
702   0xfe,   0x39,   0x09,   0x69,   0xe6,   0x4c,   0xf1,   0xaf,
703   0xb6,   0x2f,   0x0d,   0x05,   0x4a,   0x96,   0x5a,   0x26,
704   0x62,   0xc0,   0x03,   0x1a,   0x62,   0x95,   0x10,   0xc7,
705   0xf7,   0x95,   0x94,   0x63,   0x77,   0x2c,   0x2a,   0x49,
706   0x05,   0x74,   0x3e,   0x8a,   0x02,   0xc8,   0x8c,   0x7f,
707   0x93,   0x8d,   0x1d,   0x05,   0xf2,   0x82,   0x13,   0xb4,
708   0xc9,   0xb0,   0x1a,   0x22,   0xf1,   0x93,   0x94,   0x78,
709   0x8c,   0x88,   0x3d,   0x3f,   0x4d,   0x1b,   0xfe,   0xa5,
710   0xbf,   0x65,   0xf7,   0xcf,   0x84,   0xe2,   0xe9,   0x8e,
711   0x27,   0xe1,   0x96,   0x06,   0xab,   0xf5,   0x69,   0x0a,
712   0xd3,   0x26,   0xe5,   0x47,   0x23,   0xd8,   0x77,   0xb7,
713   0x8f,   0xf2,   0xfc,   0x0f,   0x0e,   0x6a,   0x28,   0x64,
714   0xc0,   0x0c,   0x54,   0xd1,   0x4f,   0x38,   0x77,   0x65,
715   0xf8,   0xb6,   0xf8,   0x64,   0x9e,   0x8d,   0x3b,   0x4b,
716   0x6e,   0xbc,   0xd7,   0x9f,   0x66,   0x0f,   0x32,   0xae,
717   0x3c,   0xa5,   0x92,   0x32,   0x25,   0x3e,   0x46,   0x1d,
718   0x78,   0x00,   0x26,   0x21,   0x80,   0xe1,   0x24,   0xfe,
719   0xf7,   0x0f,   0x44,   0xc6,   0xc5,   0xa2,   0x7a,   0x3c,
720   0x9d,   0xe5,   0x1f,   0x20,   0xb6,   0x73,   0x30,   0x9f,
721   0x69,   0xa2,   0x2d,   0x0d,   0x79,   0x1f,   0xd1,   0x58,
722   0x3e,   0xdd,   0x25,   0x12,   0x43,   0x33,   0xbe,   0xbc,
723   0x92,   0xa1,   0x57,   0xb6,   0xe8,   0x46,   0x5f,   0x07,
724   0x8a,   0x40,   0x66,   0x4b,   0x52,   0x7d,   0xaf,   0x9c,
725   0x8a,   0xd5,   0xf7,   0x1f,   0xa7,   0xd3,   0x4f,   0xa5,
726   0xb3,   0xec,   0x6c,   0xde,   0xa2,   0x7f,   0x16,   0xd4,
727   0x91,   0x69,   0xa8,   0x4c,   0x25,   0xcc,   0x1b,   0xcd,
728   0x1a,   0xc4,   0xc0,   0x10,   0x91,   0x85,   0x6d,   0xac,
729   0xdc,   0x86,   0x93,   0x57,   0xfc,   0x75,   0x99,   0x9d,
730   0x30,   0xa9,   0x3e,   0x9e,   0xef,   0xa4,   0x54,   0x92,
731   0x0a,   0x83,   0x28,   0x95,   0x91,   0xb4,   0x81,   0xf6,
732   0x15,   0xca,   0x07,   0x54,   0x16,   0xaf,   0x8c,   0xa2,
733   0x64,   0x70,   0x53,   0x7f,   0x44,   0x81,   0xb7,   0x54,
734   0x8f,   0x21,   0x27,   0x67,   0x5a,   0xa6,   0x7b,   0x1c,
735   0x25,   0xf0,   0x2e,   0x53,   0x8f,   0x39,   0x2b,   0x95,
736   0x2b,   0x7f,   0x9c,   0xb4,   0x1f,   0x4d,   0x94,   0xa1,
737   0x26,   0x26,   0xd1,   0x78,   0xf2,   0xef,   0x7f,   0x13,
738   0xe8,   0x0c,   0xe2,   0xf1,   0x8c,   0x44,   0x11,   0xc8,
739   0x49,   0x96,   0xeb,   0x6b,   0x2c,   0x54,   0x15,   0x8d,
740   0xed,   0x7d,   0xe0,   0xde,   0x79,   0x99,   0x71,   0xc0,
741   0xb4,   0xec,   0xac,   0x8a,   0xc2,   0x18,   0xa2,   0x48,
742   0x01,   0xee,   0x8e,   0xef,   0xf7,   0x1b,   0xf0,   0x48,
743   0x2d,   0x6c,   0xc9,   0xff,   0xf8,   0xf7,   0x16,   0x43,
744   0x85,   0xc8,   0x10,   0xfb,   0xab,   0x82,   0x23,   0x26,
745   0x2b,   0x13,   0x13,   0x13,   0xac,   0x06,   0x5c,   0x30,
746   0x6f,   0xc9,   0x18,   0xef,   0xcb,   0x82,   0xfe,   0x9d,
747   0xf3,   0x76,   0x3d,   0xbb,   0x0a,   0xdf,   0x81,   0x5a,
748   0xae,   0x1a,   0xe2,   0xe9,   0x74,   0x1b,   0x76,   0xaf,
749   0x35,   0x8f,   0x3c,   0xef,   0x8d,   0xe6,   0x46,   0xa6,
750   0xd4,   0x44,   0x0c,   0xc3,   0x51,   0x54,   0x20,   0x30,
751   0x96,   0x50,   0xd3,   0x74,   0x78,   0x36,   0x2d,   0xe6,
752   0xbf,   0x2e,   0xd5,   0x8e,   0xf1,   0xfc,   0x77,   0x2c,
753   0xfd,   0x89,   0x09,   0x7e,   0xa7,   0x1f,   0x13,   0xaa,
754   0xe7,   0x64,   0xe6,   0xd9,   0xe5,   0xa3,   0x36,   0x01,
755   0x63,   0x42,   0x57,   0x22,   0x7c,   0x9e,   0xbc,   0x0a,
756   0x17,   0xda,   0xec,   0x74,   0x37,   0x13,   0xe4,   0x72,
757   0x32,   0x54,   0xba,   0x3c,   0x2c,   0xf1,   0x95,   0xc4,
758   0x23,   0xd4,   0x5f,   0xff,   0xba,   0xe1,   0x87,   0xe5,
759   0x25,   0x0d,   0xa8,   0x90,   0x93,   0x45,   0x0c,   0x5d,
760   0xda,   0x0d,   0x8f,   0x17,   0x56,   0x56,   0x8d,   0x90,
761   0xd4,   0x92,   0x87,   0x00,   0xec,   0xdc,   0x94,   0xc4,
762   0xbc,   0x58,   0xbd,   0xcc,   0x19,   0x46,   0x9b,   0x89,
763   0x35,   0xb3,   0xf0,   0x54,   0xae,   0x19,   0x88,   0x10,
764   0x31,   0x8a,   0xe2,   0x5b,   0x10,   0x36,   0x5f,   0x67,
765   0xa9,   0xf7,   0x48,   0x70,   0xcb,   0x3e,   0x43,   0xbb,
766   0xec,   0xc2,   0x49,   0x68,   0xd7,   0x0b,   0x21,   0x06,
767   0xb8,   0xb9,   0x6d,   0xa7,   0x49,   0x21,   0xfd,   0x7a,
768   0x05,   0x83,   0xc4,   0x43,   0xee,   0x4d,   0x29,   0xe8,
769   0x5b,   0x95,   0x16,   0x67,   0x4f,   0x87,   0xea,   0x1b,
770   0xd2,   0x01,   0xdd,   0xce,   0xdc,   0xf3,   0x3f,   0x74,
771   0xdc,   0x85,   0x01,   0xca,   0x43,   0x04,   0xe2,   0xb8,
772   0x86,   0x18,   0xdd,   0xbc,   0x9f,   0x3b,   0x41,   0x65,
773   0xa5,   0xf5,   0x63,   0x7d,   0x70,   0x9f,   0x4b,   0xb2,
774   0x83,   0x08,   0xa2,   0x6f,   0xf4,   0x59,   0xbd,   0x46,
775   0x4e,   0xa1,   0x22,   0x5f,   0xd4,   0x21,   0x49,   0xa7,
776   0x6f,   0xcf,   0x2a,   0x43,   0x25,   0x13,   0x4f,   0xdd,
777   0x97,   0xc4,   0x59,   0xb4,   0x8c,   0x37,   0x59,   0x36,
778   0xd7,   0x78,   0xcd,   0xae,   0xa5,   0xf8,   0x9d,   0x1f,
779   0x2b,   0x4b,   0x12,   0xe5,   0x6f,   0x78,   0xd4,   0x6a,
780   0x94,   0xa6,   0x7c,   0xf0,   0x2e,   0x5f,   0x26,   0x8b,
781   0xe4,   0xb9,   0xb8,   0x95,   0xde,   0x4e,   0x47,   0xcd,
782   0xd2,   0x9e,   0x14,   0xd0,   0x17,   0x29,   0x5e,   0x1e,
783   0x7f,   0x03,   0xed,   0x48,   0x88,   0x7a,   0xf7,   0xe7,
784   0x00,   0xac,   0x02,   0x80,   0xf9,   0x53,   0x4f,   0x05,
785   0x36,   0xa5,   0xb8,   0x0a,   0x0f,   0x97,   0x7d,   0x88,
786   0x1f,   0xa6,   0x4b,   0x61,   0xf0,   0x78,   0xbc,   0xdb,
787   0xd3,   0x90,   0x26,   0x6b,   0x01,   0x20,   0x0f,   0xa9,
788   0x38,   0x31,   0x0a,   0xc9,   0xb8,   0x07,   0x32,   0x7f,
789   0x6c,   0x83,   0xa2,   0x69,   0xa0,   0x30,   0xac,   0x04,
790   0xb4,   0x80,   0xee,   0x0f,   0xec,   0x96,   0xa6,   0xdb,
791   0xae,   0x37,   0x9f,   0xa0,   0x93,   0x1e,   0x23,   0xbb,
792   0xb7,   0x19,   0x90,   0x19,   0xb2,   0xa5,   0x94,   0xc5,
793   0xf4,   0x4e,   0xa4,   0x2d,   0x8c,   0xc7,   0x2c,   0x78,
794   0x30,   0x00,   0x7e,   0xe1,   0x9b,   0xe4,   0x48,   0xae,
795   0x80,   0xad,   0xe5,   0xca,   0x54,   0xf0,   0x73,   0xe9,
796   0xae,   0x11,   0x87,   0x96,   0x46,   0x97,   0x04,   0xc0,
797   0xde,   0x77,   0xd7,   0x6c,   0x8d,   0x18,   0x1a,   0x8f,
798   0x17,   0x3d,   0xbb,   0x94,   0x08,   0x25,   0x1e,   0x49,
799   0x75,   0x10,   0xe3,   0x81,   0xa4,   0x23,   0x7a,   0x81,
800   0xa6,   0xd3,   0xc0,   0x5f,   0xc1,   0xfb,   0xca,   0xc4,
801   0x32,   0x4b,   0x85,   0x04,   0xc3,   0x31,   0x66,   0x1a,
802   0xc2,   0xbd,   0x56,   0x55,   0x58,   0xed,   0xdb,   0x68,
803   0x98,   0x97,   0x97,   0x3f,   0x1c,   0xa0,   0x18,   0xa0,
804   0xc0,   0xa9,   0x42,   0xf8,   0x61,   0xe3,   0x3e,   0x03,
805   0x68,   0x1b,   0x10,   0xbb,   0x9e,   0xbd,   0xd8,   0x4a,
806   0xb6,   0xf6,   0xec,   0x85,   0x8e,   0x2c,   0x42,   0x9b,
807   0x31,   0x8d,   0xfe,   0x53,   0x40,   0x61,   0xed,   0x36,
808   0x2d,   0x24,   0x6e,   0xd6,   0x30,   0x42,   0x03,   0xec,
809   0x87,   0xea,   0xe9,   0x19,   0x0b,   0xe7,   0x5a,   0x69,
810   0x63,   0xa6,   0x04,   0x60,   0x02,   0xaf,   0xcd,   0x49,
811   0x03,   0x2f,   0x3c,   0xc8,   0x41,   0xfa,   0x69,   0xf1,
812   0xdd,   0xaf,   0xfa,   0x6e,   0x68,   0xdb,   0x2b,   0xfa,
813   0xa8,   0x1e,   0x81,   0xd2,   0x4e,   0xeb,   0x6b,   0xe0,
814   0x30,   0xe5,   0xea,   0x49,   0x11,   0xbf,   0xe5,   0x37,
815   0x54,   0x4a,   0x7c,   0x7e,   0xb9,   0xf5,   0x90,   0x81,
816   0x09,   0x1a,   0x10,   0x3c,   0x1a,   0xcc,   0x6c,   0x59,
817   0x46,   0xb4,   0xd9,   0xad,   0x11,   0xf0,   0xaa,   0x6b,
818   0xb7,   0x39,   0x84,   0xdf,   0x80,   0x62,   0xca,   0x1b,
819   0x18,   0x03,   0x43,   0xfd,   0x4e,   0x16,   0x21,   0x5b,
820   0xbc,   0xa3,   0x2e,   0x18,   0x78,   0xc8,   0x5d,   0xe2,
821   0x92,   0x45,   0x1f,   0xdb,   0x76,   0x4b,   0xf3,   0xba,
822   0xff,   0x46,   0x4e,   0x07,   0xce,   0x2a,   0xdc,   0x82,
823   0xb7,   0x8b,   0x36,   0x4e,   0xc5,   0xa4,   0xd0,   0x6f,
824   0x90,   0x52,   0xa8,   0xb6,   0xfe,   0xda,   0x7b,   0x56,
825   0x03,   0xae,   0xb5,   0x0e,   0x12,   0xf9,   0x5d,   0xf6,
826   0x42,   0xa8,   0x21,   0x06,   0xe3,   0x0b,   0x4f,   0x18,
827   0xa3,   0xea,   0x2c,   0x5e,   0x43,   0x44,   0x34,   0x56,
828   0x94,   0xf2,   0x24,   0x55,   0x09,   0x7f,   0xcb,   0x9e,
829   0xb2,   0xa8,   0xc0,   0xf0,   0x75,   0xb5,   0xf6,   0xfc,
830   0x65,   0xf0,   0x0a,   0xa5,   0xca,   0xae,   0x76,   0xb7,
831   0xca,   0x69,   0x72,   0xe1,   0xfb,   0xdd,   0x82,   0x9d,
832   0x5f,   0xf8,   0x4f,   0x0c,   0xac,   0x43,   0xd3,   0x70,
833   0xd5,   0xf1,   0x5f,   0xa1,   0xc3,   0x69,   0xf2,   0x6b,
834   0x46,   0xa8,   0xbf,   0x83,   0x71,   0x07,   0x41,   0x54,
835   0x26,   0xc1,   0xbd,   0x9d,   0xe5,   0x50,   0x0d,   0x8f,
836   0xe8,   0x61,   0x63,   0xf0,   0x90,   0x8b,   0xd4,   0xb9,
837   0x67,   0xf3,   0xd8,   0xb9,   0x39,   0xde,   0x75,   0x66,
838   0xd3,   0x0f,   0xde,   0xba,   0x28,   0xa1,   0xf7,   0x69,
839   0x81,   0xe5,   0x49,   0x81,   0x55,   0x47,   0x97,   0xb8,
840   0x19,   0xc8,   0x0d,   0x0a,   0xb9,   0x1f,   0x18,   0x62,
841   0xe5,   0xea,   0xb3,   0x2d,   0xf8,   0xad,   0xc7,   0x3e,
842   0x50,   0xb5,   0x78,   0x6f,   0x8b,   0xe7,   0x12,   0x11,
843   0x55,   0xf4,   0x50,   0x5c,   0xd6,   0xa5,   0x02,   0xc4,
844   0x99,   0x62,   0x0a,   0x1a,   0x41,   0xd8,   0x64,   0xc1,
845   0xfe,   0x47,   0x87,   0x5c,   0x6c,   0xd2,   0xc1,   0x3c,
846   0x1f,   0x59,   0x73,   0x93,   0x3c,   0xca,   0x75,   0x17,
847   0xe5,   0xc0,   0xba,   0x27,   0x0a,   0x7f,   0x45,   0x66,
848   0x40,   0x26,   0x6d,   0x1d,   0xe5,   0x85,   0xb0,   0x37,
849   0x47,   0x52,   0xdb,   0x47,   0xd1,   0x26,   0x0e,   0xdc,
850   0x30,   0x24,   0x8b,   0x68,   0x4c,   0x63,   0xf6,   0xd0,
851   0x23,   0x48,   0x6c,   0xb0,   0x73,   0x62,   0xe4,   0x95,
852   0x53,   0x34,   0xa9,   0x47,   0x46,   0x66,   0x97,   0x1d,
853   0xe1,   0xd2,   0x9f,   0xe6,   0x9c,   0x24,   0xfa,   0x85,
854   0xb3,   0x99,   0x7f,   0x7e,   0xb0,   0xb3,   0x7d,   0xe7,
855   0x8f,   0xdd,   0x45,   0x7e,   0x4a,   0x15,   0x77,   0xf3,
856   0x31,   0x29,   0x5d,   0x26,   0xd5,   0x8f,   0xb5,   0x01,
857   0x97,   0xc6,   0x6c,   0x32,   0x27,   0xcf,   0x66,   0xaf,
858   0xe7,   0xd9,   0xc3,   0xde,   0xeb,   0xc4,   0x3a,   0xb7,
859   0x24,   0x2a,   0xbc,   0x58,   0x93,   0x10,   0x6f,   0xc6,
860   0xe0,   0xb7,   0xe9,   0xdc,   0xe7,   0x56,   0x61,   0xe5,
861   0x7e,   0x11,   0x0f,   0xb5,   0xdf,   0x3b,   0xa2,   0xed,
862   0xfe,   0x31,   0xb5,   0x8e,   0x00,   0x04,   0x1a,   0x50,
863   0xe5,   0x97,   0x4d,   0x4f,   0x18,   0x2e,   0x1c,   0x10,
864   0xdd,   0x66,   0x78,   0xcb,   0x13,   0x3b,   0x4f,   0x1b,
865   0x24,   0x36,   0x84,   0x8c,   0xb8,   0x9b,   0x98,   0xe4,
866   0x3a,   0x7b,   0x96,   0x8f,   0x9f,   0x12,   0xf1,   0x68,
867   0x48,   0x0b,   0x49,   0x0a,   0xf6,   0x0b,   0x9d,   0xff,
868   0xe2,   0xe7,   0xd8,   0x72,   0xdf,   0xb4,   0x04,   0x88,
869   0x9e,   0x26,   0xdf,   0xd2,   0x16,   0x11,   0x42,   0x95,
870   0xa9,   0xaa,   0x44,   0xf9,   0x3c,   0xdf,   0xf3,   0xc3,
871   0xa9,   0x75,   0xc7,   0x56,   0xf7,   0xc1,   0x89,   0xfc,
872   0x24,   0xe4,   0x43,   0xd1,   0xc2,   0x36,   0x4a,   0xf9,
873   0x41,   0x1d,   0x92,   0x5c,   0x98,   0x0b,   0x13,   0x4d,
874   0x15,   0x6e,   0x74,   0x36,   0x3c,   0xbe,   0xce,   0x08,
875   0xe8,   0xae,   0xc3,   0xf0,   0xc5,   0xcc,   0xcf,   0x7e,
876   0xac,   0x42,   0xf1,   0x97,   0x99,   0xfa,   0xfb,   0xe8,
877   0x08,   0x70,   0x5c,   0x3d,   0x50,   0x50,   0x8a,   0x85,
878   0x25,   0xab,   0x4b,   0xe0,   0x70,   0x37,   0x83,   0xbc,
879   0x69,   0x22,   0x12,   0x84,   0x07,   0x96,   0x9b,   0xe4,
880   0x42,   0xe6,   0xee,   0x15,   0x59,   0x1e,   0x23,   0x1c,
881   0x79,   0xb6,   0xf1,   0x15,   0xb5,   0xe9,   0x74,   0xed,
882   0xd1,   0xf6,   0xf1,   0xdc,   0xe9,   0x89,   0xe0,   0x33,
883   0x8c,   0x16,   0x00,   0x11,   0xc1,   0x88,   0x95,   0xdf,
884   0x58,   0xec,   0x27,   0x79,   0xc5,   0x54,   0xbf,   0xbc,
885   0x15,   0xe4,   0x3d,   0x52,   0x26,   0xd3,   0xe0,   0x62,
886   0x7a,   0xdb,   0x63,   0x1c,   0xf4,   0x70,   0x31,   0xe8,
887   0x72,   0x78,   0x05,   0xca,   0x7f,   0x43,   0xb8,   0xc6,
888   0x14,   0x2e,   0x12,   0xe7,   0xda,   0x1a,   0x1d,   0x67,
889   0x57,   0x22,   0x4a,   0xe6,   0x82,   0xe0,   0x03,   0xff,
890   0x51,   0xe0,   0x83,   0xbd,   0x98,   0x4c,   0x86,   0x6b,
891   0x96,   0x70,   0x27,   0x27,   0xce,   0x36,   0x14,   0xaf,
892   0x59,   0x9a,   0x08,   0x2b,   0x98,   0xbf,   0xe7,   0xfc,
893 };
Note: See TracBrowser for help on using the browser.