@atlasauth/emulator-core 0.1.0 → 0.3.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/dist/adopt.d.ts +50 -0
- package/dist/adopt.js +57 -0
- package/dist/adopt.js.map +1 -0
- package/dist/coverage.d.ts +15 -0
- package/dist/coverage.js +31 -0
- package/dist/coverage.js.map +1 -0
- package/dist/crypto-util.d.ts +10 -0
- package/dist/crypto-util.js +76 -0
- package/dist/crypto-util.js.map +1 -0
- package/dist/custom-html.d.ts +57 -0
- package/dist/custom-html.js +491 -0
- package/dist/custom-html.js.map +1 -0
- package/dist/engine.d.ts +34 -3
- package/dist/engine.js +57 -8
- package/dist/engine.js.map +1 -1
- package/dist/error-catalog.js +16 -0
- package/dist/error-catalog.js.map +1 -1
- package/dist/event-gate.d.ts +3 -0
- package/dist/event-gate.js +430 -0
- package/dist/event-gate.js.map +1 -0
- package/dist/generic.js +14 -2
- package/dist/generic.js.map +1 -1
- package/dist/handlers/access-signals.d.ts +48 -0
- package/dist/handlers/access-signals.js +76 -0
- package/dist/handlers/access-signals.js.map +1 -0
- package/dist/handlers/approvals.d.ts +2 -0
- package/dist/handlers/approvals.js +418 -0
- package/dist/handlers/approvals.js.map +1 -0
- package/dist/handlers/authz-data.d.ts +2 -0
- package/dist/handlers/authz-data.js +627 -0
- package/dist/handlers/authz-data.js.map +1 -0
- package/dist/handlers/authz-layers.d.ts +229 -0
- package/dist/handlers/authz-layers.js +786 -0
- package/dist/handlers/authz-layers.js.map +1 -0
- package/dist/handlers/authz-state.d.ts +80 -0
- package/dist/handlers/authz-state.js +175 -0
- package/dist/handlers/authz-state.js.map +1 -0
- package/dist/handlers/authz.d.ts +2 -0
- package/dist/handlers/authz.js +410 -0
- package/dist/handlers/authz.js.map +1 -0
- package/dist/handlers/billing.d.ts +100 -0
- package/dist/handlers/billing.js +877 -0
- package/dist/handlers/billing.js.map +1 -0
- package/dist/handlers/cedar-ext.d.ts +35 -0
- package/dist/handlers/cedar-ext.js +174 -0
- package/dist/handlers/cedar-ext.js.map +1 -0
- package/dist/handlers/cedar.d.ts +146 -0
- package/dist/handlers/cedar.js +689 -0
- package/dist/handlers/cedar.js.map +1 -0
- package/dist/handlers/connections.d.ts +5 -0
- package/dist/handlers/connections.js +561 -0
- package/dist/handlers/connections.js.map +1 -0
- package/dist/handlers/control.js +6 -1
- package/dist/handlers/control.js.map +1 -1
- package/dist/handlers/device.d.ts +47 -0
- package/dist/handlers/device.js +665 -0
- package/dist/handlers/device.js.map +1 -0
- package/dist/handlers/emu3-misc.d.ts +38 -0
- package/dist/handlers/emu3-misc.js +1056 -0
- package/dist/handlers/emu3-misc.js.map +1 -0
- package/dist/handlers/emu4-actions-access.d.ts +46 -0
- package/dist/handlers/emu4-actions-access.js +107 -0
- package/dist/handlers/emu4-actions-access.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog-extra.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog-extra.js +204 -0
- package/dist/handlers/emu4-actions-catalog-extra.js.map +1 -0
- package/dist/handlers/emu4-actions-catalog.d.ts +3 -0
- package/dist/handlers/emu4-actions-catalog.js +143 -0
- package/dist/handlers/emu4-actions-catalog.js.map +1 -0
- package/dist/handlers/emu4-actions-def.d.ts +50 -0
- package/dist/handlers/emu4-actions-def.js +250 -0
- package/dist/handlers/emu4-actions-def.js.map +1 -0
- package/dist/handlers/emu4-actions-sandbox.d.ts +36 -0
- package/dist/handlers/emu4-actions-sandbox.js +318 -0
- package/dist/handlers/emu4-actions-sandbox.js.map +1 -0
- package/dist/handlers/emu4-actions-typegen.d.ts +5 -0
- package/dist/handlers/emu4-actions-typegen.js +73 -0
- package/dist/handlers/emu4-actions-typegen.js.map +1 -0
- package/dist/handlers/emu4-actions.d.ts +2 -0
- package/dist/handlers/emu4-actions.js +506 -0
- package/dist/handlers/emu4-actions.js.map +1 -0
- package/dist/handlers/emu4-authz-trust.d.ts +40 -0
- package/dist/handlers/emu4-authz-trust.js +488 -0
- package/dist/handlers/emu4-authz-trust.js.map +1 -0
- package/dist/handlers/emu4-authz.d.ts +2 -0
- package/dist/handlers/emu4-authz.js +752 -0
- package/dist/handlers/emu4-authz.js.map +1 -0
- package/dist/handlers/emu4-billing-core.d.ts +23 -0
- package/dist/handlers/emu4-billing-core.js +22 -0
- package/dist/handlers/emu4-billing-core.js.map +1 -0
- package/dist/handlers/emu4-billing-x.d.ts +2 -0
- package/dist/handlers/emu4-billing-x.js +489 -0
- package/dist/handlers/emu4-billing-x.js.map +1 -0
- package/dist/handlers/emu4-billing.d.ts +14 -0
- package/dist/handlers/emu4-billing.js +846 -0
- package/dist/handlers/emu4-billing.js.map +1 -0
- package/dist/handlers/emu4-clones.d.ts +2 -0
- package/dist/handlers/emu4-clones.js +322 -0
- package/dist/handlers/emu4-clones.js.map +1 -0
- package/dist/handlers/emu4-compliance.d.ts +8 -0
- package/dist/handlers/emu4-compliance.js +39 -0
- package/dist/handlers/emu4-compliance.js.map +1 -0
- package/dist/handlers/emu4-config.d.ts +14 -0
- package/dist/handlers/emu4-config.js +148 -0
- package/dist/handlers/emu4-config.js.map +1 -0
- package/dist/handlers/emu4-cookies.d.ts +8 -0
- package/dist/handlers/emu4-cookies.js +248 -0
- package/dist/handlers/emu4-cookies.js.map +1 -0
- package/dist/handlers/emu4-erasure.d.ts +2 -0
- package/dist/handlers/emu4-erasure.js +587 -0
- package/dist/handlers/emu4-erasure.js.map +1 -0
- package/dist/handlers/emu4-federation.d.ts +8 -0
- package/dist/handlers/emu4-federation.js +18 -0
- package/dist/handlers/emu4-federation.js.map +1 -0
- package/dist/handlers/emu4-journey-math.d.ts +42 -0
- package/dist/handlers/emu4-journey-math.js +99 -0
- package/dist/handlers/emu4-journey-math.js.map +1 -0
- package/dist/handlers/emu4-messaging.d.ts +21 -0
- package/dist/handlers/emu4-messaging.js +595 -0
- package/dist/handlers/emu4-messaging.js.map +1 -0
- package/dist/handlers/emu4-minors.d.ts +7 -0
- package/dist/handlers/emu4-minors.js +408 -0
- package/dist/handlers/emu4-minors.js.map +1 -0
- package/dist/handlers/emu4-oauth-audit.d.ts +5 -0
- package/dist/handlers/emu4-oauth-audit.js +17 -0
- package/dist/handlers/emu4-oauth-audit.js.map +1 -0
- package/dist/handlers/emu4-oauth-auth.d.ts +83 -0
- package/dist/handlers/emu4-oauth-auth.js +363 -0
- package/dist/handlers/emu4-oauth-auth.js.map +1 -0
- package/dist/handlers/emu4-oauth-delivery.d.ts +68 -0
- package/dist/handlers/emu4-oauth-delivery.js +207 -0
- package/dist/handlers/emu4-oauth-delivery.js.map +1 -0
- package/dist/handlers/emu4-oauth-keys.d.ts +11 -0
- package/dist/handlers/emu4-oauth-keys.js +268 -0
- package/dist/handlers/emu4-oauth-keys.js.map +1 -0
- package/dist/handlers/emu4-oauth-pub.d.ts +36 -0
- package/dist/handlers/emu4-oauth-pub.js +420 -0
- package/dist/handlers/emu4-oauth-pub.js.map +1 -0
- package/dist/handlers/emu4-oauth.d.ts +10 -0
- package/dist/handlers/emu4-oauth.js +23 -0
- package/dist/handlers/emu4-oauth.js.map +1 -0
- package/dist/handlers/emu4-policies.d.ts +2 -0
- package/dist/handlers/emu4-policies.js +408 -0
- package/dist/handlers/emu4-policies.js.map +1 -0
- package/dist/handlers/emu4-region.d.ts +2 -0
- package/dist/handlers/emu4-region.js +189 -0
- package/dist/handlers/emu4-region.js.map +1 -0
- package/dist/handlers/emu4-saml.d.ts +12 -0
- package/dist/handlers/emu4-saml.js +532 -0
- package/dist/handlers/emu4-saml.js.map +1 -0
- package/dist/handlers/emu4-shared.d.ts +44 -0
- package/dist/handlers/emu4-shared.js +90 -0
- package/dist/handlers/emu4-shared.js.map +1 -0
- package/dist/handlers/emu4-snapshots.d.ts +38 -0
- package/dist/handlers/emu4-snapshots.js +231 -0
- package/dist/handlers/emu4-snapshots.js.map +1 -0
- package/dist/handlers/emu4-sns.d.ts +9 -0
- package/dist/handlers/emu4-sns.js +21 -0
- package/dist/handlers/emu4-sns.js.map +1 -0
- package/dist/handlers/emu4-trust-binding.d.ts +27 -0
- package/dist/handlers/emu4-trust-binding.js +344 -0
- package/dist/handlers/emu4-trust-binding.js.map +1 -0
- package/dist/handlers/emu4-trust.d.ts +35 -0
- package/dist/handlers/emu4-trust.js +543 -0
- package/dist/handlers/emu4-trust.js.map +1 -0
- package/dist/handlers/federation.d.ts +2 -0
- package/dist/handlers/federation.js +481 -0
- package/dist/handlers/federation.js.map +1 -0
- package/dist/handlers/fga-engine.d.ts +78 -0
- package/dist/handlers/fga-engine.js +663 -0
- package/dist/handlers/fga-engine.js.map +1 -0
- package/dist/handlers/governance.d.ts +2 -0
- package/dist/handlers/governance.js +460 -0
- package/dist/handlers/governance.js.map +1 -0
- package/dist/handlers/hooks.js +17 -1
- package/dist/handlers/hooks.js.map +1 -1
- package/dist/handlers/index.d.ts +5 -1
- package/dist/handlers/index.js +45 -3
- package/dist/handlers/index.js.map +1 -1
- package/dist/handlers/keys.js +6 -1
- package/dist/handlers/keys.js.map +1 -1
- package/dist/handlers/machines.js +61 -8
- package/dist/handlers/machines.js.map +1 -1
- package/dist/handlers/messaging.d.ts +6 -0
- package/dist/handlers/messaging.js +893 -0
- package/dist/handlers/messaging.js.map +1 -0
- package/dist/handlers/oauth-adv.d.ts +191 -0
- package/dist/handlers/oauth-adv.js +1305 -0
- package/dist/handlers/oauth-adv.js.map +1 -0
- package/dist/handlers/oauth-flows.d.ts +52 -0
- package/dist/handlers/oauth-flows.js +480 -0
- package/dist/handlers/oauth-flows.js.map +1 -0
- package/dist/handlers/oauth.d.ts +96 -0
- package/dist/handlers/oauth.js +793 -0
- package/dist/handlers/oauth.js.map +1 -0
- package/dist/handlers/orgs.js +6 -0
- package/dist/handlers/orgs.js.map +1 -1
- package/dist/handlers/passkeys.d.ts +3 -0
- package/dist/handlers/passkeys.js +293 -0
- package/dist/handlers/passkeys.js.map +1 -0
- package/dist/handlers/platform.d.ts +20 -0
- package/dist/handlers/platform.js +472 -0
- package/dist/handlers/platform.js.map +1 -0
- package/dist/handlers/round2.d.ts +8 -0
- package/dist/handlers/round2.js +372 -0
- package/dist/handlers/round2.js.map +1 -0
- package/dist/handlers/scim.d.ts +4 -0
- package/dist/handlers/scim.js +595 -0
- package/dist/handlers/scim.js.map +1 -0
- package/dist/handlers/sessions.d.ts +9 -3
- package/dist/handlers/sessions.js +76 -38
- package/dist/handlers/sessions.js.map +1 -1
- package/dist/handlers/support.d.ts +20 -0
- package/dist/handlers/support.js +62 -0
- package/dist/handlers/support.js.map +1 -0
- package/dist/handlers/users.js +7 -0
- package/dist/handlers/users.js.map +1 -1
- package/dist/handlers/workflows.d.ts +2 -0
- package/dist/handlers/workflows.js +428 -0
- package/dist/handlers/workflows.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +23 -1
- package/dist/index.js.map +1 -1
- package/dist/jwe.d.ts +18 -0
- package/dist/jwe.js +101 -0
- package/dist/jwe.js.map +1 -0
- package/dist/jws.d.ts +41 -0
- package/dist/jws.js +135 -0
- package/dist/jws.js.map +1 -0
- package/dist/messages.d.ts +7 -0
- package/dist/messages.js +8 -4
- package/dist/messages.js.map +1 -1
- package/dist/messaging-callbacks.d.ts +100 -0
- package/dist/messaging-callbacks.js +767 -0
- package/dist/messaging-callbacks.js.map +1 -0
- package/dist/openapi.js +41 -1
- package/dist/openapi.js.map +1 -1
- package/dist/parity-bin.js +3 -1
- package/dist/parity-bin.js.map +1 -1
- package/dist/parity-emu3-authz.d.ts +3 -0
- package/dist/parity-emu3-authz.js +61 -0
- package/dist/parity-emu3-authz.js.map +1 -0
- package/dist/parity-emu3-billing.d.ts +3 -0
- package/dist/parity-emu3-billing.js +25 -0
- package/dist/parity-emu3-billing.js.map +1 -0
- package/dist/parity-emu3-messaging.d.ts +3 -0
- package/dist/parity-emu3-messaging.js +27 -0
- package/dist/parity-emu3-messaging.js.map +1 -0
- package/dist/parity-emu3-misc.d.ts +2 -0
- package/dist/parity-emu3-misc.js +63 -0
- package/dist/parity-emu3-misc.js.map +1 -0
- package/dist/parity-emu3-oauth.d.ts +2 -0
- package/dist/parity-emu3-oauth.js +39 -0
- package/dist/parity-emu3-oauth.js.map +1 -0
- package/dist/parity-emu4-actions.d.ts +2 -0
- package/dist/parity-emu4-actions.js +38 -0
- package/dist/parity-emu4-actions.js.map +1 -0
- package/dist/parity-emu4-authz.d.ts +3 -0
- package/dist/parity-emu4-authz.js +68 -0
- package/dist/parity-emu4-authz.js.map +1 -0
- package/dist/parity-emu4-billing.d.ts +6 -0
- package/dist/parity-emu4-billing.js +44 -0
- package/dist/parity-emu4-billing.js.map +1 -0
- package/dist/parity-emu4-compliance.d.ts +2 -0
- package/dist/parity-emu4-compliance.js +92 -0
- package/dist/parity-emu4-compliance.js.map +1 -0
- package/dist/parity-emu4-federation.d.ts +2 -0
- package/dist/parity-emu4-federation.js +33 -0
- package/dist/parity-emu4-federation.js.map +1 -0
- package/dist/parity-emu4-messaging.d.ts +3 -0
- package/dist/parity-emu4-messaging.js +42 -0
- package/dist/parity-emu4-messaging.js.map +1 -0
- package/dist/parity-emu4-oauth.d.ts +2 -0
- package/dist/parity-emu4-oauth.js +55 -0
- package/dist/parity-emu4-oauth.js.map +1 -0
- package/dist/parity-emu4-trust.d.ts +2 -0
- package/dist/parity-emu4-trust.js +41 -0
- package/dist/parity-emu4-trust.js.map +1 -0
- package/dist/parity-routes.d.ts +14 -0
- package/dist/parity-routes.js +439 -0
- package/dist/parity-routes.js.map +1 -0
- package/dist/parity.d.ts +10 -3
- package/dist/parity.js +14 -5
- package/dist/parity.js.map +1 -1
- package/dist/sns-cert.d.ts +9 -0
- package/dist/sns-cert.js +101 -0
- package/dist/sns-cert.js.map +1 -0
- package/dist/tokens.d.ts +85 -3
- package/dist/tokens.js +196 -24
- package/dist/tokens.js.map +1 -1
- package/dist/webauthn-virtual.d.ts +70 -0
- package/dist/webauthn-virtual.js +186 -0
- package/dist/webauthn-virtual.js.map +1 -0
- package/dist/webhook-ext.d.ts +16 -0
- package/dist/webhook-ext.js +218 -0
- package/dist/webhook-ext.js.map +1 -0
- package/dist/webhooks.d.ts +3 -0
- package/dist/webhooks.js +37 -3
- package/dist/webhooks.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.authzHandlers = authzHandlers;
|
|
4
|
+
const errors_1 = require("../errors");
|
|
5
|
+
const access_signals_1 = require("./access-signals");
|
|
6
|
+
const cedar_1 = require("./cedar");
|
|
7
|
+
const authz_layers_1 = require("./authz-layers");
|
|
8
|
+
const authz_state_1 = require("./authz-state");
|
|
9
|
+
const support_1 = require("./support");
|
|
10
|
+
const util_1 = require("./util");
|
|
11
|
+
/**
|
|
12
|
+
* Authorization introspection on the engine's own state: `POST /v1/authz/explain` (why a user has or lacks a permission,
|
|
13
|
+
* asked of all seven layers: organization and app roles, groups, resource roles, ABAC, access policies and FGA tuples),
|
|
14
|
+
* `POST /v1/authz/rbac/check` (the role check, written to the decision log), `POST /v1/authz/what_if` (replay the logged
|
|
15
|
+
* role, ABAC and FGA decisions under a candidate change and see what flips), managed FGA sync (memberships, org roles and
|
|
16
|
+
* groups become tuples in one store, live on every change, with backfill, runs and purge) and the authorization event feed.
|
|
17
|
+
* The data the layers read is written by the routes in authz-data.
|
|
18
|
+
*/
|
|
19
|
+
const MAX_WAIT_MS = 25_000;
|
|
20
|
+
const REPLAY_LIMIT_DEFAULT = 2000;
|
|
21
|
+
const REPLAY_LIMIT_MAX = 10_000;
|
|
22
|
+
const SAMPLE_CAP = 50;
|
|
23
|
+
const bad = (message, param) => new errors_1.EmulatorError('VALIDATION_FAILED', message, param);
|
|
24
|
+
const obj = (v, field) => {
|
|
25
|
+
if (v === undefined || v === null)
|
|
26
|
+
return {};
|
|
27
|
+
if (typeof v !== 'object' || Array.isArray(v))
|
|
28
|
+
throw bad(`${field} must be an object.`, field);
|
|
29
|
+
return v;
|
|
30
|
+
};
|
|
31
|
+
const strList = (v, field) => {
|
|
32
|
+
if (v === undefined)
|
|
33
|
+
return [];
|
|
34
|
+
if (!Array.isArray(v) || v.some((x) => typeof x !== 'string' || !x))
|
|
35
|
+
throw bad(`${field} must be a list of strings.`, field);
|
|
36
|
+
return v;
|
|
37
|
+
};
|
|
38
|
+
const tupleList = (v, field) => {
|
|
39
|
+
if (v === undefined)
|
|
40
|
+
return [];
|
|
41
|
+
if (!Array.isArray(v))
|
|
42
|
+
throw bad(`${field} must be a list of tuples.`, field);
|
|
43
|
+
return v.map((t, i) => {
|
|
44
|
+
const o = obj(t, `${field}[${i}]`);
|
|
45
|
+
if (typeof o.user !== 'string' || typeof o.relation !== 'string' || typeof (o.object ?? o.target) !== 'string')
|
|
46
|
+
throw bad(`${field}[${i}] requires user, relation and object.`, field);
|
|
47
|
+
if (!/^[^:#]+:[^#]+(#[^#]+)?$/.test(o.user))
|
|
48
|
+
throw bad(`${field}[${i}].user is malformed.`, field);
|
|
49
|
+
return { user: o.user, relation: o.relation, object: (o.object ?? o.target) };
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
const policySources = (v, field) => {
|
|
53
|
+
if (v === undefined)
|
|
54
|
+
return [];
|
|
55
|
+
if (!Array.isArray(v))
|
|
56
|
+
throw bad(`${field} must be a list.`, field);
|
|
57
|
+
return v.map((p, i) => {
|
|
58
|
+
const o = obj(p, `${field}[${i}]`);
|
|
59
|
+
if (typeof o.name !== 'string' || !o.name || typeof o.source !== 'string' || !o.source)
|
|
60
|
+
throw bad(`${field}[${i}] needs name and source.`, field);
|
|
61
|
+
try {
|
|
62
|
+
(0, cedar_1.parseCedar)(o.source);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
if (err instanceof cedar_1.CedarParseError)
|
|
66
|
+
throw bad(`${field}[${i}].source: ${err.message} (at character ${err.position})`, field);
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
return { name: o.name, source: o.source };
|
|
70
|
+
});
|
|
71
|
+
};
|
|
72
|
+
const time = (v, field) => {
|
|
73
|
+
if (v === undefined || v === null)
|
|
74
|
+
return undefined;
|
|
75
|
+
const t = typeof v === 'number' ? v : typeof v === 'string' ? Date.parse(v) : NaN;
|
|
76
|
+
if (Number.isNaN(t))
|
|
77
|
+
throw bad(`${field} must be a millisecond timestamp or an ISO date.`, field);
|
|
78
|
+
return t;
|
|
79
|
+
};
|
|
80
|
+
function parseCandidate(cand) {
|
|
81
|
+
const out = {};
|
|
82
|
+
if (cand.abac !== undefined) {
|
|
83
|
+
const a = obj(cand.abac, 'candidate.abac');
|
|
84
|
+
out.abac = { add: policySources(a.add, 'candidate.abac.add'), replace: policySources(a.replace, 'candidate.abac.replace'), remove: strList(a.remove, 'candidate.abac.remove') };
|
|
85
|
+
}
|
|
86
|
+
if (cand.rbac !== undefined) {
|
|
87
|
+
const r = obj(cand.rbac, 'candidate.rbac');
|
|
88
|
+
if (!Array.isArray(r.roles) || r.roles.length === 0 || r.roles.length > 200)
|
|
89
|
+
throw bad('candidate.rbac.roles must list 1-200 role edits.', 'candidate.rbac.roles');
|
|
90
|
+
out.rbac = {
|
|
91
|
+
roles: r.roles.map((x, i) => {
|
|
92
|
+
const o = obj(x, `candidate.rbac.roles[${i}]`);
|
|
93
|
+
if (o.type !== 'org_role' && o.type !== 'app_role')
|
|
94
|
+
throw bad('type must be org_role or app_role.', `candidate.rbac.roles[${i}].type`);
|
|
95
|
+
if (typeof o.key !== 'string' || !o.key)
|
|
96
|
+
throw bad('key is required.', `candidate.rbac.roles[${i}].key`);
|
|
97
|
+
return { type: o.type, key: o.key, organizationId: typeof o.organization_id === 'string' ? o.organization_id : undefined, addPermissions: strList(o.add_permissions, 'add_permissions'), removePermissions: strList(o.remove_permissions, 'remove_permissions') };
|
|
98
|
+
}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
if (cand.fga !== undefined) {
|
|
102
|
+
const f = obj(cand.fga, 'candidate.fga');
|
|
103
|
+
if (typeof f.store_id !== 'string' || !f.store_id)
|
|
104
|
+
throw bad('candidate.fga.store_id is required.', 'candidate.fga.store_id');
|
|
105
|
+
out.fga = { storeId: f.store_id, writes: tupleList(f.writes, 'candidate.fga.writes'), deletes: tupleList(f.deletes, 'candidate.fga.deletes') };
|
|
106
|
+
}
|
|
107
|
+
if (cand.access_policy !== undefined)
|
|
108
|
+
out.accessPolicy = obj(obj(cand.access_policy, 'candidate.access_policy').draft ?? cand.access_policy, 'candidate.access_policy.draft');
|
|
109
|
+
if (!out.abac && !out.rbac && !out.fga && !out.accessPolicy)
|
|
110
|
+
throw bad('candidate needs at least one of abac, rbac, fga, access_policy.', 'candidate');
|
|
111
|
+
return out;
|
|
112
|
+
}
|
|
113
|
+
function runWhatIf(e, body) {
|
|
114
|
+
const c = parseCandidate(obj(body.candidate, 'candidate'));
|
|
115
|
+
const until = time(body.until, 'until') ?? e.clock.now();
|
|
116
|
+
let since = time(body.since, 'since');
|
|
117
|
+
if (since === undefined) {
|
|
118
|
+
const days = body.days === undefined ? 7 : body.days;
|
|
119
|
+
if (!Number.isInteger(days) || days < 1 || days > 30)
|
|
120
|
+
throw bad('days must be an integer from 1 to 30.', 'days');
|
|
121
|
+
since = until - days * 86_400_000;
|
|
122
|
+
}
|
|
123
|
+
if (since >= until)
|
|
124
|
+
throw bad('since must be before until.', 'since');
|
|
125
|
+
if (until - since > 31 * 86_400_000)
|
|
126
|
+
throw bad('The window can be at most 31 days.', 'since');
|
|
127
|
+
const limit = body.limit === undefined ? REPLAY_LIMIT_DEFAULT : body.limit;
|
|
128
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > REPLAY_LIMIT_MAX)
|
|
129
|
+
throw bad(`limit must be an integer from 1 to ${REPLAY_LIMIT_MAX}.`, 'limit');
|
|
130
|
+
if (body.name !== undefined && (typeof body.name !== 'string' || body.name.length > 200))
|
|
131
|
+
throw bad('name must be a string of at most 200 characters.', 'name');
|
|
132
|
+
if (body.save !== undefined && typeof body.save !== 'boolean')
|
|
133
|
+
throw bad('save must be a boolean.', 'save');
|
|
134
|
+
if (c.fga && !(0, authz_state_1.storeExists)(e, c.fga.storeId))
|
|
135
|
+
throw bad('Unknown FGA store.', 'candidate.fga.store_id');
|
|
136
|
+
if (c.fga && !(0, authz_layers_1.latestModel)(e, c.fga.storeId))
|
|
137
|
+
throw bad('The FGA store has no authorization model.', 'candidate.fga.store_id');
|
|
138
|
+
const by = {};
|
|
139
|
+
const skippedBy = {};
|
|
140
|
+
const skip = (reason) => void (skippedBy[reason] = (skippedBy[reason] ?? 0) + 1);
|
|
141
|
+
const flips = [];
|
|
142
|
+
const principals = new Set();
|
|
143
|
+
let replayed = 0;
|
|
144
|
+
const note = (row, before, after, mismatch) => {
|
|
145
|
+
replayed++;
|
|
146
|
+
const s = (by[row.source] ??= { replayed: 0, unchanged: 0, allow_to_deny: 0, deny_to_allow: 0, baseline_mismatch: 0 });
|
|
147
|
+
s.replayed++;
|
|
148
|
+
if (mismatch)
|
|
149
|
+
s.baseline_mismatch++;
|
|
150
|
+
if (before === after)
|
|
151
|
+
return void s.unchanged++;
|
|
152
|
+
if (before === 'allow')
|
|
153
|
+
s.allow_to_deny++;
|
|
154
|
+
else
|
|
155
|
+
s.deny_to_allow++;
|
|
156
|
+
if (row.principal)
|
|
157
|
+
principals.add(row.principal);
|
|
158
|
+
if (flips.length < SAMPLE_CAP)
|
|
159
|
+
flips.push({ decision_id: row.id, source: row.source, principal: row.principal, action: row.action, resource: row.resource, before, after, at: row.at });
|
|
160
|
+
};
|
|
161
|
+
const pdp = c.abac ? (0, authz_layers_1.loadPdp)(e) : null;
|
|
162
|
+
const cpdp = c.abac && pdp ? (0, authz_layers_1.candidatePdp)(pdp, c.abac) : null;
|
|
163
|
+
const all = (0, authz_state_1.st)(e).decisions.all().filter((d) => d.at >= since && d.at <= until);
|
|
164
|
+
const rows = all.slice(0, limit);
|
|
165
|
+
for (const row of rows) {
|
|
166
|
+
try {
|
|
167
|
+
if (['abac', 'authzen', 'mcp_gateway', 'pdp'].includes(row.source) && pdp && cpdp) {
|
|
168
|
+
const req = row.input;
|
|
169
|
+
if (!req || typeof req !== 'object' || !req.principal || !req.resource) {
|
|
170
|
+
skip('no_input');
|
|
171
|
+
continue;
|
|
172
|
+
}
|
|
173
|
+
const now = (0, authz_layers_1.abacDecide)(pdp, req).decision;
|
|
174
|
+
note(row, now, (0, authz_layers_1.abacDecide)(cpdp, req).decision, now !== row.decision);
|
|
175
|
+
}
|
|
176
|
+
else if (row.source === 'rbac' && c.rbac) {
|
|
177
|
+
if (row.result?.kind !== 'role' || !row.action) {
|
|
178
|
+
skip('rbac_not_role_based');
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
note(row, row.decision, (0, authz_layers_1.replayRoleDecision)(row.result, c.rbac.roles, row.action) ? 'allow' : 'deny', false);
|
|
182
|
+
}
|
|
183
|
+
else if (row.source === 'fga' && c.fga) {
|
|
184
|
+
if (row.policyVersion?.store_id !== c.fga.storeId) {
|
|
185
|
+
skip('other_store');
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
const i = row.input ?? {};
|
|
189
|
+
if (!i.user || !i.relation || !i.object) {
|
|
190
|
+
skip('no_input');
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const req = { user: i.user, relation: i.relation, object: i.object, contextual: i.contextual_tuples };
|
|
194
|
+
const now = (0, authz_layers_1.fgaCheck)(e, c.fga.storeId, req) ? 'allow' : 'deny';
|
|
195
|
+
note(row, now, (0, authz_layers_1.fgaCheck)(e, c.fga.storeId, req, { writes: c.fga.writes, deletes: c.fga.deletes }) ? 'allow' : 'deny', now !== row.decision);
|
|
196
|
+
}
|
|
197
|
+
else
|
|
198
|
+
skip(row.source === 'access_policy' ? 'access_policy_replayed_separately' : 'no_matching_candidate');
|
|
199
|
+
}
|
|
200
|
+
catch {
|
|
201
|
+
skip('replay_error');
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// shortcut: the emulator keeps no sampled sign-ins, so an access-policy candidate has nothing to replay against.
|
|
205
|
+
if (c.accessPolicy)
|
|
206
|
+
skip('access_policy_no_sampled_sign_ins');
|
|
207
|
+
const totals = { unchanged: 0, allow_to_deny: 0, deny_to_allow: 0 };
|
|
208
|
+
for (const s of Object.values(by)) {
|
|
209
|
+
totals.unchanged += s.unchanged;
|
|
210
|
+
totals.allow_to_deny += s.allow_to_deny;
|
|
211
|
+
totals.deny_to_allow += s.deny_to_allow;
|
|
212
|
+
}
|
|
213
|
+
const result = { object: 'authz_what_if', name: body.name ?? null, window: { since, until }, evaluated: rows.length, replayed, truncated: all.length > rows.length, skipped: skippedBy, by_source: by, totals, affected_principals: principals.size, samples: flips };
|
|
214
|
+
if (body.save === false)
|
|
215
|
+
return { ...result, status: 200 };
|
|
216
|
+
const describe = {
|
|
217
|
+
...(c.abac ? { abac: c.abac } : {}),
|
|
218
|
+
...(c.rbac ? { rbac: { roles: c.rbac.roles.map((r) => ({ type: r.type, key: r.key, organization_id: r.organizationId ?? null, add_permissions: r.addPermissions, remove_permissions: r.removePermissions })) } } : {}),
|
|
219
|
+
...(c.fga ? { fga: { store_id: c.fga.storeId, writes: c.fga.writes, deletes: c.fga.deletes } } : {}),
|
|
220
|
+
...(c.accessPolicy ? { access_policy: { draft: c.accessPolicy } } : {}),
|
|
221
|
+
};
|
|
222
|
+
const saved = (0, authz_state_1.st)(e).whatIf.insert({ name: body.name ?? null, candidate: describe, window_start: since, window_end: until, summary: { evaluated: rows.length, replayed, truncated: result.truncated, totals, affected_principals: principals.size, by_source: by }, result, created_at: e.clock.now() });
|
|
223
|
+
return { ...result, id: saved.id, created_at: saved.created_at, status: 201 };
|
|
224
|
+
}
|
|
225
|
+
const whatIfView = (r, full) => ({ object: 'authz_what_if_run', id: r.id, name: r.name, candidate: r.candidate, window: { since: r.window_start, until: r.window_end }, summary: r.summary, ...(full ? { result: r.result } : {}), created_by: null, created_at: r.created_at });
|
|
226
|
+
/** One sync run: write what should exist; with `repair`, also delete managed tuples that no longer should. Only managed tuples are ever touched. */
|
|
227
|
+
function runSync(e, kind, repair) {
|
|
228
|
+
const s = (0, authz_state_1.st)(e);
|
|
229
|
+
const now = e.clock.now();
|
|
230
|
+
const { written, deleted } = (0, authz_state_1.reconcileManaged)(e, repair);
|
|
231
|
+
const run = s.runs.insert({ kind, status: 'completed', store_id: s.config.store_id, repair, written, deleted, managed: s.managed.size, error: null, created_at: now, completed_at: now });
|
|
232
|
+
(0, authz_state_1.pushEvent)(e, 'sync_run', s.config.store_id, 'sync', { run_id: run.id, written, deleted });
|
|
233
|
+
e.webhooks.emit('fga_sync.completed', { object: 'fga_sync_run', id: run.id, store_id: s.config.store_id, written, deleted });
|
|
234
|
+
return run;
|
|
235
|
+
}
|
|
236
|
+
const runView = (r) => ({ object: 'fga_sync_run', id: r.id, kind: r.kind, status: r.status, store_id: r.store_id, repair: r.repair, tuples_written: r.written, tuples_deleted: r.deleted, managed_tuples: r.managed, error: r.error, created_at: r.created_at, completed_at: r.completed_at });
|
|
237
|
+
const statusView = (e) => {
|
|
238
|
+
const s = (0, authz_state_1.st)(e);
|
|
239
|
+
const last = s.runs.all()[0];
|
|
240
|
+
return { object: 'fga_sync', enabled: s.config.enabled, store_id: s.config.store_id, memberships: s.config.memberships, org_roles: s.config.org_roles, groups: s.config.groups, managed_tuples: s.managed.size, last_run: last ? runView(last) : null, updated_at: s.config.updated_at };
|
|
241
|
+
};
|
|
242
|
+
function authzHandlers() {
|
|
243
|
+
return [
|
|
244
|
+
{
|
|
245
|
+
method: 'POST',
|
|
246
|
+
pattern: '/v1/authz/explain',
|
|
247
|
+
scope: 'authz_decisions:read',
|
|
248
|
+
handler: (c) => {
|
|
249
|
+
const input = (0, authz_layers_1.parseExplainBody)(c.body);
|
|
250
|
+
// Signals a caller proxies in headers (country, risk level, device trust) apply when the body does not say.
|
|
251
|
+
input.access = { ...input.access, signals: (0, access_signals_1.firstOf)(input.access?.signals, (0, access_signals_1.headerSignals)(c.request.headers)) };
|
|
252
|
+
return { body: (0, authz_layers_1.explainAccess)(c.engine, input) };
|
|
253
|
+
},
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
// The same role check, written to the decision log (the corpus what-if replays).
|
|
257
|
+
method: 'POST',
|
|
258
|
+
pattern: '/v1/authz/rbac/check',
|
|
259
|
+
scope: 'authz_decisions:read',
|
|
260
|
+
handler: (c) => {
|
|
261
|
+
const e = c.engine;
|
|
262
|
+
const subject = (c.body.subject ?? {});
|
|
263
|
+
if (typeof subject.id !== 'string' || !subject.id)
|
|
264
|
+
throw bad('subject.id is required.', 'subject.id');
|
|
265
|
+
if (typeof c.body.permission !== 'string' || !c.body.permission)
|
|
266
|
+
throw bad('permission is required.', 'permission');
|
|
267
|
+
if (c.body.organization_id !== undefined && typeof c.body.organization_id !== 'string')
|
|
268
|
+
throw bad('organization_id must be a string.', 'organization_id');
|
|
269
|
+
const input = { userId: subject.id, permission: c.body.permission, organizationId: c.body.organization_id };
|
|
270
|
+
const r = (0, authz_layers_1.rbacCheck)(e, input);
|
|
271
|
+
(0, authz_layers_1.recordRbacCheck)(e, input, r);
|
|
272
|
+
const rules = [...r.layers.rbac.contributions, ...r.layers.org_roles.contributions, ...r.layers.groups.contributions].filter((x) => x.matched);
|
|
273
|
+
return { body: { object: 'rbac_check', allowed: r.allowed, decision: r.allowed ? 'allow' : 'deny', grants: r.grants, rules } };
|
|
274
|
+
},
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
method: 'POST',
|
|
278
|
+
pattern: '/v1/authz/what_if',
|
|
279
|
+
scope: 'authz_decisions:read',
|
|
280
|
+
handler: (c) => {
|
|
281
|
+
const { status, ...body } = runWhatIf(c.engine, c.body);
|
|
282
|
+
return { status, body };
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
{ method: 'GET', pattern: '/v1/authz/what_if', scope: 'authz_decisions:read', handler: (c) => (0, util_1.listReply)(c, (0, authz_state_1.st)(c.engine).whatIf.all(), (r) => whatIfView(r, false)) },
|
|
286
|
+
{
|
|
287
|
+
method: 'GET',
|
|
288
|
+
pattern: '/v1/authz/what_if/:id',
|
|
289
|
+
scope: 'authz_decisions:read',
|
|
290
|
+
handler: (c) => {
|
|
291
|
+
const r = (0, authz_state_1.st)(c.engine).whatIf.get(c.params.id);
|
|
292
|
+
if (!r)
|
|
293
|
+
throw (0, errors_1.notFound)('What-if run');
|
|
294
|
+
return { body: whatIfView(r, true) };
|
|
295
|
+
},
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
method: 'DELETE',
|
|
299
|
+
pattern: '/v1/authz/what_if/:id',
|
|
300
|
+
scope: 'authz_decisions:write',
|
|
301
|
+
handler: (c) => {
|
|
302
|
+
if (!(0, authz_state_1.st)(c.engine).whatIf.delete(c.params.id ?? ''))
|
|
303
|
+
throw (0, errors_1.notFound)('What-if run');
|
|
304
|
+
return { body: { object: 'authz_what_if_run', id: c.params.id, deleted: true } };
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
// ── managed FGA sync ──
|
|
308
|
+
{ method: 'GET', pattern: '/v1/fga/sync', scope: 'fga:read', handler: (c) => ({ body: statusView(c.engine) }) },
|
|
309
|
+
{
|
|
310
|
+
method: 'PUT',
|
|
311
|
+
pattern: '/v1/fga/sync',
|
|
312
|
+
scope: 'fga:write',
|
|
313
|
+
handler: (c) => {
|
|
314
|
+
const e = c.engine;
|
|
315
|
+
const s = (0, authz_state_1.st)(e);
|
|
316
|
+
const b = c.body;
|
|
317
|
+
for (const k of ['enabled', 'memberships', 'org_roles', 'groups'])
|
|
318
|
+
if (b[k] !== undefined && typeof b[k] !== 'boolean')
|
|
319
|
+
throw bad(`${k} must be true or false.`, k);
|
|
320
|
+
const storeId = b.store_id === undefined ? s.config.store_id : b.store_id;
|
|
321
|
+
if (storeId !== null && (typeof storeId !== 'string' || !(0, authz_state_1.storeExists)(e, storeId)))
|
|
322
|
+
throw bad('store_id must be an existing FGA store.', 'store_id');
|
|
323
|
+
// Owned tuples live in one store: it cannot change under them.
|
|
324
|
+
if (storeId !== s.config.store_id && s.managed.size)
|
|
325
|
+
throw new errors_1.EmulatorError('CONFLICT', 'The sync owns tuples in the current store. Purge them before changing the store.', 'store_id');
|
|
326
|
+
const enabled = b.enabled ?? s.config.enabled;
|
|
327
|
+
if (enabled && !storeId)
|
|
328
|
+
throw bad('Enabling sync needs a store_id.', 'store_id');
|
|
329
|
+
const turningOn = enabled && !s.config.enabled;
|
|
330
|
+
Object.assign(s.config, { enabled, store_id: storeId, memberships: b.memberships ?? s.config.memberships, org_roles: b.org_roles ?? s.config.org_roles, groups: b.groups ?? s.config.groups, updated_at: e.clock.now() });
|
|
331
|
+
if (turningOn)
|
|
332
|
+
runSync(e, 'initial', false);
|
|
333
|
+
return { body: statusView(e) };
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
method: 'POST',
|
|
338
|
+
pattern: '/v1/fga/sync/backfill',
|
|
339
|
+
scope: 'fga:write',
|
|
340
|
+
handler: (c) => {
|
|
341
|
+
const e = c.engine;
|
|
342
|
+
if (c.body.repair !== undefined && typeof c.body.repair !== 'boolean')
|
|
343
|
+
throw bad('repair must be a boolean.', 'repair');
|
|
344
|
+
if (!(0, authz_state_1.st)(e).config.enabled || !(0, authz_state_1.st)(e).config.store_id)
|
|
345
|
+
throw bad('Enable sync with a store before running a backfill.', 'enabled');
|
|
346
|
+
return { status: 202, body: runView(runSync(e, 'backfill', c.body.repair === true)) };
|
|
347
|
+
},
|
|
348
|
+
},
|
|
349
|
+
{ method: 'GET', pattern: '/v1/fga/sync/runs', scope: 'fga:read', handler: (c) => (0, util_1.listReply)(c, (0, authz_state_1.st)(c.engine).runs.all(), runView) },
|
|
350
|
+
{
|
|
351
|
+
method: 'GET',
|
|
352
|
+
pattern: '/v1/fga/sync/runs/:id',
|
|
353
|
+
scope: 'fga:read',
|
|
354
|
+
handler: (c) => {
|
|
355
|
+
const r = (0, authz_state_1.st)(c.engine).runs.get(c.params.id);
|
|
356
|
+
if (!r)
|
|
357
|
+
throw (0, errors_1.notFound)('Sync run');
|
|
358
|
+
return { body: runView(r) };
|
|
359
|
+
},
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
// Remove only the tuples the sync wrote, and forget them. Sync must be off.
|
|
363
|
+
method: 'POST',
|
|
364
|
+
pattern: '/v1/fga/sync/purge',
|
|
365
|
+
scope: 'fga:write',
|
|
366
|
+
handler: (c) => {
|
|
367
|
+
const e = c.engine;
|
|
368
|
+
const s = (0, authz_state_1.st)(e);
|
|
369
|
+
if (c.body.confirm !== true)
|
|
370
|
+
throw bad('Send confirm: true to remove the tuples the sync wrote.', 'confirm');
|
|
371
|
+
if (!s.config.store_id)
|
|
372
|
+
throw (0, errors_1.notFound)('Sync store');
|
|
373
|
+
if (s.config.enabled)
|
|
374
|
+
throw new errors_1.EmulatorError('CONFLICT', 'Disable sync before purging.');
|
|
375
|
+
const n = s.managed.size;
|
|
376
|
+
const owned = [...s.managed.values()];
|
|
377
|
+
s.managed.clear();
|
|
378
|
+
if (owned.length)
|
|
379
|
+
(0, authz_state_1.applyTuples)(e, s.config.store_id, [], owned, 'sync');
|
|
380
|
+
return { body: { object: 'fga.sync_purge', store_id: s.config.store_id, deleted: n, released: 0 } };
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
// ── the authorization event feed ──
|
|
384
|
+
{
|
|
385
|
+
method: 'GET',
|
|
386
|
+
pattern: '/v1/authz/events',
|
|
387
|
+
scope: 'fga:read',
|
|
388
|
+
handler: async (c) => {
|
|
389
|
+
const e = c.engine;
|
|
390
|
+
const s = (0, authz_state_1.st)(e);
|
|
391
|
+
const rawAfter = c.query.get('after');
|
|
392
|
+
const after = rawAfter === 'latest' ? s.seq : rawAfter === null ? 0 : Number(rawAfter);
|
|
393
|
+
if (!Number.isInteger(after) || after < 0)
|
|
394
|
+
throw bad('after must be a sequence number or "latest".', 'after');
|
|
395
|
+
const limit = (0, support_1.intIn)(c.query.get('limit') ?? undefined, 'limit', 1, 500, 100);
|
|
396
|
+
const waitMs = (0, support_1.intIn)(c.query.get('wait_ms') ?? undefined, 'wait_ms', 0, MAX_WAIT_MS, 0);
|
|
397
|
+
const kinds = c.query.get('kinds')?.split(',').filter(Boolean);
|
|
398
|
+
const store = c.query.get('store_id');
|
|
399
|
+
const pick = () => s.events.filter((x) => x.seq > after && (!kinds || kinds.includes(x.kind)) && (!store || x.store_id === store));
|
|
400
|
+
const deadline = Date.now() + waitMs;
|
|
401
|
+
while (!pick().length && Date.now() < deadline)
|
|
402
|
+
await new Promise((r) => setTimeout(r, 25));
|
|
403
|
+
const all = pick();
|
|
404
|
+
const page = all.slice(0, limit);
|
|
405
|
+
return { body: { object: 'list', data: page, has_more: all.length > limit, next_after: page.length ? page[page.length - 1].seq : after } };
|
|
406
|
+
},
|
|
407
|
+
},
|
|
408
|
+
];
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=authz.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authz.js","sourceRoot":"","sources":["../../src/handlers/authz.ts"],"names":[],"mappings":";;AA+NA,sCAmJC;AAhXD,sCAAoD;AAEpD,qDAA0D;AAC1D,mCAAyE;AACzE,iDAA0L;AAC1L,+CAAsG;AACtG,uCAAkC;AAClC,iCAAmC;AAEnC;;;;;;;GAOG;AACH,MAAM,WAAW,GAAG,MAAM,CAAC;AAC3B,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAClC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAChC,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,MAAM,GAAG,GAAG,CAAC,OAAe,EAAE,KAAa,EAAE,EAAE,CAAC,IAAI,sBAAa,CAAC,mBAAmB,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;AAEvG,MAAM,GAAG,GAAG,CAAC,CAAU,EAAE,KAAa,EAAO,EAAE;IAC7C,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,MAAM,GAAG,CAAC,GAAG,KAAK,qBAAqB,EAAE,KAAK,CAAC,CAAC;IAC/F,OAAO,CAAQ,CAAC;AAClB,CAAC,CAAC;AACF,MAAM,OAAO,GAAG,CAAC,CAAU,EAAE,KAAa,EAAY,EAAE;IACtD,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC;QAAE,MAAM,GAAG,CAAC,GAAG,KAAK,6BAA6B,EAAE,KAAK,CAAC,CAAC;IAC7H,OAAO,CAAa,CAAC;AACvB,CAAC,CAAC;AACF,MAAM,SAAS,GAAG,CAAC,CAAU,EAAE,KAAa,EAAW,EAAE;IACvD,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,MAAM,GAAG,CAAC,GAAG,KAAK,4BAA4B,EAAE,KAAK,CAAC,CAAC;IAC9E,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ;YAAE,MAAM,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,uCAAuC,EAAE,KAAK,CAAC,CAAC;QACvL,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;QACnG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAW,EAAE,CAAC;IAC1F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AACF,MAAM,aAAa,GAAG,CAAC,CAAU,EAAE,KAAa,EAA2C,EAAE;IAC3F,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,MAAM,GAAG,CAAC,GAAG,KAAK,kBAAkB,EAAE,KAAK,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM;YAAE,MAAM,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAC;QAClJ,IAAI,CAAC;YACH,IAAA,kBAAU,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,uBAAe;gBAAE,MAAM,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,aAAa,GAAG,CAAC,OAAO,kBAAkB,GAAG,CAAC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAC7H,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AACF,MAAM,IAAI,GAAG,CAAC,CAAU,EAAE,KAAa,EAAsB,EAAE;IAC7D,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAClF,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,GAAG,CAAC,GAAG,KAAK,kDAAkD,EAAE,KAAK,CAAC,CAAC;IAClG,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAQF,SAAS,cAAc,CAAC,IAAS;IAC/B,MAAM,GAAG,GAAc,EAAE,CAAC;IAC1B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC3C,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,EAAE,oBAAoB,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,OAAO,EAAE,wBAAwB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,uBAAuB,CAAC,EAAE,CAAC;IAClL,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG;YAAE,MAAM,GAAG,CAAC,kDAAkD,EAAE,sBAAsB,CAAC,CAAC;QACnK,GAAG,CAAC,IAAI,GAAG;YACT,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,CAAS,EAAE,EAAE;gBAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC,GAAG,CAAC,CAAC;gBAC/C,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU;oBAAE,MAAM,GAAG,CAAC,oCAAoC,EAAE,wBAAwB,CAAC,QAAQ,CAAC,CAAC;gBACvI,IAAI,OAAO,CAAC,CAAC,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG;oBAAE,MAAM,GAAG,CAAC,kBAAkB,EAAE,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACzG,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,EAAE,CAAC;YACpQ,CAAC,CAAC;SACH,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,MAAM,GAAG,CAAC,qCAAqC,EAAE,wBAAwB,CAAC,CAAC;QAC9H,GAAG,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,sBAAsB,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE,uBAAuB,CAAC,EAAE,CAAC;IACjJ,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS;QAAE,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;IAC9K,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY;QAAE,MAAM,GAAG,CAAC,iEAAiE,EAAE,WAAW,CAAC,CAAC;IACvJ,OAAO,GAAG,CAAC;AACb,CAAC;AAUD,SAAS,SAAS,CAAC,CAAS,EAAE,IAAS;IACrC,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IACzD,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAK,IAAe,GAAG,CAAC,IAAK,IAAe,GAAG,EAAE;YAAE,MAAM,GAAG,CAAC,uCAAuC,EAAE,MAAM,CAAC,CAAC;QACzI,KAAK,GAAG,KAAK,GAAI,IAAe,GAAG,UAAU,CAAC;IAChD,CAAC;IACD,IAAI,KAAK,IAAI,KAAK;QAAE,MAAM,GAAG,CAAC,6BAA6B,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,KAAK,GAAG,KAAK,GAAG,EAAE,GAAG,UAAU;QAAE,MAAM,GAAG,CAAC,oCAAoC,EAAE,OAAO,CAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC,IAAK,KAAgB,GAAG,gBAAgB;QAAE,MAAM,GAAG,CAAC,sCAAsC,gBAAgB,GAAG,EAAE,OAAO,CAAC,CAAC;IAC7K,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAAE,MAAM,GAAG,CAAC,kDAAkD,EAAE,MAAM,CAAC,CAAC;IAChK,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,MAAM,GAAG,CAAC,yBAAyB,EAAE,MAAM,CAAC,CAAC;IAC5G,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAA,yBAAW,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,MAAM,GAAG,CAAC,oBAAoB,EAAE,wBAAwB,CAAC,CAAC;IACvG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,IAAA,0BAAW,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;QAAE,MAAM,GAAG,CAAC,2CAA2C,EAAE,wBAAwB,CAAC,CAAC;IAE9H,MAAM,EAAE,GAAgC,EAAE,CAAC;IAC3C,MAAM,SAAS,GAA2B,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,MAAM,KAAK,GAAU,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,MAAM,IAAI,GAAG,CAAC,GAAQ,EAAE,MAAwB,EAAE,KAAuB,EAAE,QAAiB,EAAE,EAAE;QAC9F,QAAQ,EAAE,CAAC;QACX,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;QACvH,CAAC,CAAC,QAAQ,EAAE,CAAC;QACb,IAAI,QAAQ;YAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACpC,IAAI,MAAM,KAAK,KAAK;YAAE,OAAO,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;QAChD,IAAI,MAAM,KAAK,OAAO;YAAE,CAAC,CAAC,aAAa,EAAE,CAAC;;YACrC,CAAC,CAAC,aAAa,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,SAAS;YAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjD,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1L,CAAC,CAAC;IACF,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,sBAAO,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAA,2BAAY,EAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,GAAG,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,KAAM,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC;IACjF,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAe,CAAC,CAAC;IAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;gBAClF,MAAM,GAAG,GAAG,GAAG,CAAC,KAA4B,CAAC;gBAC7C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;oBACvE,IAAI,CAAC,UAAU,CAAC,CAAC;oBACjB,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,IAAA,yBAAU,EAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC;gBAC1C,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAA,yBAAU,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;YACvE,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC3C,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;oBAC/C,IAAI,CAAC,qBAAqB,CAAC,CAAC;oBAC5B,SAAS;gBACX,CAAC;gBACD,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAA,iCAAkB,EAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9G,CAAC;iBAAM,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;gBACzC,IAAI,GAAG,CAAC,aAAa,EAAE,QAAQ,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;oBAClD,IAAI,CAAC,aAAa,CAAC,CAAC;oBACpB,SAAS;gBACX,CAAC;gBACD,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC1B,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBACxC,IAAI,CAAC,UAAU,CAAC,CAAC;oBACjB,SAAS;gBACX,CAAC;gBACD,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC;gBACtG,MAAM,GAAG,GAAG,IAAA,uBAAQ,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC/D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,IAAA,uBAAQ,EAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC7I,CAAC;;gBAAM,IAAI,CAAC,GAAG,CAAC,MAAM,KAAK,eAAe,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAC9G,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,cAAc,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,iHAAiH;IACjH,IAAI,CAAC,CAAC,YAAY;QAAE,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC;QAChC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,CAAC;QACxC,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,aAAa,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC3Q,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG;QACf,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,cAAc,IAAI,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtN,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;IACF,MAAM,KAAK,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,mBAAmB,EAAE,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACxS,OAAO,EAAE,GAAG,MAAM,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAM,EAAE,IAAa,EAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;AAEpS,oJAAoJ;AACpJ,SAAS,OAAO,CAAC,CAAS,EAAE,IAA4B,EAAE,MAAe;IACvE,MAAM,CAAC,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC;IAChB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,IAAA,8BAAgB,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1L,IAAA,uBAAS,EAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1F,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7H,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAM,EAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;AACzS,MAAM,UAAU,GAAG,CAAC,CAAS,EAAO,EAAE;IACpC,MAAM,CAAC,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC;IAChB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;AAC3R,CAAC,CAAC;AAEF,SAAgB,aAAa;IAC3B,OAAO;QACL;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB;YAC5B,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,KAAK,GAAG,IAAA,+BAAgB,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACvC,4GAA4G;gBAC5G,KAAK,CAAC,MAAM,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAA,wBAAO,EAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAA,8BAAa,EAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC9G,OAAO,EAAE,IAAI,EAAE,IAAA,4BAAa,EAAC,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YAClD,CAAC;SACF;QACD;YACE,iFAAiF;YACjF,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,sBAAsB;YAC/B,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAQ,CAAC;gBAC9C,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,EAAE;oBAAE,MAAM,GAAG,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBACtG,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU;oBAAE,MAAM,GAAG,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC;gBACpH,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,eAAe,KAAK,QAAQ;oBAAE,MAAM,GAAG,CAAC,mCAAmC,EAAE,iBAAiB,CAAC,CAAC;gBAC1J,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,eAAqC,EAAE,CAAC;gBAClI,MAAM,CAAC,GAAG,IAAA,wBAAS,EAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC9B,IAAA,8BAAe,EAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC7B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACpJ,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;YACjI,CAAC;SACF;QACD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,mBAAmB;YAC5B,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAQ,CAAC;gBAC/D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC1B,CAAC;SACF;QACD,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,sBAAsB,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,gBAAS,EAAC,CAAC,EAAE,IAAA,gBAAE,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE;QACpK;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,sBAAsB;YAC7B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAA,iBAAQ,EAAC,aAAa,CAAC,CAAC;gBACtC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;YACvC,CAAC;SACF;QACD;YACE,MAAM,EAAE,QAAQ;YAChB,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,IAAA,gBAAE,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;oBAAE,MAAM,IAAA,iBAAQ,EAAC,aAAa,CAAC,CAAC;gBAClF,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YACnF,CAAC;SACF;QACD,yBAAyB;QACzB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;QAC/G;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC;gBAChB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACjB,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAU;oBAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS;wBAAE,MAAM,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;gBAC7K,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;gBAC1E,IAAI,OAAO,KAAK,IAAI,IAAI,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,IAAA,yBAAW,EAAC,CAAC,EAAE,OAAO,CAAC,CAAC;oBAAE,MAAM,GAAG,CAAC,yCAAyC,EAAE,UAAU,CAAC,CAAC;gBACpJ,+DAA+D;gBAC/D,IAAI,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI;oBAAE,MAAM,IAAI,sBAAa,CAAC,UAAU,EAAE,kFAAkF,EAAE,UAAU,CAAC,CAAC;gBACzL,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC9C,IAAI,OAAO,IAAI,CAAC,OAAO;oBAAE,MAAM,GAAG,CAAC,iCAAiC,EAAE,UAAU,CAAC,CAAC;gBAClF,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAC1N,IAAI,SAAS;oBAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;gBAC5C,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,CAAC;SACF;QACD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS;oBAAE,MAAM,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC,CAAC;gBACxH,IAAI,CAAC,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;oBAAE,MAAM,GAAG,CAAC,qDAAqD,EAAE,SAAS,CAAC,CAAC;gBACjI,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;YACxF,CAAC;SACF;QACD,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,gBAAS,EAAC,CAAC,EAAE,IAAA,gBAAE,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE;QAClI;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC7C,IAAI,CAAC,CAAC;oBAAE,MAAM,IAAA,iBAAQ,EAAC,UAAU,CAAC,CAAC;gBACnC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,CAAC;SACF;QACD;YACE,4EAA4E;YAC5E,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oBAAoB;YAC7B,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACb,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI;oBAAE,MAAM,GAAG,CAAC,yDAAyD,EAAE,SAAS,CAAC,CAAC;gBAC7G,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ;oBAAE,MAAM,IAAA,iBAAQ,EAAC,YAAY,CAAC,CAAC;gBACrD,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;oBAAE,MAAM,IAAI,sBAAa,CAAC,UAAU,EAAE,8BAA8B,CAAC,CAAC;gBAC1F,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;gBACzB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;gBACtC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,IAAI,KAAK,CAAC,MAAM;oBAAE,IAAA,yBAAW,EAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBACvE,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;YACtG,CAAC;SACF;QACD,qCAAqC;QACrC;YACE,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,kBAAkB;YAC3B,KAAK,EAAE,UAAU;YACjB,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;gBACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gBACnB,MAAM,CAAC,GAAG,IAAA,gBAAE,EAAC,CAAC,CAAC,CAAC;gBAChB,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,KAAK,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACvF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;oBAAE,MAAM,GAAG,CAAC,8CAA8C,EAAE,OAAO,CAAC,CAAC;gBAC9G,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC7E,MAAM,MAAM,GAAG,IAAA,eAAK,EAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;gBACxF,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBAC/D,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACtC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC;gBACnI,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;gBACrC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;oBAAE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC5F,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC;gBACnB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;gBACjC,OAAO,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,GAAG,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;YAC9I,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { Engine, RouteDef } from '../engine';
|
|
2
|
+
import { EmulatorError } from '../errors';
|
|
3
|
+
import type { Obj } from '../openapi';
|
|
4
|
+
import { Table } from '../store';
|
|
5
|
+
interface Balance {
|
|
6
|
+
granted: number | null;
|
|
7
|
+
usage: number;
|
|
8
|
+
unlimited: boolean;
|
|
9
|
+
}
|
|
10
|
+
interface Bill {
|
|
11
|
+
subs: Table;
|
|
12
|
+
invoices: Table;
|
|
13
|
+
refunds: Table;
|
|
14
|
+
usage: Table;
|
|
15
|
+
extensions: Map<string, Obj>;
|
|
16
|
+
consumes: Map<string, Obj>;
|
|
17
|
+
balances: Map<string, Balance>;
|
|
18
|
+
catalogue: Map<string, {
|
|
19
|
+
features: string[];
|
|
20
|
+
limits: Obj;
|
|
21
|
+
}>;
|
|
22
|
+
/** What the provider owes the customer (credit left over from a downgrade), minor units per `type|id`; applied to the next invoice. */
|
|
23
|
+
customerBalance: Map<string, number>;
|
|
24
|
+
}
|
|
25
|
+
/** A body key outside `allowed` is refused (the real routes are strict). */
|
|
26
|
+
declare function known(body: Obj, allowed: string[]): void;
|
|
27
|
+
declare function subject(e: Engine, body: Obj): {
|
|
28
|
+
type: string;
|
|
29
|
+
id: string;
|
|
30
|
+
};
|
|
31
|
+
declare function emitSub(e: Engine, type: string, s: Obj, prev: Obj | null, reason?: string, extra?: Obj): void;
|
|
32
|
+
interface EntSnap {
|
|
33
|
+
planId: string;
|
|
34
|
+
plan: string | null;
|
|
35
|
+
status: string;
|
|
36
|
+
features: string[];
|
|
37
|
+
limits: Obj;
|
|
38
|
+
}
|
|
39
|
+
/** What a subject is entitled to now: its live (active or trialing) subscriptions merged; undefined when none. */
|
|
40
|
+
declare function entSnap(e: Engine, type: string, id: string): EntSnap | undefined;
|
|
41
|
+
/** entitlement.created / updated / deleted, only when the resolved entitlement moved. */
|
|
42
|
+
declare function emitEnt(e: Engine, type: string, id: string, before: EntSnap | undefined): void;
|
|
43
|
+
/** shortcut: a plan's `amount` is display text ("$9.00"); its digits read as major units, 0 when absent. */
|
|
44
|
+
declare function priceCents(plan: Obj | undefined, interval: string): number;
|
|
45
|
+
/** One invoice line: a renewal charge, or a proration (a credit for unused time is negative). */
|
|
46
|
+
interface Line {
|
|
47
|
+
description: string;
|
|
48
|
+
amount: number;
|
|
49
|
+
quantity: number;
|
|
50
|
+
proration: boolean;
|
|
51
|
+
plan_id: string | null;
|
|
52
|
+
period_start: number;
|
|
53
|
+
period_end: number;
|
|
54
|
+
}
|
|
55
|
+
/** The invoice the subscription's next billing would produce: renewal at the plan's price plus the proration items waiting, less customer balance. */
|
|
56
|
+
declare function draft(e: Engine, s: Obj, at: number): {
|
|
57
|
+
lines: Line[];
|
|
58
|
+
total: number;
|
|
59
|
+
applied: number;
|
|
60
|
+
due: number;
|
|
61
|
+
currency: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* The period lifecycle, applied lazily on every billing read and write so advancing the clock does the work: a trial that
|
|
65
|
+
* has ended becomes active (past_due when the subscription's payment is set to fail), and each passed period end either
|
|
66
|
+
* ends a subscription set to cancel, applies a scheduled plan change, or renews for another period; each billable event
|
|
67
|
+
* gets an invoice.
|
|
68
|
+
*/
|
|
69
|
+
declare function settle(e: Engine): void;
|
|
70
|
+
export declare function billingHandlers(): RouteDef[];
|
|
71
|
+
/** The state and helpers the provider-webhook, store-link, Connect and referral-reward routes (emu4-billing.ts) share with this module. */
|
|
72
|
+
export declare const billingInternals: {
|
|
73
|
+
st: (e: Engine) => Bill;
|
|
74
|
+
planOf: (e: Engine, id: string | undefined | null) => Obj | undefined;
|
|
75
|
+
subView: (e: Engine, s: Obj) => Obj;
|
|
76
|
+
emitSub: typeof emitSub;
|
|
77
|
+
emitEnt: typeof emitEnt;
|
|
78
|
+
entSnap: typeof entSnap;
|
|
79
|
+
settle: typeof settle;
|
|
80
|
+
liveSub: (e: Engine, type: string, id: string) => Obj | undefined;
|
|
81
|
+
invoiceView: (e: Engine, i: Obj) => Obj;
|
|
82
|
+
draft: typeof draft;
|
|
83
|
+
lineView: (currency: string, l: Line) => Obj;
|
|
84
|
+
balKey2: (s: Obj) => string;
|
|
85
|
+
day: (t: number) => string;
|
|
86
|
+
DAY: number;
|
|
87
|
+
MONTH: number;
|
|
88
|
+
periodLen: (interval: string | undefined) => number;
|
|
89
|
+
priceCents: typeof priceCents;
|
|
90
|
+
bad: (message: string, param: string) => EmulatorError;
|
|
91
|
+
conflict: (m: string, meta?: Obj) => EmulatorError;
|
|
92
|
+
unsupported: (m: string) => EmulatorError & {
|
|
93
|
+
status: number;
|
|
94
|
+
};
|
|
95
|
+
known: typeof known;
|
|
96
|
+
subject: typeof subject;
|
|
97
|
+
PROVIDERS: readonly ["stripe", "polar", "dodo", "creem", "chargebee", "autumn", "commet", "paddle", "lemonsqueezy", "revenuecat", "appstore", "googleplay"];
|
|
98
|
+
STORE_OWNED: Set<string>;
|
|
99
|
+
};
|
|
100
|
+
export type { Line as InvoiceLine };
|