eventmachine 0.12.6 → 0.12.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (116) hide show
  1. data/{docs/README → README} +21 -13
  2. data/Rakefile +14 -4
  3. data/docs/DEFERRABLES +0 -5
  4. data/docs/INSTALL +2 -4
  5. data/docs/LEGAL +1 -1
  6. data/docs/LIGHTWEIGHT_CONCURRENCY +0 -2
  7. data/docs/PURE_RUBY +0 -2
  8. data/docs/RELEASE_NOTES +0 -2
  9. data/docs/SMTP +0 -7
  10. data/docs/SPAWNED_PROCESSES +0 -4
  11. data/docs/TODO +0 -2
  12. data/eventmachine.gemspec +17 -8
  13. data/examples/ex_channel.rb +43 -0
  14. data/examples/ex_queue.rb +2 -0
  15. data/examples/helper.rb +2 -0
  16. data/ext/cmain.cpp +119 -20
  17. data/ext/cplusplus.cpp +15 -6
  18. data/ext/ed.cpp +303 -93
  19. data/ext/ed.h +49 -22
  20. data/ext/em.cpp +368 -42
  21. data/ext/em.h +43 -6
  22. data/ext/eventmachine.h +21 -8
  23. data/ext/eventmachine_cpp.h +1 -0
  24. data/ext/extconf.rb +4 -0
  25. data/ext/kb.cpp +1 -2
  26. data/ext/pipe.cpp +1 -3
  27. data/ext/project.h +21 -0
  28. data/ext/rubymain.cpp +232 -32
  29. data/ext/ssl.cpp +38 -1
  30. data/ext/ssl.h +5 -1
  31. data/java/src/com/rubyeventmachine/Application.java +7 -3
  32. data/java/src/com/rubyeventmachine/EmReactor.java +16 -1
  33. data/java/src/com/rubyeventmachine/tests/ConnectTest.java +25 -3
  34. data/lib/{protocols → em}/buftok.rb +16 -5
  35. data/lib/em/callback.rb +26 -0
  36. data/lib/em/channel.rb +57 -0
  37. data/lib/em/connection.rb +505 -0
  38. data/lib/em/deferrable.rb +144 -165
  39. data/lib/em/file_watch.rb +54 -0
  40. data/lib/em/future.rb +24 -25
  41. data/lib/em/messages.rb +1 -1
  42. data/lib/em/process_watch.rb +44 -0
  43. data/lib/em/processes.rb +58 -52
  44. data/lib/em/protocols.rb +35 -0
  45. data/lib/em/protocols/header_and_content.rb +138 -0
  46. data/lib/em/protocols/httpclient.rb +263 -0
  47. data/lib/em/protocols/httpclient2.rb +582 -0
  48. data/lib/{protocols → em/protocols}/line_and_text.rb +2 -2
  49. data/lib/em/protocols/linetext2.rb +160 -0
  50. data/lib/{protocols → em/protocols}/memcache.rb +37 -7
  51. data/lib/em/protocols/object_protocol.rb +39 -0
  52. data/lib/em/protocols/postgres3.rb +247 -0
  53. data/lib/em/protocols/saslauth.rb +175 -0
  54. data/lib/em/protocols/smtpclient.rb +331 -0
  55. data/lib/em/protocols/smtpserver.rb +547 -0
  56. data/lib/em/protocols/stomp.rb +200 -0
  57. data/lib/{protocols → em/protocols}/tcptest.rb +21 -25
  58. data/lib/em/queue.rb +61 -0
  59. data/lib/em/spawnable.rb +53 -56
  60. data/lib/em/streamer.rb +92 -74
  61. data/lib/em/timers.rb +55 -0
  62. data/lib/em/version.rb +3 -0
  63. data/lib/eventmachine.rb +1008 -1298
  64. data/lib/evma.rb +1 -1
  65. data/lib/jeventmachine.rb +106 -101
  66. data/lib/pr_eventmachine.rb +47 -36
  67. data/tasks/project.rake +2 -1
  68. data/tests/client.crt +31 -0
  69. data/tests/client.key +51 -0
  70. data/tests/test_attach.rb +18 -0
  71. data/tests/test_basic.rb +108 -54
  72. data/tests/test_channel.rb +63 -0
  73. data/tests/test_connection_count.rb +2 -2
  74. data/tests/test_epoll.rb +109 -110
  75. data/tests/test_errors.rb +36 -36
  76. data/tests/test_exc.rb +22 -25
  77. data/tests/test_file_watch.rb +49 -0
  78. data/tests/test_futures.rb +77 -93
  79. data/tests/test_hc.rb +2 -2
  80. data/tests/test_httpclient.rb +55 -52
  81. data/tests/test_httpclient2.rb +110 -112
  82. data/tests/test_inactivity_timeout.rb +30 -0
  83. data/tests/test_kb.rb +8 -9
  84. data/tests/test_ltp2.rb +274 -277
  85. data/tests/test_next_tick.rb +91 -65
  86. data/tests/test_object_protocol.rb +37 -0
  87. data/tests/test_process_watch.rb +48 -0
  88. data/tests/test_processes.rb +56 -23
  89. data/tests/test_proxy_connection.rb +92 -0
  90. data/tests/test_pure.rb +1 -5
  91. data/tests/test_queue.rb +44 -0
  92. data/tests/test_running.rb +9 -14
  93. data/tests/test_sasl.rb +32 -34
  94. data/tests/test_send_file.rb +175 -176
  95. data/tests/test_servers.rb +37 -41
  96. data/tests/test_smtpserver.rb +47 -55
  97. data/tests/test_spawn.rb +284 -291
  98. data/tests/test_ssl_args.rb +1 -1
  99. data/tests/test_ssl_methods.rb +1 -1
  100. data/tests/test_ssl_verify.rb +82 -0
  101. data/tests/test_timers.rb +81 -88
  102. data/tests/test_ud.rb +0 -7
  103. data/tests/testem.rb +1 -1
  104. metadata +68 -39
  105. data/lib/em/eventable.rb +0 -39
  106. data/lib/eventmachine_version.rb +0 -31
  107. data/lib/protocols/header_and_content.rb +0 -129
  108. data/lib/protocols/httpcli2.rb +0 -803
  109. data/lib/protocols/httpclient.rb +0 -270
  110. data/lib/protocols/linetext2.rb +0 -161
  111. data/lib/protocols/postgres.rb +0 -261
  112. data/lib/protocols/saslauth.rb +0 -179
  113. data/lib/protocols/smtpclient.rb +0 -308
  114. data/lib/protocols/smtpserver.rb +0 -556
  115. data/lib/protocols/stomp.rb +0 -153
  116. data/tests/test_eventables.rb +0 -77
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -23,7 +23,6 @@
23
23
  #
24
24
  #
25
25
 
26
-
27
26
  # This module provides "glue" for the Java version of the EventMachine reactor core.
28
27
  # For C++ EventMachines, the analogous functionality is found in ext/rubymain.cpp,
29
28
  # which is a garden-variety Ruby-extension glue module.
@@ -32,106 +31,112 @@ require 'java'
32
31
  require 'em_reactor'
33
32
 
34
33
  module EventMachine
35
- # TODO: These event numbers are defined in way too many places.
36
- # DRY them up.
37
- TimerFired = 100
38
- ConnectionData = 101
39
- ConnectionUnbound = 102
40
- ConnectionAccepted = 103
41
- ConnectionCompleted = 104
42
- LoopbreakSignalled = 105
34
+ # TODO: These event numbers are defined in way too many places.
35
+ # DRY them up.
36
+ TimerFired = 100
37
+ ConnectionData = 101
38
+ ConnectionUnbound = 102
39
+ ConnectionAccepted = 103
40
+ ConnectionCompleted = 104
41
+ LoopbreakSignalled = 105
43
42
 
44
- # This thunk class used to be called EM, but that caused conflicts with
45
- # the alias "EM" for module EventMachine. (FC, 20Jun08)
46
- class JEM < com.rubyeventmachine.EmReactor
47
- def eventCallback a1, a2, a3
48
- s = String.from_java_bytes(a3.array[a3.position...a3.limit])
49
- EventMachine::event_callback a1, a2, s
50
- end
51
- end
52
- class Connection < com.rubyeventmachine.Connection
53
- def associate_callback_target sig
54
- # No-op for the time being.
55
- end
56
- end
57
- def self.initialize_event_machine
58
- @em = JEM.new
59
- end
60
- def self.release_machine
61
- @em = nil
62
- end
63
- def self.add_oneshot_timer interval
64
- @em.installOneshotTimer interval
65
- end
66
- def self.run_machine
67
- @em.run
68
- end
69
- def self.stop
70
- @em.stop
71
- end
72
- def self.start_tcp_server server, port
73
- @em.startTcpServer server, port
74
- end
75
- def self.stop_tcp_server sig
76
- @em.stopTcpServer sig
77
- end
78
- def self.start_unix_server filename
79
- # TEMPORARILY unsupported until someone figures out how to do it.
80
- raise "unsupported on this platform"
81
- end
82
- def self.send_data sig, data, length
83
- @em.sendData sig, data.to_java_bytes
84
- end
85
- def self.send_datagram sig, data, length, address, port
86
- @em.sendDatagram sig, data, length, address, port
87
- end
88
- def self.connect_server server, port
89
- @em.connectTcpServer server, port
90
- end
91
- def self.close_connection sig, after_writing
92
- @em.closeConnection sig, after_writing
93
- end
94
- def self.set_comm_inactivity_timeout sig, interval
95
- @em.setCommInactivityTimeout sig, interval
96
- end
97
- def self.start_tls sig
98
- @em.startTls sig
99
- end
100
- def self.signal_loopbreak
101
- @em.signalLoopbreak
102
- end
103
- def self.set_timer_quantum q
104
- @em.setTimerQuantum q
105
- end
106
- def self.epoll
107
- # Epoll is a no-op for Java.
108
- # The latest Java versions run epoll when possible in NIO.
109
- end
110
- def self.set_rlimit_nofile n_descriptors
111
- # Currently a no-op for Java.
112
- end
113
- def self.open_udp_socket server, port
114
- @em.openUdpSocket server, port
115
- end
116
- def self.invoke_popen cmd
117
- # TEMPORARILY unsupported until someone figures out how to do it.
118
- raise "unsupported on this platform"
119
- end
120
- def self.read_keyboard
121
- # TEMPORARILY unsupported until someone figures out how to do it.
122
- raise "temporarily unsupported on this platform"
123
- end
124
- def self.set_max_timer_count num
125
- # harmless no-op in Java. There's no built-in timer limit.
126
- end
127
- def self.library_type
128
- :java
129
- end
43
+ # This thunk class used to be called EM, but that caused conflicts with
44
+ # the alias "EM" for module EventMachine. (FC, 20Jun08)
45
+ class JEM < com.rubyeventmachine.EmReactor
46
+ def eventCallback a1, a2, a3
47
+ s = String.from_java_bytes(a3.array[a3.position...a3.limit])
48
+ EventMachine::event_callback a1, a2, s
49
+ end
50
+ end
51
+ class Connection < com.rubyeventmachine.Connection
52
+ def associate_callback_target sig
53
+ # No-op for the time being.
54
+ end
55
+ end
56
+ def self.initialize_event_machine
57
+ @em = JEM.new
58
+ end
59
+ def self.release_machine
60
+ @em = nil
61
+ end
62
+ def self.add_oneshot_timer interval
63
+ @em.installOneshotTimer interval
64
+ end
65
+ def self.run_machine
66
+ @em.run
67
+ end
68
+ def self.stop
69
+ @em.stop
70
+ end
71
+ def self.start_tcp_server server, port
72
+ @em.startTcpServer server, port
73
+ end
74
+ def self.stop_tcp_server sig
75
+ @em.stopTcpServer sig
76
+ end
77
+ def self.start_unix_server filename
78
+ # TEMPORARILY unsupported until someone figures out how to do it.
79
+ raise "unsupported on this platform"
80
+ end
81
+ def self.send_data sig, data, length
82
+ @em.sendData sig, data.to_java_bytes
83
+ end
84
+ def self.send_datagram sig, data, length, address, port
85
+ @em.sendDatagram sig, data, length, address, port
86
+ end
87
+ def self.connect_server server, port
88
+ bind_connect_server nil, nil, server, port
89
+ end
90
+ def self.bind_connect_server bind_addr, bind_port, server, port
91
+ @em.connectTcpServer bind_addr, bind_port, server, port
92
+ end
93
+ def self.close_connection sig, after_writing
94
+ @em.closeConnection sig, after_writing
95
+ end
96
+ def self.set_comm_inactivity_timeout sig, interval
97
+ @em.setCommInactivityTimeout sig, interval
98
+ end
99
+ def self.start_tls sig
100
+ @em.startTls sig
101
+ end
102
+ def self.ssl?
103
+ false
104
+ end
105
+ def self.signal_loopbreak
106
+ @em.signalLoopbreak
107
+ end
108
+ def self.set_timer_quantum q
109
+ @em.setTimerQuantum q
110
+ end
111
+ def self.epoll
112
+ # Epoll is a no-op for Java.
113
+ # The latest Java versions run epoll when possible in NIO.
114
+ end
115
+ def self.set_rlimit_nofile n_descriptors
116
+ # Currently a no-op for Java.
117
+ end
118
+ def self.open_udp_socket server, port
119
+ @em.openUdpSocket server, port
120
+ end
121
+ def self.invoke_popen cmd
122
+ # TEMPORARILY unsupported until someone figures out how to do it.
123
+ raise "unsupported on this platform"
124
+ end
125
+ def self.read_keyboard
126
+ # TEMPORARILY unsupported until someone figures out how to do it.
127
+ raise "temporarily unsupported on this platform"
128
+ end
129
+ def self.set_max_timer_count num
130
+ # harmless no-op in Java. There's no built-in timer limit.
131
+ end
132
+ def self.library_type
133
+ :java
134
+ end
130
135
 
131
- class Connection
132
- def associate_callback_target sig
133
- # No-op for the time being
134
- end
135
- end
136
+ class Connection
137
+ def associate_callback_target sig
138
+ # No-op for the time being
139
+ end
140
+ end
136
141
  end
137
142
 
@@ -1,4 +1,4 @@
1
- # $Id$
1
+ #--
2
2
  #
3
3
  # Author:: Francis Cianfrocca (gmail: blackhedd)
4
4
  # Homepage:: http://rubyeventmachine.com
@@ -76,7 +76,11 @@ module EventMachine
76
76
  # #connect_server. Return a connection descriptor to the caller.
77
77
  # TODO, what do we return here if we can't connect?
78
78
  def connect_server host, port
79
- EvmaTCPClient.connect(host, port).uuid
79
+ bind_connect_server nil, nil, host, port
80
+ end
81
+
82
+ def bind_connect_server bind_addr, bind_port, host, port
83
+ EvmaTCPClient.connect(bind_addr, bind_port, host, port).uuid
80
84
  end
81
85
 
82
86
  # #send_data
@@ -152,6 +156,11 @@ module EventMachine
152
156
  def epoll
153
157
  end
154
158
 
159
+ # #ssl? is not implemented for pure-Ruby implementation
160
+ def ssl?
161
+ false
162
+ end
163
+
155
164
  # #set_rlimit_nofile is a no-op in the pure-Ruby implementation. We simply return Ruby's built-in
156
165
  # per-process file-descriptor limit.
157
166
  def set_rlimit_nofile n
@@ -307,7 +316,7 @@ class Reactor
307
316
  open_loopbreaker
308
317
 
309
318
  loop {
310
- @current_loop_time = Time.now
319
+ @current_loop_time = Time.now
311
320
 
312
321
  break if @stop_scheduled
313
322
  run_timers
@@ -330,7 +339,7 @@ class Reactor
330
339
  @timers.each {|t|
331
340
  if t.first <= @current_loop_time
332
341
  @timers.delete t
333
- EventMachine::event_callback "", TimerFired, t.last
342
+ EventMachine::event_callback "", TimerFired, t.last
334
343
  else
335
344
  break
336
345
  end
@@ -374,24 +383,24 @@ class Reactor
374
383
  end
375
384
 
376
385
  def open_loopbreaker
377
- # Can't use an IO.pipe because they can't be set nonselectable in Windows.
378
- # Pick a random localhost UDP port.
386
+ # Can't use an IO.pipe because they can't be set nonselectable in Windows.
387
+ # Pick a random localhost UDP port.
379
388
  #@loopbreak_writer.close if @loopbreak_writer
380
389
  #rd,@loopbreak_writer = IO.pipe
381
- @loopbreak_reader = UDPSocket.new
382
- @loopbreak_writer = UDPSocket.new
383
- bound = false
384
- 100.times {
385
- @loopbreak_port = rand(10000) + 40000
386
- begin
387
- @loopbreak_reader.bind "localhost", @loopbreak_port
388
- bound = true
389
- break
390
- rescue
391
- end
392
- }
393
- raise "Unable to bind Loopbreaker" unless bound
394
- LoopbreakReader.new(@loopbreak_reader)
390
+ @loopbreak_reader = UDPSocket.new
391
+ @loopbreak_writer = UDPSocket.new
392
+ bound = false
393
+ 100.times {
394
+ @loopbreak_port = rand(10000) + 40000
395
+ begin
396
+ @loopbreak_reader.bind "localhost", @loopbreak_port
397
+ bound = true
398
+ break
399
+ rescue
400
+ end
401
+ }
402
+ raise "Unable to bind Loopbreaker" unless bound
403
+ LoopbreakReader.new(@loopbreak_reader)
395
404
  end
396
405
 
397
406
  def close_loopbreaker
@@ -401,7 +410,7 @@ class Reactor
401
410
 
402
411
  def signal_loopbreak
403
412
  #@loopbreak_writer.write '+' if @loopbreak_writer
404
- @loopbreak_writer.send('+',0,"localhost",@loopbreak_port) if @loopbreak_writer
413
+ @loopbreak_writer.send('+',0,"localhost",@loopbreak_port) if @loopbreak_writer
405
414
  end
406
415
 
407
416
  def set_timer_quantum interval_in_seconds
@@ -445,17 +454,17 @@ module EventMachine
445
454
  @last_activity = Reactor.instance.current_loop_time
446
455
 
447
456
  if defined?(Fcntl::F_GETFL)
448
- m = @io.fcntl(Fcntl::F_GETFL, 0)
449
- @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m)
457
+ m = @io.fcntl(Fcntl::F_GETFL, 0)
458
+ @io.fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK | m)
450
459
  else
451
- # Windows doesn't define F_GETFL.
452
- # It's not very reliable about setting descriptors nonblocking either.
453
- begin
454
- s = Socket.for_fd(@io.fileno)
455
- s.fcntl( Fcntl::F_SETFL, Fcntl::O_NONBLOCK )
456
- rescue Errno::EINVAL, Errno::EBADF
457
- STDERR.puts "Serious error: unable to set descriptor non-blocking"
458
- end
460
+ # Windows doesn't define F_GETFL.
461
+ # It's not very reliable about setting descriptors nonblocking either.
462
+ begin
463
+ s = Socket.for_fd(@io.fileno)
464
+ s.fcntl( Fcntl::F_SETFL, Fcntl::O_NONBLOCK )
465
+ rescue Errno::EINVAL, Errno::EBADF
466
+ STDERR.puts "Serious error: unable to set descriptor non-blocking"
467
+ end
459
468
  end
460
469
  # TODO, should set CLOEXEC on Unix?
461
470
 
@@ -640,8 +649,10 @@ end
640
649
  module EventMachine
641
650
  class EvmaTCPClient < StreamObject
642
651
 
643
- def self.connect host, port
652
+ def self.connect bind_addr, bind_port, host, port
644
653
  sd = Socket.new( Socket::AF_INET, Socket::SOCK_STREAM, 0 )
654
+ sd.bind( Socket.pack_sockaddr_in( bind_port, bind_addr )) if bind_addr
655
+
645
656
  begin
646
657
  # TODO, this assumes a current Ruby snapshot.
647
658
  # We need to degrade to a nonblocking connect otherwise.
@@ -669,9 +680,9 @@ module EventMachine
669
680
  def eventable_write
670
681
  if @pending
671
682
  @pending = false
672
- if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
683
+ if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
673
684
  EventMachine::event_callback uuid, ConnectionCompleted, ""
674
- end
685
+ end
675
686
  else
676
687
  super
677
688
  end
@@ -748,9 +759,9 @@ module EventMachine
748
759
  def eventable_write
749
760
  if @pending
750
761
  @pending = false
751
- if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
762
+ if 0 == io.getsockopt(Socket::SOL_SOCKET, Socket::SO_ERROR).unpack("i").first
752
763
  EventMachine::event_callback uuid, ConnectionCompleted, ""
753
- end
764
+ end
754
765
  else
755
766
  super
756
767
  end
@@ -37,8 +37,9 @@ if Spec.has_rdoc
37
37
  Rake::RDocTask.new do |rd|
38
38
  rd.title = Spec.name
39
39
  rd.rdoc_dir = 'rdoc'
40
- rd.main = "docs/README" if test ?e, "docs/README"
40
+ rd.main = "README"
41
41
  rd.rdoc_files.include("lib/**/*.rb", *Spec.extra_rdoc_files)
42
+ rd.rdoc_files.exclude(*%w(lib/em/version lib/emva lib/evma/ lib/pr_eventmachine lib/jeventmachine))
42
43
  end
43
44
  Rake::Task[:clean].enhance [:clobber_rdoc]
44
45
 
@@ -0,0 +1,31 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFRDCCAywCAQEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCRU0xFTATBgNV
3
+ BAgTDEV2ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQL
4
+ EwtEZXZlbG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMB4XDTA5MDMyOTAy
5
+ MzE0NloXDTEwMDMyOTAyMzE0NlowaDELMAkGA1UEBhMCRU0xFTATBgNVBAgTDEV2
6
+ ZW50TWFjaGluZTEVMBMGA1UEChMMRXZlbnRNYWNoaW5lMRQwEgYDVQQLEwtEZXZl
7
+ bG9wbWVudDEVMBMGA1UEAxMMRXZlbnRNYWNoaW5lMIICIjANBgkqhkiG9w0BAQEF
8
+ AAOCAg8AMIICCgKCAgEAv1FSOIX1z7CQtVBFlrB0A3/V29T+22STKKmiRWYkKL5b
9
+ +hkrp9IZ5J4phZHgUVM2VDPOO2Oc2PU6dlGGZISg+UPERunTogxQKezCV0vcE9cK
10
+ OwzxCFDRvv5rK8aKMscfBLbNKocAXywuRRQmdxPiVRzbyPrl+qCr/EDLXAX3D77l
11
+ S8n2AwDg19VyI+IgFUE+Dy5e1eLoY6nV+Mq+vNXdn3ttF3t+ngac5pj5Q9h+pD5p
12
+ 67baDHSnf/7cy2fa/LKrLolVHQR9G2K6cEfeM99NtcsMbkoPs4iI3FA05OVTQHXg
13
+ C8C8cRxrb9APl95I/ep65OIaCJgcdYxJ3QD3qOtQo6/NQsGnjbyiUxaEpjfqyT1N
14
+ uzWD81Q8uXGNS8yD6dDynt/lseBjyp2nfC3uQ5fY18VdIcu0MJ9pezBUKrNuhlsy
15
+ XXEZ2DXj4sY8QOvIcBqSB/zmS1nGEK55xrtkaiaNrY8fe8wRVpcPLxy+P225NFw+
16
+ B69FJRA0Lj6Jt9BM4hV/3MSIEWwTVhuw4E02ywDYTzz1wq3ITf0tsbIPn0hXQMxD
17
+ ohhAoKioM6u+yHtqsxD0eYaAWmHTVn5oDvOSGpvCpBfWHyA7FP5UQak0fKABEAgK
18
+ iQYEnb294AXwXymJttfGTIV/Ne4tLN5dIpNma8UO8rlThlcr6xnTQDbR3gkTDRsC
19
+ AwEAATANBgkqhkiG9w0BAQUFAAOCAgEAj7J8fy1LUWoVWnrXDAC9jwJ1nI/YjoSU
20
+ 6ywke3o04+nZC5S+dPnuVy+HAwsU940CoNvP6RStI/bH6JL+NIqEFmwM3M8xIEWV
21
+ MYVPkfvQUxxGvDnaY7vv93u+6Q77HV3qlhAQBHChyuXyO7TG3+WzsiT9AnBNtAP0
22
+ 4jClt5kCAQXLO/p0SFEZQ8Ru9SM8d1i73Z0VDVzs8jYWlBhiherSgbw1xK4wBOpJ
23
+ 43XmjZsBSrDpiAXd07Ak3UL2GjfT7eStgebL3UIe39ThE/s/+l43bh0M6WbOBvyQ
24
+ i/rZ50kd1GvN0xnZhtv07hIJWO85FGWi7Oet8AzdUZJ17v1Md/f2vdhPVTFN9q+w
25
+ mQ6LxjackqCvaJaQfBEbqsn2Tklxk4tZuDioiQbOElT2e6vljQVJWIfNx38Ny2LM
26
+ aiXQPQu+4CI7meAh5gXM5nyJGbZvRPsxj89CqYzyHCYs5HBP3AsviBvn26ziOF+c
27
+ 544VmHd9HkIv8UTC29hh+R64RlgMQQQdaXFaUrFPTs/do0k8n/c2bPc0iTdfi5Q2
28
+ gq6Vi8q6Ay5wGgTtRRbn/mWKuCFjEh94z6pF9Xr06NX0PuEOdf+Ls9vI5vz6G0w6
29
+ 0Li7devEN7EKBY+7Mcjg918yq9i5tEiMkUgT68788t3fTC+4iUQ5fDtdrHsaOlIR
30
+ 8bs/XQVNE/s=
31
+ -----END CERTIFICATE-----
@@ -0,0 +1,51 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ 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
51
+ -----END RSA PRIVATE KEY-----