96 lines
48 KiB
JavaScript
96 lines
48 KiB
JavaScript
"use strict";
|
||
/*
|
||
* ATTENTION: An "eval-source-map" devtool has been used.
|
||
* This devtool is neither made for production nor for readable output files.
|
||
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
||
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
||
* or disable the default devtool with "devtool: false".
|
||
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
||
*/
|
||
(() => {
|
||
var exports = {};
|
||
exports.id = "app/api/admin/toggle-user-lock/route";
|
||
exports.ids = ["app/api/admin/toggle-user-lock/route"];
|
||
exports.modules = {
|
||
|
||
/***/ "mysql2/promise":
|
||
/*!*********************************!*\
|
||
!*** external "mysql2/promise" ***!
|
||
\*********************************/
|
||
/***/ ((module) => {
|
||
|
||
module.exports = require("mysql2/promise");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "next/dist/compiled/next-server/app-page.runtime.dev.js":
|
||
/*!*************************************************************************!*\
|
||
!*** external "next/dist/compiled/next-server/app-page.runtime.dev.js" ***!
|
||
\*************************************************************************/
|
||
/***/ ((module) => {
|
||
|
||
module.exports = require("next/dist/compiled/next-server/app-page.runtime.dev.js");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "next/dist/compiled/next-server/app-route.runtime.dev.js":
|
||
/*!**************************************************************************!*\
|
||
!*** external "next/dist/compiled/next-server/app-route.runtime.dev.js" ***!
|
||
\**************************************************************************/
|
||
/***/ ((module) => {
|
||
|
||
module.exports = require("next/dist/compiled/next-server/app-route.runtime.dev.js");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!":
|
||
/*!**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||
!*** ./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D! ***!
|
||
\**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ originalPathname: () => (/* binding */ originalPathname),\n/* harmony export */ patchFetch: () => (/* binding */ patchFetch),\n/* harmony export */ requestAsyncStorage: () => (/* binding */ requestAsyncStorage),\n/* harmony export */ routeModule: () => (/* binding */ routeModule),\n/* harmony export */ serverHooks: () => (/* binding */ serverHooks),\n/* harmony export */ staticGenerationAsyncStorage: () => (/* binding */ staticGenerationAsyncStorage)\n/* harmony export */ });\n/* harmony import */ var next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/server/future/route-modules/app-route/module.compiled */ \"(rsc)/./node_modules/next/dist/server/future/route-modules/app-route/module.compiled.js\");\n/* harmony import */ var next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_dist_server_future_route_kind__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dist/server/future/route-kind */ \"(rsc)/./node_modules/next/dist/server/future/route-kind.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dist/server/lib/patch-fetch */ \"(rsc)/./node_modules/next/dist/server/lib/patch-fetch.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var C_Users_tom_VS_Code_MamadApp_mamad_app_app_api_admin_toggle_user_lock_route_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./app/api/admin/toggle-user-lock/route.ts */ \"(rsc)/./app/api/admin/toggle-user-lock/route.ts\");\n\n\n\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new next_dist_server_future_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__.AppRouteRouteModule({\n definition: {\n kind: next_dist_server_future_route_kind__WEBPACK_IMPORTED_MODULE_1__.RouteKind.APP_ROUTE,\n page: \"/api/admin/toggle-user-lock/route\",\n pathname: \"/api/admin/toggle-user-lock\",\n filename: \"route\",\n bundlePath: \"app/api/admin/toggle-user-lock/route\"\n },\n resolvedPagePath: \"C:\\\\Users\\\\tom\\\\VS Code\\\\MamadApp\\\\mamad-app\\\\app\\\\api\\\\admin\\\\toggle-user-lock\\\\route.ts\",\n nextConfigOutput,\n userland: C_Users_tom_VS_Code_MamadApp_mamad_app_app_api_admin_toggle_user_lock_route_ts__WEBPACK_IMPORTED_MODULE_3__\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { requestAsyncStorage, staticGenerationAsyncStorage, serverHooks } = routeModule;\nconst originalPathname = \"/api/admin/toggle-user-lock/route\";\nfunction patchFetch() {\n return (0,next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__.patchFetch)({\n serverHooks,\n staticGenerationAsyncStorage\n });\n}\n\n\n//# sourceMappingURL=app-route.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWFwcC1sb2FkZXIuanM/bmFtZT1hcHAlMkZhcGklMkZhZG1pbiUyRnRvZ2dsZS11c2VyLWxvY2slMkZyb3V0ZSZwYWdlPSUyRmFwaSUyRmFkbWluJTJGdG9nZ2xlLXVzZXItbG9jayUyRnJvdXRlJmFwcFBhdGhzPSZwYWdlUGF0aD1wcml2YXRlLW5leHQtYXBwLWRpciUyRmFwaSUyRmFkbWluJTJGdG9nZ2xlLXVzZXItbG9jayUyRnJvdXRlLnRzJmFwcERpcj1DJTNBJTVDVXNlcnMlNUN0b20lNUNWUyUyMENvZGUlNUNNYW1hZEFwcCU1Q21hbWFkLWFwcCU1Q2FwcCZwYWdlRXh0ZW5zaW9ucz10c3gmcGFnZUV4dGVuc2lvbnM9dHMmcGFnZUV4dGVuc2lvbnM9anN4JnBhZ2VFeHRlbnNpb25zPWpzJnJvb3REaXI9QyUzQSU1Q1VzZXJzJTVDdG9tJTVDVlMlMjBDb2RlJTVDTWFtYWRBcHAlNUNtYW1hZC1hcHAmaXNEZXY9dHJ1ZSZ0c2NvbmZpZ1BhdGg9dHNjb25maWcuanNvbiZiYXNlUGF0aD0mYXNzZXRQcmVmaXg9Jm5leHRDb25maWdPdXRwdXQ9JnByZWZlcnJlZFJlZ2lvbj0mbWlkZGxld2FyZUNvbmZpZz1lMzAlM0QhIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFzRztBQUN2QztBQUNjO0FBQ3lDO0FBQ3RIO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixnSEFBbUI7QUFDM0M7QUFDQSxjQUFjLHlFQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxZQUFZO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaUVBQWlFO0FBQ3pFO0FBQ0E7QUFDQSxXQUFXLDRFQUFXO0FBQ3RCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDdUg7O0FBRXZIIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vbWFtYWQtYXBwLz9lYzcxIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcFJvdXRlUm91dGVNb2R1bGUgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9mdXR1cmUvcm91dGUtbW9kdWxlcy9hcHAtcm91dGUvbW9kdWxlLmNvbXBpbGVkXCI7XG5pbXBvcnQgeyBSb3V0ZUtpbmQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9mdXR1cmUvcm91dGUta2luZFwiO1xuaW1wb3J0IHsgcGF0Y2hGZXRjaCBhcyBfcGF0Y2hGZXRjaCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9wYXRjaC1mZXRjaFwiO1xuaW1wb3J0ICogYXMgdXNlcmxhbmQgZnJvbSBcIkM6XFxcXFVzZXJzXFxcXHRvbVxcXFxWUyBDb2RlXFxcXE1hbWFkQXBwXFxcXG1hbWFkLWFwcFxcXFxhcHBcXFxcYXBpXFxcXGFkbWluXFxcXHRvZ2dsZS11c2VyLWxvY2tcXFxccm91dGUudHNcIjtcbi8vIFdlIGluamVjdCB0aGUgbmV4dENvbmZpZ091dHB1dCBoZXJlIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIGluIHRoZSByb3V0ZVxuLy8gbW9kdWxlLlxuY29uc3QgbmV4dENvbmZpZ091dHB1dCA9IFwiXCJcbmNvbnN0IHJvdXRlTW9kdWxlID0gbmV3IEFwcFJvdXRlUm91dGVNb2R1bGUoe1xuICAgIGRlZmluaXRpb246IHtcbiAgICAgICAga2luZDogUm91dGVLaW5kLkFQUF9ST1VURSxcbiAgICAgICAgcGFnZTogXCIvYXBpL2FkbWluL3RvZ2dsZS11c2VyLWxvY2svcm91dGVcIixcbiAgICAgICAgcGF0aG5hbWU6IFwiL2FwaS9hZG1pbi90b2dnbGUtdXNlci1sb2NrXCIsXG4gICAgICAgIGZpbGVuYW1lOiBcInJvdXRlXCIsXG4gICAgICAgIGJ1bmRsZVBhdGg6IFwiYXBwL2FwaS9hZG1pbi90b2dnbGUtdXNlci1sb2NrL3JvdXRlXCJcbiAgICB9LFxuICAgIHJlc29sdmVkUGFnZVBhdGg6IFwiQzpcXFxcVXNlcnNcXFxcdG9tXFxcXFZTIENvZGVcXFxcTWFtYWRBcHBcXFxcbWFtYWQtYXBwXFxcXGFwcFxcXFxhcGlcXFxcYWRtaW5cXFxcdG9nZ2xlLXVzZXItbG9ja1xcXFxyb3V0ZS50c1wiLFxuICAgIG5leHRDb25maWdPdXRwdXQsXG4gICAgdXNlcmxhbmRcbn0pO1xuLy8gUHVsbCBvdXQgdGhlIGV4cG9ydHMgdGhhdCB3ZSBuZWVkIHRvIGV4cG9zZSBmcm9tIHRoZSBtb2R1bGUuIFRoaXMgc2hvdWxkXG4vLyBiZSBlbGltaW5hdGVkIHdoZW4gd2UndmUgbW92ZWQgdGhlIG90aGVyIHJvdXRlcyB0byB0aGUgbmV3IGZvcm1hdC4gVGhlc2Vcbi8vIGFyZSB1c2VkIHRvIGhvb2sgaW50byB0aGUgcm91dGUuXG5jb25zdCB7IHJlcXVlc3RBc3luY1N0b3JhZ2UsIHN0YXRpY0dlbmVyYXRpb25Bc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzIH0gPSByb3V0ZU1vZHVsZTtcbmNvbnN0IG9yaWdpbmFsUGF0aG5hbWUgPSBcIi9hcGkvYWRtaW4vdG9nZ2xlLXVzZXItbG9jay9yb3V0ZVwiO1xuZnVuY3Rpb24gcGF0Y2hGZXRjaCgpIHtcbiAgICByZXR1cm4gX3BhdGNoRmV0Y2goe1xuICAgICAgICBzZXJ2ZXJIb29rcyxcbiAgICAgICAgc3RhdGljR2VuZXJhdGlvbkFzeW5jU3RvcmFnZVxuICAgIH0pO1xufVxuZXhwb3J0IHsgcm91dGVNb2R1bGUsIHJlcXVlc3RBc3luY1N0b3JhZ2UsIHN0YXRpY0dlbmVyYXRpb25Bc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzLCBvcmlnaW5hbFBhdGhuYW1lLCBwYXRjaEZldGNoLCAgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXBwLXJvdXRlLmpzLm1hcCJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./app/api/admin/toggle-user-lock/route.ts":
|
||
/*!*************************************************!*\
|
||
!*** ./app/api/admin/toggle-user-lock/route.ts ***!
|
||
\*************************************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ POST: () => (/* binding */ POST)\n/* harmony export */ });\n/* harmony import */ var next_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/server */ \"(rsc)/./node_modules/next/dist/api/server.js\");\n/* harmony import */ var _lib_database__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/lib/database */ \"(rsc)/./lib/database.ts\");\n\n\nasync function POST(request) {\n try {\n const { adminId, targetUserId, lockStatus } = await request.json();\n if (!adminId || !targetUserId || typeof lockStatus !== \"boolean\") {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"נתונים חסרים\"\n }, {\n status: 400\n });\n }\n // Get admin data\n const adminData = await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"SELECT role, field, department, team FROM users WHERE national_id = ?\", [\n adminId\n ]);\n if (adminData.length === 0) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"מנהל לא נמצא\"\n }, {\n status: 404\n });\n }\n const admin = adminData[0];\n // Get target user data\n const targetData = await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"SELECT field, department, team, name, lock_status FROM users WHERE national_id = ?\", [\n targetUserId\n ]);\n if (targetData.length === 0) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"משתמש לא נמצא\"\n }, {\n status: 404\n });\n }\n const target = targetData[0];\n // Check if admin can manage this user based on hierarchy\n let canManage = false;\n if (admin.role === \"global_admin\") {\n canManage = true;\n } else if (admin.role === \"field_admin\" && admin.field === target.field) {\n canManage = true;\n } else if (admin.role === \"department_admin\" && admin.department === target.department) {\n canManage = true;\n } else if (admin.role === \"team_admin\" && admin.team === target.team) {\n canManage = true;\n }\n if (!canManage) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"אין הרשאה לנעול/לבטל נעילה של משתמש זה\"\n }, {\n status: 403\n });\n }\n // Update user lock status\n await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"UPDATE users SET lock_status = ? WHERE national_id = ?\", [\n lockStatus,\n targetUserId\n ]);\n // Log the action\n const actionType = lockStatus ? \"lock_user\" : \"unlock_user\";\n await (0,_lib_database__WEBPACK_IMPORTED_MODULE_1__.safeQuery)(\"INSERT INTO admin_actions (admin_id, action_type, target_user_id) VALUES (?, ?, ?)\", [\n adminId,\n actionType,\n targetUserId\n ]);\n const statusText = lockStatus ? \"נעול\" : \"לא נעול\";\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n success: true,\n message: `סטטוס נעילה של ${target.name} שונה ל: ${statusText}`,\n lockStatus\n });\n } catch (error) {\n console.error(\"Toggle user lock error:\", error);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"שגיאה בשינוי סטטוס נעילה\"\n }, {\n status: 500\n });\n }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvYXBpL2FkbWluL3RvZ2dsZS11c2VyLWxvY2svcm91dGUudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQTREO0FBQ2xCO0FBRW5DLGVBQWVFLEtBQUtDLE9BQW9CO0lBQzdDLElBQUk7UUFDRixNQUFNLEVBQUVDLE9BQU8sRUFBRUMsWUFBWSxFQUFFQyxVQUFVLEVBQUUsR0FBRyxNQUFNSCxRQUFRSSxJQUFJO1FBRWhFLElBQUksQ0FBQ0gsV0FBVyxDQUFDQyxnQkFBZ0IsT0FBT0MsZUFBZSxXQUFXO1lBQ2hFLE9BQU9OLHFEQUFZQSxDQUFDTyxJQUFJLENBQUM7Z0JBQUVDLE9BQU87WUFBZSxHQUFHO2dCQUFFQyxRQUFRO1lBQUk7UUFDcEU7UUFFQSxpQkFBaUI7UUFDakIsTUFBTUMsWUFBYSxNQUFNVCx3REFBU0EsQ0FBQyx5RUFBeUU7WUFDMUdHO1NBQ0Q7UUFFRCxJQUFJTSxVQUFVQyxNQUFNLEtBQUssR0FBRztZQUMxQixPQUFPWCxxREFBWUEsQ0FBQ08sSUFBSSxDQUFDO2dCQUFFQyxPQUFPO1lBQWUsR0FBRztnQkFBRUMsUUFBUTtZQUFJO1FBQ3BFO1FBRUEsTUFBTUcsUUFBUUYsU0FBUyxDQUFDLEVBQUU7UUFFMUIsdUJBQXVCO1FBQ3ZCLE1BQU1HLGFBQWMsTUFBTVosd0RBQVNBLENBQ2pDLHNGQUNBO1lBQUNJO1NBQWE7UUFHaEIsSUFBSVEsV0FBV0YsTUFBTSxLQUFLLEdBQUc7WUFDM0IsT0FBT1gscURBQVlBLENBQUNPLElBQUksQ0FBQztnQkFBRUMsT0FBTztZQUFnQixHQUFHO2dCQUFFQyxRQUFRO1lBQUk7UUFDckU7UUFFQSxNQUFNSyxTQUFTRCxVQUFVLENBQUMsRUFBRTtRQUU1Qix5REFBeUQ7UUFDekQsSUFBSUUsWUFBWTtRQUVoQixJQUFJSCxNQUFNSSxJQUFJLEtBQUssZ0JBQWdCO1lBQ2pDRCxZQUFZO1FBQ2QsT0FBTyxJQUFJSCxNQUFNSSxJQUFJLEtBQUssaUJBQWlCSixNQUFNSyxLQUFLLEtBQUtILE9BQU9HLEtBQUssRUFBRTtZQUN2RUYsWUFBWTtRQUNkLE9BQU8sSUFBSUgsTUFBTUksSUFBSSxLQUFLLHNCQUFzQkosTUFBTU0sVUFBVSxLQUFLSixPQUFPSSxVQUFVLEVBQUU7WUFDdEZILFlBQVk7UUFDZCxPQUFPLElBQUlILE1BQU1JLElBQUksS0FBSyxnQkFBZ0JKLE1BQU1PLElBQUksS0FBS0wsT0FBT0ssSUFBSSxFQUFFO1lBQ3BFSixZQUFZO1FBQ2Q7UUFFQSxJQUFJLENBQUNBLFdBQVc7WUFDZCxPQUFPZixxREFBWUEsQ0FBQ08sSUFBSSxDQUFDO2dCQUFFQyxPQUFPO1lBQXlDLEdBQUc7Z0JBQUVDLFFBQVE7WUFBSTtRQUM5RjtRQUVBLDBCQUEwQjtRQUMxQixNQUFNUix3REFBU0EsQ0FBQywwREFBMEQ7WUFBQ0s7WUFBWUQ7U0FBYTtRQUVwRyxpQkFBaUI7UUFDakIsTUFBTWUsYUFBYWQsYUFBYSxjQUFjO1FBQzlDLE1BQU1MLHdEQUFTQSxDQUFDLHNGQUFzRjtZQUNwR0c7WUFDQWdCO1lBQ0FmO1NBQ0Q7UUFFRCxNQUFNZ0IsYUFBYWYsYUFBYSxTQUFTO1FBRXpDLE9BQU9OLHFEQUFZQSxDQUFDTyxJQUFJLENBQUM7WUFDdkJlLFNBQVM7WUFDVEMsU0FBUyxDQUFDLGVBQWUsRUFBRVQsT0FBT1UsSUFBSSxDQUFDLFNBQVMsRUFBRUgsV0FBVyxDQUFDO1lBQzlEZjtRQUNGO0lBQ0YsRUFBRSxPQUFPRSxPQUFPO1FBQ2RpQixRQUFRakIsS0FBSyxDQUFDLDJCQUEyQkE7UUFDekMsT0FBT1IscURBQVlBLENBQUNPLElBQUksQ0FBQztZQUFFQyxPQUFPO1FBQTJCLEdBQUc7WUFBRUMsUUFBUTtRQUFJO0lBQ2hGO0FBQ0YiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9tYW1hZC1hcHAvLi9hcHAvYXBpL2FkbWluL3RvZ2dsZS11c2VyLWxvY2svcm91dGUudHM/OTI2MCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE5leHRSZXF1ZXN0LCBOZXh0UmVzcG9uc2UgfSBmcm9tIFwibmV4dC9zZXJ2ZXJcIlxyXG5pbXBvcnQgeyBzYWZlUXVlcnkgfSBmcm9tIFwiQC9saWIvZGF0YWJhc2VcIlxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogTmV4dFJlcXVlc3QpIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgeyBhZG1pbklkLCB0YXJnZXRVc2VySWQsIGxvY2tTdGF0dXMgfSA9IGF3YWl0IHJlcXVlc3QuanNvbigpXHJcblxyXG4gICAgaWYgKCFhZG1pbklkIHx8ICF0YXJnZXRVc2VySWQgfHwgdHlwZW9mIGxvY2tTdGF0dXMgIT09IFwiYm9vbGVhblwiKSB7XHJcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcIteg16rXldeg15nXnSDXl9eh16jXmdedXCIgfSwgeyBzdGF0dXM6IDQwMCB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8vIEdldCBhZG1pbiBkYXRhXHJcbiAgICBjb25zdCBhZG1pbkRhdGEgPSAoYXdhaXQgc2FmZVF1ZXJ5KFwiU0VMRUNUIHJvbGUsIGZpZWxkLCBkZXBhcnRtZW50LCB0ZWFtIEZST00gdXNlcnMgV0hFUkUgbmF0aW9uYWxfaWQgPSA/XCIsIFtcclxuICAgICAgYWRtaW5JZCxcclxuICAgIF0pKSBhcyBhbnlbXVxyXG5cclxuICAgIGlmIChhZG1pbkRhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcItee16DXlNecINec15Ag16DXntem15BcIiB9LCB7IHN0YXR1czogNDA0IH0pXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgYWRtaW4gPSBhZG1pbkRhdGFbMF1cclxuXHJcbiAgICAvLyBHZXQgdGFyZ2V0IHVzZXIgZGF0YVxyXG4gICAgY29uc3QgdGFyZ2V0RGF0YSA9IChhd2FpdCBzYWZlUXVlcnkoXHJcbiAgICAgIFwiU0VMRUNUIGZpZWxkLCBkZXBhcnRtZW50LCB0ZWFtLCBuYW1lLCBsb2NrX3N0YXR1cyBGUk9NIHVzZXJzIFdIRVJFIG5hdGlvbmFsX2lkID0gP1wiLFxyXG4gICAgICBbdGFyZ2V0VXNlcklkXSxcclxuICAgICkpIGFzIGFueVtdXHJcblxyXG4gICAgaWYgKHRhcmdldERhdGEubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcItee16nXqtee16kg15zXkCDXoNee16bXkFwiIH0sIHsgc3RhdHVzOiA0MDQgfSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0YXJnZXQgPSB0YXJnZXREYXRhWzBdXHJcblxyXG4gICAgLy8gQ2hlY2sgaWYgYWRtaW4gY2FuIG1hbmFnZSB0aGlzIHVzZXIgYmFzZWQgb24gaGllcmFyY2h5XHJcbiAgICBsZXQgY2FuTWFuYWdlID0gZmFsc2VcclxuXHJcbiAgICBpZiAoYWRtaW4ucm9sZSA9PT0gXCJnbG9iYWxfYWRtaW5cIikge1xyXG4gICAgICBjYW5NYW5hZ2UgPSB0cnVlXHJcbiAgICB9IGVsc2UgaWYgKGFkbWluLnJvbGUgPT09IFwiZmllbGRfYWRtaW5cIiAmJiBhZG1pbi5maWVsZCA9PT0gdGFyZ2V0LmZpZWxkKSB7XHJcbiAgICAgIGNhbk1hbmFnZSA9IHRydWVcclxuICAgIH0gZWxzZSBpZiAoYWRtaW4ucm9sZSA9PT0gXCJkZXBhcnRtZW50X2FkbWluXCIgJiYgYWRtaW4uZGVwYXJ0bWVudCA9PT0gdGFyZ2V0LmRlcGFydG1lbnQpIHtcclxuICAgICAgY2FuTWFuYWdlID0gdHJ1ZVxyXG4gICAgfSBlbHNlIGlmIChhZG1pbi5yb2xlID09PSBcInRlYW1fYWRtaW5cIiAmJiBhZG1pbi50ZWFtID09PSB0YXJnZXQudGVhbSkge1xyXG4gICAgICBjYW5NYW5hZ2UgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFjYW5NYW5hZ2UpIHtcclxuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgZXJyb3I6IFwi15DXmdefINeU16jXqdeQ15Qg15zXoNei15XXnC/XnNeR15jXnCDXoNei15nXnNeUINep15wg157Xqdeq157XqSDXlteUXCIgfSwgeyBzdGF0dXM6IDQwMyB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8vIFVwZGF0ZSB1c2VyIGxvY2sgc3RhdHVzXHJcbiAgICBhd2FpdCBzYWZlUXVlcnkoXCJVUERBVEUgdXNlcnMgU0VUIGxvY2tfc3RhdHVzID0gPyBXSEVSRSBuYXRpb25hbF9pZCA9ID9cIiwgW2xvY2tTdGF0dXMsIHRhcmdldFVzZXJJZF0pXHJcblxyXG4gICAgLy8gTG9nIHRoZSBhY3Rpb25cclxuICAgIGNvbnN0IGFjdGlvblR5cGUgPSBsb2NrU3RhdHVzID8gXCJsb2NrX3VzZXJcIiA6IFwidW5sb2NrX3VzZXJcIlxyXG4gICAgYXdhaXQgc2FmZVF1ZXJ5KFwiSU5TRVJUIElOVE8gYWRtaW5fYWN0aW9ucyAoYWRtaW5faWQsIGFjdGlvbl90eXBlLCB0YXJnZXRfdXNlcl9pZCkgVkFMVUVTICg/LCA/LCA/KVwiLCBbXHJcbiAgICAgIGFkbWluSWQsXHJcbiAgICAgIGFjdGlvblR5cGUsXHJcbiAgICAgIHRhcmdldFVzZXJJZCxcclxuICAgIF0pXHJcblxyXG4gICAgY29uc3Qgc3RhdHVzVGV4dCA9IGxvY2tTdGF0dXMgPyBcIteg16LXldecXCIgOiBcItec15Ag16DXoteV15xcIlxyXG5cclxuICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7XHJcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXHJcbiAgICAgIG1lc3NhZ2U6IGDXodeY15jXldehINeg16LXmdec15Qg16nXnCAke3RhcmdldC5uYW1lfSDXqdeV16DXlCDXnDogJHtzdGF0dXNUZXh0fWAsXHJcbiAgICAgIGxvY2tTdGF0dXMsXHJcbiAgICB9KVxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBjb25zb2xlLmVycm9yKFwiVG9nZ2xlIHVzZXIgbG9jayBlcnJvcjpcIiwgZXJyb3IpXHJcbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCLXqdeS15nXkNeUINeR16nXmdeg15XXmSDXodeY15jXldehINeg16LXmdec15RcIiB9LCB7IHN0YXR1czogNTAwIH0pXHJcbiAgfVxyXG59XHJcbiJdLCJuYW1lcyI6WyJOZXh0UmVzcG9uc2UiLCJzYWZlUXVlcnkiLCJQT1NUIiwicmVxdWVzdCIsImFkbWluSWQiLCJ0YXJnZXRVc2VySWQiLCJsb2NrU3RhdHVzIiwianNvbiIsImVycm9yIiwic3RhdHVzIiwiYWRtaW5EYXRhIiwibGVuZ3RoIiwiYWRtaW4iLCJ0YXJnZXREYXRhIiwidGFyZ2V0IiwiY2FuTWFuYWdlIiwicm9sZSIsImZpZWxkIiwiZGVwYXJ0bWVudCIsInRlYW0iLCJhY3Rpb25UeXBlIiwic3RhdHVzVGV4dCIsInN1Y2Nlc3MiLCJtZXNzYWdlIiwibmFtZSIsImNvbnNvbGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./app/api/admin/toggle-user-lock/route.ts\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./lib/database.ts":
|
||
/*!*************************!*\
|
||
!*** ./lib/database.ts ***!
|
||
\*************************/
|
||
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
||
|
||
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ closePool: () => (/* binding */ closePool),\n/* harmony export */ createPool: () => (/* binding */ createPool),\n/* harmony export */ executeQuery: () => (/* binding */ executeQuery),\n/* harmony export */ executeTransaction: () => (/* binding */ executeTransaction),\n/* harmony export */ getConnection: () => (/* binding */ getConnection),\n/* harmony export */ getPoolStats: () => (/* binding */ getPoolStats),\n/* harmony export */ healthCheck: () => (/* binding */ healthCheck),\n/* harmony export */ safeQuery: () => (/* binding */ safeQuery),\n/* harmony export */ testConnection: () => (/* binding */ testConnection)\n/* harmony export */ });\n/* harmony import */ var mysql2_promise__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mysql2/promise */ \"mysql2/promise\");\n/* harmony import */ var mysql2_promise__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(mysql2_promise__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _config_json__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../config.json */ \"(rsc)/./config.json\");\n\n\n// Connection pool configuration\nconst poolConfig = {\n host: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.host,\n user: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.user,\n password: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.password,\n database: _config_json__WEBPACK_IMPORTED_MODULE_1__.database.database,\n charset: \"utf8mb4\",\n connectionLimit: 5,\n acquireTimeout: 30000,\n timeout: 30000,\n reconnect: true,\n idleTimeout: 180000,\n maxIdle: 2,\n enableKeepAlive: true,\n keepAliveInitialDelay: 0,\n // Add these to prevent excessive connections\n queueLimit: 0,\n dateStrings: false,\n debug: false\n};\nlet pool = null;\n// Create connection pool\nfunction createPool() {\n if (!pool) {\n try {\n pool = mysql2_promise__WEBPACK_IMPORTED_MODULE_0___default().createPool(poolConfig);\n console.log(\"Database connection pool created successfully\");\n // Handle pool events\n pool.on(\"connection\", (connection)=>{\n console.log(`New database connection established as id ${connection.threadId}`);\n });\n pool.on(\"error\", (err)=>{\n console.error(\"Database pool error:\", err);\n // Don't recreate pool automatically - let it handle reconnections\n if (err.code === \"PROTOCOL_CONNECTION_LOST\") {\n console.log(\"Connection lost, pool will handle reconnection automatically\");\n }\n });\n pool.on(\"acquire\", (connection)=>{\n console.log(`Connection ${connection.threadId} acquired from pool`);\n });\n pool.on(\"release\", (connection)=>{\n console.log(`Connection ${connection.threadId} released back to pool`);\n });\n } catch (error) {\n console.error(\"Failed to create database pool:\", error);\n throw error;\n }\n }\n return pool;\n}\n// Get connection from pool\nasync function getConnection() {\n try {\n const connectionPool = createPool();\n const connection = await connectionPool.getConnection();\n // Don't set session timeouts - let pool handle this\n return connection;\n } catch (error) {\n console.error(\"Failed to get database connection:\", error);\n throw new Error(\"Database connection failed\");\n }\n}\n// Execute query with automatic connection management\nasync function executeQuery(query, params = []) {\n let connection = null;\n try {\n connection = await getConnection();\n const [results] = await connection.execute(query, params);\n return results;\n } catch (error) {\n console.error(\"Query execution failed:\", error);\n console.error(\"Query:\", query);\n console.error(\"Params:\", params);\n throw error;\n } finally{\n // Always release connection back to pool\n if (connection) {\n connection.release();\n }\n }\n}\n// Safe query execution with automatic parameter binding and connection management\nasync function safeQuery(query, params = []) {\n try {\n return await executeQuery(query, params);\n } catch (error) {\n console.error(\"Database query error:\", error);\n throw new Error(\"Database operation failed\");\n }\n}\n// Execute transaction with automatic connection management\nasync function executeTransaction(queries) {\n let connection = null;\n try {\n connection = await getConnection();\n // Start transaction\n await connection.beginTransaction();\n const results = [];\n // Execute all queries in transaction\n for (const { query, params = [] } of queries){\n const [result] = await connection.execute(query, params);\n results.push(result);\n }\n // Commit transaction\n await connection.commit();\n return results;\n } catch (error) {\n // Rollback transaction on error\n if (connection) {\n try {\n await connection.rollback();\n } catch (rollbackError) {\n console.error(\"Transaction rollback failed:\", rollbackError);\n }\n }\n console.error(\"Transaction failed:\", error);\n throw error;\n } finally{\n // Always release connection back to pool\n if (connection) {\n connection.release();\n }\n }\n}\n// Test database connection and pool health\nasync function testConnection() {\n let connection = null;\n try {\n connection = await getConnection();\n await connection.ping();\n console.log(\"Database connection test successful\");\n return true;\n } catch (error) {\n console.error(\"Database connection test failed:\", error);\n return false;\n } finally{\n if (connection) {\n connection.release();\n }\n }\n}\n// Get pool statistics\nfunction getPoolStats() {\n if (!pool) {\n return null;\n }\n return {\n totalConnections: pool.pool._allConnections.length,\n freeConnections: pool.pool._freeConnections.length,\n acquiringConnections: pool.pool._acquiringConnections.length,\n connectionLimit: poolConfig.connectionLimit\n };\n}\n// Close all connections in pool (for graceful shutdown)\nasync function closePool() {\n if (pool) {\n try {\n await pool.end();\n pool = null;\n console.log(\"Database pool closed successfully\");\n } catch (error) {\n console.error(\"Error closing database pool:\", error);\n }\n }\n}\n// Health check for monitoring\nasync function healthCheck() {\n let connection = null;\n try {\n const startTime = Date.now();\n connection = await getConnection();\n // Test basic query\n const [result] = await connection.execute(\"SELECT 1 as health_check\");\n const responseTime = Date.now() - startTime;\n const stats = getPoolStats();\n return {\n status: \"healthy\",\n responseTime,\n poolStats: stats,\n timestamp: new Date().toISOString()\n };\n } catch (error) {\n return {\n status: \"unhealthy\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n timestamp: new Date().toISOString()\n };\n } finally{\n if (connection) {\n connection.release();\n }\n }\n}\n// Initialize pool on module load\n// createPool()\n// Graceful shutdown handler\nprocess.on(\"SIGINT\", async ()=>{\n console.log(\"Received SIGINT, closing database pool...\");\n await closePool();\n process.exit(0);\n});\nprocess.on(\"SIGTERM\", async ()=>{\n console.log(\"Received SIGTERM, closing database pool...\");\n await closePool();\n process.exit(0);\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9saWIvZGF0YWJhc2UudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQWtDO0FBQ0M7QUFFbkMsZ0NBQWdDO0FBQ2hDLE1BQU1FLGFBQWE7SUFDakJDLE1BQU1GLHVEQUFvQjtJQUMxQkksTUFBTUosdURBQW9CO0lBQzFCSyxVQUFVTCwyREFBd0I7SUFDbENHLFVBQVVILDJEQUF3QjtJQUNsQ00sU0FBUztJQUNUQyxpQkFBaUI7SUFDakJDLGdCQUFnQjtJQUNoQkMsU0FBUztJQUNUQyxXQUFXO0lBQ1hDLGFBQWE7SUFDYkMsU0FBUztJQUNUQyxpQkFBaUI7SUFDakJDLHVCQUF1QjtJQUN2Qiw2Q0FBNkM7SUFDN0NDLFlBQVk7SUFDWkMsYUFBYTtJQUNiQyxPQUFPO0FBQ1Q7QUFFQSxJQUFJQyxPQUEwQjtBQUU5Qix5QkFBeUI7QUFDbEIsU0FBU0M7SUFDZCxJQUFJLENBQUNELE1BQU07UUFDVCxJQUFJO1lBQ0ZBLE9BQU9uQixnRUFBZ0IsQ0FBQ0U7WUFDeEJtQixRQUFRQyxHQUFHLENBQUM7WUFFWixxQkFBcUI7WUFDckJILEtBQUtJLEVBQUUsQ0FBQyxjQUFjLENBQUNDO2dCQUNyQkgsUUFBUUMsR0FBRyxDQUFDLENBQUMsMENBQTBDLEVBQUVFLFdBQVdDLFFBQVEsQ0FBQyxDQUFDO1lBQ2hGO1lBRUFOLEtBQUtJLEVBQUUsQ0FBQyxTQUFTLENBQUNHO2dCQUNoQkwsUUFBUU0sS0FBSyxDQUFDLHdCQUF3QkQ7Z0JBQ3RDLGtFQUFrRTtnQkFDbEUsSUFBSUEsSUFBSUUsSUFBSSxLQUFLLDRCQUE0QjtvQkFDM0NQLFFBQVFDLEdBQUcsQ0FBQztnQkFDZDtZQUNGO1lBRUFILEtBQUtJLEVBQUUsQ0FBQyxXQUFXLENBQUNDO2dCQUNsQkgsUUFBUUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFRSxXQUFXQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7WUFDcEU7WUFFQU4sS0FBS0ksRUFBRSxDQUFDLFdBQVcsQ0FBQ0M7Z0JBQ2xCSCxRQUFRQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUVFLFdBQVdDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQztZQUN2RTtRQUNGLEVBQUUsT0FBT0UsT0FBTztZQUNkTixRQUFRTSxLQUFLLENBQUMsbUNBQW1DQTtZQUNqRCxNQUFNQTtRQUNSO0lBQ0Y7SUFDQSxPQUFPUjtBQUNUO0FBRUEsMkJBQTJCO0FBQ3BCLGVBQWVVO0lBQ3BCLElBQUk7UUFDRixNQUFNQyxpQkFBaUJWO1FBQ3ZCLE1BQU1JLGFBQWEsTUFBTU0sZUFBZUQsYUFBYTtRQUVyRCxvREFBb0Q7UUFDcEQsT0FBT0w7SUFDVCxFQUFFLE9BQU9HLE9BQU87UUFDZE4sUUFBUU0sS0FBSyxDQUFDLHNDQUFzQ0E7UUFDcEQsTUFBTSxJQUFJSSxNQUFNO0lBQ2xCO0FBQ0Y7QUFFQSxxREFBcUQ7QUFDOUMsZUFBZUMsYUFBYUMsS0FBYSxFQUFFQyxTQUFnQixFQUFFO0lBQ2xFLElBQUlWLGFBQTBDO0lBRTlDLElBQUk7UUFDRkEsYUFBYSxNQUFNSztRQUNuQixNQUFNLENBQUNNLFFBQVEsR0FBRyxNQUFNWCxXQUFXWSxPQUFPLENBQUNILE9BQU9DO1FBQ2xELE9BQU9DO0lBQ1QsRUFBRSxPQUFPUixPQUFPO1FBQ2ROLFFBQVFNLEtBQUssQ0FBQywyQkFBMkJBO1FBQ3pDTixRQUFRTSxLQUFLLENBQUMsVUFBVU07UUFDeEJaLFFBQVFNLEtBQUssQ0FBQyxXQUFXTztRQUN6QixNQUFNUDtJQUNSLFNBQVU7UUFDUix5Q0FBeUM7UUFDekMsSUFBSUgsWUFBWTtZQUNkQSxXQUFXYSxPQUFPO1FBQ3BCO0lBQ0Y7QUFDRjtBQUVBLGtGQUFrRjtBQUMzRSxlQUFlQyxVQUFVTCxLQUFhLEVBQUVDLFNBQWdCLEVBQUU7SUFDL0QsSUFBSTtRQUNGLE9BQU8sTUFBTUYsYUFBYUMsT0FBT0M7SUFDbkMsRUFBRSxPQUFPUCxPQUFPO1FBQ2ROLFFBQVFNLEtBQUssQ0FBQyx5QkFBeUJBO1FBQ3ZDLE1BQU0sSUFBSUksTUFBTTtJQUNsQjtBQUNGO0FBRUEsMkRBQTJEO0FBQ3BELGVBQWVRLG1CQUFtQkMsT0FBaUQ7SUFDeEYsSUFBSWhCLGFBQTBDO0lBRTlDLElBQUk7UUFDRkEsYUFBYSxNQUFNSztRQUVuQixvQkFBb0I7UUFDcEIsTUFBTUwsV0FBV2lCLGdCQUFnQjtRQUVqQyxNQUFNTixVQUFVLEVBQUU7UUFFbEIscUNBQXFDO1FBQ3JDLEtBQUssTUFBTSxFQUFFRixLQUFLLEVBQUVDLFNBQVMsRUFBRSxFQUFFLElBQUlNLFFBQVM7WUFDNUMsTUFBTSxDQUFDRSxPQUFPLEdBQUcsTUFBTWxCLFdBQVdZLE9BQU8sQ0FBQ0gsT0FBT0M7WUFDakRDLFFBQVFRLElBQUksQ0FBQ0Q7UUFDZjtRQUVBLHFCQUFxQjtRQUNyQixNQUFNbEIsV0FBV29CLE1BQU07UUFFdkIsT0FBT1Q7SUFDVCxFQUFFLE9BQU9SLE9BQU87UUFDZCxnQ0FBZ0M7UUFDaEMsSUFBSUgsWUFBWTtZQUNkLElBQUk7Z0JBQ0YsTUFBTUEsV0FBV3FCLFFBQVE7WUFDM0IsRUFBRSxPQUFPQyxlQUFlO2dCQUN0QnpCLFFBQVFNLEtBQUssQ0FBQyxnQ0FBZ0NtQjtZQUNoRDtRQUNGO1FBRUF6QixRQUFRTSxLQUFLLENBQUMsdUJBQXVCQTtRQUNyQyxNQUFNQTtJQUNSLFNBQVU7UUFDUix5Q0FBeUM7UUFDekMsSUFBSUgsWUFBWTtZQUNkQSxXQUFXYSxPQUFPO1FBQ3BCO0lBQ0Y7QUFDRjtBQUVBLDJDQUEyQztBQUNwQyxlQUFlVTtJQUNwQixJQUFJdkIsYUFBMEM7SUFFOUMsSUFBSTtRQUNGQSxhQUFhLE1BQU1LO1FBQ25CLE1BQU1MLFdBQVd3QixJQUFJO1FBQ3JCM0IsUUFBUUMsR0FBRyxDQUFDO1FBQ1osT0FBTztJQUNULEVBQUUsT0FBT0ssT0FBTztRQUNkTixRQUFRTSxLQUFLLENBQUMsb0NBQW9DQTtRQUNsRCxPQUFPO0lBQ1QsU0FBVTtRQUNSLElBQUlILFlBQVk7WUFDZEEsV0FBV2EsT0FBTztRQUNwQjtJQUNGO0FBQ0Y7QUFFQSxzQkFBc0I7QUFDZixTQUFTWTtJQUNkLElBQUksQ0FBQzlCLE1BQU07UUFDVCxPQUFPO0lBQ1Q7SUFFQSxPQUFPO1FBQ0wrQixrQkFBa0IvQixLQUFLQSxJQUFJLENBQUNnQyxlQUFlLENBQUNDLE1BQU07UUFDbERDLGlCQUFpQmxDLEtBQUtBLElBQUksQ0FBQ21DLGdCQUFnQixDQUFDRixNQUFNO1FBQ2xERyxzQkFBc0JwQyxLQUFLQSxJQUFJLENBQUNxQyxxQkFBcUIsQ0FBQ0osTUFBTTtRQUM1RDVDLGlCQUFpQk4sV0FBV00sZUFBZTtJQUM3QztBQUNGO0FBRUEsd0RBQXdEO0FBQ2pELGVBQWVpRDtJQUNwQixJQUFJdEMsTUFBTTtRQUNSLElBQUk7WUFDRixNQUFNQSxLQUFLdUMsR0FBRztZQUNkdkMsT0FBTztZQUNQRSxRQUFRQyxHQUFHLENBQUM7UUFDZCxFQUFFLE9BQU9LLE9BQU87WUFDZE4sUUFBUU0sS0FBSyxDQUFDLGdDQUFnQ0E7UUFDaEQ7SUFDRjtBQUNGO0FBRUEsOEJBQThCO0FBQ3ZCLGVBQWVnQztJQUNwQixJQUFJbkMsYUFBMEM7SUFFOUMsSUFBSTtRQUNGLE1BQU1vQyxZQUFZQyxLQUFLQyxHQUFHO1FBQzFCdEMsYUFBYSxNQUFNSztRQUVuQixtQkFBbUI7UUFDbkIsTUFBTSxDQUFDYSxPQUFPLEdBQUcsTUFBTWxCLFdBQVdZLE9BQU8sQ0FBQztRQUMxQyxNQUFNMkIsZUFBZUYsS0FBS0MsR0FBRyxLQUFLRjtRQUVsQyxNQUFNSSxRQUFRZjtRQUVkLE9BQU87WUFDTGdCLFFBQVE7WUFDUkY7WUFDQUcsV0FBV0Y7WUFDWEcsV0FBVyxJQUFJTixPQUFPTyxXQUFXO1FBQ25DO0lBQ0YsRUFBRSxPQUFPekMsT0FBTztRQUNkLE9BQU87WUFDTHNDLFFBQVE7WUFDUnRDLE9BQU9BLGlCQUFpQkksUUFBUUosTUFBTTBDLE9BQU8sR0FBRztZQUNoREYsV0FBVyxJQUFJTixPQUFPTyxXQUFXO1FBQ25DO0lBQ0YsU0FBVTtRQUNSLElBQUk1QyxZQUFZO1lBQ2RBLFdBQVdhLE9BQU87UUFDcEI7SUFDRjtBQUNGO0FBRUEsaUNBQWlDO0FBQ2pDLGVBQWU7QUFFZiw0QkFBNEI7QUFDNUJpQyxRQUFRL0MsRUFBRSxDQUFDLFVBQVU7SUFDbkJGLFFBQVFDLEdBQUcsQ0FBQztJQUNaLE1BQU1tQztJQUNOYSxRQUFRQyxJQUFJLENBQUM7QUFDZjtBQUVBRCxRQUFRL0MsRUFBRSxDQUFDLFdBQVc7SUFDcEJGLFFBQVFDLEdBQUcsQ0FBQztJQUNaLE1BQU1tQztJQUNOYSxRQUFRQyxJQUFJLENBQUM7QUFDZiIsInNvdXJjZXMiOlsid2VicGFjazovL21hbWFkLWFwcC8uL2xpYi9kYXRhYmFzZS50cz80ZDQ5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBteXNxbCBmcm9tIFwibXlzcWwyL3Byb21pc2VcIlxyXG5pbXBvcnQgY29uZmlnIGZyb20gXCIuLi9jb25maWcuanNvblwiXHJcblxyXG4vLyBDb25uZWN0aW9uIHBvb2wgY29uZmlndXJhdGlvblxyXG5jb25zdCBwb29sQ29uZmlnID0ge1xyXG4gIGhvc3Q6IGNvbmZpZy5kYXRhYmFzZS5ob3N0LFxyXG4gIHVzZXI6IGNvbmZpZy5kYXRhYmFzZS51c2VyLFxyXG4gIHBhc3N3b3JkOiBjb25maWcuZGF0YWJhc2UucGFzc3dvcmQsXHJcbiAgZGF0YWJhc2U6IGNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSxcclxuICBjaGFyc2V0OiBcInV0ZjhtYjRcIixcclxuICBjb25uZWN0aW9uTGltaXQ6IDUsIC8vIFJlZHVjZWQgZnJvbSAxMFxyXG4gIGFjcXVpcmVUaW1lb3V0OiAzMDAwMCwgLy8gUmVkdWNlZCBmcm9tIDYwIHNlY29uZHNcclxuICB0aW1lb3V0OiAzMDAwMCwgLy8gUmVkdWNlZCBmcm9tIDYwIHNlY29uZHNcclxuICByZWNvbm5lY3Q6IHRydWUsXHJcbiAgaWRsZVRpbWVvdXQ6IDE4MDAwMCwgLy8gUmVkdWNlZCB0byAzIG1pbnV0ZXNcclxuICBtYXhJZGxlOiAyLCAvLyBSZWR1Y2VkIGZyb20gNVxyXG4gIGVuYWJsZUtlZXBBbGl2ZTogdHJ1ZSxcclxuICBrZWVwQWxpdmVJbml0aWFsRGVsYXk6IDAsXHJcbiAgLy8gQWRkIHRoZXNlIHRvIHByZXZlbnQgZXhjZXNzaXZlIGNvbm5lY3Rpb25zXHJcbiAgcXVldWVMaW1pdDogMCxcclxuICBkYXRlU3RyaW5nczogZmFsc2UsXHJcbiAgZGVidWc6IGZhbHNlLFxyXG59XHJcblxyXG5sZXQgcG9vbDogbXlzcWwuUG9vbCB8IG51bGwgPSBudWxsXHJcblxyXG4vLyBDcmVhdGUgY29ubmVjdGlvbiBwb29sXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQb29sKCkge1xyXG4gIGlmICghcG9vbCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgcG9vbCA9IG15c3FsLmNyZWF0ZVBvb2wocG9vbENvbmZpZylcclxuICAgICAgY29uc29sZS5sb2coXCJEYXRhYmFzZSBjb25uZWN0aW9uIHBvb2wgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIilcclxuXHJcbiAgICAgIC8vIEhhbmRsZSBwb29sIGV2ZW50c1xyXG4gICAgICBwb29sLm9uKFwiY29ubmVjdGlvblwiLCAoY29ubmVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBOZXcgZGF0YWJhc2UgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCBhcyBpZCAke2Nvbm5lY3Rpb24udGhyZWFkSWR9YClcclxuICAgICAgfSlcclxuXHJcbiAgICAgIHBvb2wub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkRhdGFiYXNlIHBvb2wgZXJyb3I6XCIsIGVycilcclxuICAgICAgICAvLyBEb24ndCByZWNyZWF0ZSBwb29sIGF1dG9tYXRpY2FsbHkgLSBsZXQgaXQgaGFuZGxlIHJlY29ubmVjdGlvbnNcclxuICAgICAgICBpZiAoZXJyLmNvZGUgPT09IFwiUFJPVE9DT0xfQ09OTkVDVElPTl9MT1NUXCIpIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQ29ubmVjdGlvbiBsb3N0LCBwb29sIHdpbGwgaGFuZGxlIHJlY29ubmVjdGlvbiBhdXRvbWF0aWNhbGx5XCIpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgcG9vbC5vbihcImFjcXVpcmVcIiwgKGNvbm5lY3Rpb24pID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgQ29ubmVjdGlvbiAke2Nvbm5lY3Rpb24udGhyZWFkSWR9IGFjcXVpcmVkIGZyb20gcG9vbGApXHJcbiAgICAgIH0pXHJcblxyXG4gICAgICBwb29sLm9uKFwicmVsZWFzZVwiLCAoY29ubmVjdGlvbikgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBDb25uZWN0aW9uICR7Y29ubmVjdGlvbi50aHJlYWRJZH0gcmVsZWFzZWQgYmFjayB0byBwb29sYClcclxuICAgICAgfSlcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY3JlYXRlIGRhdGFiYXNlIHBvb2w6XCIsIGVycm9yKVxyXG4gICAgICB0aHJvdyBlcnJvclxyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gcG9vbFxyXG59XHJcblxyXG4vLyBHZXQgY29ubmVjdGlvbiBmcm9tIHBvb2xcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldENvbm5lY3Rpb24oKTogUHJvbWlzZTxteXNxbC5Qb29sQ29ubmVjdGlvbj4ge1xyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBjb25uZWN0aW9uUG9vbCA9IGNyZWF0ZVBvb2woKVxyXG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGF3YWl0IGNvbm5lY3Rpb25Qb29sLmdldENvbm5lY3Rpb24oKVxyXG5cclxuICAgIC8vIERvbid0IHNldCBzZXNzaW9uIHRpbWVvdXRzIC0gbGV0IHBvb2wgaGFuZGxlIHRoaXNcclxuICAgIHJldHVybiBjb25uZWN0aW9uXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGRhdGFiYXNlIGNvbm5lY3Rpb246XCIsIGVycm9yKVxyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGF0YWJhc2UgY29ubmVjdGlvbiBmYWlsZWRcIilcclxuICB9XHJcbn1cclxuXHJcbi8vIEV4ZWN1dGUgcXVlcnkgd2l0aCBhdXRvbWF0aWMgY29ubmVjdGlvbiBtYW5hZ2VtZW50XHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlUXVlcnkocXVlcnk6IHN0cmluZywgcGFyYW1zOiBhbnlbXSA9IFtdKSB7XHJcbiAgbGV0IGNvbm5lY3Rpb246IG15c3FsLlBvb2xDb25uZWN0aW9uIHwgbnVsbCA9IG51bGxcclxuXHJcbiAgdHJ5IHtcclxuICAgIGNvbm5lY3Rpb24gPSBhd2FpdCBnZXRDb25uZWN0aW9uKClcclxuICAgIGNvbnN0IFtyZXN1bHRzXSA9IGF3YWl0IGNvbm5lY3Rpb24uZXhlY3V0ZShxdWVyeSwgcGFyYW1zKVxyXG4gICAgcmV0dXJuIHJlc3VsdHNcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5lcnJvcihcIlF1ZXJ5IGV4ZWN1dGlvbiBmYWlsZWQ6XCIsIGVycm9yKVxyXG4gICAgY29uc29sZS5lcnJvcihcIlF1ZXJ5OlwiLCBxdWVyeSlcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJQYXJhbXM6XCIsIHBhcmFtcylcclxuICAgIHRocm93IGVycm9yXHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIC8vIEFsd2F5cyByZWxlYXNlIGNvbm5lY3Rpb24gYmFjayB0byBwb29sXHJcbiAgICBpZiAoY29ubmVjdGlvbikge1xyXG4gICAgICBjb25uZWN0aW9uLnJlbGVhc2UoKVxyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy8gU2FmZSBxdWVyeSBleGVjdXRpb24gd2l0aCBhdXRvbWF0aWMgcGFyYW1ldGVyIGJpbmRpbmcgYW5kIGNvbm5lY3Rpb24gbWFuYWdlbWVudFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2FmZVF1ZXJ5KHF1ZXJ5OiBzdHJpbmcsIHBhcmFtczogYW55W10gPSBbXSkge1xyXG4gIHRyeSB7XHJcbiAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZVF1ZXJ5KHF1ZXJ5LCBwYXJhbXMpXHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUuZXJyb3IoXCJEYXRhYmFzZSBxdWVyeSBlcnJvcjpcIiwgZXJyb3IpXHJcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYmFzZSBvcGVyYXRpb24gZmFpbGVkXCIpXHJcbiAgfVxyXG59XHJcblxyXG4vLyBFeGVjdXRlIHRyYW5zYWN0aW9uIHdpdGggYXV0b21hdGljIGNvbm5lY3Rpb24gbWFuYWdlbWVudFxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVRyYW5zYWN0aW9uKHF1ZXJpZXM6IEFycmF5PHsgcXVlcnk6IHN0cmluZzsgcGFyYW1zPzogYW55W10gfT4pIHtcclxuICBsZXQgY29ubmVjdGlvbjogbXlzcWwuUG9vbENvbm5lY3Rpb24gfCBudWxsID0gbnVsbFxyXG5cclxuICB0cnkge1xyXG4gICAgY29ubmVjdGlvbiA9IGF3YWl0IGdldENvbm5lY3Rpb24oKVxyXG5cclxuICAgIC8vIFN0YXJ0IHRyYW5zYWN0aW9uXHJcbiAgICBhd2FpdCBjb25uZWN0aW9uLmJlZ2luVHJhbnNhY3Rpb24oKVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXVxyXG5cclxuICAgIC8vIEV4ZWN1dGUgYWxsIHF1ZXJpZXMgaW4gdHJhbnNhY3Rpb25cclxuICAgIGZvciAoY29uc3QgeyBxdWVyeSwgcGFyYW1zID0gW10gfSBvZiBxdWVyaWVzKSB7XHJcbiAgICAgIGNvbnN0IFtyZXN1bHRdID0gYXdhaXQgY29ubmVjdGlvbi5leGVjdXRlKHF1ZXJ5LCBwYXJhbXMpXHJcbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpXHJcbiAgICB9XHJcblxyXG4gICAgLy8gQ29tbWl0IHRyYW5zYWN0aW9uXHJcbiAgICBhd2FpdCBjb25uZWN0aW9uLmNvbW1pdCgpXHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHNcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgLy8gUm9sbGJhY2sgdHJhbnNhY3Rpb24gb24gZXJyb3JcclxuICAgIGlmIChjb25uZWN0aW9uKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgYXdhaXQgY29ubmVjdGlvbi5yb2xsYmFjaygpXHJcbiAgICAgIH0gY2F0Y2ggKHJvbGxiYWNrRXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKFwiVHJhbnNhY3Rpb24gcm9sbGJhY2sgZmFpbGVkOlwiLCByb2xsYmFja0Vycm9yKVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5lcnJvcihcIlRyYW5zYWN0aW9uIGZhaWxlZDpcIiwgZXJyb3IpXHJcbiAgICB0aHJvdyBlcnJvclxyXG4gIH0gZmluYWxseSB7XHJcbiAgICAvLyBBbHdheXMgcmVsZWFzZSBjb25uZWN0aW9uIGJhY2sgdG8gcG9vbFxyXG4gICAgaWYgKGNvbm5lY3Rpb24pIHtcclxuICAgICAgY29ubmVjdGlvbi5yZWxlYXNlKClcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcbi8vIFRlc3QgZGF0YWJhc2UgY29ubmVjdGlvbiBhbmQgcG9vbCBoZWFsdGhcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRlc3RDb25uZWN0aW9uKCkge1xyXG4gIGxldCBjb25uZWN0aW9uOiBteXNxbC5Qb29sQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsXHJcblxyXG4gIHRyeSB7XHJcbiAgICBjb25uZWN0aW9uID0gYXdhaXQgZ2V0Q29ubmVjdGlvbigpXHJcbiAgICBhd2FpdCBjb25uZWN0aW9uLnBpbmcoKVxyXG4gICAgY29uc29sZS5sb2coXCJEYXRhYmFzZSBjb25uZWN0aW9uIHRlc3Qgc3VjY2Vzc2Z1bFwiKVxyXG4gICAgcmV0dXJuIHRydWVcclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgY29uc29sZS5lcnJvcihcIkRhdGFiYXNlIGNvbm5lY3Rpb24gdGVzdCBmYWlsZWQ6XCIsIGVycm9yKVxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIGlmIChjb25uZWN0aW9uKSB7XHJcbiAgICAgIGNvbm5lY3Rpb24ucmVsZWFzZSgpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBHZXQgcG9vbCBzdGF0aXN0aWNzXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRQb29sU3RhdHMoKSB7XHJcbiAgaWYgKCFwb29sKSB7XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHRvdGFsQ29ubmVjdGlvbnM6IHBvb2wucG9vbC5fYWxsQ29ubmVjdGlvbnMubGVuZ3RoLFxyXG4gICAgZnJlZUNvbm5lY3Rpb25zOiBwb29sLnBvb2wuX2ZyZWVDb25uZWN0aW9ucy5sZW5ndGgsXHJcbiAgICBhY3F1aXJpbmdDb25uZWN0aW9uczogcG9vbC5wb29sLl9hY3F1aXJpbmdDb25uZWN0aW9ucy5sZW5ndGgsXHJcbiAgICBjb25uZWN0aW9uTGltaXQ6IHBvb2xDb25maWcuY29ubmVjdGlvbkxpbWl0LFxyXG4gIH1cclxufVxyXG5cclxuLy8gQ2xvc2UgYWxsIGNvbm5lY3Rpb25zIGluIHBvb2wgKGZvciBncmFjZWZ1bCBzaHV0ZG93bilcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlUG9vbCgpIHtcclxuICBpZiAocG9vbCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgYXdhaXQgcG9vbC5lbmQoKVxyXG4gICAgICBwb29sID0gbnVsbFxyXG4gICAgICBjb25zb2xlLmxvZyhcIkRhdGFiYXNlIHBvb2wgY2xvc2VkIHN1Y2Nlc3NmdWxseVwiKVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGNsb3NpbmcgZGF0YWJhc2UgcG9vbDpcIiwgZXJyb3IpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBIZWFsdGggY2hlY2sgZm9yIG1vbml0b3JpbmdcclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGhlYWx0aENoZWNrKCkge1xyXG4gIGxldCBjb25uZWN0aW9uOiBteXNxbC5Qb29sQ29ubmVjdGlvbiB8IG51bGwgPSBudWxsXHJcblxyXG4gIHRyeSB7XHJcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpXHJcbiAgICBjb25uZWN0aW9uID0gYXdhaXQgZ2V0Q29ubmVjdGlvbigpXHJcblxyXG4gICAgLy8gVGVzdCBiYXNpYyBxdWVyeVxyXG4gICAgY29uc3QgW3Jlc3VsdF0gPSBhd2FpdCBjb25uZWN0aW9uLmV4ZWN1dGUoXCJTRUxFQ1QgMSBhcyBoZWFsdGhfY2hlY2tcIilcclxuICAgIGNvbnN0IHJlc3BvbnNlVGltZSA9IERhdGUubm93KCkgLSBzdGFydFRpbWVcclxuXHJcbiAgICBjb25zdCBzdGF0cyA9IGdldFBvb2xTdGF0cygpXHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBcImhlYWx0aHlcIixcclxuICAgICAgcmVzcG9uc2VUaW1lLFxyXG4gICAgICBwb29sU3RhdHM6IHN0YXRzLFxyXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcclxuICAgIH1cclxuICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc3RhdHVzOiBcInVuaGVhbHRoeVwiLFxyXG4gICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBcIlVua25vd24gZXJyb3JcIixcclxuICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXHJcbiAgICB9XHJcbiAgfSBmaW5hbGx5IHtcclxuICAgIGlmIChjb25uZWN0aW9uKSB7XHJcbiAgICAgIGNvbm5lY3Rpb24ucmVsZWFzZSgpXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcblxyXG4vLyBJbml0aWFsaXplIHBvb2wgb24gbW9kdWxlIGxvYWRcclxuLy8gY3JlYXRlUG9vbCgpXHJcblxyXG4vLyBHcmFjZWZ1bCBzaHV0ZG93biBoYW5kbGVyXHJcbnByb2Nlc3Mub24oXCJTSUdJTlRcIiwgYXN5bmMgKCkgPT4ge1xyXG4gIGNvbnNvbGUubG9nKFwiUmVjZWl2ZWQgU0lHSU5ULCBjbG9zaW5nIGRhdGFiYXNlIHBvb2wuLi5cIilcclxuICBhd2FpdCBjbG9zZVBvb2woKVxyXG4gIHByb2Nlc3MuZXhpdCgwKVxyXG59KVxyXG5cclxucHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgYXN5bmMgKCkgPT4ge1xyXG4gIGNvbnNvbGUubG9nKFwiUmVjZWl2ZWQgU0lHVEVSTSwgY2xvc2luZyBkYXRhYmFzZSBwb29sLi4uXCIpXHJcbiAgYXdhaXQgY2xvc2VQb29sKClcclxuICBwcm9jZXNzLmV4aXQoMClcclxufSlcclxuIl0sIm5hbWVzIjpbIm15c3FsIiwiY29uZmlnIiwicG9vbENvbmZpZyIsImhvc3QiLCJkYXRhYmFzZSIsInVzZXIiLCJwYXNzd29yZCIsImNoYXJzZXQiLCJjb25uZWN0aW9uTGltaXQiLCJhY3F1aXJlVGltZW91dCIsInRpbWVvdXQiLCJyZWNvbm5lY3QiLCJpZGxlVGltZW91dCIsIm1heElkbGUiLCJlbmFibGVLZWVwQWxpdmUiLCJrZWVwQWxpdmVJbml0aWFsRGVsYXkiLCJxdWV1ZUxpbWl0IiwiZGF0ZVN0cmluZ3MiLCJkZWJ1ZyIsInBvb2wiLCJjcmVhdGVQb29sIiwiY29uc29sZSIsImxvZyIsIm9uIiwiY29ubmVjdGlvbiIsInRocmVhZElkIiwiZXJyIiwiZXJyb3IiLCJjb2RlIiwiZ2V0Q29ubmVjdGlvbiIsImNvbm5lY3Rpb25Qb29sIiwiRXJyb3IiLCJleGVjdXRlUXVlcnkiLCJxdWVyeSIsInBhcmFtcyIsInJlc3VsdHMiLCJleGVjdXRlIiwicmVsZWFzZSIsInNhZmVRdWVyeSIsImV4ZWN1dGVUcmFuc2FjdGlvbiIsInF1ZXJpZXMiLCJiZWdpblRyYW5zYWN0aW9uIiwicmVzdWx0IiwicHVzaCIsImNvbW1pdCIsInJvbGxiYWNrIiwicm9sbGJhY2tFcnJvciIsInRlc3RDb25uZWN0aW9uIiwicGluZyIsImdldFBvb2xTdGF0cyIsInRvdGFsQ29ubmVjdGlvbnMiLCJfYWxsQ29ubmVjdGlvbnMiLCJsZW5ndGgiLCJmcmVlQ29ubmVjdGlvbnMiLCJfZnJlZUNvbm5lY3Rpb25zIiwiYWNxdWlyaW5nQ29ubmVjdGlvbnMiLCJfYWNxdWlyaW5nQ29ubmVjdGlvbnMiLCJjbG9zZVBvb2wiLCJlbmQiLCJoZWFsdGhDaGVjayIsInN0YXJ0VGltZSIsIkRhdGUiLCJub3ciLCJyZXNwb25zZVRpbWUiLCJzdGF0cyIsInN0YXR1cyIsInBvb2xTdGF0cyIsInRpbWVzdGFtcCIsInRvSVNPU3RyaW5nIiwibWVzc2FnZSIsInByb2Nlc3MiLCJleGl0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(rsc)/./lib/database.ts\n");
|
||
|
||
/***/ }),
|
||
|
||
/***/ "(rsc)/./config.json":
|
||
/*!*********************!*\
|
||
!*** ./config.json ***!
|
||
\*********************/
|
||
/***/ ((module) => {
|
||
|
||
module.exports = /*#__PURE__*/JSON.parse('{"database":{"host":"10.0.5.1","user":"mamad-app","password":"K[7w1@N!Uvdu@ls!","database":"mamad-app"},"app":{"resetCooldownMinutes":1}}');
|
||
|
||
/***/ })
|
||
|
||
};
|
||
;
|
||
|
||
// load runtime
|
||
var __webpack_require__ = require("../../../../webpack-runtime.js");
|
||
__webpack_require__.C(exports);
|
||
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
|
||
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&page=%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fadmin%2Ftoggle-user-lock%2Froute.ts&appDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app%5Capp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=C%3A%5CUsers%5Ctom%5CVS%20Code%5CMamadApp%5Cmamad-app&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!")));
|
||
module.exports = __webpack_exports__;
|
||
|
||
})(); |