@arcanea/council 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.
@@ -0,0 +1,63 @@
1
+ /**
2
+ * V3 Byzantine Fault Tolerant Consensus
3
+ * PBFT-style consensus for handling malicious or faulty nodes
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { ConsensusProposal, ConsensusVote, ConsensusResult, ConsensusConfig } from '../types.js';
7
+ export type ByzantinePhase = 'pre-prepare' | 'prepare' | 'commit' | 'reply';
8
+ export interface ByzantineMessage {
9
+ type: ByzantinePhase;
10
+ viewNumber: number;
11
+ sequenceNumber: number;
12
+ digest: string;
13
+ senderId: string;
14
+ timestamp: Date;
15
+ payload?: unknown;
16
+ signature?: string;
17
+ }
18
+ export interface ByzantineNode {
19
+ id: string;
20
+ isPrimary: boolean;
21
+ viewNumber: number;
22
+ sequenceNumber: number;
23
+ preparedMessages: Map<string, ByzantineMessage[]>;
24
+ committedMessages: Map<string, ByzantineMessage[]>;
25
+ }
26
+ export interface ByzantineConfig extends Partial<ConsensusConfig> {
27
+ maxFaultyNodes?: number;
28
+ viewChangeTimeoutMs?: number;
29
+ }
30
+ export declare class ByzantineConsensus extends EventEmitter {
31
+ private config;
32
+ private node;
33
+ private nodes;
34
+ private proposals;
35
+ private messageLog;
36
+ private proposalCounter;
37
+ private viewChangeTimeout?;
38
+ constructor(nodeId: string, config?: ByzantineConfig);
39
+ initialize(): Promise<void>;
40
+ shutdown(): Promise<void>;
41
+ addNode(nodeId: string, isPrimary?: boolean): void;
42
+ removeNode(nodeId: string): void;
43
+ electPrimary(): string;
44
+ propose(value: unknown): Promise<ConsensusProposal>;
45
+ vote(proposalId: string, vote: ConsensusVote): Promise<void>;
46
+ awaitConsensus(proposalId: string): Promise<ConsensusResult>;
47
+ handlePrePrepare(message: ByzantineMessage): Promise<void>;
48
+ handlePrepare(message: ByzantineMessage): Promise<void>;
49
+ handleCommit(message: ByzantineMessage): Promise<void>;
50
+ initiateViewChange(): Promise<void>;
51
+ private broadcastMessage;
52
+ private computeDigest;
53
+ private createResult;
54
+ isPrimary(): boolean;
55
+ getViewNumber(): number;
56
+ getSequenceNumber(): number;
57
+ getPreparedCount(): number;
58
+ getCommittedCount(): number;
59
+ getMaxFaultyNodes(): number;
60
+ canTolerate(faultyCount: number): boolean;
61
+ }
62
+ export declare function createByzantineConsensus(nodeId: string, config?: ByzantineConfig): ByzantineConsensus;
63
+ //# sourceMappingURL=byzantine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byzantine.d.ts","sourceRoot":"","sources":["../../src/consensus/byzantine.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,eAAe,EAEhB,MAAM,aAAa,CAAC;AAErB,MAAM,MAAM,cAAc,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE5E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,cAAc,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAClD,iBAAiB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,eAAgB,SAAQ,OAAO,CAAC,eAAe,CAAC;IAC/D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,qBAAa,kBAAmB,SAAQ,YAAY;IAClD,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,KAAK,CAAyC;IACtD,OAAO,CAAC,SAAS,CAA6C;IAC9D,OAAO,CAAC,UAAU,CAA8C;IAChE,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,iBAAiB,CAAC,CAAiB;gBAE/B,MAAM,EAAE,MAAM,EAAE,MAAM,GAAE,eAAoB;IAqBlD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,IAAI;IAezD,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC,YAAY,IAAI,MAAM;IAgBhB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgDnD,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA0B5D,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA6B5D,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC1D,aAAa,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDvD,YAAY,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkCtD,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;YAa3B,gBAAgB;IAS9B,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,YAAY;IAqBpB,SAAS,IAAI,OAAO;IAIpB,aAAa,IAAI,MAAM;IAIvB,iBAAiB,IAAI,MAAM;IAI3B,gBAAgB,IAAI,MAAM;IAI1B,iBAAiB,IAAI,MAAM;IAI3B,iBAAiB,IAAI,MAAM;IAK3B,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAG1C;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,eAAe,GACvB,kBAAkB,CAEpB"}
@@ -0,0 +1,316 @@
1
+ /**
2
+ * V3 Byzantine Fault Tolerant Consensus
3
+ * PBFT-style consensus for handling malicious or faulty nodes
4
+ */
5
+ import { EventEmitter } from 'events';
6
+ import { SWARM_CONSTANTS, } from '../types.js';
7
+ export class ByzantineConsensus extends EventEmitter {
8
+ config;
9
+ node;
10
+ nodes = new Map();
11
+ proposals = new Map();
12
+ messageLog = new Map();
13
+ proposalCounter = 0;
14
+ viewChangeTimeout;
15
+ constructor(nodeId, config = {}) {
16
+ super();
17
+ this.config = {
18
+ threshold: config.threshold ?? SWARM_CONSTANTS.DEFAULT_CONSENSUS_THRESHOLD,
19
+ timeoutMs: config.timeoutMs ?? SWARM_CONSTANTS.DEFAULT_CONSENSUS_TIMEOUT_MS,
20
+ maxRounds: config.maxRounds ?? 10,
21
+ requireQuorum: config.requireQuorum ?? true,
22
+ maxFaultyNodes: config.maxFaultyNodes ?? 1,
23
+ viewChangeTimeoutMs: config.viewChangeTimeoutMs ?? 5000,
24
+ };
25
+ this.node = {
26
+ id: nodeId,
27
+ isPrimary: false,
28
+ viewNumber: 0,
29
+ sequenceNumber: 0,
30
+ preparedMessages: new Map(),
31
+ committedMessages: new Map(),
32
+ };
33
+ }
34
+ async initialize() {
35
+ this.emit('initialized', { nodeId: this.node.id });
36
+ }
37
+ async shutdown() {
38
+ if (this.viewChangeTimeout) {
39
+ clearTimeout(this.viewChangeTimeout);
40
+ }
41
+ this.emit('shutdown');
42
+ }
43
+ addNode(nodeId, isPrimary = false) {
44
+ this.nodes.set(nodeId, {
45
+ id: nodeId,
46
+ isPrimary,
47
+ viewNumber: 0,
48
+ sequenceNumber: 0,
49
+ preparedMessages: new Map(),
50
+ committedMessages: new Map(),
51
+ });
52
+ if (isPrimary && this.node.id === nodeId) {
53
+ this.node.isPrimary = true;
54
+ }
55
+ }
56
+ removeNode(nodeId) {
57
+ this.nodes.delete(nodeId);
58
+ }
59
+ electPrimary() {
60
+ const nodeIds = [this.node.id, ...Array.from(this.nodes.keys())];
61
+ const primaryIndex = this.node.viewNumber % nodeIds.length;
62
+ const primaryId = nodeIds[primaryIndex];
63
+ this.node.isPrimary = primaryId === this.node.id;
64
+ for (const [id, node] of this.nodes) {
65
+ node.isPrimary = id === primaryId;
66
+ }
67
+ this.emit('primary.elected', { primaryId, viewNumber: this.node.viewNumber });
68
+ return primaryId;
69
+ }
70
+ async propose(value) {
71
+ if (!this.node.isPrimary) {
72
+ throw new Error('Only primary can propose values');
73
+ }
74
+ this.proposalCounter++;
75
+ const sequenceNumber = ++this.node.sequenceNumber;
76
+ const digest = this.computeDigest(value);
77
+ const proposalId = `bft_${this.node.viewNumber}_${sequenceNumber}`;
78
+ const proposal = {
79
+ id: proposalId,
80
+ proposerId: this.node.id,
81
+ value,
82
+ term: this.node.viewNumber,
83
+ timestamp: new Date(),
84
+ votes: new Map(),
85
+ status: 'pending',
86
+ };
87
+ this.proposals.set(proposalId, proposal);
88
+ // Phase 1: Pre-prepare
89
+ const prePrepareMsg = {
90
+ type: 'pre-prepare',
91
+ viewNumber: this.node.viewNumber,
92
+ sequenceNumber,
93
+ digest,
94
+ senderId: this.node.id,
95
+ timestamp: new Date(),
96
+ payload: value,
97
+ };
98
+ await this.broadcastMessage(prePrepareMsg);
99
+ // Self-prepare
100
+ await this.handlePrepare({
101
+ type: 'prepare',
102
+ viewNumber: this.node.viewNumber,
103
+ sequenceNumber,
104
+ digest,
105
+ senderId: this.node.id,
106
+ timestamp: new Date(),
107
+ });
108
+ return proposal;
109
+ }
110
+ async vote(proposalId, vote) {
111
+ const proposal = this.proposals.get(proposalId);
112
+ if (!proposal || proposal.status !== 'pending') {
113
+ return;
114
+ }
115
+ proposal.votes.set(vote.voterId, vote);
116
+ // Check consensus
117
+ const f = this.config.maxFaultyNodes ?? 1;
118
+ const n = this.nodes.size + 1;
119
+ const requiredVotes = 2 * f + 1;
120
+ const approvingVotes = Array.from(proposal.votes.values()).filter(v => v.approve).length;
121
+ if (approvingVotes >= requiredVotes) {
122
+ proposal.status = 'accepted';
123
+ this.emit('consensus.achieved', { proposalId, approved: true });
124
+ }
125
+ else if (proposal.votes.size >= n && approvingVotes < requiredVotes) {
126
+ proposal.status = 'rejected';
127
+ this.emit('consensus.achieved', { proposalId, approved: false });
128
+ }
129
+ }
130
+ async awaitConsensus(proposalId) {
131
+ const startTime = Date.now();
132
+ return new Promise((resolve, reject) => {
133
+ const checkInterval = setInterval(() => {
134
+ const proposal = this.proposals.get(proposalId);
135
+ if (!proposal) {
136
+ clearInterval(checkInterval);
137
+ reject(new Error(`Proposal ${proposalId} not found`));
138
+ return;
139
+ }
140
+ if (proposal.status !== 'pending') {
141
+ clearInterval(checkInterval);
142
+ resolve(this.createResult(proposal, Date.now() - startTime));
143
+ return;
144
+ }
145
+ if (Date.now() - startTime > (this.config.timeoutMs ?? 30000)) {
146
+ clearInterval(checkInterval);
147
+ proposal.status = 'expired';
148
+ resolve(this.createResult(proposal, Date.now() - startTime));
149
+ }
150
+ }, 10);
151
+ });
152
+ }
153
+ // ===== MESSAGE HANDLERS =====
154
+ async handlePrePrepare(message) {
155
+ // Validate message
156
+ if (message.viewNumber !== this.node.viewNumber) {
157
+ return;
158
+ }
159
+ // Accept pre-prepare from primary
160
+ const proposalId = `bft_${message.viewNumber}_${message.sequenceNumber}`;
161
+ if (!this.proposals.has(proposalId) && message.payload !== undefined) {
162
+ const proposal = {
163
+ id: proposalId,
164
+ proposerId: message.senderId,
165
+ value: message.payload,
166
+ term: message.viewNumber,
167
+ timestamp: message.timestamp,
168
+ votes: new Map(),
169
+ status: 'pending',
170
+ };
171
+ this.proposals.set(proposalId, proposal);
172
+ }
173
+ // Send prepare message
174
+ const prepareMsg = {
175
+ type: 'prepare',
176
+ viewNumber: message.viewNumber,
177
+ sequenceNumber: message.sequenceNumber,
178
+ digest: message.digest,
179
+ senderId: this.node.id,
180
+ timestamp: new Date(),
181
+ };
182
+ await this.broadcastMessage(prepareMsg);
183
+ await this.handlePrepare(prepareMsg);
184
+ }
185
+ async handlePrepare(message) {
186
+ const key = `${message.viewNumber}_${message.sequenceNumber}`;
187
+ if (!this.messageLog.has(key)) {
188
+ this.messageLog.set(key, []);
189
+ }
190
+ const messages = this.messageLog.get(key);
191
+ const hasPrepare = messages.some(m => m.type === 'prepare' && m.senderId === message.senderId);
192
+ if (!hasPrepare) {
193
+ messages.push(message);
194
+ }
195
+ // Check if prepared (2f + 1 prepare messages)
196
+ const f = this.config.maxFaultyNodes ?? 1;
197
+ const prepareCount = messages.filter(m => m.type === 'prepare').length;
198
+ if (prepareCount >= 2 * f + 1) {
199
+ const proposalId = `bft_${message.viewNumber}_${message.sequenceNumber}`;
200
+ this.node.preparedMessages.set(key, messages);
201
+ // Send commit message
202
+ const commitMsg = {
203
+ type: 'commit',
204
+ viewNumber: message.viewNumber,
205
+ sequenceNumber: message.sequenceNumber,
206
+ digest: message.digest,
207
+ senderId: this.node.id,
208
+ timestamp: new Date(),
209
+ };
210
+ await this.broadcastMessage(commitMsg);
211
+ await this.handleCommit(commitMsg);
212
+ // Record vote
213
+ const proposal = this.proposals.get(proposalId);
214
+ if (proposal) {
215
+ proposal.votes.set(this.node.id, {
216
+ voterId: this.node.id,
217
+ approve: true,
218
+ confidence: 1.0,
219
+ timestamp: new Date(),
220
+ });
221
+ }
222
+ }
223
+ }
224
+ async handleCommit(message) {
225
+ const key = `${message.viewNumber}_${message.sequenceNumber}`;
226
+ if (!this.messageLog.has(key)) {
227
+ this.messageLog.set(key, []);
228
+ }
229
+ const messages = this.messageLog.get(key);
230
+ const hasCommit = messages.some(m => m.type === 'commit' && m.senderId === message.senderId);
231
+ if (!hasCommit) {
232
+ messages.push(message);
233
+ }
234
+ // Check if committed (2f + 1 commit messages)
235
+ const f = this.config.maxFaultyNodes ?? 1;
236
+ const commitCount = messages.filter(m => m.type === 'commit').length;
237
+ if (commitCount >= 2 * f + 1) {
238
+ const proposalId = `bft_${message.viewNumber}_${message.sequenceNumber}`;
239
+ this.node.committedMessages.set(key, messages);
240
+ const proposal = this.proposals.get(proposalId);
241
+ if (proposal && proposal.status === 'pending') {
242
+ proposal.status = 'accepted';
243
+ this.emit('consensus.achieved', { proposalId, approved: true });
244
+ }
245
+ }
246
+ }
247
+ // ===== VIEW CHANGE =====
248
+ async initiateViewChange() {
249
+ this.node.viewNumber++;
250
+ this.emit('view.changing', { newViewNumber: this.node.viewNumber });
251
+ // Elect new primary
252
+ this.electPrimary();
253
+ this.emit('view.changed', { viewNumber: this.node.viewNumber });
254
+ }
255
+ // ===== PRIVATE METHODS =====
256
+ async broadcastMessage(message) {
257
+ this.emit('message.broadcast', { message });
258
+ // Broadcast to all registered nodes
259
+ for (const node of this.nodes.values()) {
260
+ this.emit('message.sent', { to: node.id, message });
261
+ }
262
+ }
263
+ computeDigest(value) {
264
+ // Simple hash for demonstration
265
+ const str = JSON.stringify(value);
266
+ let hash = 0;
267
+ for (let i = 0; i < str.length; i++) {
268
+ const char = str.charCodeAt(i);
269
+ hash = ((hash << 5) - hash) + char;
270
+ hash = hash & hash;
271
+ }
272
+ return hash.toString(16);
273
+ }
274
+ createResult(proposal, durationMs) {
275
+ const n = this.nodes.size + 1;
276
+ const approvingVotes = Array.from(proposal.votes.values()).filter(v => v.approve).length;
277
+ return {
278
+ proposalId: proposal.id,
279
+ approved: proposal.status === 'accepted',
280
+ approvalRate: proposal.votes.size > 0
281
+ ? approvingVotes / proposal.votes.size
282
+ : 0,
283
+ participationRate: proposal.votes.size / n,
284
+ finalValue: proposal.value,
285
+ rounds: 3, // pre-prepare, prepare, commit
286
+ durationMs,
287
+ };
288
+ }
289
+ // ===== STATE QUERIES =====
290
+ isPrimary() {
291
+ return this.node.isPrimary;
292
+ }
293
+ getViewNumber() {
294
+ return this.node.viewNumber;
295
+ }
296
+ getSequenceNumber() {
297
+ return this.node.sequenceNumber;
298
+ }
299
+ getPreparedCount() {
300
+ return this.node.preparedMessages.size;
301
+ }
302
+ getCommittedCount() {
303
+ return this.node.committedMessages.size;
304
+ }
305
+ getMaxFaultyNodes() {
306
+ const n = this.nodes.size + 1;
307
+ return Math.floor((n - 1) / 3);
308
+ }
309
+ canTolerate(faultyCount) {
310
+ return faultyCount <= this.getMaxFaultyNodes();
311
+ }
312
+ }
313
+ export function createByzantineConsensus(nodeId, config) {
314
+ return new ByzantineConsensus(nodeId, config);
315
+ }
316
+ //# sourceMappingURL=byzantine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byzantine.js","sourceRoot":"","sources":["../../src/consensus/byzantine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @arcanea/council — Gate Quorum Consensus
3
+ *
4
+ * Arcanea-specific consensus protocol where the Ten Guardians vote
5
+ * with weights determined by their Gate frequency (174-1111 Hz).
6
+ *
7
+ * Higher-frequency Guardians have more voting weight:
8
+ * Lyssandria (174 Hz) = 1.0x weight (broad acceptance, foundation)
9
+ * Shinkami (1111 Hz) = 6.38x weight (selective, source)
10
+ *
11
+ * Element affinity boosts votes from Guardians whose element matches the task.
12
+ * Shinkami can override any decision (Source authority).
13
+ */
14
+ import { EventEmitter } from 'node:events';
15
+ import { type GuardianName, type Element } from '../external-types.js';
16
+ import type { Petition, Seal, CouncilResult, CouncilConfig } from '../types.js';
17
+ export interface GateQuorumOptions {
18
+ quorumSize?: number;
19
+ weightByFrequency?: boolean;
20
+ approvalThreshold?: number;
21
+ tieBreaker?: 'highest-frequency' | 'element-affinity' | 'random';
22
+ elementAffinity?: Element;
23
+ voteTimeoutMs?: number;
24
+ shinkamOverride?: boolean;
25
+ }
26
+ export declare class GateQuorumConsensus extends EventEmitter {
27
+ private config;
28
+ private nodeId;
29
+ private nodes;
30
+ private proposals;
31
+ private proposalVotes;
32
+ private initialized;
33
+ constructor(nodeId: string, options?: GateQuorumOptions);
34
+ initialize(config?: CouncilConfig): Promise<void>;
35
+ shutdown(): Promise<void>;
36
+ /**
37
+ * Add a Guardian node to the quorum.
38
+ */
39
+ addNode(nodeId: string, options?: {
40
+ guardian?: GuardianName;
41
+ isPrimary?: boolean;
42
+ }): void;
43
+ removeNode(nodeId: string): void;
44
+ /**
45
+ * Submit a petition to the Gate Quorum.
46
+ */
47
+ propose(value: unknown): Promise<Petition>;
48
+ /**
49
+ * Cast a vote (seal) on a petition. Weight is calculated from Guardian frequency.
50
+ */
51
+ vote(petitionId: string, seal: Seal): Promise<void>;
52
+ /**
53
+ * Wait for consensus on a petition.
54
+ */
55
+ awaitConsensus(petitionId: string): Promise<CouncilResult>;
56
+ private resolveQuorum;
57
+ private resolveTie;
58
+ private calculateApprovalRate;
59
+ }
60
+ export declare function createGateQuorumConsensus(nodeId: string, options?: GateQuorumOptions): GateQuorumConsensus;
61
+ //# sourceMappingURL=gate-quorum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-quorum.d.ts","sourceRoot":"","sources":["../../src/consensus/gate-quorum.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,OAAO,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAIV,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,aAAa,EACd,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,mBAAmB,GAAG,kBAAkB,GAAG,QAAQ,CAAC;IACjE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAuF;IACpG,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,aAAa,CAAuC;IAC5D,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAcrD,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAYjD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,YAAY,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAiBzF,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACG,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;IAuBhD;;OAEG;IACG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAuCzD;;OAEG;IACG,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoDlD,aAAa;IAqE3B,OAAO,CAAC,UAAU;IAsBlB,OAAO,CAAC,qBAAqB;CAM9B;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,iBAAiB,GAC1B,mBAAmB,CAErB"}