@sentio/sdk 1.27.9 → 1.28.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.
@@ -7,7 +7,7 @@
7
7
  import { aptos } from "@sentio/sdk";
8
8
  import { Address, MoveModule } from "aptos-sdk/src/generated";
9
9
 
10
- import { table, event, simple_map, type_info } from "./0x1";
10
+ import * as _0x1 from "./0x1";
11
11
 
12
12
  export class token extends aptos.AptosBaseProcessor {
13
13
  constructor(options: aptos.AptosBindOptions) {
@@ -248,11 +248,11 @@ export namespace token {
248
248
 
249
249
  export class Collections {
250
250
  static TYPE_QNAME = "0x3::token::Collections";
251
- collection_data: table.Table<string, token.CollectionData>;
252
- token_data: table.Table<token.TokenDataId, token.TokenData>;
253
- create_collection_events: event.EventHandle<token.CreateCollectionEvent>;
254
- create_token_data_events: event.EventHandle<token.CreateTokenDataEvent>;
255
- mint_token_events: event.EventHandle<token.MintTokenEvent>;
251
+ collection_data: _0x1.table.Table<string, token.CollectionData>;
252
+ token_data: _0x1.table.Table<token.TokenDataId, token.TokenData>;
253
+ create_collection_events: _0x1.event.EventHandle<token.CreateCollectionEvent>;
254
+ create_token_data_events: _0x1.event.EventHandle<token.CreateTokenDataEvent>;
255
+ mint_token_events: _0x1.event.EventHandle<token.MintTokenEvent>;
256
256
  }
257
257
 
258
258
  export class CreateCollectionEvent {
@@ -382,12 +382,12 @@ export namespace token {
382
382
 
383
383
  export class TokenStore {
384
384
  static TYPE_QNAME = "0x3::token::TokenStore";
385
- tokens: table.Table<token.TokenId, token.Token>;
385
+ tokens: _0x1.table.Table<token.TokenId, token.Token>;
386
386
  direct_transfer: Boolean;
387
- deposit_events: event.EventHandle<token.DepositEvent>;
388
- withdraw_events: event.EventHandle<token.WithdrawEvent>;
389
- burn_events: event.EventHandle<token.BurnTokenEvent>;
390
- mutate_token_property_events: event.EventHandle<token.MutateTokenPropertyMapEvent>;
387
+ deposit_events: _0x1.event.EventHandle<token.DepositEvent>;
388
+ withdraw_events: _0x1.event.EventHandle<token.WithdrawEvent>;
389
+ burn_events: _0x1.event.EventHandle<token.BurnTokenEvent>;
390
+ mutate_token_property_events: _0x1.event.EventHandle<token.MutateTokenPropertyMapEvent>;
391
391
  }
392
392
 
393
393
  export class WithdrawCapability {
@@ -535,7 +535,7 @@ export namespace token {
535
535
  export namespace property_map {
536
536
  export class PropertyMap {
537
537
  static TYPE_QNAME = "0x3::property_map::PropertyMap";
538
- map: simple_map.SimpleMap<string, property_map.PropertyValue>;
538
+ map: _0x1.simple_map.SimpleMap<string, property_map.PropertyValue>;
539
539
  }
540
540
 
541
541
  export class PropertyValue {
@@ -630,7 +630,7 @@ export namespace token_coin_swap {
630
630
  amount: bigint;
631
631
  min_price: bigint;
632
632
  locked_until_secs: bigint;
633
- coin_type_info: type_info.TypeInfo;
633
+ coin_type_info: _0x1.type_info.TypeInfo;
634
634
  }
635
635
 
636
636
  export interface TokenListingEventInstance
@@ -641,14 +641,17 @@ export namespace token_coin_swap {
641
641
 
642
642
  export class TokenListings<T0> {
643
643
  static TYPE_QNAME = "0x3::token_coin_swap::TokenListings";
644
- listings: table.Table<token.TokenId, token_coin_swap.TokenCoinSwap<T0>>;
645
- listing_events: event.EventHandle<token_coin_swap.TokenListingEvent>;
646
- swap_events: event.EventHandle<token_coin_swap.TokenSwapEvent>;
644
+ listings: _0x1.table.Table<
645
+ token.TokenId,
646
+ token_coin_swap.TokenCoinSwap<T0>
647
+ >;
648
+ listing_events: _0x1.event.EventHandle<token_coin_swap.TokenListingEvent>;
649
+ swap_events: _0x1.event.EventHandle<token_coin_swap.TokenSwapEvent>;
647
650
  }
648
651
 
649
652
  export class TokenStoreEscrow {
650
653
  static TYPE_QNAME = "0x3::token_coin_swap::TokenStoreEscrow";
651
- token_escrows: table.Table<token.TokenId, token_coin_swap.TokenEscrow>;
654
+ token_escrows: _0x1.table.Table<token.TokenId, token_coin_swap.TokenEscrow>;
652
655
  }
653
656
 
654
657
  export class TokenSwapEvent {
@@ -657,7 +660,7 @@ export namespace token_coin_swap {
657
660
  token_buyer: Address;
658
661
  token_amount: bigint;
659
662
  coin_amount: bigint;
660
- coin_type_info: type_info.TypeInfo;
663
+ coin_type_info: _0x1.type_info.TypeInfo;
661
664
  }
662
665
 
663
666
  export interface TokenSwapEventInstance
@@ -784,10 +787,10 @@ export class token_transfers extends aptos.AptosBaseProcessor {
784
787
  export namespace token_transfers {
785
788
  export class PendingClaims {
786
789
  static TYPE_QNAME = "0x3::token_transfers::PendingClaims";
787
- pending_claims: table.Table<token_transfers.TokenOfferId, token.Token>;
788
- offer_events: event.EventHandle<token_transfers.TokenOfferEvent>;
789
- cancel_offer_events: event.EventHandle<token_transfers.TokenCancelOfferEvent>;
790
- claim_events: event.EventHandle<token_transfers.TokenClaimEvent>;
790
+ pending_claims: _0x1.table.Table<token_transfers.TokenOfferId, token.Token>;
791
+ offer_events: _0x1.event.EventHandle<token_transfers.TokenOfferEvent>;
792
+ cancel_offer_events: _0x1.event.EventHandle<token_transfers.TokenCancelOfferEvent>;
793
+ claim_events: _0x1.event.EventHandle<token_transfers.TokenClaimEvent>;
791
794
  }
792
795
 
793
796
  export class TokenCancelOfferEvent {
@@ -875,11 +878,8 @@ export namespace token_transfers {
875
878
  );
876
879
  }
877
880
 
878
- function loadAllTypes(_r: aptos.TypeRegistry) {
879
- table.loadTypes(_r);
880
- event.loadTypes(_r);
881
- simple_map.loadTypes(_r);
882
- type_info.loadTypes(_r);
881
+ export function loadAllTypes(_r: aptos.TypeRegistry) {
882
+ _0x1.loadAllTypes(_r);
883
883
 
884
884
  _r.load(token.ABI);
885
885
  _r.load(property_map.ABI);
@@ -0,0 +1,105 @@
1
+ /* eslint-disable */
2
+ import Long from "long";
3
+ import _m0 from "protobufjs/minimal";
4
+
5
+ export interface Timestamp {
6
+ seconds: Long;
7
+ nanos: number;
8
+ }
9
+
10
+ function createBaseTimestamp(): Timestamp {
11
+ return { seconds: Long.ZERO, nanos: 0 };
12
+ }
13
+
14
+ export const Timestamp = {
15
+ encode(
16
+ message: Timestamp,
17
+ writer: _m0.Writer = _m0.Writer.create()
18
+ ): _m0.Writer {
19
+ if (!message.seconds.isZero()) {
20
+ writer.uint32(8).int64(message.seconds);
21
+ }
22
+ if (message.nanos !== 0) {
23
+ writer.uint32(16).int32(message.nanos);
24
+ }
25
+ return writer;
26
+ },
27
+
28
+ decode(input: _m0.Reader | Uint8Array, length?: number): Timestamp {
29
+ const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
30
+ let end = length === undefined ? reader.len : reader.pos + length;
31
+ const message = createBaseTimestamp();
32
+ while (reader.pos < end) {
33
+ const tag = reader.uint32();
34
+ switch (tag >>> 3) {
35
+ case 1:
36
+ message.seconds = reader.int64() as Long;
37
+ break;
38
+ case 2:
39
+ message.nanos = reader.int32();
40
+ break;
41
+ default:
42
+ reader.skipType(tag & 7);
43
+ break;
44
+ }
45
+ }
46
+ return message;
47
+ },
48
+
49
+ fromJSON(object: any): Timestamp {
50
+ return {
51
+ seconds: isSet(object.seconds)
52
+ ? Long.fromValue(object.seconds)
53
+ : Long.ZERO,
54
+ nanos: isSet(object.nanos) ? Number(object.nanos) : 0,
55
+ };
56
+ },
57
+
58
+ toJSON(message: Timestamp): unknown {
59
+ const obj: any = {};
60
+ message.seconds !== undefined &&
61
+ (obj.seconds = (message.seconds || Long.ZERO).toString());
62
+ message.nanos !== undefined && (obj.nanos = Math.round(message.nanos));
63
+ return obj;
64
+ },
65
+
66
+ fromPartial(object: DeepPartial<Timestamp>): Timestamp {
67
+ const message = createBaseTimestamp();
68
+ message.seconds =
69
+ object.seconds !== undefined && object.seconds !== null
70
+ ? Long.fromValue(object.seconds)
71
+ : Long.ZERO;
72
+ message.nanos = object.nanos ?? 0;
73
+ return message;
74
+ },
75
+ };
76
+
77
+ type Builtin =
78
+ | Date
79
+ | Function
80
+ | Uint8Array
81
+ | string
82
+ | number
83
+ | boolean
84
+ | undefined;
85
+
86
+ type DeepPartial<T> = T extends Builtin
87
+ ? T
88
+ : T extends Long
89
+ ? string | number | Long
90
+ : T extends Array<infer U>
91
+ ? Array<DeepPartial<U>>
92
+ : T extends ReadonlyArray<infer U>
93
+ ? ReadonlyArray<DeepPartial<U>>
94
+ : T extends {}
95
+ ? { [K in keyof T]?: DeepPartial<T[K]> }
96
+ : Partial<T>;
97
+
98
+ if (_m0.util.Long !== Long) {
99
+ _m0.util.Long = Long as any;
100
+ _m0.configure();
101
+ }
102
+
103
+ function isSet(value: any): boolean {
104
+ return value !== null && value !== undefined;
105
+ }
@@ -0,0 +1,394 @@
1
+ /* eslint-disable */
2
+ import { CallContext, CallOptions } from "nice-grpc-common";
3
+ import { Timestamp } from "../../../google/protobuf/timestamp";
4
+ import Long from "long";
5
+ import _m0 from "protobufjs/minimal";
6
+
7
+ export interface CoinID {
8
+ symbol: string | undefined;
9
+ address: CoinID_AddressIdentifier | undefined;
10
+ }
11
+
12
+ export interface CoinID_AddressIdentifier {
13
+ address: string;
14
+ chain: string;
15
+ }
16
+
17
+ export interface GetPriceRequest {
18
+ timestamp: Date | undefined;
19
+ coinId: CoinID | undefined;
20
+ }
21
+
22
+ export interface GetPriceResponse {
23
+ price: number;
24
+ timestamp: Date | undefined;
25
+ }
26
+
27
+ function createBaseCoinID(): CoinID {
28
+ return { symbol: undefined, address: undefined };
29
+ }
30
+
31
+ export const CoinID = {
32
+ encode(
33
+ message: CoinID,
34
+ writer: _m0.Writer = _m0.Writer.create()
35
+ ): _m0.Writer {
36
+ if (message.symbol !== undefined) {
37
+ writer.uint32(18).string(message.symbol);
38
+ }
39
+ if (message.address !== undefined) {
40
+ CoinID_AddressIdentifier.encode(
41
+ message.address,
42
+ writer.uint32(26).fork()
43
+ ).ldelim();
44
+ }
45
+ return writer;
46
+ },
47
+
48
+ decode(input: _m0.Reader | Uint8Array, length?: number): CoinID {
49
+ const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
50
+ let end = length === undefined ? reader.len : reader.pos + length;
51
+ const message = createBaseCoinID();
52
+ while (reader.pos < end) {
53
+ const tag = reader.uint32();
54
+ switch (tag >>> 3) {
55
+ case 2:
56
+ message.symbol = reader.string();
57
+ break;
58
+ case 3:
59
+ message.address = CoinID_AddressIdentifier.decode(
60
+ reader,
61
+ reader.uint32()
62
+ );
63
+ break;
64
+ default:
65
+ reader.skipType(tag & 7);
66
+ break;
67
+ }
68
+ }
69
+ return message;
70
+ },
71
+
72
+ fromJSON(object: any): CoinID {
73
+ return {
74
+ symbol: isSet(object.symbol) ? String(object.symbol) : undefined,
75
+ address: isSet(object.address)
76
+ ? CoinID_AddressIdentifier.fromJSON(object.address)
77
+ : undefined,
78
+ };
79
+ },
80
+
81
+ toJSON(message: CoinID): unknown {
82
+ const obj: any = {};
83
+ message.symbol !== undefined && (obj.symbol = message.symbol);
84
+ message.address !== undefined &&
85
+ (obj.address = message.address
86
+ ? CoinID_AddressIdentifier.toJSON(message.address)
87
+ : undefined);
88
+ return obj;
89
+ },
90
+
91
+ fromPartial(object: DeepPartial<CoinID>): CoinID {
92
+ const message = createBaseCoinID();
93
+ message.symbol = object.symbol ?? undefined;
94
+ message.address =
95
+ object.address !== undefined && object.address !== null
96
+ ? CoinID_AddressIdentifier.fromPartial(object.address)
97
+ : undefined;
98
+ return message;
99
+ },
100
+ };
101
+
102
+ function createBaseCoinID_AddressIdentifier(): CoinID_AddressIdentifier {
103
+ return { address: "", chain: "" };
104
+ }
105
+
106
+ export const CoinID_AddressIdentifier = {
107
+ encode(
108
+ message: CoinID_AddressIdentifier,
109
+ writer: _m0.Writer = _m0.Writer.create()
110
+ ): _m0.Writer {
111
+ if (message.address !== "") {
112
+ writer.uint32(10).string(message.address);
113
+ }
114
+ if (message.chain !== "") {
115
+ writer.uint32(18).string(message.chain);
116
+ }
117
+ return writer;
118
+ },
119
+
120
+ decode(
121
+ input: _m0.Reader | Uint8Array,
122
+ length?: number
123
+ ): CoinID_AddressIdentifier {
124
+ const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
125
+ let end = length === undefined ? reader.len : reader.pos + length;
126
+ const message = createBaseCoinID_AddressIdentifier();
127
+ while (reader.pos < end) {
128
+ const tag = reader.uint32();
129
+ switch (tag >>> 3) {
130
+ case 1:
131
+ message.address = reader.string();
132
+ break;
133
+ case 2:
134
+ message.chain = reader.string();
135
+ break;
136
+ default:
137
+ reader.skipType(tag & 7);
138
+ break;
139
+ }
140
+ }
141
+ return message;
142
+ },
143
+
144
+ fromJSON(object: any): CoinID_AddressIdentifier {
145
+ return {
146
+ address: isSet(object.address) ? String(object.address) : "",
147
+ chain: isSet(object.chain) ? String(object.chain) : "",
148
+ };
149
+ },
150
+
151
+ toJSON(message: CoinID_AddressIdentifier): unknown {
152
+ const obj: any = {};
153
+ message.address !== undefined && (obj.address = message.address);
154
+ message.chain !== undefined && (obj.chain = message.chain);
155
+ return obj;
156
+ },
157
+
158
+ fromPartial(
159
+ object: DeepPartial<CoinID_AddressIdentifier>
160
+ ): CoinID_AddressIdentifier {
161
+ const message = createBaseCoinID_AddressIdentifier();
162
+ message.address = object.address ?? "";
163
+ message.chain = object.chain ?? "";
164
+ return message;
165
+ },
166
+ };
167
+
168
+ function createBaseGetPriceRequest(): GetPriceRequest {
169
+ return { timestamp: undefined, coinId: undefined };
170
+ }
171
+
172
+ export const GetPriceRequest = {
173
+ encode(
174
+ message: GetPriceRequest,
175
+ writer: _m0.Writer = _m0.Writer.create()
176
+ ): _m0.Writer {
177
+ if (message.timestamp !== undefined) {
178
+ Timestamp.encode(
179
+ toTimestamp(message.timestamp),
180
+ writer.uint32(10).fork()
181
+ ).ldelim();
182
+ }
183
+ if (message.coinId !== undefined) {
184
+ CoinID.encode(message.coinId, writer.uint32(18).fork()).ldelim();
185
+ }
186
+ return writer;
187
+ },
188
+
189
+ decode(input: _m0.Reader | Uint8Array, length?: number): GetPriceRequest {
190
+ const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
191
+ let end = length === undefined ? reader.len : reader.pos + length;
192
+ const message = createBaseGetPriceRequest();
193
+ while (reader.pos < end) {
194
+ const tag = reader.uint32();
195
+ switch (tag >>> 3) {
196
+ case 1:
197
+ message.timestamp = fromTimestamp(
198
+ Timestamp.decode(reader, reader.uint32())
199
+ );
200
+ break;
201
+ case 2:
202
+ message.coinId = CoinID.decode(reader, reader.uint32());
203
+ break;
204
+ default:
205
+ reader.skipType(tag & 7);
206
+ break;
207
+ }
208
+ }
209
+ return message;
210
+ },
211
+
212
+ fromJSON(object: any): GetPriceRequest {
213
+ return {
214
+ timestamp: isSet(object.timestamp)
215
+ ? fromJsonTimestamp(object.timestamp)
216
+ : undefined,
217
+ coinId: isSet(object.coinId) ? CoinID.fromJSON(object.coinId) : undefined,
218
+ };
219
+ },
220
+
221
+ toJSON(message: GetPriceRequest): unknown {
222
+ const obj: any = {};
223
+ message.timestamp !== undefined &&
224
+ (obj.timestamp = message.timestamp.toISOString());
225
+ message.coinId !== undefined &&
226
+ (obj.coinId = message.coinId ? CoinID.toJSON(message.coinId) : undefined);
227
+ return obj;
228
+ },
229
+
230
+ fromPartial(object: DeepPartial<GetPriceRequest>): GetPriceRequest {
231
+ const message = createBaseGetPriceRequest();
232
+ message.timestamp = object.timestamp ?? undefined;
233
+ message.coinId =
234
+ object.coinId !== undefined && object.coinId !== null
235
+ ? CoinID.fromPartial(object.coinId)
236
+ : undefined;
237
+ return message;
238
+ },
239
+ };
240
+
241
+ function createBaseGetPriceResponse(): GetPriceResponse {
242
+ return { price: 0, timestamp: undefined };
243
+ }
244
+
245
+ export const GetPriceResponse = {
246
+ encode(
247
+ message: GetPriceResponse,
248
+ writer: _m0.Writer = _m0.Writer.create()
249
+ ): _m0.Writer {
250
+ if (message.price !== 0) {
251
+ writer.uint32(9).double(message.price);
252
+ }
253
+ if (message.timestamp !== undefined) {
254
+ Timestamp.encode(
255
+ toTimestamp(message.timestamp),
256
+ writer.uint32(18).fork()
257
+ ).ldelim();
258
+ }
259
+ return writer;
260
+ },
261
+
262
+ decode(input: _m0.Reader | Uint8Array, length?: number): GetPriceResponse {
263
+ const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input);
264
+ let end = length === undefined ? reader.len : reader.pos + length;
265
+ const message = createBaseGetPriceResponse();
266
+ while (reader.pos < end) {
267
+ const tag = reader.uint32();
268
+ switch (tag >>> 3) {
269
+ case 1:
270
+ message.price = reader.double();
271
+ break;
272
+ case 2:
273
+ message.timestamp = fromTimestamp(
274
+ Timestamp.decode(reader, reader.uint32())
275
+ );
276
+ break;
277
+ default:
278
+ reader.skipType(tag & 7);
279
+ break;
280
+ }
281
+ }
282
+ return message;
283
+ },
284
+
285
+ fromJSON(object: any): GetPriceResponse {
286
+ return {
287
+ price: isSet(object.price) ? Number(object.price) : 0,
288
+ timestamp: isSet(object.timestamp)
289
+ ? fromJsonTimestamp(object.timestamp)
290
+ : undefined,
291
+ };
292
+ },
293
+
294
+ toJSON(message: GetPriceResponse): unknown {
295
+ const obj: any = {};
296
+ message.price !== undefined && (obj.price = message.price);
297
+ message.timestamp !== undefined &&
298
+ (obj.timestamp = message.timestamp.toISOString());
299
+ return obj;
300
+ },
301
+
302
+ fromPartial(object: DeepPartial<GetPriceResponse>): GetPriceResponse {
303
+ const message = createBaseGetPriceResponse();
304
+ message.price = object.price ?? 0;
305
+ message.timestamp = object.timestamp ?? undefined;
306
+ return message;
307
+ },
308
+ };
309
+
310
+ export type PriceServiceDefinition = typeof PriceServiceDefinition;
311
+ export const PriceServiceDefinition = {
312
+ name: "PriceService",
313
+ fullName: "price_service.PriceService",
314
+ methods: {
315
+ getPrice: {
316
+ name: "GetPrice",
317
+ requestType: GetPriceRequest,
318
+ requestStream: false,
319
+ responseType: GetPriceResponse,
320
+ responseStream: false,
321
+ options: {},
322
+ },
323
+ },
324
+ } as const;
325
+
326
+ export interface PriceServiceServiceImplementation<CallContextExt = {}> {
327
+ getPrice(
328
+ request: GetPriceRequest,
329
+ context: CallContext & CallContextExt
330
+ ): Promise<DeepPartial<GetPriceResponse>>;
331
+ }
332
+
333
+ export interface PriceServiceClient<CallOptionsExt = {}> {
334
+ getPrice(
335
+ request: DeepPartial<GetPriceRequest>,
336
+ options?: CallOptions & CallOptionsExt
337
+ ): Promise<GetPriceResponse>;
338
+ }
339
+
340
+ type Builtin =
341
+ | Date
342
+ | Function
343
+ | Uint8Array
344
+ | string
345
+ | number
346
+ | boolean
347
+ | undefined;
348
+
349
+ type DeepPartial<T> = T extends Builtin
350
+ ? T
351
+ : T extends Long
352
+ ? string | number | Long
353
+ : T extends Array<infer U>
354
+ ? Array<DeepPartial<U>>
355
+ : T extends ReadonlyArray<infer U>
356
+ ? ReadonlyArray<DeepPartial<U>>
357
+ : T extends {}
358
+ ? { [K in keyof T]?: DeepPartial<T[K]> }
359
+ : Partial<T>;
360
+
361
+ function toTimestamp(date: Date): Timestamp {
362
+ const seconds = numberToLong(date.getTime() / 1_000);
363
+ const nanos = (date.getTime() % 1_000) * 1_000_000;
364
+ return { seconds, nanos };
365
+ }
366
+
367
+ function fromTimestamp(t: Timestamp): Date {
368
+ let millis = t.seconds.toNumber() * 1_000;
369
+ millis += t.nanos / 1_000_000;
370
+ return new Date(millis);
371
+ }
372
+
373
+ function fromJsonTimestamp(o: any): Date {
374
+ if (o instanceof Date) {
375
+ return o;
376
+ } else if (typeof o === "string") {
377
+ return new Date(o);
378
+ } else {
379
+ return fromTimestamp(Timestamp.fromJSON(o));
380
+ }
381
+ }
382
+
383
+ function numberToLong(number: number) {
384
+ return Long.fromNumber(number);
385
+ }
386
+
387
+ if (_m0.util.Long !== Long) {
388
+ _m0.util.Long = Long as any;
389
+ _m0.configure();
390
+ }
391
+
392
+ function isSet(value: any): boolean {
393
+ return value !== null && value !== undefined;
394
+ }
@@ -0,0 +1,8 @@
1
+ import { PriceServiceClient, PriceServiceDefinition } from '../gen/service/price/protos/price'
2
+ import { createChannel, createClient } from 'nice-grpc'
3
+
4
+ export function getPriceClient(address: string): PriceServiceClient {
5
+ const channel = createChannel(address)
6
+
7
+ return createClient(PriceServiceDefinition, channel)
8
+ }