imtiler
Version:
Modern Image Tiler
1 lines • 45.8 kB
JavaScript
(()=>{var __webpack_modules__={3591:(module,exports,__webpack_require__)=>{eval('/* module decorator */ module = __webpack_require__.nmd(module);\nconst {\n writeFileSync\n} = __webpack_require__(6231);\n\nconst path = __webpack_require__(1423);\n\nconst geotiff_from = __webpack_require__(4331);\n\nconst geowarp = __webpack_require__(9706);\n\nconst tilebelt = __webpack_require__(9174);\n\nconst {\n GeoExtent\n} = __webpack_require__(3622);\n\nconst reprojectBoundingBox = __webpack_require__(4501);\n\nconst LRU = __webpack_require__(2596);\n\nconst writeImage = __webpack_require__(8954);\n\nconst readBoundingBox = __webpack_require__(7223);\n\nconst parseAnyInt = __webpack_require__(5042);\n\nconst proj4 = __webpack_require__(2080);\n\nconst lds = __webpack_require__(3346);\n\nconst caches = {\n geotiff: new LRU(100),\n tile: new LRU(100)\n};\n\nasync function handler(event, context) {\n try {\n const request_id = (1e5 + Math.random() * 1e10).toString().split(".")[0].slice(0, 3);\n const debugLevel = Number(process.env.IM_TILER_DEBUG_LEVEL || 0);\n if (debugLevel) console.log("debugLevel:", debugLevel);\n let body;\n let isBase64Encoded = false;\n let headers = {\n "Access-Control-Allow-Origin": "*",\n "Content-Type": "application/json"\n };\n const {\n queryStringParameters\n } = event;\n if (debugLevel >= 1) console.log("queryStringParameters:", queryStringParameters);\n const params = {};\n Object.entries(queryStringParameters).forEach(([k, v]) => {\n if (k.trim() !== "" && typeof v === "string" && v.trim() !== "") {\n params[k.trim()] = v.trim();\n }\n });\n if (debugLevel) console.log("params:", params);\n const queryKeys = Object.keys(params).map(k => k.trim());\n if (debugLevel) console.log("queryKeys:", queryKeys);\n\n if (queryKeys.length === 0) {\n throw new Error("no url parameters were found");\n }\n\n ["url", "x", "y", "z"].forEach(k => {\n if (!(k in params)) {\n throw new Error(`missing "${k}"`);\n }\n });\n if (debugLevel >= 1) console.log("[imtiler] params before running parse-any-int:", params);\n ["x", "y", "z"].forEach(k => {\n params[k] = parseAnyInt(params[k], {\n debug: true\n });\n });\n params.r = Number(params.r || 1);\n if (debugLevel >= 1) console.log("[imtiler] cleaned params:", params);\n let {\n url,\n method,\n f,\n r,\n x,\n y,\n z\n } = params;\n if (["", undefined, null].includes(f)) f = "png";\n const size = Math.round(r * 256);\n if (debugLevel >= 1) console.log(`[imtiler] size: ${size}`);\n const keyToTileCache = JSON.stringify([url, method, f, r, x, y, z]);\n if (debugLevel >= 1) console.log(`[imtiler] caches.tile.keys():`, caches.tile.keys());\n\n if (caches.tile.has(keyToTileCache)) {\n if (debugLevel >= 1) console.log(`[imtiler] using tile cache`);\n\n if ([undefined, "image/png", "png"].includes(f)) {\n headers["Content-Type"] = "image/png";\n } else {\n if (["image/jpeg", "image/jpg", "jpeg", "jpg"].includes(f)) {\n headers["Content-Type"] = "image/jpeg";\n }\n }\n\n return {\n statusCode: 200,\n isBase64Encoded: true,\n headers,\n body: caches.tile.get(keyToTileCache)\n };\n }\n\n if (caches.geotiff.has(url)) {\n if (debugLevel >= 1) console.log("[imtiler] using cache");\n geotiff = await caches.geotiff.get(url)();\n } else {\n const promise = geotiff_from({\n data: url,\n ovr: true\n });\n caches.geotiff.set(url, () => promise);\n if (debugLevel >= 1) console.log("[imtiler] added to cache");\n geotiff = await promise;\n }\n\n const bbox4326 = tilebelt.tileToBBOX([x, y, z]);\n if (debugLevel >= 1) console.log("[imtiler] bbox in 4326: " + JSON.stringify(bbox4326));\n const bbox3857 = reprojectBoundingBox({\n bbox: bbox4326,\n from: 4326,\n to: 3857\n });\n if (debugLevel >= 1) console.log("[imtiler] bbox in 3857: " + JSON.stringify(bbox3857));\n const image = await geotiff.getImage();\n if (debugLevel >= 1) console.log("[imtiler] got image");\n const {\n geoKeys\n } = image;\n if (debugLevel >= 2) console.log("[imtiler] geoKeys:", JSON.stringify(geoKeys));\n\n if (!geoKeys) {\n throw new Error("[imtiler] can\'t create tile because geotiff doesn\'t appear to have geoKeys");\n }\n\n const geotiff_srs = geoKeys.GeographicTypeGeoKey || geoKeys.ProjectedCSTypeGeoKey;\n if (debugLevel >= 2) console.log("[imtiler] geotiff_srs:", geotiff_srs);\n\n if (!geotiff_srs) {\n throw new Error("[imtiler] geotiff has geokeys, but is missing both GeographicTypeGeoKey and ProjectedCSTypeGeoKey");\n }\n\n const extentOfGeoTIFF = new GeoExtent(image.getBoundingBox(), {\n srs: geotiff_srs\n });\n const extentOfTile = new GeoExtent(bbox4326, {\n srs: 4326\n });\n\n if (!extentOfGeoTIFF.overlaps(extentOfTile)) {\n if (debugLevel >= 1) console.log("[imtiler] tile and geotiff do not overlap, so return a blank image");\n const out_data = new Uint8ClampedArray(4 * size * size);\n\n if (f === "png") {\n const {\n data: buffer\n } = writeImage({\n data: out_data,\n debug: false,\n format: "PNG",\n height: size,\n width: size\n });\n body = buffer.toString("base64");\n isBase64Encoded = true;\n headers["Content-Type"] = "image/png";\n } else if (f === "jpg") {\n const {\n data: buffer\n } = writeImage({\n data: out_data,\n debug: false,\n format: "JPG",\n height: size,\n width: size,\n quality: 85\n });\n body = buffer.toString("base64");\n isBase64Encoded = true;\n headers["Content-Type"] = "image/jpeg";\n } else {\n throw Error(`format "${f}" not supported`);\n }\n } else {\n console.time(`${request_id}: reading bounding box`);\n const info = await readBoundingBox({\n bbox: bbox3857,\n debugLevel: 2,\n srs: 3857,\n geotiff,\n use_overview: true,\n target_height: size,\n target_width: size\n });\n console.timeEnd(`${request_id}: reading bounding box`);\n console.time(`${request_id}: warping`);\n const warped = geowarp({\n debug_level: 0,\n reproject: proj4("EPSG:3857", "EPSG:" + info.srs_of_geotiff).forward,\n in_data: info.data,\n in_bbox: info.read_bbox,\n in_srs: info.srs_of_geotiff,\n in_width: info.width,\n in_height: info.height,\n out_bbox: bbox3857,\n out_srs: 3857,\n out_height: size,\n out_width: size,\n method,\n round: true\n });\n console.timeEnd(`${request_id}: warping`);\n\n if (f === undefined || f === "png") {\n console.time(`${request_id}: writing image`);\n const {\n data: buffer\n } = writeImage({\n data: warped.data,\n height: size,\n width: size,\n format: "PNG"\n });\n body = buffer.toString("base64");\n isBase64Encoded = true;\n headers["Content-Type"] = "image/png";\n } else if (f === "jpg") {\n const {\n data: buffer\n } = writeImage({\n data: warped.data,\n height: size,\n width: size,\n format: "JPG"\n });\n body = buffer.toString("base64");\n isBase64Encoded = true;\n headers["Content-Type"] = "image/jpeg";\n }\n\n console.timeEnd(`${request_id}: writing image`);\n }\n\n console.log("setting ", {\n keyToTileCache\n });\n caches.tile.set(keyToTileCache, body);\n if (debugLevel >= 1) console.log(`[imtiler] after setting caches.tile.keys():`, caches.tile.keys());\n const result = {\n statusCode: 200,\n isBase64Encoded,\n headers,\n body\n };\n return result;\n } catch (error) {\n console.log(error);\n return {\n statusCode: 500,\n body: process.env.IM_TILER_DEV_MODE === "true" ? JSON.stringify({\n msg: error.message\n }) : "internal error"\n };\n }\n}\n\nexports.handler = handler;\n\nif (__webpack_require__.c[__webpack_require__.s] === module) {\n const args = Array.from(process.argv);\n const str = args.join(" ");\n const debug = !!str.match(/-?-debug((=|== )(true|True|TRUE))?/);\n const serve = !!str.match(/-?-serve((=|== )(true|True|TRUE))?/);\n\n if (serve) {\n const max = Array.prototype.slice.call(str.match(/-?-max(?:=|== )(\\d+)/) || [], 1)[0];\n const port = Array.prototype.slice.call(str.match(/-?-port(?:=|== )(\\d+)/) || [], 1)[0];\n lds.serve({\n debug,\n handler,\n max,\n port\n });\n } else {\n const url = Array.prototype.slice.call(str.match(/-?-url(?:=|== )([^ ]+)/) || [], 1)[0];\n const method = Array.prototype.slice.call(str.match(/-?-method(?:=|== )([^ ]+)/) || [], 1)[0];\n let f = Array.prototype.slice.call(str.match(/-?-f(?:=|== )([^ ]+)/) || [], 1)[0];\n const r = Array.prototype.slice.call(str.match(/-?-r(?:=|== )([^ ]+)/) || [], 1)[0];\n const x = Array.prototype.slice.call(str.match(/-?-x(?:=|== )(\\d+)/) || [], 1)[0];\n const y = Array.prototype.slice.call(str.match(/-?-y(?:=|== )(\\d+)/) || [], 1)[0];\n const z = Array.prototype.slice.call(str.match(/-?-z(?:=|== )(\\d+)/) || [], 1)[0];\n let output = Array.prototype.slice.call(str.match(/-?-output(?:=|== )([^ ]+)/) || [], 1)[0];\n\n if (!f && output) {\n if (output.endsWith("png")) f = "png";else if (output.endsWith("jpg") || output.endsWith("jpeg")) f = "jpg";\n }\n\n if (output) {\n const cwd = process.cwd();\n\n if (!path.isAbsolute(output)) {\n output = path.resolve(cwd, output);\n }\n\n console.log(`[imtiler] saving to "${output}"`);\n }\n\n const event = {\n queryStringParameters: {\n url,\n method,\n f,\n x,\n r,\n y,\n z\n }\n };\n\n (async () => {\n const result = await handler(event); // console.log("result:", result);\n\n if (output) {\n writeFileSync(output, Buffer.from(result.body, "base64"));\n } else {\n console.log(result.body);\n }\n })();\n }\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFkOztBQVlBLEtBQUMsWUFBWTtBQUNYLFlBQU00RCxNQUFNLEdBQUcsTUFBTW5HLE9BQU8sQ0FBQ0MsS0FBRCxDQUE1QixDQURXLENBRVg7O0FBQ0EsVUFBSXFILE1BQUosRUFBWTtBQUNWdkksUUFBQUEsYUFBYSxDQUFDdUksTUFBRCxFQUFTSyxNQUFNLENBQUNqRSxJQUFQLENBQVl5QyxNQUFNLENBQUNuRixJQUFuQixFQUF5QixRQUF6QixDQUFULENBQWI7QUFDRCxPQUZELE1BRU87QUFDTEYsUUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVlvRixNQUFNLENBQUNuRixJQUFuQjtBQUNEO0FBQ0YsS0FSRDtBQVNEO0FBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pbXRpbGVyLy4vc3JjL2luZGV4LmpzP2I2MzUiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgeyB3cml0ZUZpbGVTeW5jIH0gPSByZXF1aXJlKFwiZnNcIik7XG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5jb25zdCBnZW90aWZmX2Zyb20gPSByZXF1aXJlKFwiZ2VvdGlmZi1mcm9tXCIpO1xuY29uc3QgZ2Vvd2FycCA9IHJlcXVpcmUoXCJnZW93YXJwXCIpO1xuY29uc3QgdGlsZWJlbHQgPSByZXF1aXJlKFwiQG1hcGJveC90aWxlYmVsdFwiKTtcbmNvbnN0IHsgR2VvRXh0ZW50IH0gPSByZXF1aXJlKFwiZ2VvLWV4dGVudFwiKTtcbmNvbnN0IHJlcHJvamVjdEJvdW5kaW5nQm94ID0gcmVxdWlyZShcInJlcHJvamVjdC1iYm94XCIpO1xuY29uc3QgTFJVID0gcmVxdWlyZShcImxydS1jYWNoZVwiKTtcbmNvbnN0IHdyaXRlSW1hZ2UgPSByZXF1aXJlKFwid3JpdGUtaW1hZ2VcIik7XG5jb25zdCByZWFkQm91bmRpbmdCb3ggPSByZXF1aXJlKFwiZ2VvdGlmZi1yZWFkLWJib3hcIik7XG5jb25zdCBwYXJzZUFueUludCA9IHJlcXVpcmUoXCJwYXJzZS1hbnktaW50XCIpO1xuY29uc3QgcHJvajQgPSByZXF1aXJlKFwicHJvajQtZnVsbHktbG9hZGVkXCIpO1xuY29uc3QgbGRzID0gcmVxdWlyZShcImxhbWJkYS1kZXYtc2VydmVyXCIpO1xuXG5jb25zdCBjYWNoZXMgPSB7XG4gIGdlb3RpZmY6IG5ldyBMUlUoMTAwKSxcbiAgdGlsZTogbmV3IExSVSgxMDApXG59O1xuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50LCBjb250ZXh0KSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWVzdF9pZCA9ICgxZTUgKyBNYXRoLnJhbmRvbSgpICogMWUxMCkudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMF0uc2xpY2UoMCwgMyk7XG5cbiAgICBjb25zdCBkZWJ1Z0xldmVsID0gTnVtYmVyKHByb2Nlc3MuZW52LklNX1RJTEVSX0RFQlVHX0xFVkVMIHx8IDApO1xuICAgIGlmIChkZWJ1Z0xldmVsKSBjb25zb2xlLmxvZyhcImRlYnVnTGV2ZWw6XCIsIGRlYnVnTGV2ZWwpO1xuXG4gICAgbGV0IGJvZHk7XG4gICAgbGV0IGlzQmFzZTY0RW5jb2RlZCA9IGZhbHNlO1xuICAgIGxldCBoZWFkZXJzID0ge1xuICAgICAgXCJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW5cIjogXCIqXCIsXG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgIH07XG5cbiAgICBjb25zdCB7IHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyB9ID0gZXZlbnQ7XG4gICAgaWYgKGRlYnVnTGV2ZWwgPj0gMSkgY29uc29sZS5sb2coXCJxdWVyeVN0cmluZ1BhcmFtZXRlcnM6XCIsIHF1ZXJ5U3RyaW5nUGFyYW1ldGVycyk7XG5cbiAgICBjb25zdCBwYXJhbXMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhxdWVyeVN0cmluZ1BhcmFtZXRlcnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgaWYgKGsudHJpbSgpICE9PSBcIlwiICYmIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiICYmIHYudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgIHBhcmFtc1trLnRyaW0oKV0gPSB2LnRyaW0oKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoZGVidWdMZXZlbCkgY29uc29sZS5sb2coXCJwYXJhbXM6XCIsIHBhcmFtcyk7XG5cbiAgICBjb25zdCBxdWVyeUtleXMgPSBPYmplY3Qua2V5cyhwYXJhbXMpLm1hcChrID0+IGsudHJpbSgpKTtcbiAgICBpZiAoZGVidWdMZXZlbCkgY29uc29sZS5sb2coXCJxdWVyeUtleXM6XCIsIHF1ZXJ5S2V5cyk7XG4gICAgaWYgKHF1ZXJ5S2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIHVybCBwYXJhbWV0ZXJzIHdlcmUgZm91bmRcIik7XG4gICAgfVxuXG4gICAgW1widXJsXCIsIFwieFwiLCBcInlcIiwgXCJ6XCJdLmZvckVhY2goayA9PiB7XG4gICAgICBpZiAoIShrIGluIHBhcmFtcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBtaXNzaW5nIFwiJHtrfVwiYCk7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgIGlmIChkZWJ1Z0xldmVsID49IDEpIGNvbnNvbGUubG9nKFwiW2ltdGlsZXJdIHBhcmFtcyBiZWZvcmUgcnVubmluZyBwYXJzZS1hbnktaW50OlwiLCBwYXJhbXMpO1xuXG4gICAgW1wieFwiLCBcInlcIiwgXCJ6XCJdLmZvckVhY2goayA9PiB7XG4gICAgICBwYXJhbXNba10gPSBwYXJzZUFueUludChwYXJhbXNba10sIHsgZGVidWc6IHRydWUgfSk7XG4gICAgfSk7XG5cbiAgICBwYXJhbXMuciA9IE51bWJlcihwYXJhbXMuciB8fCAxKTtcblxuICAgIGlmIChkZWJ1Z0xldmVsID49IDEpIGNvbnNvbGUubG9nKFwiW2ltdGlsZXJdIGNsZWFuZWQgcGFyYW1zOlwiLCBwYXJhbXMpO1xuXG4gICAgbGV0IHsgdXJsLCBtZXRob2QsIGYsIHIsIHgsIHksIHogfSA9IHBhcmFtcztcblxuICAgIGlmIChbXCJcIiwgdW5kZWZpbmVkLCBudWxsXS5pbmNsdWRlcyhmKSkgZiA9IFwicG5nXCI7XG5cbiAgICBjb25zdCBzaXplID0gTWF0aC5yb3VuZChyICogMjU2KTtcbiAgICBpZiAoZGVidWdMZXZlbCA+PSAxKSBjb25zb2xlLmxvZyhgW2ltdGlsZXJdIHNpemU6ICR7c2l6ZX1gKTtcblxuICAgIGNvbnN0IGtleVRvVGlsZUNhY2hlID0gSlNPTi5zdHJpbmdpZnkoW3VybCwgbWV0aG9kLCBmLCByLCB4LCB5LCB6XSk7XG4gICAgaWYgKGRlYnVnTGV2ZWwgPj0gMSkgY29uc29sZS5sb2coYFtpbXRpbGVyXSBjYWNoZXMudGlsZS5rZXlzKCk6YCwgY2FjaGVzLnRpbGUua2V5cygpKTtcbiAgICBpZiAoY2FjaGVzLnRpbGUuaGFzKGtleVRvVGlsZUNhY2hlKSkge1xuICAgICAgaWYgKGRlYnVnTGV2ZWwgPj0gMSkgY29uc29sZS5sb2coYFtpbXRpbGVyXSB1c2luZyB0aWxlIGNhY2hlYCk7XG4gICAgICBpZiAoW3VuZGVmaW5lZCwgXCJpbWFnZS9wbmdcIiwgXCJwbmdcIl0uaW5jbHVkZXMoZikpIHtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiaW1hZ2UvcG5nXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoW1wiaW1hZ2UvanBlZ1wiLCBcImltYWdlL2pwZ1wiLCBcImpwZWdcIiwgXCJqcGdcIl0uaW5jbHVkZXMoZikpIHtcbiAgICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJpbWFnZS9qcGVnXCI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgaXNCYXNlNjRFbmNvZGVkOiB0cnVlLFxuICAgICAgICBoZWFkZXJzLFxuICAgICAgICBib2R5OiBjYWNoZXMudGlsZS5nZXQoa2V5VG9UaWxlQ2FjaGUpXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChjYWNoZXMuZ2VvdGlmZi5oYXModXJsKSkge1xuICAgICAgaWYgKGRlYnVnTGV2ZWwgPj0gMSkgY29uc29sZS5sb2coXCJbaW10aWxlcl0gdXNpbmcgY2FjaGVcIik7XG4gICAgICBnZW90aWZmID0gYXdhaXQgY2FjaGVzLmdlb3RpZmYuZ2V0KHVybCkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IGdlb3RpZmZfZnJvbSh7IGRhdGE6IHVybCwgb3ZyOiB0cnVlIH0pO1xuICAgICAgY2FjaGVzLmdlb3RpZmYuc2V0KHVybCwgKCkgPT4gcHJvbWlzZSk7XG4gICAgICBpZiAoZGVidWdMZXZlbCA+PSAxKSBjb25zb2xlLmxvZyhcIltpbXRpbGVyXSBhZGRlZCB0byBjYWNoZVwiKTtcbiAgICAgIGdlb3RpZmYgPSBhd2FpdCBwcm9taXNlO1xuICAgIH1cblxuICAgIGNvbnN0IGJib3g0MzI2ID0gdGlsZWJlbHQudGlsZVRvQkJPWChbeCwgeSwgel0pO1xuICAgIGlmIChkZWJ1Z0xldmVsID49IDEpIGNvbnNvbGUubG9nKFwiW2ltdGlsZXJdIGJib3ggaW4gNDMyNjogXCIgKyBKU09OLnN0cmluZ2lmeShiYm94NDMyNikpO1xuICAgIGNvbnN0IGJib3gzODU3ID0gcmVwcm9qZWN0Qm91bmRpbmdCb3goe1xuICAgICAgYmJveDogYmJveDQzMjYsXG4gICAgICBmcm9tOiA0MzI2LFxuICAgICAgdG86IDM4NTdcbiAgICB9KTtcbiAgICBpZiAoZGVidWdMZXZlbCA+PSAxKSBjb25zb2xlLmxvZyhcIltpbXRpbGVyXSBiYm94IGluIDM4NTc6IFwiICsgSlNPTi5zdHJpbmdpZnkoYmJveDM4NTcpKTtcblxuICAgIGNvbnN0IGltYWdlID0gYXdhaXQgZ2VvdGlmZi5nZXRJbWFnZSgpO1xuICAgIGlmIChkZWJ1Z0xldmVsID49IDEpIGNvbnNvbGUubG9nKFwiW2ltdGlsZXJdIGdvdCBpbWFnZVwiKTtcblxuICAgIGNvbnN0IHsgZ2VvS2V5cyB9ID0gaW1hZ2U7XG4gICAgaWYgKGRlYnVnTGV2ZWwgPj0gMikgY29uc29sZS5sb2coXCJbaW10aWxlcl0gZ2VvS2V5czpcIiwgSlNPTi5zdHJpbmdpZnkoZ2VvS2V5cykpO1xuXG4gICAgaWYgKCFnZW9LZXlzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJbaW10aWxlcl0gY2FuJ3QgY3JlYXRlIHRpbGUgYmVjYXVzZSBnZW90aWZmIGRvZXNuJ3QgYXBwZWFyIHRvIGhhdmUgZ2VvS2V5c1wiKTtcbiAgICB9XG5cbiAgICBjb25zdCBnZW90aWZmX3NycyA9IGdlb0tleXMuR2VvZ3JhcGhpY1R5cGVHZW9LZXkgfHwgZ2VvS2V5cy5Qcm9qZWN0ZWRDU1R5cGVHZW9LZXk7XG4gICAgaWYgKGRlYnVnTGV2ZWwgPj0gMikgY29uc29sZS5sb2coXCJbaW10aWxlcl0gZ2VvdGlmZl9zcnM6XCIsIGdlb3RpZmZfc3JzKTtcblxuICAgIGlmICghZ2VvdGlmZl9zcnMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIltpbXRpbGVyXSBnZW90aWZmIGhhcyBnZW9rZXlzLCBidXQgaXMgbWlzc2luZyBib3RoIEdlb2dyYXBoaWNUeXBlR2VvS2V5IGFuZCBQcm9qZWN0ZWRDU1R5cGVHZW9LZXlcIik7XG4gICAgfVxuXG4gICAgY29uc3QgZXh0ZW50T2ZHZW9USUZGID0gbmV3IEdlb0V4dGVudChpbWFnZS5nZXRCb3VuZGluZ0JveCgpLCB7XG4gICAgICBzcnM6IGdlb3RpZmZfc3JzXG4gICAgfSk7XG4gICAgY29uc3QgZXh0ZW50T2ZUaWxlID0gbmV3IEdlb0V4dGVudChiYm94NDMyNiwgeyBzcnM6IDQzMjYgfSk7XG5cbiAgICBpZiAoIWV4dGVudE9mR2VvVElGRi5vdmVybGFwcyhleHRlbnRPZlRpbGUpKSB7XG4gICAgICBpZiAoZGVidWdMZXZlbCA+PSAxKSBjb25zb2xlLmxvZyhcIltpbXRpbGVyXSB0aWxlIGFuZCBnZW90aWZmIGRvIG5vdCBvdmVybGFwLCBzbyByZXR1cm4gYSBibGFuayBpbWFnZVwiKTtcbiAgICAgIGNvbnN0IG91dF9kYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDQgKiBzaXplICogc2l6ZSk7XG4gICAgICBpZiAoZiA9PT0gXCJwbmdcIikge1xuICAgICAgICBjb25zdCB7IGRhdGE6IGJ1ZmZlciB9ID0gd3JpdGVJbWFnZSh7XG4gICAgICAgICAgZGF0YTogb3V0X2RhdGEsXG4gICAgICAgICAgZGVidWc6IGZhbHNlLFxuICAgICAgICAgIGZvcm1hdDogXCJQTkdcIixcbiAgICAgICAgICBoZWlnaHQ6IHNpemUsXG4gICAgICAgICAgd2lkdGg6IHNpemVcbiAgICAgICAgfSk7XG4gICAgICAgIGJvZHkgPSBidWZmZXIudG9TdHJpbmcoXCJiYXNlNjRcIik7XG4gICAgICAgIGlzQmFzZTY0RW5jb2RlZCA9IHRydWU7XG4gICAgICAgIGhlYWRlcnNbXCJDb250ZW50LVR5cGVcIl0gPSBcImltYWdlL3BuZ1wiO1xuICAgICAgfSBlbHNlIGlmIChmID09PSBcImpwZ1wiKSB7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogYnVmZmVyIH0gPSB3cml0ZUltYWdlKHtcbiAgICAgICAgICBkYXRhOiBvdXRfZGF0YSxcbiAgICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgICAgZm9ybWF0OiBcIkpQR1wiLFxuICAgICAgICAgIGhlaWdodDogc2l6ZSxcbiAgICAgICAgICB3aWR0aDogc2l6ZSxcbiAgICAgICAgICBxdWFsaXR5OiA4NVxuICAgICAgICB9KTtcbiAgICAgICAgYm9keSA9IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgICAgICAgaXNCYXNlNjRFbmNvZGVkID0gdHJ1ZTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiaW1hZ2UvanBlZ1wiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoYGZvcm1hdCBcIiR7Zn1cIiBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUudGltZShgJHtyZXF1ZXN0X2lkfTogcmVhZGluZyBib3VuZGluZyBib3hgKTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZWFkQm91bmRpbmdCb3goe1xuICAgICAgICBiYm94OiBiYm94Mzg1NyxcbiAgICAgICAgZGVidWdMZXZlbDogMixcbiAgICAgICAgc3JzOiAzODU3LFxuICAgICAgICBnZW90aWZmLFxuICAgICAgICB1c2Vfb3ZlcnZpZXc6IHRydWUsXG4gICAgICAgIHRhcmdldF9oZWlnaHQ6IHNpemUsXG4gICAgICAgIHRhcmdldF93aWR0aDogc2l6ZVxuICAgICAgfSk7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoYCR7cmVxdWVzdF9pZH06IHJlYWRpbmcgYm91bmRpbmcgYm94YCk7XG5cbiAgICAgIGNvbnNvbGUudGltZShgJHtyZXF1ZXN0X2lkfTogd2FycGluZ2ApO1xuICAgICAgY29uc3Qgd2FycGVkID0gZ2Vvd2FycCh7XG4gICAgICAgIGRlYnVnX2xldmVsOiAwLFxuICAgICAgICByZXByb2plY3Q6IHByb2o0KFwiRVBTRzozODU3XCIsIFwiRVBTRzpcIiArIGluZm8uc3JzX29mX2dlb3RpZmYpLmZvcndhcmQsXG4gICAgICAgIGluX2RhdGE6IGluZm8uZGF0YSxcbiAgICAgICAgaW5fYmJveDogaW5mby5yZWFkX2Jib3gsXG4gICAgICAgIGluX3NyczogaW5mby5zcnNfb2ZfZ2VvdGlmZixcbiAgICAgICAgaW5fd2lkdGg6IGluZm8ud2lkdGgsXG4gICAgICAgIGluX2hlaWdodDogaW5mby5oZWlnaHQsXG4gICAgICAgIG91dF9iYm94OiBiYm94Mzg1NyxcbiAgICAgICAgb3V0X3NyczogMzg1NyxcbiAgICAgICAgb3V0X2hlaWdodDogc2l6ZSxcbiAgICAgICAgb3V0X3dpZHRoOiBzaXplLFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIHJvdW5kOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUudGltZUVuZChgJHtyZXF1ZXN0X2lkfTogd2FycGluZ2ApO1xuXG4gICAgICBpZiAoZiA9PT0gdW5kZWZpbmVkIHx8IGYgPT09IFwicG5nXCIpIHtcbiAgICAgICAgY29uc29sZS50aW1lKGAke3JlcXVlc3RfaWR9OiB3cml0aW5nIGltYWdlYCk7XG4gICAgICAgIGNvbnN0IHsgZGF0YTogYnVmZmVyIH0gPSB3cml0ZUltYWdlKHtcbiAgICAgICAgICBkYXRhOiB3YXJwZWQuZGF0YSxcbiAgICAgICAgICBoZWlnaHQ6IHNpemUsXG4gICAgICAgICAgd2lkdGg6IHNpemUsXG4gICAgICAgICAgZm9ybWF0OiBcIlBOR1wiXG4gICAgICAgIH0pO1xuICAgICAgICBib2R5ID0gYnVmZmVyLnRvU3RyaW5nKFwiYmFzZTY0XCIpO1xuICAgICAgICBpc0Jhc2U2NEVuY29kZWQgPSB0cnVlO1xuICAgICAgICBoZWFkZXJzW1wiQ29udGVudC1UeXBlXCJdID0gXCJpbWFnZS9wbmdcIjtcbiAgICAgIH0gZWxzZSBpZiAoZiA9PT0gXCJqcGdcIikge1xuICAgICAgICBjb25zdCB7IGRhdGE6IGJ1ZmZlciB9ID0gd3JpdGVJbWFnZSh7XG4gICAgICAgICAgZGF0YTogd2FycGVkLmRhdGEsXG4gICAgICAgICAgaGVpZ2h0OiBzaXplLFxuICAgICAgICAgIHdpZHRoOiBzaXplLFxuICAgICAgICAgIGZvcm1hdDogXCJKUEdcIlxuICAgICAgICB9KTtcbiAgICAgICAgYm9keSA9IGJ1ZmZlci50b1N0cmluZyhcImJhc2U2NFwiKTtcbiAgICAgICAgaXNCYXNlNjRFbmNvZGVkID0gdHJ1ZTtcbiAgICAgICAgaGVhZGVyc1tcIkNvbnRlbnQtVHlwZVwiXSA9IFwiaW1hZ2UvanBlZ1wiO1xuICAgICAgfVxuICAgICAgY29uc29sZS50aW1lRW5kKGAke3JlcXVlc3RfaWR9OiB3cml0aW5nIGltYWdlYCk7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coXCJzZXR0aW5nIFwiLCB7IGtleVRvVGlsZUNhY2hlIH0pO1xuICAgIGNhY2hlcy50aWxlLnNldChrZXlUb1RpbGVDYWNoZSwgYm9keSk7XG4gICAgaWYgKGRlYnVnTGV2ZWwgPj0gMSkgY29uc29sZS5sb2coYFtpbXRpbGVyXSBhZnRlciBzZXR0aW5nIGNhY2hlcy50aWxlLmtleXMoKTpgLCBjYWNoZXMudGlsZS5rZXlzKCkpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgaXNCYXNlNjRFbmNvZGVkLFxuICAgICAgaGVhZGVycyxcbiAgICAgIGJvZHlcbiAgICB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXNDb2RlOiA1MDAsXG4gICAgICBib2R5OiBwcm9jZXNzLmVudi5JTV9USUxFUl9ERVZfTU9ERSA9PT0gXCJ0cnVlXCIgPyBKU09OLnN0cmluZ2lmeSh7IG1zZzogZXJyb3IubWVzc2FnZSB9KSA6IFwiaW50ZXJuYWwgZXJyb3JcIlxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0cy5oYW5kbGVyID0gaGFuZGxlcjtcblxuaWYgKHJlcXVpcmUubWFpbiA9PT0gbW9kdWxlKSB7XG4gIGNvbnN0IGFyZ3MgPSBBcnJheS5mcm9tKHByb2Nlc3MuYXJndik7XG4gIGNvbnN0IHN0ciA9IGFyZ3Muam9pbihcIiBcIik7XG5cbiAgY29uc3QgZGVidWcgPSAhIXN0ci5tYXRjaCgvLT8tZGVidWcoKD18PT0gKSh0cnVlfFRydWV8VFJVRSkpPy8pO1xuICBjb25zdCBzZXJ2ZSA9ICEhc3RyLm1hdGNoKC8tPy1zZXJ2ZSgoPXw9PSApKHRydWV8VHJ1ZXxUUlVFKSk/Lyk7XG5cbiAgaWYgKHNlcnZlKSB7XG4gICAgY29uc3QgbWF4ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc3RyLm1hdGNoKC8tPy1tYXgoPzo9fD09ICkoXFxkKykvKSB8fCBbXSwgMSlbMF07XG4gICAgY29uc3QgcG9ydCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHN0ci5tYXRjaCgvLT8tcG9ydCg/Oj18PT0gKShcXGQrKS8pIHx8IFtdLCAxKVswXTtcbiAgICBsZHMuc2VydmUoe1xuICAgICAgZGVidWcsXG4gICAgICBoYW5kbGVyLFxuICAgICAgbWF4LFxuICAgICAgcG9ydFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVybCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHN0ci5tYXRjaCgvLT8tdXJsKD86PXw9PSApKFteIF0rKS8pIHx8IFtdLCAxKVswXTtcbiAgICBjb25zdCBtZXRob2QgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzdHIubWF0Y2goLy0/LW1ldGhvZCg/Oj18PT0gKShbXiBdKykvKSB8fCBbXSwgMSlbMF07XG4gICAgbGV0IGYgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzdHIubWF0Y2goLy0/LWYoPzo9fD09ICkoW14gXSspLykgfHwgW10sIDEpWzBdO1xuICAgIGNvbnN0IHIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzdHIubWF0Y2goLy0/LXIoPzo9fD09ICkoW14gXSspLykgfHwgW10sIDEpWzBdO1xuICAgIGNvbnN0IHggPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzdHIubWF0Y2goLy0/LXgoPzo9fD09ICkoXFxkKykvKSB8fCBbXSwgMSlbMF07XG4gICAgY29uc3QgeSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHN0ci5tYXRjaCgvLT8teSg/Oj18PT0gKShcXGQrKS8pIHx8IFtdLCAxKVswXTtcbiAgICBjb25zdCB6ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoc3RyLm1hdGNoKC8tPy16KD86PXw9PSApKFxcZCspLykgfHwgW10sIDEpWzBdO1xuICAgIGxldCBvdXRwdXQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzdHIubWF0Y2goLy0/LW91dHB1dCg/Oj18PT0gKShbXiBdKykvKSB8fCBbXSwgMSlbMF07XG5cbiAgICBpZiAoIWYgJiYgb3V0cHV0KSB7XG4gICAgICBpZiAob3V0cHV0LmVuZHNXaXRoKFwicG5nXCIpKSBmID0gXCJwbmdcIjtcbiAgICAgIGVsc2UgaWYgKG91dHB1dC5lbmRzV2l0aChcImpwZ1wiKSB8fCBvdXRwdXQuZW5kc1dpdGgoXCJqcGVnXCIpKSBmID0gXCJqcGdcIjtcbiAgICB9XG5cbiAgICBpZiAob3V0cHV0KSB7XG4gICAgICBjb25zdCBjd2QgPSBwcm9jZXNzLmN3ZCgpO1xuICAgICAgaWYgKCFwYXRoLmlzQWJzb2x1dGUob3V0cHV0KSkge1xuICAgICAgICBvdXRwdXQgPSBwYXRoLnJlc29sdmUoY3dkLCBvdXRwdXQpO1xuICAgICAgfVxuICAgICAgY29uc29sZS5sb2coYFtpbXRpbGVyXSBzYXZpbmcgdG8gXCIke291dHB1dH1cImApO1xuICAgIH1cblxuICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgcXVlcnlTdHJpbmdQYXJhbWV0ZXJzOiB7XG4gICAgICAgIHVybCxcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBmLFxuICAgICAgICB4LFxuICAgICAgICByLFxuICAgICAgICB5LFxuICAgICAgICB6XG4gICAgICB9XG4gICAgfTtcblxuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVyKGV2ZW50KTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVzdWx0OlwiLCByZXN1bHQpO1xuICAgICAgaWYgKG91dHB1dCkge1xuICAgICAgICB3cml0ZUZpbGVTeW5jKG91dHB1dCwgQnVmZmVyLmZyb20ocmVzdWx0LmJvZHksIFwiYmFzZTY0XCIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5ib2R5KTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsid3JpdGVGaWxlU3luYyIsInJlcXVpcmUiLCJwYXRoIiwiZ2VvdGlmZl9mcm9tIiwiZ2Vvd2FycCIsInRpbGViZWx0IiwiR2VvRXh0ZW50IiwicmVwcm9qZWN0Qm91bmRpbmdCb3giLCJMUlUiLCJ3cml0ZUltYWdlIiwicmVhZEJvdW5kaW5nQm94IiwicGFyc2VBbnlJbnQiLCJwcm9qNCIsImxkcyIsImNhY2hlcyIsImdlb3RpZmYiLCJ0aWxlIiwiaGFuZGxlciIsImV2ZW50IiwiY29udGV4dCIsInJlcXVlc3RfaWQiLCJNYXRoIiwicmFuZG9tIiwidG9TdHJpbmciLCJzcGxpdCIsInNsaWNlIiwiZGVidWdMZXZlbCIsIk51bWJlciIsInByb2Nlc3MiLCJlbnYiLCJJTV9USUxFUl9ERUJVR19MRVZFTCIsImNvbnNvbGUiLCJsb2ciLCJib2R5IiwiaXNCYXNlNjRFbmNvZGVkIiwiaGVhZGVycyIsInF1ZXJ5U3RyaW5nUGFyYW1ldGVycyIsInBhcmFtcyIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwiayIsInYiLCJ0cmltIiwicXVlcnlLZXlzIiwia2V5cyIsIm1hcCIsImxlbmd0aCIsIkVycm9yIiwiZGVidWciLCJyIiwidXJsIiwibWV0aG9kIiwiZiIsIngiLCJ5IiwieiIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwic2l6ZSIsInJvdW5kIiwia2V5VG9UaWxlQ2FjaGUiLCJKU09OIiwic3RyaW5naWZ5IiwiaGFzIiwic3RhdHVzQ29kZSIsImdldCIsInByb21pc2UiLCJkYXRhIiwib3ZyIiwic2V0IiwiYmJveDQzMjYiLCJ0aWxlVG9CQk9YIiwiYmJveDM4NTciLCJiYm94IiwiZnJvbSIsInRvIiwiaW1hZ2UiLCJnZXRJbWFnZSIsImdlb0tleXMiLCJnZW90aWZmX3NycyIsIkdlb2dyYXBoaWNUeXBlR2VvS2V5IiwiUHJvamVjdGVkQ1NUeXBlR2VvS2V5IiwiZXh0ZW50T2ZHZW9USUZGIiwiZ2V0Qm91bmRpbmdCb3giLCJzcnMiLCJleHRlbnRPZlRpbGUiLCJvdmVybGFwcyIsIm91dF9kYXRhIiwiVWludDhDbGFtcGVkQXJyYXkiLCJidWZmZXIiLCJmb3JtYXQiLCJoZWlnaHQiLCJ3aWR0aCIsInF1YWxpdHkiLCJ0aW1lIiwiaW5mbyIsInVzZV9vdmVydmlldyIsInRhcmdldF9oZWlnaHQiLCJ0YXJnZXRfd2lkdGgiLCJ0aW1lRW5kIiwid2FycGVkIiwiZGVidWdfbGV2ZWwiLCJyZXByb2plY3QiLCJzcnNfb2ZfZ2VvdGlmZiIsImZvcndhcmQiLCJpbl9kYXRhIiwiaW5fYmJveCIsInJlYWRfYmJveCIsImluX3NycyIsImluX3dpZHRoIiwiaW5faGVpZ2h0Iiwib3V0X2Jib3giLCJvdXRfc3JzIiwib3V0X2hlaWdodCIsIm91dF93aWR0aCIsInJlc3VsdCIsImVycm9yIiwiSU1fVElMRVJfREVWX01PREUiLCJtc2ciLCJtZXNzYWdlIiwiZXhwb3J0cyIsIm1haW4iLCJtb2R1bGUiLCJhcmdzIiwiQXJyYXkiLCJhcmd2Iiwic3RyIiwiam9pbiIsIm1hdGNoIiwic2VydmUiLCJtYXgiLCJwcm90b3R5cGUiLCJjYWxsIiwicG9ydCIsIm91dHB1dCIsImVuZHNXaXRoIiwiY3dkIiwiaXNBYnNvbHV0ZSIsInJlc29sdmUiLCJCdWZmZXIiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3591\n')},8086:Q=>{function F(Q){var F=new Error("Cannot find module '"+Q+"'");throw F.code="MODULE_NOT_FOUND",F}F.keys=()=>[],F.resolve=F,F.id=8086,Q.exports=F},6231:Q=>{"use strict";Q.exports=require("fs")},4439:Q=>{"use strict";Q.exports=require("http")},1423:Q=>{"use strict";Q.exports=require("path")},9491:Q=>{"use strict";Q.exports=require("assert")},4300:Q=>{"use strict";Q.exports=require("buffer")},2081:Q=>{"use strict";Q.exports=require("child_process")},2361:Q=>{"use strict";Q.exports=require("events")},5687:Q=>{"use strict";Q.exports=require("https")},2037:Q=>{"use strict";Q.exports=require("os")},2781:Q=>{"use strict";Q.exports=require("stream")},6224:Q=>{"use strict";Q.exports=require("tty")},7310:Q=>{"use strict";Q.exports=require("url")},3837:Q=>{"use strict";Q.exports=require("util")},9796:Q=>{"use strict";Q.exports=require("zlib")}},__webpack_module_cache__={},deferred,next,installedChunks;function __webpack_require__(Q){var F=__webpack_module_cache__[Q];if(void 0!==F)return F.exports;var B=__webpack_module_cache__[Q]={id:Q,loaded:!1,exports:{}};return __webpack_modules__[Q].call(B.exports,B,B.exports,__webpack_require__),B.loaded=!0,B.exports}__webpack_require__.m=__webpack_modules__,__webpack_require__.c=__webpack_module_cache__,__webpack_require__.x=()=>{var Q=__webpack_require__.O(void 0,[736],(()=>__webpack_require__(__webpack_require__.s=3591)));return __webpack_require__.O(Q)},deferred=[],__webpack_require__.O=(Q,F,B,U)=>{if(!F){var s=1/0;for(g=0;g<deferred.length;g++){for(var[F,B,U]=deferred[g],I=!0,e=0;e<F.length;e++)(!1&U||s>=U)&&Object.keys(__webpack_require__.O).every((Q=>__webpack_require__.O[Q](F[e])))?F.splice(e--,1):(I=!1,U<s&&(s=U));if(I){deferred.splice(g--,1);var i=B();void 0!==i&&(Q=i)}}return Q}U=U||0;for(var g=deferred.length;g>0&&deferred[g-1][2]>U;g--)deferred[g]=deferred[g-1];deferred[g]=[F,B,U]},__webpack_require__.n=Q=>{var F=Q&&Q.__esModule?()=>Q.default:()=>Q;return __webpack_require__.d(F,{a:F}),F},__webpack_require__.d=(Q,F)=>{for(var B in F)__webpack_require__.o(F,B)&&!__webpack_require__.o(Q,B)&&Object.defineProperty(Q,B,{enumerable:!0,get:F[B]})},__webpack_require__.f={},__webpack_require__.e=Q=>Promise.all(Object.keys(__webpack_require__.f).reduce(((F,B)=>(__webpack_require__.f[B](Q,F),F)),[])),__webpack_require__.u=Q=>{if(736===Q)return"vendor.js"},__webpack_require__.o=(Q,F)=>Object.prototype.hasOwnProperty.call(Q,F),__webpack_require__.r=Q=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(Q,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(Q,"__esModule",{value:!0})},__webpack_require__.nmd=Q=>(Q.paths=[],Q.children||(Q.children=[]),Q),installedChunks={179:1},__webpack_require__.O.require=Q=>installedChunks[Q],__webpack_require__.f.require=(Q,F)=>{installedChunks[Q]||(Q=>{var F=Q.modules,B=Q.ids,U=Q.runtime;for(var s in F)__webpack_require__.o(F,s)&&(__webpack_require__.m[s]=F[s]);U&&U(__webpack_require__);for(var I=0;I<B.length;I++)installedChunks[B[I]]=1;__webpack_require__.O()})(require("./"+__webpack_require__.u(Q)))},next=__webpack_require__.x,__webpack_require__.x=()=>(__webpack_require__.e(736),next());var __webpack_exports__=__webpack_require__.x(),__webpack_export_target__=exports;for(var i in __webpack_exports__)__webpack_export_target__[i]=__webpack_exports__[i];__webpack_exports__.__esModule&&Object.defineProperty(__webpack_export_target__,"__esModule",{value:!0})})();