@webiny/pulumi-aws 5.30.0-beta.1 → 5.31.0-beta.1
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/apps/admin/createAdminPulumiApp.d.ts +8 -6
- package/apps/admin/createAdminPulumiApp.js +4 -86
- package/apps/admin/createAdminPulumiApp.js.map +1 -1
- package/apps/api/ApiFileManager.js +7 -3
- package/apps/api/ApiFileManager.js.map +1 -1
- package/apps/api/ApiGraphql.d.ts +9 -0
- package/apps/api/ApiGraphql.js +24 -1
- package/apps/api/ApiGraphql.js.map +1 -1
- package/apps/api/ApiOutput.d.ts +15 -0
- package/apps/api/ApiOutput.js +43 -0
- package/apps/api/ApiOutput.js.map +1 -0
- package/apps/api/ApiPageBuilder.js +0 -1
- package/apps/api/ApiPageBuilder.js.map +1 -1
- package/apps/api/createApiPulumiApp.d.ts +1 -0
- package/apps/api/createApiPulumiApp.js +12 -2
- package/apps/api/createApiPulumiApp.js.map +1 -1
- package/apps/api/index.d.ts +1 -0
- package/apps/api/index.js +13 -0
- package/apps/api/index.js.map +1 -1
- package/apps/core/CoreFileManager.d.ts +4 -1
- package/apps/core/CoreFileManager.js +20 -3
- package/apps/core/CoreFileManager.js.map +1 -1
- package/apps/core/createCorePulumiApp.js +3 -1
- package/apps/core/createCorePulumiApp.js.map +1 -1
- package/apps/createAppBucket.js +4 -3
- package/apps/createAppBucket.js.map +1 -1
- package/apps/index.d.ts +1 -0
- package/apps/index.js +14 -0
- package/apps/index.js.map +1 -1
- package/apps/lambdaUtils.js +10 -11
- package/apps/lambdaUtils.js.map +1 -1
- package/apps/react/createReactPulumiApp.d.ts +29 -0
- package/apps/react/createReactPulumiApp.js +111 -0
- package/apps/react/createReactPulumiApp.js.map +1 -0
- package/apps/react/index.d.ts +1 -0
- package/apps/react/index.js +18 -0
- package/apps/react/index.js.map +1 -0
- package/apps/website/WebsitePrerendering.js +6 -14
- package/apps/website/WebsitePrerendering.js.map +1 -1
- package/apps/website/createWebsitePulumiApp.d.ts +6 -0
- package/apps/website/createWebsitePulumiApp.js +23 -3
- package/apps/website/createWebsitePulumiApp.js.map +1 -1
- package/apps/website/deliveryViewerRequest.d.ts +2 -0
- package/apps/website/deliveryViewerRequest.js +32 -0
- package/apps/website/deliveryViewerRequest.js.map +1 -0
- package/components/tenantRouter/functions/origin/request.js +3 -1
- package/components/tenantRouter/functions/origin/request.js.map +1 -1
- package/package.json +10 -8
- package/utils/getPresignedPost.d.ts +11 -0
- package/utils/getPresignedPost.js +46 -0
- package/utils/getPresignedPost.js.map +1 -0
- package/utils/lambdaEnvVariables.js +3 -1
- package/utils/lambdaEnvVariables.js.map +1 -1
- package/utils/uploadFolderToS3.d.ts +3 -4
- package/utils/uploadFolderToS3.js +51 -13
- package/utils/uploadFolderToS3.js.map +1 -1
|
@@ -7,8 +7,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.uploadFolderToS3 = void 0;
|
|
9
9
|
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
|
|
10
12
|
var _fs = _interopRequireDefault(require("fs"));
|
|
11
13
|
|
|
14
|
+
var _nodeFetch = _interopRequireDefault(require("node-fetch"));
|
|
15
|
+
|
|
16
|
+
var _formData = _interopRequireDefault(require("form-data"));
|
|
17
|
+
|
|
12
18
|
var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
|
|
13
19
|
|
|
14
20
|
var _mime = _interopRequireDefault(require("mime"));
|
|
@@ -19,6 +25,12 @@ var _path = require("path");
|
|
|
19
25
|
|
|
20
26
|
var _crawlDirectory = require("./crawlDirectory");
|
|
21
27
|
|
|
28
|
+
var _getPresignedPost = require("./getPresignedPost");
|
|
29
|
+
|
|
30
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
31
|
+
|
|
32
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
33
|
+
|
|
22
34
|
function getFileChecksum(file) {
|
|
23
35
|
const crypto = require("crypto");
|
|
24
36
|
|
|
@@ -41,6 +53,7 @@ const uploadFolderToS3 = async ({
|
|
|
41
53
|
onFileUploadSuccess,
|
|
42
54
|
onFileUploadError,
|
|
43
55
|
onFileUploadSkip,
|
|
56
|
+
// For backwards compatibility, we need to leave ACL on "public-read".
|
|
44
57
|
acl = "public-read",
|
|
45
58
|
cacheControl = "max-age=31536000"
|
|
46
59
|
}) => {
|
|
@@ -75,8 +88,7 @@ const uploadFolderToS3 = async ({
|
|
|
75
88
|
for (let j = 0; j < chunk.length; j++) {
|
|
76
89
|
const path = chunk[j];
|
|
77
90
|
promises.push(new Promise(async resolve => {
|
|
78
|
-
// We also replace "\" with "/", which
|
|
79
|
-
// https://github.com/webiny/webiny-js/issues/1701#issuecomment-860123555
|
|
91
|
+
// We also replace "\" with "/", which is a path separator on Windows' CMD or Powershell.
|
|
80
92
|
const key = (0, _path.relative)(root, path).replace(/\\/g, "/");
|
|
81
93
|
|
|
82
94
|
try {
|
|
@@ -109,17 +121,43 @@ const uploadFolderToS3 = async ({
|
|
|
109
121
|
}
|
|
110
122
|
} else {
|
|
111
123
|
const cacheControl = cacheControls.find(item => item.pattern.test(key));
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
124
|
+
|
|
125
|
+
const contentType = _mime.default.getType(path);
|
|
126
|
+
|
|
127
|
+
const {
|
|
128
|
+
url,
|
|
129
|
+
fields
|
|
130
|
+
} = await (0, _getPresignedPost.getPresignedPost)({
|
|
131
|
+
bucket,
|
|
132
|
+
key,
|
|
133
|
+
acl,
|
|
134
|
+
checksum,
|
|
135
|
+
contentType,
|
|
136
|
+
cacheControl: cacheControl ? cacheControl.value : undefined
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
const data = _objectSpread(_objectSpread({}, fields), {}, {
|
|
140
|
+
"Content-Type": contentType || "",
|
|
141
|
+
"X-Amz-Meta-Checksum": checksum,
|
|
142
|
+
file: _fs.default.readFileSync(path, "utf8")
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
if (cacheControl) {
|
|
146
|
+
data["Cache-Control"] = cacheControl.value;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const formData = new _formData.default();
|
|
150
|
+
Object.keys(data).forEach(key => {
|
|
151
|
+
formData.append(key, data[key]);
|
|
152
|
+
});
|
|
153
|
+
const res = await (0, _nodeFetch.default)(url, {
|
|
154
|
+
method: "POST",
|
|
155
|
+
body: formData
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
if (res.status > 299) {
|
|
159
|
+
throw new Error(`${res.statusText}\n${await res.text()}`);
|
|
160
|
+
}
|
|
123
161
|
|
|
124
162
|
if (typeof onFileUploadSuccess === "function") {
|
|
125
163
|
await onFileUploadSuccess({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getFileChecksum","file","crypto","require","hash","createHash","Promise","resolve","stream","fs","createReadStream","on","data","update","digest","uploadFolderToS3","path","root","bucket","onFileUploadSuccess","onFileUploadError","onFileUploadSkip","acl","cacheControl","s3","S3Client","region","process","env","AWS_REGION","existsSync","Error","paths","crawlDirectory","push","pathsChunks","chunk","cacheControls","pattern","value","Array","isArray","i","length","promises","j","key","relative","replace","checksum","skipUpload","existingObject","headObject","Bucket","Key","promise","Metadata","full","find","item","test","putObject","ACL","CacheControl","ContentType","mime","getType","undefined","Body","readFileSync","e","error","all"],"sources":["uploadFolderToS3.ts"],"sourcesContent":["import fs from \"fs\";\nimport S3Client from \"aws-sdk/clients/s3\";\nimport mime from \"mime\";\nimport chunk from \"lodash/chunk\";\nimport { relative } from \"path\";\nimport { crawlDirectory } from \"./crawlDirectory\";\n\nfunction getFileChecksum(file: string): Promise<string> {\n const crypto = require(\"crypto\");\n const hash = crypto.createHash(\"md5\");\n\n return new Promise(resolve => {\n const stream = fs.createReadStream(file);\n stream.on(\"data\", function (data: any) {\n hash.update(data, \"utf8\");\n });\n\n stream.on(\"end\", function () {\n resolve(hash.digest(\"hex\"));\n });\n });\n}\n\nimport { BucketName, ObjectCannedACL, CacheControl } from \"aws-sdk/clients/s3\";\n\nexport interface Paths {\n full: string;\n relative: string;\n}\n\ntype CacheControls = Array<{ pattern: RegExp; value: CacheControl }>;\n\nexport interface UploadFolderToS3Params {\n // Path to the folder that needs to be uploaded.\n path: string;\n\n // A callback that gets called every time a file has been uploaded successfully.\n onFileUploadSuccess: (params: { paths: Paths }) => void;\n\n // A callback that gets called every time a file has not been uploaded successfully.\n onFileUploadError: (params: { paths: Paths; error: Error }) => void;\n\n // A callback that gets called every time a file upload has been skipped.\n onFileUploadSkip: (params: { paths: Paths }) => void;\n\n bucket: BucketName;\n acl?: ObjectCannedACL;\n cacheControl?: CacheControl | CacheControls;\n}\n\nexport const uploadFolderToS3 = async ({\n path: root,\n bucket,\n onFileUploadSuccess,\n onFileUploadError,\n onFileUploadSkip,\n acl = \"public-read\",\n cacheControl = \"max-age=31536000\"\n}: UploadFolderToS3Params) => {\n const s3 = new S3Client({ region: process.env.AWS_REGION });\n\n if (!fs.existsSync(root)) {\n throw new Error(\"Cannot continue, folder does not exist.\");\n }\n\n const paths: string[] = [];\n\n await crawlDirectory(root, async (path: string) => {\n paths.push(path);\n });\n\n const pathsChunks = chunk(paths, 20);\n\n const cacheControls: CacheControls = [];\n if (typeof cacheControl === \"string\") {\n cacheControls.push({ pattern: /.*/, value: cacheControl });\n } else if (Array.isArray(cacheControls)) {\n cacheControls.push(...cacheControl);\n }\n\n for (let i = 0; i < pathsChunks.length; i++) {\n const chunk = pathsChunks[i];\n\n const promises = [];\n for (let j = 0; j < chunk.length; j++) {\n const path = chunk[j];\n\n promises.push(\n new Promise<void>(async resolve => {\n // We also replace \"\\\" with \"/\", which can occur on Windows' CMD or Powershell.\n // https://github.com/webiny/webiny-js/issues/1701#issuecomment-860123555\n const key = relative(root, path).replace(/\\\\/g, \"/\");\n try {\n // Get file checksum so that we can check if a file needs to be uploaded or not.\n const checksum = await getFileChecksum(path);\n\n let skipUpload = false;\n try {\n const existingObject = await s3\n .headObject({\n Bucket: bucket,\n Key: key\n })\n .promise();\n\n if (existingObject.Metadata?.checksum === checksum) {\n skipUpload = true;\n }\n } catch {\n // Do nothing.\n }\n\n if (skipUpload) {\n if (typeof onFileUploadSkip === \"function\") {\n await onFileUploadSkip({ paths: { full: path, relative: key } });\n }\n } else {\n const cacheControl = cacheControls.find(item => item.pattern.test(key));\n\n await s3\n .putObject({\n Bucket: bucket,\n Key: key,\n ACL: acl,\n CacheControl: cacheControl?.value,\n ContentType: mime.getType(path) || undefined,\n Body: fs.readFileSync(path),\n Metadata: {\n checksum\n }\n })\n .promise();\n\n if (typeof onFileUploadSuccess === \"function\") {\n await onFileUploadSuccess({ paths: { full: path, relative: key } });\n }\n }\n resolve();\n } catch (e) {\n if (typeof onFileUploadError === \"function\") {\n await onFileUploadError({\n paths: { full: path, relative: key },\n error: e\n });\n }\n resolve();\n }\n })\n );\n }\n\n await Promise.all(promises);\n }\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["getFileChecksum","file","crypto","require","hash","createHash","Promise","resolve","stream","fs","createReadStream","on","data","update","digest","uploadFolderToS3","path","root","bucket","onFileUploadSuccess","onFileUploadError","onFileUploadSkip","acl","cacheControl","s3","S3Client","region","process","env","AWS_REGION","existsSync","Error","paths","crawlDirectory","push","pathsChunks","chunk","cacheControls","pattern","value","Array","isArray","i","length","promises","j","key","relative","replace","checksum","skipUpload","existingObject","headObject","Bucket","Key","promise","Metadata","full","find","item","test","contentType","mime","getType","url","fields","getPresignedPost","undefined","readFileSync","formData","FormData","Object","keys","forEach","append","res","fetch","method","body","status","statusText","text","e","error","all"],"sources":["uploadFolderToS3.ts"],"sourcesContent":["import fs from \"fs\";\nimport fetch from \"node-fetch\";\nimport FormData from \"form-data\";\nimport S3Client from \"aws-sdk/clients/s3\";\nimport mime from \"mime\";\nimport chunk from \"lodash/chunk\";\nimport { relative } from \"path\";\nimport { crawlDirectory } from \"./crawlDirectory\";\nimport { getPresignedPost } from \"./getPresignedPost\";\n\nfunction getFileChecksum(file: string): Promise<string> {\n const crypto = require(\"crypto\");\n const hash = crypto.createHash(\"md5\");\n\n return new Promise(resolve => {\n const stream = fs.createReadStream(file);\n stream.on(\"data\", function (data: any) {\n hash.update(data, \"utf8\");\n });\n\n stream.on(\"end\", function () {\n resolve(hash.digest(\"hex\"));\n });\n });\n}\n\nimport { BucketName, CacheControl } from \"aws-sdk/clients/s3\";\n\nexport interface Paths {\n full: string;\n relative: string;\n}\n\nexport type CacheControls = Array<{ pattern: RegExp; value: CacheControl }>;\n\nexport interface UploadFolderToS3Params {\n // Path to the folder that needs to be uploaded.\n path: string;\n\n // Object ACL.\n acl: string;\n\n // A callback that gets called every time a file has been uploaded successfully.\n onFileUploadSuccess: (params: { paths: Paths }) => void;\n\n // A callback that gets called every time a file has not been uploaded successfully.\n onFileUploadError: (params: { paths: Paths; error: Error }) => void;\n\n // A callback that gets called every time a file upload has been skipped.\n onFileUploadSkip: (params: { paths: Paths }) => void;\n\n // Target bucket\n bucket: BucketName;\n\n // Cache control to apply to each uploaded file\n cacheControl?: CacheControl | CacheControls;\n}\n\nexport const uploadFolderToS3 = async ({\n path: root,\n bucket,\n onFileUploadSuccess,\n onFileUploadError,\n onFileUploadSkip,\n // For backwards compatibility, we need to leave ACL on \"public-read\".\n acl = \"public-read\",\n cacheControl = \"max-age=31536000\"\n}: UploadFolderToS3Params) => {\n const s3 = new S3Client({ region: process.env.AWS_REGION });\n\n if (!fs.existsSync(root)) {\n throw new Error(\"Cannot continue, folder does not exist.\");\n }\n\n const paths: string[] = [];\n\n await crawlDirectory(root, async (path: string) => {\n paths.push(path);\n });\n\n const pathsChunks = chunk(paths, 20);\n\n const cacheControls: CacheControls = [];\n if (typeof cacheControl === \"string\") {\n cacheControls.push({ pattern: /.*/, value: cacheControl });\n } else if (Array.isArray(cacheControls)) {\n cacheControls.push(...cacheControl);\n }\n\n for (let i = 0; i < pathsChunks.length; i++) {\n const chunk = pathsChunks[i];\n\n const promises = [];\n for (let j = 0; j < chunk.length; j++) {\n const path = chunk[j];\n\n promises.push(\n new Promise<void>(async resolve => {\n // We also replace \"\\\" with \"/\", which is a path separator on Windows' CMD or Powershell.\n const key = relative(root, path).replace(/\\\\/g, \"/\");\n try {\n // Get file checksum so that we can check if a file needs to be uploaded or not.\n const checksum = await getFileChecksum(path);\n\n let skipUpload = false;\n try {\n const existingObject = await s3\n .headObject({\n Bucket: bucket,\n Key: key\n })\n .promise();\n\n if (existingObject.Metadata?.checksum === checksum) {\n skipUpload = true;\n }\n } catch {\n // Do nothing.\n }\n\n if (skipUpload) {\n if (typeof onFileUploadSkip === \"function\") {\n await onFileUploadSkip({ paths: { full: path, relative: key } });\n }\n } else {\n const cacheControl = cacheControls.find(item => item.pattern.test(key));\n const contentType = mime.getType(path);\n\n const { url, fields } = await getPresignedPost({\n bucket,\n key,\n acl,\n checksum,\n contentType,\n cacheControl: cacheControl ? cacheControl.value : undefined\n });\n\n const data: Record<string, string> = {\n ...fields,\n \"Content-Type\": contentType || \"\",\n \"X-Amz-Meta-Checksum\": checksum,\n file: fs.readFileSync(path, \"utf8\")\n };\n\n if (cacheControl) {\n data[\"Cache-Control\"] = cacheControl.value;\n }\n\n const formData = new FormData();\n Object.keys(data).forEach(key => {\n formData.append(key, data[key]);\n });\n\n const res = await fetch(url, {\n method: \"POST\",\n body: formData\n });\n\n if (res.status > 299) {\n throw new Error(`${res.statusText}\\n${await res.text()}`);\n }\n\n if (typeof onFileUploadSuccess === \"function\") {\n await onFileUploadSuccess({ paths: { full: path, relative: key } });\n }\n }\n resolve();\n } catch (e) {\n if (typeof onFileUploadError === \"function\") {\n await onFileUploadError({\n paths: { full: path, relative: key },\n error: e\n });\n }\n resolve();\n }\n })\n );\n }\n\n await Promise.all(promises);\n }\n};\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;AACA;;;;;;AAEA,SAASA,eAAT,CAAyBC,IAAzB,EAAwD;EACpD,MAAMC,MAAM,GAAGC,OAAO,CAAC,QAAD,CAAtB;;EACA,MAAMC,IAAI,GAAGF,MAAM,CAACG,UAAP,CAAkB,KAAlB,CAAb;EAEA,OAAO,IAAIC,OAAJ,CAAYC,OAAO,IAAI;IAC1B,MAAMC,MAAM,GAAGC,WAAA,CAAGC,gBAAH,CAAoBT,IAApB,CAAf;;IACAO,MAAM,CAACG,EAAP,CAAU,MAAV,EAAkB,UAAUC,IAAV,EAAqB;MACnCR,IAAI,CAACS,MAAL,CAAYD,IAAZ,EAAkB,MAAlB;IACH,CAFD;IAIAJ,MAAM,CAACG,EAAP,CAAU,KAAV,EAAiB,YAAY;MACzBJ,OAAO,CAACH,IAAI,CAACU,MAAL,CAAY,KAAZ,CAAD,CAAP;IACH,CAFD;EAGH,CATM,CAAP;AAUH;;AAkCM,MAAMC,gBAAgB,GAAG,OAAO;EACnCC,IAAI,EAAEC,IAD6B;EAEnCC,MAFmC;EAGnCC,mBAHmC;EAInCC,iBAJmC;EAKnCC,gBALmC;EAMnC;EACAC,GAAG,GAAG,aAP6B;EAQnCC,YAAY,GAAG;AARoB,CAAP,KASF;EAC1B,MAAMC,EAAE,GAAG,IAAIC,UAAJ,CAAa;IAAEC,MAAM,EAAEC,OAAO,CAACC,GAAR,CAAYC;EAAtB,CAAb,CAAX;;EAEA,IAAI,CAACpB,WAAA,CAAGqB,UAAH,CAAcb,IAAd,CAAL,EAA0B;IACtB,MAAM,IAAIc,KAAJ,CAAU,yCAAV,CAAN;EACH;;EAED,MAAMC,KAAe,GAAG,EAAxB;EAEA,MAAM,IAAAC,8BAAA,EAAehB,IAAf,EAAqB,MAAOD,IAAP,IAAwB;IAC/CgB,KAAK,CAACE,IAAN,CAAWlB,IAAX;EACH,CAFK,CAAN;EAIA,MAAMmB,WAAW,GAAG,IAAAC,cAAA,EAAMJ,KAAN,EAAa,EAAb,CAApB;EAEA,MAAMK,aAA4B,GAAG,EAArC;;EACA,IAAI,OAAOd,YAAP,KAAwB,QAA5B,EAAsC;IAClCc,aAAa,CAACH,IAAd,CAAmB;MAAEI,OAAO,EAAE,IAAX;MAAiBC,KAAK,EAAEhB;IAAxB,CAAnB;EACH,CAFD,MAEO,IAAIiB,KAAK,CAACC,OAAN,CAAcJ,aAAd,CAAJ,EAAkC;IACrCA,aAAa,CAACH,IAAd,CAAmB,GAAGX,YAAtB;EACH;;EAED,KAAK,IAAImB,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGP,WAAW,CAACQ,MAAhC,EAAwCD,CAAC,EAAzC,EAA6C;IACzC,MAAMN,KAAK,GAAGD,WAAW,CAACO,CAAD,CAAzB;IAEA,MAAME,QAAQ,GAAG,EAAjB;;IACA,KAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGT,KAAK,CAACO,MAA1B,EAAkCE,CAAC,EAAnC,EAAuC;MACnC,MAAM7B,IAAI,GAAGoB,KAAK,CAACS,CAAD,CAAlB;MAEAD,QAAQ,CAACV,IAAT,CACI,IAAI5B,OAAJ,CAAkB,MAAMC,OAAN,IAAiB;QAC/B;QACA,MAAMuC,GAAG,GAAG,IAAAC,cAAA,EAAS9B,IAAT,EAAeD,IAAf,EAAqBgC,OAArB,CAA6B,KAA7B,EAAoC,GAApC,CAAZ;;QACA,IAAI;UACA;UACA,MAAMC,QAAQ,GAAG,MAAMjD,eAAe,CAACgB,IAAD,CAAtC;UAEA,IAAIkC,UAAU,GAAG,KAAjB;;UACA,IAAI;YAAA;;YACA,MAAMC,cAAc,GAAG,MAAM3B,EAAE,CAC1B4B,UADwB,CACb;cACRC,MAAM,EAAEnC,MADA;cAERoC,GAAG,EAAER;YAFG,CADa,EAKxBS,OALwB,EAA7B;;YAOA,IAAI,0BAAAJ,cAAc,CAACK,QAAf,gFAAyBP,QAAzB,MAAsCA,QAA1C,EAAoD;cAChDC,UAAU,GAAG,IAAb;YACH;UACJ,CAXD,CAWE,MAAM,CACJ;UACH;;UAED,IAAIA,UAAJ,EAAgB;YACZ,IAAI,OAAO7B,gBAAP,KAA4B,UAAhC,EAA4C;cACxC,MAAMA,gBAAgB,CAAC;gBAAEW,KAAK,EAAE;kBAAEyB,IAAI,EAAEzC,IAAR;kBAAc+B,QAAQ,EAAED;gBAAxB;cAAT,CAAD,CAAtB;YACH;UACJ,CAJD,MAIO;YACH,MAAMvB,YAAY,GAAGc,aAAa,CAACqB,IAAd,CAAmBC,IAAI,IAAIA,IAAI,CAACrB,OAAL,CAAasB,IAAb,CAAkBd,GAAlB,CAA3B,CAArB;;YACA,MAAMe,WAAW,GAAGC,aAAA,CAAKC,OAAL,CAAa/C,IAAb,CAApB;;YAEA,MAAM;cAAEgD,GAAF;cAAOC;YAAP,IAAkB,MAAM,IAAAC,kCAAA,EAAiB;cAC3ChD,MAD2C;cAE3C4B,GAF2C;cAG3CxB,GAH2C;cAI3C2B,QAJ2C;cAK3CY,WAL2C;cAM3CtC,YAAY,EAAEA,YAAY,GAAGA,YAAY,CAACgB,KAAhB,GAAwB4B;YANP,CAAjB,CAA9B;;YASA,MAAMvD,IAA4B,mCAC3BqD,MAD2B;cAE9B,gBAAgBJ,WAAW,IAAI,EAFD;cAG9B,uBAAuBZ,QAHO;cAI9BhD,IAAI,EAAEQ,WAAA,CAAG2D,YAAH,CAAgBpD,IAAhB,EAAsB,MAAtB;YAJwB,EAAlC;;YAOA,IAAIO,YAAJ,EAAkB;cACdX,IAAI,CAAC,eAAD,CAAJ,GAAwBW,YAAY,CAACgB,KAArC;YACH;;YAED,MAAM8B,QAAQ,GAAG,IAAIC,iBAAJ,EAAjB;YACAC,MAAM,CAACC,IAAP,CAAY5D,IAAZ,EAAkB6D,OAAlB,CAA0B3B,GAAG,IAAI;cAC7BuB,QAAQ,CAACK,MAAT,CAAgB5B,GAAhB,EAAqBlC,IAAI,CAACkC,GAAD,CAAzB;YACH,CAFD;YAIA,MAAM6B,GAAG,GAAG,MAAM,IAAAC,kBAAA,EAAMZ,GAAN,EAAW;cACzBa,MAAM,EAAE,MADiB;cAEzBC,IAAI,EAAET;YAFmB,CAAX,CAAlB;;YAKA,IAAIM,GAAG,CAACI,MAAJ,GAAa,GAAjB,EAAsB;cAClB,MAAM,IAAIhD,KAAJ,CAAW,GAAE4C,GAAG,CAACK,UAAW,KAAI,MAAML,GAAG,CAACM,IAAJ,EAAW,EAAjD,CAAN;YACH;;YAED,IAAI,OAAO9D,mBAAP,KAA+B,UAAnC,EAA+C;cAC3C,MAAMA,mBAAmB,CAAC;gBAAEa,KAAK,EAAE;kBAAEyB,IAAI,EAAEzC,IAAR;kBAAc+B,QAAQ,EAAED;gBAAxB;cAAT,CAAD,CAAzB;YACH;UACJ;;UACDvC,OAAO;QACV,CAnED,CAmEE,OAAO2E,CAAP,EAAU;UACR,IAAI,OAAO9D,iBAAP,KAA6B,UAAjC,EAA6C;YACzC,MAAMA,iBAAiB,CAAC;cACpBY,KAAK,EAAE;gBAAEyB,IAAI,EAAEzC,IAAR;gBAAc+B,QAAQ,EAAED;cAAxB,CADa;cAEpBqC,KAAK,EAAED;YAFa,CAAD,CAAvB;UAIH;;UACD3E,OAAO;QACV;MACJ,CA/ED,CADJ;IAkFH;;IAED,MAAMD,OAAO,CAAC8E,GAAR,CAAYxC,QAAZ,CAAN;EACH;AACJ,CA5HM"}
|