@rayadesu/dsh-client-ui-billing 0.1.0-rc.8 → 0.1.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.
- package/README.i18n.yaml +2 -2
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/lib/client.js +20 -20
- package/lib/types/client/locales.d.ts +1 -1
- package/package.json +9 -9
- package/LICENSE +0 -21
package/README.i18n.yaml
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
# last confirmed-consistent state. Both languages carry equal authority; after
|
|
3
3
|
# editing either side, bring the other along and re-record both hashes with:
|
|
4
4
|
# git hash-object README.md README.zh.md
|
|
5
|
-
README.md:
|
|
6
|
-
README.zh.md:
|
|
5
|
+
README.md: c29d9a4ee0ff5a52e184f6ac6fa512b4bf932733
|
|
6
|
+
README.zh.md: 8bfeb0333533b20c386fb3f29039742249ed0165
|
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ English | [中文](README.zh.md)
|
|
|
4
4
|
|
|
5
5
|
Web billing feature owner: contributes one entry to `conversation.session.header.utilities` that mounts its own `billing` Remote, reads the DeepSeek account balance, this session's billed spend, and today's spend across every session through `billing/getBalance`, `billing/getSessionSpend`, and `billing/getTodaySpend`, and renders them as a top-right label box. The host half of the capability lives in [`dsh-llm-billing`](../llm-billing/README.md), which owns the `/user/balance` transport, the peak/off-peak pricing table, and the `billing` Remote namespace; this package mounts that Remote and renders what it returns.
|
|
6
6
|
|
|
7
|
-
The trigger shows two lines — the remaining balance and this conversation's billed spend ("本轮对话花费 ¥X") — and renders nothing while the first fetch is in flight. Clicking it opens a label box with the remaining amount, this session's billed spend (本会话花费, priced per message at the official peak/off-peak rate) with today's all-session spend beside it (今日共花费), one priced row per model with the cache-hit / cache-miss-input / output cost breakdown ("缓存命中 ¥X · 未命中输入 ¥Y · 输出 ¥Z"), a manual refresh action, and a spend disclaimer. Refreshing keeps the last values visible rather than blanking them, and a refresh failure retains the last good value. A session or day without priced usage shows a "no usage recorded" word rather than a fabricated figure. A failure — no API key configured, a rejected credential, a transport error — renders a muted "Balance unavailable" word whose tooltip carries the Remote's own error message.
|
|
7
|
+
The trigger shows two lines — the remaining balance and this conversation's billed spend ("本轮对话花费 ¥X") — and renders nothing while the first fetch is in flight. Clicking it opens a label box with the remaining amount, this session's billed spend (本会话花费, priced per message at the official peak/off-peak rate — peak windows apply weekdays Mon–Fri only, weekends are off-peak) with today's all-session spend beside it (今日共花费), one priced row per model with the cache-hit / cache-miss-input / output cost breakdown ("缓存命中 ¥X · 未命中输入 ¥Y · 输出 ¥Z"), a manual refresh action, and a spend disclaimer. Refreshing keeps the last values visible rather than blanking them, and a refresh failure retains the last good value. A session or day without priced usage shows a "no usage recorded" word rather than a fabricated figure. A failure — no API key configured, a rejected credential, a transport error — renders a muted "Balance unavailable" word whose tooltip carries the Remote's own error message.
|
|
8
8
|
|
|
9
9
|
The badge is account-level even though the slot is session-scoped: the header utilities row is simply the one always-visible title-bar seat the shell offers, and the balance it shows does not vary by session — but the spend lines do, because they price the current session's own token usage through `billing/getSessionSpend` and every session's usage through `billing/getTodaySpend`. Copy goes through the package's own `billing` locale namespace; styling uses tokens only.
|
|
10
10
|
|
package/README.zh.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
Web 额度特性的归属方:向 `conversation.session.header.utilities` 贡献一个条目,自己挂载 `billing` Remote,通过 `billing/getBalance`、`billing/getSessionSpend` 与 `billing/getTodaySpend` 读取 DeepSeek 账户余额、本会话的计费花费与今日所有会话的计费花费,并在右上角渲染成一个标签框。该能力的宿主侧在 [`dsh-llm-billing`](../llm-billing/README.md),它拥有 `/user/balance` 传输、峰谷计价表与 `billing` Remote 命名空间;本包挂载那个 Remote 并渲染它返回的内容。
|
|
6
6
|
|
|
7
|
-
触发器显示两行——剩余额度与本轮对话的计费花费(「本轮对话花费 ¥X
|
|
7
|
+
触发器显示两行——剩余额度与本轮对话的计费花费(「本轮对话花费 ¥X」)——首个请求在途时不渲染任何东西。点击后展开一个标签框:剩余金额、本会话的计费花费(本会话花费,按官方峰/谷单价逐条消息计价——高峰窗口仅周一至周五适用,周末按低谷价——右侧并列今日所有会话的合计「今日共花费」)、每个模型一行的花费及其缓存命中/未命中输入/输出分项(「缓存命中 ¥X · 未命中输入 ¥Y · 输出 ¥Z」)、手动刷新按钮与花费说明。刷新时旧值不消失,刷新失败保留上一次有效值。没有可计价消耗的会话或日子显示「暂无消耗记录」而不是编造数字。失败——未配置 API key、凭据被拒绝、传输错误——渲染弱化的「额度不可用」,其提示携带 Remote 自己的错误信息。
|
|
8
8
|
|
|
9
9
|
角标是账户级的,尽管插槽是会话作用域:顶栏工具行不过是外壳提供的那个始终可见的标题栏席位,余额并不随会话变化——但花费行会,因为它通过 `billing/getSessionSpend` 按当前会话自己的 token 用量计价、通过 `billing/getTodaySpend` 按所有会话的用量计价。文案走本包自己的 `billing` locale 命名空间;样式只用 token。
|
|
10
10
|
|
package/lib/client.js
CHANGED
|
@@ -7,7 +7,7 @@ window.__ModuleLoader__.load({
|
|
|
7
7
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
8
|
let react = require("react");
|
|
9
9
|
let _deepseek_ai_dsh_client_ui_primitives = require("@deepseek-ai/dsh-client-ui-primitives");
|
|
10
|
-
//#region
|
|
10
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/core.js
|
|
11
11
|
var _a$1;
|
|
12
12
|
function $constructor(name, initializer, params) {
|
|
13
13
|
function init(inst, def) {
|
|
@@ -66,7 +66,7 @@ window.__ModuleLoader__.load({
|
|
|
66
66
|
return globalConfig;
|
|
67
67
|
}
|
|
68
68
|
//#endregion
|
|
69
|
-
//#region
|
|
69
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/util.js
|
|
70
70
|
function getEnumValues(entries) {
|
|
71
71
|
const numericValues = Object.values(entries).filter((v) => typeof v === "number");
|
|
72
72
|
return Object.entries(entries).filter(([k, _]) => numericValues.indexOf(+k) === -1).map(([_, v]) => v);
|
|
@@ -378,7 +378,7 @@ window.__ModuleLoader__.load({
|
|
|
378
378
|
return { ...iss };
|
|
379
379
|
}
|
|
380
380
|
//#endregion
|
|
381
|
-
//#region
|
|
381
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/errors.js
|
|
382
382
|
const initializer$1 = (inst, def) => {
|
|
383
383
|
inst.name = "$ZodError";
|
|
384
384
|
Object.defineProperty(inst, "_zod", {
|
|
@@ -438,7 +438,7 @@ window.__ModuleLoader__.load({
|
|
|
438
438
|
return fieldErrors;
|
|
439
439
|
}
|
|
440
440
|
//#endregion
|
|
441
|
-
//#region
|
|
441
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/parse.js
|
|
442
442
|
const _parse = (_Err) => (schema, value, _ctx, _params) => {
|
|
443
443
|
const ctx = _ctx ? {
|
|
444
444
|
..._ctx,
|
|
@@ -552,7 +552,7 @@ window.__ModuleLoader__.load({
|
|
|
552
552
|
return _safeParseAsync(_Err)(schema, value, _ctx);
|
|
553
553
|
};
|
|
554
554
|
//#endregion
|
|
555
|
-
//#region
|
|
555
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/regexes.js
|
|
556
556
|
/**
|
|
557
557
|
* @deprecated CUID v1 is deprecated by its authors due to information leakage
|
|
558
558
|
* (timestamps embedded in the id). Use {@link cuid2} instead.
|
|
@@ -616,7 +616,7 @@ window.__ModuleLoader__.load({
|
|
|
616
616
|
const lowercase = /^[^A-Z]*$/;
|
|
617
617
|
const uppercase = /^[^a-z]*$/;
|
|
618
618
|
//#endregion
|
|
619
|
-
//#region
|
|
619
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/checks.js
|
|
620
620
|
const $ZodCheck = /*@__PURE__*/ $constructor("$ZodCheck", (inst, def) => {
|
|
621
621
|
var _a;
|
|
622
622
|
inst._zod ?? (inst._zod = {});
|
|
@@ -974,7 +974,7 @@ window.__ModuleLoader__.load({
|
|
|
974
974
|
};
|
|
975
975
|
});
|
|
976
976
|
//#endregion
|
|
977
|
-
//#region
|
|
977
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/doc.js
|
|
978
978
|
var Doc = class {
|
|
979
979
|
constructor(args = []) {
|
|
980
980
|
this.content = [];
|
|
@@ -1005,14 +1005,14 @@ window.__ModuleLoader__.load({
|
|
|
1005
1005
|
}
|
|
1006
1006
|
};
|
|
1007
1007
|
//#endregion
|
|
1008
|
-
//#region
|
|
1008
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/versions.js
|
|
1009
1009
|
const version = {
|
|
1010
1010
|
major: 4,
|
|
1011
1011
|
minor: 4,
|
|
1012
1012
|
patch: 3
|
|
1013
1013
|
};
|
|
1014
1014
|
//#endregion
|
|
1015
|
-
//#region
|
|
1015
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/schemas.js
|
|
1016
1016
|
const $ZodType = /*@__PURE__*/ $constructor("$ZodType", (inst, def) => {
|
|
1017
1017
|
var _a;
|
|
1018
1018
|
inst ?? (inst = {});
|
|
@@ -2115,7 +2115,7 @@ window.__ModuleLoader__.load({
|
|
|
2115
2115
|
}
|
|
2116
2116
|
}
|
|
2117
2117
|
//#endregion
|
|
2118
|
-
//#region
|
|
2118
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/registries.js
|
|
2119
2119
|
var _a;
|
|
2120
2120
|
var $ZodRegistry = class {
|
|
2121
2121
|
constructor() {
|
|
@@ -2162,7 +2162,7 @@ window.__ModuleLoader__.load({
|
|
|
2162
2162
|
(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());
|
|
2163
2163
|
const globalRegistry = globalThis.__zod_globalRegistry;
|
|
2164
2164
|
//#endregion
|
|
2165
|
-
//#region
|
|
2165
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/api.js
|
|
2166
2166
|
// @__NO_SIDE_EFFECTS__
|
|
2167
2167
|
function _string(Class, params) {
|
|
2168
2168
|
return new Class({
|
|
@@ -2667,7 +2667,7 @@ window.__ModuleLoader__.load({
|
|
|
2667
2667
|
return ch;
|
|
2668
2668
|
}
|
|
2669
2669
|
//#endregion
|
|
2670
|
-
//#region
|
|
2670
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/to-json-schema.js
|
|
2671
2671
|
function initializeContext(params) {
|
|
2672
2672
|
let target = params?.target ?? "draft-2020-12";
|
|
2673
2673
|
if (target === "draft-4") target = "draft-04";
|
|
@@ -2960,7 +2960,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
2960
2960
|
return finalize(ctx, schema);
|
|
2961
2961
|
};
|
|
2962
2962
|
//#endregion
|
|
2963
|
-
//#region
|
|
2963
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/core/json-schema-processors.js
|
|
2964
2964
|
const formatMap = {
|
|
2965
2965
|
guid: "uuid",
|
|
2966
2966
|
url: "uri",
|
|
@@ -3168,7 +3168,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
3168
3168
|
seen.ref = def.innerType;
|
|
3169
3169
|
};
|
|
3170
3170
|
//#endregion
|
|
3171
|
-
//#region
|
|
3171
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/classic/iso.js
|
|
3172
3172
|
const ZodISODateTime = /*@__PURE__*/ $constructor("ZodISODateTime", (inst, def) => {
|
|
3173
3173
|
$ZodISODateTime.init(inst, def);
|
|
3174
3174
|
ZodStringFormat.init(inst, def);
|
|
@@ -3198,7 +3198,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
3198
3198
|
return /* @__PURE__ */ _isoDuration(ZodISODuration, params);
|
|
3199
3199
|
}
|
|
3200
3200
|
//#endregion
|
|
3201
|
-
//#region
|
|
3201
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/classic/errors.js
|
|
3202
3202
|
const initializer = (inst, issues) => {
|
|
3203
3203
|
$ZodError.init(inst, issues);
|
|
3204
3204
|
inst.name = "ZodError";
|
|
@@ -3220,7 +3220,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
3220
3220
|
};
|
|
3221
3221
|
const ZodRealError = /*@__PURE__*/ $constructor("ZodError", initializer, { Parent: Error });
|
|
3222
3222
|
//#endregion
|
|
3223
|
-
//#region
|
|
3223
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/classic/parse.js
|
|
3224
3224
|
const parse = /* @__PURE__ */ _parse(ZodRealError);
|
|
3225
3225
|
const parseAsync = /* @__PURE__ */ _parseAsync(ZodRealError);
|
|
3226
3226
|
const safeParse = /* @__PURE__ */ _safeParse(ZodRealError);
|
|
@@ -3234,7 +3234,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
3234
3234
|
const safeEncodeAsync = /* @__PURE__ */ _safeEncodeAsync(ZodRealError);
|
|
3235
3235
|
const safeDecodeAsync = /* @__PURE__ */ _safeDecodeAsync(ZodRealError);
|
|
3236
3236
|
//#endregion
|
|
3237
|
-
//#region
|
|
3237
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/node_modules/zod/v4/classic/schemas.js
|
|
3238
3238
|
const _installedGroups = /* @__PURE__ */ new WeakMap();
|
|
3239
3239
|
function _installLazyMethods(inst, group, methods) {
|
|
3240
3240
|
const proto = Object.getPrototypeOf(inst);
|
|
@@ -3989,7 +3989,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
3989
3989
|
return /* @__PURE__ */ _superRefine(fn, params);
|
|
3990
3990
|
}
|
|
3991
3991
|
//#endregion
|
|
3992
|
-
//#region
|
|
3992
|
+
//#region node_modules/@rayadesu/dsh-llm-billing/lib/typert.remote-client.js
|
|
3993
3993
|
const _deepseek_ai_dsh_llm_billing_billing_getBalance_result$schema = object({
|
|
3994
3994
|
"isAvailable": boolean(),
|
|
3995
3995
|
"lines": array(object({
|
|
@@ -4387,7 +4387,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4387
4387
|
"state.unavailable": "额度不可用",
|
|
4388
4388
|
"action.refresh": "刷新",
|
|
4389
4389
|
"info.aria": "花费说明",
|
|
4390
|
-
"info.hint": "仅能预估 DeepSeek
|
|
4390
|
+
"info.hint": "仅能预估 DeepSeek 相关模型。本会话花费按每条消息的发生时刻(北京时间)所在峰谷时段单价计费:缓存命中输入、未命中输入(含缓存写入)、输出(含推理)分别计价。费率按 8 月 17 日实行的标准,高峰时段为北京时间周一至周五 9:00–12:00、14:00–18:00,周末全天按低谷价计费。",
|
|
4391
4391
|
"badge.aria": "DeepSeek 额度:{amount}",
|
|
4392
4392
|
"panel.aria": "DeepSeek 额度详情"
|
|
4393
4393
|
};
|
|
@@ -4405,7 +4405,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
|
|
|
4405
4405
|
"state.unavailable": "Balance unavailable",
|
|
4406
4406
|
"action.refresh": "Refresh",
|
|
4407
4407
|
"info.aria": "About this spend",
|
|
4408
|
-
"info.hint": "Only DeepSeek models are estimated. This session's spend is priced per message at the rate of its Beijing-time peak/off-peak hour: cache-hit input, cache-miss input (including cache writes), and output (including reasoning) are billed separately.
|
|
4408
|
+
"info.hint": "Only DeepSeek models are estimated. This session's spend is priced per message at the rate of its Beijing-time peak/off-peak hour: cache-hit input, cache-miss input (including cache writes), and output (including reasoning) are billed separately. Rates follow the August 17 pricing; peak hours are Beijing time Monday–Friday 09:00–12:00 and 14:00–18:00, and weekends are billed at off-peak prices all day.",
|
|
4409
4409
|
"badge.aria": "DeepSeek balance {amount}",
|
|
4410
4410
|
"panel.aria": "DeepSeek balance details"
|
|
4411
4411
|
};
|
|
@@ -15,7 +15,7 @@ export declare const zh: {
|
|
|
15
15
|
readonly 'state.unavailable': "额度不可用";
|
|
16
16
|
readonly 'action.refresh': "刷新";
|
|
17
17
|
readonly 'info.aria': "花费说明";
|
|
18
|
-
readonly 'info.hint': "仅能预估 DeepSeek
|
|
18
|
+
readonly 'info.hint': "仅能预估 DeepSeek 相关模型。本会话花费按每条消息的发生时刻(北京时间)所在峰谷时段单价计费:缓存命中输入、未命中输入(含缓存写入)、输出(含推理)分别计价。费率按 8 月 17 日实行的标准,高峰时段为北京时间周一至周五 9:00–12:00、14:00–18:00,周末全天按低谷价计费。";
|
|
19
19
|
readonly 'badge.aria': "DeepSeek 额度:{amount}";
|
|
20
20
|
readonly 'panel.aria': "DeepSeek 额度详情";
|
|
21
21
|
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rayadesu/dsh-client-ui-billing",
|
|
3
3
|
"description": "Session-header DeepSeek account-balance and conversation-spend badge over the billing Remote",
|
|
4
|
-
"version": "0.1.0
|
|
4
|
+
"version": "0.1.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|
|
7
7
|
"types": "lib/types/index.d.ts",
|
|
@@ -31,6 +31,10 @@
|
|
|
31
31
|
"platform": "web"
|
|
32
32
|
}
|
|
33
33
|
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"bundle": "tsdown",
|
|
36
|
+
"watch": "tsdown --watch"
|
|
37
|
+
},
|
|
34
38
|
"license": "MIT",
|
|
35
39
|
"repository": {
|
|
36
40
|
"type": "git",
|
|
@@ -41,7 +45,7 @@
|
|
|
41
45
|
"access": "public"
|
|
42
46
|
},
|
|
43
47
|
"peerDependencies": {
|
|
44
|
-
"@rayadesu/dsh-llm-billing": "^0.1.0
|
|
48
|
+
"@rayadesu/dsh-llm-billing": "^0.1.0",
|
|
45
49
|
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.8",
|
|
46
50
|
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.8",
|
|
47
51
|
"@deepseek-ai/dsh-client-ui-conversation": "^0.1.0-rc.8",
|
|
@@ -50,7 +54,7 @@
|
|
|
50
54
|
"@deepseek-ai/cordis": "^4.0.1"
|
|
51
55
|
},
|
|
52
56
|
"devDependencies": {
|
|
53
|
-
"@rayadesu/dsh-llm-billing": "^0.1.0
|
|
57
|
+
"@rayadesu/dsh-llm-billing": "^0.1.0",
|
|
54
58
|
"@deepseek-ai/dsh-client-locale": "^0.1.0-rc.8",
|
|
55
59
|
"@deepseek-ai/dsh-client-runtime": "^0.1.0-rc.8",
|
|
56
60
|
"@deepseek-ai/dsh-client-test-runtime": "^0.1.0-rc.8",
|
|
@@ -68,9 +72,5 @@
|
|
|
68
72
|
"lib/invariant.js",
|
|
69
73
|
"lib/client.js",
|
|
70
74
|
"lib/types/**/*.d.ts"
|
|
71
|
-
]
|
|
72
|
-
|
|
73
|
-
"bundle": "tsdown",
|
|
74
|
-
"watch": "tsdown --watch"
|
|
75
|
-
}
|
|
76
|
-
}
|
|
75
|
+
]
|
|
76
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 WilliamLIiii
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|