eve_online 0.14.0 → 0.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (128) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +0 -2
  3. data/.rubocop.yml +8 -15
  4. data/.rubocop_general.yml +10 -2
  5. data/.ruby-version +1 -0
  6. data/.travis.yml +15 -16
  7. data/CHANGELOG.md +60 -0
  8. data/Gemfile +3 -0
  9. data/Gemfile.lock +170 -0
  10. data/LICENSE.txt +1 -1
  11. data/README.md +569 -587
  12. data/Rakefile +2 -0
  13. data/eve_online.gemspec +7 -6
  14. data/gemfiles/activesupport_42.gemfile +3 -1
  15. data/gemfiles/activesupport_50.gemfile +3 -1
  16. data/gemfiles/activesupport_51.gemfile +3 -1
  17. data/gemfiles/activesupport_52.gemfile +4 -2
  18. data/gemfiles/activesupport_edge.gemfile +3 -1
  19. data/lib/eve_online.rb +23 -40
  20. data/lib/eve_online/esi/alliance.rb +3 -1
  21. data/lib/eve_online/esi/alliance_corporations.rb +27 -0
  22. data/lib/eve_online/esi/alliance_icon.rb +4 -2
  23. data/lib/eve_online/esi/alliances.rb +19 -0
  24. data/lib/eve_online/esi/alliances_names.rb +32 -0
  25. data/lib/eve_online/esi/ancestries.rb +24 -0
  26. data/lib/eve_online/esi/base.rb +3 -0
  27. data/lib/eve_online/esi/bloodlines.rb +3 -1
  28. data/lib/eve_online/esi/character.rb +3 -1
  29. data/lib/eve_online/esi/character_assets.rb +3 -1
  30. data/lib/eve_online/esi/character_attributes.rb +3 -1
  31. data/lib/eve_online/esi/character_blueprints.rb +3 -1
  32. data/lib/eve_online/esi/character_bookmark_folders.rb +34 -0
  33. data/lib/eve_online/esi/character_bookmarks.rb +34 -0
  34. data/lib/eve_online/esi/character_calendar.rb +34 -0
  35. data/lib/eve_online/esi/character_clones.rb +3 -1
  36. data/lib/eve_online/esi/character_fatigue.rb +3 -1
  37. data/lib/eve_online/esi/character_implants.rb +3 -1
  38. data/lib/eve_online/esi/character_industry_jobs.rb +4 -2
  39. data/lib/eve_online/esi/character_loyalty_points.rb +3 -1
  40. data/lib/eve_online/esi/character_notifications.rb +34 -0
  41. data/lib/eve_online/esi/character_online.rb +3 -1
  42. data/lib/eve_online/esi/character_orders.rb +34 -0
  43. data/lib/eve_online/esi/character_portrait.rb +3 -1
  44. data/lib/eve_online/esi/character_skill_queue.rb +3 -1
  45. data/lib/eve_online/esi/character_skills.rb +3 -1
  46. data/lib/eve_online/esi/character_standings.rb +3 -1
  47. data/lib/eve_online/esi/character_wallet.rb +3 -1
  48. data/lib/eve_online/esi/character_wallet_journal.rb +34 -0
  49. data/lib/eve_online/esi/corporation.rb +3 -1
  50. data/lib/eve_online/esi/corporation_blueprints.rb +3 -1
  51. data/lib/eve_online/esi/corporation_industry_jobs.rb +4 -2
  52. data/lib/eve_online/esi/corporation_orders.rb +39 -0
  53. data/lib/eve_online/esi/dogma_attribute.rb +3 -1
  54. data/lib/eve_online/esi/dogma_attributes.rb +3 -1
  55. data/lib/eve_online/esi/factions.rb +3 -1
  56. data/lib/eve_online/esi/market_history.rb +4 -2
  57. data/lib/eve_online/esi/models/alliance.rb +2 -0
  58. data/lib/eve_online/esi/models/alliance_icon.rb +6 -4
  59. data/lib/eve_online/esi/models/alliance_short.rb +24 -0
  60. data/lib/eve_online/esi/models/ancestry.rb +44 -0
  61. data/lib/eve_online/esi/models/asset.rb +2 -0
  62. data/lib/eve_online/esi/models/attributes.rb +2 -0
  63. data/lib/eve_online/esi/models/base.rb +2 -0
  64. data/lib/eve_online/esi/models/bloodline.rb +2 -0
  65. data/lib/eve_online/esi/models/blueprint.rb +2 -0
  66. data/lib/eve_online/esi/models/bookmark.rb +76 -0
  67. data/lib/eve_online/esi/models/bookmark_folder.rb +24 -0
  68. data/lib/eve_online/esi/models/character.rb +2 -0
  69. data/lib/eve_online/esi/models/character_order.rb +96 -0
  70. data/lib/eve_online/esi/models/character_portrait.rb +2 -0
  71. data/lib/eve_online/esi/models/corporation.rb +2 -0
  72. data/lib/eve_online/esi/models/corporation_order.rb +91 -0
  73. data/lib/eve_online/esi/models/dogma_attribute.rb +2 -0
  74. data/lib/eve_online/esi/models/event.rb +41 -0
  75. data/lib/eve_online/esi/models/faction.rb +2 -0
  76. data/lib/eve_online/esi/models/fatigue.rb +2 -0
  77. data/lib/eve_online/esi/models/home_location.rb +2 -0
  78. data/lib/eve_online/esi/models/industry_job.rb +2 -0
  79. data/lib/eve_online/esi/models/jump_clone.rb +2 -0
  80. data/lib/eve_online/esi/models/loyalty_point.rb +2 -0
  81. data/lib/eve_online/esi/models/market_history.rb +2 -0
  82. data/lib/eve_online/esi/models/notification.rb +51 -0
  83. data/lib/eve_online/esi/models/online.rb +2 -0
  84. data/lib/eve_online/esi/models/race.rb +2 -0
  85. data/lib/eve_online/esi/models/server_status.rb +2 -0
  86. data/lib/eve_online/esi/models/skill.rb +2 -0
  87. data/lib/eve_online/esi/models/skill_queue_entry.rb +2 -0
  88. data/lib/eve_online/esi/models/standing.rb +2 -0
  89. data/lib/eve_online/esi/models/wallet_journal_entry.rb +77 -0
  90. data/lib/eve_online/esi/races.rb +3 -1
  91. data/lib/eve_online/esi/server_status.rb +3 -1
  92. data/lib/eve_online/exceptions/base.rb +2 -0
  93. data/lib/eve_online/exceptions/invalid_character_id_exception.rb +2 -0
  94. data/lib/eve_online/exceptions/timeout_exception.rb +2 -0
  95. data/lib/eve_online/exceptions/unauthorized_exception.rb +2 -0
  96. data/lib/eve_online/version.rb +3 -1
  97. metadata +55 -50
  98. data/lib/eve_online/base.rb +0 -34
  99. data/lib/eve_online/base_xml.rb +0 -43
  100. data/lib/eve_online/bookmark.rb +0 -71
  101. data/lib/eve_online/bookmark_folder.rb +0 -56
  102. data/lib/eve_online/contact_notification.rb +0 -42
  103. data/lib/eve_online/event.rb +0 -66
  104. data/lib/eve_online/event_response_object.rb +0 -18
  105. data/lib/eve_online/market_order.rb +0 -91
  106. data/lib/eve_online/sde/agt_agent_types.rb +0 -14
  107. data/lib/eve_online/sde/agt_agents.rb +0 -14
  108. data/lib/eve_online/sde/agt_research_agents.rb +0 -14
  109. data/lib/eve_online/sde/base.rb +0 -25
  110. data/lib/eve_online/sde/inv_flags.rb +0 -14
  111. data/lib/eve_online/sde/inv_items.rb +0 -14
  112. data/lib/eve_online/sde/inv_names.rb +0 -14
  113. data/lib/eve_online/sde/inv_positions.rb +0 -14
  114. data/lib/eve_online/sde/models/agt_agent.rb +0 -58
  115. data/lib/eve_online/sde/models/agt_agent_type.rb +0 -28
  116. data/lib/eve_online/sde/models/agt_research_agent.rb +0 -28
  117. data/lib/eve_online/sde/models/inv_flag.rb +0 -38
  118. data/lib/eve_online/sde/models/inv_item.rb +0 -48
  119. data/lib/eve_online/sde/models/inv_name.rb +0 -28
  120. data/lib/eve_online/sde/models/inv_position.rb +0 -53
  121. data/lib/eve_online/wallet_journal_entry.rb +0 -97
  122. data/lib/eve_online/xml/base.rb +0 -84
  123. data/lib/eve_online/xml/character_bookmarks.rb +0 -53
  124. data/lib/eve_online/xml/character_contact_notifications.rb +0 -51
  125. data/lib/eve_online/xml/character_market_orders.rb +0 -55
  126. data/lib/eve_online/xml/character_upcoming_calendar_events.rb +0 -51
  127. data/lib/eve_online/xml/character_wallet_journal.rb +0 -57
  128. data/lib/eve_online/xml/corporation_market_orders.rb +0 -55
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterBookmarkFolders < Base
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/bookmarks/folders/?datasource=tranquility'
7
+
8
+ attr_reader :character_id
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options[:character_id]
14
+ end
15
+
16
+ def bookmark_folders
17
+ output = []
18
+ response.each do |bookmark_folder|
19
+ output << Models::BookmarkFolder.new(bookmark_folder)
20
+ end
21
+ output
22
+ end
23
+ memoize :bookmark_folders
24
+
25
+ def scope
26
+ 'esi-bookmarks.read_character_bookmarks.v1'
27
+ end
28
+
29
+ def url
30
+ format(API_ENDPOINT, character_id: character_id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterBookmarks < Base
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/bookmarks/?datasource=tranquility'
7
+
8
+ attr_reader :character_id
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options[:character_id]
14
+ end
15
+
16
+ def bookmarks
17
+ output = []
18
+ response.each do |bookmark|
19
+ output << Models::Bookmark.new(bookmark)
20
+ end
21
+ output
22
+ end
23
+ memoize :bookmarks
24
+
25
+ def scope
26
+ 'esi-bookmarks.read_character_bookmarks.v1'
27
+ end
28
+
29
+ def url
30
+ format(API_ENDPOINT, character_id: character_id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterCalendar < Base
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/calendar/?datasource=tranquility'
7
+
8
+ attr_reader :character_id
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options[:character_id]
14
+ end
15
+
16
+ def events
17
+ output = []
18
+ response.each do |event|
19
+ output << Models::Event.new(event)
20
+ end
21
+ output
22
+ end
23
+ memoize :events
24
+
25
+ def scope
26
+ 'esi-calendar.read_calendar_events.v1'
27
+ end
28
+
29
+ def url
30
+ format(API_ENDPOINT, character_id: character_id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterClones < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v3/characters/%<character_id>s/clones/?datasource=tranquility'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v3/characters/%<character_id>s/clones/?datasource=tranquility'
5
7
 
6
8
  attr_reader :character_id
7
9
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
5
  module EveOnline
@@ -5,7 +7,7 @@ module EveOnline
5
7
  class CharacterFatigue < Base
6
8
  extend Forwardable
7
9
 
8
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/fatigue/?datasource=tranquility'.freeze
10
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/fatigue/?datasource=tranquility'
9
11
 
10
12
  attr_reader :character_id
11
13
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterImplants < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/implants/?datasource=tranquility'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/implants/?datasource=tranquility'
5
7
 
6
8
  attr_reader :character_id
7
9
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterIndustryJobs < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%s/industry/jobs/?datasource=tranquility&include_completed=%s'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/industry/jobs/?datasource=tranquility&include_completed=%<include_completed>s'
5
7
 
6
8
  attr_reader :character_id, :include_completed
7
9
 
@@ -26,7 +28,7 @@ module EveOnline
26
28
  end
27
29
 
28
30
  def url
29
- API_ENDPOINT % [character_id, include_completed]
31
+ format(API_ENDPOINT, character_id: character_id, include_completed: include_completed)
30
32
  end
31
33
  end
32
34
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterLoyaltyPoints < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/loyalty/points/?datasource=tranquility'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/loyalty/points/?datasource=tranquility'
5
7
 
6
8
  attr_reader :character_id
7
9
 
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterNotifications < Base
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/notifications/?datasource=tranquility'
7
+
8
+ attr_reader :character_id
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options[:character_id]
14
+ end
15
+
16
+ def notifications
17
+ output = []
18
+ response.each do |notification|
19
+ output << Models::Notification.new(notification)
20
+ end
21
+ output
22
+ end
23
+ memoize :notifications
24
+
25
+ def scope
26
+ 'esi-characters.read_notifications.v1'
27
+ end
28
+
29
+ def url
30
+ format(API_ENDPOINT, character_id: character_id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
5
  module EveOnline
@@ -5,7 +7,7 @@ module EveOnline
5
7
  class CharacterOnline < Base
6
8
  extend Forwardable
7
9
 
8
- API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/online/?datasource=tranquility'.freeze
10
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/online/?datasource=tranquility'
9
11
 
10
12
  attr_reader :character_id
11
13
 
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterOrders < Base
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/orders/?datasource=tranquility'
7
+
8
+ attr_reader :character_id
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options[:character_id]
14
+ end
15
+
16
+ def orders
17
+ output = []
18
+ response.each do |order|
19
+ output << Models::CharacterOrder.new(order)
20
+ end
21
+ output
22
+ end
23
+ memoize :orders
24
+
25
+ def scope
26
+ 'esi-markets.read_character_orders.v1'
27
+ end
28
+
29
+ def url
30
+ format(API_ENDPOINT, character_id: character_id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
5
  module EveOnline
@@ -5,7 +7,7 @@ module EveOnline
5
7
  class CharacterPortrait < Base
6
8
  extend Forwardable
7
9
 
8
- API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/portrait/?datasource=tranquility'.freeze
10
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/portrait/?datasource=tranquility'
9
11
 
10
12
  attr_reader :character_id
11
13
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterSkillQueue < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/skillqueue/?datasource=tranquility'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v2/characters/%<character_id>s/skillqueue/?datasource=tranquility'
5
7
 
6
8
  attr_reader :character_id
7
9
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterSkills < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v4/characters/%<character_id>s/skills/?datasource=tranquility'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v4/characters/%<character_id>s/skills/?datasource=tranquility'
5
7
 
6
8
  attr_reader :character_id
7
9
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterStandings < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/standings/?datasource=tranquility'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/standings/?datasource=tranquility'
5
7
 
6
8
  attr_reader :character_id
7
9
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CharacterWallet < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/wallet/?datasource=tranquility'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/characters/%<character_id>s/wallet/?datasource=tranquility'
5
7
 
6
8
  attr_reader :character_id
7
9
 
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CharacterWalletJournal < Base
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v3/characters/%<character_id>s/wallet/journal/?datasource=tranquility'
7
+
8
+ attr_reader :character_id
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @character_id = options[:character_id]
14
+ end
15
+
16
+ def wallet_journal_entries
17
+ output = []
18
+ response.each do |wallet_journal_entry|
19
+ output << Models::WalletJournalEntry.new(wallet_journal_entry)
20
+ end
21
+ output
22
+ end
23
+ memoize :wallet_journal_entries
24
+
25
+ def scope
26
+ 'esi-wallet.read_character_wallet.v1'
27
+ end
28
+
29
+ def url
30
+ format(API_ENDPOINT, character_id: character_id)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
5
  module EveOnline
@@ -5,7 +7,7 @@ module EveOnline
5
7
  class Corporation < Base
6
8
  extend Forwardable
7
9
 
8
- API_ENDPOINT = 'https://esi.tech.ccp.is/v4/corporations/%<corporation_id>s/?datasource=tranquility'.freeze
10
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v4/corporations/%<corporation_id>s/?datasource=tranquility'
9
11
 
10
12
  attr_reader :corporation_id
11
13
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CorporationBlueprints < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/corporations/%<corporation_id>s/blueprints/?datasource=tranquility&page=1'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/corporations/%<corporation_id>s/blueprints/?datasource=tranquility&page=1'
5
7
 
6
8
  attr_reader :corporation_id
7
9
 
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EveOnline
2
4
  module ESI
3
5
  class CorporationIndustryJobs < Base
4
- API_ENDPOINT = 'https://esi.tech.ccp.is/v1/corporations/%s/industry/jobs/?datasource=tranquility&include_completed=%s'.freeze
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/corporations/%<corporation_id>s/industry/jobs/?datasource=tranquility&include_completed=%<include_completed>s'
5
7
 
6
8
  attr_reader :corporation_id, :include_completed
7
9
 
@@ -26,7 +28,7 @@ module EveOnline
26
28
  end
27
29
 
28
30
  def url
29
- API_ENDPOINT % [corporation_id, include_completed]
31
+ format(API_ENDPOINT, corporation_id: corporation_id, include_completed: include_completed)
30
32
  end
31
33
  end
32
34
  end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EveOnline
4
+ module ESI
5
+ class CorporationOrders < Base
6
+ API_ENDPOINT = 'https://esi.tech.ccp.is/v1/corporations/%<corporation_id>s/orders/?datasource=tranquility&page=1'
7
+
8
+ attr_reader :corporation_id
9
+
10
+ def initialize(options)
11
+ super
12
+
13
+ @corporation_id = options[:corporation_id]
14
+ end
15
+
16
+ def orders
17
+ output = []
18
+ response.each do |order|
19
+ output << Models::CorporationOrder.new(order)
20
+ end
21
+ output
22
+ end
23
+ memoize :orders
24
+
25
+ def scope
26
+ 'esi-markets.read_corporation_orders.v1'
27
+ end
28
+
29
+ # TODO: add roles support
30
+ # def roles
31
+ # ['Accountant', 'Trader']
32
+ # end
33
+
34
+ def url
35
+ format(API_ENDPOINT, corporation_id: corporation_id)
36
+ end
37
+ end
38
+ end
39
+ end