russianpost 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e3c78f24b94f6b559a0392383eb33071f10ad954
4
- data.tar.gz: b8e33c4b2002fd880b387dbd9f7f2d89ca68d894
3
+ metadata.gz: 432c2a17ad3bae233696642a6ffa35e89025e4b8
4
+ data.tar.gz: 7ba0945fd832ae124f00c0fda1a2238b34db6415
5
5
  SHA512:
6
- metadata.gz: 6d72fb4308001eb0fedbccb05d6ef7d17785b7ea24cb5c4b3defeec541027391b58933aec3a91347462961a09e1c7435d87b6bba0b0c97907f93246499ba29db
7
- data.tar.gz: de9013ea5ff2b270ad4fbf9b66b30c82feddec6d7d2c44558f7a906b45a8a52c307fd96e95befa7e3bc0f6b684f567824ab186a5a8a0fb0769464f5705939d8e
6
+ metadata.gz: 4a9a2e619ffd52a163b52f8a9f7d94e4a75e425ccf4eaaacf864870aae81736f81c036f6c98a5f9dffefe1313ed1df8d64106a155cc508a8c03def525bc812ba
7
+ data.tar.gz: 20f96307c3ecdbdec1cbfefc1c1eebfbf6eeef8fdd2f25ed6a8100d6fccc3e34aca304dd5a1ae64633161d2348fcf603b743a601311c35bc7cf4b3d365223d17
data/README.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  Thin wrapper around Russian Post package tracking SOAP API. Works on a per-package basis (contrary to the bulk ticket-based API). Use it at your own risk, since the API may appear unstable and require authorization in future.
4
4
 
5
+ ## Installation
6
+
7
+ To install gem stand-alone:
8
+
9
+ gem install russianpost
10
+
11
+ To use gem in a Rails app, add the following to your `Gemfile`:
12
+
13
+ gem "russianpost", "~> 0.2.0"
14
+
15
+ This gem uses [Savon](http://savonrb.com/), which in turn uses [HTTPI](https://github.com/savonrb/httpi) internally. HTTPI chooses the best HTTP library of those you have installed. For the fastest results, make sure you add [Curb](https://github.com/taf2/curb) to your `Gemfile`:
16
+
17
+ gem "curb"
18
+ gem "russianpost"
19
+
20
+ If you use RussianPost outside Rails, `require "curb"` before requiring RussianPost.
21
+
5
22
  ## Usage
6
23
 
7
24
  Initialize a parcel object, passing the package barcode to the constructor:
data/Rakefile CHANGED
@@ -4,5 +4,6 @@ require "rake/testtask"
4
4
  task default: :test
5
5
 
6
6
  Rake::TestTask.new do |t|
7
- t.test_files = FileList['spec/*_spec.rb']
7
+ t.libs << "test"
8
+ t.test_files = FileList['test/*_test.rb', 'test/*/*_test.rb']
8
9
  end
@@ -7,7 +7,7 @@ module RussianPost
7
7
  def initialize
8
8
  @endpoint = "http://voh.russianpost.ru:8080/niips-operationhistory-web/OperationHistory"
9
9
  @namespace = "http://russianpost.org/operationhistory/data"
10
- @savon = Savon.client(endpoint: endpoint, namespace: namespace)
10
+ @savon = Savon.client(endpoint: endpoint, namespace: namespace, log: false)
11
11
  end
12
12
 
13
13
  def call(barcode: nil)
@@ -4,7 +4,11 @@ module RussianPost
4
4
  module OperationsFactory
5
5
  class << self
6
6
  def build(operations_hash)
7
- operations_hash.map { |o| build_operation(o) }
7
+ if operations_hash
8
+ operations_hash.map { |o| build_operation(o) }
9
+ else
10
+ []
11
+ end
8
12
  end
9
13
 
10
14
  def build_operation(operation_hash)
@@ -6,8 +6,10 @@ module RussianPost
6
6
  attr_reader :barcode, :client
7
7
 
8
8
  def initialize(barcode, client: Client)
9
- @barcode = barcode
9
+ @barcode = barcode.upcase
10
10
  @client = client.new
11
+
12
+ raise InvalidBarcode unless barcode_is_valid?
11
13
  end
12
14
 
13
15
  def operations
@@ -19,5 +21,11 @@ module RussianPost
19
21
  def fetch_operations
20
22
  OperationsFactory.build(client.call(barcode: barcode))
21
23
  end
24
+
25
+ def barcode_is_valid?
26
+ barcode =~ /\A([A-Z]{2}\d{9}[A-Z]{2})|(\d{14})\z/
27
+ end
22
28
  end
29
+
30
+ class InvalidBarcode < ArgumentError; end
23
31
  end
@@ -1,3 +1,3 @@
1
1
  module Russianpost
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -0,0 +1,46 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://voh.russianpost.ru:8080/niips-operationhistory-web/OperationHistory
6
+ body:
7
+ encoding: UTF-8
8
+ string: <?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
9
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://russianpost.org/operationhistory/data"
10
+ xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><wsdl:OperationHistoryRequest><wsdl:Barcode>RR123456789EE</wsdl:Barcode><wsdl:MessageType>0</wsdl:MessageType></wsdl:OperationHistoryRequest></env:Body></env:Envelope>
11
+ headers:
12
+ Soapaction:
13
+ - '"OperationHistoryRequest"'
14
+ Content-Type:
15
+ - text/xml;charset=UTF-8
16
+ Content-Length:
17
+ - '440'
18
+ Accept-Encoding:
19
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
20
+ Accept:
21
+ - '*/*'
22
+ User-Agent:
23
+ - Ruby
24
+ response:
25
+ status:
26
+ code: 200
27
+ message: OK
28
+ headers:
29
+ X-Powered-By:
30
+ - Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.1 Java/Oracle
31
+ Corporation/1.7)
32
+ Server:
33
+ - GlassFish Server Open Source Edition 3.1.1
34
+ Content-Type:
35
+ - text/xml;charset=utf-8
36
+ Transfer-Encoding:
37
+ - chunked
38
+ Date:
39
+ - Sat, 20 Apr 2013 22:10:07 GMT
40
+ body:
41
+ encoding: UTF-8
42
+ string: <?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:OperationHistoryData
43
+ xmlns:ns2="http://russianpost.org/operationhistory/data"/></S:Body></S:Envelope>
44
+ http_version:
45
+ recorded_at: Sat, 20 Apr 2013 22:10:13 GMT
46
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,365 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: http://voh.russianpost.ru:8080/niips-operationhistory-web/OperationHistory
6
+ body:
7
+ encoding: UTF-8
8
+ string: <?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema"
9
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:wsdl="http://russianpost.org/operationhistory/data"
10
+ xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body><wsdl:OperationHistoryRequest><wsdl:Barcode>RD025500807SE</wsdl:Barcode><wsdl:MessageType>0</wsdl:MessageType></wsdl:OperationHistoryRequest></env:Body></env:Envelope>
11
+ headers:
12
+ Soapaction:
13
+ - '"OperationHistoryRequest"'
14
+ Content-Type:
15
+ - text/xml;charset=UTF-8
16
+ Content-Length:
17
+ - '440'
18
+ Accept-Encoding:
19
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
20
+ Accept:
21
+ - '*/*'
22
+ User-Agent:
23
+ - Ruby
24
+ response:
25
+ status:
26
+ code: 200
27
+ message: OK
28
+ headers:
29
+ X-Powered-By:
30
+ - Servlet/3.0 JSP/2.2 (GlassFish Server Open Source Edition 3.1.1 Java/Oracle
31
+ Corporation/1.7)
32
+ Server:
33
+ - GlassFish Server Open Source Edition 3.1.1
34
+ Content-Type:
35
+ - text/xml;charset=utf-8
36
+ Transfer-Encoding:
37
+ - chunked
38
+ Date:
39
+ - Sat, 20 Apr 2013 22:02:45 GMT
40
+ body:
41
+ encoding: ASCII-8BIT
42
+ string: !binary |-
43
+ PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48UzpFbnZl
44
+ bG9wZSB4bWxuczpTPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2Fw
45
+ L2VudmVsb3BlLyI+PFM6Qm9keT48bnMyOk9wZXJhdGlvbkhpc3RvcnlEYXRh
46
+ IHhtbG5zOm5zMj0iaHR0cDovL3J1c3NpYW5wb3N0Lm9yZy9vcGVyYXRpb25o
47
+ aXN0b3J5L2RhdGEiPjxuczI6aGlzdG9yeVJlY29yZD48bnMyOkFkZHJlc3NQ
48
+ YXJhbWV0ZXJzPjxuczI6RGVzdGluYXRpb25BZGRyZXNzPjxuczI6SW5kZXg+
49
+ MTI3NTc2PC9uczI6SW5kZXg+PG5zMjpEZXNjcmlwdGlvbj7QnNC+0YHQutCy
50
+ 0LA8L25zMjpEZXNjcmlwdGlvbj48L25zMjpEZXN0aW5hdGlvbkFkZHJlc3M+
51
+ PG5zMjpPcGVyYXRpb25BZGRyZXNzPjxuczI6SW5kZXg+NjMwOTgyPC9uczI6
52
+ SW5kZXg+PG5zMjpEZXNjcmlwdGlvbj7QndC+0LLQvtGB0LjQsdC40YDRgdC6
53
+ IFBJLTI8L25zMjpEZXNjcmlwdGlvbj48L25zMjpPcGVyYXRpb25BZGRyZXNz
54
+ PjxuczI6TWFpbERpcmVjdD48bnMyOklkPjY0MzwvbnMyOklkPjxuczI6TmFt
55
+ ZVJVPtCg0L7RgdGB0LjQudGB0LrQsNGPINCk0LXQtNC10YDQsNGG0LjRjzwv
56
+ bnMyOk5hbWVSVT48L25zMjpNYWlsRGlyZWN0PjxuczI6Q291bnRyeUZyb20+
57
+ PG5zMjpJZD43NTI8L25zMjpJZD48bnMyOk5hbWVSVT7QqNCy0LXRhtC40Y88
58
+ L25zMjpOYW1lUlU+PC9uczI6Q291bnRyeUZyb20+PG5zMjpDb3VudHJ5T3Bl
59
+ cj48bnMyOklkPjY0MzwvbnMyOklkPjwvbnMyOkNvdW50cnlPcGVyPjwvbnMy
60
+ OkFkZHJlc3NQYXJhbWV0ZXJzPjxuczI6RmluYW5jZVBhcmFtZXRlcnM+PG5z
61
+ MjpQYXltZW50PjA8L25zMjpQYXltZW50PjxuczI6VmFsdWU+MDwvbnMyOlZh
62
+ bHVlPjxuczI6TWFzc1JhdGU+MDwvbnMyOk1hc3NSYXRlPjxuczI6SW5zclJh
63
+ dGU+MDwvbnMyOkluc3JSYXRlPjxuczI6QWlyUmF0ZT4wPC9uczI6QWlyUmF0
64
+ ZT48bnMyOlJhdGU+MDwvbnMyOlJhdGU+PC9uczI6RmluYW5jZVBhcmFtZXRl
65
+ cnM+PG5zMjpJdGVtUGFyYW1ldGVycz48bnMyOkJhcmNvZGU+UkQwMjU1MDA4
66
+ MDdTRTwvbnMyOkJhcmNvZGU+PG5zMjpJbnRlcm51bT5SRDAyNTUwMDgwN1NF
67
+ PC9uczI6SW50ZXJudW0+PG5zMjpWYWxpZFJ1VHlwZT5mYWxzZTwvbnMyOlZh
68
+ bGlkUnVUeXBlPjxuczI6VmFsaWRFblR5cGU+dHJ1ZTwvbnMyOlZhbGlkRW5U
69
+ eXBlPjxuczI6Q29tcGxleEl0ZW1OYW1lPtCc0LXQu9C60LjQuSDQv9Cw0LrQ
70
+ tdGCINC30LDQutCw0LfQvdC+0Lk8L25zMjpDb21wbGV4SXRlbU5hbWU+PG5z
71
+ MjpNYWlsUmFuaz48bnMyOklkPjA8L25zMjpJZD48bnMyOk5hbWU+0JHQtdC3
72
+ INGA0LDQt9GA0Y/QtNCwPC9uczI6TmFtZT48L25zMjpNYWlsUmFuaz48bnMy
73
+ OlBvc3RNYXJrPjxuczI6SWQ+MDwvbnMyOklkPjxuczI6TmFtZT7QkdC10Lcg
74
+ 0L7RgtC80LXRgtC60Lg8L25zMjpOYW1lPjwvbnMyOlBvc3RNYXJrPjxuczI6
75
+ TWFpbFR5cGU+PG5zMjpJZD41PC9uczI6SWQ+PG5zMjpOYW1lPtCc0LXQu9C6
76
+ 0LjQuSDQv9Cw0LrQtdGCPC9uczI6TmFtZT48L25zMjpNYWlsVHlwZT48bnMy
77
+ Ok1haWxDdGc+PG5zMjpJZD4xPC9uczI6SWQ+PG5zMjpOYW1lPtCX0LDQutCw
78
+ 0LfQvdC+0LU8L25zMjpOYW1lPjwvbnMyOk1haWxDdGc+PG5zMjpNYXNzPjI4
79
+ MTwvbnMyOk1hc3M+PG5zMjpNYXhNYXNzUlU+MjAwMDwvbnMyOk1heE1hc3NS
80
+ VT48bnMyOk1heE1hc3NFTj4yMDAwPC9uczI6TWF4TWFzc0VOPjwvbnMyOkl0
81
+ ZW1QYXJhbWV0ZXJzPjxuczI6T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOk9w
82
+ ZXJUeXBlPjxuczI6SWQ+OTwvbnMyOklkPjxuczI6TmFtZT7QmNC80L/QvtGA
83
+ 0YI8L25zMjpOYW1lPjwvbnMyOk9wZXJUeXBlPjxuczI6T3BlckF0dHI+PG5z
84
+ MjpJZD4wPC9uczI6SWQ+PC9uczI6T3BlckF0dHI+PG5zMjpPcGVyRGF0ZT4y
85
+ MDEzLTAzLTI3VDE5OjA5OjAwLjAwMCswNDowMDwvbnMyOk9wZXJEYXRlPjwv
86
+ bnMyOk9wZXJhdGlvblBhcmFtZXRlcnM+PG5zMjpVc2VyUGFyYW1ldGVycz48
87
+ bnMyOlNlbmRDdGc+PG5zMjpJZD40PC9uczI6SWQ+PG5zMjpOYW1lPtCc0LXQ
88
+ ttC00YPQvdCw0YDQvtC00L3Ri9C5INC+0L/QtdGA0LDRgtC+0YA8L25zMjpO
89
+ YW1lPjwvbnMyOlNlbmRDdGc+PG5zMjpSY3BuPtCV0JvQldCd0JA8L25zMjpS
90
+ Y3BuPjwvbnMyOlVzZXJQYXJhbWV0ZXJzPjwvbnMyOmhpc3RvcnlSZWNvcmQ+
91
+ PG5zMjpoaXN0b3J5UmVjb3JkPjxuczI6QWRkcmVzc1BhcmFtZXRlcnM+PG5z
92
+ MjpPcGVyYXRpb25BZGRyZXNzPjxuczI6SW5kZXg+NjMwOTgyPC9uczI6SW5k
93
+ ZXg+PG5zMjpEZXNjcmlwdGlvbj7QndC+0LLQvtGB0LjQsdC40YDRgdC6IFBJ
94
+ LTI8L25zMjpEZXNjcmlwdGlvbj48L25zMjpPcGVyYXRpb25BZGRyZXNzPjxu
95
+ czI6Q291bnRyeU9wZXI+PG5zMjpJZD42NDM8L25zMjpJZD48L25zMjpDb3Vu
96
+ dHJ5T3Blcj48L25zMjpBZGRyZXNzUGFyYW1ldGVycz48bnMyOkZpbmFuY2VQ
97
+ YXJhbWV0ZXJzPjxuczI6UGF5bWVudD4wPC9uczI6UGF5bWVudD48bnMyOlZh
98
+ bHVlPjA8L25zMjpWYWx1ZT48bnMyOk1hc3NSYXRlPjA8L25zMjpNYXNzUmF0
99
+ ZT48bnMyOkluc3JSYXRlPjA8L25zMjpJbnNyUmF0ZT48bnMyOkFpclJhdGU+
100
+ MDwvbnMyOkFpclJhdGU+PG5zMjpSYXRlPjA8L25zMjpSYXRlPjwvbnMyOkZp
101
+ bmFuY2VQYXJhbWV0ZXJzPjxuczI6SXRlbVBhcmFtZXRlcnM+PG5zMjpCYXJj
102
+ b2RlPlJEMDI1NTAwODA3U0U8L25zMjpCYXJjb2RlPjxuczI6VmFsaWRSdVR5
103
+ cGU+ZmFsc2U8L25zMjpWYWxpZFJ1VHlwZT48bnMyOlZhbGlkRW5UeXBlPnRy
104
+ dWU8L25zMjpWYWxpZEVuVHlwZT48bnMyOkNvbXBsZXhJdGVtTmFtZT7QnNC1
105
+ 0LvQutC40Lkg0L/QsNC60LXRgiDQt9Cw0LrQsNC30L3QvtC5PC9uczI6Q29t
106
+ cGxleEl0ZW1OYW1lPjxuczI6TWFpbFJhbms+PG5zMjpJZD4wPC9uczI6SWQ+
107
+ PG5zMjpOYW1lPtCR0LXQtyDRgNCw0LfRgNGP0LTQsDwvbnMyOk5hbWU+PC9u
108
+ czI6TWFpbFJhbms+PG5zMjpQb3N0TWFyaz48bnMyOklkPjA8L25zMjpJZD48
109
+ bnMyOk5hbWU+0JHQtdC3INC+0YLQvNC10YLQutC4PC9uczI6TmFtZT48L25z
110
+ MjpQb3N0TWFyaz48bnMyOk1haWxUeXBlPjxuczI6SWQ+NTwvbnMyOklkPjxu
111
+ czI6TmFtZT7QnNC10LvQutC40Lkg0L/QsNC60LXRgjwvbnMyOk5hbWU+PC9u
112
+ czI6TWFpbFR5cGU+PG5zMjpNYWlsQ3RnPjxuczI6SWQ+MTwvbnMyOklkPjxu
113
+ czI6TmFtZT7Ql9Cw0LrQsNC30L3QvtC1PC9uczI6TmFtZT48L25zMjpNYWls
114
+ Q3RnPjxuczI6TWFzcz4yODE8L25zMjpNYXNzPjxuczI6TWF4TWFzc1JVPjIw
115
+ MDA8L25zMjpNYXhNYXNzUlU+PG5zMjpNYXhNYXNzRU4+MjAwMDwvbnMyOk1h
116
+ eE1hc3NFTj48L25zMjpJdGVtUGFyYW1ldGVycz48bnMyOk9wZXJhdGlvblBh
117
+ cmFtZXRlcnM+PG5zMjpPcGVyVHlwZT48bnMyOklkPjExPC9uczI6SWQ+PG5z
118
+ MjpOYW1lPtCf0LXRgNC10LTQsNC90L4g0YLQsNC80L7QttC90LU8L25zMjpO
119
+ YW1lPjwvbnMyOk9wZXJUeXBlPjxuczI6T3BlckF0dHI+PG5zMjpJZD4wPC9u
120
+ czI6SWQ+PC9uczI6T3BlckF0dHI+PG5zMjpPcGVyRGF0ZT4yMDEzLTAzLTI4
121
+ VDA5OjQwOjAwLjAwMCswNDowMDwvbnMyOk9wZXJEYXRlPjwvbnMyOk9wZXJh
122
+ dGlvblBhcmFtZXRlcnM+PG5zMjpVc2VyUGFyYW1ldGVycy8+PC9uczI6aGlz
123
+ dG9yeVJlY29yZD48bnMyOmhpc3RvcnlSZWNvcmQ+PG5zMjpBZGRyZXNzUGFy
124
+ YW1ldGVycz48bnMyOk9wZXJhdGlvbkFkZHJlc3M+PG5zMjpJbmRleD42MzA5
125
+ ODI8L25zMjpJbmRleD48bnMyOkRlc2NyaXB0aW9uPtCd0L7QstC+0YHQuNCx
126
+ 0LjRgNGB0LogUEktMjwvbnMyOkRlc2NyaXB0aW9uPjwvbnMyOk9wZXJhdGlv
127
+ bkFkZHJlc3M+PG5zMjpDb3VudHJ5T3Blcj48bnMyOklkPjY0MzwvbnMyOklk
128
+ PjwvbnMyOkNvdW50cnlPcGVyPjwvbnMyOkFkZHJlc3NQYXJhbWV0ZXJzPjxu
129
+ czI6RmluYW5jZVBhcmFtZXRlcnM+PG5zMjpQYXltZW50PjA8L25zMjpQYXlt
130
+ ZW50PjxuczI6VmFsdWU+MDwvbnMyOlZhbHVlPjxuczI6TWFzc1JhdGU+MDwv
131
+ bnMyOk1hc3NSYXRlPjxuczI6SW5zclJhdGU+MDwvbnMyOkluc3JSYXRlPjxu
132
+ czI6QWlyUmF0ZT4wPC9uczI6QWlyUmF0ZT48bnMyOlJhdGU+MDwvbnMyOlJh
133
+ dGU+PC9uczI6RmluYW5jZVBhcmFtZXRlcnM+PG5zMjpJdGVtUGFyYW1ldGVy
134
+ cz48bnMyOkJhcmNvZGU+UkQwMjU1MDA4MDdTRTwvbnMyOkJhcmNvZGU+PG5z
135
+ MjpWYWxpZFJ1VHlwZT5mYWxzZTwvbnMyOlZhbGlkUnVUeXBlPjxuczI6VmFs
136
+ aWRFblR5cGU+dHJ1ZTwvbnMyOlZhbGlkRW5UeXBlPjxuczI6Q29tcGxleEl0
137
+ ZW1OYW1lPtCc0LXQu9C60LjQuSDQv9Cw0LrQtdGCINC30LDQutCw0LfQvdC+
138
+ 0Lk8L25zMjpDb21wbGV4SXRlbU5hbWU+PG5zMjpNYWlsUmFuaz48bnMyOklk
139
+ PjA8L25zMjpJZD48bnMyOk5hbWU+0JHQtdC3INGA0LDQt9GA0Y/QtNCwPC9u
140
+ czI6TmFtZT48L25zMjpNYWlsUmFuaz48bnMyOlBvc3RNYXJrPjxuczI6SWQ+
141
+ MDwvbnMyOklkPjxuczI6TmFtZT7QkdC10Lcg0L7RgtC80LXRgtC60Lg8L25z
142
+ MjpOYW1lPjwvbnMyOlBvc3RNYXJrPjxuczI6TWFpbFR5cGU+PG5zMjpJZD41
143
+ PC9uczI6SWQ+PG5zMjpOYW1lPtCc0LXQu9C60LjQuSDQv9Cw0LrQtdGCPC9u
144
+ czI6TmFtZT48L25zMjpNYWlsVHlwZT48bnMyOk1haWxDdGc+PG5zMjpJZD4x
145
+ PC9uczI6SWQ+PG5zMjpOYW1lPtCX0LDQutCw0LfQvdC+0LU8L25zMjpOYW1l
146
+ PjwvbnMyOk1haWxDdGc+PG5zMjpNYXNzPjI4MTwvbnMyOk1hc3M+PG5zMjpN
147
+ YXhNYXNzUlU+MjAwMDwvbnMyOk1heE1hc3NSVT48bnMyOk1heE1hc3NFTj4y
148
+ MDAwPC9uczI6TWF4TWFzc0VOPjwvbnMyOkl0ZW1QYXJhbWV0ZXJzPjxuczI6
149
+ T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOk9wZXJUeXBlPjxuczI6SWQ+MTQ8
150
+ L25zMjpJZD48bnMyOk5hbWU+0KLQsNC80L7QttC10L3QvdC+0LUg0L7RhNC+
151
+ 0YDQvNC70LXQvdC40LUg0LfQsNCy0LXRgNGI0LXQvdC+IDwvbnMyOk5hbWU+
152
+ PC9uczI6T3BlclR5cGU+PG5zMjpPcGVyQXR0cj48bnMyOklkPjE8L25zMjpJ
153
+ ZD48bnMyOk5hbWU+0JLRi9C/0YPRidC10L3QviDRgtCw0LzQvtC20L3QtdC5
154
+ PC9uczI6TmFtZT48L25zMjpPcGVyQXR0cj48bnMyOk9wZXJEYXRlPjIwMTMt
155
+ MDMtMjhUMDk6NDI6MDAuMDAwKzA0OjAwPC9uczI6T3BlckRhdGU+PC9uczI6
156
+ T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOlVzZXJQYXJhbWV0ZXJzPjxuczI6
157
+ U2VuZEN0Zz48bnMyOklkPjA8L25zMjpJZD48L25zMjpTZW5kQ3RnPjwvbnMy
158
+ OlVzZXJQYXJhbWV0ZXJzPjwvbnMyOmhpc3RvcnlSZWNvcmQ+PG5zMjpoaXN0
159
+ b3J5UmVjb3JkPjxuczI6QWRkcmVzc1BhcmFtZXRlcnM+PG5zMjpPcGVyYXRp
160
+ b25BZGRyZXNzPjxuczI6SW5kZXg+NjMwOTgyPC9uczI6SW5kZXg+PG5zMjpE
161
+ ZXNjcmlwdGlvbj7QndC+0LLQvtGB0LjQsdC40YDRgdC6IFBJLTI8L25zMjpE
162
+ ZXNjcmlwdGlvbj48L25zMjpPcGVyYXRpb25BZGRyZXNzPjxuczI6Q291bnRy
163
+ eUZyb20+PG5zMjpJZD43NTI8L25zMjpJZD48bnMyOk5hbWVSVT7QqNCy0LXR
164
+ htC40Y88L25zMjpOYW1lUlU+PC9uczI6Q291bnRyeUZyb20+PG5zMjpDb3Vu
165
+ dHJ5T3Blcj48bnMyOklkPjY0MzwvbnMyOklkPjwvbnMyOkNvdW50cnlPcGVy
166
+ PjwvbnMyOkFkZHJlc3NQYXJhbWV0ZXJzPjxuczI6RmluYW5jZVBhcmFtZXRl
167
+ cnM+PG5zMjpQYXltZW50PjA8L25zMjpQYXltZW50PjxuczI6VmFsdWU+MDwv
168
+ bnMyOlZhbHVlPjxuczI6TWFzc1JhdGU+MDwvbnMyOk1hc3NSYXRlPjxuczI6
169
+ SW5zclJhdGU+MDwvbnMyOkluc3JSYXRlPjxuczI6QWlyUmF0ZT4wPC9uczI6
170
+ QWlyUmF0ZT48bnMyOlJhdGU+MDwvbnMyOlJhdGU+PC9uczI6RmluYW5jZVBh
171
+ cmFtZXRlcnM+PG5zMjpJdGVtUGFyYW1ldGVycz48bnMyOkJhcmNvZGU+UkQw
172
+ MjU1MDA4MDdTRTwvbnMyOkJhcmNvZGU+PG5zMjpWYWxpZFJ1VHlwZT5mYWxz
173
+ ZTwvbnMyOlZhbGlkUnVUeXBlPjxuczI6VmFsaWRFblR5cGU+dHJ1ZTwvbnMy
174
+ OlZhbGlkRW5UeXBlPjxuczI6Q29tcGxleEl0ZW1OYW1lPtCc0LXQu9C60LjQ
175
+ uSDQv9Cw0LrQtdGCINC30LDQutCw0LfQvdC+0Lk8L25zMjpDb21wbGV4SXRl
176
+ bU5hbWU+PG5zMjpQb3N0TWFyaz48bnMyOklkPjA8L25zMjpJZD48bnMyOk5h
177
+ bWU+0JHQtdC3INC+0YLQvNC10YLQutC4PC9uczI6TmFtZT48L25zMjpQb3N0
178
+ TWFyaz48bnMyOk1haWxUeXBlPjxuczI6SWQ+NTwvbnMyOklkPjxuczI6TmFt
179
+ ZT7QnNC10LvQutC40Lkg0L/QsNC60LXRgjwvbnMyOk5hbWU+PC9uczI6TWFp
180
+ bFR5cGU+PG5zMjpNYWlsQ3RnPjxuczI6SWQ+MTwvbnMyOklkPjxuczI6TmFt
181
+ ZT7Ql9Cw0LrQsNC30L3QvtC1PC9uczI6TmFtZT48L25zMjpNYWlsQ3RnPjxu
182
+ czI6TWFzcz4wPC9uczI6TWFzcz48bnMyOk1heE1hc3NSVT4yMDAwPC9uczI6
183
+ TWF4TWFzc1JVPjxuczI6TWF4TWFzc0VOPjIwMDA8L25zMjpNYXhNYXNzRU4+
184
+ PC9uczI6SXRlbVBhcmFtZXRlcnM+PG5zMjpPcGVyYXRpb25QYXJhbWV0ZXJz
185
+ PjxuczI6T3BlclR5cGU+PG5zMjpJZD44PC9uczI6SWQ+PG5zMjpOYW1lPtCe
186
+ 0LHRgNCw0LHQvtGC0LrQsDwvbnMyOk5hbWU+PC9uczI6T3BlclR5cGU+PG5z
187
+ MjpPcGVyQXR0cj48bnMyOklkPjY8L25zMjpJZD48bnMyOk5hbWU+0J/QvtC6
188
+ 0LjQvdGD0LvQviDQvNC10YHRgtC+INC80LXQttC00YPQvdCw0YDQvtC00L3Q
189
+ vtCz0L4g0L7QsdC80LXQvdCwPC9uczI6TmFtZT48L25zMjpPcGVyQXR0cj48
190
+ bnMyOk9wZXJEYXRlPjIwMTMtMDMtMjlUMDU6MzI6MDAuMDAwKzA0OjAwPC9u
191
+ czI6T3BlckRhdGU+PC9uczI6T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOlVz
192
+ ZXJQYXJhbWV0ZXJzPjxuczI6UmNwbj7QldCb0JXQndCQPC9uczI6UmNwbj48
193
+ L25zMjpVc2VyUGFyYW1ldGVycz48L25zMjpoaXN0b3J5UmVjb3JkPjxuczI6
194
+ aGlzdG9yeVJlY29yZD48bnMyOkFkZHJlc3NQYXJhbWV0ZXJzPjxuczI6T3Bl
195
+ cmF0aW9uQWRkcmVzcz48bnMyOkluZGV4PjEwNDAwMjwvbnMyOkluZGV4Pjxu
196
+ czI6RGVzY3JpcHRpb24+0JzQvtGB0LrQstCwIFBDSS0yPC9uczI6RGVzY3Jp
197
+ cHRpb24+PC9uczI6T3BlcmF0aW9uQWRkcmVzcz48bnMyOkNvdW50cnlGcm9t
198
+ PjxuczI6SWQ+NzUyPC9uczI6SWQ+PG5zMjpOYW1lUlU+0KjQstC10YbQuNGP
199
+ PC9uczI6TmFtZVJVPjwvbnMyOkNvdW50cnlGcm9tPjxuczI6Q291bnRyeU9w
200
+ ZXI+PG5zMjpJZD42NDM8L25zMjpJZD48L25zMjpDb3VudHJ5T3Blcj48L25z
201
+ MjpBZGRyZXNzUGFyYW1ldGVycz48bnMyOkZpbmFuY2VQYXJhbWV0ZXJzPjxu
202
+ czI6UGF5bWVudD4wPC9uczI6UGF5bWVudD48bnMyOlZhbHVlPjA8L25zMjpW
203
+ YWx1ZT48bnMyOk1hc3NSYXRlPjA8L25zMjpNYXNzUmF0ZT48bnMyOkluc3JS
204
+ YXRlPjA8L25zMjpJbnNyUmF0ZT48bnMyOkFpclJhdGU+MDwvbnMyOkFpclJh
205
+ dGU+PG5zMjpSYXRlPjA8L25zMjpSYXRlPjwvbnMyOkZpbmFuY2VQYXJhbWV0
206
+ ZXJzPjxuczI6SXRlbVBhcmFtZXRlcnM+PG5zMjpCYXJjb2RlPlJEMDI1NTAw
207
+ ODA3U0U8L25zMjpCYXJjb2RlPjxuczI6VmFsaWRSdVR5cGU+ZmFsc2U8L25z
208
+ MjpWYWxpZFJ1VHlwZT48bnMyOlZhbGlkRW5UeXBlPnRydWU8L25zMjpWYWxp
209
+ ZEVuVHlwZT48bnMyOkNvbXBsZXhJdGVtTmFtZT7QnNC10LvQutC40Lkg0L/Q
210
+ sNC60LXRgiDQt9Cw0LrQsNC30L3QvtC5PC9uczI6Q29tcGxleEl0ZW1OYW1l
211
+ PjxuczI6UG9zdE1hcms+PG5zMjpJZD4wPC9uczI6SWQ+PG5zMjpOYW1lPtCR
212
+ 0LXQtyDQvtGC0LzQtdGC0LrQuDwvbnMyOk5hbWU+PC9uczI6UG9zdE1hcms+
213
+ PG5zMjpNYWlsVHlwZT48bnMyOklkPjU8L25zMjpJZD48bnMyOk5hbWU+0JzQ
214
+ tdC70LrQuNC5INC/0LDQutC10YI8L25zMjpOYW1lPjwvbnMyOk1haWxUeXBl
215
+ PjxuczI6TWFpbEN0Zz48bnMyOklkPjE8L25zMjpJZD48bnMyOk5hbWU+0JfQ
216
+ sNC60LDQt9C90L7QtTwvbnMyOk5hbWU+PC9uczI6TWFpbEN0Zz48bnMyOk1h
217
+ c3M+MDwvbnMyOk1hc3M+PG5zMjpNYXhNYXNzUlU+MjAwMDwvbnMyOk1heE1h
218
+ c3NSVT48bnMyOk1heE1hc3NFTj4yMDAwPC9uczI6TWF4TWFzc0VOPjwvbnMy
219
+ Okl0ZW1QYXJhbWV0ZXJzPjxuczI6T3BlcmF0aW9uUGFyYW1ldGVycz48bnMy
220
+ Ok9wZXJUeXBlPjxuczI6SWQ+ODwvbnMyOklkPjxuczI6TmFtZT7QntCx0YDQ
221
+ sNCx0L7RgtC60LA8L25zMjpOYW1lPjwvbnMyOk9wZXJUeXBlPjxuczI6T3Bl
222
+ ckF0dHI+PG5zMjpJZD4wPC9uczI6SWQ+PG5zMjpOYW1lPtCh0L7RgNGC0LjR
223
+ gNC+0LLQutCwPC9uczI6TmFtZT48L25zMjpPcGVyQXR0cj48bnMyOk9wZXJE
224
+ YXRlPjIwMTMtMDQtMDNUMDQ6NTY6MDAuMDAwKzA0OjAwPC9uczI6T3BlckRh
225
+ dGU+PC9uczI6T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOlVzZXJQYXJhbWV0
226
+ ZXJzPjxuczI6UmNwbj7QldCb0JXQndCQPC9uczI6UmNwbj48L25zMjpVc2Vy
227
+ UGFyYW1ldGVycz48L25zMjpoaXN0b3J5UmVjb3JkPjxuczI6aGlzdG9yeVJl
228
+ Y29yZD48bnMyOkFkZHJlc3NQYXJhbWV0ZXJzPjxuczI6T3BlcmF0aW9uQWRk
229
+ cmVzcz48bnMyOkluZGV4PjExMTk4NTwvbnMyOkluZGV4PjxuczI6RGVzY3Jp
230
+ cHRpb24+0JzQvtGB0LrQstCwINCc0KHQny0zINCj0YctNTwvbnMyOkRlc2Ny
231
+ aXB0aW9uPjwvbnMyOk9wZXJhdGlvbkFkZHJlc3M+PG5zMjpDb3VudHJ5T3Bl
232
+ cj48bnMyOklkPjY0MzwvbnMyOklkPjwvbnMyOkNvdW50cnlPcGVyPjwvbnMy
233
+ OkFkZHJlc3NQYXJhbWV0ZXJzPjxuczI6RmluYW5jZVBhcmFtZXRlcnM+PG5z
234
+ MjpQYXltZW50PjA8L25zMjpQYXltZW50PjxuczI6VmFsdWU+MDwvbnMyOlZh
235
+ bHVlPjxuczI6TWFzc1JhdGU+MDwvbnMyOk1hc3NSYXRlPjxuczI6SW5zclJh
236
+ dGU+MDwvbnMyOkluc3JSYXRlPjxuczI6QWlyUmF0ZT4wPC9uczI6QWlyUmF0
237
+ ZT48bnMyOlJhdGU+MDwvbnMyOlJhdGU+PC9uczI6RmluYW5jZVBhcmFtZXRl
238
+ cnM+PG5zMjpJdGVtUGFyYW1ldGVycz48bnMyOkJhcmNvZGU+UkQwMjU1MDA4
239
+ MDdTRTwvbnMyOkJhcmNvZGU+PG5zMjpWYWxpZFJ1VHlwZT5mYWxzZTwvbnMy
240
+ OlZhbGlkUnVUeXBlPjxuczI6VmFsaWRFblR5cGU+dHJ1ZTwvbnMyOlZhbGlk
241
+ RW5UeXBlPjxuczI6Q29tcGxleEl0ZW1OYW1lPtCc0LXQu9C60LjQuSDQv9Cw
242
+ 0LrQtdGCINC30LDQutCw0LfQvdC+0Lk8L25zMjpDb21wbGV4SXRlbU5hbWU+
243
+ PG5zMjpQb3N0TWFyaz48bnMyOklkPjA8L25zMjpJZD48bnMyOk5hbWU+0JHQ
244
+ tdC3INC+0YLQvNC10YLQutC4PC9uczI6TmFtZT48L25zMjpQb3N0TWFyaz48
245
+ bnMyOk1haWxUeXBlPjxuczI6SWQ+NTwvbnMyOklkPjxuczI6TmFtZT7QnNC1
246
+ 0LvQutC40Lkg0L/QsNC60LXRgjwvbnMyOk5hbWU+PC9uczI6TWFpbFR5cGU+
247
+ PG5zMjpNYWlsQ3RnPjxuczI6SWQ+MTwvbnMyOklkPjxuczI6TmFtZT7Ql9Cw
248
+ 0LrQsNC30L3QvtC1PC9uczI6TmFtZT48L25zMjpNYWlsQ3RnPjxuczI6TWFz
249
+ cz4wPC9uczI6TWFzcz48bnMyOk1heE1hc3NSVT4yMDAwPC9uczI6TWF4TWFz
250
+ c1JVPjxuczI6TWF4TWFzc0VOPjIwMDA8L25zMjpNYXhNYXNzRU4+PC9uczI6
251
+ SXRlbVBhcmFtZXRlcnM+PG5zMjpPcGVyYXRpb25QYXJhbWV0ZXJzPjxuczI6
252
+ T3BlclR5cGU+PG5zMjpJZD44PC9uczI6SWQ+PG5zMjpOYW1lPtCe0LHRgNCw
253
+ 0LHQvtGC0LrQsDwvbnMyOk5hbWU+PC9uczI6T3BlclR5cGU+PG5zMjpPcGVy
254
+ QXR0cj48bnMyOklkPjQ8L25zMjpJZD48bnMyOk5hbWU+0J/QvtC60LjQvdGD
255
+ 0LvQviDRgdC+0YDRgtC40YDQvtCy0L7Rh9C90YvQuSDRhtC10L3RgtGAPC9u
256
+ czI6TmFtZT48L25zMjpPcGVyQXR0cj48bnMyOk9wZXJEYXRlPjIwMTMtMDQt
257
+ MDRUMDA6MDA6MDAuMDAwKzA0OjAwPC9uczI6T3BlckRhdGU+PC9uczI6T3Bl
258
+ cmF0aW9uUGFyYW1ldGVycz48bnMyOlVzZXJQYXJhbWV0ZXJzLz48L25zMjpo
259
+ aXN0b3J5UmVjb3JkPjxuczI6aGlzdG9yeVJlY29yZD48bnMyOkFkZHJlc3NQ
260
+ YXJhbWV0ZXJzPjxuczI6T3BlcmF0aW9uQWRkcmVzcz48bnMyOkluZGV4PjEx
261
+ MTk0ODwvbnMyOkluZGV4PjxuczI6RGVzY3JpcHRpb24+0JzQvtGB0LrQstCw
262
+ INCc0KHQny0zINCj0YctNDg8L25zMjpEZXNjcmlwdGlvbj48L25zMjpPcGVy
263
+ YXRpb25BZGRyZXNzPjxuczI6Q291bnRyeU9wZXI+PG5zMjpJZD42NDM8L25z
264
+ MjpJZD48L25zMjpDb3VudHJ5T3Blcj48L25zMjpBZGRyZXNzUGFyYW1ldGVy
265
+ cz48bnMyOkZpbmFuY2VQYXJhbWV0ZXJzPjxuczI6UGF5bWVudD4wPC9uczI6
266
+ UGF5bWVudD48bnMyOlZhbHVlPjA8L25zMjpWYWx1ZT48bnMyOk1hc3NSYXRl
267
+ PjA8L25zMjpNYXNzUmF0ZT48bnMyOkluc3JSYXRlPjA8L25zMjpJbnNyUmF0
268
+ ZT48bnMyOkFpclJhdGU+MDwvbnMyOkFpclJhdGU+PG5zMjpSYXRlPjA8L25z
269
+ MjpSYXRlPjwvbnMyOkZpbmFuY2VQYXJhbWV0ZXJzPjxuczI6SXRlbVBhcmFt
270
+ ZXRlcnM+PG5zMjpCYXJjb2RlPlJEMDI1NTAwODA3U0U8L25zMjpCYXJjb2Rl
271
+ PjxuczI6VmFsaWRSdVR5cGU+ZmFsc2U8L25zMjpWYWxpZFJ1VHlwZT48bnMy
272
+ OlZhbGlkRW5UeXBlPnRydWU8L25zMjpWYWxpZEVuVHlwZT48bnMyOkNvbXBs
273
+ ZXhJdGVtTmFtZT7QnNC10LvQutC40Lkg0L/QsNC60LXRgiDQt9Cw0LrQsNC3
274
+ 0L3QvtC5PC9uczI6Q29tcGxleEl0ZW1OYW1lPjxuczI6UG9zdE1hcms+PG5z
275
+ MjpJZD4wPC9uczI6SWQ+PG5zMjpOYW1lPtCR0LXQtyDQvtGC0LzQtdGC0LrQ
276
+ uDwvbnMyOk5hbWU+PC9uczI6UG9zdE1hcms+PG5zMjpNYWlsVHlwZT48bnMy
277
+ OklkPjU8L25zMjpJZD48bnMyOk5hbWU+0JzQtdC70LrQuNC5INC/0LDQutC1
278
+ 0YI8L25zMjpOYW1lPjwvbnMyOk1haWxUeXBlPjxuczI6TWFpbEN0Zz48bnMy
279
+ OklkPjE8L25zMjpJZD48bnMyOk5hbWU+0JfQsNC60LDQt9C90L7QtTwvbnMy
280
+ Ok5hbWU+PC9uczI6TWFpbEN0Zz48bnMyOk1hc3M+MDwvbnMyOk1hc3M+PG5z
281
+ MjpNYXhNYXNzUlU+MjAwMDwvbnMyOk1heE1hc3NSVT48bnMyOk1heE1hc3NF
282
+ Tj4yMDAwPC9uczI6TWF4TWFzc0VOPjwvbnMyOkl0ZW1QYXJhbWV0ZXJzPjxu
283
+ czI6T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOk9wZXJUeXBlPjxuczI6SWQ+
284
+ ODwvbnMyOklkPjxuczI6TmFtZT7QntCx0YDQsNCx0L7RgtC60LA8L25zMjpO
285
+ YW1lPjwvbnMyOk9wZXJUeXBlPjxuczI6T3BlckF0dHI+PG5zMjpJZD40PC9u
286
+ czI6SWQ+PG5zMjpOYW1lPtCf0L7QutC40L3Rg9C70L4g0YHQvtGA0YLQuNGA
287
+ 0L7QstC+0YfQvdGL0Lkg0YbQtdC90YLRgDwvbnMyOk5hbWU+PC9uczI6T3Bl
288
+ ckF0dHI+PG5zMjpPcGVyRGF0ZT4yMDEzLTA0LTA1VDAwOjAwOjAwLjAwMCsw
289
+ NDowMDwvbnMyOk9wZXJEYXRlPjwvbnMyOk9wZXJhdGlvblBhcmFtZXRlcnM+
290
+ PG5zMjpVc2VyUGFyYW1ldGVycy8+PC9uczI6aGlzdG9yeVJlY29yZD48bnMy
291
+ Omhpc3RvcnlSZWNvcmQ+PG5zMjpBZGRyZXNzUGFyYW1ldGVycz48bnMyOk9w
292
+ ZXJhdGlvbkFkZHJlc3M+PG5zMjpJbmRleD4xMjc1NzY8L25zMjpJbmRleD48
293
+ bnMyOkRlc2NyaXB0aW9uPtCc0L7RgdC60LLQsCA1NzY8L25zMjpEZXNjcmlw
294
+ dGlvbj48L25zMjpPcGVyYXRpb25BZGRyZXNzPjxuczI6Q291bnRyeU9wZXI+
295
+ PG5zMjpJZD42NDM8L25zMjpJZD48L25zMjpDb3VudHJ5T3Blcj48L25zMjpB
296
+ ZGRyZXNzUGFyYW1ldGVycz48bnMyOkZpbmFuY2VQYXJhbWV0ZXJzPjxuczI6
297
+ UGF5bWVudD4wPC9uczI6UGF5bWVudD48bnMyOlZhbHVlPjA8L25zMjpWYWx1
298
+ ZT48bnMyOk1hc3NSYXRlPjA8L25zMjpNYXNzUmF0ZT48bnMyOkluc3JSYXRl
299
+ PjA8L25zMjpJbnNyUmF0ZT48bnMyOkFpclJhdGU+MDwvbnMyOkFpclJhdGU+
300
+ PG5zMjpSYXRlPjA8L25zMjpSYXRlPjwvbnMyOkZpbmFuY2VQYXJhbWV0ZXJz
301
+ PjxuczI6SXRlbVBhcmFtZXRlcnM+PG5zMjpCYXJjb2RlPlJEMDI1NTAwODA3
302
+ U0U8L25zMjpCYXJjb2RlPjxuczI6VmFsaWRSdVR5cGU+ZmFsc2U8L25zMjpW
303
+ YWxpZFJ1VHlwZT48bnMyOlZhbGlkRW5UeXBlPnRydWU8L25zMjpWYWxpZEVu
304
+ VHlwZT48bnMyOkNvbXBsZXhJdGVtTmFtZT7QnNC10LvQutC40Lkg0L/QsNC6
305
+ 0LXRgiDQt9Cw0LrQsNC30L3QvtC5PC9uczI6Q29tcGxleEl0ZW1OYW1lPjxu
306
+ czI6UG9zdE1hcms+PG5zMjpJZD4wPC9uczI6SWQ+PG5zMjpOYW1lPtCR0LXQ
307
+ tyDQvtGC0LzQtdGC0LrQuDwvbnMyOk5hbWU+PC9uczI6UG9zdE1hcms+PG5z
308
+ MjpNYWlsVHlwZT48bnMyOklkPjU8L25zMjpJZD48bnMyOk5hbWU+0JzQtdC7
309
+ 0LrQuNC5INC/0LDQutC10YI8L25zMjpOYW1lPjwvbnMyOk1haWxUeXBlPjxu
310
+ czI6TWFpbEN0Zz48bnMyOklkPjE8L25zMjpJZD48bnMyOk5hbWU+0JfQsNC6
311
+ 0LDQt9C90L7QtTwvbnMyOk5hbWU+PC9uczI6TWFpbEN0Zz48bnMyOk1hc3M+
312
+ MDwvbnMyOk1hc3M+PG5zMjpNYXhNYXNzUlU+MjAwMDwvbnMyOk1heE1hc3NS
313
+ VT48bnMyOk1heE1hc3NFTj4yMDAwPC9uczI6TWF4TWFzc0VOPjwvbnMyOkl0
314
+ ZW1QYXJhbWV0ZXJzPjxuczI6T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOk9w
315
+ ZXJUeXBlPjxuczI6SWQ+ODwvbnMyOklkPjxuczI6TmFtZT7QntCx0YDQsNCx
316
+ 0L7RgtC60LA8L25zMjpOYW1lPjwvbnMyOk9wZXJUeXBlPjxuczI6T3BlckF0
317
+ dHI+PG5zMjpJZD4yPC9uczI6SWQ+PG5zMjpOYW1lPtCf0YDQuNCx0YvQu9C+
318
+ INCyINC80LXRgdGC0L4g0LLRgNGD0YfQtdC90LjRjzwvbnMyOk5hbWU+PC9u
319
+ czI6T3BlckF0dHI+PG5zMjpPcGVyRGF0ZT4yMDEzLTA0LTA2VDEwOjU0OjAw
320
+ LjAwMCswNDowMDwvbnMyOk9wZXJEYXRlPjwvbnMyOk9wZXJhdGlvblBhcmFt
321
+ ZXRlcnM+PG5zMjpVc2VyUGFyYW1ldGVycy8+PC9uczI6aGlzdG9yeVJlY29y
322
+ ZD48bnMyOmhpc3RvcnlSZWNvcmQ+PG5zMjpBZGRyZXNzUGFyYW1ldGVycz48
323
+ bnMyOk9wZXJhdGlvbkFkZHJlc3M+PG5zMjpJbmRleD4xMjc1NzY8L25zMjpJ
324
+ bmRleD48bnMyOkRlc2NyaXB0aW9uPtCc0L7RgdC60LLQsCA1NzY8L25zMjpE
325
+ ZXNjcmlwdGlvbj48L25zMjpPcGVyYXRpb25BZGRyZXNzPjxuczI6TWFpbERp
326
+ cmVjdD48bnMyOklkPjY0MzwvbnMyOklkPjxuczI6TmFtZVJVPtCg0L7RgdGB
327
+ 0LjQudGB0LrQsNGPINCk0LXQtNC10YDQsNGG0LjRjzwvbnMyOk5hbWVSVT48
328
+ L25zMjpNYWlsRGlyZWN0PjxuczI6Q291bnRyeUZyb20+PG5zMjpJZD43NTI8
329
+ L25zMjpJZD48bnMyOk5hbWVSVT7QqNCy0LXRhtC40Y88L25zMjpOYW1lUlU+
330
+ PC9uczI6Q291bnRyeUZyb20+PG5zMjpDb3VudHJ5T3Blcj48bnMyOklkPjY0
331
+ MzwvbnMyOklkPjwvbnMyOkNvdW50cnlPcGVyPjwvbnMyOkFkZHJlc3NQYXJh
332
+ bWV0ZXJzPjxuczI6RmluYW5jZVBhcmFtZXRlcnM+PG5zMjpQYXltZW50PjA8
333
+ L25zMjpQYXltZW50PjxuczI6VmFsdWU+MDwvbnMyOlZhbHVlPjxuczI6TWFz
334
+ c1JhdGU+MDwvbnMyOk1hc3NSYXRlPjxuczI6SW5zclJhdGU+MDwvbnMyOklu
335
+ c3JSYXRlPjxuczI6QWlyUmF0ZT4wPC9uczI6QWlyUmF0ZT48bnMyOlJhdGU+
336
+ MDwvbnMyOlJhdGU+PC9uczI6RmluYW5jZVBhcmFtZXRlcnM+PG5zMjpJdGVt
337
+ UGFyYW1ldGVycz48bnMyOkJhcmNvZGU+UkQwMjU1MDA4MDdTRTwvbnMyOkJh
338
+ cmNvZGU+PG5zMjpWYWxpZFJ1VHlwZT5mYWxzZTwvbnMyOlZhbGlkUnVUeXBl
339
+ PjxuczI6VmFsaWRFblR5cGU+dHJ1ZTwvbnMyOlZhbGlkRW5UeXBlPjxuczI6
340
+ Q29tcGxleEl0ZW1OYW1lPtCc0LXQu9C60LjQuSDQv9Cw0LrQtdGCINC30LDQ
341
+ utCw0LfQvdC+0Lk8L25zMjpDb21wbGV4SXRlbU5hbWU+PG5zMjpNYWlsUmFu
342
+ az48bnMyOklkPjA8L25zMjpJZD48bnMyOk5hbWU+0JHQtdC3INGA0LDQt9GA
343
+ 0Y/QtNCwPC9uczI6TmFtZT48L25zMjpNYWlsUmFuaz48bnMyOlBvc3RNYXJr
344
+ PjxuczI6SWQ+MDwvbnMyOklkPjxuczI6TmFtZT7QkdC10Lcg0L7RgtC80LXR
345
+ gtC60Lg8L25zMjpOYW1lPjwvbnMyOlBvc3RNYXJrPjxuczI6TWFpbFR5cGU+
346
+ PG5zMjpJZD41PC9uczI6SWQ+PG5zMjpOYW1lPtCc0LXQu9C60LjQuSDQv9Cw
347
+ 0LrQtdGCPC9uczI6TmFtZT48L25zMjpNYWlsVHlwZT48bnMyOk1haWxDdGc+
348
+ PG5zMjpJZD4xPC9uczI6SWQ+PG5zMjpOYW1lPtCX0LDQutCw0LfQvdC+0LU8
349
+ L25zMjpOYW1lPjwvbnMyOk1haWxDdGc+PG5zMjpNYXNzPjI4MTwvbnMyOk1h
350
+ c3M+PG5zMjpNYXhNYXNzUlU+MjAwMDwvbnMyOk1heE1hc3NSVT48bnMyOk1h
351
+ eE1hc3NFTj4yMDAwPC9uczI6TWF4TWFzc0VOPjwvbnMyOkl0ZW1QYXJhbWV0
352
+ ZXJzPjxuczI6T3BlcmF0aW9uUGFyYW1ldGVycz48bnMyOk9wZXJUeXBlPjxu
353
+ czI6SWQ+MjwvbnMyOklkPjxuczI6TmFtZT7QktGA0YPRh9C10L3QuNC1PC9u
354
+ czI6TmFtZT48L25zMjpPcGVyVHlwZT48bnMyOk9wZXJBdHRyPjxuczI6SWQ+
355
+ MTwvbnMyOklkPjxuczI6TmFtZT7QktGA0YPRh9C10L3QuNC1INCw0LTRgNC1
356
+ 0YHQsNGC0YM8L25zMjpOYW1lPjwvbnMyOk9wZXJBdHRyPjxuczI6T3BlckRh
357
+ dGU+MjAxMy0wNC0wOFQwMDowMDowMC4wMDArMDQ6MDA8L25zMjpPcGVyRGF0
358
+ ZT48L25zMjpPcGVyYXRpb25QYXJhbWV0ZXJzPjxuczI6VXNlclBhcmFtZXRl
359
+ cnM+PG5zMjpTZW5kQ3RnPjxuczI6SWQ+MTwvbnMyOklkPjxuczI6TmFtZT7Q
360
+ ndCw0YHQtdC70LXQvdC40LU8L25zMjpOYW1lPjwvbnMyOlNlbmRDdGc+PC9u
361
+ czI6VXNlclBhcmFtZXRlcnM+PC9uczI6aGlzdG9yeVJlY29yZD48L25zMjpP
362
+ cGVyYXRpb25IaXN0b3J5RGF0YT48L1M6Qm9keT48L1M6RW52ZWxvcGU+
363
+ http_version:
364
+ recorded_at: Sat, 20 Apr 2013 22:02:50 GMT
365
+ recorded_with: VCR 2.4.0
@@ -0,0 +1,23 @@
1
+ require "test_helper"
2
+ require "russianpost/client"
3
+
4
+ class TestClient < Minitest::Unit::TestCase
5
+ def setup
6
+ @client = RussianPost::Client.new
7
+ end
8
+
9
+ def test_returns_array_of_hashes
10
+ VCR.use_cassette("valid_barcode") do
11
+ response = @client.call(barcode: "RD025500807SE")
12
+ assert_kind_of Array, response
13
+ assert_kind_of Hash, response[0]
14
+ end
15
+ end
16
+
17
+ def test_returns_nil_on_nonexistent_parcel
18
+ VCR.use_cassette("nonexistent_parcel") do
19
+ response = @client.call(barcode: "RR123456789EE")
20
+ assert_nil response
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ require "test_helper"
2
+ require "russianpost/parcel"
3
+
4
+ class ParcelTest < MiniTest::Unit::TestCase
5
+ def test_returns_array_of_operations
6
+ VCR.use_cassette :valid_barcode do
7
+ parcel = RussianPost::Parcel.new("RD025500807SE")
8
+ assert_kind_of Array, parcel.operations
9
+ assert_kind_of RussianPost::Operation, parcel.operations[0]
10
+ end
11
+ end
12
+
13
+ def test_returns_empty_array_on_nonexistent_parcel
14
+ VCR.use_cassette("nonexistent_parcel") do
15
+ parcel = RussianPost::Parcel.new("RR123456789EE")
16
+ assert_kind_of Array, parcel.operations
17
+ assert parcel.operations.empty?
18
+ end
19
+ end
20
+
21
+ def test_raises_error_on_invalid_barcode
22
+ assert_raises RussianPost::InvalidBarcode do
23
+ RussianPost::Parcel.new("123")
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,8 @@
1
+ require "minitest/autorun"
2
+ require "vcr"
3
+
4
+ VCR.configure do |c|
5
+ c.cassette_library_dir = 'test/fixtures/vcr_cassettes'
6
+ c.hook_into :webmock # or :fakeweb
7
+ # c.allow_http_connections_when_no_cassette = true
8
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: russianpost
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artem Shitov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-04-17 00:00:00.000000000 Z
11
+ date: 2013-04-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,6 +73,11 @@ files:
73
73
  - lib/russianpost/parcel.rb
74
74
  - lib/russianpost/version.rb
75
75
  - russianpost.gemspec
76
+ - test/fixtures/vcr_cassettes/nonexistent_parcel.yml
77
+ - test/fixtures/vcr_cassettes/valid_barcode.yml
78
+ - test/russianpost/client_test.rb
79
+ - test/russianpost/parcel_test.rb
80
+ - test/test_helper.rb
76
81
  homepage: https://github.com/artemshitov/russianpost
77
82
  licenses:
78
83
  - MIT
@@ -97,4 +102,9 @@ rubygems_version: 2.0.0
97
102
  signing_key:
98
103
  specification_version: 4
99
104
  summary: Russian Post package tracking API client
100
- test_files: []
105
+ test_files:
106
+ - test/fixtures/vcr_cassettes/nonexistent_parcel.yml
107
+ - test/fixtures/vcr_cassettes/valid_barcode.yml
108
+ - test/russianpost/client_test.rb
109
+ - test/russianpost/parcel_test.rb
110
+ - test/test_helper.rb