@merkl/api 0.10.362 → 0.10.378
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.
- package/README.md +78 -14
- package/dist/database/api/.generated/edge.js +21 -6
- package/dist/database/api/.generated/index-browser.js +18 -3
- package/dist/database/api/.generated/index.d.ts +1746 -256
- package/dist/database/api/.generated/index.js +21 -6
- package/dist/database/api/.generated/package.json +1 -1
- package/dist/database/api/.generated/schema.prisma +12 -2
- package/dist/database/api/.generated/wasm.js +18 -3
- package/dist/src/eden/index.d.ts +1041 -140
- package/dist/src/entities/campaign.js +2 -1
- package/dist/src/entities/opportunity.js +169 -3
- package/dist/src/index.d.ts +340 -9
- package/dist/src/libs/campaigns/campaignTypes/ERC20DynamicData.js +45 -54
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.d.ts +3 -1
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/helpers/tokenType.js +4 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/ERC4626Processor.d.ts +34 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/ERC4626Processor.js +36 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/processor/processorMapping.js +3 -0
- package/dist/src/libs/campaigns/campaignTypes/ERC20SubTypes/subtypesRound1.js +4 -1
- package/dist/src/libs/campaigns/campaignTypes/HyperdriveDynamicData.d.ts +5 -0
- package/dist/src/libs/campaigns/campaignTypes/HyperdriveDynamicData.js +76 -0
- package/dist/src/libs/campaigns/campaignsDynamicData.js +8 -0
- package/dist/src/modules/v4/campaign/campaign.controller.d.ts +2 -0
- package/dist/src/modules/v4/campaign/campaign.model.d.ts +1 -0
- package/dist/src/modules/v4/campaign/campaign.model.js +1 -0
- package/dist/src/modules/v4/campaign/campaign.repository.d.ts +63 -1
- package/dist/src/modules/v4/campaign/campaign.repository.js +15 -10
- package/dist/src/modules/v4/computedValue/computedValue.controller.d.ts +7 -4
- package/dist/src/modules/v4/computedValue/computedValue.controller.js +7 -5
- package/dist/src/modules/v4/computedValue/computedValue.model.js +12 -4
- package/dist/src/modules/v4/computedValue/computedValue.repository.d.ts +8 -5
- package/dist/src/modules/v4/computedValue/computedValue.repository.js +7 -3
- package/dist/src/modules/v4/computedValue/computedValue.service.d.ts +7 -4
- package/dist/src/modules/v4/computedValue/computedValue.service.js +10 -0
- package/dist/src/modules/v4/creator/creator.controller.d.ts +118 -0
- package/dist/src/modules/v4/creator/creator.controller.js +30 -0
- package/dist/src/modules/v4/creator/creator.model.d.ts +29 -0
- package/dist/src/modules/v4/creator/creator.model.js +18 -0
- package/dist/src/modules/v4/creator/creator.repository.d.ts +40 -0
- package/dist/src/modules/v4/creator/creator.repository.js +63 -0
- package/dist/src/modules/v4/creator/creator.service.d.ts +61 -0
- package/dist/src/modules/v4/creator/creator.service.js +44 -0
- package/dist/src/modules/v4/creator/index.d.ts +3 -0
- package/dist/src/modules/v4/creator/index.js +3 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.controller.d.ts +3 -4
- package/dist/src/modules/v4/dynamicData/dynamicData.controller.js +1 -1
- package/dist/src/modules/v4/dynamicData/dynamicData.model.d.ts +1 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.model.js +1 -0
- package/dist/src/modules/v4/dynamicData/dynamicData.service.d.ts +6 -3
- package/dist/src/modules/v4/dynamicData/dynamicData.service.js +50 -9
- package/dist/src/modules/v4/opportunity/opportunity.controller.d.ts +171 -1
- package/dist/src/modules/v4/opportunity/opportunity.controller.js +14 -0
- package/dist/src/modules/v4/opportunity/opportunity.model.d.ts +0 -1
- package/dist/src/modules/v4/opportunity/opportunity.repository.d.ts +185 -0
- package/dist/src/modules/v4/opportunity/opportunity.repository.js +41 -0
- package/dist/src/modules/v4/opportunity/opportunity.service.d.ts +151 -1
- package/dist/src/modules/v4/opportunity/opportunity.service.js +45 -2
- package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.d.ts +1 -1
- package/dist/src/modules/v4/opportunity/subservices/getHyperdriveMetadata.service.js +2 -2
- package/dist/src/modules/v4/programPayload/programPayload.controller.d.ts +30 -0
- package/dist/src/modules/v4/programPayload/programPayload.controller.js +12 -1
- package/dist/src/modules/v4/programPayload/programPayload.model.d.ts +21 -1
- package/dist/src/modules/v4/programPayload/programPayload.model.js +12 -0
- package/dist/src/modules/v4/programPayload/programPayload.repository.d.ts +13 -2
- package/dist/src/modules/v4/programPayload/programPayload.repository.js +230 -83
- package/dist/src/modules/v4/programPayload/programPayload.service.d.ts +2 -1
- package/dist/src/modules/v4/programPayload/programPayload.service.js +42 -2
- package/dist/src/modules/v4/protocol/protocol.controller.d.ts +1 -0
- package/dist/src/modules/v4/protocol/protocol.model.d.ts +1 -0
- package/dist/src/modules/v4/protocol/protocol.model.js +1 -0
- package/dist/src/modules/v4/reward/reward.repository.d.ts +2 -1
- package/dist/src/modules/v4/reward/reward.repository.js +12 -1
- package/dist/src/modules/v4/reward/reward.service.js +5 -2
- package/dist/src/modules/v4/router.d.ts +340 -9
- package/dist/src/modules/v4/router.js +3 -1
- package/dist/src/modules/v4/user/user.controller.d.ts +28 -0
- package/dist/src/modules/v4/user/user.controller.js +5 -0
- package/dist/src/modules/v4/user/user.repository.d.ts +5 -0
- package/dist/src/modules/v4/user/user.service.d.ts +5 -0
- package/dist/src/utils/decodeCalls.js +7 -1
- package/dist/src/utils/encodeCalls.js +19 -1
- package/dist/src/utils/generateCardName.js +3 -0
- package/dist/tsconfig.package.tsbuildinfo +1 -1
- package/package.json +6 -2
@@ -1,11 +1,12 @@
|
|
1
1
|
import { NotFoundError } from "../../../errors";
|
2
|
-
import { CampaignService, campaignTypeToEnumMap } from "../campaign";
|
2
|
+
import { CampaignService, campaignTypeToEnumMap, } from "../campaign";
|
3
3
|
import { log } from "../../../utils/logger";
|
4
4
|
import { OpportunityAction, Prisma, Status } from "../../../../database/api/.generated";
|
5
5
|
import { record } from "@elysiajs/opentelemetry";
|
6
6
|
import moment from "moment";
|
7
7
|
import { CacheService } from "../cache";
|
8
8
|
import { TTLPresets } from "../cache/cache.model";
|
9
|
+
import { CampaignRepository } from "../campaign/campaign.repository";
|
9
10
|
import { TokenService } from "../token";
|
10
11
|
import { UserService } from "../user";
|
11
12
|
import { OpportunityRepository } from "./opportunity.repository";
|
@@ -95,6 +96,30 @@ export class OpportunityService {
|
|
95
96
|
throw "UNKNOWN CAMPAIGN TYPE";
|
96
97
|
}
|
97
98
|
}
|
99
|
+
static async fakeCreateFromCampaign(campaign) {
|
100
|
+
const campaignType = CampaignService.getTypeFromV3(campaign.type);
|
101
|
+
const metadata = await OpportunityService.#getMetadata(campaign);
|
102
|
+
metadata.tags = [...((await UserService.findUnique(campaign.creator))?.tags ?? []), ...(campaign?.tags ?? [])];
|
103
|
+
const opportunityId = OpportunityService.hashId({
|
104
|
+
chainId: campaign.computeChainId,
|
105
|
+
identifier: campaign.opportunityIdentifier,
|
106
|
+
type: campaignType,
|
107
|
+
});
|
108
|
+
const params = JSON.parse(campaign.params);
|
109
|
+
const opportunity = {
|
110
|
+
id: opportunityId,
|
111
|
+
chainId: campaign.computeChainId,
|
112
|
+
type: campaignType,
|
113
|
+
identifier: campaign.opportunityIdentifier, // mainParameter
|
114
|
+
name: metadata.name,
|
115
|
+
status: Status.SOON,
|
116
|
+
action: metadata.action,
|
117
|
+
mainProtocol: metadata.mainProtocol,
|
118
|
+
depositUrl: !!params.url ? params.url : undefined,
|
119
|
+
tags: metadata.tags,
|
120
|
+
};
|
121
|
+
return opportunity;
|
122
|
+
}
|
98
123
|
static async createFromCampaign(campaign, upsert = false) {
|
99
124
|
const campaignType = CampaignService.getTypeFromV3(campaign.type);
|
100
125
|
const metadata = await OpportunityService.#getMetadata(campaign);
|
@@ -172,6 +197,21 @@ export class OpportunityService {
|
|
172
197
|
throw err;
|
173
198
|
}
|
174
199
|
}
|
200
|
+
/**
|
201
|
+
* Finds opportunities based on filters of its campaigns
|
202
|
+
* @notice campaigns are filtered as well
|
203
|
+
* @param where
|
204
|
+
* @returns opportunities
|
205
|
+
*/
|
206
|
+
static async getManyByCampaigns(where) {
|
207
|
+
const opportunities = await OpportunityRepository.findManyByCampaigns(CampaignRepository.transformQueryToPrismaFilters(where).where);
|
208
|
+
const formatted = opportunities.map(({ Campaigns, ...o }) => {
|
209
|
+
const opportunity = OpportunityService.formatResponse(o);
|
210
|
+
const campaigns = Campaigns.map(CampaignService.format);
|
211
|
+
return Object.assign(opportunity, { campaigns });
|
212
|
+
});
|
213
|
+
return formatted;
|
214
|
+
}
|
175
215
|
static async getUniqueWithCampaignsOrThrow(opportunityId, withTest = false) {
|
176
216
|
const id = typeof opportunityId === "string" ? opportunityId : OpportunityService.hashId(opportunityId);
|
177
217
|
const { Campaigns, ...opportunity } = await OpportunityRepository.findUniqueOrThrowWithCampaigns(id, withTest);
|
@@ -257,7 +297,10 @@ export class OpportunityService {
|
|
257
297
|
};
|
258
298
|
}
|
259
299
|
static formatResponseBase(opportunity) {
|
260
|
-
|
300
|
+
let { mainProtocolId, id, Tokens, Chain, Protocols, MainProtocol, ...opp } = opportunity;
|
301
|
+
if (mainProtocolId === "unknown") {
|
302
|
+
MainProtocol = null;
|
303
|
+
}
|
261
304
|
return {
|
262
305
|
...opp,
|
263
306
|
id,
|
@@ -1,3 +1,3 @@
|
|
1
1
|
import type { ChainId, HyperDriveLogCampaign } from "@sdk";
|
2
2
|
import type { OpportunityMetadata } from "../opportunity.model";
|
3
|
-
export declare const getHyperdriveMetadata: (chainId: ChainId, campaignSubType: HyperDriveLogCampaign["campaignSubType"], params: HyperDriveLogCampaign["campaignParameters"]) =>
|
3
|
+
export declare const getHyperdriveMetadata: (chainId: ChainId, campaignSubType: HyperDriveLogCampaign["campaignSubType"], params: HyperDriveLogCampaign["campaignParameters"]) => OpportunityMetadata;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { OpportunityAction } from "../../../../../database/api/.generated";
|
2
|
-
export const getHyperdriveMetadata =
|
2
|
+
export const getHyperdriveMetadata = (chainId, campaignSubType, params) => {
|
3
3
|
const subtypes = [
|
4
|
-
{ name: "Add Liquidity on", action: OpportunityAction.
|
4
|
+
{ name: "Add Liquidity on", action: OpportunityAction.POOL },
|
5
5
|
{ name: "Open Long on", action: OpportunityAction.LONG },
|
6
6
|
{ name: "Open Short on", action: OpportunityAction.SHORT },
|
7
7
|
];
|
@@ -242,6 +242,36 @@ export declare const ProgramPayloadController: Elysia<"/program-payload", false,
|
|
242
242
|
};
|
243
243
|
};
|
244
244
|
};
|
245
|
+
} & {
|
246
|
+
"program-payload": {
|
247
|
+
parse: {
|
248
|
+
"from-campaign-data": {
|
249
|
+
post: {
|
250
|
+
body: {
|
251
|
+
chainId: number;
|
252
|
+
startTimestamp: number;
|
253
|
+
endTimestamp: number;
|
254
|
+
computeChainId: number;
|
255
|
+
amount: string;
|
256
|
+
rewardToken: string;
|
257
|
+
campaignType: number;
|
258
|
+
campaignData: string;
|
259
|
+
symbolRewardToken: string;
|
260
|
+
decimalsRewardToken: number;
|
261
|
+
};
|
262
|
+
params: {};
|
263
|
+
query: unknown;
|
264
|
+
headers: {
|
265
|
+
authorization: string;
|
266
|
+
};
|
267
|
+
response: {
|
268
|
+
[x: string]: any;
|
269
|
+
200: any;
|
270
|
+
};
|
271
|
+
};
|
272
|
+
};
|
273
|
+
};
|
274
|
+
};
|
245
275
|
}, {
|
246
276
|
derive: {};
|
247
277
|
resolve: {};
|
@@ -1,7 +1,8 @@
|
|
1
|
+
import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
|
1
2
|
// import { AuthorizationHeadersDto, BackOfficeGuard } from "../../../guards/BackOffice.guard";
|
2
3
|
import Elysia, { t } from "elysia";
|
3
4
|
import { throwOnUnsupportedChainId } from "src/utils/throw";
|
4
|
-
import { CampaignAmountsInputDto, CampaignPayloadInputDto, ProgramPayloadInputDto, SinglePayloadInputDto, } from "./programPayload.model";
|
5
|
+
import { CampaignAmountsInputDto, CampaignDataDto, CampaignPayloadInputDto, ProgramPayloadInputDto, SinglePayloadInputDto, } from "./programPayload.model";
|
5
6
|
import { ProgramPayloadService } from "./programPayload.service";
|
6
7
|
// ─── ProgramPaylod Controller ───────────────────────────────────────────────────────
|
7
8
|
export const ProgramPayloadController = new Elysia({ prefix: "/program-payload", detail: { tags: ["ProgramPayload"] } })
|
@@ -71,4 +72,14 @@ export const ProgramPayloadController = new Elysia({ prefix: "/program-payload",
|
|
71
72
|
query: t.Object({ debug: t.Optional(t.Boolean({ description: "Debug mode" })) }),
|
72
73
|
body: SinglePayloadInputDto,
|
73
74
|
detail: { description: "BETA FEATURE : Generate the payload from a config file." },
|
75
|
+
})
|
76
|
+
.post("/parse/from-campaign-data", async ({ body }) => {
|
77
|
+
return ProgramPayloadService.buildConfigFromCampaignData(body);
|
78
|
+
}, {
|
79
|
+
headers: AuthorizationHeadersDto,
|
80
|
+
body: CampaignDataDto,
|
81
|
+
beforeHandle: ({ headers }) => {
|
82
|
+
BackOfficeGuard({ headers });
|
83
|
+
},
|
84
|
+
detail: { hide: true },
|
74
85
|
});
|
@@ -9,6 +9,18 @@ export declare const CampaignPayloadInputDto: import("@sinclair/typebox").TObjec
|
|
9
9
|
endTimestamp: import("@sinclair/typebox").TNumber;
|
10
10
|
amount: import("@sinclair/typebox").TString;
|
11
11
|
}>;
|
12
|
+
export declare const CampaignDataDto: import("@sinclair/typebox").TObject<{
|
13
|
+
campaignType: import("@sinclair/typebox").TNumber;
|
14
|
+
campaignData: import("@sinclair/typebox").TString;
|
15
|
+
amount: import("@sinclair/typebox").TString;
|
16
|
+
chainId: import("@sinclair/typebox").TNumber;
|
17
|
+
computeChainId: import("@sinclair/typebox").TNumber;
|
18
|
+
endTimestamp: import("@sinclair/typebox").TNumber;
|
19
|
+
rewardToken: import("@sinclair/typebox").TString;
|
20
|
+
startTimestamp: import("@sinclair/typebox").TNumber;
|
21
|
+
symbolRewardToken: import("@sinclair/typebox").TString;
|
22
|
+
decimalsRewardToken: import("@sinclair/typebox").TNumber;
|
23
|
+
}>;
|
12
24
|
export declare const SinglePayloadInputDto: import("@sinclair/typebox").TObject<{
|
13
25
|
distributionChainId: import("@sinclair/typebox").TNumber;
|
14
26
|
rewardToken: import("@sinclair/typebox").TString;
|
@@ -58,6 +70,7 @@ export type CampaignPayloadInputModel = typeof CampaignPayloadInputDto.static;
|
|
58
70
|
export type ProgramPayloadInputModel = typeof ProgramPayloadInputDto.static;
|
59
71
|
export type CampaignAmountsInputModel = typeof CampaignAmountsInputDto.static;
|
60
72
|
export type SinglePayloadInputDtoModel = typeof SinglePayloadInputDto.static;
|
73
|
+
export type CampaignDataDtoModel = typeof CampaignDataDto.static;
|
61
74
|
export type approvalTransaction = {
|
62
75
|
to: string;
|
63
76
|
value: string;
|
@@ -179,7 +192,14 @@ export type partialConfigIonic = {
|
|
179
192
|
blacklist: string[];
|
180
193
|
forwarders: string[];
|
181
194
|
};
|
182
|
-
export type
|
195
|
+
export type partialConfigAirdrop = {
|
196
|
+
jsonUrl: string;
|
197
|
+
url?: string;
|
198
|
+
computeChainId?: MerklChainId;
|
199
|
+
hooks?: (HookParameters<HOOK> | string)[];
|
200
|
+
campaignType: Campaign;
|
201
|
+
};
|
202
|
+
export type partialConfig = partialConfigERC20 | partialConfigMorpho | partialConfigCLAMM | partialConfigIonic | partialConfigAirdrop;
|
183
203
|
export declare const safeTemplate: {
|
184
204
|
version: string;
|
185
205
|
chainId: string;
|
@@ -10,6 +10,18 @@ export const CampaignPayloadInputDto = t.Object({
|
|
10
10
|
endTimestamp: t.Numeric({ description: "End timestamp for the campaign" }),
|
11
11
|
amount: t.String({ description: "Amount of the reward token to be distributed" }),
|
12
12
|
});
|
13
|
+
export const CampaignDataDto = t.Object({
|
14
|
+
campaignType: t.Numeric({ description: "Type of the campaign 1 : ERC20, 2: CLAMM , ..." }),
|
15
|
+
campaignData: t.String({ description: "Campaign data" }),
|
16
|
+
amount: t.String({ description: "Amount of the reward token to be distributed" }),
|
17
|
+
chainId: t.Numeric({ description: "Chain ID where the reward tokens will be distributed" }),
|
18
|
+
computeChainId: t.Numeric({ description: "Chain ID used for computation" }),
|
19
|
+
endTimestamp: t.Numeric({ description: "End timestamp for the campaign" }),
|
20
|
+
rewardToken: t.String({ description: "Address of the reward token to be distributed" }),
|
21
|
+
startTimestamp: t.Numeric({ description: "Start timestamp for the campaign" }),
|
22
|
+
symbolRewardToken: t.String({ description: "Symbol of the reward token" }),
|
23
|
+
decimalsRewardToken: t.Numeric({ description: "Decimals of the reward token" }),
|
24
|
+
});
|
13
25
|
export const SinglePayloadInputDto = t.Object({
|
14
26
|
distributionChainId: t.Numeric({ description: "Chain ID where the reward tokens will be distributed" }),
|
15
27
|
rewardToken: t.String({ description: "Address of the reward token to be distributed" }),
|
@@ -35,7 +35,7 @@ export declare enum pufferCampaigns {
|
|
35
35
|
venus_pufeth = "0xE0ee5dDeBFe0abe0a4Af50299D68b74Cec31668e",
|
36
36
|
unifiBTC = "0x170D847A8320F3B6A77eE15B0CAE430e3eC933a0",
|
37
37
|
unifiUSD = "0x82c40e07277eBb92935f79cE92268F80dDc7caB4",
|
38
|
-
CARROT_USDC = "
|
38
|
+
CARROT_USDC = "0xf00032d0F95e8f43E750C51d0188DCa33cC5a8eA"
|
39
39
|
}
|
40
40
|
export declare enum zkSyncCampaigns {
|
41
41
|
Izumi_Finance_Zk_Weth = "Izumi Finance ZK/WETH 0xd62bc9f19bd94fde9c41df4b6eb6419ea6b8e25c",
|
@@ -112,7 +112,18 @@ export declare enum zkSyncCampaigns {
|
|
112
112
|
ZKSwap_ETH_USDCe_20 = "ZKSwap Finance ETH/USDC v3 0.2pct 0x6480665e22d82b3b9079b44e421a62c185b9bd77",
|
113
113
|
ZKSwap_wstETH_ETH_20 = "ZKSwap Finance wstETH/ETH v3 0.01pct 0xd587b615ac1acb6c1f95242a1bcac512d2cd8122",
|
114
114
|
ZKSwap_wrsETH_ETH_20 = "ZKSwap Finance wrsETH/ETH v3 0.01pct 0xcd6d8b89f24b017dbbdc0c13a99d29edc13e2189",
|
115
|
-
ZKSwap_ZF_ETH = "ZKSwap Finance ZF/ETH v2 0.1pct ZKSwap Finance ZF/ETH v2 0xd33a17c883d5aa79470cd2522abb213dc4017e01"
|
115
|
+
ZKSwap_ZF_ETH = "ZKSwap Finance ZF/ETH v2 0.1pct ZKSwap Finance ZF/ETH v2 0xd33a17c883d5aa79470cd2522abb213dc4017e01",
|
116
|
+
raffle_jumper = "raffle jumper 31/01/25",
|
117
|
+
airdrop_jumper = "airdrop jumper 31/01/25",
|
118
|
+
airdrop_layerswap = "airdrop layerswap 31/01/25",
|
119
|
+
Syncswap_USN_USDCe_Range = "SyncSwap USN/USDC.e Range Pool 0xe6ed575d9627942893f12bf9c2cc3c47cd11d002",
|
120
|
+
Syncswap_USN_sUSN_Range = "SyncSwap USN/sUSN Range Pool 0x12bf23c2fe929c23ab375199efad425e70c0ece1",
|
121
|
+
Izumi_Finance_WETH_WBTC = "Izumi Finance WETH/WBTC 0xee0f2c77b0fd3daaa7fb332c8f6589f73b29ecfc",
|
122
|
+
Maverick_WETH_zkETH_Boosted_V2 = "Maverick WETH-zkETH Boosted Position 0.03% Fee 0.10% Width Mode Static 0xfb3874c26729a9ef9c3ea9a05b99a45d75cc1243",
|
123
|
+
ZKSwap_WETH_WBTC = "ZKSwap Finance WETH/WBTC v3 0.01pct 0xb6a5cc74a348be4e999a7ba1032de390dd3e993a",
|
124
|
+
ReactorFusion_WBTC = "ReactorFusion WBTC 0x0a976e1e7d3052beb46085acbe1e0daccf4a19cf",
|
125
|
+
Venus_wUSDM = "Venus wUSDM 0x183de3c349fcf546aae925e1c7f364ea6fb4033c",
|
126
|
+
Zerolend_WBTC = "Zerolend WBTC 0x7c65e6ec6feceb333092e6fe69672a3475c591fb"
|
116
127
|
}
|
117
128
|
export declare enum modeCampaigns {
|
118
129
|
Steer_EES_V2_Weth_USDC_Kim_Mode = "SteerEESV2 Kim WETH/USDC 0x468cc91df6f669cae6cdce766995bd7874052fbc",
|