@daimo/pay-common 1.19.10 → 2.0.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.md ADDED
@@ -0,0 +1,9 @@
1
+ # @daimo/pay-common (DEPRECATED)
2
+
3
+ This package is deprecated. Use [`@daimo/sdk/common`](https://www.npmjs.com/package/@daimo/sdk) instead.
4
+
5
+ ```bash
6
+ npm install @daimo/sdk
7
+ ```
8
+
9
+ [See docs.daimo.com](https://docs.daimo.com)
package/index.js ADDED
@@ -0,0 +1 @@
1
+ throw new Error("@daimo/pay-common is deprecated. Use @daimo/sdk/common instead. See https://daimo.com/docs");
package/package.json CHANGED
@@ -1,30 +1,8 @@
1
1
  {
2
2
  "name": "@daimo/pay-common",
3
- "version": "1.19.10",
4
- "description": "Daimo Pay shared types and utilities",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "author": "Daimo",
8
- "license": "BSD-2-Clause license",
9
- "scripts": {
10
- "build": "tsc",
11
- "test": "tape -r ts-node/register/transpile-only test/**/*.test.ts",
12
- "lint": "npm run lint:deps && npm run lint:style",
13
- "lint:deps": "npx depcheck --ignores @tsconfig/node20,@types/tape,ts-node",
14
- "lint:style": "eslint --max-warnings=0"
15
- },
16
- "devDependencies": {
17
- "@tsconfig/node20": "^20.1.4",
18
- "@types/tape": "^5.6.0",
19
- "depcheck": "^1.4.3",
20
- "eslint": "^8.56.0",
21
- "tape": "^5.6.3",
22
- "ts-node": "^10.9.2",
23
- "typescript": "5.9.2"
24
- },
25
- "dependencies": {
26
- "@scure/base": "^1.2.4",
27
- "viem": "^2.43.4",
28
- "zod": "^3.24.2"
29
- }
3
+ "version": "2.0.0",
4
+ "description": "DEPRECATED use @daimo/sdk/common instead",
5
+ "license": "BSD-2-Clause",
6
+ "main": "index.js",
7
+ "files": ["index.js", "README.md"]
30
8
  }
package/LICENSE DELETED
@@ -1,26 +0,0 @@
1
- BSD 2-Clause License
2
-
3
- Copyright (c) 2024, Daimo, Inc.
4
- Copyright (c) 2022, LFE, Inc.
5
- All rights reserved.
6
-
7
- Redistribution and use in source and binary forms, with or without
8
- modification, are permitted provided that the following conditions are met:
9
-
10
- 1. Redistributions of source code must retain the above copyright notice, this
11
- list of conditions and the following disclaimer.
12
-
13
- 2. Redistributions in binary form must reproduce the above copyright notice,
14
- this list of conditions and the following disclaimer in the documentation
15
- and/or other materials provided with the distribution.
16
-
17
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18
- AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20
- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
21
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
23
- SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
24
- CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
25
- OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package/dist/assert.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export declare function assert(condition: boolean, ...args: any[]): asserts condition;
2
- export declare function assertNotNull<T>(value: T | null | undefined, ...args: any[]): T;
3
- export declare function assertEqual<T>(a: T, b: T, ...args: any[]): void;
4
- /** Used to compile-time check that switch statements are exhaustive, etc. */
5
- export declare function assertUnreachable(_: never): never;
package/dist/assert.js DELETED
@@ -1,31 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.assert = assert;
4
- exports.assertNotNull = assertNotNull;
5
- exports.assertEqual = assertEqual;
6
- exports.assertUnreachable = assertUnreachable;
7
- const debug_1 = require("./debug");
8
- function assert(condition, ...args) {
9
- if (condition)
10
- return;
11
- let msg;
12
- if (args.length === 1 && typeof args[0] === "function") {
13
- msg = args[0]();
14
- }
15
- else {
16
- msg = args.map((a) => (0, debug_1.debugJson)(a)).join(", ");
17
- }
18
- throw new Error("Assertion failed: " + msg);
19
- }
20
- function assertNotNull(value, ...args) {
21
- assert(value !== null && value !== undefined, ...args);
22
- return value;
23
- }
24
- function assertEqual(a, b, ...args) {
25
- assert(a === b, ...args);
26
- }
27
- /** Used to compile-time check that switch statements are exhaustive, etc. */
28
- function assertUnreachable(_) {
29
- throw new Error("Unreachable");
30
- }
31
- //# sourceMappingURL=assert.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assert.js","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":";;AAEA,wBASC;AAED,sCAMC;AAED,kCAEC;AAGD,8CAEC;AA5BD,mCAAoC;AAEpC,SAAgB,MAAM,CAAC,SAAkB,EAAE,GAAG,IAAW;IACvD,IAAI,SAAS;QAAE,OAAO;IACtB,IAAI,GAAW,CAAC;IAChB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;QACvD,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,iBAAS,EAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,GAAG,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,aAAa,CAC3B,KAA2B,EAC3B,GAAG,IAAW;IAEd,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,GAAG,IAAI,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,WAAW,CAAI,CAAI,EAAE,CAAI,EAAE,GAAG,IAAW;IACvD,MAAM,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,6EAA6E;AAC7E,SAAgB,iBAAiB,CAAC,CAAQ;IACxC,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC"}
package/dist/chain.d.ts DELETED
@@ -1,40 +0,0 @@
1
- export type Chain = {
2
- type: "evm" | "solana" | "tron";
3
- chainId: number;
4
- name: string;
5
- cctpDomain: number | null;
6
- };
7
- export declare const arbitrum: Chain;
8
- export declare const base: Chain;
9
- export declare const bsc: Chain;
10
- export declare const celo: Chain;
11
- export declare const ethereum: Chain;
12
- export declare const gnosis: Chain;
13
- export declare const hyperEvm: Chain;
14
- export declare const linea: Chain;
15
- export declare const monad: Chain;
16
- export declare const optimism: Chain;
17
- export declare const polygon: Chain;
18
- export declare const scroll: Chain;
19
- export declare const worldchain: Chain;
20
- export declare const tron: Chain;
21
- export declare const solana: Chain;
22
- export declare const supportedChains: Chain[];
23
- /** Given a chainId, return the chain. */
24
- export declare function getChainById(chainId: number): Chain;
25
- /** Returns the chain name for the given chainId. */
26
- export declare function getChainName(chainId: number): string;
27
- /** Returns the CCTP domain for the given chainId. */
28
- export declare function getCCTPDomain(chainId: number): number | null;
29
- /**
30
- * Get block explorer URL for chain ID
31
- */
32
- export declare function getChainExplorerByChainId(chainId: number): string | undefined;
33
- /**
34
- * Get block explorer address URL for chain ID and address.
35
- */
36
- export declare function getChainExplorerAddressUrl(chainId: number, address: string): string | undefined;
37
- /**
38
- * Get block explorer transaction URL for chain ID and transaction hash.
39
- */
40
- export declare function getChainExplorerTxUrl(chainId: number, txHash: string): string | undefined;
package/dist/chain.js DELETED
@@ -1,192 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.supportedChains = exports.solana = exports.tron = exports.worldchain = exports.scroll = exports.polygon = exports.optimism = exports.monad = exports.linea = exports.hyperEvm = exports.gnosis = exports.ethereum = exports.celo = exports.bsc = exports.base = exports.arbitrum = void 0;
4
- exports.getChainById = getChainById;
5
- exports.getChainName = getChainName;
6
- exports.getCCTPDomain = getCCTPDomain;
7
- exports.getChainExplorerByChainId = getChainExplorerByChainId;
8
- exports.getChainExplorerAddressUrl = getChainExplorerAddressUrl;
9
- exports.getChainExplorerTxUrl = getChainExplorerTxUrl;
10
- exports.arbitrum = {
11
- type: "evm",
12
- chainId: 42161,
13
- name: "Arbitrum",
14
- cctpDomain: 3,
15
- };
16
- exports.base = {
17
- type: "evm",
18
- chainId: 8453,
19
- name: "Base",
20
- cctpDomain: 6,
21
- };
22
- exports.bsc = {
23
- type: "evm",
24
- chainId: 56,
25
- name: "BNB Smart Chain",
26
- cctpDomain: null,
27
- };
28
- exports.celo = {
29
- type: "evm",
30
- chainId: 42220,
31
- name: "Celo",
32
- cctpDomain: null,
33
- };
34
- exports.ethereum = {
35
- type: "evm",
36
- chainId: 1,
37
- name: "Ethereum",
38
- cctpDomain: 0,
39
- };
40
- exports.gnosis = {
41
- type: "evm",
42
- chainId: 100,
43
- name: "Gnosis",
44
- cctpDomain: null,
45
- };
46
- exports.hyperEvm = {
47
- type: "evm",
48
- chainId: 999,
49
- name: "HyperEVM",
50
- cctpDomain: 19,
51
- };
52
- exports.linea = {
53
- type: "evm",
54
- chainId: 59144,
55
- name: "Linea",
56
- cctpDomain: 11,
57
- };
58
- exports.monad = {
59
- type: "evm",
60
- chainId: 143,
61
- name: "Monad",
62
- cctpDomain: 15,
63
- };
64
- exports.optimism = {
65
- type: "evm",
66
- chainId: 10,
67
- name: "Optimism",
68
- cctpDomain: 2,
69
- };
70
- exports.polygon = {
71
- type: "evm",
72
- chainId: 137,
73
- name: "Polygon",
74
- cctpDomain: 7,
75
- };
76
- exports.scroll = {
77
- type: "evm",
78
- chainId: 534352,
79
- name: "Scroll",
80
- cctpDomain: null,
81
- };
82
- exports.worldchain = {
83
- type: "evm",
84
- chainId: 480,
85
- name: "Worldchain",
86
- cctpDomain: 14,
87
- };
88
- //
89
- // Non-EVM chains: source only
90
- //
91
- exports.tron = {
92
- type: "tron",
93
- chainId: 728126428,
94
- name: "Tron",
95
- cctpDomain: null,
96
- };
97
- exports.solana = {
98
- type: "solana",
99
- chainId: 501,
100
- name: "Solana",
101
- cctpDomain: 5,
102
- };
103
- exports.supportedChains = [
104
- exports.arbitrum,
105
- exports.base,
106
- exports.bsc,
107
- exports.celo,
108
- exports.ethereum,
109
- exports.gnosis,
110
- exports.hyperEvm,
111
- exports.linea,
112
- exports.monad,
113
- exports.optimism,
114
- exports.polygon,
115
- exports.scroll,
116
- exports.worldchain,
117
- exports.solana,
118
- exports.tron,
119
- ];
120
- /** Given a chainId, return the chain. */
121
- function getChainById(chainId) {
122
- const ret = exports.supportedChains.find((c) => c.chainId === chainId);
123
- if (ret == null)
124
- throw new Error(`Unknown chainId ${chainId}`);
125
- return ret;
126
- }
127
- /** Returns the chain name for the given chainId. */
128
- function getChainName(chainId) {
129
- return getChainById(chainId).name;
130
- }
131
- /** Returns the CCTP domain for the given chainId. */
132
- function getCCTPDomain(chainId) {
133
- return getChainById(chainId).cctpDomain;
134
- }
135
- /**
136
- * Get block explorer URL for chain ID
137
- */
138
- function getChainExplorerByChainId(chainId) {
139
- switch (chainId) {
140
- case exports.arbitrum.chainId:
141
- return "https://arbiscan.io";
142
- case exports.base.chainId:
143
- return "https://basescan.org";
144
- case exports.bsc.chainId:
145
- return "https://bscscan.com";
146
- case exports.celo.chainId:
147
- return "https://celoscan.io";
148
- case exports.ethereum.chainId:
149
- return "https://etherscan.io";
150
- case exports.gnosis.chainId:
151
- return "https://gnosisscan.io";
152
- case exports.hyperEvm.chainId:
153
- return "https://hyperevmscan.io";
154
- case exports.linea.chainId:
155
- return "https://lineascan.build";
156
- case exports.monad.chainId:
157
- return "https://monadvision.com";
158
- case exports.optimism.chainId:
159
- return "https://optimistic.etherscan.io";
160
- case exports.polygon.chainId:
161
- return "https://polygonscan.com";
162
- case exports.scroll.chainId:
163
- return "https://scrollscan.com";
164
- case exports.solana.chainId:
165
- return "https://solscan.io";
166
- case exports.worldchain.chainId:
167
- return "https://worldscan.org";
168
- default:
169
- return undefined;
170
- }
171
- }
172
- /**
173
- * Get block explorer address URL for chain ID and address.
174
- */
175
- function getChainExplorerAddressUrl(chainId, address) {
176
- const explorer = getChainExplorerByChainId(chainId);
177
- if (!explorer) {
178
- return undefined;
179
- }
180
- return `${explorer}/address/${address}`;
181
- }
182
- /**
183
- * Get block explorer transaction URL for chain ID and transaction hash.
184
- */
185
- function getChainExplorerTxUrl(chainId, txHash) {
186
- const explorer = getChainExplorerByChainId(chainId);
187
- if (!explorer) {
188
- return undefined;
189
- }
190
- return `${explorer}/tx/${txHash}`;
191
- }
192
- //# sourceMappingURL=chain.js.map
package/dist/chain.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"chain.js","sourceRoot":"","sources":["../src/chain.ts"],"names":[],"mappings":";;;AAuIA,oCAIC;AAGD,oCAEC;AAGD,sCAEC;AAKD,8DAiCC;AAKD,gEASC;AAKD,sDASC;AAhNY,QAAA,QAAQ,GAAU;IAC7B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,CAAC;CACd,CAAC;AAEW,QAAA,IAAI,GAAU;IACzB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,CAAC;CACd,CAAC;AAEW,QAAA,GAAG,GAAU;IACxB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,EAAE;IACX,IAAI,EAAE,iBAAiB;IACvB,UAAU,EAAE,IAAI;CACjB,CAAC;AAEW,QAAA,IAAI,GAAU;IACzB,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;CACjB,CAAC;AAEW,QAAA,QAAQ,GAAU;IAC7B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,CAAC;CACd,CAAC;AAEW,QAAA,MAAM,GAAU;IAC3B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,IAAI;CACjB,CAAC;AAEW,QAAA,QAAQ,GAAU;IAC7B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,EAAE;CACf,CAAC;AAEW,QAAA,KAAK,GAAU;IAC1B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,KAAK;IACd,IAAI,EAAE,OAAO;IACb,UAAU,EAAE,EAAE;CACf,CAAC;AAEW,QAAA,KAAK,GAAU;IAC1B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,OAAO;IACb,UAAU,EAAE,EAAE;CACf,CAAC;AAEW,QAAA,QAAQ,GAAU;IAC7B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,EAAE;IACX,IAAI,EAAE,UAAU;IAChB,UAAU,EAAE,CAAC;CACd,CAAC;AAEW,QAAA,OAAO,GAAU;IAC5B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,SAAS;IACf,UAAU,EAAE,CAAC;CACd,CAAC;AAEW,QAAA,MAAM,GAAU;IAC3B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,MAAM;IACf,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,IAAI;CACjB,CAAC;AAEW,QAAA,UAAU,GAAU;IAC/B,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,YAAY;IAClB,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,EAAE;AACF,8BAA8B;AAC9B,EAAE;AAEW,QAAA,IAAI,GAAU;IACzB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,MAAM;IACZ,UAAU,EAAE,IAAI;CACjB,CAAC;AAEW,QAAA,MAAM,GAAU;IAC3B,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,GAAG;IACZ,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,CAAC;CACd,CAAC;AAEW,QAAA,eAAe,GAAY;IACtC,gBAAQ;IACR,YAAI;IACJ,WAAG;IACH,YAAI;IACJ,gBAAQ;IACR,cAAM;IACN,gBAAQ;IACR,aAAK;IACL,aAAK;IACL,gBAAQ;IACR,eAAO;IACP,cAAM;IACN,kBAAU;IACV,cAAM;IACN,YAAI;CACL,CAAC;AAEF,yCAAyC;AACzC,SAAgB,YAAY,CAAC,OAAe;IAC1C,MAAM,GAAG,GAAG,uBAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IAC/D,IAAI,GAAG,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC;IAC/D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oDAAoD;AACpD,SAAgB,YAAY,CAAC,OAAe;IAC1C,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;AACpC,CAAC;AAED,qDAAqD;AACrD,SAAgB,aAAa,CAAC,OAAe;IAC3C,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,yBAAyB,CAAC,OAAe;IACvD,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,gBAAQ,CAAC,OAAO;YACnB,OAAO,qBAAqB,CAAC;QAC/B,KAAK,YAAI,CAAC,OAAO;YACf,OAAO,sBAAsB,CAAC;QAChC,KAAK,WAAG,CAAC,OAAO;YACd,OAAO,qBAAqB,CAAC;QAC/B,KAAK,YAAI,CAAC,OAAO;YACf,OAAO,qBAAqB,CAAC;QAC/B,KAAK,gBAAQ,CAAC,OAAO;YACnB,OAAO,sBAAsB,CAAC;QAChC,KAAK,cAAM,CAAC,OAAO;YACjB,OAAO,uBAAuB,CAAC;QACjC,KAAK,gBAAQ,CAAC,OAAO;YACnB,OAAO,yBAAyB,CAAC;QACnC,KAAK,aAAK,CAAC,OAAO;YAChB,OAAO,yBAAyB,CAAC;QACnC,KAAK,aAAK,CAAC,OAAO;YAChB,OAAO,yBAAyB,CAAC;QACnC,KAAK,gBAAQ,CAAC,OAAO;YACnB,OAAO,iCAAiC,CAAC;QAC3C,KAAK,eAAO,CAAC,OAAO;YAClB,OAAO,yBAAyB,CAAC;QACnC,KAAK,cAAM,CAAC,OAAO;YACjB,OAAO,wBAAwB,CAAC;QAClC,KAAK,cAAM,CAAC,OAAO;YACjB,OAAO,oBAAoB,CAAC;QAC9B,KAAK,kBAAU,CAAC,OAAO;YACrB,OAAO,uBAAuB,CAAC;QACjC;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,0BAA0B,CACxC,OAAe,EACf,OAAe;IAEf,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,QAAQ,YAAY,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,OAAe,EACf,MAAc;IAEd,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,GAAG,QAAQ,OAAO,MAAM,EAAE,CAAC;AACpC,CAAC"}