@kya-os/mcp-i 0.1.0-alpha.1.0 → 0.1.0-alpha.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.
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /**
3
+ * Tests for cryptographic utilities
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const vitest_1 = require("vitest");
40
+ const crypto = __importStar(require("../crypto"));
41
+ (0, vitest_1.describe)('Cryptographic Utilities', () => {
42
+ (0, vitest_1.describe)('generateKeyPair', () => {
43
+ (0, vitest_1.it)('should generate a valid Ed25519 key pair', async () => {
44
+ const keyPair = await crypto.generateKeyPair();
45
+ (0, vitest_1.expect)(keyPair.publicKey).toBeDefined();
46
+ (0, vitest_1.expect)(keyPair.privateKey).toBeDefined();
47
+ (0, vitest_1.expect)(Buffer.from(keyPair.publicKey, 'base64')).toHaveLength(32);
48
+ (0, vitest_1.expect)(Buffer.from(keyPair.privateKey, 'base64')).toHaveLength(32);
49
+ });
50
+ (0, vitest_1.it)('should generate different key pairs each time', async () => {
51
+ const keyPair1 = await crypto.generateKeyPair();
52
+ const keyPair2 = await crypto.generateKeyPair();
53
+ (0, vitest_1.expect)(keyPair1.publicKey).not.toEqual(keyPair2.publicKey);
54
+ (0, vitest_1.expect)(keyPair1.privateKey).not.toEqual(keyPair2.privateKey);
55
+ });
56
+ });
57
+ (0, vitest_1.describe)('sign and verify', () => {
58
+ let keyPair;
59
+ (0, vitest_1.beforeEach)(async () => {
60
+ keyPair = await crypto.generateKeyPair();
61
+ });
62
+ (0, vitest_1.it)('should sign and verify a string message', async () => {
63
+ const message = 'Hello, MCP-I!';
64
+ const signature = await crypto.sign(message, keyPair.privateKey);
65
+ (0, vitest_1.expect)(signature).toBeDefined();
66
+ (0, vitest_1.expect)(typeof signature).toBe('string');
67
+ const isValid = await crypto.verify(message, signature, keyPair.publicKey);
68
+ (0, vitest_1.expect)(isValid).toBe(true);
69
+ });
70
+ (0, vitest_1.it)('should sign and verify a buffer message', async () => {
71
+ const message = Buffer.from('Binary data test');
72
+ const signature = await crypto.sign(message, keyPair.privateKey);
73
+ const isValid = await crypto.verify(message, signature, keyPair.publicKey);
74
+ (0, vitest_1.expect)(isValid).toBe(true);
75
+ });
76
+ (0, vitest_1.it)('should fail verification with wrong message', async () => {
77
+ const message = 'Original message';
78
+ const signature = await crypto.sign(message, keyPair.privateKey);
79
+ const isValid = await crypto.verify('Different message', signature, keyPair.publicKey);
80
+ (0, vitest_1.expect)(isValid).toBe(false);
81
+ });
82
+ (0, vitest_1.it)('should fail verification with wrong public key', async () => {
83
+ const message = 'Test message';
84
+ const signature = await crypto.sign(message, keyPair.privateKey);
85
+ const otherKeyPair = await crypto.generateKeyPair();
86
+ const isValid = await crypto.verify(message, signature, otherKeyPair.publicKey);
87
+ (0, vitest_1.expect)(isValid).toBe(false);
88
+ });
89
+ (0, vitest_1.it)('should fail verification with invalid signature', async () => {
90
+ const message = 'Test message';
91
+ const invalidSignature = 'invalid-base64-signature';
92
+ const isValid = await crypto.verify(message, invalidSignature, keyPair.publicKey);
93
+ (0, vitest_1.expect)(isValid).toBe(false);
94
+ });
95
+ });
96
+ (0, vitest_1.describe)('generateNonce', () => {
97
+ (0, vitest_1.it)('should generate a nonce of default length', () => {
98
+ const nonce = crypto.generateNonce();
99
+ (0, vitest_1.expect)(nonce).toBeDefined();
100
+ (0, vitest_1.expect)(nonce).toHaveLength(64); // 32 bytes = 64 hex chars
101
+ });
102
+ (0, vitest_1.it)('should generate a nonce of specified length', () => {
103
+ const nonce = crypto.generateNonce(16);
104
+ (0, vitest_1.expect)(nonce).toHaveLength(32); // 16 bytes = 32 hex chars
105
+ });
106
+ (0, vitest_1.it)('should generate different nonces each time', () => {
107
+ const nonce1 = crypto.generateNonce();
108
+ const nonce2 = crypto.generateNonce();
109
+ (0, vitest_1.expect)(nonce1).not.toEqual(nonce2);
110
+ });
111
+ });
112
+ (0, vitest_1.describe)('constantTimeEqual', () => {
113
+ (0, vitest_1.it)('should return true for equal strings', () => {
114
+ const result = crypto.constantTimeEqual('hello', 'hello');
115
+ (0, vitest_1.expect)(result).toBe(true);
116
+ });
117
+ (0, vitest_1.it)('should return false for different strings', () => {
118
+ const result = crypto.constantTimeEqual('hello', 'world');
119
+ (0, vitest_1.expect)(result).toBe(false);
120
+ });
121
+ (0, vitest_1.it)('should return false for different length strings', () => {
122
+ const result = crypto.constantTimeEqual('hello', 'hello world');
123
+ (0, vitest_1.expect)(result).toBe(false);
124
+ });
125
+ (0, vitest_1.it)('should handle empty strings', () => {
126
+ const result = crypto.constantTimeEqual('', '');
127
+ (0, vitest_1.expect)(result).toBe(true);
128
+ });
129
+ });
130
+ (0, vitest_1.describe)('publicKeyToDid', () => {
131
+ (0, vitest_1.it)('should convert Ed25519 public key to did:key format', async () => {
132
+ const keyPair = await crypto.generateKeyPair();
133
+ const did = crypto.publicKeyToDid(keyPair.publicKey);
134
+ // Our simplified implementation uses base64url-like encoding
135
+ (0, vitest_1.expect)(did).toMatch(/^did:key:z[A-Za-z0-9_-]+$/);
136
+ (0, vitest_1.expect)(did).toContain('did:key:z');
137
+ });
138
+ (0, vitest_1.it)('should generate consistent DIDs for the same public key', async () => {
139
+ const keyPair = await crypto.generateKeyPair();
140
+ const did1 = crypto.publicKeyToDid(keyPair.publicKey);
141
+ const did2 = crypto.publicKeyToDid(keyPair.publicKey);
142
+ (0, vitest_1.expect)(did1).toEqual(did2);
143
+ });
144
+ (0, vitest_1.it)('should generate different DIDs for different public keys', async () => {
145
+ const keyPair1 = await crypto.generateKeyPair();
146
+ const keyPair2 = await crypto.generateKeyPair();
147
+ const did1 = crypto.publicKeyToDid(keyPair1.publicKey);
148
+ const did2 = crypto.publicKeyToDid(keyPair2.publicKey);
149
+ (0, vitest_1.expect)(did1).not.toEqual(did2);
150
+ });
151
+ });
152
+ });
153
+ //# sourceMappingURL=crypto.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.test.js","sourceRoot":"","sources":["../../src/__tests__/crypto.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Cryptographic utilities for MCP-I
3
+ * Implements Ed25519 signing and verification for challenge-response authentication
4
+ */
5
+ /**
6
+ * Generate a new Ed25519 key pair
7
+ */
8
+ export declare function generateKeyPair(): Promise<{
9
+ publicKey: string;
10
+ privateKey: string;
11
+ }>;
12
+ /**
13
+ * Sign a message with Ed25519
14
+ */
15
+ export declare function sign(message: string | Buffer, privateKeyBase64: string): Promise<string>;
16
+ /**
17
+ * Verify an Ed25519 signature
18
+ */
19
+ export declare function verify(message: string | Buffer, signatureBase64: string, publicKeyBase64: string): Promise<boolean>;
20
+ /**
21
+ * Generate a cryptographically secure nonce
22
+ */
23
+ export declare function generateNonce(length?: number): string;
24
+ /**
25
+ * Constant-time string comparison to prevent timing attacks
26
+ */
27
+ export declare function constantTimeEqual(a: string, b: string): boolean;
28
+ /**
29
+ * Convert Ed25519 public key to did:key format
30
+ */
31
+ export declare function publicKeyToDid(publicKeyBase64: string): string;
32
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC;IAC/C,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAQD;AAED;;GAEG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,gBAAgB,EAAE,MAAM,GACvB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAW,GAAG,MAAM,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAW/D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,CAS9D"}
package/dist/crypto.js ADDED
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * Cryptographic utilities for MCP-I
4
+ * Implements Ed25519 signing and verification for challenge-response authentication
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.generateKeyPair = generateKeyPair;
41
+ exports.sign = sign;
42
+ exports.verify = verify;
43
+ exports.generateNonce = generateNonce;
44
+ exports.constantTimeEqual = constantTimeEqual;
45
+ exports.publicKeyToDid = publicKeyToDid;
46
+ const ed25519 = __importStar(require("@noble/ed25519"));
47
+ const crypto_1 = require("crypto");
48
+ /**
49
+ * Generate a new Ed25519 key pair
50
+ */
51
+ async function generateKeyPair() {
52
+ const privateKey = ed25519.utils.randomPrivateKey();
53
+ const publicKey = await ed25519.getPublicKeyAsync(privateKey);
54
+ return {
55
+ publicKey: Buffer.from(publicKey).toString('base64'),
56
+ privateKey: Buffer.from(privateKey).toString('base64')
57
+ };
58
+ }
59
+ /**
60
+ * Sign a message with Ed25519
61
+ */
62
+ async function sign(message, privateKeyBase64) {
63
+ const messageBuffer = typeof message === 'string'
64
+ ? Buffer.from(message, 'utf-8')
65
+ : message;
66
+ const privateKey = Buffer.from(privateKeyBase64, 'base64');
67
+ const signature = await ed25519.signAsync(messageBuffer, privateKey);
68
+ return Buffer.from(signature).toString('base64');
69
+ }
70
+ /**
71
+ * Verify an Ed25519 signature
72
+ */
73
+ async function verify(message, signatureBase64, publicKeyBase64) {
74
+ try {
75
+ const messageBuffer = typeof message === 'string'
76
+ ? Buffer.from(message, 'utf-8')
77
+ : message;
78
+ const signature = Buffer.from(signatureBase64, 'base64');
79
+ const publicKey = Buffer.from(publicKeyBase64, 'base64');
80
+ return await ed25519.verifyAsync(signature, messageBuffer, publicKey);
81
+ }
82
+ catch {
83
+ return false;
84
+ }
85
+ }
86
+ /**
87
+ * Generate a cryptographically secure nonce
88
+ */
89
+ function generateNonce(length = 32) {
90
+ return (0, crypto_1.randomBytes)(length).toString('hex');
91
+ }
92
+ /**
93
+ * Constant-time string comparison to prevent timing attacks
94
+ */
95
+ function constantTimeEqual(a, b) {
96
+ if (a.length !== b.length) {
97
+ return false;
98
+ }
99
+ let result = 0;
100
+ for (let i = 0; i < a.length; i++) {
101
+ result |= a.charCodeAt(i) ^ b.charCodeAt(i);
102
+ }
103
+ return result === 0;
104
+ }
105
+ /**
106
+ * Convert Ed25519 public key to did:key format
107
+ */
108
+ function publicKeyToDid(publicKeyBase64) {
109
+ const publicKey = Buffer.from(publicKeyBase64, 'base64');
110
+ // Multicodec ed25519-pub header (0xed 0x01)
111
+ const multicodec = Buffer.from([0xed, 0x01]);
112
+ const multikey = Buffer.concat([multicodec, publicKey]);
113
+ // Base58 encode (simplified - in production use a proper base58 library)
114
+ // For now, just return a placeholder
115
+ return `did:key:z${multikey.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '')}`;
116
+ }
117
+ //# sourceMappingURL=crypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../src/crypto.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @kya-os/mcp-i - Ultra-light MCP Identity auto-registration
2
+ * @kya-os/mcp-i - Ultra-light MCP Identity auto-registration with challenge-response authentication
3
3
  *
4
4
  * Enable any MCP server to get a verifiable identity with just 2 lines of code:
5
5
  *
@@ -8,19 +8,18 @@
8
8
  * const identity = await MCPIdentity.init();
9
9
  * ```
10
10
  *
11
- * Zero dependencies on other @kya-os packages - completely standalone!
11
+ * Now with full MCP-I Handshake support including cryptographic challenge-response!
12
12
  */
13
- interface MCPIdentityOptions {
14
- name?: string;
15
- description?: string;
16
- repository?: string;
17
- apiEndpoint?: string;
18
- persistencePath?: string;
19
- }
13
+ import { MCPIdentityOptions, Challenge, ChallengeResponse, MCPICapabilities, SignedResponse } from './types';
14
+ export * from './types';
20
15
  export declare class MCPIdentity {
21
16
  readonly did: string;
22
17
  readonly publicKey: string;
23
18
  private privateKey;
19
+ private timestampTolerance;
20
+ private enableNonceTracking;
21
+ private usedNonces;
22
+ private nonceCleanupInterval?;
24
23
  private constructor();
25
24
  /**
26
25
  * Initialize MCP Identity - the main entry point
@@ -33,22 +32,37 @@ export declare class MCPIdentity {
33
32
  */
34
33
  static init(options?: MCPIdentityOptions): Promise<MCPIdentity>;
35
34
  /**
36
- * Sign a message with the agent's private key
35
+ * Sign a message with the agent's private key using Ed25519
36
+ */
37
+ sign(message: string | Buffer): Promise<string>;
38
+ /**
39
+ * Verify a signature against a public key
40
+ */
41
+ verify(message: string | Buffer, signature: string, publicKey?: string): Promise<boolean>;
42
+ /**
43
+ * Respond to an MCP-I challenge
44
+ * This is the core of the challenge-response authentication system
45
+ */
46
+ respondToChallenge(challenge: Challenge): Promise<ChallengeResponse>;
47
+ /**
48
+ * Get MCP-I capabilities for advertisement
49
+ */
50
+ getCapabilities(): MCPICapabilities;
51
+ /**
52
+ * Sign an MCP response with identity metadata
53
+ */
54
+ signResponse<T = any>(response: T): Promise<SignedResponse<T>>;
55
+ /**
56
+ * Generate a new nonce for challenges
37
57
  */
38
- sign(message: string): Promise<string>;
58
+ static generateNonce(): string;
39
59
  /**
40
- * Get MCP-I capabilities
60
+ * Clean up old nonces periodically to prevent memory leaks
41
61
  */
42
- getCapabilities(): {
43
- version: string;
44
- did: string;
45
- publicKey: string;
46
- conformanceLevel: number;
47
- };
62
+ private startNonceCleanup;
48
63
  /**
49
- * Sign an MCP response
64
+ * Clean up resources
50
65
  */
51
- signResponse(response: any): any;
66
+ destroy(): void;
52
67
  }
53
- export {};
54
68
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAQH,UAAU,kBAAkB;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0BD,qBAAa,WAAW;IACtB,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO;IAMP;;;;;;;;OAQG;WACU,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAoCrE;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK5C;;OAEG;IACH,eAAe;;;;;;IASf;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,GAAG,GAAG,GAAG;CAUjC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EACL,kBAAkB,EAGlB,SAAS,EACT,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACf,MAAM,SAAS,CAAC;AAGjB,cAAc,SAAS,CAAC;AAExB,qBAAa,WAAW;IACtB,SAAgB,GAAG,EAAE,MAAM,CAAC;IAC5B,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,mBAAmB,CAAU;IACrC,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,oBAAoB,CAAC,CAAiB;IAE9C,OAAO;IAgBP;;;;;;;;OAQG;WACU,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IA4CrE;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD;;OAEG;IACG,MAAM,CACV,OAAO,EAAE,MAAM,GAAG,MAAM,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC;IAQnB;;;OAGG;IACG,kBAAkB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA4C1E;;OAEG;IACH,eAAe,IAAI,gBAAgB;IAYnC;;OAEG;IACG,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IA2BpE;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM;IAI9B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,OAAO;CAMR"}