@shriyanss/js-recon 1.4.1-alpha.4 → 1.4.1-alpha.6
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/.github/workflows/build-and-prettify.yaml +187 -1
- package/.github/workflows/promote-js-recon.yml +116 -0
- package/.github/workflows/publish-js-recon.yml +7 -114
- package/.github/workflows/rules-smoke-test.yaml +79 -0
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +208 -14
- package/Dockerfile.release +29 -0
- package/README.md +18 -17
- package/build/analyze/engine/csMastSEngine.js +129 -0
- package/build/analyze/engine/csMastSEngine.js.map +1 -0
- package/build/analyze/engine/index.js +15 -0
- package/build/analyze/engine/index.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/findDirectAssignment.js +2 -1
- package/build/analyze/helpers/engineHelpers/findDirectAssignment.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js +2 -1
- package/build/analyze/helpers/engineHelpers/findMemberExpressionAssignment.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js +2 -1
- package/build/analyze/helpers/engineHelpers/resolveFunctionIdentifier.js.map +1 -1
- package/build/analyze/helpers/engineHelpers/taintFlow.js +11 -2
- package/build/analyze/helpers/engineHelpers/taintFlow.js.map +1 -1
- package/build/analyze/helpers/schemas.js +5 -1
- package/build/analyze/helpers/schemas.js.map +1 -1
- package/build/analyze/helpers/validate.js +3 -3
- package/build/analyze/helpers/validate.js.map +1 -1
- package/build/completion/index.js +432 -0
- package/build/completion/index.js.map +1 -0
- package/build/cs_mast/index.js +94 -3
- package/build/cs_mast/index.js.map +1 -1
- package/build/endpoints/next_js/client_jsFilesHref.js +2 -1
- package/build/endpoints/next_js/client_jsFilesHref.js.map +1 -1
- package/build/endpoints/next_js/client_jsonParse.js +2 -1
- package/build/endpoints/next_js/client_jsonParse.js.map +1 -1
- package/build/endpoints/next_js/client_mappedJsonFile.js +2 -1
- package/build/endpoints/next_js/client_mappedJsonFile.js.map +1 -1
- package/build/endpoints/next_js/client_subsequentRequests.js +2 -1
- package/build/endpoints/next_js/client_subsequentRequests.js.map +1 -1
- package/build/fingerprint/index.js +56 -33
- package/build/fingerprint/index.js.map +1 -1
- package/build/globalConfig.js +1 -1
- package/build/index.js +67 -6
- package/build/index.js.map +1 -1
- package/build/lazyLoad/angular/angular_getFromMainJs.js +2 -1
- package/build/lazyLoad/angular/angular_getFromMainJs.js.map +1 -1
- package/build/lazyLoad/downloadFilesUtil.js +6 -5
- package/build/lazyLoad/downloadFilesUtil.js.map +1 -1
- package/build/lazyLoad/downloadLoadedJsUtil.js +56 -7
- package/build/lazyLoad/downloadLoadedJsUtil.js.map +1 -1
- package/build/lazyLoad/downloadQueue.js +9 -8
- package/build/lazyLoad/downloadQueue.js.map +1 -1
- package/build/lazyLoad/index.js +28 -1
- package/build/lazyLoad/index.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js +36 -34
- package/build/lazyLoad/next_js/next_GetLazyResourcesBuildManifestJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js +63 -15
- package/build/lazyLoad/next_js/next_GetLazyResourcesWebpackJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_parseLayoutJs.js +80 -68
- package/build/lazyLoad/next_js/next_parseLayoutJs.js.map +1 -1
- package/build/lazyLoad/next_js/next_promiseResolve.js +22 -16
- package/build/lazyLoad/next_js/next_promiseResolve.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js +49 -47
- package/build/lazyLoad/nuxt_js/nuxt_astParse.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js +3 -1
- package/build/lazyLoad/nuxt_js/nuxt_getFromPageSource.js.map +1 -1
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js +3 -2
- package/build/lazyLoad/nuxt_js/nuxt_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/react/react_followImports.js +12 -9
- package/build/lazyLoad/react/react_followImports.js.map +1 -1
- package/build/lazyLoad/react/react_webpackChunkPaths.js +175 -123
- package/build/lazyLoad/react/react_webpackChunkPaths.js.map +1 -1
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js +3 -2
- package/build/lazyLoad/svelte/svelte_stringAnalysisJSFiles.js.map +1 -1
- package/build/lazyLoad/techDetect/checkAngularJS.js +27 -6
- package/build/lazyLoad/techDetect/checkAngularJS.js.map +1 -1
- package/build/lazyLoad/techDetect/checkReact.js +8 -0
- package/build/lazyLoad/techDetect/checkReact.js.map +1 -1
- package/build/lazyLoad/techDetect/index.js +23 -2
- package/build/lazyLoad/techDetect/index.js.map +1 -1
- package/build/lazyLoad/vue/vue_RuntimeJs.js +2 -1
- package/build/lazyLoad/vue/vue_RuntimeJs.js.map +1 -1
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js +2 -1
- package/build/lazyLoad/vue/vue_SingleJsFileOnHome.js.map +1 -1
- package/build/lazyLoad/vue/vue_discoverJsFiles.js +22 -10
- package/build/lazyLoad/vue/vue_discoverJsFiles.js.map +1 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js +2 -1
- package/build/lazyLoad/vue/vue_getClientSidePaths.js.map +1 -1
- package/build/lazyLoad/vue/vue_jsImports.js +2 -1
- package/build/lazyLoad/vue/vue_jsImports.js.map +1 -1
- package/build/lazyLoad/vue/vue_viteMapDeps.js +62 -54
- package/build/lazyLoad/vue/vue_viteMapDeps.js.map +1 -1
- package/build/map/angular_js/getAngularConnections.js +1 -1
- package/build/map/angular_js/getAngularConnections.js.map +1 -1
- package/build/map/graphql/resolveGraphql.js +2 -1
- package/build/map/graphql/resolveGraphql.js.map +1 -1
- package/build/map/next_js/getExports.js +2 -1
- package/build/map/next_js/getExports.js.map +1 -1
- package/build/map/next_js/getFetchInstances.js +2 -1
- package/build/map/next_js/getFetchInstances.js.map +1 -1
- package/build/map/next_js/getTurbopackConnections.js +2 -1
- package/build/map/next_js/getTurbopackConnections.js.map +1 -1
- package/build/map/next_js/getWebpackConnections.js +2 -1
- package/build/map/next_js/getWebpackConnections.js.map +1 -1
- package/build/map/next_js/resolveAxios.js +2 -1
- package/build/map/next_js/resolveAxios.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/directCallsWithoutAssignment.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/findAxiosInstance.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/findCrossChunkParams.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/handleAxiosCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/handleZDotCreate.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/interceptorHeaders.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/processExportedEndpoints.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/traceAxiosInstanceExports.js.map +1 -1
- package/build/map/next_js/resolveAxiosHelpers/traceBody.js +2 -1
- package/build/map/next_js/resolveAxiosHelpers/traceBody.js.map +1 -1
- package/build/map/next_js/resolveFetch.js +2 -1
- package/build/map/next_js/resolveFetch.js.map +1 -1
- package/build/map/next_js/resolveNewRequest.js +2 -1
- package/build/map/next_js/resolveNewRequest.js.map +1 -1
- package/build/map/next_js/resolveServerActions.js +2 -1
- package/build/map/next_js/resolveServerActions.js.map +1 -1
- package/build/map/next_js/utils.js +2 -1
- package/build/map/next_js/utils.js.map +1 -1
- package/build/map/react_js/getReactConnections.js +5 -4
- package/build/map/react_js/getReactConnections.js.map +1 -1
- package/build/map/vue_js/crossFileResolver.js +3 -2
- package/build/map/vue_js/crossFileResolver.js.map +1 -1
- package/build/map/vue_js/getViteConnections.js +5 -4
- package/build/map/vue_js/getViteConnections.js.map +1 -1
- package/build/map/vue_js/taint_utils.js +2 -1
- package/build/map/vue_js/taint_utils.js.map +1 -1
- package/build/map/vue_js/vue_resolveFetch.js +3 -2
- package/build/map/vue_js/vue_resolveFetch.js.map +1 -1
- package/build/map/vue_js/vue_resolveHttpClient.js +3 -2
- package/build/map/vue_js/vue_resolveHttpClient.js.map +1 -1
- package/build/map/vue_js/vue_resolveXhr.js +3 -2
- package/build/map/vue_js/vue_resolveXhr.js.map +1 -1
- package/build/refactor/index.js +399 -60
- package/build/refactor/index.js.map +1 -1
- package/build/refactor/next/helpers.js +194 -13
- package/build/refactor/next/helpers.js.map +1 -1
- package/build/refactor/next/index.js +223 -36
- package/build/refactor/next/index.js.map +1 -1
- package/build/refactor/next/transform.js +905 -55
- package/build/refactor/next/transform.js.map +1 -1
- package/build/refactor/react/index.js +3 -3
- package/build/refactor/react/index.js.map +1 -1
- package/build/refactor/react/transform.js +2 -1
- package/build/refactor/react/transform.js.map +1 -1
- package/build/refactor/react/validator.js +2 -1
- package/build/refactor/react/validator.js.map +1 -1
- package/build/refactor/react-vite/index.js +39 -5
- package/build/refactor/react-vite/index.js.map +1 -1
- package/build/refactor/react-vite/vendor-analyze.js +3 -3
- package/build/refactor/react-vite/vendor-analyze.js.map +1 -1
- package/build/refactor/remote/config.js +17 -1
- package/build/refactor/remote/config.js.map +1 -1
- package/build/refactor/remote/hf-client.js +27 -2
- package/build/refactor/remote/hf-client.js.map +1 -1
- package/build/refactor/remote/version-detect.js +355 -0
- package/build/refactor/remote/version-detect.js.map +1 -0
- package/build/refactor/vue/index.js +176 -0
- package/build/refactor/vue/index.js.map +1 -0
- package/build/refactor/vue/vendor-analyze-vue.js +271 -0
- package/build/refactor/vue/vendor-analyze-vue.js.map +1 -0
- package/build/refactor/vue/vite.js +216 -0
- package/build/refactor/vue/vite.js.map +1 -0
- package/build/report/utility/genHtml.js +14 -3
- package/build/report/utility/genHtml.js.map +1 -1
- package/build/run/bundler-detect.js +140 -0
- package/build/run/bundler-detect.js.map +1 -0
- package/build/run/index.js +91 -5
- package/build/run/index.js.map +1 -1
- package/build/strings/index.js +6 -2
- package/build/strings/index.js.map +1 -1
- package/build/strings/trufflehog.js +71 -0
- package/build/strings/trufflehog.js.map +1 -0
- package/build/utility/makeReq.js +10 -9
- package/build/utility/makeReq.js.map +1 -1
- package/build/utility/postmanGenerator.js +2 -2
- package/build/utility/postmanGenerator.js.map +1 -1
- package/build/utility/puppeteerInstance.js +7 -1
- package/build/utility/puppeteerInstance.js.map +1 -1
- package/package.json +9 -5
- package/scripts/smoke-test.js +74 -0
|
@@ -0,0 +1,355 @@
|
|
|
1
|
+
// Version detection for React bundles using CS-MAST-S reliable signatures.
|
|
2
|
+
// Fetches per-version reliable_signatures.json from the HuggingFace dataset and
|
|
3
|
+
// matches them against CS-MAST signatures generated from the target bundle's chunks.
|
|
4
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
5
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
6
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
7
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
8
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
9
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
10
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
import fs from "fs";
|
|
14
|
+
import path from "path";
|
|
15
|
+
import os from "os";
|
|
16
|
+
import chalk from "chalk";
|
|
17
|
+
import { cs_mast_init } from "@shriyanss/cs-mast";
|
|
18
|
+
import { getHfRawUrl, getHfApiTreeUrl, fetchText } from "./hf-client.js";
|
|
19
|
+
// Maps refactor tech identifier to the bundler name used in the HF version bucket path.
|
|
20
|
+
export const VERSION_TECH_TO_BUNDLER = {
|
|
21
|
+
"react-webpack": "webpack",
|
|
22
|
+
"react-vite": "vite",
|
|
23
|
+
};
|
|
24
|
+
// Maps HF version folder name to npm semver strings for package.json generation.
|
|
25
|
+
// react-dom is absent for React versions that predated the react-dom split (< 0.14).
|
|
26
|
+
const REACT_VERSION_TO_NPM = {
|
|
27
|
+
"react-0.11": { react: "0.11.2" },
|
|
28
|
+
"react-0.12": { react: "0.12.2" },
|
|
29
|
+
"react-0.13": { react: "0.13.3" },
|
|
30
|
+
"react-0.14": { react: "0.14.10", reactDom: "0.14.10" },
|
|
31
|
+
"react-15": { react: "15.7.0", reactDom: "15.7.0" },
|
|
32
|
+
"react-16": { react: "16.14.0", reactDom: "16.14.0" },
|
|
33
|
+
"react-17": { react: "17.0.2", reactDom: "17.0.2" },
|
|
34
|
+
"react-18": { react: "18.3.1", reactDom: "18.3.1" },
|
|
35
|
+
"react-19": { react: "19.1.0", reactDom: "19.1.0" },
|
|
36
|
+
};
|
|
37
|
+
const VERSION_CACHE_DIR = path.join(os.homedir(), ".js-recon", "refactor", "version_sigs_cache");
|
|
38
|
+
// Cache TTL: 7 days (matches the list-cache TTL for collisions.json files).
|
|
39
|
+
const CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
40
|
+
function getVersionCachePath(bundler, version, scatDir) {
|
|
41
|
+
return path.join(VERSION_CACHE_DIR, bundler, version, scatDir, "reliable_signatures.json");
|
|
42
|
+
}
|
|
43
|
+
function loadCachedReliableSigs(bundler, version, scatDir) {
|
|
44
|
+
const filePath = getVersionCachePath(bundler, version, scatDir);
|
|
45
|
+
const cachedAtPath = filePath + ".cached_at";
|
|
46
|
+
if (!fs.existsSync(filePath) || !fs.existsSync(cachedAtPath))
|
|
47
|
+
return null;
|
|
48
|
+
try {
|
|
49
|
+
const cachedAt = parseInt(fs.readFileSync(cachedAtPath, "utf8").trim(), 10);
|
|
50
|
+
if (isNaN(cachedAt) || Date.now() - cachedAt > CACHE_TTL_MS)
|
|
51
|
+
return null;
|
|
52
|
+
return JSON.parse(fs.readFileSync(filePath, "utf8"));
|
|
53
|
+
}
|
|
54
|
+
catch (_a) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function saveCachedReliableSigs(bundler, version, scatDir, sigs) {
|
|
59
|
+
const filePath = getVersionCachePath(bundler, version, scatDir);
|
|
60
|
+
const cachedAtPath = filePath + ".cached_at";
|
|
61
|
+
try {
|
|
62
|
+
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
63
|
+
fs.writeFileSync(filePath, JSON.stringify(sigs));
|
|
64
|
+
fs.writeFileSync(cachedAtPath, String(Date.now()));
|
|
65
|
+
}
|
|
66
|
+
catch (_a) {
|
|
67
|
+
// Non-fatal — next run will re-fetch
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// Lists available React version directories under version/react/<bundler>/ in the HF bucket.
|
|
71
|
+
// Returns an array of version folder names like ["react-16", "react-17", "react-18"].
|
|
72
|
+
export function listAvailableVersions(bundler) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const prefix = `version/react/${bundler}`;
|
|
75
|
+
const dirs = new Set();
|
|
76
|
+
let nextUrl = getHfApiTreeUrl(prefix);
|
|
77
|
+
while (nextUrl) {
|
|
78
|
+
let resp;
|
|
79
|
+
try {
|
|
80
|
+
resp = yield fetch(nextUrl);
|
|
81
|
+
}
|
|
82
|
+
catch (_a) {
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
if (resp.status === 429)
|
|
86
|
+
throw new Error(`Rate limited by HuggingFace`);
|
|
87
|
+
if (!resp.ok)
|
|
88
|
+
break;
|
|
89
|
+
const text = yield resp.text();
|
|
90
|
+
try {
|
|
91
|
+
const entries = JSON.parse(text);
|
|
92
|
+
const prefixSlash = prefix.endsWith("/") ? prefix : `${prefix}/`;
|
|
93
|
+
for (const e of entries) {
|
|
94
|
+
const rel = e.path.startsWith(prefixSlash) ? e.path.slice(prefixSlash.length) : e.path;
|
|
95
|
+
const parts = rel.split("/");
|
|
96
|
+
if (parts.length > 1 && parts[0].startsWith("react-"))
|
|
97
|
+
dirs.add(parts[0]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (_b) {
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
const linkHeader = resp.headers.get("link");
|
|
104
|
+
const match = linkHeader === null || linkHeader === void 0 ? void 0 : linkHeader.match(/<([^>]+)>;\s*rel="next"/);
|
|
105
|
+
nextUrl = match ? match[1] : null;
|
|
106
|
+
}
|
|
107
|
+
return Array.from(dirs).sort();
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Lists scat config directory names immediately under version/react/<bundler>/<version>/ in the HF bucket.
|
|
111
|
+
// Returns strings like ["cond-name-op_name", "id-cond-name-op_name", "lit-decl-loop-cond", ...].
|
|
112
|
+
function listScatDirsForVersion(bundler, version) {
|
|
113
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
114
|
+
const prefix = `version/react/${bundler}/${version}`;
|
|
115
|
+
const dirs = new Set();
|
|
116
|
+
let nextUrl = getHfApiTreeUrl(prefix);
|
|
117
|
+
while (nextUrl) {
|
|
118
|
+
let resp;
|
|
119
|
+
try {
|
|
120
|
+
resp = yield fetch(nextUrl);
|
|
121
|
+
}
|
|
122
|
+
catch (_a) {
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
if (resp.status === 429)
|
|
126
|
+
throw new Error(`Rate limited by HuggingFace`);
|
|
127
|
+
if (!resp.ok)
|
|
128
|
+
break;
|
|
129
|
+
const text = yield resp.text();
|
|
130
|
+
try {
|
|
131
|
+
const entries = JSON.parse(text);
|
|
132
|
+
const prefixSlash = `${prefix}/`;
|
|
133
|
+
for (const e of entries) {
|
|
134
|
+
const rel = e.path.startsWith(prefixSlash) ? e.path.slice(prefixSlash.length) : e.path;
|
|
135
|
+
const parts = rel.split("/");
|
|
136
|
+
if (parts.length > 1 && parts[0])
|
|
137
|
+
dirs.add(parts[0]);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (_b) {
|
|
141
|
+
break;
|
|
142
|
+
}
|
|
143
|
+
const linkHeader = resp.headers.get("link");
|
|
144
|
+
const match = linkHeader === null || linkHeader === void 0 ? void 0 : linkHeader.match(/<([^>]+)>;\s*rel="next"/);
|
|
145
|
+
nextUrl = match ? match[1] : null;
|
|
146
|
+
}
|
|
147
|
+
return Array.from(dirs).sort();
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Dynamically selects up to `threshold` scat configs that have non-empty reliable_signatures.json
|
|
152
|
+
* for ALL known versions of the given bundler. A scat config is only selected if every version's
|
|
153
|
+
* reliable_signatures.json for that config is non-empty — ensuring it can be used for detection
|
|
154
|
+
* across the full version range.
|
|
155
|
+
*
|
|
156
|
+
* @param bundler - Bundler name (e.g. "webpack", "vite")
|
|
157
|
+
* @param versions - Available version folder names from listAvailableVersions()
|
|
158
|
+
* @param threshold - Maximum number of scat configs to select (must be positive)
|
|
159
|
+
* @returns Array of selected scatDir strings (may be shorter than threshold if insufficient data)
|
|
160
|
+
*/
|
|
161
|
+
export function selectDynamicScatConfigs(bundler, versions, threshold) {
|
|
162
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
163
|
+
if (versions.length === 0)
|
|
164
|
+
return [];
|
|
165
|
+
// Use the first version to enumerate available scat dirs; all versions share the same set.
|
|
166
|
+
const referenceVersion = versions[0];
|
|
167
|
+
console.log(chalk.cyan(`[i] Dynamic scat config selection: listing scat dirs for ${bundler}/${referenceVersion}...`));
|
|
168
|
+
let scatDirs;
|
|
169
|
+
try {
|
|
170
|
+
scatDirs = yield listScatDirsForVersion(bundler, referenceVersion);
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
console.log(chalk.yellow(`[!] Dynamic scat selection: could not list scat dirs (${String(e)})`));
|
|
174
|
+
return [];
|
|
175
|
+
}
|
|
176
|
+
if (scatDirs.length === 0) {
|
|
177
|
+
console.log(chalk.yellow(`[!] Dynamic scat selection: no scat dirs found for ${bundler}/${referenceVersion}`));
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
const selected = [];
|
|
181
|
+
for (const scatDir of scatDirs) {
|
|
182
|
+
if (selected.length >= threshold)
|
|
183
|
+
break;
|
|
184
|
+
// A config is usable only if reliable_signatures.json is non-empty for every known version.
|
|
185
|
+
let allNonEmpty = true;
|
|
186
|
+
for (const version of versions) {
|
|
187
|
+
const sigs = yield fetchReliableSignatures(bundler, version, scatDir);
|
|
188
|
+
if (!sigs || sigs.length === 0) {
|
|
189
|
+
allNonEmpty = false;
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (allNonEmpty) {
|
|
194
|
+
selected.push(scatDir);
|
|
195
|
+
console.log(chalk.cyan(`[i] Dynamic scat config selected: ${scatDir} (${selected.length}/${threshold})`));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return selected;
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Validates that a static (user-supplied) scat config has non-empty reliable_signatures.json
|
|
203
|
+
* for every known version. Returns true when the config is usable; false if any version is empty.
|
|
204
|
+
*/
|
|
205
|
+
export function validateStaticScatConfig(bundler, versions, scatDir) {
|
|
206
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
207
|
+
for (const version of versions) {
|
|
208
|
+
const sigs = yield fetchReliableSignatures(bundler, version, scatDir);
|
|
209
|
+
if (!sigs || sigs.length === 0)
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
return true;
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
// Fetches (or loads from cache) reliable_signatures.json for one (bundler, version, scatDir) combo.
|
|
216
|
+
// Returns an array of PHC signature strings, or null if not available.
|
|
217
|
+
function fetchReliableSignatures(bundler, version, scatDir) {
|
|
218
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
219
|
+
const cached = loadCachedReliableSigs(bundler, version, scatDir);
|
|
220
|
+
if (cached !== null)
|
|
221
|
+
return cached;
|
|
222
|
+
const hfSubpath = `${version}/${scatDir}/reliable_signatures.json`;
|
|
223
|
+
const url = getHfRawUrl(`version/react/${bundler}`, hfSubpath);
|
|
224
|
+
const text = yield fetchText(url);
|
|
225
|
+
if (text === null)
|
|
226
|
+
return null;
|
|
227
|
+
try {
|
|
228
|
+
const sigs = JSON.parse(text);
|
|
229
|
+
if (!Array.isArray(sigs))
|
|
230
|
+
return null;
|
|
231
|
+
saveCachedReliableSigs(bundler, version, scatDir, sigs);
|
|
232
|
+
return sigs;
|
|
233
|
+
}
|
|
234
|
+
catch (_a) {
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
// Generates the set of all CS-MAST sub-tree signatures from every chunk in the mapped JSON,
|
|
240
|
+
// plus any extra code snippets (e.g. vendor chunk file contents not included in mapped.json).
|
|
241
|
+
// Uses the same scat categories that drove library stripping so detection uses a consistent
|
|
242
|
+
// signature space.
|
|
243
|
+
export function generateBundleSignatures(chunks, scat, extraCodes) {
|
|
244
|
+
const allSigs = new Set();
|
|
245
|
+
const codesToHash = [
|
|
246
|
+
...Object.values(chunks)
|
|
247
|
+
.map((c) => c.code)
|
|
248
|
+
.filter(Boolean),
|
|
249
|
+
...(extraCodes !== null && extraCodes !== void 0 ? extraCodes : []),
|
|
250
|
+
];
|
|
251
|
+
for (const code of codesToHash) {
|
|
252
|
+
try {
|
|
253
|
+
const tree = cs_mast_init(code, {
|
|
254
|
+
hash: "sha256",
|
|
255
|
+
scat,
|
|
256
|
+
sinc: [],
|
|
257
|
+
lang: "js",
|
|
258
|
+
prsr: "@babel/parser",
|
|
259
|
+
sourceType: "unambiguous",
|
|
260
|
+
});
|
|
261
|
+
for (const sig of tree._signatureMap.keys()) {
|
|
262
|
+
allSigs.add(sig);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
catch (_a) {
|
|
266
|
+
// Unparseable chunk (e.g. CSS-in-JS string, syntax error) — skip silently
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return allSigs;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Detects the React version used in a bundle by matching its CS-MAST signatures against
|
|
273
|
+
* per-version reliable_signatures.json files from the HuggingFace dataset.
|
|
274
|
+
*
|
|
275
|
+
* @param chunks - Parsed mapped.json chunks from the target bundle
|
|
276
|
+
* @param tech - Refactor tech identifier (e.g. "react-webpack")
|
|
277
|
+
* @param scatDirs - Scat directory names to use (e.g. ["lit-decl-loop-cond", "id-cond"]). Match
|
|
278
|
+
* counts across all scat dirs are summed per version; the version with the
|
|
279
|
+
* highest total wins.
|
|
280
|
+
* @param extraCodes - Additional raw JS code strings to include in signature generation
|
|
281
|
+
* (e.g. vendor chunk files that contain React library code but are
|
|
282
|
+
* not present in mapped.json)
|
|
283
|
+
* @returns The best-matching version result, or null if no version data available or no match found
|
|
284
|
+
*/
|
|
285
|
+
export function detectReactVersion(chunks, tech, scatDirs, extraCodes) {
|
|
286
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
287
|
+
var _a, _b;
|
|
288
|
+
const bundler = VERSION_TECH_TO_BUNDLER[tech];
|
|
289
|
+
if (!bundler)
|
|
290
|
+
return null;
|
|
291
|
+
if (scatDirs.length === 0)
|
|
292
|
+
return null;
|
|
293
|
+
// List available versions for this bundler
|
|
294
|
+
console.log(chalk.cyan(`[i] Version detection: listing available React versions for ${bundler}...`));
|
|
295
|
+
let versions;
|
|
296
|
+
try {
|
|
297
|
+
versions = yield listAvailableVersions(bundler);
|
|
298
|
+
}
|
|
299
|
+
catch (e) {
|
|
300
|
+
console.log(chalk.yellow(`[!] Version detection: could not list versions (${String(e)})`));
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
if (versions.length === 0) {
|
|
304
|
+
console.log(chalk.yellow(`[!] Version detection: no version data found for ${bundler} in the dataset`));
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
console.log(chalk.cyan(`[i] Version detection: using ${scatDirs.length} scat config(s): ${scatDirs.join(", ")}`));
|
|
308
|
+
const totalCodeUnits = Object.keys(chunks).length + ((_a = extraCodes === null || extraCodes === void 0 ? void 0 : extraCodes.length) !== null && _a !== void 0 ? _a : 0);
|
|
309
|
+
// Accumulate match counts per version across all scat dirs.
|
|
310
|
+
// Each scat config contributes independent signature evidence; summing gives a stronger signal.
|
|
311
|
+
const matchesPerVersion = new Map();
|
|
312
|
+
for (const scatDir of scatDirs) {
|
|
313
|
+
// Derive ScatCategory[] from scatDir for signature generation.
|
|
314
|
+
// scatDir uses hyphens as separators and op_name uses an underscore internally —
|
|
315
|
+
// splitting on "-" yields valid ScatCategory values for all 511 combos.
|
|
316
|
+
const scat = scatDir.split("-");
|
|
317
|
+
console.log(chalk.cyan(`[i] Version detection: generating signatures from ${totalCodeUnits} code unit(s) (scat: ${scatDir})...`));
|
|
318
|
+
const bundleSigs = generateBundleSignatures(chunks, scat, extraCodes);
|
|
319
|
+
if (bundleSigs.size === 0) {
|
|
320
|
+
console.log(chalk.yellow(`[!] Version detection: no signatures generated for scat "${scatDir}", skipping`));
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
console.log(chalk.cyan(`[i] Version detection: checking ${versions.length} versions for scat "${scatDir}"...`));
|
|
324
|
+
for (const version of versions) {
|
|
325
|
+
const reliableSigs = yield fetchReliableSignatures(bundler, version, scatDir);
|
|
326
|
+
if (!reliableSigs || reliableSigs.length === 0)
|
|
327
|
+
continue;
|
|
328
|
+
let matchCount = 0;
|
|
329
|
+
for (const sig of reliableSigs) {
|
|
330
|
+
if (bundleSigs.has(sig))
|
|
331
|
+
matchCount++;
|
|
332
|
+
}
|
|
333
|
+
if (matchCount > 0) {
|
|
334
|
+
matchesPerVersion.set(version, ((_b = matchesPerVersion.get(version)) !== null && _b !== void 0 ? _b : 0) + matchCount);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
let bestMatch = null;
|
|
339
|
+
for (const [version, totalMatches] of matchesPerVersion.entries()) {
|
|
340
|
+
const npmInfo = REACT_VERSION_TO_NPM[version];
|
|
341
|
+
if (!npmInfo)
|
|
342
|
+
continue;
|
|
343
|
+
if (!bestMatch || totalMatches > bestMatch.matchCount) {
|
|
344
|
+
bestMatch = {
|
|
345
|
+
versionKey: version,
|
|
346
|
+
reactNpm: npmInfo.react,
|
|
347
|
+
reactDomNpm: npmInfo.reactDom,
|
|
348
|
+
matchCount: totalMatches,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return bestMatch;
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
//# sourceMappingURL=version-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-detect.js","sourceRoot":"","sources":["../../../src/refactor/remote/version-detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
var _a;
|
|
11
|
+
import chalk from "chalk";
|
|
12
|
+
import parser from "@babel/parser";
|
|
13
|
+
import _traverse from "@babel/traverse";
|
|
14
|
+
import * as t from "@babel/types";
|
|
15
|
+
import { transformWebpackModule } from "../next/transform.js";
|
|
16
|
+
import { validateAndFix } from "../next/validator.js";
|
|
17
|
+
const traverse = ((_a = _traverse.default) !== null && _a !== void 0 ? _a : _traverse);
|
|
18
|
+
/**
|
|
19
|
+
* Extracts the numeric module map from a webpack chunk container.
|
|
20
|
+
*
|
|
21
|
+
* Handles both webpack 4 (webpackJsonp) and webpack 5 (webpackChunk) formats:
|
|
22
|
+
*
|
|
23
|
+
* webpack 4: (window.webpackJsonp = window.webpackJsonp || []).push([[chunkIds], {moduleId: fn, ...}])
|
|
24
|
+
* webpack 5: (self.webpackChunk_APP = self.webpackChunk_APP || []).push([[chunkIds], {moduleId: fn, ...}, runtimeFn])
|
|
25
|
+
*
|
|
26
|
+
* Returns an array of { id, fnNode } pairs for all module functions in the chunk,
|
|
27
|
+
* or an empty array if the container format is not recognised.
|
|
28
|
+
*/
|
|
29
|
+
function extractModulesFromWebpackChunk(ast) {
|
|
30
|
+
const results = [];
|
|
31
|
+
traverse(ast, {
|
|
32
|
+
CallExpression(callPath) {
|
|
33
|
+
const node = callPath.node;
|
|
34
|
+
const callee = node.callee;
|
|
35
|
+
// Must be a member expression ending in `.push`
|
|
36
|
+
if (!t.isMemberExpression(callee) || callee.computed)
|
|
37
|
+
return;
|
|
38
|
+
if (!t.isIdentifier(callee.property, { name: "push" }))
|
|
39
|
+
return;
|
|
40
|
+
if (node.arguments.length < 1)
|
|
41
|
+
return;
|
|
42
|
+
// The single argument is an array: [[chunkIds], {moduleMap}, ?runtimeFn]
|
|
43
|
+
const arg = node.arguments[0];
|
|
44
|
+
if (!t.isArrayExpression(arg))
|
|
45
|
+
return;
|
|
46
|
+
if (arg.elements.length < 2)
|
|
47
|
+
return;
|
|
48
|
+
const moduleMapNode = arg.elements[1];
|
|
49
|
+
if (!moduleMapNode || !t.isObjectExpression(moduleMapNode))
|
|
50
|
+
return;
|
|
51
|
+
// Confirm the object contains at least one numeric or string key
|
|
52
|
+
const props = moduleMapNode.properties;
|
|
53
|
+
const hasModuleProps = props.some((p) => t.isObjectProperty(p) &&
|
|
54
|
+
(t.isNumericLiteral(p.key) || t.isStringLiteral(p.key)));
|
|
55
|
+
if (!hasModuleProps)
|
|
56
|
+
return;
|
|
57
|
+
// Extract all module functions
|
|
58
|
+
for (const prop of props) {
|
|
59
|
+
if (!t.isObjectProperty(prop))
|
|
60
|
+
continue;
|
|
61
|
+
const key = prop.key;
|
|
62
|
+
const val = prop.value;
|
|
63
|
+
const moduleId = t.isNumericLiteral(key)
|
|
64
|
+
? String(key.value)
|
|
65
|
+
: t.isStringLiteral(key)
|
|
66
|
+
? key.value
|
|
67
|
+
: null;
|
|
68
|
+
if (!moduleId)
|
|
69
|
+
continue;
|
|
70
|
+
if (!t.isFunctionExpression(val) && !t.isArrowFunctionExpression(val))
|
|
71
|
+
continue;
|
|
72
|
+
results.push({
|
|
73
|
+
id: moduleId,
|
|
74
|
+
fnNode: val,
|
|
75
|
+
path: callPath,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
callPath.stop();
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Refactors a Vue webpack chunk into per-module ES module files.
|
|
85
|
+
*
|
|
86
|
+
* Input: a Chunk whose `code` field is a full webpack chunk file:
|
|
87
|
+
* - Possibly starts with `// File Source: <url>\n` (js-recon annotation)
|
|
88
|
+
* - Then the webpackJsonp / webpackChunk push expression
|
|
89
|
+
*
|
|
90
|
+
* Each module in the chunk's module map becomes a separate output file `<id>.js`.
|
|
91
|
+
*
|
|
92
|
+
* Module function format (webpack 4, FunctionExpression):
|
|
93
|
+
* { 429: function(module, exports, require) { ... } }
|
|
94
|
+
* Module function format (webpack 5, ArrowFunctionExpression):
|
|
95
|
+
* { 429: (module, exports, require) => { ... } }
|
|
96
|
+
*
|
|
97
|
+
* Both formats use identical param semantics:
|
|
98
|
+
* params[0] = module — module object (e.exports = X for CJS exports)
|
|
99
|
+
* params[1] = exports — exports target (ODP, require.d for named exports)
|
|
100
|
+
* params[2] = require — require function (r(N) for cross-module imports)
|
|
101
|
+
*/
|
|
102
|
+
export const refactorVueWebpack = (chunk) => __awaiter(void 0, void 0, void 0, function* () {
|
|
103
|
+
// Strip the js-recon file-source annotation if present
|
|
104
|
+
const code = chunk.code.replace(/^\/\/ File Source:[^\n]*\n/, "");
|
|
105
|
+
if (!code.trim())
|
|
106
|
+
return {};
|
|
107
|
+
let ast;
|
|
108
|
+
try {
|
|
109
|
+
ast = parser.parse(code, {
|
|
110
|
+
sourceType: "unambiguous",
|
|
111
|
+
plugins: ["jsx", "typescript"],
|
|
112
|
+
errorRecovery: true,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
catch (_a) {
|
|
116
|
+
console.log(chalk.yellow(`[!] Failed to parse Vue webpack chunk ${chunk.id} — skipping`));
|
|
117
|
+
return {};
|
|
118
|
+
}
|
|
119
|
+
const modules = extractModulesFromWebpackChunk(ast);
|
|
120
|
+
if (modules.length === 0) {
|
|
121
|
+
console.log(chalk.yellow(`[~] No webpack module map found in chunk ${chunk.id} — skipping`));
|
|
122
|
+
return {};
|
|
123
|
+
}
|
|
124
|
+
// Re-parse each module function in its own traversal so fnPath has correct scope.
|
|
125
|
+
// We need NodePath objects, which requires re-traversing with a visitor.
|
|
126
|
+
const results = {};
|
|
127
|
+
// Build a per-module-id lookup from the extracted fnNodes (by reference)
|
|
128
|
+
const fnNodeToId = new Map();
|
|
129
|
+
for (const { id, fnNode } of modules) {
|
|
130
|
+
fnNodeToId.set(fnNode, id);
|
|
131
|
+
}
|
|
132
|
+
// Collect NodePaths by traversing the AST
|
|
133
|
+
const capturedPaths = new Map();
|
|
134
|
+
traverse(ast, {
|
|
135
|
+
FunctionExpression(path) {
|
|
136
|
+
const id = fnNodeToId.get(path.node);
|
|
137
|
+
if (id)
|
|
138
|
+
capturedPaths.set(id, path);
|
|
139
|
+
},
|
|
140
|
+
ArrowFunctionExpression(path) {
|
|
141
|
+
const id = fnNodeToId.get(path.node);
|
|
142
|
+
if (id)
|
|
143
|
+
capturedPaths.set(id, path);
|
|
144
|
+
},
|
|
145
|
+
});
|
|
146
|
+
for (const { id, fnNode } of modules) {
|
|
147
|
+
console.log(chalk.cyan(`[i] Processing Vue (webpack) module: ${id}`));
|
|
148
|
+
const fnPath = capturedPaths.get(id);
|
|
149
|
+
if (!fnPath) {
|
|
150
|
+
console.log(chalk.yellow(`[!] Could not get NodePath for module ${id} — skipping`));
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
const params = fnNode.params;
|
|
154
|
+
const moduleParam = params[0] && t.isIdentifier(params[0]) ? params[0].name : "";
|
|
155
|
+
const exportsParam = params[1] && t.isIdentifier(params[1]) ? params[1].name : "";
|
|
156
|
+
const requireParam = params[2] && t.isIdentifier(params[2]) ? params[2].name : "";
|
|
157
|
+
const entry = {
|
|
158
|
+
id,
|
|
159
|
+
fnPath: fnPath,
|
|
160
|
+
runtimeParam: "",
|
|
161
|
+
moduleParam,
|
|
162
|
+
exportsParam,
|
|
163
|
+
requireParam,
|
|
164
|
+
};
|
|
165
|
+
const statements = transformWebpackModule(entry);
|
|
166
|
+
const rawCode = validateAndFix(statements, id);
|
|
167
|
+
if (rawCode === null) {
|
|
168
|
+
console.log(chalk.yellow(`[~] Module ${id} skipped due to unresolvable syntax errors`));
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
results[id] = rawCode;
|
|
172
|
+
}
|
|
173
|
+
return results;
|
|
174
|
+
});
|
|
175
|
+
export default refactorVueWebpack;
|
|
176
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/refactor/vue/index.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,MAAM,MAAM,eAAe,CAAC;AACnC,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAExC,OAAO,KAAK,CAAC,MAAM,cAAc,CAAC;AAElC,OAAO,EAAsB,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,QAAQ,GAAG,CAAC,MAAA,SAAS,CAAC,OAAO,mCAAI,SAAS,CAA6B,CAAC;AAE9E;;;;;;;;;;GAUG;AACH,SAAS,8BAA8B,CACnC,GAAW;IAEX,MAAM,OAAO,GAAoG,EAAE,CAAC;IAEpH,QAAQ,CAAC,GAAG,EAAE;QACV,cAAc,CAAC,QAAQ;YACnB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAC3B,gDAAgD;YAChD,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO;YAC7D,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBAAE,OAAO;YAC/D,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAEtC,yEAAyE;YACzE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC;gBAAE,OAAO;YACtC,IAAK,GAAyB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAE3D,MAAM,aAAa,GAAI,GAAyB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,aAAa,CAAC;gBAAE,OAAO;YAEnE,iEAAiE;YACjE,MAAM,KAAK,GAAI,aAAoC,CAAC,UAAU,CAAC;YAC/D,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CACF,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACrB,CAAC,CAAC,CAAC,gBAAgB,CAAE,CAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,eAAe,CAAE,CAAsB,CAAC,GAAG,CAAC,CAAC,CAC1G,CAAC;YACF,IAAI,CAAC,cAAc;gBAAE,OAAO;YAE5B,+BAA+B;YAC/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACxC,MAAM,GAAG,GAAI,IAAyB,CAAC,GAAG,CAAC;gBAC3C,MAAM,GAAG,GAAI,IAAyB,CAAC,KAAK,CAAC;gBAE7C,MAAM,QAAQ,GAAG,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC;oBACpC,CAAC,CAAC,MAAM,CAAE,GAAwB,CAAC,KAAK,CAAC;oBACzC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;wBACtB,CAAC,CAAE,GAAuB,CAAC,KAAK;wBAChC,CAAC,CAAC,IAAI,CAAC;gBACb,IAAI,CAAC,QAAQ;oBAAE,SAAS;gBAExB,IAAI,CAAC,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAChF,OAAO,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,QAAQ;oBACZ,MAAM,EAAE,GAAuD;oBAC/D,IAAI,EAAE,QAAQ;iBACjB,CAAC,CAAC;YACP,CAAC;YAED,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;KACJ,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAO,KAAY,EAAmC,EAAE;IACtF,uDAAuD;IACvD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,EAAE,CAAC,CAAC;IAElE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAE5B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACD,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE;YACrB,UAAU,EAAE,aAAa;YACzB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;YAC9B,aAAa,EAAE,IAAI;SACtB,CAAC,CAAC;IACP,CAAC;IAAC,WAAM,CAAC;QACL,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QAC1F,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,OAAO,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,KAAK,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;QAC7F,OAAO,EAAE,CAAC;IACd,CAAC;IAED,kFAAkF;IAClF,yEAAyE;IACzE,MAAM,OAAO,GAA2B,EAAE,CAAC;IAE3C,yEAAyE;IACzE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACnC,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,0CAA0C;IAC1C,MAAM,aAAa,GAAG,IAAI,GAAG,EAAsE,CAAC;IAEpG,QAAQ,CAAC,GAAG,EAAE;QACV,kBAAkB,CAAC,IAAI;YACnB,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,EAAE;gBAAE,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAAsC,CAAC,CAAC;QAC1E,CAAC;QACD,uBAAuB,CAAC,IAAI;YACxB,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,EAAE;gBAAE,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,IAA2C,CAAC,CAAC;QAC/E,CAAC;KACJ,CAAC,CAAC;IAEH,KAAK,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,EAAE,aAAa,CAAC,CAAC,CAAC;YACpF,SAAS;QACb,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,CAAC,CAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACnG,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,CAAC,CAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpG,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,CAAC,CAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAEpG,MAAM,KAAK,GAAuB;YAC9B,EAAE;YACF,MAAM,EAAE,MAA6C;YACrD,YAAY,EAAE,EAAE;YAChB,WAAW;YACX,YAAY;YACZ,YAAY;SACf,CAAC;QAEF,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,4CAA4C,CAAC,CAAC,CAAC;YACxF,SAAS;QACb,CAAC;QAED,OAAO,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;IAC1B,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC,CAAA,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
|