cirneco 0.9.12 → 0.9.13

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 (53) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +124 -49
  3. data/cirneco.gemspec +5 -4
  4. data/lib/cirneco/api.rb +8 -8
  5. data/lib/cirneco/base.rb +2 -2
  6. data/lib/cirneco/cli.rb +1 -1
  7. data/lib/cirneco/utils.rb +48 -95
  8. data/lib/cirneco/version.rb +1 -1
  9. data/lib/cirneco/work.rb +8 -203
  10. data/spec/api_spec.rb +16 -28
  11. data/spec/doi_spec.rb +9 -11
  12. data/spec/fixtures/cool-dois-minted/index.html +189 -234
  13. data/spec/fixtures/cool-dois-minted.html.md +1 -1
  14. data/spec/fixtures/cool-dois.html.md +2 -2
  15. data/spec/fixtures/index-minted.html +1 -1
  16. data/spec/fixtures/index.html +50 -1
  17. data/spec/fixtures/index.html.erb +2 -2
  18. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/get/should_get_all_dois_by_prefix.yml +20 -18
  19. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/jats/should_generate_jats_for_all_urls.yml +38 -0
  20. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_hide_for_all_urls.yml +20 -20
  21. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_hide_for_url.yml +19 -17
  22. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_hide_metadata_for_work.yml +19 -17
  23. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_and_hide_for_all_urls.yml +204 -108
  24. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_and_hide_for_url.yml +72 -64
  25. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_for_all_urls.yml +17 -291
  26. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_post_metadata_for_work.yml +47 -82
  27. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/MDS_DOI_API/get/should_get_all_dois.yml +22 -18
  28. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/MDS_DOI_API/get/should_get_doi.yml +19 -17
  29. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/MDS_DOI_API/put/should_put_doi.yml +20 -18
  30. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/jats/writes_jats_for_list_of_urls.yml +38 -0
  31. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/hides_a_doi.yml +19 -17
  32. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/hides_dois_for_list_of_urls.yml +81 -0
  33. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_and_hides_a_doi.yml +72 -64
  34. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_and_hides_dois_for_list_of_urls.yml +204 -108
  35. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_dois_for_list_of_urls.yml +17 -291
  36. data/spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/should_get_all_dois.yml +140 -18
  37. data/spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/should_get_doi.yml +137 -17
  38. data/spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/should_get_doi_not_found.yml +134 -16
  39. data/spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/username_missing.yml +121 -0
  40. data/spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/put/should_put_doi.yml +138 -18
  41. data/spec/fixtures/vcr_cassettes/Cirneco_Work/Media_API/get/should_get_media.yml +135 -17
  42. data/spec/fixtures/vcr_cassettes/Cirneco_Work/Media_API/post/should_post_media.yml +137 -17
  43. data/spec/fixtures/vcr_cassettes/Cirneco_Work/Metadata_API/delete/should_delete_metadata.yml +137 -17
  44. data/spec/fixtures/vcr_cassettes/Cirneco_Work/Metadata_API/get/should_get_metadata.yml +170 -27
  45. data/spec/fixtures/vcr_cassettes/Cirneco_Work/Metadata_API/post/should_post_metadata.yml +173 -28
  46. data/spec/fixtures/vcr_cassettes/Cirneco_Work/media/includes_media.yml +121 -0
  47. data/spec/fixtures/vcr_cassettes/Cirneco_Work/schema/BlogPosting.yml +121 -0
  48. data/spec/spec_helper.rb +1 -1
  49. data/spec/utils_spec.rb +28 -41
  50. data/spec/work_spec.rb +33 -43
  51. metadata +43 -19
  52. data/spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_for_url.yml +0 -174
  53. data/spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_a_doi.yml +0 -174
@@ -0,0 +1,121 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://blog.datacite.org/eating-your-own-dog-food
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ User-Agent:
11
+ - Maremma - https://github.com/datacite/maremma
12
+ Accept:
13
+ - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5
14
+ response:
15
+ status:
16
+ code: 302
17
+ message: Moved Temporarily
18
+ headers:
19
+ Access-Control-Allow-Methods:
20
+ - GET, POST, OPTIONS
21
+ Access-Control-Allow-Origin:
22
+ - "*"
23
+ Content-Type:
24
+ - text/html; charset=utf-8
25
+ Date:
26
+ - Sat, 22 Jul 2017 07:18:22 GMT
27
+ Location:
28
+ - "/eating-your-own-dog-food/"
29
+ Server:
30
+ - openresty/1.11.2.2
31
+ Via:
32
+ - kong/0.10.3
33
+ X-Amz-Error-Code:
34
+ - Found
35
+ X-Amz-Error-Message:
36
+ - Resource Found
37
+ X-Amz-Id-2:
38
+ - WJJcrkUGORQqdyeAW+bzhHz5g03XonrHC/FSybu16ZT58khMGF9YvSGME+RJpQpY/hzp6H0cGx4=
39
+ X-Amz-Request-Id:
40
+ - F96910132A510B39
41
+ X-Kong-Proxy-Latency:
42
+ - '0'
43
+ X-Kong-Upstream-Latency:
44
+ - '8'
45
+ Content-Length:
46
+ - '313'
47
+ Connection:
48
+ - keep-alive
49
+ body:
50
+ encoding: UTF-8
51
+ string: |
52
+ <html>
53
+ <head><title>302 Moved Temporarily</title></head>
54
+ <body>
55
+ <h1>302 Moved Temporarily</h1>
56
+ <ul>
57
+ <li>Code: Found</li>
58
+ <li>Message: Resource Found</li>
59
+ <li>RequestId: F96910132A510B39</li>
60
+ <li>HostId: WJJcrkUGORQqdyeAW+bzhHz5g03XonrHC/FSybu16ZT58khMGF9YvSGME+RJpQpY/hzp6H0cGx4=</li>
61
+ </ul>
62
+ <hr/>
63
+ </body>
64
+ </html>
65
+ http_version:
66
+ recorded_at: Sat, 22 Jul 2017 07:18:21 GMT
67
+ - request:
68
+ method: get
69
+ uri: https://blog.datacite.org/eating-your-own-dog-food/
70
+ body:
71
+ encoding: US-ASCII
72
+ string: ''
73
+ headers:
74
+ User-Agent:
75
+ - Maremma - https://github.com/datacite/maremma
76
+ Accept:
77
+ - text/html,application/json,application/xml;q=0.9, text/plain;q=0.8,image/png,*/*;q=0.5
78
+ response:
79
+ status:
80
+ code: 200
81
+ message: OK
82
+ headers:
83
+ Access-Control-Allow-Methods:
84
+ - GET, POST, OPTIONS
85
+ Access-Control-Allow-Origin:
86
+ - "*"
87
+ Cache-Control:
88
+ - max-age=31536000
89
+ Content-Type:
90
+ - text/html; charset=UTF-8
91
+ Date:
92
+ - Sat, 22 Jul 2017 07:18:22 GMT
93
+ Etag:
94
+ - '"6a6aa03cbec8a262c30666fec1970897"'
95
+ Last-Modified:
96
+ - Thu, 20 Jul 2017 11:39:32 GMT
97
+ Server:
98
+ - openresty/1.11.2.2
99
+ Via:
100
+ - kong/0.10.3
101
+ X-Amz-Id-2:
102
+ - gTINNf8lNV+G4ZCgO9QM+yvL3JhMascyiHEUcTssCbP3/1pOofnGczUfjNgdRbPebcaAwK4Ehw4=
103
+ X-Amz-Request-Id:
104
+ - 40A5ABB017903106
105
+ X-Amz-Version-Id:
106
+ - ZckgSKWJ.zIsvx_v6pKkZMyNt30kmwQi
107
+ X-Kong-Proxy-Latency:
108
+ - '0'
109
+ X-Kong-Upstream-Latency:
110
+ - '11'
111
+ Content-Length:
112
+ - '23992'
113
+ Connection:
114
+ - keep-alive
115
+ body:
116
+ encoding: ASCII-8BIT
117
+ string: !binary |-
118
+ PCFET0NUWVBFIGh0bWw+CiAgPGh0bWw+CiAgICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDwhLS0gKDEpIE9wdGltaXplIGZvciBtb2JpbGUgdmVyc2lvbnM6IGh0dHA6Ly9nb28uZ2wvRU9wRmwgLS0+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8IS0tICgxKSBmb3JjZSBsYXRlc3QgSUUgcmVuZGVyaW5nIGVuZ2luZTogYml0Lmx5LzFjOEVpQzkgLS0+CiAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgoKCiAgICA8dGl0bGU+RWF0aW5nIHlvdXIgb3duIERvZyBGb29kPC90aXRsZT4KICAgIDxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJFYXRpbmcgeW91ciBvd24gZG9nIGZvb2QgaXMgYSBzbGFuZyB0ZXJtIHRvIGRlc2NyaWJlIHRoYXQgYW4gb3JnYW5pemF0aW9uIHNob3VsZCBpdHNlbGYgdXNlIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgaXQgcHJvdmlkZXMuIEZvciBEYXRhQ2l0ZSB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHVzZSBET0lzIHdpdGggYXBwcm9wcmlhdGUgbWV0YWRhdGEgYW5kIHN0cmF0ZWdpZXMgZm9yIGxvbmctdGVybSBwcmVzZXJ2YXRpb24gZm9yLi4uIiAvPgoKICAgIDxtZXRhIG5hbWU9IkhhbmRoZWxkRnJpZW5kbHkiIGNvbnRlbnQ9IlRydWUiIC8+CiAgICA8bWV0YSBuYW1lPSJNb2JpbGVPcHRpbWl6ZWQiIGNvbnRlbnQ9IjMyMCIgLz4KICAgIDxtZXRhIG5hbWU9ImFwcGxlLW1vYmlsZS13ZWItYXBwLWNhcGFibGUiIGNvbnRlbnQ9InllcyI+CiAgICA8bWV0YSBuYW1lPSJhcHBsZS1tb2JpbGUtd2ViLWFwcC1zdGF0dXMtYmFyLXN0eWxlIiBjb250ZW50PSJibGFjay10cmFuc2x1Y2VudCI+CgogICAgPCEtLSBEdWJsaW5Db3JlIE1ldGFkYXRhIC0tPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnRpdGxlIiBjb250ZW50PSJFYXRpbmcgeW91ciBvd24gRG9nIEZvb2QiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0iZGM6Zm9ybWF0IiBjb250ZW50PSJ0ZXh0L2h0bWwiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0iZGM6bGFuZ3VhZ2UiIGNvbnRlbnQ9ImVuIiAvPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnJpZ2h0cyIgY29udGVudD0iQ0MtQlkiIC8+CiAgICA8bWV0YSBwcm9wZXJ0eT0iZGM6c291cmNlIiBjb250ZW50PSJEYXRhQ2l0ZSBCbG9nIiAvPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnN1YmplY3QiIGNvbnRlbnQ9IlNjaG9sYXJseSBDb21tdW5pY2F0aW9uIiAvPgogICAgPG1ldGEgcHJvcGVydHk9ImRjOnR5cGUiIGNvbnRlbnQ9IndlYnNpdGUiIC8+CgoKICAgIDxtZXRhIHByb3BlcnR5PSJvZzpzaXRlX25hbWUiIGNvbnRlbnQ9IkVhdGluZyB5b3VyIG93biBEb2cgRm9vZCIgLz4KICAgIDxtZXRhIHByb3BlcnR5PSJvZzpkZXNjcmlwdGlvbiIgY29udGVudD0iRWF0aW5nIHlvdXIgb3duIGRvZyBmb29kIGlzIGEgc2xhbmcgdGVybSB0byBkZXNjcmliZSB0aGF0IGFuIG9yZ2FuaXphdGlvbiBzaG91bGQgaXRzZWxmIHVzZSB0aGUgcHJvZHVjdHMgYW5kIHNlcnZpY2VzIGl0IHByb3ZpZGVzLiBGb3IgRGF0YUNpdGUgdGhpcyBtZWFucyB0aGF0IHdlIHNob3VsZCB1c2UgRE9JcyB3aXRoIGFwcHJvcHJpYXRlIG1ldGFkYXRhIGFuZCBzdHJhdGVnaWVzIGZvciBsb25nLXRlcm0gcHJlc2VydmF0aW9uIGZvci4uLiIgLz4KICAgIDxtZXRhIHByb3BlcnR5PSJvZzppbWFnZSIgY29udGVudD0iaHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZy9pbWFnZXMvMjAxNi8xMi8yMzA3ODUuanBnIiAvPgogICAgPG1ldGEgcHJvcGVydHk9Im9nOnR5cGUiIGNvbnRlbnQ9ImJsb2ciIC8+CgogICAgPGxpbmsgaHJlZj0iLy9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PUxpYnJlK0Jhc2tlcnZpbGxlOjQwMCw0MDBpLDcwMCIgcmVsPSJzdHlsZXNoZWV0Ij4KICAgIDxsaW5rIGhyZWY9Jy8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1SYWxld2F5OjQwMCw2MDAsNDAwaXRhbGljLDYwMGl0YWxpYycgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+CiAgICA8bGluayBocmVmPSIvL21heGNkbi5ib290c3RyYXBjZG4uY29tL2ZvbnQtYXdlc29tZS80LjYuMS9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0ndGV4dC9jc3MnPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9hc3NldHMuZGF0YWNpdGUub3JnL3N0eWxlc2hlZXRzL2RhdGFjaXRlLmNzcyIgcmVsPSdzdHlsZXNoZWV0JyB0eXBlPSd0ZXh0L2Nzcyc+CiAgICA8bGluayBocmVmPSJodHRwczovL2Fzc2V0cy5kYXRhY2l0ZS5vcmcvaW1hZ2VzL2Zhdmljb24uaWNvIiByZWw9Imljb24iIHR5cGU9ImltYWdlL2ljbyIgLz4KCiAgICAgIDxzY3JpcHQKICAgICAgICBzcmM9Ii8vZDJ3eThmN2E5dXJzbm0uY2xvdWRmcm9udC5uZXQvYnVnc25hZy0yLm1pbi5qcyIKICAgICAgICBkYXRhLWFwaWtleT0iYzM3YTU4NjE5NjcwOTFhOWI0MmExYTc3ZTIzNTExNGEiPgogICAgICA8L3NjcmlwdD4KCiAgICA8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2xkK2pzb24iPgogICAgICB7IkBjb250ZXh0IjoiaHR0cDovL3NjaGVtYS5vcmciLCJAdHlwZSI6IkJsb2dQb3N0aW5nIiwiQGlkIjoiaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvNEszTS1OWVZHIiwibmFtZSI6IkVhdGluZyB5b3VyIG93biBEb2cgRm9vZCIsImFsdGVybmF0ZU5hbWUiOiJNUy00OS0zNjMyLTUwODMiLCJ1cmwiOiJodHRwczovL2Jsb2cuZGF0YWNpdGUub3JnL2VhdGluZy15b3VyLW93bi1kb2ctZm9vZC8iLCJhdXRob3IiOlt7IkB0eXBlIjoiUGVyc29uIiwiQGlkIjoiaHR0cDovL29yY2lkLm9yZy8wMDAwLTAwMDMtMTQxOS0yNDA1IiwiZ2l2ZW5OYW1lIjoiTWFydGluIiwiZmFtaWx5TmFtZSI6IkZlbm5lciIsIm5hbWUiOiJNYXJ0aW4gRmVubmVyIn1dLCJwdWJsaXNoZXIiOnsiQHR5cGUiOiJPcmdhbml6YXRpb24iLCJuYW1lIjoiRGF0YUNpdGUifSwiZGF0ZUNyZWF0ZWQiOiIyMDE2LTEyLTIwIiwiZGF0ZVB1Ymxpc2hlZCI6IjIwMTYtMTItMjAiLCJkYXRlTW9kaWZpZWQiOiIyMDE2LTEyLTIwIiwia2V5d29yZHMiOiJkYXRhY2l0ZSwgZG9pLCBtZXRhZGF0YSwgZmVhdHVyZWQiLCJ2ZXJzaW9uIjoiMS4wIiwiZGVzY3JpcHRpb24iOiJFYXRpbmcgeW91ciBvd24gZG9nIGZvb2QgaXMgYSBzbGFuZyB0ZXJtIHRvIGRlc2NyaWJlIHRoYXQgYW4gb3JnYW5pemF0aW9uIHNob3VsZCBpdHNlbGYgdXNlIHRoZSBwcm9kdWN0cyBhbmQgc2VydmljZXMgaXQgcHJvdmlkZXMuIEZvciBEYXRhQ2l0ZSB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIHVzZSBET0lzIHdpdGggYXBwcm9wcmlhdGUgbWV0YWRhdGEgYW5kIHN0cmF0ZWdpZXMgZm9yIGxvbmctdGVybSBwcmVzZXJ2YXRpb24gZm9yLi4uIiwibGljZW5zZSI6Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS80LjAvIiwiaW1hZ2UiOiJodHRwczovL2Jsb2cuZGF0YWNpdGUub3JnL2ltYWdlcy8yMDE2LzEyLzIzMDc4NS5qcGciLCJlbmNvZGluZyI6eyJAdHlwZSI6Ik1lZGlhT2JqZWN0IiwiQGlkIjoiaHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZy9lYXRpbmcteW91ci1vd24tZG9nLWZvb2QvZWF0aW5nLXlvdXItb3duLWRvZy1mb29kLnhtbCIsImZpbGVGb3JtYXQiOiJhcHBsaWNhdGlvbi94bWwifSwiaXNQYXJ0T2YiOnsiQHR5cGUiOiJCbG9nIiwiQGlkIjoiaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvMDAwMC0wMFNTIiwibmFtZSI6IkRhdGFDaXRlIEJsb2cifSwiY2l0YXRpb24iOlt7IkB0eXBlIjoiQ3JlYXRpdmVXb3JrIiwiQGlkIjoiaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvMDAxMiJ9LHsiQHR5cGUiOiJDcmVhdGl2ZVdvcmsiLCJAaWQiOiJodHRwczovL2RvaS5vcmcvMTAuNTQzOC81NUU1LVQ1QzAifV19CiAgICA8L3NjcmlwdD4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aGVhZGVyIGNsYXNzPSJoZWFkZXIiIGlkPSJuYXZ0b3AiPgogICAgICA8ZGl2IGNsYXNzPSJuYXZiYXIgbmF2YmFyLXdoaXRlIiByb2xlPSJuYXZpZ2F0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmx1aWQiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWhlYWRlciIKICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJuYXZiYXItdG9nZ2xlIiBkYXRhLXRvZ2dsZT0iY29sbGFwc2UiIGRhdGEtdGFyZ2V0PSIubmF2YmFyLWNvbGxhcHNlIj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ic3Itb25seSI+VG9nZ2xlIG5hdmlnYXRpb248L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Imljb24tYmFyIj48L3NwYW4+CiAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8YSBjbGFzcz0ibmF2YmFyLWJyYW5kIiBocmVmPSIvIj5EYXRhQ2l0ZSBCbG9nPC9hPgogICAgICAgICAgPGRpdiBjbGFzcz0ibmF2YmFyLWNvbGxhcHNlIGNvbGxhcHNlIj4KICAgICAgICAgICAgPHVsIGNsYXNzPSJuYXYgbmF2YmFyLW5hdiBuYXZiYXItcmlnaHQiPgogICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3N1cHBvcnQuZGF0YWNpdGUub3JnIj5TdXBwb3J0PC9hPjwvbGk+CiAgICAgICAgICAgICAgPGxpIGNsYXNzPSJkcm9wZG93biI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBjbGFzcz0iZHJvcGRvd24tdG9nZ2xlIiBkYXRhLXRvZ2dsZT0iZHJvcGRvd24iIGlkPSJzaXRlcyI+PGkgY2xhc3M9J2ZhIGZhLXRoJz48L2k+IDxzcGFuIGNsYXNzPSJjYXJldCI+PC9zcGFuPjwvYT4KICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iZHJvcGRvd24tbWVudSIgcm9sZT0ibWVudSI+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmciPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS1nbG9iZSBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIEhvbWVwYWdlPC9hPgogICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLXJzcyBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIEJsb2c8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iZGl2aWRlciI+PC9saT4KICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vbWRzLmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWRhdGFiYXNlIGZhLWZ3Jz48L2k+CiAgICAgICAgICAgICAgICAgICAgTURTPC9hPgogICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9zY2hlbWEuZGF0YWNpdGUub3JnIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtZmlsZS1jb2RlLW8gZmEtZncnPjwvaT4KICAgICAgICAgICAgICAgICAgICBTY2hlbWE8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY2l0YXRpb24uY3Jvc3NjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWZpbGUtdGV4dC1vIGZhLWZ3Jz48L2k+CiAgICAgICAgICAgICAgICAgICAgQ2l0YXRpb24gRm9ybWF0dGVyPC9hPgogICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpdmlkZXIiPjwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3NlYXJjaC5kYXRhY2l0ZS5vcmciPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS1zZWFyY2ggZmEtZncnPjwvaT4KICAgICAgICAgICAgICAgICAgICBTZWFyY2g8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL29haS5kYXRhY2l0ZS5vcmciPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS10YWJsZSBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIE9BSS1QTUg8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3N0YXRzLmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWJhci1jaGFydCBmYS1mdyc+PC9pPgogICAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3M8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2FwaS5kYXRhY2l0ZS5vcmciPgogICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdmYSBmYS1jb2dzIGZhLWZ3Jz48L2k+CiAgICAgICAgICAgICAgICAgICAgUkVTVCBBUEk8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnJlM2RhdGEub3JnIj4KICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtY3ViZXMgZmEtZncnPjwvaT4KICAgICAgICAgICAgICAgICAgICByZTNkYXRhPC9hPgogICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9ImRpdmlkZXIiPjwvbGk+CiAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc3RhdHVzLmRhdGFjaXRlLm9yZyI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWNhbGVuZGFyLWNoZWNrLW8gZmEtZncnPjwvaT4KICAgICAgICAgICAgICAgICAgICBTdGF0dXM8L2E+CiAgICAgICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2hlYWRlcj4KICAgICAgPGRpdiBjbGFzcz0id3JhcHBlciI+CiAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHNlY3Rpb24td2hpdGUiPgogICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXItZmx1aWQiPgogICAgICAgIDxkaXYgY2xhc3M9InJvdyByb3ctc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtOCBjb2wtbWQtb2Zmc2V0LTIgcG9zdC1jb250ZW50Ij4KICAgICAgICAgICAgPGEgbmFtZT0idG9wb2ZwYWdlIj48L2E+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InBvc3QtbWV0YSI+CiAgICAgICAgICAgICAgPGgxPkVhdGluZyB5b3VyIG93biBEb2cgRm9vZDwvaDE+CiAgICAgICAgICAgICAgRGVjZW1iZXIgMjAsIDIwMTYgYnkgTWFydGluIEZlbm5lcgogICAgICAgICAgICAgIOKAoiA8c3BhbiBjbGFzcz0icG9zdC1yZWFkaW5nLXRpbWUiPjwvc3Bhbj4gcmVhZAogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImRvaSI+PGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvNEszTS1OWVZHIj5odHRwczovL2RvaS5vcmcvMTAuNTQzOC80SzNNLU5ZVkc8L2E+PC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxwPjxhIGhyZWY9Imh0dHBzOi8vbmV3cmVwdWJsaWMuY29tL2FydGljbGUvMTE1MzQ5L2RvZ2Zvb2RpbmctdGVjaC1zbGFuZy13b3JraW5nLW91dC1nbGl0Y2hlcyI+RWF0aW5nIHlvdXIgb3duIGRvZyBmb29kPC9hPiBpcyBhIHNsYW5nIHRlcm0gdG8gZGVzY3JpYmUgdGhhdCBhbiBvcmdhbml6YXRpb24gc2hvdWxkIGl0c2VsZiB1c2UgdGhlIHByb2R1Y3RzIGFuZCBzZXJ2aWNlcyBpdCBwcm92aWRlcy4gRm9yIERhdGFDaXRlIHRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgdXNlIERPSXMgd2l0aCBhcHByb3ByaWF0ZSBtZXRhZGF0YSBhbmQgc3RyYXRlZ2llcyBmb3IgbG9uZy10ZXJtIHByZXNlcnZhdGlvbiBmb3IgdGhlIHNjaG9sYXJseSBvdXRwdXRzIHdlIHByb2R1Y2UuIEZvciB0aGUgbW9zdCBwYXJ0IHRoaXMgaXMgbm90IHJlc2VhcmNoIGRhdGEsIGJ1dCByYXRoZXIgdGVjaG5pY2FsIGRvY3VtZW50cyBzdWNoIGFzIHRoZSBEYXRhQ2l0ZSBTY2hlbWEgYW5kIGl0cyBkb2N1bWVudGF0aW9uIDxzcGFuIGNsYXNzPSJjaXRhdGlvbiI+KDxhIGhyZWY9IiNyZWYtaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvMDAxMiI+MjAxNjwvYT4pPC9zcGFuPi48L3A+CjxwPlRoZXNlIG91dHB1dHMgYWxzbyBpbmNsdWRlIHRoZSBwb3N0cyBvbiB0aGlzIGJsb2csIHdoZXJlIHdlIGRpc2N1c3MgdG9waWNzIHJlbGV2YW50IGZvciB0aGUgRGF0YUNpdGUgY29tbXVuaXR5LCBidXQgYWxzbyBvZiBicm9hZGVyIGludGVyZXN0IHRvIGFueW9uZSB3aG8gY2FyZXMgYWJvdXQgcmVzZWFyY2ggZGF0YSwgcGVyc2lzdGVudCBpZGVudGlmaWVycywgYW5kIHNjaG9sYXJseSBpbmZyYXN0cnVjdHVyZS4gQW5kIHN0YXJ0aW5nIHRvZGF5IGFsbCBibG9nIHBvc3RzIG9uIHRoaXMgYmxvZyB3aWxsIGhhdmUgYSBET0ksIG1ldGFkYXRhIGFuZCB1c2UgYSBwZXJzaXN0ZW50IHN0b3JhZ2UgbWVjaGFuaXNtLjwvcD4KPGRpdiBjbGFzcz0iZmlndXJlIj4KPGltZyBzcmM9Ii9pbWFnZXMvMjAxNi8xMi8yMzA3ODUuanBnIiBhbHQ9IlBob3RvIGJ5IEJpbGwgRW1yaWNoLiBDQyBaZXJvLiIgLz4KPHAgY2xhc3M9ImNhcHRpb24iPlBob3RvIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnBleGVscy5jb20vcGhvdG8vYmxhY2stYW5kLXRhbi15b3Jrc2hpcmUtdGVycmllci1wdXBweS0yMzA3ODUvIj5CaWxsIEVtcmljaDwvYT4uIDxhIGhyZWY9Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvIj5DQyBaZXJvPC9hPi48L3A+CjwvZGl2Pgo8aDMgaWQ9InRlY2huaWNhbC1pbXBsZW1lbnRhdGlvbiI+VGVjaG5pY2FsIEltcGxlbWVudGF0aW9uPC9oMz4KPHA+VGhpcyBibG9nIGlzIHBvd2VyZWQgYnkgdGhlIHN0YXRpYyBzaXRlIGdlbmVyYXRvciA8YSBocmVmPSJodHRwczovL21pZGRsZW1hbmFwcC5jb20vIj5NaWRkbGVtYW48L2E+LCB3aXRoIGJsb2cgcG9zdHMgd3JpdHRlbiBpbiA8YSBocmVmPSJodHRwOi8vY29tbW9ubWFyay5vcmcvIj5NYXJrZG93bjwvYT4gYW5kIGNvbnZlcnRlZCB0byBIVE1MIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9wYW5kb2Mub3JnLyI+UGFuZG9jPC9hPiBhbmQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vdHJhdmlzLWNpLm9yZyI+VHJhdmlzIENJPC9hPiBjb250aW51b3VzIGludGVncmF0aW9uIHNlcnZpY2UuIFN0YXRpYyBzaXRlIGdlbmVyYXRvciBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIGRhdGFiYXNlIG9yIGFwcGxpY2F0aW9uIHNlcnZlciBwb3dlcmluZyB0aGUgc2l0ZSwgbWFraW5nIHdlYnNpdGUgYWRtaW5zdHJhdGlvbiBzaW1wbGVyLCBjaGVhcGVyIGFuZCBzYWZlci4gSW4gYWRkaXRpb24gdG8gdGhlIGJsb2csIHRoZSA8YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmciPkRhdGFDaXRlIGhvbWVwYWdlPC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9zY2hlbWEuZGF0YWNpdGUub3JnIj5NZXRhZGF0YSBTY2hlbWEgc3Vic2l0ZTwvYT4gYXJlIGFsc28gZ2VuZXJhdGVkIHVzaW5nIE1pZGRsZW1hbi48L3A+CjxwPlRoZSBzaW1wbGljaXR5IGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgaGVyZSwgYXMgcmVnaXN0ZXJpbmcgdGhlIERPSXMgYW5kIG1ldGFkYXRhIGNhbiBiZSBhY2NvbXBsaXNoZWQgdXNpbmcgYSBjb21tYW5kIGxpbmUgdXRpbGl0eSB3cml0dGVuIGJ5IERhdGFDaXRlIHN0YWZmIHRoYXQgZG9lc27igJl0IG5lZWQgdG8ga25vdyBtdWNoIGFib3V0IHRoZSBpbnRlcm5hbHMgb2YgTWlkZGxlbWFuLCBhbmQgdGh1cyBjYW4gYmUgZWFzaWx5IGFkYXB0ZWQgdG8gb3RoZXIgc3RhdGljIHNpdGUgZ2VuZXJhdG9ycyBzdWNoIGFzIDxhIGhyZWY9Imh0dHA6Ly9qZWt5bGxyYi5jb20vIj5KZWt5bGw8L2E+LCA8YSBocmVmPSJodHRwOi8vZ29odWdvLmlvLyI+SHVnbzwvYT4gb3IgPGEgaHJlZj0iaHR0cHM6Ly9oZXhvLmlvLyI+SGV4bzwvYT4uIFRoZSBjb21tYW5kIGxpbmUgdXRpbGl0eSBpcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGF0YWNpdGUvY2lybmVjbyI+Q2lybmVjbzwvYT4sIGdlbmVyYXRpbmcgdGhlIG1ldGFkYXRhIFhNTCBhY2NvcmRpbmcgdG8gdGhlIERhdGFDaXRlIE1ldGFkYXRhIFNjaGVtYSwgYW5kIHJlZ2lzdGVyaW5nIERPSSBhbmQgbWV0YWRhdGEgd2l0aCB0aGUgRGF0YUNpdGUgTURTLiBMaWtlIGFsbCB0b29scyBtZW50aW9uZWQgaW4gdGhpcyBwb3N0IENpcm5lY28gaXMgb3BlbiBzb3VyY2Ugc29mdHdhcmUsIHBsZWFzZSByZWFjaCBvdXQgdG8gdXMgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGltcGxlbWVudGluZyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgZm9yIHlvdXIgYmxvZy48L3A+CjxoMyBpZD0iZ2VuZXJhdGluZy1kb2lzIj5HZW5lcmF0aW5nIERPSXM8L2gzPgo8cD5UaGUgRE9JcyBmb3IgdGhpcyBibG9nIGFyZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSwgdXNpbmcgYSBtb2RpZmllZCBiYXNlMzIgZW5jb2RpbmcgYWxnb3JpdGhtIHRoYXQgaXMgcHJvdmlkZWQgYnkgQ2lybmVjbywgYXMgZGlzY3Vzc2VkIGxhc3Qgd2VlayA8c3BhbiBjbGFzcz0iY2l0YXRpb24iPihGZW5uZXIsIDxhIGhyZWY9IiNyZWYtaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvNTVFNS1UNUMwIj4yMDE2PC9hPik8L3NwYW4+LiBUaGUgRE9JIGlzIGdlbmVyYXRlZCBhbmQgbWludGVkIHdoZW4gYSBuZXcgcG9zdCBpcyBwdXNoZWQgdG8gPGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZyIgY2xhc3M9InVyaSI+aHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZzwvYT4uIFRoaXMgYXZvaWRzIHR3byBwcm9ibGVtczogYSkgRE9JLWxpa2Ugc3RyaW5ncyBpbiB0aGUgd2lsZCBiZWZvcmUgcHVibGljYXRpb24gYW5kIGIpIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgRE9JIGV4aXN0cyBhbHJlYWR5ICh3ZSBjYW4gc2ltcGx5IGdlbmVyYXRlIGEgbmV3IG9uZSkuIEFsbCBET0lzIGFyZSBzaG9ydCwgd2l0aG91dCBzZW1hbnRpYyBpbmZvbWF0aW9uIHRoYXQgbWlnaHQgY2hhbmdlIG92ZXIgdGltZSwgYW5kIHdpdGggYSBjaGVja3N1bSB0byBtaW5pbWl6ZSB0cmFuc2NyaXB0aW9uIGVycm9ycywgZm9yIGV4YW1wbGUgPHN0cm9uZz5odHRwczovL2RvaS5vcmcvMTAuNTQzOC9YQ0JKLUc3Wlk8L3N0cm9uZz4uIEdvaW5nIGZvcndhcmQgd2UgZW5jb3VyYWdlIHVzZXJzIHRvIGxpbmsgdG8gdGhlIERhdGFDaXRlIEJsb2cgdXNpbmcgdGhlIERPSSwgYXMgdGhlc2UgbGlua3Mgd2lsbCBjb250aW51ZSB0byB3b3JrIGV2ZW4gaWYgd2UgZXZlciBtb3ZlIHRoZSBibG9nIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLjwvcD4KPGgzIGlkPSJnZW5lcmF0aW5nLW1ldGFkYXRhIj5HZW5lcmF0aW5nIE1ldGFkYXRhPC9oMz4KPHA+Rm9yIHRoZSBnZW5lcmF0aW9uIG9mIG1ldGFkYXRhLCB3ZSBuZWVkIHRvIHN0cmlrZSBhIGJhbGFuY2UgYmV0d2VlbiBzaW1wbGUgYXV0aG9yIHByb3ZpZGVkIG1ldGFkYXRhLCBidXQgcmljaCBlbm91Z2ggdG8gYWlkIGRpc2NvdmVyeS4gV2UgYXJlIGRvaW5nIHRoaXMgdmlhIHRocmVlIG1lY2hhbmlzbXM6PC9wPgo8dWw+CjxsaT5tZXRhZGF0YSBwcm92aWRlZCBieSB0aGUgYXV0aG9yPC9saT4KPGxpPmRlZmF1bHQgbWV0YWRhdGEgZm9yIHRoZSBibG9nPC9saT4KPGxpPm1ldGFkYXRhIGF1dG9tYXRpY2FsbHkgZXh0cmFjdGVkIGZyb20gY29udGVudDwvbGk+CjwvdWw+CjxwPlRoZSBtZXRhZGF0YSBwcm92aWRlZCBieSB0aGUgYXV0aG9yIGFyZSB0aGUgdHlwaWNhbCBtZXRhZGF0YSBmb3IgYmxvZyBwb3N0cywgcHJvdmlkZWQgdmlhIDxhIGhyZWY9Imh0dHBzOi8vZ29odWdvLmlvL2NvbnRlbnQvZnJvbnQtbWF0dGVyLyI+WUFNTCBmcm9udCBtYXR0ZXI8L2E+IGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwb3N0OjwvcD4KPGRpdiBjbGFzcz0ic291cmNlQ29kZSI+PHByZSBjbGFzcz0ic291cmNlQ29kZSB5YW1sIj48Y29kZSBjbGFzcz0ic291cmNlQ29kZSB5YW1sIj48c3BhbiBjbGFzcz0ib3QiPi0tLTwvc3Bhbj4KPHNwYW4gY2xhc3M9ImZ1Ij5sYXlvdXQ6PC9zcGFuPiBwb3N0CjxzcGFuIGNsYXNzPSJmdSI+dGl0bGU6PC9zcGFuPiBFYXRpbmcgeW91ciBvd24gRG9nIEZvb2QKPHNwYW4gY2xhc3M9ImZ1Ij5hdXRob3I6PC9zcGFuPiBtZmVubmVyCjxzcGFuIGNsYXNzPSJmdSI+ZGF0ZTo8L3NwYW4+IDIwMTYtMTItMTkKPHNwYW4gY2xhc3M9ImZ1Ij50YWdzOjwvc3Bhbj4KPHNwYW4gY2xhc3M9Imt3Ij4tPC9zcGFuPiBkYXRhY2l0ZQo8c3BhbiBjbGFzcz0ia3ciPi08L3NwYW4+IGRvaQo8c3BhbiBjbGFzcz0ia3ciPi08L3NwYW4+IG1ldGFkYXRhCjxzcGFuIGNsYXNzPSJvdCI+LS0tPC9zcGFuPjwvY29kZT48L3ByZT48L2Rpdj4KPHA+V2UgY2FuIHJldXNlIGFsbCB0aGVzZSBtZXRhZGF0YSB3aGVuIGdlbmVyYXRpbmcgRGF0YUNpdGUgbWV0YWRhdGEsIHVzaW5nIHRoZSB0YWdzIGFzIDxjb2RlPnN1YmplY3RzPC9jb2RlPi48L3A+CjxwPlRoZSBkZWZhdWx0IG1ldGFkYXRhIGFyZSBtZXRhZGF0YSB0aGF0IGFsd2F5cyBzdGF5IHRoZSBzYW1lIGZvciB0aGUgYmxvZywgc3VjaCBhcyA8Y29kZT5wdWJsaXNoZXI8L2NvZGU+LCA8Y29kZT5Ib3N0aW5nSW5zdGl0dXRpb248L2NvZGU+IGFuZCA8Y29kZT5yaWdodHM8L2NvZGU+LiBXZSBjYW4gc3RvcmUgdGhlbSBpbiBhIHNpdGUtd2lkZSBjb25maWd1cmF0aW9uIGZpbGUuIFdlIGNhbiBhbHNvIGFzc3VtZSByZWFzb25hYmxlIGRlZmF1bHRzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIFlBTUwgZnJvbnQgbWF0dGVyLCBlLmcuIDxjb2RlPnJlc291cmNlVHlwZTwvY29kZT4gKHdlIHVzZSA8YSBocmVmPSJodHRwczovL3NjaGVtYS5vcmcvQmxvZ1Bvc3RpbmciPkJsb2dQb3N0aW5nPC9hPiB3aXRoIDxjb2RlPnJlc291cmNlVHlwZUdlbmVyYWw8L2NvZGU+IFRleHQpIGFuZCA8Y29kZT52ZXJzaW9uPC9jb2RlPi4gV2Ugc3RvcmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdXRob3JzIG91dHNpZGUgdGhlIGJsb2cgcG9zdCwgaW5jbHVkaW5nIDxjb2RlPmdpdmVuTmFtZTwvY29kZT4sIDxjb2RlPmZhbWlseU5hbWU8L2NvZGU+IGFuZCA8Y29kZT5uYW1lSWRlbnRpZmllcjwvY29kZT4gKHdlIG5vdyBzaG93IHRoZSBPUkNJRCBJRCBvZiBldmVyeSBibG9nIGF1dGhvciBhdCB0aGUgYm90dG9tIG9mIHRoZSBwb3N0KS48L3A+CjxwPkZpbmFsbHksIHRoZXJlIGFyZSBtZXRhZGF0YSB0aGF0IHdlIGNhbiBhdXRvbWF0aWNhbGx5IGV4dHJhY3QgZnJvbSB0aGUgYmxvZyBwb3N0LCBhbmQgd2UgYXJlIGN1cnJlbnRseSBkb2luZyB0aGlzIGZvciB0aGUgPGNvZGU+ZGVzY3JpcHRpb248L2NvZGU+IGFuZCA8Y29kZT5yZWxhdGVkSWRlbnRpZmllcjwvY29kZT4uIFRoaXMgYmxvZyB1c2VzIFBhbmRvYyBhbmQgQmliVGV4IHRvIGdlbmVyYXRlIHRoZSByZWZlcmVuY2VzIHNlY3Rpb24gYXQgdGhlIGVuZCwgYW5kIHdlIGNhbiBmZXRjaCB0aGlzIGluZm9ybWF0aW9uIGFuZCBjb252ZXJ0IGl0IGludG8gdGhlIGZvcm1hdCBuZWVkZWQgZm9yIDxjb2RlPnJlbGF0ZWRJZGVudGlmaWVyPC9jb2RlPi48L3A+CjxwPlRha2VuIHRvZ2V0aGVyIHdlIGNhbiBwcm92aWRlIGFsbCBtZXRhZGF0YSB0aGF0IGFyZSA8ZW0+cmVxdWlyZWQ8L2VtPiBvciA8ZW0+cmVjb21tZW5kZWQ8L2VtPiBpbiB0aGUgTWV0YWRhdGEgU2NoZW1hIGRvY3VtZW50YXRpb24gPHNwYW4gY2xhc3M9ImNpdGF0aW9uIj4oPGEgaHJlZj0iI3JlZi1odHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDEyIj4yMDE2PC9hPik8L3NwYW4+LCBhbmQgd2UgY2FuIGRvIHRoaXMgd2l0aG91dCBhbnkgZXh0cmEgZWZmb3J0IGZvciB0aGUgYXV0aG9yLiBUaGUgZnVsbCBYTUwgaXMgYXZhbGFpbGFibGUgPGEgaHJlZj0iaHR0cHM6Ly9kYXRhLmRhdGFjaXRlLm9yZy9jb250ZW50LXJlc29sdmVyL2FwcGxpY2F0aW9uL3gtZGF0YWNpdGUreG1sLzEwLjU0MzgvNEszTS1OWVZHIj5oZXJlPC9hPi48L3A+CjxwPk5vdCBhbGwgYmxvZyBwb3N0cyBuZWVkIHRvIGJlIGNpdGVkIGZvcm1hbGx5IHdpdGggbWV0YWRhdGEgaW4gYSA8ZW0+cmVmZXJlbmNlczwvZW0+IGxpc3QgZm9ybWF0dGVkIGFjY29yZGluZyB0byBhIHNwZWNpZmljIGNpdGF0aW9uIHN0eWxlLiBCdXQgdGhlc2UgbWV0YWRhdGEgZ3JlYXRseSBoZWxwIHdpdGggZGlzY292ZXJ5LCBhIHNlYXJjaCBpbiBEYXRhQ2l0ZSBTZWFyY2ggZm9yIDxhIGhyZWY9Imh0dHA6Ly9zZWFyY2guZGF0YWNpdGUub3JnL3dvcmtzP3F1ZXJ5PWVhdGluZytkb2crZm9vZCI+ZWF0aW5nIGRvZyBmb29kPC9hPiB3aWxsIGZvciBleGFtcGxlIGJyaW5nIHVwIHRoaXMgYmxvZyBwb3N0IGFzIHRoZSBmaXJzdCBoaXQuPC9wPgo8aDMgaWQ9InBlcnNpc3RlbnQtc3RvcmFnZSI+UGVyc2lzdGVudCBzdG9yYWdlPC9oMz4KPHA+VXNpbmcgRE9JcyBtZWFucyB0aGF0IHJlYWRlcnMgbm90IG9ubHkgZXhwZWN0IHJpY2ggbWV0YWRhdGEgdGhhdCBoZWxwIHdpdGggY2l0YXRpb24gYW5kIGRpc2NvdmVyeSwgYnV0IGFsc28gdGhhdCBEYXRhQ2l0ZSB0YWtlcyBleHRyYSBjYXJlIHRvIHByZXNlcnZlIHRoZSBibG9nIHBvc3RzLCB0aGlua2luZyBiZXlvbmQgdGhlIHBhcnRpY3VsYXIgdGVjaG5pY2FsIGltcGxlbWVudGF0aW9uIG9yIGV2ZW4gdGhlIGNvbnRpdWluZyBleGlzdGVuY2Ugb2YgdGhpcyBibG9nLiBUaGlzIGlzIGFuIGFyZWEgd2hlcmUgd2UgZG8gbmVlZCB0byBkbyBtb3JlIHdvcmssIHN0YXJ0aW5nIHdpdGggYSBkZWNpc2lvbiBhYm91dCB0aGUgYmVzdCBhcmNoaXZhbCBmb3JtYXQgZm9yIGEgYmxvZyBwb3N0IChIVE1MLCBQREYsIDxhIGhyZWY9Imh0dHBzOi8vamF0cy5ubG0ubmloLmdvdi8iPkpBVFM8L2E+PykuIEZvciBub3cgYmxvZyBwb3N0cyBhcmUgaG9zdGVkIGluIG11bHRpcGxlIEdpdCByZXBvc2l0b3JpZXMgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXRhY2l0ZS9ibG9nIj5vbmUgb2YgdGhlbSBvbiBHaXRodWI8L2E+KSwgYW5kIGluIHR3byBpbmRlcGVuZGVudCBBbWF6b24gUzMgYnVja2V0cyB0aGF0IGVhY2ggdXNlIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvblMzL2xhdGVzdC9kZXYvVmVyc2lvbmluZy5odG1sIj52ZXJzaW9uaW5nPC9hPi4gTXVsdGlwbGUgbG9jYXRpb25zIHdpdGggdmVyc2lvbmluZyBhcmUgYSBnb29kIHN0YXJ0LCBidXQgbW9yZSB3b3JrIGlzIGNsZWFybHkgbmVlZGVkLjwvcD4KPGgzIGlkPSJyZWZlcmVuY2VzIiBjbGFzcz0idW5udW1iZXJlZCI+UmVmZXJlbmNlczwvaDM+CjxkaXYgaWQ9InJlZnMiIGNsYXNzPSJyZWZlcmVuY2VzIj4KPGRpdiBpZD0icmVmLWh0dHBzOi8vZG9pLm9yZy8xMC41NDM4LzAwMTIiPgo8cD5EYXRhQ2l0ZSBNZXRhZGF0YSBXb3JraW5nIEdyb3VwLiAoMjAxNikuIERhdGFDaXRlIE1ldGFkYXRhIFNjaGVtYSBmb3IgdGhlIFB1YmxpY2F0aW9uIGFuZCBDaXRhdGlvbiBvZiBSZXNlYXJjaCBEYXRhIHY0LjAuIDxlbT5EYXRhQ2l0ZTwvZW0+LiA8YSBocmVmPSJodHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDEyIiBjbGFzcz0idXJpIj5odHRwczovL2RvaS5vcmcvMTAuNTQzOC8wMDEyPC9hPjwvcD4KPC9kaXY+CjxkaXYgaWQ9InJlZi1odHRwczovL2RvaS5vcmcvMTAuNTQzOC81NUU1LVQ1QzAiPgo8cD5GZW5uZXIsIE0uICgyMDE2KS4gQ29vbCBET0nigJlzLiA8ZW0+RGF0YUNpdGU8L2VtPi4gPGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvNTVFNS1UNUMwIiBjbGFzcz0idXJpIj5odHRwczovL2RvaS5vcmcvMTAuNTQzOC81NUU1LVQ1QzA8L2E+PC9wPgo8L2Rpdj4KPC9kaXY+CgogICAgICAgICAgICA8aHIgd2lkdGg9IjgwJSI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTUgY29sLW1kLW9mZnNldC0yIHBvc3QtY29udGVudCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJvdHRvbS10ZWFzZXIgY2YiPgogIDxkaXYgY2xhc3M9ImlzTGVmdCI+CiAgICA8c2VjdGlvbiBjbGFzcz0iYXV0aG9yIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImF1dGhvci1pbWFnZSIgc3R5bGU9ImJhY2tncm91bmQtaW1hZ2U6IHVybChodHRwczovL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLzQzNDU5MmEwOTdlOTEyNjE3OTJlYmQ2YjQ5MjA0MmJjP3M9MjUwJmQ9bW0mcj14KSI+QmxvZyBMb2dvPC9kaXY+CiAgICAgICAgPGg0Pk1hcnRpbiBGZW5uZXI8L2g0PgogICAgICAgIDxwIGNsYXNzPSJiaW8iPkRhdGFDaXRlIFRlY2huaWNhbCBEaXJlY3RvcjwvcD4KICAgICAgICA8cCBjbGFzcz0ib3JjaWQiPjxhIGhyZWY9Imh0dHA6Ly9vcmNpZC5vcmcvMDAwMC0wMDAzLTE0MTktMjQwNSI+aHR0cDovL29yY2lkLm9yZy8wMDAwLTAwMDMtMTQxOS0yNDA1PC9hPjwvcD4KICAgICAgICA8ZGl2IGNsYXNzPSJjbGVhcmZpeCI+PC9kaXY+CiAgICAgIDxoND5FYXRpbmcgeW91ciBvd24gRG9nIEZvb2Q8L2g0PgogICAgICAgIDxwIGNsYXNzPSJwdWJsaXNoZWQiPjxhIGhyZWY9Imh0dHBzOi8vZG9pLm9yZy8xMC41NDM4LzRLM00tTllWRyI+aHR0cHM6Ly9kb2kub3JnLzEwLjU0MzgvNEszTS1OWVZHPC9hPgogICAgICA8cCBjbGFzcz0icHVibGlzaGVkIj48aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXIiPjwvaT4gPHRpbWUgZGF0ZXRpbWU9IjIwMTYtMTItMjAgMDA6MDAiPkRlY2VtYmVyIDIwLCAyMDE2PC90aW1lPjwvcD4KICAgICAgPHAgY2xhc3M9InB1Ymxpc2hlZCI+PGkgY2xhc3M9ImZhIGZhLWhpc3RvcnkiPjwvaT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhdGFjaXRlL2Jsb2cvY29tbWl0cy9tYXN0ZXIvc291cmNlL3Bvc3RzL2VhdGluZy15b3VyLW93bi1kb2ctZm9vZC5odG1sLm1kIj5IaXN0b3J5PC9hPjwvcD4KICAgICAgPHAgY2xhc3M9InB1Ymxpc2hlZCI+wqkgMjAxNiBNYXJ0aW4gRmVubmVyLiBEaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIDxhIGhyZWY9Imh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS80LjAvIj5DcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIGxpY2Vuc2U8L2E+LjwvcD4KICAgICAgPHAgY2xhc3M9InB1Ymxpc2hlZCI+CiAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXRhZ3MiPjwvaT4KICAgICAgICA8YSBocmVmPSIvaW5kZXguaHRtbD90YWc9ZGF0YWNpdGUiPmRhdGFjaXRlPC9hPiwgPGEgaHJlZj0iL2luZGV4Lmh0bWw/dGFnPWRvaSI+ZG9pPC9hPiwgPGEgaHJlZj0iL2luZGV4Lmh0bWw/dGFnPW1ldGFkYXRhIj5tZXRhZGF0YTwvYT4sIDxhIGhyZWY9Ii9pbmRleC5odG1sP3RhZz1mZWF0dXJlZCI+ZmVhdHVyZWQ8L2E+CiAgICAgIDwvcD4KICAgIDwvc2VjdGlvbj4KICA8L2Rpdj4KPC9kaXY+CgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMiBjb2wtbWQtb2Zmc2V0LTEiPgogICAgICAgICAgICAgPGRpdiBjbGFzcz0iYm90dG9tLXRlYXNlciBjZiI+CiAgPGRpdiBjbGFzcz0iaXNMZWZ0Ij4KICAgIDxoNSBjbGFzcz0iaW5kZXgtaGVhZGxpbmUgZmVhdHVyZWQiPjxzcGFuPlNoYXJlIG9uPC9zcGFuPjwvaDU+CiAgICAgIDxhIGNsYXNzPSJpY29uLXR3aXR0ZXIiIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9zaGFyZT90ZXh0PU9uIHRoZSBAZGF0YWNpdGUgYmxvZzogRWF0aW5nIHlvdXIgb3duIERvZyBGb29kJmFtcDt1cmw9aHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZy9lYXRpbmcteW91ci1vd24tZG9nLWZvb2QvIgogICAgICAgIG9uY2xpY2s9IndpbmRvdy5vcGVuKHRoaXMuaHJlZiwgJ3R3aXR0ZXItc2hhcmUnLCAnd2lkdGg9NTUwLGhlaWdodD0yNTUnKTtyZXR1cm4gZmFsc2U7Ij4KICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdHdpdHRlciBmYS0yeCI+PC9pPjxzcGFuIGNsYXNzPSJoaWRkZW4iPnR3aXR0ZXI8L3NwYW4+CiAgICAgIDwvYT4KICAgICAgPGEgY2xhc3M9Imljb24tZmFjZWJvb2siIGhyZWY9Imh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIucGhwP3Q9T24gdGhlIEBkYXRhY2l0ZSBibG9nOiBFYXRpbmcgeW91ciBvd24gRG9nIEZvb2QmYW1wO3U9aHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZy9lYXRpbmcteW91ci1vd24tZG9nLWZvb2QvIgogICAgICAgIG9uY2xpY2s9IndpbmRvdy5vcGVuKHRoaXMuaHJlZiwgJ2ZhY2Vib29rLXNoYXJlJywgJ3dpZHRoPTU1MCxoZWlnaHQ9MjU1Jyk7cmV0dXJuIGZhbHNlOyI+CiAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWZhY2Vib29rIGZhLTJ4Ij48L2k+PHNwYW4gY2xhc3M9ImhpZGRlbiI+ZmFjZWJvb2s8L3NwYW4+CiAgICAgIDwvYT4KICA8L2Rpdj4KPC9kaXY+CgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtOCBjb2wtbWQtb2Zmc2V0LTIgcG9zdC1jb250ZW50Ij4KICAgICAgICAgICAgICA8ZGl2IGlkPSJkaXNxdXNfdGhyZWFkIj48L2Rpdj4KPHNjcmlwdD4KICAgIHZhciBkaXNxdXNfY29uZmlnID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMucGFnZS51cmwgPSAnaHR0cHM6Ly9ibG9nLmRhdGFjaXRlLm9yZy9lYXRpbmcteW91ci1vd24tZG9nLWZvb2QvJzsKICAgICAgICB0aGlzLnBhZ2UuaWRlbnRpZmllciA9ICdodHRwczovL2RvaS5vcmcvMTAuNTQzOC80SzNNLU5ZVkcnOwogICAgfTsKICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZCA9IGRvY3VtZW50LCBzID0gZC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKCiAgICAgICAgcy5zcmMgPSAnLy9kYXRhY2l0ZS5kaXNxdXMuY29tL2VtYmVkLmpzJzsgIC8vCgogICAgICAgIHMuc2V0QXR0cmlidXRlKCdkYXRhLXRpbWVzdGFtcCcsICtuZXcgRGF0ZSgpKTsKICAgICAgICAoZC5oZWFkIHx8IGQuYm9keSkuYXBwZW5kQ2hpbGQocyk7CiAgICB9KSgpOwo8L3NjcmlwdD4KPG5vc2NyaXB0PlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCB0byB2aWV3IHRoZSA8YSBocmVmPSJodHRwczovL2Rpc3F1cy5jb20vP3JlZl9ub3NjcmlwdCIgcmVsPSJub2ZvbGxvdyI+Y29tbWVudHMgcG93ZXJlZCBieSBEaXNxdXMuPC9hPjwvbm9zY3JpcHQ+CgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2PgogICAgPGZvb3RlciBjbGFzcz0ncm93IGZvb3Rlcic+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+CiAgICAgICAgPGRpdiBjbGFzcz0nY29sLW1kLTMgY29sLXNtLTQnPgogICAgICAgICAgPGg0PkFib3V0IERhdGFDaXRlPC9oND4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9taXNzaW9uLmh0bWwiPldoYXQgd2UgZG88L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9ib2FyZC5odG1sIj5Cb2FyZDwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3N0ZWVyaW5nLmh0bWwiPlN0ZWVyaW5nIGdyb3VwczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3N0YWZmLmh0bWwiPlN0YWZmPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvam9ib3Bwb3J0dW5pdGllcy5odG1sIj5Kb2Igb3Bwb3J0dW5pdGllczwvYT48L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtbWQtMyBjb2wtc20tNCc+CiAgICAgICAgICA8aDQ+U2VydmljZXM8L2g0PgogICAgICAgICAgPHVsPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL2RvaXMuaHRtbCI+QXNzaWduIERPSXM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9zZWFyY2guaHRtbCI+TWV0YWRhdGEgc2VhcmNoPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvZXZlbnRkYXRhLmh0bWwiPkV2ZW50IGRhdGE8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9wcm9maWxlcy5odG1sIj5Qcm9maWxlczwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3JlM2RhdGEuaHRtbCI+cmUzZGF0YTwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL2NpdGF0aW9uLmh0bWwiPkNpdGF0aW9uIGZvcm1hdHRlcjwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3N0YXRzLmh0bWwiPlN0YXRpc3RpY3M8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9jb250ZW50Lmh0bWwiPkNvbnRlbnQgbmVnb3RpYXRpb248L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9vYWlwbWguaHRtbCI+T0FJLVBNSDwvYT48L2xpPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuZGF0YWNpdGUub3JnL3Rlc3QuaHRtbCI+VGVzdCBlbnZpcm9ubWVudDwvYT48L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtbWQtMyBjb2wtc20tNCc+CiAgICAgICAgICA8aDQ+UmVzb3VyY2VzPC9oND4KICAgICAgICAgIDx1bD4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc2NoZW1hLmRhdGFjaXRlLm9yZyI+TWV0YWRhdGEgc2NoZW1hPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3N1cHBvcnQuZGF0YWNpdGUub3JnIj5TdXBwb3J0PC9hPjwvbGk+CiAgICAgICAgICA8L3VsPgogICAgICAgICAgPGg0PkNvbW11bml0eTwvaDQ+CiAgICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvbWVtYmVycy5odG1sIj5NZW1iZXJzPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvcGFydG5lcnMuaHRtbCI+UGFydG5lcnM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9zdGVlcmluZy5odG1sIj5TdGVlcmluZyBncm91cHM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9ldmVudHMuaHRtbCI+RXZlbnRzPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvcm9hZG1hcC5odG1sIj5Sb2FkbWFwPC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvdXNlci1zdG9yaWVzLmh0bWwiPlVzZXIgU3RvcmllczwvYT48L2xpPgogICAgICAgICAgPC91bD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSdjb2wtbWQtMyc+CiAgICAgICAgICA8aDQgY2xhc3M9InNoYXJlIj5Db250YWN0IHVzPC9oND4KICAgICAgICAgIDxhIGhyZWY9J21haWx0bzpzdXBwb3J0QGRhdGFjaXRlLm9yZycgY2xhc3M9InNoYXJlIj4KICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWF0Jz48L2k+CiAgICAgICAgICA8L2E+CiAgICAgICAgICA8YSBocmVmPSdodHRwczovL2Jsb2cuZGF0YWNpdGUub3JnL2ZlZWQueG1sJyBjbGFzcz0ic2hhcmUiPgogICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtcnNzJz48L2k+CiAgICAgICAgICA8L2E+CiAgICAgICAgICA8YSBocmVmPSdodHRwczovL3R3aXR0ZXIuY29tL2RhdGFjaXRlJyBjbGFzcz0ic2hhcmUiPgogICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtdHdpdHRlcic+PC9pPgogICAgICAgICAgPC9hPgogICAgICAgICAgPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2RhdGFjaXRlL2RhdGFjaXRlJyBjbGFzcz0ic2hhcmUiPgogICAgICAgICAgICA8aSBjbGFzcz0nZmEgZmEtZ2l0aHViJz48L2k+CiAgICAgICAgICA8L2E+CiAgICAgICAgICA8YSBocmVmPSdodHRwczovL3d3dy5saW5rZWRpbi5jb20vY29tcGFueS9kYXRhY2l0ZScgY2xhc3M9InNoYXJlIj4KICAgICAgICAgICAgPGkgY2xhc3M9J2ZhIGZhLWxpbmtlZGluJz48L2k+CiAgICAgICAgICA8L2E+CiAgICAgICAgICA8dWw+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvdGVybXMuaHRtbCI+VGVybXMgYW5kIGNvbmRpdGlvbnM8L2E+PC9saT4KICAgICAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmRhdGFjaXRlLm9yZy9wcml2YWN5Lmh0bWwiPlByaXZhY3kgcG9saWN5PC9hPjwvbGk+CiAgICAgICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5kYXRhY2l0ZS5vcmcvYWNrbm93bGVkZ21lbnRzLmh0bWwiPkFja25vd2xlZGdlbWVudHM8L2E+PC9saT4KICAgICAgICAgIDwvdWw+CiAgICAgICAgICA8YSBocmVmPSJodHRwOi8vc3RhdHVzLmRhdGFjaXRlLm9yZyIgdGFyZ2V0PSJfYmxhbmsiPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItZG90Ij48L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1kZXNjcmlwdGlvbiI+PC9zcGFuPgogICAgICAgICAgPC9hPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZm9vdGVyPgogICAgPHNjcmlwdCBzcmM9Ii8vY29kZS5qcXVlcnkuY29tL2pxdWVyeS0yLjEuNC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii8vbWF4Y2RuLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMy42L2pzL2Jvb3RzdHJhcC5taW4uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii8vY2RuLnN0YXR1c3BhZ2UuaW8vc2UtdjIuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vYXNzZXRzLmRhdGFjaXRlLm9yZy9qYXZhc2NyaXB0cy9kZWZhdWx0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvcmVhZGluZ1RpbWUubWluLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvaW5kZXguanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9zZWFyY2guanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBpZD0iZHNxLWNvdW50LXNjciIgc3JjPSIvL2RhdGFjaXRlLmRpc3F1cy5jb20vY291bnQuanMiIGFzeW5jPjwvc2NyaXB0PgogICAgPHNjcmlwdD4KICAgICAgKGZ1bmN0aW9uKGkscyxvLGcscixhLG0pe2lbJ0dvb2dsZUFuYWx5dGljc09iamVjdCddPXI7aVtyXT1pW3JdfHxmdW5jdGlvbigpewogICAgICAoaVtyXS5xPWlbcl0ucXx8W10pLnB1c2goYXJndW1lbnRzKX0saVtyXS5sPTEqbmV3IERhdGUoKTthPXMuY3JlYXRlRWxlbWVudChvKSwKICAgICAgbT1zLmdldEVsZW1lbnRzQnlUYWdOYW1lKG8pWzBdO2EuYXN5bmM9MTthLnNyYz1nO20ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYSxtKQogICAgICB9KSh3aW5kb3csZG9jdW1lbnQsJ3NjcmlwdCcsJy8vd3d3Lmdvb2dsZS1hbmFseXRpY3MuY29tL2FuYWx5dGljcy5qcycsJ2dhJyk7CgogICAgICBnYSgnY3JlYXRlJywgJ1VBLTIyODA2MTk2LTYnLCAnYXV0bycpOwogICAgICBnYSgnc2VuZCcsICdwYWdldmlldycpOwogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
119
+ http_version:
120
+ recorded_at: Sat, 22 Jul 2017 07:18:21 GMT
121
+ recorded_with: VCR 3.0.3
data/spec/spec_helper.rb CHANGED
@@ -85,7 +85,7 @@ VCR.configure do |c|
85
85
  c.cassette_library_dir = "spec/fixtures/vcr_cassettes"
86
86
  c.hook_into :webmock
87
87
  c.ignore_localhost = true
88
- c.ignore_hosts 'codeclimate.com'
88
+ c.ignore_hosts 'codeclimate.com', 'mds.test.datacite.org'
89
89
  c.filter_sensitive_data("<MDS_TOKEN>") { mds_token }
90
90
  c.configure_rspec_metadata!
91
91
  end
data/spec/utils_spec.rb CHANGED
@@ -20,14 +20,14 @@ describe Cirneco::DataCenter, vcr: true, :order => :defined do
20
20
  it 'should get all dois by prefix' do
21
21
  response = subject.get_dois_by_prefix(prefix, options)
22
22
  dois = response.body["data"]
23
- expect(dois.length).to eq(76)
24
- expect(dois.first).to eq("10.5072/0000-00SS")
23
+ expect(dois.length).to eq(437)
24
+ expect(dois.first).to eq("10.5438/0000-00SS")
25
25
  end
26
26
  end
27
27
 
28
28
  context "base32" do
29
29
  it 'should decode doi' do
30
- doi = "10.5072/0000-03WD"
30
+ doi = "10.5438/0000-03WD"
31
31
  expect(subject.decode_doi(doi)).to eq(124)
32
32
  end
33
33
 
@@ -38,16 +38,16 @@ describe Cirneco::DataCenter, vcr: true, :order => :defined do
38
38
 
39
39
  it 'should encode doi' do
40
40
  number = 123
41
- expect(subject.encode_doi(prefix, number: number)).to eq("10.5072/0000-03VC")
41
+ expect(subject.encode_doi(prefix, number: number)).to eq("10.5438/0000-03VC")
42
42
  end
43
43
 
44
44
  it 'should encode doi number with other characters' do
45
45
  number = "MS-123"
46
- expect(subject.encode_doi(prefix, number: number)).to eq("10.5072/0000-03VC")
46
+ expect(subject.encode_doi(prefix, number: number)).to eq("10.5438/0000-03VC")
47
47
  end
48
48
 
49
49
  it 'should encode doi random number' do
50
- expect(subject.encode_doi(prefix)).to start_with("10.5072")
50
+ expect(subject.encode_doi(prefix)).to start_with("10.5438")
51
51
  end
52
52
  end
53
53
 
@@ -120,78 +120,65 @@ describe Cirneco::DataCenter, vcr: true, :order => :defined do
120
120
  it 'should mint for url' do
121
121
  filepath = fixture_path + 'cool-dois/index.html'
122
122
  response = subject.mint_doi_for_url(filepath, options)
123
- expect(response).to eq("DOI 10.5072/0000-03VC minted for cool-dois.html.md")
123
+ expect(response).to eq("DOI 10.5438/0000-03VC minted for cool-dois.html.md")
124
124
  end
125
125
 
126
126
  it 'should hide for url' do
127
- filepath = fixture_path + 'cool-dois-minted.html'
127
+ filepath = fixture_path + 'cool-dois-minted/index.html'
128
128
  response = subject.hide_doi_for_url(filepath, options)
129
- expect(response).to eq("DOI 10.5072/0000-03WD hidden for cool-dois-minted.html.md")
129
+ expect(response).to eq("DOI 10.5438/55E5-T5C0 hidden for cool-dois-minted.html.md")
130
130
  end
131
131
 
132
132
  it 'should mint and hide for url' do
133
133
  filepath = fixture_path + 'cool-dois/index.html'
134
134
  response = subject.mint_and_hide_doi_for_url(filepath, options)
135
- expect(response).to eq("DOI 10.5072/0000-03VC minted and hidden for cool-dois.html.md")
135
+ expect(response).to eq("DOI 10.5438/0000-03VC minted and hidden for cool-dois.html.md")
136
136
  end
137
137
 
138
138
  it 'should mint for all urls' do
139
139
  filepath = fixture_path + 'index.html'
140
140
  response = subject.mint_dois_for_all_urls(filepath, options)
141
- expect(response).to eq("DOI 10.5072/0000-03VC minted for cool-dois.html.md\nDOI 10.5072/0000-00SS minted for index.html.erb")
141
+ expect(response).to eq("DOI 10.5438/0000-03VC minted for cool-dois.html.md\nDOI 10.5438/0000-00SS minted for index.html.erb")
142
142
  end
143
143
 
144
144
  it 'should hide for all urls' do
145
145
  filepath = fixture_path + 'index-minted.html'
146
146
  response = subject.hide_dois_for_all_urls(filepath, options)
147
- expect(response).to eq("No DOI for cool-dois.html.md\nErrors for DOI 10.5072/0000-NW90: Not found\n")
147
+ expect(response).to eq("No DOI for cool-dois.html.md\nErrors for DOI 10.5438/0000-NW90: Not found\n")
148
148
  end
149
149
 
150
150
  it 'should mint and hide for all urls' do
151
151
  filepath = fixture_path + 'index.html'
152
152
  response = subject.mint_and_hide_dois_for_all_urls(filepath, options)
153
- expect(response).to eq("DOI 10.5072/0000-03VC minted and hidden for cool-dois.html.md\nDOI 10.5072/0000-00SS minted and hidden for index.html.erb")
153
+ expect(response).to eq("DOI 10.5438/0000-03VC minted and hidden for cool-dois.html.md\nDOI 10.5438/0000-00SS minted and hidden for index.html.erb")
154
154
  end
155
155
 
156
- it 'should generate metadata for work' do
156
+ it 'should get_json_ld_from_work' do
157
157
  filepath = fixture_path + 'cool-dois/index.html'
158
- metadata = subject.generate_metadata_for_work(filepath)
158
+ json = subject.get_json_ld_from_work(filepath)
159
+ metadata = JSON.parse(json)
159
160
  expect(metadata["url"]).to eq("https://blog.datacite.org/cool-dois/")
160
- expect(metadata["creators"]).to eq([{:given_name=>"Martin", :family_name=>"Fenner", :orcid=>"0000-0003-1419-2405"}])
161
- expect(metadata["descriptions"]).to eq([{:value=>"In 1998 Tim Berners-Lee coined the term cool URIs (1998), that is URIs that don’t change. We know that URLs referenced in the scholarly literature are often not cool, leading to link rot (Klein et al., 2014) and making it hard or impossible to find...",:description_type=>"Abstract"}])
162
- expect(metadata["related_identifiers"]).to eq([{:value=>"https://www.w3.org/Provider/Style/URI",
163
- :related_identifier_type=>"URL",
164
- :relation_type=>"References"},
165
- { :value=>"10.1371/JOURNAL.PONE.0115253",
166
- :related_identifier_type=>"DOI",
167
- :relation_type=>"References" },
168
- { :value=>"https://blog.datacite.org/",
169
- :related_identifier_type=>"URL",
170
- :relation_type=>"IsPartOf"}])
171
- end
172
-
173
- it 'should generate metadata for work no JSON-LD' do
174
- filepath = fixture_path + 'cool-dois-no-json-ld/index.html'
175
- expect(subject.generate_metadata_for_work(filepath)).to eq("error"=>"Error: no schema.org metadata found")
176
- end
177
-
178
- it 'should generate metadata for work missing required metadata' do
179
- filepath = fixture_path + 'cool-dois-missing-metadata/index.html'
180
- expect(subject.generate_metadata_for_work(filepath)).to eq("error"=>"Error: required metadata missing")
161
+ expect(metadata["author"]).to eq([{"@type"=>"Person", "@id"=>"http://orcid.org/0000-0003-1419-2405", "givenName"=>"Martin", "familyName"=>"Fenner", "name"=>"Martin Fenner"}])
162
+ expect(metadata["description"]).to eq("In 1998 Tim Berners-Lee coined the term cool URIs (1998), that is URIs that don’t change. We know that URLs referenced in the scholarly literature are often not cool, leading to link rot (Klein et al., 2014) and making it hard or impossible to find...")
163
+ expect(metadata["citation"]).to eq([{"@type"=>"CreativeWork",
164
+ "@id"=>"https://www.w3.org/Provider/Style/URI"},
165
+ {"@type"=>"CreativeWork",
166
+ "@id"=>"https://doi.org/10.1371/journal.pone.0115253"}])
167
+ expect(metadata["isPartOf"]).to eq("@type"=>"Blog", "@id"=>"https://blog.datacite.org", "name"=>"DataCite Blog")
181
168
  end
182
169
 
183
170
  it 'should post_metadata_for_work' do
184
171
  filepath = fixture_path + 'cool-dois/index.html'
185
- metadata = subject.generate_metadata_for_work(filepath)
186
- response = subject.post_metadata_for_work(metadata, options)
172
+ json = subject.get_json_ld_from_work(filepath)
173
+ response = subject.post_metadata_for_work(json, options)
187
174
  expect(response.body["data"]).to eq("OK")
188
- expect(response.status).to eq(200)
175
+ expect(response.status).to eq(201)
189
176
  end
190
177
 
191
178
  it 'should hide_metadata_for_work' do
192
179
  filepath = fixture_path + 'cool-dois/index.html'
193
- metadata = subject.generate_metadata_for_work(filepath)
194
- response = subject.hide_metadata_for_work(metadata, options)
180
+ json = subject.get_json_ld_from_work(filepath)
181
+ response = subject.hide_metadata_for_work(json, options)
195
182
  expect(response.body["data"]).to eq("OK")
196
183
  expect(response.status).to eq(200)
197
184
  end
data/spec/work_spec.rb CHANGED
@@ -1,58 +1,48 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Cirneco::Work, vcr: true do
4
- let(:doi) { "10.5072/0000-03VC" }
5
- let(:url) { "http://www.datacite.org" }
6
- let(:creators) { [{ given_name: "Elizabeth", family_name: "Miller", orcid: "0000-0001-5000-0007" }] }
7
- let(:title) { "Full DataCite XML Example" }
8
- let(:publisher) { "DataCite" }
9
- let(:publication_year) { 2014 }
10
- let(:resource_type) { { value: "XML", resource_type_general: "Software" } }
11
- let(:subjects) { ["000 computer science"] }
12
- let(:descriptions) { [{ value: "XML example of all DataCite Metadata Schema v4.0 properties.", description_type: "Abstract" }] }
13
- let(:rights_list) { [{ value: "CC0 1.0 Universal", rights_uri: "http://creativecommons.org/publicdomain/zero/1.0/" }] }
14
- let(:media) { [{ mime_type: "application/pdf", url:"http://www.datacite.org/cirneco-test.pdf" }]}
15
- let(:metadata) { { "doi" => doi,
16
- "url" => url,
17
- "creators" => creators,
18
- "title" => title,
19
- "publisher" => publisher,
20
- "publication_year" => publication_year,
21
- "resource_type" => resource_type,
22
- "subjects" => subjects,
23
- "descriptions" => descriptions,
24
- "rights_list" => rights_list,
25
- "media" => media } }
4
+ let(:input) { "https://blog.datacite.org/eating-your-own-dog-food/" }
5
+ let(:media) { [{ mime_type: "application/pdf", url: "http://www.datacite.org/cirneco-test.pdf" }] }
26
6
  let(:username) { ENV['MDS_USERNAME'] }
27
7
  let(:password) { ENV['MDS_PASSWORD'] }
28
8
  let(:fixture_path) { "spec/fixtures/" }
29
9
  let(:samples_path) { "resources/kernel-4.0/samples/" }
30
10
 
31
- subject { Cirneco::Work.new(metadata) }
11
+ subject { Cirneco::Work.new(input: input, from: "schema_org", media: media) }
32
12
 
33
13
  describe 'schema' do
34
- it 'validates example full' do
35
- validation_errors = subject.schema.validate(samples_path + 'datacite-example-full-v4.0.xml').map { |error| error.to_s }
36
- expect(validation_errors).to be_empty
37
- end
38
-
39
- it 'exists' do
40
- expect(subject.schema.errors).to be_empty
41
- end
42
-
43
- it 'validates data' do
44
- expect(subject.validation_errors.body["errors"]).to be_empty
45
- end
46
-
47
- it 'validates work without resource_type_general with errors' do
48
- subject.resource_type[:resource_type_general] = nil
49
- expect(subject.validation_errors.body["errors"]).to eq([{"title"=>"Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': [facet 'enumeration'] The value '' is not an element of the set {'Audiovisual', 'Collection', 'Dataset', 'Event', 'Image', 'InteractiveResource', 'Model', 'PhysicalObject', 'Service', 'Software', 'Sound', 'Text', 'Workflow', 'Other'}."}, {"title"=>"Element '{http://datacite.org/schema/kernel-4}resourceType', attribute 'resourceTypeGeneral': '' is not a valid value of the atomic type '{http://datacite.org/schema/kernel-4}resourceType'."}])
14
+ it "BlogPosting" do
15
+ expect(subject.valid?).to be true
16
+ expect(subject.id).to eq("https://doi.org/10.5438/4k3m-nyvg")
17
+ expect(subject.url).to eq("https://blog.datacite.org/eating-your-own-dog-food")
18
+ expect(subject.type).to eq("BlogPosting")
19
+ expect(subject.author).to eq("type"=>"Person", "id"=>"http://orcid.org/0000-0003-1419-2405", "name"=>"Martin Fenner", "givenName"=>"Martin", "familyName"=>"Fenner")
20
+ expect(subject.title).to eq("Eating your own Dog Food")
21
+ expect(subject.alternate_name).to eq("MS-49-3632-5083")
22
+ expect(subject.description["text"]).to start_with("Eating your own dog food")
23
+ expect(subject.keywords).to eq(["datacite", "doi", "metadata", "featured"])
24
+ expect(subject.date_published).to eq("2016-12-20")
25
+ expect(subject.date_modified).to eq("2016-12-20")
26
+ expect(subject.is_part_of).to eq("id"=>"https://doi.org/10.5438/0000-00ss", "type"=>"Blog", "title"=>"DataCite Blog")
27
+ expect(subject.references).to eq([{"id"=>"https://doi.org/10.5438/0012", "type"=>"CreativeWork"}, {"id"=>"https://doi.org/10.5438/55e5-t5c0", "type"=>"CreativeWork"}])
28
+ expect(subject.publisher).to eq("DataCite")
50
29
  end
51
30
 
52
- it 'validates work without title with errors' do
53
- subject.title = nil
54
- expect(subject.validation_errors.body["errors"]).to eq([{"title"=>"Element '{http://datacite.org/schema/kernel-4}title': [facet 'minLength'] The value has a length of '0'; this underruns the allowed minimum length of '1'."},
55
- {"title"=>"Element '{http://datacite.org/schema/kernel-4}title': '' is not a valid value of the atomic type '{http://datacite.org/schema/kernel-4}nonemptycontentStringType'."}])
31
+ it 'validates example full' do
32
+ input = samples_path + 'datacite-example-full-v4.0.xml'
33
+ subject = Cirneco::Work.new(input: input, from: "datacite")
34
+
35
+ expect(subject.valid?).to be true
36
+ expect(subject.id).to eq("https://doi.org/10.5072/example-full")
37
+ expect(subject.type).to eq("SoftwareSourceCode")
38
+ expect(subject.author).to eq("type"=>"Person", "id"=>"https://orcid.org/0000-0001-5000-0007", "name"=>"Miller, Elizabeth", "givenName"=>"Elizabeth", "familyName"=>"Miller")
39
+ expect(subject.title).to eq([{"lang"=>"en-us", "text"=>"Full DataCite XML Example"}, {"title_type"=>"Subtitle", "lang"=>"en-us", "text"=>"Demonstration of DataCite Properties."}])
40
+ expect(subject.alternate_name).to eq("type"=>"URL", "name"=>"http://schema.datacite.org/schema/meta/kernel-3.1/example/datacite-example-full-v3.1.xml")
41
+ expect(subject.description["text"]).to start_with("XML example of all DataCite Metadata Schema v4.0 properties.")
42
+ expect(subject.keywords).to eq([{"subject_scheme"=>"dewey", "scheme_uri"=>"http://dewey.info/", "text"=>"000 computer science"}])
43
+ expect(subject.date_published).to eq("2014")
44
+ expect(subject.date_modified).to eq("2014-10-17")
45
+ expect(subject.publisher).to eq("DataCite")
56
46
  end
57
47
  end
58
48
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cirneco
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.12
4
+ version: 0.9.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Martin Fenner
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-02-06 00:00:00.000000000 Z
11
+ date: 2017-07-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: maremma
@@ -16,14 +16,20 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 3.1.2
19
+ version: '3.5'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 3.5.7
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
27
  - - "~>"
25
28
  - !ruby/object:Gem::Version
26
- version: 3.1.2
29
+ version: '3.5'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 3.5.7
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: bergamasco
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +44,20 @@ dependencies:
38
44
  - - "~>"
39
45
  - !ruby/object:Gem::Version
40
46
  version: '0.3'
47
+ - !ruby/object:Gem::Dependency
48
+ name: bolognese
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.9.32
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.9.32
41
61
  - !ruby/object:Gem::Dependency
42
62
  name: base32-crockford-checksum
43
63
  requirement: !ruby/object:Gem::Requirement
@@ -96,22 +116,22 @@ dependencies:
96
116
  name: activesupport
97
117
  requirement: !ruby/object:Gem::Requirement
98
118
  requirements:
99
- - - "~>"
100
- - !ruby/object:Gem::Version
101
- version: '4.2'
102
119
  - - ">="
103
120
  - !ruby/object:Gem::Version
104
121
  version: 4.2.5
122
+ - - "<"
123
+ - !ruby/object:Gem::Version
124
+ version: '6'
105
125
  type: :runtime
106
126
  prerelease: false
107
127
  version_requirements: !ruby/object:Gem::Requirement
108
128
  requirements:
109
- - - "~>"
110
- - !ruby/object:Gem::Version
111
- version: '4.2'
112
129
  - - ">="
113
130
  - !ruby/object:Gem::Version
114
131
  version: 4.2.5
132
+ - - "<"
133
+ - !ruby/object:Gem::Version
134
+ version: '6'
115
135
  - !ruby/object:Gem::Dependency
116
136
  name: dotenv
117
137
  requirement: !ruby/object:Gem::Requirement
@@ -242,20 +262,20 @@ dependencies:
242
262
  requirements:
243
263
  - - "~>"
244
264
  - !ruby/object:Gem::Version
245
- version: '1.22'
265
+ version: '3.0'
246
266
  - - ">="
247
267
  - !ruby/object:Gem::Version
248
- version: 1.22.3
268
+ version: 3.0.1
249
269
  type: :development
250
270
  prerelease: false
251
271
  version_requirements: !ruby/object:Gem::Requirement
252
272
  requirements:
253
273
  - - "~>"
254
274
  - !ruby/object:Gem::Version
255
- version: '1.22'
275
+ version: '3.0'
256
276
  - - ">="
257
277
  - !ruby/object:Gem::Version
258
- version: 1.22.3
278
+ version: 3.0.1
259
279
  - !ruby/object:Gem::Dependency
260
280
  name: codeclimate-test-reporter
261
281
  requirement: !ruby/object:Gem::Requirement
@@ -282,14 +302,14 @@ dependencies:
282
302
  requirements:
283
303
  - - "~>"
284
304
  - !ruby/object:Gem::Version
285
- version: 0.12.0
305
+ version: 0.14.1
286
306
  type: :development
287
307
  prerelease: false
288
308
  version_requirements: !ruby/object:Gem::Requirement
289
309
  requirements:
290
310
  - - "~>"
291
311
  - !ruby/object:Gem::Version
292
- version: 0.12.0
312
+ version: 0.14.1
293
313
  description: Ruby client library for the DataCite Metadata Store (MDS) API.
294
314
  email: mfenner@datacite.org
295
315
  executables:
@@ -400,31 +420,35 @@ files:
400
420
  - spec/fixtures/references.yaml
401
421
  - spec/fixtures/site.yml
402
422
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/get/should_get_all_dois_by_prefix.yml
423
+ - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/jats/should_generate_jats_for_all_urls.yml
403
424
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_hide_for_all_urls.yml
404
425
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_hide_for_url.yml
405
426
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_hide_metadata_for_work.yml
406
427
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_and_hide_for_all_urls.yml
407
428
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_and_hide_for_url.yml
408
429
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_for_all_urls.yml
409
- - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_mint_for_url.yml
410
430
  - spec/fixtures/vcr_cassettes/Cirneco_DataCenter/mint_and_hide_DOIs/should_post_metadata_for_work.yml
411
431
  - spec/fixtures/vcr_cassettes/Cirneco_Doi/MDS_DOI_API/get/should_get_all_dois.yml
412
432
  - spec/fixtures/vcr_cassettes/Cirneco_Doi/MDS_DOI_API/get/should_get_doi.yml
413
433
  - spec/fixtures/vcr_cassettes/Cirneco_Doi/MDS_DOI_API/put/should_put_doi.yml
434
+ - spec/fixtures/vcr_cassettes/Cirneco_Doi/jats/writes_jats_for_list_of_urls.yml
414
435
  - spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/hides_a_doi.yml
415
- - spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_a_doi.yml
436
+ - spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/hides_dois_for_list_of_urls.yml
416
437
  - spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_and_hides_a_doi.yml
417
438
  - spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_and_hides_dois_for_list_of_urls.yml
418
439
  - spec/fixtures/vcr_cassettes/Cirneco_Doi/mint_and_hide_DOIs/mints_dois_for_list_of_urls.yml
419
440
  - spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/should_get_all_dois.yml
420
441
  - spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/should_get_doi.yml
421
442
  - spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/should_get_doi_not_found.yml
443
+ - spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/get/username_missing.yml
422
444
  - spec/fixtures/vcr_cassettes/Cirneco_Work/DOI_API/put/should_put_doi.yml
423
445
  - spec/fixtures/vcr_cassettes/Cirneco_Work/Media_API/get/should_get_media.yml
424
446
  - spec/fixtures/vcr_cassettes/Cirneco_Work/Media_API/post/should_post_media.yml
425
447
  - spec/fixtures/vcr_cassettes/Cirneco_Work/Metadata_API/delete/should_delete_metadata.yml
426
448
  - spec/fixtures/vcr_cassettes/Cirneco_Work/Metadata_API/get/should_get_metadata.yml
427
449
  - spec/fixtures/vcr_cassettes/Cirneco_Work/Metadata_API/post/should_post_metadata.yml
450
+ - spec/fixtures/vcr_cassettes/Cirneco_Work/media/includes_media.yml
451
+ - spec/fixtures/vcr_cassettes/Cirneco_Work/schema/BlogPosting.yml
428
452
  - spec/spec_helper.rb
429
453
  - spec/utils_spec.rb
430
454
  - spec/work_spec.rb
@@ -448,7 +472,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
448
472
  version: '0'
449
473
  requirements: []
450
474
  rubyforge_project:
451
- rubygems_version: 2.6.8
475
+ rubygems_version: 2.6.11
452
476
  signing_key:
453
477
  specification_version: 4
454
478
  summary: Ruby client library for the DataCite MDS