@robono/server 0.21.0 → 0.23.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/CHANGELOG.md +12 -0
- package/README.md +30 -2
- package/SBOM.spdx.json +9 -9
- package/dist/calling-session-handle.d.ts +13 -0
- package/dist/calling-session-handle.d.ts.map +1 -0
- package/dist/calling-session-handle.js +37 -0
- package/dist/calling-session-handle.js.map +1 -0
- package/dist/calling.d.ts +1 -0
- package/dist/calling.d.ts.map +1 -1
- package/dist/calling.js +1 -1
- package/dist/calling.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/location.d.ts.map +1 -1
- package/dist/location.js +3 -0
- package/dist/location.js.map +1 -1
- package/dist/messaging-extras-contract.d.ts +14 -0
- package/dist/messaging-extras-contract.d.ts.map +1 -0
- package/dist/messaging-extras-contract.js +94 -0
- package/dist/messaging-extras-contract.js.map +1 -0
- package/dist/messaging-extras.d.ts +10 -0
- package/dist/messaging-extras.d.ts.map +1 -0
- package/dist/messaging-extras.js +42 -0
- package/dist/messaging-extras.js.map +1 -0
- package/dist/messaging-notification-providers.d.ts +20 -1
- package/dist/messaging-notification-providers.d.ts.map +1 -1
- package/dist/messaging-notification-providers.js +16 -5
- package/dist/messaging-notification-providers.js.map +1 -1
- package/dist/messaging-push-worker.d.ts.map +1 -1
- package/dist/messaging-push-worker.js +22 -2
- package/dist/messaging-push-worker.js.map +1 -1
- package/dist/messenger-calling.d.ts +14 -0
- package/dist/messenger-calling.d.ts.map +1 -0
- package/dist/messenger-calling.js +173 -0
- package/dist/messenger-calling.js.map +1 -0
- package/dist/messenger-check.d.ts.map +1 -1
- package/dist/messenger-check.js +3 -1
- package/dist/messenger-check.js.map +1 -1
- package/dist/messenger-connected-templates.d.ts.map +1 -1
- package/dist/messenger-connected-templates.js +5 -2
- package/dist/messenger-connected-templates.js.map +1 -1
- package/dist/messenger-connections.d.ts +31 -0
- package/dist/messenger-connections.d.ts.map +1 -0
- package/dist/messenger-connections.js +18 -0
- package/dist/messenger-connections.js.map +1 -0
- package/dist/messenger-customer-templates.d.ts.map +1 -1
- package/dist/messenger-customer-templates.js +2 -0
- package/dist/messenger-customer-templates.js.map +1 -1
- package/dist/messenger-init.d.ts.map +1 -1
- package/dist/messenger-init.js +9 -5
- package/dist/messenger-init.js.map +1 -1
- package/dist/messenger-install-cli.js +23 -6
- package/dist/messenger-install-cli.js.map +1 -1
- package/dist/messenger-install.d.ts +11 -1
- package/dist/messenger-install.d.ts.map +1 -1
- package/dist/messenger-install.js +260 -62
- package/dist/messenger-install.js.map +1 -1
- package/dist/messenger-node.d.ts +14 -0
- package/dist/messenger-node.d.ts.map +1 -0
- package/dist/messenger-node.js +127 -0
- package/dist/messenger-node.js.map +1 -0
- package/dist/messenger-upgrade.d.ts +21 -0
- package/dist/messenger-upgrade.d.ts.map +1 -0
- package/dist/messenger-upgrade.js +136 -0
- package/dist/messenger-upgrade.js.map +1 -0
- package/dist/messenger-vite-templates.d.ts +12 -0
- package/dist/messenger-vite-templates.d.ts.map +1 -0
- package/dist/messenger-vite-templates.js +89 -0
- package/dist/messenger-vite-templates.js.map +1 -0
- package/dist/messenger.d.ts +16 -0
- package/dist/messenger.d.ts.map +1 -1
- package/dist/messenger.js +28 -1
- package/dist/messenger.js.map +1 -1
- package/legacy/0.21.0/messenger-connected-templates.js +138 -0
- package/legacy/0.21.0/messenger-customer-templates.js +111 -0
- package/legacy/0.21.0/messenger-init.js +121 -0
- package/legacy/0.21.0/messenger-install.js +243 -0
- package/legacy/0.21.0/messenger-preview-template.js +43 -0
- package/legacy/0.21.0/package.json +1 -0
- package/package.json +11 -2
package/dist/messenger-init.js
CHANGED
|
@@ -17,9 +17,12 @@ export function messengerStarterFiles(options) {
|
|
|
17
17
|
export async function authenticate(request:Request):Promise<string|null>{
|
|
18
18
|
throw Error('Connect your existing session verification in robono-access.ts');
|
|
19
19
|
}
|
|
20
|
-
// Account operations such as settings, conversations
|
|
20
|
+
// Account operations such as settings, conversations, calling.session/calling.setup,
|
|
21
|
+
// location.settings and notifications.register-device
|
|
21
22
|
// have no conversation ID. Allow them only for active, eligible accounts.
|
|
22
|
-
// Chat operations
|
|
23
|
+
// Chat operations (including calling.*, extras.* and media.*) also need current
|
|
24
|
+
// membership and the operation-specific read/write/call permission. Location viewers
|
|
25
|
+
// must follow your directed sharing grants. Do not treat all operations as message sends.
|
|
23
26
|
export async function authorize(access:MessengerAccess):Promise<boolean>{
|
|
24
27
|
throw Error('Connect your existing messaging permission check in robono-access.ts');
|
|
25
28
|
}
|
|
@@ -43,10 +46,11 @@ export function getMessenger(){
|
|
|
43
46
|
${options.framework === 'next' ? "export const runtime = 'nodejs';\n" : ''}export const GET=(request:Request)=>getMessenger().handle(request);
|
|
44
47
|
export const POST=(request:Request)=>getMessenger().handle(request);
|
|
45
48
|
`,
|
|
46
|
-
'server/synchronize-contacts.ts': `// Run on your server when your own
|
|
49
|
+
'server/synchronize-contacts.ts': `// Run on your server when your own communication permission changes.
|
|
50
|
+
// One operation synchronizes texting and calling; the services selected in Robono decide what is available.
|
|
47
51
|
// Pass the server-only messenger instance from your application. Revisions come from YOUR database.
|
|
48
|
-
export async function synchronizeFriendship(messenger:import('@robono/server').RobonoMessengerServer,friendship:{userA:string;userB:string;
|
|
49
|
-
return messenger.
|
|
52
|
+
export async function synchronizeFriendship(messenger:import('@robono/server').RobonoMessengerServer,friendship:{userA:string;userB:string;canCommunicate:boolean;revision:number}){
|
|
53
|
+
return messenger.synchronizeContact({externalUserIds:[friendship.userA,friendship.userB],allowed:friendship.canCommunicate,revision:friendship.revision});
|
|
50
54
|
}
|
|
51
55
|
`,
|
|
52
56
|
'ROBONO-SETUP.md': `# Connect ${options.companyName.replace(/[\r\n]/g, ' ')} to Robono\n\nThese are prepared integration files, not a replacement for your app. No existing files were changed.\n\n1. Install the packages listed below in the corresponding server and client projects.\n2. Copy the generated files into your app. Put the Robono key only in the server's environment.\n3. Connect the two functions in robono-access.ts to your existing sign-in and permission checks. They reject access until connected.\n4. When your app permits or removes a friendship, call synchronizeFriendship with its current revision. Supply current contact names/avatars to the client. Group memberships use messenger.robono.setGroup.\n5. Mount GET and POST at /api/robono. Add the client screen, pass your signed-in account and token-refresh function, and call its signOut() before ending a session.\n6. Run robono-messenger-check against your own route with a disposable test-user token. Then exchange a message between two authorized users.\n\nServer: npm install @robono/server\nTypeScript server: npm install --save-dev typescript @types/node\nClient: npm install @robono/messaging @robono/${options.platform === 'web' ? 'messaging-web react react-dom' : 'messaging-react-native'}\n\n${options.platform === 'expo' ? 'For React Native, follow the native dependency and Expo configuration instructions in the package README before rebuilding iPhone and Android. Your app needs its own Apple/Google notification credentials; upload private keys only in Robono’s notification setup.' : 'For website alerts, enter your HTTPS origin and chat page in Robono’s notification setup. The supplied messenger handles the browser helper. No Apple/Google private key is needed.'}\n\nKeep feature choices in Robono’s Features & preview. Do not duplicate them in frontend permission switches. Your server remains responsible for who may use the service. Never return true for every permission request.\n\n## Local connection check\nSet ROBONO_MESSENGER_URL, ROBONO_TEST_USER_TOKEN and ROBONO_WEBSITE_ORIGIN in your local environment. Then run:\n\n\`\`\`sh\nnpx --package @robono/server robono-messenger-check\n# Shareable diagnostic output; contains no token or message content:\nnpx --package @robono/server robono-messenger-check --json\n\`\`\`\n\n## Assistance\nAn AI coding assistant may use these files and package documentation to connect your existing account service. It must preserve authentication, expiry, suspension, current memberships and server-only keys. It must not replace them with a demo password or an always-allow function. Do not send credentials or customer messages to support chat.\n`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messenger-init.js","sourceRoot":"","sources":["../src/messenger-init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAA4B,MAAM,oCAAoC,CAAC;AACtG,OAAO,EAAC,KAAK,EAAC,SAAS,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,EAAE,EAAC,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAC,OAAO,EAAC,OAAO,EAAC,QAAQ,EAAC,UAAU,EAAC,IAAI,EAAC,MAAM,WAAW,CAAC;AAEnE,4FAA4F;AAC5F,MAAM,UAAU,qBAAqB,CAAC,OAA+B;IACpE,MAAM,MAAM,GAAC,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC,IAAG,MAAM,CAAC,MAAM,KAAG,OAAO,CAAC,MAAM,IAAE,MAAM,CAAC,QAAQ,IAAE,MAAM,CAAC,QAAQ,IAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,KAAG,QAAQ,IAAE,MAAM,CAAC,QAAQ,KAAG,OAAO,IAAE,CAAC,WAAW,EAAC,WAAW,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAAC,MAAM,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAC7Q,IAAG,CAAC,CAAC,KAAK,EAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAE,CAAC,CAAC,MAAM,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAE,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,IAAE,OAAO,CAAC,WAAW,CAAC,MAAM,GAAC,GAAG;QAAC,MAAM,KAAK,CAAC,4EAA4E,CAAC,CAAC;IACpP,IAAG,OAAO,CAAC,QAAQ,KAAG,MAAM,IAAE,MAAM,CAAC,QAAQ,KAAG,QAAQ;QAAC,MAAM,KAAK,CAAC,mEAAmE,CAAC,CAAC;IAC1I,MAAM,CAAC,GAAC,IAAI,CAAC,SAAS,EAAC,KAAK,GAAC,OAAO,CAAC,SAAS,KAAG,MAAM,CAAA,CAAC,CAAA,yBAAyB,CAAA,CAAC,CAAA,wBAAwB,CAAC;IAC3G,MAAM,IAAI,GAAC
|
|
1
|
+
{"version":3,"file":"messenger-init.js","sourceRoot":"","sources":["../src/messenger-init.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,13 +2,14 @@
|
|
|
2
2
|
import { createInterface } from 'node:readline/promises';
|
|
3
3
|
import { stdin, stdout } from 'node:process';
|
|
4
4
|
import { planMessengerInstallation, planMessengerInstallationResume, applyMessengerInstallation, messengerInstallationChecklist } from './messenger-install.js';
|
|
5
|
+
import { planMessengerUpgrade } from './messenger-upgrade.js';
|
|
5
6
|
import { checkRobonoMessengerSetup } from './messenger-check.js';
|
|
6
7
|
const args = process.argv.slice(2), values = {}, flags = new Set();
|
|
7
8
|
let prompt;
|
|
8
9
|
try {
|
|
9
10
|
for (let i = 0; i < args.length; i++) {
|
|
10
11
|
const arg = args[i];
|
|
11
|
-
if (['--help', '--yes', '--dry-run', '--no-install', '--check', '--json', '--resume'].includes(arg)) {
|
|
12
|
+
if (['--help', '--yes', '--dry-run', '--no-install', '--check', '--json', '--resume', '--upgrade'].includes(arg)) {
|
|
12
13
|
flags.add(arg);
|
|
13
14
|
continue;
|
|
14
15
|
}
|
|
@@ -18,15 +19,19 @@ try {
|
|
|
18
19
|
}
|
|
19
20
|
if (flags.has('--help')) {
|
|
20
21
|
console.log(`robono-messenger-install [--project .] [--server-project ../server] [--auth supabase|firebase|custom] --origin https://your-company.com --company "Your company"
|
|
21
|
-
Detects Next.js App Router or Expo 55–56, places files, and installs matching packages.
|
|
22
|
+
Detects Next.js App Router, React + Vite or Expo 55–56, places files, and installs matching packages.
|
|
22
23
|
Expo also needs a separate Next.js server and a static app.json. Existing application screens and .env files are preserved.
|
|
23
24
|
--dry-run lists the exact files and commands without changing anything.
|
|
24
25
|
--yes applies that plan without an interactive prompt. --no-install writes files only.
|
|
25
26
|
--resume finishes package installation using your saved setup, preserving all existing integration code.
|
|
27
|
+
--upgrade updates unchanged generated files, backs them up, and saves proposals for edited files. Use --dry-run first to review.
|
|
28
|
+
React + Vite includes a Node server: npm --prefix .robono run dev / build / start. No Next.js server is needed.
|
|
26
29
|
--check shows one setup checklist; set the three ROBONO_* test variables to include live checks. --json prints a shareable checklist.
|
|
27
30
|
The development-only /robono-preview route uses fictional people and never sends messages outside the page.`);
|
|
28
31
|
}
|
|
29
32
|
else if (flags.has('--check')) {
|
|
33
|
+
if (flags.has('--upgrade') || flags.has('--resume'))
|
|
34
|
+
throw Error('Choose --check, --upgrade or --resume separately.');
|
|
30
35
|
let checks = await messengerInstallationChecklist(values['--project'] ?? '.');
|
|
31
36
|
const endpoint = process.env.ROBONO_MESSENGER_URL, origin = process.env.ROBONO_WEBSITE_ORIGIN, accessToken = process.env.ROBONO_TEST_USER_TOKEN;
|
|
32
37
|
if (endpoint && origin && accessToken) {
|
|
@@ -52,17 +57,22 @@ The development-only /robono-preview route uses fictional people and never sends
|
|
|
52
57
|
const ask = async (key, label) => values[key] ?? (prompt ? (await prompt.question(label + ': ')).trim() : undefined);
|
|
53
58
|
if (flags.has('--resume') && (flags.has('--no-install') || Object.keys(values).some(key => key !== '--project')))
|
|
54
59
|
throw Error('Use --resume with your existing --project only. It preserves the saved setup.');
|
|
55
|
-
const
|
|
56
|
-
if (
|
|
60
|
+
const existing = flags.has('--resume') || flags.has('--upgrade');
|
|
61
|
+
if (flags.has('--resume') && flags.has('--upgrade'))
|
|
62
|
+
throw Error('Choose --resume or --upgrade.');
|
|
63
|
+
if (flags.has('--upgrade') && Object.keys(values).some(key => !['--project', '--company'].includes(key)))
|
|
64
|
+
throw Error('Upgrade uses the saved installation. Only --project and a missing legacy --company may be supplied.');
|
|
65
|
+
const origin = existing ? undefined : await ask('--origin', 'Website/server origin (for example https://your-company.com)'), companyName = existing ? undefined : await ask('--company', 'Company name');
|
|
66
|
+
if (!existing && (!origin || !companyName))
|
|
57
67
|
throw Error('Supply --origin and --company, or run interactively.');
|
|
58
68
|
const auth = values['--auth'];
|
|
59
69
|
if (auth && !['custom', 'supabase', 'firebase'].includes(auth))
|
|
60
70
|
throw Error('Choose custom, supabase or firebase.');
|
|
61
|
-
const plan = flags.has('--resume') ? await planMessengerInstallationResume(values['--project'] ?? '.') : await planMessengerInstallation({ project: values['--project'] ?? '.', origin: origin, companyName: companyName, ...(values['--server-project'] ? { serverProject: values['--server-project'] } : {}), ...(auth ? { auth: auth } : {}) });
|
|
71
|
+
const plan = flags.has('--upgrade') ? await planMessengerUpgrade(values['--project'] ?? '.', values['--company'] ? { companyName: values['--company'] } : {}) : flags.has('--resume') ? await planMessengerInstallationResume(values['--project'] ?? '.') : await planMessengerInstallation({ project: values['--project'] ?? '.', origin: origin, companyName: companyName, ...(values['--server-project'] ? { serverProject: values['--server-project'] } : {}), ...(auth ? { auth: auth } : {}) });
|
|
62
72
|
for (const file of plan.files)
|
|
63
73
|
console.log('Create: ' + file.path);
|
|
64
74
|
for (const file of plan.replacements)
|
|
65
|
-
console.log('
|
|
75
|
+
console.log('Update: ' + file.path);
|
|
66
76
|
for (const command of plan.commands)
|
|
67
77
|
console.log(`Install in ${command.cwd}: ${command.command} ${command.args.join(' ')}`);
|
|
68
78
|
for (const note of plan.notes)
|
|
@@ -71,6 +81,13 @@ The development-only /robono-preview route uses fictional people and never sends
|
|
|
71
81
|
if (!flags.has('--yes') && (!prompt || !/^y(es)?$/i.test((await prompt.question('Apply this plan? [y/N] ')).trim())))
|
|
72
82
|
throw Error('Nothing changed. Use --yes to apply the displayed plan.');
|
|
73
83
|
await applyMessengerInstallation(plan, !flags.has('--no-install'));
|
|
84
|
+
if ('upgradeReport' in plan) {
|
|
85
|
+
const report = plan.upgradeReport;
|
|
86
|
+
if (report.conflicts.length) {
|
|
87
|
+
console.log('Your edited files were preserved. Review .robono/upgrade-report.json before treating the upgrade as complete.');
|
|
88
|
+
process.exitCode = 2;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
74
91
|
console.log('Integration files are ready. Open .robono/SETUP.md. Add CustomerMessenger to your screen; its optional setupChecks button checks your current login without copied tokens. Run --check for the local checklist. Nothing was deployed.');
|
|
75
92
|
}
|
|
76
93
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messenger-install-cli.js","sourceRoot":"","sources":["../src/messenger-install-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,eAAe,EAAC,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAC,KAAK,EAAC,MAAM,EAAC,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAC,yBAAyB,EAAC,+BAA+B,EAAC,0BAA0B,EAAC,8BAA8B,EAAC,MAAM,wBAAwB,CAAC;AAC3J,OAAO,EAAC,yBAAyB,EAAC,MAAM,sBAAsB,CAAC;AAC/D,MAAM,IAAI,GAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,MAAM,GAAuB,EAAE,EAAC,KAAK,GAAC,IAAI,GAAG,EAAU,CAAC;AACzF,IAAI,MAAmD,CAAC;AACxD,IAAG,CAAC;IACH,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,IAAI,CAAC,MAAM,EAAC,CAAC,EAAE,EAAC,CAAC;QAC9B,MAAM,GAAG,GAAC,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAG,CAAC,QAAQ,EAAC,OAAO,EAAC,WAAW,EAAC,cAAc,EAAC,SAAS,EAAC,QAAQ,EAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAC,CAAC;YAAA,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAAA,SAAS;QAAA,CAAC;
|
|
1
|
+
{"version":3,"file":"messenger-install-cli.js","sourceRoot":"","sources":["../src/messenger-install-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,10 +25,20 @@ export interface MessengerInstallPlan {
|
|
|
25
25
|
notes: string[];
|
|
26
26
|
setupFile?: string;
|
|
27
27
|
}
|
|
28
|
+
export declare const messengerInstallerVersion = "0.23.0";
|
|
29
|
+
export declare const generatedHash: (content: string) => string;
|
|
30
|
+
export declare function generatedKey(file: string, client: string, server: string): string;
|
|
31
|
+
export declare function exists(file: string): Promise<boolean>;
|
|
32
|
+
export declare function safePath(file: string): Promise<void>;
|
|
33
|
+
export declare function readMessengerSetup(file: string): Promise<{
|
|
34
|
+
text: string;
|
|
35
|
+
setup: any;
|
|
36
|
+
}>;
|
|
28
37
|
export declare function planMessengerInstallation(options: MessengerInstallOptions): Promise<MessengerInstallPlan>;
|
|
38
|
+
export declare function buildMessengerInstallation(options: MessengerInstallOptions, mode: 'new' | 'resume' | 'upgrade'): Promise<MessengerInstallPlan>;
|
|
29
39
|
/** Reconstruct trusted package commands; never execute commands from saved metadata. */
|
|
30
40
|
export declare function planMessengerInstallationResume(directory: string): Promise<MessengerInstallPlan>;
|
|
31
|
-
/** Preflight
|
|
41
|
+
/** Preflight, exclusive installer lock, atomic replacements and recoverable rollback. */
|
|
32
42
|
export declare function applyMessengerInstallation(plan: MessengerInstallPlan, install?: boolean): Promise<void>;
|
|
33
43
|
export declare function messengerInstallationChecklist(directory: string): Promise<{
|
|
34
44
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messenger-install.d.ts","sourceRoot":"","sources":["../src/messenger-install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"messenger-install.d.ts","sourceRoot":"","sources":["../src/messenger-install.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,uBAAuB;IAAE,OAAO,EAAC,MAAM,CAAC;IAAA,aAAa,CAAC,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,WAAW,EAAC,MAAM,CAAC;IAAA,IAAI,CAAC,EAAC,QAAQ,GAAC,UAAU,GAAC,UAAU,CAAA;CAAC;AAErJ,MAAM,WAAW,oBAAoB;IAAE,QAAQ,EAAC,KAAK,GAAC,MAAM,CAAC;IAAA,IAAI,EAAC,QAAQ,GAAC,UAAU,GAAC,UAAU,CAAC;IAAA,KAAK,EAAC;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;IAAA,YAAY,EAAC;QAAC,IAAI,EAAC,MAAM,CAAC;QAAA,MAAM,EAAC,MAAM,CAAC;QAAA,KAAK,EAAC,MAAM,CAAA;KAAC,EAAE,CAAC;IAAA,QAAQ,EAAC;QAAC,GAAG,EAAC,MAAM,CAAC;QAAA,OAAO,EAAC,MAAM,CAAC;QAAA,IAAI,EAAC,MAAM,EAAE,CAAA;KAAC,EAAE,CAAC;IAAA,KAAK,EAAC,MAAM,EAAE,CAAC;IAAA,SAAS,CAAC,EAAC,MAAM,CAAA;CAAC;AACpR,eAAO,MAAM,yBAAyB,WAAS,CAAC;AAChD,eAAO,MAAM,aAAa,GAAE,SAAQ,MAAM,WAAqD,CAAC;AAChG,wBAAgB,YAAY,CAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,EAAC,MAAM,UAInE;AAOD,wBAAsB,MAAM,CAAC,IAAI,EAAC,MAAM,oBAAqH;AAO7J,wBAAsB,QAAQ,CAAC,IAAI,EAAC,MAAM,iBAGzC;AACD,wBAAsB,kBAAkB,CAAC,IAAI,EAAC,MAAM;;;GAMnD;AAkBD,wBAAsB,yBAAyB,CAAC,OAAO,EAAC,uBAAuB,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAE7G;AACD,wBAAsB,0BAA0B,CAAC,OAAO,EAAC,uBAAuB,EAAC,IAAI,EAAC,KAAK,GAAC,QAAQ,GAAC,SAAS,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAsF5I;AACD,wFAAwF;AACxF,wBAAsB,+BAA+B,CAAC,SAAS,EAAC,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAC,CAYpG;AAaD,yFAAyF;AACzF,wBAAsB,0BAA0B,CAAC,IAAI,EAAC,oBAAoB,EAAC,OAAO,UAAK,iBAoCtF;AACD,wBAAsB,8BAA8B,CAAC,SAAS,EAAC,MAAM;;;;KAoBpE"}
|