seatsio 26.2.0 → 31.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a271b58be4efc9c27a4604733e1a7951b0f72b65d206c980c36f2d932be2baea
4
- data.tar.gz: 9b3decce98eb7a0459063592a5428e9395296c3fad72e5e7e625bd97498b0886
3
+ metadata.gz: bf1124000be835fc50c85b57259d3cc53d0efbb3625bff185329e412f0fd9b33
4
+ data.tar.gz: 4f85fb99913ddb488705092c483c88ada2da298a0f9b7dbcee90df3cae558a4d
5
5
  SHA512:
6
- metadata.gz: e09498be7a8d43d228f3d7fbc5c7d77bc06a84510f29b9bc86f1c354132d2400772d3993e76c29ecec87ad2b72006f5274d0f2cfc3f0f75e740b8a2297441f76
7
- data.tar.gz: c8c0cc4143ab7311932a5b5d8990285bbc33c552e05e928d6bb3cee2852764299c16348fae068817988ce07c9f7595ca559e784820a33bebdbbf388e30ee115a
6
+ metadata.gz: fd5ed35d871c54d7101e78eaacb2fd9925ef0894e69d56150eecd671b04b8a01cafaabe57b51b94c02326c4a9acbdfe27fe1dbed1a680e3700c6d80ebef5723e
7
+ data.tar.gz: 933fe7bb11ebcc7e9c15f8efbe8dafbfb5c9b584f351f5cef9c949a51a0dd243eda159077d8be2b79b042e9eaab44947b1c1b1feaabddb8ca554bc487e11e3b9
@@ -0,0 +1,26 @@
1
+ name: 'Build'
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ matrix:
15
+ ruby-version: ['2.3']
16
+
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby-version }}
22
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
23
+ - uses: zcong1993/setup-timezone@master
24
+ with:
25
+ timezone: Europe/Brussels
26
+ - run: bundle exec rake
@@ -0,0 +1,21 @@
1
+ name: 'Publish'
2
+
3
+ on:
4
+ release:
5
+ types: [created]
6
+
7
+ jobs:
8
+ build:
9
+ runs-on: ubuntu-latest
10
+
11
+ steps:
12
+ - uses: actions/checkout@v2
13
+ - run: |
14
+ mkdir -p $HOME/.gem
15
+ touch $HOME/.gem/credentials
16
+ chmod 0600 $HOME/.gem/credentials
17
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
18
+ gem build *.gemspec
19
+ gem push *.gem
20
+ env:
21
+ GEM_HOST_API_KEY: "${{secrets.RUBYGEMS_API_KEY}}"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- seatsio (26.2.0)
4
+ seatsio (31.0.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # seatsio-ruby, the official Seats.io Ruby client library
2
2
 
3
- [![Build Status](https://travis-ci.org/seatsio/seatsio-ruby.svg?branch=master)](https://travis-ci.org/seatsio/seatsio-ruby)
3
+ ![Build](https://github.com/seatsio/seatsio-ruby/workflows/Build/badge.svg)
4
4
 
5
5
  This is the official Ruby client library for the [Seats.io V2 REST API](https://docs.seats.io/docs/api-overview), supporting Ruby 2.2.0+
6
6
 
@@ -14,7 +14,7 @@ seatsio-ruby follows semver since v23.3.0.
14
14
 
15
15
  ```ruby
16
16
  require('seatsio')
17
- client = Seatsio::Client.new("my-workspace-secret-key") # can be found on https://app.seats.io/workspace-settings
17
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key") # can be found on https://app.seats.io/workspace-settings
18
18
  chart = client.charts.create
19
19
  event = client.events.create key: chart.key
20
20
  ```
@@ -23,7 +23,7 @@ event = client.events.create key: chart.key
23
23
 
24
24
  ```ruby
25
25
  require('seatsio')
26
- client = Seatsio::Client.new("my-workspace-secret-key")
26
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
27
27
  client.events.book(event.key, ["A-1", "A-2"])
28
28
  ```
29
29
 
@@ -31,7 +31,7 @@ client.events.book(event.key, ["A-1", "A-2"])
31
31
 
32
32
  ```ruby
33
33
  require('seatsio')
34
- client = Seatsio::Client.new("my-workspace-secret-key")
34
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
35
35
  client.events.release(event.key, ["A-1", "A-2"])
36
36
  ```
37
37
 
@@ -39,7 +39,7 @@ client.events.release(event.key, ["A-1", "A-2"])
39
39
 
40
40
  ```ruby
41
41
  require('seatsio')
42
- client = Seatsio::Client.new("my-workspace-secret-key")
42
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
43
43
  client.events.book(event.key, ["A-1", "A-2"], hold_token: "a-hold-token")
44
44
  ```
45
45
 
@@ -47,7 +47,7 @@ client.events.book(event.key, ["A-1", "A-2"], hold_token: "a-hold-token")
47
47
 
48
48
  ```ruby
49
49
  require('seatsio')
50
- client = Seatsio::Client.new("my-workspace-secret-key")
50
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
51
51
  client.events.change_object_status("<EVENT KEY>", ["A-1", "A-2"], "my-custom-status")
52
52
  ```
53
53
 
@@ -55,7 +55,7 @@ client.events.change_object_status("<EVENT KEY>", ["A-1", "A-2"], "my-custom-sta
55
55
 
56
56
  ```ruby
57
57
  require('seatsio')
58
- client = Seatsio::Client.new("my-workspace-secret-key")
58
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-workspace-secret-key")
59
59
  charts = client.charts.list
60
60
  charts.each do |chart|
61
61
  puts chart.key
@@ -101,7 +101,7 @@ end
101
101
 
102
102
  ```ruby
103
103
  require('seatsio')
104
- client = Seatsio::Client.new("my-company-admin-key")
104
+ client = Seatsio::Client.new(Seatsio::Region.EU(), "my-company-admin-key")
105
105
  client.workspaces.create name: "a workspace"
106
106
  ```
107
107
 
data/lib/seatsio.rb CHANGED
@@ -9,12 +9,12 @@ require 'seatsio/event_reports'
9
9
  require 'seatsio/usage_reports'
10
10
 
11
11
  module Seatsio
12
- # Main Seatsio Class
13
12
  class Client
14
13
  attr_reader :charts, :subaccounts, :workspaces, :events,
15
14
  :hold_tokens, :chart_reports, :event_reports, :usage_reports
16
15
 
17
- def initialize(secret_key, workspace_key = nil, base_url = 'https://api.seatsio.net')
16
+ def initialize(region, secret_key, workspace_key = nil)
17
+ base_url = region.url
18
18
  @charts = ChartsClient.new(secret_key, workspace_key, base_url)
19
19
  @subaccounts = SubaccountsClient.new(secret_key, workspace_key, base_url)
20
20
  @workspaces = WorkspacesClient.new(secret_key, base_url)
@@ -25,4 +25,32 @@ module Seatsio
25
25
  @usage_reports = UsageReportsClient.new(secret_key, workspace_key, base_url)
26
26
  end
27
27
  end
28
+
29
+ class Region
30
+ attr_reader :url
31
+
32
+ def initialize(url)
33
+ @url = url
34
+ end
35
+
36
+ def self.EU()
37
+ return Region.new(Region.url_for_id("eu"))
38
+ end
39
+
40
+ def self.NA()
41
+ return Region.new(Region.url_for_id("na"))
42
+ end
43
+
44
+ def self.SA()
45
+ return Region.new(Region.url_for_id("sa"))
46
+ end
47
+
48
+ def self.OC()
49
+ return Region.new(Region.url_for_id("oc"))
50
+ end
51
+
52
+ def self.url_for_id(id)
53
+ return "https://api-" + id + ".seatsio.net"
54
+ end
55
+ end
28
56
  end
@@ -28,7 +28,7 @@ module Seatsio
28
28
  params = book_whole_tables.nil? ? {} : { bookWholeTables: book_whole_tables }
29
29
  url = "reports/charts/#{chart_key}/#{report_type}"
30
30
  body = @http_client.get(url, params)
31
- Domain::ChartReport.new(body)
31
+ ChartReport.new(body)
32
32
  end
33
33
  end
34
34
  end
@@ -13,24 +13,24 @@ module Seatsio
13
13
 
14
14
  def initialize(secret_key, workspace_key, base_url)
15
15
  @http_client = Seatsio::HttpClient.new(secret_key, workspace_key, base_url)
16
- @archive = Pagination::Cursor.new(Domain::Chart, 'charts/archive', @http_client)
16
+ @archive = Pagination::Cursor.new(Chart, 'charts/archive', @http_client)
17
17
  end
18
18
 
19
- # @return [Seatsio::Domain::Chart]
19
+ # @return [Seatsio::Chart]
20
20
  def retrieve(chart_key)
21
21
  response = @http_client.get("charts/#{chart_key}")
22
- Domain::Chart.new(response)
22
+ Chart.new(response)
23
23
  end
24
24
 
25
25
  def retrieve_with_events(chart_key)
26
26
  response = @http_client.get("charts/#{chart_key}?expand=events")
27
- Domain::Chart.new(response)
27
+ Chart.new(response)
28
28
  end
29
29
 
30
30
  def create(name: nil, venue_type: nil, categories: nil)
31
31
  payload = build_chart_request name: name, venue_type: venue_type, categories: categories
32
32
  response = @http_client.post('charts', payload)
33
- Domain::Chart.new(response)
33
+ Chart.new(response)
34
34
  end
35
35
 
36
36
  def update(key:, new_name: nil, categories: nil)
@@ -48,24 +48,24 @@ module Seatsio
48
48
 
49
49
  def copy(key)
50
50
  response = @http_client.post("charts/#{key}/version/published/actions/copy")
51
- Domain::Chart.new(response)
51
+ Chart.new(response)
52
52
  end
53
53
 
54
54
  def copy_to_subaccount(chart_key, subaccount_id)
55
55
  url = "charts/#{chart_key}/version/published/actions/copy-to/#{subaccount_id}"
56
56
  response = @http_client.post url
57
- Domain::Chart.new(response)
57
+ Chart.new(response)
58
58
  end
59
59
 
60
60
  def copy_to_workspace(chart_key, to_workspace_key)
61
61
  url = "charts/#{chart_key}/version/published/actions/copy-to-workspace/#{to_workspace_key}"
62
62
  response = @http_client.post url
63
- Domain::Chart.new(response)
63
+ Chart.new(response)
64
64
  end
65
65
 
66
66
  def copy_draft_version(key)
67
67
  response = @http_client.post("charts/#{key}/version/draft/actions/copy")
68
- Domain::Chart.new(response)
68
+ Chart.new(response)
69
69
  end
70
70
 
71
71
  def retrieve_published_version(key)
@@ -98,7 +98,7 @@ module Seatsio
98
98
  end
99
99
 
100
100
  def list(chart_filter: nil, tag: nil, expand_events: nil, with_validation: false)
101
- cursor = Pagination::Cursor.new(Domain::Chart, 'charts', @http_client)
101
+ cursor = Pagination::Cursor.new(Chart, 'charts', @http_client)
102
102
  cursor.set_query_param('filter', chart_filter)
103
103
  cursor.set_query_param('tag', tag)
104
104
 
@@ -123,12 +123,12 @@ module Seatsio
123
123
 
124
124
  def validate_published_version(chart_key)
125
125
  response = @http_client.post("charts/#{chart_key}/version/published/actions/validate")
126
- Seatsio::Domain::ChartValidationResult.new(response)
126
+ Seatsio::ChartValidationResult.new(response)
127
127
  end
128
128
 
129
129
  def validate_draft_version(chart_key)
130
130
  response = @http_client.post("charts/#{chart_key}/version/draft/actions/validate")
131
- Seatsio::Domain::ChartValidationResult.new(response)
131
+ Seatsio::ChartValidationResult.new(response)
132
132
  end
133
133
 
134
134
  private
@@ -1,6 +1,6 @@
1
1
  require 'seatsio/util'
2
2
 
3
- module Seatsio::Domain
3
+ module Seatsio
4
4
 
5
5
  module_function
6
6
 
@@ -22,10 +22,19 @@ module Seatsio::Domain
22
22
  @archived = data['archived']
23
23
  @validation = data['validation']
24
24
  @social_distancing_rulesets = data['socialDistancingRulesets'].map {
25
- |key, r| [key, SocialDistancingRuleset.new(r['name'], r['numberOfDisabledSeatsToTheSides'], r['disableSeatsInFrontAndBehind'],
26
- r['numberOfDisabledAisleSeats'], r['maxGroupSize'],
27
- r['maxOccupancyAbsolute'], r['maxOccupancyPercentage'], r['oneGroupPerTable'], r['fixedGroupLayout'],
28
- r['disabledSeats'], r['enabledSeats'], r['index'])]
25
+ |key, r| [key, SocialDistancingRuleset.new(r['name'],
26
+ number_of_disabled_seats_to_the_sides: r['numberOfDisabledSeatsToTheSides'],
27
+ disable_seats_in_front_and_behind: r['disableSeatsInFrontAndBehind'],
28
+ disable_diagonal_seats_in_front_and_behind: r['disableDiagonalSeatsInFrontAndBehind'],
29
+ number_of_disabled_aisle_seats: r['numberOfDisabledAisleSeats'],
30
+ max_group_size: r['maxGroupSize'],
31
+ max_occupancy_absolute: r['maxOccupancyAbsolute'],
32
+ max_occupancy_percentage: r['maxOccupancyPercentage'],
33
+ one_group_per_table: r['oneGroupPerTable'],
34
+ fixed_group_layout: r['fixedGroupLayout'],
35
+ disabled_seats: r['disabledSeats'],
36
+ enabled_seats: r['enabledSeats'],
37
+ index: r['index'])]
29
38
  }.to_h
30
39
  end
31
40
  end
@@ -61,6 +70,38 @@ module Seatsio::Domain
61
70
  end
62
71
  end
63
72
 
73
+ class TableBookingConfig
74
+
75
+ attr_reader :mode, :tables
76
+
77
+ def initialize(mode, tables = nil)
78
+ @mode = mode
79
+ @tables = tables
80
+ end
81
+
82
+ def self.inherit
83
+ TableBookingConfig.new('INHERIT')
84
+ end
85
+
86
+ def self.all_by_seat
87
+ TableBookingConfig.new('ALL_BY_SEAT')
88
+ end
89
+
90
+ def self.all_by_table
91
+ TableBookingConfig.new('ALL_BY_TABLE')
92
+ end
93
+
94
+ def self.custom(tables)
95
+ TableBookingConfig.new('CUSTOM', tables)
96
+ end
97
+
98
+ def self.from_json(data)
99
+ if data
100
+ TableBookingConfig.new(data['mode'], data['tables'])
101
+ end
102
+ end
103
+ end
104
+
64
105
  class Channel
65
106
  attr_reader :key, :name, :color, :index, :objects
66
107
 
@@ -84,17 +125,16 @@ module Seatsio::Domain
84
125
 
85
126
  class Event
86
127
 
87
- attr_accessor :id, :key, :chart_key, :book_whole_tables, :supports_best_available,
88
- :table_booking_modes, :for_sale_config, :created_on, :updated_on, :channels,
128
+ attr_accessor :id, :key, :chart_key, :supports_best_available,
129
+ :table_booking_config, :for_sale_config, :created_on, :updated_on, :channels,
89
130
  :social_distancing_ruleset_key
90
131
 
91
132
  def initialize(data)
92
133
  @id = data['id']
93
134
  @key = data['key']
94
135
  @chart_key = data['chartKey']
95
- @book_whole_tables = data['bookWholeTables']
96
136
  @supports_best_available = data['supportsBestAvailable']
97
- @table_booking_modes = data['tableBookingModes']
137
+ @table_booking_config = TableBookingConfig::from_json(data['tableBookingConfig'])
98
138
  @for_sale_config = ForSaleConfig.new(data['forSaleConfig']) if data['forSaleConfig']
99
139
  @created_on = parse_date(data['createdOn'])
100
140
  @updated_on = parse_date(data['updatedOn'])
@@ -185,7 +225,7 @@ module Seatsio::Domain
185
225
  attr_reader :objects
186
226
 
187
227
  def initialize(data)
188
- @objects = Seatsio::Domain.to_object_details(data['objects']);
228
+ @objects = Seatsio.to_object_details(data['objects']);
189
229
  end
190
230
  end
191
231
 
@@ -217,14 +257,14 @@ module Seatsio::Domain
217
257
  def initialize(data)
218
258
  @next_to_each_other = data['nextToEachOther']
219
259
  @objects = data['objects']
220
- @object_details = Seatsio::Domain.to_object_details(data['objectDetails'])
260
+ @object_details = Seatsio.to_object_details(data['objectDetails'])
221
261
  end
222
262
  end
223
263
 
224
264
  class ChartReportItem
225
265
 
226
266
  attr_reader :label, :labels, :category_key, :category_label, :section, :entrance, :capacity, :object_type,
227
- :left_neighbour, :right_neighbour
267
+ :left_neighbour, :right_neighbour, :book_as_a_whole
228
268
 
229
269
  def initialize(data)
230
270
  @label = data['label']
@@ -237,6 +277,7 @@ module Seatsio::Domain
237
277
  @object_type = data['objectType']
238
278
  @left_neighbour = data['leftNeighbour']
239
279
  @right_neighbour = data['rightNeighbour']
280
+ @book_as_a_whole = data['bookAsAWhole']
240
281
  end
241
282
  end
242
283
 
@@ -287,7 +328,8 @@ module Seatsio::Domain
287
328
  :category_key, :entrance, :object_type, :hold_token, :category_label,
288
329
  :ticket_type, :num_booked, :num_free, :num_held, :for_sale, :section,
289
330
  :is_accessible, :is_companion_seat, :has_restricted_view, :displayed_object_type,
290
- :left_neighbour, :right_neighbour, :is_selectable, :is_disabled_by_social_distancing, :channel
331
+ :left_neighbour, :right_neighbour, :is_selectable, :is_disabled_by_social_distancing, :channel,
332
+ :book_as_a_whole
291
333
 
292
334
  def initialize(data)
293
335
  @status = data['status']
@@ -316,6 +358,7 @@ module Seatsio::Domain
316
358
  @is_selectable = data['isSelectable']
317
359
  @is_disabled_by_social_distancing = data['isDisabledBySocialDistancing']
318
360
  @channel = data['channel']
361
+ @book_as_a_whole = data['bookAsAWhole']
319
362
  end
320
363
  end
321
364
 
@@ -343,23 +386,14 @@ module Seatsio::Domain
343
386
 
344
387
  class UsageDetails
345
388
 
346
- attr_reader :subaccount
389
+ attr_reader :workspace, :usage_by_chart
347
390
 
348
391
  def initialize(data)
349
- @subaccount = data['subaccount'] ? UsageSubaccount.new(data['subaccount']) : nil
392
+ @workspace = data['workspace']
350
393
  @usage_by_chart = data['usageByChart'].map { |usage| UsageByChart.new(usage) }
351
394
  end
352
395
  end
353
396
 
354
- class UsageSubaccount
355
-
356
- attr_reader :id
357
-
358
- def initialize(data)
359
- @id = data['id']
360
- end
361
- end
362
-
363
397
  class UsageByChart
364
398
 
365
399
  attr_reader :chart, :usage_by_event
@@ -475,15 +509,16 @@ module Seatsio::Domain
475
509
 
476
510
  class SocialDistancingRuleset
477
511
  attr_reader :name, :number_of_disabled_seats_to_the_sides, :disable_seats_in_front_and_behind,
478
- :number_of_disabled_aisle_seats, :max_group_size, :max_occupancy_absolute,
512
+ :disable_diagonal_seats_in_front_and_behind, :number_of_disabled_aisle_seats, :max_group_size, :max_occupancy_absolute,
479
513
  :max_occupancy_percentage, :one_group_per_table, :fixed_group_layout, :disabled_seats, :enabled_seats, :index
480
514
 
481
- def initialize(name, number_of_disabled_seats_to_the_sides = 0, disable_seats_in_front_and_behind = false, number_of_disabled_aisle_seats = 0,
482
- max_group_size = 0, max_occupancy_absolute = 0, max_occupancy_percentage = 0, one_group_per_table = false,
483
- fixed_group_layout = false, disabled_seats = [], enabled_seats = [], index = 0)
515
+ def initialize(name, number_of_disabled_seats_to_the_sides: 0, disable_seats_in_front_and_behind: false, disable_diagonal_seats_in_front_and_behind: false,
516
+ number_of_disabled_aisle_seats: 0, max_group_size: 0, max_occupancy_absolute: 0, max_occupancy_percentage: 0, one_group_per_table: false,
517
+ fixed_group_layout: false, disabled_seats: [], enabled_seats: [], index: 0)
484
518
  @name = name
485
519
  @number_of_disabled_seats_to_the_sides = number_of_disabled_seats_to_the_sides
486
520
  @disable_seats_in_front_and_behind = disable_seats_in_front_and_behind
521
+ @disable_diagonal_seats_in_front_and_behind = disable_diagonal_seats_in_front_and_behind
487
522
  @number_of_disabled_aisle_seats = number_of_disabled_aisle_seats
488
523
  @max_group_size = max_group_size
489
524
  @max_occupancy_absolute = max_occupancy_absolute
@@ -495,22 +530,33 @@ module Seatsio::Domain
495
530
  @index = index
496
531
  end
497
532
 
498
- def self.fixed(name, disabled_seats = [], index = 0)
499
- SocialDistancingRuleset.new(name, 0, false, 0, 0, 0, 0, false, true, disabled_seats, [], index)
533
+ def self.fixed(name, disabled_seats: [], index: 0)
534
+ return SocialDistancingRuleset.new(name, index: index, disabled_seats: disabled_seats, fixed_group_layout: true)
500
535
  end
501
536
 
502
- def self.rule_based(name, number_of_disabled_seats_to_the_sides = 0, disable_seats_in_front_and_behind = false, number_of_disabled_aisle_seats = 0,
503
- max_group_size = 0, max_occupancy_absolute = 0, max_occupancy_percentage = 0, one_group_per_table = false,
504
- disabled_seats = [], enabled_seats = [], index = 0)
505
- SocialDistancingRuleset.new(name, number_of_disabled_seats_to_the_sides, disable_seats_in_front_and_behind, number_of_disabled_aisle_seats,
506
- max_group_size, max_occupancy_absolute, max_occupancy_percentage,
507
- one_group_per_table, false, disabled_seats, enabled_seats, index)
537
+ def self.rule_based(name, number_of_disabled_seats_to_the_sides: 0, disable_seats_in_front_and_behind: false, disable_diagonal_seats_in_front_and_behind: false,
538
+ number_of_disabled_aisle_seats: 0, max_group_size: 0, max_occupancy_absolute: 0, max_occupancy_percentage: 0, one_group_per_table: false,
539
+ disabled_seats: [], enabled_seats: [], index: 0)
540
+ return SocialDistancingRuleset.new(name,
541
+ number_of_disabled_seats_to_the_sides: number_of_disabled_seats_to_the_sides,
542
+ disable_seats_in_front_and_behind: disable_seats_in_front_and_behind,
543
+ disable_diagonal_seats_in_front_and_behind: disable_diagonal_seats_in_front_and_behind,
544
+ number_of_disabled_aisle_seats: number_of_disabled_aisle_seats,
545
+ max_group_size: max_group_size,
546
+ max_occupancy_absolute: max_occupancy_absolute,
547
+ max_occupancy_percentage: max_occupancy_percentage,
548
+ one_group_per_table: one_group_per_table,
549
+ fixed_group_layout: false,
550
+ disabled_seats: disabled_seats,
551
+ enabled_seats: enabled_seats,
552
+ index: index)
508
553
  end
509
554
 
510
555
  def == (other)
511
556
  self.name == other.name &&
512
557
  self.number_of_disabled_seats_to_the_sides == other.number_of_disabled_seats_to_the_sides &&
513
558
  self.disable_seats_in_front_and_behind == other.disable_seats_in_front_and_behind &&
559
+ self.disable_diagonal_seats_in_front_and_behind == other.disable_diagonal_seats_in_front_and_behind &&
514
560
  self.number_of_disabled_aisle_seats == other.number_of_disabled_aisle_seats &&
515
561
  self.max_group_size == other.max_group_size &&
516
562
  self.max_occupancy_absolute == other.max_occupancy_absolute &&
@@ -15,26 +15,50 @@ module Seatsio
15
15
  fetch_summary_report('byStatus', event_key)
16
16
  end
17
17
 
18
+ def deep_summary_by_status(event_key)
19
+ fetch_deep_summary_report('byStatus', event_key)
20
+ end
21
+
18
22
  def summary_by_category_key(event_key)
19
23
  fetch_summary_report('byCategoryKey', event_key)
20
24
  end
21
25
 
26
+ def deep_summary_by_category_key(event_key)
27
+ fetch_deep_summary_report('byCategoryKey', event_key)
28
+ end
29
+
22
30
  def summary_by_category_label(event_key)
23
31
  fetch_summary_report('byCategoryLabel', event_key)
24
32
  end
25
33
 
34
+ def deep_summary_by_category_label(event_key)
35
+ fetch_deep_summary_report('byCategoryLabel', event_key)
36
+ end
37
+
26
38
  def summary_by_section(event_key)
27
39
  fetch_summary_report('bySection', event_key)
28
40
  end
29
41
 
42
+ def deep_summary_by_section(event_key)
43
+ fetch_deep_summary_report('bySection', event_key)
44
+ end
45
+
30
46
  def summary_by_selectability(event_key)
31
47
  fetch_summary_report('bySelectability', event_key)
32
48
  end
33
49
 
50
+ def deep_summary_by_selectability(event_key)
51
+ fetch_deep_summary_report('bySelectability', event_key)
52
+ end
53
+
34
54
  def summary_by_channel(event_key)
35
55
  fetch_summary_report('byChannel', event_key)
36
56
  end
37
57
 
58
+ def deep_summary_by_channel(event_key)
59
+ fetch_deep_summary_report('byChannel', event_key)
60
+ end
61
+
38
62
  def by_label(event_key, label = nil)
39
63
  fetch_report('byLabel', event_key, label)
40
64
  end
@@ -74,15 +98,20 @@ module Seatsio
74
98
  @http_client.get(url)
75
99
  end
76
100
 
101
+ def fetch_deep_summary_report(report_type, event_key)
102
+ url = "reports/events/#{event_key}/#{report_type}/summary/deep"
103
+ @http_client.get(url)
104
+ end
105
+
77
106
  def fetch_report(report_type, event_key, report_filter = nil)
78
107
  if report_filter
79
108
  url = "reports/events/#{event_key}/#{report_type}/#{report_filter}"
80
109
  body = @http_client.get(url)
81
- Domain::EventReport.new(body[report_filter])
110
+ EventReport.new(body[report_filter])
82
111
  else
83
112
  url = "reports/events/#{event_key}/#{report_type}"
84
113
  body = @http_client.get(url)
85
- Domain::EventReport.new(body)
114
+ EventReport.new(body)
86
115
  end
87
116
  end
88
117
  end
@@ -15,22 +15,21 @@ module Seatsio
15
15
  @http_client = ::Seatsio::HttpClient.new(secret_key, workspace_key, base_url)
16
16
  end
17
17
 
18
- def create(chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil, social_distancing_ruleset_key: nil)
19
- payload = build_event_request(chart_key: chart_key, event_key: event_key, book_whole_tables: book_whole_tables,
20
- table_booking_modes: table_booking_modes, social_distancing_ruleset_key: social_distancing_ruleset_key)
18
+ def create(chart_key: nil, event_key: nil, table_booking_config: nil, social_distancing_ruleset_key: nil)
19
+ payload = build_event_request(chart_key: chart_key, event_key: event_key,
20
+ table_booking_config: table_booking_config, social_distancing_ruleset_key: social_distancing_ruleset_key)
21
21
  response = @http_client.post("events", payload)
22
- Domain::Event.new(response)
22
+ Event.new(response)
23
23
  end
24
24
 
25
25
  def create_multiple(key: nil, event_creation_params: nil)
26
26
  payload = build_events_request(chart_key: key, event_creation_params: event_creation_params)
27
27
  response = @http_client.post("events/actions/create-multiple", payload)
28
- Domain::Events.new(response).events
28
+ Events.new(response).events
29
29
  end
30
30
 
31
- def update(key:, chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil, social_distancing_ruleset_key: nil)
32
- payload = build_event_request(chart_key: chart_key, event_key: event_key, book_whole_tables: book_whole_tables,
33
- table_booking_modes: table_booking_modes, social_distancing_ruleset_key: social_distancing_ruleset_key)
31
+ def update(key:, chart_key: nil, event_key: nil, table_booking_config: nil, social_distancing_ruleset_key: nil)
32
+ payload = build_event_request(chart_key: chart_key, event_key: event_key, table_booking_config: table_booking_config, social_distancing_ruleset_key: social_distancing_ruleset_key)
34
33
  @http_client.post("/events/#{key}", payload)
35
34
  end
36
35
 
@@ -47,77 +46,76 @@ module Seatsio
47
46
  def retrieve_object_status(key:, object_key:)
48
47
  url = "events/#{key}/objects/#{CGI::escape(object_key).gsub('+', '%20')}"
49
48
  response = @http_client.get(url)
50
- Domain::ObjectStatus.new(response)
49
+ ObjectStatus.new(response)
51
50
  end
52
51
 
53
- def book(event_key_or_keys, object_or_objects, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
54
- self.change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::BOOKED, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
52
+ def book(event_key_or_keys, object_or_objects, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil, ignore_social_distancing: nil)
53
+ self.change_object_status(event_key_or_keys, object_or_objects, ObjectStatus::BOOKED, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys, ignore_social_distancing: ignore_social_distancing)
55
54
  end
56
55
 
57
- def change_object_status(event_key_or_keys, object_or_objects, status, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
58
- request = create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys)
56
+ def change_object_status(event_key_or_keys, object_or_objects, status, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil, ignore_social_distancing: nil)
57
+ request = create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys, ignore_social_distancing)
59
58
  request[:params] = {
60
59
  :expand => 'objects'
61
60
  }
62
61
  response = @http_client.post("seasons/actions/change-object-status", request)
63
- Domain::ChangeObjectStatusResult.new(response)
62
+ ChangeObjectStatusResult.new(response)
64
63
  end
65
64
 
66
65
  def change_object_status_in_batch(status_change_requests)
67
66
  request = {
68
67
  :statusChanges => status_change_requests,
69
- :params => { :expand => 'objects' }
68
+ :params => {:expand => 'objects'}
70
69
  }
71
70
  response = @http_client.post("events/actions/change-object-status", request)
72
- Domain::ChangeObjectStatusInBatchResult.new(response).results
71
+ ChangeObjectStatusInBatchResult.new(response).results
73
72
  end
74
73
 
75
- def hold(event_key_or_keys, object_or_objects, hold_token, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
76
- change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::HELD, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
74
+ def hold(event_key_or_keys, object_or_objects, hold_token, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil, ignore_social_distancing: nil)
75
+ change_object_status(event_key_or_keys, object_or_objects, ObjectStatus::HELD, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys, ignore_social_distancing: ignore_social_distancing)
77
76
  end
78
77
 
79
78
  def change_best_available_object_status(key, number, status, categories: nil, hold_token: nil, extra_data: nil, ticket_types: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
80
79
  request = create_change_best_available_object_status_request(number, status, categories, extra_data, ticket_types, hold_token, order_id, keep_extra_data, ignore_channels, channel_keys)
81
80
  response = @http_client.post("events/#{key}/actions/change-object-status", request)
82
- Domain::BestAvailableObjects.new(response)
81
+ BestAvailableObjects.new(response)
83
82
  end
84
83
 
85
84
  def book_best_available(key, number, categories: nil, hold_token: nil, order_id: nil, keep_extra_data: nil, extra_data: nil, ticket_types: nil, ignore_channels: nil, channel_keys: nil)
86
- change_best_available_object_status(key, number, Domain::ObjectStatus::BOOKED, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
85
+ change_best_available_object_status(key, number, ObjectStatus::BOOKED, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
87
86
  end
88
87
 
89
88
  def hold_best_available(key, number, hold_token, categories: nil, order_id: nil, keep_extra_data: nil, extra_data: nil, ticket_types: nil, ignore_channels: nil, channel_keys: nil)
90
- change_best_available_object_status(key, number, Domain::ObjectStatus::HELD, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
89
+ change_best_available_object_status(key, number, ObjectStatus::HELD, categories: categories, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, extra_data: extra_data, ticket_types: ticket_types, ignore_channels: ignore_channels, channel_keys: channel_keys)
91
90
  end
92
91
 
93
92
  def release(event_key_or_keys, object_or_objects, hold_token: nil, order_id: nil, keep_extra_data: nil, ignore_channels: nil, channel_keys: nil)
94
- change_object_status(event_key_or_keys, object_or_objects, Domain::ObjectStatus::FREE, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
93
+ change_object_status(event_key_or_keys, object_or_objects, ObjectStatus::FREE, hold_token: hold_token, order_id: order_id, keep_extra_data: keep_extra_data, ignore_channels: ignore_channels, channel_keys: channel_keys)
95
94
  end
96
95
 
97
96
  def delete(key:)
98
97
  @http_client.delete("/events/#{key}")
99
98
  end
100
99
 
101
-
102
100
  def retrieve(key:)
103
101
  response = @http_client.get("events/#{key}")
104
- Domain::Event.new(response)
102
+ Event.new(response)
105
103
  end
106
104
 
107
105
  def list
108
- Pagination::Cursor.new(Domain::Event, 'events', @http_client)
106
+ Pagination::Cursor.new(Event, 'events', @http_client)
109
107
  end
110
108
 
111
109
  def list_status_changes(key, object_id = nil)
112
110
  if object_id != nil
113
111
  status_changes_for_object key: key, object_id: object_id
114
112
  else
115
- Pagination::Cursor.new(Domain::StatusChange, "/events/#{key}/status-changes", @http_client)
113
+ Pagination::Cursor.new(StatusChange, "/events/#{key}/status-changes", @http_client)
116
114
  end
117
115
  end
118
116
 
119
117
  def status_changes_for_object(key:, object_id:)
120
- Pagination::Cursor.new(Domain::StatusChange, "/events/#{key}/objects/#{object_id}/status-changes", @http_client)
118
+ Pagination::Cursor.new(StatusChange, "/events/#{key}/objects/#{object_id}/status-changes", @http_client)
121
119
  end
122
120
 
123
121
  def mark_as_not_for_sale(key:, objects: nil, categories: nil)
@@ -157,12 +155,11 @@ module Seatsio
157
155
  payload
158
156
  end
159
157
 
160
- def build_event_request(chart_key: nil, event_key: nil, book_whole_tables: nil, table_booking_modes: nil, social_distancing_ruleset_key: nil)
158
+ def build_event_request(chart_key: nil, event_key: nil, table_booking_config: nil, social_distancing_ruleset_key: nil)
161
159
  result = {}
162
160
  result["chartKey"] = chart_key if chart_key
163
161
  result["eventKey"] = event_key if event_key
164
- result["bookWholeTables"] = book_whole_tables if book_whole_tables != nil
165
- result["tableBookingModes"] = table_booking_modes if table_booking_modes != nil
162
+ result["tableBookingConfig"] = table_booking_config_to_request(table_booking_config) if table_booking_config != nil
166
163
  result["socialDistancingRulesetKey"] = social_distancing_ruleset_key if social_distancing_ruleset_key != nil
167
164
  result
168
165
  end
@@ -179,12 +176,18 @@ module Seatsio
179
176
  params.each do |param|
180
177
  r = {}
181
178
  r["eventKey"] = param[:event_key] if param[:event_key] != nil
182
- r["bookWholeTables"] = param[:book_whole_tables] if param[:book_whole_tables] != nil
183
- r["tableBookingModes"] = param[:table_booking_modes] if param[:table_booking_modes] != nil
179
+ r["tableBookingConfig"] = table_booking_config_to_request(param[:table_booking_config]) if param[:table_booking_config] != nil
184
180
  result.push(r)
185
181
  end
186
182
  result
187
183
  end
188
184
 
185
+ def table_booking_config_to_request(table_booking_config)
186
+ result = {}
187
+ result["mode"] = table_booking_config.mode
188
+ result["tables"] = table_booking_config.tables if table_booking_config.tables != nil
189
+ result
190
+ end
191
+
189
192
  end
190
193
  end
@@ -1,4 +1,4 @@
1
- def create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys)
1
+ def create_change_object_status_request(object_or_objects, status, hold_token, order_id, event_key_or_keys, keep_extra_data, ignore_channels, channel_keys, ignore_social_distancing)
2
2
  result = {}
3
3
  result[:objects] = normalize(object_or_objects)
4
4
  result[:status] = status
@@ -12,6 +12,7 @@ def create_change_object_status_request(object_or_objects, status, hold_token, o
12
12
  result[:keepExtraData] = keep_extra_data if keep_extra_data != nil
13
13
  result[:ignoreChannels] = ignore_channels if ignore_channels != nil
14
14
  result[:channelKeys] = channel_keys if channel_keys != nil
15
+ result[:ignoreSocialDistancing] = ignore_social_distancing if ignore_social_distancing != nil
15
16
  result
16
17
  end
17
18
 
@@ -21,18 +21,18 @@ module Seatsio
21
21
  body[:expiresInMinutes] = expires_in_minutes
22
22
  end
23
23
  response = @http_client.post('hold-tokens', body)
24
- Domain::HoldToken.new(response)
24
+ HoldToken.new(response)
25
25
  end
26
26
 
27
27
  def retrieve(hold_token)
28
28
  response = @http_client.get("/hold-tokens/#{hold_token}")
29
- Domain::HoldToken.new(response)
29
+ HoldToken.new(response)
30
30
  end
31
31
 
32
32
  def expire_in_minutes(hold_token, expires_in_minutes = nil)
33
33
  body = {"expiresInMinutes": expires_in_minutes}
34
34
  response = @http_client.post("/hold-tokens/#{hold_token}", body)
35
- Domain::HoldToken.new(response)
35
+ HoldToken.new(response)
36
36
  end
37
37
  end
38
38
  end
@@ -17,7 +17,7 @@ module Seatsio
17
17
  body['name'] = name if name
18
18
 
19
19
  response = @http_client.post("subaccounts", body)
20
- Domain::Subaccount.new(response)
20
+ Subaccount.new(response)
21
21
  end
22
22
 
23
23
  def update(id:, name: nil)
@@ -50,17 +50,17 @@ module Seatsio
50
50
 
51
51
  def retrieve(id:)
52
52
  response = @http_client.get("/subaccounts/#{id}")
53
- Domain::Subaccount.new(response)
53
+ Subaccount.new(response)
54
54
  end
55
55
 
56
56
  def copy_chart_to_parent(id: nil, chart_key: nil)
57
57
  response = @http_client.post("/subaccounts/#{id}/charts/#{chart_key}/actions/copy-to/parent")
58
- Domain::Chart.new(response)
58
+ Chart.new(response)
59
59
  end
60
60
 
61
61
  def copy_chart_to_subaccount(from_id: nil, to_id: nil, chart_key: nil)
62
62
  response = @http_client.post("/subaccounts/#{from_id}/charts/#{chart_key}/actions/copy-to/#{to_id}")
63
- Domain::Chart.new(response)
63
+ Chart.new(response)
64
64
  end
65
65
 
66
66
  def regenerate_secret_key(id:)
@@ -75,7 +75,7 @@ module Seatsio
75
75
 
76
76
  def cursor(status: nil)
77
77
  endpoint = status ? "subaccounts/#{status}" : 'subaccounts'
78
- Pagination::Cursor.new(Domain::Subaccount, endpoint, @http_client)
78
+ Pagination::Cursor.new(Subaccount, endpoint, @http_client)
79
79
  end
80
80
  end
81
81
  end
@@ -13,19 +13,19 @@ module Seatsio
13
13
  def summary_for_all_months
14
14
  url = "reports/usage"
15
15
  body = @http_client.get(url)
16
- Domain::UsageSummaryForAllMoths.new(body)
16
+ UsageSummaryForAllMoths.new(body)
17
17
  end
18
18
 
19
19
  def details_for_month(month)
20
20
  url = "reports/usage/month/" + month.serialize
21
21
  body = @http_client.get(url)
22
- body.map { |item| Domain::UsageDetails.new(item) }
22
+ body.map { |item| UsageDetails.new(item) }
23
23
  end
24
24
 
25
25
  def details_for_event_in_month(eventId, month)
26
26
  url = "reports/usage/month/" + month.serialize + "/event/" + eventId.to_s
27
27
  body = @http_client.get(url)
28
- body.map { |item| Domain::UsageForObject.new(item) }
28
+ body.map { |item| UsageForObject.new(item) }
29
29
  end
30
30
  end
31
31
  end
@@ -1,3 +1,3 @@
1
1
  module Seatsio
2
- VERSION = "26.2.0"
2
+ VERSION = "31.0.0"
3
3
  end
@@ -18,7 +18,7 @@ module Seatsio
18
18
  body['isTest'] = is_test if is_test
19
19
 
20
20
  response = @http_client.post("workspaces", body)
21
- Domain::Workspace.new(response)
21
+ Workspace.new(response)
22
22
  end
23
23
 
24
24
  def update(key:, name:)
@@ -52,13 +52,13 @@ module Seatsio
52
52
 
53
53
  def retrieve(key:)
54
54
  response = @http_client.get("/workspaces/#{key}")
55
- Domain::Workspace.new(response)
55
+ Workspace.new(response)
56
56
  end
57
57
 
58
58
  private
59
59
 
60
60
  def cursor()
61
- Pagination::Cursor.new(Domain::Workspace, 'workspaces', @http_client)
61
+ Pagination::Cursor.new(Workspace, 'workspaces', @http_client)
62
62
  end
63
63
  end
64
64
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: seatsio
3
3
  version: !ruby/object:Gem::Version
4
- version: 26.2.0
4
+ version: 31.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Seats.io
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-01 00:00:00.000000000 Z
11
+ date: 2021-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,9 +100,10 @@ extensions: []
100
100
  extra_rdoc_files: []
101
101
  files:
102
102
  - ".editorconfig"
103
+ - ".github/workflows/build.yml"
104
+ - ".github/workflows/publish.yml"
103
105
  - ".gitignore"
104
106
  - ".ruby-version"
105
- - ".travis.yml"
106
107
  - Gemfile
107
108
  - Gemfile.lock
108
109
  - README.md
@@ -132,7 +133,7 @@ files:
132
133
  homepage: http://seats.io
133
134
  licenses: []
134
135
  metadata: {}
135
- post_install_message:
136
+ post_install_message:
136
137
  rdoc_options: []
137
138
  require_paths:
138
139
  - lib
@@ -147,8 +148,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
147
148
  - !ruby/object:Gem::Version
148
149
  version: '0'
149
150
  requirements: []
150
- rubygems_version: 3.0.8
151
- signing_key:
151
+ rubygems_version: 3.1.2
152
+ signing_key:
152
153
  specification_version: 4
153
154
  summary: the official Seats.io Ruby client library
154
155
  test_files: []
data/.travis.yml DELETED
@@ -1,19 +0,0 @@
1
- sudo: false
2
- language: ruby
3
- rvm:
4
- - 2.3.0
5
- before_install: gem install bundler -v 1.16.1
6
- notifications:
7
- slack:
8
- rooms:
9
- - seatsio:AGaZISx4HlvoEx6WTbVaX50V
10
- on_pull_requests: false
11
- on_failure: always
12
- on_success: change
13
- deploy:
14
- provider: rubygems
15
- gem: seatsio
16
- on:
17
- tags: true
18
- api_key:
19
- secure: mQmsVgbIYF16i0rzDYQoOzcXwG8ppJl/czjTWf/KaEtSCWG5tQKBzflXFIkrfoP7EyjC+2TvT4Z5tWIBUVR4gG2KjcV2lGgq2vV/sVYrmUIXO2LZHBu5n35QHBF//0IOvbZMufm7W8PIVM6do1tMxdRE+qMZVtb5M9YIQpDHc6jXru/PKxOffwTNEWMVX1Xjfz4wtuJCpvhR+BHuBoi9uE4dyWrF5WgkL2aELUvHpUmc2wn0gGypqJ9Whrcxq8n3EREvO0kiSMww+MMdWd57ACo4q5J8Za+h4tXvVd49EyEdevjWMvT0wYx+nSz+/vk4B9vOmd5Un9/gzoLbq8qEpAgEHXKw/J6l9KHlJDMNy2dVsMzqSOceEtBx5LA0fizWD4U2XfI0GaiM5Rdt96iNtVlU9lQuiXPhcz7igEFVRSZAkzTNHlh0cAr2FJIBBh27fffrblF/xRw1ziLwDnjutTg8lZsxmdjTrnMkAAuNWMIXKzWvh7n2bZ+jqwzp5bSqp1ckOCae7ozsG1Kx1eS8pMepsvMtmb5w6dsuWGVAI8ASd8XmYFHKisKmi6xHYOGw7uy7yE7rXHa0Ypx/K4xKCoqhv+5Y7RdTvT2tkqC0mwMOh/Io2eslgjTA0vy87sVKyLTCU/ElKRTd2165cRL2JRNH3l/X0gxglT4WpXQEEXs=