keri 0.0.8-dev.0f93fc3 → 0.0.8-dev.1468d4d

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.
Files changed (106) hide show
  1. package/README.md +1 -8
  2. package/dist/controller/controller.d.ts +109 -0
  3. package/dist/controller/controller.js +542 -0
  4. package/dist/controller/controller.js.map +1 -0
  5. package/dist/controller/encrypt.d.ts +45 -0
  6. package/dist/controller/encrypt.js +120 -0
  7. package/dist/controller/encrypt.js.map +1 -0
  8. package/dist/core/credential-event.d.ts +58 -0
  9. package/dist/core/credential-event.js +28 -0
  10. package/dist/core/credential-event.js.map +1 -0
  11. package/dist/core/credential.d.ts +79 -0
  12. package/dist/core/credential.js +25 -0
  13. package/dist/core/credential.js.map +1 -0
  14. package/dist/core/digest.d.ts +1 -0
  15. package/dist/core/digest.js +7 -0
  16. package/dist/core/digest.js.map +1 -0
  17. package/dist/core/endpoint-discovery.d.ts +20 -0
  18. package/dist/core/endpoint-discovery.js +60 -0
  19. package/dist/core/endpoint-discovery.js.map +1 -0
  20. package/dist/core/events.d.ts +12 -0
  21. package/dist/core/events.js +25 -0
  22. package/dist/core/events.js.map +1 -0
  23. package/dist/core/kawa.d.ts +17 -0
  24. package/dist/core/kawa.js +79 -0
  25. package/dist/core/kawa.js.map +1 -0
  26. package/dist/core/key-event-log.d.ts +13 -0
  27. package/dist/core/key-event-log.js +154 -0
  28. package/dist/core/key-event-log.js.map +1 -0
  29. package/dist/core/key-event.d.ts +96 -0
  30. package/dist/core/key-event.js +89 -0
  31. package/dist/core/key-event.js.map +1 -0
  32. package/dist/core/keys.d.ts +9 -0
  33. package/dist/core/keys.js +17 -0
  34. package/dist/core/keys.js.map +1 -0
  35. package/dist/core/mailbox-client.d.ts +17 -0
  36. package/dist/{client.js → core/mailbox-client.js} +8 -36
  37. package/dist/core/mailbox-client.js.map +1 -0
  38. package/dist/core/main.d.ts +47 -0
  39. package/dist/core/main.js +44 -0
  40. package/dist/core/main.js.map +1 -0
  41. package/dist/core/receipt-event.d.ts +15 -0
  42. package/dist/core/receipt-event.js +13 -0
  43. package/dist/core/receipt-event.js.map +1 -0
  44. package/dist/core/registry-event.d.ts +28 -0
  45. package/dist/core/registry-event.js +18 -0
  46. package/dist/core/registry-event.js.map +1 -0
  47. package/dist/core/routed-event.d.ts +73 -0
  48. package/dist/core/routed-event.js +53 -0
  49. package/dist/core/routed-event.js.map +1 -0
  50. package/dist/core/said.d.ts +4 -0
  51. package/dist/core/said.js +26 -0
  52. package/dist/core/said.js.map +1 -0
  53. package/dist/core/sign.d.ts +5 -0
  54. package/dist/core/sign.js +10 -0
  55. package/dist/core/sign.js.map +1 -0
  56. package/dist/core/threshold.d.ts +6 -0
  57. package/dist/core/threshold.js +58 -0
  58. package/dist/core/threshold.js.map +1 -0
  59. package/dist/core/verify.d.ts +14 -0
  60. package/dist/core/verify.js +43 -0
  61. package/dist/core/verify.js.map +1 -0
  62. package/dist/main.d.ts +2 -7
  63. package/dist/main.js +2 -7
  64. package/dist/main.js.map +1 -1
  65. package/dist/storage/sqlite/node-sqlite.d.ts +12 -0
  66. package/dist/storage/sqlite/node-sqlite.js +25 -0
  67. package/dist/storage/sqlite/node-sqlite.js.map +1 -0
  68. package/dist/storage/sqlite/schema.d.ts +2 -0
  69. package/dist/storage/sqlite/schema.js +49 -0
  70. package/dist/storage/sqlite/schema.js.map +1 -0
  71. package/dist/storage/sqlite/sqlite-database.d.ts +13 -0
  72. package/dist/storage/sqlite/sqlite-database.js +2 -0
  73. package/dist/storage/sqlite/sqlite-database.js.map +1 -0
  74. package/dist/storage/sqlite/storage-sqlite.d.ts +26 -0
  75. package/dist/storage/sqlite/storage-sqlite.js +213 -0
  76. package/dist/storage/sqlite/storage-sqlite.js.map +1 -0
  77. package/package.json +10 -11
  78. package/dist/cli/main.d.ts +0 -2
  79. package/dist/cli/main.js +0 -183
  80. package/dist/cli/main.js.map +0 -1
  81. package/dist/client.d.ts +0 -17
  82. package/dist/client.js.map +0 -1
  83. package/dist/controller.d.ts +0 -72
  84. package/dist/controller.js +0 -477
  85. package/dist/controller.js.map +0 -1
  86. package/dist/db/storage-sqlite.d.ts +0 -12
  87. package/dist/db/storage-sqlite.js +0 -53
  88. package/dist/db/storage-sqlite.js.map +0 -1
  89. package/dist/db/storage.d.ts +0 -18
  90. package/dist/db/storage.js +0 -29
  91. package/dist/db/storage.js.map +0 -1
  92. package/dist/events/event-store.d.ts +0 -116
  93. package/dist/events/event-store.js +0 -254
  94. package/dist/events/event-store.js.map +0 -1
  95. package/dist/events/events.d.ts +0 -248
  96. package/dist/events/events.js +0 -186
  97. package/dist/events/events.js.map +0 -1
  98. package/dist/keystore/encrypt.d.ts +0 -11
  99. package/dist/keystore/encrypt.js +0 -57
  100. package/dist/keystore/encrypt.js.map +0 -1
  101. package/dist/keystore/key-manager.d.ts +0 -20
  102. package/dist/keystore/key-manager.js +0 -61
  103. package/dist/keystore/key-manager.js.map +0 -1
  104. package/dist/keystore/pinentry.d.ts +0 -1
  105. package/dist/keystore/pinentry.js +0 -46
  106. package/dist/keystore/pinentry.js.map +0 -1
@@ -1,186 +0,0 @@
1
- import { blake3 } from "@noble/hashes/blake3.js";
2
- import { cesr, Matter, Message, VersionString } from "cesr";
3
- export function formatDate(date) {
4
- return date.toISOString().replace("Z", "000+00:00");
5
- }
6
- export function randomNonce() {
7
- return Matter.from(Matter.Code.Salt_128, crypto.getRandomValues(new Uint8Array(16))).text();
8
- }
9
- function calculateSaid(event) {
10
- const digest = cesr.crypto.blake3_256(blake3
11
- .create({ dkLen: 32 })
12
- .update(new TextEncoder().encode(JSON.stringify(event)))
13
- .digest());
14
- return digest.text();
15
- }
16
- export function saidify(event, labels) {
17
- if (!labels?.length) {
18
- return event;
19
- }
20
- const digest = calculateSaid(event);
21
- for (const label of labels ?? []) {
22
- event[label] = digest;
23
- }
24
- return event;
25
- }
26
- function isTransferable(key) {
27
- const raw = Matter.parse(key);
28
- switch (raw.code) {
29
- case Matter.Code.ECDSA_256k1N:
30
- case Matter.Code.Ed25519N:
31
- case Matter.Code.Ed448N:
32
- return false;
33
- default:
34
- return true;
35
- }
36
- }
37
- function resolveBackerThreshold(data) {
38
- if (data.bt) {
39
- return data.bt;
40
- }
41
- if (!data.b || data.b.length === 0) {
42
- return 0;
43
- }
44
- if (data.b.length === 1) {
45
- return 1;
46
- }
47
- return data.b.length - 1;
48
- }
49
- export class KeriEventCreator {
50
- #version;
51
- constructor(options) {
52
- this.#version = options.version;
53
- }
54
- #encode(data, labels = ["d"]) {
55
- for (const label of labels) {
56
- if (!(label in data)) {
57
- throw new Error(`Input missing label '${label}'`);
58
- }
59
- data[label] = "#".repeat(44);
60
- }
61
- return saidify(new Message({
62
- v: VersionString.encode({ protocol: "KERI", legacy: this.#version === 1 }),
63
- ...data,
64
- }).body, labels);
65
- }
66
- registry(args) {
67
- return this.#encode({
68
- t: "vcp",
69
- d: "",
70
- i: "",
71
- ii: args.ii,
72
- s: "0",
73
- c: ["NB"],
74
- bt: "0",
75
- b: [],
76
- n: args.n ?? randomNonce(),
77
- }, ["d", "i"]);
78
- }
79
- issue(args) {
80
- return this.#encode({
81
- t: "iss",
82
- d: "",
83
- i: args.i,
84
- s: "0",
85
- ri: args.ri,
86
- dt: args.dt ?? formatDate(new Date()),
87
- });
88
- }
89
- incept(data) {
90
- if (data.k.length === 0) {
91
- throw new Error("No keys provided in inception event");
92
- }
93
- const transferable = data.k.length > 1 || isTransferable(data.k[0]);
94
- const labels = ["d"];
95
- if (transferable) {
96
- labels.push("i");
97
- }
98
- return this.#encode({
99
- t: "icp",
100
- d: "",
101
- i: transferable ? "" : data.k[0],
102
- s: "0",
103
- kt: data.kt ?? data.k.length.toString(),
104
- k: data.k,
105
- nt: data.nt ?? data.n?.length.toString() ?? "0",
106
- n: data.n ?? [],
107
- bt: resolveBackerThreshold(data).toString(),
108
- b: data.b ?? [],
109
- c: [],
110
- a: [],
111
- }, labels);
112
- }
113
- exchange(data) {
114
- return this.#encode({
115
- t: "exn",
116
- d: "",
117
- i: data.i,
118
- rp: data.rp || "",
119
- p: data.p || "",
120
- dt: data.dt || formatDate(new Date()),
121
- r: data.r,
122
- q: data.q || {},
123
- a: data.a || {},
124
- e: data.e ? saidify({ ...(data.e ?? {}), d: "" }, ["d"]) : {},
125
- });
126
- }
127
- interact(data) {
128
- return this.#encode({
129
- t: "ixn",
130
- d: "",
131
- i: data.i,
132
- s: data.s,
133
- p: data.p,
134
- a: data.a ?? [],
135
- });
136
- }
137
- query(args) {
138
- return this.#encode({
139
- t: "qry",
140
- d: "",
141
- dt: formatDate(args.dt ?? new Date()),
142
- r: args.r ?? "",
143
- rr: args.rr ?? "",
144
- q: args.q,
145
- });
146
- }
147
- receipt(data) {
148
- return this.#encode({
149
- t: "rct",
150
- d: data.d,
151
- i: data.i,
152
- s: data.s,
153
- }, []);
154
- }
155
- reply(data) {
156
- return this.#encode({
157
- t: "rpy",
158
- d: "",
159
- dt: data.dt ?? formatDate(new Date()),
160
- r: data.r,
161
- a: data.a,
162
- });
163
- }
164
- credential(data) {
165
- const body = new Message({
166
- v: VersionString.encode({
167
- protocol: "ACDC",
168
- legacy: this.#version === 1,
169
- }),
170
- d: "#".repeat(44),
171
- ...(data.u && { u: data.u }),
172
- i: data.i,
173
- ri: data.ri,
174
- s: data.s,
175
- a: saidify({
176
- d: "#".repeat(44),
177
- ...data.a,
178
- }, ["d"]),
179
- ...(data.e && { e: saidify({ d: "#".repeat(44), ...data.e }, ["d"]) }),
180
- r: saidify({ d: "#".repeat(44), ...data.r }, ["d"]),
181
- }).body;
182
- return saidify(body, ["d"]);
183
- }
184
- }
185
- export const keri = new KeriEventCreator({ version: 1 });
186
- //# sourceMappingURL=events.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/events/events.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- export interface Encrypter {
2
- encrypt(data: Uint8Array): Promise<Uint8Array>;
3
- decrypt(data: Uint8Array): Promise<Uint8Array>;
4
- }
5
- export declare class PassphraseEncrypter implements Encrypter {
6
- #private;
7
- constructor(passphrase?: string);
8
- private passphrase;
9
- encrypt(data: Uint8Array): Promise<Uint8Array>;
10
- decrypt(ciphertext: Uint8Array): Promise<Uint8Array>;
11
- }
@@ -1,57 +0,0 @@
1
- import { pinentry } from "./pinentry.js";
2
- async function deriveKey(passphrase, salt) {
3
- const encoder = new TextEncoder();
4
- const encryptionKey = await crypto.subtle.importKey("raw", encoder.encode(passphrase), "PBKDF2", false, [
5
- "deriveBits",
6
- "deriveKey",
7
- ]);
8
- const key = await crypto.subtle.deriveKey({
9
- name: "PBKDF2",
10
- salt: Uint8Array.from(salt),
11
- iterations: 100000,
12
- hash: "SHA-256",
13
- }, encryptionKey, { name: "AES-GCM", length: 256 }, true, ["encrypt", "decrypt"]);
14
- return key;
15
- }
16
- async function encrypt(data, passphrase) {
17
- const salt = crypto.getRandomValues(new Uint8Array(16));
18
- const iv = crypto.getRandomValues(new Uint8Array(16));
19
- const key = await deriveKey(passphrase, salt);
20
- const encrypted = await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, Uint8Array.from(data));
21
- const result = new Uint8Array(salt.byteLength + iv.byteLength + encrypted.byteLength);
22
- result.set(salt, 0);
23
- result.set(iv, salt.byteLength);
24
- result.set(new Uint8Array(encrypted), salt.byteLength + iv.byteLength);
25
- return result;
26
- }
27
- async function decrypt(ciphertext, passphrase) {
28
- const salt = ciphertext.slice(0, 16);
29
- const key = await deriveKey(passphrase, salt);
30
- const iv = ciphertext.slice(16, 32);
31
- const encrypted = ciphertext.slice(32);
32
- return new Uint8Array(await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, encrypted));
33
- }
34
- export class PassphraseEncrypter {
35
- #passphrase;
36
- constructor(passphrase) {
37
- this.#passphrase = passphrase ?? null;
38
- }
39
- async passphrase() {
40
- if (!this.#passphrase) {
41
- this.#passphrase = await pinentry("Enter passphrase: ");
42
- }
43
- if (!this.#passphrase) {
44
- throw new Error("Passphrase is required");
45
- }
46
- return this.#passphrase;
47
- }
48
- async encrypt(data) {
49
- const passphrase = await this.passphrase();
50
- return await encrypt(data, passphrase);
51
- }
52
- async decrypt(ciphertext) {
53
- const passphrase = await this.passphrase();
54
- return await decrypt(ciphertext, passphrase);
55
- }
56
- }
57
- //# sourceMappingURL=encrypt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../src/keystore/encrypt.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import { type Encrypter } from "./encrypt.ts";
2
- import { type KeyValueStorage } from "../events/event-store.ts";
3
- import type { Keychain } from "../controller.ts";
4
- export interface KeyManagerOptions {
5
- passphrase?: string;
6
- storage: KeyValueStorage;
7
- }
8
- export declare class PassphraseKeyManager implements Keychain {
9
- storage: KeyValueStorage;
10
- encrypter: Encrypter;
11
- constructor(options: KeyManagerOptions);
12
- private load;
13
- import(key: Uint8Array): Promise<string>;
14
- incept(): Promise<string>;
15
- sign(publicKey: string, message: Uint8Array): Promise<string>;
16
- static createDigest: typeof createDigest;
17
- static verify: typeof verify;
18
- }
19
- export declare function createDigest(key: string): string;
20
- export declare function verify(publicKey: string, message: Uint8Array, signature: string): boolean;
@@ -1,61 +0,0 @@
1
- import { ed25519 } from "@noble/curves/ed25519.js";
2
- import { blake3 } from "@noble/hashes/blake3.js";
3
- import { PassphraseEncrypter } from "./encrypt.js";
4
- import {} from "../events/event-store.js";
5
- import { cesr, Matter } from "cesr";
6
- import { decodeBase64Url, encodeBase64Url } from "cesr/__unstable__";
7
- export class PassphraseKeyManager {
8
- storage;
9
- encrypter;
10
- constructor(options) {
11
- this.encrypter = new PassphraseEncrypter(options.passphrase);
12
- this.storage = options.storage;
13
- }
14
- async load(publicKey) {
15
- const value = await this.storage.get(publicKey);
16
- if (!value) {
17
- throw new Error(`Key ${publicKey} not found`);
18
- }
19
- return await this.encrypter.decrypt(decodeBase64Url(value));
20
- }
21
- async import(key) {
22
- const text = cesr.crypto.ed25519(ed25519.getPublicKey(key)).text();
23
- const data = await this.encrypter.encrypt(key);
24
- await this.storage.set(text, encodeBase64Url(data));
25
- return text;
26
- }
27
- async incept() {
28
- const key = ed25519.utils.randomSecretKey();
29
- return await this.import(key);
30
- }
31
- async sign(publicKey, message) {
32
- const key = await this.load(publicKey);
33
- const signature = ed25519.sign(message, key);
34
- return cesr.crypto.ed25519_sig(signature).text();
35
- }
36
- static createDigest = createDigest;
37
- static verify = verify;
38
- }
39
- export function createDigest(key) {
40
- const next = cesr.crypto
41
- .blake3_256(blake3.create({ dkLen: 32 }).update(new TextEncoder().encode(key)).digest())
42
- .text();
43
- return next;
44
- }
45
- export function verify(publicKey, message, signature) {
46
- const key = Matter.parse(publicKey);
47
- const sig = Matter.parse(signature);
48
- switch (key.code) {
49
- case Matter.Code.Ed25519:
50
- case Matter.Code.Ed25519N:
51
- switch (sig.code) {
52
- case Matter.Code.Ed25519_Sig:
53
- return ed25519.verify(sig.raw, message, key.raw);
54
- default:
55
- throw new Error(`Unsupported signature code: ${sig.code}`);
56
- }
57
- default:
58
- throw new Error(`Unsupported key code: ${key.code}`);
59
- }
60
- }
61
- //# sourceMappingURL=key-manager.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-manager.js","sourceRoot":"","sources":["../../src/keystore/key-manager.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export declare function pinentry(prompt: string): Promise<string | null>;
@@ -1,46 +0,0 @@
1
- import * as readline from "node:readline";
2
- import * as process from "node:process";
3
- export async function pinentry(prompt) {
4
- await new Promise((resolve) => setTimeout(resolve, 0));
5
- return new Promise((resolve) => {
6
- const rl = readline.createInterface({
7
- input: process.stdin,
8
- });
9
- let input = "";
10
- process.stdout.write(prompt + " ");
11
- readline.emitKeypressEvents(process.stdin);
12
- if (process.stdin.isTTY) {
13
- process.stdin.setRawMode(true);
14
- }
15
- const cleanup = () => {
16
- if (process.stdin.isTTY) {
17
- process.stdin.setRawMode(false);
18
- }
19
- process.stdin.removeListener("keypress", handleKeyPress);
20
- rl.close();
21
- process.stdout.write("\n");
22
- };
23
- const handleKeyPress = (str, key) => {
24
- if (key.name === "return") {
25
- cleanup();
26
- resolve(input);
27
- }
28
- else if (key.name === "escape" || (key.ctrl && key.name === "c")) {
29
- cleanup();
30
- resolve(null);
31
- }
32
- else if (key.name === "backspace") {
33
- if (input.length > 0) {
34
- input = input.slice(0, -1);
35
- process.stdout.write("\x1B[1D \x1B[1D");
36
- }
37
- }
38
- else if (str && !key.ctrl && !key.meta) {
39
- input += str;
40
- process.stdout.write("*");
41
- }
42
- };
43
- process.stdin.on("keypress", handleKeyPress);
44
- });
45
- }
46
- //# sourceMappingURL=pinentry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pinentry.js","sourceRoot":"","sources":["../../src/keystore/pinentry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,cAAc,CAAC;AAExC,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,MAAc;IAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;YAClC,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QAEH,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAEnC,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAClC,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;YACzD,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,CAAC,GAAW,EAAE,GAAiB,EAAE,EAAE;YACxD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACnE,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBAC1C,CAAC;YACH,CAAC;iBAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBACzC,KAAK,IAAI,GAAG,CAAC;gBACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC"}