qwirk 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. data/README.md +9 -14
  2. data/lib/qwirk.rb +26 -17
  3. data/lib/qwirk/adapter.rb +3 -45
  4. data/lib/qwirk/adapter/base.rb +2 -0
  5. data/lib/qwirk/adapter/base/expanding_worker_config.rb +133 -0
  6. data/lib/qwirk/adapter/base/worker_config.rb +104 -0
  7. data/lib/qwirk/adapter/in_memory.rb +13 -0
  8. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/factory.rb +2 -2
  9. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/publisher.rb +4 -4
  10. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/queue.rb +3 -2
  11. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/reply_queue.rb +3 -2
  12. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/topic.rb +2 -2
  13. data/lib/qwirk/{queue_adapter/in_mem → adapter/in_memory}/worker.rb +6 -8
  14. data/lib/qwirk/adapter/in_memory/worker_config.rb +50 -0
  15. data/lib/qwirk/adapter/inline.rb +9 -0
  16. data/lib/qwirk/adapter/inline/publisher.rb +86 -0
  17. data/lib/qwirk/adapter/inline/worker.rb +55 -0
  18. data/lib/qwirk/adapter/inline/worker_config.rb +30 -0
  19. data/lib/qwirk/adapter_factory.rb +48 -0
  20. data/lib/qwirk/base_worker.rb +18 -28
  21. data/lib/qwirk/batch/file_worker.rb +4 -4
  22. data/lib/qwirk/manager.rb +11 -8
  23. data/lib/qwirk/marshal_strategy/none.rb +1 -1
  24. data/lib/qwirk/publish_handle.rb +22 -11
  25. data/lib/qwirk/publisher.rb +9 -9
  26. data/lib/qwirk/{request_worker.rb → reply_worker.rb} +3 -3
  27. data/lib/qwirk/worker.rb +27 -29
  28. data/test/jms_fail_test.rb +11 -11
  29. data/test/jms_requestor_block_test.rb +12 -12
  30. data/test/jms_requestor_test.rb +8 -8
  31. data/test/jms_test.rb +10 -10
  32. metadata +104 -185
  33. data/examples/README +0 -1
  34. data/examples/activemq.xml +0 -84
  35. data/examples/advanced_requestor/README.md +0 -15
  36. data/examples/advanced_requestor/base_request_worker.rb +0 -18
  37. data/examples/advanced_requestor/char_count_worker.rb +0 -16
  38. data/examples/advanced_requestor/config.ru +0 -24
  39. data/examples/advanced_requestor/exception_raiser_worker.rb +0 -17
  40. data/examples/advanced_requestor/length_worker.rb +0 -14
  41. data/examples/advanced_requestor/print_worker.rb +0 -14
  42. data/examples/advanced_requestor/publisher.rb +0 -49
  43. data/examples/advanced_requestor/qwirk.yml +0 -16
  44. data/examples/advanced_requestor/reverse_worker.rb +0 -14
  45. data/examples/advanced_requestor/triple_worker.rb +0 -14
  46. data/examples/batch/my_batch_worker.rb +0 -30
  47. data/examples/batch/my_line_worker.rb +0 -8
  48. data/examples/qwirk.yml +0 -20
  49. data/examples/requestor/README.md +0 -13
  50. data/examples/requestor/config.ru +0 -13
  51. data/examples/requestor/qwirk_persist.yml +0 -5
  52. data/examples/requestor/requestor.rb +0 -68
  53. data/examples/requestor/reverse_echo_worker.rb +0 -15
  54. data/examples/setup.rb +0 -13
  55. data/examples/shared/README.md +0 -24
  56. data/examples/shared/config.ru +0 -13
  57. data/examples/shared/publisher.rb +0 -49
  58. data/examples/shared/qwirk_persist.yml +0 -5
  59. data/examples/shared/shared_worker.rb +0 -16
  60. data/examples/simple/README +0 -53
  61. data/examples/simple/bar_worker.rb +0 -10
  62. data/examples/simple/baz_worker.rb +0 -10
  63. data/examples/simple/config.ru +0 -14
  64. data/examples/simple/publisher.rb +0 -49
  65. data/examples/simple/qwirk_persist.yml +0 -4
  66. data/examples/simple/tmp/kahadb/db-1.log +0 -0
  67. data/examples/simple/tmp/kahadb/db.data +0 -0
  68. data/examples/simple/tmp/kahadb/db.redo +0 -0
  69. data/examples/task/README +0 -47
  70. data/examples/task/config.ru +0 -14
  71. data/examples/task/foo_worker.rb +0 -10
  72. data/examples/task/messages.out +0 -1000
  73. data/examples/task/publisher.rb +0 -25
  74. data/examples/task/qwirk_persist.yml +0 -5
  75. data/examples/task/task.rb +0 -36
  76. data/lib/qwirk/queue_adapter.rb +0 -3
  77. data/lib/qwirk/queue_adapter/active_mq.rb +0 -13
  78. data/lib/qwirk/queue_adapter/active_mq/publisher.rb +0 -12
  79. data/lib/qwirk/queue_adapter/active_mq/worker_config.rb +0 -16
  80. data/lib/qwirk/queue_adapter/in_mem.rb +0 -7
  81. data/lib/qwirk/queue_adapter/in_mem/worker_config.rb +0 -59
  82. data/lib/qwirk/queue_adapter/jms.rb +0 -50
  83. data/lib/qwirk/queue_adapter/jms/connection.rb +0 -42
  84. data/lib/qwirk/queue_adapter/jms/consumer.rb +0 -37
  85. data/lib/qwirk/queue_adapter/jms/publisher.rb +0 -126
  86. data/lib/qwirk/queue_adapter/jms/worker.rb +0 -89
  87. data/lib/qwirk/queue_adapter/jms/worker_config.rb +0 -38
  88. data/lib/qwirk/version.rb +0 -3
  89. data/lib/qwirk/worker_config.rb +0 -187
@@ -1,15 +0,0 @@
1
- class ReverseEchoWorker
2
- include Qwirk::RequestWorker
3
-
4
- def request(obj)
5
- puts "#{self}: Received #{obj} at #{Time.now}"
6
- if obj =~ /^sleep (.*)/
7
- sleep $1.to_f
8
- puts "#{self}: Finished sleeping at #{Time.now}"
9
- end
10
- if obj =~ /^Exception/
11
- raise Exception, 'You requested an exception'
12
- end
13
- obj.reverse
14
- end
15
- end
data/examples/setup.rb DELETED
@@ -1,13 +0,0 @@
1
- # Allow examples to be run in-place without requiring a gem install
2
- $LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
3
-
4
- require 'rubygems'
5
- require 'qwirk'
6
- require 'rumx'
7
- require 'yaml'
8
- require 'logger'
9
-
10
- #Qwirk.logger = Logger.new($stdout)
11
- file = File.expand_path('../qwirk.yml', __FILE__)
12
- Qwirk.config = YAML.load(ERB.new(File.read(file), nil, '-').result(binding))
13
- $adapter_key = ENV['QWIRK_ADAPTER'] || 'in_mem'
@@ -1,24 +0,0 @@
1
- ## Step 0
2
- ### Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
-
4
- ## Step 1
5
- ### Start up the application
6
- * rm -f qwirk_persist.yml
7
- * rackup -p 4567
8
-
9
- ## Step 2
10
- * Browse to http://localhost:4567
11
- * Open up the tree to Qwirk => S1 => Attributes
12
- * Enter 2 for count and click the Update button.
13
- * Open up the tree to Qwirk => S2 => Attributes
14
- * Enter 3 for count and click the Update button.
15
- * Refresh the browser so that you get the worker updates to the tree
16
-
17
- ## Step 3
18
- * Open the tree to Publisher => Operations => send\_bar or send\_baz
19
- * Enter values for the various arguments and click Execute.
20
-
21
- ## Step 4
22
- * cntl-c the rackup process and start it back up. It should come back with
23
- the workers and the config values that have been configured via the browser.
24
-
@@ -1,13 +0,0 @@
1
- require '../setup'
2
- require './shared_worker'
3
- require './publisher'
4
-
5
- # If we're not starting up a standalone publisher, then start up a manager
6
- if ENV['RACK_ENV'] != 'publisher'
7
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
8
- at_exit { manager.stop }
9
- end
10
- if ENV['RACK_ENV'] != 'worker'
11
- Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
12
- end
13
- run Rumx::Server
@@ -1,49 +0,0 @@
1
- require 'rumx'
2
- require 'qwirk'
3
-
4
- class Publisher
5
- include Rumx::Bean
6
-
7
- bean_attr_accessor :s1_count, :integer, 'Number of S1 messages sent'
8
- bean_attr_accessor :s2_count, :integer, 'Number of S2 messages sent'
9
-
10
- bean_operation :send_s1, :void, 'Send messages to the S1 worker', [
11
- [ :count, :integer, 'Count of messages', 10 ],
12
- [ :message, :string, 'String portion of the message to send', 'Message for Bar' ],
13
- [ :sleep_time, :float, 'Time to sleep between messages', 0.2 ]
14
- ]
15
-
16
- bean_operation :send_s2, :void, 'Send messages to the S2 worker', [
17
- [ :count, :integer, 'Count of messages', 5 ],
18
- [ :message, :string, 'String portion of the message to send', 'Message for Baz' ],
19
- [ :sleep_time, :float, 'Time to sleep between messages', 0.5 ]
20
- ]
21
-
22
-
23
- def initialize(adapter_key)
24
- @s1_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'S1', :marshal => :bson)
25
- @s2_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'S2', :marshal => :string)
26
- @s1_count = 0
27
- @s2_count = 0
28
- end
29
-
30
- def send_s1(count, message, sleep_time)
31
- count.times do
32
- @s1_count += 1
33
- obj = {'count' => @s1_count, 'message' => message}
34
- puts "Publishing to S1 object: #{obj.inspect}"
35
- @s1_publisher.publish(obj)
36
- sleep sleep_time
37
- end
38
- end
39
-
40
- def send_s2(count, message, sleep_time)
41
- count.times do
42
- @s2_count += 1
43
- obj = "#{@s2_count}: #{message}"
44
- puts "Publishing to S2 object: #{obj}"
45
- @s2_publisher.publish(obj)
46
- sleep sleep_time
47
- end
48
- end
49
- end
@@ -1,5 +0,0 @@
1
- ---
2
- S1:
3
- :min_count: 1
4
- S2:
5
- :min_count: 1
@@ -1,16 +0,0 @@
1
- class SharedWorker
2
- include Qwirk::Worker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
- config_reader :message, :string, 'Message'
6
-
7
- define_configs(
8
- 'S1' => {:message => "I'm S1", :sleep_time => 10},
9
- 'S2' => {:message => "I'm S2"}
10
- )
11
-
12
- def perform(obj)
13
- puts "#{self}: Received #{obj.inspect} at #{Time.now}"
14
- sleep config.sleep_time
15
- end
16
- end
@@ -1,53 +0,0 @@
1
- Step 0
2
- # Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
-
4
- Step 1
5
- # Start up the application
6
- rm -f qwirk_persist.yml
7
- rackup -p 4567
8
- or for ActiveMQ
9
- QWIRK_ADAPTER=active_mq rackup -p 4567
10
-
11
-
12
- Step 2
13
- # Browse to http://localhost:4567
14
- # Open up the tree to Worker => Bar => Attributes and click on Attributes
15
- # Change max_count to 100, idle_worker_timeout to 10, and sleep_time to 5 and click Update.
16
-
17
- Step 3
18
- # Open the tree to Publisher => Operations => send_bar and click on send_bar
19
- # Set count to 1000 and sleep_time to 0.2 and click Execute.
20
- # Click back on Worker => Bar => Attributes and continue clicking every few seconds while
21
- messages are still being published. For the InMem adapter, workers will continue
22
- to increase while there are still messages in the queue. For the ActiveMQ adapter,
23
- the messages get cached on the consumer side so after the the publishing is complete,
24
- many of the workers will drop off while the remaining ones that have cached messages
25
- will continue.
26
-
27
- Step 4
28
- # cntl-c the rackup process and start it back up. It should come back with
29
- the workers and the config values that have been configured via the browser.
30
-
31
-
32
- Things to try:
33
-
34
-
35
- Expanding / Contracting workers
36
-
37
- Note that after you set a max_count and before you publish, the count of workers will be
38
- 1 as their is just a single worker waiting for data on the queue. Once you publish messages,
39
- the count of workers will grow as needed to handle the message volume up to max_count.
40
-
41
- If you set a value for idle_worker_timeout then the count of workers will go down when there
42
- is no work to be done. Set a timeout and refresh the attributes to see this in action.
43
-
44
-
45
- Monitoring your workers
46
-
47
- Browse to http://localhost:4567/Worker/Bar/timer/attributes.json?reset=true
48
-
49
- Publish some messages (possibly modifying the worker's sleep times first) and browse to that address again.
50
-
51
- If you use a monitoring tool such as munin, nagios, hyperic, etc., you could poll this url periodically to create
52
- a graph or alert for your system. For easy creation of munin graphs and alert withe this framework, see
53
- https://github.com/ClarityServices/ruminate
@@ -1,10 +0,0 @@
1
- class BarWorker
2
- include Qwirk::Worker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
-
6
- def perform(obj)
7
- puts "#{self}: Received #{obj.inspect} at #{Time.now}"
8
- sleep config.sleep_time
9
- end
10
- end
@@ -1,10 +0,0 @@
1
- class BazWorker
2
- include Qwirk::Worker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 10
5
-
6
- def perform(obj)
7
- puts "#{self}: Received #{obj} at #{Time.now}"
8
- sleep config.sleep_time
9
- end
10
- end
@@ -1,14 +0,0 @@
1
- require '../setup'
2
- require './bar_worker'
3
- require './baz_worker'
4
- require './publisher'
5
-
6
- # If we're not starting up a standalone publisher, then start up a manager
7
- if ENV['RACK_ENV'] != 'publisher'
8
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
9
- at_exit { manager.stop }
10
- end
11
- if ENV['RACK_ENV'] != 'worker'
12
- Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
13
- end
14
- run Rumx::Server
@@ -1,49 +0,0 @@
1
- require 'rumx'
2
- require 'qwirk'
3
-
4
- class Publisher
5
- include Rumx::Bean
6
-
7
- bean_attr_accessor :bar_count, :integer, 'Number of Bar messages sent'
8
- bean_attr_accessor :baz_count, :integer, 'Number of Baz messages sent'
9
-
10
- bean_operation :send_bar, :void, 'Send messages to the Bar worker', [
11
- [ :count, :integer, 'Count of messages', 10 ],
12
- [ :message, :string, 'String portion of the message to send', 'Message for Bar' ],
13
- [ :sleep_time, :float, 'Time to sleep between messages', 0.2 ]
14
- ]
15
-
16
- bean_operation :send_baz, :void, 'Send messages to the Baz worker', [
17
- [ :count, :integer, 'Count of messages', 5 ],
18
- [ :message, :string, 'String portion of the message to send', 'Message for Baz' ],
19
- [ :sleep_time, :float, 'Time to sleep between messages', 0.5 ]
20
- ]
21
-
22
- def initialize(adapter_key)
23
- @bar_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'Bar', :marshal => :bson)
24
- @baz_publisher = Qwirk[adapter_key].create_publisher(:queue_name => 'Baz', :marshal => :string)
25
-
26
- @bar_count = 0
27
- @baz_count = 0
28
- end
29
-
30
- def send_bar(count, message, sleep_time)
31
- count.times do
32
- @bar_count += 1
33
- obj = {'count' => @bar_count, 'message' => message}
34
- puts "Publishing to Bar object: #{obj.inspect}"
35
- @bar_publisher.publish(obj)
36
- sleep sleep_time
37
- end
38
- end
39
-
40
- def send_baz(count, message, sleep_time)
41
- count.times do
42
- @baz_count += 1
43
- obj = "#{@baz_count}: #{message}"
44
- puts "Publishing to Baz object: #{obj}"
45
- @baz_publisher.publish(obj)
46
- sleep sleep_time
47
- end
48
- end
49
- end
@@ -1,4 +0,0 @@
1
- ---
2
- Bar:
3
- :min_count: 10
4
- ...
Binary file
Binary file
Binary file
data/examples/task/README DELETED
@@ -1,47 +0,0 @@
1
- Step 0
2
- # Follow the directions for configuring configuring a JMS or InMem adapter located in examples/README
3
-
4
- Step 1
5
- # Start up the application
6
- rm -f qwirk_persist.yml
7
- rackup -p 4567
8
-
9
- Step 2
10
- # Browse to http://localhost:4567
11
- # Open up the tree to Worker => Bar => Attributes and click on Attributes
12
- # Change max_count to 100, idle_worker_timeout to 10, and sleep_time to 5 and click Update.
13
-
14
- Step 3
15
- # Open the tree to Publisher => Operations => send_bar and click on send_bar
16
- # Set count to 100 and sleep_time to 0.2 and click Execute.
17
- # Click back on Worker => Bar => Attributes and continue clicking every few seconds. You
18
- should see the count of workers top out at around 25 (5 published messages/sec * 5 secs/worker)
19
- and then 10 seconds after all 100 messages have been read it will drop back down to 1.
20
-
21
- Step 4
22
- # cntl-c the rackup process and start it back up. It should come back with
23
- the workers and the config values that have been configured via the browser.
24
-
25
-
26
- Things to try:
27
-
28
-
29
- Expanding / Contracting workers
30
-
31
- Note that after you set a max_count and before you publish, the count of workers will be
32
- 1 as their is just a single worker waiting for data on the queue. Once you publish messages,
33
- the count of workers will grow as needed to handle the message volume up to max_count.
34
-
35
- If you set a value for idle_worker_timeout then the count of workers will go down when there
36
- is no work to be done. Set a timeout and refresh the attributes to see this in action.
37
-
38
-
39
- Monitoring your workers
40
-
41
- Browse to http://localhost:4567/Worker/Bar/timer/attributes.json?reset=true
42
-
43
- Publish some messages (possibly modifying the worker's sleep times first) and browse to that address again.
44
-
45
- If you use a monitoring tool such as munin, nagios, hyperic, etc., you could poll this url periodically to create
46
- a graph or alert for your system. For easy creation of munin graphs and alert withe this framework, see
47
- https://github.com/ClarityServices/ruminate
@@ -1,14 +0,0 @@
1
- require '../setup'
2
- require './foo_worker'
3
- require './publisher'
4
- require './task'
5
-
6
- # If we're not starting up a standalone publisher, then start up a manager
7
- if ENV['RACK_ENV'] != 'publisher'
8
- manager = Qwirk[$adapter_key].create_manager(:name => 'Worker', :persist_file => 'qwirk_persist.yml')
9
- at_exit { manager.stop }
10
- end
11
- if ENV['RACK_ENV'] != 'worker'
12
- Rumx::Bean.root.bean_add_child(:Publisher, Publisher.new($adapter_key))
13
- end
14
- run Rumx::Server
@@ -1,10 +0,0 @@
1
- class FooWorker
2
- include Qwirk::RequestWorker
3
-
4
- config_accessor :sleep_time, :float, 'Number of seconds to sleep between messages', 5
5
-
6
- def request(hash)
7
- sleep config.sleep_time
8
- '%s%04d' % [hash['message'], hash['count']]
9
- end
10
- end
@@ -1,1000 +0,0 @@
1
- M0001
2
- M0002
3
- M0003
4
- M0004
5
- M0005
6
- M0006
7
- M0007
8
- M0008
9
- M0009
10
- M0010
11
- M0011
12
- M0012
13
- M0013
14
- M0014
15
- M0015
16
- M0016
17
- M0017
18
- M0018
19
- M0019
20
- M0020
21
- M0021
22
- M0022
23
- M0023
24
- M0024
25
- M0025
26
- M0026
27
- M0027
28
- M0028
29
- M0029
30
- M0030
31
- M0031
32
- M0032
33
- M0033
34
- M0034
35
- M0035
36
- M0036
37
- M0037
38
- M0038
39
- M0039
40
- M0040
41
- M0041
42
- M0042
43
- M0043
44
- M0044
45
- M0045
46
- M0046
47
- M0047
48
- M0048
49
- M0049
50
- M0050
51
- M0051
52
- M0052
53
- M0053
54
- M0054
55
- M0055
56
- M0056
57
- M0057
58
- M0058
59
- M0059
60
- M0060
61
- M0061
62
- M0062
63
- M0063
64
- M0064
65
- M0065
66
- M0066
67
- M0067
68
- M0068
69
- M0069
70
- M0070
71
- M0071
72
- M0072
73
- M0073
74
- M0074
75
- M0075
76
- M0076
77
- M0077
78
- M0078
79
- M0079
80
- M0080
81
- M0081
82
- M0082
83
- M0083
84
- M0084
85
- M0085
86
- M0086
87
- M0087
88
- M0088
89
- M0089
90
- M0090
91
- M0091
92
- M0092
93
- M0093
94
- M0094
95
- M0095
96
- M0096
97
- M0097
98
- M0098
99
- M0100
100
- M0099
101
- M0101
102
- M0102
103
- M0103
104
- M0104
105
- M0106
106
- M0105
107
- M0107
108
- M0108
109
- M0109
110
- M0110
111
- M0111
112
- M0112
113
- M0113
114
- M0114
115
- M0115
116
- M0116
117
- M0117
118
- M0118
119
- M0119
120
- M0120
121
- M0121
122
- M0122
123
- M0123
124
- M0124
125
- M0125
126
- M0126
127
- M0127
128
- M0128
129
- M0129
130
- M0130
131
- M0131
132
- M0132
133
- M0133
134
- M0134
135
- M0135
136
- M0136
137
- M0137
138
- M0138
139
- M0139
140
- M0140
141
- M0141
142
- M0142
143
- M0143
144
- M0144
145
- M0145
146
- M0146
147
- M0147
148
- M0148
149
- M0149
150
- M0150
151
- M0151
152
- M0152
153
- M0154
154
- M0153
155
- M0155
156
- M0157
157
- M0156
158
- M0158
159
- M0160
160
- M0159
161
- M0161
162
- M0163
163
- M0162
164
- M0164
165
- M0166
166
- M0165
167
- M0167
168
- M0169
169
- M0168
170
- M0170
171
- M0171
172
- M0172
173
- M0173
174
- M0174
175
- M0175
176
- M0176
177
- M0177
178
- M0178
179
- M0179
180
- M0181
181
- M0180
182
- M0182
183
- M0183
184
- M0184
185
- M0185
186
- M0186
187
- M0187
188
- M0188
189
- M0190
190
- M0189
191
- M0191
192
- M0192
193
- M0193
194
- M0194
195
- M0196
196
- M0195
197
- M0197
198
- M0198
199
- M0199
200
- M0200
201
- M0202
202
- M0201
203
- M0203
204
- M0204
205
- M0205
206
- M0206
207
- M0208
208
- M0207
209
- M0209
210
- M0210
211
- M0211
212
- M0212
213
- M0214
214
- M0213
215
- M0215
216
- M0216
217
- M0217
218
- M0218
219
- M0220
220
- M0219
221
- M0221
222
- M0222
223
- M0223
224
- M0224
225
- M0225
226
- M0226
227
- M0227
228
- M0228
229
- M0229
230
- M0230
231
- M0231
232
- M0232
233
- M0233
234
- M0234
235
- M0235
236
- M0236
237
- M0237
238
- M0238
239
- M0239
240
- M0240
241
- M0241
242
- M0243
243
- M0242
244
- M0244
245
- M0245
246
- M0247
247
- M0246
248
- M0248
249
- M0249
250
- M0250
251
- M0251
252
- M0252
253
- M0253
254
- M0254
255
- M0255
256
- M0256
257
- M0257
258
- M0258
259
- M0259
260
- M0260
261
- M0261
262
- M0263
263
- M0262
264
- M0264
265
- M0265
266
- M0266
267
- M0267
268
- M0268
269
- M0269
270
- M0270
271
- M0271
272
- M0272
273
- M0273
274
- M0274
275
- M0275
276
- M0276
277
- M0277
278
- M0278
279
- M0279
280
- M0280
281
- M0281
282
- M0282
283
- M0283
284
- M0284
285
- M0285
286
- M0286
287
- M0287
288
- M0288
289
- M0289
290
- M0290
291
- M0291
292
- M0292
293
- M0293
294
- M0294
295
- M0295
296
- M0296
297
- M0297
298
- M0298
299
- M0299
300
- M0300
301
- M0301
302
- M0302
303
- M0303
304
- M0304
305
- M0305
306
- M0306
307
- M0307
308
- M0308
309
- M0309
310
- M0310
311
- M0311
312
- M0312
313
- M0313
314
- M0314
315
- M0315
316
- M0316
317
- M0317
318
- M0318
319
- M0319
320
- M0320
321
- M0321
322
- M0322
323
- M0323
324
- M0324
325
- M0325
326
- M0326
327
- M0327
328
- M0328
329
- M0329
330
- M0330
331
- M0331
332
- M0332
333
- M0333
334
- M0334
335
- M0335
336
- M0336
337
- M0337
338
- M0338
339
- M0339
340
- M0340
341
- M0341
342
- M0342
343
- M0343
344
- M0344
345
- M0345
346
- M0346
347
- M0348
348
- M0347
349
- M0349
350
- M0350
351
- M0351
352
- M0352
353
- M0353
354
- M0354
355
- M0356
356
- M0355
357
- M0357
358
- M0358
359
- M0359
360
- M0360
361
- M0361
362
- M0362
363
- M0363
364
- M0364
365
- M0365
366
- M0366
367
- M0367
368
- M0368
369
- M0369
370
- M0370
371
- M0371
372
- M0372
373
- M0373
374
- M0374
375
- M0376
376
- M0375
377
- M0377
378
- M0378
379
- M0379
380
- M0380
381
- M0381
382
- M0382
383
- M0384
384
- M0383
385
- M0385
386
- M0386
387
- M0387
388
- M0388
389
- M0389
390
- M0390
391
- M0392
392
- M0391
393
- M0393
394
- M0394
395
- M0395
396
- M0396
397
- M0397
398
- M0398
399
- M0399
400
- M0400
401
- M0401
402
- M0402
403
- M0403
404
- M0404
405
- M0405
406
- M0406
407
- M0407
408
- M0408
409
- M0409
410
- M0410
411
- M0411
412
- M0412
413
- M0413
414
- M0414
415
- M0415
416
- M0416
417
- M0417
418
- M0418
419
- M0420
420
- M0419
421
- M0421
422
- M0422
423
- M0423
424
- M0424
425
- M0425
426
- M0426
427
- M0427
428
- M0428
429
- M0429
430
- M0430
431
- M0431
432
- M0432
433
- M0433
434
- M0434
435
- M0436
436
- M0435
437
- M0437
438
- M0438
439
- M0439
440
- M0440
441
- M0441
442
- M0442
443
- M0443
444
- M0444
445
- M0445
446
- M0446
447
- M0447
448
- M0448
449
- M0449
450
- M0450
451
- M0451
452
- M0452
453
- M0453
454
- M0454
455
- M0455
456
- M0457
457
- M0456
458
- M0458
459
- M0459
460
- M0460
461
- M0461
462
- M0462
463
- M0463
464
- M0464
465
- M0465
466
- M0467
467
- M0466
468
- M0468
469
- M0469
470
- M0470
471
- M0471
472
- M0472
473
- M0473
474
- M0474
475
- M0475
476
- M0476
477
- M0477
478
- M0478
479
- M0479
480
- M0480
481
- M0481
482
- M0483
483
- M0482
484
- M0484
485
- M0485
486
- M0486
487
- M0487
488
- M0488
489
- M0489
490
- M0490
491
- M0491
492
- M0493
493
- M0492
494
- M0495
495
- M0494
496
- M0496
497
- M0497
498
- M0498
499
- M0499
500
- M0500
501
- M0501
502
- M0502
503
- M0503
504
- M0505
505
- M0504
506
- M0506
507
- M0508
508
- M0507
509
- M0509
510
- M0510
511
- M0511
512
- M0512
513
- M0513
514
- M0515
515
- M0514
516
- M0516
517
- M0517
518
- M0518
519
- M0519
520
- M0520
521
- M0521
522
- M0522
523
- M0523
524
- M0525
525
- M0524
526
- M0526
527
- M0527
528
- M0528
529
- M0529
530
- M0530
531
- M0531
532
- M0533
533
- M0532
534
- M0534
535
- M0535
536
- M0536
537
- M0537
538
- M0538
539
- M0539
540
- M0540
541
- M0541
542
- M0542
543
- M0543
544
- M0544
545
- M0545
546
- M0546
547
- M0548
548
- M0547
549
- M0549
550
- M0550
551
- M0551
552
- M0552
553
- M0553
554
- M0554
555
- M0555
556
- M0556
557
- M0557
558
- M0558
559
- M0559
560
- M0560
561
- M0562
562
- M0563
563
- M0561
564
- M0564
565
- M0565
566
- M0567
567
- M0566
568
- M0568
569
- M0569
570
- M0570
571
- M0571
572
- M0572
573
- M0573
574
- M0575
575
- M0574
576
- M0576
577
- M0578
578
- M0577
579
- M0579
580
- M0580
581
- M0581
582
- M0582
583
- M0583
584
- M0584
585
- M0585
586
- M0586
587
- M0588
588
- M0587
589
- M0589
590
- M0590
591
- M0591
592
- M0592
593
- M0593
594
- M0594
595
- M0595
596
- M0596
597
- M0598
598
- M0597
599
- M0599
600
- M0600
601
- M0601
602
- M0602
603
- M0603
604
- M0604
605
- M0605
606
- M0606
607
- M0607
608
- M0608
609
- M0609
610
- M0610
611
- M0611
612
- M0612
613
- M0613
614
- M0614
615
- M0615
616
- M0616
617
- M0617
618
- M0618
619
- M0619
620
- M0620
621
- M0621
622
- M0622
623
- M0623
624
- M0624
625
- M0625
626
- M0626
627
- M0627
628
- M0628
629
- M0629
630
- M0630
631
- M0631
632
- M0632
633
- M0633
634
- M0634
635
- M0635
636
- M0636
637
- M0637
638
- M0638
639
- M0639
640
- M0640
641
- M0641
642
- M0642
643
- M0643
644
- M0644
645
- M0645
646
- M0646
647
- M0647
648
- M0648
649
- M0649
650
- M0650
651
- M0651
652
- M0652
653
- M0653
654
- M0654
655
- M0655
656
- M0656
657
- M0657
658
- M0658
659
- M0659
660
- M0660
661
- M0661
662
- M0662
663
- M0663
664
- M0664
665
- M0665
666
- M0666
667
- M0668
668
- M0667
669
- M0669
670
- M0670
671
- M0671
672
- M0672
673
- M0673
674
- M0674
675
- M0675
676
- M0676
677
- M0677
678
- M0678
679
- M0679
680
- M0680
681
- M0681
682
- M0682
683
- M0683
684
- M0685
685
- M0684
686
- M0686
687
- M0688
688
- M0687
689
- M0689
690
- M0690
691
- M0691
692
- M0692
693
- M0693
694
- M0694
695
- M0695
696
- M0696
697
- M0697
698
- M0698
699
- M0699
700
- M0700
701
- M0701
702
- M0703
703
- M0702
704
- M0704
705
- M0705
706
- M0707
707
- M0708
708
- M0706
709
- M0709
710
- M0710
711
- M0711
712
- M0712
713
- M0713
714
- M0714
715
- M0715
716
- M0716
717
- M0717
718
- M0718
719
- M0719
720
- M0720
721
- M0721
722
- M0722
723
- M0723
724
- M0724
725
- M0725
726
- M0726
727
- M0728
728
- M0727
729
- M0729
730
- M0730
731
- M0731
732
- M0733
733
- M0732
734
- M0734
735
- M0735
736
- M0736
737
- M0737
738
- M0738
739
- M0739
740
- M0740
741
- M0741
742
- M0742
743
- M0743
744
- M0744
745
- M0746
746
- M0745
747
- M0747
748
- M0749
749
- M0748
750
- M0750
751
- M0752
752
- M0751
753
- M0753
754
- M0754
755
- M0755
756
- M0756
757
- M0757
758
- M0758
759
- M0759
760
- M0760
761
- M0761
762
- M0762
763
- M0763
764
- M0764
765
- M0765
766
- M0766
767
- M0767
768
- M0768
769
- M0769
770
- M0770
771
- M0771
772
- M0772
773
- M0773
774
- M0774
775
- M0775
776
- M0776
777
- M0777
778
- M0779
779
- M0778
780
- M0780
781
- M0781
782
- M0782
783
- M0784
784
- M0783
785
- M0785
786
- M0786
787
- M0787
788
- M0788
789
- M0790
790
- M0789
791
- M0791
792
- M0792
793
- M0793
794
- M0794
795
- M0795
796
- M0797
797
- M0796
798
- M0798
799
- M0799
800
- M0800
801
- M0801
802
- M0802
803
- M0803
804
- M0804
805
- M0805
806
- M0806
807
- M0807
808
- M0808
809
- M0809
810
- M0810
811
- M0811
812
- M0812
813
- M0814
814
- M0813
815
- M0816
816
- M0815
817
- M0817
818
- M0818
819
- M0820
820
- M0821
821
- M0819
822
- M0822
823
- M0823
824
- M0824
825
- M0826
826
- M0825
827
- M0827
828
- M0828
829
- M0829
830
- M0830
831
- M0831
832
- M0832
833
- M0834
834
- M0833
835
- M0835
836
- M0836
837
- M0838
838
- M0837
839
- M0840
840
- M0839
841
- M0841
842
- M0842
843
- M0843
844
- M0844
845
- M0845
846
- M0846
847
- M0847
848
- M0848
849
- M0849
850
- M0850
851
- M0851
852
- M0852
853
- M0853
854
- M0854
855
- M0855
856
- M0856
857
- M0857
858
- M0858
859
- M0859
860
- M0860
861
- M0861
862
- M0862
863
- M0863
864
- M0864
865
- M0865
866
- M0866
867
- M0867
868
- M0868
869
- M0869
870
- M0870
871
- M0871
872
- M0872
873
- M0873
874
- M0874
875
- M0875
876
- M0876
877
- M0877
878
- M0878
879
- M0879
880
- M0880
881
- M0881
882
- M0882
883
- M0883
884
- M0884
885
- M0885
886
- M0886
887
- M0887
888
- M0889
889
- M0888
890
- M0890
891
- M0891
892
- M0892
893
- M0893
894
- M0895
895
- M0894
896
- M0896
897
- M0897
898
- M0898
899
- M0899
900
- M0900
901
- M0901
902
- M0902
903
- M0903
904
- M0904
905
- M0905
906
- M0906
907
- M0907
908
- M0908
909
- M0909
910
- M0910
911
- M0911
912
- M0912
913
- M0913
914
- M0914
915
- M0915
916
- M0916
917
- M0917
918
- M0918
919
- M0919
920
- M0920
921
- M0921
922
- M0922
923
- M0923
924
- M0924
925
- M0925
926
- M0926
927
- M0927
928
- M0928
929
- M0929
930
- M0931
931
- M0930
932
- M0932
933
- M0933
934
- M0934
935
- M0935
936
- M0936
937
- M0937
938
- M0938
939
- M0940
940
- M0939
941
- M0941
942
- M0943
943
- M0942
944
- M0944
945
- M0945
946
- M0946
947
- M0947
948
- M0948
949
- M0949
950
- M0950
951
- M0951
952
- M0952
953
- M0953
954
- M0955
955
- M0956
956
- M0954
957
- M0957
958
- M0958
959
- M0959
960
- M0960
961
- M0962
962
- M0961
963
- M0963
964
- M0964
965
- M0965
966
- M0966
967
- M0968
968
- M0967
969
- M0969
970
- M0970
971
- M0971
972
- M0973
973
- M0972
974
- M0974
975
- M0975
976
- M0976
977
- M0977
978
- M0978
979
- M0979
980
- M0980
981
- M0981
982
- M0983
983
- M0982
984
- M0984
985
- M0985
986
- M0986
987
- M0987
988
- M0988
989
- M0989
990
- M0990
991
- M0991
992
- M0992
993
- M0994
994
- M0993
995
- M0995
996
- M0996
997
- M0997
998
- M0998
999
- M0999
1000
- M1000