@one_deploy/sdk 1.0.3 → 1.0.5
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/dist/{engine-CrlhH0nw.d.mts → engine-BeVuHpVx.d.mts} +163 -0
- package/dist/{engine-5ndtBaCr.d.ts → engine-DSc1Em4V.d.ts} +163 -0
- package/dist/hooks/index.d.mts +132 -3
- package/dist/hooks/index.d.ts +132 -3
- package/dist/hooks/index.js +351 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +345 -2
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +352 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +345 -2
- package/dist/index.mjs.map +1 -1
- package/dist/providers/index.d.mts +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.js +98 -0
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/index.mjs +98 -0
- package/dist/providers/index.mjs.map +1 -1
- package/dist/react-native.d.mts +140 -3
- package/dist/react-native.d.ts +140 -3
- package/dist/react-native.js +642 -0
- package/dist/react-native.js.map +1 -1
- package/dist/react-native.mjs +636 -1
- package/dist/react-native.mjs.map +1 -1
- package/dist/services/index.d.mts +99 -79
- package/dist/services/index.d.ts +99 -79
- package/dist/services/index.js +254 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/index.mjs +252 -1
- package/dist/services/index.mjs.map +1 -1
- package/dist/supabase-BT0c7q9e.d.mts +82 -0
- package/dist/supabase-BT0c7q9e.d.ts +82 -0
- package/package.json +5 -1
- package/src/components/OneSwapWidget.tsx +1 -1
- package/src/components/ai/OneChainSelector.tsx +183 -0
- package/src/components/ai/OneCycleSelector.tsx +187 -0
- package/src/components/ai/OnePairSelector.tsx +181 -0
- package/src/components/ai/OneTierSelector.tsx +187 -0
- package/src/components/ai/index.ts +17 -0
- package/src/components/index.ts +3 -0
- package/src/hooks/index.ts +20 -0
- package/src/hooks/useAITrading.ts +444 -0
- package/src/index.ts +20 -0
- package/src/react-native.ts +23 -0
- package/src/services/engine.ts +184 -0
- package/src/services/index.ts +16 -0
- package/src/services/usage.ts +249 -0
- package/.turbo/turbo-build.log +0 -0
- package/.turbo/turbo-type-check.log +0 -0
- package/tsconfig.json +0 -22
- package/tsup.config.ts +0 -25
package/dist/hooks/index.js
CHANGED
|
@@ -1046,6 +1046,43 @@ var OneEngineClient = class {
|
|
|
1046
1046
|
async adminClearRateLimits(identifier) {
|
|
1047
1047
|
return this.request(`/api/v1/admin/rate-limits/${identifier}`, { method: "DELETE" });
|
|
1048
1048
|
}
|
|
1049
|
+
// ========== AI Agent Configuration ==========
|
|
1050
|
+
/**
|
|
1051
|
+
* Get all AI agent configurations
|
|
1052
|
+
* This returns the full agent setup including tiers, cycles, and trading parameters
|
|
1053
|
+
*/
|
|
1054
|
+
async getAgentConfigs(options) {
|
|
1055
|
+
const params = new URLSearchParams();
|
|
1056
|
+
if (options?.includeInactive) params.set("includeInactive", "true");
|
|
1057
|
+
if (options?.agentId) params.set("agentId", options.agentId);
|
|
1058
|
+
const query = params.toString();
|
|
1059
|
+
return this.request(`/api/v1/agents${query ? `?${query}` : ""}`, { method: "GET" });
|
|
1060
|
+
}
|
|
1061
|
+
/**
|
|
1062
|
+
* Calculate subscription parameters for an agent
|
|
1063
|
+
*/
|
|
1064
|
+
async calculateAgentParams(params) {
|
|
1065
|
+
return this.request("/api/v1/agents/calculate", {
|
|
1066
|
+
method: "POST",
|
|
1067
|
+
body: JSON.stringify(params)
|
|
1068
|
+
});
|
|
1069
|
+
}
|
|
1070
|
+
/**
|
|
1071
|
+
* Get supported trading pairs from agents
|
|
1072
|
+
*/
|
|
1073
|
+
async getTradingPairs() {
|
|
1074
|
+
const result = await this.getAgentConfigs();
|
|
1075
|
+
if (result.success && result.data?.agents) {
|
|
1076
|
+
const allPairs = /* @__PURE__ */ new Set();
|
|
1077
|
+
const byAgent = {};
|
|
1078
|
+
for (const agent of result.data.agents) {
|
|
1079
|
+
byAgent[agent.id] = agent.supported_pairs;
|
|
1080
|
+
agent.supported_pairs.forEach((p) => allPairs.add(p));
|
|
1081
|
+
}
|
|
1082
|
+
return { success: true, data: { pairs: Array.from(allPairs), byAgent } };
|
|
1083
|
+
}
|
|
1084
|
+
return { success: false, error: result.error };
|
|
1085
|
+
}
|
|
1049
1086
|
// ========== AI Quant Trading ==========
|
|
1050
1087
|
/**
|
|
1051
1088
|
* Get all AI trading strategies
|
|
@@ -1184,6 +1221,67 @@ var OneEngineClient = class {
|
|
|
1184
1221
|
async getCryptoMarketOverview() {
|
|
1185
1222
|
return this.request("/api/v1/prices?type=overview", { method: "GET" });
|
|
1186
1223
|
}
|
|
1224
|
+
// ========== Project Management ==========
|
|
1225
|
+
/**
|
|
1226
|
+
* Get user's projects
|
|
1227
|
+
*/
|
|
1228
|
+
async getProjects(options) {
|
|
1229
|
+
const params = new URLSearchParams();
|
|
1230
|
+
if (options?.isActive !== void 0) params.set("isActive", String(options.isActive));
|
|
1231
|
+
const query = params.toString();
|
|
1232
|
+
return this.request(`/api/v1/projects${query ? `?${query}` : ""}`, { method: "GET" });
|
|
1233
|
+
}
|
|
1234
|
+
/**
|
|
1235
|
+
* Create a new project for ecosystem partners
|
|
1236
|
+
*/
|
|
1237
|
+
async createProject(params) {
|
|
1238
|
+
return this.request("/api/v1/projects", {
|
|
1239
|
+
method: "POST",
|
|
1240
|
+
body: JSON.stringify(params)
|
|
1241
|
+
});
|
|
1242
|
+
}
|
|
1243
|
+
/**
|
|
1244
|
+
* Get project details
|
|
1245
|
+
*/
|
|
1246
|
+
async getProject(projectId) {
|
|
1247
|
+
return this.request(`/api/v1/projects/${projectId}`, { method: "GET" });
|
|
1248
|
+
}
|
|
1249
|
+
/**
|
|
1250
|
+
* Update project settings
|
|
1251
|
+
*/
|
|
1252
|
+
async updateProject(projectId, updates) {
|
|
1253
|
+
return this.request(`/api/v1/projects/${projectId}`, {
|
|
1254
|
+
method: "PATCH",
|
|
1255
|
+
body: JSON.stringify(updates)
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1258
|
+
/**
|
|
1259
|
+
* Get project features status
|
|
1260
|
+
*/
|
|
1261
|
+
async getProjectFeatures(projectId) {
|
|
1262
|
+
return this.request(`/api/v1/projects/${projectId}/features`, { method: "GET" });
|
|
1263
|
+
}
|
|
1264
|
+
/**
|
|
1265
|
+
* Enable/disable features for a project
|
|
1266
|
+
*/
|
|
1267
|
+
async updateProjectFeatures(projectId, features) {
|
|
1268
|
+
return this.request(`/api/v1/projects/${projectId}/features`, {
|
|
1269
|
+
method: "PATCH",
|
|
1270
|
+
body: JSON.stringify(features)
|
|
1271
|
+
});
|
|
1272
|
+
}
|
|
1273
|
+
/**
|
|
1274
|
+
* Regenerate project API key
|
|
1275
|
+
*/
|
|
1276
|
+
async regenerateProjectApiKey(projectId) {
|
|
1277
|
+
return this.request(`/api/v1/projects/${projectId}/api-key`, { method: "POST" });
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Delete project
|
|
1281
|
+
*/
|
|
1282
|
+
async deleteProject(projectId) {
|
|
1283
|
+
return this.request(`/api/v1/projects/${projectId}`, { method: "DELETE" });
|
|
1284
|
+
}
|
|
1187
1285
|
};
|
|
1188
1286
|
function createOneEngineClient(options) {
|
|
1189
1287
|
return new OneEngineClient(options);
|
|
@@ -1352,7 +1450,260 @@ function useTokenPrices(symbols, options = {}) {
|
|
|
1352
1450
|
refetch: fetchPrices
|
|
1353
1451
|
};
|
|
1354
1452
|
}
|
|
1453
|
+
var clientInstance = null;
|
|
1454
|
+
function getClient() {
|
|
1455
|
+
if (!clientInstance) {
|
|
1456
|
+
clientInstance = createOneEngineClient();
|
|
1457
|
+
}
|
|
1458
|
+
return clientInstance;
|
|
1459
|
+
}
|
|
1460
|
+
function setAITradingAccessToken(token) {
|
|
1461
|
+
getClient().setAccessToken(token);
|
|
1462
|
+
}
|
|
1463
|
+
function clearAITradingAccessToken() {
|
|
1464
|
+
getClient().clearAccessToken();
|
|
1465
|
+
}
|
|
1466
|
+
function useAIStrategies(options = {}) {
|
|
1467
|
+
const [strategies, setStrategies] = react.useState([]);
|
|
1468
|
+
const [isLoading, setIsLoading] = react.useState(true);
|
|
1469
|
+
const [error, setError] = react.useState(null);
|
|
1470
|
+
const { category, riskLevel, minTvl, isActive, autoRefresh = false, refreshInterval = 6e4 } = options;
|
|
1471
|
+
const fetchStrategies = react.useCallback(async () => {
|
|
1472
|
+
setIsLoading(true);
|
|
1473
|
+
setError(null);
|
|
1474
|
+
try {
|
|
1475
|
+
const result = await getClient().getAIStrategies({ category, riskLevel, minTvl, isActive });
|
|
1476
|
+
if (result.success && result.data?.strategies) {
|
|
1477
|
+
setStrategies(result.data.strategies);
|
|
1478
|
+
} else {
|
|
1479
|
+
setError(result.error?.message || "Failed to fetch strategies");
|
|
1480
|
+
}
|
|
1481
|
+
} catch (err) {
|
|
1482
|
+
setError(err instanceof Error ? err.message : "Unknown error");
|
|
1483
|
+
} finally {
|
|
1484
|
+
setIsLoading(false);
|
|
1485
|
+
}
|
|
1486
|
+
}, [category, riskLevel, minTvl, isActive]);
|
|
1487
|
+
react.useEffect(() => {
|
|
1488
|
+
fetchStrategies();
|
|
1489
|
+
}, [fetchStrategies]);
|
|
1490
|
+
react.useEffect(() => {
|
|
1491
|
+
if (autoRefresh && refreshInterval > 0) {
|
|
1492
|
+
const interval = setInterval(fetchStrategies, refreshInterval);
|
|
1493
|
+
return () => clearInterval(interval);
|
|
1494
|
+
}
|
|
1495
|
+
}, [autoRefresh, refreshInterval, fetchStrategies]);
|
|
1496
|
+
return { strategies, isLoading, error, refresh: fetchStrategies };
|
|
1497
|
+
}
|
|
1498
|
+
function useAIStrategy(strategyId, include = ["performance", "market"]) {
|
|
1499
|
+
const [strategy, setStrategy] = react.useState(null);
|
|
1500
|
+
const [performance, setPerformance] = react.useState([]);
|
|
1501
|
+
const [marketData, setMarketData] = react.useState([]);
|
|
1502
|
+
const [isLoading, setIsLoading] = react.useState(true);
|
|
1503
|
+
const [error, setError] = react.useState(null);
|
|
1504
|
+
const fetchStrategy = react.useCallback(async () => {
|
|
1505
|
+
if (!strategyId) {
|
|
1506
|
+
setIsLoading(false);
|
|
1507
|
+
return;
|
|
1508
|
+
}
|
|
1509
|
+
setIsLoading(true);
|
|
1510
|
+
setError(null);
|
|
1511
|
+
try {
|
|
1512
|
+
const result = await getClient().getAIStrategy(strategyId, include);
|
|
1513
|
+
if (result.success && result.data) {
|
|
1514
|
+
setStrategy(result.data.strategy);
|
|
1515
|
+
setPerformance(result.data.performance || []);
|
|
1516
|
+
setMarketData(result.data.marketData || []);
|
|
1517
|
+
} else {
|
|
1518
|
+
setError(result.error?.message || "Failed to fetch strategy");
|
|
1519
|
+
}
|
|
1520
|
+
} catch (err) {
|
|
1521
|
+
setError(err instanceof Error ? err.message : "Unknown error");
|
|
1522
|
+
} finally {
|
|
1523
|
+
setIsLoading(false);
|
|
1524
|
+
}
|
|
1525
|
+
}, [strategyId, include.join(",")]);
|
|
1526
|
+
react.useEffect(() => {
|
|
1527
|
+
fetchStrategy();
|
|
1528
|
+
}, [fetchStrategy]);
|
|
1529
|
+
return { strategy, performance, marketData, isLoading, error, refresh: fetchStrategy };
|
|
1530
|
+
}
|
|
1531
|
+
function useAIOrders(options = {}) {
|
|
1532
|
+
const [orders, setOrders] = react.useState([]);
|
|
1533
|
+
const [isLoading, setIsLoading] = react.useState(true);
|
|
1534
|
+
const [error, setError] = react.useState(null);
|
|
1535
|
+
const { strategyId, status, autoRefresh = true, refreshInterval = 3e4 } = options;
|
|
1536
|
+
const fetchOrders = react.useCallback(async () => {
|
|
1537
|
+
setIsLoading(true);
|
|
1538
|
+
setError(null);
|
|
1539
|
+
try {
|
|
1540
|
+
const result = await getClient().getAIOrders({ strategyId, status });
|
|
1541
|
+
if (result.success && result.data?.orders) {
|
|
1542
|
+
setOrders(result.data.orders);
|
|
1543
|
+
} else {
|
|
1544
|
+
setError(result.error?.message || "Failed to fetch orders");
|
|
1545
|
+
}
|
|
1546
|
+
} catch (err) {
|
|
1547
|
+
setError(err instanceof Error ? err.message : "Unknown error");
|
|
1548
|
+
} finally {
|
|
1549
|
+
setIsLoading(false);
|
|
1550
|
+
}
|
|
1551
|
+
}, [strategyId, status]);
|
|
1552
|
+
react.useEffect(() => {
|
|
1553
|
+
fetchOrders();
|
|
1554
|
+
}, [fetchOrders]);
|
|
1555
|
+
react.useEffect(() => {
|
|
1556
|
+
if (autoRefresh && refreshInterval > 0) {
|
|
1557
|
+
const interval = setInterval(fetchOrders, refreshInterval);
|
|
1558
|
+
return () => clearInterval(interval);
|
|
1559
|
+
}
|
|
1560
|
+
}, [autoRefresh, refreshInterval, fetchOrders]);
|
|
1561
|
+
const createOrder = react.useCallback(async (request) => {
|
|
1562
|
+
const result = await getClient().createAIOrder(request);
|
|
1563
|
+
if (result.success) {
|
|
1564
|
+
await fetchOrders();
|
|
1565
|
+
}
|
|
1566
|
+
return result;
|
|
1567
|
+
}, [fetchOrders]);
|
|
1568
|
+
const pauseOrder = react.useCallback(async (orderId) => {
|
|
1569
|
+
const result = await getClient().pauseAIOrder(orderId);
|
|
1570
|
+
if (result.success) {
|
|
1571
|
+
await fetchOrders();
|
|
1572
|
+
}
|
|
1573
|
+
return result;
|
|
1574
|
+
}, [fetchOrders]);
|
|
1575
|
+
const resumeOrder = react.useCallback(async (orderId) => {
|
|
1576
|
+
const result = await getClient().resumeAIOrder(orderId);
|
|
1577
|
+
if (result.success) {
|
|
1578
|
+
await fetchOrders();
|
|
1579
|
+
}
|
|
1580
|
+
return result;
|
|
1581
|
+
}, [fetchOrders]);
|
|
1582
|
+
const redeemOrder = react.useCallback(async (orderId) => {
|
|
1583
|
+
const result = await getClient().redeemAIOrder(orderId);
|
|
1584
|
+
if (result.success) {
|
|
1585
|
+
await fetchOrders();
|
|
1586
|
+
}
|
|
1587
|
+
return result;
|
|
1588
|
+
}, [fetchOrders]);
|
|
1589
|
+
return {
|
|
1590
|
+
orders,
|
|
1591
|
+
isLoading,
|
|
1592
|
+
error,
|
|
1593
|
+
refresh: fetchOrders,
|
|
1594
|
+
createOrder,
|
|
1595
|
+
pauseOrder,
|
|
1596
|
+
resumeOrder,
|
|
1597
|
+
redeemOrder
|
|
1598
|
+
};
|
|
1599
|
+
}
|
|
1600
|
+
function useAIPortfolio(autoRefresh = true) {
|
|
1601
|
+
const [portfolio, setPortfolio] = react.useState(null);
|
|
1602
|
+
const [allocations, setAllocations] = react.useState([]);
|
|
1603
|
+
const [activeOrders, setActiveOrders] = react.useState([]);
|
|
1604
|
+
const [isLoading, setIsLoading] = react.useState(true);
|
|
1605
|
+
const [error, setError] = react.useState(null);
|
|
1606
|
+
const fetchPortfolio = react.useCallback(async () => {
|
|
1607
|
+
setIsLoading(true);
|
|
1608
|
+
setError(null);
|
|
1609
|
+
try {
|
|
1610
|
+
const result = await getClient().getAIPortfolio(["allocations", "orders"]);
|
|
1611
|
+
if (result.success && result.data) {
|
|
1612
|
+
setPortfolio(result.data.portfolio);
|
|
1613
|
+
setAllocations(result.data.allocations || []);
|
|
1614
|
+
setActiveOrders(result.data.orders || []);
|
|
1615
|
+
} else {
|
|
1616
|
+
setError(result.error?.message || "Failed to fetch portfolio");
|
|
1617
|
+
}
|
|
1618
|
+
} catch (err) {
|
|
1619
|
+
setError(err instanceof Error ? err.message : "Unknown error");
|
|
1620
|
+
} finally {
|
|
1621
|
+
setIsLoading(false);
|
|
1622
|
+
}
|
|
1623
|
+
}, []);
|
|
1624
|
+
react.useEffect(() => {
|
|
1625
|
+
fetchPortfolio();
|
|
1626
|
+
}, [fetchPortfolio]);
|
|
1627
|
+
react.useEffect(() => {
|
|
1628
|
+
if (autoRefresh) {
|
|
1629
|
+
const interval = setInterval(fetchPortfolio, 3e4);
|
|
1630
|
+
return () => clearInterval(interval);
|
|
1631
|
+
}
|
|
1632
|
+
}, [autoRefresh, fetchPortfolio]);
|
|
1633
|
+
return { portfolio, allocations, activeOrders, isLoading, error, refresh: fetchPortfolio };
|
|
1634
|
+
}
|
|
1635
|
+
function useAIMarketData(symbols = ["BTC", "ETH", "BNB", "SOL", "XRP", "DOGE", "ADA", "AVAX"], autoRefresh = true) {
|
|
1636
|
+
const [prices, setPrices] = react.useState({});
|
|
1637
|
+
const [isLoading, setIsLoading] = react.useState(true);
|
|
1638
|
+
const [error, setError] = react.useState(null);
|
|
1639
|
+
const fetchPrices = react.useCallback(async () => {
|
|
1640
|
+
setIsLoading(true);
|
|
1641
|
+
setError(null);
|
|
1642
|
+
try {
|
|
1643
|
+
const result = await getClient().getTokenPrices(symbols);
|
|
1644
|
+
if (result.success && result.data) {
|
|
1645
|
+
setPrices(result.data);
|
|
1646
|
+
} else {
|
|
1647
|
+
setError(result.error?.message || "Failed to fetch prices");
|
|
1648
|
+
}
|
|
1649
|
+
} catch (err) {
|
|
1650
|
+
setError(err instanceof Error ? err.message : "Unknown error");
|
|
1651
|
+
} finally {
|
|
1652
|
+
setIsLoading(false);
|
|
1653
|
+
}
|
|
1654
|
+
}, [symbols.join(",")]);
|
|
1655
|
+
react.useEffect(() => {
|
|
1656
|
+
fetchPrices();
|
|
1657
|
+
}, [fetchPrices]);
|
|
1658
|
+
react.useEffect(() => {
|
|
1659
|
+
if (autoRefresh) {
|
|
1660
|
+
const interval = setInterval(fetchPrices, 15e3);
|
|
1661
|
+
return () => clearInterval(interval);
|
|
1662
|
+
}
|
|
1663
|
+
}, [autoRefresh, fetchPrices]);
|
|
1664
|
+
return { prices, isLoading, error, refresh: fetchPrices };
|
|
1665
|
+
}
|
|
1666
|
+
function useAITrading() {
|
|
1667
|
+
const strategiesResult = useAIStrategies({ autoRefresh: true });
|
|
1668
|
+
const ordersResult = useAIOrders({ autoRefresh: true });
|
|
1669
|
+
const portfolioResult = useAIPortfolio(true);
|
|
1670
|
+
const marketResult = useAIMarketData();
|
|
1671
|
+
const refreshAll = react.useCallback(async () => {
|
|
1672
|
+
await Promise.all([
|
|
1673
|
+
strategiesResult.refresh(),
|
|
1674
|
+
ordersResult.refresh(),
|
|
1675
|
+
portfolioResult.refresh(),
|
|
1676
|
+
marketResult.refresh()
|
|
1677
|
+
]);
|
|
1678
|
+
}, [strategiesResult.refresh, ordersResult.refresh, portfolioResult.refresh, marketResult.refresh]);
|
|
1679
|
+
const error = react.useMemo(() => {
|
|
1680
|
+
return strategiesResult.error || ordersResult.error || portfolioResult.error || marketResult.error;
|
|
1681
|
+
}, [strategiesResult.error, ordersResult.error, portfolioResult.error, marketResult.error]);
|
|
1682
|
+
return {
|
|
1683
|
+
strategies: strategiesResult.strategies,
|
|
1684
|
+
strategiesLoading: strategiesResult.isLoading,
|
|
1685
|
+
orders: ordersResult.orders,
|
|
1686
|
+
ordersLoading: ordersResult.isLoading,
|
|
1687
|
+
portfolio: portfolioResult.portfolio,
|
|
1688
|
+
portfolioLoading: portfolioResult.isLoading,
|
|
1689
|
+
prices: marketResult.prices,
|
|
1690
|
+
createOrder: ordersResult.createOrder,
|
|
1691
|
+
pauseOrder: ordersResult.pauseOrder,
|
|
1692
|
+
resumeOrder: ordersResult.resumeOrder,
|
|
1693
|
+
redeemOrder: ordersResult.redeemOrder,
|
|
1694
|
+
refreshAll,
|
|
1695
|
+
error
|
|
1696
|
+
};
|
|
1697
|
+
}
|
|
1355
1698
|
|
|
1699
|
+
exports.clearAITradingAccessToken = clearAITradingAccessToken;
|
|
1700
|
+
exports.setAITradingAccessToken = setAITradingAccessToken;
|
|
1701
|
+
exports.useAIMarketData = useAIMarketData;
|
|
1702
|
+
exports.useAIOrders = useAIOrders;
|
|
1703
|
+
exports.useAIPortfolio = useAIPortfolio;
|
|
1704
|
+
exports.useAIStrategies = useAIStrategies;
|
|
1705
|
+
exports.useAIStrategy = useAIStrategy;
|
|
1706
|
+
exports.useAITrading = useAITrading;
|
|
1356
1707
|
exports.useTokenPrice = useTokenPrice;
|
|
1357
1708
|
exports.useTokenPrices = useTokenPrices;
|
|
1358
1709
|
exports.useWalletBalance = useWalletBalance;
|