relaton 1.8.1 → 1.9.3

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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +1 -11
  3. data/.rubocop.yml +1 -1
  4. data/docs/README.adoc +6 -5
  5. data/lib/relaton/db.rb +36 -3
  6. data/lib/relaton/processor.rb +13 -2
  7. data/lib/relaton/registry.rb +11 -0
  8. data/lib/relaton/version.rb +1 -1
  9. data/relaton.gemspec +22 -23
  10. data/spec/relaton/db_spec.rb +4 -2
  11. data/spec/relaton/processor_spec.rb +4 -0
  12. data/spec/relaton/{regirtry_spec.rb → registry_spec.rb} +6 -0
  13. data/spec/relaton_spec.rb +19 -12
  14. data/spec/vcr_cassetes/api_relaton_org.yml +57 -0
  15. data/spec/vcr_cassetes/api_relaton_org_unavailable.yml +198 -0
  16. data/spec/vcr_cassetes/async_fetch.yml +1658 -1502
  17. data/spec/vcr_cassetes/bsi_bs_en_iso_8848.yml +113 -114
  18. data/spec/vcr_cassetes/cc_dir_10005_2019.yml +12 -12
  19. data/spec/vcr_cassetes/cen_en_10160_1999.yml +41 -41
  20. data/spec/vcr_cassetes/cie_001_1980.yml +8 -8
  21. data/spec/vcr_cassetes/ecma_6.yml +8 -8
  22. data/spec/vcr_cassetes/fisp_140.yml +6 -59
  23. data/spec/vcr_cassetes/gb_t_20223_2006.yml +6 -6
  24. data/spec/vcr_cassetes/iec_60050_102_2007.yml +28 -28
  25. data/spec/vcr_cassetes/iec_combined_included.yml +164 -100
  26. data/spec/vcr_cassetes/ieee_528_2019.yml +38 -38
  27. data/spec/vcr_cassetes/iho_b_11.yml +8 -8
  28. data/spec/vcr_cassetes/iso_111111119115_1.yml +45 -26
  29. data/spec/vcr_cassetes/iso_19115_1.yml +57 -41
  30. data/spec/vcr_cassetes/iso_19115_1_2.yml +113 -81
  31. data/spec/vcr_cassetes/iso_19115_all_parts.yml +198 -0
  32. data/spec/vcr_cassetes/iso_19133_2005.yml +198 -0
  33. data/spec/vcr_cassetes/iso_cd_14093.yml +202 -0
  34. data/spec/vcr_cassetes/iso_combined_applied.yml +113 -81
  35. data/spec/vcr_cassetes/iso_combined_included.yml +114 -82
  36. data/spec/vcr_cassetes/itu_combined_included.yml +315 -199
  37. data/spec/vcr_cassetes/ogc_19_025r1.yml +14 -13105
  38. data/spec/vcr_cassetes/omg_ami4ccm_1_0.yml +4 -4
  39. data/spec/vcr_cassetes/rfc_8341.yml +8 -8
  40. data/spec/vcr_cassetes/sp_800_38b.yml +6 -59
  41. data/spec/vcr_cassetes/un_rtade_cefact_2004_32.yml +34 -34
  42. data/spec/vcr_cassetes/w3c_json_ld11.yml +12 -12
  43. metadata +83 -56
  44. data/spec/vcr_cassetes/19133_2005.yml +0 -182
  45. data/spec/vcr_cassetes/hist_cmbined_included.yml +0 -105
  46. data/spec/vcr_cassetes/iso_19115.yml +0 -182
  47. data/spec/vcr_cassetes/iso_awi_14093.yml +0 -182
  48. data/spec/vcr_cassetes/iso_iec_guide_2.yml +0 -232
  49. data/spec/vcr_cassetes/rfc_unsuccess.yml +0 -70
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 910d5cfba1e4dfc56255a635d7d3c2169b2e3597b519c2f680a1a0be35686551
4
- data.tar.gz: 8f3950346e378dca736504e3b90f82949f75dc678b7fc63f1b8cfd9de9c42339
3
+ metadata.gz: a3599c52bacdd454603dc095055338b4a89b8264ee9391fa2a2b25f1724a46e2
4
+ data.tar.gz: aa64435911173af46c12a522b05d063c4cfa0644f1919c96ec3879f9b8f9af39
5
5
  SHA512:
6
- metadata.gz: ad94b90beaaffd6df9a0635e8b25df571187235dea448386f6d2e2829582ace5902aa1f379211687124d95b805f31854dbcc0a0c19927eb2bf0050bbaf9e75c9
7
- data.tar.gz: fa687c31ab34f8843b84463a55f042b957f1394b6e8b5675d92719fcd3e7fe010a8f2bd0c44348fd387314cdf0bc6792e3d153552fec9b713fb5996550d99563
6
+ metadata.gz: 74fc610b35697515cf2f925349ff9ad076c50a3ec8e0fa08a9cbfa3fc82217c32b2f5e2869af604a58e12f70898de41addade73971a6fae9085b56eb7b3b5ff0
7
+ data.tar.gz: 8cda3116f9e84eb3f549dc1a4c5a74fb6957d4834d0cf140f587434f2b9ff84e7cae93946147b7151fa6cf1739f13aba1639f92c2f73fce552999e3a7dfe35fd
@@ -16,19 +16,9 @@ jobs:
16
16
  strategy:
17
17
  fail-fast: false
18
18
  matrix:
19
- ruby: [ '2.7', '2.6', '2.5', '2.4' ]
19
+ ruby: [ '3.0', '2.7', '2.6', '2.5' ]
20
20
  os: [ ubuntu-latest, windows-latest, macos-latest ]
21
21
  experimental: [ false ]
22
- include:
23
- - ruby: '3.0'
24
- os: 'ubuntu-latest'
25
- experimental: true
26
- - ruby: '3.0'
27
- os: 'windows-latest'
28
- experimental: true
29
- - ruby: '3.0'
30
- os: 'macos-latest'
31
- experimental: true
32
22
  steps:
33
23
  - uses: actions/checkout@v2
34
24
  with:
data/.rubocop.yml CHANGED
@@ -5,6 +5,6 @@
5
5
  inherit_from:
6
6
  - https://raw.githubusercontent.com/riboseinc/oss-guides/master/ci/rubocop.yml
7
7
  AllCops:
8
- TargetRubyVersion: 2.4
8
+ TargetRubyVersion: 2.5
9
9
  Rails:
10
10
  Enabled: false
data/docs/README.adoc CHANGED
@@ -182,20 +182,21 @@ x = db.fetch_db("ISO 5749")
182
182
  # prepare queue for results
183
183
  results = Queue.new
184
184
 
185
- # references ot fetch
185
+ # references to fetch
186
186
  refs = ["ISO 19011", "ISO 19115"]
187
187
 
188
188
  # fetch documents
189
189
  refs.each do |ref|
190
190
  db.fetch_async(ref) do |doc|
191
- results << [ref, doc]
191
+ results << [doc, ref]
192
192
  end
193
193
  end
194
194
 
195
- # wait until documets fetching
195
+ # wait until all the documents fetching
196
196
  refs.size.times do
197
- ref, doc = results.pop
198
- # do thatever you need with result x
197
+ doc, ref = results.pop
198
+ # do whatever you need with the result
199
+ # in case request error doc will be instance of Relaton::RequestError
199
200
  end
200
201
  ----
201
202
 
data/lib/relaton/db.rb CHANGED
@@ -99,16 +99,20 @@ module Relaton
99
99
  end
100
100
 
101
101
  # Fetch asynchronously
102
- def fetch_async(code, year = nil, opts = {}, &_block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
102
+ def fetch_async(code, year = nil, opts = {}, &block) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
103
103
  stdclass = standard_class code
104
104
  if stdclass
105
105
  unless @queues[stdclass]
106
106
  processor = @registry.processors[stdclass]
107
- wp = WorkersPool.new(processor.threads) { |args| yield fetch *args }
107
+ wp = WorkersPool.new(processor.threads) do |args|
108
+ args[3].call fetch(*args[0..2])
109
+ rescue RelatonBib::RequestError => e
110
+ args[3].call e
111
+ end
108
112
  @queues[stdclass] = { queue: Queue.new, workers_pool: wp }
109
113
  Thread.new { process_queue @queues[stdclass] }
110
114
  end
111
- @queues[stdclass][:queue] << [code, year, opts]
115
+ @queues[stdclass][:queue] << [code, year, opts, block]
112
116
  else yield nil
113
117
  end
114
118
  end
@@ -469,5 +473,34 @@ module Relaton
469
473
  def process_queue(qwp)
470
474
  while args = qwp[:queue].pop; qwp[:workers_pool] << args end
471
475
  end
476
+
477
+ class << self
478
+ # Initialse and return relaton instance, with local and global cache names
479
+ # local_cache: local cache name; none created if nil; "relaton" created
480
+ # if empty global_cache: boolean to create global_cache
481
+ # flush_caches: flush caches
482
+ def init_bib_caches(**opts) # rubocop:disable Metrics/CyclomaticComplexity
483
+ globalname = global_bibliocache_name if opts[:global_cache]
484
+ localname = local_bibliocache_name(opts[:local_cache])
485
+ flush_caches globalname, localname if opts[:flush_caches]
486
+ Relaton::Db.new(globalname, localname)
487
+ end
488
+
489
+ private
490
+
491
+ def flush_caches(gcache, lcache)
492
+ FileUtils.rm_rf gcache unless gcache.nil?
493
+ FileUtils.rm_rf lcache unless lcache.nil?
494
+ end
495
+
496
+ def global_bibliocache_name
497
+ "#{Dir.home}/.relaton/cache"
498
+ end
499
+
500
+ def local_bibliocache_name(cachename)
501
+ cachename = "relaton" if cachename.nil? || cachename.empty?
502
+ "#{cachename}/cache"
503
+ end
504
+ end
472
505
  end
473
506
  end
@@ -1,9 +1,16 @@
1
1
  module Relaton
2
2
  class Processor
3
+ # @rerurn [Symbol]
3
4
  attr_reader :short
4
- attr_reader :prefix
5
+
6
+ # @return [String]
7
+ attr_reader :prefix, :idtype
8
+
9
+ # @return [Regexp]
5
10
  attr_reader :defaultprefix
6
- attr_reader :idtype
11
+
12
+ # @return [Array<String>]
13
+ attr_reader :datasets
7
14
 
8
15
  def initialize
9
16
  raise "This is an abstract class!"
@@ -13,6 +20,10 @@ module Relaton
13
20
  raise "This is an abstract class!"
14
21
  end
15
22
 
23
+ def fetch_data(_source, _opts)
24
+ raise "This is an abstract class!"
25
+ end
26
+
16
27
  def from_xml(_xml)
17
28
  raise "This is an abstract class!"
18
29
  end
@@ -54,6 +54,17 @@ module Relaton
54
54
  processors.keys
55
55
  end
56
56
 
57
+ #
58
+ # Search a rpocessos by dataset name
59
+ #
60
+ # @param [String] dataset
61
+ #
62
+ # @return [Relaton::Processor, nil]
63
+ #
64
+ def find_processor_by_dataset(dataset)
65
+ processors.values.detect { |p| p.datasets&.include? dataset }
66
+ end
67
+
57
68
  #
58
69
  # Find processor by type
59
70
  #
@@ -1,3 +1,3 @@
1
1
  module Relaton
2
- VERSION = "1.8.1".freeze
2
+ VERSION = "1.9.3".freeze
3
3
  end
data/relaton.gemspec CHANGED
@@ -27,38 +27,37 @@ Gem::Specification.new do |spec|
27
27
  spec.require_paths = ["lib"]
28
28
  spec.files = `git ls-files`.split("\n")
29
29
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
30
- spec.required_ruby_version = Gem::Requirement.new(">= 2.4.0")
30
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
31
31
 
32
- # spec.add_dependency "algoliasearch"
33
- spec.add_dependency "relaton-bipm", "~> 1.8.0"
34
- spec.add_dependency "relaton-bsi", "~> 1.8.0"
35
- spec.add_dependency "relaton-calconnect", "~> 1.8.0"
36
- spec.add_dependency "relaton-cen", "~> 1.8.pre1"
37
- spec.add_dependency "relaton-cie", "~> 1.8.0"
38
- spec.add_dependency "relaton-ecma", "~> 1.8.0"
39
- spec.add_dependency "relaton-gb", "~> 1.8.0"
40
- spec.add_dependency "relaton-iec", ">= 1.8.0"
41
- spec.add_dependency "relaton-ieee", "~> 1.8.0"
42
- spec.add_dependency "relaton-ietf", "~> 1.8.0"
43
- spec.add_dependency "relaton-iho", "~> 1.8.0"
44
- spec.add_dependency "relaton-iso", ">= 1.8.0"
45
- spec.add_dependency "relaton-itu", ">= 1.8.0"
46
- spec.add_dependency "relaton-nist", ">= 1.8.0"
47
- spec.add_dependency "relaton-ogc", "~> 1.8.0"
48
- spec.add_dependency "relaton-omg", "~> 1.8.0"
49
- spec.add_dependency "relaton-un", "~> 1.8.0"
50
- spec.add_dependency "relaton-w3c", "~> 1.8.0"
32
+ spec.add_dependency "relaton-bipm", "~> 1.9.0"
33
+ spec.add_dependency "relaton-bsi", "~> 1.9.0"
34
+ spec.add_dependency "relaton-calconnect", "~> 1.9.0"
35
+ spec.add_dependency "relaton-cen", "~> 1.9.0"
36
+ spec.add_dependency "relaton-cie", "~> 1.9.0"
37
+ spec.add_dependency "relaton-ecma", "~> 1.9.0"
38
+ spec.add_dependency "relaton-gb", "~> 1.9.0"
39
+ spec.add_dependency "relaton-iec", "~> 1.9.0"
40
+ spec.add_dependency "relaton-ieee", "~> 1.9.0"
41
+ spec.add_dependency "relaton-ietf", "~> 1.9.0"
42
+ spec.add_dependency "relaton-iho", "~> 1.9.0"
43
+ spec.add_dependency "relaton-iso", "~> 1.9.0"
44
+ spec.add_dependency "relaton-itu", "~> 1.9.0"
45
+ spec.add_dependency "relaton-nist", ">= 1.9.2"
46
+ spec.add_dependency "relaton-ogc", "~> 1.9.0"
47
+ spec.add_dependency "relaton-omg", "~> 1.9.0"
48
+ spec.add_dependency "relaton-un", "~> 1.9.0"
49
+ spec.add_dependency "relaton-w3c", "~> 1.9.0"
51
50
 
52
51
  spec.add_development_dependency "byebug", "~> 11.0"
53
- # spec.add_development_dependency "debase"
54
52
  spec.add_development_dependency "equivalent-xml", "~> 0.6"
55
53
  spec.add_development_dependency "guard", "~> 2.14"
56
54
  spec.add_development_dependency "guard-rspec", "~> 4.7"
57
55
  spec.add_development_dependency "pry-byebug", "~> 3.9.0"
58
56
  spec.add_development_dependency "rake", "~> 13.0"
59
57
  spec.add_development_dependency "rspec", "~> 3.6"
60
- spec.add_development_dependency "rubocop", "= 0.54.0"
61
- # spec.add_development_dependency "ruby-debug-ide"
58
+ spec.add_development_dependency "rubocop", "~> 1.17.0"
59
+ spec.add_development_dependency "rubocop-performance", "~> 1.11.0"
60
+ spec.add_development_dependency "rubocop-rails", "~> 2.10.0"
62
61
  spec.add_development_dependency "simplecov", "~> 0.15"
63
62
  spec.add_development_dependency "timecop", "~> 0.9"
64
63
  spec.add_development_dependency "vcr", "~> 5"
@@ -163,14 +163,16 @@ RSpec.describe Relaton::Db do
163
163
  results = []
164
164
  VCR.use_cassette "async_fetch", match_requests_on: %i[method uri body] do
165
165
  refs.each do |ref|
166
- db.fetch_async(ref) { |r| queue << r }
166
+ db.fetch_async(ref) do |r|
167
+ queue << [r, ref]
168
+ end
167
169
  end
168
170
  Timeout.timeout(60) do
169
171
  refs.size.times { results << queue.pop }
170
172
  end
171
173
  end
172
174
  results.each do |result|
173
- expect(result).to be_instance_of RelatonItu::ItuBibliographicItem
175
+ expect(result[0]).to be_instance_of RelatonItu::ItuBibliographicItem
174
176
  end
175
177
  end
176
178
 
@@ -16,6 +16,10 @@ RSpec.describe Relaton::Processor do
16
16
  expect { subject.get "code", nil, {} }.to raise_error StandardError
17
17
  end
18
18
 
19
+ it "fetch_data method should be implemented" do
20
+ expect { subject.fetch_data "cource", {} }.to raise_error StandardError
21
+ end
22
+
19
23
  it "from_xml method should be implemented" do
20
24
  expect { subject.from_xml "" }.to raise_error StandardError
21
25
  end
@@ -88,4 +88,10 @@ RSpec.describe Relaton::Registry do
88
88
  expect(Relaton::Registry.instance.by_type("CEN")).to be_instance_of RelatonCen::Processor
89
89
  end
90
90
  end
91
+
92
+ it "find processot by dataset" do
93
+ expect(Relaton::Registry.instance
94
+ .find_processor_by_dataset("nist-tech-pubs"))
95
+ .to be_instance_of RelatonNist::Processor
96
+ end
91
97
  end
data/spec/relaton_spec.rb CHANGED
@@ -15,15 +15,15 @@ RSpec.describe Relaton::Db do
15
15
  VCR.use_cassette "iso_19115_1" do
16
16
  bib = @db.fetch("ISO 19115-1", nil, {})
17
17
  expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
18
- expect(bib.to_xml(bibdata: true)).to include "<project-number>"\
18
+ expect(bib.to_xml(bibdata: true)).to include "<project-number part=\"1\">"\
19
19
  "ISO 19115</project-number>"
20
20
  expect(File.exist?("testcache")).to be true
21
21
  expect(File.exist?("testcache2")).to be true
22
22
  testcache = Relaton::DbCache.new "testcache"
23
- expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>"\
23
+ expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number part=\"1\">"\
24
24
  "ISO 19115</project-number>"
25
25
  testcache = Relaton::DbCache.new "testcache2"
26
- expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number>"\
26
+ expect(testcache["ISO(ISO 19115-1)"]).to include "<project-number part=\"1\">"\
27
27
  "ISO 19115</project-number>"
28
28
  end
29
29
  bib = @db.fetch("ISO 19115-1", nil, {})
@@ -31,7 +31,7 @@ RSpec.describe Relaton::Db do
31
31
  end
32
32
 
33
33
  it "with year in code" do
34
- VCR.use_cassette "19133_2005" do
34
+ VCR.use_cassette "iso_19133_2005" do
35
35
  bib = @db.fetch("ISO 19133:2005")
36
36
  expect(bib).to be_instance_of RelatonIsoBib::IsoBibliographicItem
37
37
  expect(bib.to_xml).to include '<bibitem id="ISO19133-2005" '\
@@ -45,24 +45,24 @@ RSpec.describe Relaton::Db do
45
45
 
46
46
  context "all parts" do
47
47
  it "implicity" do
48
- VCR.use_cassette "iso_19115" do
49
- bib = @db.fetch("ISO 19115", nil, {})
48
+ VCR.use_cassette "iso_19115_all_parts" do
49
+ bib = @db.fetch("ISO 19115", nil, all_parts: true)
50
50
  expect(bib.docidentifier[0].id).to eq "ISO 19115 (all parts)"
51
51
  end
52
52
  end
53
53
 
54
54
  it "explicity" do
55
- VCR.use_cassette "iso_19115" do
56
- bib = @db.fetch("ISO 19115 (all parts)", nil, {})
55
+ VCR.use_cassette "iso_19115_all_parts" do
56
+ bib = @db.fetch("ISO 19115 (all parts)")
57
57
  expect(bib.docidentifier[0].id).to eq "ISO 19115 (all parts)"
58
58
  end
59
59
  end
60
60
  end
61
61
 
62
- it "gets sn ISO/AWI reference" do
63
- VCR.use_cassette "iso_awi_14093" do
64
- bib = @db.fetch "ISO/AWI 14093"
65
- expect(bib).not_to be_nil
62
+ it "gets sn ISO/CD reference" do
63
+ VCR.use_cassette "iso_cd_14093" do
64
+ bib = @db.fetch "ISO/CD 14093"
65
+ expect(bib.docidentifier[0].id).to eq "ISO/CD 14093"
66
66
  end
67
67
  end
68
68
  end
@@ -204,6 +204,13 @@ RSpec.describe Relaton::Db do
204
204
  end
205
205
 
206
206
  it "get OGC refrence and cache it" do
207
+ cc_fr = /\.relaton\/ogc\/bibliography\.json/
208
+ allow(File).to receive(:exist?).with(cc_fr).and_return false
209
+ allow(File).to receive(:exist?).with(/etag\.txt/).and_return false
210
+ expect(File).to receive(:exist?).and_call_original.at_least :once
211
+ expect(File).to receive(:write).with(cc_fr, kind_of(String), kind_of(Hash))
212
+ .at_most :once
213
+ allow(File).to receive(:write).and_call_original
207
214
  VCR.use_cassette "ogc_19_025r1" do
208
215
  bib = @db.fetch "OGC 19-025r1", nil, {}
209
216
  expect(bib).to be_instance_of RelatonOgc::OgcBibliographicItem
@@ -0,0 +1,57 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.relaton.org/api/v1/document?code=ISO%2019115-2&year=2019
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Host:
17
+ - api.relaton.org
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Content-Type:
24
+ - text/xml
25
+ Content-Length:
26
+ - '2963'
27
+ Connection:
28
+ - keep-alive
29
+ Date:
30
+ - Mon, 23 Aug 2021 12:02:12 GMT
31
+ X-Amzn-Requestid:
32
+ - '098ad305-defa-47c8-ab52-48343ab03fa8'
33
+ Access-Control-Allow-Origin:
34
+ - "*"
35
+ Access-Control-Allow-Headers:
36
+ - Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
37
+ X-Amz-Apigw-Id:
38
+ - EhMocHeAoAMFtlg=
39
+ Access-Control-Allow-Methods:
40
+ - GET, POST, OPTIONS
41
+ X-Amzn-Trace-Id:
42
+ - Root=1-61238e35-5a78c6585f0a12aa03ef6ad2;Sampled=0
43
+ X-Cache:
44
+ - Miss from cloudfront
45
+ Via:
46
+ - 1.1 a65cc3f0f56427b7099c895c026d63f0.cloudfront.net (CloudFront)
47
+ X-Amz-Cf-Pop:
48
+ - ZAG50-C1
49
+ X-Amz-Cf-Id:
50
+ - AQ2ZtJn4PYqRprdqa7s-risSYgyC2fp3TfB26w8gi7l_4N7BHW252w==
51
+ body:
52
+ encoding: ASCII-8BIT
53
+ string: !binary |-
54
+ PGJpYmRhdGEgdHlwZT0ic3RhbmRhcmQiPgogIDxmZXRjaGVkPjIwMjEtMDctMTE8L2ZldGNoZWQ+CiAgPHRpdGxlIHR5cGU9InRpdGxlLWludHJvIiBmb3JtYXQ9InRleHQvcGxhaW4iIGxhbmd1YWdlPSJlbiIgc2NyaXB0PSJMYXRuIj5HZW9ncmFwaGljIGluZm9ybWF0aW9uPC90aXRsZT4KICA8dGl0bGUgdHlwZT0idGl0bGUtbWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZW4iIHNjcmlwdD0iTGF0biI+TWV0YWRhdGE8L3RpdGxlPgogIDx0aXRsZSB0eXBlPSJ0aXRsZS1wYXJ0IiBmb3JtYXQ9InRleHQvcGxhaW4iIGxhbmd1YWdlPSJlbiIgc2NyaXB0PSJMYXRuIj5QYXJ0IDI6IEV4dGVuc2lvbnMgZm9yIGFjcXVpc2l0aW9uIGFuZCBwcm9jZXNzaW5nPC90aXRsZT4KICA8dGl0bGUgdHlwZT0ibWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZW4iIHNjcmlwdD0iTGF0biI+R2VvZ3JhcGhpYyBpbmZvcm1hdGlvbiAtIE1ldGFkYXRhIC0gUGFydCAyOiBFeHRlbnNpb25zIGZvciBhY3F1aXNpdGlvbiBhbmQgcHJvY2Vzc2luZzwvdGl0bGU+CiAgPHRpdGxlIHR5cGU9InRpdGxlLWludHJvIiBmb3JtYXQ9InRleHQvcGxhaW4iIGxhbmd1YWdlPSJmciIgc2NyaXB0PSJMYXRuIj5JbmZvcm1hdGlvbiBnw6lvZ3JhcGhpcXVlPC90aXRsZT4KICA8dGl0bGUgdHlwZT0idGl0bGUtbWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZnIiIHNjcmlwdD0iTGF0biI+TcOpdGFkb25uw6llczwvdGl0bGU+CiAgPHRpdGxlIHR5cGU9InRpdGxlLXBhcnQiIGZvcm1hdD0idGV4dC9wbGFpbiIgbGFuZ3VhZ2U9ImZyIiBzY3JpcHQ9IkxhdG4iPlBhcnRpZSAyOiBFeHRlbnNpb25zIHBvdXIgbCdhY3F1aXNpdGlvbiBldCBsZSB0cmFpdGVtZW50PC90aXRsZT4KICA8dGl0bGUgdHlwZT0ibWFpbiIgZm9ybWF0PSJ0ZXh0L3BsYWluIiBsYW5ndWFnZT0iZnIiIHNjcmlwdD0iTGF0biI+SW5mb3JtYXRpb24gZ8Opb2dyYXBoaXF1ZSAtIE3DqXRhZG9ubsOpZXMgLSBQYXJ0aWUgMjogRXh0ZW5zaW9ucyBwb3VyIGwnYWNxdWlzaXRpb24gZXQgbGUgdHJhaXRlbWVudDwvdGl0bGU+CiAgPHVyaSB0eXBlPSJzcmMiPmh0dHBzOi8vd3d3Lmlzby5vcmcvc3RhbmRhcmQvNjcwMzkuaHRtbDwvdXJpPgogIDx1cmkgdHlwZT0ib2JwIj5odHRwczovL3d3dy5pc28ub3JnL29icC91aS8jIWlzbzpzdGQ6NjcwMzk6ZW48L3VyaT4KICA8dXJpIHR5cGU9InJzcyI+aHR0cHM6Ly93d3cuaXNvLm9yZy9jb250ZW50cy9kYXRhL3N0YW5kYXJkLzA2LzcwLzY3MDM5LmRldGFpbC5yc3M8L3VyaT4KICA8ZG9jaWRlbnRpZmllciB0eXBlPSJJU08iPklTTyAxOTExNS0yOjIwMTk8L2RvY2lkZW50aWZpZXI+CiAgPGRvY2lkZW50aWZpZXIgdHlwZT0iVVJOIj51cm46aXNvOnN0ZDppc286MTkxMTU6LTI6c3RhZ2UtNjAuNjA6ZWQtMjplbixmcjwvZG9jaWRlbnRpZmllcj4KICA8ZG9jbnVtYmVyPjE5MTE1PC9kb2NudW1iZXI+CiAgPGRhdGUgdHlwZT0icHVibGlzaGVkIj4KICAgIDxvbj4yMDE5LTAxPC9vbj4KICA8L2RhdGU+CiAgPGNvbnRyaWJ1dG9yPgogICAgPHJvbGUgdHlwZT0icHVibGlzaGVyIi8+CiAgICA8b3JnYW5pemF0aW9uPgogICAgICA8bmFtZT5JbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uPC9uYW1lPgogICAgICA8YWJicmV2aWF0aW9uPklTTzwvYWJicmV2aWF0aW9uPgogICAgICA8dXJpPnd3dy5pc28ub3JnPC91cmk+CiAgICA8L29yZ2FuaXphdGlvbj4KICA8L2NvbnRyaWJ1dG9yPgogIDxlZGl0aW9uPjI8L2VkaXRpb24+CiAgPGxhbmd1YWdlPmVuPC9sYW5ndWFnZT4KICA8bGFuZ3VhZ2U+ZnI8L2xhbmd1YWdlPgogIDxzY3JpcHQ+TGF0bjwvc2NyaXB0PgogIDxzdGF0dXM+CiAgICA8c3RhZ2U+NjA8L3N0YWdlPgogICAgPHN1YnN0YWdlPjYwPC9zdWJzdGFnZT4KICA8L3N0YXR1cz4KICA8Y29weXJpZ2h0PgogICAgPGZyb20+MjAxOTwvZnJvbT4KICAgIDxvd25lcj4KICAgICAgPG9yZ2FuaXphdGlvbj4KICAgICAgICA8bmFtZT5JU088L25hbWU+CiAgICAgIDwvb3JnYW5pemF0aW9uPgogICAgPC9vd25lcj4KICA8L2NvcHlyaWdodD4KICA8cmVsYXRpb24gdHlwZT0ib2Jzb2xldGVzIj4KICAgIDxiaWJpdGVtIHR5cGU9InN0YW5kYXJkIj4KICAgICAgPGZvcm1hdHRlZHJlZiBmb3JtYXQ9InRleHQvcGxhaW4iPklTTyAxOTExNS0yOjIwMDk8L2Zvcm1hdHRlZHJlZj4KICAgIDwvYmliaXRlbT4KICA8L3JlbGF0aW9uPgogIDxyZWxhdGlvbiB0eXBlPSJ1cGRhdGVzIj4KICAgIDxiaWJpdGVtIHR5cGU9InN0YW5kYXJkIj4KICAgICAgPGZvcm1hdHRlZHJlZiBmb3JtYXQ9InRleHQvcGxhaW4iPklTTyAxOTExNS0yOjIwMTkvUFJGIEFtZCAxPC9mb3JtYXR0ZWRyZWY+CiAgICAgIDxkYXRlIHR5cGU9ImNpcmN1bGF0ZWQiPgogICAgICAgIDxvbj4yMDE5LTAxLTEwPC9vbj4KICAgICAgPC9kYXRlPgogICAgPC9iaWJpdGVtPgogIDwvcmVsYXRpb24+CiAgPHBsYWNlPkdlbmV2YTwvcGxhY2U+CiAgPGV4dD4KICAgIDxkb2N0eXBlPmludGVybmF0aW9uYWwtc3RhbmRhcmQ8L2RvY3R5cGU+CiAgICA8ZWRpdG9yaWFsZ3JvdXA+CiAgICAgIDx0ZWNobmljYWwtY29tbWl0dGVlIG51bWJlcj0iMjExIiB0eXBlPSJUQyI+SVNPL1RDIDIxMUdlb2dyYXBoaWMgaW5mb3JtYXRpb24vR2VvbWF0aWNzPC90ZWNobmljYWwtY29tbWl0dGVlPgogICAgPC9lZGl0b3JpYWxncm91cD4KICAgIDxpY3M+CiAgICAgIDxjb2RlPjM1LjI0MC43MDwvY29kZT4KICAgICAgPHRleHQ+SVQgYXBwbGljYXRpb25zIGluIHNjaWVuY2U8L3RleHQ+CiAgICA8L2ljcz4KICAgIDxzdHJ1Y3R1cmVkaWRlbnRpZmllciB0eXBlPSJJU08iPgogICAgICA8cHJvamVjdC1udW1iZXI+SVNPIDE5MTE1PC9wcm9qZWN0LW51bWJlcj4KICAgIDwvc3RydWN0dXJlZGlkZW50aWZpZXI+CiAgPC9leHQ+CjwvYmliZGF0YT4=
55
+ http_version:
56
+ recorded_at: Mon, 23 Aug 2021 12:02:12 GMT
57
+ recorded_with: VCR 5.1.0