context.dev 2.5.0 → 2.7.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +23 -0
- data/README.md +1 -1
- data/lib/context_dev/client.rb +4 -0
- data/lib/context_dev/models/batch_cancel_params.rb +22 -0
- data/lib/context_dev/models/batch_cancel_response.rb +241 -0
- data/lib/context_dev/models/batch_get_results_params.rb +42 -0
- data/lib/context_dev/models/batch_get_results_response.rb +463 -0
- data/lib/context_dev/models/batch_list_params.rb +94 -0
- data/lib/context_dev/models/batch_list_response.rb +379 -0
- data/lib/context_dev/models/batch_retrieve_params.rb +22 -0
- data/lib/context_dev/models/batch_retrieve_response.rb +373 -0
- data/lib/context_dev/models/batch_submit_params.rb +56 -0
- data/lib/context_dev/models/batch_submit_response.rb +614 -0
- data/lib/context_dev/models/crawl_controls.rb +126 -0
- data/lib/context_dev/models/failure.rb +27 -0
- data/lib/context_dev/models/intake.rb +62 -0
- data/lib/context_dev/models/monitor_create_params.rb +141 -127
- data/lib/context_dev/models/monitor_create_response.rb +34 -10
- data/lib/context_dev/models/monitor_list_response.rb +21 -7
- data/lib/context_dev/models/monitor_retrieve_response.rb +21 -7
- data/lib/context_dev/models/monitor_update_params.rb +21 -7
- data/lib/context_dev/models/monitor_update_response.rb +21 -7
- data/lib/context_dev/models/page_error_count.rb +26 -0
- data/lib/context_dev/models/web_screenshot_params.rb +5 -7
- data/lib/context_dev/models/web_web_crawl_md_params.rb +5 -7
- data/lib/context_dev/models/web_web_scrape_html_params.rb +5 -7
- data/lib/context_dev/models/web_web_scrape_html_response.rb +93 -1
- data/lib/context_dev/models/web_web_scrape_md_params.rb +5 -7
- data/lib/context_dev/models/web_web_scrape_md_response.rb +93 -1
- data/lib/context_dev/models.rb +18 -0
- data/lib/context_dev/resources/batch.rb +152 -0
- data/lib/context_dev/resources/monitors.rb +5 -5
- data/lib/context_dev/resources/web.rb +4 -4
- data/lib/context_dev/version.rb +1 -1
- data/lib/context_dev.rb +15 -0
- data/rbi/context_dev/client.rbi +3 -0
- data/rbi/context_dev/models/batch_cancel_params.rbi +40 -0
- data/rbi/context_dev/models/batch_cancel_response.rbi +424 -0
- data/rbi/context_dev/models/batch_get_results_params.rbi +70 -0
- data/rbi/context_dev/models/batch_get_results_response.rbi +848 -0
- data/rbi/context_dev/models/batch_list_params.rbi +166 -0
- data/rbi/context_dev/models/batch_list_response.rbi +713 -0
- data/rbi/context_dev/models/batch_retrieve_params.rbi +40 -0
- data/rbi/context_dev/models/batch_retrieve_response.rbi +672 -0
- data/rbi/context_dev/models/batch_submit_params.rbi +105 -0
- data/rbi/context_dev/models/batch_submit_response.rbi +1330 -0
- data/rbi/context_dev/models/crawl_controls.rbi +252 -0
- data/rbi/context_dev/models/failure.rbi +35 -0
- data/rbi/context_dev/models/intake.rbi +88 -0
- data/rbi/context_dev/models/monitor_create_params.rbi +274 -242
- data/rbi/context_dev/models/monitor_create_response.rbi +38 -7
- data/rbi/context_dev/models/monitor_list_response.rbi +24 -5
- data/rbi/context_dev/models/monitor_retrieve_response.rbi +24 -5
- data/rbi/context_dev/models/monitor_update_params.rbi +24 -5
- data/rbi/context_dev/models/monitor_update_response.rbi +24 -5
- data/rbi/context_dev/models/page_error_count.rbi +34 -0
- data/rbi/context_dev/models/web_screenshot_params.rbi +6 -9
- data/rbi/context_dev/models/web_web_crawl_md_params.rbi +6 -9
- data/rbi/context_dev/models/web_web_scrape_html_params.rbi +6 -9
- data/rbi/context_dev/models/web_web_scrape_html_response.rbi +182 -0
- data/rbi/context_dev/models/web_web_scrape_md_params.rbi +6 -9
- data/rbi/context_dev/models/web_web_scrape_md_response.rbi +180 -0
- data/rbi/context_dev/models.rbi +18 -0
- data/rbi/context_dev/resources/batch.rbi +117 -0
- data/rbi/context_dev/resources/monitors.rbi +12 -12
- data/rbi/context_dev/resources/web.rbi +8 -12
- data/sig/context_dev/client.rbs +2 -0
- data/sig/context_dev/models/batch_cancel_params.rbs +23 -0
- data/sig/context_dev/models/batch_cancel_response.rbs +174 -0
- data/sig/context_dev/models/batch_get_results_params.rbs +36 -0
- data/sig/context_dev/models/batch_get_results_response.rbs +399 -0
- data/sig/context_dev/models/batch_list_params.rbs +94 -0
- data/sig/context_dev/models/batch_list_response.rbs +283 -0
- data/sig/context_dev/models/batch_retrieve_params.rbs +23 -0
- data/sig/context_dev/models/batch_retrieve_response.rbs +262 -0
- data/sig/context_dev/models/batch_submit_params.rbs +52 -0
- data/sig/context_dev/models/batch_submit_response.rbs +542 -0
- data/sig/context_dev/models/crawl_controls.rbs +114 -0
- data/sig/context_dev/models/failure.rbs +15 -0
- data/sig/context_dev/models/intake.rbs +40 -0
- data/sig/context_dev/models/monitor_create_params.rbs +117 -97
- data/sig/context_dev/models/monitor_create_response.rbs +18 -1
- data/sig/context_dev/models/monitor_list_response.rbs +13 -1
- data/sig/context_dev/models/monitor_retrieve_response.rbs +13 -1
- data/sig/context_dev/models/monitor_update_params.rbs +13 -1
- data/sig/context_dev/models/monitor_update_response.rbs +13 -1
- data/sig/context_dev/models/page_error_count.rbs +15 -0
- data/sig/context_dev/models/web_web_scrape_html_response.rbs +85 -0
- data/sig/context_dev/models/web_web_scrape_md_response.rbs +85 -0
- data/sig/context_dev/models.rbs +18 -0
- data/sig/context_dev/resources/batch.rbs +41 -0
- data/sig/context_dev/resources/monitors.rbs +2 -2
- metadata +47 -2
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module ContextDev
|
|
4
|
+
module Models
|
|
5
|
+
class CrawlControls < ContextDev::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias do
|
|
8
|
+
T.any(ContextDev::CrawlControls, ContextDev::Internal::AnyHash)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Whether links to subdomains were followed. Always false for a sitemap crawl.
|
|
12
|
+
sig { returns(T::Boolean) }
|
|
13
|
+
attr_accessor :follow_subdomains
|
|
14
|
+
|
|
15
|
+
# Link depth limit. Always 0 for a sitemap crawl, which never follows links off
|
|
16
|
+
# its URLs; null when a `start_url` crawl set no limit.
|
|
17
|
+
sig { returns(T.nilable(Integer)) }
|
|
18
|
+
attr_accessor :max_depth
|
|
19
|
+
|
|
20
|
+
# The `maxUrls` submitted with the crawl. A sitemap crawl scrapes only the URLs
|
|
21
|
+
# its sitemap actually lists, up to this many, so `input.reserved` is often lower.
|
|
22
|
+
sig { returns(Integer) }
|
|
23
|
+
attr_accessor :max_pages
|
|
24
|
+
|
|
25
|
+
# Where the crawl started.
|
|
26
|
+
sig { returns(ContextDev::CrawlControls::Source::Variants) }
|
|
27
|
+
attr_accessor :source
|
|
28
|
+
|
|
29
|
+
# RE2 pattern URLs had to match to be crawled. Null when the crawl set none.
|
|
30
|
+
sig { returns(T.nilable(String)) }
|
|
31
|
+
attr_accessor :url_pattern
|
|
32
|
+
|
|
33
|
+
# The crawl controls as submitted, so the limits requested can be compared against
|
|
34
|
+
# what the crawl reached.
|
|
35
|
+
sig do
|
|
36
|
+
params(
|
|
37
|
+
follow_subdomains: T::Boolean,
|
|
38
|
+
max_depth: T.nilable(Integer),
|
|
39
|
+
max_pages: Integer,
|
|
40
|
+
source:
|
|
41
|
+
T.any(
|
|
42
|
+
ContextDev::CrawlControls::Source::UnionMember0::OrHash,
|
|
43
|
+
ContextDev::CrawlControls::Source::UnionMember1::OrHash
|
|
44
|
+
),
|
|
45
|
+
url_pattern: T.nilable(String)
|
|
46
|
+
).returns(T.attached_class)
|
|
47
|
+
end
|
|
48
|
+
def self.new(
|
|
49
|
+
# Whether links to subdomains were followed. Always false for a sitemap crawl.
|
|
50
|
+
follow_subdomains:,
|
|
51
|
+
# Link depth limit. Always 0 for a sitemap crawl, which never follows links off
|
|
52
|
+
# its URLs; null when a `start_url` crawl set no limit.
|
|
53
|
+
max_depth:,
|
|
54
|
+
# The `maxUrls` submitted with the crawl. A sitemap crawl scrapes only the URLs
|
|
55
|
+
# its sitemap actually lists, up to this many, so `input.reserved` is often lower.
|
|
56
|
+
max_pages:,
|
|
57
|
+
# Where the crawl started.
|
|
58
|
+
source:,
|
|
59
|
+
# RE2 pattern URLs had to match to be crawled. Null when the crawl set none.
|
|
60
|
+
url_pattern:
|
|
61
|
+
)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
sig do
|
|
65
|
+
override.returns(
|
|
66
|
+
{
|
|
67
|
+
follow_subdomains: T::Boolean,
|
|
68
|
+
max_depth: T.nilable(Integer),
|
|
69
|
+
max_pages: Integer,
|
|
70
|
+
source: ContextDev::CrawlControls::Source::Variants,
|
|
71
|
+
url_pattern: T.nilable(String)
|
|
72
|
+
}
|
|
73
|
+
)
|
|
74
|
+
end
|
|
75
|
+
def to_hash
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Where the crawl started.
|
|
79
|
+
module Source
|
|
80
|
+
extend ContextDev::Internal::Type::Union
|
|
81
|
+
|
|
82
|
+
Variants =
|
|
83
|
+
T.type_alias do
|
|
84
|
+
T.any(
|
|
85
|
+
ContextDev::CrawlControls::Source::UnionMember0,
|
|
86
|
+
ContextDev::CrawlControls::Source::UnionMember1
|
|
87
|
+
)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
class UnionMember0 < ContextDev::Internal::Type::BaseModel
|
|
91
|
+
OrHash =
|
|
92
|
+
T.type_alias do
|
|
93
|
+
T.any(
|
|
94
|
+
ContextDev::CrawlControls::Source::UnionMember0,
|
|
95
|
+
ContextDev::Internal::AnyHash
|
|
96
|
+
)
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
sig do
|
|
100
|
+
returns(
|
|
101
|
+
ContextDev::CrawlControls::Source::UnionMember0::Type::TaggedSymbol
|
|
102
|
+
)
|
|
103
|
+
end
|
|
104
|
+
attr_accessor :type
|
|
105
|
+
|
|
106
|
+
# Page the crawl started from.
|
|
107
|
+
sig { returns(String) }
|
|
108
|
+
attr_accessor :url
|
|
109
|
+
|
|
110
|
+
sig do
|
|
111
|
+
params(
|
|
112
|
+
type:
|
|
113
|
+
ContextDev::CrawlControls::Source::UnionMember0::Type::OrSymbol,
|
|
114
|
+
url: String
|
|
115
|
+
).returns(T.attached_class)
|
|
116
|
+
end
|
|
117
|
+
def self.new(
|
|
118
|
+
type:,
|
|
119
|
+
# Page the crawl started from.
|
|
120
|
+
url:
|
|
121
|
+
)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
sig do
|
|
125
|
+
override.returns(
|
|
126
|
+
{
|
|
127
|
+
type:
|
|
128
|
+
ContextDev::CrawlControls::Source::UnionMember0::Type::TaggedSymbol,
|
|
129
|
+
url: String
|
|
130
|
+
}
|
|
131
|
+
)
|
|
132
|
+
end
|
|
133
|
+
def to_hash
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
module Type
|
|
137
|
+
extend ContextDev::Internal::Type::Enum
|
|
138
|
+
|
|
139
|
+
TaggedSymbol =
|
|
140
|
+
T.type_alias do
|
|
141
|
+
T.all(
|
|
142
|
+
Symbol,
|
|
143
|
+
ContextDev::CrawlControls::Source::UnionMember0::Type
|
|
144
|
+
)
|
|
145
|
+
end
|
|
146
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
147
|
+
|
|
148
|
+
START_URL =
|
|
149
|
+
T.let(
|
|
150
|
+
:start_url,
|
|
151
|
+
ContextDev::CrawlControls::Source::UnionMember0::Type::TaggedSymbol
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
sig do
|
|
155
|
+
override.returns(
|
|
156
|
+
T::Array[
|
|
157
|
+
ContextDev::CrawlControls::Source::UnionMember0::Type::TaggedSymbol
|
|
158
|
+
]
|
|
159
|
+
)
|
|
160
|
+
end
|
|
161
|
+
def self.values
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
class UnionMember1 < ContextDev::Internal::Type::BaseModel
|
|
167
|
+
OrHash =
|
|
168
|
+
T.type_alias do
|
|
169
|
+
T.any(
|
|
170
|
+
ContextDev::CrawlControls::Source::UnionMember1,
|
|
171
|
+
ContextDev::Internal::AnyHash
|
|
172
|
+
)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
# Domain whose sitemap supplied the pages.
|
|
176
|
+
sig { returns(String) }
|
|
177
|
+
attr_accessor :domain
|
|
178
|
+
|
|
179
|
+
sig do
|
|
180
|
+
returns(
|
|
181
|
+
ContextDev::CrawlControls::Source::UnionMember1::Type::TaggedSymbol
|
|
182
|
+
)
|
|
183
|
+
end
|
|
184
|
+
attr_accessor :type
|
|
185
|
+
|
|
186
|
+
sig do
|
|
187
|
+
params(
|
|
188
|
+
domain: String,
|
|
189
|
+
type:
|
|
190
|
+
ContextDev::CrawlControls::Source::UnionMember1::Type::OrSymbol
|
|
191
|
+
).returns(T.attached_class)
|
|
192
|
+
end
|
|
193
|
+
def self.new(
|
|
194
|
+
# Domain whose sitemap supplied the pages.
|
|
195
|
+
domain:,
|
|
196
|
+
type:
|
|
197
|
+
)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
sig do
|
|
201
|
+
override.returns(
|
|
202
|
+
{
|
|
203
|
+
domain: String,
|
|
204
|
+
type:
|
|
205
|
+
ContextDev::CrawlControls::Source::UnionMember1::Type::TaggedSymbol
|
|
206
|
+
}
|
|
207
|
+
)
|
|
208
|
+
end
|
|
209
|
+
def to_hash
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
module Type
|
|
213
|
+
extend ContextDev::Internal::Type::Enum
|
|
214
|
+
|
|
215
|
+
TaggedSymbol =
|
|
216
|
+
T.type_alias do
|
|
217
|
+
T.all(
|
|
218
|
+
Symbol,
|
|
219
|
+
ContextDev::CrawlControls::Source::UnionMember1::Type
|
|
220
|
+
)
|
|
221
|
+
end
|
|
222
|
+
OrSymbol = T.type_alias { T.any(Symbol, String) }
|
|
223
|
+
|
|
224
|
+
SITEMAP =
|
|
225
|
+
T.let(
|
|
226
|
+
:sitemap,
|
|
227
|
+
ContextDev::CrawlControls::Source::UnionMember1::Type::TaggedSymbol
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
sig do
|
|
231
|
+
override.returns(
|
|
232
|
+
T::Array[
|
|
233
|
+
ContextDev::CrawlControls::Source::UnionMember1::Type::TaggedSymbol
|
|
234
|
+
]
|
|
235
|
+
)
|
|
236
|
+
end
|
|
237
|
+
def self.values
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
sig do
|
|
243
|
+
override.returns(
|
|
244
|
+
T::Array[ContextDev::CrawlControls::Source::Variants]
|
|
245
|
+
)
|
|
246
|
+
end
|
|
247
|
+
def self.variants
|
|
248
|
+
end
|
|
249
|
+
end
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module ContextDev
|
|
4
|
+
module Models
|
|
5
|
+
class Failure < ContextDev::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias do
|
|
8
|
+
T.any(ContextDev::Failure, ContextDev::Internal::AnyHash)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# Why the batch itself stopped.
|
|
12
|
+
sig { returns(String) }
|
|
13
|
+
attr_accessor :code
|
|
14
|
+
|
|
15
|
+
# Human-readable explanation.
|
|
16
|
+
sig { returns(String) }
|
|
17
|
+
attr_accessor :message
|
|
18
|
+
|
|
19
|
+
# A failure of the batch as a whole, distinct from the per-page failures in
|
|
20
|
+
# `page_errors`.
|
|
21
|
+
sig { params(code: String, message: String).returns(T.attached_class) }
|
|
22
|
+
def self.new(
|
|
23
|
+
# Why the batch itself stopped.
|
|
24
|
+
code:,
|
|
25
|
+
# Human-readable explanation.
|
|
26
|
+
message:
|
|
27
|
+
)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
sig { override.returns({ code: String, message: String }) }
|
|
31
|
+
def to_hash
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# typed: strong
|
|
2
|
+
|
|
3
|
+
module ContextDev
|
|
4
|
+
module Models
|
|
5
|
+
class Intake < ContextDev::Internal::Type::BaseModel
|
|
6
|
+
OrHash =
|
|
7
|
+
T.type_alias do
|
|
8
|
+
T.any(ContextDev::Intake, ContextDev::Internal::AnyHash)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# URLs dropped before reserving because another entry resolved to the same page.
|
|
12
|
+
# Non-zero for sitemap crawls too, whose sitemaps routinely list a page more than
|
|
13
|
+
# once.
|
|
14
|
+
sig { returns(Integer) }
|
|
15
|
+
attr_accessor :duplicates
|
|
16
|
+
|
|
17
|
+
# URLs from your list rejected as unusable; the same ones are itemised in
|
|
18
|
+
# `invalid_urls` at submission. Null for a crawl — a crawl that resolves no usable
|
|
19
|
+
# page is rejected outright with a 400 rather than accepted with an empty list.
|
|
20
|
+
sig { returns(T.nilable(Integer)) }
|
|
21
|
+
attr_accessor :invalid
|
|
22
|
+
|
|
23
|
+
# Pages credits were reserved for. Everything else — progress, the refund, the
|
|
24
|
+
# completion percentage — is measured against this.
|
|
25
|
+
sig { returns(Integer) }
|
|
26
|
+
attr_accessor :reserved
|
|
27
|
+
|
|
28
|
+
# Whether `reserved` is an upper bound the batch may finish under. True only for a
|
|
29
|
+
# crawl that follows links, whose reachable page count is unknowable until it
|
|
30
|
+
# runs. False for a scrape and for a sitemap crawl, where `reserved` is an exact
|
|
31
|
+
# page count.
|
|
32
|
+
sig { returns(T::Boolean) }
|
|
33
|
+
attr_accessor :reserved_is_ceiling
|
|
34
|
+
|
|
35
|
+
# URLs in the list you sent, before validation and de-duplication. Null for a
|
|
36
|
+
# crawl, which is given a source rather than a list.
|
|
37
|
+
sig { returns(T.nilable(Integer)) }
|
|
38
|
+
attr_accessor :submitted
|
|
39
|
+
|
|
40
|
+
# What submission took in, and what it charged for.
|
|
41
|
+
sig do
|
|
42
|
+
params(
|
|
43
|
+
duplicates: Integer,
|
|
44
|
+
invalid: T.nilable(Integer),
|
|
45
|
+
reserved: Integer,
|
|
46
|
+
reserved_is_ceiling: T::Boolean,
|
|
47
|
+
submitted: T.nilable(Integer)
|
|
48
|
+
).returns(T.attached_class)
|
|
49
|
+
end
|
|
50
|
+
def self.new(
|
|
51
|
+
# URLs dropped before reserving because another entry resolved to the same page.
|
|
52
|
+
# Non-zero for sitemap crawls too, whose sitemaps routinely list a page more than
|
|
53
|
+
# once.
|
|
54
|
+
duplicates:,
|
|
55
|
+
# URLs from your list rejected as unusable; the same ones are itemised in
|
|
56
|
+
# `invalid_urls` at submission. Null for a crawl — a crawl that resolves no usable
|
|
57
|
+
# page is rejected outright with a 400 rather than accepted with an empty list.
|
|
58
|
+
invalid:,
|
|
59
|
+
# Pages credits were reserved for. Everything else — progress, the refund, the
|
|
60
|
+
# completion percentage — is measured against this.
|
|
61
|
+
reserved:,
|
|
62
|
+
# Whether `reserved` is an upper bound the batch may finish under. True only for a
|
|
63
|
+
# crawl that follows links, whose reachable page count is unknowable until it
|
|
64
|
+
# runs. False for a scrape and for a sitemap crawl, where `reserved` is an exact
|
|
65
|
+
# page count.
|
|
66
|
+
reserved_is_ceiling:,
|
|
67
|
+
# URLs in the list you sent, before validation and de-duplication. Null for a
|
|
68
|
+
# crawl, which is given a source rather than a list.
|
|
69
|
+
submitted:
|
|
70
|
+
)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
sig do
|
|
74
|
+
override.returns(
|
|
75
|
+
{
|
|
76
|
+
duplicates: Integer,
|
|
77
|
+
invalid: T.nilable(Integer),
|
|
78
|
+
reserved: Integer,
|
|
79
|
+
reserved_is_ceiling: T::Boolean,
|
|
80
|
+
submitted: T.nilable(Integer)
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
end
|
|
84
|
+
def to_hash
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|