ruby-saml 0.9.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/LICENSE +1 -1
  4. data/README.md +71 -15
  5. data/changelog.md +15 -6
  6. data/lib/onelogin/ruby-saml.rb +1 -0
  7. data/lib/onelogin/ruby-saml/attribute_service.rb +25 -2
  8. data/lib/onelogin/ruby-saml/attributes.rb +42 -23
  9. data/lib/onelogin/ruby-saml/authrequest.rb +33 -8
  10. data/lib/onelogin/ruby-saml/http_error.rb +7 -0
  11. data/lib/onelogin/ruby-saml/idp_metadata_parser.rb +65 -10
  12. data/lib/onelogin/ruby-saml/logging.rb +14 -10
  13. data/lib/onelogin/ruby-saml/logoutrequest.rb +39 -14
  14. data/lib/onelogin/ruby-saml/logoutresponse.rb +166 -39
  15. data/lib/onelogin/ruby-saml/metadata.rb +40 -23
  16. data/lib/onelogin/ruby-saml/response.rb +562 -88
  17. data/lib/onelogin/ruby-saml/saml_message.rb +80 -14
  18. data/lib/onelogin/ruby-saml/settings.rb +62 -23
  19. data/lib/onelogin/ruby-saml/slo_logoutrequest.rb +210 -20
  20. data/lib/onelogin/ruby-saml/slo_logoutresponse.rb +44 -13
  21. data/lib/onelogin/ruby-saml/utils.rb +163 -40
  22. data/lib/onelogin/ruby-saml/version.rb +1 -1
  23. data/lib/schemas/saml-schema-metadata-2.0.xsd +0 -2
  24. data/lib/xml_security.rb +87 -29
  25. data/ruby-saml.gemspec +1 -0
  26. data/test/certificates/{r1_certificate2_base64 → certificate_without_head_foot} +0 -0
  27. data/test/certificates/formatted_certificate +14 -0
  28. data/test/certificates/formatted_private_key +12 -0
  29. data/test/certificates/formatted_rsa_private_key +12 -0
  30. data/test/certificates/invalid_certificate1 +1 -0
  31. data/test/certificates/invalid_certificate2 +1 -0
  32. data/test/certificates/invalid_certificate3 +12 -0
  33. data/test/certificates/invalid_private_key1 +1 -0
  34. data/test/certificates/invalid_private_key2 +1 -0
  35. data/test/certificates/invalid_private_key3 +10 -0
  36. data/test/certificates/invalid_rsa_private_key1 +1 -0
  37. data/test/certificates/invalid_rsa_private_key2 +1 -0
  38. data/test/certificates/invalid_rsa_private_key3 +10 -0
  39. data/test/idp_metadata_parser_test.rb +41 -4
  40. data/test/logging_test.rb +62 -0
  41. data/test/logout_requests/invalid_slo_request.xml +6 -0
  42. data/test/{responses → logout_requests}/slo_request.xml +0 -0
  43. data/test/logout_requests/slo_request.xml.base64 +1 -0
  44. data/test/logout_requests/slo_request_deflated.xml.base64 +1 -0
  45. data/test/logout_requests/slo_request_with_session_index.xml +5 -0
  46. data/test/{responses → logout_responses}/logoutresponse_fixtures.rb +6 -6
  47. data/test/logoutrequest_test.rb +79 -52
  48. data/test/logoutresponse_test.rb +206 -59
  49. data/test/metadata_test.rb +77 -7
  50. data/test/request_test.rb +80 -65
  51. data/test/response_test.rb +862 -189
  52. data/test/responses/attackxee.xml +13 -0
  53. data/test/responses/invalids/invalid_audience.xml.base64 +1 -0
  54. data/test/responses/invalids/invalid_issuer_assertion.xml.base64 +1 -0
  55. data/test/responses/invalids/invalid_issuer_message.xml.base64 +1 -0
  56. data/test/responses/invalids/invalid_signature_position.xml.base64 +1 -0
  57. data/test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64 +1 -0
  58. data/test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64 +1 -0
  59. data/test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64 +1 -0
  60. data/test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64 +1 -0
  61. data/test/responses/invalids/multiple_assertions.xml.base64 +2 -0
  62. data/test/responses/invalids/multiple_signed.xml.base64 +1 -0
  63. data/test/responses/invalids/no_id.xml.base64 +1 -0
  64. data/test/responses/invalids/no_saml2.xml.base64 +1 -0
  65. data/test/responses/invalids/no_signature.xml.base64 +1 -0
  66. data/test/responses/invalids/no_status.xml.base64 +1 -0
  67. data/test/responses/invalids/no_status_code.xml.base64 +1 -0
  68. data/test/responses/invalids/no_subjectconfirmation_data.xml.base64 +1 -0
  69. data/test/responses/invalids/no_subjectconfirmation_method.xml.base64 +1 -0
  70. data/test/responses/invalids/response_encrypted_attrs.xml.base64 +1 -0
  71. data/test/responses/invalids/response_invalid_signed_element.xml.base64 +1 -0
  72. data/test/responses/invalids/status_code_responder.xml.base64 +1 -0
  73. data/test/responses/invalids/status_code_responer_and_msg.xml.base64 +1 -0
  74. data/test/responses/{response4.xml.base64 → response_assertion_wrapped.xml.base64} +0 -0
  75. data/test/responses/response_encrypted_nameid.xml.base64 +1 -0
  76. data/test/responses/response_unsigned_xml_base64 +1 -0
  77. data/test/responses/{response5.xml.base64 → response_with_saml2_namespace.xml.base64} +0 -0
  78. data/test/responses/{response3.xml.base64 → response_with_signed_assertion.xml.base64} +0 -0
  79. data/test/responses/{r1_response6.xml.base64 → response_with_signed_assertion_2.xml.base64} +0 -0
  80. data/test/responses/{response1.xml.base64 → response_with_undefined_recipient.xml.base64} +0 -0
  81. data/test/responses/{response2.xml.base64 → response_without_attributes.xml.base64} +0 -0
  82. data/test/responses/{wrapped_response_2.xml.base64 → response_wrapped.xml.base64} +0 -0
  83. data/test/responses/signed_message_encrypted_signed_assertion.xml.base64 +1 -0
  84. data/test/responses/signed_message_encrypted_unsigned_assertion.xml.base64 +1 -0
  85. data/test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64 +1 -0
  86. data/test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64 +1 -0
  87. data/test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64 +1 -0
  88. data/test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64 +1 -0
  89. data/test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64 +1 -0
  90. data/test/responses/unsigned_message_encrypted_signed_assertion.xml.base64 +1 -0
  91. data/test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64 +1 -0
  92. data/test/responses/valid_response.xml.base64 +1 -0
  93. data/test/saml_message_test.rb +56 -0
  94. data/test/settings_test.rb +138 -1
  95. data/test/slo_logoutrequest_test.rb +239 -28
  96. data/test/slo_logoutresponse_test.rb +93 -71
  97. data/test/test_helper.rb +138 -31
  98. data/test/utils_test.rb +129 -25
  99. data/test/xml_security_test.rb +140 -71
  100. metadata +142 -25
  101. data/test/responses/response_node_text_attack.xml.base64 +0 -1
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-saml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - OneLogin LLC
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-05 00:00:00.000000000 Z
11
+ date: 2015-07-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: uuid
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '2.11'
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.9.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.9.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: systemu
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -157,6 +171,7 @@ files:
157
171
  - lib/onelogin/ruby-saml/attribute_service.rb
158
172
  - lib/onelogin/ruby-saml/attributes.rb
159
173
  - lib/onelogin/ruby-saml/authrequest.rb
174
+ - lib/onelogin/ruby-saml/http_error.rb
160
175
  - lib/onelogin/ruby-saml/idp_metadata_parser.rb
161
176
  - lib/onelogin/ruby-saml/logging.rb
162
177
  - lib/onelogin/ruby-saml/logoutrequest.rb
@@ -186,10 +201,29 @@ files:
186
201
  - lib/xml_security.rb
187
202
  - ruby-saml.gemspec
188
203
  - test/certificates/certificate1
189
- - test/certificates/r1_certificate2_base64
204
+ - test/certificates/certificate_without_head_foot
205
+ - test/certificates/formatted_certificate
206
+ - test/certificates/formatted_private_key
207
+ - test/certificates/formatted_rsa_private_key
208
+ - test/certificates/invalid_certificate1
209
+ - test/certificates/invalid_certificate2
210
+ - test/certificates/invalid_certificate3
211
+ - test/certificates/invalid_private_key1
212
+ - test/certificates/invalid_private_key2
213
+ - test/certificates/invalid_private_key3
214
+ - test/certificates/invalid_rsa_private_key1
215
+ - test/certificates/invalid_rsa_private_key2
216
+ - test/certificates/invalid_rsa_private_key3
190
217
  - test/certificates/ruby-saml.crt
191
218
  - test/certificates/ruby-saml.key
192
219
  - test/idp_metadata_parser_test.rb
220
+ - test/logging_test.rb
221
+ - test/logout_requests/invalid_slo_request.xml
222
+ - test/logout_requests/slo_request.xml
223
+ - test/logout_requests/slo_request.xml.base64
224
+ - test/logout_requests/slo_request_deflated.xml.base64
225
+ - test/logout_requests/slo_request_with_session_index.xml
226
+ - test/logout_responses/logoutresponse_fixtures.rb
193
227
  - test/logoutrequest_test.rb
194
228
  - test/logoutresponse_test.rb
195
229
  - test/metadata_test.rb
@@ -200,27 +234,59 @@ files:
200
234
  - test/responses/adfs_response_sha384.xml
201
235
  - test/responses/adfs_response_sha512.xml
202
236
  - test/responses/adfs_response_xmlns.xml
237
+ - test/responses/attackxee.xml
203
238
  - test/responses/idp_descriptor.xml
204
- - test/responses/logoutresponse_fixtures.rb
239
+ - test/responses/invalids/invalid_audience.xml.base64
240
+ - test/responses/invalids/invalid_issuer_assertion.xml.base64
241
+ - test/responses/invalids/invalid_issuer_message.xml.base64
242
+ - test/responses/invalids/invalid_signature_position.xml.base64
243
+ - test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64
244
+ - test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64
245
+ - test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64
246
+ - test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64
247
+ - test/responses/invalids/multiple_assertions.xml.base64
248
+ - test/responses/invalids/multiple_signed.xml.base64
249
+ - test/responses/invalids/no_id.xml.base64
250
+ - test/responses/invalids/no_saml2.xml.base64
251
+ - test/responses/invalids/no_signature.xml.base64
252
+ - test/responses/invalids/no_status.xml.base64
253
+ - test/responses/invalids/no_status_code.xml.base64
254
+ - test/responses/invalids/no_subjectconfirmation_data.xml.base64
255
+ - test/responses/invalids/no_subjectconfirmation_method.xml.base64
256
+ - test/responses/invalids/response_encrypted_attrs.xml.base64
257
+ - test/responses/invalids/response_invalid_signed_element.xml.base64
258
+ - test/responses/invalids/status_code_responder.xml.base64
259
+ - test/responses/invalids/status_code_responer_and_msg.xml.base64
205
260
  - test/responses/no_signature_ns.xml
206
261
  - test/responses/open_saml_response.xml
207
- - test/responses/r1_response6.xml.base64
208
- - test/responses/response1.xml.base64
209
- - test/responses/response2.xml.base64
210
- - test/responses/response3.xml.base64
211
- - test/responses/response4.xml.base64
212
- - test/responses/response5.xml.base64
262
+ - test/responses/response_assertion_wrapped.xml.base64
263
+ - test/responses/response_encrypted_nameid.xml.base64
213
264
  - test/responses/response_eval.xml
214
265
  - test/responses/response_no_cert_and_encrypted_attrs.xml
215
- - test/responses/response_node_text_attack.xml.base64
266
+ - test/responses/response_unsigned_xml_base64
216
267
  - test/responses/response_with_ampersands.xml
217
268
  - test/responses/response_with_ampersands.xml.base64
218
269
  - test/responses/response_with_multiple_attribute_values.xml
270
+ - test/responses/response_with_saml2_namespace.xml.base64
271
+ - test/responses/response_with_signed_assertion.xml.base64
272
+ - test/responses/response_with_signed_assertion_2.xml.base64
273
+ - test/responses/response_with_undefined_recipient.xml.base64
274
+ - test/responses/response_without_attributes.xml.base64
275
+ - test/responses/response_wrapped.xml.base64
276
+ - test/responses/signed_message_encrypted_signed_assertion.xml.base64
277
+ - test/responses/signed_message_encrypted_unsigned_assertion.xml.base64
219
278
  - test/responses/simple_saml_php.xml
220
- - test/responses/slo_request.xml
221
279
  - test/responses/starfield_response.xml.base64
222
280
  - test/responses/test_sign.xml
223
- - test/responses/wrapped_response_2.xml.base64
281
+ - test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64
282
+ - test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64
283
+ - test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64
284
+ - test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64
285
+ - test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64
286
+ - test/responses/unsigned_message_encrypted_signed_assertion.xml.base64
287
+ - test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64
288
+ - test/responses/valid_response.xml.base64
289
+ - test/saml_message_test.rb
224
290
  - test/settings_test.rb
225
291
  - test/slo_logoutrequest_test.rb
226
292
  - test/slo_logoutresponse_test.rb
@@ -248,16 +314,35 @@ required_rubygems_version: !ruby/object:Gem::Requirement
248
314
  version: '0'
249
315
  requirements: []
250
316
  rubyforge_project: http://www.rubygems.org/gems/ruby-saml
251
- rubygems_version: 2.5.1
317
+ rubygems_version: 2.4.5
252
318
  signing_key:
253
319
  specification_version: 4
254
320
  summary: SAML Ruby Tookit
255
321
  test_files:
256
322
  - test/certificates/certificate1
257
- - test/certificates/r1_certificate2_base64
323
+ - test/certificates/certificate_without_head_foot
324
+ - test/certificates/formatted_certificate
325
+ - test/certificates/formatted_private_key
326
+ - test/certificates/formatted_rsa_private_key
327
+ - test/certificates/invalid_certificate1
328
+ - test/certificates/invalid_certificate2
329
+ - test/certificates/invalid_certificate3
330
+ - test/certificates/invalid_private_key1
331
+ - test/certificates/invalid_private_key2
332
+ - test/certificates/invalid_private_key3
333
+ - test/certificates/invalid_rsa_private_key1
334
+ - test/certificates/invalid_rsa_private_key2
335
+ - test/certificates/invalid_rsa_private_key3
258
336
  - test/certificates/ruby-saml.crt
259
337
  - test/certificates/ruby-saml.key
260
338
  - test/idp_metadata_parser_test.rb
339
+ - test/logging_test.rb
340
+ - test/logout_requests/invalid_slo_request.xml
341
+ - test/logout_requests/slo_request.xml
342
+ - test/logout_requests/slo_request.xml.base64
343
+ - test/logout_requests/slo_request_deflated.xml.base64
344
+ - test/logout_requests/slo_request_with_session_index.xml
345
+ - test/logout_responses/logoutresponse_fixtures.rb
261
346
  - test/logoutrequest_test.rb
262
347
  - test/logoutresponse_test.rb
263
348
  - test/metadata_test.rb
@@ -268,27 +353,59 @@ test_files:
268
353
  - test/responses/adfs_response_sha384.xml
269
354
  - test/responses/adfs_response_sha512.xml
270
355
  - test/responses/adfs_response_xmlns.xml
356
+ - test/responses/attackxee.xml
271
357
  - test/responses/idp_descriptor.xml
272
- - test/responses/logoutresponse_fixtures.rb
358
+ - test/responses/invalids/invalid_audience.xml.base64
359
+ - test/responses/invalids/invalid_issuer_assertion.xml.base64
360
+ - test/responses/invalids/invalid_issuer_message.xml.base64
361
+ - test/responses/invalids/invalid_signature_position.xml.base64
362
+ - test/responses/invalids/invalid_subjectconfirmation_inresponse.xml.base64
363
+ - test/responses/invalids/invalid_subjectconfirmation_nb.xml.base64
364
+ - test/responses/invalids/invalid_subjectconfirmation_noa.xml.base64
365
+ - test/responses/invalids/invalid_subjectconfirmation_recipient.xml.base64
366
+ - test/responses/invalids/multiple_assertions.xml.base64
367
+ - test/responses/invalids/multiple_signed.xml.base64
368
+ - test/responses/invalids/no_id.xml.base64
369
+ - test/responses/invalids/no_saml2.xml.base64
370
+ - test/responses/invalids/no_signature.xml.base64
371
+ - test/responses/invalids/no_status.xml.base64
372
+ - test/responses/invalids/no_status_code.xml.base64
373
+ - test/responses/invalids/no_subjectconfirmation_data.xml.base64
374
+ - test/responses/invalids/no_subjectconfirmation_method.xml.base64
375
+ - test/responses/invalids/response_encrypted_attrs.xml.base64
376
+ - test/responses/invalids/response_invalid_signed_element.xml.base64
377
+ - test/responses/invalids/status_code_responder.xml.base64
378
+ - test/responses/invalids/status_code_responer_and_msg.xml.base64
273
379
  - test/responses/no_signature_ns.xml
274
380
  - test/responses/open_saml_response.xml
275
- - test/responses/r1_response6.xml.base64
276
- - test/responses/response1.xml.base64
277
- - test/responses/response2.xml.base64
278
- - test/responses/response3.xml.base64
279
- - test/responses/response4.xml.base64
280
- - test/responses/response5.xml.base64
381
+ - test/responses/response_assertion_wrapped.xml.base64
382
+ - test/responses/response_encrypted_nameid.xml.base64
281
383
  - test/responses/response_eval.xml
282
384
  - test/responses/response_no_cert_and_encrypted_attrs.xml
283
- - test/responses/response_node_text_attack.xml.base64
385
+ - test/responses/response_unsigned_xml_base64
284
386
  - test/responses/response_with_ampersands.xml
285
387
  - test/responses/response_with_ampersands.xml.base64
286
388
  - test/responses/response_with_multiple_attribute_values.xml
389
+ - test/responses/response_with_saml2_namespace.xml.base64
390
+ - test/responses/response_with_signed_assertion.xml.base64
391
+ - test/responses/response_with_signed_assertion_2.xml.base64
392
+ - test/responses/response_with_undefined_recipient.xml.base64
393
+ - test/responses/response_without_attributes.xml.base64
394
+ - test/responses/response_wrapped.xml.base64
395
+ - test/responses/signed_message_encrypted_signed_assertion.xml.base64
396
+ - test/responses/signed_message_encrypted_unsigned_assertion.xml.base64
287
397
  - test/responses/simple_saml_php.xml
288
- - test/responses/slo_request.xml
289
398
  - test/responses/starfield_response.xml.base64
290
399
  - test/responses/test_sign.xml
291
- - test/responses/wrapped_response_2.xml.base64
400
+ - test/responses/unsigned_message_aes128_encrypted_signed_assertion.xml.base64
401
+ - test/responses/unsigned_message_aes192_encrypted_signed_assertion.xml.base64
402
+ - test/responses/unsigned_message_aes256_encrypted_signed_assertion.xml.base64
403
+ - test/responses/unsigned_message_des192_encrypted_signed_assertion.xml.base64
404
+ - test/responses/unsigned_message_encrypted_assertion_without_saml_namespace.xml.base64
405
+ - test/responses/unsigned_message_encrypted_signed_assertion.xml.base64
406
+ - test/responses/unsigned_message_encrypted_unsigned_assertion.xml.base64
407
+ - test/responses/valid_response.xml.base64
408
+ - test/saml_message_test.rb
292
409
  - test/settings_test.rb
293
410
  - test/slo_logoutrequest_test.rb
294
411
  - test/slo_logoutresponse_test.rb
@@ -1 +0,0 @@
1
- PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphc3NlcnRpb24iIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIElEPSJHT1NBTUxSMTI5MDExNzQ1NzE3OTQiIFZlcnNpb249IjIuMCIgSXNzdWVJbnN0YW50PSIyMDEwLTExLTE4VDIxOjU3OjM3WiIgRGVzdGluYXRpb249IntyZWNpcGllbnR9Ij4NCiAgPHNhbWxwOlN0YXR1cz4NCiAgICA8c2FtbHA6U3RhdHVzQ29kZSBWYWx1ZT0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOnN0YXR1czpTdWNjZXNzIi8+PC9zYW1scDpTdGF0dXM+DQogIDxzYW1sOkFzc2VydGlvbiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIFZlcnNpb249IjIuMCIgSUQ9InBmeGE0NjU3NGRmLWIzYjAtYTA2YS0yM2M4LTYzNjQxMzE5ODc3MiIgSXNzdWVJbnN0YW50PSIyMDEwLTExLTE4VDIxOjU3OjM3WiI+DQogICAgPHNhbWw6SXNzdWVyPmh0dHBzOi8vYXBwLm9uZWxvZ2luLmNvbS9zYW1sL21ldGFkYXRhLzEzNTkwPC9zYW1sOklzc3Vlcj4NCiAgICA8ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4NCiAgICAgIDxkczpTaWduZWRJbmZvPg0KICAgICAgICA8ZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICA8ZHM6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+DQogICAgICAgIDxkczpSZWZlcmVuY2UgVVJJPSIjcGZ4YTQ2NTc0ZGYtYjNiMC1hMDZhLTIzYzgtNjM2NDEzMTk4NzcyIj4NCiAgICAgICAgICA8ZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICAgIDxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPg0KICAgICAgICAgICAgPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTAveG1sLWV4Yy1jMTRuIyIvPg0KICAgICAgICAgIDwvZHM6VHJhbnNmb3Jtcz4NCiAgICAgICAgICA8ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz4NCiAgICAgICAgICA8ZHM6RGlnZXN0VmFsdWU+cEpRN01TL2VrNEtSUldHbXYvSDQzUmVIWU1zPTwvZHM6RGlnZXN0VmFsdWU+DQogICAgICAgIDwvZHM6UmVmZXJlbmNlPg0KICAgICAgPC9kczpTaWduZWRJbmZvPg0KICAgICAgPGRzOlNpZ25hdHVyZVZhbHVlPnlpdmVLY1BkRHB1RE5qNnNoclEzQUJ3ci9jQTNDcnlEMnBoRy94TFpzektXeFU1L21sYUt0OGV3YlpPZEtLdnRPczJwSEJ5NUR1YTNrOTRBRnp4R3llbDVnT293bW95WEpyQU9ya1BPMHZsaTFWOG8zaFBQVVp3UmdTWDZROXBTMUNxUWdoS2lFYXNSeXlscXFKVWFQWXptT3pPRTgvWGxNa3dpV21PMD08L2RzOlNpZ25hdHVyZVZhbHVlPg0KICAgICAgPGRzOktleUluZm8+DQogICAgICAgIDxkczpYNTA5RGF0YT4NCiAgICAgICAgICA8ZHM6WDUwOUNlcnRpZmljYXRlPk1JSUJyVENDQWFHZ0F3SUJBZ0lCQVRBREJnRUFNR2N4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eWJtbGhNUlV3RXdZRFZRUUhEQXhUWVc1MFlTQk5iMjVwWTJFeEVUQVBCZ05WQkFvTUNFOXVaVXh2WjJsdU1Sa3dGd1lEVlFRRERCQmhjSEF1YjI1bGJHOW5hVzR1WTI5dE1CNFhEVEV3TURNd09UQTVOVGcwTlZvWERURTFNRE13T1RBNU5UZzBOVm93WnpFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RlRBVEJnTlZCQWNNREZOaGJuUmhJRTF2Ym1sallURVJNQThHQTFVRUNnd0lUMjVsVEc5bmFXNHhHVEFYQmdOVkJBTU1FR0Z3Y0M1dmJtVnNiMmRwYmk1amIyMHdnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBT2pTdTFmalB5OGQ1dzRReUwxemQ0aEl3MU1ra2ZmNFdZL1RMRzhPWmtVNVlUU1dtbUhQRDVrdllINXVvWFMvNnFRODFxWHBSMndWOENUb3daSlVMZzA5ZGRSZFJuOFFzcWoxRnlPQzVzbEUzeTJiWjJvRnVhNzJvZi80OWZwdWpuRlQ2S25RNjFDQk1xbERvVFFxT1Q2MnZHSjhuUDZNWld2QTZzeHF1ZDVBZ01CQUFFd0F3WUJBQU1CQUE9PTwvZHM6WDUwOUNlcnRpZmljYXRlPg0KICAgICAgICA8L2RzOlg1MDlEYXRhPg0KICAgICAgPC9kczpLZXlJbmZvPg0KICAgIDwvZHM6U2lnbmF0dXJlPg0KICAgIDxzYW1sOlN1YmplY3Q+DQogICAgICA8c2FtbDpOYW1lSUQgRm9ybWF0PSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjE6bmFtZWlkLWZvcm1hdDplbWFpbEFkZHJlc3MiPnN1cHBvcnQ8IS0tIGF0dGFjayEgLS0+QG9uZWxvZ2luLmNvbTwvc2FtbDpOYW1lSUQ+DQogICAgICA8c2FtbDpTdWJqZWN0Q29uZmlybWF0aW9uIE1ldGhvZD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOmNtOmJlYXJlciI+DQogICAgICAgIDxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiIFJlY2lwaWVudD0ie3JlY2lwaWVudH0iLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj4NCiAgICA8L3NhbWw6U3ViamVjdD4NCiAgICA8c2FtbDpDb25kaXRpb25zIE5vdEJlZm9yZT0iMjAxMC0xMS0xOFQyMTo1MjozN1oiIE5vdE9uT3JBZnRlcj0iMjAxMC0xMS0xOFQyMjowMjozN1oiPg0KICAgICAgPHNhbWw6QXVkaWVuY2VSZXN0cmljdGlvbj4NCiAgICAgICAgPHNhbWw6QXVkaWVuY2U+e2F1ZGllbmNlfTwvc2FtbDpBdWRpZW5jZT4NCiAgICAgIDwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPg0KICAgIDwvc2FtbDpDb25kaXRpb25zPg0KICAgIDxzYW1sOkF1dGhuU3RhdGVtZW50IEF1dGhuSW5zdGFudD0iMjAxMC0xMS0xOFQyMTo1NzozN1oiIFNlc3Npb25Ob3RPbk9yQWZ0ZXI9IjIwMTAtMTEtMTlUMjE6NTc6MzdaIiBTZXNzaW9uSW5kZXg9Il81MzFjMzJkMjgzYmRmZjdlMDRlNDg3YmNkYmM0ZGQ4ZCI+DQogICAgICA8c2FtbDpBdXRobkNvbnRleHQ+DQogICAgICAgIDxzYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPnVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDphYzpjbGFzc2VzOlBhc3N3b3JkPC9zYW1sOkF1dGhuQ29udGV4dENsYXNzUmVmPg0KICAgICAgPC9zYW1sOkF1dGhuQ29udGV4dD4NCiAgICA8L3NhbWw6QXV0aG5TdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9InN1cm5hbWUiPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnM8IS0tIGF0dGFjayEgLS0+bWl0aDwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0iYW5vdGhlcl92YWx1ZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+dmFsdWUxPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTp0eXBlPSJ4czpzdHJpbmciPnZhbHVlMjwvc2FtbDpBdHRyaWJ1dGVWYWx1ZT4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgICA8c2FtbDpBdHRyaWJ1dGUgTmFtZT0icm9sZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+cm9sZTE8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICA8L3NhbWw6QXR0cmlidXRlPg0KICAgIDwvc2FtbDpBdHRyaWJ1dGVTdGF0ZW1lbnQ+DQogICAgPHNhbWw6QXR0cmlidXRlU3RhdGVtZW50Pg0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9ImZpcnN0bmFtZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnR5cGU9InhzOnN0cmluZyI+Ym9iPC9zYW1sOkF0dHJpYnV0ZVZhbHVlPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4gIA0KICAgICAgPHNhbWw6QXR0cmlidXRlIE5hbWU9ImF0dHJpYnV0ZV93aXRoX25pbF92YWx1ZSI+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5pbD0idHJ1ZSIvPg0KICAgICAgPC9zYW1sOkF0dHJpYnV0ZT4NCiAgICAgIDxzYW1sOkF0dHJpYnV0ZSBOYW1lPSJhdHRyaWJ1dGVfd2l0aF9uaWxzX2FuZF9lbXB0eV9zdHJpbmdzIj4NCiAgICAgICAgPHNhbWw6QXR0cmlidXRlVmFsdWUvPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZT52YWx1ZVByZXNlbnQ8L3NhbWw6QXR0cmlidXRlVmFsdWU+DQogICAgICAgIDxzYW1sOkF0dHJpYnV0ZVZhbHVlIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOm5pbD0idHJ1ZSIvPg0KICAgICAgICA8c2FtbDpBdHRyaWJ1dGVWYWx1ZSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpuaWw9IjEiLz4NCiAgICAgIDwvc2FtbDpBdHRyaWJ1dGU+DQogICAgPC9zYW1sOkF0dHJpYnV0ZVN0YXRlbWVudD4NCiAgPC9zYW1sOkFzc2VydGlvbj4NCjwvc2FtbHA6UmVzcG9uc2U+