@inhuman.tools/policy 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/LICENSE.md +7 -0
- package/dist/check.d.ts +1 -2
- package/dist/check.d.ts.map +1 -1
- package/dist/check.js +0 -3
- package/dist/check.js.map +1 -1
- package/package.json +8 -8
- package/src/check.ts +0 -10
- package/dist/decide.d.ts +0 -64
- package/dist/decide.d.ts.map +0 -1
- package/dist/decide.js +0 -482
- package/dist/decide.js.map +0 -1
- package/dist/error-with-invariant.d.ts +0 -9
- package/dist/error-with-invariant.d.ts.map +0 -1
- package/dist/error-with-invariant.js +0 -12
- package/dist/error-with-invariant.js.map +0 -1
- package/dist/license-law.d.ts +0 -43
- package/dist/license-law.d.ts.map +0 -1
- package/dist/license-law.js +0 -129
- package/dist/license-law.js.map +0 -1
- package/dist/license.d.ts +0 -3
- package/dist/license.d.ts.map +0 -1
- package/dist/license.js +0 -2
- package/dist/license.js.map +0 -1
- package/dist/peel-cwd.d.ts +0 -8
- package/dist/peel-cwd.d.ts.map +0 -1
- package/dist/peel-cwd.js +0 -120
- package/dist/peel-cwd.js.map +0 -1
- package/dist/prep.d.ts +0 -58
- package/dist/prep.d.ts.map +0 -1
- package/dist/prep.js +0 -690
- package/dist/prep.js.map +0 -1
- package/dist/schemas/tirith.d.ts +0 -58
- package/dist/schemas/tirith.d.ts.map +0 -1
- package/dist/schemas/tirith.js +0 -23
- package/dist/schemas/tirith.js.map +0 -1
- package/dist/tirith-units.d.ts +0 -2
- package/dist/tirith-units.d.ts.map +0 -1
- package/dist/tirith-units.js +0 -227
- package/dist/tirith-units.js.map +0 -1
- package/dist/tirith.d.ts +0 -24
- package/dist/tirith.d.ts.map +0 -1
- package/dist/tirith.js +0 -311
- package/dist/tirith.js.map +0 -1
package/dist/tirith.js
DELETED
|
@@ -1,311 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Host-side command inspection. The command is data, never shell source
|
|
3
|
-
* for the child. `analysis_incomplete` is not one threat: intel-gap
|
|
4
|
-
* (offline package lookup) is not a vote, nested-incomplete-only is
|
|
5
|
-
* remainder ask, concrete rules and scanner error keep today's map.
|
|
6
|
-
*/
|
|
7
|
-
import { execFile } from "node:child_process";
|
|
8
|
-
import { mkdtemp, realpath, rm } from "node:fs/promises";
|
|
9
|
-
import { createRequire } from "node:module";
|
|
10
|
-
import { tmpdir } from "node:os";
|
|
11
|
-
import path from "node:path";
|
|
12
|
-
import { fileURLToPath } from "node:url";
|
|
13
|
-
import { findingSchema, outputSchema } from "./schemas/tirith.js";
|
|
14
|
-
import { tirithUnits } from "./tirith-units.js";
|
|
15
|
-
const policyRoot = fileURLToPath(new URL("../tirith-policy/", import.meta.url));
|
|
16
|
-
const policyPath = path.join(policyRoot, ".tirith", "policy.yaml");
|
|
17
|
-
const codes = { allow: 0, warn: 2, block: 1 };
|
|
18
|
-
export function parseTirithOutput(stdout, code) {
|
|
19
|
-
const output = outputSchema.parse(JSON.parse(stdout));
|
|
20
|
-
if (codes[output.action] !== code)
|
|
21
|
-
throw new Error(`Tirith verdict disagrees with exit code ${code}`);
|
|
22
|
-
return output;
|
|
23
|
-
}
|
|
24
|
-
export function tirithFailure(error) {
|
|
25
|
-
return { action: "error", findings: [], error: error instanceof Error ? error.message : String(error) };
|
|
26
|
-
}
|
|
27
|
-
const INCOMPLETE_RULE = "analysis_incomplete";
|
|
28
|
-
const INTERNAL_COPY = /tirith|getvet\.sh|policy\.yaml|scan\.require|operator policy|capsule command|--suggest/i;
|
|
29
|
-
const BUDGET_NOTE = /nested body suffix omitted|bounded analysis|coverage gap/i;
|
|
30
|
-
const INCOMPLETE_MESSAGE = "Policy safeguards were unable to classify this shell script's safety. It may be correct to use, but it is too complex for static analysis; try to produce a simpler or more explicit shell script that will do the same thing.";
|
|
31
|
-
export function tirithCoverage(report) {
|
|
32
|
-
if (report.action === "error")
|
|
33
|
-
return "error";
|
|
34
|
-
if (report.findings.length === 0)
|
|
35
|
-
return "none";
|
|
36
|
-
if (report.findings.some((finding) => finding.rule_id !== INCOMPLETE_RULE))
|
|
37
|
-
return "concrete";
|
|
38
|
-
if (report.findings.every(isIntelGapFinding))
|
|
39
|
-
return "intel-gap";
|
|
40
|
-
return "incomplete";
|
|
41
|
-
}
|
|
42
|
-
function isIntelGapFinding(finding) {
|
|
43
|
-
const evidence = finding.evidence ?? [];
|
|
44
|
-
return evidence.length > 0 && evidence.every((item) => item.type === "threat_intel");
|
|
45
|
-
}
|
|
46
|
-
/** A block only when a finding is the attack itself. A coarse shape stays a question. */
|
|
47
|
-
const HARD_BLOCK = new Set([
|
|
48
|
-
"pipe_to_interpreter",
|
|
49
|
-
"curl_pipe_shell",
|
|
50
|
-
"wget_pipe_shell",
|
|
51
|
-
"httpie_pipe_shell",
|
|
52
|
-
"xh_pipe_shell",
|
|
53
|
-
"base64_decode_execute",
|
|
54
|
-
"sudo_download_install",
|
|
55
|
-
"reverse_shell",
|
|
56
|
-
"proc_mem_access",
|
|
57
|
-
"docker_remote_priv_esc",
|
|
58
|
-
"plain_http_to_sink",
|
|
59
|
-
"schemeless_to_sink",
|
|
60
|
-
"insecure_tls_flags",
|
|
61
|
-
"userinfo_trick",
|
|
62
|
-
"non_ascii_hostname",
|
|
63
|
-
"shortened_url",
|
|
64
|
-
"metadata_endpoint",
|
|
65
|
-
"private_network_access",
|
|
66
|
-
"data_exfiltration",
|
|
67
|
-
"dotfile_overwrite",
|
|
68
|
-
"private_key_exposed",
|
|
69
|
-
"sudo_shell_spawn",
|
|
70
|
-
"sudo_env_preserve_sensitive",
|
|
71
|
-
"sudo_tee_system_file",
|
|
72
|
-
"sudo_recursive_perms_broad_path",
|
|
73
|
-
"blast_writes_system_path",
|
|
74
|
-
"blast_find_delete",
|
|
75
|
-
"blast_rsync_delete",
|
|
76
|
-
"wrapper_chain_too_deep",
|
|
77
|
-
]);
|
|
78
|
-
function hardBlock(report) {
|
|
79
|
-
return report.findings.some((finding) => HARD_BLOCK.has(finding.rule_id));
|
|
80
|
-
}
|
|
81
|
-
export function tirithDisposition(report) {
|
|
82
|
-
switch (tirithCoverage(report)) {
|
|
83
|
-
case "error":
|
|
84
|
-
return "block";
|
|
85
|
-
case "intel-gap":
|
|
86
|
-
case "none":
|
|
87
|
-
return "approve";
|
|
88
|
-
case "incomplete":
|
|
89
|
-
return "ask";
|
|
90
|
-
case "concrete":
|
|
91
|
-
if (report.action === "allow")
|
|
92
|
-
return "approve";
|
|
93
|
-
if (report.action === "warn")
|
|
94
|
-
return "ask";
|
|
95
|
-
return hardBlock(report) ? "block" : "ask";
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/** Model-facing. Scanner identity stays in `policyEvidenceJson`. */
|
|
99
|
-
export function tirithMessage(report) {
|
|
100
|
-
switch (tirithCoverage(report)) {
|
|
101
|
-
case "error":
|
|
102
|
-
return "Policy safeguards could not inspect this command.";
|
|
103
|
-
case "intel-gap":
|
|
104
|
-
case "none":
|
|
105
|
-
return null;
|
|
106
|
-
case "incomplete":
|
|
107
|
-
return withFragments(INCOMPLETE_MESSAGE, commandSnippets(report.findings));
|
|
108
|
-
case "concrete": {
|
|
109
|
-
const concrete = report.findings.filter((finding) => finding.rule_id !== INCOMPLETE_RULE);
|
|
110
|
-
const parts = concrete.map(findingAdvice).filter((part) => part !== "");
|
|
111
|
-
return parts.length === 0 ? null : parts.join("\n\n");
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/** Classifier PIP. Concrete findings only — no-verdicts are not threats. */
|
|
116
|
-
export function tirithPolicyCut(report) {
|
|
117
|
-
if (tirithCoverage(report) !== "concrete")
|
|
118
|
-
return "";
|
|
119
|
-
return tirithMessage(report) ?? "";
|
|
120
|
-
}
|
|
121
|
-
export function parseTirithEvidence(json) {
|
|
122
|
-
if (json == null || json === "")
|
|
123
|
-
return null;
|
|
124
|
-
try {
|
|
125
|
-
const parsed = JSON.parse(json);
|
|
126
|
-
if (!isRecord(parsed))
|
|
127
|
-
return null;
|
|
128
|
-
return asReport(parsed.tirith);
|
|
129
|
-
}
|
|
130
|
-
catch {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
function isRecord(value) {
|
|
135
|
-
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
136
|
-
}
|
|
137
|
-
function asReport(value) {
|
|
138
|
-
if (!isRecord(value))
|
|
139
|
-
return null;
|
|
140
|
-
const action = value.action;
|
|
141
|
-
if (action !== "allow" && action !== "warn" && action !== "block" && action !== "error")
|
|
142
|
-
return null;
|
|
143
|
-
if (!Array.isArray(value.findings))
|
|
144
|
-
return null;
|
|
145
|
-
const findings = [];
|
|
146
|
-
for (const item of value.findings) {
|
|
147
|
-
const parsed = findingSchema.safeParse(item);
|
|
148
|
-
if (!parsed.success)
|
|
149
|
-
return null;
|
|
150
|
-
findings.push(parsed.data);
|
|
151
|
-
}
|
|
152
|
-
const error = value.error;
|
|
153
|
-
return typeof error === "string" ? { action, findings, error } : { action, findings };
|
|
154
|
-
}
|
|
155
|
-
function recoveryScript(ruleId) {
|
|
156
|
-
if (ruleId === "interpreter_suspicious_inline_exec") {
|
|
157
|
-
return "Drop the spawn, socket, or eval, or move that part into a file and run the file. A one-liner that only computes is already allowed.";
|
|
158
|
-
}
|
|
159
|
-
if (ruleId === "mass_file_deletion") {
|
|
160
|
-
return "Delete fewer than three files in one step, or name the build directory you mean (node_modules, dist, target). Do not chain the rest into one command.";
|
|
161
|
-
}
|
|
162
|
-
return "";
|
|
163
|
-
}
|
|
164
|
-
function findingAdvice(finding) {
|
|
165
|
-
const body = modelSentences(finding.description) || modelSentences(finding.title);
|
|
166
|
-
const rem = finding.remediation === undefined ? "" : modelSentences(finding.remediation);
|
|
167
|
-
const snips = commandSnippets([finding]);
|
|
168
|
-
const hit = finding.evidence?.find((item) => item.pattern != null && item.pattern !== "")?.pattern;
|
|
169
|
-
const parts = [];
|
|
170
|
-
if (body !== "")
|
|
171
|
-
parts.push(body);
|
|
172
|
-
if (snips.length > 0)
|
|
173
|
-
parts.push(`This fragment:\n${snips.map((snip) => ` ${snip}`).join("\n")}`);
|
|
174
|
-
if (hit !== undefined)
|
|
175
|
-
parts.push(`Why: it matches ${hit}.`);
|
|
176
|
-
const script = recoveryScript(finding.rule_id);
|
|
177
|
-
if (script !== "")
|
|
178
|
-
parts.push(script);
|
|
179
|
-
else if (rem !== "" && rem !== body)
|
|
180
|
-
parts.push(rem);
|
|
181
|
-
return parts.join("\n");
|
|
182
|
-
}
|
|
183
|
-
function withFragments(lead, snips) {
|
|
184
|
-
if (snips.length === 0)
|
|
185
|
-
return lead;
|
|
186
|
-
return `${lead}\n\nThis fragment could not be classified:\n${snips.map((snip) => ` ${snip}`).join("\n")}`;
|
|
187
|
-
}
|
|
188
|
-
function commandSnippets(findings) {
|
|
189
|
-
const seen = new Set();
|
|
190
|
-
const out = [];
|
|
191
|
-
for (const finding of findings) {
|
|
192
|
-
for (const item of finding.evidence ?? []) {
|
|
193
|
-
const text = item.matched ?? item.raw;
|
|
194
|
-
if (text == null || text === "" || BUDGET_NOTE.test(text) || seen.has(text))
|
|
195
|
-
continue;
|
|
196
|
-
seen.add(text);
|
|
197
|
-
out.push(text);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
return out;
|
|
201
|
-
}
|
|
202
|
-
function modelSentences(text) {
|
|
203
|
-
return text
|
|
204
|
-
.split(/(?<=\.)\s+/)
|
|
205
|
-
.filter((sentence) => sentence !== "" && !INTERNAL_COPY.test(sentence))
|
|
206
|
-
.join(" ")
|
|
207
|
-
.trim();
|
|
208
|
-
}
|
|
209
|
-
function binaryPath() {
|
|
210
|
-
const require = createRequire(import.meta.url);
|
|
211
|
-
const fromTirith = createRequire(require.resolve("tirith/package.json"));
|
|
212
|
-
const platform = `${process.platform}-${process.arch}`;
|
|
213
|
-
if (!["darwin-arm64", "darwin-x64", "linux-arm64", "linux-x64", "win32-x64"].includes(platform)) {
|
|
214
|
-
throw new Error(`Unsupported Tirith platform: ${platform}`);
|
|
215
|
-
}
|
|
216
|
-
const root = path.dirname(fromTirith.resolve(`@sheeki03/tirith-${platform}/package.json`));
|
|
217
|
-
return path.join(root, "bin", process.platform === "win32" ? "tirith.exe" : "tirith");
|
|
218
|
-
}
|
|
219
|
-
/** Do not inherit TIRITH*, loader injection, user allowlists, or project policy discovery. */
|
|
220
|
-
function scannerEnv(state) {
|
|
221
|
-
const env = {
|
|
222
|
-
HOME: state,
|
|
223
|
-
USERPROFILE: state,
|
|
224
|
-
XDG_CONFIG_HOME: state,
|
|
225
|
-
XDG_DATA_HOME: state,
|
|
226
|
-
XDG_CACHE_HOME: state,
|
|
227
|
-
APPDATA: state,
|
|
228
|
-
LOCALAPPDATA: state,
|
|
229
|
-
TIRITH_POLICY_ROOT: policyRoot,
|
|
230
|
-
TIRITH_LOG: "0",
|
|
231
|
-
TIRITH_OFFLINE: "1",
|
|
232
|
-
};
|
|
233
|
-
for (const name of ["PATH", "SystemRoot", "SYSTEMROOT", "WINDIR", "TMPDIR", "TEMP", "TMP"]) {
|
|
234
|
-
if (process.env[name] !== undefined)
|
|
235
|
-
env[name] = process.env[name];
|
|
236
|
-
}
|
|
237
|
-
return env;
|
|
238
|
-
}
|
|
239
|
-
function joinTirithReports(reports) {
|
|
240
|
-
const findings = reports.flatMap((report) => report.findings);
|
|
241
|
-
if (reports.some((report) => report.action === "block"))
|
|
242
|
-
return { action: "block", findings };
|
|
243
|
-
const failed = reports.find((report) => report.action === "error");
|
|
244
|
-
if (failed !== undefined)
|
|
245
|
-
return { action: "error", findings, error: failed.error };
|
|
246
|
-
if (reports.some((report) => report.action === "warn"))
|
|
247
|
-
return { action: "warn", findings };
|
|
248
|
-
return { action: "allow", findings };
|
|
249
|
-
}
|
|
250
|
-
function inspectCommand(binary, command, cwd, env, signal) {
|
|
251
|
-
return new Promise((resolve, reject) => {
|
|
252
|
-
execFile(binary, ["check", "--format", "json", "--non-interactive", "--no-daemon", "--offline", "--shell", "posix", "--", command], {
|
|
253
|
-
cwd,
|
|
254
|
-
env,
|
|
255
|
-
signal,
|
|
256
|
-
timeout: 5000,
|
|
257
|
-
killSignal: "SIGKILL",
|
|
258
|
-
maxBuffer: 1024 * 1024,
|
|
259
|
-
encoding: "utf8",
|
|
260
|
-
windowsHide: true,
|
|
261
|
-
}, (error, stdout) => {
|
|
262
|
-
try {
|
|
263
|
-
if (error == null) {
|
|
264
|
-
resolve(parseTirithOutput(stdout, 0));
|
|
265
|
-
return;
|
|
266
|
-
}
|
|
267
|
-
const code = error.code;
|
|
268
|
-
if (error.killed || error.signal || typeof code !== "number")
|
|
269
|
-
throw error;
|
|
270
|
-
resolve(parseTirithOutput(stdout, code));
|
|
271
|
-
}
|
|
272
|
-
catch (error_) {
|
|
273
|
-
reject(error_);
|
|
274
|
-
}
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
}
|
|
278
|
-
export const checkTirith = async (command, { cwd, signal }) => {
|
|
279
|
-
let state;
|
|
280
|
-
try {
|
|
281
|
-
signal?.throwIfAborted();
|
|
282
|
-
const binary = binaryPath();
|
|
283
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename -- fixed package asset, never caller input
|
|
284
|
-
await realpath(policyPath);
|
|
285
|
-
const home = await mkdtemp(path.join(tmpdir(), "harness-tirith-"));
|
|
286
|
-
state = home;
|
|
287
|
-
signal?.throwIfAborted();
|
|
288
|
-
const env = scannerEnv(home);
|
|
289
|
-
const reports = await Promise.all(tirithUnits(command).map(async (unit) => {
|
|
290
|
-
try {
|
|
291
|
-
const output = await inspectCommand(binary, unit, cwd, env, signal);
|
|
292
|
-
if (!output.policy_path_used) {
|
|
293
|
-
throw new Error("Tirith did not use the package-owned policy");
|
|
294
|
-
}
|
|
295
|
-
return { action: output.action, findings: output.findings };
|
|
296
|
-
}
|
|
297
|
-
catch (error) {
|
|
298
|
-
return tirithFailure(error);
|
|
299
|
-
}
|
|
300
|
-
}));
|
|
301
|
-
return joinTirithReports(reports);
|
|
302
|
-
}
|
|
303
|
-
catch (error) {
|
|
304
|
-
return tirithFailure(error);
|
|
305
|
-
}
|
|
306
|
-
finally {
|
|
307
|
-
if (state !== undefined)
|
|
308
|
-
await rm(state, { recursive: true, force: true });
|
|
309
|
-
}
|
|
310
|
-
};
|
|
311
|
-
//# sourceMappingURL=tirith.js.map
|
package/dist/tirith.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tirith.js","sourceRoot":"","sources":["../src/tirith.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAyC,MAAM,qBAAqB,CAAC;AACzG,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYhD,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAChF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AACnE,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,IAAmB;IACnE,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC,CAAC;IACjE,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,IAAI,EAAE,CAAC,CAAC;IACtG,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC1G,CAAC;AAED,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAC9C,MAAM,aAAa,GAAG,yFAAyF,CAAC;AAChH,MAAM,WAAW,GAAG,2DAA2D,CAAC;AAEhF,MAAM,kBAAkB,GACtB,gOAAgO,CAAC;AAInO,MAAM,UAAU,cAAc,CAAC,MAAoB;IACjD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IAC9C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAChD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,eAAe,CAAC;QAAE,OAAO,UAAU,CAAC;IAC9F,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAAE,OAAO,WAAW,CAAC;IACjE,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAsB;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,OAAO,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;AACvF,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,qBAAqB;IACrB,iBAAiB;IACjB,iBAAiB;IACjB,mBAAmB;IACnB,eAAe;IACf,uBAAuB;IACvB,uBAAuB;IACvB,eAAe;IACf,iBAAiB;IACjB,wBAAwB;IACxB,oBAAoB;IACpB,oBAAoB;IACpB,oBAAoB;IACpB,gBAAgB;IAChB,oBAAoB;IACpB,eAAe;IACf,mBAAmB;IACnB,wBAAwB;IACxB,mBAAmB;IACnB,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,6BAA6B;IAC7B,sBAAsB;IACtB,iCAAiC;IACjC,0BAA0B;IAC1B,mBAAmB;IACnB,oBAAoB;IACpB,wBAAwB;CACzB,CAAC,CAAC;AAEH,SAAS,SAAS,CAAC,MAAoB;IACrC,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,QAAQ,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,SAAS,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,KAAK,CAAC;QACf,KAAK,UAAU;YACb,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;gBAAE,OAAO,SAAS,CAAC;YAChD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;gBAAE,OAAO,KAAK,CAAC;YAC3C,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,QAAQ,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,OAAO;YACV,OAAO,mDAAmD,CAAC;QAC7D,KAAK,WAAW,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC;QACd,KAAK,YAAY;YACf,OAAO,aAAa,CAAC,kBAAkB,EAAE,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7E,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,eAAe,CAAC,CAAC;YAC1F,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,IAAI,cAAc,CAAC,MAAM,CAAC,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IACrD,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAA+B;IACjE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAC1B,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,cAAc,CAAC,MAAc;IACpC,IAAI,MAAM,KAAK,oCAAoC,EAAE,CAAC;QACpD,OAAO,qIAAqI,CAAC;IAC/I,CAAC;IACD,IAAI,MAAM,KAAK,oBAAoB,EAAE,CAAC;QACpC,OAAO,uJAAuJ,CAAC;IACjK,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,aAAa,CAAC,OAAsB;IAC3C,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAClF,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzF,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC;IACnG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnG,IAAI,GAAG,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,mBAAmB,GAAG,GAAG,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,MAAM,KAAK,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACjC,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACrD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,KAAwB;IAC3D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,GAAG,IAAI,+CAA+C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC7G,CAAC;AAED,SAAS,eAAe,CAAC,QAAkC;IACzD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,CAAC;YACtC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,EAAE,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACtF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,KAAK,CAAC,YAAY,CAAC;SACnB,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACtE,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACzE,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,CAAC,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,KAAK,CAAC,gCAAgC,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,oBAAoB,QAAQ,eAAe,CAAC,CAAC,CAAC;IAC3F,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;AACxF,CAAC;AAED,8FAA8F;AAC9F,SAAS,UAAU,CAAC,KAAa;IAC/B,MAAM,GAAG,GAAsB;QAC7B,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,KAAK;QAClB,eAAe,EAAE,KAAK;QACtB,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,KAAK;QACrB,OAAO,EAAE,KAAK;QACd,YAAY,EAAE,KAAK;QACnB,kBAAkB,EAAE,UAAU;QAC9B,UAAU,EAAE,GAAG;QACf,cAAc,EAAE,GAAG;KACpB,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3F,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAgC;IACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC9D,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC9F,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IACnE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACpF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IAC5F,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,cAAc,CACrB,MAAc,EACd,OAAe,EACf,GAAW,EACX,GAAsB,EACtB,MAA+B;IAE/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,QAAQ,CACN,MAAM,EACN,CAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,mBAAmB,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,EACjH;YACE,GAAG;YACH,GAAG;YACH,MAAM;YACN,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,IAAI,GAAG,IAAI;YACtB,QAAQ,EAAE,MAAM;YAChB,WAAW,EAAE,IAAI;SAClB,EACD,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAChB,IAAI,CAAC;gBACH,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;oBAClB,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;oBACtC,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;gBACxB,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ;oBAAE,MAAM,KAAK,CAAC;gBAC1E,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,MAAM,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,CAAC,CAAC;YACjB,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAiB,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;IAC1E,IAAI,KAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,8GAA8G;QAC9G,MAAM,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnE,KAAK,GAAG,IAAI,CAAC;QACb,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBACpE,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC7B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;gBACjE,CAAC;gBACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAyB,CAAC;YACrF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QACF,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;YAAS,CAAC;QACT,IAAI,KAAK,KAAK,SAAS;YAAE,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;AACH,CAAC,CAAC"}
|