hood-alerts 0.1.1 → 0.2.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/.env.example +90 -0
- package/Dockerfile +65 -0
- package/LICENSE +15 -14
- package/README.md +253 -309
- package/dist/scripts/capture-fixtures.d.ts +2 -0
- package/dist/scripts/capture-fixtures.js +143 -0
- package/dist/scripts/capture-fixtures.js.map +1 -0
- package/dist/scripts/grant-premium.d.ts +2 -0
- package/dist/scripts/grant-premium.js +70 -0
- package/dist/scripts/grant-premium.js.map +1 -0
- package/dist/scripts/live-probe.d.ts +2 -0
- package/dist/scripts/live-probe.js +51 -0
- package/dist/scripts/live-probe.js.map +1 -0
- package/dist/src/commands/commands.d.ts +42 -0
- package/dist/src/commands/commands.js +246 -0
- package/dist/src/commands/commands.js.map +1 -0
- package/dist/src/config.d.ts +69 -0
- package/dist/src/config.js +72 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/db/deliveries.d.ts +17 -0
- package/dist/src/db/deliveries.js +41 -0
- package/dist/src/db/deliveries.js.map +1 -0
- package/dist/src/db/entitlements.d.ts +41 -0
- package/dist/src/db/entitlements.js +73 -0
- package/dist/src/db/entitlements.js.map +1 -0
- package/dist/src/db/index.d.ts +4 -0
- package/dist/src/db/index.js +63 -0
- package/dist/src/db/index.js.map +1 -0
- package/dist/src/db/subscribers.d.ts +44 -0
- package/dist/src/db/subscribers.js +124 -0
- package/dist/src/db/subscribers.js.map +1 -0
- package/dist/src/engine/detectors/holders.d.ts +16 -0
- package/dist/src/engine/detectors/holders.js +33 -0
- package/dist/src/engine/detectors/holders.js.map +1 -0
- package/dist/src/engine/detectors/liquidity.d.ts +24 -0
- package/dist/src/engine/detectors/liquidity.js +62 -0
- package/dist/src/engine/detectors/liquidity.js.map +1 -0
- package/dist/src/engine/detectors/live.d.ts +52 -0
- package/dist/src/engine/detectors/live.js +420 -0
- package/dist/src/engine/detectors/live.js.map +1 -0
- package/dist/src/engine/detectors/premium-ladder.d.ts +14 -0
- package/dist/src/engine/detectors/premium-ladder.js +61 -0
- package/dist/src/engine/detectors/premium-ladder.js.map +1 -0
- package/dist/src/engine/detectors/prices.d.ts +15 -0
- package/dist/src/engine/detectors/prices.js +45 -0
- package/dist/src/engine/detectors/prices.js.map +1 -0
- package/dist/src/engine/detectors/whale-classify.d.ts +18 -0
- package/dist/src/engine/detectors/whale-classify.js +69 -0
- package/dist/src/engine/detectors/whale-classify.js.map +1 -0
- package/dist/src/engine/digest.d.ts +31 -0
- package/dist/src/engine/digest.js +48 -0
- package/dist/src/engine/digest.js.map +1 -0
- package/dist/src/engine/engine.d.ts +40 -0
- package/dist/src/engine/engine.js +175 -0
- package/dist/src/engine/engine.js.map +1 -0
- package/dist/src/engine/eth-price.d.ts +18 -0
- package/dist/src/engine/eth-price.js +85 -0
- package/dist/src/engine/eth-price.js.map +1 -0
- package/dist/src/engine/events.d.ts +94 -0
- package/dist/src/engine/events.js +37 -0
- package/dist/src/engine/events.js.map +1 -0
- package/dist/src/engine/gate.d.ts +35 -0
- package/dist/src/engine/gate.js +35 -0
- package/dist/src/engine/gate.js.map +1 -0
- package/dist/src/engine/token-meta.d.ts +17 -0
- package/dist/src/engine/token-meta.js +44 -0
- package/dist/src/engine/token-meta.js.map +1 -0
- package/dist/src/engine/topics.d.ts +60 -0
- package/dist/src/engine/topics.js +120 -0
- package/dist/src/engine/topics.js.map +1 -0
- package/dist/src/format/cards.d.ts +46 -0
- package/dist/src/format/cards.js +193 -0
- package/dist/src/format/cards.js.map +1 -0
- package/dist/{service/main.d.cts → src/index.d.ts} +1 -0
- package/dist/src/index.js +133 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logger.d.ts +5 -0
- package/dist/src/logger.js +16 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/premium/paywall.d.ts +40 -0
- package/dist/src/premium/paywall.js +105 -0
- package/dist/src/premium/paywall.js.map +1 -0
- package/dist/src/server.d.ts +14 -0
- package/dist/src/server.js +57 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/transports/console.d.ts +14 -0
- package/dist/src/transports/console.js +24 -0
- package/dist/src/transports/console.js.map +1 -0
- package/dist/src/transports/discord.d.ts +28 -0
- package/dist/src/transports/discord.js +145 -0
- package/dist/src/transports/discord.js.map +1 -0
- package/dist/src/transports/telegram.d.ts +22 -0
- package/dist/src/transports/telegram.js +101 -0
- package/dist/src/transports/telegram.js.map +1 -0
- package/dist/src/transports/types.d.ts +14 -0
- package/dist/src/transports/types.js +2 -0
- package/dist/src/transports/types.js.map +1 -0
- package/dist/src/transports/x.d.ts +58 -0
- package/dist/src/transports/x.js +155 -0
- package/dist/src/transports/x.js.map +1 -0
- package/package.json +80 -112
- package/dist/bot/index.cjs +0 -1008
- package/dist/bot/index.cjs.map +0 -1
- package/dist/bot/index.d.cts +0 -241
- package/dist/bot/index.d.ts +0 -241
- package/dist/bot/index.js +0 -30
- package/dist/bot/index.js.map +0 -1
- package/dist/chunk-32GS6XVE.js +0 -732
- package/dist/chunk-32GS6XVE.js.map +0 -1
- package/dist/chunk-3LHCQA4Z.js +0 -76
- package/dist/chunk-3LHCQA4Z.js.map +0 -1
- package/dist/chunk-3NHLSKZE.js +0 -1
- package/dist/chunk-3NHLSKZE.js.map +0 -1
- package/dist/chunk-6JQK5G3Z.js +0 -72
- package/dist/chunk-6JQK5G3Z.js.map +0 -1
- package/dist/chunk-CBNZ6AZT.js +0 -598
- package/dist/chunk-CBNZ6AZT.js.map +0 -1
- package/dist/chunk-CIURPPOW.js +0 -1
- package/dist/chunk-CIURPPOW.js.map +0 -1
- package/dist/chunk-IUOEGBF6.js +0 -49
- package/dist/chunk-IUOEGBF6.js.map +0 -1
- package/dist/chunk-NBMINJ5E.js +0 -230
- package/dist/chunk-NBMINJ5E.js.map +0 -1
- package/dist/chunk-O2RY2SWN.js +0 -1
- package/dist/chunk-O2RY2SWN.js.map +0 -1
- package/dist/chunk-PLMVKTQM.js +0 -1
- package/dist/chunk-PLMVKTQM.js.map +0 -1
- package/dist/chunk-RSTLW7XH.js +0 -130
- package/dist/chunk-RSTLW7XH.js.map +0 -1
- package/dist/chunk-SOBZ2FPP.js +0 -355
- package/dist/chunk-SOBZ2FPP.js.map +0 -1
- package/dist/chunk-VC5MKEY2.js +0 -170
- package/dist/chunk-VC5MKEY2.js.map +0 -1
- package/dist/chunk-W2GUAWUR.js +0 -147
- package/dist/chunk-W2GUAWUR.js.map +0 -1
- package/dist/chunk-Y2M3USWZ.js +0 -355
- package/dist/chunk-Y2M3USWZ.js.map +0 -1
- package/dist/chunk-Z4DJPESQ.js +0 -1216
- package/dist/chunk-Z4DJPESQ.js.map +0 -1
- package/dist/chunk-ZDM5VNWB.js +0 -1
- package/dist/chunk-ZDM5VNWB.js.map +0 -1
- package/dist/events/index.cjs +0 -820
- package/dist/events/index.cjs.map +0 -1
- package/dist/events/index.d.cts +0 -58
- package/dist/events/index.d.ts +0 -58
- package/dist/events/index.js +0 -69
- package/dist/events/index.js.map +0 -1
- package/dist/format-6RG4OcyE.d.ts +0 -57
- package/dist/format-B7d40f65.d.cts +0 -57
- package/dist/index.cjs +0 -4122
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -21
- package/dist/index.d.ts +0 -21
- package/dist/index.js +0 -274
- package/dist/index.js.map +0 -1
- package/dist/logger-3phvV_fl.d.cts +0 -185
- package/dist/logger-CYza_0eU.d.ts +0 -185
- package/dist/logs-D7sYBvSy.d.cts +0 -66
- package/dist/logs-D7sYBvSy.d.ts +0 -66
- package/dist/notifiers/index.cjs +0 -620
- package/dist/notifiers/index.cjs.map +0 -1
- package/dist/notifiers/index.d.cts +0 -186
- package/dist/notifiers/index.d.ts +0 -186
- package/dist/notifiers/index.js +0 -70
- package/dist/notifiers/index.js.map +0 -1
- package/dist/pricing-BumgLpvB.d.cts +0 -79
- package/dist/pricing-BumgLpvB.d.ts +0 -79
- package/dist/ratelimit-BKVQG2oY.d.cts +0 -42
- package/dist/ratelimit-CGLlXNIS.d.ts +0 -42
- package/dist/registry-D3We8Lg6.d.ts +0 -50
- package/dist/registry-DePA3IyS.d.cts +0 -50
- package/dist/rules/index.cjs +0 -614
- package/dist/rules/index.cjs.map +0 -1
- package/dist/rules/index.d.cts +0 -166
- package/dist/rules/index.d.ts +0 -166
- package/dist/rules/index.js +0 -60
- package/dist/rules/index.js.map +0 -1
- package/dist/schema-DuDMPqpq.d.ts +0 -183
- package/dist/schema-NnIdKFl2.d.cts +0 -183
- package/dist/service/index.cjs +0 -3774
- package/dist/service/index.cjs.map +0 -1
- package/dist/service/index.d.cts +0 -262
- package/dist/service/index.d.ts +0 -262
- package/dist/service/index.js +0 -45
- package/dist/service/index.js.map +0 -1
- package/dist/service/main.cjs +0 -3759
- package/dist/service/main.cjs.map +0 -1
- package/dist/service/main.d.ts +0 -1
- package/dist/service/main.js +0 -60
- package/dist/service/main.js.map +0 -1
- package/dist/sources-CAaQR6-N.d.ts +0 -159
- package/dist/sources-CpDOUlzx.d.cts +0 -159
- package/dist/telegram-CpodYJrP.d.cts +0 -64
- package/dist/telegram-pvphmBwn.d.ts +0 -64
- package/dist/tiers/index.cjs +0 -471
- package/dist/tiers/index.cjs.map +0 -1
- package/dist/tiers/index.d.cts +0 -231
- package/dist/tiers/index.d.ts +0 -231
- package/dist/tiers/index.js +0 -34
- package/dist/tiers/index.js.map +0 -1
- package/dist/types-C0ETog04.d.ts +0 -109
- package/dist/types-CcoKpStA.d.cts +0 -109
- package/dist/types-DFPpTMWo.d.cts +0 -186
- package/dist/types-DFPpTMWo.d.ts +0 -186
package/.env.example
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# hood-alerts configuration. Copy to .env and fill in what you use.
|
|
2
|
+
# Everything is optional: with zero env vars the engine runs with the console
|
|
3
|
+
# transport only (alerts printed as structured logs), which is the self-host
|
|
4
|
+
# smoke-test mode.
|
|
5
|
+
|
|
6
|
+
# ---- chain ----
|
|
7
|
+
# Custom RPC (e.g. Alchemy: https://robinhood-mainnet.g.alchemy.com/v2/KEY).
|
|
8
|
+
# Defaults to the public RPC from viem's official `robinhood` chain definition.
|
|
9
|
+
HOOD_ALERTS_RPC_URL=
|
|
10
|
+
|
|
11
|
+
# ---- storage ----
|
|
12
|
+
# SQLite database path (subscriptions, entitlements, dedup, delivery log).
|
|
13
|
+
HOOD_ALERTS_DB=./data/hood-alerts.db
|
|
14
|
+
|
|
15
|
+
# ---- HTTP server ----
|
|
16
|
+
# Cloud Run injects PORT. /healthz + the premium x402 endpoints live here.
|
|
17
|
+
PORT=8080
|
|
18
|
+
# Public base URL of this instance (used in payment challenges + bot replies).
|
|
19
|
+
HOOD_ALERTS_PUBLIC_URL=
|
|
20
|
+
|
|
21
|
+
# ---- Telegram bot ----
|
|
22
|
+
# Create with @BotFather -> /newbot. Leave empty to disable the transport.
|
|
23
|
+
HOOD_ALERTS_TELEGRAM_TOKEN=
|
|
24
|
+
|
|
25
|
+
# ---- Discord bot ----
|
|
26
|
+
# Create at https://discord.com/developers/applications (Bot token + App ID).
|
|
27
|
+
# Leave empty to disable the transport.
|
|
28
|
+
HOOD_ALERTS_DISCORD_TOKEN=
|
|
29
|
+
HOOD_ALERTS_DISCORD_APP_ID=
|
|
30
|
+
|
|
31
|
+
# ---- X (Twitter) auto-posting: pick ONE mode ----
|
|
32
|
+
# Leave empty to disable. X has no inbound bot (no watch/unwatch DMs), so what
|
|
33
|
+
# it posts is fixed at startup via HOOD_ALERTS_X_TOPICS below.
|
|
34
|
+
HOOD_ALERTS_X_MODE= # official | xactions
|
|
35
|
+
|
|
36
|
+
# official mode: the real X API v2, POST /2/tweets, OAuth1 user context.
|
|
37
|
+
# Requires a developer.x.com app with a posting-capable tier (check current
|
|
38
|
+
# pricing at https://developer.x.com/en/portal/products/buy before relying on
|
|
39
|
+
# this; it has changed before and may change again). Create an app, generate
|
|
40
|
+
# a consumer key/secret, then generate an access token/secret with
|
|
41
|
+
# read+write permissions.
|
|
42
|
+
HOOD_ALERTS_X_API_KEY=
|
|
43
|
+
HOOD_ALERTS_X_API_SECRET=
|
|
44
|
+
HOOD_ALERTS_X_ACCESS_TOKEN=
|
|
45
|
+
HOOD_ALERTS_X_ACCESS_SECRET=
|
|
46
|
+
|
|
47
|
+
# xactions mode: free, self-hosted browser-automation posting via your own X
|
|
48
|
+
# session cookie instead of the official API. See
|
|
49
|
+
# https://github.com/nirholas/XActions to run your own instance. Not the
|
|
50
|
+
# official API: carries ToS risk. Posting is async (queued, not confirmed
|
|
51
|
+
# synchronously).
|
|
52
|
+
HOOD_ALERTS_XACTIONS_URL=
|
|
53
|
+
HOOD_ALERTS_XACTIONS_TOKEN=
|
|
54
|
+
|
|
55
|
+
# Topics the X broadcast auto-posts (comma-separated; parsed the same way a
|
|
56
|
+
# `watch` command target is). Premium-tier topics (premiums, rugs) only post
|
|
57
|
+
# if the x/public subscriber has been granted premium (see grant-premium).
|
|
58
|
+
HOOD_ALERTS_X_TOPICS=launches,graduations,whales
|
|
59
|
+
|
|
60
|
+
# ---- premium (x402 USDG on Robinhood Chain via hood402) ----
|
|
61
|
+
# Rail selector. `hood402` (USDG on chain 4663) is implemented end-to-end.
|
|
62
|
+
# `x402-usdc` is a documented alternative (see README) and is rejected at
|
|
63
|
+
# startup until wired to your own facilitator.
|
|
64
|
+
HOOD_ALERTS_PREMIUM_RAIL=hood402
|
|
65
|
+
# Address that receives premium payments. Premium purchase endpoints stay
|
|
66
|
+
# disabled (503 + guidance) until this is set.
|
|
67
|
+
HOOD402_PAY_TO=
|
|
68
|
+
# Settlement mode A: a hood402 facilitator base URL (recommended; no gas key
|
|
69
|
+
# on this box).
|
|
70
|
+
HOOD402_FACILITATOR_URL=
|
|
71
|
+
# Settlement mode B: self-settle with a gas key. READ THE WARNING in the
|
|
72
|
+
# README before putting a key here.
|
|
73
|
+
HOOD402_SETTLER_KEY=
|
|
74
|
+
# Price + duration of one premium purchase.
|
|
75
|
+
HOOD_ALERTS_PREMIUM_PRICE_USDG=5
|
|
76
|
+
HOOD_ALERTS_PREMIUM_DAYS=30
|
|
77
|
+
|
|
78
|
+
# ---- detector tuning (defaults shown) ----
|
|
79
|
+
# Floor below which whale trades are not even emitted engine-side (USD).
|
|
80
|
+
HOOD_ALERTS_WHALE_FLOOR_USD=1000
|
|
81
|
+
# Default per-subscription whale threshold when none is given (USD).
|
|
82
|
+
HOOD_ALERTS_WHALE_DEFAULT_USD=5000
|
|
83
|
+
# Price-move window (seconds) and default threshold (percent).
|
|
84
|
+
HOOD_ALERTS_PRICE_WINDOW_S=900
|
|
85
|
+
HOOD_ALERTS_PRICE_DEFAULT_PCT=2
|
|
86
|
+
# Stock premium/discount poll interval (seconds) and default threshold (%).
|
|
87
|
+
HOOD_ALERTS_PREMIUM_POLL_S=60
|
|
88
|
+
HOOD_ALERTS_PREMIUM_DEFAULT_PCT=2
|
|
89
|
+
# Liquidity-pull default threshold (percent of pool quote reserves).
|
|
90
|
+
HOOD_ALERTS_RUG_DEFAULT_PCT=30
|
package/Dockerfile
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# syntax=docker/dockerfile:1
|
|
2
|
+
#
|
|
3
|
+
# hood-alerts: one long-running process runs the detection engine, the HTTP
|
|
4
|
+
# server (/healthz + premium x402), and both bots (env-gated). Min-instances 1
|
|
5
|
+
# on Cloud Run; this is a service, not a job.
|
|
6
|
+
#
|
|
7
|
+
# The build context MUST be the parent `robinhood/` directory so the local
|
|
8
|
+
# file: siblings (robinhood-chain-sdk, hoodkit, hood402) resolve:
|
|
9
|
+
#
|
|
10
|
+
# docker build -f hood-alerts/Dockerfile -t hood-alerts . # run from robinhood/
|
|
11
|
+
#
|
|
12
|
+
# Once those packages are published to npm, switch the file: specs in
|
|
13
|
+
# package.json to the published versions and the app builds from its own dir.
|
|
14
|
+
|
|
15
|
+
# ---- build: full install (better-sqlite3 needs a toolchain) + tsc ----
|
|
16
|
+
FROM node:22-slim AS build
|
|
17
|
+
RUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ \
|
|
18
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
19
|
+
WORKDIR /build
|
|
20
|
+
# Prebuilt sibling packages (manifest + dist) for the file: links.
|
|
21
|
+
COPY robinhood-chain-sdk/package.json ./robinhood-chain-sdk/package.json
|
|
22
|
+
COPY robinhood-chain-sdk/dist ./robinhood-chain-sdk/dist
|
|
23
|
+
COPY hoodkit/package.json ./hoodkit/package.json
|
|
24
|
+
COPY hoodkit/dist ./hoodkit/dist
|
|
25
|
+
COPY hood402/package.json ./hood402/package.json
|
|
26
|
+
COPY hood402/dist ./hood402/dist
|
|
27
|
+
WORKDIR /build/hood-alerts
|
|
28
|
+
COPY hood-alerts/package.json ./package.json
|
|
29
|
+
# --install-links copies the file: siblings into node_modules as real packages
|
|
30
|
+
# (not symlinks), so their `viem` dependency hoists and resolves at runtime.
|
|
31
|
+
RUN npm install --install-links --no-audit --no-fund
|
|
32
|
+
COPY hood-alerts/tsconfig.json ./tsconfig.json
|
|
33
|
+
COPY hood-alerts/src ./src
|
|
34
|
+
COPY hood-alerts/scripts ./scripts
|
|
35
|
+
RUN npm run build
|
|
36
|
+
|
|
37
|
+
# ---- prod-deps: runtime node_modules only (no tsc/tsx/vitest) ----
|
|
38
|
+
FROM node:22-slim AS prod-deps
|
|
39
|
+
RUN apt-get update && apt-get install -y --no-install-recommends python3 make g++ \
|
|
40
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
41
|
+
WORKDIR /build
|
|
42
|
+
COPY robinhood-chain-sdk/package.json ./robinhood-chain-sdk/package.json
|
|
43
|
+
COPY robinhood-chain-sdk/dist ./robinhood-chain-sdk/dist
|
|
44
|
+
COPY hoodkit/package.json ./hoodkit/package.json
|
|
45
|
+
COPY hoodkit/dist ./hoodkit/dist
|
|
46
|
+
COPY hood402/package.json ./hood402/package.json
|
|
47
|
+
COPY hood402/dist ./hood402/dist
|
|
48
|
+
WORKDIR /build/hood-alerts
|
|
49
|
+
COPY hood-alerts/package.json ./package.json
|
|
50
|
+
RUN npm install --omit=dev --install-links --no-audit --no-fund
|
|
51
|
+
|
|
52
|
+
# ---- runtime ----
|
|
53
|
+
FROM node:22-slim AS runtime
|
|
54
|
+
ENV NODE_ENV=production
|
|
55
|
+
ENV PORT=8080
|
|
56
|
+
ENV HOOD_ALERTS_DB=/data/hood-alerts.db
|
|
57
|
+
WORKDIR /app
|
|
58
|
+
COPY --from=prod-deps /build/hood-alerts/node_modules ./node_modules
|
|
59
|
+
COPY --from=build /build/hood-alerts/dist ./dist
|
|
60
|
+
COPY --from=build /build/hood-alerts/package.json ./package.json
|
|
61
|
+
# SQLite lives on a mounted volume so subscriptions survive restarts.
|
|
62
|
+
RUN mkdir -p /data
|
|
63
|
+
VOLUME ["/data"]
|
|
64
|
+
EXPOSE 8080
|
|
65
|
+
CMD ["node", "dist/src/index.js"]
|
package/LICENSE
CHANGED
|
@@ -1,20 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
MIT License
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Copyright (c) 2026 nirholas
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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:
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
copyright owner.
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
12
14
|
|
|
13
15
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
16
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
-
FITNESS FOR A PARTICULAR PURPOSE
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
DEALINGS IN THE SOFTWARE.
|
|
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.
|