Index: TruckSimulator-main/ds-db-ws/MIGRATION_GUIDE.md
===================================================================
--- TruckSimulator-main/ds-db-ws/MIGRATION_GUIDE.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/MIGRATION_GUIDE.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,178 @@
+# MySQL to PostgreSQL Migration Guide
+
+This guide will help you migrate the TruckSimulator application from MySQL to PostgreSQL.
+
+## Prerequisites
+
+1. **PostgreSQL Installation**
+   - Install PostgreSQL 12+ on your system
+   - Ensure PostgreSQL service is running
+   - Default port: 5432
+
+2. **Database Setup**
+   - Create a database named `trucksimulator`
+   - Create a user `postgres` with password `2405` (or update connection string)
+   - Grant necessary permissions
+
+## Migration Steps
+
+### 1. Install Dependencies
+
+```bash
+cd ds-db-ws
+npm install
+```
+
+This will install the PostgreSQL driver (`pg`) and remove the MySQL dependency.
+
+### 2. Database Migration
+
+Run the migration script to create PostgreSQL tables:
+
+```bash
+node migrate-to-postgres.js
+```
+
+This script will:
+- Convert MySQL syntax to PostgreSQL
+- Create all necessary tables
+- Handle data type conversions
+- Set up proper constraints
+
+### 3. Manual Database Setup (Alternative)
+
+If the migration script doesn't work, you can manually:
+
+1. Create the database:
+```sql
+CREATE DATABASE trucksimulator;
+```
+
+2. Import the converted SQL file (after manual conversion):
+```bash
+psql -U postgres -d trucksimulator -f converted_schema.sql
+```
+
+### 4. Update Connection String (if needed)
+
+If your PostgreSQL setup differs, update `models/db.js`:
+
+```javascript
+const pool = new Pool({
+  host: 'localhost',        // Your PostgreSQL host
+  user: 'postgres',         // Your PostgreSQL user
+  password: '2405',         // Your PostgreSQL password
+  database: 'trucksimulator', // Your database name
+  port: 5432,              // Your PostgreSQL port
+  max: 10,
+  idleTimeoutMillis: 30000,
+  connectionTimeoutMillis: 2000,
+});
+```
+
+### 5. Test the Application
+
+```bash
+npm start
+```
+
+Visit `http://localhost:3000` and test:
+- User registration/login
+- Product browsing
+- Procurement functionality
+- Admin dashboard
+
+## Key Changes Made
+
+### 1. Database Driver
+- **Before**: `mysql2` package
+- **After**: `pg` package
+
+### 2. Connection Configuration
+- **Before**: MySQL connection pool
+- **After**: PostgreSQL connection pool
+
+### 3. Query Syntax
+- **Before**: `?` placeholders (`SELECT * FROM users WHERE id = ?`)
+- **After**: `$1, $2, $3...` placeholders (`SELECT * FROM users WHERE id = $1`)
+
+### 4. Result Handling
+- **Before**: `const [rows] = await pool.query(...)`
+- **After**: `const result = await pool.query(...); const rows = result.rows`
+
+### 5. SQL Functions
+- **Before**: `TIMESTAMPDIFF(MINUTE, start, end)`
+- **After**: `EXTRACT(EPOCH FROM (end - start))/60`
+
+- **Before**: `JSON_OBJECT('key', value)`
+- **After**: `JSON_BUILD_OBJECT('key', value)`
+
+### 6. Data Types
+- **Before**: `AUTO_INCREMENT`
+- **After**: `SERIAL`
+
+- **Before**: `DATETIME`
+- **After**: `TIMESTAMP`
+
+## Troubleshooting
+
+### Common Issues
+
+1. **Connection Refused**
+   - Ensure PostgreSQL is running
+   - Check port 5432 is open
+   - Verify user credentials
+
+2. **Permission Denied**
+   - Grant proper permissions to the database user
+   - Check database ownership
+
+3. **Syntax Errors**
+   - Some MySQL-specific functions may need manual conversion
+   - Check PostgreSQL documentation for equivalent functions
+
+4. **Data Type Issues**
+   - Review column types after migration
+   - Some MySQL types may need adjustment
+
+### Verification Commands
+
+Test database connection:
+```bash
+psql -U postgres -d trucksimulator -c "SELECT NOW();"
+```
+
+Check tables:
+```bash
+psql -U postgres -d trucksimulator -c "\dt"
+```
+
+## Rollback Plan
+
+If you need to rollback to MySQL:
+
+1. Revert `package.json`:
+```json
+{
+  "dependencies": {
+    "mysql2": "^3.14.1"
+  }
+}
+```
+
+2. Revert `models/db.js` to MySQL configuration
+
+3. Revert all query syntax changes
+
+4. Run `npm install` to restore MySQL driver
+
+## Support
+
+If you encounter issues during migration:
+
+1. Check PostgreSQL logs
+2. Verify all dependencies are installed
+3. Test database connection manually
+4. Review error messages for specific syntax issues
+
+The migration script includes error handling and will show warnings for problematic statements that may need manual adjustment.
Index: TruckSimulator-main/ds-db-ws/controllers/adminController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/adminController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/adminController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -3,5 +3,5 @@
   exports.getDashboardStats = async (req, res) => {
     try {
-        const [employeeSales] = await pool.query(`
+        const employeeSalesResult = await pool.query(`
           SELECT e.EmployeeID, e.EmployeeName AS Name, e.EmployeeSurName AS Surname, COUNT(*) AS SalesCount, 
                  SUM(t.TotalPrice) AS TotalSales
@@ -11,7 +11,8 @@
           GROUP BY e.EmployeeID
         `);
+        const employeeSales = employeeSalesResult.rows;
         
         
-        const [maintenanceStats] = await pool.query(`
+        const maintenanceStatsResult = await pool.query(`
           SELECT e.EmployeeID, e.EmployeeName AS Name, e.EmployeeSurName AS Surname, COUNT(*) AS MaintenanceDone
           FROM maintenance m
@@ -20,6 +21,7 @@
           GROUP BY e.EmployeeID
         `);
+        const maintenanceStats = maintenanceStatsResult.rows;
   
-      const [customerTotals] = await pool.query(`
+      const customerTotalsResult = await pool.query(`
         SELECT c.CustomerID, c.CustomerName, c.CustomerSurName, COUNT(*) AS Purchases, 
                SUM(t.TotalPrice) AS TotalSpent
@@ -29,26 +31,32 @@
         GROUP BY c.CustomerID
       `);
+      const customerTotals = customerTotalsResult.rows;
   
-      const [averageMaintenanceTime] = await pool.query(`
-        SELECT AVG(TIMESTAMPDIFF(MINUTE, StartTime, EndTime)) AS AvgMinutes
+      const averageMaintenanceTimeResult = await pool.query(`
+        SELECT AVG(EXTRACT(EPOCH FROM (EndTime - StartTime))/60) AS AvgMinutes
         FROM maintenance
         WHERE Status = 'Completed' AND StartTime IS NOT NULL AND EndTime IS NOT NULL
       `);
+      const averageMaintenanceTime = averageMaintenanceTimeResult.rows;
   
-      const [totalProcurements] = await pool.query(`
+      const totalProcurementsResult = await pool.query(`
         SELECT COUNT(*) AS TotalProcurements FROM procurement_request
       `);
+      const totalProcurements = totalProcurementsResult.rows;
   
-      const [avgProcurementValue] = await pool.query(`
+      const avgProcurementValueResult = await pool.query(`
         SELECT AVG(TotalPrice) AS AvgProcurementValue FROM t_type
       `);
+      const avgProcurementValue = avgProcurementValueResult.rows;
   
-      const [totalRevenue] = await pool.query(`
+      const totalRevenueResult = await pool.query(`
         SELECT SUM(TotalPrice) AS TotalRevenue FROM t_type
       `);
+      const totalRevenue = totalRevenueResult.rows;
   
-      const [revenueSplit] = await pool.query(`
+      const revenueSplitResult = await pool.query(`
         SELECT Type, SUM(TotalPrice) AS Revenue FROM t_type GROUP BY Type
       `);
+      const revenueSplit = revenueSplitResult.rows;
   
       res.json({
Index: TruckSimulator-main/ds-db-ws/controllers/authController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/authController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/authController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -5,14 +5,14 @@
   const { name, surname, email, address, contact, password } = req.body;
 
-  const [rows] = await pool.query("SELECT * FROM customer WHERE Email = ?", [email]);
-  if (rows.length > 0) return res.send("Email already registered.");
+  const result = await pool.query("SELECT * FROM customer WHERE email = $1", [email]);
+  if (result.rows.length > 0) return res.send("Email already registered.");
 
   const hashedPassword = await bcrypt.hash(password, 10);
-  const [idRow] = await pool.query("SELECT MAX(CustomerID)+1 AS NewID FROM customer");
-  const newID = idRow[0].NewID || 1;
+  const idResult = await pool.query("SELECT MAX(customerid)+1 AS newid FROM customer");
+  const newID = idResult.rows[0].newid || 1;
 
   await pool.query(
-    `INSERT INTO customer (CustomerID, CustomerName, CustomerSurName, Email, Address, CustomerContact, Password) 
-     VALUES (?, ?, ?, ?, ?, ?, ?)`,
+    `INSERT INTO customer (customerid, customername, customersurname, email, address, customercontact, password) 
+     VALUES ($1, $2, $3, $4, $5, $6, $7)`,
     [newID, name, surname, email, address, contact, hashedPassword]
   );
@@ -24,25 +24,25 @@
   const { email, password } = req.body;
 
-  const [customers] = await pool.query("SELECT * FROM customer WHERE Email = ?", [email]);
-  const customer = customers[0];
+  const customerResult = await pool.query("SELECT * FROM customer WHERE email = $1", [email]);
+  const customer = customerResult.rows[0];
 
-  if (customer && await bcrypt.compare(password, customer.Password)) {
+  if (customer && await bcrypt.compare(password, customer.password)) {
     req.session.user = {
       type: "customer",
-      id: customer.CustomerID,
-      name: customer.CustomerName
+      id: customer.customerid,
+      name: customer.customername
     };
     return res.redirect("/index.html");
   }
 
-  const [employees] = await pool.query("SELECT * FROM employee WHERE Email = ?", [email]);
-  const employee = employees[0];
+  const employeeResult = await pool.query("SELECT * FROM employee WHERE email = $1", [email]);
+  const employee = employeeResult.rows[0];
 
-  if (employee && password === employee.Password) {
+  if (employee && password === employee.password) {
     req.session.user = {
       type: "employee",
-      id: employee.EmployeeID,
-      name: employee.EmployeeName,
-      department: employee.Department
+      id: employee.employeeid,
+      name: employee.employeename,
+      department: employee.department
     };
     return res.redirect("/index.html");
Index: TruckSimulator-main/ds-db-ws/controllers/employeeController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/employeeController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/employeeController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -33,5 +33,5 @@
     await pool.query(
       `INSERT INTO employee (EmployeeID, EmployeeName, EmployeeSurName, Position, Department, Email, Password)
-       VALUES (?, ?, ?, ?, ?, ?, ?)`,
+       VALUES ($1, $2, $3, $4, $5, $6, $7)`,
       [newID, name, surname, position, department, email, password]
     );
Index: TruckSimulator-main/ds-db-ws/controllers/feedbackController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/feedbackController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/feedbackController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -12,5 +12,5 @@
     
     const [existing] = await pool.query(
-      `SELECT * FROM customerfeedback WHERE CustomerID = ? AND TransactionID = ?`,
+      `SELECT * FROM customerfeedback WHERE CustomerID = $1 AND TransactionID = $2`,
       [CustomerID, TransactionID]
     );
@@ -27,5 +27,5 @@
     await pool.query(
       `INSERT INTO customerfeedback (FeedbackID, CustomerID, ProductID, Rating, Comment, FeedbackDate, TransactionID)
-       VALUES (?, ?, ?, ?, ?, CURDATE(), ?)`,
+       VALUES ($1, $2, $3, $4, $5, CURRENT_DATE, $6)`,
       [newID, CustomerID, ProductID, Rating, Comment, TransactionID]
     );
Index: TruckSimulator-main/ds-db-ws/controllers/maintenanceController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/maintenanceController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/maintenanceController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -37,9 +37,9 @@
     await pool.query(
       `INSERT INTO maintenance (MainID, EmployeeID, ProductID, MainDate, Description, Cost, Status)
-       VALUES (?, ?, ?, NOW(), ?, ?, 'Pending')`,
+       VALUES ($1, $2, $3, NOW(), $4, $5, 'Pending')`,
       [newId, employeeId, ProductID, Description, Cost]
     );
 
-    await pool.query("UPDATE product SET Status = 'maintenance' WHERE ProductID = ?", [ProductID]);
+    await pool.query("UPDATE product SET Status = 'maintenance' WHERE ProductID = $1", [ProductID]);
 
     res.json({ success: true });
@@ -61,14 +61,14 @@
     await pool.query(
       `UPDATE maintenance 
-       SET Description = ?, Cost = ?, Status = 'Completed', EndTime = NOW() 
-       WHERE MainID = ?`,
-      [description, cost, mainId]
+       SET Description = $2, Cost = $3, Status = 'Completed', EndTime = NOW() 
+       WHERE MainID = $1`,
+      [mainId, description, cost]
     );
 
-    const [rows] = await pool.query("SELECT ProductID FROM maintenance WHERE MainID = ?", [mainId]);
-    const productId = rows[0]?.ProductID;
+    const result = await pool.query("SELECT ProductID FROM maintenance WHERE MainID = $1", [mainId]);
+    const productId = result.rows[0]?.productid;
 
     if (productId) {
-      await pool.query("UPDATE product SET Status = 'available' WHERE ProductID = ?", [productId]);
+      await pool.query("UPDATE product SET Status = 'available' WHERE ProductID = $1", [productId]);
     }
 
Index: TruckSimulator-main/ds-db-ws/controllers/procurementController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/procurementController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/procurementController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -26,5 +26,5 @@
   const id = req.params.id;
   const db = require('../models/db');
-  db.query('DELETE FROM product WHERE ProductID = ?', [id], (err, result) => {
+  db.query('DELETE FROM product WHERE ProductID = $1', [id], (err, result) => {
     if (err) return res.status(500).send('Failed to delete product');
     res.send('Product deleted');
@@ -41,28 +41,28 @@
 
   try {
-    const [rows] = await pool.query(`
+    const result = await pool.query(`
       SELECT 
-        p.TransactionID,
-        p.ProductID,
-        pr.Model,
-        p.Quantity,
-        p.ProcurementDate,
-        p.Status,
-        p.GroupID,
-        t.Type,
-        t.MonthlyPay,
-        t.Duration,
-        t.TotalPrice,
-        f.Rating AS FeedbackRating,
-        f.Comment AS FeedbackComment
+        p.transactionid AS "TransactionID",
+        p.productid AS "ProductID",
+        pr.model AS "Model",
+        p.quantity AS "Quantity",
+        p.procurementdate AS "ProcurementDate",
+        p.status AS "Status",
+        p.groupid AS "GroupID",
+        t.type AS "Type",
+        t.monthlypay AS "MonthlyPay",
+        t.duration AS "Duration",
+        t.totalprice AS "TotalPrice",
+        f.rating AS "FeedbackRating",
+        f.comment AS "FeedbackComment"
       FROM procurement p
-      JOIN product pr ON pr.ProductID = p.ProductID
-      LEFT JOIN t_type t ON t.TransactionID = p.TransactionID
-      LEFT JOIN customerfeedback f ON f.TransactionID = p.TransactionID
-      WHERE p.CustomerID = ?
-      ORDER BY p.ProcurementDate DESC
+      JOIN product pr ON pr.productid = p.productid
+      LEFT JOIN t_type t ON t.transactionid = p.transactionid
+      LEFT JOIN customerfeedback f ON f.transactionid = p.transactionid
+      WHERE p.customerid = $1
+      ORDER BY p.procurementdate DESC
     `, [customerId]);
 
-    res.json(rows);
+    res.json(result.rows);
   } catch (err) {
     console.error(" Error fetching my procurements:", err);
@@ -88,5 +88,5 @@
     const productIds = cartItems.map(p => p.productId);
     const [available] = await pool.query(
-      `SELECT * FROM product WHERE ProductID IN (?) AND Status = 'available'`,
+      `SELECT * FROM product WHERE ProductID = ANY($1) AND Status = 'available'`,
       [productIds]
     );
@@ -117,5 +117,5 @@
       await pool.query(
         `INSERT INTO procurement (TransactionID, EmployeeID, CustomerID, ProductID, ProcurementDate, Quantity, Status)
-         VALUES (?, NULL, ?, ?, NOW(), 1, 'Pending')`,
+         VALUES ($1, NULL, $2, $3, NOW(), 1, 'Pending')`,
         [transactionId, customerId, item.productId]
       );
@@ -123,5 +123,5 @@
       await pool.query(
         `INSERT INTO t_type (TransactionID, Type, Duration, MonthlyPay, TotalPrice)
-         VALUES (?, ?, ?, ?, ?)`,
+         VALUES ($1, $2, $3, $4, $5)`,
         [transactionId, type, duration, monthlyPay, totalPrice]
       );
@@ -140,5 +140,5 @@
 exports.getPendingRequests = async (req, res) => {
   try {
-    const [rows] = await pool.query(`
+    const result = await pool.query(`
       SELECT 
         r.GroupID,
@@ -148,5 +148,5 @@
         r.Status,
         r.RequestedAt,
-        GROUP_CONCAT(p.Model SEPARATOR ', ') AS Products,
+        STRING_AGG(p.Model, ', ') AS Products,
         SUM(r.TotalPrice) AS TotalPrice
       FROM procurement_request r
@@ -156,5 +156,5 @@
       GROUP BY r.GroupID, r.CustomerID, c.CustomerName, c.CustomerSurName, r.Status, r.RequestedAt
     `);
-    res.json(rows);
+    res.json(result.rows);
   } catch (err) {
     console.error("Error fetching pending grouped requests:", err);
@@ -173,25 +173,25 @@
 
   try {
-    const [requests] = await pool.query(
-      `SELECT * FROM procurement_request WHERE GroupID = ? AND Status = 'Pending'`,
+    const result = await pool.query(
+      `SELECT * FROM procurement_request WHERE GroupID = $1 AND Status = 'Pending'`,
       [groupId]
     );
 
-    if (requests.length === 0) {
+    if (result.rows.length === 0) {
       return res.status(400).json({ error: "No pending requests found for this group." });
     }
 
-    for (const reqItem of requests) {
-      
-      const [[{ maxId }]] = await pool.query(`SELECT MAX(TransactionID) AS maxId FROM procurement`);
-      const newTransactionId = (maxId || 0) + 1;
-
-      
-      const [[product]] = await pool.query(`SELECT Price FROM product WHERE ProductID = ?`, [reqItem.ProductID]);
-      const price = parseFloat(product?.Price || 0);
-
-      
-      const isRent = reqItem.TransactionType === "Rent";
-      const duration = isRent ? reqItem.Duration : null;
+    for (const reqItem of result.rows) {
+      
+      const maxResult = await pool.query(`SELECT MAX(TransactionID) AS maxId FROM procurement`);
+      const newTransactionId = (maxResult.rows[0].maxid || 0) + 1;
+
+      
+      const productResult = await pool.query(`SELECT Price FROM product WHERE ProductID = $1`, [reqItem.productid]);
+      const price = parseFloat(productResult.rows[0]?.price || 0);
+
+      
+      const isRent = reqItem.transactiontype === "Rent";
+      const duration = isRent ? reqItem.duration : null;
       const monthlyPay = isRent ? (price / 36).toFixed(2) : null;
       const totalPrice = isRent ? parseFloat(monthlyPay) * duration : price;
@@ -201,6 +201,6 @@
       await pool.query(
         `INSERT INTO procurement (TransactionID, CustomerID, ProductID, Quantity, ProcurementDate, Status, EmployeeID, GroupID)
-         VALUES (?, ?, ?, ?, NOW(), 'Approved', ?, ?)`,
-        [newTransactionId, reqItem.CustomerID, reqItem.ProductID, reqItem.Quantity, employeeId, groupId]
+         VALUES ($1, $2, $3, $4, NOW(), 'Approved', $5, $6)`,
+        [newTransactionId, reqItem.customerid, reqItem.productid, reqItem.quantity, employeeId, groupId]
       );
 
@@ -208,6 +208,6 @@
       await pool.query(
         `INSERT INTO t_type (TransactionID, Type, MonthlyPay, Duration, TotalPrice)
-         VALUES (?, ?, ?, ?, ?)`,
-        [newTransactionId, reqItem.TransactionType, monthlyPay, duration, totalPrice]
+         VALUES ($1, $2, $3, $4, $5)`,
+        [newTransactionId, reqItem.transactiontype, monthlyPay, duration, totalPrice]
       );
 
@@ -221,5 +221,5 @@
     
     await pool.query(
-      `UPDATE procurement_request SET Status = 'Approved' WHERE GroupID = ?`,
+      `UPDATE procurement_request SET Status = 'Approved' WHERE GroupID = $1`,
       [groupId]
     );
@@ -244,5 +244,5 @@
   try {
     const [requests] = await pool.query(
-      `SELECT * FROM procurement_request WHERE GroupID = ? AND Status = 'Pending'`,
+      `SELECT * FROM procurement_request WHERE GroupID = $1 AND Status = 'Pending'`,
       [groupId]
     );
@@ -261,5 +261,5 @@
 
     await pool.query(
-      `UPDATE procurement_request SET Status = 'Rejected', PaymentStatus = 'Refunded' WHERE GroupID = ?`,
+      `UPDATE procurement_request SET Status = 'Rejected', PaymentStatus = 'Refunded' WHERE GroupID = $1`,
       [groupId]
     );
@@ -275,25 +275,24 @@
 exports.getGroupedPendingRequests = async (req, res) => {
   try {
-    const [groups] = await pool.query(`
+    const result = await pool.query(`
       SELECT 
-        r.GroupID,
-        COUNT(*) AS ItemCount,
+        r.groupid AS "GroupID",
+        COUNT(*) AS "ItemCount",
         SUM(CASE 
-              WHEN r.TransactionType = 'Rent' THEN (pr.Price / 36) * r.Duration
-              ELSE pr.Price
-            END) AS Total,
-        GROUP_CONCAT(p.Model SEPARATOR ', ') AS ProductModels,
-        ANY_VALUE(c.CustomerName) AS CustomerName,
-        ANY_VALUE(c.CustomerSurName) AS CustomerSurName
+              WHEN r.transactiontype = 'Rent' THEN (p.price / 36) * r.duration
+              ELSE p.price
+            END) AS "Total",
+        STRING_AGG(p.model, ', ') AS "ProductModels",
+        (ARRAY_AGG(c.customername))[1] AS "CustomerName",
+        (ARRAY_AGG(c.customersurname))[1] AS "CustomerSurName"
       FROM procurement_request r
-      JOIN customer c ON r.CustomerID = c.CustomerID
-      JOIN product p ON p.ProductID = r.ProductID
-      JOIN product pr ON pr.ProductID = r.ProductID
-      WHERE r.Status = 'Pending' AND r.GroupID IS NOT NULL
-      GROUP BY r.GroupID
-      ORDER BY r.GroupID DESC
+      JOIN customer c ON r.customerid = c.customerid
+      JOIN product p ON p.productid = r.productid
+      WHERE r.status = 'Pending' AND r.groupid IS NOT NULL
+      GROUP BY r.groupid
+      ORDER BY r.groupid DESC
     `);
 
-    res.json(groups);
+    res.json(result.rows);
   } catch (err) {
     console.error("Error fetching grouped requests:", err);
@@ -319,6 +318,6 @@
   try {
    
-    const [walletResult] = await pool.query("SELECT Balance, CVV FROM wallet WHERE WalletID = ?", [cardId]);
-    if (walletResult.length === 0 || walletResult[0].CVV !== cvv) {
+    const walletResult = await pool.query("SELECT Balance, CVV FROM wallet WHERE WalletID = $1", [cardId]);
+    if (walletResult.rows.length === 0 || walletResult.rows[0].cvv !== cvv) {
       return res.status(400).json({ error: "Invalid card or CVV." });
     }
@@ -329,8 +328,8 @@
 
     for (const item of cartItems) {
-      const [result] = await pool.query("SELECT Price FROM product WHERE ProductID = ?", [item.productId]);
-      if (result.length === 0) return res.status(400).json({ error: "Invalid product." });
-
-      const price = parseFloat(result[0].Price);
+      const result = await pool.query("SELECT Price FROM product WHERE ProductID = $1", [item.productId]);
+      if (result.rows.length === 0) return res.status(400).json({ error: "Invalid product." });
+
+      const price = parseFloat(result.rows[0].price);
       const type = item.type;
       let monthlyPay = null;
@@ -348,14 +347,14 @@
     }
 
-    if (walletResult[0].Balance < totalPrice) {
+    if (walletResult.rows[0].balance < totalPrice) {
       return res.status(400).json({ error: "Insufficient funds." });
     }
 
     
-    await pool.query("UPDATE wallet SET Balance = Balance - ? WHERE WalletID = ?", [totalPrice, cardId]);
+    await pool.query("UPDATE wallet SET Balance = Balance - $1 WHERE WalletID = $2", [totalPrice, cardId]);
 
     
-    const [groupResult] = await pool.query("SELECT MAX(GroupID) AS maxId FROM procurement_request");
-    const groupId = (groupResult[0].maxId || 0) + 1;
+    const groupResult = await pool.query("SELECT MAX(GroupID) AS maxId FROM procurement_request");
+    const groupId = (groupResult.rows[0].maxid || 0) + 1;
 
     
@@ -364,5 +363,5 @@
         `INSERT INTO procurement_request 
           (CustomerID, ProductID, Quantity, RequestedAt, Status, PaymentStatus, MonthlyPay, TotalPrice, Duration, CardID, TransactionType, PaymentMethod, GroupID)
-         VALUES (?, ?, ?, NOW(), 'Pending', 'Reserved', ?, ?, ?, ?, ?, ?, ?)`,
+         VALUES ($1, $2, $3, NOW(), 'Pending', 'Reserved', $4, $5, $6, $7, $8, $9, $10)`,
         [
           customerId,
@@ -390,8 +389,8 @@
 exports.getPendingProductIds = async (req, res) => {
   try {
-    const [rows] = await pool.query(`
+    const result = await pool.query(`
       SELECT DISTINCT ProductID FROM procurement_request WHERE Status = 'Pending'
     `);
-    const ids = rows.map(r => r.ProductID);
+    const ids = result.rows.map(r => r.productid);
     res.json(ids);
   } catch (err) {
Index: TruckSimulator-main/ds-db-ws/controllers/procurementRequestController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/procurementRequestController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/procurementRequestController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -16,7 +16,7 @@
   try {
     
-    const [cardRows] = await pool.query("SELECT Balance, CVV FROM wallet WHERE WalletID = ?", [cardId]);
-    if (cardRows.length === 0) return res.status(400).json({ error: "Invalid card." });
-    if (cardRows[0].CVV !== cvv) return res.status(400).json({ error: "Invalid CVV." });
+    const cardResult = await pool.query("SELECT Balance, CVV FROM wallet WHERE WalletID = $1", [cardId]);
+    if (cardResult.rows.length === 0) return res.status(400).json({ error: "Invalid card." });
+    if (cardResult.rows[0].cvv !== cvv) return res.status(400).json({ error: "Invalid CVV." });
 
   
@@ -25,8 +25,8 @@
 
     for (const item of items) {
-      const [productRows] = await pool.query("SELECT Price FROM product WHERE ProductID = ?", [item.productId]);
-      if (productRows.length === 0) return res.status(400).json({ error: "Invalid product." });
+      const productResult = await pool.query("SELECT Price FROM product WHERE ProductID = $1", [item.productId]);
+      if (productResult.rows.length === 0) return res.status(400).json({ error: "Invalid product." });
 
-      const price = parseFloat(productRows[0].Price);
+      const price = parseFloat(productResult.rows[0].price);
       let monthlyPay = null;
       let totalPrice = price;
@@ -44,10 +44,10 @@
 
    
-    if (cardRows[0].Balance < totalCost) {
+    if (cardResult.rows[0].balance < totalCost) {
       return res.status(400).json({ error: "Insufficient balance." });
     }
 
     
-    await pool.query("UPDATE wallet SET Balance = Balance - ? WHERE WalletID = ?", [totalCost, cardId]);
+    await pool.query("UPDATE wallet SET Balance = Balance - $1 WHERE WalletID = $2", [totalCost, cardId]);
 
     
@@ -58,5 +58,5 @@
         INSERT INTO procurement_request 
         (CustomerID, ProductID, Quantity, RequestedAt, Status, PaymentStatus, MonthlyPay, TotalPrice, Duration, CardID, TransactionType, PaymentMethod, GroupID)
-        VALUES (?, ?, ?, NOW(), 'Pending', 'Reserved', ?, ?, ?, ?, ?, ?, ?)`,
+        VALUES ($1, $2, $3, NOW(), 'Pending', 'Reserved', $4, $5, $6, $7, $8, $9, $10)`,
         [
           customerId,
@@ -86,5 +86,5 @@
 exports.getPendingRequests = async (req, res) => {
   try {
-    const [rows] = await pool.query(`
+    const result = await pool.query(`
       SELECT pr.GroupID, pr.RequestID, c.CustomerName, c.CustomerSurName,
              p.Model, pr.Quantity, pr.TotalPrice, pr.Duration
@@ -98,7 +98,7 @@
     
     const grouped = {};
-    for (const row of rows) {
-      if (!grouped[row.GroupID]) grouped[row.GroupID] = [];
-      grouped[row.GroupID].push(row);
+    for (const row of result.rows) {
+      if (!grouped[row.groupid]) grouped[row.groupid] = [];
+      grouped[row.groupid].push(row);
     }
 
Index: TruckSimulator-main/ds-db-ws/controllers/productController.js
===================================================================
--- TruckSimulator-main/ds-db-ws/controllers/productController.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/controllers/productController.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -17,25 +17,31 @@
     let query = `
       SELECT 
-        p.ProductID, p.Model, p.Price, p.LicensePlate, p.Status,
+        p.productid, p.model, p.price, p.licenseplate, p.status,
         CASE 
-          WHEN t.ProductID IS NOT NULL THEN 'truck'
-          WHEN tr.ProductID IS NOT NULL THEN 'trailer'
+          WHEN t.productid IS NOT NULL THEN 'truck'
+          WHEN tr.productid IS NOT NULL THEN 'trailer'
           ELSE 'unknown'
         END AS type,
-        JSON_OBJECT('HP', t.HP, 'Capacity', tr.Capacity) AS specs
+        JSON_BUILD_OBJECT('HP', t.hp, 'Capacity', tr.capacity) AS specs
       FROM product p
-      LEFT JOIN truck t ON p.ProductID = t.ProductID
-      LEFT JOIN trailer tr ON p.ProductID = tr.ProductID
+      LEFT JOIN truck t ON p.productid = t.productid
+      LEFT JOIN trailer tr ON p.productid = tr.productid
     `;
 
     if (!req.session.user || req.session.user.type !== "employee") {
-      query += " WHERE p.Status = 'available'";
+      query += " WHERE p.status = 'available'";
     }
 
-    const [products] = await pool.query(query);
+    const result = await pool.query(query);
+    const products = result.rows;
 
     const parsed = products.map(p => ({
-      ...p,
-      specs: JSON.parse(p.specs)
+      ProductID: p.productid,
+      Model: p.model,
+      Price: p.price,
+      LicensePlate: p.licenseplate,
+      Status: p.status,
+      type: p.type,
+      specs: typeof p.specs === 'string' ? JSON.parse(p.specs) : p.specs
     }));
 
@@ -67,17 +73,17 @@
 
   try {
-    const [idRow] = await pool.query("SELECT MAX(ProductID) + 1 AS NewID FROM product");
-    const newID = idRow[0].NewID || 1;
+    const idResult = await pool.query("SELECT MAX(productid) + 1 AS newid FROM product");
+    const newID = idResult.rows[0].newid || 1;
 
     await pool.query(
-      `INSERT INTO product (ProductID, Model, Price, LicensePlate, Status)
-       VALUES (?, ?, ?, ?, ?)`,
+      `INSERT INTO product (productid, model, price, licenseplate, status)
+       VALUES ($1, $2, $3, $4, $5)`,
       [newID, Model, Price, LicensePlate, Status]
     );
 
     if (Type === "truck") {
-      await pool.query("INSERT INTO truck (ProductID, HP) VALUES (?, ?)", [newID, HP]);
+      await pool.query("INSERT INTO truck (productid, hp) VALUES ($1, $2)", [newID, HP]);
     } else if (Type === "trailer") {
-      await pool.query("INSERT INTO trailer (ProductID, Capacity) VALUES (?, ?)", [newID, Capacity]);
+      await pool.query("INSERT INTO trailer (productid, capacity) VALUES ($1, $2)", [newID, Capacity]);
     }
 
@@ -89,13 +95,49 @@
 };
 exports.updateProduct = async (req, res) => {
-  const { Model, Price, LicensePlate, Status } = req.body;
+  const { Model, Price, LicensePlate, Status, HP, Capacity } = req.body;
   const id = req.params.id;
 
+  if (!id) {
+    return res.status(400).json({ error: "Product ID is required" });
+  }
+
   try {
-    await pool.query(
-      `UPDATE product SET Model=?, Price=?, LicensePlate=?, Status=? WHERE ProductID=?`,
-      [Model, Price, LicensePlate, Status, id]
-    );
-    res.json({ message: "Product updated" });
+    // Convert empty string to null for numeric fields
+    const price = Price === '' ? null : parseFloat(Price);
+
+    const client = await pool.connect();
+    try {
+      await client.query('BEGIN');
+
+      await client.query(
+        `UPDATE product SET Model=$1, Price=$2, LicensePlate=$3, Status=$4 WHERE ProductID=$5`,
+        [Model, price, LicensePlate, Status, id]
+      );
+
+      // Optionally update truck/trailer specs if provided
+      if (HP !== undefined && HP !== null && HP !== '') {
+        await client.query(
+          `INSERT INTO truck (ProductID, HP) VALUES ($1, $2)
+           ON CONFLICT (ProductID) DO UPDATE SET HP = EXCLUDED.HP`,
+          [id, parseInt(HP)]
+        );
+      }
+
+      if (Capacity !== undefined && Capacity !== null && Capacity !== '') {
+        await client.query(
+          `INSERT INTO trailer (ProductID, Capacity) VALUES ($1, $2)
+           ON CONFLICT (ProductID) DO UPDATE SET Capacity = EXCLUDED.Capacity`,
+          [id, parseFloat(Capacity)]
+        );
+      }
+
+      await client.query('COMMIT');
+      res.json({ message: "Product updated" });
+    } catch (txErr) {
+      await client.query('ROLLBACK');
+      throw txErr;
+    } finally {
+      client.release();
+    }
   } catch (err) {
     console.error("Error updating product:", err);
@@ -107,7 +149,37 @@
   const id = req.params.id;
 
+  if (!id) {
+    return res.status(400).json({ error: "Product ID is required" });
+  }
+
   try {
-    await pool.query("DELETE FROM product WHERE ProductID = ?", [id]);
-    res.json({ message: "Product deleted" });
+    const client = await pool.connect();
+    try {
+      await client.query('BEGIN');
+
+      // Remove dependent rows first to satisfy foreign key constraints
+      await client.query("DELETE FROM truck WHERE ProductID = $1", [id]);
+      await client.query("DELETE FROM trailer WHERE ProductID = $1", [id]);
+      await client.query("DELETE FROM views WHERE ProductID = $1", [id]);
+      await client.query("DELETE FROM maintenance WHERE ProductID = $1", [id]);
+      await client.query("DELETE FROM customerfeedback WHERE ProductID = $1", [id]);
+      await client.query(
+        "DELETE FROM t_type WHERE TransactionID IN (SELECT TransactionID FROM procurement WHERE ProductID = $1)",
+        [id]
+      );
+      await client.query("DELETE FROM procurement_request WHERE ProductID = $1", [id]);
+      await client.query("DELETE FROM procurement WHERE ProductID = $1", [id]);
+
+      // Finally delete the product
+      await client.query("DELETE FROM product WHERE ProductID = $1", [id]);
+
+      await client.query('COMMIT');
+      res.json({ message: "Product deleted" });
+    } catch (txErr) {
+      await client.query('ROLLBACK');
+      throw txErr;
+    } finally {
+      client.release();
+    }
   } catch (err) {
     console.error("Error deleting product:", err);
Index: TruckSimulator-main/ds-db-ws/migrate-to-postgres.js
===================================================================
--- TruckSimulator-main/ds-db-ws/migrate-to-postgres.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/migrate-to-postgres.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,127 @@
+#!/usr/bin/env node
+
+/**
+ * Database Migration Script: MySQL to PostgreSQL
+ * 
+ * This script helps migrate the TruckSimulator database from MySQL to PostgreSQL.
+ * 
+ * Prerequisites:
+ * 1. PostgreSQL server running on localhost:5432
+ * 2. PostgreSQL user 'postgres' with password '2405'
+ * 3. Database 'TruckSimulator' created in PostgreSQL
+ * 
+ * Usage:
+ * node migrate-to-postgres.js
+ */
+
+const { Pool } = require('pg');
+const fs = require('fs');
+const path = require('path');
+
+// PostgreSQL connection
+const pool = new Pool({
+  host: 'localhost',
+  user: 'postgres',
+  password: 'Marconioni123',
+  database: 'TruckSimulator',
+  port: 5432,
+});
+
+async function createTables() {
+  try {
+    console.log('Creating PostgreSQL tables...');
+    
+    // Read the SQL file
+    const sqlFile = path.join(__dirname, '..', 'sql data base', 'TruckSimulator.sql');
+    const sqlContent = fs.readFileSync(sqlFile, 'utf8');
+    
+    // Convert MySQL syntax to PostgreSQL
+    let postgresSQL = sqlContent
+      // Replace AUTO_INCREMENT with SERIAL
+      .replace(/AUTO_INCREMENT/g, 'SERIAL')
+      // Replace MySQL data types
+      .replace(/INT\(\d+\)/g, 'INTEGER')
+      .replace(/VARCHAR\(\d+\)/g, 'VARCHAR')
+      .replace(/DATETIME/g, 'TIMESTAMP')
+      // Replace MySQL specific syntax
+      .replace(/ENGINE=InnoDB/g, '')
+      .replace(/DEFAULT CHARSET=utf8mb4/g, '')
+      .replace(/COLLATE utf8mb4_0900_ai_ci/g, '')
+      // Remove MySQL specific comments and syntax
+      .replace(/--.*$/gm, '')
+      .replace(/\/\*.*?\*\//gs, '');
+    
+    // Split into individual statements
+    const statements = postgresSQL
+      .split(';')
+      .map(stmt => stmt.trim())
+      .filter(stmt => stmt.length > 0 && !stmt.startsWith('--'));
+    
+    // Execute each statement
+    for (const statement of statements) {
+      if (statement.trim()) {
+        try {
+          await pool.query(statement);
+          console.log('✓ Executed:', statement.substring(0, 50) + '...');
+        } catch (err) {
+          console.warn('⚠ Warning executing statement:', err.message);
+          console.log('Statement:', statement.substring(0, 100) + '...');
+        }
+      }
+    }
+    
+    console.log('✓ Database tables created successfully!');
+    
+  } catch (err) {
+    console.error('❌ Error creating tables:', err);
+    throw err;
+  }
+}
+
+async function testConnection() {
+  try {
+    console.log('Testing PostgreSQL connection...');
+    const result = await pool.query('SELECT NOW() as current_time');
+    console.log('✓ Connection successful! Current time:', result.rows[0].current_time);
+    return true;
+  } catch (err) {
+    console.error('❌ Connection failed:', err.message);
+    return false;
+  }
+}
+
+async function main() {
+  console.log('🚀 Starting MySQL to PostgreSQL migration...\n');
+  
+  // Test connection
+  const connected = await testConnection();
+  if (!connected) {
+    console.log('\n❌ Cannot proceed without database connection.');
+    console.log('Please ensure PostgreSQL is running and the database exists.');
+    process.exit(1);
+  }
+  
+  try {
+    // Create tables
+    await createTables();
+    
+    console.log('\n✅ Migration completed successfully!');
+    console.log('\nNext steps:');
+    console.log('1. Install dependencies: npm install');
+    console.log('2. Start the application: npm start');
+    console.log('3. Test all functionality to ensure everything works');
+    
+  } catch (err) {
+    console.error('\n❌ Migration failed:', err);
+    process.exit(1);
+  } finally {
+    await pool.end();
+  }
+}
+
+// Run the migration
+if (require.main === module) {
+  main().catch(console.error);
+}
+
+module.exports = { createTables, testConnection };
Index: TruckSimulator-main/ds-db-ws/models/customerModel.js
===================================================================
--- TruckSimulator-main/ds-db-ws/models/customerModel.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/models/customerModel.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -15,5 +15,5 @@
 exports.addFeedback = (data, cb) => {
   const { FeedbackID, CustomerID, ProductID, Rating, Comment, FeedbackDate, TransactionID } = data;
-  db.query('INSERT INTO customerfeedback VALUES (?, ?, ?, ?, ?, ?, ?)',
+  db.query('INSERT INTO customerfeedback VALUES ($1, $2, $3, $4, $5, $6, $7)',
     [FeedbackID, CustomerID, ProductID, Rating, Comment, FeedbackDate, TransactionID], cb);
 };
Index: TruckSimulator-main/ds-db-ws/models/db.js
===================================================================
--- TruckSimulator-main/ds-db-ws/models/db.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/models/db.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -1,15 +1,19 @@
-const mysql = require('mysql2/promise');
+const { Pool } = require('pg');
 
-const pool = mysql.createPool({
+const pool = new Pool({
   host: 'localhost',
-  user: 'root',
-  password: '2405',
-  database: 'trucksimulator',
-  waitForConnections: true,
-  connectionLimit: 10,
-  queueLimit: 0
+  user: 'postgres',
+  password: 'Marconioni123',
+  database: 'TruckSimulator',
+  port: 5432,
+  max: 10,
+  idleTimeoutMillis: 30000,
+  connectionTimeoutMillis: 2000,
 });
+
+// Test the connection
 pool.query('SELECT 1 + 1 AS solution')
-  .then(([rows]) => console.log('Database connection test successful:', rows[0].solution))
+  .then((result) => console.log('Database connection test successful:', result.rows[0].solution))
   .catch(err => console.error('Database connection failed:', err));
+
 module.exports = pool;
Index: TruckSimulator-main/ds-db-ws/models/employeeModel.js
===================================================================
--- TruckSimulator-main/ds-db-ws/models/employeeModel.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/models/employeeModel.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -7,9 +7,9 @@
 exports.add = (data, cb) => {
   const { EmployeeID, EmployeeName, EmployeeSurName, Position, Department, Email, Password } = data;
-  db.query('INSERT INTO employee VALUES (?, ?, ?, ?, ?, ?, ?)',
+  db.query('INSERT INTO employee VALUES ($1, $2, $3, $4, $5, $6, $7)',
     [EmployeeID, EmployeeName, EmployeeSurName, Position, Department, Email, Password], cb);
 };
 
 exports.findByEmail = (email, cb) => {
-  db.query('SELECT * FROM employee WHERE Email = ?', [email], cb);
+  db.query('SELECT * FROM employee WHERE Email = $1', [email], cb);
 };
Index: TruckSimulator-main/ds-db-ws/models/maintenanceModel.js
===================================================================
--- TruckSimulator-main/ds-db-ws/models/maintenanceModel.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/models/maintenanceModel.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -14,4 +14,4 @@
 exports.addMaintenance = (data, cb) => {
   const { MainID, EmployeeID, ProductID, MainDate } = data;
-  db.query('INSERT INTO maintenance (MainID, EmployeeID, ProductID, MainDate) VALUES (?, ?, ?, ?)', [MainID, EmployeeID, ProductID, MainDate], cb);
+  db.query('INSERT INTO maintenance (MainID, EmployeeID, ProductID, MainDate) VALUES ($1, $2, $3, $4)', [MainID, EmployeeID, ProductID, MainDate], cb);
 };
Index: TruckSimulator-main/ds-db-ws/models/procurementModel.js
===================================================================
--- TruckSimulator-main/ds-db-ws/models/procurementModel.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/models/procurementModel.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -17,4 +17,4 @@
 exports.add = (data, cb) => {
   const { TransactionID, EmployeeID, CustomerID, ProductID, ProcurementDate, Quantity } = data;
-  db.query('INSERT INTO procurement VALUES (?, ?, ?, ?, ?, ?)', [TransactionID, EmployeeID, CustomerID, ProductID, ProcurementDate, Quantity], cb);
+  db.query('INSERT INTO procurement VALUES ($1, $2, $3, $4, $5, $6)', [TransactionID, EmployeeID, CustomerID, ProductID, ProcurementDate, Quantity], cb);
 };
Index: TruckSimulator-main/ds-db-ws/models/productModel.js
===================================================================
--- TruckSimulator-main/ds-db-ws/models/productModel.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/models/productModel.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -10,13 +10,13 @@
 
 exports.getById = (id, cb) => {
-  db.query("SELECT * FROM product WHERE ProductID = ?", [id], cb);
+  db.query("SELECT * FROM product WHERE ProductID = $1", [id], cb);
 };
 
 exports.addProduct = (data, cb) => {
   const { ProductID, Model, Price, LicensePlate, Status } = data;
-  db.query('INSERT INTO product VALUES (?, ?, ?, ?, ?)', [ProductID, Model, Price, LicensePlate, Status], cb);
+  db.query('INSERT INTO product VALUES ($1, $2, $3, $4, $5)', [ProductID, Model, Price, LicensePlate, Status], cb);
 };
 
 exports.updateStatus = (id, status, cb) => {
-  db.query('UPDATE product SET Status = ? WHERE ProductID = ?', [status, id], cb);
+  db.query('UPDATE product SET Status = $1 WHERE ProductID = $2', [status, id], cb);
 };
Index: TruckSimulator-main/ds-db-ws/models/userModel.js
===================================================================
--- TruckSimulator-main/ds-db-ws/models/userModel.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/models/userModel.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -2,14 +2,14 @@
 
 exports.findCustomerByEmail = (email, cb) => {
-  db.query('SELECT * FROM customers WHERE Email = ?', [email], cb);
+  db.query('SELECT * FROM customers WHERE Email = $1', [email], cb);
 };
 
 exports.createCustomer = (data, callback) => {
   const { CustomerID, CustomerName, CustomerSurName, Email, Address, CustomerContact, Password } = data;
-  db.query('INSERT INTO customer VALUES (?, ?, ?, ?, ?, ?, ?)',
+  db.query('INSERT INTO customer VALUES ($1, $2, $3, $4, $5, $6, $7)',
     [CustomerID, CustomerName, CustomerSurName, Email, Address, CustomerContact, Password], callback);
 };
 
 exports.findEmployeeByEmail = (email, cb) => {
-  db.query('SELECT * FROM employees WHERE Email = ?', [email], cb);
+  db.query('SELECT * FROM employees WHERE Email = $1', [email], cb);
 };
Index: TruckSimulator-main/ds-db-ws/node_modules/.package-lock.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/.package-lock.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/node_modules/.package-lock.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -18,13 +18,4 @@
       }
     },
-    "node_modules/aws-ssl-profiles": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
-      "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 6.0.0"
-      }
-    },
     "node_modules/bcrypt": {
       "version": "6.0.0",
@@ -162,13 +153,4 @@
           "optional": true
         }
-      }
-    },
-    "node_modules/denque": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
-      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=0.10"
       }
     },
@@ -382,13 +364,4 @@
       }
     },
-    "node_modules/generate-function": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
-      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
-      "license": "MIT",
-      "dependencies": {
-        "is-property": "^1.0.2"
-      }
-    },
     "node_modules/get-intrinsic": {
       "version": "1.3.0",
@@ -513,40 +486,4 @@
       "license": "MIT"
     },
-    "node_modules/is-property": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-      "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
-      "license": "MIT"
-    },
-    "node_modules/long": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
-      "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
-      "license": "Apache-2.0"
-    },
-    "node_modules/lru-cache": {
-      "version": "7.18.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
-      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/lru.min": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
-      "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
-      "license": "MIT",
-      "engines": {
-        "bun": ">=1.0.0",
-        "deno": ">=1.30.0",
-        "node": ">=8.0.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/wellwelwel"
-      }
-    },
     "node_modules/math-intrinsics": {
       "version": "1.1.0",
@@ -606,36 +543,4 @@
       "license": "MIT"
     },
-    "node_modules/mysql2": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.1.tgz",
-      "integrity": "sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==",
-      "license": "MIT",
-      "dependencies": {
-        "aws-ssl-profiles": "^1.1.1",
-        "denque": "^2.1.0",
-        "generate-function": "^2.3.1",
-        "iconv-lite": "^0.6.3",
-        "long": "^5.2.1",
-        "lru.min": "^1.0.0",
-        "named-placeholders": "^1.1.3",
-        "seq-queue": "^0.0.5",
-        "sqlstring": "^2.3.2"
-      },
-      "engines": {
-        "node": ">= 8.0"
-      }
-    },
-    "node_modules/named-placeholders": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
-      "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
-      "license": "MIT",
-      "dependencies": {
-        "lru-cache": "^7.14.1"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
     "node_modules/negotiator": {
       "version": "1.0.0",
@@ -725,4 +630,132 @@
       "engines": {
         "node": ">=16"
+      }
+    },
+    "node_modules/pg": {
+      "version": "8.16.3",
+      "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz",
+      "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-connection-string": "^2.9.1",
+        "pg-pool": "^3.10.1",
+        "pg-protocol": "^1.10.3",
+        "pg-types": "2.2.0",
+        "pgpass": "1.0.5"
+      },
+      "engines": {
+        "node": ">= 16.0.0"
+      },
+      "optionalDependencies": {
+        "pg-cloudflare": "^1.2.7"
+      },
+      "peerDependencies": {
+        "pg-native": ">=3.0.1"
+      },
+      "peerDependenciesMeta": {
+        "pg-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pg-cloudflare": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz",
+      "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/pg-connection-string": {
+      "version": "2.9.1",
+      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
+      "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
+      "license": "MIT"
+    },
+    "node_modules/pg-int8": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/pg-pool": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz",
+      "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "pg": ">=8.0"
+      }
+    },
+    "node_modules/pg-protocol": {
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz",
+      "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==",
+      "license": "MIT"
+    },
+    "node_modules/pg-types": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-int8": "1.0.1",
+        "postgres-array": "~2.0.0",
+        "postgres-bytea": "~1.0.0",
+        "postgres-date": "~1.0.4",
+        "postgres-interval": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pgpass": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+      "license": "MIT",
+      "dependencies": {
+        "split2": "^4.1.0"
+      }
+    },
+    "node_modules/postgres-array": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postgres-bytea": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-date": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-interval": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "xtend": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
@@ -852,9 +885,4 @@
       }
     },
-    "node_modules/seq-queue": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
-      "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
-    },
     "node_modules/serve-static": {
       "version": "2.2.0",
@@ -950,11 +978,11 @@
       }
     },
-    "node_modules/sqlstring": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
-      "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">= 10.x"
       }
     },
@@ -1039,4 +1067,13 @@
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "license": "ISC"
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4"
+      }
     }
   }
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,19 +1,0 @@
-Copyright (c) 2024 Andrey Sidorov, Douglas Wilson, Weslley Araújo and contributors.
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,146 +1,0 @@
-# AWS SSL Profiles
-
-[**AWS RDS**](https://aws.amazon.com/rds/) **SSL** Certificates Bundles.
-
-**Table of Contents**
-
-- [Installation](#installation)
-- [Usage](#usage)
-  - [**mysqljs/mysql**](#mysqljsmysql)
-  - [**MySQL2**](#mysql2)
-  - [**node-postgres**](#node-postgres)
-  - [Custom `ssl` options](#custom-ssl-options)
-- [License](#license)
-- [Security](#security)
-- [Contributing](#contributing)
-- [Acknowledgements](#acknowledgements)
-
----
-
-## Installation
-
-```bash
-npm install --save aws-ssl-profiles
-```
-
----
-
-## Usage
-
-### [mysqljs/mysql](https://github.com/mysqljs/mysql)
-
-```js
-const mysql = require('mysql');
-const awsCaBundle = require('aws-ssl-profiles');
-
-// mysql connection
-const connection = mysql.createConnection({
-  //...
-  ssl: awsCaBundle,
-});
-
-// mysql connection pool
-const pool = mysql.createPool({
-  //...
-  ssl: awsCaBundle,
-});
-```
-
-### [MySQL2](https://github.com/sidorares/node-mysql2)
-
-```js
-const mysql = require('mysql2');
-const awsCaBundle = require('aws-ssl-profiles');
-
-// mysql2 connection
-const connection = mysql.createConnection({
-  //...
-  ssl: awsCaBundle,
-});
-
-// mysql2 connection pool
-const pool = mysql.createPool({
-  //...
-  ssl: awsCaBundle,
-});
-```
-
-### [node-postgres](https://github.com/brianc/node-postgres)
-
-```js
-const pg = require('pg');
-const awsCaBundle = require('aws-ssl-profiles');
-
-// pg connection
-const client = new pg.Client({
-  // ...
-  ssl: awsCaBundle,
-});
-
-// pg connection pool
-const pool = new pg.Pool({
-  // ...
-  ssl: awsCaBundle,
-});
-```
-
-### Custom `ssl` options
-
-Using **AWS SSL Profiles** with custom `ssl` options:
-
-```js
-{
-  // ...
-  ssl: {
-    ...awsCaBundle,
-    rejectUnauthorized: true,
-    // ...
-  }
-}
-```
-
-```js
-{
-  // ...
-  ssl: {
-    ca: awsCaBundle.ca,
-    rejectUnauthorized: true,
-    // ...
-  }
-}
-```
-
-### Custom bundles
-
-```js
-const { proxyBundle } = require('aws-ssl-profiles');
-
-{
-  // ...
-  ssl: proxyBundle,
-}
-```
-
----
-
-## License
-
-**AWS SSL Profiles** is under the [**MIT License**](./LICENSE).
-
----
-
-## Security
-
-Please check the [**SECURITY.md**](./SECURITY.md).
-
----
-
-## Contributing
-
-Please check the [**CONTRIBUTING.md**](./CONTRIBUTING.md) for instructions.
-
----
-
-## Acknowledgements
-
-[**Contributors**](https://github.com/mysqljs/aws-ssl-profiles/graphs/contributors).
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/@types/profiles.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/@types/profiles.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,4 +1,0 @@
-export type CA = string[];
-export type Profiles = {
-    ca: CA;
-};
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/@types/profiles.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/@types/profiles.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,2 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import type { Profiles } from "./@types/profiles.js";
-export declare const proxyBundle: Profiles;
-declare const profiles: Profiles;
-declare module "aws-ssl-profiles" {
-    const profiles: Profiles & { proxyBundle: Profiles };
-    export = profiles;
-}
-export default profiles;
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,13 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const defaults_js_1 = require("./profiles/ca/defaults.js");
-const proxies_js_1 = require("./profiles/ca/proxies.js");
-const proxyBundle = {
-    ca: proxies_js_1.proxies,
-};
-const profiles = {
-    ca: [...defaults_js_1.defaults, ...proxies_js_1.proxies],
-};
-module.exports = profiles;
-module.exports.proxyBundle = proxyBundle;
-module.exports.default = profiles;
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/defaults.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/defaults.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,9 +1,0 @@
-import type { CA } from '../../@types/profiles.js';
-/**
- * CA Certificates for **Amazon RDS** (2024)
- *
- * - https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html
- * - https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL.html
- * - https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html#aurora-serverless.tls
- */
-export declare const defaults: CA;
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/defaults.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/defaults.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,2888 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.defaults = void 0;
-/**
- * CA Certificates for **Amazon RDS** (2024)
- *
- * - https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html
- * - https://docs.amazonaws.cn/en_us/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL.html
- * - https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html#aurora-serverless.tls
- */
-exports.defaults = [
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEEjCCAvqgAwIBAgIJAM2ZN/+nPi27MA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\n' +
-        'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' +
-        'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' +
-        'em9uIFJEUzEmMCQGA1UEAwwdQW1hem9uIFJEUyBhZi1zb3V0aC0xIFJvb3QgQ0Ew\n' +
-        'HhcNMTkxMDI4MTgwNTU4WhcNMjQxMDI2MTgwNTU4WjCBlTELMAkGA1UEBhMCVVMx\n' +
-        'EDAOBgNVBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoM\n' +
-        'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' +
-        'JjAkBgNVBAMMHUFtYXpvbiBSRFMgYWYtc291dGgtMSBSb290IENBMIIBIjANBgkq\n' +
-        'hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwR2351uPMZaJk2gMGT+1sk8HE9MQh2rc\n' +
-        '/sCnbxGn2p1c7Oi9aBbd/GiFijeJb2BXvHU+TOq3d3Jjqepq8tapXVt4ojbTJNyC\n' +
-        'J5E7r7KjTktKdLxtBE1MK25aY+IRJjtdU6vG3KiPKUT1naO3xs3yt0F76WVuFivd\n' +
-        '9OHv2a+KHvPkRUWIxpmAHuMY9SIIMmEZtVE7YZGx5ah0iO4JzItHcbVR0y0PBH55\n' +
-        'arpFBddpIVHCacp1FUPxSEWkOpI7q0AaU4xfX0fe1BV5HZYRKpBOIp1TtZWvJD+X\n' +
-        'jGUtL1BEsT5vN5g9MkqdtYrC+3SNpAk4VtpvJrdjraI/hhvfeXNnAwIDAQABo2Mw\n' +
-        'YTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUEEi/\n' +
-        'WWMcBJsoGXg+EZwkQ0MscZQwHwYDVR0jBBgwFoAUEEi/WWMcBJsoGXg+EZwkQ0Ms\n' +
-        'cZQwDQYJKoZIhvcNAQELBQADggEBAGDZ5js5Pc/gC58LJrwMPXFhJDBS8QuDm23C\n' +
-        'FFUdlqucskwOS3907ErK1ZkmVJCIqFLArHqskFXMAkRZ2PNR7RjWLqBs+0znG5yH\n' +
-        'hRKb4DXzhUFQ18UBRcvT6V6zN97HTRsEEaNhM/7k8YLe7P8vfNZ28VIoJIGGgv9D\n' +
-        'wQBBvkxQ71oOmAG0AwaGD0ORGUfbYry9Dz4a4IcUsZyRWRMADixgrFv6VuETp26s\n' +
-        '/+z+iqNaGWlELBKh3iQCT6Y/1UnkPLO42bxrCSyOvshdkYN58Q2gMTE1SVTqyo8G\n' +
-        'Lw8lLAz9bnvUSgHzB3jRrSx6ggF/WRMRYlR++y6LXP4SAsSAaC0=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEEjCCAvqgAwIBAgIJAJYM4LxvTZA6MA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\n' +
-        'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' +
-        'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' +
-        'em9uIFJEUzEmMCQGA1UEAwwdQW1hem9uIFJEUyBldS1zb3V0aC0xIFJvb3QgQ0Ew\n' +
-        'HhcNMTkxMDMwMjAyMDM2WhcNMjQxMDI4MjAyMDM2WjCBlTELMAkGA1UEBhMCVVMx\n' +
-        'EDAOBgNVBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoM\n' +
-        'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' +
-        'JjAkBgNVBAMMHUFtYXpvbiBSRFMgZXUtc291dGgtMSBSb290IENBMIIBIjANBgkq\n' +
-        'hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqM921jXCXeqpRNCS9CBPOe5N7gMaEt+D\n' +
-        's5uR3riZbqzRlHGiF1jZihkXfHAIQewDwy+Yz+Oec1aEZCQMhUHxZJPusuX0cJfj\n' +
-        'b+UluFqHIijL2TfXJ3D0PVLLoNTQJZ8+GAPECyojAaNuoHbdVqxhOcznMsXIXVFq\n' +
-        'yVLKDGvyKkJjai/iSPDrQMXufg3kWt0ISjNLvsG5IFXgP4gttsM8i0yvRd4QcHoo\n' +
-        'DjvH7V3cS+CQqW5SnDrGnHToB0RLskE1ET+oNOfeN9PWOxQprMOX/zmJhnJQlTqD\n' +
-        'QP7jcf7SddxrKFjuziFiouskJJyNDsMjt1Lf60+oHZhed2ogTeifGwIDAQABo2Mw\n' +
-        'YTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUFBAF\n' +
-        'cgJe/BBuZiGeZ8STfpkgRYQwHwYDVR0jBBgwFoAUFBAFcgJe/BBuZiGeZ8STfpkg\n' +
-        'RYQwDQYJKoZIhvcNAQELBQADggEBAKAYUtlvDuX2UpZW9i1QgsjFuy/ErbW0dLHU\n' +
-        'e/IcFtju2z6RLZ+uF+5A8Kme7IKG1hgt8s+w9TRVQS/7ukQzoK3TaN6XKXRosjtc\n' +
-        'o9Rm4gYWM8bmglzY1TPNaiI4HC7546hSwJhubjN0bXCuj/0sHD6w2DkiGuwKNAef\n' +
-        'yTu5vZhPkeNyXLykxkzz7bNp2/PtMBnzIp+WpS7uUDmWyScGPohKMq5PqvL59z+L\n' +
-        'ZI3CYeMZrJ5VpXUg3fNNIz/83N3G0sk7wr0ohs/kHTP7xPOYB0zD7Ku4HA0Q9Swf\n' +
-        'WX0qr6UQgTPMjfYDLffI7aEId0gxKw1eGYc6Cq5JAZ3ipi/cBFc=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEEjCCAvqgAwIBAgIJANew34ehz5l8MA0GCSqGSIb3DQEBCwUAMIGVMQswCQYD\n' +
-        'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' +
-        'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' +
-        'em9uIFJEUzEmMCQGA1UEAwwdQW1hem9uIFJEUyBtZS1zb3V0aC0xIFJvb3QgQ0Ew\n' +
-        'HhcNMTkwNTEwMjE0ODI3WhcNMjQwNTA4MjE0ODI3WjCBlTELMAkGA1UEBhMCVVMx\n' +
-        'EDAOBgNVBAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoM\n' +
-        'GUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMx\n' +
-        'JjAkBgNVBAMMHUFtYXpvbiBSRFMgbWUtc291dGgtMSBSb290IENBMIIBIjANBgkq\n' +
-        'hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp7BYV88MukcY+rq0r79+C8UzkT30fEfT\n' +
-        'aPXbx1d6M7uheGN4FMaoYmL+JE1NZPaMRIPTHhFtLSdPccInvenRDIatcXX+jgOk\n' +
-        'UA6lnHQ98pwN0pfDUyz/Vph4jBR9LcVkBbe0zdoKKp+HGbMPRU0N2yNrog9gM5O8\n' +
-        'gkU/3O2csJ/OFQNnj4c2NQloGMUpEmedwJMOyQQfcUyt9CvZDfIPNnheUS29jGSw\n' +
-        'ERpJe/AENu8Pxyc72jaXQuD+FEi2Ck6lBkSlWYQFhTottAeGvVFNCzKszCntrtqd\n' +
-        'rdYUwurYsLTXDHv9nW2hfDUQa0mhXf9gNDOBIVAZugR9NqNRNyYLHQIDAQABo2Mw\n' +
-        'YTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU54cf\n' +
-        'DjgwBx4ycBH8+/r8WXdaiqYwHwYDVR0jBBgwFoAU54cfDjgwBx4ycBH8+/r8WXda\n' +
-        'iqYwDQYJKoZIhvcNAQELBQADggEBAIIMTSPx/dR7jlcxggr+O6OyY49Rlap2laKA\n' +
-        'eC/XI4ySP3vQkIFlP822U9Kh8a9s46eR0uiwV4AGLabcu0iKYfXjPkIprVCqeXV7\n' +
-        'ny9oDtrbflyj7NcGdZLvuzSwgl9SYTJp7PVCZtZutsPYlbJrBPHwFABvAkMvRtDB\n' +
-        'hitIg4AESDGPoCl94sYHpfDfjpUDMSrAMDUyO6DyBdZH5ryRMAs3lGtsmkkNUrso\n' +
-        'aTW6R05681Z0mvkRdb+cdXtKOSuDZPoe2wJJIaz3IlNQNSrB5TImMYgmt6iAsFhv\n' +
-        '3vfTSTKrZDNTJn4ybG6pq1zWExoXsktZPylJly6R3RBwV6nwqBM=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBjCCAu6gAwIBAgIJAMc0ZzaSUK51MA0GCSqGSIb3DQEBCwUAMIGPMQswCQYD\n' +
-        'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' +
-        'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' +
-        'em9uIFJEUzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkw\n' +
-        'ODIyMTcwODUwWhcNMjQwODIyMTcwODUwWjCBjzELMAkGA1UEBhMCVVMxEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUxEzARBgNVBAgMCldhc2hpbmd0b24xIjAgBgNVBAoMGUFtYXpv\n' +
-        'biBXZWIgU2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxIDAeBgNV\n' +
-        'BAMMF0FtYXpvbiBSRFMgUm9vdCAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\n' +
-        'AQ8AMIIBCgKCAQEArXnF/E6/Qh+ku3hQTSKPMhQQlCpoWvnIthzX6MK3p5a0eXKZ\n' +
-        'oWIjYcNNG6UwJjp4fUXl6glp53Jobn+tWNX88dNH2n8DVbppSwScVE2LpuL+94vY\n' +
-        '0EYE/XxN7svKea8YvlrqkUBKyxLxTjh+U/KrGOaHxz9v0l6ZNlDbuaZw3qIWdD/I\n' +
-        '6aNbGeRUVtpM6P+bWIoxVl/caQylQS6CEYUk+CpVyJSkopwJlzXT07tMoDL5WgX9\n' +
-        'O08KVgDNz9qP/IGtAcRduRcNioH3E9v981QO1zt/Gpb2f8NqAjUUCUZzOnij6mx9\n' +
-        'McZ+9cWX88CRzR0vQODWuZscgI08NvM69Fn2SQIDAQABo2MwYTAOBgNVHQ8BAf8E\n' +
-        'BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUc19g2LzLA5j0Kxc0LjZa\n' +
-        'pmD/vB8wHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJKoZIhvcN\n' +
-        'AQELBQADggEBAHAG7WTmyjzPRIM85rVj+fWHsLIvqpw6DObIjMWokpliCeMINZFV\n' +
-        'ynfgBKsf1ExwbvJNzYFXW6dihnguDG9VMPpi2up/ctQTN8tm9nDKOy08uNZoofMc\n' +
-        'NUZxKCEkVKZv+IL4oHoeayt8egtv3ujJM6V14AstMQ6SwvwvA93EP/Ug2e4WAXHu\n' +
-        'cbI1NAbUgVDqp+DRdfvZkgYKryjTWd/0+1fS8X1bBZVWzl7eirNVnHbSH2ZDpNuY\n' +
-        '0SBd8dj5F6ld3t58ydZbrTHze7JJOd8ijySAp4/kiu9UfZWuTPABzDa/DSdz9Dk/\n' +
-        'zPW4CXXvhLmE02TA9/HeCw3KEHIwicNuEfw=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEEDCCAvigAwIBAgIJAKFMXyltvuRdMA0GCSqGSIb3DQEBCwUAMIGUMQswCQYD\n' +
-        'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' +
-        'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' +
-        'em9uIFJEUzElMCMGA1UEAwwcQW1hem9uIFJEUyBCZXRhIFJvb3QgMjAxOSBDQTAe\n' +
-        'Fw0xOTA4MTkxNzM4MjZaFw0yNDA4MTkxNzM4MjZaMIGUMQswCQYDVQQGEwJVUzEQ\n' +
-        'MA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UECgwZ\n' +
-        'QW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEl\n' +
-        'MCMGA1UEAwwcQW1hem9uIFJEUyBCZXRhIFJvb3QgMjAxOSBDQTCCASIwDQYJKoZI\n' +
-        'hvcNAQEBBQADggEPADCCAQoCggEBAMkZdnIH9ndatGAcFo+DppGJ1HUt4x+zeO+0\n' +
-        'ZZ29m0sfGetVulmTlv2d5b66e+QXZFWpcPQMouSxxYTW08TbrQiZngKr40JNXftA\n' +
-        'atvzBqIImD4II0ZX5UEVj2h98qe/ypW5xaDN7fEa5e8FkYB1TEemPaWIbNXqchcL\n' +
-        'tV7IJPr3Cd7Z5gZJlmujIVDPpMuSiNaal9/6nT9oqN+JSM1fx5SzrU5ssg1Vp1vv\n' +
-        '5Xab64uOg7wCJRB9R2GC9XD04odX6VcxUAGrZo6LR64ZSifupo3l+R5sVOc5i8NH\n' +
-        'skdboTzU9H7+oSdqoAyhIU717PcqeDum23DYlPE2nGBWckE+eT8CAwEAAaNjMGEw\n' +
-        'DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFK2hDBWl\n' +
-        'sbHzt/EHd0QYOooqcFPhMB8GA1UdIwQYMBaAFK2hDBWlsbHzt/EHd0QYOooqcFPh\n' +
-        'MA0GCSqGSIb3DQEBCwUAA4IBAQAO/718k8EnOqJDx6wweUscGTGL/QdKXUzTVRAx\n' +
-        'JUsjNUv49mH2HQVEW7oxszfH6cPCaupNAddMhQc4C/af6GHX8HnqfPDk27/yBQI+\n' +
-        'yBBvIanGgxv9c9wBbmcIaCEWJcsLp3HzXSYHmjiqkViXwCpYfkoV3Ns2m8bp+KCO\n' +
-        'y9XmcCKRaXkt237qmoxoh2sGmBHk2UlQtOsMC0aUQ4d7teAJG0q6pbyZEiPyKZY1\n' +
-        'XR/UVxMJL0Q4iVpcRS1kaNCMfqS2smbLJeNdsan8pkw1dvPhcaVTb7CvjhJtjztF\n' +
-        'YfDzAI5794qMlWxwilKMmUvDlPPOTen8NNHkLwWvyFCH7Doh\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEFjCCAv6gAwIBAgIJAMzYZJ+R9NBVMA0GCSqGSIb3DQEBCwUAMIGXMQswCQYD\n' +
-        'VQQGEwJVUzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEi\n' +
-        'MCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1h\n' +
-        'em9uIFJEUzEoMCYGA1UEAwwfQW1hem9uIFJEUyBQcmV2aWV3IFJvb3QgMjAxOSBD\n' +
-        'QTAeFw0xOTA4MjEyMjI5NDlaFw0yNDA4MjEyMjI5NDlaMIGXMQswCQYDVQQGEwJV\n' +
-        'UzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\n' +
-        'CgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\n' +
-        'UzEoMCYGA1UEAwwfQW1hem9uIFJEUyBQcmV2aWV3IFJvb3QgMjAxOSBDQTCCASIw\n' +
-        'DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7kkS6vjgKKQTPynC2NjdN5aPPV\n' +
-        'O71G0JJS/2ARVBVJd93JLiGovVJilfWYfwZCs4gTRSSjrUD4D4HyqCd6A+eEEtJq\n' +
-        'M0DEC7i0dC+9WNTsPszuB206Jy2IUmxZMIKJAA1NHSbIMjB+b6/JhbSUi7nKdbR/\n' +
-        'brj83bF+RoSA+ogrgX7mQbxhmFcoZN9OGaJgYKsKWUt5Wqv627KkGodUK8mDepgD\n' +
-        'S3ZfoRQRx3iceETpcmHJvaIge6+vyDX3d9Z22jmvQ4AKv3py2CmU2UwuhOltFDwB\n' +
-        '0ddtb39vgwrJxaGfiMRHpEP1DfNLWHAnA69/pgZPwIggidS+iBPUhgucMp8CAwEA\n' +
-        'AaNjMGEwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n' +
-        'FGnTGpQuQ2H/DZlXMQijZEhjs7TdMB8GA1UdIwQYMBaAFGnTGpQuQ2H/DZlXMQij\n' +
-        'ZEhjs7TdMA0GCSqGSIb3DQEBCwUAA4IBAQC3xz1vQvcXAfpcZlngiRWeqU8zQAMQ\n' +
-        'LZPCFNv7PVk4pmqX+ZiIRo4f9Zy7TrOVcboCnqmP/b/mNq0gVF4O+88jwXJZD+f8\n' +
-        '/RnABMZcnGU+vK0YmxsAtYU6TIb1uhRFmbF8K80HHbj9vSjBGIQdPCbvmR2zY6VJ\n' +
-        'BYM+w9U9hp6H4DVMLKXPc1bFlKA5OBTgUtgkDibWJKFOEPW3UOYwp9uq6pFoN0AO\n' +
-        'xMTldqWFsOF3bJIlvOY0c/1EFZXu3Ns6/oCP//Ap9vumldYMUZWmbK+gK33FPOXV\n' +
-        '8BQ6jNC29icv7lLDpRPwjibJBXX+peDR5UK4FdYcswWEB1Tix5X8dYu6\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZUxCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSYwJAYDVQQDDB1BbWF6b24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQTAeFw0xOTEw\n' +
-        'MjgxODA2NTNaFw0yNDEwMjgxODA2NTNaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UE\n' +
-        'CAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9u\n' +
-        'IFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UE\n' +
-        'AwwYQW1hem9uIFJEUyBhZi1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\n' +
-        'AQ8AMIIBCgKCAQEAvtV1OqmFa8zCVQSKOvPUJERLVFtd4rZmDpImc5rIoeBk7w/P\n' +
-        '9lcKUJjO8R/w1a2lJXx3oQ81tiY0Piw6TpT62YWVRMWrOw8+Vxq1dNaDSFp9I8d0\n' +
-        'UHillSSbOk6FOrPDp+R6AwbGFqUDebbN5LFFoDKbhNmH1BVS0a6YNKpGigLRqhka\n' +
-        'cClPslWtPqtjbaP3Jbxl26zWzLo7OtZl98dR225pq8aApNBwmtgA7Gh60HK/cX0t\n' +
-        '32W94n8D+GKSg6R4MKredVFqRTi9hCCNUu0sxYPoELuM+mHiqB5NPjtm92EzCWs+\n' +
-        '+vgWhMc6GxG+82QSWx1Vj8sgLqtE/vLrWddf5QIDAQABo2YwZDAOBgNVHQ8BAf8E\n' +
-        'BAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUuLB4gYVJrSKJj/Gz\n' +
-        'pqc6yeA+RcAwHwYDVR0jBBgwFoAUEEi/WWMcBJsoGXg+EZwkQ0MscZQwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBABauYOZxUhe9/RhzGJ8MsWCz8eKcyDVd4FCnY6Qh+9wcmYNT\n' +
-        'LtnD88LACtJKb/b81qYzcB0Em6+zVJ3Z9jznfr6buItE6es9wAoja22Xgv44BTHL\n' +
-        'rimbgMwpTt3uEMXDffaS0Ww6YWb3pSE0XYI2ISMWz+xRERRf+QqktSaL39zuiaW5\n' +
-        'tfZMre+YhohRa/F0ZQl3RCd6yFcLx4UoSPqQsUl97WhYzwAxZZfwvLJXOc4ATt3u\n' +
-        'VlCUylNDkaZztDJc/yN5XQoK9W5nOt2cLu513MGYKbuarQr8f+gYU8S+qOyuSRSP\n' +
-        'NRITzwCRVnsJE+2JmcRInn/NcanB7uOGqTvJ9+c=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZUxCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSYwJAYDVQQDDB1BbWF6b24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQTAeFw0xOTEw\n' +
-        'MzAyMDIxMzBaFw0yNDEwMzAyMDIxMzBaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UE\n' +
-        'CAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9u\n' +
-        'IFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UE\n' +
-        'AwwYQW1hem9uIFJEUyBldS1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\n' +
-        'AQ8AMIIBCgKCAQEAtEyjYcajx6xImJn8Vz1zjdmL4ANPgQXwF7+tF7xccmNAZETb\n' +
-        'bzb3I9i5fZlmrRaVznX+9biXVaGxYzIUIR3huQ3Q283KsDYnVuGa3mk690vhvJbB\n' +
-        'QIPgKa5mVwJppnuJm78KqaSpi0vxyCPe3h8h6LLFawVyWrYNZ4okli1/U582eef8\n' +
-        'RzJp/Ear3KgHOLIiCdPDF0rjOdCG1MOlDLixVnPn9IYOciqO+VivXBg+jtfc5J+L\n' +
-        'AaPm0/Yx4uELt1tkbWkm4BvTU/gBOODnYziITZM0l6Fgwvbwgq5duAtKW+h031lC\n' +
-        '37rEvrclqcp4wrsUYcLAWX79ZyKIlRxcAdvEhQIDAQABo2YwZDAOBgNVHQ8BAf8E\n' +
-        'BAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU7zPyc0azQxnBCe7D\n' +
-        'b9KAadH1QSEwHwYDVR0jBBgwFoAUFBAFcgJe/BBuZiGeZ8STfpkgRYQwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAFGaNiYxg7yC/xauXPlaqLCtwbm2dKyK9nIFbF/7be8mk7Q3\n' +
-        'MOA0of1vGHPLVQLr6bJJpD9MAbUcm4cPAwWaxwcNpxOjYOFDaq10PCK4eRAxZWwF\n' +
-        'NJRIRmGsl8NEsMNTMCy8X+Kyw5EzH4vWFl5Uf2bGKOeFg0zt43jWQVOX6C+aL3Cd\n' +
-        'pRS5MhmYpxMG8irrNOxf4NVFE2zpJOCm3bn0STLhkDcV/ww4zMzObTJhiIb5wSWn\n' +
-        'EXKKWhUXuRt7A2y1KJtXpTbSRHQxE++69Go1tWhXtRiULCJtf7wF2Ksm0RR/AdXT\n' +
-        '1uR1vKyH5KBJPX3ppYkQDukoHTFR0CpB+G84NLo=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZUxCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSYwJAYDVQQDDB1BbWF6b24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQTAeFw0xOTA1\n' +
-        'MTAyMTU4NDNaFw0yNTA2MDExMjAwMDBaMIGQMQswCQYDVQQGEwJVUzETMBEGA1UE\n' +
-        'CAwKV2FzaGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9u\n' +
-        'IFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEhMB8GA1UE\n' +
-        'AwwYQW1hem9uIFJEUyBtZS1zb3V0aC0xIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC\n' +
-        'AQ8AMIIBCgKCAQEAudOYPZH+ihJAo6hNYMB5izPVBe3TYhnZm8+X3IoaaYiKtsp1\n' +
-        'JJhkTT0CEejYIQ58Fh4QrMUyWvU8qsdK3diNyQRoYLbctsBPgxBR1u07eUJDv38/\n' +
-        'C1JlqgHmMnMi4y68Iy7ymv50QgAMuaBqgEBRI1R6Lfbyrb2YvH5txjJyTVMwuCfd\n' +
-        'YPAtZVouRz0JxmnfsHyxjE+So56uOKTDuw++Ho4HhZ7Qveej7XB8b+PIPuroknd3\n' +
-        'FQB5RVbXRvt5ZcVD4F2fbEdBniF7FAF4dEiofVCQGQ2nynT7dZdEIPfPdH3n7ZmE\n' +
-        'lAOmwHQ6G83OsiHRBLnbp+QZRgOsjkHJxT20bQIDAQABo2YwZDAOBgNVHQ8BAf8E\n' +
-        'BAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUOEVDM7VomRH4HVdA\n' +
-        'QvIMNq2tXOcwHwYDVR0jBBgwFoAU54cfDjgwBx4ycBH8+/r8WXdaiqYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAHhvMssj+Th8IpNePU6RH0BiL6o9c437R3Q4IEJeFdYL+nZz\n' +
-        'PW/rELDPvLRUNMfKM+KzduLZ+l29HahxefejYPXtvXBlq/E/9czFDD4fWXg+zVou\n' +
-        'uDXhyrV4kNmP4S0eqsAP/jQHPOZAMFA4yVwO9hlqmePhyDnszCh9c1PfJSBh49+b\n' +
-        '4w7i/L3VBOMt8j3EKYvqz0gVfpeqhJwL4Hey8UbVfJRFJMJzfNHpePqtDRAY7yjV\n' +
-        'PYquRaV2ab/E+/7VFkWMM4tazYz/qsYA2jSH+4xDHvYk8LnsbcrF9iuidQmEc5sb\n' +
-        'FgcWaSKG4DJjcI5k7AJLWcXyTDt21Ci43LE+I9Q=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECDCCAvCgAwIBAgICVIYwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MDQxNzEz\n' +
-        'MDRaFw0yNDA4MjIxNzA4NTBaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEmMCQGA1UEAwwdQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n' +
-        'DwAwggEKAoIBAQDUYOz1hGL42yUCrcsMSOoU8AeD/3KgZ4q7gP+vAz1WnY9K/kim\n' +
-        'eWN/2Qqzlo3+mxSFQFyD4MyV3+CnCPnBl9Sh1G/F6kThNiJ7dEWSWBQGAB6HMDbC\n' +
-        'BaAsmUc1UIz8sLTL3fO+S9wYhA63Wun0Fbm/Rn2yk/4WnJAaMZcEtYf6e0KNa0LM\n' +
-        'p/kN/70/8cD3iz3dDR8zOZFpHoCtf0ek80QqTich0A9n3JLxR6g6tpwoYviVg89e\n' +
-        'qCjQ4axxOkWWeusLeTJCcY6CkVyFvDAKvcUl1ytM5AiaUkXblE7zDFXRM4qMMRdt\n' +
-        'lPm8d3pFxh0fRYk8bIKnpmtOpz3RIctDrZZxAgMBAAGjZjBkMA4GA1UdDwEB/wQE\n' +
-        'AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBT99wKJftD3jb4sHoHG\n' +
-        'i3uGlH6W6TAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n' +
-        '9w0BAQsFAAOCAQEAZ17hhr3dII3hUfuHQ1hPWGrpJOX/G9dLzkprEIcCidkmRYl+\n' +
-        'hu1Pe3caRMh/17+qsoEErmnVq5jNY9X1GZL04IZH8YbHc7iRHw3HcWAdhN8633+K\n' +
-        'jYEB2LbJ3vluCGnCejq9djDb6alOugdLMJzxOkHDhMZ6/gYbECOot+ph1tQuZXzD\n' +
-        'tZ7prRsrcuPBChHlPjmGy8M9z8u+kF196iNSUGC4lM8vLkHM7ycc1/ZOwRq9aaTe\n' +
-        'iOghbQQyAEe03MWCyDGtSmDfr0qEk+CHN+6hPiaL8qKt4s+V9P7DeK4iW08ny8Ox\n' +
-        'AVS7u0OK/5+jKMAMrKwpYrBydOjTUTHScocyNw==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBzCCAu+gAwIBAgICQ2QwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MDUxODQ2\n' +
-        'MjlaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\n' +
-        'em9uIFJEUyBzYS1lYXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n' +
-        'ADCCAQoCggEBAMMvR+ReRnOzqJzoaPipNTt1Z2VA968jlN1+SYKUrYM3No+Vpz0H\n' +
-        'M6Tn0oYB66ByVsXiGc28ulsqX1HbHsxqDPwvQTKvO7SrmDokoAkjJgLocOLUAeld\n' +
-        '5AwvUjxGRP6yY90NV7X786MpnYb2Il9DIIaV9HjCmPt+rjy2CZjS0UjPjCKNfB8J\n' +
-        'bFjgW6GGscjeyGb/zFwcom5p4j0rLydbNaOr9wOyQrtt3ZQWLYGY9Zees/b8pmcc\n' +
-        'Jt+7jstZ2UMV32OO/kIsJ4rMUn2r/uxccPwAc1IDeRSSxOrnFKhW3Cu69iB3bHp7\n' +
-        'JbawY12g7zshE4I14sHjv3QoXASoXjx4xgMCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\n' +
-        'AgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI1Fc/Ql2jx+oJPgBVYq\n' +
-        'ccgP0pQ8MB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\n' +
-        'DQEBCwUAA4IBAQB4VVVabVp70myuYuZ3vltQIWqSUMhkaTzehMgGcHjMf9iLoZ/I\n' +
-        '93KiFUSGnek5cRePyS9wcpp0fcBT3FvkjpUdCjVtdttJgZFhBxgTd8y26ImdDDMR\n' +
-        '4+BUuhI5msvjL08f+Vkkpu1GQcGmyFVPFOy/UY8iefu+QyUuiBUnUuEDd49Hw0Fn\n' +
-        '/kIPII6Vj82a2mWV/Q8e+rgN8dIRksRjKI03DEoP8lhPlsOkhdwU6Uz9Vu6NOB2Q\n' +
-        'Ls1kbcxAc7cFSyRVJEhh12Sz9d0q/CQSTFsVJKOjSNQBQfVnLz1GwO/IieUEAr4C\n' +
-        'jkTntH0r1LX5b/GwN4R887LvjAEdTbg1his7\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECDCCAvCgAwIBAgIDAIkHMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\n' +
-        'UzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\n' +
-        'CgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\n' +
-        'UzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTA2MTc0\n' +
-        'MDIxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\n' +
-        'c2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\n' +
-        'U2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\n' +
-        'YXpvbiBSRFMgdXMtd2VzdC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n' +
-        'DwAwggEKAoIBAQDD2yzbbAl77OofTghDMEf624OvU0eS9O+lsdO0QlbfUfWa1Kd6\n' +
-        '0WkgjkLZGfSRxEHMCnrv4UPBSK/Qwn6FTjkDLgemhqBtAnplN4VsoDL+BkRX4Wwq\n' +
-        '/dSQJE2b+0hm9w9UMVGFDEq1TMotGGTD2B71eh9HEKzKhGzqiNeGsiX4VV+LJzdH\n' +
-        'uM23eGisNqmd4iJV0zcAZ+Gbh2zK6fqTOCvXtm7Idccv8vZZnyk1FiWl3NR4WAgK\n' +
-        'AkvWTIoFU3Mt7dIXKKClVmvssG8WHCkd3Xcb4FHy/G756UZcq67gMMTX/9fOFM/v\n' +
-        'l5C0+CHl33Yig1vIDZd+fXV1KZD84dEJfEvHAgMBAAGjZjBkMA4GA1UdDwEB/wQE\n' +
-        'AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBR+ap20kO/6A7pPxo3+\n' +
-        'T3CfqZpQWjAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n' +
-        '9w0BAQsFAAOCAQEAHCJky2tPjPttlDM/RIqExupBkNrnSYnOK4kr9xJ3sl8UF2DA\n' +
-        'PAnYsjXp3rfcjN/k/FVOhxwzi3cXJF/2Tjj39Bm/OEfYTOJDNYtBwB0VVH4ffa/6\n' +
-        'tZl87jaIkrxJcreeeHqYMnIxeN0b/kliyA+a5L2Yb0VPjt9INq34QDc1v74FNZ17\n' +
-        '4z8nr1nzg4xsOWu0Dbjo966lm4nOYIGBRGOKEkHZRZ4mEiMgr3YLkv8gSmeitx57\n' +
-        'Z6dVemNtUic/LVo5Iqw4n3TBS0iF2C1Q1xT/s3h+0SXZlfOWttzSluDvoMv5PvCd\n' +
-        'pFjNn+aXLAALoihL1MJSsxydtsLjOBro5eK0Vw==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEDDCCAvSgAwIBAgICOFAwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTAxNzQ2\n' +
-        'MjFaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\n' +
-        'em9uIFJEUyBhcC1ub3J0aGVhc3QtMiAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\n' +
-        'AAOCAQ8AMIIBCgKCAQEAzU72e6XbaJbi4HjJoRNjKxzUEuChKQIt7k3CWzNnmjc5\n' +
-        '8I1MjCpa2W1iw1BYVysXSNSsLOtUsfvBZxi/1uyMn5ZCaf9aeoA9UsSkFSZBjOCN\n' +
-        'DpKPCmfV1zcEOvJz26+1m8WDg+8Oa60QV0ou2AU1tYcw98fOQjcAES0JXXB80P2s\n' +
-        '3UfkNcnDz+l4k7j4SllhFPhH6BQ4lD2NiFAP4HwoG6FeJUn45EPjzrydxjq6v5Fc\n' +
-        'cQ8rGuHADVXotDbEhaYhNjIrsPL+puhjWfhJjheEw8c4whRZNp6gJ/b6WEes/ZhZ\n' +
-        'h32DwsDsZw0BfRDUMgUn8TdecNexHUw8vQWeC181hwIDAQABo2YwZDAOBgNVHQ8B\n' +
-        'Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUwW9bWgkWkr0U\n' +
-        'lrOsq2kvIdrECDgwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\n' +
-        'KoZIhvcNAQELBQADggEBAEugF0Gj7HVhX0ehPZoGRYRt3PBuI2YjfrrJRTZ9X5wc\n' +
-        '9T8oHmw07mHmNy1qqWvooNJg09bDGfB0k5goC2emDiIiGfc/kvMLI7u+eQOoMKj6\n' +
-        'mkfCncyRN3ty08Po45vTLBFZGUvtQmjM6yKewc4sXiASSBmQUpsMbiHRCL72M5qV\n' +
-        'obcJOjGcIdDTmV1BHdWT+XcjynsGjUqOvQWWhhLPrn4jWe6Xuxll75qlrpn3IrIx\n' +
-        'CRBv/5r7qbcQJPOgwQsyK4kv9Ly8g7YT1/vYBlR3cRsYQjccw5ceWUj2DrMVWhJ4\n' +
-        'prf+E3Aa4vYmLLOUUvKnDQ1k3RGNu56V0tonsQbfsaM=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECjCCAvKgAwIBAgICEzUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTAyMDUy\n' +
-        'MjVaFw0yNDA4MjIxNzA4NTBaMIGXMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEoMCYGA1UEAwwfQW1h\n' +
-        'em9uIFJEUyBjYS1jZW50cmFsLTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\n' +
-        'ggEPADCCAQoCggEBAOxHqdcPSA2uBjsCP4DLSlqSoPuQ/X1kkJLusVRKiQE2zayB\n' +
-        'viuCBt4VB9Qsh2rW3iYGM+usDjltGnI1iUWA5KHcvHszSMkWAOYWLiMNKTlg6LCp\n' +
-        'XnE89tvj5dIH6U8WlDvXLdjB/h30gW9JEX7S8supsBSci2GxEzb5mRdKaDuuF/0O\n' +
-        'qvz4YE04pua3iZ9QwmMFuTAOYzD1M72aOpj+7Ac+YLMM61qOtU+AU6MndnQkKoQi\n' +
-        'qmUN2A9IFaqHFzRlSdXwKCKUA4otzmz+/N3vFwjb5F4DSsbsrMfjeHMo6o/nb6Nh\n' +
-        'YDb0VJxxPee6TxSuN7CQJ2FxMlFUezcoXqwqXD0CAwEAAaNmMGQwDgYDVR0PAQH/\n' +
-        'BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFDGGpon9WfIpsggE\n' +
-        'CxHq8hZ7E2ESMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqG\n' +
-        'SIb3DQEBCwUAA4IBAQAvpeQYEGZvoTVLgV9rd2+StPYykMsmFjWQcyn3dBTZRXC2\n' +
-        'lKq7QhQczMAOhEaaN29ZprjQzsA2X/UauKzLR2Uyqc2qOeO9/YOl0H3qauo8C/W9\n' +
-        'r8xqPbOCDLEXlOQ19fidXyyEPHEq5WFp8j+fTh+s8WOx2M7IuC0ANEetIZURYhSp\n' +
-        'xl9XOPRCJxOhj7JdelhpweX0BJDNHeUFi0ClnFOws8oKQ7sQEv66d5ddxqqZ3NVv\n' +
-        'RbCvCtEutQMOUMIuaygDlMn1anSM8N7Wndx8G6+Uy67AnhjGx7jw/0YPPxopEj6x\n' +
-        'JXP8j0sJbcT9K/9/fPVLNT25RvQ/93T2+IQL4Ca2\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBzCCAu+gAwIBAgICYpgwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTExNzMx\n' +
-        'NDhaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\n' +
-        'em9uIFJEUyBldS13ZXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n' +
-        'ADCCAQoCggEBAMk3YdSZ64iAYp6MyyKtYJtNzv7zFSnnNf6vv0FB4VnfITTMmOyZ\n' +
-        'LXqKAT2ahZ00hXi34ewqJElgU6eUZT/QlzdIu359TEZyLVPwURflL6SWgdG01Q5X\n' +
-        'O++7fSGcBRyIeuQWs9FJNIIqK8daF6qw0Rl5TXfu7P9dBc3zkgDXZm2DHmxGDD69\n' +
-        '7liQUiXzoE1q2Z9cA8+jirDioJxN9av8hQt12pskLQumhlArsMIhjhHRgF03HOh5\n' +
-        'tvi+RCfihVOxELyIRTRpTNiIwAqfZxxTWFTgfn+gijTmd0/1DseAe82aYic8JbuS\n' +
-        'EMbrDduAWsqrnJ4GPzxHKLXX0JasCUcWyMECAwEAAaNmMGQwDgYDVR0PAQH/BAQD\n' +
-        'AgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFPLtsq1NrwJXO13C9eHt\n' +
-        'sLY11AGwMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\n' +
-        'DQEBCwUAA4IBAQAnWBKj5xV1A1mYd0kIgDdkjCwQkiKF5bjIbGkT3YEFFbXoJlSP\n' +
-        '0lZZ/hDaOHI8wbLT44SzOvPEEmWF9EE7SJzkvSdQrUAWR9FwDLaU427ALI3ngNHy\n' +
-        'lGJ2hse1fvSRNbmg8Sc9GBv8oqNIBPVuw+AJzHTacZ1OkyLZrz1c1QvwvwN2a+Jd\n' +
-        'vH0V0YIhv66llKcYDMUQJAQi4+8nbRxXWv6Gq3pvrFoorzsnkr42V3JpbhnYiK+9\n' +
-        'nRKd4uWl62KRZjGkfMbmsqZpj2fdSWMY1UGyN1k+kDmCSWYdrTRDP0xjtIocwg+A\n' +
-        'J116n4hV/5mbA0BaPiS2krtv17YAeHABZcvz\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECjCCAvKgAwIBAgICV2YwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTExOTM2\n' +
-        'MjBaFw0yNDA4MjIxNzA4NTBaMIGXMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEoMCYGA1UEAwwfQW1h\n' +
-        'em9uIFJEUyBldS1jZW50cmFsLTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQAD\n' +
-        'ggEPADCCAQoCggEBAMEx54X2pHVv86APA0RWqxxRNmdkhAyp2R1cFWumKQRofoFv\n' +
-        'n+SPXdkpIINpMuEIGJANozdiEz7SPsrAf8WHyD93j/ZxrdQftRcIGH41xasetKGl\n' +
-        'I67uans8d+pgJgBKGb/Z+B5m+UsIuEVekpvgpwKtmmaLFC/NCGuSsJoFsRqoa6Gh\n' +
-        'm34W6yJoY87UatddCqLY4IIXaBFsgK9Q/wYzYLbnWM6ZZvhJ52VMtdhcdzeTHNW0\n' +
-        '5LGuXJOF7Ahb4JkEhoo6TS2c0NxB4l4MBfBPgti+O7WjR3FfZHpt18A6Zkq6A2u6\n' +
-        'D/oTSL6c9/3sAaFTFgMyL3wHb2YlW0BPiljZIqECAwEAAaNmMGQwDgYDVR0PAQH/\n' +
-        'BAQDAgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFOcAToAc6skWffJa\n' +
-        'TnreaswAfrbcMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqG\n' +
-        'SIb3DQEBCwUAA4IBAQA1d0Whc1QtspK496mFWfFEQNegLh0a9GWYlJm+Htcj5Nxt\n' +
-        'DAIGXb+8xrtOZFHmYP7VLCT5Zd2C+XytqseK/+s07iAr0/EPF+O2qcyQWMN5KhgE\n' +
-        'cXw2SwuP9FPV3i+YAm11PBVeenrmzuk9NrdHQ7TxU4v7VGhcsd2C++0EisrmquWH\n' +
-        'mgIfmVDGxphwoES52cY6t3fbnXmTkvENvR+h3rj+fUiSz0aSo+XZUGHPgvuEKM/W\n' +
-        'CBD9Smc9CBoBgvy7BgHRgRUmwtABZHFUIEjHI5rIr7ZvYn+6A0O6sogRfvVYtWFc\n' +
-        'qpyrW1YX8mD0VlJ8fGKM3G+aCOsiiPKDV/Uafrm+\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECDCCAvCgAwIBAgICGAcwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTIxODE5\n' +
-        'NDRaFw0yNDA4MjIxNzA4NTBaMIGVMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEmMCQGA1UEAwwdQW1h\n' +
-        'em9uIFJEUyBldS1ub3J0aC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n' +
-        'DwAwggEKAoIBAQCiIYnhe4UNBbdBb/nQxl5giM0XoVHWNrYV5nB0YukA98+TPn9v\n' +
-        'Aoj1RGYmtryjhrf01Kuv8SWO+Eom95L3zquoTFcE2gmxCfk7bp6qJJ3eHOJB+QUO\n' +
-        'XsNRh76fwDzEF1yTeZWH49oeL2xO13EAx4PbZuZpZBttBM5zAxgZkqu4uWQczFEs\n' +
-        'JXfla7z2fvWmGcTagX10O5C18XaFroV0ubvSyIi75ue9ykg/nlFAeB7O0Wxae88e\n' +
-        'uhiBEFAuLYdqWnsg3459NfV8Yi1GnaitTym6VI3tHKIFiUvkSiy0DAlAGV2iiyJE\n' +
-        'q+DsVEO4/hSINJEtII4TMtysOsYPpINqeEzRAgMBAAGjZjBkMA4GA1UdDwEB/wQE\n' +
-        'AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBRR0UpnbQyjnHChgmOc\n' +
-        'hnlc0PogzTAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n' +
-        '9w0BAQsFAAOCAQEAKJD4xVzSf4zSGTBJrmamo86jl1NHQxXUApAZuBZEc8tqC6TI\n' +
-        'T5CeoSr9CMuVC8grYyBjXblC4OsM5NMvmsrXl/u5C9dEwtBFjo8mm53rOOIm1fxl\n' +
-        'I1oYB/9mtO9ANWjkykuLzWeBlqDT/i7ckaKwalhLODsRDO73vRhYNjsIUGloNsKe\n' +
-        'pxw3dzHwAZx4upSdEVG4RGCZ1D0LJ4Gw40OfD69hfkDfRVVxKGrbEzqxXRvovmDc\n' +
-        'tKLdYZO/6REoca36v4BlgIs1CbUXJGLSXUwtg7YXGLSVBJ/U0+22iGJmBSNcoyUN\n' +
-        'cjPFD9JQEhDDIYYKSGzIYpvslvGc4T5ISXFiuQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBzCCAu+gAwIBAgICZIEwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTIyMTMy\n' +
-        'MzJaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\n' +
-        'em9uIFJEUyBldS13ZXN0LTIgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n' +
-        'ADCCAQoCggEBALGiwqjiF7xIjT0Sx7zB3764K2T2a1DHnAxEOr+/EIftWKxWzT3u\n' +
-        'PFwS2eEZcnKqSdRQ+vRzonLBeNLO4z8aLjQnNbkizZMBuXGm4BqRm1Kgq3nlLDQn\n' +
-        '7YqdijOq54SpShvR/8zsO4sgMDMmHIYAJJOJqBdaus2smRt0NobIKc0liy7759KB\n' +
-        '6kmQ47Gg+kfIwxrQA5zlvPLeQImxSoPi9LdbRoKvu7Iot7SOa+jGhVBh3VdqndJX\n' +
-        '7tm/saj4NE375csmMETFLAOXjat7zViMRwVorX4V6AzEg1vkzxXpA9N7qywWIT5Y\n' +
-        'fYaq5M8i6vvLg0CzrH9fHORtnkdjdu1y+0MCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\n' +
-        'AgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFFOhOx1yt3Z7mvGB9jBv\n' +
-        '2ymdZwiOMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\n' +
-        'DQEBCwUAA4IBAQBehqY36UGDvPVU9+vtaYGr38dBbp+LzkjZzHwKT1XJSSUc2wqM\n' +
-        'hnCIQKilonrTIvP1vmkQi8qHPvDRtBZKqvz/AErW/ZwQdZzqYNFd+BmOXaeZWV0Q\n' +
-        'oHtDzXmcwtP8aUQpxN0e1xkWb1E80qoy+0uuRqb/50b/R4Q5qqSfJhkn6z8nwB10\n' +
-        '7RjLtJPrK8igxdpr3tGUzfAOyiPrIDncY7UJaL84GFp7WWAkH0WG3H8Y8DRcRXOU\n' +
-        'mqDxDLUP3rNuow3jnGxiUY+gGX5OqaZg4f4P6QzOSmeQYs6nLpH0PiN00+oS1BbD\n' +
-        'bpWdZEttILPI+vAYkU4QuBKKDjJL6HbSd+cn\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECDCCAvCgAwIBAgIDAIVCMA0GCSqGSIb3DQEBCwUAMIGPMQswCQYDVQQGEwJV\n' +
-        'UzEQMA4GA1UEBwwHU2VhdHRsZTETMBEGA1UECAwKV2FzaGluZ3RvbjEiMCAGA1UE\n' +
-        'CgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJE\n' +
-        'UzEgMB4GA1UEAwwXQW1hem9uIFJEUyBSb290IDIwMTkgQ0EwHhcNMTkwOTEzMTcw\n' +
-        'NjQxWhcNMjQwODIyMTcwODUwWjCBlDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCldh\n' +
-        'c2hpbmd0b24xEDAOBgNVBAcMB1NlYXR0bGUxIjAgBgNVBAoMGUFtYXpvbiBXZWIg\n' +
-        'U2VydmljZXMsIEluYy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxJTAjBgNVBAMMHEFt\n' +
-        'YXpvbiBSRFMgdXMtZWFzdC0yIDIwMTkgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB\n' +
-        'DwAwggEKAoIBAQDE+T2xYjUbxOp+pv+gRA3FO24+1zCWgXTDF1DHrh1lsPg5k7ht\n' +
-        '2KPYzNc+Vg4E+jgPiW0BQnA6jStX5EqVh8BU60zELlxMNvpg4KumniMCZ3krtMUC\n' +
-        'au1NF9rM7HBh+O+DYMBLK5eSIVt6lZosOb7bCi3V6wMLA8YqWSWqabkxwN4w0vXI\n' +
-        '8lu5uXXFRemHnlNf+yA/4YtN4uaAyd0ami9+klwdkZfkrDOaiy59haOeBGL8EB/c\n' +
-        'dbJJlguHH5CpCscs3RKtOOjEonXnKXldxarFdkMzi+aIIjQ8GyUOSAXHtQHb3gZ4\n' +
-        'nS6Ey0CMlwkB8vUObZU9fnjKJcL5QCQqOfwvAgMBAAGjZjBkMA4GA1UdDwEB/wQE\n' +
-        'AwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBQUPuRHohPxx4VjykmH\n' +
-        '6usGrLL1ETAfBgNVHSMEGDAWgBRzX2DYvMsDmPQrFzQuNlqmYP+8HzANBgkqhkiG\n' +
-        '9w0BAQsFAAOCAQEAUdR9Vb3y33Yj6X6KGtuthZ08SwjImVQPtknzpajNE5jOJAh8\n' +
-        'quvQnU9nlnMO85fVDU1Dz3lLHGJ/YG1pt1Cqq2QQ200JcWCvBRgdvH6MjHoDQpqZ\n' +
-        'HvQ3vLgOGqCLNQKFuet9BdpsHzsctKvCVaeBqbGpeCtt3Hh/26tgx0rorPLw90A2\n' +
-        'V8QSkZJjlcKkLa58N5CMM8Xz8KLWg3MZeT4DmlUXVCukqK2RGuP2L+aME8dOxqNv\n' +
-        'OnOz1zrL5mR2iJoDpk8+VE/eBDmJX40IJk6jBjWoxAO/RXq+vBozuF5YHN1ujE92\n' +
-        'tO8HItgTp37XT8bJBAiAnt5mxw+NLSqtxk2QdQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEDDCCAvSgAwIBAgICY4kwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTMyMDEx\n' +
-        'NDJaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aGVhc3QtMSAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\n' +
-        'AAOCAQ8AMIIBCgKCAQEAr5u9OuLL/OF/fBNUX2kINJLzFl4DnmrhnLuSeSnBPgbb\n' +
-        'qddjf5EFFJBfv7IYiIWEFPDbDG5hoBwgMup5bZDbas+ZTJTotnnxVJTQ6wlhTmns\n' +
-        'eHECcg2pqGIKGrxZfbQhlj08/4nNAPvyYCTS0bEcmQ1emuDPyvJBYDDLDU6AbCB5\n' +
-        '6Z7YKFQPTiCBblvvNzchjLWF9IpkqiTsPHiEt21sAdABxj9ityStV3ja/W9BfgxH\n' +
-        'wzABSTAQT6FbDwmQMo7dcFOPRX+hewQSic2Rn1XYjmNYzgEHisdUsH7eeXREAcTw\n' +
-        '61TRvaLH8AiOWBnTEJXPAe6wYfrcSd1pD0MXpoB62wIDAQABo2YwZDAOBgNVHQ8B\n' +
-        'Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUytwMiomQOgX5\n' +
-        'Ichd+2lDWRUhkikwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\n' +
-        'KoZIhvcNAQELBQADggEBACf6lRDpfCD7BFRqiWM45hqIzffIaysmVfr+Jr+fBTjP\n' +
-        'uYe/ba1omSrNGG23bOcT9LJ8hkQJ9d+FxUwYyICQNWOy6ejicm4z0C3VhphbTPqj\n' +
-        'yjpt9nG56IAcV8BcRJh4o/2IfLNzC/dVuYJV8wj7XzwlvjysenwdrJCoLadkTr1h\n' +
-        'eIdG6Le07sB9IxrGJL9e04afk37h7c8ESGSE4E+oS4JQEi3ATq8ne1B9DQ9SasXi\n' +
-        'IRmhNAaISDzOPdyLXi9N9V9Lwe/DHcja7hgLGYx3UqfjhLhOKwp8HtoZORixAmOI\n' +
-        'HfILgNmwyugAbuZoCazSKKBhQ0wgO0WZ66ZKTMG8Oho=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBzCCAu+gAwIBAgICUYkwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTYxODIx\n' +
-        'MTVaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\n' +
-        'em9uIFJEUyB1cy13ZXN0LTIgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n' +
-        'ADCCAQoCggEBANCEZBZyu6yJQFZBJmSUZfSZd3Ui2gitczMKC4FLr0QzkbxY+cLa\n' +
-        'uVONIOrPt4Rwi+3h/UdnUg917xao3S53XDf1TDMFEYp4U8EFPXqCn/GXBIWlU86P\n' +
-        'PvBN+gzw3nS+aco7WXb+woTouvFVkk8FGU7J532llW8o/9ydQyDIMtdIkKTuMfho\n' +
-        'OiNHSaNc+QXQ32TgvM9A/6q7ksUoNXGCP8hDOkSZ/YOLiI5TcdLh/aWj00ziL5bj\n' +
-        'pvytiMZkilnc9dLY9QhRNr0vGqL0xjmWdoEXz9/OwjmCihHqJq+20MJPsvFm7D6a\n' +
-        '2NKybR9U+ddrjb8/iyLOjURUZnj5O+2+OPcCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\n' +
-        'AgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFEBxMBdv81xuzqcK5TVu\n' +
-        'pHj+Aor8MB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\n' +
-        'DQEBCwUAA4IBAQBZkfiVqGoJjBI37aTlLOSjLcjI75L5wBrwO39q+B4cwcmpj58P\n' +
-        '3sivv+jhYfAGEbQnGRzjuFoyPzWnZ1DesRExX+wrmHsLLQbF2kVjLZhEJMHF9eB7\n' +
-        'GZlTPdTzHErcnuXkwA/OqyXMpj9aghcQFuhCNguEfnROY9sAoK2PTfnTz9NJHL+Q\n' +
-        'UpDLEJEUfc0GZMVWYhahc0x38ZnSY2SKacIPECQrTI0KpqZv/P+ijCEcMD9xmYEb\n' +
-        'jL4en+XKS1uJpw5fIU5Sj0MxhdGstH6S84iAE5J3GM3XHklGSFwwqPYvuTXvANH6\n' +
-        'uboynxRgSae59jIlAK6Jrr6GWMwQRbgcaAlW\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEDDCCAvSgAwIBAgICEkYwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTYxOTUz\n' +
-        'NDdaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aGVhc3QtMiAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\n' +
-        'AAOCAQ8AMIIBCgKCAQEAufodI2Flker8q7PXZG0P0vmFSlhQDw907A6eJuF/WeMo\n' +
-        'GHnll3b4S6nC3oRS3nGeRMHbyU2KKXDwXNb3Mheu+ox+n5eb/BJ17eoj9HbQR1cd\n' +
-        'gEkIciiAltf8gpMMQH4anP7TD+HNFlZnP7ii3geEJB2GGXSxgSWvUzH4etL67Zmn\n' +
-        'TpGDWQMB0T8lK2ziLCMF4XAC/8xDELN/buHCNuhDpxpPebhct0T+f6Arzsiswt2j\n' +
-        '7OeNeLLZwIZvVwAKF7zUFjC6m7/VmTQC8nidVY559D6l0UhhU0Co/txgq3HVsMOH\n' +
-        'PbxmQUwJEKAzQXoIi+4uZzHFZrvov/nDTNJUhC6DqwIDAQABo2YwZDAOBgNVHQ8B\n' +
-        'Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUwaZpaCme+EiV\n' +
-        'M5gcjeHZSTgOn4owHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\n' +
-        'KoZIhvcNAQELBQADggEBAAR6a2meCZuXO2TF9bGqKGtZmaah4pH2ETcEVUjkvXVz\n' +
-        'sl+ZKbYjrun+VkcMGGKLUjS812e7eDF726ptoku9/PZZIxlJB0isC/0OyixI8N4M\n' +
-        'NsEyvp52XN9QundTjkl362bomPnHAApeU0mRbMDRR2JdT70u6yAzGLGsUwMkoNnw\n' +
-        '1VR4XKhXHYGWo7KMvFrZ1KcjWhubxLHxZWXRulPVtGmyWg/MvE6KF+2XMLhojhUL\n' +
-        '+9jB3Fpn53s6KMx5tVq1x8PukHmowcZuAF8k+W4gk8Y68wIwynrdZrKRyRv6CVtR\n' +
-        'FZ8DeJgoNZT3y/GT254VqMxxfuy2Ccb/RInd16tEvVk=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEDDCCAvSgAwIBAgICOYIwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTcyMDA1\n' +
-        'MjlaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\n' +
-        'em9uIFJEUyBhcC1ub3J0aGVhc3QtMyAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\n' +
-        'AAOCAQ8AMIIBCgKCAQEA4dMak8W+XW8y/2F6nRiytFiA4XLwePadqWebGtlIgyCS\n' +
-        'kbug8Jv5w7nlMkuxOxoUeD4WhI6A9EkAn3r0REM/2f0aYnd2KPxeqS2MrtdxxHw1\n' +
-        'xoOxk2x0piNSlOz6yog1idsKR5Wurf94fvM9FdTrMYPPrDabbGqiBMsZZmoHLvA3\n' +
-        'Z+57HEV2tU0Ei3vWeGIqnNjIekS+E06KhASxrkNU5vi611UsnYZlSi0VtJsH4UGV\n' +
-        'LhnHl53aZL0YFO5mn/fzuNG/51qgk/6EFMMhaWInXX49Dia9FnnuWXwVwi6uX1Wn\n' +
-        '7kjoHi5VtmC8ZlGEHroxX2DxEr6bhJTEpcLMnoQMqwIDAQABo2YwZDAOBgNVHQ8B\n' +
-        'Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUsUI5Cb3SWB8+\n' +
-        'gv1YLN/ABPMdxSAwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\n' +
-        'KoZIhvcNAQELBQADggEBAJAF3E9PM1uzVL8YNdzb6fwJrxxqI2shvaMVmC1mXS+w\n' +
-        'G0zh4v2hBZOf91l1EO0rwFD7+fxoI6hzQfMxIczh875T6vUXePKVOCOKI5wCrDad\n' +
-        'zQbVqbFbdhsBjF4aUilOdtw2qjjs9JwPuB0VXN4/jY7m21oKEOcnpe36+7OiSPjN\n' +
-        'xngYewCXKrSRqoj3mw+0w/+exYj3Wsush7uFssX18av78G+ehKPIVDXptOCP/N7W\n' +
-        '8iKVNeQ2QGTnu2fzWsGUSvMGyM7yqT+h1ILaT//yQS8er511aHMLc142bD4D9VSy\n' +
-        'DgactwPDTShK/PXqhvNey9v/sKXm4XatZvwcc8KYlW4=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEDDCCAvSgAwIBAgICcEUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTgxNjU2\n' +
-        'MjBaFw0yNDA4MjIxNzA4NTBaMIGZMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzEqMCgGA1UEAwwhQW1h\n' +
-        'em9uIFJEUyBhcC1ub3J0aGVhc3QtMSAyMDE5IENBMIIBIjANBgkqhkiG9w0BAQEF\n' +
-        'AAOCAQ8AMIIBCgKCAQEAndtkldmHtk4TVQAyqhAvtEHSMb6pLhyKrIFved1WO3S7\n' +
-        '+I+bWwv9b2W/ljJxLq9kdT43bhvzonNtI4a1LAohS6bqyirmk8sFfsWT3akb+4Sx\n' +
-        '1sjc8Ovc9eqIWJCrUiSvv7+cS7ZTA9AgM1PxvHcsqrcUXiK3Jd/Dax9jdZE1e15s\n' +
-        'BEhb2OEPE+tClFZ+soj8h8Pl2Clo5OAppEzYI4LmFKtp1X/BOf62k4jviXuCSst3\n' +
-        'UnRJzE/CXtjmN6oZySVWSe0rQYuyqRl6//9nK40cfGKyxVnimB8XrrcxUN743Vud\n' +
-        'QQVU0Esm8OVTX013mXWQXJHP2c0aKkog8LOga0vobQIDAQABo2YwZDAOBgNVHQ8B\n' +
-        'Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQULmoOS1mFSjj+\n' +
-        'snUPx4DgS3SkLFYwHwYDVR0jBBgwFoAUc19g2LzLA5j0Kxc0LjZapmD/vB8wDQYJ\n' +
-        'KoZIhvcNAQELBQADggEBAAkVL2P1M2/G9GM3DANVAqYOwmX0Xk58YBHQu6iiQg4j\n' +
-        'b4Ky/qsZIsgT7YBsZA4AOcPKQFgGTWhe9pvhmXqoN3RYltN8Vn7TbUm/ZVDoMsrM\n' +
-        'gwv0+TKxW1/u7s8cXYfHPiTzVSJuOogHx99kBW6b2f99GbP7O1Sv3sLq4j6lVvBX\n' +
-        'Fiacf5LAWC925nvlTzLlBgIc3O9xDtFeAGtZcEtxZJ4fnGXiqEnN4539+nqzIyYq\n' +
-        'nvlgCzyvcfRAxwltrJHuuRu6Maw5AGcd2Y0saMhqOVq9KYKFKuD/927BTrbd2JVf\n' +
-        '2sGWyuPZPCk3gq+5pCjbD0c6DkhcMGI6WwxvM5V/zSM=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBzCCAu+gAwIBAgICJDQwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTgxNzAz\n' +
-        'MTVaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\n' +
-        'em9uIFJEUyBldS13ZXN0LTMgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n' +
-        'ADCCAQoCggEBAL9bL7KE0n02DLVtlZ2PL+g/BuHpMYFq2JnE2RgompGurDIZdjmh\n' +
-        '1pxfL3nT+QIVMubuAOy8InRfkRxfpxyjKYdfLJTPJG+jDVL+wDcPpACFVqoV7Prg\n' +
-        'pVYEV0lc5aoYw4bSeYFhdzgim6F8iyjoPnObjll9mo4XsHzSoqJLCd0QC+VG9Fw2\n' +
-        'q+GDRZrLRmVM2oNGDRbGpGIFg77aRxRapFZa8SnUgs2AqzuzKiprVH5i0S0M6dWr\n' +
-        'i+kk5epmTtkiDHceX+dP/0R1NcnkCPoQ9TglyXyPdUdTPPRfKCq12dftqll+u4mV\n' +
-        'ARdN6WFjovxax8EAP2OAUTi1afY+1JFMj+sCAwEAAaNmMGQwDgYDVR0PAQH/BAQD\n' +
-        'AgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLfhrbrO5exkCVgxW0x3\n' +
-        'Y2mAi8lNMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\n' +
-        'DQEBCwUAA4IBAQAigQ5VBNGyw+OZFXwxeJEAUYaXVoP/qrhTOJ6mCE2DXUVEoJeV\n' +
-        'SxScy/TlFA9tJXqmit8JH8VQ/xDL4ubBfeMFAIAo4WzNWDVoeVMqphVEcDWBHsI1\n' +
-        'AETWzfsapRS9yQekOMmxg63d/nV8xewIl8aNVTHdHYXMqhhik47VrmaVEok1UQb3\n' +
-        'O971RadLXIEbVd9tjY5bMEHm89JsZDnDEw1hQXBb67Elu64OOxoKaHBgUH8AZn/2\n' +
-        'zFsL1ynNUjOhCSAA15pgd1vjwc0YsBbAEBPcHBWYBEyME6NLNarjOzBl4FMtATSF\n' +
-        'wWCKRGkvqN8oxYhwR2jf2rR5Mu4DWkK5Q8Ep\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBzCCAu+gAwIBAgICJVUwDQYJKoZIhvcNAQELBQAwgY8xCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSAwHgYDVQQDDBdBbWF6b24gUkRTIFJvb3QgMjAxOSBDQTAeFw0xOTA5MTkxODE2\n' +
-        'NTNaFw0yNDA4MjIxNzA4NTBaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECAwKV2Fz\n' +
-        'aGluZ3RvbjEQMA4GA1UEBwwHU2VhdHRsZTEiMCAGA1UECgwZQW1hem9uIFdlYiBT\n' +
-        'ZXJ2aWNlcywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzElMCMGA1UEAwwcQW1h\n' +
-        'em9uIFJEUyB1cy1lYXN0LTEgMjAxOSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n' +
-        'ADCCAQoCggEBAM3i/k2u6cqbMdcISGRvh+m+L0yaSIoOXjtpNEoIftAipTUYoMhL\n' +
-        'InXGlQBVA4shkekxp1N7HXe1Y/iMaPEyb3n+16pf3vdjKl7kaSkIhjdUz3oVUEYt\n' +
-        'i8Z/XeJJ9H2aEGuiZh3kHixQcZczn8cg3dA9aeeyLSEnTkl/npzLf//669Ammyhs\n' +
-        'XcAo58yvT0D4E0D/EEHf2N7HRX7j/TlyWvw/39SW0usiCrHPKDLxByLojxLdHzso\n' +
-        'QIp/S04m+eWn6rmD+uUiRteN1hI5ncQiA3wo4G37mHnUEKo6TtTUh+sd/ku6a8HK\n' +
-        'glMBcgqudDI90s1OpuIAWmuWpY//8xEG2YECAwEAAaNmMGQwDgYDVR0PAQH/BAQD\n' +
-        'AgEGMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFPqhoWZcrVY9mU7tuemR\n' +
-        'RBnQIj1jMB8GA1UdIwQYMBaAFHNfYNi8ywOY9CsXNC42WqZg/7wfMA0GCSqGSIb3\n' +
-        'DQEBCwUAA4IBAQB6zOLZ+YINEs72heHIWlPZ8c6WY8MDU+Be5w1M+BK2kpcVhCUK\n' +
-        'PJO4nMXpgamEX8DIiaO7emsunwJzMSvavSPRnxXXTKIc0i/g1EbiDjnYX9d85DkC\n' +
-        'E1LaAUCmCZBVi9fIe0H2r9whIh4uLWZA41oMnJx/MOmo3XyMfQoWcqaSFlMqfZM4\n' +
-        '0rNoB/tdHLNuV4eIdaw2mlHxdWDtF4oH+HFm+2cVBUVC1jXKrFv/euRVtsTT+A6i\n' +
-        'h2XBHKxQ1Y4HgAn0jACP2QSPEmuoQEIa57bEKEcZsBR8SDY6ZdTd2HLRIApcCOSF\n' +
-        'MRM8CKLeF658I0XgF8D5EsYoKPsA+74Z+jDH\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEETCCAvmgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwgZQxCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSUwIwYDVQQDDBxBbWF6b24gUkRTIEJldGEgUm9vdCAyMDE5IENBMB4XDTE5MDgy\n' +
-        'MDE3MTAwN1oXDTI0MDgxOTE3MzgyNlowgZkxCzAJBgNVBAYTAlVTMRMwEQYDVQQI\n' +
-        'DApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMSIwIAYDVQQKDBlBbWF6b24g\n' +
-        'V2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMSowKAYDVQQD\n' +
-        'DCFBbWF6b24gUkRTIEJldGEgdXMtZWFzdC0xIDIwMTkgQ0EwggEiMA0GCSqGSIb3\n' +
-        'DQEBAQUAA4IBDwAwggEKAoIBAQDTNCOlotQcLP8TP82U2+nk0bExVuuMVOgFeVMx\n' +
-        'vbUHZQeIj9ikjk+jm6eTDnnkhoZcmJiJgRy+5Jt69QcRbb3y3SAU7VoHgtraVbxF\n' +
-        'QDh7JEHI9tqEEVOA5OvRrDRcyeEYBoTDgh76ROco2lR+/9uCvGtHVrMCtG7BP7ZB\n' +
-        'sSVNAr1IIRZZqKLv2skKT/7mzZR2ivcw9UeBBTUf8xsfiYVBvMGoEsXEycjYdf6w\n' +
-        'WV+7XS7teNOc9UgsFNN+9AhIBc1jvee5E//72/4F8pAttAg/+mmPUyIKtekNJ4gj\n' +
-        'OAR2VAzGx1ybzWPwIgOudZFHXFduxvq4f1hIRPH0KbQ/gkRrAgMBAAGjZjBkMA4G\n' +
-        'A1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBTkvpCD\n' +
-        '6C43rar9TtJoXr7q8dkrrjAfBgNVHSMEGDAWgBStoQwVpbGx87fxB3dEGDqKKnBT\n' +
-        '4TANBgkqhkiG9w0BAQsFAAOCAQEAJd9fOSkwB3uVdsS+puj6gCER8jqmhd3g/J5V\n' +
-        'Zjk9cKS8H0e8pq/tMxeJ8kpurPAzUk5RkCspGt2l0BSwmf3ahr8aJRviMX6AuW3/\n' +
-        'g8aKplTvq/WMNGKLXONa3Sq8591J+ce8gtOX/1rDKmFI4wQ/gUzOSYiT991m7QKS\n' +
-        'Fr6HMgFuz7RNJbb3Fy5cnurh8eYWA7mMv7laiLwTNsaro5qsqErD5uXuot6o9beT\n' +
-        'a+GiKinEur35tNxAr47ax4IRubuIzyfCrezjfKc5raVV2NURJDyKP0m0CCaffAxE\n' +
-        'qn2dNfYc3v1D8ypg3XjHlOzRo32RB04o8ALHMD9LSwsYDLpMag==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEFzCCAv+gAwIBAgICFSUwDQYJKoZIhvcNAQELBQAwgZcxCzAJBgNVBAYTAlVT\n' +
-        'MRAwDgYDVQQHDAdTZWF0dGxlMRMwEQYDVQQIDApXYXNoaW5ndG9uMSIwIAYDVQQK\n' +
-        'DBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRT\n' +
-        'MSgwJgYDVQQDDB9BbWF6b24gUkRTIFByZXZpZXcgUm9vdCAyMDE5IENBMB4XDTE5\n' +
-        'MDgyMTIyMzk0N1oXDTI0MDgyMTIyMjk0OVowgZwxCzAJBgNVBAYTAlVTMRMwEQYD\n' +
-        'VQQIDApXYXNoaW5ndG9uMRAwDgYDVQQHDAdTZWF0dGxlMSIwIAYDVQQKDBlBbWF6\n' +
-        'b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMS0wKwYD\n' +
-        'VQQDDCRBbWF6b24gUkRTIFByZXZpZXcgdXMtZWFzdC0yIDIwMTkgQ0EwggEiMA0G\n' +
-        'CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD0dB/U7qRnSf05wOi7m10Pa2uPMTJv\n' +
-        'r6U/3Y17a5prq5Zr4++CnSUYarG51YuIf355dKs+7Lpzs782PIwCmLpzAHKWzix6\n' +
-        'pOaTQ+WZ0+vUMTxyqgqWbsBgSCyP7pVBiyqnmLC/L4az9XnscrbAX4pNaoJxsuQe\n' +
-        'mzBo6yofjQaAzCX69DuqxFkVTRQnVy7LCFkVaZtjNAftnAHJjVgQw7lIhdGZp9q9\n' +
-        'IafRt2gteihYfpn+EAQ/t/E4MnhrYs4CPLfS7BaYXBycEKC5Muj1l4GijNNQ0Efo\n' +
-        'xG8LSZz7SNgUvfVwiNTaqfLP3AtEAWiqxyMyh3VO+1HpCjT7uNBFtmF3AgMBAAGj\n' +
-        'ZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQW\n' +
-        'BBQtinkdrj+0B2+qdXngV2tgHnPIujAfBgNVHSMEGDAWgBRp0xqULkNh/w2ZVzEI\n' +
-        'o2RIY7O03TANBgkqhkiG9w0BAQsFAAOCAQEAtJdqbCxDeMc8VN1/RzCabw9BIL/z\n' +
-        '73Auh8eFTww/sup26yn8NWUkfbckeDYr1BrXa+rPyLfHpg06kwR8rBKyrs5mHwJx\n' +
-        'bvOzXD/5WTdgreB+2Fb7mXNvWhenYuji1MF+q1R2DXV3I05zWHteKX6Dajmx+Uuq\n' +
-        'Yq78oaCBSV48hMxWlp8fm40ANCL1+gzQ122xweMFN09FmNYFhwuW+Ao+Vv90ZfQG\n' +
-        'PYwTvN4n/gegw2TYcifGZC2PNX74q3DH03DXe5fvNgRW5plgz/7f+9mS+YHd5qa9\n' +
-        'tYTPUvoRbi169ou6jicsMKUKPORHWhiTpSCWR1FMMIbsAcsyrvtIsuaGCQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/jCCAuagAwIBAgIQdOCSuA9psBpQd8EI368/0DANBgkqhkiG9w0BAQsFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIHNhLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTE5MTgwNjI2WhgPMjA2MTA1MTkxOTA2MjZaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgc2EtZWFzdC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN6ftL6w8v3dB2yW\n' +
-        'LjCxSP1D7ZsOTeLZOSCz1Zv0Gkd0XLhil5MdHOHBvwH/DrXqFU2oGzCRuAy+aZis\n' +
-        'DardJU6ChyIQIciXCO37f0K23edhtpXuruTLLwUwzeEPdcnLPCX+sWEn9Y5FPnVm\n' +
-        'pCd6J8edH2IfSGoa9LdErkpuESXdidLym/w0tWG/O2By4TabkNSmpdrCL00cqI+c\n' +
-        'prA8Bx1jX8/9sY0gpAovtuFaRN+Ivg3PAnWuhqiSYyQ5nC2qDparOWuDiOhpY56E\n' +
-        'EgmTvjwqMMjNtExfYx6Rv2Ndu50TriiNKEZBzEtkekwXInTupmYTvc7U83P/959V\n' +
-        'UiQ+WSMCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU4uYHdH0+\n' +
-        'bUeh81Eq2l5/RJbW+vswDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\n' +
-        'AQBhxcExJ+w74bvDknrPZDRgTeMLYgbVJjx2ExH7/Ac5FZZWcpUpFwWMIJJxtewI\n' +
-        'AnhryzM3tQYYd4CG9O+Iu0+h/VVfW7e4O3joWVkxNMb820kQSEwvZfA78aItGwOY\n' +
-        'WSaFNVRyloVicZRNJSyb1UL9EiJ9ldhxm4LTT0ax+4ontI7zTx6n6h8Sr6r/UOvX\n' +
-        'd9T5aUUENWeo6M9jGupHNn3BobtL7BZm2oS8wX8IVYj4tl0q5T89zDi2x0MxbsIV\n' +
-        '5ZjwqBQ5JWKv7ASGPb+z286RjPA9R2knF4lJVZrYuNV90rHvI/ECyt/JrDqeljGL\n' +
-        'BLl1W/UsvZo6ldLIpoMbbrb5\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBDCCAuygAwIBAgIQUfVbqapkLYpUqcLajpTJWzANBgkqhkiG9w0BAQsFADCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIG1lLWNlbnRyYWwtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwIBcNMjIwNTA2MjMyMDA5WhgPMjA2MjA1MDcwMDIwMDlaMIGa\n' +
-        'MQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\n' +
-        'LjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\n' +
-        'YXpvbiBSRFMgbWUtY2VudHJhbC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJIeovu3\n' +
-        'ewI9FVitXMQzvkh34aQ6WyI4NO3YepfJaePiv3cnyFGYHN2S1cR3UQcLWgypP5va\n' +
-        'j6bfroqwGbCbZZcb+6cyOB4ceKO9Ws1UkcaGHnNDcy5gXR7aCW2OGTUfinUuhd2d\n' +
-        '5bOGgV7JsPbpw0bwJ156+MwfOK40OLCWVbzy8B1kITs4RUPNa/ZJnvIbiMu9rdj4\n' +
-        '8y7GSFJLnKCjlOFUkNI5LcaYvI1+ybuNgphT3nuu5ZirvTswGakGUT/Q0J3dxP0J\n' +
-        'pDfg5Sj/2G4gXiaM0LppVOoU5yEwVewhQ250l0eQAqSrwPqAkdTg9ng360zqCFPE\n' +
-        'JPPcgI1tdGUgneECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\n' +
-        '/2AJVxWdZxc8eJgdpbwpW7b0f7IwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\n' +
-        'CwUAA4IBAQBYm63jTu2qYKJ94gKnqc+oUgqmb1mTXmgmp/lXDbxonjszJDOXFbri\n' +
-        '3CCO7xB2sg9bd5YWY8sGKHaWmENj3FZpCmoefbUx++8D7Mny95Cz8R32rNcwsPTl\n' +
-        'ebpd9A/Oaw5ug6M0x/cNr0qzF8Wk9Dx+nFEimp8RYQdKvLDfNFZHjPa1itnTiD8M\n' +
-        'TorAqj+VwnUGHOYBsT/0NY12tnwXdD+ATWfpEHdOXV+kTMqFFwDyhfgRVNpTc+os\n' +
-        'ygr8SwhnSCpJPB/EYl2S7r+tgAbJOkuwUvGT4pTqrzDQEhwE7swgepnHC87zhf6l\n' +
-        'qN6mVpSnQKQLm6Ob5TeCEFgcyElsF5bH\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjSgAwIBAgIRAOxu0I1QuMAhIeszB3fJIlkwCgYIKoZIzj0EAwMwgZYx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\n' +
-        'em9uIFJEUyB1cy13ZXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTI0MjIwNjU5WhgPMjEyMTA1MjQyMzA2NTlaMIGWMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\n' +
-        'RFMgdXMtd2VzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\n' +
-        'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEz4bylRcGqqDWdP7gQIIoTHdBK6FNtKH1\n' +
-        '4SkEIXRXkYDmRvL9Bci1MuGrwuvrka5TDj4b7e+csY0llEzHpKfq6nJPFljoYYP9\n' +
-        'uqHFkv77nOpJJ633KOr8IxmeHW5RXgrZo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\n' +
-        'A1UdDgQWBBQQikVz8wmjd9eDFRXzBIU8OseiGzAOBgNVHQ8BAf8EBAMCAYYwCgYI\n' +
-        'KoZIzj0EAwMDaAAwZQIwf06Mcrpw1O0EBLBBrp84m37NYtOkE/0Z0O+C7D41wnXi\n' +
-        'EQdn6PXUVgdD23Gj82SrAjEAklhKs+liO1PtN15yeZR1Io98nFve+lLptaLakZcH\n' +
-        '+hfFuUtCqMbaI8CdvJlKnPqT\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCTCCA/GgAwIBAgIRALyWMTyCebLZOGcZZQmkmfcwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI0MjAyODAzWhgPMjEyMTA1MjQyMTI4MDNa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTMgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\n' +
-        'wGFiyDyCrGqgdn4fXG12cxKAAfVvhMea1mw5h9CVRoavkPqhzQpAitSOuMB9DeiP\n' +
-        'wQyqcsiGl/cTEau4L+AUBG8b9v26RlY48exUYBXj8CieYntOT9iNw5WtdYJa3kF/\n' +
-        'JxgI+HDMzE9cmHDs5DOO3S0uwZVyra/xE1ymfSlpOeUIOTpHRJv97CBUEpaZMUW5\n' +
-        'Sr6GruuOwFVpO5FX3A/jQlcS+UN4GjSRgDUJuqg6RRQldEZGCVCCmodbByvI2fGm\n' +
-        'reGpsPJD54KkmAX08nOR8e5hkGoHxq0m2DLD4SrOFmt65vG47qnuwplWJjtk9B3Z\n' +
-        '9wDoopwZLBOtlkPIkUllWm1P8EuHC1IKOA+wSP6XdT7cy8S77wgyHzR0ynxv7q/l\n' +
-        'vlZtH30wnNqFI0y9FeogD0TGMCHcnGqfBSicJXPy9T4fU6f0r1HwqKwPp2GArwe7\n' +
-        'dnqLTj2D7M9MyVtFjEs6gfGWXmu1y5uDrf+CszurE8Cycoma+OfjjuVQgWOCy7Nd\n' +
-        'jJswPxAroTzVfpgoxXza4ShUY10woZu0/J+HmNmqK7lh4NS75q1tz75in8uTZDkV\n' +
-        'be7GK+SEusTrRgcf3tlgPjSTWG3veNzFDF2Vn1GLJXmuZfhdlVQDBNXW4MNREExS\n' +
-        'dG57kJjICpT+r8X+si+5j51gRzkSnMYs7VHulpxfcwECAwEAAaNCMEAwDwYDVR0T\n' +
-        'AQH/BAUwAwEB/zAdBgNVHQ4EFgQU4JWOpDBmUBuWKvGPZelw87ezhL8wDgYDVR0P\n' +
-        'AQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQBRNLMql7itvXSEFQRAnyOjivHz\n' +
-        'l5IlWVQjAbOUr6ogZcwvK6YpxNAFW5zQr8F+fdkiypLz1kk5irx9TIpff0BWC9hQ\n' +
-        '/odMPO8Gxn8+COlSvc+dLsF2Dax3Hvz0zLeKMo+cYisJOzpdR/eKd0/AmFdkvQoM\n' +
-        'AOK9n0yYvVJU2IrSgeJBiiCarpKSeAktEVQ4rvyacQGr+QAPkkjRwm+5LHZKK43W\n' +
-        'nNnggRli9N/27qYtc5bgr3AaQEhEXMI4RxPRXCLsod0ehMGWyRRK728a+6PMMJAJ\n' +
-        'WHOU0x7LCEMPP/bvpLj3BdvSGqNor4ZtyXEbwREry1uzsgODeRRns5acPwTM6ff+\n' +
-        'CmxO2NZ0OktIUSYRmf6H/ZFlZrIhV8uWaIwEJDz71qvj7buhQ+RFDZ9CNL64C0X6\n' +
-        'mf0zJGEpddjANHaaVky+F4gYMtEy2K2Lcm4JGTdyIzUoIe+atzCnRp0QeIcuWtF+\n' +
-        's8AjDYCVFNypcMmqbRmNpITSnOoCHSRuVkY3gutVoYyMLbp8Jm9SJnCIlEWTA6Rm\n' +
-        'wADOMGZJVn5/XRTRuetVOB3KlQDjs9OO01XN5NzGSZO2KT9ngAUfh9Eqhf1iRWSP\n' +
-        'nZlRbQ2NRCuY/oJ5N59mLGxnNJSE7giEKEBRhTQ/XEPIUYAUPD5fca0arKRJwbol\n' +
-        'l9Se1Hsq0ZU5f+OZKQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGATCCA+mgAwIBAgIRAK7vlRrGVEePJpW1VHMXdlIwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\n' +
-        'QW1hem9uIFJEUyBhZi1zb3V0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMTA1MTkxOTI4NDNaGA8yMTIxMDUxOTIwMjg0M1owgZgx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\n' +
-        'em9uIFJEUyBhZi1zb3V0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMZiHOQC6x4o\n' +
-        'eC7vVOMCGiN5EuLqPYHdceFPm4h5k/ZejXTf7kryk6aoKZKsDIYihkaZwXVS7Y/y\n' +
-        '7Ig1F1ABi2jD+CYprj7WxXbhpysmN+CKG7YC3uE4jSvfvUnpzionkQbjJsRJcrPO\n' +
-        'cZJM4FVaVp3mlHHtvnM+K3T+ni4a38nAd8xrv1na4+B8ZzZwWZXarfg8lJoGskSn\n' +
-        'ou+3rbGQ0r+XlUP03zWujHoNlVK85qUIQvDfTB7n3O4s1XNGvkfv3GNBhYRWJYlB\n' +
-        '4p8T+PFN8wG+UOByp1gV7BD64RnpuZ8V3dRAlO6YVAmINyG5UGrPzkIbLtErUNHO\n' +
-        '4iSp4UqYvztDqJWWHR/rA84ef+I9RVwwZ8FQbjKq96OTnPrsr63A5mXTC9dXKtbw\n' +
-        'XNJPQY//FEdyM3K8sqM0IdCzxCA1MXZ8+QapWVjwyTjUwFvL69HYky9H8eAER59K\n' +
-        '5I7u/CWWeCy2R1SYUBINc3xxLr0CGGukcWPEZW2aPo5ibW5kepU1P/pzdMTaTfao\n' +
-        'F42jSFXbc7gplLcSqUgWwzBnn35HLTbiZOFBPKf6vRRu8aRX9atgHw/EjCebi2xP\n' +
-        'xIYr5Ub8u0QVHIqcnF1/hVzO/Xz0chj3E6VF/yTXnsakm+W1aM2QkZbFGpga+LMy\n' +
-        'mFCtdPrELjea2CfxgibaJX1Q4rdEpc8DAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wHQYDVR0OBBYEFDSaycEyuspo/NOuzlzblui8KotFMA4GA1UdDwEB/wQEAwIB\n' +
-        'hjANBgkqhkiG9w0BAQwFAAOCAgEAbosemjeTRsL9o4v0KadBUNS3V7gdAH+X4vH2\n' +
-        'Ee1Jc91VOGLdd/s1L9UX6bhe37b9WjUD69ur657wDW0RzxMYgQdZ27SUl0tEgGGp\n' +
-        'cCmVs1ky3zEN+Hwnhkz+OTmIg1ufq0W2hJgJiluAx2r1ib1GB+YI3Mo3rXSaBYUk\n' +
-        'bgQuujYPctf0PA153RkeICE5GI3OaJ7u6j0caYEixBS3PDHt2MJWexITvXGwHWwc\n' +
-        'CcrC05RIrTUNOJaetQw8smVKYOfRImEzLLPZ5kf/H3Cbj8BNAFNsa10wgvlPuGOW\n' +
-        'XLXqzNXzrG4V3sjQU5YtisDMagwYaN3a6bBf1wFwFIHQoAPIgt8q5zaQ9WI+SBns\n' +
-        'Il6rd4zfvjq/BPmt0uI7rVg/cgbaEg/JDL2neuM9CJAzmKxYxLQuHSX2i3Fy4Y1B\n' +
-        'cnxnRQETCRZNPGd00ADyxPKVoYBC45/t+yVusArFt+2SVLEGiFBr23eG2CEZu+HS\n' +
-        'nDEgIfQ4V3YOTUNa86wvbAss1gbbnT/v1XCnNGClEWCWNCSRjwV2ZmQ/IVTmNHPo\n' +
-        '7axTTBBJbKJbKzFndCnuxnDXyytdYRgFU7Ly3sa27WS2KFyFEDebLFRHQEfoYqCu\n' +
-        'IupSqBSbXsR3U10OTjc9z6EPo1nuV6bdz+gEDthmxKa1NI+Qb1kvyliXQHL2lfhr\n' +
-        '5zT5+Bs=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/zCCA+egAwIBAgIRAOLV6zZcL4IV2xmEneN1GwswDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyB1cy13ZXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUxOTE5MDg1OFoYDzIxMjEwNTE5MjAwODU4WjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIHVzLXdlc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC7koAKGXXlLixN\n' +
-        'fVjhuqvz0WxDeTQfhthPK60ekRpftkfE5QtnYGzeovaUAiS58MYVzqnnTACDwcJs\n' +
-        'IGTFE6Wd7sB6r8eI/3CwI1pyJfxepubiQNVAQG0zJETOVkoYKe/5KnteKtnEER3X\n' +
-        'tCBRdV/rfbxEDG9ZAsYfMl6zzhEWKF88G6xhs2+VZpDqwJNNALvQuzmTx8BNbl5W\n' +
-        'RUWGq9CQ9GK9GPF570YPCuURW7kl35skofudE9bhURNz51pNoNtk2Z3aEeRx3ouT\n' +
-        'ifFJlzh+xGJRHqBG7nt5NhX8xbg+vw4xHCeq1aAe6aVFJ3Uf9E2HzLB4SfIT9bRp\n' +
-        'P7c9c0ySGt+3n+KLSHFf/iQ3E4nft75JdPjeSt0dnyChi1sEKDi0tnWGiXaIg+J+\n' +
-        'r1ZtcHiyYpCB7l29QYMAdD0TjfDwwPayLmq//c20cPmnSzw271VwqjUT0jYdrNAm\n' +
-        'gV+JfW9t4ixtE3xF2jaUh/NzL3bAmN5v8+9k/aqPXlU1BgE3uPwMCjrfn7V0I7I1\n' +
-        'WLpHyd9jF3U/Ysci6H6i8YKgaPiOfySimQiDu1idmPld659qerutUSemQWmPD3bE\n' +
-        'dcjZolmzS9U0Ujq/jDF1YayN3G3xvry1qWkTci0qMRMu2dZu30Herugh9vsdTYkf\n' +
-        '00EqngPbqtIVLDrDjEQLqPcb8QvWFQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\n' +
-        'MB0GA1UdDgQWBBQBqg8Za/L0YMHURGExHfvPyfLbOTAOBgNVHQ8BAf8EBAMCAYYw\n' +
-        'DQYJKoZIhvcNAQEMBQADggIBACAGPMa1QL7P/FIO7jEtMelJ0hQlQepKnGtbKz4r\n' +
-        'Xq1bUX1jnLvnAieR9KZmeQVuKi3g3CDU6b0mDgygS+FL1KDDcGRCSPh238Ou8KcG\n' +
-        'HIxtt3CMwMHMa9gmdcMlR5fJF9vhR0C56KM2zvyelUY51B/HJqHwGvWuexryXUKa\n' +
-        'wq1/iK2/d9mNeOcjDvEIj0RCMI8dFQCJv3PRCTC36XS36Tzr6F47TcTw1c3mgKcs\n' +
-        'xpcwt7ezrXMUunzHS4qWAA5OGdzhYlcv+P5GW7iAA7TDNrBF+3W4a/6s9v2nQAnX\n' +
-        'UvXd9ul0ob71377UhZbJ6SOMY56+I9cJOOfF5QvaL83Sz29Ij1EKYw/s8TYdVqAq\n' +
-        '+dCyQZBkMSnDFLVe3J1KH2SUSfm3O98jdPORQrUlORQVYCHPls19l2F6lCmU7ICK\n' +
-        'hRt8EVSpXm4sAIA7zcnR2nU00UH8YmMQLnx5ok9YGhuh3Ehk6QlTQLJux6LYLskd\n' +
-        '9YHOLGW/t6knVtV78DgPqDeEx/Wu/5A8R0q7HunpWxr8LCPBK6hksZnOoUhhb8IP\n' +
-        'vl46Ve5Tv/FlkyYr1RTVjETmg7lb16a8J0At14iLtpZWmwmuv4agss/1iBVMXfFk\n' +
-        '+ZGtx5vytWU5XJmsfKA51KLsMQnhrLxb3X3zC+JRCyJoyc8++F3YEcRi2pkRYE3q\n' +
-        'Hing\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgIRANxgyBbnxgTEOpDul2ZnC0UwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMyBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNjEwMTgxOTA3WhgPMjA2MTA2MTAxOTE5MDda\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTMgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' +
-        'xnwSDAChrMkfk5TA4Dk8hKzStDlSlONzmd3fTG0Wqr5+x3EmFT6Ksiu/WIwEl9J2\n' +
-        'K98UI7vYyuZfCxUKb1iMPeBdVGqk0zb92GpURd+Iz/+K1ps9ZLeGBkzR8mBmAi1S\n' +
-        'OfpwKiTBzIv6E8twhEn4IUpHsdcuX/2Y78uESpJyM8O5CpkG0JaV9FNEbDkJeBUQ\n' +
-        'Ao2qqNcH4R0Qcr5pyeqA9Zto1RswgL06BQMI9dTpfwSP5VvkvcNUaLl7Zv5WzLQE\n' +
-        'JzORWePvdPzzvWEkY/3FPjxBypuYwssKaERW0fkPDmPtykktP9W/oJolKUFI6pXp\n' +
-        'y+Y6p6/AVdnQD2zZjW5FhQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n' +
-        'DgQWBBT+jEKs96LC+/X4BZkUYUkzPfXdqTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAIGQqgqcQ6XSGkmNebzR6DhadTbfDmbYeN5N0Vuzv+Tdmufb\n' +
-        'tMGjdjnYMg4B+IVnTKQb+Ox3pL9gbX6KglGK8HupobmIRtwKVth+gYYz3m0SL/Nk\n' +
-        'haWPYzOm0x3tJm8jSdufJcEob4/ATce9JwseLl76pSWdl5A4lLjnhPPKudUDfH+1\n' +
-        'BLNUi3lxpp6GkC8aWUPtupnhZuXddolTLOuA3GwTZySI44NfaFRm+o83N1jp+EwD\n' +
-        '6e94M4cTRzjUv6J3MZmSbdtQP/Tk1uz2K4bQZGP0PZC3bVpqiesdE/xr+wbu8uHr\n' +
-        'cM1JXH0AmXf1yIkTgyWzmvt0k1/vgcw5ixAqvvE=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEATCCAumgAwIBAgIRAMhw98EQU18mIji+unM2YH8wDQYJKoZIhvcNAQELBQAw\n' +
-        'gZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMjA2MDYyMTQyMjJaGA8yMDYyMDYwNjIyNDIyMlowgZgx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIeeRoLfTm+7\n' +
-        'vqm7ZlFSx+1/CGYHyYrOOryM4/Z3dqYVHFMgWTR7V3ziO8RZ6yUanrRcWVX3PZbF\n' +
-        'AfX0KFE8OgLsXEZIX8odSrq86+/Th5eZOchB2fDBsUB7GuN2rvFBbM8lTI9ivVOU\n' +
-        'lbuTnYyb55nOXN7TpmH2bK+z5c1y9RVC5iQsNAl6IJNvSN8VCqXh31eK5MlKB4DT\n' +
-        '+Y3OivCrSGsjM+UR59uZmwuFB1h+icE+U0p9Ct3Mjq3MzSX5tQb6ElTNGlfmyGpW\n' +
-        'Kh7GQ5XU1KaKNZXoJ37H53woNSlq56bpVrKI4uv7ATpdpFubOnSLtpsKlpLdR3sy\n' +
-        'Ws245200pC8CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUp0ki\n' +
-        '6+eWvsnBjQhMxwMW5pwn7DgwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUA\n' +
-        'A4IBAQB2V8lv0aqbYQpj/bmVv/83QfE4vOxKCJAHv7DQ35cJsTyBdF+8pBczzi3t\n' +
-        '3VNL5IUgW6WkyuUOWnE0eqAFOUVj0yTS1jSAtfl3vOOzGJZmWBbqm9BKEdu1D8O6\n' +
-        'sB8bnomwiab2tNDHPmUslpdDqdabbkWwNWzLJ97oGFZ7KNODMEPXWKWNxg33iHfS\n' +
-        '/nlmnrTVI3XgaNK9qLZiUrxu9Yz5gxi/1K+sG9/Dajd32ZxjRwDipOLiZbiXQrsd\n' +
-        'qzIMY4GcWf3g1gHL5mCTfk7dG22h/rhPyGV0svaDnsb+hOt6sv1McMN6Y3Ou0mtM\n' +
-        '/UaAXojREmJmTSCNvs2aBny3/2sy\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjSgAwIBAgIRAMnRxsKLYscJV8Qv5pWbL7swCgYIKoZIzj0EAwMwgZYx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\n' +
-        'em9uIFJEUyBzYS1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTE5MTgxNjAxWhgPMjEyMTA1MTkxOTE2MDFaMIGWMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\n' +
-        'RFMgc2EtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\n' +
-        'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEjFOCZgTNVKxLKhUxffiDEvTLFhrmIqdO\n' +
-        'dKqVdgDoELEzIHWDdC+19aDPitbCYtBVHl65ITu/9pn6mMUl5hhUNtfZuc6A+Iw1\n' +
-        'sBe0v0qI3y9Q9HdQYrGgeHDh8M5P7E2ho0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\n' +
-        'A1UdDgQWBBS5L7/8M0TzoBZk39Ps7BkfTB4yJTAOBgNVHQ8BAf8EBAMCAYYwCgYI\n' +
-        'KoZIzj0EAwMDaAAwZQIwI43O0NtWKTgnVv9z0LO5UMZYgSve7GvGTwqktZYCMObE\n' +
-        'rUI4QerXM9D6JwLy09mqAjEAypfkdLyVWtaElVDUyHFkihAS1I1oUxaaDrynLNQK\n' +
-        'Ou/Ay+ns+J+GyvyDUjBpVVW1\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/jCCA+agAwIBAgIQR71Z8lTO5Sj+as2jB7IWXzANBgkqhkiG9w0BAQwFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTI0MjIwMzIwWhgPMjEyMTA1MjQyMzAzMjBaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAM977bHIs1WJijrS\n' +
-        'XQMfUOhmlJjr2v0K0UjPl52sE1TJ76H8umo1yR4T7Whkd9IwBHNGKXCJtJmMr9zp\n' +
-        'fB38eLTu+5ydUAXdFuZpRMKBWwPVe37AdJRKqn5beS8HQjd3JXAgGKUNNuE92iqF\n' +
-        'qi2fIqFMpnJXWo0FIW6s2Dl2zkORd7tH0DygcRi7lgVxCsw1BJQhFJon3y+IV8/F\n' +
-        'bnbUXSNSDUnDW2EhvWSD8L+t4eiXYsozhDAzhBvojpxhPH9OB7vqFYw5qxFx+G0t\n' +
-        'lSLX5iWi1jzzc3XyGnB6WInZDVbvnvJ4BGZ+dTRpOCvsoMIn9bz4EQTvu243c7aU\n' +
-        'HbS/kvnCASNt+zk7C6lbmaq0AGNztwNj85Opn2enFciWZVnnJ/4OeefUWQxD0EPp\n' +
-        'SjEd9Cn2IHzkBZrHCg+lWZJQBKbUVS0lLIMSsLQQ6WvR38jY7D2nxM1A93xWxwpt\n' +
-        'ZtQnYRCVXH6zt2OwDAFePInWwxUjR5t/wu3XxPgpSfrmTi3WYtr1wFypAJ811e/P\n' +
-        'yBtswWUQ6BNJQvy+KnOEeGfOwmtdDFYR+GOCfvCihzrKJrxOtHIieehR5Iw3cbXG\n' +
-        'sm4pDzfMUVvDDz6C2M6PRlJhhClbatHCjik9hxFYEsAlqtVVK9pxaz9i8hOqSFQq\n' +
-        'kJSQsgWw+oM/B2CyjcSqkSQEu8RLAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\n' +
-        'HQYDVR0OBBYEFPmrdxpRRgu3IcaB5BTqlprcKdTsMA4GA1UdDwEB/wQEAwIBhjAN\n' +
-        'BgkqhkiG9w0BAQwFAAOCAgEAVdlxWjPvVKky3kn8ZizeM4D+EsLw9dWLau2UD/ls\n' +
-        'zwDCFoT6euagVeCknrn+YEl7g20CRYT9iaonGoMUPuMR/cdtPL1W/Rf40PSrGf9q\n' +
-        'QuxavWiHLEXOQTCtCaVZMokkvjuuLNDXyZnstgECuiZECTwhexUF4oiuhyGk9o01\n' +
-        'QMaiz4HX4lgk0ozALUvEzaNd9gWEwD2qe+rq9cQMTVq3IArUkvTIftZUaVUMzr0O\n' +
-        'ed1+zAsNa9nJhURJ/6anJPJjbQgb5qA1asFcp9UaMT1ku36U3gnR1T/BdgG2jX3X\n' +
-        'Um0UcaGNVPrH1ukInWW743pxWQb7/2sumEEMVh+jWbB18SAyLI4WIh4lkurdifzS\n' +
-        'IuTFp8TEx+MouISFhz/vJDWZ84tqoLVjkEcP6oDypq9lFoEzHDJv3V1CYcIgOusT\n' +
-        'k1jm9P7BXdTG7TYzUaTb9USb6bkqkD9EwJAOSs7DI94aE6rsSws2yAHavjAMfuMZ\n' +
-        'sDAZvkqS2Qg2Z2+CI6wUZn7mzkJXbZoqRjDvChDXEB1mIhzVXhiNW/CR5WKVDvlj\n' +
-        '9v1sdGByh2pbxcLQtVaq/5coM4ANgphoNz3pOYUPWHS+JUrIivBZ+JobjXcxr3SN\n' +
-        '9iDzcu5/FVVNbq7+KN/nvPMngT+gduEN5m+EBjm8GukJymFG0m6BENRA0QSDqZ7k\n' +
-        'zDY=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgIRAK5EYG3iHserxMqgg+0EFjgwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI0MjAyMzE2WhgPMjA2MTA1MjQyMTIzMTZa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTMgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' +
-        's1L6TtB84LGraLHVC+rGPhLBW2P0oN/91Rq3AnYwqDOuTom7agANwEjvLq7dSRG/\n' +
-        'sIfZsSV/ABTgArZ5sCmLjHFZAo8Kd45yA9byx20RcYtAG8IZl+q1Cri+s0XefzyO\n' +
-        'U6mlfXZkVe6lzjlfXBkrlE/+5ifVbJK4dqOS1t9cWIpgKqv5fbE6Qbq4LVT+5/WM\n' +
-        'Vd2BOljuBMGMzdZubqFKFq4mzTuIYfnBm7SmHlZfTdfBYPP1ScNuhpjuzw4n3NCR\n' +
-        'EdU6dQv04Q6th4r7eiOCwbWI9LkmVbvBe3ylhH63lApC7MiiPYLlB13xBubVHVhV\n' +
-        'q1NHoNTi+zA3MN9HWicRxQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n' +
-        'DgQWBBSuxoqm0/wjNiZLvqv+JlQwsDvTPDAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAFfTK/j5kv90uIbM8VaFdVbr/6weKTwehafT0pAk1bfLVX+7\n' +
-        'uf8oHgYiyKTTl0DFQicXejghXTeyzwoEkWSR8c6XkhD5vYG3oESqmt/RGvvoxz11\n' +
-        'rHHy7yHYu7RIUc3VQG60c4qxXv/1mWySGwVwJrnuyNT9KZXPevu3jVaWOVHEILaK\n' +
-        'HvzQ2YEcWBPmde/zEseO2QeeGF8FL45Q1d66wqIP4nNUd2pCjeTS5SpB0MMx7yi9\n' +
-        'ki1OH1pv8tOuIdimtZ7wkdB8+JSZoaJ81b8sRrydRwJyvB88rftuI3YB4WwGuONT\n' +
-        'ZezUPsmaoK69B0RChB0ofDpAaviF9V3xOWvVZfo=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGDzCCA/egAwIBAgIRAI0sMNG2XhaBMRN3zD7ZyoEwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZ8xCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE4MDYGA1UEAwwv\n' +
-        'QW1hem9uIFJEUyBQcmV2aWV3IHVzLWVhc3QtMiBSb290IENBIFJTQTQwOTYgRzEx\n' +
-        'EDAOBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTE4MjA1NzUwWhgPMjEyMTA1MTgyMTU3\n' +
-        'NTBaMIGfMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' +
-        'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExODA2BgNV\n' +
-        'BAMML0FtYXpvbiBSRFMgUHJldmlldyB1cy1lYXN0LTIgUm9vdCBDQSBSU0E0MDk2\n' +
-        'IEcxMRAwDgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC\n' +
-        'CgKCAgEAh/otSiCu4Uw3hu7OJm0PKgLsLRqBmUS6jihcrkxfN2SHmp2zuRflkweU\n' +
-        'BhMkebzL+xnNvC8okzbgPWtUxSmDnIRhE8J7bvSKFlqs/tmEdiI/LMqe/YIKcdsI\n' +
-        '20UYmvyLIjtDaJIh598SHHlF9P8DB5jD8snJfhxWY+9AZRN+YVTltgQAAgayxkWp\n' +
-        'M1BbvxpOnz4CC00rE0eqkguXIUSuobb1vKqdKIenlYBNxm2AmtgvQfpsBIQ0SB+8\n' +
-        '8Zip8Ef5rtjSw5J3s2Rq0aYvZPfCVIsKYepIboVwXtD7E9J31UkB5onLBQlaHaA6\n' +
-        'XlH4srsMmrew5d2XejQGy/lGZ1nVWNsKO0x/Az2QzY5Kjd6AlXZ8kq6H68hscA5i\n' +
-        'OMbNlXzeEQsZH0YkId3+UsEns35AAjZv4qfFoLOu8vDotWhgVNT5DfdbIWZW3ZL8\n' +
-        'qbmra3JnCHuaTwXMnc25QeKgVq7/rG00YB69tCIDwcf1P+tFJWxvaGtV0g2NthtB\n' +
-        'a+Xo09eC0L53gfZZ3hZw1pa3SIF5dIZ6RFRUQ+lFOux3Q/I3u+rYstYw7Zxc4Zeo\n' +
-        'Y8JiedpQXEAnbw2ECHix/L6mVWgiWCiDzBnNLLdbmXjJRnafNSndSfFtHCnY1SiP\n' +
-        'aCrNpzwZIJejoV1zDlWAMO+gyS28EqzuIq3WJK/TFE7acHkdKIcCAwEAAaNCMEAw\n' +
-        'DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUrmV1YASnuudfmqAZP4sKGTvScaEw\n' +
-        'DgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQBGpEKeQoPvE85tN/25\n' +
-        'qHFkys9oHDl93DZ62EnOqAUKLd6v0JpCyEiop4nlrJe+4KrBYVBPyKOJDcIqE2Sp\n' +
-        '3cvgJXLhY4i46VM3Qxe8yuYF1ElqBpg3jJVj/sCQnYz9dwoAMWIJFaDWOvmU2E7M\n' +
-        'MRaKx+sPXFkIjiDA6Bv0m+VHef7aedSYIY7IDltEQHuXoqNacGrYo3I50R+fZs88\n' +
-        '/mB3e/V7967e99D6565yf9Lcjw4oQf2Hy7kl/6P9AuMz0LODnGITwh2TKk/Zo3RU\n' +
-        'Vgq25RDrT4xJK6nFHyjUF6+4cOBxVpimmFw/VP1zaXT8DN5r4HyJ9p4YuSK8ha5N\n' +
-        '2pJc/exvU8Nv2+vS/efcDZWyuEdZ7eh1IJWQZlOZKIAONfRDRTpeQHJ3zzv3QVYy\n' +
-        't78pYp/eWBHyVIfEE8p2lFKD4279WYe+Uvdb8c4Jm4TJwqkSJV8ifID7Ub80Lsir\n' +
-        'lPAU3OCVTBeVRFPXT2zpC4PB4W6KBSuj6OOcEu2y/HgWcoi7Cnjvp0vFTUhDFdus\n' +
-        'Wz3ucmJjfVsrkEO6avDKu4SwdbVHsk30TVAwPd6srIdi9U6MOeOQSOSE4EsrrS7l\n' +
-        'SVmu2QIDUVFpm8QAHYplkyWIyGkupyl3ashH9mokQhixIU/Pzir0byePxHLHrwLu\n' +
-        '1axqeKpI0F5SBUPsaVNYY2uNFg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECDCCAvCgAwIBAgIQCREfzzVyDTMcNME+gWnTCTANBgkqhkiG9w0BAQsFADCB\n' +
-        'nDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTUwMwYDVQQDDCxB\n' +
-        'bWF6b24gUkRTIGFwLXNvdXRoZWFzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4G\n' +
-        'A1UEBwwHU2VhdHRsZTAgFw0yMTA1MjQyMDQyMzNaGA8yMDYxMDUyNDIxNDIzM1ow\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDL\n' +
-        '1MT6br3L/4Pq87DPXtcjlXN3cnbNk2YqRAZHJayStTz8VtsFcGPJOpk14geRVeVk\n' +
-        'e9uKFHRbcyr/RM4owrJTj5X4qcEuATYZbo6ou/rW2kYzuWFZpFp7lqm0vasV4Z9F\n' +
-        'fChlhwkNks0UbM3G+psCSMNSoF19ERunj7w2c4E62LwujkeYLvKGNepjnaH10TJL\n' +
-        '2krpERd+ZQ4jIpObtRcMH++bTrvklc+ei8W9lqrVOJL+89v2piN3Ecdd389uphst\n' +
-        'qQdb1BBVXbhUrtuGHgVf7zKqN1SkCoktoWxVuOprVWhSvr7akaWeq0UmlvbEsujU\n' +
-        'vADqxGMcJFyCzxx3CkJjAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O\n' +
-        'BBYEFFk8UJmlhoxFT3PP12PvhvazHjT4MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG\n' +
-        '9w0BAQsFAAOCAQEAfFtr2lGoWVXmWAsIo2NYre7kzL8Xb9Tx7desKxCCz5HOOvIr\n' +
-        '8JMB1YK6A7IOvQsLJQ/f1UnKRh3X3mJZjKIywfrMSh0FiDf+rjcEzXxw2dGtUem4\n' +
-        'A+WMvIA3jwxnJ90OQj5rQ8bg3iPtE6eojzo9vWQGw/Vu48Dtw1DJo9210Lq/6hze\n' +
-        'hPhNkFh8fMXNT7Q1Wz/TJqJElyAQGNOXhyGpHKeb0jHMMhsy5UNoW5hLeMS5ffao\n' +
-        'TBFWEJ1gVfxIU9QRxSh+62m46JIg+dwDlWv8Aww14KgepspRbMqDuaM2cinoejv6\n' +
-        't3dyOyHHrsOyv3ffZUKtQhQbQr+sUcL89lARsg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/zCCAuegAwIBAgIRAIJLTMpzGNxqHZ4t+c1MlCIwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyBhcC1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyNTIxMzAzM1oYDzIwNjEwNTI1MjIzMDMzWjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGFwLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDtdHut0ZhJ9Nn2\n' +
-        'MpVafFcwHdoEzx06okmmhjJsNy4l9QYVeh0UUoek0SufRNMRF4d5ibzpgZol0Y92\n' +
-        '/qKWNe0jNxhEj6sXyHsHPeYtNBPuDMzThfbvsLK8z7pBP7vVyGPGuppqW/6m4ZBB\n' +
-        'lcc9fsf7xpZ689iSgoyjiT6J5wlVgmCx8hFYc/uvcRtfd8jAHvheug7QJ3zZmIye\n' +
-        'V4htOW+fRVWnBjf40Q+7uTv790UAqs0Zboj4Yil+hER0ibG62y1g71XcCyvcVpto\n' +
-        '2/XW7Y9NCgMNqQ7fGN3wR1gjtSYPd7DO32LTzYhutyvfbpAZjsAHnoObmoljcgXI\n' +
-        'QjfBcCFpAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJI3aWLg\n' +
-        'CS5xqU5WYVaeT5s8lpO0MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\n' +
-        'AQEAUwATpJOcGVOs3hZAgJwznWOoTzOVJKfrqBum7lvkVH1vBwxBl9CahaKj3ZOt\n' +
-        'YYp2qJzhDUWludL164DL4ZjS6eRedLRviyy5cRy0581l1MxPWTThs27z+lCC14RL\n' +
-        'PJZNVYYdl7Jy9Q5NsQ0RBINUKYlRY6OqGDySWyuMPgno2GPbE8aynMdKP+f6G/uE\n' +
-        'YHOf08gFDqTsbyfa70ztgVEJaRooVf5JJq4UQtpDvVswW2reT96qi6tXPKHN5qp3\n' +
-        '3wI0I1Mp4ePmiBKku2dwYzPfrJK/pQlvu0Gu5lKOQ65QdotwLAAoaFqrf9za1yYs\n' +
-        'INUkHLWIxDds+4OHNYcerGp5Dw==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCTCCA/GgAwIBAgIRAIO6ldra1KZvNWJ0TA1ihXEwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIxMjE0NTA1WhgPMjEyMTA1MjEyMjQ1MDVa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\n' +
-        'sDN52Si9pFSyZ1ruh3xAN0nVqEs960o2IK5CPu/ZfshFmzAwnx/MM8EHt/jMeZtj\n' +
-        'SM58LADAsNDL01ELpFZATjgZQ6xNAyXRXE7RiTRUvNkK7O3o2qAGbLnJq/UqF7Sw\n' +
-        'LRnB8V6hYOv+2EjVnohtGCn9SUFGZtYDjWXsLd4ML4Zpxv0a5LK7oEC7AHzbUR7R\n' +
-        'jsjkrXqSv7GE7bvhSOhMkmgxgj1F3J0b0jdQdtyyj109aO0ATUmIvf+Bzadg5AI2\n' +
-        'A9UA+TUcGeebhpHu8AP1Hf56XIlzPpaQv3ZJ4vzoLaVNUC7XKzAl1dlvCl7Klg/C\n' +
-        '84qmbD/tjZ6GHtzpLKgg7kQEV7mRoXq8X4wDX2AFPPQl2fv+Kbe+JODqm5ZjGegm\n' +
-        'uskABBi8IFv1hYx9jEulZPxC6uD/09W2+niFm3pirnlWS83BwVDTUBzF+CooUIMT\n' +
-        'jhWkIIZGDDgMJTzouBHfoSJtS1KpUZi99m2WyVs21MNKHeWAbs+zmI6TO5iiMC+T\n' +
-        'uB8spaOiHFO1573Fmeer4sy3YA6qVoqVl6jjTQqOdy3frAMbCkwH22/crV8YA+08\n' +
-        'hLeHXrMK+6XUvU+EtHAM3VzcrLbuYJUI2XJbzTj5g0Eb8I8JWsHvWHR5K7Z7gceR\n' +
-        '78AzxQmoGEfV6KABNWKsgoCQnfb1BidDJIe3BsI0A6UCAwEAAaNCMEAwDwYDVR0T\n' +
-        'AQH/BAUwAwEB/zAdBgNVHQ4EFgQUABp0MlB14MSHgAcuNSOhs3MOlUcwDgYDVR0P\n' +
-        'AQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQCv4CIOBSQi/QR9NxdRgVAG/pAh\n' +
-        'tFJhV7OWb/wqwsNKFDtg6tTxwaahdCfWpGWId15OUe7G9LoPiKiwM9C92n0ZeHRz\n' +
-        '4ewbrQVo7Eu1JI1wf0rnZJISL72hVYKmlvaWaacHhWxvsbKLrB7vt6Cknxa+S993\n' +
-        'Kf8i2Psw8j5886gaxhiUtzMTBwoDWak8ZaK7m3Y6C6hXQk08+3pnIornVSFJ9dlS\n' +
-        'PAqt5UPwWmrEfF+0uIDORlT+cvrAwgSp7nUF1q8iasledycZ/BxFgQqzNwnkBDwQ\n' +
-        'Z/aM52ArGsTzfMhkZRz9HIEhz1/0mJw8gZtDVQroD8778h8zsx2SrIz7eWQ6uWsD\n' +
-        'QEeSWXpcheiUtEfzkDImjr2DLbwbA23c9LoexUD10nwohhoiQQg77LmvBVxeu7WU\n' +
-        'E63JqaYUlOLOzEmNJp85zekIgR8UTkO7Gc+5BD7P4noYscI7pPOL5rP7YLg15ZFi\n' +
-        'ega+G53NTckRXz4metsd8XFWloDjZJJq4FfD60VuxgXzoMNT9wpFTNSH42PR2s9L\n' +
-        'I1vcl3w8yNccs9se2utM2nLsItZ3J0m/+QSRiw9hbrTYTcM9sXki0DtH2kyIOwYf\n' +
-        'lOrGJDiYOIrXSQK36H0gQ+8omlrUTvUj4msvkXuQjlfgx6sgp2duOAfnGxE7uHnc\n' +
-        'UhnJzzoe6M+LfGHkVQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICuDCCAj2gAwIBAgIQSAG6j2WHtWUUuLGJTPb1nTAKBggqhkjOPQQDAzCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLW5vcnRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyMDE2MzgyNloYDzIxMjEwNTIwMTczODI2WjCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLW5vcnRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE2eqwU4FOzW8RV1W381Bd\n' +
-        'olhDOrqoMqzWli21oDUt7y8OnXM/lmAuOS6sr8Nt61BLVbONdbr+jgCYw75KabrK\n' +
-        'ZGg3siqvMOgabIKkKuXO14wtrGyGDt7dnKXg5ERGYOZlo0IwQDAPBgNVHRMBAf8E\n' +
-        'BTADAQH/MB0GA1UdDgQWBBS1Acp2WYxOcblv5ikZ3ZIbRCCW+zAOBgNVHQ8BAf8E\n' +
-        'BAMCAYYwCgYIKoZIzj0EAwMDaQAwZgIxAJL84J08PBprxmsAKPTotBuVI3MyW1r8\n' +
-        'xQ0i8lgCQUf8GcmYjQ0jI4oZyv+TuYJAcwIxAP9Xpzq0Docxb+4N1qVhpiOfWt1O\n' +
-        'FnemFiy9m1l+wv6p3riQMPV7mBVpklmijkIv3Q==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgIRALZLcqCVIJ25maDPE3sbPCIwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIxMjEzOTM5WhgPMjA2MTA1MjEyMjM5Mzla\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' +
-        'ypKc+6FfGx6Gl6fQ78WYS29QoKgQiur58oxR3zltWeg5fqh9Z85K5S3UbRSTqWWu\n' +
-        'Xcfnkz0/FS07qHX+nWAGU27JiQb4YYqhjZNOAq8q0+ptFHJ6V7lyOqXBq5xOzO8f\n' +
-        '+0DlbJSsy7GEtJp7d7QCM3M5KVY9dENVZUKeJwa8PC5StvwPx4jcLeZRJC2rAVDG\n' +
-        'SW7NAInbATvr9ssSh03JqjXb+HDyywiqoQ7EVLtmtXWimX+0b3/2vhqcH5jgcKC9\n' +
-        'IGFydrjPbv4kwMrKnm6XlPZ9L0/3FMzanXPGd64LQVy51SI4d5Xymn0Mw2kMX8s6\n' +
-        'Nf05OsWcDzJ1n6/Q1qHSxQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n' +
-        'DgQWBBRmaIc8eNwGP7i6P7AJrNQuK6OpFzAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAIBeHfGwz3S2zwIUIpqEEI5/sMySDeS+3nJR+woWAHeO0C8i\n' +
-        'BJdDh+kzzkP0JkWpr/4NWz84/IdYo1lqASd1Kopz9aT1+iROXaWr43CtbzjXb7/X\n' +
-        'Zv7eZZFC8/lS5SROq42pPWl4ekbR0w8XGQElmHYcWS41LBfKeHCUwv83ATF0XQ6I\n' +
-        '4t+9YSqZHzj4vvedrvcRInzmwWJaal9s7Z6GuwTGmnMsN3LkhZ+/GD6oW3pU/Pyh\n' +
-        'EtWqffjsLhfcdCs3gG8x9BbkcJPH5aPAVkPn4wc8wuXg6xxb9YGsQuY930GWTYRf\n' +
-        'schbgjsuqznW4HHakq4WNhs1UdTSTKkRdZz7FUQ=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEDzCCAvegAwIBAgIRAM2zAbhyckaqRim63b+Tib8wDQYJKoZIhvcNAQELBQAw\n' +
-        'gZ8xCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE4MDYGA1UEAwwv\n' +
-        'QW1hem9uIFJEUyBQcmV2aWV3IHVzLWVhc3QtMiBSb290IENBIFJTQTIwNDggRzEx\n' +
-        'EDAOBgNVBAcMB1NlYXR0bGUwIBcNMjEwNTE4MjA0OTQ1WhgPMjA2MTA1MTgyMTQ5\n' +
-        'NDVaMIGfMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNl\n' +
-        'cywgSW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExODA2BgNV\n' +
-        'BAMML0FtYXpvbiBSRFMgUHJldmlldyB1cy1lYXN0LTIgUm9vdCBDQSBSU0EyMDQ4\n' +
-        'IEcxMRAwDgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB\n' +
-        'CgKCAQEA1ybjQMH1MkbvfKsWJaCTXeCSN1SG5UYid+Twe+TjuSqaXWonyp4WRR5z\n' +
-        'tlkqq+L2MWUeQQAX3S17ivo/t84mpZ3Rla0cx39SJtP3BiA2BwfUKRjhPwOjmk7j\n' +
-        '3zrcJjV5k1vSeLNOfFFSlwyDiVyLAE61lO6onBx+cRjelu0egMGq6WyFVidTdCmT\n' +
-        'Q9Zw3W6LTrnPvPmEyjHy2yCHzH3E50KSd/5k4MliV4QTujnxYexI2eR8F8YQC4m3\n' +
-        'DYjXt/MicbqA366SOoJA50JbgpuVv62+LSBu56FpzY12wubmDZsdn4lsfYKiWxUy\n' +
-        'uc83a2fRXsJZ1d3whxrl20VFtLFHFQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\n' +
-        'MB0GA1UdDgQWBBRC0ytKmDYbfz0Bz0Psd4lRQV3aNTAOBgNVHQ8BAf8EBAMCAYYw\n' +
-        'DQYJKoZIhvcNAQELBQADggEBAGv8qZu4uaeoF6zsbumauz6ea6tdcWt+hGFuwGrb\n' +
-        'tRbI85ucAmVSX06x59DJClsb4MPhL1XmqO3RxVMIVVfRwRHWOsZQPnXm8OYQ2sny\n' +
-        'rYuFln1COOz1U/KflZjgJmxbn8x4lYiTPZRLarG0V/OsCmnLkQLPtEl/spMu8Un7\n' +
-        'r3K8SkbWN80gg17Q8EV5mnFwycUx9xsTAaFItuG0en9bGsMgMmy+ZsDmTRbL+lcX\n' +
-        'Fq8r4LT4QjrFz0shrzCwuuM4GmcYtBSxlacl+HxYEtAs5k10tmzRf6OYlY33tGf6\n' +
-        '1tkYvKryxDPF/EDgGp/LiBwx6ixYMBfISoYASt4V/ylAlHA=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICtTCCAjqgAwIBAgIRAK9BSZU6nIe6jqfODmuVctYwCgYIKoZIzj0EAwMwgZkx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1h\n' +
-        'em9uIFJEUyBjYS1jZW50cmFsLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTIxMjIxMzA5WhgPMjEyMTA1MjEyMzEzMDlaMIGZMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMjAwBgNVBAMMKUFtYXpv\n' +
-        'biBSRFMgY2EtY2VudHJhbC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEUkEERcgxneT5H+P+fERcbGmf\n' +
-        'bVx+M7rNWtgWUr6w+OBENebQA9ozTkeSg4c4M+qdYSObFqjxITdYxT1z/nHz1gyx\n' +
-        'OKAhLjWu+nkbRefqy3RwXaWT680uUaAP6ccnkZOMo0IwQDAPBgNVHRMBAf8EBTAD\n' +
-        'AQH/MB0GA1UdDgQWBBSN6fxlg0s5Wny08uRBYZcQ3TUoyzAOBgNVHQ8BAf8EBAMC\n' +
-        'AYYwCgYIKoZIzj0EAwMDaQAwZgIxAORaz+MBVoFBTmZ93j2G2vYTwA6T5hWzBWrx\n' +
-        'CrI54pKn5g6At56DBrkjrwZF5T1enAIxAJe/LZ9xpDkAdxDgGJFN8gZYLRWc0NRy\n' +
-        'Rb4hihy5vj9L+w9uKc9VfEBIFuhT7Z3ljg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEADCCAuigAwIBAgIQB/57HSuaqUkLaasdjxUdPjANBgkqhkiG9w0BAQsFADCB\n' +
-        'mDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\n' +
-        'bWF6b24gUkRTIGFwLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUxOTE3NDAzNFoYDzIwNjEwNTE5MTg0MDM0WjCBmDEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtbkaoVsUS76o\n' +
-        'TgLFmcnaB8cswBk1M3Bf4IVRcwWT3a1HeJSnaJUqWHCJ+u3ip/zGVOYl0gN1MgBb\n' +
-        'MuQRIJiB95zGVcIa6HZtx00VezDTr3jgGWRHmRjNVCCHGmxOZWvJjsIE1xavT/1j\n' +
-        'QYV/ph4EZEIZ/qPq7e3rHohJaHDe23Z7QM9kbyqp2hANG2JtU/iUhCxqgqUHNozV\n' +
-        'Zd0l5K6KnltZQoBhhekKgyiHqdTrH8fWajYl5seD71bs0Axowb+Oh0rwmrws3Db2\n' +
-        'Dh+oc2PwREnjHeca9/1C6J2vhY+V0LGaJmnnIuOANrslx2+bgMlyhf9j0Bv8AwSi\n' +
-        'dSWsobOhNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQb7vJT\n' +
-        'VciLN72yJGhaRKLn6Krn2TAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\n' +
-        'ggEBAAxEj8N9GslReAQnNOBpGl8SLgCMTejQ6AW/bapQvzxrZrfVOZOYwp/5oV0f\n' +
-        '9S1jcGysDM+DrmfUJNzWxq2Y586R94WtpH4UpJDGqZp+FuOVJL313te4609kopzO\n' +
-        'lDdmd+8z61+0Au93wB1rMiEfnIMkOEyt7D2eTFJfJRKNmnPrd8RjimRDlFgcLWJA\n' +
-        '3E8wca67Lz/G0eAeLhRHIXv429y8RRXDtKNNz0wA2RwURWIxyPjn1fHjA9SPDkeW\n' +
-        'E1Bq7gZj+tBnrqz+ra3yjZ2blss6Ds3/uRY6NYqseFTZWmQWT7FolZEnT9vMUitW\n' +
-        'I0VynUbShVpGf6946e0vgaaKw20=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/jCCAuagAwIBAgIQGyUVTaVjYJvWhroVEiHPpDANBgkqhkiG9w0BAQsFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIHVzLXdlc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTE5MTkwNDA2WhgPMjA2MTA1MTkyMDA0MDZaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgdXMtd2VzdC0xIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANhyXpJ0t4nigRDZ\n' +
-        'EwNtFOem1rM1k8k5XmziHKDvDk831p7QsX9ZOxl/BT59Pu/P+6W6SvasIyKls1sW\n' +
-        'FJIjFF+6xRQcpoE5L5evMgN/JXahpKGeQJPOX9UEXVW5B8yi+/dyUitFT7YK5LZA\n' +
-        'MqWBN/LtHVPa8UmE88RCDLiKkqiv229tmwZtWT7nlMTTCqiAHMFcryZHx0pf9VPh\n' +
-        'x/iPV8p2gBJnuPwcz7z1kRKNmJ8/cWaY+9w4q7AYlAMaq/rzEqDaN2XXevdpsYAK\n' +
-        'TMMj2kji4x1oZO50+VPNfBl5ZgJc92qz1ocF95SAwMfOUsP8AIRZkf0CILJYlgzk\n' +
-        '/6u6qZECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm5jfcS9o\n' +
-        '+LwL517HpB6hG+PmpBswDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\n' +
-        'AQAcQ6lsqxi63MtpGk9XK8mCxGRLCad51+MF6gcNz6i6PAqhPOoKCoFqdj4cEQTF\n' +
-        'F8dCfa3pvfJhxV6RIh+t5FCk/y6bWT8Ls/fYKVo6FhHj57bcemWsw/Z0XnROdVfK\n' +
-        'Yqbc7zvjCPmwPHEqYBhjU34NcY4UF9yPmlLOL8uO1JKXa3CAR0htIoW4Pbmo6sA4\n' +
-        '6P0co/clW+3zzsQ92yUCjYmRNeSbdXbPfz3K/RtFfZ8jMtriRGuO7KNxp8MqrUho\n' +
-        'HK8O0mlSUxGXBZMNicfo7qY8FD21GIPH9w5fp5oiAl7lqFzt3E3sCLD3IiVJmxbf\n' +
-        'fUwpGd1XZBBSdIxysRLM6j48\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrTCCAjOgAwIBAgIQU+PAILXGkpoTcpF200VD/jAKBggqhkjOPQQDAzCBljEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\n' +
-        'b24gUkRTIGFwLWVhc3QtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTAgFw0yMTA1MjUyMTQ1MTFaGA8yMTIxMDUyNTIyNDUxMVowgZYxCzAJBgNV\n' +
-        'BAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\n' +
-        'VQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\n' +
-        'UyBhcC1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\n' +
-        'djAQBgcqhkjOPQIBBgUrgQQAIgNiAAT3tFKE8Kw1sGQAvNLlLhd8OcGhlc7MiW/s\n' +
-        'NXm3pOiCT4vZpawKvHBzD76Kcv+ZZzHRxQEmG1/muDzZGlKR32h8AAj+NNO2Wy3d\n' +
-        'CKTtYMiVF6Z2zjtuSkZQdjuQbe4eQ7qjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\n' +
-        'VR0OBBYEFAiSQOp16Vv0Ohpvqcbd2j5RmhYNMA4GA1UdDwEB/wQEAwIBhjAKBggq\n' +
-        'hkjOPQQDAwNoADBlAjBVsi+5Ape0kOhMt/WFkANkslD4qXA5uqhrfAtH29Xzz2NV\n' +
-        'tR7akiA771OaIGB/6xsCMQCZt2egCtbX7J0WkuZ2KivTh66jecJr5DHvAP4X2xtS\n' +
-        'F/5pS+AUhcKTEGjI9jDH3ew=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICuDCCAj2gAwIBAgIQT5mGlavQzFHsB7hV6Mmy6TAKBggqhkjOPQQDAzCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyNDIwNTAxNVoYDzIxMjEwNTI0MjE1MDE1WjCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEcm4BBBjYK7clwm0HJRWS\n' +
-        'flt3iYwoJbIXiXn9c1y3E+Vb7bmuyKhS4eO8mwO4GefUcXObRfoHY2TZLhMJLVBQ\n' +
-        '7MN2xDc0RtZNj07BbGD3VAIFRTDX0mH9UNYd0JQM3t/Oo0IwQDAPBgNVHRMBAf8E\n' +
-        'BTADAQH/MB0GA1UdDgQWBBRrd5ITedfAwrGo4FA9UaDaGFK3rjAOBgNVHQ8BAf8E\n' +
-        'BAMCAYYwCgYIKoZIzj0EAwMDaQAwZgIxAPBNqmVv1IIA3EZyQ6XuVf4gj79/DMO8\n' +
-        'bkicNS1EcBpUqbSuU4Zwt2BYc8c/t7KVOQIxAOHoWkoKZPiKyCxfMtJpCZySUG+n\n' +
-        'sXgB/LOyWE5BJcXUfm+T1ckeNoWeUUMOLmnJjg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgIRAJcDeinvdNrDQBeJ8+t38WQwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtNCBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjIwNTI1MTY0OTE2WhgPMjA2MjA1MjUxNzQ5MTZa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTQgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' +
-        'k8DBNkr9tMoIM0NHoFiO7cQfSX0cOMhEuk/CHt0fFx95IBytx7GHCnNzpM27O5z6\n' +
-        'x6iRhfNnx+B6CrGyCzOjxvPizneY+h+9zfvNz9jj7L1I2uYMuiNyOKR6FkHR46CT\n' +
-        '1CiArfVLLPaTqgD/rQjS0GL2sLHS/0dmYipzynnZcs613XT0rAWdYDYgxDq7r/Yi\n' +
-        'Xge5AkWQFkMUq3nOYDLCyGGfQqWKkwv6lZUHLCDKf+Y0Uvsrj8YGCI1O8mF0qPCQ\n' +
-        'lmlfaDvbuBu1AV+aabmkvyFj3b8KRIlNLEtQ4N8KGYR2Jdb82S4YUGIOAt4wuuFt\n' +
-        '1B7AUDLk3V/u+HTWiwfoLQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n' +
-        'DgQWBBSNpcjz6ArWBtAA+Gz6kyyZxrrgdDAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAGJEd7UgOzHYIcQRSF7nSYyjLROyalaIV9AX4WXW/Cqlul1c\n' +
-        'MblP5etDZm7A/thliZIWAuyqv2bNicmS3xKvNy6/QYi1YgxZyy/qwJ3NdFl067W0\n' +
-        't8nGo29B+EVK94IPjzFHWShuoktIgp+dmpijB7wkTIk8SmIoe9yuY4+hzgqk+bo4\n' +
-        'ms2SOXSN1DoQ75Xv+YmztbnZM8MuWhL1T7hA4AMorzTQLJ9Pof8SpSdMHeDsHp0R\n' +
-        '01jogNFkwy25nw7cL62nufSuH2fPYGWXyNDg+y42wKsKWYXLRgUQuDVEJ2OmTFMB\n' +
-        'T0Vf7VuNijfIA9hkN2d3K53m/9z5WjGPSdOjGhg=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/jCCAuagAwIBAgIQRiwspKyrO0xoxDgSkqLZczANBgkqhkiG9w0BAQsFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIHVzLXdlc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTI0MjE1OTAwWhgPMjA2MTA1MjQyMjU5MDBaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgdXMtd2VzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL53Jk3GsKiu+4bx\n' +
-        'jDfsevWbwPCNJ3H08Zp7GWhvI3Tgi39opfHYv2ku2BKFjK8N2L6RvNPSR8yplv5j\n' +
-        'Y0tK0U+XVNl8o0ibhqRDhbTuh6KL8CFINWYzAajuxFS+CF0U6c1Q3tXLBdALxA7l\n' +
-        'FlXJ71QrP06W31kRe7kvgrvO7qWU3/OzUf9qYw4LSiR1/VkvvRCTqcVNw09clw/M\n' +
-        'Jbw6FSgweN65M9j7zPbjGAXSHkXyxH1Erin2fa+B9PE4ZDgX9cp2C1DHewYJQL/g\n' +
-        'SepwwcudVNRN1ibKH7kpMrgPnaNIVNx5sXVsTjk6q2ZqYw3SVHegltJpLy/cZReP\n' +
-        'mlivF2kCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUmTcQd6o1\n' +
-        'CuS65MjBrMwQ9JJjmBwwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\n' +
-        'AQAKSDSIzl956wVddPThf2VAzI8syw9ngSwsEHZvxVGHBvu5gg618rDyguVCYX9L\n' +
-        '4Kw/xJrk6S3qxOS2ZDyBcOpsrBskgahDFIunzoRP3a18ARQVq55LVgfwSDQiunch\n' +
-        'Bd05cnFGLoiLkR5rrkgYaP2ftn3gRBRaf0y0S3JXZ2XB3sMZxGxavYq9mfiEcwB0\n' +
-        'LMTMQ1NYzahIeG6Jm3LqRqR8HkzP/Ztq4dT2AtSLvFebbNMiWqeqT7OcYp94HTYT\n' +
-        'zqrtaVdUg9bwyAUCDgy0GV9RHDIdNAOInU/4LEETovrtuBU7Z1q4tcHXvN6Hd1H8\n' +
-        'gMb0mCG5I393qW5hFsA/diFb\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgIRAPQAvihfjBg/JDbj6U64K98wDQYJKoZIhvcNAQELBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIwMTYyODQxWhgPMjA2MTA1MjAxNzI4NDFa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' +
-        'vJ9lgyksCxkBlY40qOzI1TCj/Q0FVGuPL/Z1Mw2YN0l+41BDv0FHApjTUkIKOeIP\n' +
-        'nwDwpXTa3NjYbk3cOZ/fpH2rYJ++Fte6PNDGPgKppVCUh6x3jiVZ1L7wOgnTdK1Q\n' +
-        'Trw8440IDS5eLykRHvz8OmwvYDl0iIrt832V0QyOlHTGt6ZJ/aTQKl12Fy3QBLv7\n' +
-        'stClPzvHTrgWqVU6uidSYoDtzHbU7Vda7YH0wD9IUoMBf7Tu0rqcE4uH47s2XYkc\n' +
-        'SdLEoOg/Ngs7Y9B1y1GCyj3Ux7hnyvCoRTw014QyNB7dTatFMDvYlrRDGG14KeiU\n' +
-        'UL7Vo/+EejWI31eXNLw84wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n' +
-        'DgQWBBQkgTWFsNg6wA3HbbihDQ4vpt1E2zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAGz1Asiw7hn5WYUj8RpOCzpE0h/oBZcnxP8wulzZ5Xd0YxWO\n' +
-        '0jYUcUk3tTQy1QvoY+Q5aCjg6vFv+oFBAxkib/SmZzp4xLisZIGlzpJQuAgRkwWA\n' +
-        '6BVMgRS+AaOMQ6wKPgz1x4v6T0cIELZEPq3piGxvvqkcLZKdCaeC3wCS6sxuafzZ\n' +
-        '4qA3zMwWuLOzRftgX2hQto7d/2YkRXga7jSvQl3id/EI+xrYoH6zIWgjdU1AUaNq\n' +
-        'NGT7DIo47vVMfnd9HFZNhREsd4GJE83I+JhTqIxiKPNxrKgESzyADmNPt0gXDnHo\n' +
-        'tbV1pMZz5HpJtjnP/qVZhEK5oB0tqlKPv9yx074=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICuTCCAj6gAwIBAgIRAKp1Rn3aL/g/6oiHVIXtCq8wCgYIKoZIzj0EAwMwgZsx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\n' +
-        'em9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMTA1MjQyMDMyMTdaGA8yMTIxMDUyNDIxMzIxN1owgZsx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\n' +
-        'em9uIFJEUyBhcC1ub3J0aGVhc3QtMyBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGTYWPILeBJXfcL3Dz4z\n' +
-        'EWMUq78xB1HpjBwHoTURYfcMd5r96BTVG6yaUBWnAVCMeeD6yTG9a1eVGNhG14Hk\n' +
-        'ZAEjgLiNB7RRbEG5JZ/XV7W/vODh09WCst2y9SLKsdgeAaNCMEAwDwYDVR0TAQH/\n' +
-        'BAUwAwEB/zAdBgNVHQ4EFgQUoE0qZHmDCDB+Bnm8GUa/evpfPwgwDgYDVR0PAQH/\n' +
-        'BAQDAgGGMAoGCCqGSM49BAMDA2kAMGYCMQCnil5MMwhY3qoXv0xvcKZGxGPaBV15\n' +
-        '0CCssCKn0oVtdJQfJQ3Jrf3RSaEyijXIJsoCMQC35iJi4cWoNX3N/qfgnHohW52O\n' +
-        'B5dg0DYMqy5cNZ40+UcAanRMyqNQ6P7fy3umGco=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICtzCCAj2gAwIBAgIQPXnDTPegvJrI98qz8WxrMjAKBggqhkjOPQQDAzCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIEJldGEgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUxODIxNDAxMloYDzIxMjEwNTE4MjI0MDEyWjCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIEJldGEgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEI0sR7gwutK5AB46hM761\n' +
-        'gcLTGBIYlURSEoM1jcBwy56CL+3CJKZwLLyJ7qoOKfWbu5GsVLUTWS8MV6Nw33cx\n' +
-        '2KQD2svb694wi+Px2f4n9+XHkEFQw8BbiodDD7RZA70fo0IwQDAPBgNVHRMBAf8E\n' +
-        'BTADAQH/MB0GA1UdDgQWBBTQSioOvnVLEMXwNSDg+zgln/vAkjAOBgNVHQ8BAf8E\n' +
-        'BAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIxAMwu1hqm5Bc98uE/E0B5iMYbBQ4kpMxO\n' +
-        'tP8FTfz5UR37HUn26nXE0puj6S/Ffj4oJgIwXI7s2c26tFQeqzq6u3lrNJHp5jC9\n' +
-        'Uxlo/hEJOLoDj5jnpxo8dMAtCNoQPaHdfL0P\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjWgAwIBAgIQGKVv+5VuzEZEBzJ+bVfx2zAKBggqhkjOPQQDAzCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTE5MTc1MDU5WhgPMjEyMTA1MTkxODUwNTlaMIGXMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\n' +
-        'RFMgYXAtc291dGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\n' +
-        'ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMqdLJ0tZF/DGFZTKZDrGRJZID8ivC2I\n' +
-        'JRCYTWweZKCKSCAzoiuGGHzJhr5RlLHQf/QgmFcgXsdmO2n3CggzhA4tOD9Ip7Lk\n' +
-        'P05eHd2UPInyPCHRgmGjGb0Z+RdQ6zkitKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\n' +
-        'BgNVHQ4EFgQUC1yhRgVqU5bR8cGzOUCIxRpl4EYwDgYDVR0PAQH/BAQDAgGGMAoG\n' +
-        'CCqGSM49BAMDA2cAMGQCMG0c/zLGECRPzGKJvYCkpFTCUvdP4J74YP0v/dPvKojL\n' +
-        't/BrR1Tg4xlfhaib7hPc7wIwFvgqHes20CubQnZmswbTKLUrgSUW4/lcKFpouFd2\n' +
-        't2/ewfi/0VhkeUW+IiHhOMdU\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCTCCA/GgAwIBAgIRAOXxJuyXVkbfhZCkS/dOpfEwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI1MjE1OTEwWhgPMjEyMTA1MjUyMjU5MTBa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\n' +
-        'xiP4RDYm4tIS12hGgn1csfO8onQDmK5SZDswUpl0HIKXOUVVWkHNlINkVxbdqpqH\n' +
-        'FhbyZmNN6F/EWopotMDKe1B+NLrjNQf4zefv2vyKvPHJXhxoKmfyuTd5Wk8k1F7I\n' +
-        'lNwLQzznB+ElhrLIDJl9Ro8t31YBBNFRGAGEnxyACFGcdkjlsa52UwfYrwreEg2l\n' +
-        'gW5AzqHgjFfj9QRLydeU/n4bHm0F1adMsV7P3rVwilcUlqsENDwXnWyPEyv3sw6F\n' +
-        'wNemLEs1129mB77fwvySb+lLNGsnzr8w4wdioZ74co+T9z2ca+eUiP+EQccVw1Is\n' +
-        'D4Fh57IjPa6Wuc4mwiUYKkKY63+38aCfEWb0Qoi+zW+mE9nek6MOQ914cN12u5LX\n' +
-        'dBoYopphRO5YmubSN4xcBy405nIdSdbrAVWwxXnVVyjqjknmNeqQsPZaxAhdoKhV\n' +
-        'AqxNr8AUAdOAO6Sz3MslmcLlDXFihrEEOeUbpg/m1mSUUHGbu966ajTG1FuEHHwS\n' +
-        '7WB52yxoJo/tHvt9nAWnh3uH5BHmS8zn6s6CGweWKbX5yICnZ1QFR1e4pogxX39v\n' +
-        'XD6YcNOO+Vn+HY4nXmjgSYVC7l+eeP8eduMg1xJujzjrbmrXU+d+cBObgdTOAlpa\n' +
-        'JFHaGwYw1osAwPCo9cZ2f04yitBfj9aPFia8ASKldakCAwEAAaNCMEAwDwYDVR0T\n' +
-        'AQH/BAUwAwEB/zAdBgNVHQ4EFgQUqKS+ltlior0SyZKYAkJ/efv55towDgYDVR0P\n' +
-        'AQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQAdElvp8bW4B+Cv+1WSN87dg6TN\n' +
-        'wGyIjJ14/QYURgyrZiYpUmZpj+/pJmprSWXu4KNyqHftmaidu7cdjL5nCAvAfnY5\n' +
-        '/6eDDbX4j8Gt9fb/6H9y0O0dn3mUPSEKG0crR+JRFAtPhn/2FNvst2P82yguWLv0\n' +
-        'pHjHVUVcq+HqDMtUIJsTPYjSh9Iy77Q6TOZKln9dyDOWJpCSkiUWQtMAKbCSlvzd\n' +
-        'zTs/ahqpT+zLfGR1SR+T3snZHgQnbnemmz/XtlKl52NxccARwfcEEKaCRQyGq/pR\n' +
-        '0PVZasyJS9JY4JfQs4YOdeOt4UMZ8BmW1+BQWGSkkb0QIRl8CszoKofucAlqdPcO\n' +
-        'IT/ZaMVhI580LFGWiQIizWFskX6lqbCyHqJB3LDl8gJISB5vNTHOHpvpMOMs5PYt\n' +
-        'cRl5Mrksx5MKMqG7y5R734nMlZxQIHjL5FOoOxTBp9KeWIL/Ib89T2QDaLw1SQ+w\n' +
-        'ihqWBJ4ZdrIMWYpP3WqM+MXWk7WAem+xsFJdR+MDgOOuobVQTy5dGBlPks/6gpjm\n' +
-        'rO9TjfQ36ppJ3b7LdKUPeRfnYmlR5RU4oyYJ//uLbClI443RZAgxaCXX/nyc12lr\n' +
-        'eVLUMNF2abLX4/VF63m2/Z9ACgMRfqGshPssn1NN33OonrotQoj4S3N9ZrjvzKt8\n' +
-        'iHcaqd60QKpfiH2A3A==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICuDCCAj2gAwIBAgIQPaVGRuu86nh/ylZVCLB0MzAKBggqhkjOPQQDAzCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLW5vcnRoZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyNTIyMDMxNloYDzIxMjEwNTI1MjMwMzE2WjCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLW5vcnRoZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEexNURoB9KE93MEtEAlJG\n' +
-        'obz4LS/pD2hc8Gczix1WhVvpJ8bN5zCDXaKdnDMCebetyRQsmQ2LYlfmCwpZwSDu\n' +
-        '0zowB11Pt3I5Avu2EEcuKTlKIDMBeZ1WWuOd3Tf7MEAMo0IwQDAPBgNVHRMBAf8E\n' +
-        'BTADAQH/MB0GA1UdDgQWBBSaYbZPBvFLikSAjpa8mRJvyArMxzAOBgNVHQ8BAf8E\n' +
-        'BAMCAYYwCgYIKoZIzj0EAwMDaQAwZgIxAOEJkuh3Zjb7Ih/zuNRd1RBqmIYcnyw0\n' +
-        'nwUZczKXry+9XebYj3VQxSRNadrarPWVqgIxAMg1dyGoDAYjY/L/9YElyMnvHltO\n' +
-        'PwpJShmqHvCLc/mXMgjjYb/akK7yGthvW6j/uQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCDCCA/CgAwIBAgIQChu3v5W1Doil3v6pgRIcVzANBgkqhkiG9w0BAQwFADCB\n' +
-        'nDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTUwMwYDVQQDDCxB\n' +
-        'bWF6b24gUkRTIEJldGEgdXMtZWFzdC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4G\n' +
-        'A1UEBwwHU2VhdHRsZTAgFw0yMTA1MTgyMTM0MTVaGA8yMTIxMDUxODIyMzQxNVow\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBCZXRhIHVzLWVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC1\n' +
-        'FUGQ5tf3OwpDR6hGBxhUcrkwKZhaXP+1St1lSOQvjG8wXT3RkKzRGMvb7Ee0kzqI\n' +
-        'mzKKe4ASIhtV3UUWdlNmP0EA3XKnif6N79MismTeGkDj75Yzp5A6tSvqByCgxIjK\n' +
-        'JqpJrch3Dszoyn8+XhwDxMZtkUa5nQVdJgPzJ6ltsQ8E4SWLyLtTu0S63jJDkqYY\n' +
-        'S7cQblk7y7fel+Vn+LS5dGTdRRhMvSzEnb6mkVBaVzRyVX90FNUED06e8q+gU8Ob\n' +
-        'htvQlf9/kRzHwRAdls2YBhH40ZeyhpUC7vdtPwlmIyvW5CZ/QiG0yglixnL6xahL\n' +
-        'pbmTuTSA/Oqz4UGQZv2WzHe1lD2gRHhtFX2poQZeNQX8wO9IcUhrH5XurW/G9Xwl\n' +
-        'Sat9CMPERQn4KC3HSkat4ir2xaEUrjfg6c4XsGyh2Pk/LZ0gLKum0dyWYpWP4JmM\n' +
-        'RQNjrInXPbMhzQObozCyFT7jYegS/3cppdyy+K1K7434wzQGLU1gYXDKFnXwkX8R\n' +
-        'bRKgx2pHNbH5lUddjnNt75+e8m83ygSq/ZNBUz2Ur6W2s0pl6aBjwaDES4VfWYlI\n' +
-        'jokcmrGvJNDfQWygb1k00eF2bzNeNCHwgWsuo3HSxVgc/WGsbcGrTlDKfz+g3ich\n' +
-        'bXUeUidPhRiv5UQIVCLIHpHuin3bj9lQO/0t6p+tAQIDAQABo0IwQDAPBgNVHRMB\n' +
-        'Af8EBTADAQH/MB0GA1UdDgQWBBSFmMBgm5IsRv3hLrvDPIhcPweXYTAOBgNVHQ8B\n' +
-        'Af8EBAMCAYYwDQYJKoZIhvcNAQEMBQADggIBAAa2EuozymOsQDJlEi7TqnyA2OhT\n' +
-        'GXPfYqCyMJVkfrqNgcnsNpCAiNEiZbb+8sIPXnT8Ay8hrwJYEObJ5b7MHXpLuyft\n' +
-        'z0Pu1oFLKnQxKjNxrIsCvaB4CRRdYjm1q7EqGhMGv76se9stOxkOqO9it31w/LoU\n' +
-        'ENDk7GLsSqsV1OzYLhaH8t+MaNP6rZTSNuPrHwbV3CtBFl2TAZ7iKgKOhdFz1Hh9\n' +
-        'Pez0lG+oKi4mHZ7ajov6PD0W7njn5KqzCAkJR6OYmlNVPjir+c/vUtEs0j+owsMl\n' +
-        'g7KE5g4ZpTRShyh5BjCFRK2tv0tkqafzNtxrKC5XNpEkqqVTCnLcKG+OplIEadtr\n' +
-        'C7UWf4HyhCiR+xIyxFyR05p3uY/QQU/5uza7GlK0J+U1sBUytx7BZ+Fo8KQfPPqV\n' +
-        'CqDCaYUksoJcnJE/KeoksyqNQys7sDGJhkd0NeUGDrFLKHSLhIwAMbEWnqGxvhli\n' +
-        'E7sP2E5rI/I9Y9zTbLIiI8pfeZlFF8DBdoP/Hzg8pqsiE/yiXSFTKByDwKzGwNqz\n' +
-        'F0VoFdIZcIbLdDbzlQitgGpJtvEL7HseB0WH7B2PMMD8KPJlYvPveO3/6OLzCsav\n' +
-        '+CAkvk47NQViKMsUTKOA0JDCW+u981YRozxa3K081snhSiSe83zIPBz1ikldXxO9\n' +
-        '6YYLNPRrj3mi9T/f\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjSgAwIBAgIRAMkvdFnVDb0mWWFiXqnKH68wCgYIKoZIzj0EAwMwgZYx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\n' +
-        'em9uIFJEUyB1cy13ZXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTE5MTkxMzI0WhgPMjEyMTA1MTkyMDEzMjRaMIGWMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\n' +
-        'RFMgdXMtd2VzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\n' +
-        'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEy86DB+9th/0A5VcWqMSWDxIUblWTt/R0\n' +
-        'ao6Z2l3vf2YDF2wt1A2NIOGpfQ5+WAOJO/IQmnV9LhYo+kacB8sOnXdQa6biZZkR\n' +
-        'IyouUfikVQAKWEJnh1Cuo5YMM4E2sUt5o0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\n' +
-        'A1UdDgQWBBQ8u3OnecANmG8OoT7KLWDuFzZwBTAOBgNVHQ8BAf8EBAMCAYYwCgYI\n' +
-        'KoZIzj0EAwMDaAAwZQIwQ817qkb7mWJFnieRAN+m9W3E0FLVKaV3zC5aYJUk2fcZ\n' +
-        'TaUx3oLp3jPLGvY5+wgeAjEA6wAicAki4ZiDfxvAIuYiIe1OS/7H5RA++R8BH6qG\n' +
-        'iRzUBM/FItFpnkus7u/eTkvo\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrzCCAjWgAwIBAgIQS/+Ryfgb/IOVEa1pWoe8oTAKBggqhkjOPQQDAzCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoLTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjIwNjA2MjE1NDQyWhgPMjEyMjA2MDYyMjU0NDJaMIGXMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\n' +
-        'RFMgYXAtc291dGgtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\n' +
-        'ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDsX6fhdUWBQpYTdseBD/P3s96Dtw2Iw\n' +
-        'OrXKNToCnmX5nMkUGdRn9qKNiz1pw3EPzaPxShbYwQ7LYP09ENK/JN4QQjxMihxC\n' +
-        'jLFxS85nhBQQQGRCWikDAe38mD8fSvREQKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\n' +
-        'BgNVHQ4EFgQUIh1xZiseQYFjPYKJmGbruAgRH+AwDgYDVR0PAQH/BAQDAgGGMAoG\n' +
-        'CCqGSM49BAMDA2gAMGUCMFudS4zLy+UUGrtgNLtRMcu/DZ9BUzV4NdHxo0bkG44O\n' +
-        'thnjl4+wTKI6VbyAbj2rkgIxAOHps8NMITU5DpyiMnKTxV8ubb/WGHrLl0BjB8Lw\n' +
-        'ETVJk5DNuZvsIIcm7ykk6iL4Tw==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGBDCCA+ygAwIBAgIQDcEmNIAVrDpUw5cH5ynutDANBgkqhkiG9w0BAQwFADCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIG1lLWNlbnRyYWwtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwIBcNMjIwNTA3MDA0MDIzWhgPMjEyMjA1MDcwMTQwMjNaMIGa\n' +
-        'MQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\n' +
-        'LjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\n' +
-        'YXpvbiBSRFMgbWUtY2VudHJhbC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKvADk8t\n' +
-        'Fl9bFlU5sajLPPDSOUpPAkKs6iPlz+27o1GJC88THcOvf3x0nVAcu9WYe9Qaas+4\n' +
-        'j4a0vv51agqyODRD/SNi2HnqW7DbtLPAm6KBHe4twl28ItB/JD5g7u1oPAHFoXMS\n' +
-        'cH1CZEAs5RtlZGzJhcBXLFsHNv/7+SCLyZ7+2XFh9OrtgU4wMzkHoRNndhfwV5bu\n' +
-        '17bPTwuH+VxH37zXf1mQ/KjhuJos0C9dL0FpjYBAuyZTAWhZKs8dpSe4DI544z4w\n' +
-        'gkwUB4bC2nA1TBzsywEAHyNuZ/xRjNpWvx0ToWAA2iFJqC3VO3iKcnBplMvaUuMt\n' +
-        'jwzVSNBnKcoabXCZL2XDLt4YTZR8FSwz05IvsmwcPB7uNTBXq3T9sjejW8QQK3vT\n' +
-        'tzyfLq4jKmQE7PoS6cqYm+hEPm2hDaC/WP9bp3FdEJxZlPH26fq1b7BWYWhQ9pBA\n' +
-        'Nv9zTnzdR1xohTyOJBUFQ81ybEzabqXqVXUIANqIOaNcTB09/sLJ7+zuMhp3mwBu\n' +
-        'LtjfJv8PLuT1r63bU3seROhKA98b5KfzjvbvPSg3vws78JQyoYGbqNyDfyjVjg3U\n' +
-        'v//AdVuPie6PNtdrW3upZY4Qti5IjP9e3kimaJ+KAtTgMRG56W0WxD3SP7+YGGbG\n' +
-        'KhntDOkKsN39hLpn9UOafTIqFu7kIaueEy/NAgMBAAGjQjBAMA8GA1UdEwEB/wQF\n' +
-        'MAMBAf8wHQYDVR0OBBYEFHAems86dTwdZbLe8AaPy3kfIUVoMA4GA1UdDwEB/wQE\n' +
-        'AwIBhjANBgkqhkiG9w0BAQwFAAOCAgEAOBHpp0ICx81kmeoBcZTrMdJs2gnhcd85\n' +
-        'FoSCjXx9H5XE5rmN/lQcxxOgj8hr3uPuLdLHu+i6THAyzjrl2NA1FWiqpfeECGmy\n' +
-        '0jm7iZsYORgGQYp/VKnDrwnKNSqlZvOuRr0kfUexwFlr34Y4VmupvEOK/RdGsd3S\n' +
-        '+3hiemcHse9ST/sJLHx962AWMkN86UHPscJEe4+eT3f2Wyzg6La8ARwdWZSNS+WH\n' +
-        'ZfybrncMmuiXuUdHv9XspPsqhKgtHhcYeXOGUtrwQPLe3+VJZ0LVxhlTWr9951GZ\n' +
-        'GfmWwTV/9VsyKVaCFIXeQ6L+gjcKyEzYF8wpMtQlSc7FFqwgC4bKxvMBSaRy88Nr\n' +
-        'lV2+tJD/fr8zGUeBK44Emon0HKDBWGX+/Hq1ZIv0Da0S+j6LbA4fusWxtGfuGha+\n' +
-        'luhHgVInCpALIOamiBEdGhILkoTtx7JrYppt3/Raqg9gUNCOOYlCvGhqX7DXeEfL\n' +
-        'DGabooiY2FNWot6h04JE9nqGj5QqT8D6t/TL1nzxhRPzbcSDIHUd/b5R+a0bAA+7\n' +
-        'YTU6JqzEVCWKEIEynYmqikgLMGB/OzWsgyEL6822QW6hJAQ78XpbNeCzrICF4+GC\n' +
-        '7KShLnwuWoWpAb26268lvOEvCTFM47VC6jNQl97md+2SA9Ma81C9wflid2M83Wle\n' +
-        'cuLMVcQZceE=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEADCCAuigAwIBAgIQAhAteLRCvizAElaWORFU2zANBgkqhkiG9w0BAQsFADCB\n' +
-        'mDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\n' +
-        'bWF6b24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyMDE3MDkxNloYDzIwNjEwNTIwMTgwOTE2WjCBmDEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\n' +
-        'b24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+qg7JAcOVKjh\n' +
-        'N83SACnBFZPyB63EusfDr/0V9ZdL8lKcmZX9sv/CqoBo3N0EvBqHQqUUX6JvFb7F\n' +
-        'XrMUZ740kr28gSRALfXTFgNODjXeDsCtEkKRTkac/UM8xXHn+hR7UFRPHS3e0GzI\n' +
-        'iLiwQWDkr0Op74W8aM0CfaVKvh2bp4BI1jJbdDnQ9OKXpOxNHGUf0ZGb7TkNPkgI\n' +
-        'b2CBAc8J5o3H9lfw4uiyvl6Fz5JoP+A+zPELAioYBXDrbE7wJeqQDJrETWqR9VEK\n' +
-        'BXURCkVnHeaJy123MpAX2ozf4pqk0V0LOEOZRS29I+USF5DcWr7QIXR/w2I8ws1Q\n' +
-        '7ys+qbE+kQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQFJ16n\n' +
-        '1EcCMOIhoZs/F9sR+Jy++zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\n' +
-        'ggEBAOc5nXbT3XTDEZsxX2iD15YrQvmL5m13B3ImZWpx/pqmObsgx3/dg75rF2nQ\n' +
-        'qS+Vl+f/HLh516pj2BPP/yWCq12TRYigGav8UH0qdT3CAClYy2o+zAzUJHm84oiB\n' +
-        'ud+6pFVGkbqpsY+QMpJUbZWu52KViBpJMYsUEy+9cnPSFRVuRAHjYynSiLk2ZEjb\n' +
-        'Wkdc4x0nOZR5tP0FgrX0Ve2KcjFwVQJVZLgOUqmFYQ/G0TIIGTNh9tcmR7yp+xJR\n' +
-        'A2tbPV2Z6m9Yxx4E8lLEPNuoeouJ/GR4CkMEmF8cLwM310t174o3lKKUXJ4Vs2HO\n' +
-        'Wj2uN6R9oI+jGLMSswTzCNV1vgc=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICuDCCAj6gAwIBAgIRAOocLeZWjYkG/EbHmscuy8gwCgYIKoZIzj0EAwMwgZsx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMTA1MjEyMTUwMDFaGA8yMTIxMDUyMTIyNTAwMVowgZsx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE0MDIGA1UEAwwrQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aGVhc3QtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABCEr3jq1KtRncnZfK5cq\n' +
-        'btY0nW6ZG3FMbh7XwBIR6Ca0f8llGZ4vJEC1pXgiM/4Dh045B9ZIzNrR54rYOIfa\n' +
-        '2NcYZ7mk06DjIQML64hbAxbQzOAuNzLPx268MrlL2uW2XaNCMEAwDwYDVR0TAQH/\n' +
-        'BAUwAwEB/zAdBgNVHQ4EFgQUln75pChychwN4RfHl+tOinMrfVowDgYDVR0PAQH/\n' +
-        'BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMGiyPINRU1mwZ4Crw01vpuPvxZxb2IOr\n' +
-        'yX3RNlOIu4We1H+5dQk5tIvH8KGYFbWEpAIxAO9NZ6/j9osMhLgZ0yj0WVjb+uZx\n' +
-        'YlZR9fyFisY/jNfX7QhSk+nrc3SFLRUNtpXrng==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBTCCAu2gAwIBAgIRAKiaRZatN8eiz9p0s0lu0rQwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZoxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEzMDEGA1UEAwwq\n' +
-        'QW1hem9uIFJEUyBjYS1jZW50cmFsLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYD\n' +
-        'VQQHDAdTZWF0dGxlMCAXDTIxMDUyMTIyMDIzNVoYDzIwNjEwNTIxMjMwMjM1WjCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIGNhLWNlbnRyYWwtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCygVMf\n' +
-        'qB865IR9qYRBRFHn4eAqGJOCFx+UbraQZmjr/mnRqSkY+nhbM7Pn/DWOrRnxoh+w\n' +
-        'q5F9ZxdZ5D5T1v6kljVwxyfFgHItyyyIL0YS7e2h7cRRscCM+75kMedAP7icb4YN\n' +
-        'LfWBqfKHbHIOqvvQK8T6+Emu/QlG2B5LvuErrop9K0KinhITekpVIO4HCN61cuOe\n' +
-        'CADBKF/5uUJHwS9pWw3uUbpGUwsLBuhJzCY/OpJlDqC8Y9aToi2Ivl5u3/Q/sKjr\n' +
-        '6AZb9lx4q3J2z7tJDrm5MHYwV74elGSXoeoG8nODUqjgklIWAPrt6lQ3WJpO2kug\n' +
-        '8RhCdSbWkcXHfX95AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n' +
-        'FOIxhqTPkKVqKBZvMWtKewKWDvDBMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0B\n' +
-        'AQsFAAOCAQEAqoItII89lOl4TKvg0I1EinxafZLXIheLcdGCxpjRxlZ9QMQUN3yb\n' +
-        'y/8uFKBL0otbQgJEoGhxm4h0tp54g28M6TN1U0332dwkjYxUNwvzrMaV5Na55I2Z\n' +
-        '1hq4GB3NMXW+PvdtsgVOZbEN+zOyOZ5MvJHEQVkT3YRnf6avsdntltcRzHJ16pJc\n' +
-        'Y8rR7yWwPXh1lPaPkxddrCtwayyGxNbNmRybjR48uHRhwu7v2WuAMdChL8H8bp89\n' +
-        'TQLMrMHgSbZfee9hKhO4Zebelf1/cslRSrhkG0ESq6G5MUINj6lMg2g6F0F7Xz2v\n' +
-        'ncD/vuRN5P+vT8th/oZ0Q2Gc68Pun0cn/g==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/zCCAuegAwIBAgIRAJYlnmkGRj4ju/2jBQsnXJYwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyB1cy1lYXN0LTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyMTIzMDQ0NFoYDzIwNjEwNTIyMDAwNDQ0WjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIHVzLWVhc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC74V3eigv+pCj5\n' +
-        'nqDBqplY0Jp16pTeNB06IKbzb4MOTvNde6QjsZxrE1xUmprT8LxQqN9tI3aDYEYk\n' +
-        'b9v4F99WtQVgCv3Y34tYKX9NwWQgwS1vQwnIR8zOFBYqsAsHEkeJuSqAB12AYUSd\n' +
-        'Zv2RVFjiFmYJho2X30IrSLQfS/IE3KV7fCyMMm154+/K1Z2IJlcissydEAwgsUHw\n' +
-        'edrE6CxJVkkJ3EvIgG4ugK/suxd8eEMztaQYJwSdN8TdfT59LFuSPl7zmF3fIBdJ\n' +
-        '//WexcQmGabaJ7Xnx+6o2HTfkP8Zzzzaq8fvjAcvA7gyFH5EP26G2ZqMG+0y4pTx\n' +
-        'SPVTrQEXAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFIWWuNEF\n' +
-        'sUMOC82XlfJeqazzrkPDMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\n' +
-        'AQEAgClmxcJaQTGpEZmjElL8G2Zc8lGc+ylGjiNlSIw8X25/bcLRptbDA90nuP+q\n' +
-        'zXAMhEf0ccbdpwxG/P5a8JipmHgqQLHfpkvaXx+0CuP++3k+chAJ3Gk5XtY587jX\n' +
-        '+MJfrPgjFt7vmMaKmynndf+NaIJAYczjhJj6xjPWmGrjM3MlTa9XesmelMwP3jep\n' +
-        'bApIWAvCYVjGndbK9byyMq1nyj0TUzB8oJZQooaR3MMjHTmADuVBylWzkRMxbKPl\n' +
-        '4Nlsk4Ef1JvIWBCzsMt+X17nuKfEatRfp3c9tbpGlAE/DSP0W2/Lnayxr4RpE9ds\n' +
-        'ICF35uSis/7ZlsftODUe8wtpkQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/zCCA+egAwIBAgIRAPvvd+MCcp8E36lHziv0xhMwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyB1cy1lYXN0LTIgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyMTIzMTEwNloYDzIxMjEwNTIyMDAxMTA2WjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIHVzLWVhc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDbvwekKIKGcV/s\n' +
-        'lDU96a71ZdN2pTYkev1X2e2/ICb765fw/i1jP9MwCzs8/xHBEQBJSxdfO4hPeNx3\n' +
-        'ENi0zbM+TrMKliS1kFVe1trTTEaHYjF8BMK9yTY0VgSpWiGxGwg4tshezIA5lpu8\n' +
-        'sF6XMRxosCEVCxD/44CFqGZTzZaREIvvFPDTXKJ6yOYnuEkhH3OcoOajHN2GEMMQ\n' +
-        'ShuyRFDQvYkqOC/Q5icqFbKg7eGwfl4PmimdV7gOVsxSlw2s/0EeeIILXtHx22z3\n' +
-        '8QBhX25Lrq2rMuaGcD3IOMBeBo2d//YuEtd9J+LGXL9AeOXHAwpvInywJKAtXTMq\n' +
-        'Wsy3LjhuANFrzMlzjR2YdjkGVzeQVx3dKUzJ2//Qf7IXPSPaEGmcgbxuatxjnvfT\n' +
-        'H85oeKr3udKnXm0Kh7CLXeqJB5ITsvxI+Qq2iXtYCc+goHNR01QJwtGDSzuIMj3K\n' +
-        'f+YMrqBXZgYBwU2J/kCNTH31nfw96WTbOfNGwLwmVRDgguzFa+QzmQsJW4FTDMwc\n' +
-        '7cIjwdElQQVA+Gqa67uWmyDKAnoTkudmgAP+OTBkhnmc6NJuZDcy6f/iWUdl0X0u\n' +
-        '/tsfgXXR6ZovnHonM13ANiN7VmEVqFlEMa0VVmc09m+2FYjjlk8F9sC7Rc4wt214\n' +
-        '7u5YvCiCsFZwx44baP5viyRZgkJVpQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\n' +
-        'MB0GA1UdDgQWBBQgCZCsc34nVTRbWsniXBPjnUTQ2DAOBgNVHQ8BAf8EBAMCAYYw\n' +
-        'DQYJKoZIhvcNAQEMBQADggIBAAQas3x1G6OpsIvQeMS9BbiHG3+kU9P/ba6Rrg+E\n' +
-        'lUz8TmL04Bcd+I+R0IyMBww4NznT+K60cFdk+1iSmT8Q55bpqRekyhcdWda1Qu0r\n' +
-        'JiTi7zz+3w2v66akofOnGevDpo/ilXGvCUJiLOBnHIF0izUqzvfczaMZGJT6xzKq\n' +
-        'PcEVRyAN1IHHf5KnGzUlVFv9SGy47xJ9I1vTk24JU0LWkSLzMMoxiUudVmHSqJtN\n' +
-        'u0h+n/x3Q6XguZi1/C1KOntH56ewRh8n5AF7c+9LJJSRM9wunb0Dzl7BEy21Xe9q\n' +
-        '03xRYjf5wn8eDELB8FZPa1PrNKXIOLYM9egdctbKEcpSsse060+tkyBrl507+SJT\n' +
-        '04lvJ4tcKjZFqxn+bUkDQvXYj0D3WK+iJ7a8kZJPRvz8BDHfIqancY8Tgw+69SUn\n' +
-        'WqIb+HNZqFuRs16WFSzlMksqzXv6wcDSyI7aZOmCGGEcYW9NHk8EuOnOQ+1UMT9C\n' +
-        'Qb1GJcipjRzry3M4KN/t5vN3hIetB+/PhmgTO4gKhBETTEyPC3HC1QbdVfRndB6e\n' +
-        'U/NF2U/t8U2GvD26TTFLK4pScW7gyw4FQyXWs8g8FS8f+R2yWajhtS9++VDJQKom\n' +
-        'fAUISoCH+PlPRJpu/nHd1Zrddeiiis53rBaLbXu2J1Q3VqjWOmtj0HjxJJxWnYmz\n' +
-        'Pqj2\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGATCCA+mgAwIBAgIRAI/U4z6+GF8/znpHM8Dq8G0wDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMjA2MDYyMTQ4MThaGA8yMTIyMDYwNjIyNDgxOFowgZgx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK5WqMvyq888\n' +
-        '3uuOtEj1FcP6iZhqO5kJurdJF59Otp2WCg+zv6I+QwaAspEWHQsKD405XfFsTGKV\n' +
-        'SKTCwoMxwBniuChSmyhlagQGKSnRY9+znOWq0v7hgmJRwp6FqclTbubmr+K6lzPy\n' +
-        'hs86mEp68O5TcOTYWUlPZDqfKwfNTbtCl5YDRr8Gxb5buHmkp6gUSgDkRsXiZ5VV\n' +
-        'b3GBmXRqbnwo5ZRNAzQeM6ylXCn4jKs310lQGUrFbrJqlyxUdfxzqdlaIRn2X+HY\n' +
-        'xRSYbHox3LVNPpJxYSBRvpQVFSy9xbX8d1v6OM8+xluB31cbLBtm08KqPFuqx+cO\n' +
-        'I2H5F0CYqYzhyOSKJsiOEJT6/uH4ewryskZzncx9ae62SC+bB5n3aJLmOSTkKLFY\n' +
-        'YS5IsmDT2m3iMgzsJNUKVoCx2zihAzgBanFFBsG+Xmoq0aKseZUI6vd2qpd5tUST\n' +
-        '/wS1sNk0Ph7teWB2ACgbFE6etnJ6stwjHFZOj/iTYhlnR2zDRU8akunFdGb6CB4/\n' +
-        'hMxGJxaqXSJeGtHm7FpadlUTf+2ESbYcVW+ui/F8sdBJseQdKZf3VdZZMgM0bcaX\n' +
-        'NE47cauDTy72WdU9YJX/YXKYMLDE0iFHTnGpfVGsuWGPYhlwZ3dFIO07mWnCRM6X\n' +
-        'u5JXRB1oy5n5HRluMsmpSN/R92MeBxKFAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wHQYDVR0OBBYEFNtH0F0xfijSLHEyIkRGD9gW6NazMA4GA1UdDwEB/wQEAwIB\n' +
-        'hjANBgkqhkiG9w0BAQwFAAOCAgEACo+5jFeY3ygxoDDzL3xpfe5M0U1WxdKk+az4\n' +
-        '/OfjZvkoma7WfChi3IIMtwtKLYC2/seKWA4KjlB3rlTsCVNPnK6D+gAnybcfTKk/\n' +
-        'IRSPk92zagwQkSUWtAk80HpVfWJzpkSU16ejiajhedzOBRtg6BwsbSqLCDXb8hXr\n' +
-        'eXWC1S9ZceGc+LcKRHewGWPu31JDhHE9bNcl9BFSAS0lYVZqxIRWxivZ+45j5uQv\n' +
-        'wPrC8ggqsdU3K8quV6dblUQzzA8gKbXJpCzXZihkPrYpQHTH0szvXvgebh+CNUAG\n' +
-        'rUxm8+yTS0NFI3U+RLbcLFVzSvjMOnEwCX0SPj5XZRYYXs5ajtQCoZhTUkkwpDV8\n' +
-        'RxXk8qGKiXwUxDO8GRvmvM82IOiXz5w2jy/h7b7soyIgdYiUydMq4Ja4ogB/xPZa\n' +
-        'gf4y0o+bremO15HFf1MkaU2UxPK5FFVUds05pKvpSIaQWbF5lw4LHHj4ZtVup7zF\n' +
-        'CLjPWs4Hs/oUkxLMqQDw0FBwlqa4uot8ItT8uq5BFpz196ZZ+4WXw5PVzfSxZibI\n' +
-        'C/nwcj0AS6qharXOs8yPnPFLPSZ7BbmWzFDgo3tpglRqo3LbSPsiZR+sLeivqydr\n' +
-        '0w4RK1btRda5Ws88uZMmW7+2aufposMKcbAdrApDEAVzHijbB/nolS5nsnFPHZoA\n' +
-        'KDPtFEk=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICtzCCAj2gAwIBAgIQVZ5Y/KqjR4XLou8MCD5pOjAKBggqhkjOPQQDAzCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoZWFzdC00IFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIyMDUyNTE2NTgzM1oYDzIxMjIwNTI1MTc1ODMzWjCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoZWFzdC00IFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEbo473OmpD5vkckdJajXg\n' +
-        'brhmNFyoSa0WCY1njuZC2zMFp3zP6rX4I1r3imrYnJd9pFH/aSiV/r6L5ACE5RPx\n' +
-        '4qdg5SQ7JJUaZc3DWsTOiOed7BCZSzM+KTYK/2QzDMApo0IwQDAPBgNVHRMBAf8E\n' +
-        'BTADAQH/MB0GA1UdDgQWBBTmogc06+1knsej1ltKUOdWFvwgsjAOBgNVHQ8BAf8E\n' +
-        'BAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIxAIs7TlLMbGTWNXpGiKf9DxaM07d/iDHe\n' +
-        'F/Vv/wyWSTGdobxBL6iArQNVXz0Gr4dvPAIwd0rsoa6R0x5mtvhdRPtM37FYrbHJ\n' +
-        'pbV+OMusQqcSLseunLBoCHenvJW0QOCQ8EDY\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICvTCCAkOgAwIBAgIQCIY7E/bFvFN2lK9Kckb0dTAKBggqhkjOPQQDAzCBnjEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTcwNQYDVQQDDC5BbWF6\n' +
-        'b24gUkRTIFByZXZpZXcgdXMtZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYD\n' +
-        'VQQHDAdTZWF0dGxlMCAXDTIxMDUxODIxMDUxMFoYDzIxMjEwNTE4MjIwNTEwWjCB\n' +
-        'njELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTcwNQYDVQQDDC5B\n' +
-        'bWF6b24gUkRTIFByZXZpZXcgdXMtZWFzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEMI0hzf1JCEOI\n' +
-        'Eue4+DmcNnSs2i2UaJxHMrNGGfU7b42a7vwP53F7045ffHPBGP4jb9q02/bStZzd\n' +
-        'VHqfcgqkSRI7beBKjD2mfz82hF/wJSITTgCLs+NRpS6zKMFOFHUNo0IwQDAPBgNV\n' +
-        'HRMBAf8EBTADAQH/MB0GA1UdDgQWBBS8uF/6hk5mPLH4qaWv9NVZaMmyTjAOBgNV\n' +
-        'HQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIxAO7Pu9wzLyM0X7Q08uLIL+vL\n' +
-        'qaxe3UFuzFTWjM16MLJHbzLf1i9IDFKz+Q4hXCSiJwIwClMBsqT49BPUxVsJnjGr\n' +
-        'EbyEk6aOOVfY1p2yQL649zh3M4h8okLnwf+bYIb1YpeU\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEADCCAuigAwIBAgIQY+JhwFEQTe36qyRlUlF8ozANBgkqhkiG9w0BAQsFADCB\n' +
-        'mDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\n' +
-        'bWF6b24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUxOTE5MjQxNloYDzIwNjEwNTE5MjAyNDE2WjCBmDEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\n' +
-        'b24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnIye77j6ev40\n' +
-        '8wRPyN2OdKFSUfI9jB20Or2RLO+RDoL43+USXdrze0Wv4HMRLqaen9BcmCfaKMp0\n' +
-        'E4SFo47bXK/O17r6G8eyq1sqnHE+v288mWtYH9lAlSamNFRF6YwA7zncmE/iKL8J\n' +
-        '0vePHMHP/B6svw8LULZCk+nZk3tgxQn2+r0B4FOz+RmpkoVddfqqUPMbKUxhM2wf\n' +
-        'fO7F6bJaUXDNMBPhCn/3ayKCjYr49ErmnpYV2ZVs1i34S+LFq39J7kyv6zAgbHv9\n' +
-        '+/MtRMoRB1CjpqW0jIOZkHBdYcd1o9p1zFn591Do1wPkmMsWdjIYj+6e7UXcHvOB\n' +
-        '2+ScIRAcnwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQGtq2W\n' +
-        'YSyMMxpdQ3IZvcGE+nyZqTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\n' +
-        'ggEBAEgoP3ixJsKSD5FN8dQ01RNHERl/IFbA7TRXfwC+L1yFocKnQh4Mp/msPRSV\n' +
-        '+OeHIvemPW/wtZDJzLTOFJ6eTolGekHK1GRTQ6ZqsWiU2fmiOP8ks4oSpI+tQ9Lw\n' +
-        'VrfZqTiEcS5wEIqyfUAZZfKDo7W1xp+dQWzfczSBuZJZwI5iaha7+ILM0r8Ckden\n' +
-        'TVTapc5pLSoO15v0ziRuQ2bT3V3nwu/U0MRK44z+VWOJdSiKxdnOYDs8hFNnKhfe\n' +
-        'klbTZF7kW7WbiNYB43OaAQBJ6BALZsIskEaqfeZT8FD71uN928TcEQyBDXdZpRN+\n' +
-        'iGQZDGhht0r0URGMDSs9waJtTfA=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/jCCA+agAwIBAgIQXY/dmS+72lZPranO2JM9jjANBgkqhkiG9w0BAQwFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIGFwLWVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTI1MjEzNDUxWhgPMjEyMTA1MjUyMjM0NTFaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgYXAtZWFzdC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMyW9kBJjD/hx8e8\n' +
-        'b5E1sF42bp8TXsz1htSYE3Tl3T1Aq379DfEhB+xa/ASDZxt7/vwa81BkNo4M6HYq\n' +
-        'okYIXeE7cu5SnSgjWXqcERhgPevtAwgmhdE3yREe8oz2DyOi2qKKZqah+1gpPaIQ\n' +
-        'fK0uAqoeQlyHosye3KZZKkDHBatjBsQ5kf8lhuf7wVulEZVRHY2bP2X7N98PfbpL\n' +
-        'QdH7mWXzDtJJ0LiwFwds47BrkgK1pkHx2p1mTo+HMkfX0P6Fq1atkVC2RHHtbB/X\n' +
-        'iYyH7paaHBzviFrhr679zNqwXIOKlbf74w3mS11P76rFn9rS1BAH2Qm6eY5S/Fxe\n' +
-        'HEKXm4kjPN63Zy0p3yE5EjPt54yPkvumOnT+RqDGJ2HCI9k8Ehcbve0ogfdRKNqQ\n' +
-        'VHWYTy8V33ndQRHZlx/CuU1yN61TH4WSoMly1+q1ihTX9sApmlQ14B2pJi/9DnKW\n' +
-        'cwECrPy1jAowC2UJ45RtC8UC05CbP9yrIy/7Noj8gQDiDOepm+6w1g6aNlWoiuQS\n' +
-        'kyI6nzz1983GcnOHya73ga7otXo0Qfg9jPghlYiMomrgshlSLDHZG0Ib/3hb8cnR\n' +
-        '1OcN9FpzNmVK2Ll1SmTMLrIhuCkyNYX9O/bOknbcf706XeESxGduSkHEjIw/k1+2\n' +
-        'Atteoq5dT6cwjnJ9hyhiueVlVkiDAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\n' +
-        'HQYDVR0OBBYEFLUI+DD7RJs+0nRnjcwIVWzzYSsFMA4GA1UdDwEB/wQEAwIBhjAN\n' +
-        'BgkqhkiG9w0BAQwFAAOCAgEAb1mcCHv4qMQetLGTBH9IxsB2YUUhr5dda0D2BcHr\n' +
-        'UtDbfd0VQs4tux6h/6iKwHPx0Ew8fuuYj99WknG0ffgJfNc5/fMspxR/pc1jpdyU\n' +
-        '5zMQ+B9wi0lOZPO9uH7/pr+d2odcNEy8zAwqdv/ihsTwLmGP54is9fVbsgzNW1cm\n' +
-        'HKAVL2t/Ope+3QnRiRilKCN1lzhav4HHdLlN401TcWRWKbEuxF/FgxSO2Hmx86pj\n' +
-        'e726lweCTMmnq/cTsPOVY0WMjs0or3eHDVlyLgVeV5ldyN+ptg3Oit60T05SRa58\n' +
-        'AJPTaVKIcGQ/gKkKZConpu7GDofT67P/ox0YNY57LRbhsx9r5UY4ROgz7WMQ1yoS\n' +
-        'Y+19xizm+mBm2PyjMUbfwZUyCxsdKMwVdOq5/UmTmdms+TR8+m1uBHPOTQ2vKR0s\n' +
-        'Pd/THSzPuu+d3dbzRyDSLQbHFFneG760CUlD/ZmzFlQjJ89/HmAmz8IyENq+Sjhx\n' +
-        'Jgzy+FjVZb8aRUoYLlnffpUpej1n87Ynlr1GrvC4GsRpNpOHlwuf6WD4W0qUTsC/\n' +
-        'C9JO+fBzUj/aWlJzNcLEW6pte1SB+EdkR2sZvWH+F88TxemeDrV0jKJw5R89CDf8\n' +
-        'ZQNfkxJYjhns+YeV0moYjqQdc7tq4i04uggEQEtVzEhRLU5PE83nlh/K2NZZm8Kj\n' +
-        'dIA=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/zCCAuegAwIBAgIRAPVSMfFitmM5PhmbaOFoGfUwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyNTIyMzQ1N1oYDzIwNjEwNTI1MjMzNDU3WjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIHVzLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDu9H7TBeGoDzMr\n' +
-        'dxN6H8COntJX4IR6dbyhnj5qMD4xl/IWvp50lt0VpmMd+z2PNZzx8RazeGC5IniV\n' +
-        '5nrLg0AKWRQ2A/lGGXbUrGXCSe09brMQCxWBSIYe1WZZ1iU1IJ/6Bp4D2YEHpXrW\n' +
-        'bPkOq5x3YPcsoitgm1Xh8ygz6vb7PsvJvPbvRMnkDg5IqEThapPjmKb8ZJWyEFEE\n' +
-        'QRrkCIRueB1EqQtJw0fvP4PKDlCJAKBEs/y049FoOqYpT3pRy0WKqPhWve+hScMd\n' +
-        '6obq8kxTFy1IHACjHc51nrGII5Bt76/MpTWhnJIJrCnq1/Uc3Qs8IVeb+sLaFC8K\n' +
-        'DI69Sw6bAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE7PCopt\n' +
-        'lyOgtXX0Y1lObBUxuKaCMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\n' +
-        'AQEAFj+bX8gLmMNefr5jRJfHjrL3iuZCjf7YEZgn89pS4z8408mjj9z6Q5D1H7yS\n' +
-        'jNETVV8QaJip1qyhh5gRzRaArgGAYvi2/r0zPsy+Tgf7v1KGL5Lh8NT8iCEGGXwF\n' +
-        'g3Ir+Nl3e+9XUp0eyyzBIjHtjLBm6yy8rGk9p6OtFDQnKF5OxwbAgip42CD75r/q\n' +
-        'p421maEDDvvRFR4D+99JZxgAYDBGqRRceUoe16qDzbMvlz0A9paCZFclxeftAxv6\n' +
-        'QlR5rItMz/XdzpBJUpYhdzM0gCzAzdQuVO5tjJxmXhkSMcDP+8Q+Uv6FA9k2VpUV\n' +
-        'E/O5jgpqUJJ2Hc/5rs9VkAPXeA==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrzCCAjWgAwIBAgIQW0yuFCle3uj4vWiGU0SaGzAKBggqhkjOPQQDAzCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGFmLXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTE5MTkzNTE2WhgPMjEyMTA1MTkyMDM1MTZaMIGXMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\n' +
-        'RFMgYWYtc291dGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\n' +
-        'ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDPiKNZSaXs3Un/J/v+LTsFDANHpi7en\n' +
-        'oL2qh0u0DoqNzEBTbBjvO23bLN3k599zh6CY3HKW0r2k1yaIdbWqt4upMCRCcUFi\n' +
-        'I4iedAmubgzh56wJdoMZztjXZRwDthTkJKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\n' +
-        'BgNVHQ4EFgQUWbYkcrvVSnAWPR5PJhIzppcAnZIwDgYDVR0PAQH/BAQDAgGGMAoG\n' +
-        'CCqGSM49BAMDA2gAMGUCMCESGqpat93CjrSEjE7z+Hbvz0psZTHwqaxuiH64GKUm\n' +
-        'mYynIiwpKHyBrzjKBmeDoQIxANGrjIo6/b8Jl6sdIZQI18V0pAyLfLiZjlHVOnhM\n' +
-        'MOTVgr82ZuPoEHTX78MxeMnYlw==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgIRAIbsx8XOl0sgTNiCN4O+18QwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTI1MjE1NDU4WhgPMjA2MTA1MjUyMjU0NTha\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' +
-        'tROxwXWCgn5R9gI/2Ivjzaxc0g95ysBjoJsnhPdJEHQb7w3y2kWrVWU3Y9fOitgb\n' +
-        'CEsnEC3PrhRnzNVW0fPsK6kbvOeCmjvY30rdbxbc8h+bjXfGmIOgAkmoULEr6Hc7\n' +
-        'G1Q/+tvv4lEwIs7bEaf+abSZxRJbZ0MBxhbHn7UHHDiMZYvzK+SV1MGCxx7JVhrm\n' +
-        'xWu3GC1zZCsGDhB9YqY9eR6PmjbqA5wy8vqbC57dZZa1QVtWIQn3JaRXn+faIzHx\n' +
-        'nLMN5CEWihsdmHBXhnRboXprE/OS4MFv1UrQF/XM/h5RBeCywpHePpC+Oe1T3LNC\n' +
-        'iP8KzRFrjC1MX/WXJnmOVQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n' +
-        'DgQWBBS33XbXAUMs1znyZo4B0+B3D68WFTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBADuadd2EmlpueY2VlrIIPC30QkoA1EOSoCmZgN6124apkoY1\n' +
-        'HiV4r+QNPljN4WP8gmcARnNkS7ZeR4fvWi8xPh5AxQCpiaBMw4gcbTMCuKDV68Pw\n' +
-        'P2dZCTMspvR3CDfM35oXCufdtFnxyU6PAyINUqF/wyTHguO3owRFPz64+sk3r2pT\n' +
-        'WHmJjG9E7V+KOh0s6REgD17Gqn6C5ijLchSrPUHB0wOIkeLJZndHxN/76h7+zhMt\n' +
-        'fFeNxPWHY2MfpcaLjz4UREzZPSB2U9k+y3pW1omCIcl6MQU9itGx/LpQE+H3ZeX2\n' +
-        'M2bdYd5L+ow+bdbGtsVKOuN+R9Dm17YpswF+vyQ=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGATCCA+mgAwIBAgIRAKlQ+3JX9yHXyjP/Ja6kZhkwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMTA1MTkxNzQ1MjBaGA8yMTIxMDUxOTE4NDUyMFowgZgx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\n' +
-        'em9uIFJEUyBhcC1zb3V0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKtahBrpUjQ6\n' +
-        'H2mni05BAKU6Z5USPZeSKmBBJN3YgD17rJ93ikJxSgzJ+CupGy5rvYQ0xznJyiV0\n' +
-        '91QeQN4P+G2MjGQR0RGeUuZcfcZitJro7iAg3UBvw8WIGkcDUg+MGVpRv/B7ry88\n' +
-        '7E4OxKb8CPNoa+a9j6ABjOaaxaI22Bb7j3OJ+JyMICs6CU2bgkJaj3VUV9FCNUOc\n' +
-        'h9PxD4jzT9yyGYm/sK9BAT1WOTPG8XQUkpcFqy/IerZDfiQkf1koiSd4s5VhBkUn\n' +
-        'aQHOdri/stldT7a+HJFVyz2AXDGPDj+UBMOuLq0K6GAT6ThpkXCb2RIf4mdTy7ox\n' +
-        'N5BaJ+ih+Ro3ZwPkok60egnt/RN98jgbm+WstgjJWuLqSNInnMUgkuqjyBWwePqX\n' +
-        'Kib+wdpyx/LOzhKPEFpeMIvHQ3A0sjlulIjnh+j+itezD+dp0UNxMERlW4Bn/IlS\n' +
-        'sYQVNfYutWkRPRLErXOZXtlxxkI98JWQtLjvGzQr+jywxTiw644FSLWdhKa6DtfU\n' +
-        '2JWBHqQPJicMElfZpmfaHZjtXuCZNdZQXWg7onZYohe281ZrdFPOqC4rUq7gYamL\n' +
-        'T+ZB+2P+YCPOLJ60bj/XSvcB7mesAdg8P0DNddPhHUFWx2dFqOs1HxIVB4FZVA9U\n' +
-        'Ppbv4a484yxjTgG7zFZNqXHKTqze6rBBAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wHQYDVR0OBBYEFCEAqjighncv/UnWzBjqu1Ka2Yb4MA4GA1UdDwEB/wQEAwIB\n' +
-        'hjANBgkqhkiG9w0BAQwFAAOCAgEAYyvumblckIXlohzi3QiShkZhqFzZultbFIu9\n' +
-        'GhA5CDar1IFMhJ9vJpO9nUK/camKs1VQRs8ZsBbXa0GFUM2p8y2cgUfLwFULAiC/\n' +
-        'sWETyW5lcX/xc4Pyf6dONhqFJt/ovVBxNZtcmMEWv/1D6Tf0nLeEb0P2i/pnSRR4\n' +
-        'Oq99LVFjossXtyvtaq06OSiUUZ1zLPvV6AQINg8dWeBOWRcQYhYcEcC2wQ06KShZ\n' +
-        '0ahuu7ar5Gym3vuLK6nH+eQrkUievVomN/LpASrYhK32joQ5ypIJej3sICIgJUEP\n' +
-        'UoeswJ+Z16f3ECoL1OSnq4A0riiLj1ZGmVHNhM6m/gotKaHNMxsK9zsbqmuU6IT/\n' +
-        'P6cR0S+vdigQG8ZNFf5vEyVNXhl8KcaJn6lMD/gMB2rY0qpaeTg4gPfU5wcg8S4Y\n' +
-        'C9V//tw3hv0f2n+8kGNmqZrylOQDQWSSo8j8M2SRSXiwOHDoTASd1fyBEIqBAwzn\n' +
-        'LvXVg8wQd1WlmM3b0Vrsbzltyh6y4SuKSkmgufYYvC07NknQO5vqvZcNoYbLNea3\n' +
-        '76NkFaMHUekSbwVejZgG5HGwbaYBgNdJEdpbWlA3X4yGRVxknQSUyt4dZRnw/HrX\n' +
-        'k8x6/wvtw7wht0/DOqz1li7baSsMazqxx+jDdSr1h9xML416Q4loFCLgqQhil8Jq\n' +
-        'Em4Hy3A=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGBTCCA+2gAwIBAgIRAJfKe4Zh4aWNt3bv6ZjQwogwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZoxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEzMDEGA1UEAwwq\n' +
-        'QW1hem9uIFJEUyBjYS1jZW50cmFsLTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYD\n' +
-        'VQQHDAdTZWF0dGxlMCAXDTIxMDUyMTIyMDg1M1oYDzIxMjEwNTIxMjMwODUzWjCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIGNhLWNlbnRyYWwtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpgUH6\n' +
-        'Crzd8cOw9prAh2rkQqAOx2vtuI7xX4tmBG4I/um28eBjyVmgwQ1fpq0Zg2nCKS54\n' +
-        'Nn0pCmT7f3h6Bvopxn0J45AzXEtajFqXf92NQ3iPth95GVfAJSD7gk2LWMhpmID9\n' +
-        'JGQyoGuDPg+hYyr292X6d0madzEktVVGO4mKTF989qEg+tY8+oN0U2fRTrqa2tZp\n' +
-        'iYsmg350ynNopvntsJAfpCO/srwpsqHHLNFZ9jvhTU8uW90wgaKO9i31j/mHggCE\n' +
-        '+CAOaJCM3g+L8DPl/2QKsb6UkBgaaIwKyRgKSj1IlgrK+OdCBCOgM9jjId4Tqo2j\n' +
-        'ZIrrPBGl6fbn1+etZX+2/tf6tegz+yV0HHQRAcKCpaH8AXF44bny9andslBoNjGx\n' +
-        'H6R/3ib4FhPrnBMElzZ5i4+eM/cuPC2huZMBXb/jKgRC/QN1Wm3/nah5FWq+yn+N\n' +
-        'tiAF10Ga0BYzVhHDEwZzN7gn38bcY5yi/CjDUNpY0OzEe2+dpaBKPlXTaFfn9Nba\n' +
-        'CBmXPRF0lLGGtPeTAgjcju+NEcVa82Ht1pqxyu2sDtbu3J5bxp4RKtj+ShwN8nut\n' +
-        'Tkf5Ea9rSmHEY13fzgibZlQhXaiFSKA2ASUwgJP19Putm0XKlBCNSGCoECemewxL\n' +
-        '+7Y8FszS4Uu4eaIwvXVqUEE2yf+4ex0hqQ1acQIDAQABo0IwQDAPBgNVHRMBAf8E\n' +
-        'BTADAQH/MB0GA1UdDgQWBBSeUnXIRxNbYsZLtKomIz4Y1nOZEzAOBgNVHQ8BAf8E\n' +
-        'BAMCAYYwDQYJKoZIhvcNAQEMBQADggIBAIpRvxVS0dzoosBh/qw65ghPUGSbP2D4\n' +
-        'dm6oYCv5g/zJr4fR7NzEbHOXX5aOQnHbQL4M/7veuOCLNPOW1uXwywMg6gY+dbKe\n' +
-        'YtPVA1as8G9sUyadeXyGh2uXGsziMFXyaESwiAXZyiYyKChS3+g26/7jwECFo5vC\n' +
-        'XGhWpIO7Hp35Yglp8AnwnEAo/PnuXgyt2nvyTSrxlEYa0jus6GZEZd77pa82U1JH\n' +
-        'qFhIgmKPWWdvELA3+ra1nKnvpWM/xX0pnMznMej5B3RT3Y+k61+kWghJE81Ix78T\n' +
-        '+tG4jSotgbaL53BhtQWBD1yzbbilqsGE1/DXPXzHVf9yD73fwh2tGWSaVInKYinr\n' +
-        'a4tcrB3KDN/PFq0/w5/21lpZjVFyu/eiPj6DmWDuHW73XnRwZpHo/2OFkei5R7cT\n' +
-        'rn/YdDD6c1dYtSw5YNnS6hdCQ3sOiB/xbPRN9VWJa6se79uZ9NLz6RMOr73DNnb2\n' +
-        'bhIR9Gf7XAA5lYKqQk+A+stoKbIT0F65RnkxrXi/6vSiXfCh/bV6B41cf7MY/6YW\n' +
-        'ehserSdjhQamv35rTFdM+foJwUKz1QN9n9KZhPxeRmwqPitAV79PloksOnX25ElN\n' +
-        'SlyxdndIoA1wia1HRd26EFm2pqfZ2vtD2EjU3wD42CXX4H8fKVDna30nNFSYF0yn\n' +
-        'jGKc3k6UNxpg\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/jCCA+agAwIBAgIQaRHaEqqacXN20e8zZJtmDDANBgkqhkiG9w0BAQwFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIHVzLWVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTI1MjIzODM1WhgPMjEyMTA1MjUyMzM4MzVaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgdXMtZWFzdC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAInfBCaHuvj6Rb5c\n' +
-        'L5Wmn1jv2PHtEGMHm+7Z8dYosdwouG8VG2A+BCYCZfij9lIGszrTXkY4O7vnXgru\n' +
-        'JUNdxh0Q3M83p4X+bg+gODUs3jf+Z3Oeq7nTOk/2UYvQLcxP4FEXILxDInbQFcIx\n' +
-        'yen1ESHggGrjEodgn6nbKQNRfIhjhW+TKYaewfsVWH7EF2pfj+cjbJ6njjgZ0/M9\n' +
-        'VZifJFBgat6XUTOf3jwHwkCBh7T6rDpgy19A61laImJCQhdTnHKvzTpxcxiLRh69\n' +
-        'ZObypR7W04OAUmFS88V7IotlPmCL8xf7kwxG+gQfvx31+A9IDMsiTqJ1Cc4fYEKg\n' +
-        'bL+Vo+2Ii4W2esCTGVYmHm73drznfeKwL+kmIC/Bq+DrZ+veTqKFYwSkpHRyJCEe\n' +
-        'U4Zym6POqQ/4LBSKwDUhWLJIlq99bjKX+hNTJykB+Lbcx0ScOP4IAZQoxmDxGWxN\n' +
-        'S+lQj+Cx2pwU3S/7+OxlRndZAX/FKgk7xSMkg88HykUZaZ/ozIiqJqSnGpgXCtED\n' +
-        'oQ4OJw5ozAr+/wudOawaMwUWQl5asD8fuy/hl5S1nv9XxIc842QJOtJFxhyeMIXt\n' +
-        'LVECVw/dPekhMjS3Zo3wwRgYbnKG7YXXT5WMxJEnHu8+cYpMiRClzq2BEP6/MtI2\n' +
-        'AZQQUFu2yFjRGL2OZA6IYjxnXYiRAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\n' +
-        'HQYDVR0OBBYEFADCcQCPX2HmkqQcmuHfiQ2jjqnrMA4GA1UdDwEB/wQEAwIBhjAN\n' +
-        'BgkqhkiG9w0BAQwFAAOCAgEASXkGQ2eUmudIKPeOIF7RBryCoPmMOsqP0+1qxF8l\n' +
-        'pGkwmrgNDGpmd9s0ArfIVBTc1jmpgB3oiRW9c6n2OmwBKL4UPuQ8O3KwSP0iD2sZ\n' +
-        'KMXoMEyphCEzW1I2GRvYDugL3Z9MWrnHkoaoH2l8YyTYvszTvdgxBPpM2x4pSkp+\n' +
-        '76d4/eRpJ5mVuQ93nC+YG0wXCxSq63hX4kyZgPxgCdAA+qgFfKIGyNqUIqWgeyTP\n' +
-        'n5OgKaboYk2141Rf2hGMD3/hsGm0rrJh7g3C0ZirPws3eeJfulvAOIy2IZzqHUSY\n' +
-        'jkFzraz6LEH3IlArT3jUPvWKqvh2lJWnnp56aqxBR7qHH5voD49UpJWY1K0BjGnS\n' +
-        'OHcurpp0Yt/BIs4VZeWdCZwI7JaSeDcPMaMDBvND3Ia5Fga0thgYQTG6dE+N5fgF\n' +
-        'z+hRaujXO2nb0LmddVyvE8prYlWRMuYFv+Co8hcMdJ0lEZlfVNu0jbm9/GmwAZ+l\n' +
-        '9umeYO9yz/uC7edC8XJBglMAKUmVK9wNtOckUWAcCfnPWYLbYa/PqtXBYcxrso5j\n' +
-        'iaS/A7iEW51uteHBGrViCy1afGG+hiUWwFlesli+Rq4dNstX3h6h2baWABaAxEVJ\n' +
-        'y1RnTQSz6mROT1VmZSgSVO37rgIyY0Hf0872ogcTS+FfvXgBxCxsNWEbiQ/XXva4\n' +
-        '0Ws=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICtDCCAjqgAwIBAgIRAMyaTlVLN0ndGp4ffwKAfoMwCgYIKoZIzj0EAwMwgZkx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1h\n' +
-        'em9uIFJEUyBtZS1jZW50cmFsLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjIwNTA3MDA0NDM3WhgPMjEyMjA1MDcwMTQ0MzdaMIGZMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMjAwBgNVBAMMKUFtYXpv\n' +
-        'biBSRFMgbWUtY2VudHJhbC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE19nCV1nsI6CohSor13+B25cr\n' +
-        'zg+IHdi9Y3L7ziQnHWI6yjBazvnKD+oC71aRRlR8b5YXsYGUQxWzPLHN7EGPcSGv\n' +
-        'bzA9SLG1KQYCJaQ0m9Eg/iGrwKWOgylbhVw0bCxoo0IwQDAPBgNVHRMBAf8EBTAD\n' +
-        'AQH/MB0GA1UdDgQWBBS4KsknsJXM9+QPEkBdZxUPaLr11zAOBgNVHQ8BAf8EBAMC\n' +
-        'AYYwCgYIKoZIzj0EAwMDaAAwZQIxAJaRgrYIEfXQMZQQDxMTYS0azpyWSseQooXo\n' +
-        'L3nYq4OHGBgYyQ9gVjvRYWU85PXbfgIwdi82DtANQFkCu+j+BU0JBY/uRKPEeYzo\n' +
-        'JG92igKIcXPqCoxIJ7lJbbzmuf73gQu5\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGATCCA+mgAwIBAgIRAJwCobx0Os8F7ihbJngxrR8wDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\n' +
-        'QW1hem9uIFJEUyBtZS1zb3V0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMTA1MjAxNzE1MzNaGA8yMTIxMDUyMDE4MTUzM1owgZgx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\n' +
-        'em9uIFJEUyBtZS1zb3V0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANukKwlm+ZaI\n' +
-        'Y5MkWGbEVLApEyLmlrHLEg8PfiiEa9ts7jssQcin3bzEPdTqGr5jo91ONoZ3ccWq\n' +
-        'xJgg1W3bLu5CAO2CqIOXTXHRyCO/u0Ch1FGgWB8xETPSi3UHt/Vn1ltdO6DYdbDU\n' +
-        'mYgwzYrvLBdRCwxsb9o+BuYQHVFzUYonqk/y9ujz3gotzFq7r55UwDTA1ita3vb4\n' +
-        'eDKjIb4b1M4Wr81M23WHonpje+9qkkrAkdQcHrkgvSCV046xsq/6NctzwCUUNsgF\n' +
-        '7Q1a8ut5qJEYpz5ta8vI1rqFqAMBqCbFjRYlmAoTTpFPOmzAVxV+YoqTrW5A16su\n' +
-        '/2SXlMYfJ/n/ad/QfBNPPAAQMpyOr2RCL/YiL/PFZPs7NxYjnZHNWxMLSPgFyI+/\n' +
-        't2klnn5jR76KJK2qimmaXedB90EtFsMRUU1e4NxH9gDuyrihKPJ3aVnZ35mSipvR\n' +
-        '/1KB8t8gtFXp/VQaz2sg8+uxPMKB81O37fL4zz6Mg5K8+aq3ejBiyHucpFGnsnVB\n' +
-        '3kQWeD36ONkybngmgWoyPceuSWm1hQ0Z7VRAQX+KlxxSaHmSaIk1XxZu9h9riQHx\n' +
-        'fMuev6KXjRn/CjCoUTn+7eFrt0dT5GryQEIZP+nA0oq0LKxogigHNZlwAT4flrqb\n' +
-        'JUfZJrqgoce5HjZSXl10APbtPjJi0fW9AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wHQYDVR0OBBYEFEfV+LztI29OVDRm0tqClP3NrmEWMA4GA1UdDwEB/wQEAwIB\n' +
-        'hjANBgkqhkiG9w0BAQwFAAOCAgEAvSNe+0wuk53KhWlRlRf2x/97H2Q76X3anzF0\n' +
-        '5fOSVm022ldALzXMzqOfdnoKIhAu2oVKiHHKs7mMas+T6TL+Mkphx0CYEVxFE3PG\n' +
-        '061q3CqJU+wMm9W9xsB79oB2XG47r1fIEywZZ3GaRsatAbjcNOT8uBaATPQAfJFN\n' +
-        'zjFe4XyN+rA4cFrYNvfHTeu5ftrYmvks7JlRaJgEGWsz+qXux7uvaEEVPqEumd2H\n' +
-        'uYeaRNOZ2V23R009X5lbgBFx9tq5VDTnKhQiTQ2SeT0rc1W3Dz5ik6SbQQNP3nSR\n' +
-        '0Ywy7r/sZ3fcDyfFiqnrVY4Ympfvb4YW2PZ6OsQJbzH6xjdnTG2HtzEU30ngxdp1\n' +
-        'WUEF4zt6rjJCp7QBUqXgdlHvJqYu6949qtWjEPiFN9uSsRV2i1YDjJqN52dLjAPn\n' +
-        'AipJKo8x1PHTwUzuITqnB9BdP+5TlTl8biJfkEf/+08eWDTLlDHr2VrZLOLompTh\n' +
-        'bS5OrhDmqA2Q+O+EWrTIhMflwwlCpR9QYM/Xwvlbad9H0FUHbJsCVNaru3wGOgWo\n' +
-        'tt3dNSK9Lqnv/Ej9K9v6CRr36in4ylJKivhJ5B9E7ABHg7EpBJ1xi7O5eNDkNoJG\n' +
-        '+pFyphJq3AkBR2U4ni2tUaTAtSW2tks7IaiDV+UMtqZyGabT5ISQfWLLtLHSWn2F\n' +
-        'Tspdjbg=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIECTCCAvGgAwIBAgIRAJZFh4s9aZGzKaTMLrSb4acwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBCZXRhIHVzLWVhc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTE4MjEyODQxWhgPMjA2MTA1MTgyMjI4NDFa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgQmV0YSB1cy1lYXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n' +
-        '17i2yoU6diep+WrqxIn2CrDEO2NdJVwWTSckx4WMZlLpkQDoymSmkNHjq9ADIApD\n' +
-        'A31Cx+843apL7wub8QkFZD0Tk7/ThdHWJOzcAM3ov98QBPQfOC1W5zYIIRP2F+vQ\n' +
-        'TRETHQnLcW3rLv0NMk5oQvIKpJoC9ett6aeVrzu+4cU4DZVWYlJUoC/ljWzCluau\n' +
-        '8blfW0Vwin6OB7s0HCG5/wijQWJBU5SrP/KAIPeQi1GqG5efbqAXDr/ple0Ipwyo\n' +
-        'Xjjl73LenGUgqpANlC9EAT4i7FkJcllLPeK3NcOHjuUG0AccLv1lGsHAxZLgjk/x\n' +
-        'z9ZcnVV9UFWZiyJTKxeKPwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud\n' +
-        'DgQWBBRWyMuZUo4gxCR3Luf9/bd2AqZ7CjAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZI\n' +
-        'hvcNAQELBQADggEBAIqN2DlIKlvDFPO0QUZQVFbsi/tLdYM98/vvzBpttlTGVMyD\n' +
-        'gJuQeHVz+MnhGIwoCGOlGU3OOUoIlLAut0+WG74qYczn43oA2gbMd7HoD7oL/IGg\n' +
-        'njorBwJVcuuLv2G//SqM3nxGcLRtkRnQ+lvqPxMz9+0fKFUn6QcIDuF0QSfthLs2\n' +
-        'WSiGEPKO9c9RSXdRQ4pXA7c3hXng8P4A2ZmdciPne5Nu4I4qLDGZYRrRLRkNTrOi\n' +
-        'TyS6r2HNGUfgF7eOSeKt3NWL+mNChcYj71/Vycf5edeczpUgfnWy9WbPrK1svKyl\n' +
-        'aAs2xg+X6O8qB+Mnj2dNBzm+lZIS3sIlm+nO9sg=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjSgAwIBAgIRAPAlEk8VJPmEzVRRaWvTh2AwCgYIKoZIzj0EAwMwgZYx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\n' +
-        'em9uIFJEUyB1cy1lYXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTI1MjI0MTU1WhgPMjEyMTA1MjUyMzQxNTVaMIGWMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\n' +
-        'RFMgdXMtZWFzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\n' +
-        'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEx5xjrup8II4HOJw15NTnS3H5yMrQGlbj\n' +
-        'EDA5MMGnE9DmHp5dACIxmPXPMe/99nO7wNdl7G71OYPCgEvWm0FhdvVUeTb3LVnV\n' +
-        'BnaXt32Ek7/oxGk1T+Df03C+W0vmuJ+wo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\n' +
-        'A1UdDgQWBBTGXmqBWN/1tkSea4pNw0oHrjk2UDAOBgNVHQ8BAf8EBAMCAYYwCgYI\n' +
-        'KoZIzj0EAwMDaAAwZQIxAIqqZWCSrIkZ7zsv/FygtAusW6yvlL935YAWYPVXU30m\n' +
-        'jkMFLM+/RJ9GMvnO8jHfCgIwB+whlkcItzE9CRQ6CsMo/d5cEHDUu/QW6jSIh9BR\n' +
-        'OGh9pTYPVkUbBiKPA7lVVhre\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/zCCA+egAwIBAgIRAJGY9kZITwfSRaAS/bSBOw8wDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyBzYS1lYXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUxOTE4MTEyMFoYDzIxMjEwNTE5MTkxMTIwWjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIHNhLWVhc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDe2vlDp6Eo4WQi\n' +
-        'Wi32YJOgdXHhxTFrLjB9SRy22DYoMaWfginJIwJcSR8yse8ZDQuoNhERB9LRggAE\n' +
-        'eng23mhrfvtL1yQkMlZfBu4vG1nOb22XiPFzk7X2wqz/WigdYNBCqa1kK3jrLqPx\n' +
-        'YUy7jk2oZle4GLVRTNGuMfcid6S2hs3UCdXfkJuM2z2wc3WUlvHoVNk37v2/jzR/\n' +
-        'hSCHZv5YHAtzL/kLb/e64QkqxKll5QmKhyI6d7vt6Lr1C0zb+DmwxUoJhseAS0hI\n' +
-        'dRk5DklMb4Aqpj6KN0ss0HAYqYERGRIQM7KKA4+hxDMUkJmt8KqWKZkAlCZgflzl\n' +
-        'm8NZ31o2cvBzf6g+VFHx+6iVrSkohVQydkCxx7NJ743iPKsh8BytSM4qU7xx4OnD\n' +
-        'H2yNXcypu+D5bZnVZr4Pywq0w0WqbTM2bpYthG9IC4JeVUvZ2mDc01lqOlbMeyfT\n' +
-        'og5BRPLDXdZK8lapo7se2teh64cIfXtCmM2lDSwm1wnH2iSK+AWZVIM3iE45WSGc\n' +
-        'vZ+drHfVgjJJ5u1YrMCWNL5C2utFbyF9Obw9ZAwm61MSbPQL9JwznhNlCh7F2ANW\n' +
-        'ZHWQPNcOAJqzE4uVcJB1ZeVl28ORYY1668lx+s9yYeMXk3QQdj4xmdnvoBFggqRB\n' +
-        'ZR6Z0D7ZohADXe024RzEo1TukrQgKQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\n' +
-        'MB0GA1UdDgQWBBT7Vs4Y5uG/9aXnYGNMEs6ycPUT3jAOBgNVHQ8BAf8EBAMCAYYw\n' +
-        'DQYJKoZIhvcNAQEMBQADggIBACN4Htp2PvGcQA0/sAS+qUVWWJoAXSsu8Pgc6Gar\n' +
-        '7tKVlNJ/4W/a6pUV2Xo/Tz3msg4yiE8sMESp2k+USosD5n9Alai5s5qpWDQjrqrh\n' +
-        '76AGyF2nzve4kIN19GArYhm4Mz/EKEG1QHYvBDGgXi3kNvL/a2Zbybp+3LevG+q7\n' +
-        'xtx4Sz9yIyMzuT/6Y7ijtiMZ9XbuxGf5wab8UtwT3Xq1UradJy0KCkzRJAz/Wy/X\n' +
-        'HbTkEvKSaYKExH6sLo0jqdIjV/d2Io31gt4e0Ly1ER2wPyFa+pc/swu7HCzrN+iz\n' +
-        'A2ZM4+KX9nBvFyfkHLix4rALg+WTYJa/dIsObXkdZ3z8qPf5A9PXlULiaa1mcP4+\n' +
-        'rokw74IyLEYooQ8iSOjxumXhnkTS69MAdGzXYE5gnHokABtGD+BB5qLhtLt4fqAp\n' +
-        '8AyHpQWMyV42M9SJLzQ+iOz7kAgJOBOaVtJI3FV/iAg/eqWVm3yLuUTWDxSHrKuL\n' +
-        'N19+pSjF6TNvUSFXwEa2LJkfDqIOCE32iOuy85QY//3NsgrSQF6UkSPa95eJrSGI\n' +
-        '3hTRYYh3Up2GhBGl1KUy7/o0k3KRZTk4s38fylY8bZ3TakUOH5iIGoHyFVVcp361\n' +
-        'Pyy25SzFSmNalWoQd9wZVc/Cps2ldxhcttM+WLkFNzprd0VJa8qTz8vYtHP0ouDN\n' +
-        'nWS0\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCTCCA/GgAwIBAgIRAOY7gfcBZgR2tqfBzMbFQCUwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtNCBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjIwNTI1MTY1NDU5WhgPMjEyMjA1MjUxNzU0NTla\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtc291dGhlYXN0LTQgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\n' +
-        'lfxER43FuLRdL08bddF0YhbCP+XXKj1A/TFMXmd2My8XDei8rPXFYyyjMig9+xZw\n' +
-        'uAsIxLwz8uiA26CKA8bCZKg5VG2kTeOJAfvBJaLv1CZefs3Z4Uf1Sjvm6MF2yqEj\n' +
-        'GoORfyfL9HiZFTDuF/hcjWoKYCfMuG6M/wO8IbdICrX3n+BiYQJu/pFO660Mg3h/\n' +
-        '8YBBWYDbHoCiH/vkqqJugQ5BM3OI5nsElW51P1icEEqti4AZ7JmtSv9t7fIFBVyR\n' +
-        'oaEyOgpp0sm193F/cDJQdssvjoOnaubsSYm1ep3awZAUyGN/X8MBrPY95d0hLhfH\n' +
-        'Ehc5Icyg+hsosBljlAyksmt4hFQ9iBnWIz/ZTfGMck+6p3HVL9RDgvluez+rWv59\n' +
-        '8q7omUGsiPApy5PDdwI/Wt/KtC34/2sjslIJfvgifdAtkRPkhff1WEwER00ADrN9\n' +
-        'eGGInaCpJfb1Rq8cV2n00jxg7DcEd65VR3dmIRb0bL+jWK62ni/WdEyomAOMfmGj\n' +
-        'aWf78S/4rasHllWJ+QwnaUYY3u6N8Cgio0/ep4i34FxMXqMV3V0/qXdfhyabi/LM\n' +
-        'wCxNo1Dwt+s6OtPJbwO92JL+829QAxydfmaMTeHBsgMPkG7RwAekeuatKGHNsc2Z\n' +
-        'x2Q4C2wVvOGAhcHwxfM8JfZs3nDSZJndtVVnFlUY0UECAwEAAaNCMEAwDwYDVR0T\n' +
-        'AQH/BAUwAwEB/zAdBgNVHQ4EFgQUpnG7mWazy6k97/tb5iduRB3RXgQwDgYDVR0P\n' +
-        'AQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQCDLqq1Wwa9Tkuv7vxBnIeVvvFF\n' +
-        'ecTn+P+wJxl9Qa2ortzqTHZsBDyJO62d04AgBwiDXkJ9a+bthgG0H1J7Xee8xqv1\n' +
-        'xyX2yKj24ygHjspLotKP4eDMdDi5TYq+gdkbPmm9Q69B1+W6e049JVGXvWG8/7kU\n' +
-        'igxeuCYwtCCdUPRLf6D8y+1XMGgVv3/DSOHWvTg3MJ1wJ3n3+eve3rjGdRYWZeJu\n' +
-        'k21HLSZYzVrCtUsh2YAeLnUbSxVuT2Xr4JehYe9zW5HEQ8Je/OUfnCy9vzoN/ITw\n' +
-        'osAH+EBJQey7RxEDqMwCaRefH0yeHFcnOll0OXg/urnQmwbEYzQ1uutJaBPsjU0J\n' +
-        'Qf06sMxI7GiB5nPE+CnI2sM6A9AW9kvwexGXpNJiLxF8dvPQthpOKGcYu6BFvRmt\n' +
-        '6ctfXd9b7JJoVqMWuf5cCY6ihpk1e9JTlAqu4Eb/7JNyGiGCR40iSLvV28un9wiE\n' +
-        'plrdYxwcNYq851BEu3r3AyYWw/UW1AKJ5tM+/Gtok+AphMC9ywT66o/Kfu44mOWm\n' +
-        'L3nSLSWEcgfUVgrikpnyGbUnGtgCmHiMlUtNVexcE7OtCIZoVAlCGKNu7tyuJf10\n' +
-        'Qlk8oIIzfSIlcbHpOYoN79FkLoDNc2er4Gd+7w1oPQmdAB0jBJnA6t0OUBPKdDdE\n' +
-        'Ufff2jrbfbzECn1ELg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCDCCA/CgAwIBAgIQIuO1A8LOnmc7zZ/vMm3TrDANBgkqhkiG9w0BAQwFADCB\n' +
-        'nDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTUwMwYDVQQDDCxB\n' +
-        'bWF6b24gUkRTIGFwLXNvdXRoZWFzdC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4G\n' +
-        'A1UEBwwHU2VhdHRsZTAgFw0yMTA1MjQyMDQ2MThaGA8yMTIxMDUyNDIxNDYxOFow\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDq\n' +
-        'qRHKbG8ZK6/GkGm2cenznEF06yHwI1gD5sdsHjTgekDZ2Dl9RwtDmUH2zFuIQwGj\n' +
-        'SeC7E2iKwrJRA5wYzL9/Vk8NOILEKQOP8OIKUHbc7q8rEtjs401KcU6pFBBEdO9G\n' +
-        'CTiRhogq+8mhC13AM/UriZJbKhwgM2UaDOzAneGMhQAGjH8z83NsNcPxpYVE7tqM\n' +
-        'sch5yLtIJLkJRusrmQQTeHUev16YNqyUa+LuFclFL0FzFCimkcxUhXlbfEKXbssS\n' +
-        'yPzjiv8wokGyo7+gA0SueceMO2UjfGfute3HlXZDcNvBbkSY+ver41jPydyRD6Qq\n' +
-        'oEkh0tyIbPoa3oU74kwipJtz6KBEA3u3iq61OUR0ENhR2NeP7CSKrC24SnQJZ/92\n' +
-        'qxusrbyV/0w+U4m62ug/o4hWNK1lUcc2AqiBOvCSJ7qpdteTFxcEIzDwYfERDx6a\n' +
-        'd9+3IPvzMb0ZCxBIIUFMxLTF7yAxI9s6KZBBXSZ6tDcCCYIgEysEPRWMRAcG+ye/\n' +
-        'fZVn9Vnzsj4/2wchC2eQrYpb1QvG4eMXA4M5tFHKi+/8cOPiUzJRgwS222J8YuDj\n' +
-        'yEBval874OzXk8H8Mj0JXJ/jH66WuxcBbh5K7Rp5oJn7yju9yqX6qubY8gVeMZ1i\n' +
-        'u4oXCopefDqa35JplQNUXbWwSebi0qJ4EK0V8F9Q+QIDAQABo0IwQDAPBgNVHRMB\n' +
-        'Af8EBTADAQH/MB0GA1UdDgQWBBT4ysqCxaPe7y+g1KUIAenqu8PAgzAOBgNVHQ8B\n' +
-        'Af8EBAMCAYYwDQYJKoZIhvcNAQEMBQADggIBALU8WN35KAjPZEX65tobtCDQFkIO\n' +
-        'uJjv0alD7qLB0i9eY80C+kD87HKqdMDJv50a5fZdqOta8BrHutgFtDm+xo5F/1M3\n' +
-        'u5/Vva5lV4xy5DqPajcF4Mw52czYBmeiLRTnyPJsU93EQIC2Bp4Egvb6LI4cMOgm\n' +
-        '4pY2hL8DojOC5PXt4B1/7c1DNcJX3CMzHDm4SMwiv2MAxSuC/cbHXcWMk+qXdrVx\n' +
-        '+ayLUSh8acaAOy3KLs1MVExJ6j9iFIGsDVsO4vr4ZNsYQiyHjp+L8ops6YVBO5AT\n' +
-        'k/pI+axHIVsO5qiD4cFWvkGqmZ0gsVtgGUchZaacboyFsVmo6QPrl28l6LwxkIEv\n' +
-        'GGJYvIBW8sfqtGRspjfX5TlNy5IgW/VOwGBdHHsvg/xpRo31PR3HOFw7uPBi7cAr\n' +
-        'FiZRLJut7af98EB2UvovZnOh7uIEGPeecQWeOTQfJeWet2FqTzFYd0NUMgqPuJx1\n' +
-        'vLKferP+ajAZLJvVnW1J7Vccx/pm0rMiUJEf0LRb/6XFxx7T2RGjJTi0EzXODTYI\n' +
-        'gnLfBBjnolQqw+emf4pJ4pAtly0Gq1KoxTG2QN+wTd4lsCMjnelklFDjejwnl7Uy\n' +
-        'vtxzRBAu/hi/AqDkDFf94m6j+edIrjbi9/JDFtQ9EDlyeqPgw0qwi2fwtJyMD45V\n' +
-        'fejbXelUSJSzDIdY\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCTCCA/GgAwIBAgIRAN7Y9G9i4I+ZaslPobE7VL4wDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1ub3J0aGVhc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwIBcNMjEwNTIwMTYzMzIzWhgPMjEyMTA1MjAxNzMzMjNa\n' +
-        'MIGcMQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywg\n' +
-        'SW5jLjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExNTAzBgNVBAMM\n' +
-        'LEFtYXpvbiBSRFMgYXAtbm9ydGhlYXN0LTIgUm9vdCBDQSBSU0E0MDk2IEcxMRAw\n' +
-        'DgYDVQQHDAdTZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA\n' +
-        '4BEPCiIfiK66Q/qa8k+eqf1Q3qsa6Xuu/fPkpuStXVBShhtXd3eqrM0iT4Xxs420\n' +
-        'Va0vSB3oZ7l86P9zYfa60n6PzRxdYFckYX330aI7L/oFIdaodB/C9szvROI0oLG+\n' +
-        '6RwmIF2zcprH0cTby8MiM7G3v9ykpq27g4WhDC1if2j8giOQL3oHpUaByekZNIHF\n' +
-        'dIllsI3RkXmR3xmmxoOxJM1B9MZi7e1CvuVtTGOnSGpNCQiqofehTGwxCN2wFSK8\n' +
-        'xysaWlw48G0VzZs7cbxoXMH9QbMpb4tpk0d+T8JfAPu6uWO9UwCLWWydf0CkmA/+\n' +
-        'D50/xd1t33X9P4FEaPSg5lYbHXzSLWn7oLbrN2UqMLaQrkoEBg/VGvzmfN0mbflw\n' +
-        '+T87bJ/VEOVNlG+gepyCTf89qIQVWOjuYMox4sK0PjzZGsYEuYiq1+OUT3vk/e5K\n' +
-        'ag1fCcq2Isy4/iwB2xcXrsQ6ljwdk1fc+EmOnjGKrhuOHJY3S+RFv4ToQBsVyYhC\n' +
-        'XGaC3EkqIX0xaCpDimxYhFjWhpDXAjG/zJ+hRLDAMCMhl/LPGRk/D1kzSbPmdjpl\n' +
-        'lEMK5695PeBvEBTQdBQdOiYgOU3vWU6tzwwHfiM2/wgvess/q0FDAHfJhppbgbb9\n' +
-        '3vgsIUcsvoC5o29JvMsUxsDRvsAfEmMSDGkJoA/X6GECAwEAAaNCMEAwDwYDVR0T\n' +
-        'AQH/BAUwAwEB/zAdBgNVHQ4EFgQUgEWm1mZCbGD6ytbwk2UU1aLaOUUwDgYDVR0P\n' +
-        'AQH/BAQDAgGGMA0GCSqGSIb3DQEBDAUAA4ICAQBb4+ABTGBGwxK1U/q4g8JDqTQM\n' +
-        '1Wh8Oz8yAk4XtPJMAmCctxbd81cRnSnePWw/hxViLVtkZ/GsemvXfqAQyOn1coN7\n' +
-        'QeYSw+ZOlu0j2jEJVynmgsR7nIRqE7QkCyZAU+d2FTJUfmee+IiBiGyFGgxz9n7A\n' +
-        'JhBZ/eahBbiuoOik/APW2JWLh0xp0W0GznfJ8lAlaQTyDa8iDXmVtbJg9P9qzkvl\n' +
-        'FgPXQttzEOyooF8Pb2LCZO4kUz+1sbU7tHdr2YE+SXxt6D3SBv+Yf0FlvyWLiqVk\n' +
-        'GDEOlPPTDSjAWgKnqST8UJ0RDcZK/v1ixs7ayqQJU0GUQm1I7LGTErWXHMnCuHKe\n' +
-        'UKYuiSZwmTcJ06NgdhcCnGZgPq13ryMDqxPeltQc3n5eO7f1cL9ERYLDLOzm6A9P\n' +
-        'oQ3MfcVOsbHgGHZWaPSeNrQRN9xefqBXH0ZPasgcH9WJdsLlEjVUXoultaHOKx3b\n' +
-        'UCCb+d3EfqF6pRT488ippOL6bk7zNubwhRa/+y4wjZtwe3kAX78ACJVcjPobH9jZ\n' +
-        'ErySads5zdQeaoee5wRKdp3TOfvuCe4bwLRdhOLCHWzEcXzY3g/6+ppLvNom8o+h\n' +
-        'Bh5X26G6KSfr9tqhQ3O9IcbARjnuPbvtJnoPY0gz3EHHGPhy0RNW8i2gl3nUp0ah\n' +
-        'PtjwbKW0hYAhIttT0Q==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICtzCCAj2gAwIBAgIQQRBQTs6Y3H1DDbpHGta3lzAKBggqhkjOPQQDAzCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoZWFzdC0zIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDYxMTAwMTI0M1oYDzIxMjEwNjExMDExMjQzWjCBmzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTQwMgYDVQQDDCtBbWF6\n' +
-        'b24gUkRTIGFwLXNvdXRoZWFzdC0zIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEs0942Xj4m/gKA+WA6F5h\n' +
-        'AHYuek9eGpzTRoLJddM4rEV1T3eSueytMVKOSlS3Ub9IhyQrH2D8EHsLYk9ktnGR\n' +
-        'pATk0kCYTqFbB7onNo070lmMJmGT/Q7NgwC8cySChFxbo0IwQDAPBgNVHRMBAf8E\n' +
-        'BTADAQH/MB0GA1UdDgQWBBQ20iKBKiNkcbIZRu0y1uoF1yJTEzAOBgNVHQ8BAf8E\n' +
-        'BAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwYv0wTSrpQTaPaarfLN8Xcqrqu3hzl07n\n' +
-        'FrESIoRw6Cx77ZscFi2/MV6AFyjCV/TlAjEAhpwJ3tpzPXpThRML8DMJYZ3YgMh3\n' +
-        'CMuLqhPpla3cL0PhybrD27hJWl29C4el6aMO\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrDCCAjOgAwIBAgIQGcztRyV40pyMKbNeSN+vXTAKBggqhkjOPQQDAzCBljEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\n' +
-        'b24gUkRTIHVzLWVhc3QtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTAgFw0yMTA1MjEyMzE1NTZaGA8yMTIxMDUyMjAwMTU1NlowgZYxCzAJBgNV\n' +
-        'BAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\n' +
-        'VQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\n' +
-        'UyB1cy1lYXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\n' +
-        'djAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfDcv+GGRESD9wT+I5YIPRsD3L+/jsiIis\n' +
-        'Tr7t9RSbFl+gYpO7ZbDXvNbV5UGOC5lMJo/SnqFRTC6vL06NF7qOHfig3XO8QnQz\n' +
-        '6T5uhhrhnX2RSY3/10d2kTyHq3ZZg3+jQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\n' +
-        'VR0OBBYEFLDyD3PRyNXpvKHPYYxjHXWOgfPnMA4GA1UdDwEB/wQEAwIBhjAKBggq\n' +
-        'hkjOPQQDAwNnADBkAjB20HQp6YL7CqYD82KaLGzgw305aUKw2aMrdkBR29J183jY\n' +
-        '6Ocj9+Wcif9xnRMS+7oCMAvrt03rbh4SU9BohpRUcQ2Pjkh7RoY0jDR4Xq4qzjNr\n' +
-        '5UFr3BXpFvACxXF51BksGQ==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjWgAwIBAgIQeKbS5zvtqDvRtwr5H48cAjAKBggqhkjOPQQDAzCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIG1lLXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTIwMTcxOTU1WhgPMjEyMTA1MjAxODE5NTVaMIGXMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\n' +
-        'RFMgbWUtc291dGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\n' +
-        'ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABEKjgUaAPmUlRMEQdBC7BScAGosJ1zRV\n' +
-        'LDd38qTBjzgmwBfQJ5ZfGIvyEK5unB09MB4e/3qqK5I/L6Qn5Px/n5g4dq0c7MQZ\n' +
-        'u7G9GBYm90U3WRJBf7lQrPStXaRnS4A/O6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\n' +
-        'BgNVHQ4EFgQUNKcAbGEIn03/vkwd8g6jNyiRdD4wDgYDVR0PAQH/BAQDAgGGMAoG\n' +
-        'CCqGSM49BAMDA2cAMGQCMHIeTrjenCSYuGC6txuBt/0ZwnM/ciO9kHGWVCoK8QLs\n' +
-        'jGghb5/YSFGZbmQ6qpGlSAIwVOQgdFfTpEfe5i+Vs9frLJ4QKAfc27cTNYzRIM0I\n' +
-        'E+AJgK4C4+DiyyMzOpiCfmvq\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGCDCCA/CgAwIBAgIQSFkEUzu9FYgC5dW+5lnTgjANBgkqhkiG9w0BAQwFADCB\n' +
-        'nDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTUwMwYDVQQDDCxB\n' +
-        'bWF6b24gUkRTIGFwLXNvdXRoZWFzdC0zIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4G\n' +
-        'A1UEBwwHU2VhdHRsZTAgFw0yMTA2MTEwMDA4MzZaGA8yMTIxMDYxMTAxMDgzNlow\n' +
-        'gZwxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTE1MDMGA1UEAwws\n' +
-        'QW1hem9uIFJEUyBhcC1zb3V0aGVhc3QtMyBSb290IENBIFJTQTQwOTYgRzExEDAO\n' +
-        'BgNVBAcMB1NlYXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDx\n' +
-        'my5Qmd8zdwaI/KOKV9Xar9oNbhJP5ED0JCiigkuvCkg5qM36klszE8JhsUj40xpp\n' +
-        'vQw9wkYW4y+C8twBpzKGBvakqMnoaVUV7lOCKx0RofrnNwkZCboTBB4X/GCZ3fIl\n' +
-        'YTybS7Ehi1UuiaZspIT5A2jidoA8HiBPk+mTg1UUkoWS9h+MEAPa8L4DY6fGf4pO\n' +
-        'J1Gk2cdePuNzzIrpm2yPto+I8MRROwZ3ha7ooyymOXKtz2c7jEHHJ314boCXAv9G\n' +
-        'cdo27WiebewZkHHH7Zx9iTIVuuk2abyVSzvLVeGv7Nuy4lmSqa5clWYqWsGXxvZ2\n' +
-        '0fZC5Gd+BDUMW1eSpW7QDTk3top6x/coNoWuLSfXiC5ZrJkIKimSp9iguULgpK7G\n' +
-        'abMMN4PR+O+vhcB8E879hcwmS2yd3IwcPTl3QXxufqeSV58/h2ibkqb/W4Bvggf6\n' +
-        '5JMHQPlPHOqMCVFIHP1IffIo+Of7clb30g9FD2j3F4qgV3OLwEDNg/zuO1DiAvH1\n' +
-        'L+OnmGHkfbtYz+AVApkAZrxMWwoYrwpauyBusvSzwRE24vLTd2i80ZDH422QBLXG\n' +
-        'rN7Zas8rwIiBKacJLYtBYETw8mfsNt8gb72aIQX6cZOsphqp6hUtKaiMTVgGazl7\n' +
-        'tBXqbB+sIv3S9X6bM4cZJKkMJOXbnyCCLZFYv8TurwIDAQABo0IwQDAPBgNVHRMB\n' +
-        'Af8EBTADAQH/MB0GA1UdDgQWBBTOVtaS1b/lz6yJDvNk65vEastbQTAOBgNVHQ8B\n' +
-        'Af8EBAMCAYYwDQYJKoZIhvcNAQEMBQADggIBABEONg+TmMZM/PrYGNAfB4S41zp1\n' +
-        '3CVjslZswh/pC4kgXSf8cPJiUOzMwUevuFQj7tCqxQtJEygJM2IFg4ViInIah2kh\n' +
-        'xlRakEGGw2dEVlxZAmmLWxlL1s1lN1565t5kgVwM0GVfwYM2xEvUaby6KDVJIkD3\n' +
-        'aM6sFDBshvVA70qOggM6kU6mwTbivOROzfoIQDnVaT+LQjHqY/T+ok6IN0YXXCWl\n' +
-        'Favai8RDjzLDFwXSRvgIK+1c49vlFFY4W9Efp7Z9tPSZU1TvWUcKdAtV8P2fPHAS\n' +
-        'vAZ+g9JuNfeawhEibjXkwg6Z/yFUueQCQOs9TRXYogzp5CMMkfdNJF8byKYqHscs\n' +
-        'UosIcETnHwqwban99u35sWcoDZPr6aBIrz7LGKTJrL8Nis8qHqnqQBXu/fsQEN8u\n' +
-        'zJ2LBi8sievnzd0qI0kaWmg8GzZmYH1JCt1GXSqOFkI8FMy2bahP7TUQR1LBUKQ3\n' +
-        'hrOSqldkhN+cSAOnvbQcFzLr+iEYEk34+NhcMIFVE+51KJ1n6+zISOinr6mI3ckX\n' +
-        '6p2tmiCD4Shk2Xx/VTY/KGvQWKFcQApWezBSvDNlGe0yV71LtLf3dr1pr4ofo7cE\n' +
-        'rYucCJ40bfxEU/fmzYdBF32xP7AOD9U0FbOR3Mcthc6Z6w20WFC+zru8FGY08gPf\n' +
-        'WT1QcNdw7ntUJP/w\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrzCCAjWgAwIBAgIQARky6+5PNFRkFVOp3Ob1CTAKBggqhkjOPQQDAzCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGV1LXNvdXRoLTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjIwNTIzMTg0MTI4WhgPMjEyMjA1MjMxOTQxMjdaMIGXMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\n' +
-        'RFMgZXUtc291dGgtMiBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\n' +
-        'ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABNVGL5oF7cfIBxKyWd2PVK/S5yQfaJY3\n' +
-        'QFHWvEdt6951n9JhiiPrHzfVHsxZp1CBjILRMzjgRbYWmc8qRoLkgGE7htGdwudJ\n' +
-        'Fa/WuKzO574Prv4iZXUnVGTboC7JdvKbh6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\n' +
-        'BgNVHQ4EFgQUgDeIIEKynwUbNXApdIPnmRWieZwwDgYDVR0PAQH/BAQDAgGGMAoG\n' +
-        'CCqGSM49BAMDA2gAMGUCMEOOJfucrST+FxuqJkMZyCM3gWGZaB+/w6+XUAJC6hFM\n' +
-        'uSTY0F44/bERkA4XhH+YGAIxAIpJQBakCA1/mXjsTnQ+0El9ty+LODp8ibkn031c\n' +
-        '8DKDS7pR9UK7ZYdR6zFg3ZCjQw==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjOgAwIBAgIQJvkWUcYLbnxtuwnyjMmntDAKBggqhkjOPQQDAzCBljEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMS8wLQYDVQQDDCZBbWF6\n' +
-        'b24gUkRTIGV1LXdlc3QtMyBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTAgFw0yMTA1MjUyMjI2MTJaGA8yMTIxMDUyNTIzMjYxMlowgZYxCzAJBgNV\n' +
-        'BAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMwEQYD\n' +
-        'VQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1hem9uIFJE\n' +
-        'UyBldS13ZXN0LTMgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0bGUw\n' +
-        'djAQBgcqhkjOPQIBBgUrgQQAIgNiAARENn8uHCyjn1dFax4OeXxvbV861qsXFD9G\n' +
-        'DshumTmFzWWHN/69WN/AOsxy9XN5S7Cgad4gQgeYYYgZ5taw+tFo/jQvCLY//uR5\n' +
-        'uihcLuLJ78opvRPvD9kbWZ6oXfBtFkWjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD\n' +
-        'VR0OBBYEFKiK3LpoF+gDnqPldGSwChBPCYciMA4GA1UdDwEB/wQEAwIBhjAKBggq\n' +
-        'hkjOPQQDAwNpADBmAjEA+7qfvRlnvF1Aosyp9HzxxCbN7VKu+QXXPhLEBWa5oeWW\n' +
-        'UOcifunf/IVLC4/FGCsLAjEAte1AYp+iJyOHDB8UYkhBE/1sxnFaTiEPbvQBU0wZ\n' +
-        'SuwWVLhu2wWDuSW+K7tTuL8p\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/zCCAuegAwIBAgIRAKeDpqX5WFCGNo94M4v69sUwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyBldS13ZXN0LTMgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyNTIyMTgzM1oYDzIwNjEwNTI1MjMxODMzWjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGV1LXdlc3QtMyBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCcKOTEMTfzvs4H\n' +
-        'WtJR8gI7GXN6xesulWtZPv21oT+fLGwJ+9Bv8ADCGDDrDxfeH/HxJmzG9hgVAzVn\n' +
-        '4g97Bn7q07tGZM5pVi96/aNp11velZT7spOJKfJDZTlGns6DPdHmx48whpdO+dOb\n' +
-        '6+eR0VwCIv+Vl1fWXgoACXYCoKjhxJs+R+fwY//0JJ1YG8yjZ+ghLCJmvlkOJmE1\n' +
-        'TCPUyIENaEONd6T+FHGLVYRRxC2cPO65Jc4yQjsXvvQypoGgx7FwD5voNJnFMdyY\n' +
-        '754JGPOOe/SZdepN7Tz7UEq8kn7NQSbhmCsgA/Hkjkchz96qN/YJ+H/okiQUTNB0\n' +
-        'eG9ogiVFAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFjayw9Y\n' +
-        'MjbxfF14XAhMM2VPl0PfMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\n' +
-        'AQEAAtmx6d9+9CWlMoU0JCirtp4dSS41bBfb9Oor6GQ8WIr2LdfZLL6uES/ubJPE\n' +
-        '1Sh5Vu/Zon5/MbqLMVrfniv3UpQIof37jKXsjZJFE1JVD/qQfRzG8AlBkYgHNEiS\n' +
-        'VtD4lFxERmaCkY1tjKB4Dbd5hfhdrDy29618ZjbSP7NwAfnwb96jobCmMKgxVGiH\n' +
-        'UqsLSiEBZ33b2hI7PJ6iTJnYBWGuiDnsWzKRmheA4nxwbmcQSfjbrNwa93w3caL2\n' +
-        'v/4u54Kcasvcu3yFsUwJygt8z43jsGAemNZsS7GWESxVVlW93MJRn6M+MMakkl9L\n' +
-        'tWaXdHZ+KUV7LhfYLb0ajvb40w==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBDCCAuygAwIBAgIQJ5oxPEjefCsaESSwrxk68DANBgkqhkiG9w0BAQsFADCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIGV1LWNlbnRyYWwtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwIBcNMjIwNjA2MjExNzA1WhgPMjA2MjA2MDYyMjE3MDVaMIGa\n' +
-        'MQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\n' +
-        'LjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\n' +
-        'YXpvbiBSRFMgZXUtY2VudHJhbC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALTQt5eX\n' +
-        'g+VP3BjO9VBkWJhE0GfLrU/QIk32I6WvrnejayTrlup9H1z4QWlXF7GNJrqScRMY\n' +
-        'KhJHlcP05aPsx1lYco6pdFOf42ybXyWHHJdShj4A5glU81GTT+VrXGzHSarLmtua\n' +
-        'eozkQgPpDsSlPt0RefyTyel7r3Cq+5K/4vyjCTcIqbfgaGwTU36ffjM1LaPCuE4O\n' +
-        'nINMeD6YuImt2hU/mFl20FZ+IZQUIFZZU7pxGLqTRz/PWcH8tDDxnkYg7tNuXOeN\n' +
-        'JbTpXrw7St50/E9ZQ0llGS+MxJD8jGRAa/oL4G/cwnV8P2OEPVVkgN9xDDQeieo0\n' +
-        '3xkzolkDkmeKOnUCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU\n' +
-        'bwu8635iQGQMRanekesORM8Hkm4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB\n' +
-        'CwUAA4IBAQAgN6LE9mUgjsj6xGCX1afYE69fnmCjjb0rC6eEe1mb/QZNcyw4XBIW\n' +
-        '6+zTXo4mjZ4ffoxb//R0/+vdTE7IvaLgfAZgFsLKJCtYDDstXZj8ujQnGR9Pig3R\n' +
-        'W+LpNacvOOSJSawNQq0Xrlcu55AU4buyD5VjcICnfF1dqBMnGTnh27m/scd/ZMx/\n' +
-        'kapHZ/fMoK2mAgSX/NvUKF3UkhT85vSSM2BTtET33DzCPDQTZQYxFBa4rFRmFi4c\n' +
-        'BLlmIReiCGyh3eJhuUUuYAbK6wLaRyPsyEcIOLMQmZe1+gAFm1+1/q5Ke9ugBmjf\n' +
-        'PbTWjsi/lfZ5CdVAhc5lmZj/l5aKqwaS\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjSgAwIBAgIRAKKPTYKln9L4NTx9dpZGUjowCgYIKoZIzj0EAwMwgZYx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\n' +
-        'em9uIFJEUyBldS13ZXN0LTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTIxMjI1NTIxWhgPMjEyMTA1MjEyMzU1MjFaMIGWMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\n' +
-        'RFMgZXUtd2VzdC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\n' +
-        'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE/owTReDvaRqdmbtTzXbyRmEpKCETNj6O\n' +
-        'hZMKH0F8oU9Tmn8RU7kQQj6xUKEyjLPrFBN7c+26TvrVO1KmJAvbc8bVliiJZMbc\n' +
-        'C0yV5PtJTalvlMZA1NnciZuhxaxrzlK1o0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\n' +
-        'A1UdDgQWBBT4i5HaoHtrs7Mi8auLhMbKM1XevDAOBgNVHQ8BAf8EBAMCAYYwCgYI\n' +
-        'KoZIzj0EAwMDaAAwZQIxAK9A+8/lFdX4XJKgfP+ZLy5ySXC2E0Spoy12Gv2GdUEZ\n' +
-        'p1G7c1KbWVlyb1d6subzkQIwKyH0Naf/3usWfftkmq8SzagicKz5cGcEUaULq4tO\n' +
-        'GzA/AMpr63IDBAqkZbMDTCmH\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrzCCAjWgAwIBAgIQTgIvwTDuNWQo0Oe1sOPQEzAKBggqhkjOPQQDAzCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGV1LW5vcnRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTI0MjEwNjM4WhgPMjEyMTA1MjQyMjA2MzhaMIGXMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpvbiBS\n' +
-        'RFMgZXUtbm9ydGgtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwHU2VhdHRs\n' +
-        'ZTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJuzXLU8q6WwSKXBvx8BbdIi3mPhb7Xo\n' +
-        'rNJBfuMW1XRj5BcKH1ZoGaDGw+BIIwyBJg8qNmCK8kqIb4cH8/Hbo3Y+xBJyoXq/\n' +
-        'cuk8aPrxiNoRsKWwiDHCsVxaK9L7GhHHAqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAd\n' +
-        'BgNVHQ4EFgQUYgcsdU4fm5xtuqLNppkfTHM2QMYwDgYDVR0PAQH/BAQDAgGGMAoG\n' +
-        'CCqGSM49BAMDA2gAMGUCMQDz/Rm89+QJOWJecYAmYcBWCcETASyoK1kbr4vw7Hsg\n' +
-        '7Ew3LpLeq4IRmTyuiTMl0gMCMAa0QSjfAnxBKGhAnYxcNJSntUyyMpaXzur43ec0\n' +
-        '3D8npJghwC4DuICtKEkQiI5cSg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGATCCA+mgAwIBAgIRAORIGqQXLTcbbYT2upIsSnQwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\n' +
-        'QW1hem9uIFJEUyBldS1zb3V0aC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMjA1MjMxODM0MjJaGA8yMTIyMDUyMzE5MzQyMlowgZgx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\n' +
-        'em9uIFJEUyBldS1zb3V0aC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPKukwsW2s/h\n' +
-        '1k+Hf65pOP0knVBnOnMQyT1mopp2XHGdXznj9xS49S30jYoUnWccyXgD983A1bzu\n' +
-        'w4fuJRHg4MFdz/NWTgXvy+zy0Roe83OPIJjUmXnnzwUHQcBa9vl6XUO65iQ3pbSi\n' +
-        'fQfNDFXD8cvuXbkezeADoy+iFAlzhXTzV9MD44GTuo9Z3qAXNGHQCrgRSCL7uRYt\n' +
-        't1nfwboCbsVRnElopn2cTigyVXE62HzBUmAw1GTbAZeFAqCn5giBWYAfHwTUldRL\n' +
-        '6eEa6atfsS2oPNus4ZENa1iQxXq7ft+pMdNt0qKXTCZiiCZjmLkY0V9kWwHTRRF8\n' +
-        'r+75oSL//3di43QnuSCgjwMRIeWNtMud5jf3eQzSBci+9njb6DrrSUbx7blP0srg\n' +
-        '94/C/fYOp/0/EHH34w99Th14VVuGWgDgKahT9/COychLOubXUT6vD1As47S9KxTv\n' +
-        'yYleVKwJnF9cVjepODN72fNlEf74BwzgSIhUmhksmZSeJBabrjSUj3pdyo/iRZN/\n' +
-        'CiYz9YPQ29eXHPQjBZVIUqWbOVfdwsx0/Xu5T1e7yyXByQ3/oDulahtcoKPAFQ3J\n' +
-        'ee6NJK655MdS7pM9hJnU2Rzu3qZ/GkM6YK7xTlMXVouPUZov/VbiaCKbqYDs8Dg+\n' +
-        'UKdeNXAT6+BMleGQzly1X7vjhgeA8ugVAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wHQYDVR0OBBYEFJdaPwpCf78UolFTEn6GO85/QwUIMA4GA1UdDwEB/wQEAwIB\n' +
-        'hjANBgkqhkiG9w0BAQwFAAOCAgEAWkxHIT3mers5YnZRSVjmpxCLivGj1jMB9VYC\n' +
-        'iKqTAeIvD0940L0YaZgivQll5pue8UUcQ6M2uCdVVAsNJdmQ5XHIYiGOknYPtxzO\n' +
-        'aO+bnZp7VIZw/vJ49hvH6RreA2bbxYMZO/ossYdcWsWbOKHFrRmAw0AhtK/my51g\n' +
-        'obV7eQg+WmlE5Iqc75ycUsoZdc3NimkjBi7LQoNP1HMvlLHlF71UZhQDdq+/WdV7\n' +
-        '0zmg+epkki1LjgMmuPyb+xWuYkFKT1/faX+Xs62hIm5BY+aI4if4RuQ+J//0pOSs\n' +
-        'UajrjTo+jLGB8A96jAe8HaFQenbwMjlaHRDAF0wvbkYrMr5a6EbneAB37V05QD0Y\n' +
-        'Rh4L4RrSs9DX2hbSmS6iLDuPEjanHKzglF5ePEvnItbRvGGkynqDVlwF+Bqfnw8l\n' +
-        '0i8Hr1f1/LP1c075UjkvsHlUnGgPbLqA0rDdcxF8Fdlv1BunUjX0pVlz10Ha5M6P\n' +
-        'AdyWUOneOfaA5G7jjv7i9qg3r99JNs1/Lmyg/tV++gnWTAsSPFSSEte81kmPhlK3\n' +
-        '2UtAO47nOdTtk+q4VIRAwY1MaOR7wTFZPfer1mWs4RhKNu/odp8urEY87iIzbMWT\n' +
-        'QYO/4I6BGj9rEWNGncvR5XTowwIthMCj2KWKM3Z/JxvjVFylSf+s+FFfO1bNIm6h\n' +
-        'u3UBpZI=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICtDCCAjmgAwIBAgIQenQbcP/Zbj9JxvZ+jXbRnTAKBggqhkjOPQQDAzCBmTEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTIwMAYDVQQDDClBbWF6\n' +
-        'b24gUkRTIGV1LWNlbnRyYWwtMSBSb290IENBIEVDQzM4NCBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTAgFw0yMTA1MjEyMjMzMjRaGA8yMTIxMDUyMTIzMzMyNFowgZkxCzAJ\n' +
-        'BgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRMw\n' +
-        'EQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1hem9u\n' +
-        'IFJEUyBldS1jZW50cmFsLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATlBHiEM9LoEb1Hdnd5j2VpCDOU\n' +
-        '5nGuFoBD8ROUCkFLFh5mHrHfPXwBc63heW9WrP3qnDEm+UZEUvW7ROvtWCTPZdLz\n' +
-        'Z4XaqgAlSqeE2VfUyZOZzBSgUUJk7OlznXfkCMOjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wHQYDVR0OBBYEFDT/ThjQZl42Nv/4Z/7JYaPNMly2MA4GA1UdDwEB/wQEAwIB\n' +
-        'hjAKBggqhkjOPQQDAwNpADBmAjEAnZWmSgpEbmq+oiCa13l5aGmxSlfp9h12Orvw\n' +
-        'Dq/W5cENJz891QD0ufOsic5oGq1JAjEAp5kSJj0MxJBTHQze1Aa9gG4sjHBxXn98\n' +
-        '4MP1VGsQuhfndNHQb4V0Au7OWnOeiobq\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/zCCAuegAwIBAgIRAMgnyikWz46xY6yRgiYwZ3swDQYJKoZIhvcNAQELBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyBldS13ZXN0LTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyMDE2NDkxMloYDzIwNjEwNTIwMTc0OTEyWjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGV1LXdlc3QtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCi8JYOc9cYSgZH\n' +
-        'gYPxLk6Xcc7HqzamvsnjYU98Dcb98y6iDqS46Ra2Ne02MITtU5MDL+qjxb8WGDZV\n' +
-        'RUA9ZS69tkTO3gldW8QdiSh3J6hVNJQW81F0M7ZWgV0gB3n76WCmfT4IWos0AXHM\n' +
-        '5v7M/M4tqVmCPViQnZb2kdVlM3/Xc9GInfSMCgNfwHPTXl+PXX+xCdNBePaP/A5C\n' +
-        '5S0oK3HiXaKGQAy3K7VnaQaYdiv32XUatlM4K2WS4AMKt+2cw3hTCjlmqKRHvYFQ\n' +
-        'veWCXAuc+U5PQDJ9SuxB1buFJZhT4VP3JagOuZbh5NWpIbOTxlAJOb5pGEDuJTKi\n' +
-        '1gQQQVEFAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNXm+N87\n' +
-        'OFxK9Af/bjSxDCiulGUzMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOC\n' +
-        'AQEAkqIbkgZ45spvrgRQ6n9VKzDLvNg+WciLtmVrqyohwwJbj4pYvWwnKQCkVc7c\n' +
-        'hUOSBmlSBa5REAPbH5o8bdt00FPRrD6BdXLXhaECKgjsHe1WW08nsequRKD8xVmc\n' +
-        '8bEX6sw/utBeBV3mB+3Zv7ejYAbDFM4vnRsWtO+XqgReOgrl+cwdA6SNQT9oW3e5\n' +
-        'rSQ+VaXgJtl9NhkiIysq9BeYigxqS/A13pHQp0COMwS8nz+kBPHhJTsajHCDc8F4\n' +
-        'HfLi6cgs9G0gaRhT8FCH66OdGSqn196sE7Y3bPFFFs/3U+vxvmQgoZC6jegQXAg5\n' +
-        'Prxd+VNXtNI/azitTysQPumH7A==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEBTCCAu2gAwIBAgIRAO8bekN7rUReuNPG8pSTKtEwDQYJKoZIhvcNAQELBQAw\n' +
-        'gZoxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEzMDEGA1UEAwwq\n' +
-        'QW1hem9uIFJEUyBldS1jZW50cmFsLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYD\n' +
-        'VQQHDAdTZWF0dGxlMCAXDTIxMDUyMTIyMjM0N1oYDzIwNjEwNTIxMjMyMzQ3WjCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIGV1LWNlbnRyYWwtMSBSb290IENBIFJTQTIwNDggRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCTTYds\n' +
-        'Tray+Q9VA5j5jTh5TunHKFQzn68ZbOzdqaoi/Rq4ohfC0xdLrxCpfqn2TGDHN6Zi\n' +
-        '2qGK1tWJZEd1H0trhzd9d1CtGK+3cjabUmz/TjSW/qBar7e9MA67/iJ74Gc+Ww43\n' +
-        'A0xPNIWcL4aLrHaLm7sHgAO2UCKsrBUpxErOAACERScVYwPAfu79xeFcX7DmcX+e\n' +
-        'lIqY16pQAvK2RIzrekSYfLFxwFq2hnlgKHaVgZ3keKP+nmXcXmRSHQYUUr72oYNZ\n' +
-        'HcNYl2+gxCc9ccPEHM7xncVEKmb5cWEWvVoaysgQ+osi5f5aQdzgC2X2g2daKbyA\n' +
-        'XL/z5FM9GHpS5BJjAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE\n' +
-        'FBDAiJ7Py9/A9etNa/ebOnx5l5MGMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0B\n' +
-        'AQsFAAOCAQEALMh/+81fFPdJV/RrJUeoUvFCGMp8iaANu97NpeJyKitNOv7RoeVP\n' +
-        'WjivS0KcCqZaDBs+p6IZ0sLI5ZH098LDzzytcfZg0PsGqUAb8a0MiU/LfgDCI9Ee\n' +
-        'jsOiwaFB8k0tfUJK32NPcIoQYApTMT2e26lPzYORSkfuntme2PTHUnuC7ikiQrZk\n' +
-        'P+SZjWgRuMcp09JfRXyAYWIuix4Gy0eZ4rpRuaTK6mjAb1/LYoNK/iZ/gTeIqrNt\n' +
-        'l70OWRsWW8jEmSyNTIubGK/gGGyfuZGSyqoRX6OKHESkP6SSulbIZHyJ5VZkgtXo\n' +
-        '2XvyRyJ7w5pFyoofrL3Wv0UF8yt/GDszmg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/zCCA+egAwIBAgIRAMDk/F+rrhdn42SfE+ghPC8wDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyBldS13ZXN0LTIgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyMTIyNTEyMloYDzIxMjEwNTIxMjM1MTIyWjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGV1LXdlc3QtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2twMALVg9vRVu\n' +
-        'VNqsr6N8thmp3Dy8jEGTsm3GCQ+C5P2YcGlD/T/5icfWW84uF7Sx3ezcGlvsqFMf\n' +
-        'Ukj9sQyqtz7qfFFugyy7pa/eH9f48kWFHLbQYm9GEgbYBIrWMp1cy3vyxuMCwQN4\n' +
-        'DCncqU+yNpy0CprQJEha3PzY+3yJOjDQtc3zr99lyECCFJTDUucxHzyQvX89eL74\n' +
-        'uh8la0lKH3v9wPpnEoftbrwmm5jHNFdzj7uXUHUJ41N7af7z7QUfghIRhlBDiKtx\n' +
-        '5lYZemPCXajTc3ryDKUZC/b+B6ViXZmAeMdmQoPE0jwyEp/uaUcdp+FlUQwCfsBk\n' +
-        'ayPFEApTWgPiku2isjdeTVmEgL8bJTDUZ6FYFR7ZHcYAsDzcwHgIu3GGEMVRS3Uf\n' +
-        'ILmioiyly9vcK4Sa01ondARmsi/I0s7pWpKflaekyv5boJKD/xqwz9lGejmJHelf\n' +
-        '8Od2TyqJScMpB7Q8c2ROxBwqwB72jMCEvYigB+Wnbb8RipliqNflIGx938FRCzKL\n' +
-        'UQUBmNAznR/yRRL0wHf9UAE/8v9a09uZABeiznzOFAl/frHpgdAbC00LkFlnwwgX\n' +
-        'g8YfEFlkp4fLx5B7LtoO6uVNFVimLxtwirpyKoj3G4M/kvSTux8bTw0heBCmWmKR\n' +
-        '57MS6k7ODzbv+Kpeht2hqVZCNFMxoQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\n' +
-        'MB0GA1UdDgQWBBRuMnDhJjoj7DcKALj+HbxEqj3r6jAOBgNVHQ8BAf8EBAMCAYYw\n' +
-        'DQYJKoZIhvcNAQEMBQADggIBALSnXfx72C3ldhBP5kY4Mo2DDaGQ8FGpTOOiD95d\n' +
-        '0rf7I9LrsBGVqu/Nir+kqqP80PB70+Jy9fHFFigXwcPBX3MpKGxK8Cel7kVf8t1B\n' +
-        '4YD6A6bqlzP+OUL0uGWfZpdpDxwMDI2Flt4NEldHgXWPjvN1VblEKs0+kPnKowyg\n' +
-        'jhRMgBbD/y+8yg0fIcjXUDTAw/+INcp21gWaMukKQr/8HswqC1yoqW9in2ijQkpK\n' +
-        '2RB9vcQ0/gXR0oJUbZQx0jn0OH8Agt7yfMAnJAdnHO4M3gjvlJLzIC5/4aGrRXZl\n' +
-        'JoZKfJ2fZRnrFMi0nhAYDeInoS+Rwx+QzaBk6fX5VPyCj8foZ0nmqvuYoydzD8W5\n' +
-        'mMlycgxFqS+DUmO+liWllQC4/MnVBlHGB1Cu3wTj5kgOvNs/k+FW3GXGzD3+rpv0\n' +
-        'QTLuwSbMr+MbEThxrSZRSXTCQzKfehyC+WZejgLb+8ylLJUA10e62o7H9PvCrwj+\n' +
-        'ZDVmN7qj6amzvndCP98sZfX7CFZPLfcBd4wVIjHsFjSNEwWHOiFyLPPG7cdolGKA\n' +
-        'lOFvonvo4A1uRc13/zFeP0Xi5n5OZ2go8aOOeGYdI2vB2sgH9R2IASH/jHmr0gvY\n' +
-        '0dfBCcfXNgrS0toq0LX/y+5KkKOxh52vEYsJLdhqrveuZhQnsFEm/mFwjRXkyO7c\n' +
-        '2jpC\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGADCCA+igAwIBAgIQYe0HgSuFFP9ivYM2vONTrTANBgkqhkiG9w0BAQwFADCB\n' +
-        'mDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\n' +
-        'bWF6b24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUxOTE4MzMyMVoYDzIxMjEwNTE5MTkzMzIxWjCBmDEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\n' +
-        'b24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAuO7QPKfPMTo2\n' +
-        'POQWvzDLwi5f++X98hGjORI1zkN9kotCYH5pAzSBwBPoMNaIfedgmsIxGHj2fq5G\n' +
-        '4oXagNhNuGP79Zl6uKW5H7S74W7aWM8C0s8zuxMOI4GZy5h2IfQk3m/3AzZEX5w8\n' +
-        'UtNPkzo2feDVOkerHT+j+vjXgAxZ4wHnuMDcRT+K4r9EXlAH6X9b/RO0JlfEwmNz\n' +
-        'xlqqGxocq9qRC66N6W0HF2fNEAKP84n8H80xcZBOBthQORRi8HSmKcPdmrvwCuPz\n' +
-        'M+L+j18q6RAVaA0ABbD0jMWcTf0UvjUfBStn5mvu/wGlLjmmRkZsppUTRukfwqXK\n' +
-        'yltUsTq0tOIgCIpne5zA4v+MebbR5JBnsvd4gdh5BI01QH470yB7BkUefZ9bobOm\n' +
-        'OseAAVXcYFJKe4DAA6uLDrqOfFSxV+CzVvEp3IhLRaik4G5MwI/h2c/jEYDqkg2J\n' +
-        'HMflxc2gcSMdk7E5ByLz5f6QrFfSDFk02ZJTs4ssbbUEYohht9znPMQEaWVqATWE\n' +
-        '3n0VspqZyoBNkH/agE5GiGZ/k/QyeqzMNj+c9kr43Upu8DpLrz8v2uAp5xNj3YVg\n' +
-        'ihaeD6GW8+PQoEjZ3mrCmH7uGLmHxh7Am59LfEyNrDn+8Rq95WvkmbyHSVxZnBmo\n' +
-        'h/6O3Jk+0/QhIXZ2hryMflPcYWeRGH0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB\n' +
-        '/zAdBgNVHQ4EFgQU2eFK7+R3x/me8roIBNxBrplkM6EwDgYDVR0PAQH/BAQDAgGG\n' +
-        'MA0GCSqGSIb3DQEBDAUAA4ICAQB5gWFe5s7ObQFj1fTO9L6gYgtFhnwdmxU0q8Ke\n' +
-        'HWCrdFmyXdC39qdAFOwM5/7fa9zKmiMrZvy9HNvCXEp4Z7z9mHhBmuqPZQx0qPgU\n' +
-        'uLdP8wGRuWryzp3g2oqkX9t31Z0JnkbIdp7kfRT6ME4I4VQsaY5Y3mh+hIHOUvcy\n' +
-        'p+98i3UuEIcwJnVAV9wTTzrWusZl9iaQ1nSYbmkX9bBssJ2GmtW+T+VS/1hJ/Q4f\n' +
-        'AlE3dOQkLFoPPb3YRWBHr2n1LPIqMVwDNAuWavRA2dSfaLl+kzbn/dua7HTQU5D4\n' +
-        'b2Fu2vLhGirwRJe+V7zdef+tI7sngXqjgObyOeG5O2BY3s+um6D4fS0Th3QchMO7\n' +
-        '0+GwcIgSgcjIjlrt6/xJwJLE8cRkUUieYKq1C4McpZWTF30WnzOPUzRzLHkcNzNA\n' +
-        '0A7sKMK6QoYWo5Rmo8zewUxUqzc9oQSrYADP7PEwGncLtFe+dlRFx+PA1a+lcIgo\n' +
-        '1ZGfXigYtQ3VKkcknyYlJ+hN4eCMBHtD81xDy9iP2MLE41JhLnoB2rVEtewO5diF\n' +
-        '7o95Mwl84VMkLhhHPeGKSKzEbBtYYBifHNct+Bst8dru8UumTltgfX6urH3DN+/8\n' +
-        'JF+5h3U8oR2LL5y76cyeb+GWDXXy9zoQe2QvTyTy88LwZq1JzujYi2k8QiLLhFIf\n' +
-        'FEv9Bg==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICsDCCAjagAwIBAgIRAMgApnfGYPpK/fD0dbN2U4YwCgYIKoZIzj0EAwMwgZcx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwnQW1h\n' +
-        'em9uIFJEUyBldS1zb3V0aC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMCAXDTIxMDUxOTE4MzgxMVoYDzIxMjEwNTE5MTkzODExWjCBlzELMAkG\n' +
-        'A1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4xEzAR\n' +
-        'BgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6b24g\n' +
-        'UkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1NlYXR0\n' +
-        'bGUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQfEWl6d4qSuIoECdZPp+39LaKsfsX7\n' +
-        'THs3/RrtT0+h/jl3bjZ7Qc68k16x+HGcHbaayHfqD0LPdzH/kKtNSfQKqemdxDQh\n' +
-        'Z4pwkixJu8T1VpXZ5zzCvBXCl75UqgEFS92jQjBAMA8GA1UdEwEB/wQFMAMBAf8w\n' +
-        'HQYDVR0OBBYEFFPrSNtWS5JU+Tvi6ABV231XbjbEMA4GA1UdDwEB/wQEAwIBhjAK\n' +
-        'BggqhkjOPQQDAwNoADBlAjEA+a7hF1IrNkBd2N/l7IQYAQw8chnRZDzh4wiGsZsC\n' +
-        '6A83maaKFWUKIb3qZYXFSi02AjAbp3wxH3myAmF8WekDHhKcC2zDvyOiKLkg9Y6v\n' +
-        'ZVmyMR043dscQbcsVoacOYv198c=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICtDCCAjqgAwIBAgIRAPhVkIsQ51JFhD2kjFK5uAkwCgYIKoZIzj0EAwMwgZkx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEyMDAGA1UEAwwpQW1h\n' +
-        'em9uIFJEUyBldS1jZW50cmFsLTIgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjIwNjA2MjEyOTE3WhgPMjEyMjA2MDYyMjI5MTdaMIGZMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMjAwBgNVBAMMKUFtYXpv\n' +
-        'biBSRFMgZXUtY2VudHJhbC0yIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEA5xnIEBtG5b2nmbj49UEwQza\n' +
-        'yX0844fXjccYzZ8xCDUe9dS2XOUi0aZlGblgSe/3lwjg8fMcKXLObGGQfgIx1+5h\n' +
-        'AIBjORis/dlyN5q/yH4U5sjS8tcR0GDGVHrsRUZCo0IwQDAPBgNVHRMBAf8EBTAD\n' +
-        'AQH/MB0GA1UdDgQWBBRK+lSGutXf4DkTjR3WNfv4+KeNFTAOBgNVHQ8BAf8EBAMC\n' +
-        'AYYwCgYIKoZIzj0EAwMDaAAwZQIxAJ4NxQ1Gerqr70ZrnUqc62Vl8NNqTzInamCG\n' +
-        'Kce3FTsMWbS9qkgrjZkO9QqOcGIw/gIwSLrwUT+PKr9+H9eHyGvpq9/3AIYSnFkb\n' +
-        'Cf3dyWPiLKoAtLFwjzB/CkJlsAS1c8dS\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/jCCA+agAwIBAgIQGZH12Q7x41qIh9vDu9ikTjANBgkqhkiG9w0BAQwFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIGV1LXdlc3QtMyBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTI1MjIyMjMzWhgPMjEyMTA1MjUyMzIyMzNaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgZXUtd2VzdC0zIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMqE47sHXWzdpuqj\n' +
-        'JHb+6jM9tDbQLDFnYjDWpq4VpLPZhb7xPNh9gnYYTPKG4avG421EblAHqzy9D2pN\n' +
-        '1z90yKbIfUb/Sy2MhQbmZomsObhONEra06fJ0Dydyjswf1iYRp2kwpx5AgkVoNo7\n' +
-        '3dlws73zFjD7ImKvUx2C7B75bhnw2pJWkFnGcswl8fZt9B5Yt95sFOKEz2MSJE91\n' +
-        'kZlHtya19OUxZ/cSGci4MlOySzqzbGwUqGxEIDlY8I39VMwXaYQ8uXUN4G780VcL\n' +
-        'u46FeyRGxZGz2n3hMc805WAA1V5uir87vuirTvoSVREET97HVRGVVNJJ/FM6GXr1\n' +
-        'VKtptybbo81nefYJg9KBysxAa2Ao2x2ry/2ZxwhS6VZ6v1+90bpZA1BIYFEDXXn/\n' +
-        'dW07HSCFnYSlgPtSc+Muh15mdr94LspYeDqNIierK9i4tB6ep7llJAnq0BU91fM2\n' +
-        'JPeqyoTtc3m06QhLf68ccSxO4l8Hmq9kLSHO7UXgtdjfRVaffngopTNk8qK7bIb7\n' +
-        'LrgkqhiQw/PRCZjUdyXL153/fUcsj9nFNe25gM4vcFYwH6c5trd2tUl31NTi1MfG\n' +
-        'Mgp3d2dqxQBIYANkEjtBDMy3SqQLIo9EymqmVP8xx2A/gCBgaxvMAsI6FSWRoC7+\n' +
-        'hqJ8XH4mFnXSHKtYMe6WPY+/XZgtAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8w\n' +
-        'HQYDVR0OBBYEFIkXqTnllT/VJnI2NqipA4XV8rh1MA4GA1UdDwEB/wQEAwIBhjAN\n' +
-        'BgkqhkiG9w0BAQwFAAOCAgEAKjSle8eenGeHgT8pltWCw/HzWyQruVKhfYIBfKJd\n' +
-        'MhV4EnH5BK7LxBIvpXGsFUrb0ThzSw0fn0zoA9jBs3i/Sj6KyeZ9qUF6b8ycDXd+\n' +
-        'wHonmJiQ7nk7UuMefaYAfs06vosgl1rI7eBHC0itexIQmKh0aX+821l4GEgEoSMf\n' +
-        'loMFTLXv2w36fPHHCsZ67ODldgcZbKNnpCTX0YrCwEYO3Pz/L398btiRcWGrewrK\n' +
-        'jdxAAyietra8DRno1Zl87685tfqc6HsL9v8rVw58clAo9XAQvT+fmSOFw/PogRZ7\n' +
-        'OMHUat3gu/uQ1M5S64nkLLFsKu7jzudBuoNmcJysPlzIbqJ7vYc82OUGe9ucF3wi\n' +
-        '3tbKQ983hdJiTExVRBLX/fYjPsGbG3JtPTv89eg2tjWHlPhCDMMxyRKl6isu2RTq\n' +
-        '6VT489Z2zQrC33MYF8ZqO1NKjtyMAMIZwxVu4cGLkVsqFmEV2ScDHa5RadDyD3Ok\n' +
-        'm+mqybhvEVm5tPgY6p0ILPMN3yvJsMSPSvuBXhO/X5ppNnpw9gnxpwbjQKNhkFaG\n' +
-        'M5pkADZ14uRguOLM4VthSwUSEAr5VQYCFZhEwK+UOyJAGiB/nJz6IxL5XBNUXmRM\n' +
-        'Hl8Xvz4riq48LMQbjcVQj0XvH941yPh+P8xOi00SGaQRaWp55Vyr4YKGbV0mEDz1\n' +
-        'r1o=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIF/zCCA+egAwIBAgIRAKwYju1QWxUZpn6D1gOtwgQwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZcxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEwMC4GA1UEAwwn\n' +
-        'QW1hem9uIFJEUyBldS13ZXN0LTEgUm9vdCBDQSBSU0E0MDk2IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyMDE2NTM1NFoYDzIxMjEwNTIwMTc1MzU0WjCBlzEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdBbWF6\n' +
-        'b24gUkRTIGV1LXdlc3QtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCKdBP1U4lqWWkc\n' +
-        'Cb25/BKRTsvNVnISiKocva8GAzJyKfcGRa85gmgu41U+Hz6+39K+XkRfM0YS4BvQ\n' +
-        'F1XxWT0bNyypuvwCvmYShSTjN1TY0ltncDddahTajE/4MdSOZb/c98u0yt03cH+G\n' +
-        'hVwRyT50h0v/UEol50VfwcVAEZEgcQQYhf1IFUFlIvKpmDOqLuFakOnc7c9akK+i\n' +
-        'ivST+JO1tgowbnNkn2iLlSSgUWgb1gjaOsNfysagv1RXdlyPw3EyfwkFifAQvF2P\n' +
-        'Q0ayYZfYS640cccv7efM1MSVyFHR9PrrDsF/zr2S2sGPbeHr7R/HwLl+S5J/l9N9\n' +
-        'y0rk6IHAWV4dEkOvgpnuJKURwA48iu1Hhi9e4moNS6eqoK2KmY3VFpuiyWcA73nH\n' +
-        'GSmyaH+YuMrF7Fnuu7GEHZL/o6+F5cL3mj2SJJhL7sz0ryf5Cs5R4yN9BIEj/f49\n' +
-        'wh84pM6nexoI0Q4wiSFCxWiBpjSmOK6h7z6+2utaB5p20XDZHhxAlmlx4vMuWtjh\n' +
-        'XckgRFxc+ZpVMU3cAHUpVEoO49e/+qKEpPzp8Xg4cToKw2+AfTk3cmyyXQfGwXMQ\n' +
-        'ZUHNZ3w9ILMWihGCM2aGUsLcGDRennvNmnmin/SENsOQ8Ku0/a3teEzwV9cmmdYz\n' +
-        '5iYs1YtgPvKFobY6+T2RXXh+A5kprwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/\n' +
-        'MB0GA1UdDgQWBBSyUrsQVnKmA8z6/2Ech0rCvqpNmTAOBgNVHQ8BAf8EBAMCAYYw\n' +
-        'DQYJKoZIhvcNAQEMBQADggIBAFlj3IFmgiFz5lvTzFTRizhVofhTJsGr14Yfkuc7\n' +
-        'UrXPuXOwJomd4uot2d/VIeGJpfnuS84qGdmQyGewGTJ9inatHsGZgHl9NHNWRwKZ\n' +
-        'lTKTbBiq7aqgtUSFa06v202wpzU+1kadxJJePrbABxiXVfOmIW/a1a4hPNcT3syH\n' +
-        'FIEg1+CGsp71UNjBuwg3JTKWna0sLSKcxLOSOvX1fzxK5djzVpEsvQMB4PSAzXca\n' +
-        'vENgg2ErTwgTA+4s6rRtiBF9pAusN1QVuBahYP3ftrY6f3ycS4K65GnqscyfvKt5\n' +
-        'YgjtEKO3ZeeX8NpubMbzC+0Z6tVKfPFk/9TXuJtwvVeqow0YMrLLyRiYvK7EzJ97\n' +
-        'rrkxoKnHYQSZ+rH2tZ5SE392/rfk1PJL0cdHnkpDkUDO+8cKsFjjYKAQSNC52sKX\n' +
-        '74AVh6wMwxYwVZZJf2/2XxkjMWWhKNejsZhUkTISSmiLs+qPe3L67IM7GyKm9/m6\n' +
-        'R3r8x6NGjhTsKH64iYJg7AeKeax4b2e4hBb6GXFftyOs7unpEOIVkJJgM6gh3mwn\n' +
-        'R7v4gwFbLKADKt1vHuerSZMiTuNTGhSfCeDM53XI/mjZl2HeuCKP1mCDLlaO+gZR\n' +
-        'Q/G+E0sBKgEX4xTkAc3kgkuQGfExdGtnN2U2ehF80lBHB8+2y2E+xWWXih/ZyIcW\n' +
-        'wOx+\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGBDCCA+ygAwIBAgIQM4C8g5iFRucSWdC8EdqHeDANBgkqhkiG9w0BAQwFADCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIGV1LWNlbnRyYWwtMSBSb290IENBIFJTQTQwOTYgRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwIBcNMjEwNTIxMjIyODI2WhgPMjEyMTA1MjEyMzI4MjZaMIGa\n' +
-        'MQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\n' +
-        'LjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\n' +
-        'YXpvbiBSRFMgZXUtY2VudHJhbC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANeTsD/u\n' +
-        '6saPiY4Sg0GlJlMXMBltnrcGAEkwq34OKQ0bCXqcoNJ2rcAMmuFC5x9Ho1Y3YzB7\n' +
-        'NO2GpIh6bZaO76GzSv4cnimcv9n/sQSYXsGbPD+bAtnN/RvNW1avt4C0q0/ghgF1\n' +
-        'VFS8JihIrgPYIArAmDtGNEdl5PUrdi9y6QGggbRfidMDdxlRdZBe1C18ZdgERSEv\n' +
-        'UgSTPRlVczONG5qcQkUGCH83MMqL5MKQiby/Br5ZyPq6rxQMwRnQ7tROuElzyYzL\n' +
-        '7d6kke+PNzG1mYy4cbYdjebwANCtZ2qYRSUHAQsOgybRcSoarv2xqcjO9cEsDiRU\n' +
-        'l97ToadGYa4VVERuTaNZxQwrld4mvzpyKuirqZltOqg0eoy8VUsaRPL3dc5aChR0\n' +
-        'dSrBgRYmSAClcR2/2ZCWpXemikwgt031Dsc0A/+TmVurrsqszwbr0e5xqMow9LzO\n' +
-        'MI/JtLd0VFtoOkL/7GG2tN8a+7gnLFxpv+AQ0DH5n4k/BY/IyS+H1erqSJhOTQ11\n' +
-        'vDOFTM5YplB9hWV9fp5PRs54ILlHTlZLpWGs3I2BrJwzRtg/rOlvsosqcge9ryai\n' +
-        'AKm2j+JBg5wJ19R8oxRy8cfrNTftZePpISaLTyV2B16w/GsSjqixjTQe9LRN2DHk\n' +
-        'cC+HPqYyzW2a3pUVyTGHhW6a7YsPBs9yzt6hAgMBAAGjQjBAMA8GA1UdEwEB/wQF\n' +
-        'MAMBAf8wHQYDVR0OBBYEFIqA8QkOs2cSirOpCuKuOh9VDfJfMA4GA1UdDwEB/wQE\n' +
-        'AwIBhjANBgkqhkiG9w0BAQwFAAOCAgEAOUI90mEIsa+vNJku0iUwdBMnHiO4gm7E\n' +
-        '5JloP7JG0xUr7d0hypDorMM3zVDAL+aZRHsq8n934Cywj7qEp1304UF6538ByGdz\n' +
-        'tkfacJsUSYfdlNJE9KbA4T+U+7SNhj9jvePpVjdQbhgzxITE9f8CxY/eM40yluJJ\n' +
-        'PhbaWvOiRagzo74wttlcDerzLT6Y/JrVpWhnB7IY8HvzK+BwAdaCsBUPC3HF+kth\n' +
-        'CIqLq7J3YArTToejWZAp5OOI6DLPM1MEudyoejL02w0jq0CChmZ5i55ElEMnapRX\n' +
-        '7GQTARHmjgAOqa95FjbHEZzRPqZ72AtZAWKFcYFNk+grXSeWiDgPFOsq6mDg8DDB\n' +
-        '0kfbYwKLFFCC9YFmYzR2YrWw2NxAScccUc2chOWAoSNHiqBbHR8ofrlJSWrtmKqd\n' +
-        'YRCXzn8wqXnTS3NNHNccqJ6dN+iMr9NGnytw8zwwSchiev53Fpc1mGrJ7BKTWH0t\n' +
-        'ZrA6m32wzpMymtKozlOPYoE5mtZEzrzHEXfa44Rns7XIHxVQSXVWyBHLtIsZOrvW\n' +
-        'U5F41rQaFEpEeUQ7sQvqUoISfTUVRNDn6GK6YaccEhCji14APLFIvhRQUDyYMIiM\n' +
-        '4vll0F/xgVRHTgDVQ8b8sxdhSYlqB4Wc2Ym41YRz+X2yPqk3typEZBpc4P5Tt1/N\n' +
-        '89cEIGdbjsA=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEADCCAuigAwIBAgIQYjbPSg4+RNRD3zNxO1fuKDANBgkqhkiG9w0BAQsFADCB\n' +
-        'mDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\n' +
-        'bWF6b24gUkRTIGV1LW5vcnRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUyNDIwNTkyMVoYDzIwNjEwNTI0MjE1OTIxWjCBmDEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\n' +
-        'b24gUkRTIGV1LW5vcnRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA179eQHxcV0YL\n' +
-        'XMkqEmhSBazHhnRVd8yICbMq82PitE3BZcnv1Z5Zs/oOgNmMkOKae4tCXO/41JCX\n' +
-        'wAgbs/eWWi+nnCfpQ/FqbLPg0h3dqzAgeszQyNl9IzTzX4Nd7JFRBVJXPIIKzlRf\n' +
-        '+GmFsAhi3rYgDgO27pz3ciahVSN+CuACIRYnA0K0s9lhYdddmrW/SYeWyoB7jPa2\n' +
-        'LmWpAs7bDOgS4LlP2H3eFepBPgNufRytSQUVA8f58lsE5w25vNiUSnrdlvDrIU5n\n' +
-        'Qwzc7NIZCx4qJpRbSKWrUtbyJriWfAkGU7i0IoainHLn0eHp9bWkwb9D+C/tMk1X\n' +
-        'ERZw2PDGkwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSFmR7s\n' +
-        'dAblusFN+xhf1ae0KUqhWTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\n' +
-        'ggEBAHsXOpjPMyH9lDhPM61zYdja1ebcMVgfUvsDvt+w0xKMKPhBzYDMs/cFOi1N\n' +
-        'Q8LV79VNNfI2NuvFmGygcvTIR+4h0pqqZ+wjWl3Kk5jVxCrbHg3RBX02QLumKd/i\n' +
-        'kwGcEtTUvTssn3SM8bgM0/1BDXgImZPC567ciLvWDo0s/Fe9dJJC3E0G7d/4s09n\n' +
-        'OMdextcxFuWBZrBm/KK3QF0ByA8MG3//VXaGO9OIeeOJCpWn1G1PjT1UklYhkg61\n' +
-        'EbsTiZVA2DLd1BGzfU4o4M5mo68l0msse/ndR1nEY6IywwpgIFue7+rEleDh6b9d\n' +
-        'PYkG1rHVw2I0XDG4o17aOn5E94I=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEADCCAuigAwIBAgIQC6W4HFghUkkgyQw14a6JljANBgkqhkiG9w0BAQsFADCB\n' +
-        'mDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\n' +
-        'bWF6b24gUkRTIGV1LXNvdXRoLTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIyMDUyMzE4MTYzMloYDzIwNjIwNTIzMTkxNjMyWjCBmDEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\n' +
-        'b24gUkRTIGV1LXNvdXRoLTIgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiM/t4FV2R9Nx\n' +
-        'UQG203UY83jInTa/6TMq0SPyg617FqYZxvz2kkx09x3dmxepUg9ttGMlPgjsRZM5\n' +
-        'LCFEi1FWk+hxHzt7vAdhHES5tdjwds3aIkgNEillmRDVrUsbrDwufLaa+MMDO2E1\n' +
-        'wQ/JYFXw16WBCCi2g1EtyQ2Xp+tZDX5IWOTnvhZpW8vVDptZ2AcJ5rMhfOYO3OsK\n' +
-        '5EF0GGA5ldzuezP+BkrBYGJ4wVKGxeaq9+5AT8iVZrypjwRkD7Y5CurywK3+aBwm\n' +
-        's9Q5Nd8t45JCOUzYp92rFKsCriD86n/JnEvgDfdP6Hvtm0/DkwXK40Wz2q0Zrd0k\n' +
-        'mjP054NRPwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRR7yqd\n' +
-        'SfKcX2Q8GzhcVucReIpewTAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\n' +
-        'ggEBAEszBRDwXcZyNm07VcFwI1Im94oKwKccuKYeJEsizTBsVon8VpEiMwDs+yGu\n' +
-        '3p8kBhvkLwWybkD/vv6McH7T5b9jDX2DoOudqYnnaYeypsPH/00Vh3LvKagqzQza\n' +
-        'orWLx+0tLo8xW4BtU+Wrn3JId8LvAhxyYXTn9bm+EwPcStp8xGLwu53OPD1RXYuy\n' +
-        'uu+3ps/2piP7GVfou7H6PRaqbFHNfiGg6Y+WA0HGHiJzn8uLmrRJ5YRdIOOG9/xi\n' +
-        'qTmAZloUNM7VNuurcMM2hWF494tQpsQ6ysg2qPjbBqzlGoOt3GfBTOZmqmwmqtam\n' +
-        'K7juWM/mdMQAJ3SMlE5wI8nVdx4=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIICrjCCAjSgAwIBAgIRAL9SdzVPcpq7GOpvdGoM80IwCgYIKoZIzj0EAwMwgZYx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTEvMC0GA1UEAwwmQW1h\n' +
-        'em9uIFJEUyBldS13ZXN0LTEgUm9vdCBDQSBFQ0MzODQgRzExEDAOBgNVBAcMB1Nl\n' +
-        'YXR0bGUwIBcNMjEwNTIwMTY1ODA3WhgPMjEyMTA1MjAxNzU4MDdaMIGWMQswCQYD\n' +
-        'VQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjETMBEG\n' +
-        'A1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExLzAtBgNVBAMMJkFtYXpvbiBS\n' +
-        'RFMgZXUtd2VzdC0xIFJvb3QgQ0EgRUNDMzg0IEcxMRAwDgYDVQQHDAdTZWF0dGxl\n' +
-        'MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEJWDgXebvwjR+Ce+hxKOLbnsfN5W5dOlP\n' +
-        'Zn8kwWnD+SLkU81Eac/BDJsXGrMk6jFD1vg16PEkoSevsuYWlC8xR6FmT6F6pmeh\n' +
-        'fsMGOyJpfK4fyoEPhKeQoT23lFIc5Orjo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0G\n' +
-        'A1UdDgQWBBSVNAN1CHAz0eZ77qz2adeqjm31TzAOBgNVHQ8BAf8EBAMCAYYwCgYI\n' +
-        'KoZIzj0EAwMDaAAwZQIxAMlQeHbcjor49jqmcJ9gRLWdEWpXG8thIf6zfYQ/OEAg\n' +
-        'd7GDh4fR/OUk0VfjsBUN/gIwZB0bGdXvK38s6AAE/9IT051cz/wMe9GIrX1MnL1T\n' +
-        '1F5OqnXJdiwfZRRTHsRQ/L00\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGBDCCA+ygAwIBAgIQalr16vDfX4Rsr+gfQ4iVFDANBgkqhkiG9w0BAQwFADCB\n' +
-        'mjELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTMwMQYDVQQDDCpB\n' +
-        'bWF6b24gUkRTIGV1LWNlbnRyYWwtMiBSb290IENBIFJTQTQwOTYgRzExEDAOBgNV\n' +
-        'BAcMB1NlYXR0bGUwIBcNMjIwNjA2MjEyNTIzWhgPMjEyMjA2MDYyMjI1MjNaMIGa\n' +
-        'MQswCQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5j\n' +
-        'LjETMBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMzAxBgNVBAMMKkFt\n' +
-        'YXpvbiBSRFMgZXUtY2VudHJhbC0yIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANbHbFg7\n' +
-        '2VhZor1YNtez0VlNFaobS3PwOMcEn45BE3y7HONnElIIWXGQa0811M8V2FnyqnE8\n' +
-        'Z5aO1EuvijvWf/3D8DPZkdmAkIfh5hlZYY6Aatr65kEOckwIAm7ZZzrwFogYuaFC\n' +
-        'z/q0CW+8gxNK+98H/zeFx+IxiVoPPPX6UlrLvn+R6XYNERyHMLNgoZbbS5gGHk43\n' +
-        'KhENVv3AWCCcCc85O4rVd+DGb2vMVt6IzXdTQt6Kih28+RGph+WDwYmf+3txTYr8\n' +
-        'xMcCBt1+whyCPlMbC+Yn/ivtCO4LRf0MPZDRQrqTTrFf0h/V0BGEUmMGwuKgmzf5\n' +
-        'Kl9ILdWv6S956ioZin2WgAxhcn7+z//sN++zkqLreSf90Vgv+A7xPRqIpTdJ/nWG\n' +
-        'JaAOUofBfsDsk4X4SUFE7xJa1FZAiu2lqB/E+y7jnWOvFRalzxVJ2Y+D/ZfUfrnK\n' +
-        '4pfKtyD1C6ni1celrZrAwLrJ3PoXPSg4aJKh8+CHex477SRsGj8KP19FG8r0P5AG\n' +
-        '8lS1V+enFCNvT5KqEBpDZ/Y5SQAhAYFUX+zH4/n4ql0l/emS+x23kSRrF+yMkB9q\n' +
-        'lhC/fMk6Pi3tICBjrDQ8XAxv56hfud9w6+/ljYB2uQ1iUYtlE3JdIiuE+3ws26O8\n' +
-        'i7PLMD9zQmo+sVi12pLHfBHQ6RRHtdVRXbXRAgMBAAGjQjBAMA8GA1UdEwEB/wQF\n' +
-        'MAMBAf8wHQYDVR0OBBYEFBFot08ipEL9ZUXCG4lagmF53C0/MA4GA1UdDwEB/wQE\n' +
-        'AwIBhjANBgkqhkiG9w0BAQwFAAOCAgEAi2mcZi6cpaeqJ10xzMY0F3L2eOKYnlEQ\n' +
-        'h6QyhmNKCUF05q5u+cok5KtznzqMwy7TFOZtbVHl8uUX+xvgq/MQCxqFAnuStBXm\n' +
-        'gr2dg1h509ZwvTdk7TDxGdftvPCfnPNJBFbMSq4CZtNcOFBg9Rj8c3Yj+Qvwd56V\n' +
-        'zWs65BUkDNJrXmxdvhJZjUkMa9vi/oFN+M84xXeZTaC5YDYNZZeW9706QqDbAVES\n' +
-        '5ulvKLavB8waLI/lhRBK5/k0YykCMl0A8Togt8D1QsQ0eWWbIM8/HYJMPVFhJ8Wj\n' +
-        'vT1p/YVeDA3Bo1iKDOttgC5vILf5Rw1ZEeDxjf/r8A7VS13D3OLjBmc31zxRTs3n\n' +
-        'XvHKP9MieQHn9GE44tEYPjK3/yC6BDFzCBlvccYHmqGb+jvDEXEBXKzimdC9mcDl\n' +
-        'f4BBQWGJBH5jkbU9p6iti19L/zHhz7qU6UJWbxY40w92L9jS9Utljh4A0LCTjlnR\n' +
-        'NQUgjnGC6K+jkw8hj0LTC5Ip87oqoT9w7Av5EJ3VJ4hcnmNMXJJ1DkWYdnytcGpO\n' +
-        'DMVITQzzDZRwhbitCVPHagTN2wdi9TEuYE33J0VmFeTc6FSI50wP2aOAZ0Q1/8Aj\n' +
-        'bxeM5jS25eaHc2CQAuhrc/7GLnxOcPwdWQb2XWT8eHudhMnoRikVv/KSK3mf6om4\n' +
-        '1YfpdH2jp30=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID/jCCAuagAwIBAgIQTDc+UgTRtYO7ZGTQ8UWKDDANBgkqhkiG9w0BAQsFADCB\n' +
-        'lzELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTAwLgYDVQQDDCdB\n' +
-        'bWF6b24gUkRTIGV1LXdlc3QtMiBSb290IENBIFJTQTIwNDggRzExEDAOBgNVBAcM\n' +
-        'B1NlYXR0bGUwIBcNMjEwNTIxMjI0NjI0WhgPMjA2MTA1MjEyMzQ2MjRaMIGXMQsw\n' +
-        'CQYDVQQGEwJVUzEiMCAGA1UECgwZQW1hem9uIFdlYiBTZXJ2aWNlcywgSW5jLjET\n' +
-        'MBEGA1UECwwKQW1hem9uIFJEUzELMAkGA1UECAwCV0ExMDAuBgNVBAMMJ0FtYXpv\n' +
-        'biBSRFMgZXUtd2VzdC0yIFJvb3QgQ0EgUlNBMjA0OCBHMTEQMA4GA1UEBwwHU2Vh\n' +
-        'dHRsZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM1oGtthQ1YiVIC2\n' +
-        'i4u4swMAGxAjc/BZp0yq0eP5ZQFaxnxs7zFAPabEWsrjeDzrRhdVO0h7zskrertP\n' +
-        'gblGhfD20JfjvCHdP1RUhy/nzG+T+hn6Takan/GIgs8grlBMRHMgBYHW7tklhjaH\n' +
-        '3F7LujhceAHhhgp6IOrpb6YTaTTaJbF3GTmkqxSJ3l1LtEoWz8Al/nL/Ftzxrtez\n' +
-        'Vs6ebpvd7sw37sxmXBWX2OlvUrPCTmladw9OrllGXtCFw4YyLe3zozBlZ3cHzQ0q\n' +
-        'lINhpRcajTMfZrsiGCkQtoJT+AqVJPS2sHjqsEH8yiySW9Jbq4zyMbM1yqQ2vnnx\n' +
-        'MJgoYMcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUaQG88UnV\n' +
-        'JPTI+Pcti1P+q3H7pGYwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4IB\n' +
-        'AQBAkgr75V0sEJimC6QRiTVWEuj2Khy7unjSfudbM6zumhXEU2/sUaVLiYy6cA/x\n' +
-        '3v0laDle6T07x9g64j5YastE/4jbzrGgIINFlY0JnaYmR3KZEjgi1s1fkRRf3llL\n' +
-        'PJm9u4Q1mbwAMQK/ZjLuuRcL3uRIHJek18nRqT5h43GB26qXyvJqeYYpYfIjL9+/\n' +
-        'YiZAbSRRZG+Li23cmPWrbA1CJY121SB+WybCbysbOXzhD3Sl2KSZRwSw4p2HrFtV\n' +
-        '1Prk0dOBtZxCG9luf87ultuDZpfS0w6oNBAMXocgswk24ylcADkkFxBWW+7BETn1\n' +
-        'EpK+t1Lm37mU4sxtuha00XAi\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIEADCCAuigAwIBAgIQcY44/8NUvBwr6LlHfRy7KjANBgkqhkiG9w0BAQsFADCB\n' +
-        'mDELMAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIElu\n' +
-        'Yy4xEzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChB\n' +
-        'bWF6b24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQH\n' +
-        'DAdTZWF0dGxlMCAXDTIxMDUxOTE4MjcxOFoYDzIwNjEwNTE5MTkyNzE4WjCBmDEL\n' +
-        'MAkGA1UEBhMCVVMxIjAgBgNVBAoMGUFtYXpvbiBXZWIgU2VydmljZXMsIEluYy4x\n' +
-        'EzARBgNVBAsMCkFtYXpvbiBSRFMxCzAJBgNVBAgMAldBMTEwLwYDVQQDDChBbWF6\n' +
-        'b24gUkRTIGV1LXNvdXRoLTEgUm9vdCBDQSBSU0EyMDQ4IEcxMRAwDgYDVQQHDAdT\n' +
-        'ZWF0dGxlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0UaBeC+Usalu\n' +
-        'EtXnV7+PnH+gi7/71tI/jkKVGKuhD2JDVvqLVoqbMHRh3+wGMvqKCjbHPcC2XMWv\n' +
-        '566fpAj4UZ9CLB5fVzss+QVNTl+FH2XhEzigopp+872ajsNzcZxrMkifxGb4i0U+\n' +
-        't0Zi+UrbL5tsfP2JonKR1crOrbS6/DlzHBjIiJazGOQcMsJjNuTOItLbMohLpraA\n' +
-        '/nApa3kOvI7Ufool1/34MG0+wL3UUA4YkZ6oBJVxjZvvs6tI7Lzz/SnhK2widGdc\n' +
-        'snbLqBpHNIZQSorVoiwcFaRBGYX/uzYkiw44Yfa4cK2V/B5zgu1Fbr0gbI2am4eh\n' +
-        'yVYyg4jPawIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS9gM1m\n' +
-        'IIjyh9O5H/7Vj0R/akI7UzAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQELBQAD\n' +
-        'ggEBAF0Sm9HC2AUyedBVnwgkVXMibnYChOzz7T+0Y+fOLXYAEXex2s8oqGeZdGYX\n' +
-        'JHkjBn7JXu7LM+TpTbPbFFDoc1sgMguD/ls+8XsqAl1CssW+amryIL+jfcfbgQ+P\n' +
-        'ICwEUD9hGdjBgJ5WcuS+qqxHsEIlFNci3HxcxfBa9VsWs5TjI7Vsl4meL5lf7ZyL\n' +
-        'wDV7dHRuU+cImqG1MIvPRIlvPnT7EghrCYi2VCPhP2pM/UvShuwVnkz4MJ29ebIk\n' +
-        'WR9kpblFxFdE92D5UUvMCjC2kmtgzNiErvTcwIvOO9YCbBHzRB1fFiWrXUHhJWq9\n' +
-        'IkaxR5icb/IpAV0A1lYZEWMVsfQ=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIGATCCA+mgAwIBAgIRAMa0TPL+QgbWfUPpYXQkf8wwDQYJKoZIhvcNAQEMBQAw\n' +
-        'gZgxCzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJ\n' +
-        'bmMuMRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwo\n' +
-        'QW1hem9uIFJEUyBldS1ub3J0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UE\n' +
-        'BwwHU2VhdHRsZTAgFw0yMTA1MjQyMTAzMjBaGA8yMTIxMDUyNDIyMDMyMFowgZgx\n' +
-        'CzAJBgNVBAYTAlVTMSIwIAYDVQQKDBlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMu\n' +
-        'MRMwEQYDVQQLDApBbWF6b24gUkRTMQswCQYDVQQIDAJXQTExMC8GA1UEAwwoQW1h\n' +
-        'em9uIFJEUyBldS1ub3J0aC0xIFJvb3QgQ0EgUlNBNDA5NiBHMTEQMA4GA1UEBwwH\n' +
-        'U2VhdHRsZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANhS9LJVJyWp\n' +
-        '6Rudy9t47y6kzvgnFYDrvJVtgEK0vFn5ifdlHE7xqMz4LZqWBFTnS+3oidwVRqo7\n' +
-        'tqsuuElsouStO8m315/YUzKZEPmkw8h5ufWt/lg3NTCoUZNkB4p4skr7TspyMUwE\n' +
-        'VdlKQuWTCOLtofwmWT+BnFF3To6xTh3XPlT3ssancw27Gob8kJegD7E0TSMVsecP\n' +
-        'B8je65+3b8CGwcD3QB3kCTGLy87tXuS2+07pncHvjMRMBdDQQQqhXWsRSeUNg0IP\n' +
-        'xdHTWcuwMldYPWK5zus9M4dCNBDlmZjKdcZZVUOKeBBAm7Uo7CbJCk8r/Fvfr6mw\n' +
-        'nXXDtuWhqn/WhJiI/y0QU27M+Hy5CQMxBwFsfAjJkByBpdXmyYxUgTmMpLf43p7H\n' +
-        'oWfH1xN0cT0OQEVmAQjMakauow4AQLNkilV+X6uAAu3STQVFRSrpvMen9Xx3EPC3\n' +
-        'G9flHueTa71bU65Xe8ZmEmFhGeFYHY0GrNPAFhq9RThPRY0IPyCZe0Th8uGejkek\n' +
-        'jQjm0FHPOqs5jc8CD8eJs4jSEFt9lasFLVDcAhx0FkacLKQjGHvKAnnbRwhN/dF3\n' +
-        'xt4oL8Z4JGPCLau056gKnYaEyviN7PgO+IFIVOVIdKEBu2ASGE8/+QJB5bcHefNj\n' +
-        '04hEkDW0UYJbSfPpVbGAR0gFI/QpycKnAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wHQYDVR0OBBYEFFMXvvjoaGGUcul8GA3FT05DLbZcMA4GA1UdDwEB/wQEAwIB\n' +
-        'hjANBgkqhkiG9w0BAQwFAAOCAgEAQLwFhd2JKn4K/6salLyIA4mP58qbA/9BTB/r\n' +
-        'D9l0bEwDlVPSdY7R3gZCe6v7SWLfA9RjE5tdWDrQMi5IU6W2OVrVsZS/yGJfwnwe\n' +
-        'a/9iUAYprA5QYKDg37h12XhVsDKlYCekHdC+qa5WwB1SL3YUprDLPWeaIQdg+Uh2\n' +
-        '+LxvpZGoxoEbca0fc7flwq9ke/3sXt/3V4wJDyY6AL2YNdjFzC+FtYjHHx8rYxHs\n' +
-        'aesP7yunuN17KcfOZBBnSFRrx96k+Xm95VReTEEpwiBqAECqEpMbd+R0mFAayMb1\n' +
-        'cE77GaK5yeC2f67NLYGpkpIoPbO9p9rzoXLE5GpSizMjimnz6QCbXPFAFBDfSzim\n' +
-        'u6azp40kEUO6kWd7rBhqRwLc43D3TtNWQYxMve5mTRG4Od+eMKwYZmQz89BQCeqm\n' +
-        'aZiJP9y9uwJw4p/A5V3lYHTDQqzmbOyhGUk6OdpdE8HXs/1ep1xTT20QDYOx3Ekt\n' +
-        'r4mmNYfH/8v9nHNRlYJOqFhmoh1i85IUl5IHhg6OT5ZTTwsGTSxvgQQXrmmHVrgZ\n' +
-        'rZIqyBKllCgVeB9sMEsntn4bGLig7CS/N1y2mYdW/745yCLZv2gj0NXhPqgEIdVV\n' +
-        'f9DhFD4ohE1C63XP0kOQee+LYg/MY5vH8swpCSWxQgX5icv5jVDz8YTdCKgUc5u8\n' +
-        'rM2p0kk=\n' +
-        '-----END CERTIFICATE-----\n',
-];
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/proxies.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/proxies.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,8 +1,0 @@
-import type { CA } from '../../@types/profiles.js';
-/**
- * CA Certificates for **Amazon RDS Proxy** (2024)
- *
- * - https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.howitworks.html#rds-proxy-security.tls
- * - https://www.amazontrust.com/repository/
- */
-export declare const proxies: CA;
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/proxies.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/lib/profiles/ca/proxies.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,111 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.proxies = void 0;
-/**
- * CA Certificates for **Amazon RDS Proxy** (2024)
- *
- * - https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.howitworks.html#rds-proxy-security.tls
- * - https://www.amazontrust.com/repository/
- */
-exports.proxies = [
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n' +
-        'ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n' +
-        'b24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\n' +
-        'MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\n' +
-        'b3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\n' +
-        'ca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n' +
-        '9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\n' +
-        'IFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\n' +
-        'VOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n' +
-        '93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\n' +
-        'jgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n' +
-        'AYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\n' +
-        'A4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\n' +
-        'U5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\n' +
-        'N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\n' +
-        'o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n' +
-        '5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\n' +
-        'rqXRfboQnoZsG4q5WTP468SQvvG5\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF\n' +
-        'ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n' +
-        'b24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL\n' +
-        'MAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\n' +
-        'b3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK\n' +
-        'gXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ\n' +
-        'W0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg\n' +
-        '1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K\n' +
-        '8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r\n' +
-        '2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me\n' +
-        'z/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR\n' +
-        '8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj\n' +
-        'mUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz\n' +
-        '7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6\n' +
-        '+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI\n' +
-        '0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\n' +
-        'Af8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm\n' +
-        'UjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2\n' +
-        'LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\n' +
-        '+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS\n' +
-        'k5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl\n' +
-        '7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm\n' +
-        'btmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl\n' +
-        'urR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+\n' +
-        'fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63\n' +
-        'n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE\n' +
-        '76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H\n' +
-        '9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT\n' +
-        '4PsJYGw=\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\n' +
-        'MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n' +
-        'Um9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n' +
-        'A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n' +
-        'Q0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\n' +
-        'ui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\n' +
-        'QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\n' +
-        'ttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\n' +
-        'BqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\n' +
-        'YyRIHN8wfdVoOw==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5\n' +
-        'MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\n' +
-        'Um9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\n' +
-        'A1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\n' +
-        'Q0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi\n' +
-        '9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk\n' +
-        'M6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB\n' +
-        '/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB\n' +
-        'MAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw\n' +
-        'CkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW\n' +
-        '1KyLa2tJElMzrdfkviT8tQp21KW8EA==\n' +
-        '-----END CERTIFICATE-----\n',
-    '-----BEGIN CERTIFICATE-----\n' +
-        'MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\n' +
-        'EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\n' +
-        'HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\n' +
-        'ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\n' +
-        'MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\n' +
-        'VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\n' +
-        'ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\n' +
-        'dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\n' +
-        'hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\n' +
-        'OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\n' +
-        '8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\n' +
-        'Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\n' +
-        'hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\n' +
-        '6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\n' +
-        'DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\n' +
-        'AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\n' +
-        'bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\n' +
-        've6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\n' +
-        'qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\n' +
-        'iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\n' +
-        '0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\n' +
-        'sSi6\n' +
-        '-----END CERTIFICATE-----\n',
-];
Index: uckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/aws-ssl-profiles/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,52 +1,0 @@
-{
-  "name": "aws-ssl-profiles",
-  "version": "1.1.2",
-  "main": "lib/index.js",
-  "author": "https://github.com/wellwelwel",
-  "description": "AWS RDS SSL certificates bundles.",
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/mysqljs/aws-ssl-profiles"
-  },
-  "bugs": {
-    "url": "https://github.com/mysqljs/aws-ssl-profiles/issues"
-  },
-  "devDependencies": {
-    "@biomejs/biome": "^1.8.3",
-    "@types/node": "^22.5.1",
-    "@types/x509.js": "^1.0.3",
-    "poku": "^2.5.0",
-    "prettier": "^3.3.3",
-    "tsx": "^4.19.0",
-    "typescript": "^5.5.4",
-    "x509.js": "^1.0.0"
-  },
-  "files": [
-    "lib"
-  ],
-  "engines": {
-    "node": ">= 6.0.0"
-  },
-  "keywords": [
-    "mysql",
-    "mysql2",
-    "pg",
-    "postgres",
-    "aws",
-    "rds",
-    "ssl",
-    "certificates",
-    "ca",
-    "bundle"
-  ],
-  "scripts": {
-    "build": "npx tsc",
-    "postbuild": "cp src/index.d.ts lib/index.d.ts",
-    "lint": "npx @biomejs/biome lint && prettier --check .",
-    "lint:fix": "npx @biomejs/biome lint --write . && prettier --write .",
-    "pretest": "npm run build",
-    "test": "poku --parallel ./test",
-    "test:ci": "npm run lint && npm run test"
-  }
-}
Index: uckSimulator-main/ds-db-ws/node_modules/denque/CHANGELOG.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/denque/CHANGELOG.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,29 +1,0 @@
-## 2.1.0
-
- - fix: issue where `clear()` is still keeping references to the elements (#47)
- - refactor: performance optimizations for growth and array copy (#43)
- - refactor: performance optimizations for toArray and fromArray (#46)
- - test: add additional benchmarks for queue growth and `toArray` (#45)
-
-## 2.0.1
-
- - fix(types): incorrect return type on `size()`
-
-## 2.0.0
-
- - fix!: `push` & `unshift` now accept `undefined` values to match behaviour of `Array` (fixes #25) (#35)
-   - This is only a **BREAKING** change if you are currently expecting `push(undefined)` and `unshift(undefined)` to do
-     nothing - the new behaviour now correctly adds undefined values to the queue.
-   - **Note**: behaviour of `push()` & `unshift()` (no arguments) remains unchanged (nothing gets added to the queue).
-   - **Note**: If you need to differentiate between `undefined` values in the queue and the return value of `pop()` then
-     check the queue `.length` before popping.
- - fix: incorrect methods in types definition file
-
-## 1.5.1
-
- - perf: minor performance tweak when growing queue size (#29)
-
-## 1.5.0
-
- - feat: adds capacity option for circular buffers (#27)
-
Index: uckSimulator-main/ds-db-ws/node_modules/denque/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/denque/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,201 +1,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright 2018-present Invertase Limited
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
Index: uckSimulator-main/ds-db-ws/node_modules/denque/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/denque/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,77 +1,0 @@
-<p align="center">
-  <h1 align="center">Denque</h1>
-</p>
-
-<p align="center">
-  <a href="https://www.npmjs.com/package/denque"><img src="https://img.shields.io/npm/dm/denque.svg?style=flat-square" alt="NPM downloads"></a>
-  <a href="https://www.npmjs.com/package/denque"><img src="https://img.shields.io/npm/v/denque.svg?style=flat-square" alt="NPM version"></a>
-  <a href="https://github.com/invertase/denque/actions/workflows/testing.yam"><img src="https://github.com/invertase/denque/actions/workflows/testing.yaml/badge.svg" alt="Tests status"></a>
-  <a href="https://codecov.io/gh/invertase/denque"><img src="https://codecov.io/gh/invertase/denque/branch/master/graph/badge.svg?token=rn91iI4bSe" alt="Coverage"></a>
-  <a href="/LICENSE"><img src="https://img.shields.io/npm/l/denque.svg?style=flat-square" alt="License"></a>
-  <a href="https://twitter.com/invertaseio"><img src="https://img.shields.io/twitter/follow/invertaseio.svg?style=social&label=Follow" alt="Follow on Twitter"></a>
-</p>
-
-Denque is a well tested, extremely fast and lightweight [double-ended queue](http://en.wikipedia.org/wiki/Double-ended_queue)
-implementation with zero dependencies and includes TypeScript types.
-
-Double-ended queues can also be used as a:
-
-- [Stack](http://en.wikipedia.org/wiki/Stack_\(abstract_data_type\))
-- [Queue](http://en.wikipedia.org/wiki/Queue_\(data_structure\))
-
-This implementation is currently the fastest available, even faster than `double-ended-queue`, see the [benchmarks](https://docs.page/invertase/denque/benchmarks).
-
-Every queue operation is done at a constant `O(1)` - including random access from `.peekAt(index)`.
-
-**Works on all node versions >= v0.10**
-
-## Quick Start
-
-Install the package:
-
-```bash
-npm install denque
-```
-
-Create and consume a queue:
-
-```js
-const Denque = require("denque");
-
-const denque = new Denque([1,2,3,4]);
-denque.shift(); // 1
-denque.pop(); // 4
-```
-
-
-See the [API reference documentation](https://docs.page/invertase/denque/api) for more examples.
-
----
-
-## Who's using it?
-
-- [Kafka Node.js client](https://www.npmjs.com/package/kafka-node)
-- [MariaDB Node.js client](https://www.npmjs.com/package/mariadb)
-- [MongoDB Node.js client](https://www.npmjs.com/package/mongodb)
-- [MySQL Node.js client](https://www.npmjs.com/package/mysql2)
-- [Redis Node.js clients](https://www.npmjs.com/package/redis)
-
-... and [many more](https://www.npmjs.com/browse/depended/denque).
-
-
----
-
-## License
-
-- See [LICENSE](/LICENSE)
-
----
-
-<p align="center">
-  <a href="https://invertase.io/?utm_source=readme&utm_medium=footer&utm_campaign=denque">
-    <img width="75px" src="https://static.invertase.io/assets/invertase/invertase-rounded-avatar.png">
-  </a>
-  <p align="center">
-    Built and maintained by <a href="https://invertase.io/?utm_source=readme&utm_medium=footer&utm_campaign=denque">Invertase</a>.
-  </p>
-</p>
Index: uckSimulator-main/ds-db-ws/node_modules/denque/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/denque/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,47 +1,0 @@
-declare class Denque<T = any> {
-  length: number;
-
-  constructor();
-
-  constructor(array: T[]);
-
-  constructor(array: T[], options: IDenqueOptions);
-
-  push(item: T): number;
-
-  unshift(item: T): number;
-
-  pop(): T | undefined;
-
-  shift(): T | undefined;
-
-  peekBack(): T | undefined;
-
-  peekFront(): T | undefined;
-
-  peekAt(index: number): T | undefined;
-
-  get(index: number): T | undefined;
-
-  remove(index: number, count: number): T[];
-
-  removeOne(index: number): T | undefined;
-
-  splice(index: number, count: number, ...item: T[]): T[] | undefined;
-
-  isEmpty(): boolean;
-
-  clear(): void;
-
-  size(): number;
-
-  toString(): string;
-
-  toArray(): T[];
-}
-
-interface IDenqueOptions {
-  capacity?: number
-}
-
-export = Denque;
Index: uckSimulator-main/ds-db-ws/node_modules/denque/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/denque/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,481 +1,0 @@
-'use strict';
-
-/**
- * Custom implementation of a double ended queue.
- */
-function Denque(array, options) {
-  var options = options || {};
-  this._capacity = options.capacity;
-
-  this._head = 0;
-  this._tail = 0;
-
-  if (Array.isArray(array)) {
-    this._fromArray(array);
-  } else {
-    this._capacityMask = 0x3;
-    this._list = new Array(4);
-  }
-}
-
-/**
- * --------------
- *  PUBLIC API
- * -------------
- */
-
-/**
- * Returns the item at the specified index from the list.
- * 0 is the first element, 1 is the second, and so on...
- * Elements at negative values are that many from the end: -1 is one before the end
- * (the last element), -2 is two before the end (one before last), etc.
- * @param index
- * @returns {*}
- */
-Denque.prototype.peekAt = function peekAt(index) {
-  var i = index;
-  // expect a number or return undefined
-  if ((i !== (i | 0))) {
-    return void 0;
-  }
-  var len = this.size();
-  if (i >= len || i < -len) return undefined;
-  if (i < 0) i += len;
-  i = (this._head + i) & this._capacityMask;
-  return this._list[i];
-};
-
-/**
- * Alias for peekAt()
- * @param i
- * @returns {*}
- */
-Denque.prototype.get = function get(i) {
-  return this.peekAt(i);
-};
-
-/**
- * Returns the first item in the list without removing it.
- * @returns {*}
- */
-Denque.prototype.peek = function peek() {
-  if (this._head === this._tail) return undefined;
-  return this._list[this._head];
-};
-
-/**
- * Alias for peek()
- * @returns {*}
- */
-Denque.prototype.peekFront = function peekFront() {
-  return this.peek();
-};
-
-/**
- * Returns the item that is at the back of the queue without removing it.
- * Uses peekAt(-1)
- */
-Denque.prototype.peekBack = function peekBack() {
-  return this.peekAt(-1);
-};
-
-/**
- * Returns the current length of the queue
- * @return {Number}
- */
-Object.defineProperty(Denque.prototype, 'length', {
-  get: function length() {
-    return this.size();
-  }
-});
-
-/**
- * Return the number of items on the list, or 0 if empty.
- * @returns {number}
- */
-Denque.prototype.size = function size() {
-  if (this._head === this._tail) return 0;
-  if (this._head < this._tail) return this._tail - this._head;
-  else return this._capacityMask + 1 - (this._head - this._tail);
-};
-
-/**
- * Add an item at the beginning of the list.
- * @param item
- */
-Denque.prototype.unshift = function unshift(item) {
-  if (arguments.length === 0) return this.size();
-  var len = this._list.length;
-  this._head = (this._head - 1 + len) & this._capacityMask;
-  this._list[this._head] = item;
-  if (this._tail === this._head) this._growArray();
-  if (this._capacity && this.size() > this._capacity) this.pop();
-  if (this._head < this._tail) return this._tail - this._head;
-  else return this._capacityMask + 1 - (this._head - this._tail);
-};
-
-/**
- * Remove and return the first item on the list,
- * Returns undefined if the list is empty.
- * @returns {*}
- */
-Denque.prototype.shift = function shift() {
-  var head = this._head;
-  if (head === this._tail) return undefined;
-  var item = this._list[head];
-  this._list[head] = undefined;
-  this._head = (head + 1) & this._capacityMask;
-  if (head < 2 && this._tail > 10000 && this._tail <= this._list.length >>> 2) this._shrinkArray();
-  return item;
-};
-
-/**
- * Add an item to the bottom of the list.
- * @param item
- */
-Denque.prototype.push = function push(item) {
-  if (arguments.length === 0) return this.size();
-  var tail = this._tail;
-  this._list[tail] = item;
-  this._tail = (tail + 1) & this._capacityMask;
-  if (this._tail === this._head) {
-    this._growArray();
-  }
-  if (this._capacity && this.size() > this._capacity) {
-    this.shift();
-  }
-  if (this._head < this._tail) return this._tail - this._head;
-  else return this._capacityMask + 1 - (this._head - this._tail);
-};
-
-/**
- * Remove and return the last item on the list.
- * Returns undefined if the list is empty.
- * @returns {*}
- */
-Denque.prototype.pop = function pop() {
-  var tail = this._tail;
-  if (tail === this._head) return undefined;
-  var len = this._list.length;
-  this._tail = (tail - 1 + len) & this._capacityMask;
-  var item = this._list[this._tail];
-  this._list[this._tail] = undefined;
-  if (this._head < 2 && tail > 10000 && tail <= len >>> 2) this._shrinkArray();
-  return item;
-};
-
-/**
- * Remove and return the item at the specified index from the list.
- * Returns undefined if the list is empty.
- * @param index
- * @returns {*}
- */
-Denque.prototype.removeOne = function removeOne(index) {
-  var i = index;
-  // expect a number or return undefined
-  if ((i !== (i | 0))) {
-    return void 0;
-  }
-  if (this._head === this._tail) return void 0;
-  var size = this.size();
-  var len = this._list.length;
-  if (i >= size || i < -size) return void 0;
-  if (i < 0) i += size;
-  i = (this._head + i) & this._capacityMask;
-  var item = this._list[i];
-  var k;
-  if (index < size / 2) {
-    for (k = index; k > 0; k--) {
-      this._list[i] = this._list[i = (i - 1 + len) & this._capacityMask];
-    }
-    this._list[i] = void 0;
-    this._head = (this._head + 1 + len) & this._capacityMask;
-  } else {
-    for (k = size - 1 - index; k > 0; k--) {
-      this._list[i] = this._list[i = (i + 1 + len) & this._capacityMask];
-    }
-    this._list[i] = void 0;
-    this._tail = (this._tail - 1 + len) & this._capacityMask;
-  }
-  return item;
-};
-
-/**
- * Remove number of items from the specified index from the list.
- * Returns array of removed items.
- * Returns undefined if the list is empty.
- * @param index
- * @param count
- * @returns {array}
- */
-Denque.prototype.remove = function remove(index, count) {
-  var i = index;
-  var removed;
-  var del_count = count;
-  // expect a number or return undefined
-  if ((i !== (i | 0))) {
-    return void 0;
-  }
-  if (this._head === this._tail) return void 0;
-  var size = this.size();
-  var len = this._list.length;
-  if (i >= size || i < -size || count < 1) return void 0;
-  if (i < 0) i += size;
-  if (count === 1 || !count) {
-    removed = new Array(1);
-    removed[0] = this.removeOne(i);
-    return removed;
-  }
-  if (i === 0 && i + count >= size) {
-    removed = this.toArray();
-    this.clear();
-    return removed;
-  }
-  if (i + count > size) count = size - i;
-  var k;
-  removed = new Array(count);
-  for (k = 0; k < count; k++) {
-    removed[k] = this._list[(this._head + i + k) & this._capacityMask];
-  }
-  i = (this._head + i) & this._capacityMask;
-  if (index + count === size) {
-    this._tail = (this._tail - count + len) & this._capacityMask;
-    for (k = count; k > 0; k--) {
-      this._list[i = (i + 1 + len) & this._capacityMask] = void 0;
-    }
-    return removed;
-  }
-  if (index === 0) {
-    this._head = (this._head + count + len) & this._capacityMask;
-    for (k = count - 1; k > 0; k--) {
-      this._list[i = (i + 1 + len) & this._capacityMask] = void 0;
-    }
-    return removed;
-  }
-  if (i < size / 2) {
-    this._head = (this._head + index + count + len) & this._capacityMask;
-    for (k = index; k > 0; k--) {
-      this.unshift(this._list[i = (i - 1 + len) & this._capacityMask]);
-    }
-    i = (this._head - 1 + len) & this._capacityMask;
-    while (del_count > 0) {
-      this._list[i = (i - 1 + len) & this._capacityMask] = void 0;
-      del_count--;
-    }
-    if (index < 0) this._tail = i;
-  } else {
-    this._tail = i;
-    i = (i + count + len) & this._capacityMask;
-    for (k = size - (count + index); k > 0; k--) {
-      this.push(this._list[i++]);
-    }
-    i = this._tail;
-    while (del_count > 0) {
-      this._list[i = (i + 1 + len) & this._capacityMask] = void 0;
-      del_count--;
-    }
-  }
-  if (this._head < 2 && this._tail > 10000 && this._tail <= len >>> 2) this._shrinkArray();
-  return removed;
-};
-
-/**
- * Native splice implementation.
- * Remove number of items from the specified index from the list and/or add new elements.
- * Returns array of removed items or empty array if count == 0.
- * Returns undefined if the list is empty.
- *
- * @param index
- * @param count
- * @param {...*} [elements]
- * @returns {array}
- */
-Denque.prototype.splice = function splice(index, count) {
-  var i = index;
-  // expect a number or return undefined
-  if ((i !== (i | 0))) {
-    return void 0;
-  }
-  var size = this.size();
-  if (i < 0) i += size;
-  if (i > size) return void 0;
-  if (arguments.length > 2) {
-    var k;
-    var temp;
-    var removed;
-    var arg_len = arguments.length;
-    var len = this._list.length;
-    var arguments_index = 2;
-    if (!size || i < size / 2) {
-      temp = new Array(i);
-      for (k = 0; k < i; k++) {
-        temp[k] = this._list[(this._head + k) & this._capacityMask];
-      }
-      if (count === 0) {
-        removed = [];
-        if (i > 0) {
-          this._head = (this._head + i + len) & this._capacityMask;
-        }
-      } else {
-        removed = this.remove(i, count);
-        this._head = (this._head + i + len) & this._capacityMask;
-      }
-      while (arg_len > arguments_index) {
-        this.unshift(arguments[--arg_len]);
-      }
-      for (k = i; k > 0; k--) {
-        this.unshift(temp[k - 1]);
-      }
-    } else {
-      temp = new Array(size - (i + count));
-      var leng = temp.length;
-      for (k = 0; k < leng; k++) {
-        temp[k] = this._list[(this._head + i + count + k) & this._capacityMask];
-      }
-      if (count === 0) {
-        removed = [];
-        if (i != size) {
-          this._tail = (this._head + i + len) & this._capacityMask;
-        }
-      } else {
-        removed = this.remove(i, count);
-        this._tail = (this._tail - leng + len) & this._capacityMask;
-      }
-      while (arguments_index < arg_len) {
-        this.push(arguments[arguments_index++]);
-      }
-      for (k = 0; k < leng; k++) {
-        this.push(temp[k]);
-      }
-    }
-    return removed;
-  } else {
-    return this.remove(i, count);
-  }
-};
-
-/**
- * Soft clear - does not reset capacity.
- */
-Denque.prototype.clear = function clear() {
-  this._list = new Array(this._list.length);
-  this._head = 0;
-  this._tail = 0;
-};
-
-/**
- * Returns true or false whether the list is empty.
- * @returns {boolean}
- */
-Denque.prototype.isEmpty = function isEmpty() {
-  return this._head === this._tail;
-};
-
-/**
- * Returns an array of all queue items.
- * @returns {Array}
- */
-Denque.prototype.toArray = function toArray() {
-  return this._copyArray(false);
-};
-
-/**
- * -------------
- *   INTERNALS
- * -------------
- */
-
-/**
- * Fills the queue with items from an array
- * For use in the constructor
- * @param array
- * @private
- */
-Denque.prototype._fromArray = function _fromArray(array) {
-  var length = array.length;
-  var capacity = this._nextPowerOf2(length);
-
-  this._list = new Array(capacity);
-  this._capacityMask = capacity - 1;
-  this._tail = length;
-
-  for (var i = 0; i < length; i++) this._list[i] = array[i];
-};
-
-/**
- *
- * @param fullCopy
- * @param size Initialize the array with a specific size. Will default to the current list size
- * @returns {Array}
- * @private
- */
-Denque.prototype._copyArray = function _copyArray(fullCopy, size) {
-  var src = this._list;
-  var capacity = src.length;
-  var length = this.length;
-  size = size | length;
-
-  // No prealloc requested and the buffer is contiguous
-  if (size == length && this._head < this._tail) {
-    // Simply do a fast slice copy
-    return this._list.slice(this._head, this._tail);
-  }
-
-  var dest = new Array(size);
-
-  var k = 0;
-  var i;
-  if (fullCopy || this._head > this._tail) {
-    for (i = this._head; i < capacity; i++) dest[k++] = src[i];
-    for (i = 0; i < this._tail; i++) dest[k++] = src[i];
-  } else {
-    for (i = this._head; i < this._tail; i++) dest[k++] = src[i];
-  }
-
-  return dest;
-}
-
-/**
- * Grows the internal list array.
- * @private
- */
-Denque.prototype._growArray = function _growArray() {
-  if (this._head != 0) {
-    // double array size and copy existing data, head to end, then beginning to tail.
-    var newList = this._copyArray(true, this._list.length << 1);
-
-    this._tail = this._list.length;
-    this._head = 0;
-
-    this._list = newList;
-  } else {
-    this._tail = this._list.length;
-    this._list.length <<= 1;
-  }
-
-  this._capacityMask = (this._capacityMask << 1) | 1;
-};
-
-/**
- * Shrinks the internal list array.
- * @private
- */
-Denque.prototype._shrinkArray = function _shrinkArray() {
-  this._list.length >>>= 1;
-  this._capacityMask >>>= 1;
-};
-
-/**
- * Find the next power of 2, at least 4
- * @private
- * @param {number} num 
- * @returns {number}
- */
-Denque.prototype._nextPowerOf2 = function _nextPowerOf2(num) {
-  var log2 = Math.log(num) / Math.log(2);
-  var nextPow2 = 1 << (log2 + 1);
-
-  return Math.max(nextPow2, 4);
-}
-
-module.exports = Denque;
Index: uckSimulator-main/ds-db-ws/node_modules/denque/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/denque/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,58 +1,0 @@
-{
-  "name": "denque",
-  "version": "2.1.0",
-  "description": "The fastest javascript implementation of a double-ended queue. Used by the official Redis, MongoDB, MariaDB & MySQL libraries for Node.js and many other libraries. Maintains compatability with deque.",
-  "main": "index.js",
-  "engines": {
-    "node": ">=0.10"
-  },
-  "keywords": [
-    "data-structure",
-    "data-structures",
-    "queue",
-    "double",
-    "end",
-    "ended",
-    "deque",
-    "denque",
-    "double-ended-queue"
-  ],
-  "scripts": {
-    "test": "istanbul cover --report lcov _mocha && npm run typescript",
-    "coveralls": "cat ./coverage/lcov.info | coveralls",
-    "typescript": "tsc --project ./test/type/tsconfig.json",
-    "benchmark_thousand": "node benchmark/thousand",
-    "benchmark_2mil": "node benchmark/two_million",
-    "benchmark_splice": "node benchmark/splice",
-    "benchmark_remove": "node benchmark/remove",
-    "benchmark_removeOne": "node benchmark/removeOne",
-    "benchmark_growth": "node benchmark/growth",
-    "benchmark_toArray": "node benchmark/toArray",
-    "benchmark_fromArray": "node benchmark/fromArray"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/invertase/denque.git"
-  },
-  "license": "Apache-2.0",
-  "author": {
-    "name": "Invertase",
-    "email": "oss@invertase.io",
-    "url": "http://github.com/invertase/"
-  },
-  "contributors": [
-    "Mike Diarmid (Salakar) <mike@invertase.io>"
-  ],
-  "bugs": {
-    "url": "https://github.com/invertase/denque/issues"
-  },
-  "homepage": "https://docs.page/invertase/denque",
-  "devDependencies": {
-    "benchmark": "^2.1.4",
-    "codecov": "^3.8.3",
-    "double-ended-queue": "^2.1.0-0",
-    "istanbul": "^0.4.5",
-    "mocha": "^3.5.3",
-    "typescript": "^3.4.1"
-  }
-}
Index: uckSimulator-main/ds-db-ws/node_modules/generate-function/.travis.yml
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/generate-function/.travis.yml	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,3 +1,0 @@
-language: node_js
-node_js:
-  - "0.10"
Index: uckSimulator-main/ds-db-ws/node_modules/generate-function/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/generate-function/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Mathias Buus
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/generate-function/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/generate-function/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,89 +1,0 @@
-# generate-function
-
-Module that helps you write generated functions in Node
-
-```
-npm install generate-function
-```
-
-[![build status](http://img.shields.io/travis/mafintosh/generate-function.svg?style=flat)](http://travis-ci.org/mafintosh/generate-function)
-
-## Disclamer
-
-Writing code that generates code is hard.
-You should only use this if you really, really, really need this for performance reasons (like schema validators / parsers etc).
-
-## Usage
-
-``` js
-const genfun = require('generate-function')
-const { d } = genfun.formats
-
-function addNumber (val) {
-  const gen = genfun()
-
-  gen(`
-    function add (n) {')
-      return n + ${d(val)}) // supports format strings to insert values
-    }
-  `)
-
-  return gen.toFunction() // will compile the function
-}
-
-const add2 = addNumber(2)
-
-console.log('1 + 2 =', add2(1))
-console.log(add2.toString()) // prints the generated function
-```
-
-If you need to close over variables in your generated function pass them to `toFunction(scope)`
-
-``` js
-function multiply (a, b) {
-  return a * b
-}
-
-function addAndMultiplyNumber (val) {
-  const gen = genfun()
-  
-  gen(`
-    function (n) {
-      if (typeof n !== 'number') {
-        throw new Error('argument should be a number')
-      }
-      const result = multiply(${d(val)}, n + ${d(val)})
-      return result
-    }
-  `)
-
-  // use gen.toString() if you want to see the generated source
-
-  return gen.toFunction({multiply})
-}
-
-const addAndMultiply2 = addAndMultiplyNumber(2)
-
-console.log(addAndMultiply2.toString())
-console.log('(3 + 2) * 2 =', addAndMultiply2(3))
-```
-
-You can call `gen(src)` as many times as you want to append more source code to the function.
-
-## Variables
-
-If you need a unique safe identifier for the scope of the generated function call `str = gen.sym('friendlyName')`.
-These are safe to use for variable names etc.
-
-## Object properties
-
-If you need to access an object property use the `str = gen.property('objectName', 'propertyName')`.
-
-This returns `'objectName.propertyName'` if `propertyName` is safe to use as a variable. Otherwise
-it returns `objectName[propertyNameAsString]`.
-
-If you only pass `gen.property('propertyName')` it will only return the `propertyName` part safely
-
-## License
-
-MIT
Index: uckSimulator-main/ds-db-ws/node_modules/generate-function/example.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/generate-function/example.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,27 +1,0 @@
-const genfun = require('./')
-const { d } = genfun.formats
-
-function multiply (a, b) {
-  return a * b
-}
-
-function addAndMultiplyNumber (val) {
-  const fn = genfun(`
-    function (n) {
-      if (typeof n !== 'number') {
-        throw new Error('argument should be a number')
-      }
-      const result = multiply(${d(val)}, n + ${d(val)})
-      return result
-    }
-  `)
-
-  // use fn.toString() if you want to see the generated source
-
-  return fn.toFunction({multiply})
-}
-
-const addAndMultiply2 = addAndMultiplyNumber(2)
-
-console.log(addAndMultiply2.toString())
-console.log('(3 + 2) * 2 =', addAndMultiply2(3))
Index: uckSimulator-main/ds-db-ws/node_modules/generate-function/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/generate-function/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,181 +1,0 @@
-var util = require('util')
-var isProperty = require('is-property')
-
-var INDENT_START = /[\{\[]/
-var INDENT_END = /[\}\]]/
-
-// from https://mathiasbynens.be/notes/reserved-keywords
-var RESERVED = [
-  'do',
-  'if',
-  'in',
-  'for',
-  'let',
-  'new',
-  'try',
-  'var',
-  'case',
-  'else',
-  'enum',
-  'eval',
-  'null',
-  'this',
-  'true',
-  'void',
-  'with',
-  'await',
-  'break',
-  'catch',
-  'class',
-  'const',
-  'false',
-  'super',
-  'throw',
-  'while',
-  'yield',
-  'delete',
-  'export',
-  'import',
-  'public',
-  'return',
-  'static',
-  'switch',
-  'typeof',
-  'default',
-  'extends',
-  'finally',
-  'package',
-  'private',
-  'continue',
-  'debugger',
-  'function',
-  'arguments',
-  'interface',
-  'protected',
-  'implements',
-  'instanceof',
-  'NaN',
-  'undefined'
-]
-
-var RESERVED_MAP = {}
-
-for (var i = 0; i < RESERVED.length; i++) {
-  RESERVED_MAP[RESERVED[i]] = true
-}
-
-var isVariable = function (name) {
-  return isProperty(name) && !RESERVED_MAP.hasOwnProperty(name)
-}
-
-var formats = {
-  s: function(s) {
-    return '' + s
-  },
-  d: function(d) {
-    return '' + Number(d)
-  },
-  o: function(o) {
-    return JSON.stringify(o)
-  }
-}
-
-var genfun = function() {
-  var lines = []
-  var indent = 0
-  var vars = {}
-
-  var push = function(str) {
-    var spaces = ''
-    while (spaces.length < indent*2) spaces += '  '
-    lines.push(spaces+str)
-  }
-
-  var pushLine = function(line) {
-    if (INDENT_END.test(line.trim()[0]) && INDENT_START.test(line[line.length-1])) {
-      indent--
-      push(line)
-      indent++
-      return
-    }
-    if (INDENT_START.test(line[line.length-1])) {
-      push(line)
-      indent++
-      return
-    }
-    if (INDENT_END.test(line.trim()[0])) {
-      indent--
-      push(line)
-      return
-    }
-
-    push(line)
-  }
-
-  var line = function(fmt) {
-    if (!fmt) return line
-
-    if (arguments.length === 1 && fmt.indexOf('\n') > -1) {
-      var lines = fmt.trim().split('\n')
-      for (var i = 0; i < lines.length; i++) {
-        pushLine(lines[i].trim())
-      }
-    } else {
-      pushLine(util.format.apply(util, arguments))
-    }
-
-    return line
-  }
-
-  line.scope = {}
-  line.formats = formats
-
-  line.sym = function(name) {
-    if (!name || !isVariable(name)) name = 'tmp'
-    if (!vars[name]) vars[name] = 0
-    return name + (vars[name]++ || '')
-  }
-
-  line.property = function(obj, name) {
-    if (arguments.length === 1) {
-      name = obj
-      obj = ''
-    }
-
-    name = name + ''
-
-    if (isProperty(name)) return (obj ? obj + '.' + name : name)
-    return obj ? obj + '[' + JSON.stringify(name) + ']' : JSON.stringify(name)
-  }
-
-  line.toString = function() {
-    return lines.join('\n')
-  }
-
-  line.toFunction = function(scope) {
-    if (!scope) scope = {}
-
-    var src = 'return ('+line.toString()+')'
-
-    Object.keys(line.scope).forEach(function (key) {
-      if (!scope[key]) scope[key] = line.scope[key]
-    })
-
-    var keys = Object.keys(scope).map(function(key) {
-      return key
-    })
-
-    var vals = keys.map(function(key) {
-      return scope[key]
-    })
-
-    return Function.apply(null, keys.concat(src)).apply(null, vals)
-  }
-
-  if (arguments.length) line.apply(null, arguments)
-
-  return line
-}
-
-genfun.formats = formats
-module.exports = genfun
Index: uckSimulator-main/ds-db-ws/node_modules/generate-function/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/generate-function/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,32 +1,0 @@
-{
-  "name": "generate-function",
-  "version": "2.3.1",
-  "description": "Module that helps you write generated functions in Node",
-  "main": "index.js",
-  "scripts": {
-    "test": "tape test.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/mafintosh/generate-function"
-  },
-  "keywords": [
-    "generate",
-    "code",
-    "generation",
-    "function",
-    "performance"
-  ],
-  "author": "Mathias Buus",
-  "license": "MIT",
-  "bugs": {
-    "url": "https://github.com/mafintosh/generate-function/issues"
-  },
-  "homepage": "https://github.com/mafintosh/generate-function",
-  "devDependencies": {
-    "tape": "^4.9.1"
-  },
-  "dependencies": {
-    "is-property": "^1.0.2"
-  }
-}
Index: uckSimulator-main/ds-db-ws/node_modules/generate-function/test.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/generate-function/test.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,49 +1,0 @@
-var tape = require('tape')
-var genfun = require('./')
-
-tape('generate add function', function(t) {
-  var fn = genfun()
-    ('function add(n) {')
-      ('return n + %d', 42)
-    ('}')
-
-  t.same(fn.toString(), 'function add(n) {\n  return n + 42\n}', 'code is indented')
-  t.same(fn.toFunction()(10), 52, 'function works')
-  t.end()
-})
-
-tape('generate function + closed variables', function(t) {
-  var fn = genfun()
-    ('function add(n) {')
-      ('return n + %d + number', 42)
-    ('}')
-
-  var notGood = fn.toFunction()
-  var good = fn.toFunction({number:10})
-
-  try {
-    notGood(10)
-    t.ok(false, 'function should not work')
-  } catch (err) {
-    t.same(err.message, 'number is not defined', 'throws reference error')
-  }
-
-  t.same(good(11), 63, 'function with closed var works')
-  t.end()
-})
-
-tape('generate property', function(t) {
-  var gen = genfun()
-
-  t.same(gen.property('a'), 'a')
-  t.same(gen.property('42'), '"42"')
-  t.same(gen.property('b', 'a'), 'b.a')
-  t.same(gen.property('b', '42'), 'b["42"]')
-  t.same(gen.sym(42), 'tmp')
-  t.same(gen.sym('a'), 'a')
-  t.same(gen.sym('a'), 'a1')
-  t.same(gen.sym(42), 'tmp1')
-  t.same(gen.sym('const'), 'tmp2')
-
-  t.end()
-})
Index: uckSimulator-main/ds-db-ws/node_modules/is-property/.npmignore
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/is-property/.npmignore	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,17 +1,0 @@
-lib-cov
-*.seed
-*.log
-*.csv
-*.dat
-*.out
-*.pid
-*.gz
-
-pids
-logs
-results
-
-npm-debug.log
-node_modules/*
-*.DS_Store
-test/*
Index: uckSimulator-main/ds-db-ws/node_modules/is-property/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/is-property/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,22 +1,0 @@
-
-The MIT License (MIT)
-
-Copyright (c) 2013 Mikola Lysenko
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/is-property/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/is-property/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,28 +1,0 @@
-is-property
-===========
-Tests if a property of a JavaScript object can be accessed using the dot (.) notation or if it must be enclosed in brackets, (ie use x[" ... "])
-
-Example
--------
-
-```javascript
-var isProperty = require("is-property")
-
-console.log(isProperty("foo"))  //Prints true
-console.log(isProperty("0"))    //Prints false
-```
-
-Install
--------
-
-    npm install is-property
-    
-### `require("is-property")(str)`
-Checks if str is a property
-
-* `str` is a string which we will test if it is a property or not
-
-**Returns** true or false depending if str is a property
-
-## Credits
-(c) 2013 Mikola Lysenko. MIT License
Index: uckSimulator-main/ds-db-ws/node_modules/is-property/is-property.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/is-property/is-property.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,5 +1,0 @@
-"use strict"
-function isProperty(str) {
-  return /^[$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc][$A-Z\_a-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc0-9\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19b0-\u19c0\u19c8\u19c9\u19d0-\u19d9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2-\u1cf4\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8e0-\ua8f1\ua900-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f]*$/.test(str)
-}
-module.exports = isProperty
Index: uckSimulator-main/ds-db-ws/node_modules/is-property/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/is-property/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,36 +1,0 @@
-{
-  "name": "is-property",
-  "version": "1.0.2",
-  "description": "Tests if a JSON property can be accessed using . syntax",
-  "main": "is-property.js",
-  "directories": {
-    "test": "test"
-  },
-  "dependencies": {},
-  "devDependencies": {
-    "tape": "~1.0.4"
-  },
-  "scripts": {
-    "test": "tap test/*.js"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git://github.com/mikolalysenko/is-property.git"
-  },
-  "keywords": [
-    "is",
-    "property",
-    "json",
-    "dot",
-    "bracket",
-    ".",
-    "[]"
-  ],
-  "author": "Mikola Lysenko",
-  "license": "MIT",
-  "readmeFilename": "README.md",
-  "gitHead": "0a85ea5b6b1264ea1cdecc6e5cf186adbb3ffc50",
-  "bugs": {
-    "url": "https://github.com/mikolalysenko/is-property/issues"
-  }
-}
Index: uckSimulator-main/ds-db-ws/node_modules/long/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,202 +1,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
Index: uckSimulator-main/ds-db-ws/node_modules/long/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,286 +1,0 @@
-# long.js
-
-A Long class for representing a 64 bit two's-complement integer value derived from the [Closure Library](https://github.com/google/closure-library)
-for stand-alone use and extended with unsigned support.
-
-[![Build Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/long.js/test.yml?branch=main&label=test&logo=github)](https://github.com/dcodeIO/long.js/actions/workflows/test.yml) [![Publish Status](https://img.shields.io/github/actions/workflow/status/dcodeIO/long.js/publish.yml?branch=main&label=publish&logo=github)](https://github.com/dcodeIO/long.js/actions/workflows/publish.yml) [![npm](https://img.shields.io/npm/v/long.svg?label=npm&color=007acc&logo=npm)](https://www.npmjs.com/package/long)
-
-## Background
-
-As of [ECMA-262 5th Edition](http://ecma262-5.com/ELS5_HTML.htm#Section_8.5), "all the positive and negative integers
-whose magnitude is no greater than 2<sup>53</sup> are representable in the Number type", which is "representing the
-doubleprecision 64-bit format IEEE 754 values as specified in the IEEE Standard for Binary Floating-Point Arithmetic".
-The [maximum safe integer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER)
-in JavaScript is 2<sup>53</sup>-1.
-
-Example: 2<sup>64</sup>-1 is 1844674407370955**1615** but in JavaScript it evaluates to 1844674407370955**2000**.
-
-Furthermore, bitwise operators in JavaScript "deal only with integers in the range −2<sup>31</sup> through
-2<sup>31</sup>−1, inclusive, or in the range 0 through 2<sup>32</sup>−1, inclusive. These operators accept any value of
-the Number type but first convert each such value to one of 2<sup>32</sup> integer values."
-
-In some use cases, however, it is required to be able to reliably work with and perform bitwise operations on the full
-64 bits. This is where long.js comes into play.
-
-## Usage
-
-The package exports an ECMAScript module with an UMD fallback.
-
-```
-$> npm install long
-```
-
-```js
-import Long from "long";
-
-var value = new Long(0xFFFFFFFF, 0x7FFFFFFF);
-console.log(value.toString());
-...
-```
-
-Note that mixing ESM and CommonJS is not recommended as it yields different classes, albeit with the same functionality.
-
-### Usage with a CDN
-
-- From GitHub via [jsDelivr](https://www.jsdelivr.com):<br />
-  `https://cdn.jsdelivr.net/gh/dcodeIO/long.js@TAG/index.js` (ESM)
-- From npm via [jsDelivr](https://www.jsdelivr.com):<br />
-  `https://cdn.jsdelivr.net/npm/long@VERSION/index.js` (ESM)<br />
-  `https://cdn.jsdelivr.net/npm/long@VERSION/umd/index.js` (UMD)
-- From npm via [unpkg](https://unpkg.com):<br />
-  `https://unpkg.com/long@VERSION/index.js` (ESM)<br />
-  `https://unpkg.com/long@VERSION/umd/index.js` (UMD)
-
-Replace `TAG` respectively `VERSION` with a [specific version](https://github.com/dcodeIO/long.js/releases) or omit it (not recommended in production) to use main/latest.
-
-## API
-
-### Constructor
-
-- new **Long**(low: `number`, high?: `number`, unsigned?: `boolean`)<br />
-  Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as _signed_ integers. See the from\* functions below for more convenient ways of constructing Longs.
-
-### Fields
-
-- Long#**low**: `number`<br />
-  The low 32 bits as a signed value.
-
-- Long#**high**: `number`<br />
-  The high 32 bits as a signed value.
-
-- Long#**unsigned**: `boolean`<br />
-  Whether unsigned or not.
-
-### Constants
-
-- Long.**ZERO**: `Long`<br />
-  Signed zero.
-
-- Long.**ONE**: `Long`<br />
-  Signed one.
-
-- Long.**NEG_ONE**: `Long`<br />
-  Signed negative one.
-
-- Long.**UZERO**: `Long`<br />
-  Unsigned zero.
-
-- Long.**UONE**: `Long`<br />
-  Unsigned one.
-
-- Long.**MAX_VALUE**: `Long`<br />
-  Maximum signed value.
-
-- Long.**MIN_VALUE**: `Long`<br />
-  Minimum signed value.
-
-- Long.**MAX_UNSIGNED_VALUE**: `Long`<br />
-  Maximum unsigned value.
-
-### Utility
-
-- type **LongLike**: `Long | number | bigint | string`<br />
-  Any value or object that either is or can be converted to a Long.
-
-- Long.**isLong**(obj: `any`): `boolean`<br />
-  Tests if the specified object is a Long.
-
-- Long.**fromBits**(lowBits: `number`, highBits: `number`, unsigned?: `boolean`): `Long`<br />
-  Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is assumed to use 32 bits.
-
-- Long.**fromBytes**(bytes: `number[]`, unsigned?: `boolean`, le?: `boolean`): `Long`<br />
-  Creates a Long from its byte representation.
-
-- Long.**fromBytesLE**(bytes: `number[]`, unsigned?: `boolean`): `Long`<br />
-  Creates a Long from its little endian byte representation.
-
-- Long.**fromBytesBE**(bytes: `number[]`, unsigned?: `boolean`): `Long`<br />
-  Creates a Long from its big endian byte representation.
-
-- Long.**fromInt**(value: `number`, unsigned?: `boolean`): `Long`<br />
-  Returns a Long representing the given 32 bit integer value.
-
-- Long.**fromNumber**(value: `number`, unsigned?: `boolean`): `Long`<br />
-  Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
-
-- Long.**fromBigInt**(value: `bigint`, unsigned?: `boolean`): `Long`<br />
-  Returns a Long representing the given big integer.
-
-- Long.**fromString**(str: `string`, unsigned?: `boolean`, radix?: `number`)<br />
-  Long.**fromString**(str: `string`, radix: `number`)<br />
-  Returns a Long representation of the given string, written using the specified radix.
-
-- Long.**fromValue**(val: `LongLike`, unsigned?: `boolean`): `Long`<br />
-  Converts the specified value to a Long using the appropriate from\* function for its type.
-
-### Methods
-
-- Long#**add**(addend: `LongLike`): `Long`<br />
-  Returns the sum of this and the specified Long.
-
-- Long#**and**(other: `LongLike`): `Long`<br />
-  Returns the bitwise AND of this Long and the specified.
-
-- Long#**compare**/**comp**(other: `LongLike`): `number`<br />
-  Compares this Long's value with the specified's. Returns `0` if they are the same, `1` if the this is greater and `-1` if the given one is greater.
-
-- Long#**divide**/**div**(divisor: `LongLike`): `Long`<br />
-  Returns this Long divided by the specified.
-
-- Long#**equals**/**eq**(other: `LongLike`): `boolean`<br />
-  Tests if this Long's value equals the specified's.
-
-- Long#**getHighBits**(): `number`<br />
-  Gets the high 32 bits as a signed integer.
-
-- Long#**getHighBitsUnsigned**(): `number`<br />
-  Gets the high 32 bits as an unsigned integer.
-
-- Long#**getLowBits**(): `number`<br />
-  Gets the low 32 bits as a signed integer.
-
-- Long#**getLowBitsUnsigned**(): `number`<br />
-  Gets the low 32 bits as an unsigned integer.
-
-- Long#**getNumBitsAbs**(): `number`<br />
-  Gets the number of bits needed to represent the absolute value of this Long.
-
-- Long#**greaterThan**/**gt**(other: `LongLike`): `boolean`<br />
-  Tests if this Long's value is greater than the specified's.
-
-- Long#**greaterThanOrEqual**/**gte**/**ge**(other: `LongLike`): `boolean`<br />
-  Tests if this Long's value is greater than or equal the specified's.
-
-- Long#**isEven**(): `boolean`<br />
-  Tests if this Long's value is even.
-
-- Long#**isNegative**(): `boolean`<br />
-  Tests if this Long's value is negative.
-
-- Long#**isOdd**(): `boolean`<br />
-  Tests if this Long's value is odd.
-
-- Long#**isPositive**(): `boolean`<br />
-  Tests if this Long's value is positive or zero.
-
-- Long#**isSafeInteger**(): `boolean`<br />
-  Tests if this Long can be safely represented as a JavaScript number.
-
-- Long#**isZero**/**eqz**(): `boolean`<br />
-  Tests if this Long's value equals zero.
-
-- Long#**lessThan**/**lt**(other: `LongLike`): `boolean`<br />
-  Tests if this Long's value is less than the specified's.
-
-- Long#**lessThanOrEqual**/**lte**/**le**(other: `LongLike`): `boolean`<br />
-  Tests if this Long's value is less than or equal the specified's.
-
-- Long#**modulo**/**mod**/**rem**(divisor: `LongLike`): `Long`<br />
-  Returns this Long modulo the specified.
-
-- Long#**multiply**/**mul**(multiplier: `LongLike`): `Long`<br />
-  Returns the product of this and the specified Long.
-
-- Long#**negate**/**neg**(): `Long`<br />
-  Negates this Long's value.
-
-- Long#**not**(): `Long`<br />
-  Returns the bitwise NOT of this Long.
-
-- Long#**countLeadingZeros**/**clz**(): `number`<br />
-  Returns count leading zeros of this Long.
-
-- Long#**countTrailingZeros**/**ctz**(): `number`<br />
-  Returns count trailing zeros of this Long.
-
-- Long#**notEquals**/**neq**/**ne**(other: `LongLike`): `boolean`<br />
-  Tests if this Long's value differs from the specified's.
-
-- Long#**or**(other: `LongLike`): `Long`<br />
-  Returns the bitwise OR of this Long and the specified.
-
-- Long#**shiftLeft**/**shl**(numBits: `Long | number`): `Long`<br />
-  Returns this Long with bits shifted to the left by the given amount.
-
-- Long#**shiftRight**/**shr**(numBits: `Long | number`): `Long`<br />
-  Returns this Long with bits arithmetically shifted to the right by the given amount.
-
-- Long#**shiftRightUnsigned**/**shru**/**shr_u**(numBits: `Long | number`): `Long`<br />
-  Returns this Long with bits logically shifted to the right by the given amount.
-
-- Long#**rotateLeft**/**rotl**(numBits: `Long | number`): `Long`<br />
-  Returns this Long with bits rotated to the left by the given amount.
-
-- Long#**rotateRight**/**rotr**(numBits: `Long | number`): `Long`<br />
-  Returns this Long with bits rotated to the right by the given amount.
-
-- Long#**subtract**/**sub**(subtrahend: `LongLike`): `Long`<br />
-  Returns the difference of this and the specified Long.
-
-- Long#**toBytes**(le?: `boolean`): `number[]`<br />
-  Converts this Long to its byte representation.
-
-- Long#**toBytesLE**(): `number[]`<br />
-  Converts this Long to its little endian byte representation.
-
-- Long#**toBytesBE**(): `number[]`<br />
-  Converts this Long to its big endian byte representation.
-
-- Long#**toInt**(): `number`<br />
-  Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.
-
-- Long#**toNumber**(): `number`<br />
-  Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).
-
-- Long#**toBigInt**(): `bigint`<br />
-  Converts the Long to its big integer representation.
-
-- Long#**toSigned**(): `Long`<br />
-  Converts this Long to signed.
-
-- Long#**toString**(radix?: `number`): `string`<br />
-  Converts the Long to a string written in the specified radix.
-
-- Long#**toUnsigned**(): `Long`<br />
-  Converts this Long to unsigned.
-
-- Long#**xor**(other: `Long | number | string`): `Long`<br />
-  Returns the bitwise XOR of this Long and the given one.
-
-## WebAssembly support
-
-[WebAssembly](http://webassembly.org) supports 64-bit integer arithmetic out of the box, hence a [tiny WebAssembly module](./wasm.wat) is used to compute operations like multiplication, division and remainder more efficiently (slow operations like division are around twice as fast), falling back to floating point based computations in JavaScript where WebAssembly is not yet supported, e.g., in older versions of node.
-
-## Building
-
-Building the UMD fallback:
-
-```
-$> npm run build
-```
-
-Running the [tests](./tests):
-
-```
-$> npm test
-```
Index: uckSimulator-main/ds-db-ws/node_modules/long/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,2 +1,0 @@
-import { Long } from "./types.js";
-export default Long;
Index: uckSimulator-main/ds-db-ws/node_modules/long/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1581 +1,0 @@
-/**
- * @license
- * Copyright 2009 The Closure Library Authors
- * Copyright 2020 Daniel Wirtz / The long.js Authors.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * SPDX-License-Identifier: Apache-2.0
- */
-
-// WebAssembly optimizations to do native i64 multiplication and divide
-var wasm = null;
-try {
-  wasm = new WebAssembly.Instance(
-    new WebAssembly.Module(
-      new Uint8Array([
-        // \0asm
-        0, 97, 115, 109,
-        // version 1
-        1, 0, 0, 0,
-
-        // section "type"
-        1, 13, 2,
-        // 0, () => i32
-        96, 0, 1, 127,
-        // 1, (i32, i32, i32, i32) => i32
-        96, 4, 127, 127, 127, 127, 1, 127,
-
-        // section "function"
-        3, 7, 6,
-        // 0, type 0
-        0,
-        // 1, type 1
-        1,
-        // 2, type 1
-        1,
-        // 3, type 1
-        1,
-        // 4, type 1
-        1,
-        // 5, type 1
-        1,
-
-        // section "global"
-        6, 6, 1,
-        // 0, "high", mutable i32
-        127, 1, 65, 0, 11,
-
-        // section "export"
-        7, 50, 6,
-        // 0, "mul"
-        3, 109, 117, 108, 0, 1,
-        // 1, "div_s"
-        5, 100, 105, 118, 95, 115, 0, 2,
-        // 2, "div_u"
-        5, 100, 105, 118, 95, 117, 0, 3,
-        // 3, "rem_s"
-        5, 114, 101, 109, 95, 115, 0, 4,
-        // 4, "rem_u"
-        5, 114, 101, 109, 95, 117, 0, 5,
-        // 5, "get_high"
-        8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0,
-
-        // section "code"
-        10, 191, 1, 6,
-        // 0, "get_high"
-        4, 0, 35, 0, 11,
-        // 1, "mul"
-        36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32,
-        3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4,
-        167, 11,
-        // 2, "div_s"
-        36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32,
-        3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4,
-        167, 11,
-        // 3, "div_u"
-        36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32,
-        3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4,
-        167, 11,
-        // 4, "rem_s"
-        36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32,
-        3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4,
-        167, 11,
-        // 5, "rem_u"
-        36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32,
-        3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4,
-        167, 11,
-      ]),
-    ),
-    {},
-  ).exports;
-} catch {
-  // no wasm support :(
-}
-
-/**
- * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.
- *  See the from* functions below for more convenient ways of constructing Longs.
- * @exports Long
- * @class A Long class for representing a 64 bit two's-complement integer value.
- * @param {number} low The low (signed) 32 bits of the long
- * @param {number} high The high (signed) 32 bits of the long
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @constructor
- */
-function Long(low, high, unsigned) {
-  /**
-   * The low 32 bits as a signed value.
-   * @type {number}
-   */
-  this.low = low | 0;
-
-  /**
-   * The high 32 bits as a signed value.
-   * @type {number}
-   */
-  this.high = high | 0;
-
-  /**
-   * Whether unsigned or not.
-   * @type {boolean}
-   */
-  this.unsigned = !!unsigned;
-}
-
-// The internal representation of a long is the two given signed, 32-bit values.
-// We use 32-bit pieces because these are the size of integers on which
-// Javascript performs bit-operations.  For operations like addition and
-// multiplication, we split each number into 16 bit pieces, which can easily be
-// multiplied within Javascript's floating-point representation without overflow
-// or change in sign.
-//
-// In the algorithms below, we frequently reduce the negative case to the
-// positive case by negating the input(s) and then post-processing the result.
-// Note that we must ALWAYS check specially whether those values are MIN_VALUE
-// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
-// a positive number, it overflows back into a negative).  Not handling this
-// case would often result in infinite recursion.
-//
-// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*
-// methods on which they depend.
-
-/**
- * An indicator used to reliably determine if an object is a Long or not.
- * @type {boolean}
- * @const
- * @private
- */
-Long.prototype.__isLong__;
-
-Object.defineProperty(Long.prototype, "__isLong__", { value: true });
-
-/**
- * @function
- * @param {*} obj Object
- * @returns {boolean}
- * @inner
- */
-function isLong(obj) {
-  return (obj && obj["__isLong__"]) === true;
-}
-
-/**
- * @function
- * @param {*} value number
- * @returns {number}
- * @inner
- */
-function ctz32(value) {
-  var c = Math.clz32(value & -value);
-  return value ? 31 - c : c;
-}
-
-/**
- * Tests if the specified object is a Long.
- * @function
- * @param {*} obj Object
- * @returns {boolean}
- */
-Long.isLong = isLong;
-
-/**
- * A cache of the Long representations of small integer values.
- * @type {!Object}
- * @inner
- */
-var INT_CACHE = {};
-
-/**
- * A cache of the Long representations of small unsigned integer values.
- * @type {!Object}
- * @inner
- */
-var UINT_CACHE = {};
-
-/**
- * @param {number} value
- * @param {boolean=} unsigned
- * @returns {!Long}
- * @inner
- */
-function fromInt(value, unsigned) {
-  var obj, cachedObj, cache;
-  if (unsigned) {
-    value >>>= 0;
-    if ((cache = 0 <= value && value < 256)) {
-      cachedObj = UINT_CACHE[value];
-      if (cachedObj) return cachedObj;
-    }
-    obj = fromBits(value, 0, true);
-    if (cache) UINT_CACHE[value] = obj;
-    return obj;
-  } else {
-    value |= 0;
-    if ((cache = -128 <= value && value < 128)) {
-      cachedObj = INT_CACHE[value];
-      if (cachedObj) return cachedObj;
-    }
-    obj = fromBits(value, value < 0 ? -1 : 0, false);
-    if (cache) INT_CACHE[value] = obj;
-    return obj;
-  }
-}
-
-/**
- * Returns a Long representing the given 32 bit integer value.
- * @function
- * @param {number} value The 32 bit integer in question
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @returns {!Long} The corresponding Long value
- */
-Long.fromInt = fromInt;
-
-/**
- * @param {number} value
- * @param {boolean=} unsigned
- * @returns {!Long}
- * @inner
- */
-function fromNumber(value, unsigned) {
-  if (isNaN(value)) return unsigned ? UZERO : ZERO;
-  if (unsigned) {
-    if (value < 0) return UZERO;
-    if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;
-  } else {
-    if (value <= -TWO_PWR_63_DBL) return MIN_VALUE;
-    if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE;
-  }
-  if (value < 0) return fromNumber(-value, unsigned).neg();
-  return fromBits(
-    value % TWO_PWR_32_DBL | 0,
-    (value / TWO_PWR_32_DBL) | 0,
-    unsigned,
-  );
-}
-
-/**
- * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
- * @function
- * @param {number} value The number in question
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @returns {!Long} The corresponding Long value
- */
-Long.fromNumber = fromNumber;
-
-/**
- * @param {number} lowBits
- * @param {number} highBits
- * @param {boolean=} unsigned
- * @returns {!Long}
- * @inner
- */
-function fromBits(lowBits, highBits, unsigned) {
-  return new Long(lowBits, highBits, unsigned);
-}
-
-/**
- * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is
- *  assumed to use 32 bits.
- * @function
- * @param {number} lowBits The low 32 bits
- * @param {number} highBits The high 32 bits
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @returns {!Long} The corresponding Long value
- */
-Long.fromBits = fromBits;
-
-/**
- * @function
- * @param {number} base
- * @param {number} exponent
- * @returns {number}
- * @inner
- */
-var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)
-
-/**
- * @param {string} str
- * @param {(boolean|number)=} unsigned
- * @param {number=} radix
- * @returns {!Long}
- * @inner
- */
-function fromString(str, unsigned, radix) {
-  if (str.length === 0) throw Error("empty string");
-  if (typeof unsigned === "number") {
-    // For goog.math.long compatibility
-    radix = unsigned;
-    unsigned = false;
-  } else {
-    unsigned = !!unsigned;
-  }
-  if (
-    str === "NaN" ||
-    str === "Infinity" ||
-    str === "+Infinity" ||
-    str === "-Infinity"
-  )
-    return unsigned ? UZERO : ZERO;
-  radix = radix || 10;
-  if (radix < 2 || 36 < radix) throw RangeError("radix");
-
-  var p;
-  if ((p = str.indexOf("-")) > 0) throw Error("interior hyphen");
-  else if (p === 0) {
-    return fromString(str.substring(1), unsigned, radix).neg();
-  }
-
-  // Do several (8) digits each time through the loop, so as to
-  // minimize the calls to the very expensive emulated div.
-  var radixToPower = fromNumber(pow_dbl(radix, 8));
-
-  var result = ZERO;
-  for (var i = 0; i < str.length; i += 8) {
-    var size = Math.min(8, str.length - i),
-      value = parseInt(str.substring(i, i + size), radix);
-    if (size < 8) {
-      var power = fromNumber(pow_dbl(radix, size));
-      result = result.mul(power).add(fromNumber(value));
-    } else {
-      result = result.mul(radixToPower);
-      result = result.add(fromNumber(value));
-    }
-  }
-  result.unsigned = unsigned;
-  return result;
-}
-
-/**
- * Returns a Long representation of the given string, written using the specified radix.
- * @function
- * @param {string} str The textual representation of the Long
- * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed
- * @param {number=} radix The radix in which the text is written (2-36), defaults to 10
- * @returns {!Long} The corresponding Long value
- */
-Long.fromString = fromString;
-
-/**
- * @function
- * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val
- * @param {boolean=} unsigned
- * @returns {!Long}
- * @inner
- */
-function fromValue(val, unsigned) {
-  if (typeof val === "number") return fromNumber(val, unsigned);
-  if (typeof val === "string") return fromString(val, unsigned);
-  // Throws for non-objects, converts non-instanceof Long:
-  return fromBits(
-    val.low,
-    val.high,
-    typeof unsigned === "boolean" ? unsigned : val.unsigned,
-  );
-}
-
-/**
- * Converts the specified value to a Long using the appropriate from* function for its type.
- * @function
- * @param {!Long|number|bigint|string|!{low: number, high: number, unsigned: boolean}} val Value
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @returns {!Long}
- */
-Long.fromValue = fromValue;
-
-// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be
-// no runtime penalty for these.
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var TWO_PWR_16_DBL = 1 << 16;
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var TWO_PWR_24_DBL = 1 << 24;
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;
-
-/**
- * @type {number}
- * @const
- * @inner
- */
-var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;
-
-/**
- * @type {!Long}
- * @const
- * @inner
- */
-var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);
-
-/**
- * @type {!Long}
- * @inner
- */
-var ZERO = fromInt(0);
-
-/**
- * Signed zero.
- * @type {!Long}
- */
-Long.ZERO = ZERO;
-
-/**
- * @type {!Long}
- * @inner
- */
-var UZERO = fromInt(0, true);
-
-/**
- * Unsigned zero.
- * @type {!Long}
- */
-Long.UZERO = UZERO;
-
-/**
- * @type {!Long}
- * @inner
- */
-var ONE = fromInt(1);
-
-/**
- * Signed one.
- * @type {!Long}
- */
-Long.ONE = ONE;
-
-/**
- * @type {!Long}
- * @inner
- */
-var UONE = fromInt(1, true);
-
-/**
- * Unsigned one.
- * @type {!Long}
- */
-Long.UONE = UONE;
-
-/**
- * @type {!Long}
- * @inner
- */
-var NEG_ONE = fromInt(-1);
-
-/**
- * Signed negative one.
- * @type {!Long}
- */
-Long.NEG_ONE = NEG_ONE;
-
-/**
- * @type {!Long}
- * @inner
- */
-var MAX_VALUE = fromBits(0xffffffff | 0, 0x7fffffff | 0, false);
-
-/**
- * Maximum signed value.
- * @type {!Long}
- */
-Long.MAX_VALUE = MAX_VALUE;
-
-/**
- * @type {!Long}
- * @inner
- */
-var MAX_UNSIGNED_VALUE = fromBits(0xffffffff | 0, 0xffffffff | 0, true);
-
-/**
- * Maximum unsigned value.
- * @type {!Long}
- */
-Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;
-
-/**
- * @type {!Long}
- * @inner
- */
-var MIN_VALUE = fromBits(0, 0x80000000 | 0, false);
-
-/**
- * Minimum signed value.
- * @type {!Long}
- */
-Long.MIN_VALUE = MIN_VALUE;
-
-/**
- * @alias Long.prototype
- * @inner
- */
-var LongPrototype = Long.prototype;
-
-/**
- * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.
- * @this {!Long}
- * @returns {number}
- */
-LongPrototype.toInt = function toInt() {
-  return this.unsigned ? this.low >>> 0 : this.low;
-};
-
-/**
- * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).
- * @this {!Long}
- * @returns {number}
- */
-LongPrototype.toNumber = function toNumber() {
-  if (this.unsigned)
-    return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0);
-  return this.high * TWO_PWR_32_DBL + (this.low >>> 0);
-};
-
-/**
- * Converts the Long to a string written in the specified radix.
- * @this {!Long}
- * @param {number=} radix Radix (2-36), defaults to 10
- * @returns {string}
- * @override
- * @throws {RangeError} If `radix` is out of range
- */
-LongPrototype.toString = function toString(radix) {
-  radix = radix || 10;
-  if (radix < 2 || 36 < radix) throw RangeError("radix");
-  if (this.isZero()) return "0";
-  if (this.isNegative()) {
-    // Unsigned Longs are never negative
-    if (this.eq(MIN_VALUE)) {
-      // We need to change the Long value before it can be negated, so we remove
-      // the bottom-most digit in this base and then recurse to do the rest.
-      var radixLong = fromNumber(radix),
-        div = this.div(radixLong),
-        rem1 = div.mul(radixLong).sub(this);
-      return div.toString(radix) + rem1.toInt().toString(radix);
-    } else return "-" + this.neg().toString(radix);
-  }
-
-  // Do several (6) digits each time through the loop, so as to
-  // minimize the calls to the very expensive emulated div.
-  var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),
-    rem = this;
-  var result = "";
-  while (true) {
-    var remDiv = rem.div(radixToPower),
-      intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,
-      digits = intval.toString(radix);
-    rem = remDiv;
-    if (rem.isZero()) return digits + result;
-    else {
-      while (digits.length < 6) digits = "0" + digits;
-      result = "" + digits + result;
-    }
-  }
-};
-
-/**
- * Gets the high 32 bits as a signed integer.
- * @this {!Long}
- * @returns {number} Signed high bits
- */
-LongPrototype.getHighBits = function getHighBits() {
-  return this.high;
-};
-
-/**
- * Gets the high 32 bits as an unsigned integer.
- * @this {!Long}
- * @returns {number} Unsigned high bits
- */
-LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {
-  return this.high >>> 0;
-};
-
-/**
- * Gets the low 32 bits as a signed integer.
- * @this {!Long}
- * @returns {number} Signed low bits
- */
-LongPrototype.getLowBits = function getLowBits() {
-  return this.low;
-};
-
-/**
- * Gets the low 32 bits as an unsigned integer.
- * @this {!Long}
- * @returns {number} Unsigned low bits
- */
-LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {
-  return this.low >>> 0;
-};
-
-/**
- * Gets the number of bits needed to represent the absolute value of this Long.
- * @this {!Long}
- * @returns {number}
- */
-LongPrototype.getNumBitsAbs = function getNumBitsAbs() {
-  if (this.isNegative())
-    // Unsigned Longs are never negative
-    return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
-  var val = this.high != 0 ? this.high : this.low;
-  for (var bit = 31; bit > 0; bit--) if ((val & (1 << bit)) != 0) break;
-  return this.high != 0 ? bit + 33 : bit + 1;
-};
-
-/**
- * Tests if this Long can be safely represented as a JavaScript number.
- * @this {!Long}
- * @returns {boolean}
- */
-LongPrototype.isSafeInteger = function isSafeInteger() {
-  // 2^53-1 is the maximum safe value
-  var top11Bits = this.high >> 21;
-  // [0, 2^53-1]
-  if (!top11Bits) return true;
-  // > 2^53-1
-  if (this.unsigned) return false;
-  // [-2^53, -1] except -2^53
-  return top11Bits === -1 && !(this.low === 0 && this.high === -0x200000);
-};
-
-/**
- * Tests if this Long's value equals zero.
- * @this {!Long}
- * @returns {boolean}
- */
-LongPrototype.isZero = function isZero() {
-  return this.high === 0 && this.low === 0;
-};
-
-/**
- * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.
- * @returns {boolean}
- */
-LongPrototype.eqz = LongPrototype.isZero;
-
-/**
- * Tests if this Long's value is negative.
- * @this {!Long}
- * @returns {boolean}
- */
-LongPrototype.isNegative = function isNegative() {
-  return !this.unsigned && this.high < 0;
-};
-
-/**
- * Tests if this Long's value is positive or zero.
- * @this {!Long}
- * @returns {boolean}
- */
-LongPrototype.isPositive = function isPositive() {
-  return this.unsigned || this.high >= 0;
-};
-
-/**
- * Tests if this Long's value is odd.
- * @this {!Long}
- * @returns {boolean}
- */
-LongPrototype.isOdd = function isOdd() {
-  return (this.low & 1) === 1;
-};
-
-/**
- * Tests if this Long's value is even.
- * @this {!Long}
- * @returns {boolean}
- */
-LongPrototype.isEven = function isEven() {
-  return (this.low & 1) === 0;
-};
-
-/**
- * Tests if this Long's value equals the specified's.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.equals = function equals(other) {
-  if (!isLong(other)) other = fromValue(other);
-  if (
-    this.unsigned !== other.unsigned &&
-    this.high >>> 31 === 1 &&
-    other.high >>> 31 === 1
-  )
-    return false;
-  return this.high === other.high && this.low === other.low;
-};
-
-/**
- * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.eq = LongPrototype.equals;
-
-/**
- * Tests if this Long's value differs from the specified's.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.notEquals = function notEquals(other) {
-  return !this.eq(/* validates */ other);
-};
-
-/**
- * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.neq = LongPrototype.notEquals;
-
-/**
- * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.ne = LongPrototype.notEquals;
-
-/**
- * Tests if this Long's value is less than the specified's.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.lessThan = function lessThan(other) {
-  return this.comp(/* validates */ other) < 0;
-};
-
-/**
- * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.lt = LongPrototype.lessThan;
-
-/**
- * Tests if this Long's value is less than or equal the specified's.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {
-  return this.comp(/* validates */ other) <= 0;
-};
-
-/**
- * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.lte = LongPrototype.lessThanOrEqual;
-
-/**
- * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.le = LongPrototype.lessThanOrEqual;
-
-/**
- * Tests if this Long's value is greater than the specified's.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.greaterThan = function greaterThan(other) {
-  return this.comp(/* validates */ other) > 0;
-};
-
-/**
- * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.gt = LongPrototype.greaterThan;
-
-/**
- * Tests if this Long's value is greater than or equal the specified's.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {
-  return this.comp(/* validates */ other) >= 0;
-};
-
-/**
- * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.gte = LongPrototype.greaterThanOrEqual;
-
-/**
- * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {boolean}
- */
-LongPrototype.ge = LongPrototype.greaterThanOrEqual;
-
-/**
- * Compares this Long's value with the specified's.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other value
- * @returns {number} 0 if they are the same, 1 if the this is greater and -1
- *  if the given one is greater
- */
-LongPrototype.compare = function compare(other) {
-  if (!isLong(other)) other = fromValue(other);
-  if (this.eq(other)) return 0;
-  var thisNeg = this.isNegative(),
-    otherNeg = other.isNegative();
-  if (thisNeg && !otherNeg) return -1;
-  if (!thisNeg && otherNeg) return 1;
-  // At this point the sign bits are the same
-  if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1;
-  // Both are positive if at least one is unsigned
-  return other.high >>> 0 > this.high >>> 0 ||
-    (other.high === this.high && other.low >>> 0 > this.low >>> 0)
-    ? -1
-    : 1;
-};
-
-/**
- * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.
- * @function
- * @param {!Long|number|bigint|string} other Other value
- * @returns {number} 0 if they are the same, 1 if the this is greater and -1
- *  if the given one is greater
- */
-LongPrototype.comp = LongPrototype.compare;
-
-/**
- * Negates this Long's value.
- * @this {!Long}
- * @returns {!Long} Negated Long
- */
-LongPrototype.negate = function negate() {
-  if (!this.unsigned && this.eq(MIN_VALUE)) return MIN_VALUE;
-  return this.not().add(ONE);
-};
-
-/**
- * Negates this Long's value. This is an alias of {@link Long#negate}.
- * @function
- * @returns {!Long} Negated Long
- */
-LongPrototype.neg = LongPrototype.negate;
-
-/**
- * Returns the sum of this and the specified Long.
- * @this {!Long}
- * @param {!Long|number|bigint|string} addend Addend
- * @returns {!Long} Sum
- */
-LongPrototype.add = function add(addend) {
-  if (!isLong(addend)) addend = fromValue(addend);
-
-  // Divide each number into 4 chunks of 16 bits, and then sum the chunks.
-
-  var a48 = this.high >>> 16;
-  var a32 = this.high & 0xffff;
-  var a16 = this.low >>> 16;
-  var a00 = this.low & 0xffff;
-
-  var b48 = addend.high >>> 16;
-  var b32 = addend.high & 0xffff;
-  var b16 = addend.low >>> 16;
-  var b00 = addend.low & 0xffff;
-
-  var c48 = 0,
-    c32 = 0,
-    c16 = 0,
-    c00 = 0;
-  c00 += a00 + b00;
-  c16 += c00 >>> 16;
-  c00 &= 0xffff;
-  c16 += a16 + b16;
-  c32 += c16 >>> 16;
-  c16 &= 0xffff;
-  c32 += a32 + b32;
-  c48 += c32 >>> 16;
-  c32 &= 0xffff;
-  c48 += a48 + b48;
-  c48 &= 0xffff;
-  return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
-};
-
-/**
- * Returns the difference of this and the specified Long.
- * @this {!Long}
- * @param {!Long|number|bigint|string} subtrahend Subtrahend
- * @returns {!Long} Difference
- */
-LongPrototype.subtract = function subtract(subtrahend) {
-  if (!isLong(subtrahend)) subtrahend = fromValue(subtrahend);
-  return this.add(subtrahend.neg());
-};
-
-/**
- * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.
- * @function
- * @param {!Long|number|bigint|string} subtrahend Subtrahend
- * @returns {!Long} Difference
- */
-LongPrototype.sub = LongPrototype.subtract;
-
-/**
- * Returns the product of this and the specified Long.
- * @this {!Long}
- * @param {!Long|number|bigint|string} multiplier Multiplier
- * @returns {!Long} Product
- */
-LongPrototype.multiply = function multiply(multiplier) {
-  if (this.isZero()) return this;
-  if (!isLong(multiplier)) multiplier = fromValue(multiplier);
-
-  // use wasm support if present
-  if (wasm) {
-    var low = wasm["mul"](this.low, this.high, multiplier.low, multiplier.high);
-    return fromBits(low, wasm["get_high"](), this.unsigned);
-  }
-
-  if (multiplier.isZero()) return this.unsigned ? UZERO : ZERO;
-  if (this.eq(MIN_VALUE)) return multiplier.isOdd() ? MIN_VALUE : ZERO;
-  if (multiplier.eq(MIN_VALUE)) return this.isOdd() ? MIN_VALUE : ZERO;
-
-  if (this.isNegative()) {
-    if (multiplier.isNegative()) return this.neg().mul(multiplier.neg());
-    else return this.neg().mul(multiplier).neg();
-  } else if (multiplier.isNegative()) return this.mul(multiplier.neg()).neg();
-
-  // If both longs are small, use float multiplication
-  if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))
-    return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);
-
-  // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
-  // We can skip products that would overflow.
-
-  var a48 = this.high >>> 16;
-  var a32 = this.high & 0xffff;
-  var a16 = this.low >>> 16;
-  var a00 = this.low & 0xffff;
-
-  var b48 = multiplier.high >>> 16;
-  var b32 = multiplier.high & 0xffff;
-  var b16 = multiplier.low >>> 16;
-  var b00 = multiplier.low & 0xffff;
-
-  var c48 = 0,
-    c32 = 0,
-    c16 = 0,
-    c00 = 0;
-  c00 += a00 * b00;
-  c16 += c00 >>> 16;
-  c00 &= 0xffff;
-  c16 += a16 * b00;
-  c32 += c16 >>> 16;
-  c16 &= 0xffff;
-  c16 += a00 * b16;
-  c32 += c16 >>> 16;
-  c16 &= 0xffff;
-  c32 += a32 * b00;
-  c48 += c32 >>> 16;
-  c32 &= 0xffff;
-  c32 += a16 * b16;
-  c48 += c32 >>> 16;
-  c32 &= 0xffff;
-  c32 += a00 * b32;
-  c48 += c32 >>> 16;
-  c32 &= 0xffff;
-  c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
-  c48 &= 0xffff;
-  return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
-};
-
-/**
- * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.
- * @function
- * @param {!Long|number|bigint|string} multiplier Multiplier
- * @returns {!Long} Product
- */
-LongPrototype.mul = LongPrototype.multiply;
-
-/**
- * Returns this Long divided by the specified. The result is signed if this Long is signed or
- *  unsigned if this Long is unsigned.
- * @this {!Long}
- * @param {!Long|number|bigint|string} divisor Divisor
- * @returns {!Long} Quotient
- */
-LongPrototype.divide = function divide(divisor) {
-  if (!isLong(divisor)) divisor = fromValue(divisor);
-  if (divisor.isZero()) throw Error("division by zero");
-
-  // use wasm support if present
-  if (wasm) {
-    // guard against signed division overflow: the largest
-    // negative number / -1 would be 1 larger than the largest
-    // positive number, due to two's complement.
-    if (
-      !this.unsigned &&
-      this.high === -0x80000000 &&
-      divisor.low === -1 &&
-      divisor.high === -1
-    ) {
-      // be consistent with non-wasm code path
-      return this;
-    }
-    var low = (this.unsigned ? wasm["div_u"] : wasm["div_s"])(
-      this.low,
-      this.high,
-      divisor.low,
-      divisor.high,
-    );
-    return fromBits(low, wasm["get_high"](), this.unsigned);
-  }
-
-  if (this.isZero()) return this.unsigned ? UZERO : ZERO;
-  var approx, rem, res;
-  if (!this.unsigned) {
-    // This section is only relevant for signed longs and is derived from the
-    // closure library as a whole.
-    if (this.eq(MIN_VALUE)) {
-      if (divisor.eq(ONE) || divisor.eq(NEG_ONE))
-        return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE
-      else if (divisor.eq(MIN_VALUE)) return ONE;
-      else {
-        // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
-        var halfThis = this.shr(1);
-        approx = halfThis.div(divisor).shl(1);
-        if (approx.eq(ZERO)) {
-          return divisor.isNegative() ? ONE : NEG_ONE;
-        } else {
-          rem = this.sub(divisor.mul(approx));
-          res = approx.add(rem.div(divisor));
-          return res;
-        }
-      }
-    } else if (divisor.eq(MIN_VALUE)) return this.unsigned ? UZERO : ZERO;
-    if (this.isNegative()) {
-      if (divisor.isNegative()) return this.neg().div(divisor.neg());
-      return this.neg().div(divisor).neg();
-    } else if (divisor.isNegative()) return this.div(divisor.neg()).neg();
-    res = ZERO;
-  } else {
-    // The algorithm below has not been made for unsigned longs. It's therefore
-    // required to take special care of the MSB prior to running it.
-    if (!divisor.unsigned) divisor = divisor.toUnsigned();
-    if (divisor.gt(this)) return UZERO;
-    if (divisor.gt(this.shru(1)))
-      // 15 >>> 1 = 7 ; with divisor = 8 ; true
-      return UONE;
-    res = UZERO;
-  }
-
-  // Repeat the following until the remainder is less than other:  find a
-  // floating-point that approximates remainder / other *from below*, add this
-  // into the result, and subtract it from the remainder.  It is critical that
-  // the approximate value is less than or equal to the real value so that the
-  // remainder never becomes negative.
-  rem = this;
-  while (rem.gte(divisor)) {
-    // Approximate the result of division. This may be a little greater or
-    // smaller than the actual value.
-    approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));
-
-    // We will tweak the approximate result by changing it in the 48-th digit or
-    // the smallest non-fractional digit, whichever is larger.
-    var log2 = Math.ceil(Math.log(approx) / Math.LN2),
-      delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48),
-      // Decrease the approximation until it is smaller than the remainder.  Note
-      // that if it is too large, the product overflows and is negative.
-      approxRes = fromNumber(approx),
-      approxRem = approxRes.mul(divisor);
-    while (approxRem.isNegative() || approxRem.gt(rem)) {
-      approx -= delta;
-      approxRes = fromNumber(approx, this.unsigned);
-      approxRem = approxRes.mul(divisor);
-    }
-
-    // We know the answer can't be zero... and actually, zero would cause
-    // infinite recursion since we would make no progress.
-    if (approxRes.isZero()) approxRes = ONE;
-
-    res = res.add(approxRes);
-    rem = rem.sub(approxRem);
-  }
-  return res;
-};
-
-/**
- * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.
- * @function
- * @param {!Long|number|bigint|string} divisor Divisor
- * @returns {!Long} Quotient
- */
-LongPrototype.div = LongPrototype.divide;
-
-/**
- * Returns this Long modulo the specified.
- * @this {!Long}
- * @param {!Long|number|bigint|string} divisor Divisor
- * @returns {!Long} Remainder
- */
-LongPrototype.modulo = function modulo(divisor) {
-  if (!isLong(divisor)) divisor = fromValue(divisor);
-
-  // use wasm support if present
-  if (wasm) {
-    var low = (this.unsigned ? wasm["rem_u"] : wasm["rem_s"])(
-      this.low,
-      this.high,
-      divisor.low,
-      divisor.high,
-    );
-    return fromBits(low, wasm["get_high"](), this.unsigned);
-  }
-
-  return this.sub(this.div(divisor).mul(divisor));
-};
-
-/**
- * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
- * @function
- * @param {!Long|number|bigint|string} divisor Divisor
- * @returns {!Long} Remainder
- */
-LongPrototype.mod = LongPrototype.modulo;
-
-/**
- * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
- * @function
- * @param {!Long|number|bigint|string} divisor Divisor
- * @returns {!Long} Remainder
- */
-LongPrototype.rem = LongPrototype.modulo;
-
-/**
- * Returns the bitwise NOT of this Long.
- * @this {!Long}
- * @returns {!Long}
- */
-LongPrototype.not = function not() {
-  return fromBits(~this.low, ~this.high, this.unsigned);
-};
-
-/**
- * Returns count leading zeros of this Long.
- * @this {!Long}
- * @returns {!number}
- */
-LongPrototype.countLeadingZeros = function countLeadingZeros() {
-  return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32;
-};
-
-/**
- * Returns count leading zeros. This is an alias of {@link Long#countLeadingZeros}.
- * @function
- * @param {!Long}
- * @returns {!number}
- */
-LongPrototype.clz = LongPrototype.countLeadingZeros;
-
-/**
- * Returns count trailing zeros of this Long.
- * @this {!Long}
- * @returns {!number}
- */
-LongPrototype.countTrailingZeros = function countTrailingZeros() {
-  return this.low ? ctz32(this.low) : ctz32(this.high) + 32;
-};
-
-/**
- * Returns count trailing zeros. This is an alias of {@link Long#countTrailingZeros}.
- * @function
- * @param {!Long}
- * @returns {!number}
- */
-LongPrototype.ctz = LongPrototype.countTrailingZeros;
-
-/**
- * Returns the bitwise AND of this Long and the specified.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other Long
- * @returns {!Long}
- */
-LongPrototype.and = function and(other) {
-  if (!isLong(other)) other = fromValue(other);
-  return fromBits(this.low & other.low, this.high & other.high, this.unsigned);
-};
-
-/**
- * Returns the bitwise OR of this Long and the specified.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other Long
- * @returns {!Long}
- */
-LongPrototype.or = function or(other) {
-  if (!isLong(other)) other = fromValue(other);
-  return fromBits(this.low | other.low, this.high | other.high, this.unsigned);
-};
-
-/**
- * Returns the bitwise XOR of this Long and the given one.
- * @this {!Long}
- * @param {!Long|number|bigint|string} other Other Long
- * @returns {!Long}
- */
-LongPrototype.xor = function xor(other) {
-  if (!isLong(other)) other = fromValue(other);
-  return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);
-};
-
-/**
- * Returns this Long with bits shifted to the left by the given amount.
- * @this {!Long}
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Shifted Long
- */
-LongPrototype.shiftLeft = function shiftLeft(numBits) {
-  if (isLong(numBits)) numBits = numBits.toInt();
-  if ((numBits &= 63) === 0) return this;
-  else if (numBits < 32)
-    return fromBits(
-      this.low << numBits,
-      (this.high << numBits) | (this.low >>> (32 - numBits)),
-      this.unsigned,
-    );
-  else return fromBits(0, this.low << (numBits - 32), this.unsigned);
-};
-
-/**
- * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.
- * @function
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Shifted Long
- */
-LongPrototype.shl = LongPrototype.shiftLeft;
-
-/**
- * Returns this Long with bits arithmetically shifted to the right by the given amount.
- * @this {!Long}
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Shifted Long
- */
-LongPrototype.shiftRight = function shiftRight(numBits) {
-  if (isLong(numBits)) numBits = numBits.toInt();
-  if ((numBits &= 63) === 0) return this;
-  else if (numBits < 32)
-    return fromBits(
-      (this.low >>> numBits) | (this.high << (32 - numBits)),
-      this.high >> numBits,
-      this.unsigned,
-    );
-  else
-    return fromBits(
-      this.high >> (numBits - 32),
-      this.high >= 0 ? 0 : -1,
-      this.unsigned,
-    );
-};
-
-/**
- * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.
- * @function
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Shifted Long
- */
-LongPrototype.shr = LongPrototype.shiftRight;
-
-/**
- * Returns this Long with bits logically shifted to the right by the given amount.
- * @this {!Long}
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Shifted Long
- */
-LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {
-  if (isLong(numBits)) numBits = numBits.toInt();
-  if ((numBits &= 63) === 0) return this;
-  if (numBits < 32)
-    return fromBits(
-      (this.low >>> numBits) | (this.high << (32 - numBits)),
-      this.high >>> numBits,
-      this.unsigned,
-    );
-  if (numBits === 32) return fromBits(this.high, 0, this.unsigned);
-  return fromBits(this.high >>> (numBits - 32), 0, this.unsigned);
-};
-
-/**
- * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
- * @function
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Shifted Long
- */
-LongPrototype.shru = LongPrototype.shiftRightUnsigned;
-
-/**
- * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
- * @function
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Shifted Long
- */
-LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;
-
-/**
- * Returns this Long with bits rotated to the left by the given amount.
- * @this {!Long}
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Rotated Long
- */
-LongPrototype.rotateLeft = function rotateLeft(numBits) {
-  var b;
-  if (isLong(numBits)) numBits = numBits.toInt();
-  if ((numBits &= 63) === 0) return this;
-  if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);
-  if (numBits < 32) {
-    b = 32 - numBits;
-    return fromBits(
-      (this.low << numBits) | (this.high >>> b),
-      (this.high << numBits) | (this.low >>> b),
-      this.unsigned,
-    );
-  }
-  numBits -= 32;
-  b = 32 - numBits;
-  return fromBits(
-    (this.high << numBits) | (this.low >>> b),
-    (this.low << numBits) | (this.high >>> b),
-    this.unsigned,
-  );
-};
-/**
- * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.
- * @function
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Rotated Long
- */
-LongPrototype.rotl = LongPrototype.rotateLeft;
-
-/**
- * Returns this Long with bits rotated to the right by the given amount.
- * @this {!Long}
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Rotated Long
- */
-LongPrototype.rotateRight = function rotateRight(numBits) {
-  var b;
-  if (isLong(numBits)) numBits = numBits.toInt();
-  if ((numBits &= 63) === 0) return this;
-  if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);
-  if (numBits < 32) {
-    b = 32 - numBits;
-    return fromBits(
-      (this.high << b) | (this.low >>> numBits),
-      (this.low << b) | (this.high >>> numBits),
-      this.unsigned,
-    );
-  }
-  numBits -= 32;
-  b = 32 - numBits;
-  return fromBits(
-    (this.low << b) | (this.high >>> numBits),
-    (this.high << b) | (this.low >>> numBits),
-    this.unsigned,
-  );
-};
-/**
- * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.
- * @function
- * @param {number|!Long} numBits Number of bits
- * @returns {!Long} Rotated Long
- */
-LongPrototype.rotr = LongPrototype.rotateRight;
-
-/**
- * Converts this Long to signed.
- * @this {!Long}
- * @returns {!Long} Signed long
- */
-LongPrototype.toSigned = function toSigned() {
-  if (!this.unsigned) return this;
-  return fromBits(this.low, this.high, false);
-};
-
-/**
- * Converts this Long to unsigned.
- * @this {!Long}
- * @returns {!Long} Unsigned long
- */
-LongPrototype.toUnsigned = function toUnsigned() {
-  if (this.unsigned) return this;
-  return fromBits(this.low, this.high, true);
-};
-
-/**
- * Converts this Long to its byte representation.
- * @param {boolean=} le Whether little or big endian, defaults to big endian
- * @this {!Long}
- * @returns {!Array.<number>} Byte representation
- */
-LongPrototype.toBytes = function toBytes(le) {
-  return le ? this.toBytesLE() : this.toBytesBE();
-};
-
-/**
- * Converts this Long to its little endian byte representation.
- * @this {!Long}
- * @returns {!Array.<number>} Little endian byte representation
- */
-LongPrototype.toBytesLE = function toBytesLE() {
-  var hi = this.high,
-    lo = this.low;
-  return [
-    lo & 0xff,
-    (lo >>> 8) & 0xff,
-    (lo >>> 16) & 0xff,
-    lo >>> 24,
-    hi & 0xff,
-    (hi >>> 8) & 0xff,
-    (hi >>> 16) & 0xff,
-    hi >>> 24,
-  ];
-};
-
-/**
- * Converts this Long to its big endian byte representation.
- * @this {!Long}
- * @returns {!Array.<number>} Big endian byte representation
- */
-LongPrototype.toBytesBE = function toBytesBE() {
-  var hi = this.high,
-    lo = this.low;
-  return [
-    hi >>> 24,
-    (hi >>> 16) & 0xff,
-    (hi >>> 8) & 0xff,
-    hi & 0xff,
-    lo >>> 24,
-    (lo >>> 16) & 0xff,
-    (lo >>> 8) & 0xff,
-    lo & 0xff,
-  ];
-};
-
-/**
- * Creates a Long from its byte representation.
- * @param {!Array.<number>} bytes Byte representation
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @param {boolean=} le Whether little or big endian, defaults to big endian
- * @returns {Long} The corresponding Long value
- */
-Long.fromBytes = function fromBytes(bytes, unsigned, le) {
-  return le
-    ? Long.fromBytesLE(bytes, unsigned)
-    : Long.fromBytesBE(bytes, unsigned);
-};
-
-/**
- * Creates a Long from its little endian byte representation.
- * @param {!Array.<number>} bytes Little endian byte representation
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @returns {Long} The corresponding Long value
- */
-Long.fromBytesLE = function fromBytesLE(bytes, unsigned) {
-  return new Long(
-    bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24),
-    bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24),
-    unsigned,
-  );
-};
-
-/**
- * Creates a Long from its big endian byte representation.
- * @param {!Array.<number>} bytes Big endian byte representation
- * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
- * @returns {Long} The corresponding Long value
- */
-Long.fromBytesBE = function fromBytesBE(bytes, unsigned) {
-  return new Long(
-    (bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7],
-    (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3],
-    unsigned,
-  );
-};
-
-// Support conversion to/from BigInt where available
-if (typeof BigInt === "function") {
-  /**
-   * Returns a Long representing the given big integer.
-   * @function
-   * @param {number} value The big integer value
-   * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-   * @returns {!Long} The corresponding Long value
-   */
-  Long.fromBigInt = function fromBigInt(value, unsigned) {
-    var lowBits = Number(BigInt.asIntN(32, value));
-    var highBits = Number(BigInt.asIntN(32, value >> BigInt(32)));
-    return fromBits(lowBits, highBits, unsigned);
-  };
-
-  // Override
-  Long.fromValue = function fromValueWithBigInt(value, unsigned) {
-    if (typeof value === "bigint") return Long.fromBigInt(value, unsigned);
-    return fromValue(value, unsigned);
-  };
-
-  /**
-   * Converts the Long to its big integer representation.
-   * @this {!Long}
-   * @returns {bigint}
-   */
-  LongPrototype.toBigInt = function toBigInt() {
-    var lowBigInt = BigInt(this.low >>> 0);
-    var highBigInt = BigInt(this.unsigned ? this.high >>> 0 : this.high);
-    return (highBigInt << BigInt(32)) | lowBigInt;
-  };
-}
-
-export default Long;
Index: uckSimulator-main/ds-db-ws/node_modules/long/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,58 +1,0 @@
-{
-  "name": "long",
-  "version": "5.3.2",
-  "author": "Daniel Wirtz <dcode@dcode.io>",
-  "description": "A Long class for representing a 64-bit two's-complement integer value.",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/dcodeIO/long.js.git"
-  },
-  "bugs": {
-    "url": "https://github.com/dcodeIO/long.js/issues"
-  },
-  "keywords": [
-    "math",
-    "long",
-    "int64"
-  ],
-  "license": "Apache-2.0",
-  "type": "module",
-  "main": "umd/index.js",
-  "types": "umd/index.d.ts",
-  "exports": {
-    ".": {
-      "import": {
-        "types": "./index.d.ts",
-        "default": "./index.js"
-      },
-      "require": {
-        "types": "./umd/index.d.ts",
-        "default": "./umd/index.js"
-      }
-    }
-  },
-  "scripts": {
-    "build": "node scripts/build.js",
-    "lint": "prettier --check .",
-    "format": "prettier --write .",
-    "test": "npm run test:unit && npm run test:typescript",
-    "test:unit": "node tests",
-    "test:typescript": "tsc --project tests/typescript/tsconfig.esnext.json && tsc --project tests/typescript/tsconfig.nodenext.json && tsc --project tests/typescript/tsconfig.commonjs.json && tsc --project tests/typescript/tsconfig.global.json"
-  },
-  "files": [
-    "index.js",
-    "index.d.ts",
-    "types.d.ts",
-    "umd/index.js",
-    "umd/index.d.ts",
-    "umd/types.d.ts",
-    "umd/package.json",
-    "LICENSE",
-    "README.md"
-  ],
-  "devDependencies": {
-    "esm2umd": "^0.3.1",
-    "prettier": "^3.5.0",
-    "typescript": "^5.7.3"
-  }
-}
Index: uckSimulator-main/ds-db-ws/node_modules/long/types.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/types.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,474 +1,0 @@
-// Common type definitions for both the ESM and UMD variants. The ESM variant
-// reexports the Long class as its default export, whereas the UMD variant makes
-// the Long class a whole-module export with a global variable fallback.
-
-type LongLike =
-  | Long
-  | number
-  | bigint
-  | string
-  | { low: number; high: number; unsigned: boolean };
-
-export declare class Long {
-  /**
-   * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as signed integers. See the from* functions below for more convenient ways of constructing Longs.
-   */
-  constructor(low: number, high?: number, unsigned?: boolean);
-
-  /**
-   * Maximum unsigned value.
-   */
-  static MAX_UNSIGNED_VALUE: Long;
-
-  /**
-   * Maximum signed value.
-   */
-  static MAX_VALUE: Long;
-
-  /**
-   * Minimum signed value.
-   */
-  static MIN_VALUE: Long;
-
-  /**
-   * Signed negative one.
-   */
-  static NEG_ONE: Long;
-
-  /**
-   * Signed one.
-   */
-  static ONE: Long;
-
-  /**
-   * Unsigned one.
-   */
-  static UONE: Long;
-
-  /**
-   * Unsigned zero.
-   */
-  static UZERO: Long;
-
-  /**
-   * Signed zero
-   */
-  static ZERO: Long;
-
-  /**
-   * The high 32 bits as a signed value.
-   */
-  high: number;
-
-  /**
-   * The low 32 bits as a signed value.
-   */
-  low: number;
-
-  /**
-   * Whether unsigned or not.
-   */
-  unsigned: boolean;
-
-  /**
-   * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is assumed to use 32 bits.
-   */
-  static fromBits(lowBits: number, highBits: number, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representing the given 32 bit integer value.
-   */
-  static fromInt(value: number, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
-   */
-  static fromNumber(value: number, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representing the given big integer value.
-   */
-  static fromBigInt(value: bigint, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representation of the given string, written using the specified radix.
-   */
-  static fromString(
-    str: string,
-    unsigned?: boolean | number,
-    radix?: number,
-  ): Long;
-
-  /**
-   * Creates a Long from its byte representation.
-   */
-  static fromBytes(bytes: number[], unsigned?: boolean, le?: boolean): Long;
-
-  /**
-   * Creates a Long from its little endian byte representation.
-   */
-  static fromBytesLE(bytes: number[], unsigned?: boolean): Long;
-
-  /**
-   * Creates a Long from its big endian byte representation.
-   */
-  static fromBytesBE(bytes: number[], unsigned?: boolean): Long;
-
-  /**
-   * Tests if the specified object is a Long.
-   */
-  static isLong(obj: any): obj is Long;
-
-  /**
-   * Converts the specified value to a Long.
-   */
-  static fromValue(val: LongLike, unsigned?: boolean): Long;
-
-  /**
-   * Returns the sum of this and the specified Long.
-   */
-  add(addend: LongLike): Long;
-
-  /**
-   * Returns the bitwise AND of this Long and the specified.
-   */
-  and(other: LongLike): Long;
-
-  /**
-   * Compares this Long's value with the specified's.
-   */
-  compare(other: LongLike): number;
-
-  /**
-   * Compares this Long's value with the specified's.
-   */
-  comp(other: LongLike): number;
-
-  /**
-   * Returns this Long divided by the specified.
-   */
-  divide(divisor: LongLike): Long;
-
-  /**
-   * Returns this Long divided by the specified.
-   */
-  div(divisor: LongLike): Long;
-
-  /**
-   * Tests if this Long's value equals the specified's.
-   */
-  equals(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value equals the specified's.
-   */
-  eq(other: LongLike): boolean;
-
-  /**
-   * Gets the high 32 bits as a signed integer.
-   */
-  getHighBits(): number;
-
-  /**
-   * Gets the high 32 bits as an unsigned integer.
-   */
-  getHighBitsUnsigned(): number;
-
-  /**
-   * Gets the low 32 bits as a signed integer.
-   */
-  getLowBits(): number;
-
-  /**
-   * Gets the low 32 bits as an unsigned integer.
-   */
-  getLowBitsUnsigned(): number;
-
-  /**
-   * Gets the number of bits needed to represent the absolute value of this Long.
-   */
-  getNumBitsAbs(): number;
-
-  /**
-   * Tests if this Long's value is greater than the specified's.
-   */
-  greaterThan(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than the specified's.
-   */
-  gt(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than or equal the specified's.
-   */
-  greaterThanOrEqual(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than or equal the specified's.
-   */
-  gte(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than or equal the specified's.
-   */
-  ge(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is even.
-   */
-  isEven(): boolean;
-
-  /**
-   * Tests if this Long's value is negative.
-   */
-  isNegative(): boolean;
-
-  /**
-   * Tests if this Long's value is odd.
-   */
-  isOdd(): boolean;
-
-  /**
-   * Tests if this Long's value is positive or zero.
-   */
-  isPositive(): boolean;
-
-  /**
-   * Tests if this Long can be safely represented as a JavaScript number.
-   */
-  isSafeInteger(): boolean;
-
-  /**
-   * Tests if this Long's value equals zero.
-   */
-  isZero(): boolean;
-
-  /**
-   * Tests if this Long's value equals zero.
-   */
-  eqz(): boolean;
-
-  /**
-   * Tests if this Long's value is less than the specified's.
-   */
-  lessThan(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than the specified's.
-   */
-  lt(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than or equal the specified's.
-   */
-  lessThanOrEqual(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than or equal the specified's.
-   */
-  lte(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than or equal the specified's.
-   */
-  le(other: LongLike): boolean;
-
-  /**
-   * Returns this Long modulo the specified.
-   */
-  modulo(other: LongLike): Long;
-
-  /**
-   * Returns this Long modulo the specified.
-   */
-  mod(other: LongLike): Long;
-
-  /**
-   * Returns this Long modulo the specified.
-   */
-  rem(other: LongLike): Long;
-
-  /**
-   * Returns the product of this and the specified Long.
-   */
-  multiply(multiplier: LongLike): Long;
-
-  /**
-   * Returns the product of this and the specified Long.
-   */
-  mul(multiplier: LongLike): Long;
-
-  /**
-   * Negates this Long's value.
-   */
-  negate(): Long;
-
-  /**
-   * Negates this Long's value.
-   */
-  neg(): Long;
-
-  /**
-   * Returns the bitwise NOT of this Long.
-   */
-  not(): Long;
-
-  /**
-   * Returns count leading zeros of this Long.
-   */
-  countLeadingZeros(): number;
-
-  /**
-   * Returns count leading zeros of this Long.
-   */
-  clz(): number;
-
-  /**
-   * Returns count trailing zeros of this Long.
-   */
-  countTrailingZeros(): number;
-
-  /**
-   * Returns count trailing zeros of this Long.
-   */
-  ctz(): number;
-
-  /**
-   * Tests if this Long's value differs from the specified's.
-   */
-  notEquals(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value differs from the specified's.
-   */
-  neq(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value differs from the specified's.
-   */
-  ne(other: LongLike): boolean;
-
-  /**
-   * Returns the bitwise OR of this Long and the specified.
-   */
-  or(other: LongLike): Long;
-
-  /**
-   * Returns this Long with bits shifted to the left by the given amount.
-   */
-  shiftLeft(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits shifted to the left by the given amount.
-   */
-  shl(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits arithmetically shifted to the right by the given amount.
-   */
-  shiftRight(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits arithmetically shifted to the right by the given amount.
-   */
-  shr(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits logically shifted to the right by the given amount.
-   */
-  shiftRightUnsigned(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits logically shifted to the right by the given amount.
-   */
-  shru(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits logically shifted to the right by the given amount.
-   */
-  shr_u(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the left by the given amount.
-   */
-  rotateLeft(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the left by the given amount.
-   */
-  rotl(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the right by the given amount.
-   */
-  rotateRight(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the right by the given amount.
-   */
-  rotr(numBits: number | Long): Long;
-
-  /**
-   * Returns the difference of this and the specified Long.
-   */
-  subtract(subtrahend: LongLike): Long;
-
-  /**
-   * Returns the difference of this and the specified Long.
-   */
-  sub(subtrahend: LongLike): Long;
-
-  /**
-   * Converts the Long to a big integer.
-   */
-  toBigInt(): bigint;
-
-  /**
-   * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.
-   */
-  toInt(): number;
-
-  /**
-   * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).
-   */
-  toNumber(): number;
-
-  /**
-   * Converts this Long to its byte representation.
-   */
-
-  toBytes(le?: boolean): number[];
-
-  /**
-   * Converts this Long to its little endian byte representation.
-   */
-
-  toBytesLE(): number[];
-
-  /**
-   * Converts this Long to its big endian byte representation.
-   */
-
-  toBytesBE(): number[];
-
-  /**
-   * Converts this Long to signed.
-   */
-  toSigned(): Long;
-
-  /**
-   * Converts the Long to a string written in the specified radix.
-   */
-  toString(radix?: number): string;
-
-  /**
-   * Converts this Long to unsigned.
-   */
-  toUnsigned(): Long;
-
-  /**
-   * Returns the bitwise XOR of this Long and the given one.
-   */
-  xor(other: LongLike): Long;
-}
Index: uckSimulator-main/ds-db-ws/node_modules/long/umd/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/umd/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,3 +1,0 @@
-import { Long } from "./types.js";
-export = Long;
-export as namespace Long;
Index: uckSimulator-main/ds-db-ws/node_modules/long/umd/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/umd/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1622 +1,0 @@
-// GENERATED FILE. DO NOT EDIT.
-(function (global, factory) {
-  function preferDefault(exports) {
-    return exports.default || exports;
-  }
-  if (typeof define === "function" && define.amd) {
-    define([], function () {
-      var exports = {};
-      factory(exports);
-      return preferDefault(exports);
-    });
-  } else if (typeof exports === "object") {
-    factory(exports);
-    if (typeof module === "object") module.exports = preferDefault(exports);
-  } else {
-    (function () {
-      var exports = {};
-      factory(exports);
-      global.Long = preferDefault(exports);
-    })();
-  }
-})(
-  typeof globalThis !== "undefined"
-    ? globalThis
-    : typeof self !== "undefined"
-      ? self
-      : this,
-  function (_exports) {
-    "use strict";
-
-    Object.defineProperty(_exports, "__esModule", {
-      value: true,
-    });
-    _exports.default = void 0;
-    /**
-     * @license
-     * Copyright 2009 The Closure Library Authors
-     * Copyright 2020 Daniel Wirtz / The long.js Authors.
-     *
-     * Licensed under the Apache License, Version 2.0 (the "License");
-     * you may not use this file except in compliance with the License.
-     * You may obtain a copy of the License at
-     *
-     *     http://www.apache.org/licenses/LICENSE-2.0
-     *
-     * Unless required by applicable law or agreed to in writing, software
-     * distributed under the License is distributed on an "AS IS" BASIS,
-     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     * See the License for the specific language governing permissions and
-     * limitations under the License.
-     *
-     * SPDX-License-Identifier: Apache-2.0
-     */
-
-    // WebAssembly optimizations to do native i64 multiplication and divide
-    var wasm = null;
-    try {
-      wasm = new WebAssembly.Instance(
-        new WebAssembly.Module(
-          new Uint8Array([
-            // \0asm
-            0, 97, 115, 109,
-            // version 1
-            1, 0, 0, 0,
-            // section "type"
-            1, 13, 2,
-            // 0, () => i32
-            96, 0, 1, 127,
-            // 1, (i32, i32, i32, i32) => i32
-            96, 4, 127, 127, 127, 127, 1, 127,
-            // section "function"
-            3, 7, 6,
-            // 0, type 0
-            0,
-            // 1, type 1
-            1,
-            // 2, type 1
-            1,
-            // 3, type 1
-            1,
-            // 4, type 1
-            1,
-            // 5, type 1
-            1,
-            // section "global"
-            6, 6, 1,
-            // 0, "high", mutable i32
-            127, 1, 65, 0, 11,
-            // section "export"
-            7, 50, 6,
-            // 0, "mul"
-            3, 109, 117, 108, 0, 1,
-            // 1, "div_s"
-            5, 100, 105, 118, 95, 115, 0, 2,
-            // 2, "div_u"
-            5, 100, 105, 118, 95, 117, 0, 3,
-            // 3, "rem_s"
-            5, 114, 101, 109, 95, 115, 0, 4,
-            // 4, "rem_u"
-            5, 114, 101, 109, 95, 117, 0, 5,
-            // 5, "get_high"
-            8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0,
-            // section "code"
-            10, 191, 1, 6,
-            // 0, "get_high"
-            4, 0, 35, 0, 11,
-            // 1, "mul"
-            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
-            32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0,
-            32, 4, 167, 11,
-            // 2, "div_s"
-            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
-            32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0,
-            32, 4, 167, 11,
-            // 3, "div_u"
-            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
-            32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0,
-            32, 4, 167, 11,
-            // 4, "rem_s"
-            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
-            32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0,
-            32, 4, 167, 11,
-            // 5, "rem_u"
-            36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173,
-            32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0,
-            32, 4, 167, 11,
-          ]),
-        ),
-        {},
-      ).exports;
-    } catch {
-      // no wasm support :(
-    }
-
-    /**
-     * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.
-     *  See the from* functions below for more convenient ways of constructing Longs.
-     * @exports Long
-     * @class A Long class for representing a 64 bit two's-complement integer value.
-     * @param {number} low The low (signed) 32 bits of the long
-     * @param {number} high The high (signed) 32 bits of the long
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @constructor
-     */
-    function Long(low, high, unsigned) {
-      /**
-       * The low 32 bits as a signed value.
-       * @type {number}
-       */
-      this.low = low | 0;
-
-      /**
-       * The high 32 bits as a signed value.
-       * @type {number}
-       */
-      this.high = high | 0;
-
-      /**
-       * Whether unsigned or not.
-       * @type {boolean}
-       */
-      this.unsigned = !!unsigned;
-    }
-
-    // The internal representation of a long is the two given signed, 32-bit values.
-    // We use 32-bit pieces because these are the size of integers on which
-    // Javascript performs bit-operations.  For operations like addition and
-    // multiplication, we split each number into 16 bit pieces, which can easily be
-    // multiplied within Javascript's floating-point representation without overflow
-    // or change in sign.
-    //
-    // In the algorithms below, we frequently reduce the negative case to the
-    // positive case by negating the input(s) and then post-processing the result.
-    // Note that we must ALWAYS check specially whether those values are MIN_VALUE
-    // (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as
-    // a positive number, it overflows back into a negative).  Not handling this
-    // case would often result in infinite recursion.
-    //
-    // Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*
-    // methods on which they depend.
-
-    /**
-     * An indicator used to reliably determine if an object is a Long or not.
-     * @type {boolean}
-     * @const
-     * @private
-     */
-    Long.prototype.__isLong__;
-    Object.defineProperty(Long.prototype, "__isLong__", {
-      value: true,
-    });
-
-    /**
-     * @function
-     * @param {*} obj Object
-     * @returns {boolean}
-     * @inner
-     */
-    function isLong(obj) {
-      return (obj && obj["__isLong__"]) === true;
-    }
-
-    /**
-     * @function
-     * @param {*} value number
-     * @returns {number}
-     * @inner
-     */
-    function ctz32(value) {
-      var c = Math.clz32(value & -value);
-      return value ? 31 - c : c;
-    }
-
-    /**
-     * Tests if the specified object is a Long.
-     * @function
-     * @param {*} obj Object
-     * @returns {boolean}
-     */
-    Long.isLong = isLong;
-
-    /**
-     * A cache of the Long representations of small integer values.
-     * @type {!Object}
-     * @inner
-     */
-    var INT_CACHE = {};
-
-    /**
-     * A cache of the Long representations of small unsigned integer values.
-     * @type {!Object}
-     * @inner
-     */
-    var UINT_CACHE = {};
-
-    /**
-     * @param {number} value
-     * @param {boolean=} unsigned
-     * @returns {!Long}
-     * @inner
-     */
-    function fromInt(value, unsigned) {
-      var obj, cachedObj, cache;
-      if (unsigned) {
-        value >>>= 0;
-        if ((cache = 0 <= value && value < 256)) {
-          cachedObj = UINT_CACHE[value];
-          if (cachedObj) return cachedObj;
-        }
-        obj = fromBits(value, 0, true);
-        if (cache) UINT_CACHE[value] = obj;
-        return obj;
-      } else {
-        value |= 0;
-        if ((cache = -128 <= value && value < 128)) {
-          cachedObj = INT_CACHE[value];
-          if (cachedObj) return cachedObj;
-        }
-        obj = fromBits(value, value < 0 ? -1 : 0, false);
-        if (cache) INT_CACHE[value] = obj;
-        return obj;
-      }
-    }
-
-    /**
-     * Returns a Long representing the given 32 bit integer value.
-     * @function
-     * @param {number} value The 32 bit integer in question
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @returns {!Long} The corresponding Long value
-     */
-    Long.fromInt = fromInt;
-
-    /**
-     * @param {number} value
-     * @param {boolean=} unsigned
-     * @returns {!Long}
-     * @inner
-     */
-    function fromNumber(value, unsigned) {
-      if (isNaN(value)) return unsigned ? UZERO : ZERO;
-      if (unsigned) {
-        if (value < 0) return UZERO;
-        if (value >= TWO_PWR_64_DBL) return MAX_UNSIGNED_VALUE;
-      } else {
-        if (value <= -TWO_PWR_63_DBL) return MIN_VALUE;
-        if (value + 1 >= TWO_PWR_63_DBL) return MAX_VALUE;
-      }
-      if (value < 0) return fromNumber(-value, unsigned).neg();
-      return fromBits(
-        value % TWO_PWR_32_DBL | 0,
-        (value / TWO_PWR_32_DBL) | 0,
-        unsigned,
-      );
-    }
-
-    /**
-     * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
-     * @function
-     * @param {number} value The number in question
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @returns {!Long} The corresponding Long value
-     */
-    Long.fromNumber = fromNumber;
-
-    /**
-     * @param {number} lowBits
-     * @param {number} highBits
-     * @param {boolean=} unsigned
-     * @returns {!Long}
-     * @inner
-     */
-    function fromBits(lowBits, highBits, unsigned) {
-      return new Long(lowBits, highBits, unsigned);
-    }
-
-    /**
-     * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is
-     *  assumed to use 32 bits.
-     * @function
-     * @param {number} lowBits The low 32 bits
-     * @param {number} highBits The high 32 bits
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @returns {!Long} The corresponding Long value
-     */
-    Long.fromBits = fromBits;
-
-    /**
-     * @function
-     * @param {number} base
-     * @param {number} exponent
-     * @returns {number}
-     * @inner
-     */
-    var pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)
-
-    /**
-     * @param {string} str
-     * @param {(boolean|number)=} unsigned
-     * @param {number=} radix
-     * @returns {!Long}
-     * @inner
-     */
-    function fromString(str, unsigned, radix) {
-      if (str.length === 0) throw Error("empty string");
-      if (typeof unsigned === "number") {
-        // For goog.math.long compatibility
-        radix = unsigned;
-        unsigned = false;
-      } else {
-        unsigned = !!unsigned;
-      }
-      if (
-        str === "NaN" ||
-        str === "Infinity" ||
-        str === "+Infinity" ||
-        str === "-Infinity"
-      )
-        return unsigned ? UZERO : ZERO;
-      radix = radix || 10;
-      if (radix < 2 || 36 < radix) throw RangeError("radix");
-      var p;
-      if ((p = str.indexOf("-")) > 0) throw Error("interior hyphen");
-      else if (p === 0) {
-        return fromString(str.substring(1), unsigned, radix).neg();
-      }
-
-      // Do several (8) digits each time through the loop, so as to
-      // minimize the calls to the very expensive emulated div.
-      var radixToPower = fromNumber(pow_dbl(radix, 8));
-      var result = ZERO;
-      for (var i = 0; i < str.length; i += 8) {
-        var size = Math.min(8, str.length - i),
-          value = parseInt(str.substring(i, i + size), radix);
-        if (size < 8) {
-          var power = fromNumber(pow_dbl(radix, size));
-          result = result.mul(power).add(fromNumber(value));
-        } else {
-          result = result.mul(radixToPower);
-          result = result.add(fromNumber(value));
-        }
-      }
-      result.unsigned = unsigned;
-      return result;
-    }
-
-    /**
-     * Returns a Long representation of the given string, written using the specified radix.
-     * @function
-     * @param {string} str The textual representation of the Long
-     * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed
-     * @param {number=} radix The radix in which the text is written (2-36), defaults to 10
-     * @returns {!Long} The corresponding Long value
-     */
-    Long.fromString = fromString;
-
-    /**
-     * @function
-     * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val
-     * @param {boolean=} unsigned
-     * @returns {!Long}
-     * @inner
-     */
-    function fromValue(val, unsigned) {
-      if (typeof val === "number") return fromNumber(val, unsigned);
-      if (typeof val === "string") return fromString(val, unsigned);
-      // Throws for non-objects, converts non-instanceof Long:
-      return fromBits(
-        val.low,
-        val.high,
-        typeof unsigned === "boolean" ? unsigned : val.unsigned,
-      );
-    }
-
-    /**
-     * Converts the specified value to a Long using the appropriate from* function for its type.
-     * @function
-     * @param {!Long|number|bigint|string|!{low: number, high: number, unsigned: boolean}} val Value
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @returns {!Long}
-     */
-    Long.fromValue = fromValue;
-
-    // NOTE: the compiler should inline these constant values below and then remove these variables, so there should be
-    // no runtime penalty for these.
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var TWO_PWR_16_DBL = 1 << 16;
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var TWO_PWR_24_DBL = 1 << 24;
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;
-
-    /**
-     * @type {number}
-     * @const
-     * @inner
-     */
-    var TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;
-
-    /**
-     * @type {!Long}
-     * @const
-     * @inner
-     */
-    var TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var ZERO = fromInt(0);
-
-    /**
-     * Signed zero.
-     * @type {!Long}
-     */
-    Long.ZERO = ZERO;
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var UZERO = fromInt(0, true);
-
-    /**
-     * Unsigned zero.
-     * @type {!Long}
-     */
-    Long.UZERO = UZERO;
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var ONE = fromInt(1);
-
-    /**
-     * Signed one.
-     * @type {!Long}
-     */
-    Long.ONE = ONE;
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var UONE = fromInt(1, true);
-
-    /**
-     * Unsigned one.
-     * @type {!Long}
-     */
-    Long.UONE = UONE;
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var NEG_ONE = fromInt(-1);
-
-    /**
-     * Signed negative one.
-     * @type {!Long}
-     */
-    Long.NEG_ONE = NEG_ONE;
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var MAX_VALUE = fromBits(0xffffffff | 0, 0x7fffffff | 0, false);
-
-    /**
-     * Maximum signed value.
-     * @type {!Long}
-     */
-    Long.MAX_VALUE = MAX_VALUE;
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var MAX_UNSIGNED_VALUE = fromBits(0xffffffff | 0, 0xffffffff | 0, true);
-
-    /**
-     * Maximum unsigned value.
-     * @type {!Long}
-     */
-    Long.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;
-
-    /**
-     * @type {!Long}
-     * @inner
-     */
-    var MIN_VALUE = fromBits(0, 0x80000000 | 0, false);
-
-    /**
-     * Minimum signed value.
-     * @type {!Long}
-     */
-    Long.MIN_VALUE = MIN_VALUE;
-
-    /**
-     * @alias Long.prototype
-     * @inner
-     */
-    var LongPrototype = Long.prototype;
-
-    /**
-     * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.
-     * @this {!Long}
-     * @returns {number}
-     */
-    LongPrototype.toInt = function toInt() {
-      return this.unsigned ? this.low >>> 0 : this.low;
-    };
-
-    /**
-     * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).
-     * @this {!Long}
-     * @returns {number}
-     */
-    LongPrototype.toNumber = function toNumber() {
-      if (this.unsigned)
-        return (this.high >>> 0) * TWO_PWR_32_DBL + (this.low >>> 0);
-      return this.high * TWO_PWR_32_DBL + (this.low >>> 0);
-    };
-
-    /**
-     * Converts the Long to a string written in the specified radix.
-     * @this {!Long}
-     * @param {number=} radix Radix (2-36), defaults to 10
-     * @returns {string}
-     * @override
-     * @throws {RangeError} If `radix` is out of range
-     */
-    LongPrototype.toString = function toString(radix) {
-      radix = radix || 10;
-      if (radix < 2 || 36 < radix) throw RangeError("radix");
-      if (this.isZero()) return "0";
-      if (this.isNegative()) {
-        // Unsigned Longs are never negative
-        if (this.eq(MIN_VALUE)) {
-          // We need to change the Long value before it can be negated, so we remove
-          // the bottom-most digit in this base and then recurse to do the rest.
-          var radixLong = fromNumber(radix),
-            div = this.div(radixLong),
-            rem1 = div.mul(radixLong).sub(this);
-          return div.toString(radix) + rem1.toInt().toString(radix);
-        } else return "-" + this.neg().toString(radix);
-      }
-
-      // Do several (6) digits each time through the loop, so as to
-      // minimize the calls to the very expensive emulated div.
-      var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),
-        rem = this;
-      var result = "";
-      while (true) {
-        var remDiv = rem.div(radixToPower),
-          intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,
-          digits = intval.toString(radix);
-        rem = remDiv;
-        if (rem.isZero()) return digits + result;
-        else {
-          while (digits.length < 6) digits = "0" + digits;
-          result = "" + digits + result;
-        }
-      }
-    };
-
-    /**
-     * Gets the high 32 bits as a signed integer.
-     * @this {!Long}
-     * @returns {number} Signed high bits
-     */
-    LongPrototype.getHighBits = function getHighBits() {
-      return this.high;
-    };
-
-    /**
-     * Gets the high 32 bits as an unsigned integer.
-     * @this {!Long}
-     * @returns {number} Unsigned high bits
-     */
-    LongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {
-      return this.high >>> 0;
-    };
-
-    /**
-     * Gets the low 32 bits as a signed integer.
-     * @this {!Long}
-     * @returns {number} Signed low bits
-     */
-    LongPrototype.getLowBits = function getLowBits() {
-      return this.low;
-    };
-
-    /**
-     * Gets the low 32 bits as an unsigned integer.
-     * @this {!Long}
-     * @returns {number} Unsigned low bits
-     */
-    LongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {
-      return this.low >>> 0;
-    };
-
-    /**
-     * Gets the number of bits needed to represent the absolute value of this Long.
-     * @this {!Long}
-     * @returns {number}
-     */
-    LongPrototype.getNumBitsAbs = function getNumBitsAbs() {
-      if (this.isNegative())
-        // Unsigned Longs are never negative
-        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();
-      var val = this.high != 0 ? this.high : this.low;
-      for (var bit = 31; bit > 0; bit--) if ((val & (1 << bit)) != 0) break;
-      return this.high != 0 ? bit + 33 : bit + 1;
-    };
-
-    /**
-     * Tests if this Long can be safely represented as a JavaScript number.
-     * @this {!Long}
-     * @returns {boolean}
-     */
-    LongPrototype.isSafeInteger = function isSafeInteger() {
-      // 2^53-1 is the maximum safe value
-      var top11Bits = this.high >> 21;
-      // [0, 2^53-1]
-      if (!top11Bits) return true;
-      // > 2^53-1
-      if (this.unsigned) return false;
-      // [-2^53, -1] except -2^53
-      return top11Bits === -1 && !(this.low === 0 && this.high === -0x200000);
-    };
-
-    /**
-     * Tests if this Long's value equals zero.
-     * @this {!Long}
-     * @returns {boolean}
-     */
-    LongPrototype.isZero = function isZero() {
-      return this.high === 0 && this.low === 0;
-    };
-
-    /**
-     * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.
-     * @returns {boolean}
-     */
-    LongPrototype.eqz = LongPrototype.isZero;
-
-    /**
-     * Tests if this Long's value is negative.
-     * @this {!Long}
-     * @returns {boolean}
-     */
-    LongPrototype.isNegative = function isNegative() {
-      return !this.unsigned && this.high < 0;
-    };
-
-    /**
-     * Tests if this Long's value is positive or zero.
-     * @this {!Long}
-     * @returns {boolean}
-     */
-    LongPrototype.isPositive = function isPositive() {
-      return this.unsigned || this.high >= 0;
-    };
-
-    /**
-     * Tests if this Long's value is odd.
-     * @this {!Long}
-     * @returns {boolean}
-     */
-    LongPrototype.isOdd = function isOdd() {
-      return (this.low & 1) === 1;
-    };
-
-    /**
-     * Tests if this Long's value is even.
-     * @this {!Long}
-     * @returns {boolean}
-     */
-    LongPrototype.isEven = function isEven() {
-      return (this.low & 1) === 0;
-    };
-
-    /**
-     * Tests if this Long's value equals the specified's.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.equals = function equals(other) {
-      if (!isLong(other)) other = fromValue(other);
-      if (
-        this.unsigned !== other.unsigned &&
-        this.high >>> 31 === 1 &&
-        other.high >>> 31 === 1
-      )
-        return false;
-      return this.high === other.high && this.low === other.low;
-    };
-
-    /**
-     * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.eq = LongPrototype.equals;
-
-    /**
-     * Tests if this Long's value differs from the specified's.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.notEquals = function notEquals(other) {
-      return !this.eq(/* validates */ other);
-    };
-
-    /**
-     * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.neq = LongPrototype.notEquals;
-
-    /**
-     * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.ne = LongPrototype.notEquals;
-
-    /**
-     * Tests if this Long's value is less than the specified's.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.lessThan = function lessThan(other) {
-      return this.comp(/* validates */ other) < 0;
-    };
-
-    /**
-     * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.lt = LongPrototype.lessThan;
-
-    /**
-     * Tests if this Long's value is less than or equal the specified's.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {
-      return this.comp(/* validates */ other) <= 0;
-    };
-
-    /**
-     * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.lte = LongPrototype.lessThanOrEqual;
-
-    /**
-     * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.le = LongPrototype.lessThanOrEqual;
-
-    /**
-     * Tests if this Long's value is greater than the specified's.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.greaterThan = function greaterThan(other) {
-      return this.comp(/* validates */ other) > 0;
-    };
-
-    /**
-     * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.gt = LongPrototype.greaterThan;
-
-    /**
-     * Tests if this Long's value is greater than or equal the specified's.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {
-      return this.comp(/* validates */ other) >= 0;
-    };
-
-    /**
-     * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.gte = LongPrototype.greaterThanOrEqual;
-
-    /**
-     * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {boolean}
-     */
-    LongPrototype.ge = LongPrototype.greaterThanOrEqual;
-
-    /**
-     * Compares this Long's value with the specified's.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {number} 0 if they are the same, 1 if the this is greater and -1
-     *  if the given one is greater
-     */
-    LongPrototype.compare = function compare(other) {
-      if (!isLong(other)) other = fromValue(other);
-      if (this.eq(other)) return 0;
-      var thisNeg = this.isNegative(),
-        otherNeg = other.isNegative();
-      if (thisNeg && !otherNeg) return -1;
-      if (!thisNeg && otherNeg) return 1;
-      // At this point the sign bits are the same
-      if (!this.unsigned) return this.sub(other).isNegative() ? -1 : 1;
-      // Both are positive if at least one is unsigned
-      return other.high >>> 0 > this.high >>> 0 ||
-        (other.high === this.high && other.low >>> 0 > this.low >>> 0)
-        ? -1
-        : 1;
-    };
-
-    /**
-     * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.
-     * @function
-     * @param {!Long|number|bigint|string} other Other value
-     * @returns {number} 0 if they are the same, 1 if the this is greater and -1
-     *  if the given one is greater
-     */
-    LongPrototype.comp = LongPrototype.compare;
-
-    /**
-     * Negates this Long's value.
-     * @this {!Long}
-     * @returns {!Long} Negated Long
-     */
-    LongPrototype.negate = function negate() {
-      if (!this.unsigned && this.eq(MIN_VALUE)) return MIN_VALUE;
-      return this.not().add(ONE);
-    };
-
-    /**
-     * Negates this Long's value. This is an alias of {@link Long#negate}.
-     * @function
-     * @returns {!Long} Negated Long
-     */
-    LongPrototype.neg = LongPrototype.negate;
-
-    /**
-     * Returns the sum of this and the specified Long.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} addend Addend
-     * @returns {!Long} Sum
-     */
-    LongPrototype.add = function add(addend) {
-      if (!isLong(addend)) addend = fromValue(addend);
-
-      // Divide each number into 4 chunks of 16 bits, and then sum the chunks.
-
-      var a48 = this.high >>> 16;
-      var a32 = this.high & 0xffff;
-      var a16 = this.low >>> 16;
-      var a00 = this.low & 0xffff;
-      var b48 = addend.high >>> 16;
-      var b32 = addend.high & 0xffff;
-      var b16 = addend.low >>> 16;
-      var b00 = addend.low & 0xffff;
-      var c48 = 0,
-        c32 = 0,
-        c16 = 0,
-        c00 = 0;
-      c00 += a00 + b00;
-      c16 += c00 >>> 16;
-      c00 &= 0xffff;
-      c16 += a16 + b16;
-      c32 += c16 >>> 16;
-      c16 &= 0xffff;
-      c32 += a32 + b32;
-      c48 += c32 >>> 16;
-      c32 &= 0xffff;
-      c48 += a48 + b48;
-      c48 &= 0xffff;
-      return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
-    };
-
-    /**
-     * Returns the difference of this and the specified Long.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} subtrahend Subtrahend
-     * @returns {!Long} Difference
-     */
-    LongPrototype.subtract = function subtract(subtrahend) {
-      if (!isLong(subtrahend)) subtrahend = fromValue(subtrahend);
-      return this.add(subtrahend.neg());
-    };
-
-    /**
-     * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.
-     * @function
-     * @param {!Long|number|bigint|string} subtrahend Subtrahend
-     * @returns {!Long} Difference
-     */
-    LongPrototype.sub = LongPrototype.subtract;
-
-    /**
-     * Returns the product of this and the specified Long.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} multiplier Multiplier
-     * @returns {!Long} Product
-     */
-    LongPrototype.multiply = function multiply(multiplier) {
-      if (this.isZero()) return this;
-      if (!isLong(multiplier)) multiplier = fromValue(multiplier);
-
-      // use wasm support if present
-      if (wasm) {
-        var low = wasm["mul"](
-          this.low,
-          this.high,
-          multiplier.low,
-          multiplier.high,
-        );
-        return fromBits(low, wasm["get_high"](), this.unsigned);
-      }
-      if (multiplier.isZero()) return this.unsigned ? UZERO : ZERO;
-      if (this.eq(MIN_VALUE)) return multiplier.isOdd() ? MIN_VALUE : ZERO;
-      if (multiplier.eq(MIN_VALUE)) return this.isOdd() ? MIN_VALUE : ZERO;
-      if (this.isNegative()) {
-        if (multiplier.isNegative()) return this.neg().mul(multiplier.neg());
-        else return this.neg().mul(multiplier).neg();
-      } else if (multiplier.isNegative())
-        return this.mul(multiplier.neg()).neg();
-
-      // If both longs are small, use float multiplication
-      if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))
-        return fromNumber(
-          this.toNumber() * multiplier.toNumber(),
-          this.unsigned,
-        );
-
-      // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.
-      // We can skip products that would overflow.
-
-      var a48 = this.high >>> 16;
-      var a32 = this.high & 0xffff;
-      var a16 = this.low >>> 16;
-      var a00 = this.low & 0xffff;
-      var b48 = multiplier.high >>> 16;
-      var b32 = multiplier.high & 0xffff;
-      var b16 = multiplier.low >>> 16;
-      var b00 = multiplier.low & 0xffff;
-      var c48 = 0,
-        c32 = 0,
-        c16 = 0,
-        c00 = 0;
-      c00 += a00 * b00;
-      c16 += c00 >>> 16;
-      c00 &= 0xffff;
-      c16 += a16 * b00;
-      c32 += c16 >>> 16;
-      c16 &= 0xffff;
-      c16 += a00 * b16;
-      c32 += c16 >>> 16;
-      c16 &= 0xffff;
-      c32 += a32 * b00;
-      c48 += c32 >>> 16;
-      c32 &= 0xffff;
-      c32 += a16 * b16;
-      c48 += c32 >>> 16;
-      c32 &= 0xffff;
-      c32 += a00 * b32;
-      c48 += c32 >>> 16;
-      c32 &= 0xffff;
-      c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;
-      c48 &= 0xffff;
-      return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);
-    };
-
-    /**
-     * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.
-     * @function
-     * @param {!Long|number|bigint|string} multiplier Multiplier
-     * @returns {!Long} Product
-     */
-    LongPrototype.mul = LongPrototype.multiply;
-
-    /**
-     * Returns this Long divided by the specified. The result is signed if this Long is signed or
-     *  unsigned if this Long is unsigned.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} divisor Divisor
-     * @returns {!Long} Quotient
-     */
-    LongPrototype.divide = function divide(divisor) {
-      if (!isLong(divisor)) divisor = fromValue(divisor);
-      if (divisor.isZero()) throw Error("division by zero");
-
-      // use wasm support if present
-      if (wasm) {
-        // guard against signed division overflow: the largest
-        // negative number / -1 would be 1 larger than the largest
-        // positive number, due to two's complement.
-        if (
-          !this.unsigned &&
-          this.high === -0x80000000 &&
-          divisor.low === -1 &&
-          divisor.high === -1
-        ) {
-          // be consistent with non-wasm code path
-          return this;
-        }
-        var low = (this.unsigned ? wasm["div_u"] : wasm["div_s"])(
-          this.low,
-          this.high,
-          divisor.low,
-          divisor.high,
-        );
-        return fromBits(low, wasm["get_high"](), this.unsigned);
-      }
-      if (this.isZero()) return this.unsigned ? UZERO : ZERO;
-      var approx, rem, res;
-      if (!this.unsigned) {
-        // This section is only relevant for signed longs and is derived from the
-        // closure library as a whole.
-        if (this.eq(MIN_VALUE)) {
-          if (divisor.eq(ONE) || divisor.eq(NEG_ONE))
-            return MIN_VALUE; // recall that -MIN_VALUE == MIN_VALUE
-          else if (divisor.eq(MIN_VALUE)) return ONE;
-          else {
-            // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.
-            var halfThis = this.shr(1);
-            approx = halfThis.div(divisor).shl(1);
-            if (approx.eq(ZERO)) {
-              return divisor.isNegative() ? ONE : NEG_ONE;
-            } else {
-              rem = this.sub(divisor.mul(approx));
-              res = approx.add(rem.div(divisor));
-              return res;
-            }
-          }
-        } else if (divisor.eq(MIN_VALUE)) return this.unsigned ? UZERO : ZERO;
-        if (this.isNegative()) {
-          if (divisor.isNegative()) return this.neg().div(divisor.neg());
-          return this.neg().div(divisor).neg();
-        } else if (divisor.isNegative()) return this.div(divisor.neg()).neg();
-        res = ZERO;
-      } else {
-        // The algorithm below has not been made for unsigned longs. It's therefore
-        // required to take special care of the MSB prior to running it.
-        if (!divisor.unsigned) divisor = divisor.toUnsigned();
-        if (divisor.gt(this)) return UZERO;
-        if (divisor.gt(this.shru(1)))
-          // 15 >>> 1 = 7 ; with divisor = 8 ; true
-          return UONE;
-        res = UZERO;
-      }
-
-      // Repeat the following until the remainder is less than other:  find a
-      // floating-point that approximates remainder / other *from below*, add this
-      // into the result, and subtract it from the remainder.  It is critical that
-      // the approximate value is less than or equal to the real value so that the
-      // remainder never becomes negative.
-      rem = this;
-      while (rem.gte(divisor)) {
-        // Approximate the result of division. This may be a little greater or
-        // smaller than the actual value.
-        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));
-
-        // We will tweak the approximate result by changing it in the 48-th digit or
-        // the smallest non-fractional digit, whichever is larger.
-        var log2 = Math.ceil(Math.log(approx) / Math.LN2),
-          delta = log2 <= 48 ? 1 : pow_dbl(2, log2 - 48),
-          // Decrease the approximation until it is smaller than the remainder.  Note
-          // that if it is too large, the product overflows and is negative.
-          approxRes = fromNumber(approx),
-          approxRem = approxRes.mul(divisor);
-        while (approxRem.isNegative() || approxRem.gt(rem)) {
-          approx -= delta;
-          approxRes = fromNumber(approx, this.unsigned);
-          approxRem = approxRes.mul(divisor);
-        }
-
-        // We know the answer can't be zero... and actually, zero would cause
-        // infinite recursion since we would make no progress.
-        if (approxRes.isZero()) approxRes = ONE;
-        res = res.add(approxRes);
-        rem = rem.sub(approxRem);
-      }
-      return res;
-    };
-
-    /**
-     * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.
-     * @function
-     * @param {!Long|number|bigint|string} divisor Divisor
-     * @returns {!Long} Quotient
-     */
-    LongPrototype.div = LongPrototype.divide;
-
-    /**
-     * Returns this Long modulo the specified.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} divisor Divisor
-     * @returns {!Long} Remainder
-     */
-    LongPrototype.modulo = function modulo(divisor) {
-      if (!isLong(divisor)) divisor = fromValue(divisor);
-
-      // use wasm support if present
-      if (wasm) {
-        var low = (this.unsigned ? wasm["rem_u"] : wasm["rem_s"])(
-          this.low,
-          this.high,
-          divisor.low,
-          divisor.high,
-        );
-        return fromBits(low, wasm["get_high"](), this.unsigned);
-      }
-      return this.sub(this.div(divisor).mul(divisor));
-    };
-
-    /**
-     * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
-     * @function
-     * @param {!Long|number|bigint|string} divisor Divisor
-     * @returns {!Long} Remainder
-     */
-    LongPrototype.mod = LongPrototype.modulo;
-
-    /**
-     * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.
-     * @function
-     * @param {!Long|number|bigint|string} divisor Divisor
-     * @returns {!Long} Remainder
-     */
-    LongPrototype.rem = LongPrototype.modulo;
-
-    /**
-     * Returns the bitwise NOT of this Long.
-     * @this {!Long}
-     * @returns {!Long}
-     */
-    LongPrototype.not = function not() {
-      return fromBits(~this.low, ~this.high, this.unsigned);
-    };
-
-    /**
-     * Returns count leading zeros of this Long.
-     * @this {!Long}
-     * @returns {!number}
-     */
-    LongPrototype.countLeadingZeros = function countLeadingZeros() {
-      return this.high ? Math.clz32(this.high) : Math.clz32(this.low) + 32;
-    };
-
-    /**
-     * Returns count leading zeros. This is an alias of {@link Long#countLeadingZeros}.
-     * @function
-     * @param {!Long}
-     * @returns {!number}
-     */
-    LongPrototype.clz = LongPrototype.countLeadingZeros;
-
-    /**
-     * Returns count trailing zeros of this Long.
-     * @this {!Long}
-     * @returns {!number}
-     */
-    LongPrototype.countTrailingZeros = function countTrailingZeros() {
-      return this.low ? ctz32(this.low) : ctz32(this.high) + 32;
-    };
-
-    /**
-     * Returns count trailing zeros. This is an alias of {@link Long#countTrailingZeros}.
-     * @function
-     * @param {!Long}
-     * @returns {!number}
-     */
-    LongPrototype.ctz = LongPrototype.countTrailingZeros;
-
-    /**
-     * Returns the bitwise AND of this Long and the specified.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other Long
-     * @returns {!Long}
-     */
-    LongPrototype.and = function and(other) {
-      if (!isLong(other)) other = fromValue(other);
-      return fromBits(
-        this.low & other.low,
-        this.high & other.high,
-        this.unsigned,
-      );
-    };
-
-    /**
-     * Returns the bitwise OR of this Long and the specified.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other Long
-     * @returns {!Long}
-     */
-    LongPrototype.or = function or(other) {
-      if (!isLong(other)) other = fromValue(other);
-      return fromBits(
-        this.low | other.low,
-        this.high | other.high,
-        this.unsigned,
-      );
-    };
-
-    /**
-     * Returns the bitwise XOR of this Long and the given one.
-     * @this {!Long}
-     * @param {!Long|number|bigint|string} other Other Long
-     * @returns {!Long}
-     */
-    LongPrototype.xor = function xor(other) {
-      if (!isLong(other)) other = fromValue(other);
-      return fromBits(
-        this.low ^ other.low,
-        this.high ^ other.high,
-        this.unsigned,
-      );
-    };
-
-    /**
-     * Returns this Long with bits shifted to the left by the given amount.
-     * @this {!Long}
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Shifted Long
-     */
-    LongPrototype.shiftLeft = function shiftLeft(numBits) {
-      if (isLong(numBits)) numBits = numBits.toInt();
-      if ((numBits &= 63) === 0) return this;
-      else if (numBits < 32)
-        return fromBits(
-          this.low << numBits,
-          (this.high << numBits) | (this.low >>> (32 - numBits)),
-          this.unsigned,
-        );
-      else return fromBits(0, this.low << (numBits - 32), this.unsigned);
-    };
-
-    /**
-     * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.
-     * @function
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Shifted Long
-     */
-    LongPrototype.shl = LongPrototype.shiftLeft;
-
-    /**
-     * Returns this Long with bits arithmetically shifted to the right by the given amount.
-     * @this {!Long}
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Shifted Long
-     */
-    LongPrototype.shiftRight = function shiftRight(numBits) {
-      if (isLong(numBits)) numBits = numBits.toInt();
-      if ((numBits &= 63) === 0) return this;
-      else if (numBits < 32)
-        return fromBits(
-          (this.low >>> numBits) | (this.high << (32 - numBits)),
-          this.high >> numBits,
-          this.unsigned,
-        );
-      else
-        return fromBits(
-          this.high >> (numBits - 32),
-          this.high >= 0 ? 0 : -1,
-          this.unsigned,
-        );
-    };
-
-    /**
-     * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.
-     * @function
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Shifted Long
-     */
-    LongPrototype.shr = LongPrototype.shiftRight;
-
-    /**
-     * Returns this Long with bits logically shifted to the right by the given amount.
-     * @this {!Long}
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Shifted Long
-     */
-    LongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {
-      if (isLong(numBits)) numBits = numBits.toInt();
-      if ((numBits &= 63) === 0) return this;
-      if (numBits < 32)
-        return fromBits(
-          (this.low >>> numBits) | (this.high << (32 - numBits)),
-          this.high >>> numBits,
-          this.unsigned,
-        );
-      if (numBits === 32) return fromBits(this.high, 0, this.unsigned);
-      return fromBits(this.high >>> (numBits - 32), 0, this.unsigned);
-    };
-
-    /**
-     * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
-     * @function
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Shifted Long
-     */
-    LongPrototype.shru = LongPrototype.shiftRightUnsigned;
-
-    /**
-     * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.
-     * @function
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Shifted Long
-     */
-    LongPrototype.shr_u = LongPrototype.shiftRightUnsigned;
-
-    /**
-     * Returns this Long with bits rotated to the left by the given amount.
-     * @this {!Long}
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Rotated Long
-     */
-    LongPrototype.rotateLeft = function rotateLeft(numBits) {
-      var b;
-      if (isLong(numBits)) numBits = numBits.toInt();
-      if ((numBits &= 63) === 0) return this;
-      if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);
-      if (numBits < 32) {
-        b = 32 - numBits;
-        return fromBits(
-          (this.low << numBits) | (this.high >>> b),
-          (this.high << numBits) | (this.low >>> b),
-          this.unsigned,
-        );
-      }
-      numBits -= 32;
-      b = 32 - numBits;
-      return fromBits(
-        (this.high << numBits) | (this.low >>> b),
-        (this.low << numBits) | (this.high >>> b),
-        this.unsigned,
-      );
-    };
-    /**
-     * Returns this Long with bits rotated to the left by the given amount. This is an alias of {@link Long#rotateLeft}.
-     * @function
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Rotated Long
-     */
-    LongPrototype.rotl = LongPrototype.rotateLeft;
-
-    /**
-     * Returns this Long with bits rotated to the right by the given amount.
-     * @this {!Long}
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Rotated Long
-     */
-    LongPrototype.rotateRight = function rotateRight(numBits) {
-      var b;
-      if (isLong(numBits)) numBits = numBits.toInt();
-      if ((numBits &= 63) === 0) return this;
-      if (numBits === 32) return fromBits(this.high, this.low, this.unsigned);
-      if (numBits < 32) {
-        b = 32 - numBits;
-        return fromBits(
-          (this.high << b) | (this.low >>> numBits),
-          (this.low << b) | (this.high >>> numBits),
-          this.unsigned,
-        );
-      }
-      numBits -= 32;
-      b = 32 - numBits;
-      return fromBits(
-        (this.low << b) | (this.high >>> numBits),
-        (this.high << b) | (this.low >>> numBits),
-        this.unsigned,
-      );
-    };
-    /**
-     * Returns this Long with bits rotated to the right by the given amount. This is an alias of {@link Long#rotateRight}.
-     * @function
-     * @param {number|!Long} numBits Number of bits
-     * @returns {!Long} Rotated Long
-     */
-    LongPrototype.rotr = LongPrototype.rotateRight;
-
-    /**
-     * Converts this Long to signed.
-     * @this {!Long}
-     * @returns {!Long} Signed long
-     */
-    LongPrototype.toSigned = function toSigned() {
-      if (!this.unsigned) return this;
-      return fromBits(this.low, this.high, false);
-    };
-
-    /**
-     * Converts this Long to unsigned.
-     * @this {!Long}
-     * @returns {!Long} Unsigned long
-     */
-    LongPrototype.toUnsigned = function toUnsigned() {
-      if (this.unsigned) return this;
-      return fromBits(this.low, this.high, true);
-    };
-
-    /**
-     * Converts this Long to its byte representation.
-     * @param {boolean=} le Whether little or big endian, defaults to big endian
-     * @this {!Long}
-     * @returns {!Array.<number>} Byte representation
-     */
-    LongPrototype.toBytes = function toBytes(le) {
-      return le ? this.toBytesLE() : this.toBytesBE();
-    };
-
-    /**
-     * Converts this Long to its little endian byte representation.
-     * @this {!Long}
-     * @returns {!Array.<number>} Little endian byte representation
-     */
-    LongPrototype.toBytesLE = function toBytesLE() {
-      var hi = this.high,
-        lo = this.low;
-      return [
-        lo & 0xff,
-        (lo >>> 8) & 0xff,
-        (lo >>> 16) & 0xff,
-        lo >>> 24,
-        hi & 0xff,
-        (hi >>> 8) & 0xff,
-        (hi >>> 16) & 0xff,
-        hi >>> 24,
-      ];
-    };
-
-    /**
-     * Converts this Long to its big endian byte representation.
-     * @this {!Long}
-     * @returns {!Array.<number>} Big endian byte representation
-     */
-    LongPrototype.toBytesBE = function toBytesBE() {
-      var hi = this.high,
-        lo = this.low;
-      return [
-        hi >>> 24,
-        (hi >>> 16) & 0xff,
-        (hi >>> 8) & 0xff,
-        hi & 0xff,
-        lo >>> 24,
-        (lo >>> 16) & 0xff,
-        (lo >>> 8) & 0xff,
-        lo & 0xff,
-      ];
-    };
-
-    /**
-     * Creates a Long from its byte representation.
-     * @param {!Array.<number>} bytes Byte representation
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @param {boolean=} le Whether little or big endian, defaults to big endian
-     * @returns {Long} The corresponding Long value
-     */
-    Long.fromBytes = function fromBytes(bytes, unsigned, le) {
-      return le
-        ? Long.fromBytesLE(bytes, unsigned)
-        : Long.fromBytesBE(bytes, unsigned);
-    };
-
-    /**
-     * Creates a Long from its little endian byte representation.
-     * @param {!Array.<number>} bytes Little endian byte representation
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @returns {Long} The corresponding Long value
-     */
-    Long.fromBytesLE = function fromBytesLE(bytes, unsigned) {
-      return new Long(
-        bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24),
-        bytes[4] | (bytes[5] << 8) | (bytes[6] << 16) | (bytes[7] << 24),
-        unsigned,
-      );
-    };
-
-    /**
-     * Creates a Long from its big endian byte representation.
-     * @param {!Array.<number>} bytes Big endian byte representation
-     * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-     * @returns {Long} The corresponding Long value
-     */
-    Long.fromBytesBE = function fromBytesBE(bytes, unsigned) {
-      return new Long(
-        (bytes[4] << 24) | (bytes[5] << 16) | (bytes[6] << 8) | bytes[7],
-        (bytes[0] << 24) | (bytes[1] << 16) | (bytes[2] << 8) | bytes[3],
-        unsigned,
-      );
-    };
-
-    // Support conversion to/from BigInt where available
-    if (typeof BigInt === "function") {
-      /**
-       * Returns a Long representing the given big integer.
-       * @function
-       * @param {number} value The big integer value
-       * @param {boolean=} unsigned Whether unsigned or not, defaults to signed
-       * @returns {!Long} The corresponding Long value
-       */
-      Long.fromBigInt = function fromBigInt(value, unsigned) {
-        var lowBits = Number(BigInt.asIntN(32, value));
-        var highBits = Number(BigInt.asIntN(32, value >> BigInt(32)));
-        return fromBits(lowBits, highBits, unsigned);
-      };
-
-      // Override
-      Long.fromValue = function fromValueWithBigInt(value, unsigned) {
-        if (typeof value === "bigint") return Long.fromBigInt(value, unsigned);
-        return fromValue(value, unsigned);
-      };
-
-      /**
-       * Converts the Long to its big integer representation.
-       * @this {!Long}
-       * @returns {bigint}
-       */
-      LongPrototype.toBigInt = function toBigInt() {
-        var lowBigInt = BigInt(this.low >>> 0);
-        var highBigInt = BigInt(this.unsigned ? this.high >>> 0 : this.high);
-        return (highBigInt << BigInt(32)) | lowBigInt;
-      };
-    }
-    var _default = (_exports.default = Long);
-  },
-);
Index: uckSimulator-main/ds-db-ws/node_modules/long/umd/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/umd/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,3 +1,0 @@
-{
-  "type": "commonjs"
-}
Index: uckSimulator-main/ds-db-ws/node_modules/long/umd/types.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/long/umd/types.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,474 +1,0 @@
-// Common type definitions for both the ESM and UMD variants. The ESM variant
-// reexports the Long class as its default export, whereas the UMD variant makes
-// the Long class a whole-module export with a global variable fallback.
-
-type LongLike =
-  | Long
-  | number
-  | bigint
-  | string
-  | { low: number; high: number; unsigned: boolean };
-
-export declare class Long {
-  /**
-   * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as signed integers. See the from* functions below for more convenient ways of constructing Longs.
-   */
-  constructor(low: number, high?: number, unsigned?: boolean);
-
-  /**
-   * Maximum unsigned value.
-   */
-  static MAX_UNSIGNED_VALUE: Long;
-
-  /**
-   * Maximum signed value.
-   */
-  static MAX_VALUE: Long;
-
-  /**
-   * Minimum signed value.
-   */
-  static MIN_VALUE: Long;
-
-  /**
-   * Signed negative one.
-   */
-  static NEG_ONE: Long;
-
-  /**
-   * Signed one.
-   */
-  static ONE: Long;
-
-  /**
-   * Unsigned one.
-   */
-  static UONE: Long;
-
-  /**
-   * Unsigned zero.
-   */
-  static UZERO: Long;
-
-  /**
-   * Signed zero
-   */
-  static ZERO: Long;
-
-  /**
-   * The high 32 bits as a signed value.
-   */
-  high: number;
-
-  /**
-   * The low 32 bits as a signed value.
-   */
-  low: number;
-
-  /**
-   * Whether unsigned or not.
-   */
-  unsigned: boolean;
-
-  /**
-   * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is assumed to use 32 bits.
-   */
-  static fromBits(lowBits: number, highBits: number, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representing the given 32 bit integer value.
-   */
-  static fromInt(value: number, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.
-   */
-  static fromNumber(value: number, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representing the given big integer value.
-   */
-  static fromBigInt(value: bigint, unsigned?: boolean): Long;
-
-  /**
-   * Returns a Long representation of the given string, written using the specified radix.
-   */
-  static fromString(
-    str: string,
-    unsigned?: boolean | number,
-    radix?: number,
-  ): Long;
-
-  /**
-   * Creates a Long from its byte representation.
-   */
-  static fromBytes(bytes: number[], unsigned?: boolean, le?: boolean): Long;
-
-  /**
-   * Creates a Long from its little endian byte representation.
-   */
-  static fromBytesLE(bytes: number[], unsigned?: boolean): Long;
-
-  /**
-   * Creates a Long from its big endian byte representation.
-   */
-  static fromBytesBE(bytes: number[], unsigned?: boolean): Long;
-
-  /**
-   * Tests if the specified object is a Long.
-   */
-  static isLong(obj: any): obj is Long;
-
-  /**
-   * Converts the specified value to a Long.
-   */
-  static fromValue(val: LongLike, unsigned?: boolean): Long;
-
-  /**
-   * Returns the sum of this and the specified Long.
-   */
-  add(addend: LongLike): Long;
-
-  /**
-   * Returns the bitwise AND of this Long and the specified.
-   */
-  and(other: LongLike): Long;
-
-  /**
-   * Compares this Long's value with the specified's.
-   */
-  compare(other: LongLike): number;
-
-  /**
-   * Compares this Long's value with the specified's.
-   */
-  comp(other: LongLike): number;
-
-  /**
-   * Returns this Long divided by the specified.
-   */
-  divide(divisor: LongLike): Long;
-
-  /**
-   * Returns this Long divided by the specified.
-   */
-  div(divisor: LongLike): Long;
-
-  /**
-   * Tests if this Long's value equals the specified's.
-   */
-  equals(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value equals the specified's.
-   */
-  eq(other: LongLike): boolean;
-
-  /**
-   * Gets the high 32 bits as a signed integer.
-   */
-  getHighBits(): number;
-
-  /**
-   * Gets the high 32 bits as an unsigned integer.
-   */
-  getHighBitsUnsigned(): number;
-
-  /**
-   * Gets the low 32 bits as a signed integer.
-   */
-  getLowBits(): number;
-
-  /**
-   * Gets the low 32 bits as an unsigned integer.
-   */
-  getLowBitsUnsigned(): number;
-
-  /**
-   * Gets the number of bits needed to represent the absolute value of this Long.
-   */
-  getNumBitsAbs(): number;
-
-  /**
-   * Tests if this Long's value is greater than the specified's.
-   */
-  greaterThan(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than the specified's.
-   */
-  gt(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than or equal the specified's.
-   */
-  greaterThanOrEqual(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than or equal the specified's.
-   */
-  gte(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is greater than or equal the specified's.
-   */
-  ge(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is even.
-   */
-  isEven(): boolean;
-
-  /**
-   * Tests if this Long's value is negative.
-   */
-  isNegative(): boolean;
-
-  /**
-   * Tests if this Long's value is odd.
-   */
-  isOdd(): boolean;
-
-  /**
-   * Tests if this Long's value is positive or zero.
-   */
-  isPositive(): boolean;
-
-  /**
-   * Tests if this Long can be safely represented as a JavaScript number.
-   */
-  isSafeInteger(): boolean;
-
-  /**
-   * Tests if this Long's value equals zero.
-   */
-  isZero(): boolean;
-
-  /**
-   * Tests if this Long's value equals zero.
-   */
-  eqz(): boolean;
-
-  /**
-   * Tests if this Long's value is less than the specified's.
-   */
-  lessThan(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than the specified's.
-   */
-  lt(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than or equal the specified's.
-   */
-  lessThanOrEqual(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than or equal the specified's.
-   */
-  lte(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value is less than or equal the specified's.
-   */
-  le(other: LongLike): boolean;
-
-  /**
-   * Returns this Long modulo the specified.
-   */
-  modulo(other: LongLike): Long;
-
-  /**
-   * Returns this Long modulo the specified.
-   */
-  mod(other: LongLike): Long;
-
-  /**
-   * Returns this Long modulo the specified.
-   */
-  rem(other: LongLike): Long;
-
-  /**
-   * Returns the product of this and the specified Long.
-   */
-  multiply(multiplier: LongLike): Long;
-
-  /**
-   * Returns the product of this and the specified Long.
-   */
-  mul(multiplier: LongLike): Long;
-
-  /**
-   * Negates this Long's value.
-   */
-  negate(): Long;
-
-  /**
-   * Negates this Long's value.
-   */
-  neg(): Long;
-
-  /**
-   * Returns the bitwise NOT of this Long.
-   */
-  not(): Long;
-
-  /**
-   * Returns count leading zeros of this Long.
-   */
-  countLeadingZeros(): number;
-
-  /**
-   * Returns count leading zeros of this Long.
-   */
-  clz(): number;
-
-  /**
-   * Returns count trailing zeros of this Long.
-   */
-  countTrailingZeros(): number;
-
-  /**
-   * Returns count trailing zeros of this Long.
-   */
-  ctz(): number;
-
-  /**
-   * Tests if this Long's value differs from the specified's.
-   */
-  notEquals(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value differs from the specified's.
-   */
-  neq(other: LongLike): boolean;
-
-  /**
-   * Tests if this Long's value differs from the specified's.
-   */
-  ne(other: LongLike): boolean;
-
-  /**
-   * Returns the bitwise OR of this Long and the specified.
-   */
-  or(other: LongLike): Long;
-
-  /**
-   * Returns this Long with bits shifted to the left by the given amount.
-   */
-  shiftLeft(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits shifted to the left by the given amount.
-   */
-  shl(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits arithmetically shifted to the right by the given amount.
-   */
-  shiftRight(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits arithmetically shifted to the right by the given amount.
-   */
-  shr(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits logically shifted to the right by the given amount.
-   */
-  shiftRightUnsigned(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits logically shifted to the right by the given amount.
-   */
-  shru(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits logically shifted to the right by the given amount.
-   */
-  shr_u(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the left by the given amount.
-   */
-  rotateLeft(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the left by the given amount.
-   */
-  rotl(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the right by the given amount.
-   */
-  rotateRight(numBits: number | Long): Long;
-
-  /**
-   * Returns this Long with bits rotated to the right by the given amount.
-   */
-  rotr(numBits: number | Long): Long;
-
-  /**
-   * Returns the difference of this and the specified Long.
-   */
-  subtract(subtrahend: LongLike): Long;
-
-  /**
-   * Returns the difference of this and the specified Long.
-   */
-  sub(subtrahend: LongLike): Long;
-
-  /**
-   * Converts the Long to a big integer.
-   */
-  toBigInt(): bigint;
-
-  /**
-   * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.
-   */
-  toInt(): number;
-
-  /**
-   * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).
-   */
-  toNumber(): number;
-
-  /**
-   * Converts this Long to its byte representation.
-   */
-
-  toBytes(le?: boolean): number[];
-
-  /**
-   * Converts this Long to its little endian byte representation.
-   */
-
-  toBytesLE(): number[];
-
-  /**
-   * Converts this Long to its big endian byte representation.
-   */
-
-  toBytesBE(): number[];
-
-  /**
-   * Converts this Long to signed.
-   */
-  toSigned(): Long;
-
-  /**
-   * Converts the Long to a string written in the specified radix.
-   */
-  toString(radix?: number): string;
-
-  /**
-   * Converts this Long to unsigned.
-   */
-  toUnsigned(): Long;
-
-  /**
-   * Returns the bitwise XOR of this Long and the given one.
-   */
-  xor(other: LongLike): Long;
-}
Index: uckSimulator-main/ds-db-ws/node_modules/lru-cache/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru-cache/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,15 +1,0 @@
-The ISC License
-
-Copyright (c) 2010-2023 Isaac Z. Schlueter and Contributors
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
-IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/lru-cache/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru-cache/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1117 +1,0 @@
-# lru-cache
-
-A cache object that deletes the least-recently-used items.
-
-Specify a max number of the most recently used items that you
-want to keep, and this cache will keep that many of the most
-recently accessed items.
-
-This is not primarily a TTL cache, and does not make strong TTL
-guarantees. There is no preemptive pruning of expired items by
-default, but you _may_ set a TTL on the cache or on a single
-`set`. If you do so, it will treat expired items as missing, and
-delete them when fetched. If you are more interested in TTL
-caching than LRU caching, check out
-[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache).
-
-As of version 7, this is one of the most performant LRU
-implementations available in JavaScript, and supports a wide
-diversity of use cases. However, note that using some of the
-features will necessarily impact performance, by causing the
-cache to have to do more work. See the "Performance" section
-below.
-
-## Installation
-
-```bash
-npm install lru-cache --save
-```
-
-## Usage
-
-```js
-// hybrid module, either works
-import LRUCache from 'lru-cache'
-// or:
-const LRUCache = require('lru-cache')
-
-// At least one of 'max', 'ttl', or 'maxSize' is required, to prevent
-// unsafe unbounded storage.
-//
-// In most cases, it's best to specify a max for performance, so all
-// the required memory allocation is done up-front.
-//
-// All the other options are optional, see the sections below for
-// documentation on what each one does.  Most of them can be
-// overridden for specific items in get()/set()
-const options = {
-  max: 500,
-
-  // for use with tracking overall storage size
-  maxSize: 5000,
-  sizeCalculation: (value, key) => {
-    return 1
-  },
-
-  // for use when you need to clean up something when objects
-  // are evicted from the cache
-  dispose: (value, key) => {
-    freeFromMemoryOrWhatever(value)
-  },
-
-  // how long to live in ms
-  ttl: 1000 * 60 * 5,
-
-  // return stale items before removing from cache?
-  allowStale: false,
-
-  updateAgeOnGet: false,
-  updateAgeOnHas: false,
-
-  // async method to use for cache.fetch(), for
-  // stale-while-revalidate type of behavior
-  fetchMethod: async (key, staleValue, { options, signal }) => {},
-}
-
-const cache = new LRUCache(options)
-
-cache.set('key', 'value')
-cache.get('key') // "value"
-
-// non-string keys ARE fully supported
-// but note that it must be THE SAME object, not
-// just a JSON-equivalent object.
-var someObject = { a: 1 }
-cache.set(someObject, 'a value')
-// Object keys are not toString()-ed
-cache.set('[object Object]', 'a different value')
-assert.equal(cache.get(someObject), 'a value')
-// A similar object with same keys/values won't work,
-// because it's a different object identity
-assert.equal(cache.get({ a: 1 }), undefined)
-
-cache.clear() // empty the cache
-```
-
-If you put more stuff in it, then items will fall out.
-
-## Options
-
-### `max`
-
-The maximum number of items that remain in the cache (assuming no
-TTL pruning or explicit deletions). Note that fewer items may be
-stored if size calculation is used, and `maxSize` is exceeded.
-This must be a positive finite intger.
-
-At least one of `max`, `maxSize`, or `TTL` is required. This
-must be a positive integer if set.
-
-**It is strongly recommended to set a `max` to prevent unbounded
-growth of the cache.** See "Storage Bounds Safety" below.
-
-### `maxSize`
-
-Set to a positive integer to track the sizes of items added to
-the cache, and automatically evict items in order to stay below
-this size. Note that this may result in fewer than `max` items
-being stored.
-
-Attempting to add an item to the cache whose calculated size is
-greater that this amount will be a no-op. The item will not be
-cached, and no other items will be evicted.
-
-Optional, must be a positive integer if provided.
-
-Sets `maxEntrySize` to the same value, unless a different value
-is provided for `maxEntrySize`.
-
-At least one of `max`, `maxSize`, or `TTL` is required. This
-must be a positive integer if set.
-
-Even if size tracking is enabled, **it is strongly recommended to
-set a `max` to prevent unbounded growth of the cache.** See
-"Storage Bounds Safety" below.
-
-### `maxEntrySize`
-
-Set to a positive integer to track the sizes of items added to
-the cache, and prevent caching any item over a given size.
-Attempting to add an item whose calculated size is greater than
-this amount will be a no-op. The item will not be cached, and no
-other items will be evicted.
-
-Optional, must be a positive integer if provided. Defaults to
-the value of `maxSize` if provided.
-
-### `sizeCalculation`
-
-Function used to calculate the size of stored items. If you're
-storing strings or buffers, then you probably want to do
-something like `n => n.length`. The item is passed as the first
-argument, and the key is passed as the second argument.
-
-This may be overridden by passing an options object to
-`cache.set()`.
-
-Requires `maxSize` to be set.
-
-If the `size` (or return value of `sizeCalculation`) for a given
-entry is greater than `maxEntrySize`, then the item will not be
-added to the cache.
-
-Deprecated alias: `length`
-
-### `fetchMethod`
-
-Function that is used to make background asynchronous fetches.
-Called with `fetchMethod(key, staleValue, { signal, options,
-context })`. May return a Promise.
-
-If `fetchMethod` is not provided, then `cache.fetch(key)` is
-equivalent to `Promise.resolve(cache.get(key))`.
-
-The `signal` object is an `AbortSignal` if that's available in
-the global object, otherwise it's a pretty close polyfill.
-
-If at any time, `signal.aborted` is set to `true`, or if the
-`signal.onabort` method is called, or if it emits an `'abort'`
-event which you can listen to with `addEventListener`, then that
-means that the fetch should be abandoned. This may be passed
-along to async functions aware of AbortController/AbortSignal
-behavior.
-
-The `fetchMethod` should **only** return `undefined` or a Promise
-resolving to `undefined` if the AbortController signaled an
-`abort` event. In all other cases, it should return or resolve
-to a value suitable for adding to the cache.
-
-The `options` object is a union of the options that may be
-provided to `set()` and `get()`. If they are modified, then that
-will result in modifying the settings to `cache.set()` when the
-value is resolved, and in the case of `noDeleteOnFetchRejection`
-and `allowStaleOnFetchRejection`, the handling of `fetchMethod`
-failures.
-
-For example, a DNS cache may update the TTL based on the value
-returned from a remote DNS server by changing `options.ttl` in
-the `fetchMethod`.
-
-### `fetchContext`
-
-Arbitrary data that can be passed to the `fetchMethod` as the
-`context` option.
-
-Note that this will only be relevant when the `cache.fetch()`
-call needs to call `fetchMethod()`. Thus, any data which will
-meaningfully vary the fetch response needs to be present in the
-key. This is primarily intended for including `x-request-id`
-headers and the like for debugging purposes, which do not affect
-the `fetchMethod()` response.
-
-### `noDeleteOnFetchRejection`
-
-If a `fetchMethod` throws an error or returns a rejected promise,
-then by default, any existing stale value will be removed from
-the cache.
-
-If `noDeleteOnFetchRejection` is set to `true`, then this
-behavior is suppressed, and the stale value remains in the cache
-in the case of a rejected `fetchMethod`.
-
-This is important in cases where a `fetchMethod` is _only_ called
-as a background update while the stale value is returned, when
-`allowStale` is used.
-
-This is implicitly in effect when `allowStaleOnFetchRejection` is
-set.
-
-This may be set in calls to `fetch()`, or defaulted on the
-constructor, or overridden by modifying the options object in the
-`fetchMethod`.
-
-### `allowStaleOnFetchRejection`
-
-Set to true to return a stale value from the cache when a
-`fetchMethod` throws an error or returns a rejected Promise.
-
-If a `fetchMethod` fails, and there is no stale value available,
-the `fetch()` will resolve to `undefined`. Ie, all `fetchMethod`
-errors are suppressed.
-
-Implies `noDeleteOnFetchRejection`.
-
-This may be set in calls to `fetch()`, or defaulted on the
-constructor, or overridden by modifying the options object in the
-`fetchMethod`.
-
-### `allowStaleOnFetchAbort`
-
-Set to true to return a stale value from the cache when the
-`AbortSignal` passed to the `fetchMethod` dispatches an `'abort'`
-event, whether user-triggered, or due to internal cache behavior.
-
-Unless `ignoreFetchAbort` is also set, the underlying
-`fetchMethod` will still be considered canceled, and its return
-value will be ignored and not cached.
-
-### `ignoreFetchAbort`
-
-Set to true to ignore the `abort` event emitted by the
-`AbortSignal` object passed to `fetchMethod`, and still cache the
-resulting resolution value, as long as it is not `undefined`.
-
-When used on its own, this means aborted `fetch()` calls are not
-immediately resolved or rejected when they are aborted, and
-instead take the full time to await.
-
-When used with `allowStaleOnFetchAbort`, aborted `fetch()` calls
-will resolve immediately to their stale cached value or
-`undefined`, and will continue to process and eventually update
-the cache when they resolve, as long as the resulting value is
-not `undefined`, thus supporting a "return stale on timeout while
-refreshing" mechanism by passing `AbortSignal.timeout(n)` as the
-signal.
-
-For example:
-
-```js
-const c = new LRUCache({
-  ttl: 100,
-  ignoreFetchAbort: true,
-  allowStaleOnFetchAbort: true,
-  fetchMethod: async (key, oldValue, { signal }) => {
-    // note: do NOT pass the signal to fetch()!
-    // let's say this fetch can take a long time.
-    const res = await fetch(`https://slow-backend-server/${key}`)
-    return await res.json()
-  },
-})
-
-// this will return the stale value after 100ms, while still
-// updating in the background for next time.
-const val = await c.fetch('key', { signal: AbortSignal.timeout(100) })
-```
-
-**Note**: regardless of this setting, an `abort` event _is still
-emitted on the `AbortSignal` object_, so may result in invalid
-results when passed to other underlying APIs that use
-AbortSignals.
-
-This may be overridden on the `fetch()` call or in the
-`fetchMethod` itself.
-
-### `dispose`
-
-Function that is called on items when they are dropped from the
-cache, as `this.dispose(value, key, reason)`.
-
-This can be handy if you want to close file descriptors or do
-other cleanup tasks when items are no longer stored in the cache.
-
-**NOTE**: It is called _before_ the item has been fully removed
-from the cache, so if you want to put it right back in, you need
-to wait until the next tick. If you try to add it back in during
-the `dispose()` function call, it will break things in subtle and
-weird ways.
-
-Unlike several other options, this may _not_ be overridden by
-passing an option to `set()`, for performance reasons. If
-disposal functions may vary between cache entries, then the
-entire list must be scanned on every cache swap, even if no
-disposal function is in use.
-
-The `reason` will be one of the following strings, corresponding
-to the reason for the item's deletion:
-
-- `evict` Item was evicted to make space for a new addition
-- `set` Item was overwritten by a new value
-- `delete` Item was removed by explicit `cache.delete(key)` or by
-  calling `cache.clear()`, which deletes everything.
-
-The `dispose()` method is _not_ called for canceled calls to
-`fetchMethod()`. If you wish to handle evictions, overwrites,
-and deletes of in-flight asynchronous fetches, you must use the
-`AbortSignal` provided.
-
-Optional, must be a function.
-
-### `disposeAfter`
-
-The same as `dispose`, but called _after_ the entry is completely
-removed and the cache is once again in a clean state.
-
-It is safe to add an item right back into the cache at this
-point. However, note that it is _very_ easy to inadvertently
-create infinite recursion in this way.
-
-The `disposeAfter()` method is _not_ called for canceled calls to
-`fetchMethod()`. If you wish to handle evictions, overwrites,
-and deletes of in-flight asynchronous fetches, you must use the
-`AbortSignal` provided.
-
-### `noDisposeOnSet`
-
-Set to `true` to suppress calling the `dispose()` function if the
-entry key is still accessible within the cache.
-
-This may be overridden by passing an options object to
-`cache.set()`.
-
-Boolean, default `false`. Only relevant if `dispose` or
-`disposeAfter` options are set.
-
-### `ttl`
-
-Max time to live for items before they are considered stale.
-Note that stale items are NOT preemptively removed by default,
-and MAY live in the cache, contributing to its LRU max, long
-after they have expired.
-
-Also, as this cache is optimized for LRU/MRU operations, some of
-the staleness/TTL checks will reduce performance.
-
-This is not primarily a TTL cache, and does not make strong TTL
-guarantees. There is no pre-emptive pruning of expired items,
-but you _may_ set a TTL on the cache, and it will treat expired
-items as missing when they are fetched, and delete them.
-
-Optional, but must be a positive integer in ms if specified.
-
-This may be overridden by passing an options object to
-`cache.set()`.
-
-At least one of `max`, `maxSize`, or `TTL` is required. This
-must be a positive integer if set.
-
-Even if ttl tracking is enabled, **it is strongly recommended to
-set a `max` to prevent unbounded growth of the cache.** See
-"Storage Bounds Safety" below.
-
-If ttl tracking is enabled, and `max` and `maxSize` are not set,
-and `ttlAutopurge` is not set, then a warning will be emitted
-cautioning about the potential for unbounded memory consumption.
-
-Deprecated alias: `maxAge`
-
-### `noUpdateTTL`
-
-Boolean flag to tell the cache to not update the TTL when setting
-a new value for an existing key (ie, when updating a value rather
-than inserting a new value). Note that the TTL value is _always_
-set (if provided) when adding a new entry into the cache.
-
-This may be passed as an option to `cache.set()`.
-
-Boolean, default false.
-
-### `ttlResolution`
-
-Minimum amount of time in ms in which to check for staleness.
-Defaults to `1`, which means that the current time is checked at
-most once per millisecond.
-
-Set to `0` to check the current time every time staleness is
-tested.
-
-Note that setting this to a higher value _will_ improve
-performance somewhat while using ttl tracking, albeit at the
-expense of keeping stale items around a bit longer than intended.
-
-### `ttlAutopurge`
-
-Preemptively remove stale items from the cache.
-
-Note that this may _significantly_ degrade performance,
-especially if the cache is storing a large number of items. It
-is almost always best to just leave the stale items in the cache,
-and let them fall out as new items are added.
-
-Note that this means that `allowStale` is a bit pointless, as
-stale items will be deleted almost as soon as they expire.
-
-Use with caution!
-
-Boolean, default `false`
-
-### `allowStale`
-
-By default, if you set `ttl`, it'll only delete stale items from
-the cache when you `get(key)`. That is, it's not preemptively
-pruning items.
-
-If you set `allowStale:true`, it'll return the stale value as
-well as deleting it. If you don't set this, then it'll return
-`undefined` when you try to get a stale entry.
-
-Note that when a stale entry is fetched, _even if it is returned
-due to `allowStale` being set_, it is removed from the cache
-immediately. You can immediately put it back in the cache if you
-wish, thus resetting the TTL.
-
-This may be overridden by passing an options object to
-`cache.get()`. The `cache.has()` method will always return
-`false` for stale items.
-
-Boolean, default false, only relevant if `ttl` is set.
-
-Deprecated alias: `stale`
-
-### `noDeleteOnStaleGet`
-
-When using time-expiring entries with `ttl`, by default stale
-items will be removed from the cache when the key is accessed
-with `cache.get()`.
-
-Setting `noDeleteOnStaleGet` to `true` will cause stale items to
-remain in the cache, until they are explicitly deleted with
-`cache.delete(key)`, or retrieved with `noDeleteOnStaleGet` set
-to `false`.
-
-This may be overridden by passing an options object to
-`cache.get()`.
-
-Boolean, default false, only relevant if `ttl` is set.
-
-### `updateAgeOnGet`
-
-When using time-expiring entries with `ttl`, setting this to
-`true` will make each item's age reset to 0 whenever it is
-retrieved from cache with `get()`, causing it to not expire. (It
-can still fall out of cache based on recency of use, of course.)
-
-This may be overridden by passing an options object to
-`cache.get()`.
-
-Boolean, default false, only relevant if `ttl` is set.
-
-### `updateAgeOnHas`
-
-When using time-expiring entries with `ttl`, setting this to
-`true` will make each item's age reset to 0 whenever its presence
-in the cache is checked with `has()`, causing it to not expire.
-(It can still fall out of cache based on recency of use, of
-course.)
-
-This may be overridden by passing an options object to
-`cache.has()`.
-
-Boolean, default false, only relevant if `ttl` is set.
-
-## API
-
-### `new LRUCache(options)`
-
-Create a new LRUCache. All options are documented above, and are
-on the cache as public members.
-
-### `cache.max`, `cache.maxSize`, `cache.allowStale`,
-
-`cache.noDisposeOnSet`, `cache.sizeCalculation`, `cache.dispose`,
-`cache.maxSize`, `cache.ttl`, `cache.updateAgeOnGet`,
-`cache.updateAgeOnHas`
-
-All option names are exposed as public members on the cache
-object.
-
-These are intended for read access only. Changing them during
-program operation can cause undefined behavior.
-
-### `cache.size`
-
-The total number of items held in the cache at the current
-moment.
-
-### `cache.calculatedSize`
-
-The total size of items in cache when using size tracking.
-
-### `set(key, value, [{ size, sizeCalculation, ttl, noDisposeOnSet, start, status }])`
-
-Add a value to the cache.
-
-Optional options object may contain `ttl` and `sizeCalculation`
-as described above, which default to the settings on the cache
-object.
-
-If `start` is provided, then that will set the effective start
-time for the TTL calculation. Note that this must be a previous
-value of `performance.now()` if supported, or a previous value of
-`Date.now()` if not.
-
-Options object may also include `size`, which will prevent
-calling the `sizeCalculation` function and just use the specified
-number if it is a positive integer, and `noDisposeOnSet` which
-will prevent calling a `dispose` function in the case of
-overwrites.
-
-If the `size` (or return value of `sizeCalculation`) for a given
-entry is greater than `maxEntrySize`, then the item will not be
-added to the cache.
-
-Will update the recency of the entry.
-
-Returns the cache object.
-
-For the usage of the `status` option, see **Status Tracking**
-below.
-
-### `get(key, { updateAgeOnGet, allowStale, status } = {}) => value`
-
-Return a value from the cache.
-
-Will update the recency of the cache entry found.
-
-If the key is not found, `get()` will return `undefined`. This
-can be confusing when setting values specifically to `undefined`,
-as in `cache.set(key, undefined)`. Use `cache.has()` to
-determine whether a key is present in the cache at all.
-
-For the usage of the `status` option, see **Status Tracking**
-below.
-
-### `async fetch(key, options = {}) => Promise`
-
-The following options are supported:
-
-- `updateAgeOnGet`
-- `allowStale`
-- `size`
-- `sizeCalculation`
-- `ttl`
-- `noDisposeOnSet`
-- `forceRefresh`
-- `status` - See **Status Tracking** below.
-- `signal` - AbortSignal can be used to cancel the `fetch()`.
-  Note that the `signal` option provided to the `fetchMethod` is
-  a different object, because it must also respond to internal
-  cache state changes, but aborting this signal will abort the
-  one passed to `fetchMethod` as well.
-- `fetchContext` - sets the `context` option passed to the
-  underlying `fetchMethod`.
-
-If the value is in the cache and not stale, then the returned
-Promise resolves to the value.
-
-If not in the cache, or beyond its TTL staleness, then
-`fetchMethod(key, staleValue, { options, signal, context })` is
-called, and the value returned will be added to the cache once
-resolved.
-
-If called with `allowStale`, and an asynchronous fetch is
-currently in progress to reload a stale value, then the former
-stale value will be returned.
-
-If called with `forceRefresh`, then the cached item will be
-re-fetched, even if it is not stale. However, if `allowStale` is
-set, then the old value will still be returned. This is useful
-in cases where you want to force a reload of a cached value. If
-a background fetch is already in progress, then `forceRefresh`
-has no effect.
-
-Multiple fetches for the same `key` will only call `fetchMethod`
-a single time, and all will be resolved when the value is
-resolved, even if different options are used.
-
-If `fetchMethod` is not specified, then this is effectively an
-alias for `Promise.resolve(cache.get(key))`.
-
-When the fetch method resolves to a value, if the fetch has not
-been aborted due to deletion, eviction, or being overwritten,
-then it is added to the cache using the options provided.
-
-If the key is evicted or deleted before the `fetchMethod`
-resolves, then the AbortSignal passed to the `fetchMethod` will
-receive an `abort` event, and the promise returned by `fetch()`
-will reject with the reason for the abort.
-
-If a `signal` is passed to the `fetch()` call, then aborting the
-signal will abort the fetch and cause the `fetch()` promise to
-reject with the reason provided.
-
-### `peek(key, { allowStale } = {}) => value`
-
-Like `get()` but doesn't update recency or delete stale items.
-
-Returns `undefined` if the item is stale, unless `allowStale` is
-set either on the cache or in the options object.
-
-### `has(key, { updateAgeOnHas, status } = {}) => Boolean`
-
-Check if a key is in the cache, without updating the recency of
-use. Age is updated if `updateAgeOnHas` is set to `true` in
-either the options or the constructor.
-
-Will return `false` if the item is stale, even though it is
-technically in the cache.  The difference can be determined (if
-it matters) by using a `status` argument, and inspecting the
-`has` field.
-
-For the usage of the `status` option, see **Status Tracking**
-below.
-
-### `delete(key)`
-
-Deletes a key out of the cache.
-
-Returns `true` if the key was deleted, `false` otherwise.
-
-### `clear()`
-
-Clear the cache entirely, throwing away all values.
-
-Deprecated alias: `reset()`
-
-### `keys()`
-
-Return a generator yielding the keys in the cache, in order from
-most recently used to least recently used.
-
-### `rkeys()`
-
-Return a generator yielding the keys in the cache, in order from
-least recently used to most recently used.
-
-### `values()`
-
-Return a generator yielding the values in the cache, in order
-from most recently used to least recently used.
-
-### `rvalues()`
-
-Return a generator yielding the values in the cache, in order
-from least recently used to most recently used.
-
-### `entries()`
-
-Return a generator yielding `[key, value]` pairs, in order from
-most recently used to least recently used.
-
-### `rentries()`
-
-Return a generator yielding `[key, value]` pairs, in order from
-least recently used to most recently used.
-
-### `find(fn, [getOptions])`
-
-Find a value for which the supplied `fn` method returns a truthy
-value, similar to `Array.find()`.
-
-`fn` is called as `fn(value, key, cache)`.
-
-The optional `getOptions` are applied to the resulting `get()` of
-the item found.
-
-### `dump()`
-
-Return an array of `[key, entry]` objects which can be passed to
-`cache.load()`
-
-The `start` fields are calculated relative to a portable
-`Date.now()` timestamp, even if `performance.now()` is available.
-
-Stale entries are always included in the `dump`, even if
-`allowStale` is false.
-
-Note: this returns an actual array, not a generator, so it can be
-more easily passed around.
-
-### `load(entries)`
-
-Reset the cache and load in the items in `entries` in the order
-listed. Note that the shape of the resulting cache may be
-different if the same options are not used in both caches.
-
-The `start` fields are assumed to be calculated relative to a
-portable `Date.now()` timestamp, even if `performance.now()` is
-available.
-
-### `purgeStale()`
-
-Delete any stale entries. Returns `true` if anything was
-removed, `false` otherwise.
-
-Deprecated alias: `prune`
-
-### `getRemainingTTL(key)`
-
-Return the number of ms left in the item's TTL. If item is not
-in cache, returns `0`. Returns `Infinity` if item is in cache
-without a defined TTL.
-
-### `forEach(fn, [thisp])`
-
-Call the `fn` function with each set of `fn(value, key, cache)`
-in the LRU cache, from most recent to least recently used.
-
-Does not affect recency of use.
-
-If `thisp` is provided, function will be called in the
-`this`-context of the provided object.
-
-### `rforEach(fn, [thisp])`
-
-Same as `cache.forEach(fn, thisp)`, but in order from least
-recently used to most recently used.
-
-### `pop()`
-
-Evict the least recently used item, returning its value.
-
-Returns `undefined` if cache is empty.
-
-### Internal Methods and Properties
-
-In order to optimize performance as much as possible, "private"
-members and methods are exposed on the object as normal
-properties, rather than being accessed via Symbols, private
-members, or closure variables.
-
-**Do not use or rely on these.** They will change or be removed
-without notice. They will cause undefined behavior if used
-inappropriately. There is no need or reason to ever call them
-directly.
-
-This documentation is here so that it is especially clear that
-this not "undocumented" because someone forgot; it _is_
-documented, and the documentation is telling you not to do it.
-
-**Do not report bugs that stem from using these properties.**
-They will be ignored.
-
-- `initializeTTLTracking()` Set up the cache for tracking TTLs
-- `updateItemAge(index)` Called when an item age is updated, by
-  internal ID
-- `setItemTTL(index)` Called when an item ttl is updated, by
-  internal ID
-- `isStale(index)` Called to check an item's staleness, by
-  internal ID
-- `initializeSizeTracking()` Set up the cache for tracking item
-  size. Called automatically when a size is specified.
-- `removeItemSize(index)` Updates the internal size calculation
-  when an item is removed or modified, by internal ID
-- `addItemSize(index)` Updates the internal size calculation when
-  an item is added or modified, by internal ID
-- `indexes()` An iterator over the non-stale internal IDs, from
-  most recently to least recently used.
-- `rindexes()` An iterator over the non-stale internal IDs, from
-  least recently to most recently used.
-- `newIndex()` Create a new internal ID, either reusing a deleted
-  ID, evicting the least recently used ID, or walking to the end
-  of the allotted space.
-- `evict()` Evict the least recently used internal ID, returning
-  its ID. Does not do any bounds checking.
-- `connect(p, n)` Connect the `p` and `n` internal IDs in the
-  linked list.
-- `moveToTail(index)` Move the specified internal ID to the most
-  recently used position.
-- `keyMap` Map of keys to internal IDs
-- `keyList` List of keys by internal ID
-- `valList` List of values by internal ID
-- `sizes` List of calculated sizes by internal ID
-- `ttls` List of TTL values by internal ID
-- `starts` List of start time values by internal ID
-- `next` Array of "next" pointers by internal ID
-- `prev` Array of "previous" pointers by internal ID
-- `head` Internal ID of least recently used item
-- `tail` Internal ID of most recently used item
-- `free` Stack of deleted internal IDs
-
-## Status Tracking
-
-Occasionally, it may be useful to track the internal behavior of
-the cache, particularly for logging, debugging, or for behavior
-within the `fetchMethod`.  To do this, you can pass a `status`
-object to the `get()`, `set()`, `has()`, and `fetch()` methods.
-
-The `status` option should be a plain JavaScript object.
-
-The following fields will be set appropriately:
-
-```ts
-interface Status<V> {
-  /**
-   * The status of a set() operation.
-   *
-   * - add: the item was not found in the cache, and was added
-   * - update: the item was in the cache, with the same value provided
-   * - replace: the item was in the cache, and replaced
-   * - miss: the item was not added to the cache for some reason
-   */
-  set?: 'add' | 'update' | 'replace' | 'miss'
-
-  /**
-   * the ttl stored for the item, or undefined if ttls are not used.
-   */
-  ttl?: LRUMilliseconds
-
-  /**
-   * the start time for the item, or undefined if ttls are not used.
-   */
-  start?: LRUMilliseconds
-
-  /**
-   * The timestamp used for TTL calculation
-   */
-  now?: LRUMilliseconds
-
-  /**
-   * the remaining ttl for the item, or undefined if ttls are not used.
-   */
-  remainingTTL?: LRUMilliseconds
-
-  /**
-   * The calculated size for the item, if sizes are used.
-   */
-  size?: LRUSize
-
-  /**
-   * A flag indicating that the item was not stored, due to exceeding the
-   * {@link maxEntrySize}
-   */
-  maxEntrySizeExceeded?: true
-
-  /**
-   * The old value, specified in the case of `set:'update'` or
-   * `set:'replace'`
-   */
-  oldValue?: V
-
-  /**
-   * The results of a {@link has} operation
-   *
-   * - hit: the item was found in the cache
-   * - stale: the item was found in the cache, but is stale
-   * - miss: the item was not found in the cache
-   */
-  has?: 'hit' | 'stale' | 'miss'
-
-  /**
-   * The status of a {@link fetch} operation.
-   * Note that this can change as the underlying fetch() moves through
-   * various states.
-   *
-   * - inflight: there is another fetch() for this key which is in process
-   * - get: there is no fetchMethod, so {@link get} was called.
-   * - miss: the item is not in cache, and will be fetched.
-   * - hit: the item is in the cache, and was resolved immediately.
-   * - stale: the item is in the cache, but stale.
-   * - refresh: the item is in the cache, and not stale, but
-   *   {@link forceRefresh} was specified.
-   */
-  fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'
-
-  /**
-   * The {@link fetchMethod} was called
-   */
-  fetchDispatched?: true
-
-  /**
-   * The cached value was updated after a successful call to fetchMethod
-   */
-  fetchUpdated?: true
-
-  /**
-   * The reason for a fetch() rejection.  Either the error raised by the
-   * {@link fetchMethod}, or the reason for an AbortSignal.
-   */
-  fetchError?: Error
-
-  /**
-   * The fetch received an abort signal
-   */
-  fetchAborted?: true
-
-  /**
-   * The abort signal received was ignored, and the fetch was allowed to
-   * continue.
-   */
-  fetchAbortIgnored?: true
-
-  /**
-   * The fetchMethod promise resolved successfully
-   */
-  fetchResolved?: true
-
-  /**
-   * The results of the fetchMethod promise were stored in the cache
-   */
-  fetchUpdated?: true
-
-  /**
-   * The fetchMethod promise was rejected
-   */
-  fetchRejected?: true
-
-  /**
-   * The status of a {@link get} operation.
-   *
-   * - fetching: The item is currently being fetched.  If a previous value is
-   *   present and allowed, that will be returned.
-   * - stale: The item is in the cache, and is stale.
-   * - hit: the item is in the cache
-   * - miss: the item is not in the cache
-   */
-  get?: 'stale' | 'hit' | 'miss'
-
-  /**
-   * A fetch or get operation returned a stale value.
-   */
-  returnedStale?: true
-}
-```
-
-## Storage Bounds Safety
-
-This implementation aims to be as flexible as possible, within
-the limits of safe memory consumption and optimal performance.
-
-At initial object creation, storage is allocated for `max` items.
-If `max` is set to zero, then some performance is lost, and item
-count is unbounded. Either `maxSize` or `ttl` _must_ be set if
-`max` is not specified.
-
-If `maxSize` is set, then this creates a safe limit on the
-maximum storage consumed, but without the performance benefits of
-pre-allocation. When `maxSize` is set, every item _must_ provide
-a size, either via the `sizeCalculation` method provided to the
-constructor, or via a `size` or `sizeCalculation` option provided
-to `cache.set()`. The size of every item _must_ be a positive
-integer.
-
-If neither `max` nor `maxSize` are set, then `ttl` tracking must
-be enabled. Note that, even when tracking item `ttl`, items are
-_not_ preemptively deleted when they become stale, unless
-`ttlAutopurge` is enabled. Instead, they are only purged the
-next time the key is requested. Thus, if `ttlAutopurge`, `max`,
-and `maxSize` are all not set, then the cache will potentially
-grow unbounded.
-
-In this case, a warning is printed to standard error. Future
-versions may require the use of `ttlAutopurge` if `max` and
-`maxSize` are not specified.
-
-If you truly wish to use a cache that is bound _only_ by TTL
-expiration, consider using a `Map` object, and calling
-`setTimeout` to delete entries when they expire. It will perform
-much better than an LRU cache.
-
-Here is an implementation you may use, under the same
-[license](./LICENSE) as this package:
-
-```js
-// a storage-unbounded ttl cache that is not an lru-cache
-const cache = {
-  data: new Map(),
-  timers: new Map(),
-  set: (k, v, ttl) => {
-    if (cache.timers.has(k)) {
-      clearTimeout(cache.timers.get(k))
-    }
-    cache.timers.set(
-      k,
-      setTimeout(() => cache.delete(k), ttl)
-    )
-    cache.data.set(k, v)
-  },
-  get: k => cache.data.get(k),
-  has: k => cache.data.has(k),
-  delete: k => {
-    if (cache.timers.has(k)) {
-      clearTimeout(cache.timers.get(k))
-    }
-    cache.timers.delete(k)
-    return cache.data.delete(k)
-  },
-  clear: () => {
-    cache.data.clear()
-    for (const v of cache.timers.values()) {
-      clearTimeout(v)
-    }
-    cache.timers.clear()
-  },
-}
-```
-
-If that isn't to your liking, check out
-[@isaacs/ttlcache](http://npm.im/@isaacs/ttlcache).
-
-## Performance
-
-As of January 2022, version 7 of this library is one of the most
-performant LRU cache implementations in JavaScript.
-
-Benchmarks can be extremely difficult to get right. In
-particular, the performance of set/get/delete operations on
-objects will vary _wildly_ depending on the type of key used. V8
-is highly optimized for objects with keys that are short strings,
-especially integer numeric strings. Thus any benchmark which
-tests _solely_ using numbers as keys will tend to find that an
-object-based approach performs the best.
-
-Note that coercing _anything_ to strings to use as object keys is
-unsafe, unless you can be 100% certain that no other type of
-value will be used. For example:
-
-```js
-const myCache = {}
-const set = (k, v) => (myCache[k] = v)
-const get = k => myCache[k]
-
-set({}, 'please hang onto this for me')
-set('[object Object]', 'oopsie')
-```
-
-Also beware of "Just So" stories regarding performance. Garbage
-collection of large (especially: deep) object graphs can be
-incredibly costly, with several "tipping points" where it
-increases exponentially. As a result, putting that off until
-later can make it much worse, and less predictable. If a library
-performs well, but only in a scenario where the object graph is
-kept shallow, then that won't help you if you are using large
-objects as keys.
-
-In general, when attempting to use a library to improve
-performance (such as a cache like this one), it's best to choose
-an option that will perform well in the sorts of scenarios where
-you'll actually use it.
-
-This library is optimized for repeated gets and minimizing
-eviction time, since that is the expected need of a LRU. Set
-operations are somewhat slower on average than a few other
-options, in part because of that optimization. It is assumed
-that you'll be caching some costly operation, ideally as rarely
-as possible, so optimizing set over get would be unwise.
-
-If performance matters to you:
-
-1. If it's at all possible to use small integer values as keys,
-   and you can guarantee that no other types of values will be
-   used as keys, then do that, and use a cache such as
-   [lru-fast](https://npmjs.com/package/lru-fast), or
-   [mnemonist's
-   LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache)
-   which uses an Object as its data store.
-2. Failing that, if at all possible, use short non-numeric
-   strings (ie, less than 256 characters) as your keys, and use
-   [mnemonist's
-   LRUCache](https://yomguithereal.github.io/mnemonist/lru-cache).
-3. If the types of your keys will be long strings, strings that
-   look like floats, `null`, objects, or some mix of types, or if
-   you aren't sure, then this library will work well for you.
-4. Do not use a `dispose` function, size tracking, or especially
-   ttl behavior, unless absolutely needed. These features are
-   convenient, and necessary in some use cases, and every attempt
-   has been made to make the performance impact minimal, but it
-   isn't nothing.
-
-## Breaking Changes in Version 7
-
-This library changed to a different algorithm and internal data
-structure in version 7, yielding significantly better
-performance, albeit with some subtle changes as a result.
-
-If you were relying on the internals of LRUCache in version 6 or
-before, it probably will not work in version 7 and above.
-
-For more info, see the [change log](CHANGELOG.md).
Index: uckSimulator-main/ds-db-ws/node_modules/lru-cache/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru-cache/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,869 +1,0 @@
-// Project: https://github.com/isaacs/node-lru-cache
-// Based initially on @types/lru-cache
-// https://github.com/DefinitelyTyped/DefinitelyTyped
-// used under the terms of the MIT License, shown below.
-//
-// DefinitelyTyped license:
-// ------
-// MIT License
-//
-// Copyright (c) Microsoft Corporation.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the "Software"),
-// to deal in the Software without restriction, including without limitation
-// the rights to use, copy, modify, merge, publish, distribute, sublicense,
-// and/or sell copies of the Software, and to permit persons to whom the
-// Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
-// ------
-//
-// Changes by Isaac Z. Schlueter released under the terms found in the
-// LICENSE file within this project.
-
-/**
- * Integer greater than 0, representing some number of milliseconds, or the
- * time at which a TTL started counting from.
- */
-declare type LRUMilliseconds = number
-
-/**
- * An integer greater than 0, reflecting the calculated size of items
- */
-declare type LRUSize = number
-
-/**
- * An integer greater than 0, reflecting a number of items
- */
-declare type LRUCount = number
-
-declare class LRUCache<K, V> implements Iterable<[K, V]> {
-  constructor(options: LRUCache.Options<K, V>)
-
-  /**
-   * Number of items in the cache.
-   * Alias for {@link size}
-   *
-   * @deprecated since 7.0 use {@link size} instead
-   */
-  public readonly length: LRUCount
-
-  public readonly max: LRUCount
-  public readonly maxSize: LRUSize
-  public readonly maxEntrySize: LRUSize
-  public readonly sizeCalculation:
-    | LRUCache.SizeCalculator<K, V>
-    | undefined
-  public readonly dispose: LRUCache.Disposer<K, V>
-  /**
-   * @since 7.4.0
-   */
-  public readonly disposeAfter: LRUCache.Disposer<K, V> | null
-  public readonly noDisposeOnSet: boolean
-  public readonly ttl: LRUMilliseconds
-  public readonly ttlResolution: LRUMilliseconds
-  public readonly ttlAutopurge: boolean
-  public readonly allowStale: boolean
-  public readonly updateAgeOnGet: boolean
-  /**
-   * @since 7.11.0
-   */
-  public readonly noDeleteOnStaleGet: boolean
-  /**
-   * @since 7.6.0
-   */
-  public readonly fetchMethod: LRUCache.Fetcher<K, V> | null
-
-  /**
-   * The total number of items held in the cache at the current moment.
-   */
-  public readonly size: LRUCount
-
-  /**
-   * The total size of items in cache when using size tracking.
-   */
-  public readonly calculatedSize: LRUSize
-
-  /**
-   * Add a value to the cache.
-   */
-  public set(
-    key: K,
-    value: V,
-    options?: LRUCache.SetOptions<K, V>
-  ): this
-
-  /**
-   * Return a value from the cache. Will update the recency of the cache entry
-   * found.
-   *
-   * If the key is not found, {@link get} will return `undefined`. This can be
-   * confusing when setting values specifically to `undefined`, as in
-   * `cache.set(key, undefined)`. Use {@link has} to determine whether a key is
-   * present in the cache at all.
-   */
-  public get(key: K, options?: LRUCache.GetOptions<V>): V | undefined
-
-  /**
-   * Like {@link get} but doesn't update recency or delete stale items.
-   * Returns `undefined` if the item is stale, unless {@link allowStale} is set
-   * either on the cache or in the options object.
-   */
-  public peek(key: K, options?: LRUCache.PeekOptions): V | undefined
-
-  /**
-   * Check if a key is in the cache, without updating the recency of use.
-   * Will return false if the item is stale, even though it is technically
-   * in the cache.
-   *
-   * Will not update item age unless {@link updateAgeOnHas} is set in the
-   * options or constructor.
-   */
-  public has(key: K, options?: LRUCache.HasOptions<V>): boolean
-
-  /**
-   * Deletes a key out of the cache.
-   * Returns true if the key was deleted, false otherwise.
-   */
-  public delete(key: K): boolean
-
-  /**
-   * Clear the cache entirely, throwing away all values.
-   */
-  public clear(): void
-
-  /**
-   * Delete any stale entries. Returns true if anything was removed, false
-   * otherwise.
-   */
-  public purgeStale(): boolean
-
-  /**
-   * Find a value for which the supplied fn method returns a truthy value,
-   * similar to Array.find().  fn is called as fn(value, key, cache).
-   */
-  public find(
-    callbackFn: (
-      value: V,
-      key: K,
-      cache: this
-    ) => boolean | undefined | void,
-    options?: LRUCache.GetOptions<V>
-  ): V | undefined
-
-  /**
-   * Call the supplied function on each item in the cache, in order from
-   * most recently used to least recently used.  fn is called as
-   * fn(value, key, cache).  Does not update age or recenty of use.
-   */
-  public forEach<T = this>(
-    callbackFn: (this: T, value: V, key: K, cache: this) => void,
-    thisArg?: T
-  ): void
-
-  /**
-   * The same as {@link forEach} but items are iterated over in reverse
-   * order.  (ie, less recently used items are iterated over first.)
-   */
-  public rforEach<T = this>(
-    callbackFn: (this: T, value: V, key: K, cache: this) => void,
-    thisArg?: T
-  ): void
-
-  /**
-   * Return a generator yielding the keys in the cache,
-   * in order from most recently used to least recently used.
-   */
-  public keys(): Generator<K, void, void>
-
-  /**
-   * Inverse order version of {@link keys}
-   *
-   * Return a generator yielding the keys in the cache,
-   * in order from least recently used to most recently used.
-   */
-  public rkeys(): Generator<K, void, void>
-
-  /**
-   * Return a generator yielding the values in the cache,
-   * in order from most recently used to least recently used.
-   */
-  public values(): Generator<V, void, void>
-
-  /**
-   * Inverse order version of {@link values}
-   *
-   * Return a generator yielding the values in the cache,
-   * in order from least recently used to most recently used.
-   */
-  public rvalues(): Generator<V, void, void>
-
-  /**
-   * Return a generator yielding `[key, value]` pairs,
-   * in order from most recently used to least recently used.
-   */
-  public entries(): Generator<[K, V], void, void>
-
-  /**
-   * Inverse order version of {@link entries}
-   *
-   * Return a generator yielding `[key, value]` pairs,
-   * in order from least recently used to most recently used.
-   */
-  public rentries(): Generator<[K, V], void, void>
-
-  /**
-   * Iterating over the cache itself yields the same results as
-   * {@link entries}
-   */
-  public [Symbol.iterator](): Generator<[K, V], void, void>
-
-  /**
-   * Return an array of [key, entry] objects which can be passed to
-   * cache.load()
-   */
-  public dump(): Array<[K, LRUCache.Entry<V>]>
-
-  /**
-   * Reset the cache and load in the items in entries in the order listed.
-   * Note that the shape of the resulting cache may be different if the
-   * same options are not used in both caches.
-   */
-  public load(
-    cacheEntries: ReadonlyArray<[K, LRUCache.Entry<V>]>
-  ): void
-
-  /**
-   * Evict the least recently used item, returning its value or `undefined`
-   * if cache is empty.
-   */
-  public pop(): V | undefined
-
-  /**
-   * Deletes a key out of the cache.
-   *
-   * @deprecated since 7.0 use delete() instead
-   */
-  public del(key: K): boolean
-
-  /**
-   * Clear the cache entirely, throwing away all values.
-   *
-   * @deprecated since 7.0 use clear() instead
-   */
-  public reset(): void
-
-  /**
-   * Manually iterates over the entire cache proactively pruning old entries.
-   *
-   * @deprecated since 7.0 use purgeStale() instead
-   */
-  public prune(): boolean
-
-  /**
-   * Make an asynchronous cached fetch using the {@link fetchMethod} function.
-   *
-   * If multiple fetches for the same key are issued, then they will all be
-   * coalesced into a single call to fetchMethod.
-   *
-   * Note that this means that handling options such as
-   * {@link allowStaleOnFetchAbort}, {@link signal}, and
-   * {@link allowStaleOnFetchRejection} will be determined by the FIRST fetch()
-   * call for a given key.
-   *
-   * This is a known (fixable) shortcoming which will be addresed on when
-   * someone complains about it, as the fix would involve added complexity and
-   * may not be worth the costs for this edge case.
-   *
-   * since: 7.6.0
-   */
-  public fetch(
-    key: K,
-    options?: LRUCache.FetchOptions<K, V>
-  ): Promise<V>
-
-  /**
-   * since: 7.6.0
-   */
-  public getRemainingTTL(key: K): LRUMilliseconds
-}
-
-declare namespace LRUCache {
-  type DisposeReason = 'evict' | 'set' | 'delete'
-
-  type SizeCalculator<K, V> = (value: V, key: K) => LRUSize
-  type Disposer<K, V> = (
-    value: V,
-    key: K,
-    reason: DisposeReason
-  ) => void
-  type Fetcher<K, V> = (
-    key: K,
-    staleValue: V | undefined,
-    options: FetcherOptions<K, V>
-  ) => Promise<V | void | undefined> | V | void | undefined
-
-  interface DeprecatedOptions<K, V> {
-    /**
-     * alias for ttl
-     *
-     * @deprecated since 7.0 use options.ttl instead
-     */
-    maxAge?: LRUMilliseconds
-
-    /**
-     * alias for {@link sizeCalculation}
-     *
-     * @deprecated since 7.0 use {@link sizeCalculation} instead
-     */
-    length?: SizeCalculator<K, V>
-
-    /**
-     * alias for allowStale
-     *
-     * @deprecated since 7.0 use options.allowStale instead
-     */
-    stale?: boolean
-  }
-
-  interface LimitedByCount {
-    /**
-     * The number of most recently used items to keep.
-     * Note that we may store fewer items than this if maxSize is hit.
-     */
-    max: LRUCount
-  }
-
-  type MaybeMaxEntrySizeLimit<K, V> =
-    | {
-        /**
-         * The maximum allowed size for any single item in the cache.
-         *
-         * If a larger item is passed to {@link set} or returned by a
-         * {@link fetchMethod}, then it will not be stored in the cache.
-         */
-        maxEntrySize: LRUSize
-        sizeCalculation?: SizeCalculator<K, V>
-      }
-    | {}
-
-  interface LimitedBySize<K, V> {
-    /**
-     * If you wish to track item size, you must provide a maxSize
-     * note that we still will only keep up to max *actual items*,
-     * if max is set, so size tracking may cause fewer than max items
-     * to be stored.  At the extreme, a single item of maxSize size
-     * will cause everything else in the cache to be dropped when it
-     * is added.  Use with caution!
-     *
-     * Note also that size tracking can negatively impact performance,
-     * though for most cases, only minimally.
-     */
-    maxSize: LRUSize
-
-    /**
-     * Function to calculate size of items.  Useful if storing strings or
-     * buffers or other items where memory size depends on the object itself.
-     *
-     * Items larger than {@link maxEntrySize} will not be stored in the cache.
-     *
-     * Note that when {@link maxSize} or {@link maxEntrySize} are set, every
-     * item added MUST have a size specified, either via a `sizeCalculation` in
-     * the constructor, or `sizeCalculation` or {@link size} options to
-     * {@link set}.
-     */
-    sizeCalculation?: SizeCalculator<K, V>
-  }
-
-  interface LimitedByTTL {
-    /**
-     * Max time in milliseconds for items to live in cache before they are
-     * considered stale.  Note that stale items are NOT preemptively removed
-     * by default, and MAY live in the cache, contributing to its LRU max,
-     * long after they have expired.
-     *
-     * Also, as this cache is optimized for LRU/MRU operations, some of
-     * the staleness/TTL checks will reduce performance, as they will incur
-     * overhead by deleting items.
-     *
-     * Must be an integer number of ms, defaults to 0, which means "no TTL"
-     */
-    ttl: LRUMilliseconds
-
-    /**
-     * Boolean flag to tell the cache to not update the TTL when
-     * setting a new value for an existing key (ie, when updating a value
-     * rather than inserting a new value).  Note that the TTL value is
-     * _always_ set (if provided) when adding a new entry into the cache.
-     *
-     * @default false
-     * @since 7.4.0
-     */
-    noUpdateTTL?: boolean
-
-    /**
-     * Minimum amount of time in ms in which to check for staleness.
-     * Defaults to 1, which means that the current time is checked
-     * at most once per millisecond.
-     *
-     * Set to 0 to check the current time every time staleness is tested.
-     * (This reduces performance, and is theoretically unnecessary.)
-     *
-     * Setting this to a higher value will improve performance somewhat
-     * while using ttl tracking, albeit at the expense of keeping stale
-     * items around a bit longer than their TTLs would indicate.
-     *
-     * @default 1
-     * @since 7.1.0
-     */
-    ttlResolution?: LRUMilliseconds
-
-    /**
-     * Preemptively remove stale items from the cache.
-     * Note that this may significantly degrade performance,
-     * especially if the cache is storing a large number of items.
-     * It is almost always best to just leave the stale items in
-     * the cache, and let them fall out as new items are added.
-     *
-     * Note that this means that {@link allowStale} is a bit pointless,
-     * as stale items will be deleted almost as soon as they expire.
-     *
-     * Use with caution!
-     *
-     * @default false
-     * @since 7.1.0
-     */
-    ttlAutopurge?: boolean
-
-    /**
-     * Return stale items from {@link get} before disposing of them.
-     * Return stale values from {@link fetch} while performing a call
-     * to the {@link fetchMethod} in the background.
-     *
-     * @default false
-     */
-    allowStale?: boolean
-
-    /**
-     * Update the age of items on {@link get}, renewing their TTL
-     *
-     * @default false
-     */
-    updateAgeOnGet?: boolean
-
-    /**
-     * Do not delete stale items when they are retrieved with {@link get}.
-     * Note that the {@link get} return value will still be `undefined` unless
-     * allowStale is true.
-     *
-     * @default false
-     * @since 7.11.0
-     */
-    noDeleteOnStaleGet?: boolean
-
-    /**
-     * Update the age of items on {@link has}, renewing their TTL
-     *
-     * @default false
-     */
-    updateAgeOnHas?: boolean
-  }
-
-  type SafetyBounds<K, V> =
-    | LimitedByCount
-    | LimitedBySize<K, V>
-    | LimitedByTTL
-
-  // options shared by all three of the limiting scenarios
-  interface SharedOptions<K, V> {
-    /**
-     * Function that is called on items when they are dropped from the cache.
-     * This can be handy if you want to close file descriptors or do other
-     * cleanup tasks when items are no longer accessible. Called with `key,
-     * value`.  It's called before actually removing the item from the
-     * internal cache, so it is *NOT* safe to re-add them.
-     * Use {@link disposeAfter} if you wish to dispose items after they have
-     * been full removed, when it is safe to add them back to the cache.
-     */
-    dispose?: Disposer<K, V>
-
-    /**
-     * The same as dispose, but called *after* the entry is completely
-     * removed and the cache is once again in a clean state.  It is safe to
-     * add an item right back into the cache at this point.
-     * However, note that it is *very* easy to inadvertently create infinite
-     * recursion this way.
-     *
-     * @since 7.3.0
-     */
-    disposeAfter?: Disposer<K, V>
-
-    /**
-     * Set to true to suppress calling the dispose() function if the entry
-     * key is still accessible within the cache.
-     * This may be overridden by passing an options object to {@link set}.
-     *
-     * @default false
-     */
-    noDisposeOnSet?: boolean
-
-    /**
-     * Function that is used to make background asynchronous fetches.  Called
-     * with `fetchMethod(key, staleValue, { signal, options, context })`.
-     *
-     * If `fetchMethod` is not provided, then {@link fetch} is
-     * equivalent to `Promise.resolve(cache.get(key))`.
-     *
-     * The `fetchMethod` should ONLY return `undefined` in cases where the
-     * abort controller has sent an abort signal.
-     *
-     * @since 7.6.0
-     */
-    fetchMethod?: LRUCache.Fetcher<K, V>
-
-    /**
-     * Set to true to suppress the deletion of stale data when a
-     * {@link fetchMethod} throws an error or returns a rejected promise
-     *
-     * This may be overridden in the {@link fetchMethod}.
-     *
-     * @default false
-     * @since 7.10.0
-     */
-    noDeleteOnFetchRejection?: boolean
-
-    /**
-     * Set to true to allow returning stale data when a {@link fetchMethod}
-     * throws an error or returns a rejected promise. Note that this
-     * differs from using {@link allowStale} in that stale data will
-     * ONLY be returned in the case that the fetch fails, not any other
-     * times.
-     *
-     * This may be overridden in the {@link fetchMethod}.
-     *
-     * @default false
-     * @since 7.16.0
-     */
-    allowStaleOnFetchRejection?: boolean
-
-    /**
-     *
-     * Set to true to ignore the `abort` event emitted by the `AbortSignal`
-     * object passed to {@link fetchMethod}, and still cache the
-     * resulting resolution value, as long as it is not `undefined`.
-     *
-     * When used on its own, this means aborted {@link fetch} calls are not
-     * immediately resolved or rejected when they are aborted, and instead take
-     * the full time to await.
-     *
-     * When used with {@link allowStaleOnFetchAbort}, aborted {@link fetch}
-     * calls will resolve immediately to their stale cached value or
-     * `undefined`, and will continue to process and eventually update the
-     * cache when they resolve, as long as the resulting value is not
-     * `undefined`, thus supporting a "return stale on timeout while
-     * refreshing" mechanism by passing `AbortSignal.timeout(n)` as the signal.
-     *
-     * **Note**: regardless of this setting, an `abort` event _is still emitted
-     * on the `AbortSignal` object_, so may result in invalid results when
-     * passed to other underlying APIs that use AbortSignals.
-     *
-     * This may be overridden in the {@link fetchMethod} or the call to
-     * {@link fetch}.
-     *
-     * @default false
-     * @since 7.17.0
-     */
-    ignoreFetchAbort?: boolean
-
-    /**
-     * Set to true to return a stale value from the cache when the
-     * `AbortSignal` passed to the {@link fetchMethod} dispatches an `'abort'`
-     * event, whether user-triggered, or due to internal cache behavior.
-     *
-     * Unless {@link ignoreFetchAbort} is also set, the underlying
-     * {@link fetchMethod} will still be considered canceled, and its return
-     * value will be ignored and not cached.
-     *
-     * This may be overridden in the {@link fetchMethod} or the call to
-     * {@link fetch}.
-     *
-     * @default false
-     * @since 7.17.0
-     */
-    allowStaleOnFetchAbort?: boolean
-
-    /**
-     * Set to any value in the constructor or {@link fetch} options to
-     * pass arbitrary data to the {@link fetchMethod} in the {@link context}
-     * options field.
-     *
-     * @since 7.12.0
-     */
-    fetchContext?: any
-  }
-
-  type Options<K, V> = SharedOptions<K, V> &
-    DeprecatedOptions<K, V> &
-    SafetyBounds<K, V> &
-    MaybeMaxEntrySizeLimit<K, V>
-
-  /**
-   * options which override the options set in the LRUCache constructor
-   * when making calling {@link set}.
-   */
-  interface SetOptions<K, V> {
-    /**
-     * A value for the size of the entry, prevents calls to
-     * {@link sizeCalculation}.
-     *
-     * Items larger than {@link maxEntrySize} will not be stored in the cache.
-     *
-     * Note that when {@link maxSize} or {@link maxEntrySize} are set, every
-     * item added MUST have a size specified, either via a `sizeCalculation` in
-     * the constructor, or {@link sizeCalculation} or `size` options to
-     * {@link set}.
-     */
-    size?: LRUSize
-    /**
-     * Overrides the {@link sizeCalculation} method set in the constructor.
-     *
-     * Items larger than {@link maxEntrySize} will not be stored in the cache.
-     *
-     * Note that when {@link maxSize} or {@link maxEntrySize} are set, every
-     * item added MUST have a size specified, either via a `sizeCalculation` in
-     * the constructor, or `sizeCalculation` or {@link size} options to
-     * {@link set}.
-     */
-    sizeCalculation?: SizeCalculator<K, V>
-    ttl?: LRUMilliseconds
-    start?: LRUMilliseconds
-    noDisposeOnSet?: boolean
-    noUpdateTTL?: boolean
-    status?: Status<V>
-  }
-
-  /**
-   * options which override the options set in the LRUCAche constructor
-   * when calling {@link has}.
-   */
-  interface HasOptions<V> {
-    updateAgeOnHas?: boolean
-    status: Status<V>
-  }
-
-  /**
-   * options which override the options set in the LRUCache constructor
-   * when calling {@link get}.
-   */
-  interface GetOptions<V> {
-    allowStale?: boolean
-    updateAgeOnGet?: boolean
-    noDeleteOnStaleGet?: boolean
-    status?: Status<V>
-  }
-
-  /**
-   * options which override the options set in the LRUCache constructor
-   * when calling {@link peek}.
-   */
-  interface PeekOptions {
-    allowStale?: boolean
-  }
-
-  /**
-   * Options object passed to the {@link fetchMethod}
-   *
-   * May be mutated by the {@link fetchMethod} to affect the behavior of the
-   * resulting {@link set} operation on resolution, or in the case of
-   * {@link noDeleteOnFetchRejection}, {@link ignoreFetchAbort}, and
-   * {@link allowStaleOnFetchRejection}, the handling of failure.
-   */
-  interface FetcherFetchOptions<K, V> {
-    allowStale?: boolean
-    updateAgeOnGet?: boolean
-    noDeleteOnStaleGet?: boolean
-    size?: LRUSize
-    sizeCalculation?: SizeCalculator<K, V>
-    ttl?: LRUMilliseconds
-    noDisposeOnSet?: boolean
-    noUpdateTTL?: boolean
-    noDeleteOnFetchRejection?: boolean
-    allowStaleOnFetchRejection?: boolean
-    ignoreFetchAbort?: boolean
-    allowStaleOnFetchAbort?: boolean
-    status?: Status<V>
-  }
-
-  /**
-   * Status object that may be passed to {@link fetch}, {@link get},
-   * {@link set}, and {@link has}.
-   */
-  interface Status<V> {
-    /**
-     * The status of a set() operation.
-     *
-     * - add: the item was not found in the cache, and was added
-     * - update: the item was in the cache, with the same value provided
-     * - replace: the item was in the cache, and replaced
-     * - miss: the item was not added to the cache for some reason
-     */
-    set?: 'add' | 'update' | 'replace' | 'miss'
-
-    /**
-     * the ttl stored for the item, or undefined if ttls are not used.
-     */
-    ttl?: LRUMilliseconds
-
-    /**
-     * the start time for the item, or undefined if ttls are not used.
-     */
-    start?: LRUMilliseconds
-
-    /**
-     * The timestamp used for TTL calculation
-     */
-    now?: LRUMilliseconds
-
-    /**
-     * the remaining ttl for the item, or undefined if ttls are not used.
-     */
-    remainingTTL?: LRUMilliseconds
-
-    /**
-     * The calculated size for the item, if sizes are used.
-     */
-    size?: LRUSize
-
-    /**
-     * A flag indicating that the item was not stored, due to exceeding the
-     * {@link maxEntrySize}
-     */
-    maxEntrySizeExceeded?: true
-
-    /**
-     * The old value, specified in the case of `set:'update'` or
-     * `set:'replace'`
-     */
-    oldValue?: V
-
-    /**
-     * The results of a {@link has} operation
-     *
-     * - hit: the item was found in the cache
-     * - stale: the item was found in the cache, but is stale
-     * - miss: the item was not found in the cache
-     */
-    has?: 'hit' | 'stale' | 'miss'
-
-    /**
-     * The status of a {@link fetch} operation.
-     * Note that this can change as the underlying fetch() moves through
-     * various states.
-     *
-     * - inflight: there is another fetch() for this key which is in process
-     * - get: there is no fetchMethod, so {@link get} was called.
-     * - miss: the item is not in cache, and will be fetched.
-     * - hit: the item is in the cache, and was resolved immediately.
-     * - stale: the item is in the cache, but stale.
-     * - refresh: the item is in the cache, and not stale, but
-     *   {@link forceRefresh} was specified.
-     */
-    fetch?: 'get' | 'inflight' | 'miss' | 'hit' | 'stale' | 'refresh'
-
-    /**
-     * The {@link fetchMethod} was called
-     */
-    fetchDispatched?: true
-
-    /**
-     * The cached value was updated after a successful call to fetchMethod
-     */
-    fetchUpdated?: true
-
-    /**
-     * The reason for a fetch() rejection.  Either the error raised by the
-     * {@link fetchMethod}, or the reason for an AbortSignal.
-     */
-    fetchError?: Error
-
-    /**
-     * The fetch received an abort signal
-     */
-    fetchAborted?: true
-
-    /**
-     * The abort signal received was ignored, and the fetch was allowed to
-     * continue.
-     */
-    fetchAbortIgnored?: true
-
-    /**
-     * The fetchMethod promise resolved successfully
-     */
-    fetchResolved?: true
-
-    /**
-     * The fetchMethod promise was rejected
-     */
-    fetchRejected?: true
-
-    /**
-     * The status of a {@link get} operation.
-     *
-     * - fetching: The item is currently being fetched.  If a previous value is
-     *   present and allowed, that will be returned.
-     * - stale: The item is in the cache, and is stale.
-     * - hit: the item is in the cache
-     * - miss: the item is not in the cache
-     */
-    get?: 'stale' | 'hit' | 'miss'
-
-    /**
-     * A fetch or get operation returned a stale value.
-     */
-    returnedStale?: true
-  }
-
-  /**
-   * options which override the options set in the LRUCache constructor
-   * when calling {@link fetch}.
-   *
-   * This is the union of GetOptions and SetOptions, plus
-   * {@link noDeleteOnFetchRejection}, {@link allowStaleOnFetchRejection},
-   * {@link forceRefresh}, and {@link fetchContext}
-   */
-  interface FetchOptions<K, V> extends FetcherFetchOptions<K, V> {
-    forceRefresh?: boolean
-    fetchContext?: any
-    signal?: AbortSignal
-    status?: Status<V>
-  }
-
-  interface FetcherOptions<K, V> {
-    signal: AbortSignal
-    options: FetcherFetchOptions<K, V>
-    /**
-     * Object provided in the {@link fetchContext} option
-     */
-    context: any
-  }
-
-  interface Entry<V> {
-    value: V
-    ttl?: LRUMilliseconds
-    size?: LRUSize
-    start?: LRUMilliseconds
-  }
-}
-
-export = LRUCache
Index: uckSimulator-main/ds-db-ws/node_modules/lru-cache/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru-cache/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1227 +1,0 @@
-const perf =
-  typeof performance === 'object' &&
-  performance &&
-  typeof performance.now === 'function'
-    ? performance
-    : Date
-
-const hasAbortController = typeof AbortController === 'function'
-
-// minimal backwards-compatibility polyfill
-// this doesn't have nearly all the checks and whatnot that
-// actual AbortController/Signal has, but it's enough for
-// our purposes, and if used properly, behaves the same.
-const AC = hasAbortController
-  ? AbortController
-  : class AbortController {
-      constructor() {
-        this.signal = new AS()
-      }
-      abort(reason = new Error('This operation was aborted')) {
-        this.signal.reason = this.signal.reason || reason
-        this.signal.aborted = true
-        this.signal.dispatchEvent({
-          type: 'abort',
-          target: this.signal,
-        })
-      }
-    }
-
-const hasAbortSignal = typeof AbortSignal === 'function'
-// Some polyfills put this on the AC class, not global
-const hasACAbortSignal = typeof AC.AbortSignal === 'function'
-const AS = hasAbortSignal
-  ? AbortSignal
-  : hasACAbortSignal
-  ? AC.AbortController
-  : class AbortSignal {
-      constructor() {
-        this.reason = undefined
-        this.aborted = false
-        this._listeners = []
-      }
-      dispatchEvent(e) {
-        if (e.type === 'abort') {
-          this.aborted = true
-          this.onabort(e)
-          this._listeners.forEach(f => f(e), this)
-        }
-      }
-      onabort() {}
-      addEventListener(ev, fn) {
-        if (ev === 'abort') {
-          this._listeners.push(fn)
-        }
-      }
-      removeEventListener(ev, fn) {
-        if (ev === 'abort') {
-          this._listeners = this._listeners.filter(f => f !== fn)
-        }
-      }
-    }
-
-const warned = new Set()
-const deprecatedOption = (opt, instead) => {
-  const code = `LRU_CACHE_OPTION_${opt}`
-  if (shouldWarn(code)) {
-    warn(code, `${opt} option`, `options.${instead}`, LRUCache)
-  }
-}
-const deprecatedMethod = (method, instead) => {
-  const code = `LRU_CACHE_METHOD_${method}`
-  if (shouldWarn(code)) {
-    const { prototype } = LRUCache
-    const { get } = Object.getOwnPropertyDescriptor(prototype, method)
-    warn(code, `${method} method`, `cache.${instead}()`, get)
-  }
-}
-const deprecatedProperty = (field, instead) => {
-  const code = `LRU_CACHE_PROPERTY_${field}`
-  if (shouldWarn(code)) {
-    const { prototype } = LRUCache
-    const { get } = Object.getOwnPropertyDescriptor(prototype, field)
-    warn(code, `${field} property`, `cache.${instead}`, get)
-  }
-}
-
-const emitWarning = (...a) => {
-  typeof process === 'object' &&
-  process &&
-  typeof process.emitWarning === 'function'
-    ? process.emitWarning(...a)
-    : console.error(...a)
-}
-
-const shouldWarn = code => !warned.has(code)
-
-const warn = (code, what, instead, fn) => {
-  warned.add(code)
-  const msg = `The ${what} is deprecated. Please use ${instead} instead.`
-  emitWarning(msg, 'DeprecationWarning', code, fn)
-}
-
-const isPosInt = n => n && n === Math.floor(n) && n > 0 && isFinite(n)
-
-/* istanbul ignore next - This is a little bit ridiculous, tbh.
- * The maximum array length is 2^32-1 or thereabouts on most JS impls.
- * And well before that point, you're caching the entire world, I mean,
- * that's ~32GB of just integers for the next/prev links, plus whatever
- * else to hold that many keys and values.  Just filling the memory with
- * zeroes at init time is brutal when you get that big.
- * But why not be complete?
- * Maybe in the future, these limits will have expanded. */
-const getUintArray = max =>
-  !isPosInt(max)
-    ? null
-    : max <= Math.pow(2, 8)
-    ? Uint8Array
-    : max <= Math.pow(2, 16)
-    ? Uint16Array
-    : max <= Math.pow(2, 32)
-    ? Uint32Array
-    : max <= Number.MAX_SAFE_INTEGER
-    ? ZeroArray
-    : null
-
-class ZeroArray extends Array {
-  constructor(size) {
-    super(size)
-    this.fill(0)
-  }
-}
-
-class Stack {
-  constructor(max) {
-    if (max === 0) {
-      return []
-    }
-    const UintArray = getUintArray(max)
-    this.heap = new UintArray(max)
-    this.length = 0
-  }
-  push(n) {
-    this.heap[this.length++] = n
-  }
-  pop() {
-    return this.heap[--this.length]
-  }
-}
-
-class LRUCache {
-  constructor(options = {}) {
-    const {
-      max = 0,
-      ttl,
-      ttlResolution = 1,
-      ttlAutopurge,
-      updateAgeOnGet,
-      updateAgeOnHas,
-      allowStale,
-      dispose,
-      disposeAfter,
-      noDisposeOnSet,
-      noUpdateTTL,
-      maxSize = 0,
-      maxEntrySize = 0,
-      sizeCalculation,
-      fetchMethod,
-      fetchContext,
-      noDeleteOnFetchRejection,
-      noDeleteOnStaleGet,
-      allowStaleOnFetchRejection,
-      allowStaleOnFetchAbort,
-      ignoreFetchAbort,
-    } = options
-
-    // deprecated options, don't trigger a warning for getting them if
-    // the thing being passed in is another LRUCache we're copying.
-    const { length, maxAge, stale } =
-      options instanceof LRUCache ? {} : options
-
-    if (max !== 0 && !isPosInt(max)) {
-      throw new TypeError('max option must be a nonnegative integer')
-    }
-
-    const UintArray = max ? getUintArray(max) : Array
-    if (!UintArray) {
-      throw new Error('invalid max value: ' + max)
-    }
-
-    this.max = max
-    this.maxSize = maxSize
-    this.maxEntrySize = maxEntrySize || this.maxSize
-    this.sizeCalculation = sizeCalculation || length
-    if (this.sizeCalculation) {
-      if (!this.maxSize && !this.maxEntrySize) {
-        throw new TypeError(
-          'cannot set sizeCalculation without setting maxSize or maxEntrySize'
-        )
-      }
-      if (typeof this.sizeCalculation !== 'function') {
-        throw new TypeError('sizeCalculation set to non-function')
-      }
-    }
-
-    this.fetchMethod = fetchMethod || null
-    if (this.fetchMethod && typeof this.fetchMethod !== 'function') {
-      throw new TypeError(
-        'fetchMethod must be a function if specified'
-      )
-    }
-
-    this.fetchContext = fetchContext
-    if (!this.fetchMethod && fetchContext !== undefined) {
-      throw new TypeError(
-        'cannot set fetchContext without fetchMethod'
-      )
-    }
-
-    this.keyMap = new Map()
-    this.keyList = new Array(max).fill(null)
-    this.valList = new Array(max).fill(null)
-    this.next = new UintArray(max)
-    this.prev = new UintArray(max)
-    this.head = 0
-    this.tail = 0
-    this.free = new Stack(max)
-    this.initialFill = 1
-    this.size = 0
-
-    if (typeof dispose === 'function') {
-      this.dispose = dispose
-    }
-    if (typeof disposeAfter === 'function') {
-      this.disposeAfter = disposeAfter
-      this.disposed = []
-    } else {
-      this.disposeAfter = null
-      this.disposed = null
-    }
-    this.noDisposeOnSet = !!noDisposeOnSet
-    this.noUpdateTTL = !!noUpdateTTL
-    this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection
-    this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection
-    this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort
-    this.ignoreFetchAbort = !!ignoreFetchAbort
-
-    // NB: maxEntrySize is set to maxSize if it's set
-    if (this.maxEntrySize !== 0) {
-      if (this.maxSize !== 0) {
-        if (!isPosInt(this.maxSize)) {
-          throw new TypeError(
-            'maxSize must be a positive integer if specified'
-          )
-        }
-      }
-      if (!isPosInt(this.maxEntrySize)) {
-        throw new TypeError(
-          'maxEntrySize must be a positive integer if specified'
-        )
-      }
-      this.initializeSizeTracking()
-    }
-
-    this.allowStale = !!allowStale || !!stale
-    this.noDeleteOnStaleGet = !!noDeleteOnStaleGet
-    this.updateAgeOnGet = !!updateAgeOnGet
-    this.updateAgeOnHas = !!updateAgeOnHas
-    this.ttlResolution =
-      isPosInt(ttlResolution) || ttlResolution === 0
-        ? ttlResolution
-        : 1
-    this.ttlAutopurge = !!ttlAutopurge
-    this.ttl = ttl || maxAge || 0
-    if (this.ttl) {
-      if (!isPosInt(this.ttl)) {
-        throw new TypeError(
-          'ttl must be a positive integer if specified'
-        )
-      }
-      this.initializeTTLTracking()
-    }
-
-    // do not allow completely unbounded caches
-    if (this.max === 0 && this.ttl === 0 && this.maxSize === 0) {
-      throw new TypeError(
-        'At least one of max, maxSize, or ttl is required'
-      )
-    }
-    if (!this.ttlAutopurge && !this.max && !this.maxSize) {
-      const code = 'LRU_CACHE_UNBOUNDED'
-      if (shouldWarn(code)) {
-        warned.add(code)
-        const msg =
-          'TTL caching without ttlAutopurge, max, or maxSize can ' +
-          'result in unbounded memory consumption.'
-        emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)
-      }
-    }
-
-    if (stale) {
-      deprecatedOption('stale', 'allowStale')
-    }
-    if (maxAge) {
-      deprecatedOption('maxAge', 'ttl')
-    }
-    if (length) {
-      deprecatedOption('length', 'sizeCalculation')
-    }
-  }
-
-  getRemainingTTL(key) {
-    return this.has(key, { updateAgeOnHas: false }) ? Infinity : 0
-  }
-
-  initializeTTLTracking() {
-    this.ttls = new ZeroArray(this.max)
-    this.starts = new ZeroArray(this.max)
-
-    this.setItemTTL = (index, ttl, start = perf.now()) => {
-      this.starts[index] = ttl !== 0 ? start : 0
-      this.ttls[index] = ttl
-      if (ttl !== 0 && this.ttlAutopurge) {
-        const t = setTimeout(() => {
-          if (this.isStale(index)) {
-            this.delete(this.keyList[index])
-          }
-        }, ttl + 1)
-        /* istanbul ignore else - unref() not supported on all platforms */
-        if (t.unref) {
-          t.unref()
-        }
-      }
-    }
-
-    this.updateItemAge = index => {
-      this.starts[index] = this.ttls[index] !== 0 ? perf.now() : 0
-    }
-
-    this.statusTTL = (status, index) => {
-      if (status) {
-        status.ttl = this.ttls[index]
-        status.start = this.starts[index]
-        status.now = cachedNow || getNow()
-        status.remainingTTL = status.now + status.ttl - status.start
-      }
-    }
-
-    // debounce calls to perf.now() to 1s so we're not hitting
-    // that costly call repeatedly.
-    let cachedNow = 0
-    const getNow = () => {
-      const n = perf.now()
-      if (this.ttlResolution > 0) {
-        cachedNow = n
-        const t = setTimeout(
-          () => (cachedNow = 0),
-          this.ttlResolution
-        )
-        /* istanbul ignore else - not available on all platforms */
-        if (t.unref) {
-          t.unref()
-        }
-      }
-      return n
-    }
-
-    this.getRemainingTTL = key => {
-      const index = this.keyMap.get(key)
-      if (index === undefined) {
-        return 0
-      }
-      return this.ttls[index] === 0 || this.starts[index] === 0
-        ? Infinity
-        : this.starts[index] +
-            this.ttls[index] -
-            (cachedNow || getNow())
-    }
-
-    this.isStale = index => {
-      return (
-        this.ttls[index] !== 0 &&
-        this.starts[index] !== 0 &&
-        (cachedNow || getNow()) - this.starts[index] >
-          this.ttls[index]
-      )
-    }
-  }
-  updateItemAge(_index) {}
-  statusTTL(_status, _index) {}
-  setItemTTL(_index, _ttl, _start) {}
-  isStale(_index) {
-    return false
-  }
-
-  initializeSizeTracking() {
-    this.calculatedSize = 0
-    this.sizes = new ZeroArray(this.max)
-    this.removeItemSize = index => {
-      this.calculatedSize -= this.sizes[index]
-      this.sizes[index] = 0
-    }
-    this.requireSize = (k, v, size, sizeCalculation) => {
-      // provisionally accept background fetches.
-      // actual value size will be checked when they return.
-      if (this.isBackgroundFetch(v)) {
-        return 0
-      }
-      if (!isPosInt(size)) {
-        if (sizeCalculation) {
-          if (typeof sizeCalculation !== 'function') {
-            throw new TypeError('sizeCalculation must be a function')
-          }
-          size = sizeCalculation(v, k)
-          if (!isPosInt(size)) {
-            throw new TypeError(
-              'sizeCalculation return invalid (expect positive integer)'
-            )
-          }
-        } else {
-          throw new TypeError(
-            'invalid size value (must be positive integer). ' +
-              'When maxSize or maxEntrySize is used, sizeCalculation or size ' +
-              'must be set.'
-          )
-        }
-      }
-      return size
-    }
-    this.addItemSize = (index, size, status) => {
-      this.sizes[index] = size
-      if (this.maxSize) {
-        const maxSize = this.maxSize - this.sizes[index]
-        while (this.calculatedSize > maxSize) {
-          this.evict(true)
-        }
-      }
-      this.calculatedSize += this.sizes[index]
-      if (status) {
-        status.entrySize = size
-        status.totalCalculatedSize = this.calculatedSize
-      }
-    }
-  }
-  removeItemSize(_index) {}
-  addItemSize(_index, _size) {}
-  requireSize(_k, _v, size, sizeCalculation) {
-    if (size || sizeCalculation) {
-      throw new TypeError(
-        'cannot set size without setting maxSize or maxEntrySize on cache'
-      )
-    }
-  }
-
-  *indexes({ allowStale = this.allowStale } = {}) {
-    if (this.size) {
-      for (let i = this.tail; true; ) {
-        if (!this.isValidIndex(i)) {
-          break
-        }
-        if (allowStale || !this.isStale(i)) {
-          yield i
-        }
-        if (i === this.head) {
-          break
-        } else {
-          i = this.prev[i]
-        }
-      }
-    }
-  }
-
-  *rindexes({ allowStale = this.allowStale } = {}) {
-    if (this.size) {
-      for (let i = this.head; true; ) {
-        if (!this.isValidIndex(i)) {
-          break
-        }
-        if (allowStale || !this.isStale(i)) {
-          yield i
-        }
-        if (i === this.tail) {
-          break
-        } else {
-          i = this.next[i]
-        }
-      }
-    }
-  }
-
-  isValidIndex(index) {
-    return (
-      index !== undefined &&
-      this.keyMap.get(this.keyList[index]) === index
-    )
-  }
-
-  *entries() {
-    for (const i of this.indexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield [this.keyList[i], this.valList[i]]
-      }
-    }
-  }
-  *rentries() {
-    for (const i of this.rindexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield [this.keyList[i], this.valList[i]]
-      }
-    }
-  }
-
-  *keys() {
-    for (const i of this.indexes()) {
-      if (
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.keyList[i]
-      }
-    }
-  }
-  *rkeys() {
-    for (const i of this.rindexes()) {
-      if (
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.keyList[i]
-      }
-    }
-  }
-
-  *values() {
-    for (const i of this.indexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.valList[i]
-      }
-    }
-  }
-  *rvalues() {
-    for (const i of this.rindexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.valList[i]
-      }
-    }
-  }
-
-  [Symbol.iterator]() {
-    return this.entries()
-  }
-
-  find(fn, getOptions) {
-    for (const i of this.indexes()) {
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      if (fn(value, this.keyList[i], this)) {
-        return this.get(this.keyList[i], getOptions)
-      }
-    }
-  }
-
-  forEach(fn, thisp = this) {
-    for (const i of this.indexes()) {
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      fn.call(thisp, value, this.keyList[i], this)
-    }
-  }
-
-  rforEach(fn, thisp = this) {
-    for (const i of this.rindexes()) {
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      fn.call(thisp, value, this.keyList[i], this)
-    }
-  }
-
-  get prune() {
-    deprecatedMethod('prune', 'purgeStale')
-    return this.purgeStale
-  }
-
-  purgeStale() {
-    let deleted = false
-    for (const i of this.rindexes({ allowStale: true })) {
-      if (this.isStale(i)) {
-        this.delete(this.keyList[i])
-        deleted = true
-      }
-    }
-    return deleted
-  }
-
-  dump() {
-    const arr = []
-    for (const i of this.indexes({ allowStale: true })) {
-      const key = this.keyList[i]
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      const entry = { value }
-      if (this.ttls) {
-        entry.ttl = this.ttls[i]
-        // always dump the start relative to a portable timestamp
-        // it's ok for this to be a bit slow, it's a rare operation.
-        const age = perf.now() - this.starts[i]
-        entry.start = Math.floor(Date.now() - age)
-      }
-      if (this.sizes) {
-        entry.size = this.sizes[i]
-      }
-      arr.unshift([key, entry])
-    }
-    return arr
-  }
-
-  load(arr) {
-    this.clear()
-    for (const [key, entry] of arr) {
-      if (entry.start) {
-        // entry.start is a portable timestamp, but we may be using
-        // node's performance.now(), so calculate the offset.
-        // it's ok for this to be a bit slow, it's a rare operation.
-        const age = Date.now() - entry.start
-        entry.start = perf.now() - age
-      }
-      this.set(key, entry.value, entry)
-    }
-  }
-
-  dispose(_v, _k, _reason) {}
-
-  set(
-    k,
-    v,
-    {
-      ttl = this.ttl,
-      start,
-      noDisposeOnSet = this.noDisposeOnSet,
-      size = 0,
-      sizeCalculation = this.sizeCalculation,
-      noUpdateTTL = this.noUpdateTTL,
-      status,
-    } = {}
-  ) {
-    size = this.requireSize(k, v, size, sizeCalculation)
-    // if the item doesn't fit, don't do anything
-    // NB: maxEntrySize set to maxSize by default
-    if (this.maxEntrySize && size > this.maxEntrySize) {
-      if (status) {
-        status.set = 'miss'
-        status.maxEntrySizeExceeded = true
-      }
-      // have to delete, in case a background fetch is there already.
-      // in non-async cases, this is a no-op
-      this.delete(k)
-      return this
-    }
-    let index = this.size === 0 ? undefined : this.keyMap.get(k)
-    if (index === undefined) {
-      // addition
-      index = this.newIndex()
-      this.keyList[index] = k
-      this.valList[index] = v
-      this.keyMap.set(k, index)
-      this.next[this.tail] = index
-      this.prev[index] = this.tail
-      this.tail = index
-      this.size++
-      this.addItemSize(index, size, status)
-      if (status) {
-        status.set = 'add'
-      }
-      noUpdateTTL = false
-    } else {
-      // update
-      this.moveToTail(index)
-      const oldVal = this.valList[index]
-      if (v !== oldVal) {
-        if (this.isBackgroundFetch(oldVal)) {
-          oldVal.__abortController.abort(new Error('replaced'))
-        } else {
-          if (!noDisposeOnSet) {
-            this.dispose(oldVal, k, 'set')
-            if (this.disposeAfter) {
-              this.disposed.push([oldVal, k, 'set'])
-            }
-          }
-        }
-        this.removeItemSize(index)
-        this.valList[index] = v
-        this.addItemSize(index, size, status)
-        if (status) {
-          status.set = 'replace'
-          const oldValue =
-            oldVal && this.isBackgroundFetch(oldVal)
-              ? oldVal.__staleWhileFetching
-              : oldVal
-          if (oldValue !== undefined) status.oldValue = oldValue
-        }
-      } else if (status) {
-        status.set = 'update'
-      }
-    }
-    if (ttl !== 0 && this.ttl === 0 && !this.ttls) {
-      this.initializeTTLTracking()
-    }
-    if (!noUpdateTTL) {
-      this.setItemTTL(index, ttl, start)
-    }
-    this.statusTTL(status, index)
-    if (this.disposeAfter) {
-      while (this.disposed.length) {
-        this.disposeAfter(...this.disposed.shift())
-      }
-    }
-    return this
-  }
-
-  newIndex() {
-    if (this.size === 0) {
-      return this.tail
-    }
-    if (this.size === this.max && this.max !== 0) {
-      return this.evict(false)
-    }
-    if (this.free.length !== 0) {
-      return this.free.pop()
-    }
-    // initial fill, just keep writing down the list
-    return this.initialFill++
-  }
-
-  pop() {
-    if (this.size) {
-      const val = this.valList[this.head]
-      this.evict(true)
-      return val
-    }
-  }
-
-  evict(free) {
-    const head = this.head
-    const k = this.keyList[head]
-    const v = this.valList[head]
-    if (this.isBackgroundFetch(v)) {
-      v.__abortController.abort(new Error('evicted'))
-    } else {
-      this.dispose(v, k, 'evict')
-      if (this.disposeAfter) {
-        this.disposed.push([v, k, 'evict'])
-      }
-    }
-    this.removeItemSize(head)
-    // if we aren't about to use the index, then null these out
-    if (free) {
-      this.keyList[head] = null
-      this.valList[head] = null
-      this.free.push(head)
-    }
-    this.head = this.next[head]
-    this.keyMap.delete(k)
-    this.size--
-    return head
-  }
-
-  has(k, { updateAgeOnHas = this.updateAgeOnHas, status } = {}) {
-    const index = this.keyMap.get(k)
-    if (index !== undefined) {
-      if (!this.isStale(index)) {
-        if (updateAgeOnHas) {
-          this.updateItemAge(index)
-        }
-        if (status) status.has = 'hit'
-        this.statusTTL(status, index)
-        return true
-      } else if (status) {
-        status.has = 'stale'
-        this.statusTTL(status, index)
-      }
-    } else if (status) {
-      status.has = 'miss'
-    }
-    return false
-  }
-
-  // like get(), but without any LRU updating or TTL expiration
-  peek(k, { allowStale = this.allowStale } = {}) {
-    const index = this.keyMap.get(k)
-    if (index !== undefined && (allowStale || !this.isStale(index))) {
-      const v = this.valList[index]
-      // either stale and allowed, or forcing a refresh of non-stale value
-      return this.isBackgroundFetch(v) ? v.__staleWhileFetching : v
-    }
-  }
-
-  backgroundFetch(k, index, options, context) {
-    const v = index === undefined ? undefined : this.valList[index]
-    if (this.isBackgroundFetch(v)) {
-      return v
-    }
-    const ac = new AC()
-    if (options.signal) {
-      options.signal.addEventListener('abort', () =>
-        ac.abort(options.signal.reason)
-      )
-    }
-    const fetchOpts = {
-      signal: ac.signal,
-      options,
-      context,
-    }
-    const cb = (v, updateCache = false) => {
-      const { aborted } = ac.signal
-      const ignoreAbort = options.ignoreFetchAbort && v !== undefined
-      if (options.status) {
-        if (aborted && !updateCache) {
-          options.status.fetchAborted = true
-          options.status.fetchError = ac.signal.reason
-          if (ignoreAbort) options.status.fetchAbortIgnored = true
-        } else {
-          options.status.fetchResolved = true
-        }
-      }
-      if (aborted && !ignoreAbort && !updateCache) {
-        return fetchFail(ac.signal.reason)
-      }
-      // either we didn't abort, and are still here, or we did, and ignored
-      if (this.valList[index] === p) {
-        if (v === undefined) {
-          if (p.__staleWhileFetching) {
-            this.valList[index] = p.__staleWhileFetching
-          } else {
-            this.delete(k)
-          }
-        } else {
-          if (options.status) options.status.fetchUpdated = true
-          this.set(k, v, fetchOpts.options)
-        }
-      }
-      return v
-    }
-    const eb = er => {
-      if (options.status) {
-        options.status.fetchRejected = true
-        options.status.fetchError = er
-      }
-      return fetchFail(er)
-    }
-    const fetchFail = er => {
-      const { aborted } = ac.signal
-      const allowStaleAborted =
-        aborted && options.allowStaleOnFetchAbort
-      const allowStale =
-        allowStaleAborted || options.allowStaleOnFetchRejection
-      const noDelete = allowStale || options.noDeleteOnFetchRejection
-      if (this.valList[index] === p) {
-        // if we allow stale on fetch rejections, then we need to ensure that
-        // the stale value is not removed from the cache when the fetch fails.
-        const del = !noDelete || p.__staleWhileFetching === undefined
-        if (del) {
-          this.delete(k)
-        } else if (!allowStaleAborted) {
-          // still replace the *promise* with the stale value,
-          // since we are done with the promise at this point.
-          // leave it untouched if we're still waiting for an
-          // aborted background fetch that hasn't yet returned.
-          this.valList[index] = p.__staleWhileFetching
-        }
-      }
-      if (allowStale) {
-        if (options.status && p.__staleWhileFetching !== undefined) {
-          options.status.returnedStale = true
-        }
-        return p.__staleWhileFetching
-      } else if (p.__returned === p) {
-        throw er
-      }
-    }
-    const pcall = (res, rej) => {
-      this.fetchMethod(k, v, fetchOpts).then(v => res(v), rej)
-      // ignored, we go until we finish, regardless.
-      // defer check until we are actually aborting,
-      // so fetchMethod can override.
-      ac.signal.addEventListener('abort', () => {
-        if (
-          !options.ignoreFetchAbort ||
-          options.allowStaleOnFetchAbort
-        ) {
-          res()
-          // when it eventually resolves, update the cache.
-          if (options.allowStaleOnFetchAbort) {
-            res = v => cb(v, true)
-          }
-        }
-      })
-    }
-    if (options.status) options.status.fetchDispatched = true
-    const p = new Promise(pcall).then(cb, eb)
-    p.__abortController = ac
-    p.__staleWhileFetching = v
-    p.__returned = null
-    if (index === undefined) {
-      // internal, don't expose status.
-      this.set(k, p, { ...fetchOpts.options, status: undefined })
-      index = this.keyMap.get(k)
-    } else {
-      this.valList[index] = p
-    }
-    return p
-  }
-
-  isBackgroundFetch(p) {
-    return (
-      p &&
-      typeof p === 'object' &&
-      typeof p.then === 'function' &&
-      Object.prototype.hasOwnProperty.call(
-        p,
-        '__staleWhileFetching'
-      ) &&
-      Object.prototype.hasOwnProperty.call(p, '__returned') &&
-      (p.__returned === p || p.__returned === null)
-    )
-  }
-
-  // this takes the union of get() and set() opts, because it does both
-  async fetch(
-    k,
-    {
-      // get options
-      allowStale = this.allowStale,
-      updateAgeOnGet = this.updateAgeOnGet,
-      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
-      // set options
-      ttl = this.ttl,
-      noDisposeOnSet = this.noDisposeOnSet,
-      size = 0,
-      sizeCalculation = this.sizeCalculation,
-      noUpdateTTL = this.noUpdateTTL,
-      // fetch exclusive options
-      noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,
-      allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,
-      ignoreFetchAbort = this.ignoreFetchAbort,
-      allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,
-      fetchContext = this.fetchContext,
-      forceRefresh = false,
-      status,
-      signal,
-    } = {}
-  ) {
-    if (!this.fetchMethod) {
-      if (status) status.fetch = 'get'
-      return this.get(k, {
-        allowStale,
-        updateAgeOnGet,
-        noDeleteOnStaleGet,
-        status,
-      })
-    }
-
-    const options = {
-      allowStale,
-      updateAgeOnGet,
-      noDeleteOnStaleGet,
-      ttl,
-      noDisposeOnSet,
-      size,
-      sizeCalculation,
-      noUpdateTTL,
-      noDeleteOnFetchRejection,
-      allowStaleOnFetchRejection,
-      allowStaleOnFetchAbort,
-      ignoreFetchAbort,
-      status,
-      signal,
-    }
-
-    let index = this.keyMap.get(k)
-    if (index === undefined) {
-      if (status) status.fetch = 'miss'
-      const p = this.backgroundFetch(k, index, options, fetchContext)
-      return (p.__returned = p)
-    } else {
-      // in cache, maybe already fetching
-      const v = this.valList[index]
-      if (this.isBackgroundFetch(v)) {
-        const stale =
-          allowStale && v.__staleWhileFetching !== undefined
-        if (status) {
-          status.fetch = 'inflight'
-          if (stale) status.returnedStale = true
-        }
-        return stale ? v.__staleWhileFetching : (v.__returned = v)
-      }
-
-      // if we force a refresh, that means do NOT serve the cached value,
-      // unless we are already in the process of refreshing the cache.
-      const isStale = this.isStale(index)
-      if (!forceRefresh && !isStale) {
-        if (status) status.fetch = 'hit'
-        this.moveToTail(index)
-        if (updateAgeOnGet) {
-          this.updateItemAge(index)
-        }
-        this.statusTTL(status, index)
-        return v
-      }
-
-      // ok, it is stale or a forced refresh, and not already fetching.
-      // refresh the cache.
-      const p = this.backgroundFetch(k, index, options, fetchContext)
-      const hasStale = p.__staleWhileFetching !== undefined
-      const staleVal = hasStale && allowStale
-      if (status) {
-        status.fetch = hasStale && isStale ? 'stale' : 'refresh'
-        if (staleVal && isStale) status.returnedStale = true
-      }
-      return staleVal ? p.__staleWhileFetching : (p.__returned = p)
-    }
-  }
-
-  get(
-    k,
-    {
-      allowStale = this.allowStale,
-      updateAgeOnGet = this.updateAgeOnGet,
-      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
-      status,
-    } = {}
-  ) {
-    const index = this.keyMap.get(k)
-    if (index !== undefined) {
-      const value = this.valList[index]
-      const fetching = this.isBackgroundFetch(value)
-      this.statusTTL(status, index)
-      if (this.isStale(index)) {
-        if (status) status.get = 'stale'
-        // delete only if not an in-flight background fetch
-        if (!fetching) {
-          if (!noDeleteOnStaleGet) {
-            this.delete(k)
-          }
-          if (status) status.returnedStale = allowStale
-          return allowStale ? value : undefined
-        } else {
-          if (status) {
-            status.returnedStale =
-              allowStale && value.__staleWhileFetching !== undefined
-          }
-          return allowStale ? value.__staleWhileFetching : undefined
-        }
-      } else {
-        if (status) status.get = 'hit'
-        // if we're currently fetching it, we don't actually have it yet
-        // it's not stale, which means this isn't a staleWhileRefetching.
-        // If it's not stale, and fetching, AND has a __staleWhileFetching
-        // value, then that means the user fetched with {forceRefresh:true},
-        // so it's safe to return that value.
-        if (fetching) {
-          return value.__staleWhileFetching
-        }
-        this.moveToTail(index)
-        if (updateAgeOnGet) {
-          this.updateItemAge(index)
-        }
-        return value
-      }
-    } else if (status) {
-      status.get = 'miss'
-    }
-  }
-
-  connect(p, n) {
-    this.prev[n] = p
-    this.next[p] = n
-  }
-
-  moveToTail(index) {
-    // if tail already, nothing to do
-    // if head, move head to next[index]
-    // else
-    //   move next[prev[index]] to next[index] (head has no prev)
-    //   move prev[next[index]] to prev[index]
-    // prev[index] = tail
-    // next[tail] = index
-    // tail = index
-    if (index !== this.tail) {
-      if (index === this.head) {
-        this.head = this.next[index]
-      } else {
-        this.connect(this.prev[index], this.next[index])
-      }
-      this.connect(this.tail, index)
-      this.tail = index
-    }
-  }
-
-  get del() {
-    deprecatedMethod('del', 'delete')
-    return this.delete
-  }
-
-  delete(k) {
-    let deleted = false
-    if (this.size !== 0) {
-      const index = this.keyMap.get(k)
-      if (index !== undefined) {
-        deleted = true
-        if (this.size === 1) {
-          this.clear()
-        } else {
-          this.removeItemSize(index)
-          const v = this.valList[index]
-          if (this.isBackgroundFetch(v)) {
-            v.__abortController.abort(new Error('deleted'))
-          } else {
-            this.dispose(v, k, 'delete')
-            if (this.disposeAfter) {
-              this.disposed.push([v, k, 'delete'])
-            }
-          }
-          this.keyMap.delete(k)
-          this.keyList[index] = null
-          this.valList[index] = null
-          if (index === this.tail) {
-            this.tail = this.prev[index]
-          } else if (index === this.head) {
-            this.head = this.next[index]
-          } else {
-            this.next[this.prev[index]] = this.next[index]
-            this.prev[this.next[index]] = this.prev[index]
-          }
-          this.size--
-          this.free.push(index)
-        }
-      }
-    }
-    if (this.disposed) {
-      while (this.disposed.length) {
-        this.disposeAfter(...this.disposed.shift())
-      }
-    }
-    return deleted
-  }
-
-  clear() {
-    for (const index of this.rindexes({ allowStale: true })) {
-      const v = this.valList[index]
-      if (this.isBackgroundFetch(v)) {
-        v.__abortController.abort(new Error('deleted'))
-      } else {
-        const k = this.keyList[index]
-        this.dispose(v, k, 'delete')
-        if (this.disposeAfter) {
-          this.disposed.push([v, k, 'delete'])
-        }
-      }
-    }
-
-    this.keyMap.clear()
-    this.valList.fill(null)
-    this.keyList.fill(null)
-    if (this.ttls) {
-      this.ttls.fill(0)
-      this.starts.fill(0)
-    }
-    if (this.sizes) {
-      this.sizes.fill(0)
-    }
-    this.head = 0
-    this.tail = 0
-    this.initialFill = 1
-    this.free.length = 0
-    this.calculatedSize = 0
-    this.size = 0
-    if (this.disposed) {
-      while (this.disposed.length) {
-        this.disposeAfter(...this.disposed.shift())
-      }
-    }
-  }
-
-  get reset() {
-    deprecatedMethod('reset', 'clear')
-    return this.clear
-  }
-
-  get length() {
-    deprecatedProperty('length', 'size')
-    return this.size
-  }
-
-  static get AbortController() {
-    return AC
-  }
-  static get AbortSignal() {
-    return AS
-  }
-}
-
-module.exports = LRUCache
Index: uckSimulator-main/ds-db-ws/node_modules/lru-cache/index.mjs
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru-cache/index.mjs	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1227 +1,0 @@
-const perf =
-  typeof performance === 'object' &&
-  performance &&
-  typeof performance.now === 'function'
-    ? performance
-    : Date
-
-const hasAbortController = typeof AbortController === 'function'
-
-// minimal backwards-compatibility polyfill
-// this doesn't have nearly all the checks and whatnot that
-// actual AbortController/Signal has, but it's enough for
-// our purposes, and if used properly, behaves the same.
-const AC = hasAbortController
-  ? AbortController
-  : class AbortController {
-      constructor() {
-        this.signal = new AS()
-      }
-      abort(reason = new Error('This operation was aborted')) {
-        this.signal.reason = this.signal.reason || reason
-        this.signal.aborted = true
-        this.signal.dispatchEvent({
-          type: 'abort',
-          target: this.signal,
-        })
-      }
-    }
-
-const hasAbortSignal = typeof AbortSignal === 'function'
-// Some polyfills put this on the AC class, not global
-const hasACAbortSignal = typeof AC.AbortSignal === 'function'
-const AS = hasAbortSignal
-  ? AbortSignal
-  : hasACAbortSignal
-  ? AC.AbortController
-  : class AbortSignal {
-      constructor() {
-        this.reason = undefined
-        this.aborted = false
-        this._listeners = []
-      }
-      dispatchEvent(e) {
-        if (e.type === 'abort') {
-          this.aborted = true
-          this.onabort(e)
-          this._listeners.forEach(f => f(e), this)
-        }
-      }
-      onabort() {}
-      addEventListener(ev, fn) {
-        if (ev === 'abort') {
-          this._listeners.push(fn)
-        }
-      }
-      removeEventListener(ev, fn) {
-        if (ev === 'abort') {
-          this._listeners = this._listeners.filter(f => f !== fn)
-        }
-      }
-    }
-
-const warned = new Set()
-const deprecatedOption = (opt, instead) => {
-  const code = `LRU_CACHE_OPTION_${opt}`
-  if (shouldWarn(code)) {
-    warn(code, `${opt} option`, `options.${instead}`, LRUCache)
-  }
-}
-const deprecatedMethod = (method, instead) => {
-  const code = `LRU_CACHE_METHOD_${method}`
-  if (shouldWarn(code)) {
-    const { prototype } = LRUCache
-    const { get } = Object.getOwnPropertyDescriptor(prototype, method)
-    warn(code, `${method} method`, `cache.${instead}()`, get)
-  }
-}
-const deprecatedProperty = (field, instead) => {
-  const code = `LRU_CACHE_PROPERTY_${field}`
-  if (shouldWarn(code)) {
-    const { prototype } = LRUCache
-    const { get } = Object.getOwnPropertyDescriptor(prototype, field)
-    warn(code, `${field} property`, `cache.${instead}`, get)
-  }
-}
-
-const emitWarning = (...a) => {
-  typeof process === 'object' &&
-  process &&
-  typeof process.emitWarning === 'function'
-    ? process.emitWarning(...a)
-    : console.error(...a)
-}
-
-const shouldWarn = code => !warned.has(code)
-
-const warn = (code, what, instead, fn) => {
-  warned.add(code)
-  const msg = `The ${what} is deprecated. Please use ${instead} instead.`
-  emitWarning(msg, 'DeprecationWarning', code, fn)
-}
-
-const isPosInt = n => n && n === Math.floor(n) && n > 0 && isFinite(n)
-
-/* istanbul ignore next - This is a little bit ridiculous, tbh.
- * The maximum array length is 2^32-1 or thereabouts on most JS impls.
- * And well before that point, you're caching the entire world, I mean,
- * that's ~32GB of just integers for the next/prev links, plus whatever
- * else to hold that many keys and values.  Just filling the memory with
- * zeroes at init time is brutal when you get that big.
- * But why not be complete?
- * Maybe in the future, these limits will have expanded. */
-const getUintArray = max =>
-  !isPosInt(max)
-    ? null
-    : max <= Math.pow(2, 8)
-    ? Uint8Array
-    : max <= Math.pow(2, 16)
-    ? Uint16Array
-    : max <= Math.pow(2, 32)
-    ? Uint32Array
-    : max <= Number.MAX_SAFE_INTEGER
-    ? ZeroArray
-    : null
-
-class ZeroArray extends Array {
-  constructor(size) {
-    super(size)
-    this.fill(0)
-  }
-}
-
-class Stack {
-  constructor(max) {
-    if (max === 0) {
-      return []
-    }
-    const UintArray = getUintArray(max)
-    this.heap = new UintArray(max)
-    this.length = 0
-  }
-  push(n) {
-    this.heap[this.length++] = n
-  }
-  pop() {
-    return this.heap[--this.length]
-  }
-}
-
-class LRUCache {
-  constructor(options = {}) {
-    const {
-      max = 0,
-      ttl,
-      ttlResolution = 1,
-      ttlAutopurge,
-      updateAgeOnGet,
-      updateAgeOnHas,
-      allowStale,
-      dispose,
-      disposeAfter,
-      noDisposeOnSet,
-      noUpdateTTL,
-      maxSize = 0,
-      maxEntrySize = 0,
-      sizeCalculation,
-      fetchMethod,
-      fetchContext,
-      noDeleteOnFetchRejection,
-      noDeleteOnStaleGet,
-      allowStaleOnFetchRejection,
-      allowStaleOnFetchAbort,
-      ignoreFetchAbort,
-    } = options
-
-    // deprecated options, don't trigger a warning for getting them if
-    // the thing being passed in is another LRUCache we're copying.
-    const { length, maxAge, stale } =
-      options instanceof LRUCache ? {} : options
-
-    if (max !== 0 && !isPosInt(max)) {
-      throw new TypeError('max option must be a nonnegative integer')
-    }
-
-    const UintArray = max ? getUintArray(max) : Array
-    if (!UintArray) {
-      throw new Error('invalid max value: ' + max)
-    }
-
-    this.max = max
-    this.maxSize = maxSize
-    this.maxEntrySize = maxEntrySize || this.maxSize
-    this.sizeCalculation = sizeCalculation || length
-    if (this.sizeCalculation) {
-      if (!this.maxSize && !this.maxEntrySize) {
-        throw new TypeError(
-          'cannot set sizeCalculation without setting maxSize or maxEntrySize'
-        )
-      }
-      if (typeof this.sizeCalculation !== 'function') {
-        throw new TypeError('sizeCalculation set to non-function')
-      }
-    }
-
-    this.fetchMethod = fetchMethod || null
-    if (this.fetchMethod && typeof this.fetchMethod !== 'function') {
-      throw new TypeError(
-        'fetchMethod must be a function if specified'
-      )
-    }
-
-    this.fetchContext = fetchContext
-    if (!this.fetchMethod && fetchContext !== undefined) {
-      throw new TypeError(
-        'cannot set fetchContext without fetchMethod'
-      )
-    }
-
-    this.keyMap = new Map()
-    this.keyList = new Array(max).fill(null)
-    this.valList = new Array(max).fill(null)
-    this.next = new UintArray(max)
-    this.prev = new UintArray(max)
-    this.head = 0
-    this.tail = 0
-    this.free = new Stack(max)
-    this.initialFill = 1
-    this.size = 0
-
-    if (typeof dispose === 'function') {
-      this.dispose = dispose
-    }
-    if (typeof disposeAfter === 'function') {
-      this.disposeAfter = disposeAfter
-      this.disposed = []
-    } else {
-      this.disposeAfter = null
-      this.disposed = null
-    }
-    this.noDisposeOnSet = !!noDisposeOnSet
-    this.noUpdateTTL = !!noUpdateTTL
-    this.noDeleteOnFetchRejection = !!noDeleteOnFetchRejection
-    this.allowStaleOnFetchRejection = !!allowStaleOnFetchRejection
-    this.allowStaleOnFetchAbort = !!allowStaleOnFetchAbort
-    this.ignoreFetchAbort = !!ignoreFetchAbort
-
-    // NB: maxEntrySize is set to maxSize if it's set
-    if (this.maxEntrySize !== 0) {
-      if (this.maxSize !== 0) {
-        if (!isPosInt(this.maxSize)) {
-          throw new TypeError(
-            'maxSize must be a positive integer if specified'
-          )
-        }
-      }
-      if (!isPosInt(this.maxEntrySize)) {
-        throw new TypeError(
-          'maxEntrySize must be a positive integer if specified'
-        )
-      }
-      this.initializeSizeTracking()
-    }
-
-    this.allowStale = !!allowStale || !!stale
-    this.noDeleteOnStaleGet = !!noDeleteOnStaleGet
-    this.updateAgeOnGet = !!updateAgeOnGet
-    this.updateAgeOnHas = !!updateAgeOnHas
-    this.ttlResolution =
-      isPosInt(ttlResolution) || ttlResolution === 0
-        ? ttlResolution
-        : 1
-    this.ttlAutopurge = !!ttlAutopurge
-    this.ttl = ttl || maxAge || 0
-    if (this.ttl) {
-      if (!isPosInt(this.ttl)) {
-        throw new TypeError(
-          'ttl must be a positive integer if specified'
-        )
-      }
-      this.initializeTTLTracking()
-    }
-
-    // do not allow completely unbounded caches
-    if (this.max === 0 && this.ttl === 0 && this.maxSize === 0) {
-      throw new TypeError(
-        'At least one of max, maxSize, or ttl is required'
-      )
-    }
-    if (!this.ttlAutopurge && !this.max && !this.maxSize) {
-      const code = 'LRU_CACHE_UNBOUNDED'
-      if (shouldWarn(code)) {
-        warned.add(code)
-        const msg =
-          'TTL caching without ttlAutopurge, max, or maxSize can ' +
-          'result in unbounded memory consumption.'
-        emitWarning(msg, 'UnboundedCacheWarning', code, LRUCache)
-      }
-    }
-
-    if (stale) {
-      deprecatedOption('stale', 'allowStale')
-    }
-    if (maxAge) {
-      deprecatedOption('maxAge', 'ttl')
-    }
-    if (length) {
-      deprecatedOption('length', 'sizeCalculation')
-    }
-  }
-
-  getRemainingTTL(key) {
-    return this.has(key, { updateAgeOnHas: false }) ? Infinity : 0
-  }
-
-  initializeTTLTracking() {
-    this.ttls = new ZeroArray(this.max)
-    this.starts = new ZeroArray(this.max)
-
-    this.setItemTTL = (index, ttl, start = perf.now()) => {
-      this.starts[index] = ttl !== 0 ? start : 0
-      this.ttls[index] = ttl
-      if (ttl !== 0 && this.ttlAutopurge) {
-        const t = setTimeout(() => {
-          if (this.isStale(index)) {
-            this.delete(this.keyList[index])
-          }
-        }, ttl + 1)
-        /* istanbul ignore else - unref() not supported on all platforms */
-        if (t.unref) {
-          t.unref()
-        }
-      }
-    }
-
-    this.updateItemAge = index => {
-      this.starts[index] = this.ttls[index] !== 0 ? perf.now() : 0
-    }
-
-    this.statusTTL = (status, index) => {
-      if (status) {
-        status.ttl = this.ttls[index]
-        status.start = this.starts[index]
-        status.now = cachedNow || getNow()
-        status.remainingTTL = status.now + status.ttl - status.start
-      }
-    }
-
-    // debounce calls to perf.now() to 1s so we're not hitting
-    // that costly call repeatedly.
-    let cachedNow = 0
-    const getNow = () => {
-      const n = perf.now()
-      if (this.ttlResolution > 0) {
-        cachedNow = n
-        const t = setTimeout(
-          () => (cachedNow = 0),
-          this.ttlResolution
-        )
-        /* istanbul ignore else - not available on all platforms */
-        if (t.unref) {
-          t.unref()
-        }
-      }
-      return n
-    }
-
-    this.getRemainingTTL = key => {
-      const index = this.keyMap.get(key)
-      if (index === undefined) {
-        return 0
-      }
-      return this.ttls[index] === 0 || this.starts[index] === 0
-        ? Infinity
-        : this.starts[index] +
-            this.ttls[index] -
-            (cachedNow || getNow())
-    }
-
-    this.isStale = index => {
-      return (
-        this.ttls[index] !== 0 &&
-        this.starts[index] !== 0 &&
-        (cachedNow || getNow()) - this.starts[index] >
-          this.ttls[index]
-      )
-    }
-  }
-  updateItemAge(_index) {}
-  statusTTL(_status, _index) {}
-  setItemTTL(_index, _ttl, _start) {}
-  isStale(_index) {
-    return false
-  }
-
-  initializeSizeTracking() {
-    this.calculatedSize = 0
-    this.sizes = new ZeroArray(this.max)
-    this.removeItemSize = index => {
-      this.calculatedSize -= this.sizes[index]
-      this.sizes[index] = 0
-    }
-    this.requireSize = (k, v, size, sizeCalculation) => {
-      // provisionally accept background fetches.
-      // actual value size will be checked when they return.
-      if (this.isBackgroundFetch(v)) {
-        return 0
-      }
-      if (!isPosInt(size)) {
-        if (sizeCalculation) {
-          if (typeof sizeCalculation !== 'function') {
-            throw new TypeError('sizeCalculation must be a function')
-          }
-          size = sizeCalculation(v, k)
-          if (!isPosInt(size)) {
-            throw new TypeError(
-              'sizeCalculation return invalid (expect positive integer)'
-            )
-          }
-        } else {
-          throw new TypeError(
-            'invalid size value (must be positive integer). ' +
-              'When maxSize or maxEntrySize is used, sizeCalculation or size ' +
-              'must be set.'
-          )
-        }
-      }
-      return size
-    }
-    this.addItemSize = (index, size, status) => {
-      this.sizes[index] = size
-      if (this.maxSize) {
-        const maxSize = this.maxSize - this.sizes[index]
-        while (this.calculatedSize > maxSize) {
-          this.evict(true)
-        }
-      }
-      this.calculatedSize += this.sizes[index]
-      if (status) {
-        status.entrySize = size
-        status.totalCalculatedSize = this.calculatedSize
-      }
-    }
-  }
-  removeItemSize(_index) {}
-  addItemSize(_index, _size) {}
-  requireSize(_k, _v, size, sizeCalculation) {
-    if (size || sizeCalculation) {
-      throw new TypeError(
-        'cannot set size without setting maxSize or maxEntrySize on cache'
-      )
-    }
-  }
-
-  *indexes({ allowStale = this.allowStale } = {}) {
-    if (this.size) {
-      for (let i = this.tail; true; ) {
-        if (!this.isValidIndex(i)) {
-          break
-        }
-        if (allowStale || !this.isStale(i)) {
-          yield i
-        }
-        if (i === this.head) {
-          break
-        } else {
-          i = this.prev[i]
-        }
-      }
-    }
-  }
-
-  *rindexes({ allowStale = this.allowStale } = {}) {
-    if (this.size) {
-      for (let i = this.head; true; ) {
-        if (!this.isValidIndex(i)) {
-          break
-        }
-        if (allowStale || !this.isStale(i)) {
-          yield i
-        }
-        if (i === this.tail) {
-          break
-        } else {
-          i = this.next[i]
-        }
-      }
-    }
-  }
-
-  isValidIndex(index) {
-    return (
-      index !== undefined &&
-      this.keyMap.get(this.keyList[index]) === index
-    )
-  }
-
-  *entries() {
-    for (const i of this.indexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield [this.keyList[i], this.valList[i]]
-      }
-    }
-  }
-  *rentries() {
-    for (const i of this.rindexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield [this.keyList[i], this.valList[i]]
-      }
-    }
-  }
-
-  *keys() {
-    for (const i of this.indexes()) {
-      if (
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.keyList[i]
-      }
-    }
-  }
-  *rkeys() {
-    for (const i of this.rindexes()) {
-      if (
-        this.keyList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.keyList[i]
-      }
-    }
-  }
-
-  *values() {
-    for (const i of this.indexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.valList[i]
-      }
-    }
-  }
-  *rvalues() {
-    for (const i of this.rindexes()) {
-      if (
-        this.valList[i] !== undefined &&
-        !this.isBackgroundFetch(this.valList[i])
-      ) {
-        yield this.valList[i]
-      }
-    }
-  }
-
-  [Symbol.iterator]() {
-    return this.entries()
-  }
-
-  find(fn, getOptions) {
-    for (const i of this.indexes()) {
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      if (fn(value, this.keyList[i], this)) {
-        return this.get(this.keyList[i], getOptions)
-      }
-    }
-  }
-
-  forEach(fn, thisp = this) {
-    for (const i of this.indexes()) {
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      fn.call(thisp, value, this.keyList[i], this)
-    }
-  }
-
-  rforEach(fn, thisp = this) {
-    for (const i of this.rindexes()) {
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      fn.call(thisp, value, this.keyList[i], this)
-    }
-  }
-
-  get prune() {
-    deprecatedMethod('prune', 'purgeStale')
-    return this.purgeStale
-  }
-
-  purgeStale() {
-    let deleted = false
-    for (const i of this.rindexes({ allowStale: true })) {
-      if (this.isStale(i)) {
-        this.delete(this.keyList[i])
-        deleted = true
-      }
-    }
-    return deleted
-  }
-
-  dump() {
-    const arr = []
-    for (const i of this.indexes({ allowStale: true })) {
-      const key = this.keyList[i]
-      const v = this.valList[i]
-      const value = this.isBackgroundFetch(v)
-        ? v.__staleWhileFetching
-        : v
-      if (value === undefined) continue
-      const entry = { value }
-      if (this.ttls) {
-        entry.ttl = this.ttls[i]
-        // always dump the start relative to a portable timestamp
-        // it's ok for this to be a bit slow, it's a rare operation.
-        const age = perf.now() - this.starts[i]
-        entry.start = Math.floor(Date.now() - age)
-      }
-      if (this.sizes) {
-        entry.size = this.sizes[i]
-      }
-      arr.unshift([key, entry])
-    }
-    return arr
-  }
-
-  load(arr) {
-    this.clear()
-    for (const [key, entry] of arr) {
-      if (entry.start) {
-        // entry.start is a portable timestamp, but we may be using
-        // node's performance.now(), so calculate the offset.
-        // it's ok for this to be a bit slow, it's a rare operation.
-        const age = Date.now() - entry.start
-        entry.start = perf.now() - age
-      }
-      this.set(key, entry.value, entry)
-    }
-  }
-
-  dispose(_v, _k, _reason) {}
-
-  set(
-    k,
-    v,
-    {
-      ttl = this.ttl,
-      start,
-      noDisposeOnSet = this.noDisposeOnSet,
-      size = 0,
-      sizeCalculation = this.sizeCalculation,
-      noUpdateTTL = this.noUpdateTTL,
-      status,
-    } = {}
-  ) {
-    size = this.requireSize(k, v, size, sizeCalculation)
-    // if the item doesn't fit, don't do anything
-    // NB: maxEntrySize set to maxSize by default
-    if (this.maxEntrySize && size > this.maxEntrySize) {
-      if (status) {
-        status.set = 'miss'
-        status.maxEntrySizeExceeded = true
-      }
-      // have to delete, in case a background fetch is there already.
-      // in non-async cases, this is a no-op
-      this.delete(k)
-      return this
-    }
-    let index = this.size === 0 ? undefined : this.keyMap.get(k)
-    if (index === undefined) {
-      // addition
-      index = this.newIndex()
-      this.keyList[index] = k
-      this.valList[index] = v
-      this.keyMap.set(k, index)
-      this.next[this.tail] = index
-      this.prev[index] = this.tail
-      this.tail = index
-      this.size++
-      this.addItemSize(index, size, status)
-      if (status) {
-        status.set = 'add'
-      }
-      noUpdateTTL = false
-    } else {
-      // update
-      this.moveToTail(index)
-      const oldVal = this.valList[index]
-      if (v !== oldVal) {
-        if (this.isBackgroundFetch(oldVal)) {
-          oldVal.__abortController.abort(new Error('replaced'))
-        } else {
-          if (!noDisposeOnSet) {
-            this.dispose(oldVal, k, 'set')
-            if (this.disposeAfter) {
-              this.disposed.push([oldVal, k, 'set'])
-            }
-          }
-        }
-        this.removeItemSize(index)
-        this.valList[index] = v
-        this.addItemSize(index, size, status)
-        if (status) {
-          status.set = 'replace'
-          const oldValue =
-            oldVal && this.isBackgroundFetch(oldVal)
-              ? oldVal.__staleWhileFetching
-              : oldVal
-          if (oldValue !== undefined) status.oldValue = oldValue
-        }
-      } else if (status) {
-        status.set = 'update'
-      }
-    }
-    if (ttl !== 0 && this.ttl === 0 && !this.ttls) {
-      this.initializeTTLTracking()
-    }
-    if (!noUpdateTTL) {
-      this.setItemTTL(index, ttl, start)
-    }
-    this.statusTTL(status, index)
-    if (this.disposeAfter) {
-      while (this.disposed.length) {
-        this.disposeAfter(...this.disposed.shift())
-      }
-    }
-    return this
-  }
-
-  newIndex() {
-    if (this.size === 0) {
-      return this.tail
-    }
-    if (this.size === this.max && this.max !== 0) {
-      return this.evict(false)
-    }
-    if (this.free.length !== 0) {
-      return this.free.pop()
-    }
-    // initial fill, just keep writing down the list
-    return this.initialFill++
-  }
-
-  pop() {
-    if (this.size) {
-      const val = this.valList[this.head]
-      this.evict(true)
-      return val
-    }
-  }
-
-  evict(free) {
-    const head = this.head
-    const k = this.keyList[head]
-    const v = this.valList[head]
-    if (this.isBackgroundFetch(v)) {
-      v.__abortController.abort(new Error('evicted'))
-    } else {
-      this.dispose(v, k, 'evict')
-      if (this.disposeAfter) {
-        this.disposed.push([v, k, 'evict'])
-      }
-    }
-    this.removeItemSize(head)
-    // if we aren't about to use the index, then null these out
-    if (free) {
-      this.keyList[head] = null
-      this.valList[head] = null
-      this.free.push(head)
-    }
-    this.head = this.next[head]
-    this.keyMap.delete(k)
-    this.size--
-    return head
-  }
-
-  has(k, { updateAgeOnHas = this.updateAgeOnHas, status } = {}) {
-    const index = this.keyMap.get(k)
-    if (index !== undefined) {
-      if (!this.isStale(index)) {
-        if (updateAgeOnHas) {
-          this.updateItemAge(index)
-        }
-        if (status) status.has = 'hit'
-        this.statusTTL(status, index)
-        return true
-      } else if (status) {
-        status.has = 'stale'
-        this.statusTTL(status, index)
-      }
-    } else if (status) {
-      status.has = 'miss'
-    }
-    return false
-  }
-
-  // like get(), but without any LRU updating or TTL expiration
-  peek(k, { allowStale = this.allowStale } = {}) {
-    const index = this.keyMap.get(k)
-    if (index !== undefined && (allowStale || !this.isStale(index))) {
-      const v = this.valList[index]
-      // either stale and allowed, or forcing a refresh of non-stale value
-      return this.isBackgroundFetch(v) ? v.__staleWhileFetching : v
-    }
-  }
-
-  backgroundFetch(k, index, options, context) {
-    const v = index === undefined ? undefined : this.valList[index]
-    if (this.isBackgroundFetch(v)) {
-      return v
-    }
-    const ac = new AC()
-    if (options.signal) {
-      options.signal.addEventListener('abort', () =>
-        ac.abort(options.signal.reason)
-      )
-    }
-    const fetchOpts = {
-      signal: ac.signal,
-      options,
-      context,
-    }
-    const cb = (v, updateCache = false) => {
-      const { aborted } = ac.signal
-      const ignoreAbort = options.ignoreFetchAbort && v !== undefined
-      if (options.status) {
-        if (aborted && !updateCache) {
-          options.status.fetchAborted = true
-          options.status.fetchError = ac.signal.reason
-          if (ignoreAbort) options.status.fetchAbortIgnored = true
-        } else {
-          options.status.fetchResolved = true
-        }
-      }
-      if (aborted && !ignoreAbort && !updateCache) {
-        return fetchFail(ac.signal.reason)
-      }
-      // either we didn't abort, and are still here, or we did, and ignored
-      if (this.valList[index] === p) {
-        if (v === undefined) {
-          if (p.__staleWhileFetching) {
-            this.valList[index] = p.__staleWhileFetching
-          } else {
-            this.delete(k)
-          }
-        } else {
-          if (options.status) options.status.fetchUpdated = true
-          this.set(k, v, fetchOpts.options)
-        }
-      }
-      return v
-    }
-    const eb = er => {
-      if (options.status) {
-        options.status.fetchRejected = true
-        options.status.fetchError = er
-      }
-      return fetchFail(er)
-    }
-    const fetchFail = er => {
-      const { aborted } = ac.signal
-      const allowStaleAborted =
-        aborted && options.allowStaleOnFetchAbort
-      const allowStale =
-        allowStaleAborted || options.allowStaleOnFetchRejection
-      const noDelete = allowStale || options.noDeleteOnFetchRejection
-      if (this.valList[index] === p) {
-        // if we allow stale on fetch rejections, then we need to ensure that
-        // the stale value is not removed from the cache when the fetch fails.
-        const del = !noDelete || p.__staleWhileFetching === undefined
-        if (del) {
-          this.delete(k)
-        } else if (!allowStaleAborted) {
-          // still replace the *promise* with the stale value,
-          // since we are done with the promise at this point.
-          // leave it untouched if we're still waiting for an
-          // aborted background fetch that hasn't yet returned.
-          this.valList[index] = p.__staleWhileFetching
-        }
-      }
-      if (allowStale) {
-        if (options.status && p.__staleWhileFetching !== undefined) {
-          options.status.returnedStale = true
-        }
-        return p.__staleWhileFetching
-      } else if (p.__returned === p) {
-        throw er
-      }
-    }
-    const pcall = (res, rej) => {
-      this.fetchMethod(k, v, fetchOpts).then(v => res(v), rej)
-      // ignored, we go until we finish, regardless.
-      // defer check until we are actually aborting,
-      // so fetchMethod can override.
-      ac.signal.addEventListener('abort', () => {
-        if (
-          !options.ignoreFetchAbort ||
-          options.allowStaleOnFetchAbort
-        ) {
-          res()
-          // when it eventually resolves, update the cache.
-          if (options.allowStaleOnFetchAbort) {
-            res = v => cb(v, true)
-          }
-        }
-      })
-    }
-    if (options.status) options.status.fetchDispatched = true
-    const p = new Promise(pcall).then(cb, eb)
-    p.__abortController = ac
-    p.__staleWhileFetching = v
-    p.__returned = null
-    if (index === undefined) {
-      // internal, don't expose status.
-      this.set(k, p, { ...fetchOpts.options, status: undefined })
-      index = this.keyMap.get(k)
-    } else {
-      this.valList[index] = p
-    }
-    return p
-  }
-
-  isBackgroundFetch(p) {
-    return (
-      p &&
-      typeof p === 'object' &&
-      typeof p.then === 'function' &&
-      Object.prototype.hasOwnProperty.call(
-        p,
-        '__staleWhileFetching'
-      ) &&
-      Object.prototype.hasOwnProperty.call(p, '__returned') &&
-      (p.__returned === p || p.__returned === null)
-    )
-  }
-
-  // this takes the union of get() and set() opts, because it does both
-  async fetch(
-    k,
-    {
-      // get options
-      allowStale = this.allowStale,
-      updateAgeOnGet = this.updateAgeOnGet,
-      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
-      // set options
-      ttl = this.ttl,
-      noDisposeOnSet = this.noDisposeOnSet,
-      size = 0,
-      sizeCalculation = this.sizeCalculation,
-      noUpdateTTL = this.noUpdateTTL,
-      // fetch exclusive options
-      noDeleteOnFetchRejection = this.noDeleteOnFetchRejection,
-      allowStaleOnFetchRejection = this.allowStaleOnFetchRejection,
-      ignoreFetchAbort = this.ignoreFetchAbort,
-      allowStaleOnFetchAbort = this.allowStaleOnFetchAbort,
-      fetchContext = this.fetchContext,
-      forceRefresh = false,
-      status,
-      signal,
-    } = {}
-  ) {
-    if (!this.fetchMethod) {
-      if (status) status.fetch = 'get'
-      return this.get(k, {
-        allowStale,
-        updateAgeOnGet,
-        noDeleteOnStaleGet,
-        status,
-      })
-    }
-
-    const options = {
-      allowStale,
-      updateAgeOnGet,
-      noDeleteOnStaleGet,
-      ttl,
-      noDisposeOnSet,
-      size,
-      sizeCalculation,
-      noUpdateTTL,
-      noDeleteOnFetchRejection,
-      allowStaleOnFetchRejection,
-      allowStaleOnFetchAbort,
-      ignoreFetchAbort,
-      status,
-      signal,
-    }
-
-    let index = this.keyMap.get(k)
-    if (index === undefined) {
-      if (status) status.fetch = 'miss'
-      const p = this.backgroundFetch(k, index, options, fetchContext)
-      return (p.__returned = p)
-    } else {
-      // in cache, maybe already fetching
-      const v = this.valList[index]
-      if (this.isBackgroundFetch(v)) {
-        const stale =
-          allowStale && v.__staleWhileFetching !== undefined
-        if (status) {
-          status.fetch = 'inflight'
-          if (stale) status.returnedStale = true
-        }
-        return stale ? v.__staleWhileFetching : (v.__returned = v)
-      }
-
-      // if we force a refresh, that means do NOT serve the cached value,
-      // unless we are already in the process of refreshing the cache.
-      const isStale = this.isStale(index)
-      if (!forceRefresh && !isStale) {
-        if (status) status.fetch = 'hit'
-        this.moveToTail(index)
-        if (updateAgeOnGet) {
-          this.updateItemAge(index)
-        }
-        this.statusTTL(status, index)
-        return v
-      }
-
-      // ok, it is stale or a forced refresh, and not already fetching.
-      // refresh the cache.
-      const p = this.backgroundFetch(k, index, options, fetchContext)
-      const hasStale = p.__staleWhileFetching !== undefined
-      const staleVal = hasStale && allowStale
-      if (status) {
-        status.fetch = hasStale && isStale ? 'stale' : 'refresh'
-        if (staleVal && isStale) status.returnedStale = true
-      }
-      return staleVal ? p.__staleWhileFetching : (p.__returned = p)
-    }
-  }
-
-  get(
-    k,
-    {
-      allowStale = this.allowStale,
-      updateAgeOnGet = this.updateAgeOnGet,
-      noDeleteOnStaleGet = this.noDeleteOnStaleGet,
-      status,
-    } = {}
-  ) {
-    const index = this.keyMap.get(k)
-    if (index !== undefined) {
-      const value = this.valList[index]
-      const fetching = this.isBackgroundFetch(value)
-      this.statusTTL(status, index)
-      if (this.isStale(index)) {
-        if (status) status.get = 'stale'
-        // delete only if not an in-flight background fetch
-        if (!fetching) {
-          if (!noDeleteOnStaleGet) {
-            this.delete(k)
-          }
-          if (status) status.returnedStale = allowStale
-          return allowStale ? value : undefined
-        } else {
-          if (status) {
-            status.returnedStale =
-              allowStale && value.__staleWhileFetching !== undefined
-          }
-          return allowStale ? value.__staleWhileFetching : undefined
-        }
-      } else {
-        if (status) status.get = 'hit'
-        // if we're currently fetching it, we don't actually have it yet
-        // it's not stale, which means this isn't a staleWhileRefetching.
-        // If it's not stale, and fetching, AND has a __staleWhileFetching
-        // value, then that means the user fetched with {forceRefresh:true},
-        // so it's safe to return that value.
-        if (fetching) {
-          return value.__staleWhileFetching
-        }
-        this.moveToTail(index)
-        if (updateAgeOnGet) {
-          this.updateItemAge(index)
-        }
-        return value
-      }
-    } else if (status) {
-      status.get = 'miss'
-    }
-  }
-
-  connect(p, n) {
-    this.prev[n] = p
-    this.next[p] = n
-  }
-
-  moveToTail(index) {
-    // if tail already, nothing to do
-    // if head, move head to next[index]
-    // else
-    //   move next[prev[index]] to next[index] (head has no prev)
-    //   move prev[next[index]] to prev[index]
-    // prev[index] = tail
-    // next[tail] = index
-    // tail = index
-    if (index !== this.tail) {
-      if (index === this.head) {
-        this.head = this.next[index]
-      } else {
-        this.connect(this.prev[index], this.next[index])
-      }
-      this.connect(this.tail, index)
-      this.tail = index
-    }
-  }
-
-  get del() {
-    deprecatedMethod('del', 'delete')
-    return this.delete
-  }
-
-  delete(k) {
-    let deleted = false
-    if (this.size !== 0) {
-      const index = this.keyMap.get(k)
-      if (index !== undefined) {
-        deleted = true
-        if (this.size === 1) {
-          this.clear()
-        } else {
-          this.removeItemSize(index)
-          const v = this.valList[index]
-          if (this.isBackgroundFetch(v)) {
-            v.__abortController.abort(new Error('deleted'))
-          } else {
-            this.dispose(v, k, 'delete')
-            if (this.disposeAfter) {
-              this.disposed.push([v, k, 'delete'])
-            }
-          }
-          this.keyMap.delete(k)
-          this.keyList[index] = null
-          this.valList[index] = null
-          if (index === this.tail) {
-            this.tail = this.prev[index]
-          } else if (index === this.head) {
-            this.head = this.next[index]
-          } else {
-            this.next[this.prev[index]] = this.next[index]
-            this.prev[this.next[index]] = this.prev[index]
-          }
-          this.size--
-          this.free.push(index)
-        }
-      }
-    }
-    if (this.disposed) {
-      while (this.disposed.length) {
-        this.disposeAfter(...this.disposed.shift())
-      }
-    }
-    return deleted
-  }
-
-  clear() {
-    for (const index of this.rindexes({ allowStale: true })) {
-      const v = this.valList[index]
-      if (this.isBackgroundFetch(v)) {
-        v.__abortController.abort(new Error('deleted'))
-      } else {
-        const k = this.keyList[index]
-        this.dispose(v, k, 'delete')
-        if (this.disposeAfter) {
-          this.disposed.push([v, k, 'delete'])
-        }
-      }
-    }
-
-    this.keyMap.clear()
-    this.valList.fill(null)
-    this.keyList.fill(null)
-    if (this.ttls) {
-      this.ttls.fill(0)
-      this.starts.fill(0)
-    }
-    if (this.sizes) {
-      this.sizes.fill(0)
-    }
-    this.head = 0
-    this.tail = 0
-    this.initialFill = 1
-    this.free.length = 0
-    this.calculatedSize = 0
-    this.size = 0
-    if (this.disposed) {
-      while (this.disposed.length) {
-        this.disposeAfter(...this.disposed.shift())
-      }
-    }
-  }
-
-  get reset() {
-    deprecatedMethod('reset', 'clear')
-    return this.clear
-  }
-
-  get length() {
-    deprecatedProperty('length', 'size')
-    return this.size
-  }
-
-  static get AbortController() {
-    return AC
-  }
-  static get AbortSignal() {
-    return AS
-  }
-}
-
-export default LRUCache
Index: uckSimulator-main/ds-db-ws/node_modules/lru-cache/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru-cache/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,96 +1,0 @@
-{
-  "name": "lru-cache",
-  "description": "A cache object that deletes the least-recently-used items.",
-  "version": "7.18.3",
-  "author": "Isaac Z. Schlueter <i@izs.me>",
-  "keywords": [
-    "mru",
-    "lru",
-    "cache"
-  ],
-  "sideEffects": false,
-  "scripts": {
-    "build": "npm run prepare",
-    "pretest": "npm run prepare",
-    "presnap": "npm run prepare",
-    "prepare": "node ./scripts/transpile-to-esm.js",
-    "size": "size-limit",
-    "test": "tap",
-    "snap": "tap",
-    "preversion": "npm test",
-    "postversion": "npm publish",
-    "prepublishOnly": "git push origin --follow-tags",
-    "format": "prettier --write .",
-    "typedoc": "typedoc ./index.d.ts"
-  },
-  "type": "commonjs",
-  "main": "./index.js",
-  "module": "./index.mjs",
-  "types": "./index.d.ts",
-  "exports": {
-    ".": {
-      "import": {
-        "types": "./index.d.ts",
-        "default": "./index.mjs"
-      },
-      "require": {
-        "types": "./index.d.ts",
-        "default": "./index.js"
-      }
-    },
-    "./package.json": "./package.json"
-  },
-  "repository": "git://github.com/isaacs/node-lru-cache.git",
-  "devDependencies": {
-    "@size-limit/preset-small-lib": "^7.0.8",
-    "@types/node": "^17.0.31",
-    "@types/tap": "^15.0.6",
-    "benchmark": "^2.1.4",
-    "c8": "^7.11.2",
-    "clock-mock": "^1.0.6",
-    "eslint-config-prettier": "^8.5.0",
-    "prettier": "^2.6.2",
-    "size-limit": "^7.0.8",
-    "tap": "^16.3.4",
-    "ts-node": "^10.7.0",
-    "tslib": "^2.4.0",
-    "typedoc": "^0.23.24",
-    "typescript": "^4.6.4"
-  },
-  "license": "ISC",
-  "files": [
-    "index.js",
-    "index.mjs",
-    "index.d.ts"
-  ],
-  "engines": {
-    "node": ">=12"
-  },
-  "prettier": {
-    "semi": false,
-    "printWidth": 70,
-    "tabWidth": 2,
-    "useTabs": false,
-    "singleQuote": true,
-    "jsxSingleQuote": false,
-    "bracketSameLine": true,
-    "arrowParens": "avoid",
-    "endOfLine": "lf"
-  },
-  "tap": {
-    "nyc-arg": [
-      "--include=index.js"
-    ],
-    "node-arg": [
-      "--expose-gc",
-      "--require",
-      "ts-node/register"
-    ],
-    "ts": false
-  },
-  "size-limit": [
-    {
-      "path": "./index.js"
-    }
-  ]
-}
Index: uckSimulator-main/ds-db-ws/node_modules/lru.min/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru.min/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,21 +1,0 @@
-MIT License
-
-Copyright (c) 2024-current Weslley Araújo (@wellwelwel)
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/lru.min/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru.min/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,426 +1,0 @@
-<h1 align="center">lru.min</h1>
-<div align="center">
-
-[![NPM Version](https://img.shields.io/npm/v/lru.min.svg?label=&color=70a1ff&logo=npm&logoColor=white)](https://www.npmjs.com/package/lru.min)
-[![NPM Downloads](https://img.shields.io/npm/dm/lru.min.svg?label=&logo=npm&logoColor=white&color=45aaf2)](https://www.npmjs.com/package/lru.min)
-[![Coverage](https://img.shields.io/codecov/c/github/wellwelwel/lru.min?label=&logo=codecov&logoColor=white&color=98cc00)](https://app.codecov.io/gh/wellwelwel/lru.min)<br />
-[![GitHub Workflow Status (Node.js)](https://img.shields.io/github/actions/workflow/status/wellwelwel/lru.min/ci_node.yml?event=push&label=&branch=main&logo=nodedotjs&logoColor=535c68&color=badc58)](https://github.com/wellwelwel/lru.min/actions/workflows/ci_node.yml?query=branch%3Amain)
-[![GitHub Workflow Status (Bun)](https://img.shields.io/github/actions/workflow/status/wellwelwel/lru.min/ci_bun.yml?event=push&label=&branch=main&logo=bun&logoColor=ffffff&color=f368e0)](https://github.com/wellwelwel/lru.min/actions/workflows/ci_bun.yml?query=branch%3Amain)
-[![GitHub Workflow Status (Deno)](https://img.shields.io/github/actions/workflow/status/wellwelwel/lru.min/ci_deno.yml?event=push&label=&branch=main&logo=deno&logoColor=ffffff&color=079992)](https://github.com/wellwelwel/lru.min/actions/workflows/ci_deno.yml?query=branch%3Amain)
-
-🔥 An extremely fast, efficient, and lightweight <strong><a href="https://en.m.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_.28LRU.29">LRU</a> Cache</strong> for <strong>JavaScript</strong> (<strong>Browser</strong> compatible).
-
-</div>
-
-## Why another LRU?
-
-- 🎖️ **lru.min** is fully compatible with both **Node.js** _(8+)_, **Bun**, **Deno** and, browser environments. All of this, while maintaining the same high performance [_(and a little more)_](https://github.com/wellwelwel/lru.min?tab=readme-ov-file#performance) as the most popular **LRU** packages.
-
----
-
-## Install
-
-```bash
-# Node.js
-npm i lru.min
-```
-
-```bash
-# Bun
-bun add lru.min
-```
-
-```bash
-# Deno
-deno add npm:lru.min
-```
-
----
-
-## Usage
-
-### Quickstart
-
-```js
-import { createLRU } from 'lru.min';
-
-const max = 2;
-const onEviction = (key, value) => {
-  console.log(`Key "${key}" with value "${value}" has been evicted.`);
-};
-
-const LRU = createLRU({
-  max,
-  onEviction,
-});
-
-LRU.set('A', 'My Value');
-LRU.set('B', 'Other Value');
-LRU.set('C', 'Another Value');
-
-// => Key "A" with value "My Value" has been evicted.
-
-LRU.has('B');
-LRU.get('B');
-LRU.delete('B');
-
-// => Key "B" with value "Other Value" has been evicted.
-
-LRU.peek('C');
-
-LRU.clear(); // ← recommended | LRU.evict(max) → (slower alternative)
-
-// => Key "C" with value "Another Value" has been evicted.
-
-LRU.set('D', "You're amazing 💛");
-
-LRU.size; // 1
-LRU.max; // 2
-LRU.available; // 1
-
-LRU.resize(10);
-
-LRU.size; // 1
-LRU.max; // 10
-LRU.available; // 9
-```
-
-> For _up-to-date_ documentation, always follow the [**README.md**](https://github.com/wellwelwel/lru.min?tab=readme-ov-file#readme) in the **GitHub** repository.
-
-### Import
-
-#### ES Modules
-
-```js
-import { createLRU } from 'lru.min';
-```
-
-#### CommonJS
-
-```js
-const { createLRU } = require('lru.min');
-```
-
-#### Browser
-
-> Requires **ES6**.
-
-```html
-<script src="https://cdn.jsdelivr.net/npm/lru.min@1.x.x/browser/lru.min.js"></script>
-```
-
-- You can use tools such as [**Babel**](https://github.com/babel/babel) to increase the compatibility rate.
-
-### Create a new LRU Cache
-
-> Set maximum size when creating **LRU**.
-
-```ts
-const LRU = createLRU({ max: 150_000 });
-```
-
-Also, you can set a callback for every deletion/eviction:
-
-```ts
-const LRU = createLRU({
-  max: 150_000,
-  onEviction: (key, value) => {
-    // do something
-  },
-});
-```
-
-### Set a cache
-
-Adds a key-value pair to the cache. Updates the value if the key already exists
-
-```ts
-LRU.set('key', 'value');
-```
-
-> `undefined` keys will simply be ignored.
-
-- Complexity: **O(1)**.
-
-### Get a cache
-
-Retrieves the value for a given key and moves the key to the most recent position.
-
-```ts
-LRU.get('key');
-```
-
-- Complexity: **O(1)**.
-
-### Peek a cache
-
-Retrieves the value for a given key without changing its position.
-
-```ts
-LRU.peek('key');
-```
-
-- Complexity: **O(1)**.
-
-### Check if a key exists
-
-```ts
-LRU.has('key');
-```
-
-- Complexity: **O(1)**.
-
-### Delete a cache
-
-```ts
-LRU.delete('key');
-```
-
-- Complexity: **O(1)**.
-
-### Evict from the oldest cache
-
-Evicts the specified number of the oldest items from the cache.
-
-```ts
-LRU.evict(1000);
-```
-
-- Complexity: **O(key)** — even if passed a number greater than the number of items, only existing items will be evicted.
-
-> [!TIP]
->
-> - Methods that perform eviction(s) when maximum size is reached: `set` and `resize`.
-> - Methods that always perform eviction(s): `delete`, `clear`, and `evict` itself.
-
-### Resize the cache
-
-Resizes the cache to a new maximum size, evicting items if necessary.
-
-```ts
-LRU.resize(50_000);
-```
-
-- Complexity:
-  - Increasing: **O(newMax - max)**.
-  - Downsizing: **O(n)**.
-
-### Clear the cache
-
-Clears and disposes (if used) all key-value pairs from the cache.
-
-```ts
-LRU.clear();
-```
-
-- Complexity:
-  - Without `onEviction`: **O(1)**.
-  - Using `onEviction`: **O(entries)**.
-
-### Debugging
-
-#### Get the max size of the cache
-
-```ts
-LRU.max;
-```
-
-- Complexity: **O(1)**.
-
-#### Get the current size of the cache
-
-```ts
-LRU.size;
-```
-
-- Complexity: **O(1)**.
-
-#### Get the available slots in the cache
-
-```ts
-LRU.available;
-```
-
-- Complexity: **O(1)**.
-
-### Iterating the cache
-
-#### Get all keys
-
-Iterates over all keys in the cache, from most recent to least recent.
-
-```ts
-const keys = [...LRU.keys()];
-```
-
-- Complexity: **O(keys)**.
-
-#### Get all values
-
-Iterates over all values in the cache, from most recent to least recent.
-
-```ts
-const values = [...LRU.values()];
-```
-
-- Complexity: **O(values)**.
-
-#### Get all entries
-
-Iterates over `[key, value]` pairs in the cache, from most recent to least recent.
-
-```ts
-const entries = [...LRU.entries()];
-```
-
-- Complexity: **O(entries)**.
-
-#### Run a callback for each entry
-
-Iterates over each value-key pair in the cache, from most recent to least recent.
-
-```ts
-LRU.forEach((value, key) => {
-  // do something
-});
-```
-
-- Complexity: **O(entries)**.
-
----
-
-> [!NOTE]
->
-> - We use `O(keys)`, `O(values)`, `O(entries)`, and `O(newMax - max)` to explicitly indicate what is being iterated over. In traditional complexity notation, this would be represented as `O(n)`.
-
----
-
-### TypeScript
-
-You can set types for both keys and values. For example:
-
-```ts
-import { createLRU } from 'lru.min';
-
-type Key = number;
-
-type Value = {
-  name: string;
-};
-
-const LRU = createLRU<Key, Value>({ max: 1000 });
-
-LRU.set(1, { name: 'Peter' });
-LRU.set(2, { name: 'Mary' });
-```
-
-Also:
-
-```ts
-import { createLRU, type CacheOptions } from 'lru.min';
-
-type Key = number;
-
-type Value = {
-  name: string;
-};
-
-const options: CacheOptions<Key, Value> = {
-  max: 10,
-  onEviction(key, value) {
-    console.log(key, value);
-  },
-};
-
-// No need to repeat the type params
-const LRU = createLRU(options);
-
-LRU.set(1, { name: 'Peter' });
-LRU.set(2, { name: 'Mary' });
-```
-
----
-
-### Performance
-
-The benchmark is performed by comparing `1,000,000` runs through a maximum cache limit of `100,000`, getting `333,333` caches and deleting `200,000` keys 10 consecutive times, clearing the cache every run.
-
-> - [**lru-cache**](https://github.com/isaacs/node-lru-cache) `v11.0.0`
-> - [**quick-lru**](https://github.com/sindresorhus/quick-lru) `v7.0.0`
-
-```sh
-# Time:
-  lru.min:    240.45ms
-  lru-cache:  258.32ms
-  quick-lru:  279.89ms
-
-# CPU:
-  lru.min:    275558.30µs
-  lru-cache:  306858.30µs
-  quick-lru:  401318.80µs
-```
-
-- See detailed results and how the tests are run and compared in the [**benchmark**](https://github.com/wellwelwel/lru.min/tree/main/benchmark) directory.
-
----
-
-## Security Policy
-
-[![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/wellwelwel/lru.min/ci_codeql.yml?event=push&label=&branch=main&logo=github&logoColor=white&color=f368e0)](https://github.com/wellwelwel/lru.min/actions/workflows/ci_codeql.yml?query=branch%3Amain)
-
-Please check the [**SECURITY.md**](https://github.com/wellwelwel/lru.min/blob/main/SECURITY.md).
-
----
-
-## Contributing
-
-See the [**Contributing Guide**](https://github.com/wellwelwel/lru.min/blob/main/CONTRIBUTING.md) and please follow our [**Code of Conduct**](https://github.com/wellwelwel/lru.min/blob/main/CODE_OF_CONDUCT.md) 🚀
-
----
-
-## Acknowledgements
-
-**lru.min** is based and inspired on the architecture and code of both [**lru-cache**](https://github.com/isaacs/node-lru-cache) and [**quick-lru**](https://github.com/sindresorhus/quick-lru), simplifying their core concepts for enhanced performance and compatibility.
-
-For more comprehensive features such as **TTL** support, consider using and supporting them 🤝
-
-- The architecture is mostly based on [@isaacs](https://github.com/isaacs) — [**lru-cache**](https://github.com/isaacs/node-lru-cache/blob/8f51d75351cbb4ac819952eb8e9f95eda00ef800/src/index.ts).
-- Most of the methods names and its functionalities were inspired by [@sindresorhus](https://github.com/sindresorhus) — [**quick-lru**](https://github.com/sindresorhus/quick-lru/blob/a2262c65e1952539cb4d985a67c46363a780d234/index.js).
-- [![Contributors](https://img.shields.io/github/contributors/wellwelwel/lru.min?label=Contributors)](https://github.com/wellwelwel/lru.min/graphs/contributors)
-
----
-
-#### What comes from [**lru-cache**](https://github.com/isaacs/node-lru-cache)?
-
-Architecture's essence:
-
-> _It's not the same code, but majority based on [this](https://github.com/isaacs/node-lru-cache/blob/8f51d75351cbb4ac819952eb8e9f95eda00ef800/src/index.ts#L1385-L1394)._
-
-```ts
-let free: number[] = [];
-
-const keyMap: Map<Key, number> = new Map();
-const keyList: (Key | undefined)[] = new Array(max).fill(undefined);
-const valList: (Value | undefined)[] = new Array(max).fill(undefined);
-const next: number[] = new Array(max).fill(0);
-const prev: number[] = new Array(max).fill(0);
-```
-
----
-
-#### What comes from [**quick-lru**](https://github.com/sindresorhus/quick-lru)?
-
-Name of methods and options _(including their final functionality ideas)_:
-
-- `resize`
-- `peek`
-- `onEviction`
-- `forEach`
-- `entriesDescending` as `entries`
-
----
-
-## License
-
-**lru.min** is under the [**MIT License**](https://github.com/wellwelwel/lru.min/blob/main/LICENSE).<br />
-Copyright © 2024-present [Weslley Araújo](https://github.com/wellwelwel) and **lru.min** [contributors](https://github.com/wellwelwel/lru.min/graphs/contributors).
Index: uckSimulator-main/ds-db-ws/node_modules/lru.min/browser/lru.min.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru.min/browser/lru.min.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1 +1,0 @@
-"use strict";window.createLRU=function(e){var r=e.max;if(!(Number.isInteger(r)&&r>0))throw new TypeError("`max` must be a positive integer");var n=0,i=0,t=0,a=[],o=e.onEviction,l=new Map,f=new Array(r).fill(void 0),u=new Array(r).fill(void 0),v=new Array(r).fill(0),s=new Array(r).fill(0),d=function(e,r){if(e!==t){var n=v[e],a=s[e];e===i?i=n:("get"===r||0!==a)&&(v[a]=n),0!==n&&(s[n]=a),v[t]=e,s[e]=t,v[e]=0,t=e}},p=function(){var e=i,r=f[e];return null==o||o(r,u[e]),l.delete(r),f[e]=void 0,u[e]=void 0,0!==(i=v[e])&&(s[i]=0),0===--n&&(i=t=0),a.push(e),e};return{set:function(e,v){if(void 0!==e){var s=l.get(e);void 0===s?(s=n===r?p():a.length>0?a.pop():n,l.set(e,s),f[s]=e,n++):null==o||o(e,u[s]),u[s]=v,1===n?i=t=s:d(s,"set")}},get:function(e){var r=l.get(e);if(void 0!==r)return r!==t&&d(r,"get"),u[r]},peek:function(e){var r=l.get(e);return void 0!==r?u[r]:void 0},has:function(e){return l.has(e)},keys:function*(){for(var e=t,r=0;r<n;r++)yield f[e],e=s[e]},values:function*(){for(var e=t,r=0;r<n;r++)yield u[e],e=s[e]},entries:function*(){for(var e=t,r=0;r<n;r++)yield[f[e],u[e]],e=s[e]},forEach:function(e){for(var r=t,i=0;i<n;i++){var a=f[r];e(u[r],a),r=s[r]}},delete:function(e){var r=l.get(e);if(void 0===r)return!1;null==o||o(e,u[r]),l.delete(e),a.push(r),f[r]=void 0,u[r]=void 0;var d=s[r],p=v[r];return 0!==d&&(v[d]=p),0!==p&&(s[p]=d),r===i&&(i=p),r===t&&(t=d),n--,!0},evict:function(e){for(var r=Math.min(e,n);r>0;)p(),r--},clear:function(){if("function"==typeof o)for(var e=l.values(),r=e.next();!r.done;r=e.next())o(f[r.value],u[r.value]);l.clear(),f.fill(void 0),u.fill(void 0),a=[],n=0,i=t=0},resize:function(e){if(!(Number.isInteger(e)&&e>0))throw new TypeError("`max` must be a positive integer");if(e!==r){if(e<r){for(var d=t,p=Math.min(n,e),c=n-p,y=new Array(e),g=new Array(e),h=new Array(e),w=new Array(e),A=1;A<=c;A++)null==o||o(f[A],u[A]);for(var m=p-1;m>=0;m--)y[m]=f[d],g[m]=u[d],h[m]=m+1,w[m]=m-1,l.set(y[m],m),d=s[d];i=0,t=p-1,n=p,f.length=e,u.length=e,v.length=e,s.length=e;for(var x=0;x<p;x++)f[x]=y[x],u[x]=g[x],v[x]=h[x],s[x]=w[x];a=[];for(var b=p;b<e;b++)a.push(b)}else{var E=e-r;f.push.apply(f,new Array(E).fill(void 0)),u.push.apply(u,new Array(E).fill(void 0)),v.push.apply(v,new Array(E).fill(0)),s.push.apply(s,new Array(E).fill(0))}r=e}},get max(){return r},get size(){return n},get available(){return r-n}}};
Index: uckSimulator-main/ds-db-ws/node_modules/lru.min/lib/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru.min/lib/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,38 +1,0 @@
-export type CacheOptions<Key = unknown, Value = unknown> = {
-    /** Maximum number of items the cache can hold. */
-    max: number;
-    /** Function called when an item is evicted from the cache. */
-    onEviction?: (key: Key, value: Value) => unknown;
-};
-export declare const createLRU: <Key, Value>(options: CacheOptions<Key, Value>) => {
-    /** Adds a key-value pair to the cache. Updates the value if the key already exists. */
-    set(key: Key, value: Value): undefined;
-    /** Retrieves the value for a given key and moves the key to the most recent position. */
-    get(key: Key): Value | undefined;
-    /** Retrieves the value for a given key without changing its position. */
-    peek: (key: Key) => Value | undefined;
-    /** Checks if a key exists in the cache. */
-    has: (key: Key) => boolean;
-    /** Iterates over all keys in the cache, from most recent to least recent. */
-    keys(): IterableIterator<Key>;
-    /** Iterates over all values in the cache, from most recent to least recent. */
-    values(): IterableIterator<Value>;
-    /** Iterates over `[key, value]` pairs in the cache, from most recent to least recent. */
-    entries(): IterableIterator<[Key, Value]>;
-    /** Iterates over each value-key pair in the cache, from most recent to least recent. */
-    forEach: (callback: (value: Value, key: Key) => unknown) => undefined;
-    /** Deletes a key-value pair from the cache. */
-    delete(key: Key): boolean;
-    /** Evicts the oldest item or the specified number of the oldest items from the cache. */
-    evict: (number: number) => undefined;
-    /** Clears all key-value pairs from the cache. */
-    clear(): undefined;
-    /** Resizes the cache to a new maximum size, evicting items if necessary. */
-    resize: (newMax: number) => undefined;
-    /** Returns the maximum number of items that can be stored in the cache. */
-    readonly max: number;
-    /** Returns the number of items currently stored in the cache. */
-    readonly size: number;
-    /** Returns the number of currently available slots in the cache before reaching the maximum size. */
-    readonly available: number;
-};
Index: uckSimulator-main/ds-db-ws/node_modules/lru.min/lib/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru.min/lib/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,229 +1,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.createLRU = void 0;
-const createLRU = (options) => {
-    let { max } = options;
-    if (!(Number.isInteger(max) && max > 0))
-        throw new TypeError('`max` must be a positive integer');
-    let size = 0;
-    let head = 0;
-    let tail = 0;
-    let free = [];
-    const { onEviction } = options;
-    const keyMap = new Map();
-    const keyList = new Array(max).fill(undefined);
-    const valList = new Array(max).fill(undefined);
-    const next = new Array(max).fill(0);
-    const prev = new Array(max).fill(0);
-    const setTail = (index, type) => {
-        if (index === tail)
-            return;
-        const nextIndex = next[index];
-        const prevIndex = prev[index];
-        if (index === head)
-            head = nextIndex;
-        else if (type === 'get' || prevIndex !== 0)
-            next[prevIndex] = nextIndex;
-        if (nextIndex !== 0)
-            prev[nextIndex] = prevIndex;
-        next[tail] = index;
-        prev[index] = tail;
-        next[index] = 0;
-        tail = index;
-    };
-    const _evict = () => {
-        const evictHead = head;
-        const key = keyList[evictHead];
-        onEviction === null || onEviction === void 0 ? void 0 : onEviction(key, valList[evictHead]);
-        keyMap.delete(key);
-        keyList[evictHead] = undefined;
-        valList[evictHead] = undefined;
-        head = next[evictHead];
-        if (head !== 0)
-            prev[head] = 0;
-        size--;
-        if (size === 0)
-            head = tail = 0;
-        free.push(evictHead);
-        return evictHead;
-    };
-    return {
-        /** Adds a key-value pair to the cache. Updates the value if the key already exists. */
-        set(key, value) {
-            if (key === undefined)
-                return;
-            let index = keyMap.get(key);
-            if (index === undefined) {
-                index = size === max ? _evict() : free.length > 0 ? free.pop() : size;
-                keyMap.set(key, index);
-                keyList[index] = key;
-                size++;
-            }
-            else
-                onEviction === null || onEviction === void 0 ? void 0 : onEviction(key, valList[index]);
-            valList[index] = value;
-            if (size === 1)
-                head = tail = index;
-            else
-                setTail(index, 'set');
-        },
-        /** Retrieves the value for a given key and moves the key to the most recent position. */
-        get(key) {
-            const index = keyMap.get(key);
-            if (index === undefined)
-                return;
-            if (index !== tail)
-                setTail(index, 'get');
-            return valList[index];
-        },
-        /** Retrieves the value for a given key without changing its position. */
-        peek: (key) => {
-            const index = keyMap.get(key);
-            return index !== undefined ? valList[index] : undefined;
-        },
-        /** Checks if a key exists in the cache. */
-        has: (key) => keyMap.has(key),
-        /** Iterates over all keys in the cache, from most recent to least recent. */
-        *keys() {
-            let current = tail;
-            for (let i = 0; i < size; i++) {
-                yield keyList[current];
-                current = prev[current];
-            }
-        },
-        /** Iterates over all values in the cache, from most recent to least recent. */
-        *values() {
-            let current = tail;
-            for (let i = 0; i < size; i++) {
-                yield valList[current];
-                current = prev[current];
-            }
-        },
-        /** Iterates over `[key, value]` pairs in the cache, from most recent to least recent. */
-        *entries() {
-            let current = tail;
-            for (let i = 0; i < size; i++) {
-                yield [keyList[current], valList[current]];
-                current = prev[current];
-            }
-        },
-        /** Iterates over each value-key pair in the cache, from most recent to least recent. */
-        forEach: (callback) => {
-            let current = tail;
-            for (let i = 0; i < size; i++) {
-                const key = keyList[current];
-                const value = valList[current];
-                callback(value, key);
-                current = prev[current];
-            }
-        },
-        /** Deletes a key-value pair from the cache. */
-        delete(key) {
-            const index = keyMap.get(key);
-            if (index === undefined)
-                return false;
-            onEviction === null || onEviction === void 0 ? void 0 : onEviction(key, valList[index]);
-            keyMap.delete(key);
-            free.push(index);
-            keyList[index] = undefined;
-            valList[index] = undefined;
-            const prevIndex = prev[index];
-            const nextIndex = next[index];
-            if (prevIndex !== 0)
-                next[prevIndex] = nextIndex;
-            if (nextIndex !== 0)
-                prev[nextIndex] = prevIndex;
-            if (index === head)
-                head = nextIndex;
-            if (index === tail)
-                tail = prevIndex;
-            size--;
-            return true;
-        },
-        /** Evicts the oldest item or the specified number of the oldest items from the cache. */
-        evict: (number) => {
-            let toPrune = Math.min(number, size);
-            while (toPrune > 0) {
-                _evict();
-                toPrune--;
-            }
-        },
-        /** Clears all key-value pairs from the cache. */
-        clear() {
-            if (typeof onEviction === 'function') {
-                const iterator = keyMap.values();
-                for (let result = iterator.next(); !result.done; result = iterator.next())
-                    onEviction(keyList[result.value], valList[result.value]);
-            }
-            keyMap.clear();
-            keyList.fill(undefined);
-            valList.fill(undefined);
-            free = [];
-            size = 0;
-            head = tail = 0;
-        },
-        /** Resizes the cache to a new maximum size, evicting items if necessary. */
-        resize: (newMax) => {
-            if (!(Number.isInteger(newMax) && newMax > 0))
-                throw new TypeError('`max` must be a positive integer');
-            if (newMax === max)
-                return;
-            if (newMax < max) {
-                let current = tail;
-                const preserve = Math.min(size, newMax);
-                const remove = size - preserve;
-                const newKeyList = new Array(newMax);
-                const newValList = new Array(newMax);
-                const newNext = new Array(newMax);
-                const newPrev = new Array(newMax);
-                for (let i = 1; i <= remove; i++)
-                    onEviction === null || onEviction === void 0 ? void 0 : onEviction(keyList[i], valList[i]);
-                for (let i = preserve - 1; i >= 0; i--) {
-                    newKeyList[i] = keyList[current];
-                    newValList[i] = valList[current];
-                    newNext[i] = i + 1;
-                    newPrev[i] = i - 1;
-                    keyMap.set(newKeyList[i], i);
-                    current = prev[current];
-                }
-                head = 0;
-                tail = preserve - 1;
-                size = preserve;
-                keyList.length = newMax;
-                valList.length = newMax;
-                next.length = newMax;
-                prev.length = newMax;
-                for (let i = 0; i < preserve; i++) {
-                    keyList[i] = newKeyList[i];
-                    valList[i] = newValList[i];
-                    next[i] = newNext[i];
-                    prev[i] = newPrev[i];
-                }
-                free = [];
-                for (let i = preserve; i < newMax; i++)
-                    free.push(i);
-            }
-            else {
-                const fill = newMax - max;
-                keyList.push(...new Array(fill).fill(undefined));
-                valList.push(...new Array(fill).fill(undefined));
-                next.push(...new Array(fill).fill(0));
-                prev.push(...new Array(fill).fill(0));
-            }
-            max = newMax;
-        },
-        /** Returns the maximum number of items that can be stored in the cache. */
-        get max() {
-            return max;
-        },
-        /** Returns the number of items currently stored in the cache. */
-        get size() {
-            return size;
-        },
-        /** Returns the number of currently available slots in the cache before reaching the maximum size. */
-        get available() {
-            return max - size;
-        },
-    };
-};
-exports.createLRU = createLRU;
Index: uckSimulator-main/ds-db-ws/node_modules/lru.min/lib/index.mjs
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru.min/lib/index.mjs	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,207 +1,0 @@
-const createLRU = (options) => {
-  let { max } = options;
-  if (!(Number.isInteger(max) && max > 0))
-    throw new TypeError("`max` must be a positive integer");
-  let size = 0;
-  let head = 0;
-  let tail = 0;
-  let free = [];
-  const { onEviction } = options;
-  const keyMap = /* @__PURE__ */ new Map();
-  const keyList = new Array(max).fill(void 0);
-  const valList = new Array(max).fill(void 0);
-  const next = new Array(max).fill(0);
-  const prev = new Array(max).fill(0);
-  const setTail = (index, type) => {
-    if (index === tail) return;
-    const nextIndex = next[index];
-    const prevIndex = prev[index];
-    if (index === head) head = nextIndex;
-    else if (type === "get" || prevIndex !== 0) next[prevIndex] = nextIndex;
-    if (nextIndex !== 0) prev[nextIndex] = prevIndex;
-    next[tail] = index;
-    prev[index] = tail;
-    next[index] = 0;
-    tail = index;
-  };
-  const _evict = () => {
-    const evictHead = head;
-    const key = keyList[evictHead];
-    onEviction == null ? void 0 : onEviction(key, valList[evictHead]);
-    keyMap.delete(key);
-    keyList[evictHead] = void 0;
-    valList[evictHead] = void 0;
-    head = next[evictHead];
-    if (head !== 0) prev[head] = 0;
-    size--;
-    if (size === 0) head = tail = 0;
-    free.push(evictHead);
-    return evictHead;
-  };
-  return {
-    /** Adds a key-value pair to the cache. Updates the value if the key already exists. */
-    set(key, value) {
-      if (key === void 0) return;
-      let index = keyMap.get(key);
-      if (index === void 0) {
-        index = size === max ? _evict() : free.length > 0 ? free.pop() : size;
-        keyMap.set(key, index);
-        keyList[index] = key;
-        size++;
-      } else onEviction == null ? void 0 : onEviction(key, valList[index]);
-      valList[index] = value;
-      if (size === 1) head = tail = index;
-      else setTail(index, "set");
-    },
-    /** Retrieves the value for a given key and moves the key to the most recent position. */
-    get(key) {
-      const index = keyMap.get(key);
-      if (index === void 0) return;
-      if (index !== tail) setTail(index, "get");
-      return valList[index];
-    },
-    /** Retrieves the value for a given key without changing its position. */
-    peek: (key) => {
-      const index = keyMap.get(key);
-      return index !== void 0 ? valList[index] : void 0;
-    },
-    /** Checks if a key exists in the cache. */
-    has: (key) => keyMap.has(key),
-    /** Iterates over all keys in the cache, from most recent to least recent. */
-    *keys() {
-      let current = tail;
-      for (let i = 0; i < size; i++) {
-        yield keyList[current];
-        current = prev[current];
-      }
-    },
-    /** Iterates over all values in the cache, from most recent to least recent. */
-    *values() {
-      let current = tail;
-      for (let i = 0; i < size; i++) {
-        yield valList[current];
-        current = prev[current];
-      }
-    },
-    /** Iterates over `[key, value]` pairs in the cache, from most recent to least recent. */
-    *entries() {
-      let current = tail;
-      for (let i = 0; i < size; i++) {
-        yield [keyList[current], valList[current]];
-        current = prev[current];
-      }
-    },
-    /** Iterates over each value-key pair in the cache, from most recent to least recent. */
-    forEach: (callback) => {
-      let current = tail;
-      for (let i = 0; i < size; i++) {
-        const key = keyList[current];
-        const value = valList[current];
-        callback(value, key);
-        current = prev[current];
-      }
-    },
-    /** Deletes a key-value pair from the cache. */
-    delete(key) {
-      const index = keyMap.get(key);
-      if (index === void 0) return false;
-      onEviction == null ? void 0 : onEviction(key, valList[index]);
-      keyMap.delete(key);
-      free.push(index);
-      keyList[index] = void 0;
-      valList[index] = void 0;
-      const prevIndex = prev[index];
-      const nextIndex = next[index];
-      if (prevIndex !== 0) next[prevIndex] = nextIndex;
-      if (nextIndex !== 0) prev[nextIndex] = prevIndex;
-      if (index === head) head = nextIndex;
-      if (index === tail) tail = prevIndex;
-      size--;
-      return true;
-    },
-    /** Evicts the oldest item or the specified number of the oldest items from the cache. */
-    evict: (number) => {
-      let toPrune = Math.min(number, size);
-      while (toPrune > 0) {
-        _evict();
-        toPrune--;
-      }
-    },
-    /** Clears all key-value pairs from the cache. */
-    clear() {
-      if (typeof onEviction === "function") {
-        const iterator = keyMap.values();
-        for (let result = iterator.next(); !result.done; result = iterator.next())
-          onEviction(keyList[result.value], valList[result.value]);
-      }
-      keyMap.clear();
-      keyList.fill(void 0);
-      valList.fill(void 0);
-      free = [];
-      size = 0;
-      head = tail = 0;
-    },
-    /** Resizes the cache to a new maximum size, evicting items if necessary. */
-    resize: (newMax) => {
-      if (!(Number.isInteger(newMax) && newMax > 0))
-        throw new TypeError("`max` must be a positive integer");
-      if (newMax === max) return;
-      if (newMax < max) {
-        let current = tail;
-        const preserve = Math.min(size, newMax);
-        const remove = size - preserve;
-        const newKeyList = new Array(newMax);
-        const newValList = new Array(newMax);
-        const newNext = new Array(newMax);
-        const newPrev = new Array(newMax);
-        for (let i = 1; i <= remove; i++)
-          onEviction == null ? void 0 : onEviction(keyList[i], valList[i]);
-        for (let i = preserve - 1; i >= 0; i--) {
-          newKeyList[i] = keyList[current];
-          newValList[i] = valList[current];
-          newNext[i] = i + 1;
-          newPrev[i] = i - 1;
-          keyMap.set(newKeyList[i], i);
-          current = prev[current];
-        }
-        head = 0;
-        tail = preserve - 1;
-        size = preserve;
-        keyList.length = newMax;
-        valList.length = newMax;
-        next.length = newMax;
-        prev.length = newMax;
-        for (let i = 0; i < preserve; i++) {
-          keyList[i] = newKeyList[i];
-          valList[i] = newValList[i];
-          next[i] = newNext[i];
-          prev[i] = newPrev[i];
-        }
-        free = [];
-        for (let i = preserve; i < newMax; i++) free.push(i);
-      } else {
-        const fill = newMax - max;
-        keyList.push(...new Array(fill).fill(void 0));
-        valList.push(...new Array(fill).fill(void 0));
-        next.push(...new Array(fill).fill(0));
-        prev.push(...new Array(fill).fill(0));
-      }
-      max = newMax;
-    },
-    /** Returns the maximum number of items that can be stored in the cache. */
-    get max() {
-      return max;
-    },
-    /** Returns the number of items currently stored in the cache. */
-    get size() {
-      return size;
-    },
-    /** Returns the number of currently available slots in the cache before reaching the maximum size. */
-    get available() {
-      return max - size;
-    }
-  };
-};
-export {
-  createLRU
-};
Index: uckSimulator-main/ds-db-ws/node_modules/lru.min/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/lru.min/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,89 +1,0 @@
-{
-  "name": "lru.min",
-  "version": "1.1.2",
-  "description": "🔥 An extremely fast and efficient LRU cache for JavaScript with high compatibility (including Browsers) — 6.8KB.",
-  "main": "./lib/index.js",
-  "module": "./lib/index.mjs",
-  "types": "./lib/index.d.ts",
-  "license": "MIT",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/wellwelwel/lru.min.git"
-  },
-  "bugs": {
-    "url": "https://github.com/wellwelwel/lru.min/issues"
-  },
-  "author": "https://github.com/wellwelwel",
-  "funding": {
-    "type": "github",
-    "url": "https://github.com/sponsors/wellwelwel"
-  },
-  "files": [
-    "browser",
-    "lib"
-  ],
-  "engines": {
-    "node": ">=8.0.0",
-    "bun": ">=1.0.0",
-    "deno": ">=1.30.0"
-  },
-  "scripts": {
-    "benchmark:esm": "cd benchmark && npm ci && node index.mjs",
-    "benchmark:cjs": "cd benchmark && npm ci && node index.cjs",
-    "prebuild": "rm -rf ./browser ./lib",
-    "build:browser": "tsx tools/browserfy.ts",
-    "build:esm": "esbuild src/index.ts --outfile=lib/index.mjs --platform=node --target=node12 --format=esm",
-    "build": "tsc && npm run build:esm && npm run build:browser",
-    "test:node": "poku",
-    "test:bun": "bun poku",
-    "test:deno": "deno run -A npm:poku",
-    "test:coverage": "mcr --import tsx --config mcr.config.ts npm run test:node",
-    "lint": "npx @biomejs/biome lint && prettier --check .",
-    "lint:fix": "npx @biomejs/biome lint --write && prettier --write .github/workflows/*.yml .",
-    "update": "pu minor && npm i && npm audit fix",
-    "postupdate": "npm run lint:fix",
-    "size": "ls -lh lib/index.mjs | awk '{print $5}'"
-  },
-  "devDependencies": {
-    "@babel/core": "^7.26.9",
-    "@babel/preset-env": "^7.26.9",
-    "@biomejs/biome": "^1.9.4",
-    "@types/babel__core": "^7.20.5",
-    "@types/node": "^22.13.10",
-    "esbuild": "^0.25.0",
-    "monocart-coverage-reports": "2.12.1",
-    "packages-update": "^2.0.0",
-    "poku": "^3.0.1",
-    "prettier": "^3.5.3",
-    "terser": "^5.39.0",
-    "tsx": "^4.19.3",
-    "typescript": "^5.8.2"
-  },
-  "exports": {
-    ".": {
-      "import": {
-        "types": "./lib/index.d.ts",
-        "default": "./lib/index.mjs"
-      },
-      "require": {
-        "types": "./lib/index.d.ts",
-        "default": "./lib/index.js"
-      }
-    }
-  },
-  "keywords": [
-    "lru",
-    "cache",
-    "caching",
-    "hash",
-    "node",
-    "nodejs",
-    "bun",
-    "deno",
-    "typescript",
-    "browser",
-    "fast",
-    "lru-cache",
-    "quick-lru"
-  ]
-}
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/License
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/License	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,19 +1,0 @@
-Copyright (c) 2016 Andrey Sidorov (sidorares@yandex.ru) and contributors
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,114 +1,0 @@
-[npm-image]: https://img.shields.io/npm/v/mysql2.svg
-[npm-url]: https://npmjs.com/package/mysql2
-[node-version-image]: https://img.shields.io/node/v/mysql2.svg
-[node-version-url]: https://nodejs.org/en/download
-[downloads-image]: https://img.shields.io/npm/dm/mysql2.svg
-[downloads-url]: https://npmjs.com/package/mysql2
-[license-url]: https://github.com/sidorares/node-mysql2/blob/master/License
-[license-image]: https://img.shields.io/npm/l/mysql2.svg?maxAge=2592000
-[node-mysql]: https://github.com/mysqljs/mysql
-[mysqljs]: https://github.com/mysqljs
-[mysql-native]: https://github.com/sidorares/nodejs-mysql-native
-[sidorares]: https://github.com/sidorares
-[TooTallNate]: https://gist.github.com/TooTallNate
-[starttls.js]: https://gist.github.com/TooTallNate/848444
-[node-mariasql]: https://github.com/mscdex/node-mariasql
-[contributors]: https://github.com/sidorares/node-mysql2/graphs/contributors
-[contributing]: https://github.com/sidorares/node-mysql2/blob/master/Contributing.md
-[docs-base]: https://sidorares.github.io/node-mysql2/docs
-[docs-base-zh-CN]: https://sidorares.github.io/node-mysql2/zh-CN/docs
-[docs-base-pt-BR]: https://sidorares.github.io/node-mysql2/pt-BR/docs
-[docs-prepared-statements]: https://sidorares.github.io/node-mysql2/docs/documentation/prepared-statements
-[docs-mysql-server]: https://sidorares.github.io/node-mysql2/docs/documentation/mysql-server
-[docs-promise-wrapper]: https://sidorares.github.io/node-mysql2/docs/documentation/promise-wrapper
-[docs-authentication-switch]: https://sidorares.github.io/node-mysql2/docs/documentation/authentication-switch
-[docs-streams]: https://sidorares.github.io/node-mysql2/docs/documentation/extras
-[docs-typescript-docs]: https://sidorares.github.io/node-mysql2/docs/documentation/typescript-examples
-[docs-qs-pooling]: https://sidorares.github.io/node-mysql2/docs#using-connection-pools
-[docs-qs-first-query]: https://sidorares.github.io/node-mysql2/docs#first-query
-[docs-qs-using-prepared-statements]: https://sidorares.github.io/node-mysql2/docs#using-prepared-statements
-[docs-examples]: https://sidorares.github.io/node-mysql2/docs/examples
-[docs-faq]: https://sidorares.github.io/node-mysql2/docs/faq
-[docs-documentation]: https://sidorares.github.io/node-mysql2/docs/documentation
-[docs-contributing]: https://sidorares.github.io/node-mysql2/docs/contributing/website
-[coverage]: https://img.shields.io/codecov/c/github/sidorares/node-mysql2
-[coverage-url]: https://app.codecov.io/github/sidorares/node-mysql2
-[ci-url]: https://github.com/sidorares/node-mysql2/actions/workflows/ci-coverage.yml?query=branch%3Amaster
-[ci-image]: https://img.shields.io/github/actions/workflow/status/sidorares/node-mysql2/ci-coverage.yml?event=push&style=flat&label=CI&branch=master
-
-# MySQL2
-
-[![NPM Version][npm-image]][npm-url]
-[![NPM Downloads][downloads-image]][downloads-url]
-[![Node.js Version][node-version-image]][node-version-url]
-[![GitHub Workflow Status (with event)][ci-image]][ci-url]
-[![Codecov][coverage]][coverage-url]
-[![License][license-image]][license-url]
-
-[English][docs-base] | [简体中文][docs-base-zh-CN] | [Português (BR)][docs-base-pt-BR]
-
-> MySQL client for Node.js with focus on performance. Supports prepared statements, non-utf8 encodings, binary log protocol, compression, ssl [much more][docs-documentation].
-
-**Table of Contents**
-
-- [History and Why MySQL2](#history-and-why-mysql2)
-- [Installation](#installation)
-- [Documentation](#documentation)
-- [Acknowledgements](#acknowledgements)
-- [Contributing](#contributing)
-
-## History and Why MySQL2
-
-MySQL2 project is a continuation of [MySQL-Native][mysql-native]. Protocol parser code was rewritten from scratch and api changed to match popular [Node MySQL][node-mysql]. MySQL2 team is working together with [Node MySQL][node-mysql] team to factor out shared code and move it under [mysqljs][mysqljs] organization.
-
-MySQL2 is mostly API compatible with [Node MySQL][node-mysql] and supports majority of features. MySQL2 also offers these additional features:
-
-- Faster / Better Performance
-- [Prepared Statements][docs-prepared-statements]
-- MySQL Binary Log Protocol
-- [MySQL Server][docs-mysql-server]
-- Extended support for Encoding and Collation
-- [Promise Wrapper][docs-promise-wrapper]
-- Compression
-- SSL and [Authentication Switch][docs-authentication-switch]
-- [Custom Streams][docs-streams]
-- [Pooling][docs-qs-pooling]
-
-## Installation
-
-MySQL2 is free from native bindings and can be installed on Linux, Mac OS or Windows without any issues.
-
-```bash
-npm install --save mysql2
-```
-
-If you are using TypeScript, you will need to install `@types/node`.
-
-```bash
-npm install --save-dev @types/node
-```
-
-> For TypeScript documentation and examples, see [here][docs-typescript-docs].
-
-## Documentation
-
-- [Quickstart][docs-base]
-  - [First Query][docs-qs-first-query], [Using Prepared Statements][docs-qs-using-prepared-statements], [Using Connection Pools][docs-qs-pooling] and more.
-- [Documentation][docs-documentation]
-- [Examples][docs-examples]
-- [FAQ][docs-faq]
-
-## Acknowledgements
-
-- Internal protocol is written by [@sidorares][sidorares] [MySQL-Native][mysql-native].
-- Constants, SQL parameters interpolation, Pooling, `ConnectionConfig` class taken from [Node MySQL][node-mysql].
-- SSL upgrade code based on [@TooTallNate][TooTallNate] [code][starttls.js].
-- Secure connection / compressed connection api flags compatible to [MariaSQL][node-mariasql] client.
-- [Contributors][contributors].
-
-## Contributing
-
-Want to improve something in **MySQL2**?
-Please check [Contributing.md][contributing] for detailed instruction on how to get started.
-
-To contribute in **MySQL2 Documentation**, please visit the [Website Contributing Guidelines][docs-contributing] for detailed instruction on how to get started.
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1 +1,0 @@
-export * from './typings/mysql/index.js';
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,77 +1,0 @@
-'use strict';
-
-const SqlString = require('sqlstring');
-
-const ConnectionConfig = require('./lib/connection_config.js');
-const parserCache = require('./lib/parsers/parser_cache.js');
-
-const Connection = require('./lib/connection.js');
-
-exports.createConnection = require('./lib/create_connection.js');
-exports.connect = exports.createConnection;
-exports.Connection = Connection;
-exports.ConnectionConfig = ConnectionConfig;
-
-const Pool = require('./lib/pool.js');
-const PoolCluster = require('./lib/pool_cluster.js');
-const createPool = require('./lib/create_pool.js');
-const createPoolCluster = require('./lib/create_pool_cluster.js');
-
-exports.createPool = createPool;
-
-exports.createPoolCluster = createPoolCluster;
-
-exports.createQuery = Connection.createQuery;
-
-exports.Pool = Pool;
-
-exports.PoolCluster = PoolCluster;
-
-exports.createServer = function (handler) {
-  const Server = require('./lib/server.js');
-  const s = new Server();
-  if (handler) {
-    s.on('connection', handler);
-  }
-  return s;
-};
-
-exports.PoolConnection = require('./lib/pool_connection.js');
-exports.authPlugins = require('./lib/auth_plugins');
-exports.escape = SqlString.escape;
-exports.escapeId = SqlString.escapeId;
-exports.format = SqlString.format;
-exports.raw = SqlString.raw;
-
-exports.__defineGetter__(
-  'createConnectionPromise',
-  () => require('./promise.js').createConnection
-);
-
-exports.__defineGetter__(
-  'createPoolPromise',
-  () => require('./promise.js').createPool
-);
-
-exports.__defineGetter__(
-  'createPoolClusterPromise',
-  () => require('./promise.js').createPoolCluster
-);
-
-exports.__defineGetter__('Types', () => require('./lib/constants/types.js'));
-
-exports.__defineGetter__('Charsets', () =>
-  require('./lib/constants/charsets.js')
-);
-
-exports.__defineGetter__('CharsetToEncoding', () =>
-  require('./lib/constants/charset_encodings.js')
-);
-
-exports.setMaxParserCache = function (max) {
-  parserCache.setMaxCache(max);
-};
-
-exports.clearParserCache = function () {
-  parserCache.clearCache();
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_41.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_41.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,95 +1,0 @@
-'use strict';
-
-/*
-4.1 authentication: (http://bazaar.launchpad.net/~mysql/mysql-server/5.5/view/head:/sql/password.c)
-
-  SERVER:  public_seed=create_random_string()
-           send(public_seed)
-
-  CLIENT:  recv(public_seed)
-           hash_stage1=sha1("password")
-           hash_stage2=sha1(hash_stage1)
-           reply=xor(hash_stage1, sha1(public_seed,hash_stage2)
-
-           // this three steps are done in scramble()
-
-           send(reply)
-
-
-  SERVER:  recv(reply)
-           hash_stage1=xor(reply, sha1(public_seed,hash_stage2))
-           candidate_hash2=sha1(hash_stage1)
-           check(candidate_hash2==hash_stage2)
-
-server stores sha1(sha1(password)) ( hash_stag2)
-*/
-
-const crypto = require('crypto');
-
-function sha1(msg, msg1, msg2) {
-  const hash = crypto.createHash('sha1');
-  hash.update(msg);
-  if (msg1) {
-    hash.update(msg1);
-  }
-
-  if (msg2) {
-    hash.update(msg2);
-  }
-
-  return hash.digest();
-}
-
-function xor(a, b) {
-  const result = Buffer.allocUnsafe(a.length);
-  for (let i = 0; i < a.length; i++) {
-    result[i] = a[i] ^ b[i];
-  }
-  return result;
-}
-
-exports.xor = xor;
-
-function token(password, scramble1, scramble2) {
-  if (!password) {
-    return Buffer.alloc(0);
-  }
-  const stage1 = sha1(password);
-  return exports.calculateTokenFromPasswordSha(stage1, scramble1, scramble2);
-}
-
-exports.calculateTokenFromPasswordSha = function (
-  passwordSha,
-  scramble1,
-  scramble2
-) {
-  // we use AUTH 41 here, and we need only the bytes we just need.
-  const authPluginData1 = scramble1.slice(0, 8);
-  const authPluginData2 = scramble2.slice(0, 12);
-  const stage2 = sha1(passwordSha);
-  const stage3 = sha1(authPluginData1, authPluginData2, stage2);
-  return xor(stage3, passwordSha);
-};
-
-exports.calculateToken = token;
-
-exports.verifyToken = function (publicSeed1, publicSeed2, token, doubleSha) {
-  const hashStage1 = xor(token, sha1(publicSeed1, publicSeed2, doubleSha));
-  const candidateHash2 = sha1(hashStage1);
-  return candidateHash2.compare(doubleSha) === 0;
-};
-
-exports.doubleSha1 = function (password) {
-  return sha1(sha1(password));
-};
-
-function xorRotating(a, seed) {
-  const result = Buffer.allocUnsafe(a.length);
-  const seedLen = seed.length;
-
-  for (let i = 0; i < a.length; i++) {
-    result[i] = a[i] ^ seed[i % seedLen];
-  }
-  return result;
-}
-exports.xorRotating = xorRotating;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/caching_sha2_password.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/caching_sha2_password.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,108 +1,0 @@
-'use strict';
-
-// https://mysqlserverteam.com/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/
-
-const PLUGIN_NAME = 'caching_sha2_password';
-const crypto = require('crypto');
-const { xor, xorRotating } = require('../auth_41');
-
-const REQUEST_SERVER_KEY_PACKET = Buffer.from([2]);
-const FAST_AUTH_SUCCESS_PACKET = Buffer.from([3]);
-const PERFORM_FULL_AUTHENTICATION_PACKET = Buffer.from([4]);
-
-const STATE_INITIAL = 0;
-const STATE_TOKEN_SENT = 1;
-const STATE_WAIT_SERVER_KEY = 2;
-const STATE_FINAL = -1;
-
-function sha256(msg) {
-  const hash = crypto.createHash('sha256');
-  hash.update(msg);
-  return hash.digest();
-}
-
-function calculateToken(password, scramble) {
-  if (!password) {
-    return Buffer.alloc(0);
-  }
-  const stage1 = sha256(Buffer.from(password));
-  const stage2 = sha256(stage1);
-  const stage3 = sha256(Buffer.concat([stage2, scramble]));
-  return xor(stage1, stage3);
-}
-
-function encrypt(password, scramble, key) {
-  const stage1 = xorRotating(Buffer.from(`${password}\0`, 'utf8'), scramble);
-  return crypto.publicEncrypt(
-    {
-      key,
-      padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
-    },
-    stage1
-  );
-}
-
-module.exports =
-  (pluginOptions = {}) =>
-  ({ connection }) => {
-    let state = 0;
-    let scramble = null;
-
-    const password = connection.config.password;
-
-    const authWithKey = (serverKey) => {
-      const _password = encrypt(password, scramble, serverKey);
-      state = STATE_FINAL;
-      return _password;
-    };
-
-    return (data) => {
-      switch (state) {
-        case STATE_INITIAL:
-          scramble = data.slice(0, 20);
-          state = STATE_TOKEN_SENT;
-          return calculateToken(password, scramble);
-
-        case STATE_TOKEN_SENT:
-          if (FAST_AUTH_SUCCESS_PACKET.equals(data)) {
-            state = STATE_FINAL;
-            return null;
-          }
-
-          if (PERFORM_FULL_AUTHENTICATION_PACKET.equals(data)) {
-            const isSecureConnection =
-              typeof pluginOptions.overrideIsSecure === 'undefined'
-                ? connection.config.ssl || connection.config.socketPath
-                : pluginOptions.overrideIsSecure;
-            if (isSecureConnection) {
-              state = STATE_FINAL;
-              return Buffer.from(`${password}\0`, 'utf8');
-            }
-
-            // if client provides key we can save one extra roundrip on first connection
-            if (pluginOptions.serverPublicKey) {
-              return authWithKey(pluginOptions.serverPublicKey);
-            }
-
-            state = STATE_WAIT_SERVER_KEY;
-            return REQUEST_SERVER_KEY_PACKET;
-          }
-          throw new Error(
-            `Invalid AuthMoreData packet received by ${PLUGIN_NAME} plugin in STATE_TOKEN_SENT state.`
-          );
-        case STATE_WAIT_SERVER_KEY:
-          if (pluginOptions.onServerPublicKey) {
-            pluginOptions.onServerPublicKey(data);
-          }
-          return authWithKey(data);
-        case STATE_FINAL:
-          throw new Error(
-            `Unexpected data in AuthMoreData packet received by ${PLUGIN_NAME} plugin in STATE_FINAL state.`
-          );
-      }
-
-      throw new Error(
-        `Unexpected data in AuthMoreData packet received by ${PLUGIN_NAME} plugin in state ${state}`
-      );
-    };
-  };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/caching_sha2_password.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/caching_sha2_password.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,18 +1,0 @@
-##
-
-https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html
-
-```js
-const mysql = require('mysql');
-mysql.createConnection({
-  authPlugins: {
-    caching_sha2_password: mysql.authPlugins.caching_sha2_password({
-      onServerPublikKey: function (key) {
-        console.log(key);
-      },
-      serverPublicKey: 'xxxyyy',
-      overrideIsSecure: true, //
-    }),
-  },
-});
-```
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,8 +1,0 @@
-'use strict';
-
-module.exports = {
-  caching_sha2_password: require('./caching_sha2_password'),
-  mysql_clear_password: require('./mysql_clear_password'),
-  mysql_native_password: require('./mysql_native_password'),
-  sha256_password: require('./sha256_password'),
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/mysql_clear_password.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/mysql_clear_password.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,17 +1,0 @@
-'use strict';
-
-function bufferFromStr(str) {
-  return Buffer.from(`${str}\0`);
-}
-
-const create_mysql_clear_password_plugin = (pluginOptions) =>
-  function mysql_clear_password_plugin({ connection, command }) {
-    const password =
-      command.password || pluginOptions.password || connection.config.password;
-
-    return function (/* pluginData */) {
-      return bufferFromStr(password);
-    };
-  };
-
-module.exports = create_mysql_clear_password_plugin;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/mysql_native_password.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/mysql_native_password.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,34 +1,0 @@
-'use strict';
-
-//const PLUGIN_NAME = 'mysql_native_password';
-const auth41 = require('../auth_41.js');
-
-module.exports =
-  (pluginOptions) =>
-  ({ connection, command }) => {
-    const password =
-      command.password || pluginOptions.password || connection.config.password;
-    const passwordSha1 =
-      command.passwordSha1 ||
-      pluginOptions.passwordSha1 ||
-      connection.config.passwordSha1;
-    return (data) => {
-      const authPluginData1 = data.slice(0, 8);
-      const authPluginData2 = data.slice(8, 20);
-      let authToken;
-      if (passwordSha1) {
-        authToken = auth41.calculateTokenFromPasswordSha(
-          passwordSha1,
-          authPluginData1,
-          authPluginData2
-        );
-      } else {
-        authToken = auth41.calculateToken(
-          password,
-          authPluginData1,
-          authPluginData2
-        );
-      }
-      return authToken;
-    };
-  };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/sha256_password.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/auth_plugins/sha256_password.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,59 +1,0 @@
-'use strict';
-
-const PLUGIN_NAME = 'sha256_password';
-const crypto = require('crypto');
-const { xorRotating } = require('../auth_41');
-
-const REQUEST_SERVER_KEY_PACKET = Buffer.from([1]);
-
-const STATE_INITIAL = 0;
-const STATE_WAIT_SERVER_KEY = 1;
-const STATE_FINAL = -1;
-
-function encrypt(password, scramble, key) {
-  const stage1 = xorRotating(Buffer.from(`${password}\0`, 'utf8'), scramble);
-  return crypto.publicEncrypt(key, stage1);
-}
-
-module.exports =
-  (pluginOptions = {}) =>
-  ({ connection }) => {
-    let state = 0;
-    let scramble = null;
-
-    const password = connection.config.password;
-
-    const authWithKey = (serverKey) => {
-      const _password = encrypt(password, scramble, serverKey);
-      state = STATE_FINAL;
-      return _password;
-    };
-
-    return (data) => {
-      switch (state) {
-        case STATE_INITIAL:
-          scramble = data.slice(0, 20);
-          // if client provides key we can save one extra roundrip on first connection
-          if (pluginOptions.serverPublicKey) {
-            return authWithKey(pluginOptions.serverPublicKey);
-          }
-
-          state = STATE_WAIT_SERVER_KEY;
-          return REQUEST_SERVER_KEY_PACKET;
-
-        case STATE_WAIT_SERVER_KEY:
-          if (pluginOptions.onServerPublicKey) {
-            pluginOptions.onServerPublicKey(data);
-          }
-          return authWithKey(data);
-        case STATE_FINAL:
-          throw new Error(
-            `Unexpected data in AuthMoreData packet received by ${PLUGIN_NAME} plugin in STATE_FINAL state.`
-          );
-      }
-
-      throw new Error(
-        `Unexpected data in AuthMoreData packet received by ${PLUGIN_NAME} plugin in state ${state}`
-      );
-    };
-  };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/base/connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/base/connection.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,945 +1,0 @@
-// This file was modified by Oracle on June 1, 2021.
-// The changes involve new logic to handle an additional ERR Packet sent by
-// the MySQL server when the connection is closed unexpectedly.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-// This file was modified by Oracle on June 17, 2021.
-// The changes involve logic to ensure the socket connection is closed when
-// there is a fatal error.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-// This file was modified by Oracle on September 21, 2021.
-// The changes involve passing additional authentication factor passwords
-// to the ChangeUser Command instance.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const Net = require('net');
-const Tls = require('tls');
-const Timers = require('timers');
-const EventEmitter = require('events').EventEmitter;
-const Readable = require('stream').Readable;
-const Queue = require('denque');
-const SqlString = require('sqlstring');
-const { createLRU } = require('lru.min');
-const PacketParser = require('../packet_parser.js');
-const Packets = require('../packets/index.js');
-const Commands = require('../commands/index.js');
-const ConnectionConfig = require('../connection_config.js');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-
-let _connectionId = 0;
-
-let convertNamedPlaceholders = null;
-
-class BaseConnection extends EventEmitter {
-  constructor(opts) {
-    super();
-    this.config = opts.config;
-    // TODO: fill defaults
-    // if no params, connect to /var/lib/mysql/mysql.sock ( /tmp/mysql.sock on OSX )
-    // if host is given, connect to host:3306
-    // TODO: use `/usr/local/mysql/bin/mysql_config --socket` output? as default socketPath
-    // if there is no host/port and no socketPath parameters?
-    if (!opts.config.stream) {
-      if (opts.config.socketPath) {
-        this.stream = Net.connect(opts.config.socketPath);
-      } else {
-        this.stream = Net.connect(opts.config.port, opts.config.host);
-
-        // Optionally enable keep-alive on the socket.
-        if (this.config.enableKeepAlive) {
-          this.stream.on('connect', () => {
-            this.stream.setKeepAlive(true, this.config.keepAliveInitialDelay);
-          });
-        }
-
-        // Enable TCP_NODELAY flag. This is needed so that the network packets
-        // are sent immediately to the server
-        this.stream.setNoDelay(true);
-      }
-      // if stream is a function, treat it as "stream agent / factory"
-    } else if (typeof opts.config.stream === 'function') {
-      this.stream = opts.config.stream(opts);
-    } else {
-      this.stream = opts.config.stream;
-    }
-
-    this._internalId = _connectionId++;
-    this._commands = new Queue();
-    this._command = null;
-    this._paused = false;
-    this._paused_packets = new Queue();
-    this._statements = createLRU({
-      max: this.config.maxPreparedStatements,
-      onEviction: function (_, statement) {
-        statement.close();
-      },
-    });
-    this.serverCapabilityFlags = 0;
-    this.authorized = false;
-    this.sequenceId = 0;
-    this.compressedSequenceId = 0;
-    this.threadId = null;
-    this._handshakePacket = null;
-    this._fatalError = null;
-    this._protocolError = null;
-    this._outOfOrderPackets = [];
-    this.clientEncoding = CharsetToEncoding[this.config.charsetNumber];
-    this.stream.on('error', this._handleNetworkError.bind(this));
-    // see https://gist.github.com/khoomeister/4985691#use-that-instead-of-bind
-    this.packetParser = new PacketParser((p) => {
-      this.handlePacket(p);
-    });
-    this.stream.on('data', (data) => {
-      if (this.connectTimeout) {
-        Timers.clearTimeout(this.connectTimeout);
-        this.connectTimeout = null;
-      }
-      this.packetParser.execute(data);
-    });
-    this.stream.on('end', () => {
-      // emit the end event so that the pooled connection can close the connection
-      this.emit('end');
-    });
-    this.stream.on('close', () => {
-      // we need to set this flag everywhere where we want connection to close
-      if (this._closing) {
-        return;
-      }
-      if (!this._protocolError) {
-        // no particular error message before disconnect
-        this._protocolError = new Error(
-          'Connection lost: The server closed the connection.'
-        );
-        this._protocolError.fatal = true;
-        this._protocolError.code = 'PROTOCOL_CONNECTION_LOST';
-      }
-      this._notifyError(this._protocolError);
-    });
-    let handshakeCommand;
-    if (!this.config.isServer) {
-      handshakeCommand = new Commands.ClientHandshake(this.config.clientFlags);
-      handshakeCommand.on('end', () => {
-        // this happens when handshake finishes early either because there was
-        // some fatal error or the server sent an error packet instead of
-        // an hello packet (for example, 'Too many connections' error)
-        if (
-          !handshakeCommand.handshake ||
-          this._fatalError ||
-          this._protocolError
-        ) {
-          return;
-        }
-        this._handshakePacket = handshakeCommand.handshake;
-        this.threadId = handshakeCommand.handshake.connectionId;
-        this.emit('connect', handshakeCommand.handshake);
-      });
-      handshakeCommand.on('error', (err) => {
-        this._closing = true;
-        this._notifyError(err);
-      });
-      this.addCommand(handshakeCommand);
-    }
-    // in case there was no initial handshake but we need to read sting, assume it utf-8
-    // most common example: "Too many connections" error ( packet is sent immediately on connection attempt, we don't know server encoding yet)
-    // will be overwritten with actual encoding value as soon as server handshake packet is received
-    this.serverEncoding = 'utf8';
-    if (this.config.connectTimeout) {
-      const timeoutHandler = this._handleTimeoutError.bind(this);
-      this.connectTimeout = Timers.setTimeout(
-        timeoutHandler,
-        this.config.connectTimeout
-      );
-    }
-  }
-
-  _addCommandClosedState(cmd) {
-    const err = new Error(
-      "Can't add new command when connection is in closed state"
-    );
-    err.fatal = true;
-    if (cmd.onResult) {
-      cmd.onResult(err);
-    } else {
-      this.emit('error', err);
-    }
-  }
-
-  _handleFatalError(err) {
-    err.fatal = true;
-    // stop receiving packets
-    this.stream.removeAllListeners('data');
-    this.addCommand = this._addCommandClosedState;
-    this.write = () => {
-      this.emit('error', new Error("Can't write in closed state"));
-    };
-    this._notifyError(err);
-    this._fatalError = err;
-  }
-
-  _handleNetworkError(err) {
-    if (this.connectTimeout) {
-      Timers.clearTimeout(this.connectTimeout);
-      this.connectTimeout = null;
-    }
-    // Do not throw an error when a connection ends with a RST,ACK packet
-    if (err.code === 'ECONNRESET' && this._closing) {
-      return;
-    }
-    this._handleFatalError(err);
-  }
-
-  _handleTimeoutError() {
-    if (this.connectTimeout) {
-      Timers.clearTimeout(this.connectTimeout);
-      this.connectTimeout = null;
-    }
-    this.stream.destroy && this.stream.destroy();
-    const err = new Error('connect ETIMEDOUT');
-    err.errorno = 'ETIMEDOUT';
-    err.code = 'ETIMEDOUT';
-    err.syscall = 'connect';
-    this._handleNetworkError(err);
-  }
-
-  // notify all commands in the queue and bubble error as connection "error"
-  // called on stream error or unexpected termination
-  _notifyError(err) {
-    if (this.connectTimeout) {
-      Timers.clearTimeout(this.connectTimeout);
-      this.connectTimeout = null;
-    }
-    // prevent from emitting 'PROTOCOL_CONNECTION_LOST' after EPIPE or ECONNRESET
-    if (this._fatalError) {
-      return;
-    }
-    let command;
-    // if there is no active command, notify connection
-    // if there are commands and all of them have callbacks, pass error via callback
-    let bubbleErrorToConnection = !this._command;
-    if (this._command && this._command.onResult) {
-      this._command.onResult(err);
-      this._command = null;
-      // connection handshake is special because we allow it to be implicit
-      // if error happened during handshake, but there are others commands in queue
-      // then bubble error to other commands and not to connection
-    } else if (
-      !(
-        this._command &&
-        this._command.constructor === Commands.ClientHandshake &&
-        this._commands.length > 0
-      )
-    ) {
-      bubbleErrorToConnection = true;
-    }
-    while ((command = this._commands.shift())) {
-      if (command.onResult) {
-        command.onResult(err);
-      } else {
-        bubbleErrorToConnection = true;
-      }
-    }
-    // notify connection if some comands in the queue did not have callbacks
-    // or if this is pool connection ( so it can be removed from pool )
-    if (bubbleErrorToConnection || this._pool) {
-      this.emit('error', err);
-    }
-    // close connection after emitting the event in case of a fatal error
-    if (err.fatal) {
-      this.close();
-    }
-  }
-
-  write(buffer) {
-    const result = this.stream.write(buffer, (err) => {
-      if (err) {
-        this._handleNetworkError(err);
-      }
-    });
-
-    if (!result) {
-      this.stream.emit('pause');
-    }
-  }
-
-  // http://dev.mysql.com/doc/internals/en/sequence-id.html
-  //
-  // The sequence-id is incremented with each packet and may wrap around.
-  // It starts at 0 and is reset to 0 when a new command
-  // begins in the Command Phase.
-  // http://dev.mysql.com/doc/internals/en/example-several-mysql-packets.html
-  _resetSequenceId() {
-    this.sequenceId = 0;
-    this.compressedSequenceId = 0;
-  }
-
-  _bumpCompressedSequenceId(numPackets) {
-    this.compressedSequenceId += numPackets;
-    this.compressedSequenceId %= 256;
-  }
-
-  _bumpSequenceId(numPackets) {
-    this.sequenceId += numPackets;
-    this.sequenceId %= 256;
-  }
-
-  writePacket(packet) {
-    const MAX_PACKET_LENGTH = 16777215;
-    const length = packet.length();
-    let chunk, offset, header;
-    if (length < MAX_PACKET_LENGTH) {
-      packet.writeHeader(this.sequenceId);
-      if (this.config.debug) {
-        console.log(
-          `${this._internalId} ${this.connectionId} <== ${this._command._commandName}#${this._command.stateName()}(${[this.sequenceId, packet._name, packet.length()].join(',')})`
-        );
-        console.log(
-          `${this._internalId} ${this.connectionId} <== ${packet.buffer.toString('hex')}`
-        );
-      }
-      this._bumpSequenceId(1);
-      this.write(packet.buffer);
-    } else {
-      if (this.config.debug) {
-        console.log(
-          `${this._internalId} ${this.connectionId} <== Writing large packet, raw content not written:`
-        );
-        console.log(
-          `${this._internalId} ${this.connectionId} <== ${this._command._commandName}#${this._command.stateName()}(${[this.sequenceId, packet._name, packet.length()].join(',')})`
-        );
-      }
-      for (offset = 4; offset < 4 + length; offset += MAX_PACKET_LENGTH) {
-        chunk = packet.buffer.slice(offset, offset + MAX_PACKET_LENGTH);
-        if (chunk.length === MAX_PACKET_LENGTH) {
-          header = Buffer.from([0xff, 0xff, 0xff, this.sequenceId]);
-        } else {
-          header = Buffer.from([
-            chunk.length & 0xff,
-            (chunk.length >> 8) & 0xff,
-            (chunk.length >> 16) & 0xff,
-            this.sequenceId,
-          ]);
-        }
-        this._bumpSequenceId(1);
-        this.write(header);
-        this.write(chunk);
-      }
-    }
-  }
-
-  // 0.11+ environment
-  startTLS(onSecure) {
-    if (this.config.debug) {
-      console.log('Upgrading connection to TLS');
-    }
-    const secureContext = Tls.createSecureContext({
-      ca: this.config.ssl.ca,
-      cert: this.config.ssl.cert,
-      ciphers: this.config.ssl.ciphers,
-      key: this.config.ssl.key,
-      passphrase: this.config.ssl.passphrase,
-      minVersion: this.config.ssl.minVersion,
-      maxVersion: this.config.ssl.maxVersion,
-    });
-    const rejectUnauthorized = this.config.ssl.rejectUnauthorized;
-    const verifyIdentity = this.config.ssl.verifyIdentity;
-    const servername = this.config.host;
-
-    let secureEstablished = false;
-    this.stream.removeAllListeners('data');
-    const secureSocket = Tls.connect(
-      {
-        rejectUnauthorized,
-        requestCert: rejectUnauthorized,
-        checkServerIdentity: verifyIdentity
-          ? Tls.checkServerIdentity
-          : function () {
-              return undefined;
-            },
-        secureContext,
-        isServer: false,
-        socket: this.stream,
-        servername,
-      },
-      () => {
-        secureEstablished = true;
-        if (rejectUnauthorized) {
-          if (typeof servername === 'string' && verifyIdentity) {
-            const cert = secureSocket.getPeerCertificate(true);
-            const serverIdentityCheckError = Tls.checkServerIdentity(
-              servername,
-              cert
-            );
-            if (serverIdentityCheckError) {
-              onSecure(serverIdentityCheckError);
-              return;
-            }
-          }
-        }
-        onSecure();
-      }
-    );
-    // error handler for secure socket
-    secureSocket.on('error', (err) => {
-      if (secureEstablished) {
-        this._handleNetworkError(err);
-      } else {
-        onSecure(err);
-      }
-    });
-    secureSocket.on('data', (data) => {
-      this.packetParser.execute(data);
-    });
-    this.write = (buffer) => secureSocket.write(buffer);
-  }
-
-  protocolError(message, code) {
-    // Starting with MySQL 8.0.24, if the client closes the connection
-    // unexpectedly, the server will send a last ERR Packet, which we can
-    // safely ignore.
-    // https://dev.mysql.com/worklog/task/?id=12999
-    if (this._closing) {
-      return;
-    }
-
-    const err = new Error(message);
-    err.fatal = true;
-    err.code = code || 'PROTOCOL_ERROR';
-    this.emit('error', err);
-  }
-
-  get fatalError() {
-    return this._fatalError;
-  }
-
-  handlePacket(packet) {
-    if (this._paused) {
-      this._paused_packets.push(packet);
-      return;
-    }
-    if (this.config.debug) {
-      if (packet) {
-        console.log(
-          ` raw: ${packet.buffer
-            .slice(packet.offset, packet.offset + packet.length())
-            .toString('hex')}`
-        );
-        console.trace();
-        const commandName = this._command
-          ? this._command._commandName
-          : '(no command)';
-        const stateName = this._command
-          ? this._command.stateName()
-          : '(no command)';
-        console.log(
-          `${this._internalId} ${this.connectionId} ==> ${commandName}#${stateName}(${[packet.sequenceId, packet.type(), packet.length()].join(',')})`
-        );
-      }
-    }
-    if (!this._command) {
-      const marker = packet.peekByte();
-      // If it's an Err Packet, we should use it.
-      if (marker === 0xff) {
-        const error = Packets.Error.fromPacket(packet);
-        this.protocolError(error.message, error.code);
-      } else {
-        // Otherwise, it means it's some other unexpected packet.
-        this.protocolError(
-          'Unexpected packet while no commands in the queue',
-          'PROTOCOL_UNEXPECTED_PACKET'
-        );
-      }
-      this.close();
-      return;
-    }
-    if (packet) {
-      // Note: when server closes connection due to inactivity, Err packet ER_CLIENT_INTERACTION_TIMEOUT from MySQL 8.0.24, sequenceId will be 0
-      if (this.sequenceId !== packet.sequenceId) {
-        const err = new Error(
-          `Warning: got packets out of order. Expected ${this.sequenceId} but received ${packet.sequenceId}`
-        );
-        err.expected = this.sequenceId;
-        err.received = packet.sequenceId;
-        this.emit('warn', err); // REVIEW
-        console.error(err.message);
-      }
-      this._bumpSequenceId(packet.numPackets);
-    }
-    try {
-      if (this._fatalError) {
-        // skip remaining packets after client is in the error state
-        return;
-      }
-      const done = this._command.execute(packet, this);
-      if (done) {
-        this._command = this._commands.shift();
-        if (this._command) {
-          this.sequenceId = 0;
-          this.compressedSequenceId = 0;
-          this.handlePacket();
-        }
-      }
-    } catch (err) {
-      this._handleFatalError(err);
-      this.stream.destroy();
-    }
-  }
-
-  addCommand(cmd) {
-    // this.compressedSequenceId = 0;
-    // this.sequenceId = 0;
-    if (this.config.debug) {
-      const commandName = cmd.constructor.name;
-      console.log(`Add command: ${commandName}`);
-      cmd._commandName = commandName;
-    }
-    if (!this._command) {
-      this._command = cmd;
-      this.handlePacket();
-    } else {
-      this._commands.push(cmd);
-    }
-    return cmd;
-  }
-
-  format(sql, values) {
-    if (typeof this.config.queryFormat === 'function') {
-      return this.config.queryFormat.call(
-        this,
-        sql,
-        values,
-        this.config.timezone
-      );
-    }
-    const opts = {
-      sql: sql,
-      values: values,
-    };
-    this._resolveNamedPlaceholders(opts);
-    return SqlString.format(
-      opts.sql,
-      opts.values,
-      this.config.stringifyObjects,
-      this.config.timezone
-    );
-  }
-
-  escape(value) {
-    return SqlString.escape(value, false, this.config.timezone);
-  }
-
-  escapeId(value) {
-    return SqlString.escapeId(value, false);
-  }
-
-  raw(sql) {
-    return SqlString.raw(sql);
-  }
-
-  _resolveNamedPlaceholders(options) {
-    let unnamed;
-    if (this.config.namedPlaceholders || options.namedPlaceholders) {
-      if (Array.isArray(options.values)) {
-        // if an array is provided as the values, assume the conversion is not necessary.
-        // this allows the usage of unnamed placeholders even if the namedPlaceholders flag is enabled.
-        return;
-      }
-      if (convertNamedPlaceholders === null) {
-        convertNamedPlaceholders = require('named-placeholders')();
-      }
-      unnamed = convertNamedPlaceholders(options.sql, options.values);
-      options.sql = unnamed[0];
-      options.values = unnamed[1];
-    }
-  }
-
-  query(sql, values, cb) {
-    let cmdQuery;
-    if (sql.constructor === Commands.Query) {
-      cmdQuery = sql;
-    } else {
-      cmdQuery = BaseConnection.createQuery(sql, values, cb, this.config);
-    }
-    this._resolveNamedPlaceholders(cmdQuery);
-    const rawSql = this.format(
-      cmdQuery.sql,
-      cmdQuery.values !== undefined ? cmdQuery.values : []
-    );
-    cmdQuery.sql = rawSql;
-    return this.addCommand(cmdQuery);
-  }
-
-  pause() {
-    this._paused = true;
-    this.stream.pause();
-  }
-
-  resume() {
-    let packet;
-    this._paused = false;
-    while ((packet = this._paused_packets.shift())) {
-      this.handlePacket(packet);
-      // don't resume if packet handler paused connection
-      if (this._paused) {
-        return;
-      }
-    }
-    this.stream.resume();
-  }
-
-  // TODO: named placeholders support
-  prepare(options, cb) {
-    if (typeof options === 'string') {
-      options = { sql: options };
-    }
-    return this.addCommand(new Commands.Prepare(options, cb));
-  }
-
-  unprepare(sql) {
-    let options = {};
-    if (typeof sql === 'object') {
-      options = sql;
-    } else {
-      options.sql = sql;
-    }
-    const key = BaseConnection.statementKey(options);
-    const stmt = this._statements.get(key);
-    if (stmt) {
-      this._statements.delete(key);
-      stmt.close();
-    }
-    return stmt;
-  }
-
-  execute(sql, values, cb) {
-    let options = {
-      infileStreamFactory: this.config.infileStreamFactory,
-    };
-    if (typeof sql === 'object') {
-      // execute(options, cb)
-      options = {
-        ...options,
-        ...sql,
-        sql: sql.sql,
-        values: sql.values,
-      };
-      if (typeof values === 'function') {
-        cb = values;
-      } else {
-        options.values = options.values || values;
-      }
-    } else if (typeof values === 'function') {
-      // execute(sql, cb)
-      cb = values;
-      options.sql = sql;
-      options.values = undefined;
-    } else {
-      // execute(sql, values, cb)
-      options.sql = sql;
-      options.values = values;
-    }
-    this._resolveNamedPlaceholders(options);
-    // check for values containing undefined
-    if (options.values) {
-      //If namedPlaceholder is not enabled and object is passed as bind parameters
-      if (!Array.isArray(options.values)) {
-        throw new TypeError(
-          'Bind parameters must be array if namedPlaceholders parameter is not enabled'
-        );
-      }
-      options.values.forEach((val) => {
-        //If namedPlaceholder is not enabled and object is passed as bind parameters
-        if (!Array.isArray(options.values)) {
-          throw new TypeError(
-            'Bind parameters must be array if namedPlaceholders parameter is not enabled'
-          );
-        }
-        if (val === undefined) {
-          throw new TypeError(
-            'Bind parameters must not contain undefined. To pass SQL NULL specify JS null'
-          );
-        }
-        if (typeof val === 'function') {
-          throw new TypeError(
-            'Bind parameters must not contain function(s). To pass the body of a function as a string call .toString() first'
-          );
-        }
-      });
-    }
-    const executeCommand = new Commands.Execute(options, cb);
-    const prepareCommand = new Commands.Prepare(options, (err, stmt) => {
-      if (err) {
-        // skip execute command if prepare failed, we have main
-        // combined callback here
-        executeCommand.start = function () {
-          return null;
-        };
-        if (cb) {
-          cb(err);
-        } else {
-          executeCommand.emit('error', err);
-        }
-        executeCommand.emit('end');
-        return;
-      }
-      executeCommand.statement = stmt;
-    });
-    this.addCommand(prepareCommand);
-    this.addCommand(executeCommand);
-    return executeCommand;
-  }
-
-  changeUser(options, callback) {
-    if (!callback && typeof options === 'function') {
-      callback = options;
-      options = {};
-    }
-    const charsetNumber = options.charset
-      ? ConnectionConfig.getCharsetNumber(options.charset)
-      : this.config.charsetNumber;
-    return this.addCommand(
-      new Commands.ChangeUser(
-        {
-          user: options.user || this.config.user,
-          // for the purpose of multi-factor authentication, or not, the main
-          // password (used for the 1st authentication factor) can also be
-          // provided via the "password1" option
-          password:
-            options.password ||
-            options.password1 ||
-            this.config.password ||
-            this.config.password1,
-          password2: options.password2 || this.config.password2,
-          password3: options.password3 || this.config.password3,
-          passwordSha1: options.passwordSha1 || this.config.passwordSha1,
-          database: options.database || this.config.database,
-          timeout: options.timeout,
-          charsetNumber: charsetNumber,
-          currentConfig: this.config,
-        },
-        (err) => {
-          if (err) {
-            err.fatal = true;
-          }
-          if (callback) {
-            callback(err);
-          }
-        }
-      )
-    );
-  }
-
-  // transaction helpers
-  beginTransaction(cb) {
-    return this.query('START TRANSACTION', cb);
-  }
-
-  commit(cb) {
-    return this.query('COMMIT', cb);
-  }
-
-  rollback(cb) {
-    return this.query('ROLLBACK', cb);
-  }
-
-  ping(cb) {
-    return this.addCommand(new Commands.Ping(cb));
-  }
-
-  _registerSlave(opts, cb) {
-    return this.addCommand(new Commands.RegisterSlave(opts, cb));
-  }
-
-  _binlogDump(opts, cb) {
-    return this.addCommand(new Commands.BinlogDump(opts, cb));
-  }
-
-  // currently just alias to close
-  destroy() {
-    this.close();
-  }
-
-  close() {
-    if (this.connectTimeout) {
-      Timers.clearTimeout(this.connectTimeout);
-      this.connectTimeout = null;
-    }
-    this._closing = true;
-    this.stream.end();
-    this.addCommand = this._addCommandClosedState;
-  }
-
-  createBinlogStream(opts) {
-    // TODO: create proper stream class
-    // TODO: use through2
-    let test = 1;
-    const stream = new Readable({ objectMode: true });
-    stream._read = function () {
-      return {
-        data: test++,
-      };
-    };
-    this._registerSlave(opts, () => {
-      const dumpCmd = this._binlogDump(opts);
-      dumpCmd.on('event', (ev) => {
-        stream.push(ev);
-      });
-      dumpCmd.on('eof', () => {
-        stream.push(null);
-        // if non-blocking, then close stream to prevent errors
-        if (opts.flags && opts.flags & 0x01) {
-          this.close();
-        }
-      });
-      // TODO: pipe errors as well
-    });
-    return stream;
-  }
-
-  connect(cb) {
-    if (!cb) {
-      return;
-    }
-    if (this._fatalError || this._protocolError) {
-      return cb(this._fatalError || this._protocolError);
-    }
-    if (this._handshakePacket) {
-      return cb(null, this);
-    }
-    let connectCalled = 0;
-    function callbackOnce(isErrorHandler) {
-      return function (param) {
-        if (!connectCalled) {
-          if (isErrorHandler) {
-            cb(param);
-          } else {
-            cb(null, param);
-          }
-        }
-        connectCalled = 1;
-      };
-    }
-    this.once('error', callbackOnce(true));
-    this.once('connect', callbackOnce(false));
-  }
-
-  // ===================================
-  // outgoing server connection methods
-  // ===================================
-  writeColumns(columns) {
-    this.writePacket(Packets.ResultSetHeader.toPacket(columns.length));
-    columns.forEach((column) => {
-      this.writePacket(
-        Packets.ColumnDefinition.toPacket(column, this.serverConfig.encoding)
-      );
-    });
-    this.writeEof();
-  }
-
-  // row is array of columns, not hash
-  writeTextRow(column) {
-    this.writePacket(
-      Packets.TextRow.toPacket(column, this.serverConfig.encoding)
-    );
-  }
-
-  writeBinaryRow(column) {
-    this.writePacket(
-      Packets.BinaryRow.toPacket(column, this.serverConfig.encoding)
-    );
-  }
-
-  writeTextResult(rows, columns, binary = false) {
-    this.writeColumns(columns);
-    rows.forEach((row) => {
-      const arrayRow = new Array(columns.length);
-      columns.forEach((column) => {
-        arrayRow.push(row[column.name]);
-      });
-      if (binary) {
-        this.writeBinaryRow(arrayRow);
-      } else this.writeTextRow(arrayRow);
-    });
-    this.writeEof();
-  }
-
-  writeEof(warnings, statusFlags) {
-    this.writePacket(Packets.EOF.toPacket(warnings, statusFlags));
-  }
-
-  writeOk(args) {
-    if (!args) {
-      args = { affectedRows: 0 };
-    }
-    this.writePacket(Packets.OK.toPacket(args, this.serverConfig.encoding));
-  }
-
-  writeError(args) {
-    // if we want to send error before initial hello was sent, use default encoding
-    const encoding = this.serverConfig ? this.serverConfig.encoding : 'cesu8';
-    this.writePacket(Packets.Error.toPacket(args, encoding));
-  }
-
-  serverHandshake(args) {
-    this.serverConfig = args;
-    this.serverConfig.encoding =
-      CharsetToEncoding[this.serverConfig.characterSet];
-    return this.addCommand(new Commands.ServerHandshake(args));
-  }
-
-  // ===============================================================
-  end(callback) {
-    if (this.config.isServer) {
-      this._closing = true;
-      const quitCmd = new EventEmitter();
-      setImmediate(() => {
-        this.stream.end();
-        quitCmd.emit('end');
-      });
-      return quitCmd;
-    }
-    // trigger error if more commands enqueued after end command
-    const quitCmd = this.addCommand(new Commands.Quit(callback));
-    this.addCommand = this._addCommandClosedState;
-    return quitCmd;
-  }
-
-  static createQuery(sql, values, cb, config) {
-    let options = {
-      rowsAsArray: config.rowsAsArray,
-      infileStreamFactory: config.infileStreamFactory,
-    };
-    if (typeof sql === 'object') {
-      // query(options, cb)
-      options = {
-        ...options,
-        ...sql,
-        sql: sql.sql,
-        values: sql.values,
-      };
-      if (typeof values === 'function') {
-        cb = values;
-      } else if (values !== undefined) {
-        options.values = values;
-      }
-    } else if (typeof values === 'function') {
-      // query(sql, cb)
-      cb = values;
-      options.sql = sql;
-      options.values = undefined;
-    } else {
-      // query(sql, values, cb)
-      options.sql = sql;
-      options.values = values;
-    }
-    return new Commands.Query(options, cb);
-  }
-
-  static statementKey(options) {
-    return `${typeof options.nestTables}/${options.nestTables}/${options.rowsAsArray}${options.sql}`;
-  }
-}
-
-module.exports = BaseConnection;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/base/pool.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/base/pool.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,233 +1,0 @@
-'use strict';
-
-const process = require('process');
-const SqlString = require('sqlstring');
-const EventEmitter = require('events').EventEmitter;
-const PoolConnection = require('../pool_connection.js');
-const Queue = require('denque');
-const BaseConnection = require('./connection.js');
-
-function spliceConnection(queue, connection) {
-  const len = queue.length;
-  for (let i = 0; i < len; i++) {
-    if (queue.get(i) === connection) {
-      queue.removeOne(i);
-      break;
-    }
-  }
-}
-
-class BasePool extends EventEmitter {
-  constructor(options) {
-    super();
-    this.config = options.config;
-    this.config.connectionConfig.pool = this;
-    this._allConnections = new Queue();
-    this._freeConnections = new Queue();
-    this._connectionQueue = new Queue();
-    this._closed = false;
-    if (this.config.maxIdle < this.config.connectionLimit) {
-      // create idle connection timeout automatically release job
-      this._removeIdleTimeoutConnections();
-    }
-  }
-
-  getConnection(cb) {
-    if (this._closed) {
-      return process.nextTick(() => cb(new Error('Pool is closed.')));
-    }
-    let connection;
-    if (this._freeConnections.length > 0) {
-      connection = this._freeConnections.pop();
-      this.emit('acquire', connection);
-      return process.nextTick(() => cb(null, connection));
-    }
-    if (
-      this.config.connectionLimit === 0 ||
-      this._allConnections.length < this.config.connectionLimit
-    ) {
-      connection = new PoolConnection(this, {
-        config: this.config.connectionConfig,
-      });
-      this._allConnections.push(connection);
-      return connection.connect((err) => {
-        if (this._closed) {
-          return cb(new Error('Pool is closed.'));
-        }
-        if (err) {
-          return cb(err);
-        }
-        this.emit('connection', connection);
-        this.emit('acquire', connection);
-        return cb(null, connection);
-      });
-    }
-    if (!this.config.waitForConnections) {
-      return process.nextTick(() => cb(new Error('No connections available.')));
-    }
-    if (
-      this.config.queueLimit &&
-      this._connectionQueue.length >= this.config.queueLimit
-    ) {
-      return cb(new Error('Queue limit reached.'));
-    }
-    this.emit('enqueue');
-    return this._connectionQueue.push(cb);
-  }
-
-  releaseConnection(connection) {
-    let cb;
-    if (!connection._pool) {
-      // The connection has been removed from the pool and is no longer good.
-      if (this._connectionQueue.length) {
-        cb = this._connectionQueue.shift();
-        process.nextTick(this.getConnection.bind(this, cb));
-      }
-    } else if (this._connectionQueue.length) {
-      cb = this._connectionQueue.shift();
-      process.nextTick(cb.bind(null, null, connection));
-    } else {
-      this._freeConnections.push(connection);
-      this.emit('release', connection);
-    }
-  }
-
-  end(cb) {
-    this._closed = true;
-    clearTimeout(this._removeIdleTimeoutConnectionsTimer);
-    if (typeof cb !== 'function') {
-      cb = function (err) {
-        if (err) {
-          throw err;
-        }
-      };
-    }
-    let calledBack = false;
-    let closedConnections = 0;
-    let connection;
-    const endCB = function (err) {
-      if (calledBack) {
-        return;
-      }
-      if (err || ++closedConnections >= this._allConnections.length) {
-        calledBack = true;
-        cb(err);
-        return;
-      }
-    }.bind(this);
-    if (this._allConnections.length === 0) {
-      endCB();
-      return;
-    }
-    for (let i = 0; i < this._allConnections.length; i++) {
-      connection = this._allConnections.get(i);
-      connection._realEnd(endCB);
-    }
-  }
-
-  query(sql, values, cb) {
-    const cmdQuery = BaseConnection.createQuery(
-      sql,
-      values,
-      cb,
-      this.config.connectionConfig
-    );
-    if (typeof cmdQuery.namedPlaceholders === 'undefined') {
-      cmdQuery.namedPlaceholders =
-        this.config.connectionConfig.namedPlaceholders;
-    }
-    this.getConnection((err, conn) => {
-      if (err) {
-        if (typeof cmdQuery.onResult === 'function') {
-          cmdQuery.onResult(err);
-        } else {
-          cmdQuery.emit('error', err);
-        }
-        return;
-      }
-      try {
-        conn.query(cmdQuery).once('end', () => {
-          conn.release();
-        });
-      } catch (e) {
-        conn.release();
-        throw e;
-      }
-    });
-    return cmdQuery;
-  }
-
-  execute(sql, values, cb) {
-    // TODO construct execute command first here and pass it to connection.execute
-    // so that polymorphic arguments logic is there in one place
-    if (typeof values === 'function') {
-      cb = values;
-      values = [];
-    }
-    this.getConnection((err, conn) => {
-      if (err) {
-        return cb(err);
-      }
-      try {
-        conn.execute(sql, values, cb).once('end', () => {
-          conn.release();
-        });
-      } catch (e) {
-        conn.release();
-        return cb(e);
-      }
-    });
-  }
-
-  _removeConnection(connection) {
-    // Remove connection from all connections
-    spliceConnection(this._allConnections, connection);
-    // Remove connection from free connections
-    spliceConnection(this._freeConnections, connection);
-    this.releaseConnection(connection);
-  }
-
-  _removeIdleTimeoutConnections() {
-    if (this._removeIdleTimeoutConnectionsTimer) {
-      clearTimeout(this._removeIdleTimeoutConnectionsTimer);
-    }
-
-    this._removeIdleTimeoutConnectionsTimer = setTimeout(() => {
-      try {
-        while (
-          this._freeConnections.length > this.config.maxIdle ||
-          (this._freeConnections.length > 0 &&
-            Date.now() - this._freeConnections.get(0).lastActiveTime >
-              this.config.idleTimeout)
-        ) {
-          this._freeConnections.get(0).destroy();
-        }
-      } finally {
-        this._removeIdleTimeoutConnections();
-      }
-    }, 1000);
-  }
-
-  format(sql, values) {
-    return SqlString.format(
-      sql,
-      values,
-      this.config.connectionConfig.stringifyObjects,
-      this.config.connectionConfig.timezone
-    );
-  }
-
-  escape(value) {
-    return SqlString.escape(
-      value,
-      this.config.connectionConfig.stringifyObjects,
-      this.config.connectionConfig.timezone
-    );
-  }
-
-  escapeId(value) {
-    return SqlString.escapeId(value, false);
-  }
-}
-
-module.exports = BasePool;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/base/pool_connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/base/pool_connection.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,63 +1,0 @@
-'use strict';
-
-const BaseConnection = require('./connection.js');
-
-class BasePoolConnection extends BaseConnection {
-  constructor(pool, options) {
-    super(options);
-    this._pool = pool;
-    // The last active time of this connection
-    this.lastActiveTime = Date.now();
-    // When a fatal error occurs the connection's protocol ends, which will cause
-    // the connection to end as well, thus we only need to watch for the end event
-    // and we will be notified of disconnects.
-    // REVIEW: Moved to `once`
-    this.once('end', () => {
-      this._removeFromPool();
-    });
-    this.once('error', () => {
-      this._removeFromPool();
-    });
-  }
-
-  release() {
-    if (!this._pool || this._pool._closed) {
-      return;
-    }
-    // update last active time
-    this.lastActiveTime = Date.now();
-    this._pool.releaseConnection(this);
-  }
-
-  end() {
-    const err = new Error(
-      'Calling conn.end() to release a pooled connection is ' +
-        'deprecated. In next version calling conn.end() will be ' +
-        'restored to default conn.end() behavior. Use ' +
-        'conn.release() instead.'
-    );
-    this.emit('warn', err);
-    console.warn(err.message);
-    this.release();
-  }
-
-  destroy() {
-    this._removeFromPool();
-    super.destroy();
-  }
-
-  _removeFromPool() {
-    if (!this._pool || this._pool._closed) {
-      return;
-    }
-    const pool = this._pool;
-    this._pool = null;
-    pool._removeConnection(this);
-  }
-}
-
-BasePoolConnection.statementKey = BaseConnection.statementKey;
-module.exports = BasePoolConnection;
-
-// TODO: Remove this when we are removing PoolConnection#end
-BasePoolConnection.prototype._realEnd = BaseConnection.prototype.end;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/auth_switch.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/auth_switch.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,111 +1,0 @@
-// This file was modified by Oracle on July 5, 2021.
-// Errors generated by asynchronous authentication plugins are now being
-// handled and subsequently emitted at the command level.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const Packets = require('../packets/index.js');
-const sha256_password = require('../auth_plugins/sha256_password');
-const caching_sha2_password = require('../auth_plugins/caching_sha2_password.js');
-const mysql_native_password = require('../auth_plugins/mysql_native_password.js');
-const mysql_clear_password = require('../auth_plugins/mysql_clear_password.js');
-
-const standardAuthPlugins = {
-  sha256_password: sha256_password({}),
-  caching_sha2_password: caching_sha2_password({}),
-  mysql_native_password: mysql_native_password({}),
-  mysql_clear_password: mysql_clear_password({}),
-};
-
-function warnLegacyAuthSwitch() {
-  console.warn(
-    'WARNING! authSwitchHandler api is deprecated, please use new authPlugins api'
-  );
-}
-
-function authSwitchPluginError(error, command) {
-  // Authentication errors are fatal
-  error.code = 'AUTH_SWITCH_PLUGIN_ERROR';
-  error.fatal = true;
-
-  command.emit('error', error);
-}
-
-function authSwitchRequest(packet, connection, command) {
-  const { pluginName, pluginData } =
-    Packets.AuthSwitchRequest.fromPacket(packet);
-  let authPlugin =
-    connection.config.authPlugins && connection.config.authPlugins[pluginName];
-
-  // legacy plugin api don't allow to override mysql_native_password
-  // if pluginName is mysql_native_password it's using standard auth4.1 auth
-  if (
-    connection.config.authSwitchHandler &&
-    pluginName !== 'mysql_native_password'
-  ) {
-    const legacySwitchHandler = connection.config.authSwitchHandler;
-    warnLegacyAuthSwitch();
-    legacySwitchHandler({ pluginName, pluginData }, (err, data) => {
-      if (err) {
-        return authSwitchPluginError(err, command);
-      }
-      connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket());
-    });
-    return;
-  }
-  if (!authPlugin) {
-    authPlugin = standardAuthPlugins[pluginName];
-  }
-  if (!authPlugin) {
-    throw new Error(
-      `Server requests authentication using unknown plugin ${pluginName}. See ${'TODO: add plugins doco here'} on how to configure or author authentication plugins.`
-    );
-  }
-  connection._authPlugin = authPlugin({ connection, command });
-  Promise.resolve(connection._authPlugin(pluginData))
-    .then((data) => {
-      if (data) {
-        connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket());
-      }
-    })
-    .catch((err) => {
-      authSwitchPluginError(err, command);
-    });
-}
-
-function authSwitchRequestMoreData(packet, connection, command) {
-  const { data } = Packets.AuthSwitchRequestMoreData.fromPacket(packet);
-
-  if (connection.config.authSwitchHandler) {
-    const legacySwitchHandler = connection.config.authSwitchHandler;
-    warnLegacyAuthSwitch();
-    legacySwitchHandler({ pluginData: data }, (err, data) => {
-      if (err) {
-        return authSwitchPluginError(err, command);
-      }
-      connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket());
-    });
-    return;
-  }
-
-  if (!connection._authPlugin) {
-    throw new Error(
-      'AuthPluginMoreData received but no auth plugin instance found'
-    );
-  }
-  Promise.resolve(connection._authPlugin(data))
-    .then((data) => {
-      if (data) {
-        connection.writePacket(new Packets.AuthSwitchResponse(data).toPacket());
-      }
-    })
-    .catch((err) => {
-      authSwitchPluginError(err, command);
-    });
-}
-
-module.exports = {
-  authSwitchRequest,
-  authSwitchRequestMoreData,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/binlog_dump.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/binlog_dump.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,109 +1,0 @@
-'use strict';
-
-const Command = require('./command');
-const Packets = require('../packets');
-
-const eventParsers = [];
-
-class BinlogEventHeader {
-  constructor(packet) {
-    this.timestamp = packet.readInt32();
-    this.eventType = packet.readInt8();
-    this.serverId = packet.readInt32();
-    this.eventSize = packet.readInt32();
-    this.logPos = packet.readInt32();
-    this.flags = packet.readInt16();
-  }
-}
-
-class BinlogDump extends Command {
-  constructor(opts) {
-    super();
-    // this.onResult = callback;
-    this.opts = opts;
-  }
-
-  start(packet, connection) {
-    const newPacket = new Packets.BinlogDump(this.opts);
-    connection.writePacket(newPacket.toPacket(1));
-    return BinlogDump.prototype.binlogData;
-  }
-
-  binlogData(packet) {
-    // ok - continue consuming events
-    // error - error
-    // eof - end of binlog
-    if (packet.isEOF()) {
-      this.emit('eof');
-      return null;
-    }
-    // binlog event header
-    packet.readInt8();
-    const header = new BinlogEventHeader(packet);
-    const EventParser = eventParsers[header.eventType];
-    let event;
-    if (EventParser) {
-      event = new EventParser(packet);
-    } else {
-      event = {
-        name: 'UNKNOWN',
-      };
-    }
-    event.header = header;
-    this.emit('event', event);
-    return BinlogDump.prototype.binlogData;
-  }
-}
-
-class RotateEvent {
-  constructor(packet) {
-    this.pposition = packet.readInt32();
-    // TODO: read uint64 here
-    packet.readInt32(); // positionDword2
-    this.nextBinlog = packet.readString();
-    this.name = 'RotateEvent';
-  }
-}
-
-class FormatDescriptionEvent {
-  constructor(packet) {
-    this.binlogVersion = packet.readInt16();
-    this.serverVersion = packet.readString(50).replace(/\u0000.*/, ''); // eslint-disable-line no-control-regex
-    this.createTimestamp = packet.readInt32();
-    this.eventHeaderLength = packet.readInt8(); // should be 19
-    this.eventsLength = packet.readBuffer();
-    this.name = 'FormatDescriptionEvent';
-  }
-}
-
-class QueryEvent {
-  constructor(packet) {
-    const parseStatusVars = require('../packets/binlog_query_statusvars.js');
-    this.slaveProxyId = packet.readInt32();
-    this.executionTime = packet.readInt32();
-    const schemaLength = packet.readInt8();
-    this.errorCode = packet.readInt16();
-    const statusVarsLength = packet.readInt16();
-    const statusVars = packet.readBuffer(statusVarsLength);
-    this.schema = packet.readString(schemaLength);
-    packet.readInt8(); // should be zero
-    this.statusVars = parseStatusVars(statusVars);
-    this.query = packet.readString();
-    this.name = 'QueryEvent';
-  }
-}
-
-class XidEvent {
-  constructor(packet) {
-    this.binlogVersion = packet.readInt16();
-    this.xid = packet.readInt64();
-    this.name = 'XidEvent';
-  }
-}
-
-eventParsers[2] = QueryEvent;
-eventParsers[4] = RotateEvent;
-eventParsers[15] = FormatDescriptionEvent;
-eventParsers[16] = XidEvent;
-
-module.exports = BinlogDump;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/change_user.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/change_user.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,68 +1,0 @@
-// This file was modified by Oracle on September 21, 2021.
-// The changes involve saving additional authentication factor passwords
-// in the command scope and enabling multi-factor authentication in the
-// client-side when the server supports it.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const Command = require('./command.js');
-const Packets = require('../packets/index.js');
-const ClientConstants = require('../constants/client');
-const ClientHandshake = require('./client_handshake.js');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-
-class ChangeUser extends Command {
-  constructor(options, callback) {
-    super();
-    this.onResult = callback;
-    this.user = options.user;
-    this.password = options.password;
-    // "password1" is an alias of "password"
-    this.password1 = options.password;
-    this.password2 = options.password2;
-    this.password3 = options.password3;
-    this.database = options.database;
-    this.passwordSha1 = options.passwordSha1;
-    this.charsetNumber = options.charsetNumber;
-    this.currentConfig = options.currentConfig;
-    this.authenticationFactor = 0;
-  }
-  start(packet, connection) {
-    const newPacket = new Packets.ChangeUser({
-      flags: connection.config.clientFlags,
-      user: this.user,
-      database: this.database,
-      charsetNumber: this.charsetNumber,
-      password: this.password,
-      passwordSha1: this.passwordSha1,
-      authPluginData1: connection._handshakePacket.authPluginData1,
-      authPluginData2: connection._handshakePacket.authPluginData2,
-    });
-    this.currentConfig.user = this.user;
-    this.currentConfig.password = this.password;
-    this.currentConfig.database = this.database;
-    this.currentConfig.charsetNumber = this.charsetNumber;
-    connection.clientEncoding = CharsetToEncoding[this.charsetNumber];
-    // clear prepared statements cache as all statements become invalid after changeUser
-    connection._statements.clear();
-    connection.writePacket(newPacket.toPacket());
-    // check if the server supports multi-factor authentication
-    const multiFactorAuthentication =
-      connection.serverCapabilityFlags &
-      ClientConstants.MULTI_FACTOR_AUTHENTICATION;
-    if (multiFactorAuthentication) {
-      // if the server supports multi-factor authentication, we enable it in
-      // the client
-      this.authenticationFactor = 1;
-    }
-    return ChangeUser.prototype.handshakeResult;
-  }
-}
-
-ChangeUser.prototype.handshakeResult =
-  ClientHandshake.prototype.handshakeResult;
-ChangeUser.prototype.calculateNativePasswordAuthToken =
-  ClientHandshake.prototype.calculateNativePasswordAuthToken;
-
-module.exports = ChangeUser;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/client_handshake.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/client_handshake.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,241 +1,0 @@
-// This file was modified by Oracle on June 17, 2021.
-// Handshake errors are now maked as fatal and the corresponding events are
-// emitted in the command instance itself.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-// This file was modified by Oracle on September 21, 2021.
-// Handshake workflow now supports additional authentication factors requested
-// by the server.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const Command = require('./command.js');
-const Packets = require('../packets/index.js');
-const ClientConstants = require('../constants/client.js');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-const auth41 = require('../auth_41.js');
-
-function flagNames(flags) {
-  const res = [];
-  for (const c in ClientConstants) {
-    if (flags & ClientConstants[c]) {
-      res.push(c.replace(/_/g, ' ').toLowerCase());
-    }
-  }
-  return res;
-}
-
-class ClientHandshake extends Command {
-  constructor(clientFlags) {
-    super();
-    this.handshake = null;
-    this.clientFlags = clientFlags;
-    this.authenticationFactor = 0;
-  }
-
-  start() {
-    return ClientHandshake.prototype.handshakeInit;
-  }
-
-  sendSSLRequest(connection) {
-    const sslRequest = new Packets.SSLRequest(
-      this.clientFlags,
-      connection.config.charsetNumber
-    );
-    connection.writePacket(sslRequest.toPacket());
-  }
-
-  sendCredentials(connection) {
-    if (connection.config.debug) {
-      // eslint-disable-next-line
-      console.log(
-        'Sending handshake packet: flags:%d=(%s)',
-        this.clientFlags,
-        flagNames(this.clientFlags).join(', ')
-      );
-    }
-    this.user = connection.config.user;
-    this.password = connection.config.password;
-    // "password1" is an alias to the original "password" value
-    // to make it easier to integrate multi-factor authentication
-    this.password1 = connection.config.password;
-    // "password2" and "password3" are the 2nd and 3rd factor authentication
-    // passwords, which can be undefined depending on the authentication
-    // plugin being used
-    this.password2 = connection.config.password2;
-    this.password3 = connection.config.password3;
-    this.passwordSha1 = connection.config.passwordSha1;
-    this.database = connection.config.database;
-    this.authPluginName = this.handshake.authPluginName;
-    const handshakeResponse = new Packets.HandshakeResponse({
-      flags: this.clientFlags,
-      user: this.user,
-      database: this.database,
-      password: this.password,
-      passwordSha1: this.passwordSha1,
-      charsetNumber: connection.config.charsetNumber,
-      authPluginData1: this.handshake.authPluginData1,
-      authPluginData2: this.handshake.authPluginData2,
-      compress: connection.config.compress,
-      connectAttributes: connection.config.connectAttributes,
-    });
-    connection.writePacket(handshakeResponse.toPacket());
-  }
-
-  calculateNativePasswordAuthToken(authPluginData) {
-    // TODO: dont split into authPluginData1 and authPluginData2, instead join when 1 & 2 received
-    const authPluginData1 = authPluginData.slice(0, 8);
-    const authPluginData2 = authPluginData.slice(8, 20);
-    let authToken;
-    if (this.passwordSha1) {
-      authToken = auth41.calculateTokenFromPasswordSha(
-        this.passwordSha1,
-        authPluginData1,
-        authPluginData2
-      );
-    } else {
-      authToken = auth41.calculateToken(
-        this.password,
-        authPluginData1,
-        authPluginData2
-      );
-    }
-    return authToken;
-  }
-
-  handshakeInit(helloPacket, connection) {
-    this.on('error', (e) => {
-      connection._fatalError = e;
-      connection._protocolError = e;
-    });
-    this.handshake = Packets.Handshake.fromPacket(helloPacket);
-    if (connection.config.debug) {
-      // eslint-disable-next-line
-      console.log(
-        'Server hello packet: capability flags:%d=(%s)',
-        this.handshake.capabilityFlags,
-        flagNames(this.handshake.capabilityFlags).join(', ')
-      );
-    }
-    connection.serverCapabilityFlags = this.handshake.capabilityFlags;
-    connection.serverEncoding = CharsetToEncoding[this.handshake.characterSet];
-    connection.connectionId = this.handshake.connectionId;
-    const serverSSLSupport =
-      this.handshake.capabilityFlags & ClientConstants.SSL;
-    // multi factor authentication is enabled with the
-    // "MULTI_FACTOR_AUTHENTICATION" capability and should only be used if it
-    // is supported by the server
-    const multiFactorAuthentication =
-      this.handshake.capabilityFlags &
-      ClientConstants.MULTI_FACTOR_AUTHENTICATION;
-    this.clientFlags = this.clientFlags | multiFactorAuthentication;
-    // use compression only if requested by client and supported by server
-    connection.config.compress =
-      connection.config.compress &&
-      this.handshake.capabilityFlags & ClientConstants.COMPRESS;
-    this.clientFlags = this.clientFlags | connection.config.compress;
-    if (connection.config.ssl) {
-      // client requires SSL but server does not support it
-      if (!serverSSLSupport) {
-        const err = new Error('Server does not support secure connection');
-        err.code = 'HANDSHAKE_NO_SSL_SUPPORT';
-        err.fatal = true;
-        this.emit('error', err);
-        return false;
-      }
-      // send ssl upgrade request and immediately upgrade connection to secure
-      this.clientFlags |= ClientConstants.SSL;
-      this.sendSSLRequest(connection);
-      connection.startTLS((err) => {
-        // after connection is secure
-        if (err) {
-          // SSL negotiation error are fatal
-          err.code = 'HANDSHAKE_SSL_ERROR';
-          err.fatal = true;
-          this.emit('error', err);
-          return;
-        }
-        // rest of communication is encrypted
-        this.sendCredentials(connection);
-      });
-    } else {
-      this.sendCredentials(connection);
-    }
-    if (multiFactorAuthentication) {
-      // if the server supports multi-factor authentication, we enable it in
-      // the client
-      this.authenticationFactor = 1;
-    }
-    return ClientHandshake.prototype.handshakeResult;
-  }
-
-  handshakeResult(packet, connection) {
-    const marker = packet.peekByte();
-    // packet can be OK_Packet, ERR_Packet, AuthSwitchRequest, AuthNextFactor
-    // or AuthMoreData
-    if (marker === 0xfe || marker === 1 || marker === 0x02) {
-      const authSwitch = require('./auth_switch');
-      try {
-        if (marker === 1) {
-          authSwitch.authSwitchRequestMoreData(packet, connection, this);
-        } else {
-          // if authenticationFactor === 0, it means the server does not support
-          // the multi-factor authentication capability
-          if (this.authenticationFactor !== 0) {
-            // if we are past the first authentication factor, we should use the
-            // corresponding password (if there is one)
-            connection.config.password =
-              this[`password${this.authenticationFactor}`];
-            // update the current authentication factor
-            this.authenticationFactor += 1;
-          }
-          // if marker === 0x02, it means it is an AuthNextFactor packet,
-          // which is similar in structure to an AuthSwitchRequest packet,
-          // so, we can use it directly
-          authSwitch.authSwitchRequest(packet, connection, this);
-        }
-        return ClientHandshake.prototype.handshakeResult;
-      } catch (err) {
-        // Authentication errors are fatal
-        err.code = 'AUTH_SWITCH_PLUGIN_ERROR';
-        err.fatal = true;
-
-        if (this.onResult) {
-          this.onResult(err);
-        } else {
-          this.emit('error', err);
-        }
-        return null;
-      }
-    }
-    if (marker !== 0) {
-      const err = new Error('Unexpected packet during handshake phase');
-      // Unknown handshake errors are fatal
-      err.code = 'HANDSHAKE_UNKNOWN_ERROR';
-      err.fatal = true;
-
-      if (this.onResult) {
-        this.onResult(err);
-      } else {
-        this.emit('error', err);
-      }
-      return null;
-    }
-    // this should be called from ClientHandshake command only
-    // and skipped when called from ChangeUser command
-    if (!connection.authorized) {
-      connection.authorized = true;
-      if (connection.config.compress) {
-        const enableCompression =
-          require('../compressed_protocol.js').enableCompression;
-        enableCompression(connection);
-      }
-    }
-    if (this.onResult) {
-      this.onResult(null);
-    }
-    return null;
-  }
-}
-module.exports = ClientHandshake;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/close_statement.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/close_statement.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,18 +1,0 @@
-'use strict';
-
-const Command = require('./command');
-const Packets = require('../packets/index.js');
-
-class CloseStatement extends Command {
-  constructor(id) {
-    super();
-    this.id = id;
-  }
-
-  start(packet, connection) {
-    connection.writePacket(new Packets.CloseStatement(this.id).toPacket(1));
-    return null;
-  }
-}
-
-module.exports = CloseStatement;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/command.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/command.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,54 +1,0 @@
-'use strict';
-
-const EventEmitter = require('events').EventEmitter;
-const Timers = require('timers');
-
-class Command extends EventEmitter {
-  constructor() {
-    super();
-    this.next = null;
-  }
-
-  // slow. debug only
-  stateName() {
-    const state = this.next;
-    for (const i in this) {
-      if (this[i] === state && i !== 'next') {
-        return i;
-      }
-    }
-    return 'unknown name';
-  }
-
-  execute(packet, connection) {
-    if (!this.next) {
-      this.next = this.start;
-      connection._resetSequenceId();
-    }
-    if (packet && packet.isError()) {
-      const err = packet.asError(connection.clientEncoding);
-      err.sql = this.sql || this.query;
-      if (this.queryTimeout) {
-        Timers.clearTimeout(this.queryTimeout);
-        this.queryTimeout = null;
-      }
-      if (this.onResult) {
-        this.onResult(err);
-        this.emit('end');
-      } else {
-        this.emit('error', err);
-        this.emit('end');
-      }
-      return true;
-    }
-    // TODO: don't return anything from execute, it's ugly and error-prone. Listen for 'end' event in connection
-    this.next = this.next(packet, connection);
-    if (this.next) {
-      return false;
-    }
-    this.emit('end');
-    return true;
-  }
-}
-
-module.exports = Command;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/execute.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/execute.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,112 +1,0 @@
-'use strict';
-
-const Command = require('./command.js');
-const Query = require('./query.js');
-const Packets = require('../packets/index.js');
-
-const getBinaryParser = require('../parsers/binary_parser.js');
-const getStaticBinaryParser = require('../parsers/static_binary_parser.js');
-
-class Execute extends Command {
-  constructor(options, callback) {
-    super();
-    this.statement = options.statement;
-    this.sql = options.sql;
-    this.values = options.values;
-    this.onResult = callback;
-    this.parameters = options.values;
-    this.insertId = 0;
-    this.timeout = options.timeout;
-    this.queryTimeout = null;
-    this._rows = [];
-    this._fields = [];
-    this._result = [];
-    this._fieldCount = 0;
-    this._rowParser = null;
-    this._executeOptions = options;
-    this._resultIndex = 0;
-    this._localStream = null;
-    this._unpipeStream = function () {};
-    this._streamFactory = options.infileStreamFactory;
-    this._connection = null;
-  }
-
-  buildParserFromFields(fields, connection) {
-    if (this.options.disableEval) {
-      return getStaticBinaryParser(fields, this.options, connection.config);
-    }
-
-    return getBinaryParser(fields, this.options, connection.config);
-  }
-
-  start(packet, connection) {
-    this._connection = connection;
-    this.options = Object.assign({}, connection.config, this._executeOptions);
-    this._setTimeout();
-    const executePacket = new Packets.Execute(
-      this.statement.id,
-      this.parameters,
-      connection.config.charsetNumber,
-      connection.config.timezone
-    );
-    //For reasons why this try-catch is here, please see
-    // https://github.com/sidorares/node-mysql2/pull/689
-    //For additional discussion, see
-    // 1. https://github.com/sidorares/node-mysql2/issues/493
-    // 2. https://github.com/sidorares/node-mysql2/issues/187
-    // 3. https://github.com/sidorares/node-mysql2/issues/480
-    try {
-      connection.writePacket(executePacket.toPacket(1));
-    } catch (error) {
-      this.onResult(error);
-    }
-    return Execute.prototype.resultsetHeader;
-  }
-
-  readField(packet, connection) {
-    let fields;
-    // disabling for now, but would be great to find reliable way to parse fields only once
-    // fields reported by prepare can be empty at all or just incorrect - see #169
-    //
-    // perfomance optimisation: if we already have this field parsed in statement header, use one from header
-    // const field = this.statement.columns.length == this._fieldCount ?
-    //  this.statement.columns[this._receivedFieldsCount] : new Packets.ColumnDefinition(packet);
-    const field = new Packets.ColumnDefinition(
-      packet,
-      connection.clientEncoding
-    );
-    this._receivedFieldsCount++;
-    this._fields[this._resultIndex].push(field);
-    if (this._receivedFieldsCount === this._fieldCount) {
-      fields = this._fields[this._resultIndex];
-      this.emit('fields', fields, this._resultIndex);
-      return Execute.prototype.fieldsEOF;
-    }
-    return Execute.prototype.readField;
-  }
-
-  fieldsEOF(packet, connection) {
-    // check EOF
-    if (!packet.isEOF()) {
-      return connection.protocolError('Expected EOF packet');
-    }
-    this._rowParser = new (this.buildParserFromFields(
-      this._fields[this._resultIndex],
-      connection
-    ))();
-    return Execute.prototype.row;
-  }
-}
-
-Execute.prototype.done = Query.prototype.done;
-Execute.prototype.doneInsert = Query.prototype.doneInsert;
-Execute.prototype.resultsetHeader = Query.prototype.resultsetHeader;
-Execute.prototype._findOrCreateReadStream =
-  Query.prototype._findOrCreateReadStream;
-Execute.prototype._streamLocalInfile = Query.prototype._streamLocalInfile;
-Execute.prototype._setTimeout = Query.prototype._setTimeout;
-Execute.prototype._handleTimeoutError = Query.prototype._handleTimeoutError;
-Execute.prototype.row = Query.prototype.row;
-Execute.prototype.stream = Query.prototype.stream;
-
-module.exports = Execute;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,27 +1,0 @@
-'use strict';
-
-const ClientHandshake = require('./client_handshake.js');
-const ServerHandshake = require('./server_handshake.js');
-const Query = require('./query.js');
-const Prepare = require('./prepare.js');
-const CloseStatement = require('./close_statement.js');
-const Execute = require('./execute.js');
-const Ping = require('./ping.js');
-const RegisterSlave = require('./register_slave.js');
-const BinlogDump = require('./binlog_dump.js');
-const ChangeUser = require('./change_user.js');
-const Quit = require('./quit.js');
-
-module.exports = {
-  ClientHandshake,
-  ServerHandshake,
-  Query,
-  Prepare,
-  CloseStatement,
-  Execute,
-  Ping,
-  RegisterSlave,
-  BinlogDump,
-  ChangeUser,
-  Quit,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/ping.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/ping.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,36 +1,0 @@
-'use strict';
-
-const Command = require('./command');
-const CommandCode = require('../constants/commands');
-const Packet = require('../packets/packet');
-
-// TODO: time statistics?
-// usefull for queue size and network latency monitoring
-// store created,sent,reply timestamps
-class Ping extends Command {
-  constructor(callback) {
-    super();
-    this.onResult = callback;
-  }
-
-  start(packet, connection) {
-    const ping = new Packet(
-      0,
-      Buffer.from([1, 0, 0, 0, CommandCode.PING]),
-      0,
-      5
-    );
-    connection.writePacket(ping);
-    return Ping.prototype.pingResponse;
-  }
-
-  pingResponse() {
-    // TODO: check it's OK packet. error check already done in caller
-    if (this.onResult) {
-      process.nextTick(this.onResult.bind(this));
-    }
-    return null;
-  }
-}
-
-module.exports = Ping;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/prepare.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/prepare.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,143 +1,0 @@
-'use strict';
-
-const Packets = require('../packets/index.js');
-const Command = require('./command.js');
-const CloseStatement = require('./close_statement.js');
-const Execute = require('./execute.js');
-
-class PreparedStatementInfo {
-  constructor(query, id, columns, parameters, connection) {
-    this.query = query;
-    this.id = id;
-    this.columns = columns;
-    this.parameters = parameters;
-    this.rowParser = null;
-    this._connection = connection;
-  }
-
-  close() {
-    return this._connection.addCommand(new CloseStatement(this.id));
-  }
-
-  execute(parameters, callback) {
-    if (typeof parameters === 'function') {
-      callback = parameters;
-      parameters = [];
-    }
-    return this._connection.addCommand(
-      new Execute({ statement: this, values: parameters }, callback)
-    );
-  }
-}
-
-class Prepare extends Command {
-  constructor(options, callback) {
-    super();
-    this.query = options.sql;
-    this.onResult = callback;
-    this.id = 0;
-    this.fieldCount = 0;
-    this.parameterCount = 0;
-    this.fields = [];
-    this.parameterDefinitions = [];
-    this.options = options;
-  }
-
-  start(packet, connection) {
-    const Connection = connection.constructor;
-    this.key = Connection.statementKey(this.options);
-    const statement = connection._statements.get(this.key);
-    if (statement) {
-      if (this.onResult) {
-        this.onResult(null, statement);
-      }
-      return null;
-    }
-    const cmdPacket = new Packets.PrepareStatement(
-      this.query,
-      connection.config.charsetNumber,
-      this.options.values
-    );
-    connection.writePacket(cmdPacket.toPacket(1));
-    return Prepare.prototype.prepareHeader;
-  }
-
-  prepareHeader(packet, connection) {
-    const header = new Packets.PreparedStatementHeader(packet);
-    this.id = header.id;
-    this.fieldCount = header.fieldCount;
-    this.parameterCount = header.parameterCount;
-    if (this.parameterCount > 0) {
-      return Prepare.prototype.readParameter;
-    }
-    if (this.fieldCount > 0) {
-      return Prepare.prototype.readField;
-    }
-    return this.prepareDone(connection);
-  }
-
-  readParameter(packet, connection) {
-    // there might be scenarios when mysql server reports more parameters than
-    // are actually present in the array of parameter definitions.
-    // if EOF packet is received we switch to "read fields" state if there are
-    // any fields reported by the server, otherwise we finish the command.
-    if (packet.isEOF()) {
-      if (this.fieldCount > 0) {
-        return Prepare.prototype.readField;
-      }
-      return this.prepareDone(connection);
-    }
-    const def = new Packets.ColumnDefinition(packet, connection.clientEncoding);
-    this.parameterDefinitions.push(def);
-    if (this.parameterDefinitions.length === this.parameterCount) {
-      return Prepare.prototype.parametersEOF;
-    }
-    return this.readParameter;
-  }
-
-  readField(packet, connection) {
-    if (packet.isEOF()) {
-      return this.prepareDone(connection);
-    }
-    const def = new Packets.ColumnDefinition(packet, connection.clientEncoding);
-    this.fields.push(def);
-    if (this.fields.length === this.fieldCount) {
-      return Prepare.prototype.fieldsEOF;
-    }
-    return Prepare.prototype.readField;
-  }
-
-  parametersEOF(packet, connection) {
-    if (!packet.isEOF()) {
-      return connection.protocolError('Expected EOF packet after parameters');
-    }
-    if (this.fieldCount > 0) {
-      return Prepare.prototype.readField;
-    }
-    return this.prepareDone(connection);
-  }
-
-  fieldsEOF(packet, connection) {
-    if (!packet.isEOF()) {
-      return connection.protocolError('Expected EOF packet after fields');
-    }
-    return this.prepareDone(connection);
-  }
-
-  prepareDone(connection) {
-    const statement = new PreparedStatementInfo(
-      this.query,
-      this.id,
-      this.fields,
-      this.parameterDefinitions,
-      connection
-    );
-    connection._statements.set(this.key, statement);
-    if (this.onResult) {
-      this.onResult(null, statement);
-    }
-    return null;
-  }
-}
-
-module.exports = Prepare;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/query.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/query.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,329 +1,0 @@
-'use strict';
-
-const process = require('process');
-const Timers = require('timers');
-
-const Readable = require('stream').Readable;
-
-const Command = require('./command.js');
-const Packets = require('../packets/index.js');
-const getTextParser = require('../parsers/text_parser.js');
-const staticParser = require('../parsers/static_text_parser.js');
-const ServerStatus = require('../constants/server_status.js');
-
-const EmptyPacket = new Packets.Packet(0, Buffer.allocUnsafe(4), 0, 4);
-
-// http://dev.mysql.com/doc/internals/en/com-query.html
-class Query extends Command {
-  constructor(options, callback) {
-    super();
-    this.sql = options.sql;
-    this.values = options.values;
-    this._queryOptions = options;
-    this.namedPlaceholders = options.namedPlaceholders || false;
-    this.onResult = callback;
-    this.timeout = options.timeout;
-    this.queryTimeout = null;
-    this._fieldCount = 0;
-    this._rowParser = null;
-    this._fields = [];
-    this._rows = [];
-    this._receivedFieldsCount = 0;
-    this._resultIndex = 0;
-    this._localStream = null;
-    this._unpipeStream = function () {};
-    this._streamFactory = options.infileStreamFactory;
-    this._connection = null;
-  }
-
-  then() {
-    const err =
-      "You have tried to call .then(), .catch(), or invoked await on the result of query that is not a promise, which is a programming error. Try calling con.promise().query(), or require('mysql2/promise') instead of 'mysql2' for a promise-compatible version of the query interface. To learn how to use async/await or Promises check out documentation at https://sidorares.github.io/node-mysql2/docs#using-promise-wrapper, or the mysql2 documentation at https://sidorares.github.io/node-mysql2/docs/documentation/promise-wrapper";
-    // eslint-disable-next-line
-    console.log(err);
-    throw new Error(err);
-  }
-
-  /* eslint no-unused-vars: ["error", { "argsIgnorePattern": "^_" }] */
-  start(_packet, connection) {
-    if (connection.config.debug) {
-      // eslint-disable-next-line
-      console.log('        Sending query command: %s', this.sql);
-    }
-    this._connection = connection;
-    this.options = Object.assign({}, connection.config, this._queryOptions);
-    this._setTimeout();
-
-    const cmdPacket = new Packets.Query(
-      this.sql,
-      connection.config.charsetNumber
-    );
-    connection.writePacket(cmdPacket.toPacket(1));
-    return Query.prototype.resultsetHeader;
-  }
-
-  done() {
-    this._unpipeStream();
-    // if all ready timeout, return null directly
-    if (this.timeout && !this.queryTimeout) {
-      return null;
-    }
-    // else clear timer
-    if (this.queryTimeout) {
-      Timers.clearTimeout(this.queryTimeout);
-      this.queryTimeout = null;
-    }
-    if (this.onResult) {
-      let rows, fields;
-      if (this._resultIndex === 0) {
-        rows = this._rows[0];
-        fields = this._fields[0];
-      } else {
-        rows = this._rows;
-        fields = this._fields;
-      }
-      if (fields) {
-        process.nextTick(() => {
-          this.onResult(null, rows, fields);
-        });
-      } else {
-        process.nextTick(() => {
-          this.onResult(null, rows);
-        });
-      }
-    }
-    return null;
-  }
-
-  doneInsert(rs) {
-    if (this._localStreamError) {
-      if (this.onResult) {
-        this.onResult(this._localStreamError, rs);
-      } else {
-        this.emit('error', this._localStreamError);
-      }
-      return null;
-    }
-    this._rows.push(rs);
-    this._fields.push(void 0);
-    this.emit('fields', void 0);
-    this.emit('result', rs);
-    if (rs.serverStatus & ServerStatus.SERVER_MORE_RESULTS_EXISTS) {
-      this._resultIndex++;
-      return this.resultsetHeader;
-    }
-    return this.done();
-  }
-
-  resultsetHeader(packet, connection) {
-    const rs = new Packets.ResultSetHeader(packet, connection);
-    this._fieldCount = rs.fieldCount;
-    if (connection.config.debug) {
-      // eslint-disable-next-line
-      console.log(
-        `        Resultset header received, expecting ${rs.fieldCount} column definition packets`
-      );
-    }
-    if (this._fieldCount === 0) {
-      return this.doneInsert(rs);
-    }
-    if (this._fieldCount === null) {
-      return this._streamLocalInfile(connection, rs.infileName);
-    }
-    this._receivedFieldsCount = 0;
-    this._rows.push([]);
-    this._fields.push([]);
-    return this.readField;
-  }
-
-  _streamLocalInfile(connection, path) {
-    if (this._streamFactory) {
-      this._localStream = this._streamFactory(path);
-    } else {
-      this._localStreamError = new Error(
-        `As a result of LOCAL INFILE command server wants to read ${path} file, but as of v2.0 you must provide streamFactory option returning ReadStream.`
-      );
-      connection.writePacket(EmptyPacket);
-      return this.infileOk;
-    }
-
-    const onConnectionError = () => {
-      this._unpipeStream();
-    };
-    const onDrain = () => {
-      this._localStream.resume();
-    };
-    const onPause = () => {
-      this._localStream.pause();
-    };
-    const onData = function (data) {
-      const dataWithHeader = Buffer.allocUnsafe(data.length + 4);
-      data.copy(dataWithHeader, 4);
-      connection.writePacket(
-        new Packets.Packet(0, dataWithHeader, 0, dataWithHeader.length)
-      );
-    };
-    const onEnd = () => {
-      connection.removeListener('error', onConnectionError);
-      connection.writePacket(EmptyPacket);
-    };
-    const onError = (err) => {
-      this._localStreamError = err;
-      connection.removeListener('error', onConnectionError);
-      connection.writePacket(EmptyPacket);
-    };
-    this._unpipeStream = () => {
-      connection.stream.removeListener('pause', onPause);
-      connection.stream.removeListener('drain', onDrain);
-      this._localStream.removeListener('data', onData);
-      this._localStream.removeListener('end', onEnd);
-      this._localStream.removeListener('error', onError);
-    };
-    connection.stream.on('pause', onPause);
-    connection.stream.on('drain', onDrain);
-    this._localStream.on('data', onData);
-    this._localStream.on('end', onEnd);
-    this._localStream.on('error', onError);
-    connection.once('error', onConnectionError);
-    return this.infileOk;
-  }
-
-  readField(packet, connection) {
-    this._receivedFieldsCount++;
-    // Often there is much more data in the column definition than in the row itself
-    // If you set manually _fields[0] to array of ColumnDefinition's (from previous call)
-    // you can 'cache' result of parsing. Field packets still received, but ignored in that case
-    // this is the reason _receivedFieldsCount exist (otherwise we could just use current length of fields array)
-    if (this._fields[this._resultIndex].length !== this._fieldCount) {
-      const field = new Packets.ColumnDefinition(
-        packet,
-        connection.clientEncoding
-      );
-      this._fields[this._resultIndex].push(field);
-      if (connection.config.debug) {
-        /* eslint-disable no-console */
-        console.log('        Column definition:');
-        console.log(`          name: ${field.name}`);
-        console.log(`          type: ${field.columnType}`);
-        console.log(`         flags: ${field.flags}`);
-        /* eslint-enable no-console */
-      }
-    }
-    // last field received
-    if (this._receivedFieldsCount === this._fieldCount) {
-      const fields = this._fields[this._resultIndex];
-      this.emit('fields', fields);
-      if (this.options.disableEval) {
-        this._rowParser = staticParser(fields, this.options, connection.config);
-      } else {
-        this._rowParser = new (getTextParser(
-          fields,
-          this.options,
-          connection.config
-        ))(fields);
-      }
-      return Query.prototype.fieldsEOF;
-    }
-    return Query.prototype.readField;
-  }
-
-  fieldsEOF(packet, connection) {
-    // check EOF
-    if (!packet.isEOF()) {
-      return connection.protocolError('Expected EOF packet');
-    }
-    return this.row;
-  }
-
-  /* eslint no-unused-vars: ["error", { "argsIgnorePattern": "^_" }] */
-  row(packet, _connection) {
-    if (packet.isEOF()) {
-      const status = packet.eofStatusFlags();
-      const moreResults = status & ServerStatus.SERVER_MORE_RESULTS_EXISTS;
-      if (moreResults) {
-        this._resultIndex++;
-        return Query.prototype.resultsetHeader;
-      }
-      return this.done();
-    }
-    let row;
-    try {
-      row = this._rowParser.next(
-        packet,
-        this._fields[this._resultIndex],
-        this.options
-      );
-    } catch (err) {
-      this._localStreamError = err;
-      return this.doneInsert(null);
-    }
-    if (this.onResult) {
-      this._rows[this._resultIndex].push(row);
-    } else {
-      this.emit('result', row, this._resultIndex);
-    }
-    return Query.prototype.row;
-  }
-
-  infileOk(packet, connection) {
-    const rs = new Packets.ResultSetHeader(packet, connection);
-    return this.doneInsert(rs);
-  }
-
-  stream(options) {
-    options = options || {};
-    options.objectMode = true;
-    const stream = new Readable(options);
-    stream._read = () => {
-      this._connection && this._connection.resume();
-    };
-    this.on('result', (row, resultSetIndex) => {
-      if (!stream.push(row)) {
-        this._connection.pause();
-      }
-      stream.emit('result', row, resultSetIndex); // replicate old emitter
-    });
-    this.on('error', (err) => {
-      stream.emit('error', err); // Pass on any errors
-    });
-    this.on('end', () => {
-      stream.push(null); // pushing null, indicating EOF
-    });
-    this.on('fields', (fields) => {
-      stream.emit('fields', fields); // replicate old emitter
-    });
-    stream.on('end', () => {
-      stream.emit('close');
-    });
-    return stream;
-  }
-
-  _setTimeout() {
-    if (this.timeout) {
-      const timeoutHandler = this._handleTimeoutError.bind(this);
-      this.queryTimeout = Timers.setTimeout(timeoutHandler, this.timeout);
-    }
-  }
-
-  _handleTimeoutError() {
-    if (this.queryTimeout) {
-      Timers.clearTimeout(this.queryTimeout);
-      this.queryTimeout = null;
-    }
-
-    const err = new Error('Query inactivity timeout');
-    err.errorno = 'PROTOCOL_SEQUENCE_TIMEOUT';
-    err.code = 'PROTOCOL_SEQUENCE_TIMEOUT';
-    err.syscall = 'query';
-
-    if (this.onResult) {
-      this.onResult(err);
-    } else {
-      this.emit('error', err);
-    }
-  }
-}
-
-Query.prototype.catch = Query.prototype.then;
-
-module.exports = Query;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/quit.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/quit.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,29 +1,0 @@
-'use strict';
-
-const Command = require('./command.js');
-const CommandCode = require('../constants/commands.js');
-const Packet = require('../packets/packet.js');
-
-class Quit extends Command {
-  constructor(callback) {
-    super();
-    this.onResult = callback;
-  }
-
-  start(packet, connection) {
-    connection._closing = true;
-    const quit = new Packet(
-      0,
-      Buffer.from([1, 0, 0, 0, CommandCode.QUIT]),
-      0,
-      5
-    );
-    if (this.onResult) {
-      this.onResult();
-    }
-    connection.writePacket(quit);
-    return null;
-  }
-}
-
-module.exports = Quit;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/register_slave.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/register_slave.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,27 +1,0 @@
-'use strict';
-
-const Command = require('./command');
-const Packets = require('../packets');
-
-class RegisterSlave extends Command {
-  constructor(opts, callback) {
-    super();
-    this.onResult = callback;
-    this.opts = opts;
-  }
-
-  start(packet, connection) {
-    const newPacket = new Packets.RegisterSlave(this.opts);
-    connection.writePacket(newPacket.toPacket(1));
-    return RegisterSlave.prototype.registerResponse;
-  }
-
-  registerResponse() {
-    if (this.onResult) {
-      process.nextTick(this.onResult.bind(this));
-    }
-    return null;
-  }
-}
-
-module.exports = RegisterSlave;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/server_handshake.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/commands/server_handshake.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,203 +1,0 @@
-'use strict';
-
-const CommandCode = require('../constants/commands.js');
-const Errors = require('../constants/errors.js');
-
-const Command = require('./command.js');
-const Packets = require('../packets/index.js');
-
-class ServerHandshake extends Command {
-  constructor(args) {
-    super();
-    this.args = args;
-    /*
-    this.protocolVersion = args.protocolVersion || 10;
-    this.serverVersion   = args.serverVersion;
-    this.connectionId    = args.connectionId,
-    this.statusFlags     = args.statusFlags,
-    this.characterSet    = args.characterSet,
-    this.capabilityFlags = args.capabilityFlags || 512;
-    */
-  }
-
-  start(packet, connection) {
-    const serverHelloPacket = new Packets.Handshake(this.args);
-    this.serverHello = serverHelloPacket;
-    serverHelloPacket.setScrambleData((err) => {
-      if (err) {
-        connection.emit('error', new Error('Error generating random bytes'));
-        return;
-      }
-      connection.writePacket(serverHelloPacket.toPacket(0));
-    });
-    return ServerHandshake.prototype.readClientReply;
-  }
-
-  readClientReply(packet, connection) {
-    // check auth here
-    const clientHelloReply = Packets.HandshakeResponse.fromPacket(packet);
-    // TODO check we don't have something similar already
-    connection.clientHelloReply = clientHelloReply;
-    if (this.args.authCallback) {
-      this.args.authCallback(
-        {
-          user: clientHelloReply.user,
-          database: clientHelloReply.database,
-          address: connection.stream.remoteAddress,
-          authPluginData1: this.serverHello.authPluginData1,
-          authPluginData2: this.serverHello.authPluginData2,
-          authToken: clientHelloReply.authToken,
-        },
-        (err, mysqlError) => {
-          // if (err)
-          if (!mysqlError) {
-            connection.writeOk();
-          } else {
-            // TODO create constants / errorToCode
-            // 1045 = ER_ACCESS_DENIED_ERROR
-            connection.writeError({
-              message: mysqlError.message || '',
-              code: mysqlError.code || 1045,
-            });
-            connection.close();
-          }
-        }
-      );
-    } else {
-      connection.writeOk();
-    }
-    return ServerHandshake.prototype.dispatchCommands;
-  }
-
-  _isStatement(query, name) {
-    const firstWord = query.split(' ')[0].toUpperCase();
-    return firstWord === name;
-  }
-
-  dispatchCommands(packet, connection) {
-    // command from client to server
-    let knownCommand = true;
-    const encoding = connection.clientHelloReply.encoding;
-    const commandCode = packet.readInt8();
-    switch (commandCode) {
-      case CommandCode.STMT_PREPARE:
-        if (connection.listeners('stmt_prepare').length) {
-          const query = packet.readString(undefined, encoding);
-          connection.emit('stmt_prepare', query);
-        } else {
-          connection.writeError({
-            code: Errors.HA_ERR_INTERNAL_ERROR,
-            message: 'No query handler for prepared statements.',
-          });
-        }
-        break;
-      case CommandCode.STMT_EXECUTE:
-        if (connection.listeners('stmt_execute').length) {
-          const { stmtId, flags, iterationCount, values } =
-            Packets.Execute.fromPacket(packet, encoding);
-          connection.emit(
-            'stmt_execute',
-            stmtId,
-            flags,
-            iterationCount,
-            values
-          );
-        } else {
-          connection.writeError({
-            code: Errors.HA_ERR_INTERNAL_ERROR,
-            message: 'No query handler for execute statements.',
-          });
-        }
-        break;
-      case CommandCode.QUIT:
-        if (connection.listeners('quit').length) {
-          connection.emit('quit');
-        } else {
-          connection.stream.end();
-        }
-        break;
-      case CommandCode.INIT_DB:
-        if (connection.listeners('init_db').length) {
-          const schemaName = packet.readString(undefined, encoding);
-          connection.emit('init_db', schemaName);
-        } else {
-          connection.writeOk();
-        }
-        break;
-      case CommandCode.QUERY:
-        if (connection.listeners('query').length) {
-          const query = packet.readString(undefined, encoding);
-          if (
-            this._isStatement(query, 'PREPARE') ||
-            this._isStatement(query, 'SET')
-          ) {
-            connection.emit('stmt_prepare', query);
-          } else if (this._isStatement(query, 'EXECUTE')) {
-            connection.emit('stmt_execute', null, null, null, null, query);
-          } else connection.emit('query', query);
-        } else {
-          connection.writeError({
-            code: Errors.HA_ERR_INTERNAL_ERROR,
-            message: 'No query handler',
-          });
-        }
-        break;
-      case CommandCode.FIELD_LIST:
-        if (connection.listeners('field_list').length) {
-          const table = packet.readNullTerminatedString(encoding);
-          const fields = packet.readString(undefined, encoding);
-          connection.emit('field_list', table, fields);
-        } else {
-          connection.writeError({
-            code: Errors.ER_WARN_DEPRECATED_SYNTAX,
-            message:
-              'As of MySQL 5.7.11, COM_FIELD_LIST is deprecated and will be removed in a future version of MySQL.',
-          });
-        }
-        break;
-      case CommandCode.PING:
-        if (connection.listeners('ping').length) {
-          connection.emit('ping');
-        } else {
-          connection.writeOk();
-        }
-        break;
-      default:
-        knownCommand = false;
-    }
-    if (connection.listeners('packet').length) {
-      connection.emit('packet', packet.clone(), knownCommand, commandCode);
-    } else if (!knownCommand) {
-      // eslint-disable-next-line no-console
-      console.log('Unknown command:', commandCode);
-    }
-    return ServerHandshake.prototype.dispatchCommands;
-  }
-}
-
-module.exports = ServerHandshake;
-
-// TODO: implement server-side 4.1 authentication
-/*
-4.1 authentication: (http://bazaar.launchpad.net/~mysql/mysql-server/5.5/view/head:/sql/password.c)
-
-  SERVER:  public_seed=create_random_string()
-           send(public_seed)
-
-  CLIENT:  recv(public_seed)
-           hash_stage1=sha1("password")
-           hash_stage2=sha1(hash_stage1)
-           reply=xor(hash_stage1, sha1(public_seed,hash_stage2)
-
-           // this three steps are done in scramble()
-
-           send(reply)
-
-
-  SERVER:  recv(reply)
-           hash_stage1=xor(reply, sha1(public_seed,hash_stage2))
-           candidate_hash2=sha1(hash_stage1)
-           check(candidate_hash2==hash_stage2)
-
-server stores sha1(sha1(password)) ( hash_stag2)
-*/
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/compressed_protocol.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/compressed_protocol.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,127 +1,0 @@
-'use strict';
-
-// connection mixins
-// implementation of http://dev.mysql.com/doc/internals/en/compression.html
-
-const zlib = require('zlib');
-const PacketParser = require('./packet_parser.js');
-
-function handleCompressedPacket(packet) {
-  // eslint-disable-next-line consistent-this, no-invalid-this
-  const connection = this;
-  const deflatedLength = packet.readInt24();
-  const body = packet.readBuffer();
-
-  if (deflatedLength !== 0) {
-    connection.inflateQueue.push((task) => {
-      zlib.inflate(body, (err, data) => {
-        if (err) {
-          connection._handleNetworkError(err);
-          return;
-        }
-        connection._bumpCompressedSequenceId(packet.numPackets);
-        connection._inflatedPacketsParser.execute(data);
-        task.done();
-      });
-    });
-  } else {
-    connection.inflateQueue.push((task) => {
-      connection._bumpCompressedSequenceId(packet.numPackets);
-      connection._inflatedPacketsParser.execute(body);
-      task.done();
-    });
-  }
-}
-
-function writeCompressed(buffer) {
-  // http://dev.mysql.com/doc/internals/en/example-several-mysql-packets.html
-  // note: sending a MySQL Packet of the size 2^24−5 to 2^24−1 via compression
-  // leads to at least one extra compressed packet.
-  // (this is because "length of the packet before compression" need to fit
-  // into 3 byte unsigned int. "length of the packet before compression" includes
-  // 4 byte packet header, hence 2^24−5)
-  const MAX_COMPRESSED_LENGTH = 16777210;
-  let start;
-  if (buffer.length > MAX_COMPRESSED_LENGTH) {
-    for (start = 0; start < buffer.length; start += MAX_COMPRESSED_LENGTH) {
-      writeCompressed.call(
-        // eslint-disable-next-line no-invalid-this
-        this,
-        buffer.slice(start, start + MAX_COMPRESSED_LENGTH)
-      );
-    }
-    return;
-  }
-
-  // eslint-disable-next-line no-invalid-this, consistent-this
-  const connection = this;
-
-  let packetLen = buffer.length;
-  const compressHeader = Buffer.allocUnsafe(7);
-
-  // seqqueue is used here because zlib async execution is routed via thread pool
-  // internally and when we have multiple compressed packets arriving we need
-  // to assemble uncompressed result sequentially
-  (function (seqId) {
-    connection.deflateQueue.push((task) => {
-      zlib.deflate(buffer, (err, compressed) => {
-        if (err) {
-          connection._handleFatalError(err);
-          return;
-        }
-        let compressedLength = compressed.length;
-
-        if (compressedLength < packetLen) {
-          compressHeader.writeUInt8(compressedLength & 0xff, 0);
-          compressHeader.writeUInt16LE(compressedLength >> 8, 1);
-          compressHeader.writeUInt8(seqId, 3);
-          compressHeader.writeUInt8(packetLen & 0xff, 4);
-          compressHeader.writeUInt16LE(packetLen >> 8, 5);
-          connection.writeUncompressed(compressHeader);
-          connection.writeUncompressed(compressed);
-        } else {
-          // http://dev.mysql.com/doc/internals/en/uncompressed-payload.html
-          // To send an uncompressed payload:
-          //   - set length of payload before compression to 0
-          //   - the compressed payload contains the uncompressed payload instead.
-          compressedLength = packetLen;
-          packetLen = 0;
-          compressHeader.writeUInt8(compressedLength & 0xff, 0);
-          compressHeader.writeUInt16LE(compressedLength >> 8, 1);
-          compressHeader.writeUInt8(seqId, 3);
-          compressHeader.writeUInt8(packetLen & 0xff, 4);
-          compressHeader.writeUInt16LE(packetLen >> 8, 5);
-          connection.writeUncompressed(compressHeader);
-          connection.writeUncompressed(buffer);
-        }
-        task.done();
-      });
-    });
-  })(connection.compressedSequenceId);
-  connection._bumpCompressedSequenceId(1);
-}
-
-function enableCompression(connection) {
-  connection._lastWrittenPacketId = 0;
-  connection._lastReceivedPacketId = 0;
-
-  connection._handleCompressedPacket = handleCompressedPacket;
-  connection._inflatedPacketsParser = new PacketParser((p) => {
-    connection.handlePacket(p);
-  }, 4);
-  connection._inflatedPacketsParser._lastPacket = 0;
-  connection.packetParser = new PacketParser((packet) => {
-    connection._handleCompressedPacket(packet);
-  }, 7);
-
-  connection.writeUncompressed = connection.write;
-  connection.write = writeCompressed;
-
-  const seqqueue = require('seq-queue');
-  connection.inflateQueue = seqqueue.createQueue();
-  connection.deflateQueue = seqqueue.createQueue();
-}
-
-module.exports = {
-  enableCompression: enableCompression,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/connection.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,12 +1,0 @@
-'use strict';
-
-const BaseConnection = require('./base/connection.js');
-
-class Connection extends BaseConnection {
-  promise(promiseImpl) {
-    const PromiseConnection = require('./promise/connection.js');
-    return new PromiseConnection(this, promiseImpl);
-  }
-}
-
-module.exports = Connection;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/connection_config.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/connection_config.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,292 +1,0 @@
-// This file was modified by Oracle on September 21, 2021.
-// New connection options for additional authentication factors were
-// introduced.
-// Multi-factor authentication capability is now enabled if one of these
-// options is used.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const { URL } = require('url');
-const ClientConstants = require('./constants/client');
-const Charsets = require('./constants/charsets');
-const { version } = require('../package.json');
-let SSLProfiles = null;
-
-const validOptions = {
-  authPlugins: 1,
-  authSwitchHandler: 1,
-  bigNumberStrings: 1,
-  charset: 1,
-  charsetNumber: 1,
-  compress: 1,
-  connectAttributes: 1,
-  connectTimeout: 1,
-  database: 1,
-  dateStrings: 1,
-  debug: 1,
-  decimalNumbers: 1,
-  enableKeepAlive: 1,
-  flags: 1,
-  host: 1,
-  insecureAuth: 1,
-  infileStreamFactory: 1,
-  isServer: 1,
-  keepAliveInitialDelay: 1,
-  localAddress: 1,
-  maxPreparedStatements: 1,
-  multipleStatements: 1,
-  namedPlaceholders: 1,
-  nestTables: 1,
-  password: 1,
-  // with multi-factor authentication, the main password (used for the first
-  // authentication factor) can be provided via password1
-  password1: 1,
-  password2: 1,
-  password3: 1,
-  passwordSha1: 1,
-  pool: 1,
-  port: 1,
-  queryFormat: 1,
-  rowsAsArray: 1,
-  socketPath: 1,
-  ssl: 1,
-  stream: 1,
-  stringifyObjects: 1,
-  supportBigNumbers: 1,
-  timezone: 1,
-  trace: 1,
-  typeCast: 1,
-  uri: 1,
-  user: 1,
-  disableEval: 1,
-  // These options are used for Pool
-  connectionLimit: 1,
-  maxIdle: 1,
-  idleTimeout: 1,
-  Promise: 1,
-  queueLimit: 1,
-  waitForConnections: 1,
-  jsonStrings: 1,
-};
-
-class ConnectionConfig {
-  constructor(options) {
-    if (typeof options === 'string') {
-      options = ConnectionConfig.parseUrl(options);
-    } else if (options && options.uri) {
-      const uriOptions = ConnectionConfig.parseUrl(options.uri);
-      for (const key in uriOptions) {
-        if (!Object.prototype.hasOwnProperty.call(uriOptions, key)) continue;
-        if (options[key]) continue;
-        options[key] = uriOptions[key];
-      }
-    }
-    for (const key in options) {
-      if (!Object.prototype.hasOwnProperty.call(options, key)) continue;
-      if (validOptions[key] !== 1) {
-        // REVIEW: Should this be emitted somehow?
-        // eslint-disable-next-line no-console
-        console.error(
-          `Ignoring invalid configuration option passed to Connection: ${key}. This is currently a warning, but in future versions of MySQL2, an error will be thrown if you pass an invalid configuration option to a Connection`
-        );
-      }
-    }
-    this.isServer = options.isServer;
-    this.stream = options.stream;
-    this.host = options.host || 'localhost';
-    this.port =
-      (typeof options.port === 'string'
-        ? parseInt(options.port, 10)
-        : options.port) || 3306;
-    this.localAddress = options.localAddress;
-    this.socketPath = options.socketPath;
-    this.user = options.user || undefined;
-    // for the purpose of multi-factor authentication, or not, the main
-    // password (used for the 1st authentication factor) can also be
-    // provided via the "password1" option
-    this.password = options.password || options.password1 || undefined;
-    this.password2 = options.password2 || undefined;
-    this.password3 = options.password3 || undefined;
-    this.passwordSha1 = options.passwordSha1 || undefined;
-    this.database = options.database;
-    this.connectTimeout = isNaN(options.connectTimeout)
-      ? 10 * 1000
-      : options.connectTimeout;
-    this.insecureAuth = options.insecureAuth || false;
-    this.infileStreamFactory = options.infileStreamFactory || undefined;
-    this.supportBigNumbers = options.supportBigNumbers || false;
-    this.bigNumberStrings = options.bigNumberStrings || false;
-    this.decimalNumbers = options.decimalNumbers || false;
-    this.dateStrings = options.dateStrings || false;
-    this.debug = options.debug;
-    this.trace = options.trace !== false;
-    this.stringifyObjects = options.stringifyObjects || false;
-    this.enableKeepAlive = options.enableKeepAlive !== false;
-    this.keepAliveInitialDelay = options.keepAliveInitialDelay;
-    if (
-      options.timezone &&
-      !/^(?:local|Z|[ +-]\d\d:\d\d)$/.test(options.timezone)
-    ) {
-      // strictly supports timezones specified by mysqljs/mysql:
-      // https://github.com/mysqljs/mysql#user-content-connection-options
-      // eslint-disable-next-line no-console
-      console.error(
-        `Ignoring invalid timezone passed to Connection: ${options.timezone}. This is currently a warning, but in future versions of MySQL2, an error will be thrown if you pass an invalid configuration option to a Connection`
-      );
-      // SqlStrings falls back to UTC on invalid timezone
-      this.timezone = 'Z';
-    } else {
-      this.timezone = options.timezone || 'local';
-    }
-    this.queryFormat = options.queryFormat;
-    this.pool = options.pool || undefined;
-    this.ssl =
-      typeof options.ssl === 'string'
-        ? ConnectionConfig.getSSLProfile(options.ssl)
-        : options.ssl || false;
-    this.multipleStatements = options.multipleStatements || false;
-    this.rowsAsArray = options.rowsAsArray || false;
-    this.namedPlaceholders = options.namedPlaceholders || false;
-    this.nestTables =
-      options.nestTables === undefined ? undefined : options.nestTables;
-    this.typeCast = options.typeCast === undefined ? true : options.typeCast;
-    this.disableEval = Boolean(options.disableEval);
-    if (this.timezone[0] === ' ') {
-      // "+" is a url encoded char for space so it
-      // gets translated to space when giving a
-      // connection string..
-      this.timezone = `+${this.timezone.slice(1)}`;
-    }
-    if (this.ssl) {
-      if (typeof this.ssl !== 'object') {
-        throw new TypeError(
-          `SSL profile must be an object, instead it's a ${typeof this.ssl}`
-        );
-      }
-      // Default rejectUnauthorized to true
-      this.ssl.rejectUnauthorized = this.ssl.rejectUnauthorized !== false;
-    }
-    this.maxPacketSize = 0;
-    this.charsetNumber = options.charset
-      ? ConnectionConfig.getCharsetNumber(options.charset)
-      : options.charsetNumber || Charsets.UTF8MB4_UNICODE_CI;
-    this.compress = options.compress || false;
-    this.authPlugins = options.authPlugins;
-    this.authSwitchHandler = options.authSwitchHandler;
-    this.clientFlags = ConnectionConfig.mergeFlags(
-      ConnectionConfig.getDefaultFlags(options),
-      options.flags || ''
-    );
-    // Default connection attributes
-    // https://dev.mysql.com/doc/refman/8.0/en/performance-schema-connection-attribute-tables.html
-    const defaultConnectAttributes = {
-      _client_name: 'Node-MySQL-2',
-      _client_version: version,
-    };
-    this.connectAttributes = {
-      ...defaultConnectAttributes,
-      ...(options.connectAttributes || {}),
-    };
-    this.maxPreparedStatements = options.maxPreparedStatements || 16000;
-    this.jsonStrings = options.jsonStrings || false;
-  }
-
-  static mergeFlags(default_flags, user_flags) {
-    let flags = 0x0,
-      i;
-    if (!Array.isArray(user_flags)) {
-      user_flags = String(user_flags || '')
-        .toUpperCase()
-        .split(/\s*,+\s*/);
-    }
-    // add default flags unless "blacklisted"
-    for (i in default_flags) {
-      if (user_flags.indexOf(`-${default_flags[i]}`) >= 0) {
-        continue;
-      }
-      flags |= ClientConstants[default_flags[i]] || 0x0;
-    }
-    // add user flags unless already already added
-    for (i in user_flags) {
-      if (user_flags[i][0] === '-') {
-        continue;
-      }
-      if (default_flags.indexOf(user_flags[i]) >= 0) {
-        continue;
-      }
-      flags |= ClientConstants[user_flags[i]] || 0x0;
-    }
-    return flags;
-  }
-
-  static getDefaultFlags(options) {
-    const defaultFlags = [
-      'LONG_PASSWORD',
-      'FOUND_ROWS',
-      'LONG_FLAG',
-      'CONNECT_WITH_DB',
-      'ODBC',
-      'LOCAL_FILES',
-      'IGNORE_SPACE',
-      'PROTOCOL_41',
-      'IGNORE_SIGPIPE',
-      'TRANSACTIONS',
-      'RESERVED',
-      'SECURE_CONNECTION',
-      'MULTI_RESULTS',
-      'TRANSACTIONS',
-      'SESSION_TRACK',
-      'CONNECT_ATTRS',
-    ];
-    if (options && options.multipleStatements) {
-      defaultFlags.push('MULTI_STATEMENTS');
-    }
-    defaultFlags.push('PLUGIN_AUTH');
-    defaultFlags.push('PLUGIN_AUTH_LENENC_CLIENT_DATA');
-
-    return defaultFlags;
-  }
-
-  static getCharsetNumber(charset) {
-    const num = Charsets[charset.toUpperCase()];
-    if (num === undefined) {
-      throw new TypeError(`Unknown charset '${charset}'`);
-    }
-    return num;
-  }
-
-  static getSSLProfile(name) {
-    if (!SSLProfiles) {
-      SSLProfiles = require('./constants/ssl_profiles.js');
-    }
-    const ssl = SSLProfiles[name];
-    if (ssl === undefined) {
-      throw new TypeError(`Unknown SSL profile '${name}'`);
-    }
-    return ssl;
-  }
-
-  static parseUrl(url) {
-    const parsedUrl = new URL(url);
-    const options = {
-      host: decodeURIComponent(parsedUrl.hostname),
-      port: parseInt(parsedUrl.port, 10),
-      database: decodeURIComponent(parsedUrl.pathname.slice(1)),
-      user: decodeURIComponent(parsedUrl.username),
-      password: decodeURIComponent(parsedUrl.password),
-    };
-    parsedUrl.searchParams.forEach((value, key) => {
-      try {
-        // Try to parse this as a JSON expression first
-        options[key] = JSON.parse(value);
-      } catch (err) {
-        // Otherwise assume it is a plain string
-        options[key] = value;
-      }
-    });
-    return options;
-  }
-}
-
-module.exports = ConnectionConfig;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/charset_encodings.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/charset_encodings.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,316 +1,0 @@
-'use strict';
-
-// see tools/generate-charset-mapping.js
-// basicalliy result of "SHOW COLLATION" query
-
-module.exports = [
-  'utf8',
-  'big5',
-  'latin2',
-  'dec8',
-  'cp850',
-  'latin1',
-  'hp8',
-  'koi8r',
-  'latin1',
-  'latin2',
-  'swe7',
-  'ascii',
-  'eucjp',
-  'sjis',
-  'cp1251',
-  'latin1',
-  'hebrew',
-  'utf8',
-  'tis620',
-  'euckr',
-  'latin7',
-  'latin2',
-  'koi8u',
-  'cp1251',
-  'gb2312',
-  'greek',
-  'cp1250',
-  'latin2',
-  'gbk',
-  'cp1257',
-  'latin5',
-  'latin1',
-  'armscii8',
-  'cesu8',
-  'cp1250',
-  'ucs2',
-  'cp866',
-  'keybcs2',
-  'macintosh',
-  'macroman',
-  'cp852',
-  'latin7',
-  'latin7',
-  'macintosh',
-  'cp1250',
-  'utf8',
-  'utf8',
-  'latin1',
-  'latin1',
-  'latin1',
-  'cp1251',
-  'cp1251',
-  'cp1251',
-  'macroman',
-  'utf16',
-  'utf16',
-  'utf16-le',
-  'cp1256',
-  'cp1257',
-  'cp1257',
-  'utf32',
-  'utf32',
-  'utf16-le',
-  'binary',
-  'armscii8',
-  'ascii',
-  'cp1250',
-  'cp1256',
-  'cp866',
-  'dec8',
-  'greek',
-  'hebrew',
-  'hp8',
-  'keybcs2',
-  'koi8r',
-  'koi8u',
-  'cesu8',
-  'latin2',
-  'latin5',
-  'latin7',
-  'cp850',
-  'cp852',
-  'swe7',
-  'cesu8',
-  'big5',
-  'euckr',
-  'gb2312',
-  'gbk',
-  'sjis',
-  'tis620',
-  'ucs2',
-  'eucjp',
-  'geostd8',
-  'geostd8',
-  'latin1',
-  'cp932',
-  'cp932',
-  'eucjpms',
-  'eucjpms',
-  'cp1250',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf16',
-  'utf8',
-  'utf8',
-  'utf8',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'ucs2',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'ucs2',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf32',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'cesu8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'cesu8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'gb18030',
-  'gb18030',
-  'gb18030',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-  'utf8',
-];
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/charsets.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/charsets.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,317 +1,0 @@
-'use strict';
-
-exports.BIG5_CHINESE_CI = 1;
-exports.LATIN2_CZECH_CS = 2;
-exports.DEC8_SWEDISH_CI = 3;
-exports.CP850_GENERAL_CI = 4;
-exports.LATIN1_GERMAN1_CI = 5;
-exports.HP8_ENGLISH_CI = 6;
-exports.KOI8R_GENERAL_CI = 7;
-exports.LATIN1_SWEDISH_CI = 8;
-exports.LATIN2_GENERAL_CI = 9;
-exports.SWE7_SWEDISH_CI = 10;
-exports.ASCII_GENERAL_CI = 11;
-exports.UJIS_JAPANESE_CI = 12;
-exports.SJIS_JAPANESE_CI = 13;
-exports.CP1251_BULGARIAN_CI = 14;
-exports.LATIN1_DANISH_CI = 15;
-exports.HEBREW_GENERAL_CI = 16;
-exports.TIS620_THAI_CI = 18;
-exports.EUCKR_KOREAN_CI = 19;
-exports.LATIN7_ESTONIAN_CS = 20;
-exports.LATIN2_HUNGARIAN_CI = 21;
-exports.KOI8U_GENERAL_CI = 22;
-exports.CP1251_UKRAINIAN_CI = 23;
-exports.GB2312_CHINESE_CI = 24;
-exports.GREEK_GENERAL_CI = 25;
-exports.CP1250_GENERAL_CI = 26;
-exports.LATIN2_CROATIAN_CI = 27;
-exports.GBK_CHINESE_CI = 28;
-exports.CP1257_LITHUANIAN_CI = 29;
-exports.LATIN5_TURKISH_CI = 30;
-exports.LATIN1_GERMAN2_CI = 31;
-exports.ARMSCII8_GENERAL_CI = 32;
-exports.UTF8_GENERAL_CI = 33;
-exports.CP1250_CZECH_CS = 34;
-exports.UCS2_GENERAL_CI = 35;
-exports.CP866_GENERAL_CI = 36;
-exports.KEYBCS2_GENERAL_CI = 37;
-exports.MACCE_GENERAL_CI = 38;
-exports.MACROMAN_GENERAL_CI = 39;
-exports.CP852_GENERAL_CI = 40;
-exports.LATIN7_GENERAL_CI = 41;
-exports.LATIN7_GENERAL_CS = 42;
-exports.MACCE_BIN = 43;
-exports.CP1250_CROATIAN_CI = 44;
-exports.UTF8MB4_GENERAL_CI = 45;
-exports.UTF8MB4_BIN = 46;
-exports.LATIN1_BIN = 47;
-exports.LATIN1_GENERAL_CI = 48;
-exports.LATIN1_GENERAL_CS = 49;
-exports.CP1251_BIN = 50;
-exports.CP1251_GENERAL_CI = 51;
-exports.CP1251_GENERAL_CS = 52;
-exports.MACROMAN_BIN = 53;
-exports.UTF16_GENERAL_CI = 54;
-exports.UTF16_BIN = 55;
-exports.UTF16LE_GENERAL_CI = 56;
-exports.CP1256_GENERAL_CI = 57;
-exports.CP1257_BIN = 58;
-exports.CP1257_GENERAL_CI = 59;
-exports.UTF32_GENERAL_CI = 60;
-exports.UTF32_BIN = 61;
-exports.UTF16LE_BIN = 62;
-exports.BINARY = 63;
-exports.ARMSCII8_BIN = 64;
-exports.ASCII_BIN = 65;
-exports.CP1250_BIN = 66;
-exports.CP1256_BIN = 67;
-exports.CP866_BIN = 68;
-exports.DEC8_BIN = 69;
-exports.GREEK_BIN = 70;
-exports.HEBREW_BIN = 71;
-exports.HP8_BIN = 72;
-exports.KEYBCS2_BIN = 73;
-exports.KOI8R_BIN = 74;
-exports.KOI8U_BIN = 75;
-exports.UTF8_TOLOWER_CI = 76;
-exports.LATIN2_BIN = 77;
-exports.LATIN5_BIN = 78;
-exports.LATIN7_BIN = 79;
-exports.CP850_BIN = 80;
-exports.CP852_BIN = 81;
-exports.SWE7_BIN = 82;
-exports.UTF8_BIN = 83;
-exports.BIG5_BIN = 84;
-exports.EUCKR_BIN = 85;
-exports.GB2312_BIN = 86;
-exports.GBK_BIN = 87;
-exports.SJIS_BIN = 88;
-exports.TIS620_BIN = 89;
-exports.UCS2_BIN = 90;
-exports.UJIS_BIN = 91;
-exports.GEOSTD8_GENERAL_CI = 92;
-exports.GEOSTD8_BIN = 93;
-exports.LATIN1_SPANISH_CI = 94;
-exports.CP932_JAPANESE_CI = 95;
-exports.CP932_BIN = 96;
-exports.EUCJPMS_JAPANESE_CI = 97;
-exports.EUCJPMS_BIN = 98;
-exports.CP1250_POLISH_CI = 99;
-exports.UTF16_UNICODE_CI = 101;
-exports.UTF16_ICELANDIC_CI = 102;
-exports.UTF16_LATVIAN_CI = 103;
-exports.UTF16_ROMANIAN_CI = 104;
-exports.UTF16_SLOVENIAN_CI = 105;
-exports.UTF16_POLISH_CI = 106;
-exports.UTF16_ESTONIAN_CI = 107;
-exports.UTF16_SPANISH_CI = 108;
-exports.UTF16_SWEDISH_CI = 109;
-exports.UTF16_TURKISH_CI = 110;
-exports.UTF16_CZECH_CI = 111;
-exports.UTF16_DANISH_CI = 112;
-exports.UTF16_LITHUANIAN_CI = 113;
-exports.UTF16_SLOVAK_CI = 114;
-exports.UTF16_SPANISH2_CI = 115;
-exports.UTF16_ROMAN_CI = 116;
-exports.UTF16_PERSIAN_CI = 117;
-exports.UTF16_ESPERANTO_CI = 118;
-exports.UTF16_HUNGARIAN_CI = 119;
-exports.UTF16_SINHALA_CI = 120;
-exports.UTF16_GERMAN2_CI = 121;
-exports.UTF16_CROATIAN_CI = 122;
-exports.UTF16_UNICODE_520_CI = 123;
-exports.UTF16_VIETNAMESE_CI = 124;
-exports.UCS2_UNICODE_CI = 128;
-exports.UCS2_ICELANDIC_CI = 129;
-exports.UCS2_LATVIAN_CI = 130;
-exports.UCS2_ROMANIAN_CI = 131;
-exports.UCS2_SLOVENIAN_CI = 132;
-exports.UCS2_POLISH_CI = 133;
-exports.UCS2_ESTONIAN_CI = 134;
-exports.UCS2_SPANISH_CI = 135;
-exports.UCS2_SWEDISH_CI = 136;
-exports.UCS2_TURKISH_CI = 137;
-exports.UCS2_CZECH_CI = 138;
-exports.UCS2_DANISH_CI = 139;
-exports.UCS2_LITHUANIAN_CI = 140;
-exports.UCS2_SLOVAK_CI = 141;
-exports.UCS2_SPANISH2_CI = 142;
-exports.UCS2_ROMAN_CI = 143;
-exports.UCS2_PERSIAN_CI = 144;
-exports.UCS2_ESPERANTO_CI = 145;
-exports.UCS2_HUNGARIAN_CI = 146;
-exports.UCS2_SINHALA_CI = 147;
-exports.UCS2_GERMAN2_CI = 148;
-exports.UCS2_CROATIAN_CI = 149;
-exports.UCS2_UNICODE_520_CI = 150;
-exports.UCS2_VIETNAMESE_CI = 151;
-exports.UCS2_GENERAL_MYSQL500_CI = 159;
-exports.UTF32_UNICODE_CI = 160;
-exports.UTF32_ICELANDIC_CI = 161;
-exports.UTF32_LATVIAN_CI = 162;
-exports.UTF32_ROMANIAN_CI = 163;
-exports.UTF32_SLOVENIAN_CI = 164;
-exports.UTF32_POLISH_CI = 165;
-exports.UTF32_ESTONIAN_CI = 166;
-exports.UTF32_SPANISH_CI = 167;
-exports.UTF32_SWEDISH_CI = 168;
-exports.UTF32_TURKISH_CI = 169;
-exports.UTF32_CZECH_CI = 170;
-exports.UTF32_DANISH_CI = 171;
-exports.UTF32_LITHUANIAN_CI = 172;
-exports.UTF32_SLOVAK_CI = 173;
-exports.UTF32_SPANISH2_CI = 174;
-exports.UTF32_ROMAN_CI = 175;
-exports.UTF32_PERSIAN_CI = 176;
-exports.UTF32_ESPERANTO_CI = 177;
-exports.UTF32_HUNGARIAN_CI = 178;
-exports.UTF32_SINHALA_CI = 179;
-exports.UTF32_GERMAN2_CI = 180;
-exports.UTF32_CROATIAN_CI = 181;
-exports.UTF32_UNICODE_520_CI = 182;
-exports.UTF32_VIETNAMESE_CI = 183;
-exports.UTF8_UNICODE_CI = 192;
-exports.UTF8_ICELANDIC_CI = 193;
-exports.UTF8_LATVIAN_CI = 194;
-exports.UTF8_ROMANIAN_CI = 195;
-exports.UTF8_SLOVENIAN_CI = 196;
-exports.UTF8_POLISH_CI = 197;
-exports.UTF8_ESTONIAN_CI = 198;
-exports.UTF8_SPANISH_CI = 199;
-exports.UTF8_SWEDISH_CI = 200;
-exports.UTF8_TURKISH_CI = 201;
-exports.UTF8_CZECH_CI = 202;
-exports.UTF8_DANISH_CI = 203;
-exports.UTF8_LITHUANIAN_CI = 204;
-exports.UTF8_SLOVAK_CI = 205;
-exports.UTF8_SPANISH2_CI = 206;
-exports.UTF8_ROMAN_CI = 207;
-exports.UTF8_PERSIAN_CI = 208;
-exports.UTF8_ESPERANTO_CI = 209;
-exports.UTF8_HUNGARIAN_CI = 210;
-exports.UTF8_SINHALA_CI = 211;
-exports.UTF8_GERMAN2_CI = 212;
-exports.UTF8_CROATIAN_CI = 213;
-exports.UTF8_UNICODE_520_CI = 214;
-exports.UTF8_VIETNAMESE_CI = 215;
-exports.UTF8_GENERAL_MYSQL500_CI = 223;
-exports.UTF8MB4_UNICODE_CI = 224;
-exports.UTF8MB4_ICELANDIC_CI = 225;
-exports.UTF8MB4_LATVIAN_CI = 226;
-exports.UTF8MB4_ROMANIAN_CI = 227;
-exports.UTF8MB4_SLOVENIAN_CI = 228;
-exports.UTF8MB4_POLISH_CI = 229;
-exports.UTF8MB4_ESTONIAN_CI = 230;
-exports.UTF8MB4_SPANISH_CI = 231;
-exports.UTF8MB4_SWEDISH_CI = 232;
-exports.UTF8MB4_TURKISH_CI = 233;
-exports.UTF8MB4_CZECH_CI = 234;
-exports.UTF8MB4_DANISH_CI = 235;
-exports.UTF8MB4_LITHUANIAN_CI = 236;
-exports.UTF8MB4_SLOVAK_CI = 237;
-exports.UTF8MB4_SPANISH2_CI = 238;
-exports.UTF8MB4_ROMAN_CI = 239;
-exports.UTF8MB4_PERSIAN_CI = 240;
-exports.UTF8MB4_ESPERANTO_CI = 241;
-exports.UTF8MB4_HUNGARIAN_CI = 242;
-exports.UTF8MB4_SINHALA_CI = 243;
-exports.UTF8MB4_GERMAN2_CI = 244;
-exports.UTF8MB4_CROATIAN_CI = 245;
-exports.UTF8MB4_UNICODE_520_CI = 246;
-exports.UTF8MB4_VIETNAMESE_CI = 247;
-exports.GB18030_CHINESE_CI = 248;
-exports.GB18030_BIN = 249;
-exports.GB18030_UNICODE_520_CI = 250;
-exports.UTF8_GENERAL50_CI = 253; // deprecated
-exports.UTF8MB4_0900_AI_CI = 255;
-exports.UTF8MB4_DE_PB_0900_AI_CI = 256;
-exports.UTF8MB4_IS_0900_AI_CI = 257;
-exports.UTF8MB4_LV_0900_AI_CI = 258;
-exports.UTF8MB4_RO_0900_AI_CI = 259;
-exports.UTF8MB4_SL_0900_AI_CI = 260;
-exports.UTF8MB4_PL_0900_AI_CI = 261;
-exports.UTF8MB4_ET_0900_AI_CI = 262;
-exports.UTF8MB4_ES_0900_AI_CI = 263;
-exports.UTF8MB4_SV_0900_AI_CI = 264;
-exports.UTF8MB4_TR_0900_AI_CI = 265;
-exports.UTF8MB4_CS_0900_AI_CI = 266;
-exports.UTF8MB4_DA_0900_AI_CI = 267;
-exports.UTF8MB4_LT_0900_AI_CI = 268;
-exports.UTF8MB4_SK_0900_AI_CI = 269;
-exports.UTF8MB4_ES_TRAD_0900_AI_CI = 270;
-exports.UTF8MB4_LA_0900_AI_CI = 271;
-exports.UTF8MB4_EO_0900_AI_CI = 273;
-exports.UTF8MB4_HU_0900_AI_CI = 274;
-exports.UTF8MB4_HR_0900_AI_CI = 275;
-exports.UTF8MB4_VI_0900_AI_CI = 277;
-exports.UTF8MB4_0900_AS_CS = 278;
-exports.UTF8MB4_DE_PB_0900_AS_CS = 279;
-exports.UTF8MB4_IS_0900_AS_CS = 280;
-exports.UTF8MB4_LV_0900_AS_CS = 281;
-exports.UTF8MB4_RO_0900_AS_CS = 282;
-exports.UTF8MB4_SL_0900_AS_CS = 283;
-exports.UTF8MB4_PL_0900_AS_CS = 284;
-exports.UTF8MB4_ET_0900_AS_CS = 285;
-exports.UTF8MB4_ES_0900_AS_CS = 286;
-exports.UTF8MB4_SV_0900_AS_CS = 287;
-exports.UTF8MB4_TR_0900_AS_CS = 288;
-exports.UTF8MB4_CS_0900_AS_CS = 289;
-exports.UTF8MB4_DA_0900_AS_CS = 290;
-exports.UTF8MB4_LT_0900_AS_CS = 291;
-exports.UTF8MB4_SK_0900_AS_CS = 292;
-exports.UTF8MB4_ES_TRAD_0900_AS_CS = 293;
-exports.UTF8MB4_LA_0900_AS_CS = 294;
-exports.UTF8MB4_EO_0900_AS_CS = 296;
-exports.UTF8MB4_HU_0900_AS_CS = 297;
-exports.UTF8MB4_HR_0900_AS_CS = 298;
-exports.UTF8MB4_VI_0900_AS_CS = 300;
-exports.UTF8MB4_JA_0900_AS_CS = 303;
-exports.UTF8MB4_JA_0900_AS_CS_KS = 304;
-exports.UTF8MB4_0900_AS_CI = 305;
-exports.UTF8MB4_RU_0900_AI_CI = 306;
-exports.UTF8MB4_RU_0900_AS_CS = 307;
-exports.UTF8MB4_ZH_0900_AS_CS = 308;
-exports.UTF8MB4_0900_BIN = 309;
-
-// short aliases
-exports.BIG5 = exports.BIG5_CHINESE_CI;
-exports.DEC8 = exports.DEC8_SWEDISH_CI;
-exports.CP850 = exports.CP850_GENERAL_CI;
-exports.HP8 = exports.HP8_ENGLISH_CI;
-exports.KOI8R = exports.KOI8R_GENERAL_CI;
-exports.LATIN1 = exports.LATIN1_SWEDISH_CI;
-exports.LATIN2 = exports.LATIN2_GENERAL_CI;
-exports.SWE7 = exports.SWE7_SWEDISH_CI;
-exports.ASCII = exports.ASCII_GENERAL_CI;
-exports.UJIS = exports.UJIS_JAPANESE_CI;
-exports.SJIS = exports.SJIS_JAPANESE_CI;
-exports.HEBREW = exports.HEBREW_GENERAL_CI;
-exports.TIS620 = exports.TIS620_THAI_CI;
-exports.EUCKR = exports.EUCKR_KOREAN_CI;
-exports.KOI8U = exports.KOI8U_GENERAL_CI;
-exports.GB2312 = exports.GB2312_CHINESE_CI;
-exports.GREEK = exports.GREEK_GENERAL_CI;
-exports.CP1250 = exports.CP1250_GENERAL_CI;
-exports.GBK = exports.GBK_CHINESE_CI;
-exports.LATIN5 = exports.LATIN5_TURKISH_CI;
-exports.ARMSCII8 = exports.ARMSCII8_GENERAL_CI;
-exports.UTF8 = exports.UTF8_GENERAL_CI;
-exports.UCS2 = exports.UCS2_GENERAL_CI;
-exports.CP866 = exports.CP866_GENERAL_CI;
-exports.KEYBCS2 = exports.KEYBCS2_GENERAL_CI;
-exports.MACCE = exports.MACCE_GENERAL_CI;
-exports.MACROMAN = exports.MACROMAN_GENERAL_CI;
-exports.CP852 = exports.CP852_GENERAL_CI;
-exports.LATIN7 = exports.LATIN7_GENERAL_CI;
-exports.UTF8MB4 = exports.UTF8MB4_GENERAL_CI;
-exports.CP1251 = exports.CP1251_GENERAL_CI;
-exports.UTF16 = exports.UTF16_GENERAL_CI;
-exports.UTF16LE = exports.UTF16LE_GENERAL_CI;
-exports.CP1256 = exports.CP1256_GENERAL_CI;
-exports.CP1257 = exports.CP1257_GENERAL_CI;
-exports.UTF32 = exports.UTF32_GENERAL_CI;
-exports.CP932 = exports.CP932_JAPANESE_CI;
-exports.EUCJPMS = exports.EUCJPMS_JAPANESE_CI;
-exports.GB18030 = exports.GB18030_CHINESE_CI;
-exports.GEOSTD8 = exports.GEOSTD8_GENERAL_CI;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/client.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/client.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,39 +1,0 @@
-// This file was modified by Oracle on September 21, 2021.
-// New capability for multi-factor authentication based on mandatory session
-// trackers, that are signaled with an extra single-byte prefix on new
-// versions of the MySQL server.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-exports.LONG_PASSWORD = 0x00000001; /* new more secure passwords */
-exports.FOUND_ROWS = 0x00000002; /* found instead of affected rows */
-exports.LONG_FLAG = 0x00000004; /* get all column flags */
-exports.CONNECT_WITH_DB = 0x00000008; /* one can specify db on connect */
-exports.NO_SCHEMA = 0x00000010; /* don't allow database.table.column */
-exports.COMPRESS = 0x00000020; /* can use compression protocol */
-exports.ODBC = 0x00000040; /* odbc client */
-exports.LOCAL_FILES = 0x00000080; /* can use LOAD DATA LOCAL */
-exports.IGNORE_SPACE = 0x00000100; /* ignore spaces before '' */
-exports.PROTOCOL_41 = 0x00000200; /* new 4.1 protocol */
-exports.INTERACTIVE = 0x00000400; /* this is an interactive client */
-exports.SSL = 0x00000800; /* switch to ssl after handshake */
-exports.IGNORE_SIGPIPE = 0x00001000; /* IGNORE sigpipes */
-exports.TRANSACTIONS = 0x00002000; /* client knows about transactions */
-exports.RESERVED = 0x00004000; /* old flag for 4.1 protocol  */
-exports.SECURE_CONNECTION = 0x00008000; /* new 4.1 authentication */
-exports.MULTI_STATEMENTS = 0x00010000; /* enable/disable multi-stmt support */
-exports.MULTI_RESULTS = 0x00020000; /* enable/disable multi-results */
-exports.PS_MULTI_RESULTS = 0x00040000; /* multi-results in ps-protocol */
-exports.PLUGIN_AUTH = 0x00080000; /* client supports plugin authentication */
-exports.CONNECT_ATTRS = 0x00100000; /* permits connection attributes */
-exports.PLUGIN_AUTH_LENENC_CLIENT_DATA = 0x00200000; /* Understands length-encoded integer for auth response data in Protocol::HandshakeResponse41. */
-exports.CAN_HANDLE_EXPIRED_PASSWORDS = 0x00400000; /* Announces support for expired password extension. */
-exports.SESSION_TRACK = 0x00800000; /* Can set SERVER_SESSION_STATE_CHANGED in the Status Flags and send session-state change data after a OK packet. */
-exports.DEPRECATE_EOF = 0x01000000; /* Can send OK after a Text Resultset. */
-
-exports.SSL_VERIFY_SERVER_CERT = 0x40000000;
-exports.REMEMBER_OPTIONS = 0x80000000;
-
-exports.MULTI_FACTOR_AUTHENTICATION = 0x10000000; /* multi-factor authentication */
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/commands.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/commands.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,36 +1,0 @@
-'use strict';
-
-module.exports = {
-  SLEEP: 0x00, // deprecated
-  QUIT: 0x01,
-  INIT_DB: 0x02,
-  QUERY: 0x03,
-  FIELD_LIST: 0x04,
-  CREATE_DB: 0x05,
-  DROP_DB: 0x06,
-  REFRESH: 0x07,
-  SHUTDOWN: 0x08,
-  STATISTICS: 0x09,
-  PROCESS_INFO: 0x0a, // deprecated
-  CONNECT: 0x0b, // deprecated
-  PROCESS_KILL: 0x0c,
-  DEBUG: 0x0d,
-  PING: 0x0e,
-  TIME: 0x0f, // deprecated
-  DELAYED_INSERT: 0x10, // deprecated
-  CHANGE_USER: 0x11,
-  BINLOG_DUMP: 0x12,
-  TABLE_DUMP: 0x13,
-  CONNECT_OUT: 0x14,
-  REGISTER_SLAVE: 0x15,
-  STMT_PREPARE: 0x16,
-  STMT_EXECUTE: 0x17,
-  STMT_SEND_LONG_DATA: 0x18,
-  STMT_CLOSE: 0x19,
-  STMT_RESET: 0x1a,
-  SET_OPTION: 0x1b,
-  STMT_FETCH: 0x1c,
-  DAEMON: 0x1d, // deprecated
-  BINLOG_DUMP_GTID: 0x1e,
-  UNKNOWN: 0xff, // bad!
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/cursor.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/cursor.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,8 +1,0 @@
-'use strict';
-
-module.exports = {
-  NO_CURSOR: 0,
-  READ_ONLY: 1,
-  FOR_UPDATE: 2,
-  SCROLLABLE: 3,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/encoding_charset.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/encoding_charset.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,50 +1,0 @@
-'use strict';
-
-// inverse of charset_encodings
-// given encoding, get matching mysql charset number
-
-module.exports = {
-  big5: 1,
-  latin2: 2,
-  dec8: 3,
-  cp850: 4,
-  latin1: 5,
-  hp8: 6,
-  koi8r: 7,
-  swe7: 10,
-  ascii: 11,
-  eucjp: 12,
-  sjis: 13,
-  cp1251: 14,
-  hebrew: 16,
-  tis620: 18,
-  euckr: 19,
-  latin7: 20,
-  koi8u: 22,
-  gb2312: 24,
-  greek: 25,
-  cp1250: 26,
-  gbk: 28,
-  cp1257: 29,
-  latin5: 30,
-  armscii8: 32,
-  cesu8: 33,
-  ucs2: 35,
-  cp866: 36,
-  keybcs2: 37,
-  macintosh: 38,
-  macroman: 39,
-  cp852: 40,
-  utf8: 45,
-  utf8mb4: 45,
-  utf16: 54,
-  utf16le: 56,
-  cp1256: 57,
-  utf32: 60,
-  binary: 63,
-  geostd8: 92,
-  cp932: 95,
-  eucjpms: 97,
-  gb18030: 248,
-  utf8mb3: 192,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/errors.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/errors.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,3973 +1,0 @@
-// This file was modified by Oracle on June 1, 2021.
-// An entry was created for a new error reported by the MySQL server due to
-// client inactivity.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-// originally copied from https://raw.githubusercontent.com/mysqljs/mysql/7770ee5bb13260c56a160b91fe480d9165dbeeba/lib/protocol/constants/errors.js
-// (c) node-mysql authors
-
-// updated to contain error codes as is contained in MySQL 8.0
-// by adapting node-mysql: /.../generate-error-constants.js
-
-/**
- * MySQL error constants
- *
- * Extracted from version 8.0.33
- *
- * !! Generated by generate-error-constants.js, do not modify by hand !!
- */
-
-exports.EE_CANTCREATEFILE = 1;
-exports.EE_READ = 2;
-exports.EE_WRITE = 3;
-exports.EE_BADCLOSE = 4;
-exports.EE_OUTOFMEMORY = 5;
-exports.EE_DELETE = 6;
-exports.EE_LINK = 7;
-exports.EE_EOFERR = 9;
-exports.EE_CANTLOCK = 10;
-exports.EE_CANTUNLOCK = 11;
-exports.EE_DIR = 12;
-exports.EE_STAT = 13;
-exports.EE_CANT_CHSIZE = 14;
-exports.EE_CANT_OPEN_STREAM = 15;
-exports.EE_GETWD = 16;
-exports.EE_SETWD = 17;
-exports.EE_LINK_WARNING = 18;
-exports.EE_OPEN_WARNING = 19;
-exports.EE_DISK_FULL = 20;
-exports.EE_CANT_MKDIR = 21;
-exports.EE_UNKNOWN_CHARSET = 22;
-exports.EE_OUT_OF_FILERESOURCES = 23;
-exports.EE_CANT_READLINK = 24;
-exports.EE_CANT_SYMLINK = 25;
-exports.EE_REALPATH = 26;
-exports.EE_SYNC = 27;
-exports.EE_UNKNOWN_COLLATION = 28;
-exports.EE_FILENOTFOUND = 29;
-exports.EE_FILE_NOT_CLOSED = 30;
-exports.EE_CHANGE_OWNERSHIP = 31;
-exports.EE_CHANGE_PERMISSIONS = 32;
-exports.EE_CANT_SEEK = 33;
-exports.EE_CAPACITY_EXCEEDED = 34;
-exports.EE_DISK_FULL_WITH_RETRY_MSG = 35;
-exports.EE_FAILED_TO_CREATE_TIMER = 36;
-exports.EE_FAILED_TO_DELETE_TIMER = 37;
-exports.EE_FAILED_TO_CREATE_TIMER_QUEUE = 38;
-exports.EE_FAILED_TO_START_TIMER_NOTIFY_THREAD = 39;
-exports.EE_FAILED_TO_CREATE_TIMER_NOTIFY_THREAD_INTERRUPT_EVENT = 40;
-exports.EE_EXITING_TIMER_NOTIFY_THREAD = 41;
-exports.EE_WIN_LIBRARY_LOAD_FAILED = 42;
-exports.EE_WIN_RUN_TIME_ERROR_CHECK = 43;
-exports.EE_FAILED_TO_DETERMINE_LARGE_PAGE_SIZE = 44;
-exports.EE_FAILED_TO_KILL_ALL_THREADS = 45;
-exports.EE_FAILED_TO_CREATE_IO_COMPLETION_PORT = 46;
-exports.EE_FAILED_TO_OPEN_DEFAULTS_FILE = 47;
-exports.EE_FAILED_TO_HANDLE_DEFAULTS_FILE = 48;
-exports.EE_WRONG_DIRECTIVE_IN_CONFIG_FILE = 49;
-exports.EE_SKIPPING_DIRECTIVE_DUE_TO_MAX_INCLUDE_RECURSION = 50;
-exports.EE_INCORRECT_GRP_DEFINITION_IN_CONFIG_FILE = 51;
-exports.EE_OPTION_WITHOUT_GRP_IN_CONFIG_FILE = 52;
-exports.EE_CONFIG_FILE_PERMISSION_ERROR = 53;
-exports.EE_IGNORE_WORLD_WRITABLE_CONFIG_FILE = 54;
-exports.EE_USING_DISABLED_OPTION = 55;
-exports.EE_USING_DISABLED_SHORT_OPTION = 56;
-exports.EE_USING_PASSWORD_ON_CLI_IS_INSECURE = 57;
-exports.EE_UNKNOWN_SUFFIX_FOR_VARIABLE = 58;
-exports.EE_SSL_ERROR_FROM_FILE = 59;
-exports.EE_SSL_ERROR = 60;
-exports.EE_NET_SEND_ERROR_IN_BOOTSTRAP = 61;
-exports.EE_PACKETS_OUT_OF_ORDER = 62;
-exports.EE_UNKNOWN_PROTOCOL_OPTION = 63;
-exports.EE_FAILED_TO_LOCATE_SERVER_PUBLIC_KEY = 64;
-exports.EE_PUBLIC_KEY_NOT_IN_PEM_FORMAT = 65;
-exports.EE_DEBUG_INFO = 66;
-exports.EE_UNKNOWN_VARIABLE = 67;
-exports.EE_UNKNOWN_OPTION = 68;
-exports.EE_UNKNOWN_SHORT_OPTION = 69;
-exports.EE_OPTION_WITHOUT_ARGUMENT = 70;
-exports.EE_OPTION_REQUIRES_ARGUMENT = 71;
-exports.EE_SHORT_OPTION_REQUIRES_ARGUMENT = 72;
-exports.EE_OPTION_IGNORED_DUE_TO_INVALID_VALUE = 73;
-exports.EE_OPTION_WITH_EMPTY_VALUE = 74;
-exports.EE_FAILED_TO_ASSIGN_MAX_VALUE_TO_OPTION = 75;
-exports.EE_INCORRECT_BOOLEAN_VALUE_FOR_OPTION = 76;
-exports.EE_FAILED_TO_SET_OPTION_VALUE = 77;
-exports.EE_INCORRECT_INT_VALUE_FOR_OPTION = 78;
-exports.EE_INCORRECT_UINT_VALUE_FOR_OPTION = 79;
-exports.EE_ADJUSTED_SIGNED_VALUE_FOR_OPTION = 80;
-exports.EE_ADJUSTED_UNSIGNED_VALUE_FOR_OPTION = 81;
-exports.EE_ADJUSTED_ULONGLONG_VALUE_FOR_OPTION = 82;
-exports.EE_ADJUSTED_DOUBLE_VALUE_FOR_OPTION = 83;
-exports.EE_INVALID_DECIMAL_VALUE_FOR_OPTION = 84;
-exports.EE_COLLATION_PARSER_ERROR = 85;
-exports.EE_FAILED_TO_RESET_BEFORE_PRIMARY_IGNORABLE_CHAR = 86;
-exports.EE_FAILED_TO_RESET_BEFORE_TERTIARY_IGNORABLE_CHAR = 87;
-exports.EE_SHIFT_CHAR_OUT_OF_RANGE = 88;
-exports.EE_RESET_CHAR_OUT_OF_RANGE = 89;
-exports.EE_UNKNOWN_LDML_TAG = 90;
-exports.EE_FAILED_TO_RESET_BEFORE_SECONDARY_IGNORABLE_CHAR = 91;
-exports.EE_FAILED_PROCESSING_DIRECTIVE = 92;
-exports.EE_PTHREAD_KILL_FAILED = 93;
-exports.HA_ERR_KEY_NOT_FOUND = 120;
-exports.HA_ERR_FOUND_DUPP_KEY = 121;
-exports.HA_ERR_INTERNAL_ERROR = 122;
-exports.HA_ERR_RECORD_CHANGED = 123;
-exports.HA_ERR_WRONG_INDEX = 124;
-exports.HA_ERR_ROLLED_BACK = 125;
-exports.HA_ERR_CRASHED = 126;
-exports.HA_ERR_WRONG_IN_RECORD = 127;
-exports.HA_ERR_OUT_OF_MEM = 128;
-exports.HA_ERR_NOT_A_TABLE = 130;
-exports.HA_ERR_WRONG_COMMAND = 131;
-exports.HA_ERR_OLD_FILE = 132;
-exports.HA_ERR_NO_ACTIVE_RECORD = 133;
-exports.HA_ERR_RECORD_DELETED = 134;
-exports.HA_ERR_RECORD_FILE_FULL = 135;
-exports.HA_ERR_INDEX_FILE_FULL = 136;
-exports.HA_ERR_END_OF_FILE = 137;
-exports.HA_ERR_UNSUPPORTED = 138;
-exports.HA_ERR_TOO_BIG_ROW = 139;
-exports.HA_WRONG_CREATE_OPTION = 140;
-exports.HA_ERR_FOUND_DUPP_UNIQUE = 141;
-exports.HA_ERR_UNKNOWN_CHARSET = 142;
-exports.HA_ERR_WRONG_MRG_TABLE_DEF = 143;
-exports.HA_ERR_CRASHED_ON_REPAIR = 144;
-exports.HA_ERR_CRASHED_ON_USAGE = 145;
-exports.HA_ERR_LOCK_WAIT_TIMEOUT = 146;
-exports.HA_ERR_LOCK_TABLE_FULL = 147;
-exports.HA_ERR_READ_ONLY_TRANSACTION = 148;
-exports.HA_ERR_LOCK_DEADLOCK = 149;
-exports.HA_ERR_CANNOT_ADD_FOREIGN = 150;
-exports.HA_ERR_NO_REFERENCED_ROW = 151;
-exports.HA_ERR_ROW_IS_REFERENCED = 152;
-exports.HA_ERR_NO_SAVEPOINT = 153;
-exports.HA_ERR_NON_UNIQUE_BLOCK_SIZE = 154;
-exports.HA_ERR_NO_SUCH_TABLE = 155;
-exports.HA_ERR_TABLE_EXIST = 156;
-exports.HA_ERR_NO_CONNECTION = 157;
-exports.HA_ERR_NULL_IN_SPATIAL = 158;
-exports.HA_ERR_TABLE_DEF_CHANGED = 159;
-exports.HA_ERR_NO_PARTITION_FOUND = 160;
-exports.HA_ERR_RBR_LOGGING_FAILED = 161;
-exports.HA_ERR_DROP_INDEX_FK = 162;
-exports.HA_ERR_FOREIGN_DUPLICATE_KEY = 163;
-exports.HA_ERR_TABLE_NEEDS_UPGRADE = 164;
-exports.HA_ERR_TABLE_READONLY = 165;
-exports.HA_ERR_AUTOINC_READ_FAILED = 166;
-exports.HA_ERR_AUTOINC_ERANGE = 167;
-exports.HA_ERR_GENERIC = 168;
-exports.HA_ERR_RECORD_IS_THE_SAME = 169;
-exports.HA_ERR_LOGGING_IMPOSSIBLE = 170;
-exports.HA_ERR_CORRUPT_EVENT = 171;
-exports.HA_ERR_NEW_FILE = 172;
-exports.HA_ERR_ROWS_EVENT_APPLY = 173;
-exports.HA_ERR_INITIALIZATION = 174;
-exports.HA_ERR_FILE_TOO_SHORT = 175;
-exports.HA_ERR_WRONG_CRC = 176;
-exports.HA_ERR_TOO_MANY_CONCURRENT_TRXS = 177;
-exports.HA_ERR_NOT_IN_LOCK_PARTITIONS = 178;
-exports.HA_ERR_INDEX_COL_TOO_LONG = 179;
-exports.HA_ERR_INDEX_CORRUPT = 180;
-exports.HA_ERR_UNDO_REC_TOO_BIG = 181;
-exports.HA_FTS_INVALID_DOCID = 182;
-exports.HA_ERR_TABLE_IN_FK_CHECK = 183;
-exports.HA_ERR_TABLESPACE_EXISTS = 184;
-exports.HA_ERR_TOO_MANY_FIELDS = 185;
-exports.HA_ERR_ROW_IN_WRONG_PARTITION = 186;
-exports.HA_ERR_INNODB_READ_ONLY = 187;
-exports.HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT = 188;
-exports.HA_ERR_TEMP_FILE_WRITE_FAILURE = 189;
-exports.HA_ERR_INNODB_FORCED_RECOVERY = 190;
-exports.HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE = 191;
-exports.HA_ERR_FK_DEPTH_EXCEEDED = 192;
-exports.HA_MISSING_CREATE_OPTION = 193;
-exports.HA_ERR_SE_OUT_OF_MEMORY = 194;
-exports.HA_ERR_TABLE_CORRUPT = 195;
-exports.HA_ERR_QUERY_INTERRUPTED = 196;
-exports.HA_ERR_TABLESPACE_MISSING = 197;
-exports.HA_ERR_TABLESPACE_IS_NOT_EMPTY = 198;
-exports.HA_ERR_WRONG_FILE_NAME = 199;
-exports.HA_ERR_NOT_ALLOWED_COMMAND = 200;
-exports.HA_ERR_COMPUTE_FAILED = 201;
-exports.HA_ERR_ROW_FORMAT_CHANGED = 202;
-exports.HA_ERR_NO_WAIT_LOCK = 203;
-exports.HA_ERR_DISK_FULL_NOWAIT = 204;
-exports.HA_ERR_NO_SESSION_TEMP = 205;
-exports.HA_ERR_WRONG_TABLE_NAME = 206;
-exports.HA_ERR_TOO_LONG_PATH = 207;
-exports.HA_ERR_SAMPLING_INIT_FAILED = 208;
-exports.HA_ERR_FTS_TOO_MANY_NESTED_EXP = 209;
-exports.ER_HASHCHK = 1000;
-exports.ER_NISAMCHK = 1001;
-exports.ER_NO = 1002;
-exports.ER_YES = 1003;
-exports.ER_CANT_CREATE_FILE = 1004;
-exports.ER_CANT_CREATE_TABLE = 1005;
-exports.ER_CANT_CREATE_DB = 1006;
-exports.ER_DB_CREATE_EXISTS = 1007;
-exports.ER_DB_DROP_EXISTS = 1008;
-exports.ER_DB_DROP_DELETE = 1009;
-exports.ER_DB_DROP_RMDIR = 1010;
-exports.ER_CANT_DELETE_FILE = 1011;
-exports.ER_CANT_FIND_SYSTEM_REC = 1012;
-exports.ER_CANT_GET_STAT = 1013;
-exports.ER_CANT_GET_WD = 1014;
-exports.ER_CANT_LOCK = 1015;
-exports.ER_CANT_OPEN_FILE = 1016;
-exports.ER_FILE_NOT_FOUND = 1017;
-exports.ER_CANT_READ_DIR = 1018;
-exports.ER_CANT_SET_WD = 1019;
-exports.ER_CHECKREAD = 1020;
-exports.ER_DISK_FULL = 1021;
-exports.ER_DUP_KEY = 1022;
-exports.ER_ERROR_ON_CLOSE = 1023;
-exports.ER_ERROR_ON_READ = 1024;
-exports.ER_ERROR_ON_RENAME = 1025;
-exports.ER_ERROR_ON_WRITE = 1026;
-exports.ER_FILE_USED = 1027;
-exports.ER_FILSORT_ABORT = 1028;
-exports.ER_FORM_NOT_FOUND = 1029;
-exports.ER_GET_ERRNO = 1030;
-exports.ER_ILLEGAL_HA = 1031;
-exports.ER_KEY_NOT_FOUND = 1032;
-exports.ER_NOT_FORM_FILE = 1033;
-exports.ER_NOT_KEYFILE = 1034;
-exports.ER_OLD_KEYFILE = 1035;
-exports.ER_OPEN_AS_READONLY = 1036;
-exports.ER_OUTOFMEMORY = 1037;
-exports.ER_OUT_OF_SORTMEMORY = 1038;
-exports.ER_UNEXPECTED_EOF = 1039;
-exports.ER_CON_COUNT_ERROR = 1040;
-exports.ER_OUT_OF_RESOURCES = 1041;
-exports.ER_BAD_HOST_ERROR = 1042;
-exports.ER_HANDSHAKE_ERROR = 1043;
-exports.ER_DBACCESS_DENIED_ERROR = 1044;
-exports.ER_ACCESS_DENIED_ERROR = 1045;
-exports.ER_NO_DB_ERROR = 1046;
-exports.ER_UNKNOWN_COM_ERROR = 1047;
-exports.ER_BAD_NULL_ERROR = 1048;
-exports.ER_BAD_DB_ERROR = 1049;
-exports.ER_TABLE_EXISTS_ERROR = 1050;
-exports.ER_BAD_TABLE_ERROR = 1051;
-exports.ER_NON_UNIQ_ERROR = 1052;
-exports.ER_SERVER_SHUTDOWN = 1053;
-exports.ER_BAD_FIELD_ERROR = 1054;
-exports.ER_WRONG_FIELD_WITH_GROUP = 1055;
-exports.ER_WRONG_GROUP_FIELD = 1056;
-exports.ER_WRONG_SUM_SELECT = 1057;
-exports.ER_WRONG_VALUE_COUNT = 1058;
-exports.ER_TOO_LONG_IDENT = 1059;
-exports.ER_DUP_FIELDNAME = 1060;
-exports.ER_DUP_KEYNAME = 1061;
-exports.ER_DUP_ENTRY = 1062;
-exports.ER_WRONG_FIELD_SPEC = 1063;
-exports.ER_PARSE_ERROR = 1064;
-exports.ER_EMPTY_QUERY = 1065;
-exports.ER_NONUNIQ_TABLE = 1066;
-exports.ER_INVALID_DEFAULT = 1067;
-exports.ER_MULTIPLE_PRI_KEY = 1068;
-exports.ER_TOO_MANY_KEYS = 1069;
-exports.ER_TOO_MANY_KEY_PARTS = 1070;
-exports.ER_TOO_LONG_KEY = 1071;
-exports.ER_KEY_COLUMN_DOES_NOT_EXITS = 1072;
-exports.ER_BLOB_USED_AS_KEY = 1073;
-exports.ER_TOO_BIG_FIELDLENGTH = 1074;
-exports.ER_WRONG_AUTO_KEY = 1075;
-exports.ER_READY = 1076;
-exports.ER_NORMAL_SHUTDOWN = 1077;
-exports.ER_GOT_SIGNAL = 1078;
-exports.ER_SHUTDOWN_COMPLETE = 1079;
-exports.ER_FORCING_CLOSE = 1080;
-exports.ER_IPSOCK_ERROR = 1081;
-exports.ER_NO_SUCH_INDEX = 1082;
-exports.ER_WRONG_FIELD_TERMINATORS = 1083;
-exports.ER_BLOBS_AND_NO_TERMINATED = 1084;
-exports.ER_TEXTFILE_NOT_READABLE = 1085;
-exports.ER_FILE_EXISTS_ERROR = 1086;
-exports.ER_LOAD_INFO = 1087;
-exports.ER_ALTER_INFO = 1088;
-exports.ER_WRONG_SUB_KEY = 1089;
-exports.ER_CANT_REMOVE_ALL_FIELDS = 1090;
-exports.ER_CANT_DROP_FIELD_OR_KEY = 1091;
-exports.ER_INSERT_INFO = 1092;
-exports.ER_UPDATE_TABLE_USED = 1093;
-exports.ER_NO_SUCH_THREAD = 1094;
-exports.ER_KILL_DENIED_ERROR = 1095;
-exports.ER_NO_TABLES_USED = 1096;
-exports.ER_TOO_BIG_SET = 1097;
-exports.ER_NO_UNIQUE_LOGFILE = 1098;
-exports.ER_TABLE_NOT_LOCKED_FOR_WRITE = 1099;
-exports.ER_TABLE_NOT_LOCKED = 1100;
-exports.ER_BLOB_CANT_HAVE_DEFAULT = 1101;
-exports.ER_WRONG_DB_NAME = 1102;
-exports.ER_WRONG_TABLE_NAME = 1103;
-exports.ER_TOO_BIG_SELECT = 1104;
-exports.ER_UNKNOWN_ERROR = 1105;
-exports.ER_UNKNOWN_PROCEDURE = 1106;
-exports.ER_WRONG_PARAMCOUNT_TO_PROCEDURE = 1107;
-exports.ER_WRONG_PARAMETERS_TO_PROCEDURE = 1108;
-exports.ER_UNKNOWN_TABLE = 1109;
-exports.ER_FIELD_SPECIFIED_TWICE = 1110;
-exports.ER_INVALID_GROUP_FUNC_USE = 1111;
-exports.ER_UNSUPPORTED_EXTENSION = 1112;
-exports.ER_TABLE_MUST_HAVE_COLUMNS = 1113;
-exports.ER_RECORD_FILE_FULL = 1114;
-exports.ER_UNKNOWN_CHARACTER_SET = 1115;
-exports.ER_TOO_MANY_TABLES = 1116;
-exports.ER_TOO_MANY_FIELDS = 1117;
-exports.ER_TOO_BIG_ROWSIZE = 1118;
-exports.ER_STACK_OVERRUN = 1119;
-exports.ER_WRONG_OUTER_JOIN = 1120;
-exports.ER_NULL_COLUMN_IN_INDEX = 1121;
-exports.ER_CANT_FIND_UDF = 1122;
-exports.ER_CANT_INITIALIZE_UDF = 1123;
-exports.ER_UDF_NO_PATHS = 1124;
-exports.ER_UDF_EXISTS = 1125;
-exports.ER_CANT_OPEN_LIBRARY = 1126;
-exports.ER_CANT_FIND_DL_ENTRY = 1127;
-exports.ER_FUNCTION_NOT_DEFINED = 1128;
-exports.ER_HOST_IS_BLOCKED = 1129;
-exports.ER_HOST_NOT_PRIVILEGED = 1130;
-exports.ER_PASSWORD_ANONYMOUS_USER = 1131;
-exports.ER_PASSWORD_NOT_ALLOWED = 1132;
-exports.ER_PASSWORD_NO_MATCH = 1133;
-exports.ER_UPDATE_INFO = 1134;
-exports.ER_CANT_CREATE_THREAD = 1135;
-exports.ER_WRONG_VALUE_COUNT_ON_ROW = 1136;
-exports.ER_CANT_REOPEN_TABLE = 1137;
-exports.ER_INVALID_USE_OF_NULL = 1138;
-exports.ER_REGEXP_ERROR = 1139;
-exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS = 1140;
-exports.ER_NONEXISTING_GRANT = 1141;
-exports.ER_TABLEACCESS_DENIED_ERROR = 1142;
-exports.ER_COLUMNACCESS_DENIED_ERROR = 1143;
-exports.ER_ILLEGAL_GRANT_FOR_TABLE = 1144;
-exports.ER_GRANT_WRONG_HOST_OR_USER = 1145;
-exports.ER_NO_SUCH_TABLE = 1146;
-exports.ER_NONEXISTING_TABLE_GRANT = 1147;
-exports.ER_NOT_ALLOWED_COMMAND = 1148;
-exports.ER_SYNTAX_ERROR = 1149;
-exports.ER_UNUSED1 = 1150;
-exports.ER_UNUSED2 = 1151;
-exports.ER_ABORTING_CONNECTION = 1152;
-exports.ER_NET_PACKET_TOO_LARGE = 1153;
-exports.ER_NET_READ_ERROR_FROM_PIPE = 1154;
-exports.ER_NET_FCNTL_ERROR = 1155;
-exports.ER_NET_PACKETS_OUT_OF_ORDER = 1156;
-exports.ER_NET_UNCOMPRESS_ERROR = 1157;
-exports.ER_NET_READ_ERROR = 1158;
-exports.ER_NET_READ_INTERRUPTED = 1159;
-exports.ER_NET_ERROR_ON_WRITE = 1160;
-exports.ER_NET_WRITE_INTERRUPTED = 1161;
-exports.ER_TOO_LONG_STRING = 1162;
-exports.ER_TABLE_CANT_HANDLE_BLOB = 1163;
-exports.ER_TABLE_CANT_HANDLE_AUTO_INCREMENT = 1164;
-exports.ER_UNUSED3 = 1165;
-exports.ER_WRONG_COLUMN_NAME = 1166;
-exports.ER_WRONG_KEY_COLUMN = 1167;
-exports.ER_WRONG_MRG_TABLE = 1168;
-exports.ER_DUP_UNIQUE = 1169;
-exports.ER_BLOB_KEY_WITHOUT_LENGTH = 1170;
-exports.ER_PRIMARY_CANT_HAVE_NULL = 1171;
-exports.ER_TOO_MANY_ROWS = 1172;
-exports.ER_REQUIRES_PRIMARY_KEY = 1173;
-exports.ER_NO_RAID_COMPILED = 1174;
-exports.ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE = 1175;
-exports.ER_KEY_DOES_NOT_EXITS = 1176;
-exports.ER_CHECK_NO_SUCH_TABLE = 1177;
-exports.ER_CHECK_NOT_IMPLEMENTED = 1178;
-exports.ER_CANT_DO_THIS_DURING_AN_TRANSACTION = 1179;
-exports.ER_ERROR_DURING_COMMIT = 1180;
-exports.ER_ERROR_DURING_ROLLBACK = 1181;
-exports.ER_ERROR_DURING_FLUSH_LOGS = 1182;
-exports.ER_ERROR_DURING_CHECKPOINT = 1183;
-exports.ER_NEW_ABORTING_CONNECTION = 1184;
-exports.ER_DUMP_NOT_IMPLEMENTED = 1185;
-exports.ER_FLUSH_MASTER_BINLOG_CLOSED = 1186;
-exports.ER_INDEX_REBUILD = 1187;
-exports.ER_SOURCE = 1188;
-exports.ER_SOURCE_NET_READ = 1189;
-exports.ER_SOURCE_NET_WRITE = 1190;
-exports.ER_FT_MATCHING_KEY_NOT_FOUND = 1191;
-exports.ER_LOCK_OR_ACTIVE_TRANSACTION = 1192;
-exports.ER_UNKNOWN_SYSTEM_VARIABLE = 1193;
-exports.ER_CRASHED_ON_USAGE = 1194;
-exports.ER_CRASHED_ON_REPAIR = 1195;
-exports.ER_WARNING_NOT_COMPLETE_ROLLBACK = 1196;
-exports.ER_TRANS_CACHE_FULL = 1197;
-exports.ER_SLAVE_MUST_STOP = 1198;
-exports.ER_REPLICA_NOT_RUNNING = 1199;
-exports.ER_BAD_REPLICA = 1200;
-exports.ER_CONNECTION_METADATA = 1201;
-exports.ER_REPLICA_THREAD = 1202;
-exports.ER_TOO_MANY_USER_CONNECTIONS = 1203;
-exports.ER_SET_CONSTANTS_ONLY = 1204;
-exports.ER_LOCK_WAIT_TIMEOUT = 1205;
-exports.ER_LOCK_TABLE_FULL = 1206;
-exports.ER_READ_ONLY_TRANSACTION = 1207;
-exports.ER_DROP_DB_WITH_READ_LOCK = 1208;
-exports.ER_CREATE_DB_WITH_READ_LOCK = 1209;
-exports.ER_WRONG_ARGUMENTS = 1210;
-exports.ER_NO_PERMISSION_TO_CREATE_USER = 1211;
-exports.ER_UNION_TABLES_IN_DIFFERENT_DIR = 1212;
-exports.ER_LOCK_DEADLOCK = 1213;
-exports.ER_TABLE_CANT_HANDLE_FT = 1214;
-exports.ER_CANNOT_ADD_FOREIGN = 1215;
-exports.ER_NO_REFERENCED_ROW = 1216;
-exports.ER_ROW_IS_REFERENCED = 1217;
-exports.ER_CONNECT_TO_SOURCE = 1218;
-exports.ER_QUERY_ON_MASTER = 1219;
-exports.ER_ERROR_WHEN_EXECUTING_COMMAND = 1220;
-exports.ER_WRONG_USAGE = 1221;
-exports.ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT = 1222;
-exports.ER_CANT_UPDATE_WITH_READLOCK = 1223;
-exports.ER_MIXING_NOT_ALLOWED = 1224;
-exports.ER_DUP_ARGUMENT = 1225;
-exports.ER_USER_LIMIT_REACHED = 1226;
-exports.ER_SPECIFIC_ACCESS_DENIED_ERROR = 1227;
-exports.ER_LOCAL_VARIABLE = 1228;
-exports.ER_GLOBAL_VARIABLE = 1229;
-exports.ER_NO_DEFAULT = 1230;
-exports.ER_WRONG_VALUE_FOR_VAR = 1231;
-exports.ER_WRONG_TYPE_FOR_VAR = 1232;
-exports.ER_VAR_CANT_BE_READ = 1233;
-exports.ER_CANT_USE_OPTION_HERE = 1234;
-exports.ER_NOT_SUPPORTED_YET = 1235;
-exports.ER_SOURCE_FATAL_ERROR_READING_BINLOG = 1236;
-exports.ER_REPLICA_IGNORED_TABLE = 1237;
-exports.ER_INCORRECT_GLOBAL_LOCAL_VAR = 1238;
-exports.ER_WRONG_FK_DEF = 1239;
-exports.ER_KEY_REF_DO_NOT_MATCH_TABLE_REF = 1240;
-exports.ER_OPERAND_COLUMNS = 1241;
-exports.ER_SUBQUERY_NO_1_ROW = 1242;
-exports.ER_UNKNOWN_STMT_HANDLER = 1243;
-exports.ER_CORRUPT_HELP_DB = 1244;
-exports.ER_CYCLIC_REFERENCE = 1245;
-exports.ER_AUTO_CONVERT = 1246;
-exports.ER_ILLEGAL_REFERENCE = 1247;
-exports.ER_DERIVED_MUST_HAVE_ALIAS = 1248;
-exports.ER_SELECT_REDUCED = 1249;
-exports.ER_TABLENAME_NOT_ALLOWED_HERE = 1250;
-exports.ER_NOT_SUPPORTED_AUTH_MODE = 1251;
-exports.ER_SPATIAL_CANT_HAVE_NULL = 1252;
-exports.ER_COLLATION_CHARSET_MISMATCH = 1253;
-exports.ER_SLAVE_WAS_RUNNING = 1254;
-exports.ER_SLAVE_WAS_NOT_RUNNING = 1255;
-exports.ER_TOO_BIG_FOR_UNCOMPRESS = 1256;
-exports.ER_ZLIB_Z_MEM_ERROR = 1257;
-exports.ER_ZLIB_Z_BUF_ERROR = 1258;
-exports.ER_ZLIB_Z_DATA_ERROR = 1259;
-exports.ER_CUT_VALUE_GROUP_CONCAT = 1260;
-exports.ER_WARN_TOO_FEW_RECORDS = 1261;
-exports.ER_WARN_TOO_MANY_RECORDS = 1262;
-exports.ER_WARN_NULL_TO_NOTNULL = 1263;
-exports.ER_WARN_DATA_OUT_OF_RANGE = 1264;
-exports.WARN_DATA_TRUNCATED = 1265;
-exports.ER_WARN_USING_OTHER_HANDLER = 1266;
-exports.ER_CANT_AGGREGATE_2COLLATIONS = 1267;
-exports.ER_DROP_USER = 1268;
-exports.ER_REVOKE_GRANTS = 1269;
-exports.ER_CANT_AGGREGATE_3COLLATIONS = 1270;
-exports.ER_CANT_AGGREGATE_NCOLLATIONS = 1271;
-exports.ER_VARIABLE_IS_NOT_STRUCT = 1272;
-exports.ER_UNKNOWN_COLLATION = 1273;
-exports.ER_REPLICA_IGNORED_SSL_PARAMS = 1274;
-exports.ER_SERVER_IS_IN_SECURE_AUTH_MODE = 1275;
-exports.ER_WARN_FIELD_RESOLVED = 1276;
-exports.ER_BAD_REPLICA_UNTIL_COND = 1277;
-exports.ER_MISSING_SKIP_REPLICA = 1278;
-exports.ER_UNTIL_COND_IGNORED = 1279;
-exports.ER_WRONG_NAME_FOR_INDEX = 1280;
-exports.ER_WRONG_NAME_FOR_CATALOG = 1281;
-exports.ER_WARN_QC_RESIZE = 1282;
-exports.ER_BAD_FT_COLUMN = 1283;
-exports.ER_UNKNOWN_KEY_CACHE = 1284;
-exports.ER_WARN_HOSTNAME_WONT_WORK = 1285;
-exports.ER_UNKNOWN_STORAGE_ENGINE = 1286;
-exports.ER_WARN_DEPRECATED_SYNTAX = 1287;
-exports.ER_NON_UPDATABLE_TABLE = 1288;
-exports.ER_FEATURE_DISABLED = 1289;
-exports.ER_OPTION_PREVENTS_STATEMENT = 1290;
-exports.ER_DUPLICATED_VALUE_IN_TYPE = 1291;
-exports.ER_TRUNCATED_WRONG_VALUE = 1292;
-exports.ER_TOO_MUCH_AUTO_TIMESTAMP_COLS = 1293;
-exports.ER_INVALID_ON_UPDATE = 1294;
-exports.ER_UNSUPPORTED_PS = 1295;
-exports.ER_GET_ERRMSG = 1296;
-exports.ER_GET_TEMPORARY_ERRMSG = 1297;
-exports.ER_UNKNOWN_TIME_ZONE = 1298;
-exports.ER_WARN_INVALID_TIMESTAMP = 1299;
-exports.ER_INVALID_CHARACTER_STRING = 1300;
-exports.ER_WARN_ALLOWED_PACKET_OVERFLOWED = 1301;
-exports.ER_CONFLICTING_DECLARATIONS = 1302;
-exports.ER_SP_NO_RECURSIVE_CREATE = 1303;
-exports.ER_SP_ALREADY_EXISTS = 1304;
-exports.ER_SP_DOES_NOT_EXIST = 1305;
-exports.ER_SP_DROP_FAILED = 1306;
-exports.ER_SP_STORE_FAILED = 1307;
-exports.ER_SP_LILABEL_MISMATCH = 1308;
-exports.ER_SP_LABEL_REDEFINE = 1309;
-exports.ER_SP_LABEL_MISMATCH = 1310;
-exports.ER_SP_UNINIT_VAR = 1311;
-exports.ER_SP_BADSELECT = 1312;
-exports.ER_SP_BADRETURN = 1313;
-exports.ER_SP_BADSTATEMENT = 1314;
-exports.ER_UPDATE_LOG_DEPRECATED_IGNORED = 1315;
-exports.ER_UPDATE_LOG_DEPRECATED_TRANSLATED = 1316;
-exports.ER_QUERY_INTERRUPTED = 1317;
-exports.ER_SP_WRONG_NO_OF_ARGS = 1318;
-exports.ER_SP_COND_MISMATCH = 1319;
-exports.ER_SP_NORETURN = 1320;
-exports.ER_SP_NORETURNEND = 1321;
-exports.ER_SP_BAD_CURSOR_QUERY = 1322;
-exports.ER_SP_BAD_CURSOR_SELECT = 1323;
-exports.ER_SP_CURSOR_MISMATCH = 1324;
-exports.ER_SP_CURSOR_ALREADY_OPEN = 1325;
-exports.ER_SP_CURSOR_NOT_OPEN = 1326;
-exports.ER_SP_UNDECLARED_VAR = 1327;
-exports.ER_SP_WRONG_NO_OF_FETCH_ARGS = 1328;
-exports.ER_SP_FETCH_NO_DATA = 1329;
-exports.ER_SP_DUP_PARAM = 1330;
-exports.ER_SP_DUP_VAR = 1331;
-exports.ER_SP_DUP_COND = 1332;
-exports.ER_SP_DUP_CURS = 1333;
-exports.ER_SP_CANT_ALTER = 1334;
-exports.ER_SP_SUBSELECT_NYI = 1335;
-exports.ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG = 1336;
-exports.ER_SP_VARCOND_AFTER_CURSHNDLR = 1337;
-exports.ER_SP_CURSOR_AFTER_HANDLER = 1338;
-exports.ER_SP_CASE_NOT_FOUND = 1339;
-exports.ER_FPARSER_TOO_BIG_FILE = 1340;
-exports.ER_FPARSER_BAD_HEADER = 1341;
-exports.ER_FPARSER_EOF_IN_COMMENT = 1342;
-exports.ER_FPARSER_ERROR_IN_PARAMETER = 1343;
-exports.ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER = 1344;
-exports.ER_VIEW_NO_EXPLAIN = 1345;
-exports.ER_FRM_UNKNOWN_TYPE = 1346;
-exports.ER_WRONG_OBJECT = 1347;
-exports.ER_NONUPDATEABLE_COLUMN = 1348;
-exports.ER_VIEW_SELECT_DERIVED = 1349;
-exports.ER_VIEW_SELECT_CLAUSE = 1350;
-exports.ER_VIEW_SELECT_VARIABLE = 1351;
-exports.ER_VIEW_SELECT_TMPTABLE = 1352;
-exports.ER_VIEW_WRONG_LIST = 1353;
-exports.ER_WARN_VIEW_MERGE = 1354;
-exports.ER_WARN_VIEW_WITHOUT_KEY = 1355;
-exports.ER_VIEW_INVALID = 1356;
-exports.ER_SP_NO_DROP_SP = 1357;
-exports.ER_SP_GOTO_IN_HNDLR = 1358;
-exports.ER_TRG_ALREADY_EXISTS = 1359;
-exports.ER_TRG_DOES_NOT_EXIST = 1360;
-exports.ER_TRG_ON_VIEW_OR_TEMP_TABLE = 1361;
-exports.ER_TRG_CANT_CHANGE_ROW = 1362;
-exports.ER_TRG_NO_SUCH_ROW_IN_TRG = 1363;
-exports.ER_NO_DEFAULT_FOR_FIELD = 1364;
-exports.ER_DIVISION_BY_ZERO = 1365;
-exports.ER_TRUNCATED_WRONG_VALUE_FOR_FIELD = 1366;
-exports.ER_ILLEGAL_VALUE_FOR_TYPE = 1367;
-exports.ER_VIEW_NONUPD_CHECK = 1368;
-exports.ER_VIEW_CHECK_FAILED = 1369;
-exports.ER_PROCACCESS_DENIED_ERROR = 1370;
-exports.ER_RELAY_LOG_FAIL = 1371;
-exports.ER_PASSWD_LENGTH = 1372;
-exports.ER_UNKNOWN_TARGET_BINLOG = 1373;
-exports.ER_IO_ERR_LOG_INDEX_READ = 1374;
-exports.ER_BINLOG_PURGE_PROHIBITED = 1375;
-exports.ER_FSEEK_FAIL = 1376;
-exports.ER_BINLOG_PURGE_FATAL_ERR = 1377;
-exports.ER_LOG_IN_USE = 1378;
-exports.ER_LOG_PURGE_UNKNOWN_ERR = 1379;
-exports.ER_RELAY_LOG_INIT = 1380;
-exports.ER_NO_BINARY_LOGGING = 1381;
-exports.ER_RESERVED_SYNTAX = 1382;
-exports.ER_WSAS_FAILED = 1383;
-exports.ER_DIFF_GROUPS_PROC = 1384;
-exports.ER_NO_GROUP_FOR_PROC = 1385;
-exports.ER_ORDER_WITH_PROC = 1386;
-exports.ER_LOGGING_PROHIBIT_CHANGING_OF = 1387;
-exports.ER_NO_FILE_MAPPING = 1388;
-exports.ER_WRONG_MAGIC = 1389;
-exports.ER_PS_MANY_PARAM = 1390;
-exports.ER_KEY_PART_0 = 1391;
-exports.ER_VIEW_CHECKSUM = 1392;
-exports.ER_VIEW_MULTIUPDATE = 1393;
-exports.ER_VIEW_NO_INSERT_FIELD_LIST = 1394;
-exports.ER_VIEW_DELETE_MERGE_VIEW = 1395;
-exports.ER_CANNOT_USER = 1396;
-exports.ER_XAER_NOTA = 1397;
-exports.ER_XAER_INVAL = 1398;
-exports.ER_XAER_RMFAIL = 1399;
-exports.ER_XAER_OUTSIDE = 1400;
-exports.ER_XAER_RMERR = 1401;
-exports.ER_XA_RBROLLBACK = 1402;
-exports.ER_NONEXISTING_PROC_GRANT = 1403;
-exports.ER_PROC_AUTO_GRANT_FAIL = 1404;
-exports.ER_PROC_AUTO_REVOKE_FAIL = 1405;
-exports.ER_DATA_TOO_LONG = 1406;
-exports.ER_SP_BAD_SQLSTATE = 1407;
-exports.ER_STARTUP = 1408;
-exports.ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR = 1409;
-exports.ER_CANT_CREATE_USER_WITH_GRANT = 1410;
-exports.ER_WRONG_VALUE_FOR_TYPE = 1411;
-exports.ER_TABLE_DEF_CHANGED = 1412;
-exports.ER_SP_DUP_HANDLER = 1413;
-exports.ER_SP_NOT_VAR_ARG = 1414;
-exports.ER_SP_NO_RETSET = 1415;
-exports.ER_CANT_CREATE_GEOMETRY_OBJECT = 1416;
-exports.ER_FAILED_ROUTINE_BREAK_BINLOG = 1417;
-exports.ER_BINLOG_UNSAFE_ROUTINE = 1418;
-exports.ER_BINLOG_CREATE_ROUTINE_NEED_SUPER = 1419;
-exports.ER_EXEC_STMT_WITH_OPEN_CURSOR = 1420;
-exports.ER_STMT_HAS_NO_OPEN_CURSOR = 1421;
-exports.ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG = 1422;
-exports.ER_NO_DEFAULT_FOR_VIEW_FIELD = 1423;
-exports.ER_SP_NO_RECURSION = 1424;
-exports.ER_TOO_BIG_SCALE = 1425;
-exports.ER_TOO_BIG_PRECISION = 1426;
-exports.ER_M_BIGGER_THAN_D = 1427;
-exports.ER_WRONG_LOCK_OF_SYSTEM_TABLE = 1428;
-exports.ER_CONNECT_TO_FOREIGN_DATA_SOURCE = 1429;
-exports.ER_QUERY_ON_FOREIGN_DATA_SOURCE = 1430;
-exports.ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST = 1431;
-exports.ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE = 1432;
-exports.ER_FOREIGN_DATA_STRING_INVALID = 1433;
-exports.ER_CANT_CREATE_FEDERATED_TABLE = 1434;
-exports.ER_TRG_IN_WRONG_SCHEMA = 1435;
-exports.ER_STACK_OVERRUN_NEED_MORE = 1436;
-exports.ER_TOO_LONG_BODY = 1437;
-exports.ER_WARN_CANT_DROP_DEFAULT_KEYCACHE = 1438;
-exports.ER_TOO_BIG_DISPLAYWIDTH = 1439;
-exports.ER_XAER_DUPID = 1440;
-exports.ER_DATETIME_FUNCTION_OVERFLOW = 1441;
-exports.ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG = 1442;
-exports.ER_VIEW_PREVENT_UPDATE = 1443;
-exports.ER_PS_NO_RECURSION = 1444;
-exports.ER_SP_CANT_SET_AUTOCOMMIT = 1445;
-exports.ER_MALFORMED_DEFINER = 1446;
-exports.ER_VIEW_FRM_NO_USER = 1447;
-exports.ER_VIEW_OTHER_USER = 1448;
-exports.ER_NO_SUCH_USER = 1449;
-exports.ER_FORBID_SCHEMA_CHANGE = 1450;
-exports.ER_ROW_IS_REFERENCED_2 = 1451;
-exports.ER_NO_REFERENCED_ROW_2 = 1452;
-exports.ER_SP_BAD_VAR_SHADOW = 1453;
-exports.ER_TRG_NO_DEFINER = 1454;
-exports.ER_OLD_FILE_FORMAT = 1455;
-exports.ER_SP_RECURSION_LIMIT = 1456;
-exports.ER_SP_PROC_TABLE_CORRUPT = 1457;
-exports.ER_SP_WRONG_NAME = 1458;
-exports.ER_TABLE_NEEDS_UPGRADE = 1459;
-exports.ER_SP_NO_AGGREGATE = 1460;
-exports.ER_MAX_PREPARED_STMT_COUNT_REACHED = 1461;
-exports.ER_VIEW_RECURSIVE = 1462;
-exports.ER_NON_GROUPING_FIELD_USED = 1463;
-exports.ER_TABLE_CANT_HANDLE_SPKEYS = 1464;
-exports.ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA = 1465;
-exports.ER_REMOVED_SPACES = 1466;
-exports.ER_AUTOINC_READ_FAILED = 1467;
-exports.ER_USERNAME = 1468;
-exports.ER_HOSTNAME = 1469;
-exports.ER_WRONG_STRING_LENGTH = 1470;
-exports.ER_NON_INSERTABLE_TABLE = 1471;
-exports.ER_ADMIN_WRONG_MRG_TABLE = 1472;
-exports.ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT = 1473;
-exports.ER_NAME_BECOMES_EMPTY = 1474;
-exports.ER_AMBIGUOUS_FIELD_TERM = 1475;
-exports.ER_FOREIGN_SERVER_EXISTS = 1476;
-exports.ER_FOREIGN_SERVER_DOESNT_EXIST = 1477;
-exports.ER_ILLEGAL_HA_CREATE_OPTION = 1478;
-exports.ER_PARTITION_REQUIRES_VALUES_ERROR = 1479;
-exports.ER_PARTITION_WRONG_VALUES_ERROR = 1480;
-exports.ER_PARTITION_MAXVALUE_ERROR = 1481;
-exports.ER_PARTITION_SUBPARTITION_ERROR = 1482;
-exports.ER_PARTITION_SUBPART_MIX_ERROR = 1483;
-exports.ER_PARTITION_WRONG_NO_PART_ERROR = 1484;
-exports.ER_PARTITION_WRONG_NO_SUBPART_ERROR = 1485;
-exports.ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR = 1486;
-exports.ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR = 1487;
-exports.ER_FIELD_NOT_FOUND_PART_ERROR = 1488;
-exports.ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR = 1489;
-exports.ER_INCONSISTENT_PARTITION_INFO_ERROR = 1490;
-exports.ER_PARTITION_FUNC_NOT_ALLOWED_ERROR = 1491;
-exports.ER_PARTITIONS_MUST_BE_DEFINED_ERROR = 1492;
-exports.ER_RANGE_NOT_INCREASING_ERROR = 1493;
-exports.ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR = 1494;
-exports.ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR = 1495;
-exports.ER_PARTITION_ENTRY_ERROR = 1496;
-exports.ER_MIX_HANDLER_ERROR = 1497;
-exports.ER_PARTITION_NOT_DEFINED_ERROR = 1498;
-exports.ER_TOO_MANY_PARTITIONS_ERROR = 1499;
-exports.ER_SUBPARTITION_ERROR = 1500;
-exports.ER_CANT_CREATE_HANDLER_FILE = 1501;
-exports.ER_BLOB_FIELD_IN_PART_FUNC_ERROR = 1502;
-exports.ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF = 1503;
-exports.ER_NO_PARTS_ERROR = 1504;
-exports.ER_PARTITION_MGMT_ON_NONPARTITIONED = 1505;
-exports.ER_FOREIGN_KEY_ON_PARTITIONED = 1506;
-exports.ER_DROP_PARTITION_NON_EXISTENT = 1507;
-exports.ER_DROP_LAST_PARTITION = 1508;
-exports.ER_COALESCE_ONLY_ON_HASH_PARTITION = 1509;
-exports.ER_REORG_HASH_ONLY_ON_SAME_NO = 1510;
-exports.ER_REORG_NO_PARAM_ERROR = 1511;
-exports.ER_ONLY_ON_RANGE_LIST_PARTITION = 1512;
-exports.ER_ADD_PARTITION_SUBPART_ERROR = 1513;
-exports.ER_ADD_PARTITION_NO_NEW_PARTITION = 1514;
-exports.ER_COALESCE_PARTITION_NO_PARTITION = 1515;
-exports.ER_REORG_PARTITION_NOT_EXIST = 1516;
-exports.ER_SAME_NAME_PARTITION = 1517;
-exports.ER_NO_BINLOG_ERROR = 1518;
-exports.ER_CONSECUTIVE_REORG_PARTITIONS = 1519;
-exports.ER_REORG_OUTSIDE_RANGE = 1520;
-exports.ER_PARTITION_FUNCTION_FAILURE = 1521;
-exports.ER_PART_STATE_ERROR = 1522;
-exports.ER_LIMITED_PART_RANGE = 1523;
-exports.ER_PLUGIN_IS_NOT_LOADED = 1524;
-exports.ER_WRONG_VALUE = 1525;
-exports.ER_NO_PARTITION_FOR_GIVEN_VALUE = 1526;
-exports.ER_FILEGROUP_OPTION_ONLY_ONCE = 1527;
-exports.ER_CREATE_FILEGROUP_FAILED = 1528;
-exports.ER_DROP_FILEGROUP_FAILED = 1529;
-exports.ER_TABLESPACE_AUTO_EXTEND_ERROR = 1530;
-exports.ER_WRONG_SIZE_NUMBER = 1531;
-exports.ER_SIZE_OVERFLOW_ERROR = 1532;
-exports.ER_ALTER_FILEGROUP_FAILED = 1533;
-exports.ER_BINLOG_ROW_LOGGING_FAILED = 1534;
-exports.ER_BINLOG_ROW_WRONG_TABLE_DEF = 1535;
-exports.ER_BINLOG_ROW_RBR_TO_SBR = 1536;
-exports.ER_EVENT_ALREADY_EXISTS = 1537;
-exports.ER_EVENT_STORE_FAILED = 1538;
-exports.ER_EVENT_DOES_NOT_EXIST = 1539;
-exports.ER_EVENT_CANT_ALTER = 1540;
-exports.ER_EVENT_DROP_FAILED = 1541;
-exports.ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG = 1542;
-exports.ER_EVENT_ENDS_BEFORE_STARTS = 1543;
-exports.ER_EVENT_EXEC_TIME_IN_THE_PAST = 1544;
-exports.ER_EVENT_OPEN_TABLE_FAILED = 1545;
-exports.ER_EVENT_NEITHER_M_EXPR_NOR_M_AT = 1546;
-exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED = 1547;
-exports.ER_CANNOT_LOAD_FROM_TABLE = 1548;
-exports.ER_EVENT_CANNOT_DELETE = 1549;
-exports.ER_EVENT_COMPILE_ERROR = 1550;
-exports.ER_EVENT_SAME_NAME = 1551;
-exports.ER_EVENT_DATA_TOO_LONG = 1552;
-exports.ER_DROP_INDEX_FK = 1553;
-exports.ER_WARN_DEPRECATED_SYNTAX_WITH_VER = 1554;
-exports.ER_CANT_WRITE_LOCK_LOG_TABLE = 1555;
-exports.ER_CANT_LOCK_LOG_TABLE = 1556;
-exports.ER_FOREIGN_DUPLICATE_KEY = 1557;
-exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE = 1558;
-exports.ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR = 1559;
-exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1560;
-exports.ER_NDB_CANT_SWITCH_BINLOG_FORMAT = 1561;
-exports.ER_PARTITION_NO_TEMPORARY = 1562;
-exports.ER_PARTITION_CONST_DOMAIN_ERROR = 1563;
-exports.ER_PARTITION_FUNCTION_IS_NOT_ALLOWED = 1564;
-exports.ER_DDL_LOG_ERROR = 1565;
-exports.ER_NULL_IN_VALUES_LESS_THAN = 1566;
-exports.ER_WRONG_PARTITION_NAME = 1567;
-exports.ER_CANT_CHANGE_TX_CHARACTERISTICS = 1568;
-exports.ER_DUP_ENTRY_AUTOINCREMENT_CASE = 1569;
-exports.ER_EVENT_MODIFY_QUEUE_ERROR = 1570;
-exports.ER_EVENT_SET_VAR_ERROR = 1571;
-exports.ER_PARTITION_MERGE_ERROR = 1572;
-exports.ER_CANT_ACTIVATE_LOG = 1573;
-exports.ER_RBR_NOT_AVAILABLE = 1574;
-exports.ER_BASE64_DECODE_ERROR = 1575;
-exports.ER_EVENT_RECURSION_FORBIDDEN = 1576;
-exports.ER_EVENTS_DB_ERROR = 1577;
-exports.ER_ONLY_INTEGERS_ALLOWED = 1578;
-exports.ER_UNSUPORTED_LOG_ENGINE = 1579;
-exports.ER_BAD_LOG_STATEMENT = 1580;
-exports.ER_CANT_RENAME_LOG_TABLE = 1581;
-exports.ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT = 1582;
-exports.ER_WRONG_PARAMETERS_TO_NATIVE_FCT = 1583;
-exports.ER_WRONG_PARAMETERS_TO_STORED_FCT = 1584;
-exports.ER_NATIVE_FCT_NAME_COLLISION = 1585;
-exports.ER_DUP_ENTRY_WITH_KEY_NAME = 1586;
-exports.ER_BINLOG_PURGE_EMFILE = 1587;
-exports.ER_EVENT_CANNOT_CREATE_IN_THE_PAST = 1588;
-exports.ER_EVENT_CANNOT_ALTER_IN_THE_PAST = 1589;
-exports.ER_SLAVE_INCIDENT = 1590;
-exports.ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT = 1591;
-exports.ER_BINLOG_UNSAFE_STATEMENT = 1592;
-exports.ER_BINLOG_FATAL_ERROR = 1593;
-exports.ER_SLAVE_RELAY_LOG_READ_FAILURE = 1594;
-exports.ER_SLAVE_RELAY_LOG_WRITE_FAILURE = 1595;
-exports.ER_SLAVE_CREATE_EVENT_FAILURE = 1596;
-exports.ER_SLAVE_MASTER_COM_FAILURE = 1597;
-exports.ER_BINLOG_LOGGING_IMPOSSIBLE = 1598;
-exports.ER_VIEW_NO_CREATION_CTX = 1599;
-exports.ER_VIEW_INVALID_CREATION_CTX = 1600;
-exports.ER_SR_INVALID_CREATION_CTX = 1601;
-exports.ER_TRG_CORRUPTED_FILE = 1602;
-exports.ER_TRG_NO_CREATION_CTX = 1603;
-exports.ER_TRG_INVALID_CREATION_CTX = 1604;
-exports.ER_EVENT_INVALID_CREATION_CTX = 1605;
-exports.ER_TRG_CANT_OPEN_TABLE = 1606;
-exports.ER_CANT_CREATE_SROUTINE = 1607;
-exports.ER_NEVER_USED = 1608;
-exports.ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT = 1609;
-exports.ER_REPLICA_CORRUPT_EVENT = 1610;
-exports.ER_LOAD_DATA_INVALID_COLUMN = 1611;
-exports.ER_LOG_PURGE_NO_FILE = 1612;
-exports.ER_XA_RBTIMEOUT = 1613;
-exports.ER_XA_RBDEADLOCK = 1614;
-exports.ER_NEED_REPREPARE = 1615;
-exports.ER_DELAYED_NOT_SUPPORTED = 1616;
-exports.WARN_NO_CONNECTION_METADATA = 1617;
-exports.WARN_OPTION_IGNORED = 1618;
-exports.ER_PLUGIN_DELETE_BUILTIN = 1619;
-exports.WARN_PLUGIN_BUSY = 1620;
-exports.ER_VARIABLE_IS_READONLY = 1621;
-exports.ER_WARN_ENGINE_TRANSACTION_ROLLBACK = 1622;
-exports.ER_SLAVE_HEARTBEAT_FAILURE = 1623;
-exports.ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE = 1624;
-exports.ER_NDB_REPLICATION_SCHEMA_ERROR = 1625;
-exports.ER_CONFLICT_FN_PARSE_ERROR = 1626;
-exports.ER_EXCEPTIONS_WRITE_ERROR = 1627;
-exports.ER_TOO_LONG_TABLE_COMMENT = 1628;
-exports.ER_TOO_LONG_FIELD_COMMENT = 1629;
-exports.ER_FUNC_INEXISTENT_NAME_COLLISION = 1630;
-exports.ER_DATABASE_NAME = 1631;
-exports.ER_TABLE_NAME = 1632;
-exports.ER_PARTITION_NAME = 1633;
-exports.ER_SUBPARTITION_NAME = 1634;
-exports.ER_TEMPORARY_NAME = 1635;
-exports.ER_RENAMED_NAME = 1636;
-exports.ER_TOO_MANY_CONCURRENT_TRXS = 1637;
-exports.WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED = 1638;
-exports.ER_DEBUG_SYNC_TIMEOUT = 1639;
-exports.ER_DEBUG_SYNC_HIT_LIMIT = 1640;
-exports.ER_DUP_SIGNAL_SET = 1641;
-exports.ER_SIGNAL_WARN = 1642;
-exports.ER_SIGNAL_NOT_FOUND = 1643;
-exports.ER_SIGNAL_EXCEPTION = 1644;
-exports.ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER = 1645;
-exports.ER_SIGNAL_BAD_CONDITION_TYPE = 1646;
-exports.WARN_COND_ITEM_TRUNCATED = 1647;
-exports.ER_COND_ITEM_TOO_LONG = 1648;
-exports.ER_UNKNOWN_LOCALE = 1649;
-exports.ER_REPLICA_IGNORE_SERVER_IDS = 1650;
-exports.ER_QUERY_CACHE_DISABLED = 1651;
-exports.ER_SAME_NAME_PARTITION_FIELD = 1652;
-exports.ER_PARTITION_COLUMN_LIST_ERROR = 1653;
-exports.ER_WRONG_TYPE_COLUMN_VALUE_ERROR = 1654;
-exports.ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR = 1655;
-exports.ER_MAXVALUE_IN_VALUES_IN = 1656;
-exports.ER_TOO_MANY_VALUES_ERROR = 1657;
-exports.ER_ROW_SINGLE_PARTITION_FIELD_ERROR = 1658;
-exports.ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD = 1659;
-exports.ER_PARTITION_FIELDS_TOO_LONG = 1660;
-exports.ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE = 1661;
-exports.ER_BINLOG_ROW_MODE_AND_STMT_ENGINE = 1662;
-exports.ER_BINLOG_UNSAFE_AND_STMT_ENGINE = 1663;
-exports.ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE = 1664;
-exports.ER_BINLOG_STMT_MODE_AND_ROW_ENGINE = 1665;
-exports.ER_BINLOG_ROW_INJECTION_AND_STMT_MODE = 1666;
-exports.ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1667;
-exports.ER_BINLOG_UNSAFE_LIMIT = 1668;
-exports.ER_UNUSED4 = 1669;
-exports.ER_BINLOG_UNSAFE_SYSTEM_TABLE = 1670;
-exports.ER_BINLOG_UNSAFE_AUTOINC_COLUMNS = 1671;
-exports.ER_BINLOG_UNSAFE_UDF = 1672;
-exports.ER_BINLOG_UNSAFE_SYSTEM_VARIABLE = 1673;
-exports.ER_BINLOG_UNSAFE_SYSTEM_FUNCTION = 1674;
-exports.ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS = 1675;
-exports.ER_MESSAGE_AND_STATEMENT = 1676;
-exports.ER_SLAVE_CONVERSION_FAILED = 1677;
-exports.ER_REPLICA_CANT_CREATE_CONVERSION = 1678;
-exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT = 1679;
-exports.ER_PATH_LENGTH = 1680;
-exports.ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT = 1681;
-exports.ER_WRONG_NATIVE_TABLE_STRUCTURE = 1682;
-exports.ER_WRONG_PERFSCHEMA_USAGE = 1683;
-exports.ER_WARN_I_S_SKIPPED_TABLE = 1684;
-exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1685;
-exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT = 1686;
-exports.ER_SPATIAL_MUST_HAVE_GEOM_COL = 1687;
-exports.ER_TOO_LONG_INDEX_COMMENT = 1688;
-exports.ER_LOCK_ABORTED = 1689;
-exports.ER_DATA_OUT_OF_RANGE = 1690;
-exports.ER_WRONG_SPVAR_TYPE_IN_LIMIT = 1691;
-exports.ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE = 1692;
-exports.ER_BINLOG_UNSAFE_MIXED_STATEMENT = 1693;
-exports.ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1694;
-exports.ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN = 1695;
-exports.ER_FAILED_READ_FROM_PAR_FILE = 1696;
-exports.ER_VALUES_IS_NOT_INT_TYPE_ERROR = 1697;
-exports.ER_ACCESS_DENIED_NO_PASSWORD_ERROR = 1698;
-exports.ER_SET_PASSWORD_AUTH_PLUGIN = 1699;
-exports.ER_GRANT_PLUGIN_USER_EXISTS = 1700;
-exports.ER_TRUNCATE_ILLEGAL_FK = 1701;
-exports.ER_PLUGIN_IS_PERMANENT = 1702;
-exports.ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN = 1703;
-exports.ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX = 1704;
-exports.ER_STMT_CACHE_FULL = 1705;
-exports.ER_MULTI_UPDATE_KEY_CONFLICT = 1706;
-exports.ER_TABLE_NEEDS_REBUILD = 1707;
-exports.WARN_OPTION_BELOW_LIMIT = 1708;
-exports.ER_INDEX_COLUMN_TOO_LONG = 1709;
-exports.ER_ERROR_IN_TRIGGER_BODY = 1710;
-exports.ER_ERROR_IN_UNKNOWN_TRIGGER_BODY = 1711;
-exports.ER_INDEX_CORRUPT = 1712;
-exports.ER_UNDO_RECORD_TOO_BIG = 1713;
-exports.ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT = 1714;
-exports.ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE = 1715;
-exports.ER_BINLOG_UNSAFE_REPLACE_SELECT = 1716;
-exports.ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT = 1717;
-exports.ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT = 1718;
-exports.ER_BINLOG_UNSAFE_UPDATE_IGNORE = 1719;
-exports.ER_PLUGIN_NO_UNINSTALL = 1720;
-exports.ER_PLUGIN_NO_INSTALL = 1721;
-exports.ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT = 1722;
-exports.ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC = 1723;
-exports.ER_BINLOG_UNSAFE_INSERT_TWO_KEYS = 1724;
-exports.ER_TABLE_IN_FK_CHECK = 1725;
-exports.ER_UNSUPPORTED_ENGINE = 1726;
-exports.ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST = 1727;
-exports.ER_CANNOT_LOAD_FROM_TABLE_V2 = 1728;
-exports.ER_SOURCE_DELAY_VALUE_OUT_OF_RANGE = 1729;
-exports.ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT = 1730;
-exports.ER_PARTITION_EXCHANGE_DIFFERENT_OPTION = 1731;
-exports.ER_PARTITION_EXCHANGE_PART_TABLE = 1732;
-exports.ER_PARTITION_EXCHANGE_TEMP_TABLE = 1733;
-exports.ER_PARTITION_INSTEAD_OF_SUBPARTITION = 1734;
-exports.ER_UNKNOWN_PARTITION = 1735;
-exports.ER_TABLES_DIFFERENT_METADATA = 1736;
-exports.ER_ROW_DOES_NOT_MATCH_PARTITION = 1737;
-exports.ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX = 1738;
-exports.ER_WARN_INDEX_NOT_APPLICABLE = 1739;
-exports.ER_PARTITION_EXCHANGE_FOREIGN_KEY = 1740;
-exports.ER_NO_SUCH_KEY_VALUE = 1741;
-exports.ER_RPL_INFO_DATA_TOO_LONG = 1742;
-exports.ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE = 1743;
-exports.ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE = 1744;
-exports.ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX = 1745;
-exports.ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT = 1746;
-exports.ER_PARTITION_CLAUSE_ON_NONPARTITIONED = 1747;
-exports.ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET = 1748;
-exports.ER_NO_SUCH_PARTITION = 1749;
-exports.ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE = 1750;
-exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE = 1751;
-exports.ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE = 1752;
-exports.ER_MTA_FEATURE_IS_NOT_SUPPORTED = 1753;
-exports.ER_MTA_UPDATED_DBS_GREATER_MAX = 1754;
-exports.ER_MTA_CANT_PARALLEL = 1755;
-exports.ER_MTA_INCONSISTENT_DATA = 1756;
-exports.ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING = 1757;
-exports.ER_DA_INVALID_CONDITION_NUMBER = 1758;
-exports.ER_INSECURE_PLAIN_TEXT = 1759;
-exports.ER_INSECURE_CHANGE_SOURCE = 1760;
-exports.ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO = 1761;
-exports.ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO = 1762;
-exports.ER_SQLTHREAD_WITH_SECURE_REPLICA = 1763;
-exports.ER_TABLE_HAS_NO_FT = 1764;
-exports.ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER = 1765;
-exports.ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION = 1766;
-exports.ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST = 1767;
-exports.ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION = 1768;
-exports.ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION = 1769;
-exports.ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL = 1770;
-exports.ER_SKIPPING_LOGGED_TRANSACTION = 1771;
-exports.ER_MALFORMED_GTID_SET_SPECIFICATION = 1772;
-exports.ER_MALFORMED_GTID_SET_ENCODING = 1773;
-exports.ER_MALFORMED_GTID_SPECIFICATION = 1774;
-exports.ER_GNO_EXHAUSTED = 1775;
-exports.ER_BAD_REPLICA_AUTO_POSITION = 1776;
-exports.ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF = 1777;
-exports.ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET = 1778;
-exports.ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON = 1779;
-exports.ER_GTID_MODE_REQUIRES_BINLOG = 1780;
-exports.ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF = 1781;
-exports.ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON = 1782;
-exports.ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF = 1783;
-exports.ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF = 1784;
-exports.ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE = 1785;
-exports.ER_GTID_UNSAFE_CREATE_SELECT = 1786;
-exports.ER_GTID_UNSAFE_CREATE_DROP_TEMP_TABLE_IN_TRANSACTION = 1787;
-exports.ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME = 1788;
-exports.ER_SOURCE_HAS_PURGED_REQUIRED_GTIDS = 1789;
-exports.ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID = 1790;
-exports.ER_UNKNOWN_EXPLAIN_FORMAT = 1791;
-exports.ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION = 1792;
-exports.ER_TOO_LONG_TABLE_PARTITION_COMMENT = 1793;
-exports.ER_REPLICA_CONFIGURATION = 1794;
-exports.ER_INNODB_FT_LIMIT = 1795;
-exports.ER_INNODB_NO_FT_TEMP_TABLE = 1796;
-exports.ER_INNODB_FT_WRONG_DOCID_COLUMN = 1797;
-exports.ER_INNODB_FT_WRONG_DOCID_INDEX = 1798;
-exports.ER_INNODB_ONLINE_LOG_TOO_BIG = 1799;
-exports.ER_UNKNOWN_ALTER_ALGORITHM = 1800;
-exports.ER_UNKNOWN_ALTER_LOCK = 1801;
-exports.ER_MTA_CHANGE_SOURCE_CANT_RUN_WITH_GAPS = 1802;
-exports.ER_MTA_RECOVERY_FAILURE = 1803;
-exports.ER_MTA_RESET_WORKERS = 1804;
-exports.ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2 = 1805;
-exports.ER_REPLICA_SILENT_RETRY_TRANSACTION = 1806;
-exports.ER_DISCARD_FK_CHECKS_RUNNING = 1807;
-exports.ER_TABLE_SCHEMA_MISMATCH = 1808;
-exports.ER_TABLE_IN_SYSTEM_TABLESPACE = 1809;
-exports.ER_IO_READ_ERROR = 1810;
-exports.ER_IO_WRITE_ERROR = 1811;
-exports.ER_TABLESPACE_MISSING = 1812;
-exports.ER_TABLESPACE_EXISTS = 1813;
-exports.ER_TABLESPACE_DISCARDED = 1814;
-exports.ER_INTERNAL_ERROR = 1815;
-exports.ER_INNODB_IMPORT_ERROR = 1816;
-exports.ER_INNODB_INDEX_CORRUPT = 1817;
-exports.ER_INVALID_YEAR_COLUMN_LENGTH = 1818;
-exports.ER_NOT_VALID_PASSWORD = 1819;
-exports.ER_MUST_CHANGE_PASSWORD = 1820;
-exports.ER_FK_NO_INDEX_CHILD = 1821;
-exports.ER_FK_NO_INDEX_PARENT = 1822;
-exports.ER_FK_FAIL_ADD_SYSTEM = 1823;
-exports.ER_FK_CANNOT_OPEN_PARENT = 1824;
-exports.ER_FK_INCORRECT_OPTION = 1825;
-exports.ER_FK_DUP_NAME = 1826;
-exports.ER_PASSWORD_FORMAT = 1827;
-exports.ER_FK_COLUMN_CANNOT_DROP = 1828;
-exports.ER_FK_COLUMN_CANNOT_DROP_CHILD = 1829;
-exports.ER_FK_COLUMN_NOT_NULL = 1830;
-exports.ER_DUP_INDEX = 1831;
-exports.ER_FK_COLUMN_CANNOT_CHANGE = 1832;
-exports.ER_FK_COLUMN_CANNOT_CHANGE_CHILD = 1833;
-exports.ER_UNUSED5 = 1834;
-exports.ER_MALFORMED_PACKET = 1835;
-exports.ER_READ_ONLY_MODE = 1836;
-exports.ER_GTID_NEXT_TYPE_UNDEFINED_GTID = 1837;
-exports.ER_VARIABLE_NOT_SETTABLE_IN_SP = 1838;
-exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF = 1839;
-exports.ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY = 1840;
-exports.ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY = 1841;
-exports.ER_GTID_PURGED_WAS_CHANGED = 1842;
-exports.ER_GTID_EXECUTED_WAS_CHANGED = 1843;
-exports.ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES = 1844;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED = 1845;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON = 1846;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY = 1847;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION = 1848;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME = 1849;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE = 1850;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK = 1851;
-exports.ER_UNUSED6 = 1852;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK = 1853;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC = 1854;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS = 1855;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS = 1856;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS = 1857;
-exports.ER_SQL_REPLICA_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE = 1858;
-exports.ER_DUP_UNKNOWN_IN_INDEX = 1859;
-exports.ER_IDENT_CAUSES_TOO_LONG_PATH = 1860;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL = 1861;
-exports.ER_MUST_CHANGE_PASSWORD_LOGIN = 1862;
-exports.ER_ROW_IN_WRONG_PARTITION = 1863;
-exports.ER_MTA_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX = 1864;
-exports.ER_INNODB_NO_FT_USES_PARSER = 1865;
-exports.ER_BINLOG_LOGICAL_CORRUPTION = 1866;
-exports.ER_WARN_PURGE_LOG_IN_USE = 1867;
-exports.ER_WARN_PURGE_LOG_IS_ACTIVE = 1868;
-exports.ER_AUTO_INCREMENT_CONFLICT = 1869;
-exports.WARN_ON_BLOCKHOLE_IN_RBR = 1870;
-exports.ER_REPLICA_CM_INIT_REPOSITORY = 1871;
-exports.ER_REPLICA_AM_INIT_REPOSITORY = 1872;
-exports.ER_ACCESS_DENIED_CHANGE_USER_ERROR = 1873;
-exports.ER_INNODB_READ_ONLY = 1874;
-exports.ER_STOP_REPLICA_SQL_THREAD_TIMEOUT = 1875;
-exports.ER_STOP_REPLICA_IO_THREAD_TIMEOUT = 1876;
-exports.ER_TABLE_CORRUPT = 1877;
-exports.ER_TEMP_FILE_WRITE_FAILURE = 1878;
-exports.ER_INNODB_FT_AUX_NOT_HEX_ID = 1879;
-exports.ER_OLD_TEMPORALS_UPGRADED = 1880;
-exports.ER_INNODB_FORCED_RECOVERY = 1881;
-exports.ER_AES_INVALID_IV = 1882;
-exports.ER_PLUGIN_CANNOT_BE_UNINSTALLED = 1883;
-exports.ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_ASSIGNED_GTID = 1884;
-exports.ER_REPLICA_HAS_MORE_GTIDS_THAN_SOURCE = 1885;
-exports.ER_MISSING_KEY = 1886;
-exports.WARN_NAMED_PIPE_ACCESS_EVERYONE = 1887;
-exports.ER_FILE_CORRUPT = 3000;
-exports.ER_ERROR_ON_SOURCE = 3001;
-exports.ER_INCONSISTENT_ERROR = 3002;
-exports.ER_STORAGE_ENGINE_NOT_LOADED = 3003;
-exports.ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER = 3004;
-exports.ER_WARN_LEGACY_SYNTAX_CONVERTED = 3005;
-exports.ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN = 3006;
-exports.ER_CANNOT_DISCARD_TEMPORARY_TABLE = 3007;
-exports.ER_FK_DEPTH_EXCEEDED = 3008;
-exports.ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2 = 3009;
-exports.ER_WARN_TRIGGER_DOESNT_HAVE_CREATED = 3010;
-exports.ER_REFERENCED_TRG_DOES_NOT_EXIST = 3011;
-exports.ER_EXPLAIN_NOT_SUPPORTED = 3012;
-exports.ER_INVALID_FIELD_SIZE = 3013;
-exports.ER_MISSING_HA_CREATE_OPTION = 3014;
-exports.ER_ENGINE_OUT_OF_MEMORY = 3015;
-exports.ER_PASSWORD_EXPIRE_ANONYMOUS_USER = 3016;
-exports.ER_REPLICA_SQL_THREAD_MUST_STOP = 3017;
-exports.ER_NO_FT_MATERIALIZED_SUBQUERY = 3018;
-exports.ER_INNODB_UNDO_LOG_FULL = 3019;
-exports.ER_INVALID_ARGUMENT_FOR_LOGARITHM = 3020;
-exports.ER_REPLICA_CHANNEL_IO_THREAD_MUST_STOP = 3021;
-exports.ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO = 3022;
-exports.ER_WARN_ONLY_SOURCE_LOG_FILE_NO_POS = 3023;
-exports.ER_QUERY_TIMEOUT = 3024;
-exports.ER_NON_RO_SELECT_DISABLE_TIMER = 3025;
-exports.ER_DUP_LIST_ENTRY = 3026;
-exports.ER_SQL_MODE_NO_EFFECT = 3027;
-exports.ER_AGGREGATE_ORDER_FOR_UNION = 3028;
-exports.ER_AGGREGATE_ORDER_NON_AGG_QUERY = 3029;
-exports.ER_REPLICA_WORKER_STOPPED_PREVIOUS_THD_ERROR = 3030;
-exports.ER_DONT_SUPPORT_REPLICA_PRESERVE_COMMIT_ORDER = 3031;
-exports.ER_SERVER_OFFLINE_MODE = 3032;
-exports.ER_GIS_DIFFERENT_SRIDS = 3033;
-exports.ER_GIS_UNSUPPORTED_ARGUMENT = 3034;
-exports.ER_GIS_UNKNOWN_ERROR = 3035;
-exports.ER_GIS_UNKNOWN_EXCEPTION = 3036;
-exports.ER_GIS_INVALID_DATA = 3037;
-exports.ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION = 3038;
-exports.ER_BOOST_GEOMETRY_CENTROID_EXCEPTION = 3039;
-exports.ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION = 3040;
-exports.ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION = 3041;
-exports.ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION = 3042;
-exports.ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION = 3043;
-exports.ER_STD_BAD_ALLOC_ERROR = 3044;
-exports.ER_STD_DOMAIN_ERROR = 3045;
-exports.ER_STD_LENGTH_ERROR = 3046;
-exports.ER_STD_INVALID_ARGUMENT = 3047;
-exports.ER_STD_OUT_OF_RANGE_ERROR = 3048;
-exports.ER_STD_OVERFLOW_ERROR = 3049;
-exports.ER_STD_RANGE_ERROR = 3050;
-exports.ER_STD_UNDERFLOW_ERROR = 3051;
-exports.ER_STD_LOGIC_ERROR = 3052;
-exports.ER_STD_RUNTIME_ERROR = 3053;
-exports.ER_STD_UNKNOWN_EXCEPTION = 3054;
-exports.ER_GIS_DATA_WRONG_ENDIANESS = 3055;
-exports.ER_CHANGE_SOURCE_PASSWORD_LENGTH = 3056;
-exports.ER_USER_LOCK_WRONG_NAME = 3057;
-exports.ER_USER_LOCK_DEADLOCK = 3058;
-exports.ER_REPLACE_INACCESSIBLE_ROWS = 3059;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS = 3060;
-exports.ER_ILLEGAL_USER_VAR = 3061;
-exports.ER_GTID_MODE_OFF = 3062;
-exports.ER_UNSUPPORTED_BY_REPLICATION_THREAD = 3063;
-exports.ER_INCORRECT_TYPE = 3064;
-exports.ER_FIELD_IN_ORDER_NOT_SELECT = 3065;
-exports.ER_AGGREGATE_IN_ORDER_NOT_SELECT = 3066;
-exports.ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN = 3067;
-exports.ER_NET_OK_PACKET_TOO_LARGE = 3068;
-exports.ER_INVALID_JSON_DATA = 3069;
-exports.ER_INVALID_GEOJSON_MISSING_MEMBER = 3070;
-exports.ER_INVALID_GEOJSON_WRONG_TYPE = 3071;
-exports.ER_INVALID_GEOJSON_UNSPECIFIED = 3072;
-exports.ER_DIMENSION_UNSUPPORTED = 3073;
-exports.ER_REPLICA_CHANNEL_DOES_NOT_EXIST = 3074;
-exports.ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT = 3075;
-exports.ER_REPLICA_CHANNEL_NAME_INVALID_OR_TOO_LONG = 3076;
-exports.ER_REPLICA_NEW_CHANNEL_WRONG_REPOSITORY = 3077;
-exports.ER_SLAVE_CHANNEL_DELETE = 3078;
-exports.ER_REPLICA_MULTIPLE_CHANNELS_CMD = 3079;
-exports.ER_REPLICA_MAX_CHANNELS_EXCEEDED = 3080;
-exports.ER_REPLICA_CHANNEL_MUST_STOP = 3081;
-exports.ER_REPLICA_CHANNEL_NOT_RUNNING = 3082;
-exports.ER_REPLICA_CHANNEL_WAS_RUNNING = 3083;
-exports.ER_REPLICA_CHANNEL_WAS_NOT_RUNNING = 3084;
-exports.ER_REPLICA_CHANNEL_SQL_THREAD_MUST_STOP = 3085;
-exports.ER_REPLICA_CHANNEL_SQL_SKIP_COUNTER = 3086;
-exports.ER_WRONG_FIELD_WITH_GROUP_V2 = 3087;
-exports.ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2 = 3088;
-exports.ER_WARN_DEPRECATED_SYSVAR_UPDATE = 3089;
-exports.ER_WARN_DEPRECATED_SQLMODE = 3090;
-exports.ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID = 3091;
-exports.ER_GROUP_REPLICATION_CONFIGURATION = 3092;
-exports.ER_GROUP_REPLICATION_RUNNING = 3093;
-exports.ER_GROUP_REPLICATION_APPLIER_INIT_ERROR = 3094;
-exports.ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT = 3095;
-exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR = 3096;
-exports.ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR = 3097;
-exports.ER_BEFORE_DML_VALIDATION_ERROR = 3098;
-exports.ER_PREVENTS_VARIABLE_WITHOUT_RBR = 3099;
-exports.ER_RUN_HOOK_ERROR = 3100;
-exports.ER_TRANSACTION_ROLLBACK_DURING_COMMIT = 3101;
-exports.ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED = 3102;
-exports.ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN = 3103;
-exports.ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN = 3104;
-exports.ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN = 3105;
-exports.ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN = 3106;
-exports.ER_GENERATED_COLUMN_NON_PRIOR = 3107;
-exports.ER_DEPENDENT_BY_GENERATED_COLUMN = 3108;
-exports.ER_GENERATED_COLUMN_REF_AUTO_INC = 3109;
-exports.ER_FEATURE_NOT_AVAILABLE = 3110;
-exports.ER_CANT_SET_GTID_MODE = 3111;
-exports.ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF = 3112;
-exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION = 3113;
-exports.ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON = 3114;
-exports.ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF = 3115;
-exports.ER_CANT_ENFORCE_GTID_CONSISTENCY_WITH_ONGOING_GTID_VIOLATING_TX = 3116;
-exports.ER_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TX = 3117;
-exports.ER_ACCOUNT_HAS_BEEN_LOCKED = 3118;
-exports.ER_WRONG_TABLESPACE_NAME = 3119;
-exports.ER_TABLESPACE_IS_NOT_EMPTY = 3120;
-exports.ER_WRONG_FILE_NAME = 3121;
-exports.ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION = 3122;
-exports.ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR = 3123;
-exports.ER_WARN_BAD_MAX_EXECUTION_TIME = 3124;
-exports.ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME = 3125;
-exports.ER_WARN_CONFLICTING_HINT = 3126;
-exports.ER_WARN_UNKNOWN_QB_NAME = 3127;
-exports.ER_UNRESOLVED_HINT_NAME = 3128;
-exports.ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE = 3129;
-exports.ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED = 3130;
-exports.ER_LOCKING_SERVICE_WRONG_NAME = 3131;
-exports.ER_LOCKING_SERVICE_DEADLOCK = 3132;
-exports.ER_LOCKING_SERVICE_TIMEOUT = 3133;
-exports.ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED = 3134;
-exports.ER_SQL_MODE_MERGED = 3135;
-exports.ER_VTOKEN_PLUGIN_TOKEN_MISMATCH = 3136;
-exports.ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND = 3137;
-exports.ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID = 3138;
-exports.ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED = 3139;
-exports.ER_INVALID_JSON_TEXT = 3140;
-exports.ER_INVALID_JSON_TEXT_IN_PARAM = 3141;
-exports.ER_INVALID_JSON_BINARY_DATA = 3142;
-exports.ER_INVALID_JSON_PATH = 3143;
-exports.ER_INVALID_JSON_CHARSET = 3144;
-exports.ER_INVALID_JSON_CHARSET_IN_FUNCTION = 3145;
-exports.ER_INVALID_TYPE_FOR_JSON = 3146;
-exports.ER_INVALID_CAST_TO_JSON = 3147;
-exports.ER_INVALID_JSON_PATH_CHARSET = 3148;
-exports.ER_INVALID_JSON_PATH_WILDCARD = 3149;
-exports.ER_JSON_VALUE_TOO_BIG = 3150;
-exports.ER_JSON_KEY_TOO_BIG = 3151;
-exports.ER_JSON_USED_AS_KEY = 3152;
-exports.ER_JSON_VACUOUS_PATH = 3153;
-exports.ER_JSON_BAD_ONE_OR_ALL_ARG = 3154;
-exports.ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE = 3155;
-exports.ER_INVALID_JSON_VALUE_FOR_CAST = 3156;
-exports.ER_JSON_DOCUMENT_TOO_DEEP = 3157;
-exports.ER_JSON_DOCUMENT_NULL_KEY = 3158;
-exports.ER_SECURE_TRANSPORT_REQUIRED = 3159;
-exports.ER_NO_SECURE_TRANSPORTS_CONFIGURED = 3160;
-exports.ER_DISABLED_STORAGE_ENGINE = 3161;
-exports.ER_USER_DOES_NOT_EXIST = 3162;
-exports.ER_USER_ALREADY_EXISTS = 3163;
-exports.ER_AUDIT_API_ABORT = 3164;
-exports.ER_INVALID_JSON_PATH_ARRAY_CELL = 3165;
-exports.ER_BUFPOOL_RESIZE_INPROGRESS = 3166;
-exports.ER_FEATURE_DISABLED_SEE_DOC = 3167;
-exports.ER_SERVER_ISNT_AVAILABLE = 3168;
-exports.ER_SESSION_WAS_KILLED = 3169;
-exports.ER_CAPACITY_EXCEEDED = 3170;
-exports.ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER = 3171;
-exports.ER_TABLE_NEEDS_UPG_PART = 3172;
-exports.ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID = 3173;
-exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL = 3174;
-exports.ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT = 3175;
-exports.ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE = 3176;
-exports.ER_LOCK_REFUSED_BY_ENGINE = 3177;
-exports.ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN = 3178;
-exports.ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE = 3179;
-exports.ER_MASTER_KEY_ROTATION_ERROR_BY_SE = 3180;
-exports.ER_MASTER_KEY_ROTATION_BINLOG_FAILED = 3181;
-exports.ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE = 3182;
-exports.ER_TABLESPACE_CANNOT_ENCRYPT = 3183;
-exports.ER_INVALID_ENCRYPTION_OPTION = 3184;
-exports.ER_CANNOT_FIND_KEY_IN_KEYRING = 3185;
-exports.ER_CAPACITY_EXCEEDED_IN_PARSER = 3186;
-exports.ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE = 3187;
-exports.ER_KEYRING_UDF_KEYRING_SERVICE_ERROR = 3188;
-exports.ER_USER_COLUMN_OLD_LENGTH = 3189;
-exports.ER_CANT_RESET_SOURCE = 3190;
-exports.ER_GROUP_REPLICATION_MAX_GROUP_SIZE = 3191;
-exports.ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED = 3192;
-exports.ER_TABLE_REFERENCED = 3193;
-exports.ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE = 3194;
-exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO = 3195;
-exports.ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID = 3196;
-exports.ER_XA_RETRY = 3197;
-exports.ER_KEYRING_AWS_UDF_AWS_KMS_ERROR = 3198;
-exports.ER_BINLOG_UNSAFE_XA = 3199;
-exports.ER_UDF_ERROR = 3200;
-exports.ER_KEYRING_MIGRATION_FAILURE = 3201;
-exports.ER_KEYRING_ACCESS_DENIED_ERROR = 3202;
-exports.ER_KEYRING_MIGRATION_STATUS = 3203;
-exports.ER_PLUGIN_FAILED_TO_OPEN_TABLES = 3204;
-exports.ER_PLUGIN_FAILED_TO_OPEN_TABLE = 3205;
-exports.ER_AUDIT_LOG_NO_KEYRING_PLUGIN_INSTALLED = 3206;
-exports.ER_AUDIT_LOG_ENCRYPTION_PASSWORD_HAS_NOT_BEEN_SET = 3207;
-exports.ER_AUDIT_LOG_COULD_NOT_CREATE_AES_KEY = 3208;
-exports.ER_AUDIT_LOG_ENCRYPTION_PASSWORD_CANNOT_BE_FETCHED = 3209;
-exports.ER_AUDIT_LOG_JSON_FILTERING_NOT_ENABLED = 3210;
-exports.ER_AUDIT_LOG_UDF_INSUFFICIENT_PRIVILEGE = 3211;
-exports.ER_AUDIT_LOG_SUPER_PRIVILEGE_REQUIRED = 3212;
-exports.ER_COULD_NOT_REINITIALIZE_AUDIT_LOG_FILTERS = 3213;
-exports.ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_TYPE = 3214;
-exports.ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_COUNT = 3215;
-exports.ER_AUDIT_LOG_HAS_NOT_BEEN_INSTALLED = 3216;
-exports.ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_TYPE = 3217;
-exports.ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_VALUE = 3218;
-exports.ER_AUDIT_LOG_JSON_FILTER_PARSING_ERROR = 3219;
-exports.ER_AUDIT_LOG_JSON_FILTER_NAME_CANNOT_BE_EMPTY = 3220;
-exports.ER_AUDIT_LOG_JSON_USER_NAME_CANNOT_BE_EMPTY = 3221;
-exports.ER_AUDIT_LOG_JSON_FILTER_DOES_NOT_EXISTS = 3222;
-exports.ER_AUDIT_LOG_USER_FIRST_CHARACTER_MUST_BE_ALPHANUMERIC = 3223;
-exports.ER_AUDIT_LOG_USER_NAME_INVALID_CHARACTER = 3224;
-exports.ER_AUDIT_LOG_HOST_NAME_INVALID_CHARACTER = 3225;
-exports.WARN_DEPRECATED_MAXDB_SQL_MODE_FOR_TIMESTAMP = 3226;
-exports.ER_XA_REPLICATION_FILTERS = 3227;
-exports.ER_CANT_OPEN_ERROR_LOG = 3228;
-exports.ER_GROUPING_ON_TIMESTAMP_IN_DST = 3229;
-exports.ER_CANT_START_SERVER_NAMED_PIPE = 3230;
-exports.ER_WRITE_SET_EXCEEDS_LIMIT = 3231;
-exports.ER_DEPRECATED_TLS_VERSION_SESSION_57 = 3232;
-exports.ER_WARN_DEPRECATED_TLS_VERSION_57 = 3233;
-exports.ER_WARN_WRONG_NATIVE_TABLE_STRUCTURE = 3234;
-exports.ER_AES_INVALID_KDF_NAME = 3235;
-exports.ER_AES_INVALID_KDF_ITERATIONS = 3236;
-exports.WARN_AES_KEY_SIZE = 3237;
-exports.ER_AES_INVALID_KDF_OPTION_SIZE = 3238;
-exports.ER_UNSUPPORT_COMPRESSED_TEMPORARY_TABLE = 3500;
-exports.ER_ACL_OPERATION_FAILED = 3501;
-exports.ER_UNSUPPORTED_INDEX_ALGORITHM = 3502;
-exports.ER_NO_SUCH_DB = 3503;
-exports.ER_TOO_BIG_ENUM = 3504;
-exports.ER_TOO_LONG_SET_ENUM_VALUE = 3505;
-exports.ER_INVALID_DD_OBJECT = 3506;
-exports.ER_UPDATING_DD_TABLE = 3507;
-exports.ER_INVALID_DD_OBJECT_ID = 3508;
-exports.ER_INVALID_DD_OBJECT_NAME = 3509;
-exports.ER_TABLESPACE_MISSING_WITH_NAME = 3510;
-exports.ER_TOO_LONG_ROUTINE_COMMENT = 3511;
-exports.ER_SP_LOAD_FAILED = 3512;
-exports.ER_INVALID_BITWISE_OPERANDS_SIZE = 3513;
-exports.ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE = 3514;
-exports.ER_WARN_UNSUPPORTED_HINT = 3515;
-exports.ER_UNEXPECTED_GEOMETRY_TYPE = 3516;
-exports.ER_SRS_PARSE_ERROR = 3517;
-exports.ER_SRS_PROJ_PARAMETER_MISSING = 3518;
-exports.ER_WARN_SRS_NOT_FOUND = 3519;
-exports.ER_SRS_NOT_CARTESIAN = 3520;
-exports.ER_SRS_NOT_CARTESIAN_UNDEFINED = 3521;
-exports.ER_PK_INDEX_CANT_BE_INVISIBLE = 3522;
-exports.ER_UNKNOWN_AUTHID = 3523;
-exports.ER_FAILED_ROLE_GRANT = 3524;
-exports.ER_OPEN_ROLE_TABLES = 3525;
-exports.ER_FAILED_DEFAULT_ROLES = 3526;
-exports.ER_COMPONENTS_NO_SCHEME = 3527;
-exports.ER_COMPONENTS_NO_SCHEME_SERVICE = 3528;
-exports.ER_COMPONENTS_CANT_LOAD = 3529;
-exports.ER_ROLE_NOT_GRANTED = 3530;
-exports.ER_FAILED_REVOKE_ROLE = 3531;
-exports.ER_RENAME_ROLE = 3532;
-exports.ER_COMPONENTS_CANT_ACQUIRE_SERVICE_IMPLEMENTATION = 3533;
-exports.ER_COMPONENTS_CANT_SATISFY_DEPENDENCY = 3534;
-exports.ER_COMPONENTS_LOAD_CANT_REGISTER_SERVICE_IMPLEMENTATION = 3535;
-exports.ER_COMPONENTS_LOAD_CANT_INITIALIZE = 3536;
-exports.ER_COMPONENTS_UNLOAD_NOT_LOADED = 3537;
-exports.ER_COMPONENTS_UNLOAD_CANT_DEINITIALIZE = 3538;
-exports.ER_COMPONENTS_CANT_RELEASE_SERVICE = 3539;
-exports.ER_COMPONENTS_UNLOAD_CANT_UNREGISTER_SERVICE = 3540;
-exports.ER_COMPONENTS_CANT_UNLOAD = 3541;
-exports.ER_WARN_UNLOAD_THE_NOT_PERSISTED = 3542;
-exports.ER_COMPONENT_TABLE_INCORRECT = 3543;
-exports.ER_COMPONENT_MANIPULATE_ROW_FAILED = 3544;
-exports.ER_COMPONENTS_UNLOAD_DUPLICATE_IN_GROUP = 3545;
-exports.ER_CANT_SET_GTID_PURGED_DUE_SETS_CONSTRAINTS = 3546;
-exports.ER_CANNOT_LOCK_USER_MANAGEMENT_CACHES = 3547;
-exports.ER_SRS_NOT_FOUND = 3548;
-exports.ER_VARIABLE_NOT_PERSISTED = 3549;
-exports.ER_IS_QUERY_INVALID_CLAUSE = 3550;
-exports.ER_UNABLE_TO_STORE_STATISTICS = 3551;
-exports.ER_NO_SYSTEM_SCHEMA_ACCESS = 3552;
-exports.ER_NO_SYSTEM_TABLESPACE_ACCESS = 3553;
-exports.ER_NO_SYSTEM_TABLE_ACCESS = 3554;
-exports.ER_NO_SYSTEM_TABLE_ACCESS_FOR_DICTIONARY_TABLE = 3555;
-exports.ER_NO_SYSTEM_TABLE_ACCESS_FOR_SYSTEM_TABLE = 3556;
-exports.ER_NO_SYSTEM_TABLE_ACCESS_FOR_TABLE = 3557;
-exports.ER_INVALID_OPTION_KEY = 3558;
-exports.ER_INVALID_OPTION_VALUE = 3559;
-exports.ER_INVALID_OPTION_KEY_VALUE_PAIR = 3560;
-exports.ER_INVALID_OPTION_START_CHARACTER = 3561;
-exports.ER_INVALID_OPTION_END_CHARACTER = 3562;
-exports.ER_INVALID_OPTION_CHARACTERS = 3563;
-exports.ER_DUPLICATE_OPTION_KEY = 3564;
-exports.ER_WARN_SRS_NOT_FOUND_AXIS_ORDER = 3565;
-exports.ER_NO_ACCESS_TO_NATIVE_FCT = 3566;
-exports.ER_RESET_SOURCE_TO_VALUE_OUT_OF_RANGE = 3567;
-exports.ER_UNRESOLVED_TABLE_LOCK = 3568;
-exports.ER_DUPLICATE_TABLE_LOCK = 3569;
-exports.ER_BINLOG_UNSAFE_SKIP_LOCKED = 3570;
-exports.ER_BINLOG_UNSAFE_NOWAIT = 3571;
-exports.ER_LOCK_NOWAIT = 3572;
-exports.ER_CTE_RECURSIVE_REQUIRES_UNION = 3573;
-exports.ER_CTE_RECURSIVE_REQUIRES_NONRECURSIVE_FIRST = 3574;
-exports.ER_CTE_RECURSIVE_FORBIDS_AGGREGATION = 3575;
-exports.ER_CTE_RECURSIVE_FORBIDDEN_JOIN_ORDER = 3576;
-exports.ER_CTE_RECURSIVE_REQUIRES_SINGLE_REFERENCE = 3577;
-exports.ER_SWITCH_TMP_ENGINE = 3578;
-exports.ER_WINDOW_NO_SUCH_WINDOW = 3579;
-exports.ER_WINDOW_CIRCULARITY_IN_WINDOW_GRAPH = 3580;
-exports.ER_WINDOW_NO_CHILD_PARTITIONING = 3581;
-exports.ER_WINDOW_NO_INHERIT_FRAME = 3582;
-exports.ER_WINDOW_NO_REDEFINE_ORDER_BY = 3583;
-exports.ER_WINDOW_FRAME_START_ILLEGAL = 3584;
-exports.ER_WINDOW_FRAME_END_ILLEGAL = 3585;
-exports.ER_WINDOW_FRAME_ILLEGAL = 3586;
-exports.ER_WINDOW_RANGE_FRAME_ORDER_TYPE = 3587;
-exports.ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE = 3588;
-exports.ER_WINDOW_RANGE_FRAME_NUMERIC_TYPE = 3589;
-exports.ER_WINDOW_RANGE_BOUND_NOT_CONSTANT = 3590;
-exports.ER_WINDOW_DUPLICATE_NAME = 3591;
-exports.ER_WINDOW_ILLEGAL_ORDER_BY = 3592;
-exports.ER_WINDOW_INVALID_WINDOW_FUNC_USE = 3593;
-exports.ER_WINDOW_INVALID_WINDOW_FUNC_ALIAS_USE = 3594;
-exports.ER_WINDOW_NESTED_WINDOW_FUNC_USE_IN_WINDOW_SPEC = 3595;
-exports.ER_WINDOW_ROWS_INTERVAL_USE = 3596;
-exports.ER_WINDOW_NO_GROUP_ORDER = 3597;
-exports.ER_WINDOW_EXPLAIN_JSON = 3598;
-exports.ER_WINDOW_FUNCTION_IGNORES_FRAME = 3599;
-exports.ER_WL9236_NOW = 3600;
-exports.ER_INVALID_NO_OF_ARGS = 3601;
-exports.ER_FIELD_IN_GROUPING_NOT_GROUP_BY = 3602;
-exports.ER_TOO_LONG_TABLESPACE_COMMENT = 3603;
-exports.ER_ENGINE_CANT_DROP_TABLE = 3604;
-exports.ER_ENGINE_CANT_DROP_MISSING_TABLE = 3605;
-exports.ER_TABLESPACE_DUP_FILENAME = 3606;
-exports.ER_DB_DROP_RMDIR2 = 3607;
-exports.ER_IMP_NO_FILES_MATCHED = 3608;
-exports.ER_IMP_SCHEMA_DOES_NOT_EXIST = 3609;
-exports.ER_IMP_TABLE_ALREADY_EXISTS = 3610;
-exports.ER_IMP_INCOMPATIBLE_MYSQLD_VERSION = 3611;
-exports.ER_IMP_INCOMPATIBLE_DD_VERSION = 3612;
-exports.ER_IMP_INCOMPATIBLE_SDI_VERSION = 3613;
-exports.ER_WARN_INVALID_HINT = 3614;
-exports.ER_VAR_DOES_NOT_EXIST = 3615;
-exports.ER_LONGITUDE_OUT_OF_RANGE = 3616;
-exports.ER_LATITUDE_OUT_OF_RANGE = 3617;
-exports.ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS = 3618;
-exports.ER_ILLEGAL_PRIVILEGE_LEVEL = 3619;
-exports.ER_NO_SYSTEM_VIEW_ACCESS = 3620;
-exports.ER_COMPONENT_FILTER_FLABBERGASTED = 3621;
-exports.ER_PART_EXPR_TOO_LONG = 3622;
-exports.ER_UDF_DROP_DYNAMICALLY_REGISTERED = 3623;
-exports.ER_UNABLE_TO_STORE_COLUMN_STATISTICS = 3624;
-exports.ER_UNABLE_TO_UPDATE_COLUMN_STATISTICS = 3625;
-exports.ER_UNABLE_TO_DROP_COLUMN_STATISTICS = 3626;
-exports.ER_UNABLE_TO_BUILD_HISTOGRAM = 3627;
-exports.ER_MANDATORY_ROLE = 3628;
-exports.ER_MISSING_TABLESPACE_FILE = 3629;
-exports.ER_PERSIST_ONLY_ACCESS_DENIED_ERROR = 3630;
-exports.ER_CMD_NEED_SUPER = 3631;
-exports.ER_PATH_IN_DATADIR = 3632;
-exports.ER_CLONE_DDL_IN_PROGRESS = 3633;
-exports.ER_CLONE_TOO_MANY_CONCURRENT_CLONES = 3634;
-exports.ER_APPLIER_LOG_EVENT_VALIDATION_ERROR = 3635;
-exports.ER_CTE_MAX_RECURSION_DEPTH = 3636;
-exports.ER_NOT_HINT_UPDATABLE_VARIABLE = 3637;
-exports.ER_CREDENTIALS_CONTRADICT_TO_HISTORY = 3638;
-exports.ER_WARNING_PASSWORD_HISTORY_CLAUSES_VOID = 3639;
-exports.ER_CLIENT_DOES_NOT_SUPPORT = 3640;
-exports.ER_I_S_SKIPPED_TABLESPACE = 3641;
-exports.ER_TABLESPACE_ENGINE_MISMATCH = 3642;
-exports.ER_WRONG_SRID_FOR_COLUMN = 3643;
-exports.ER_CANNOT_ALTER_SRID_DUE_TO_INDEX = 3644;
-exports.ER_WARN_BINLOG_PARTIAL_UPDATES_DISABLED = 3645;
-exports.ER_WARN_BINLOG_V1_ROW_EVENTS_DISABLED = 3646;
-exports.ER_WARN_BINLOG_PARTIAL_UPDATES_SUGGESTS_PARTIAL_IMAGES = 3647;
-exports.ER_COULD_NOT_APPLY_JSON_DIFF = 3648;
-exports.ER_CORRUPTED_JSON_DIFF = 3649;
-exports.ER_RESOURCE_GROUP_EXISTS = 3650;
-exports.ER_RESOURCE_GROUP_NOT_EXISTS = 3651;
-exports.ER_INVALID_VCPU_ID = 3652;
-exports.ER_INVALID_VCPU_RANGE = 3653;
-exports.ER_INVALID_THREAD_PRIORITY = 3654;
-exports.ER_DISALLOWED_OPERATION = 3655;
-exports.ER_RESOURCE_GROUP_BUSY = 3656;
-exports.ER_RESOURCE_GROUP_DISABLED = 3657;
-exports.ER_FEATURE_UNSUPPORTED = 3658;
-exports.ER_ATTRIBUTE_IGNORED = 3659;
-exports.ER_INVALID_THREAD_ID = 3660;
-exports.ER_RESOURCE_GROUP_BIND_FAILED = 3661;
-exports.ER_INVALID_USE_OF_FORCE_OPTION = 3662;
-exports.ER_GROUP_REPLICATION_COMMAND_FAILURE = 3663;
-exports.ER_SDI_OPERATION_FAILED = 3664;
-exports.ER_MISSING_JSON_TABLE_VALUE = 3665;
-exports.ER_WRONG_JSON_TABLE_VALUE = 3666;
-exports.ER_TF_MUST_HAVE_ALIAS = 3667;
-exports.ER_TF_FORBIDDEN_JOIN_TYPE = 3668;
-exports.ER_JT_VALUE_OUT_OF_RANGE = 3669;
-exports.ER_JT_MAX_NESTED_PATH = 3670;
-exports.ER_PASSWORD_EXPIRATION_NOT_SUPPORTED_BY_AUTH_METHOD = 3671;
-exports.ER_INVALID_GEOJSON_CRS_NOT_TOP_LEVEL = 3672;
-exports.ER_BAD_NULL_ERROR_NOT_IGNORED = 3673;
-exports.WARN_USELESS_SPATIAL_INDEX = 3674;
-exports.ER_DISK_FULL_NOWAIT = 3675;
-exports.ER_PARSE_ERROR_IN_DIGEST_FN = 3676;
-exports.ER_UNDISCLOSED_PARSE_ERROR_IN_DIGEST_FN = 3677;
-exports.ER_SCHEMA_DIR_EXISTS = 3678;
-exports.ER_SCHEMA_DIR_MISSING = 3679;
-exports.ER_SCHEMA_DIR_CREATE_FAILED = 3680;
-exports.ER_SCHEMA_DIR_UNKNOWN = 3681;
-exports.ER_ONLY_IMPLEMENTED_FOR_SRID_0_AND_4326 = 3682;
-exports.ER_BINLOG_EXPIRE_LOG_DAYS_AND_SECS_USED_TOGETHER = 3683;
-exports.ER_REGEXP_BUFFER_OVERFLOW = 3684;
-exports.ER_REGEXP_ILLEGAL_ARGUMENT = 3685;
-exports.ER_REGEXP_INDEX_OUTOFBOUNDS_ERROR = 3686;
-exports.ER_REGEXP_INTERNAL_ERROR = 3687;
-exports.ER_REGEXP_RULE_SYNTAX = 3688;
-exports.ER_REGEXP_BAD_ESCAPE_SEQUENCE = 3689;
-exports.ER_REGEXP_UNIMPLEMENTED = 3690;
-exports.ER_REGEXP_MISMATCHED_PAREN = 3691;
-exports.ER_REGEXP_BAD_INTERVAL = 3692;
-exports.ER_REGEXP_MAX_LT_MIN = 3693;
-exports.ER_REGEXP_INVALID_BACK_REF = 3694;
-exports.ER_REGEXP_LOOK_BEHIND_LIMIT = 3695;
-exports.ER_REGEXP_MISSING_CLOSE_BRACKET = 3696;
-exports.ER_REGEXP_INVALID_RANGE = 3697;
-exports.ER_REGEXP_STACK_OVERFLOW = 3698;
-exports.ER_REGEXP_TIME_OUT = 3699;
-exports.ER_REGEXP_PATTERN_TOO_BIG = 3700;
-exports.ER_CANT_SET_ERROR_LOG_SERVICE = 3701;
-exports.ER_EMPTY_PIPELINE_FOR_ERROR_LOG_SERVICE = 3702;
-exports.ER_COMPONENT_FILTER_DIAGNOSTICS = 3703;
-exports.ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS = 3704;
-exports.ER_NOT_IMPLEMENTED_FOR_PROJECTED_SRS = 3705;
-exports.ER_NONPOSITIVE_RADIUS = 3706;
-exports.ER_RESTART_SERVER_FAILED = 3707;
-exports.ER_SRS_MISSING_MANDATORY_ATTRIBUTE = 3708;
-exports.ER_SRS_MULTIPLE_ATTRIBUTE_DEFINITIONS = 3709;
-exports.ER_SRS_NAME_CANT_BE_EMPTY_OR_WHITESPACE = 3710;
-exports.ER_SRS_ORGANIZATION_CANT_BE_EMPTY_OR_WHITESPACE = 3711;
-exports.ER_SRS_ID_ALREADY_EXISTS = 3712;
-exports.ER_WARN_SRS_ID_ALREADY_EXISTS = 3713;
-exports.ER_CANT_MODIFY_SRID_0 = 3714;
-exports.ER_WARN_RESERVED_SRID_RANGE = 3715;
-exports.ER_CANT_MODIFY_SRS_USED_BY_COLUMN = 3716;
-exports.ER_SRS_INVALID_CHARACTER_IN_ATTRIBUTE = 3717;
-exports.ER_SRS_ATTRIBUTE_STRING_TOO_LONG = 3718;
-exports.ER_DEPRECATED_UTF8_ALIAS = 3719;
-exports.ER_DEPRECATED_NATIONAL = 3720;
-exports.ER_INVALID_DEFAULT_UTF8MB4_COLLATION = 3721;
-exports.ER_UNABLE_TO_COLLECT_LOG_STATUS = 3722;
-exports.ER_RESERVED_TABLESPACE_NAME = 3723;
-exports.ER_UNABLE_TO_SET_OPTION = 3724;
-exports.ER_REPLICA_POSSIBLY_DIVERGED_AFTER_DDL = 3725;
-exports.ER_SRS_NOT_GEOGRAPHIC = 3726;
-exports.ER_POLYGON_TOO_LARGE = 3727;
-exports.ER_SPATIAL_UNIQUE_INDEX = 3728;
-exports.ER_INDEX_TYPE_NOT_SUPPORTED_FOR_SPATIAL_INDEX = 3729;
-exports.ER_FK_CANNOT_DROP_PARENT = 3730;
-exports.ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE = 3731;
-exports.ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE = 3732;
-exports.ER_FK_CANNOT_USE_VIRTUAL_COLUMN = 3733;
-exports.ER_FK_NO_COLUMN_PARENT = 3734;
-exports.ER_CANT_SET_ERROR_SUPPRESSION_LIST = 3735;
-exports.ER_SRS_GEOGCS_INVALID_AXES = 3736;
-exports.ER_SRS_INVALID_SEMI_MAJOR_AXIS = 3737;
-exports.ER_SRS_INVALID_INVERSE_FLATTENING = 3738;
-exports.ER_SRS_INVALID_ANGULAR_UNIT = 3739;
-exports.ER_SRS_INVALID_PRIME_MERIDIAN = 3740;
-exports.ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTED = 3741;
-exports.ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTED = 3742;
-exports.ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84 = 3743;
-exports.ER_TRANSFORM_TARGET_SRS_MISSING_TOWGS84 = 3744;
-exports.ER_TEMP_TABLE_PREVENTS_SWITCH_SESSION_BINLOG_FORMAT = 3745;
-exports.ER_TEMP_TABLE_PREVENTS_SWITCH_GLOBAL_BINLOG_FORMAT = 3746;
-exports.ER_RUNNING_APPLIER_PREVENTS_SWITCH_GLOBAL_BINLOG_FORMAT = 3747;
-exports.ER_CLIENT_GTID_UNSAFE_CREATE_DROP_TEMP_TABLE_IN_TRX_IN_SBR = 3748;
-exports.ER_XA_CANT_CREATE_MDL_BACKUP = 3749;
-exports.ER_TABLE_WITHOUT_PK = 3750;
-exports.ER_WARN_DATA_TRUNCATED_FUNCTIONAL_INDEX = 3751;
-exports.ER_WARN_DATA_OUT_OF_RANGE_FUNCTIONAL_INDEX = 3752;
-exports.ER_FUNCTIONAL_INDEX_ON_JSON_OR_GEOMETRY_FUNCTION = 3753;
-exports.ER_FUNCTIONAL_INDEX_REF_AUTO_INCREMENT = 3754;
-exports.ER_CANNOT_DROP_COLUMN_FUNCTIONAL_INDEX = 3755;
-exports.ER_FUNCTIONAL_INDEX_PRIMARY_KEY = 3756;
-exports.ER_FUNCTIONAL_INDEX_ON_LOB = 3757;
-exports.ER_FUNCTIONAL_INDEX_FUNCTION_IS_NOT_ALLOWED = 3758;
-exports.ER_FULLTEXT_FUNCTIONAL_INDEX = 3759;
-exports.ER_SPATIAL_FUNCTIONAL_INDEX = 3760;
-exports.ER_WRONG_KEY_COLUMN_FUNCTIONAL_INDEX = 3761;
-exports.ER_FUNCTIONAL_INDEX_ON_FIELD = 3762;
-exports.ER_GENERATED_COLUMN_NAMED_FUNCTION_IS_NOT_ALLOWED = 3763;
-exports.ER_GENERATED_COLUMN_ROW_VALUE = 3764;
-exports.ER_GENERATED_COLUMN_VARIABLES = 3765;
-exports.ER_DEPENDENT_BY_DEFAULT_GENERATED_VALUE = 3766;
-exports.ER_DEFAULT_VAL_GENERATED_NON_PRIOR = 3767;
-exports.ER_DEFAULT_VAL_GENERATED_REF_AUTO_INC = 3768;
-exports.ER_DEFAULT_VAL_GENERATED_FUNCTION_IS_NOT_ALLOWED = 3769;
-exports.ER_DEFAULT_VAL_GENERATED_NAMED_FUNCTION_IS_NOT_ALLOWED = 3770;
-exports.ER_DEFAULT_VAL_GENERATED_ROW_VALUE = 3771;
-exports.ER_DEFAULT_VAL_GENERATED_VARIABLES = 3772;
-exports.ER_DEFAULT_AS_VAL_GENERATED = 3773;
-exports.ER_UNSUPPORTED_ACTION_ON_DEFAULT_VAL_GENERATED = 3774;
-exports.ER_GTID_UNSAFE_ALTER_ADD_COL_WITH_DEFAULT_EXPRESSION = 3775;
-exports.ER_FK_CANNOT_CHANGE_ENGINE = 3776;
-exports.ER_WARN_DEPRECATED_USER_SET_EXPR = 3777;
-exports.ER_WARN_DEPRECATED_UTF8MB3_COLLATION = 3778;
-exports.ER_WARN_DEPRECATED_NESTED_COMMENT_SYNTAX = 3779;
-exports.ER_FK_INCOMPATIBLE_COLUMNS = 3780;
-exports.ER_GR_HOLD_WAIT_TIMEOUT = 3781;
-exports.ER_GR_HOLD_KILLED = 3782;
-exports.ER_GR_HOLD_MEMBER_STATUS_ERROR = 3783;
-exports.ER_RPL_ENCRYPTION_FAILED_TO_FETCH_KEY = 3784;
-exports.ER_RPL_ENCRYPTION_KEY_NOT_FOUND = 3785;
-exports.ER_RPL_ENCRYPTION_KEYRING_INVALID_KEY = 3786;
-exports.ER_RPL_ENCRYPTION_HEADER_ERROR = 3787;
-exports.ER_RPL_ENCRYPTION_FAILED_TO_ROTATE_LOGS = 3788;
-exports.ER_RPL_ENCRYPTION_KEY_EXISTS_UNEXPECTED = 3789;
-exports.ER_RPL_ENCRYPTION_FAILED_TO_GENERATE_KEY = 3790;
-exports.ER_RPL_ENCRYPTION_FAILED_TO_STORE_KEY = 3791;
-exports.ER_RPL_ENCRYPTION_FAILED_TO_REMOVE_KEY = 3792;
-exports.ER_RPL_ENCRYPTION_UNABLE_TO_CHANGE_OPTION = 3793;
-exports.ER_RPL_ENCRYPTION_MASTER_KEY_RECOVERY_FAILED = 3794;
-exports.ER_SLOW_LOG_MODE_IGNORED_WHEN_NOT_LOGGING_TO_FILE = 3795;
-exports.ER_GRP_TRX_CONSISTENCY_NOT_ALLOWED = 3796;
-exports.ER_GRP_TRX_CONSISTENCY_BEFORE = 3797;
-exports.ER_GRP_TRX_CONSISTENCY_AFTER_ON_TRX_BEGIN = 3798;
-exports.ER_GRP_TRX_CONSISTENCY_BEGIN_NOT_ALLOWED = 3799;
-exports.ER_FUNCTIONAL_INDEX_ROW_VALUE_IS_NOT_ALLOWED = 3800;
-exports.ER_RPL_ENCRYPTION_FAILED_TO_ENCRYPT = 3801;
-exports.ER_PAGE_TRACKING_NOT_STARTED = 3802;
-exports.ER_PAGE_TRACKING_RANGE_NOT_TRACKED = 3803;
-exports.ER_PAGE_TRACKING_CANNOT_PURGE = 3804;
-exports.ER_RPL_ENCRYPTION_CANNOT_ROTATE_BINLOG_MASTER_KEY = 3805;
-exports.ER_BINLOG_MASTER_KEY_RECOVERY_OUT_OF_COMBINATION = 3806;
-exports.ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_OPERATE_KEY = 3807;
-exports.ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_ROTATE_LOGS = 3808;
-exports.ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_REENCRYPT_LOG = 3809;
-exports.ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_CLEANUP_UNUSED_KEYS = 3810;
-exports.ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_CLEANUP_AUX_KEY = 3811;
-exports.ER_NON_BOOLEAN_EXPR_FOR_CHECK_CONSTRAINT = 3812;
-exports.ER_COLUMN_CHECK_CONSTRAINT_REFERENCES_OTHER_COLUMN = 3813;
-exports.ER_CHECK_CONSTRAINT_NAMED_FUNCTION_IS_NOT_ALLOWED = 3814;
-exports.ER_CHECK_CONSTRAINT_FUNCTION_IS_NOT_ALLOWED = 3815;
-exports.ER_CHECK_CONSTRAINT_VARIABLES = 3816;
-exports.ER_CHECK_CONSTRAINT_ROW_VALUE = 3817;
-exports.ER_CHECK_CONSTRAINT_REFERS_AUTO_INCREMENT_COLUMN = 3818;
-exports.ER_CHECK_CONSTRAINT_VIOLATED = 3819;
-exports.ER_CHECK_CONSTRAINT_REFERS_UNKNOWN_COLUMN = 3820;
-exports.ER_CHECK_CONSTRAINT_NOT_FOUND = 3821;
-exports.ER_CHECK_CONSTRAINT_DUP_NAME = 3822;
-exports.ER_CHECK_CONSTRAINT_CLAUSE_USING_FK_REFER_ACTION_COLUMN = 3823;
-exports.WARN_UNENCRYPTED_TABLE_IN_ENCRYPTED_DB = 3824;
-exports.ER_INVALID_ENCRYPTION_REQUEST = 3825;
-exports.ER_CANNOT_SET_TABLE_ENCRYPTION = 3826;
-exports.ER_CANNOT_SET_DATABASE_ENCRYPTION = 3827;
-exports.ER_CANNOT_SET_TABLESPACE_ENCRYPTION = 3828;
-exports.ER_TABLESPACE_CANNOT_BE_ENCRYPTED = 3829;
-exports.ER_TABLESPACE_CANNOT_BE_DECRYPTED = 3830;
-exports.ER_TABLESPACE_TYPE_UNKNOWN = 3831;
-exports.ER_TARGET_TABLESPACE_UNENCRYPTED = 3832;
-exports.ER_CANNOT_USE_ENCRYPTION_CLAUSE = 3833;
-exports.ER_INVALID_MULTIPLE_CLAUSES = 3834;
-exports.ER_UNSUPPORTED_USE_OF_GRANT_AS = 3835;
-exports.ER_UKNOWN_AUTH_ID_OR_ACCESS_DENIED_FOR_GRANT_AS = 3836;
-exports.ER_DEPENDENT_BY_FUNCTIONAL_INDEX = 3837;
-exports.ER_PLUGIN_NOT_EARLY = 3838;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_START_SUBDIR_PATH = 3839;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_START_TIMEOUT = 3840;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_DIRS_INVALID = 3841;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_LABEL_NOT_FOUND = 3842;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_DIR_EMPTY = 3843;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_NO_SUCH_DIR = 3844;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_DIR_CLASH = 3845;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_DIR_PERMISSIONS = 3846;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_FILE_CREATE = 3847;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_ACTIVE = 3848;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_INACTIVE = 3849;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_FAILED = 3850;
-exports.ER_INNODB_REDO_LOG_ARCHIVE_SESSION = 3851;
-exports.ER_STD_REGEX_ERROR = 3852;
-exports.ER_INVALID_JSON_TYPE = 3853;
-exports.ER_CANNOT_CONVERT_STRING = 3854;
-exports.ER_DEPENDENT_BY_PARTITION_FUNC = 3855;
-exports.ER_WARN_DEPRECATED_FLOAT_AUTO_INCREMENT = 3856;
-exports.ER_RPL_CANT_STOP_REPLICA_WHILE_LOCKED_BACKUP = 3857;
-exports.ER_WARN_DEPRECATED_FLOAT_DIGITS = 3858;
-exports.ER_WARN_DEPRECATED_FLOAT_UNSIGNED = 3859;
-exports.ER_WARN_DEPRECATED_INTEGER_DISPLAY_WIDTH = 3860;
-exports.ER_WARN_DEPRECATED_ZEROFILL = 3861;
-exports.ER_CLONE_DONOR = 3862;
-exports.ER_CLONE_PROTOCOL = 3863;
-exports.ER_CLONE_DONOR_VERSION = 3864;
-exports.ER_CLONE_OS = 3865;
-exports.ER_CLONE_PLATFORM = 3866;
-exports.ER_CLONE_CHARSET = 3867;
-exports.ER_CLONE_CONFIG = 3868;
-exports.ER_CLONE_SYS_CONFIG = 3869;
-exports.ER_CLONE_PLUGIN_MATCH = 3870;
-exports.ER_CLONE_LOOPBACK = 3871;
-exports.ER_CLONE_ENCRYPTION = 3872;
-exports.ER_CLONE_DISK_SPACE = 3873;
-exports.ER_CLONE_IN_PROGRESS = 3874;
-exports.ER_CLONE_DISALLOWED = 3875;
-exports.ER_CANNOT_GRANT_ROLES_TO_ANONYMOUS_USER = 3876;
-exports.ER_SECONDARY_ENGINE_PLUGIN = 3877;
-exports.ER_SECOND_PASSWORD_CANNOT_BE_EMPTY = 3878;
-exports.ER_DB_ACCESS_DENIED = 3879;
-exports.ER_DA_AUTH_ID_WITH_SYSTEM_USER_PRIV_IN_MANDATORY_ROLES = 3880;
-exports.ER_DA_RPL_GTID_TABLE_CANNOT_OPEN = 3881;
-exports.ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT = 3882;
-exports.ER_DA_PLUGIN_INSTALL_ERROR = 3883;
-exports.ER_NO_SESSION_TEMP = 3884;
-exports.ER_DA_UNKNOWN_ERROR_NUMBER = 3885;
-exports.ER_COLUMN_CHANGE_SIZE = 3886;
-exports.ER_REGEXP_INVALID_CAPTURE_GROUP_NAME = 3887;
-exports.ER_DA_SSL_LIBRARY_ERROR = 3888;
-exports.ER_SECONDARY_ENGINE = 3889;
-exports.ER_SECONDARY_ENGINE_DDL = 3890;
-exports.ER_INCORRECT_CURRENT_PASSWORD = 3891;
-exports.ER_MISSING_CURRENT_PASSWORD = 3892;
-exports.ER_CURRENT_PASSWORD_NOT_REQUIRED = 3893;
-exports.ER_PASSWORD_CANNOT_BE_RETAINED_ON_PLUGIN_CHANGE = 3894;
-exports.ER_CURRENT_PASSWORD_CANNOT_BE_RETAINED = 3895;
-exports.ER_PARTIAL_REVOKES_EXIST = 3896;
-exports.ER_CANNOT_GRANT_SYSTEM_PRIV_TO_MANDATORY_ROLE = 3897;
-exports.ER_XA_REPLICATION_FILTERS = 3898;
-exports.ER_UNSUPPORTED_SQL_MODE = 3899;
-exports.ER_REGEXP_INVALID_FLAG = 3900;
-exports.ER_PARTIAL_REVOKE_AND_DB_GRANT_BOTH_EXISTS = 3901;
-exports.ER_UNIT_NOT_FOUND = 3902;
-exports.ER_INVALID_JSON_VALUE_FOR_FUNC_INDEX = 3903;
-exports.ER_JSON_VALUE_OUT_OF_RANGE_FOR_FUNC_INDEX = 3904;
-exports.ER_EXCEEDED_MV_KEYS_NUM = 3905;
-exports.ER_EXCEEDED_MV_KEYS_SPACE = 3906;
-exports.ER_FUNCTIONAL_INDEX_DATA_IS_TOO_LONG = 3907;
-exports.ER_WRONG_MVI_VALUE = 3908;
-exports.ER_WARN_FUNC_INDEX_NOT_APPLICABLE = 3909;
-exports.ER_GRP_RPL_UDF_ERROR = 3910;
-exports.ER_UPDATE_GTID_PURGED_WITH_GR = 3911;
-exports.ER_GROUPING_ON_TIMESTAMP_IN_DST = 3912;
-exports.ER_TABLE_NAME_CAUSES_TOO_LONG_PATH = 3913;
-exports.ER_AUDIT_LOG_INSUFFICIENT_PRIVILEGE = 3914;
-exports.ER_AUDIT_LOG_PASSWORD_HAS_BEEN_COPIED = 3915;
-exports.ER_DA_GRP_RPL_STARTED_AUTO_REJOIN = 3916;
-exports.ER_SYSVAR_CHANGE_DURING_QUERY = 3917;
-exports.ER_GLOBSTAT_CHANGE_DURING_QUERY = 3918;
-exports.ER_GRP_RPL_MESSAGE_SERVICE_INIT_FAILURE = 3919;
-exports.ER_CHANGE_SOURCE_WRONG_COMPRESSION_ALGORITHM_CLIENT = 3920;
-exports.ER_CHANGE_SOURCE_WRONG_COMPRESSION_LEVEL_CLIENT = 3921;
-exports.ER_WRONG_COMPRESSION_ALGORITHM_CLIENT = 3922;
-exports.ER_WRONG_COMPRESSION_LEVEL_CLIENT = 3923;
-exports.ER_CHANGE_SOURCE_WRONG_COMPRESSION_ALGORITHM_LIST_CLIENT = 3924;
-exports.ER_CLIENT_PRIVILEGE_CHECKS_USER_CANNOT_BE_ANONYMOUS = 3925;
-exports.ER_CLIENT_PRIVILEGE_CHECKS_USER_DOES_NOT_EXIST = 3926;
-exports.ER_CLIENT_PRIVILEGE_CHECKS_USER_CORRUPT = 3927;
-exports.ER_CLIENT_PRIVILEGE_CHECKS_USER_NEEDS_RPL_APPLIER_PRIV = 3928;
-exports.ER_WARN_DA_PRIVILEGE_NOT_REGISTERED = 3929;
-exports.ER_CLIENT_KEYRING_UDF_KEY_INVALID = 3930;
-exports.ER_CLIENT_KEYRING_UDF_KEY_TYPE_INVALID = 3931;
-exports.ER_CLIENT_KEYRING_UDF_KEY_TOO_LONG = 3932;
-exports.ER_CLIENT_KEYRING_UDF_KEY_TYPE_TOO_LONG = 3933;
-exports.ER_JSON_SCHEMA_VALIDATION_ERROR_WITH_DETAILED_REPORT = 3934;
-exports.ER_DA_UDF_INVALID_CHARSET_SPECIFIED = 3935;
-exports.ER_DA_UDF_INVALID_CHARSET = 3936;
-exports.ER_DA_UDF_INVALID_COLLATION = 3937;
-exports.ER_DA_UDF_INVALID_EXTENSION_ARGUMENT_TYPE = 3938;
-exports.ER_MULTIPLE_CONSTRAINTS_WITH_SAME_NAME = 3939;
-exports.ER_CONSTRAINT_NOT_FOUND = 3940;
-exports.ER_ALTER_CONSTRAINT_ENFORCEMENT_NOT_SUPPORTED = 3941;
-exports.ER_TABLE_VALUE_CONSTRUCTOR_MUST_HAVE_COLUMNS = 3942;
-exports.ER_TABLE_VALUE_CONSTRUCTOR_CANNOT_HAVE_DEFAULT = 3943;
-exports.ER_CLIENT_QUERY_FAILURE_INVALID_NON_ROW_FORMAT = 3944;
-exports.ER_REQUIRE_ROW_FORMAT_INVALID_VALUE = 3945;
-exports.ER_FAILED_TO_DETERMINE_IF_ROLE_IS_MANDATORY = 3946;
-exports.ER_FAILED_TO_FETCH_MANDATORY_ROLE_LIST = 3947;
-exports.ER_CLIENT_LOCAL_FILES_DISABLED = 3948;
-exports.ER_IMP_INCOMPATIBLE_CFG_VERSION = 3949;
-exports.ER_DA_OOM = 3950;
-exports.ER_DA_UDF_INVALID_ARGUMENT_TO_SET_CHARSET = 3951;
-exports.ER_DA_UDF_INVALID_RETURN_TYPE_TO_SET_CHARSET = 3952;
-exports.ER_MULTIPLE_INTO_CLAUSES = 3953;
-exports.ER_MISPLACED_INTO = 3954;
-exports.ER_USER_ACCESS_DENIED_FOR_USER_ACCOUNT_BLOCKED_BY_PASSWORD_LOCK = 3955;
-exports.ER_WARN_DEPRECATED_YEAR_UNSIGNED = 3956;
-exports.ER_CLONE_NETWORK_PACKET = 3957;
-exports.ER_SDI_OPERATION_FAILED_MISSING_RECORD = 3958;
-exports.ER_DEPENDENT_BY_CHECK_CONSTRAINT = 3959;
-exports.ER_GRP_OPERATION_NOT_ALLOWED_GR_MUST_STOP = 3960;
-exports.ER_WARN_DEPRECATED_JSON_TABLE_ON_ERROR_ON_EMPTY = 3961;
-exports.ER_WARN_DEPRECATED_INNER_INTO = 3962;
-exports.ER_WARN_DEPRECATED_VALUES_FUNCTION_ALWAYS_NULL = 3963;
-exports.ER_WARN_DEPRECATED_SQL_CALC_FOUND_ROWS = 3964;
-exports.ER_WARN_DEPRECATED_FOUND_ROWS = 3965;
-exports.ER_MISSING_JSON_VALUE = 3966;
-exports.ER_MULTIPLE_JSON_VALUES = 3967;
-exports.ER_HOSTNAME_TOO_LONG = 3968;
-exports.ER_WARN_CLIENT_DEPRECATED_PARTITION_PREFIX_KEY = 3969;
-exports.ER_GROUP_REPLICATION_USER_EMPTY_MSG = 3970;
-exports.ER_GROUP_REPLICATION_USER_MANDATORY_MSG = 3971;
-exports.ER_GROUP_REPLICATION_PASSWORD_LENGTH = 3972;
-exports.ER_SUBQUERY_TRANSFORM_REJECTED = 3973;
-exports.ER_DA_GRP_RPL_RECOVERY_ENDPOINT_FORMAT = 3974;
-exports.ER_DA_GRP_RPL_RECOVERY_ENDPOINT_INVALID = 3975;
-exports.ER_WRONG_VALUE_FOR_VAR_PLUS_ACTIONABLE_PART = 3976;
-exports.ER_STATEMENT_NOT_ALLOWED_AFTER_START_TRANSACTION = 3977;
-exports.ER_FOREIGN_KEY_WITH_ATOMIC_CREATE_SELECT = 3978;
-exports.ER_NOT_ALLOWED_WITH_START_TRANSACTION = 3979;
-exports.ER_INVALID_JSON_ATTRIBUTE = 3980;
-exports.ER_ENGINE_ATTRIBUTE_NOT_SUPPORTED = 3981;
-exports.ER_INVALID_USER_ATTRIBUTE_JSON = 3982;
-exports.ER_INNODB_REDO_DISABLED = 3983;
-exports.ER_INNODB_REDO_ARCHIVING_ENABLED = 3984;
-exports.ER_MDL_OUT_OF_RESOURCES = 3985;
-exports.ER_IMPLICIT_COMPARISON_FOR_JSON = 3986;
-exports.ER_FUNCTION_DOES_NOT_SUPPORT_CHARACTER_SET = 3987;
-exports.ER_IMPOSSIBLE_STRING_CONVERSION = 3988;
-exports.ER_SCHEMA_READ_ONLY = 3989;
-exports.ER_RPL_ASYNC_RECONNECT_GTID_MODE_OFF = 3990;
-exports.ER_RPL_ASYNC_RECONNECT_AUTO_POSITION_OFF = 3991;
-exports.ER_DISABLE_GTID_MODE_REQUIRES_ASYNC_RECONNECT_OFF = 3992;
-exports.ER_DISABLE_AUTO_POSITION_REQUIRES_ASYNC_RECONNECT_OFF = 3993;
-exports.ER_INVALID_PARAMETER_USE = 3994;
-exports.ER_CHARACTER_SET_MISMATCH = 3995;
-exports.ER_WARN_VAR_VALUE_CHANGE_NOT_SUPPORTED = 3996;
-exports.ER_INVALID_TIME_ZONE_INTERVAL = 3997;
-exports.ER_INVALID_CAST = 3998;
-exports.ER_HYPERGRAPH_NOT_SUPPORTED_YET = 3999;
-exports.ER_WARN_HYPERGRAPH_EXPERIMENTAL = 4000;
-exports.ER_DA_NO_ERROR_LOG_PARSER_CONFIGURED = 4001;
-exports.ER_DA_ERROR_LOG_TABLE_DISABLED = 4002;
-exports.ER_DA_ERROR_LOG_MULTIPLE_FILTERS = 4003;
-exports.ER_DA_CANT_OPEN_ERROR_LOG = 4004;
-exports.ER_USER_REFERENCED_AS_DEFINER = 4005;
-exports.ER_CANNOT_USER_REFERENCED_AS_DEFINER = 4006;
-exports.ER_REGEX_NUMBER_TOO_BIG = 4007;
-exports.ER_SPVAR_NONINTEGER_TYPE = 4008;
-exports.WARN_UNSUPPORTED_ACL_TABLES_READ = 4009;
-exports.ER_BINLOG_UNSAFE_ACL_TABLE_READ_IN_DML_DDL = 4010;
-exports.ER_STOP_REPLICA_MONITOR_IO_THREAD_TIMEOUT = 4011;
-exports.ER_STARTING_REPLICA_MONITOR_IO_THREAD = 4012;
-exports.ER_CANT_USE_ANONYMOUS_TO_GTID_WITH_GTID_MODE_NOT_ON = 4013;
-exports.ER_CANT_COMBINE_ANONYMOUS_TO_GTID_AND_AUTOPOSITION = 4014;
-exports.ER_ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_REQUIRES_GTID_MODE_ON = 4015;
-exports.ER_SQL_REPLICA_SKIP_COUNTER_USED_WITH_GTID_MODE_ON = 4016;
-exports.ER_USING_ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_AS_LOCAL_OR_UUID = 4017;
-exports.ER_CANT_SET_ANONYMOUS_TO_GTID_AND_WAIT_UNTIL_SQL_THD_AFTER_GTIDS = 4018;
-exports.ER_CANT_SET_SQL_AFTER_OR_BEFORE_GTIDS_WITH_ANONYMOUS_TO_GTID = 4019;
-exports.ER_ANONYMOUS_TO_GTID_UUID_SAME_AS_GROUP_NAME = 4020;
-exports.ER_CANT_USE_SAME_UUID_AS_GROUP_NAME = 4021;
-exports.ER_GRP_RPL_RECOVERY_CHANNEL_STILL_RUNNING = 4022;
-exports.ER_INNODB_INVALID_AUTOEXTEND_SIZE_VALUE = 4023;
-exports.ER_INNODB_INCOMPATIBLE_WITH_TABLESPACE = 4024;
-exports.ER_INNODB_AUTOEXTEND_SIZE_OUT_OF_RANGE = 4025;
-exports.ER_CANNOT_USE_AUTOEXTEND_SIZE_CLAUSE = 4026;
-exports.ER_ROLE_GRANTED_TO_ITSELF = 4027;
-exports.ER_TABLE_MUST_HAVE_A_VISIBLE_COLUMN = 4028;
-exports.ER_INNODB_COMPRESSION_FAILURE = 4029;
-exports.ER_WARN_ASYNC_CONN_FAILOVER_NETWORK_NAMESPACE = 4030;
-exports.ER_CLIENT_INTERACTION_TIMEOUT = 4031;
-exports.ER_INVALID_CAST_TO_GEOMETRY = 4032;
-exports.ER_INVALID_CAST_POLYGON_RING_DIRECTION = 4033;
-exports.ER_GIS_DIFFERENT_SRIDS_AGGREGATION = 4034;
-exports.ER_RELOAD_KEYRING_FAILURE = 4035;
-exports.ER_SDI_GET_KEYS_INVALID_TABLESPACE = 4036;
-exports.ER_CHANGE_RPL_SRC_WRONG_COMPRESSION_ALGORITHM_SIZE = 4037;
-exports.ER_WARN_DEPRECATED_TLS_VERSION_FOR_CHANNEL_CLI = 4038;
-exports.ER_CANT_USE_SAME_UUID_AS_VIEW_CHANGE_UUID = 4039;
-exports.ER_ANONYMOUS_TO_GTID_UUID_SAME_AS_VIEW_CHANGE_UUID = 4040;
-exports.ER_GRP_RPL_VIEW_CHANGE_UUID_FAIL_GET_VARIABLE = 4041;
-exports.ER_WARN_ADUIT_LOG_MAX_SIZE_AND_PRUNE_SECONDS = 4042;
-exports.ER_WARN_ADUIT_LOG_MAX_SIZE_CLOSE_TO_ROTATE_ON_SIZE = 4043;
-exports.ER_KERBEROS_CREATE_USER = 4044;
-exports.ER_INSTALL_PLUGIN_CONFLICT_CLIENT = 4045;
-exports.ER_DA_ERROR_LOG_COMPONENT_FLUSH_FAILED = 4046;
-exports.ER_WARN_SQL_AFTER_MTS_GAPS_GAP_NOT_CALCULATED = 4047;
-exports.ER_INVALID_ASSIGNMENT_TARGET = 4048;
-exports.ER_OPERATION_NOT_ALLOWED_ON_GR_SECONDARY = 4049;
-exports.ER_GRP_RPL_FAILOVER_CHANNEL_STATUS_PROPAGATION = 4050;
-exports.ER_WARN_AUDIT_LOG_FORMAT_UNIX_TIMESTAMP_ONLY_WHEN_JSON = 4051;
-exports.ER_INVALID_MFA_PLUGIN_SPECIFIED = 4052;
-exports.ER_IDENTIFIED_BY_UNSUPPORTED = 4053;
-exports.ER_INVALID_PLUGIN_FOR_REGISTRATION = 4054;
-exports.ER_PLUGIN_REQUIRES_REGISTRATION = 4055;
-exports.ER_MFA_METHOD_EXISTS = 4056;
-exports.ER_MFA_METHOD_NOT_EXISTS = 4057;
-exports.ER_AUTHENTICATION_POLICY_MISMATCH = 4058;
-exports.ER_PLUGIN_REGISTRATION_DONE = 4059;
-exports.ER_INVALID_USER_FOR_REGISTRATION = 4060;
-exports.ER_USER_REGISTRATION_FAILED = 4061;
-exports.ER_MFA_METHODS_INVALID_ORDER = 4062;
-exports.ER_MFA_METHODS_IDENTICAL = 4063;
-exports.ER_INVALID_MFA_OPERATIONS_FOR_PASSWORDLESS_USER = 4064;
-exports.ER_CHANGE_REPLICATION_SOURCE_NO_OPTIONS_FOR_GTID_ONLY = 4065;
-exports.ER_CHANGE_REP_SOURCE_CANT_DISABLE_REQ_ROW_FORMAT_WITH_GTID_ONLY = 4066;
-exports.ER_CHANGE_REP_SOURCE_CANT_DISABLE_AUTO_POSITION_WITH_GTID_ONLY = 4067;
-exports.ER_CHANGE_REP_SOURCE_CANT_DISABLE_GTID_ONLY_WITHOUT_POSITIONS = 4068;
-exports.ER_CHANGE_REP_SOURCE_CANT_DISABLE_AUTO_POS_WITHOUT_POSITIONS = 4069;
-exports.ER_CHANGE_REP_SOURCE_GR_CHANNEL_WITH_GTID_MODE_NOT_ON = 4070;
-exports.ER_CANT_USE_GTID_ONLY_WITH_GTID_MODE_NOT_ON = 4071;
-exports.ER_WARN_C_DISABLE_GTID_ONLY_WITH_SOURCE_AUTO_POS_INVALID_POS = 4072;
-exports.ER_DA_SSL_FIPS_MODE_ERROR = 4073;
-exports.ER_VALUE_OUT_OF_RANGE = 4074;
-exports.ER_FULLTEXT_WITH_ROLLUP = 4075;
-exports.ER_REGEXP_MISSING_RESOURCE = 4076;
-exports.ER_WARN_REGEXP_USING_DEFAULT = 4077;
-exports.ER_REGEXP_MISSING_FILE = 4078;
-exports.ER_WARN_DEPRECATED_COLLATION = 4079;
-exports.ER_CONCURRENT_PROCEDURE_USAGE = 4080;
-exports.ER_DA_GLOBAL_CONN_LIMIT = 4081;
-exports.ER_DA_CONN_LIMIT = 4082;
-exports.ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE_INSTANT = 4083;
-exports.ER_WARN_SF_UDF_NAME_COLLISION = 4084;
-exports.ER_CANNOT_PURGE_BINLOG_WITH_BACKUP_LOCK = 4085;
-exports.ER_TOO_MANY_WINDOWS = 4086;
-exports.ER_MYSQLBACKUP_CLIENT_MSG = 4087;
-exports.ER_COMMENT_CONTAINS_INVALID_STRING = 4088;
-exports.ER_DEFINITION_CONTAINS_INVALID_STRING = 4089;
-exports.ER_CANT_EXECUTE_COMMAND_WITH_ASSIGNED_GTID_NEXT = 4090;
-exports.ER_XA_TEMP_TABLE = 4091;
-exports.ER_INNODB_MAX_ROW_VERSION = 4092;
-exports.ER_INNODB_INSTANT_ADD_NOT_SUPPORTED_MAX_SIZE = 4093;
-exports.ER_OPERATION_NOT_ALLOWED_WHILE_PRIMARY_CHANGE_IS_RUNNING = 4094;
-exports.ER_WARN_DEPRECATED_DATETIME_DELIMITER = 4095;
-exports.ER_WARN_DEPRECATED_SUPERFLUOUS_DELIMITER = 4096;
-exports.ER_CANNOT_PERSIST_SENSITIVE_VARIABLES = 4097;
-exports.ER_WARN_CANNOT_SECURELY_PERSIST_SENSITIVE_VARIABLES = 4098;
-exports.ER_WARN_TRG_ALREADY_EXISTS = 4099;
-exports.ER_IF_NOT_EXISTS_UNSUPPORTED_TRG_EXISTS_ON_DIFFERENT_TABLE = 4100;
-exports.ER_IF_NOT_EXISTS_UNSUPPORTED_UDF_NATIVE_FCT_NAME_COLLISION = 4101;
-exports.ER_SET_PASSWORD_AUTH_PLUGIN_ERROR = 4102;
-exports.ER_REDUCED_DBLWR_FILE_CORRUPTED = 4103;
-exports.ER_REDUCED_DBLWR_PAGE_FOUND = 4104;
-exports.ER_SRS_INVALID_LATITUDE_OF_ORIGIN = 4105;
-exports.ER_SRS_INVALID_LONGITUDE_OF_ORIGIN = 4106;
-exports.ER_SRS_UNUSED_PROJ_PARAMETER_PRESENT = 4107;
-exports.ER_GIPK_COLUMN_EXISTS = 4108;
-exports.ER_GIPK_FAILED_AUTOINC_COLUMN_EXISTS = 4109;
-exports.ER_GIPK_COLUMN_ALTER_NOT_ALLOWED = 4110;
-exports.ER_DROP_PK_COLUMN_TO_DROP_GIPK = 4111;
-exports.ER_CREATE_SELECT_WITH_GIPK_DISALLOWED_IN_SBR = 4112;
-exports.ER_DA_EXPIRE_LOGS_DAYS_IGNORED = 4113;
-exports.ER_CTE_RECURSIVE_NOT_UNION = 4114;
-exports.ER_COMMAND_BACKEND_FAILED_TO_FETCH_SECURITY_CTX = 4115;
-exports.ER_COMMAND_SERVICE_BACKEND_FAILED = 4116;
-exports.ER_CLIENT_FILE_PRIVILEGE_FOR_REPLICATION_CHECKS = 4117;
-exports.ER_GROUP_REPLICATION_FORCE_MEMBERS_COMMAND_FAILURE = 4118;
-exports.ER_WARN_DEPRECATED_IDENT = 4119;
-exports.ER_INTERSECT_ALL_MAX_DUPLICATES_EXCEEDED = 4120;
-exports.ER_TP_QUERY_THRS_PER_GRP_EXCEEDS_TXN_THR_LIMIT = 4121;
-exports.ER_BAD_TIMESTAMP_FORMAT = 4122;
-exports.ER_SHAPE_PRIDICTION_UDF = 4123;
-exports.ER_SRS_INVALID_HEIGHT = 4124;
-exports.ER_SRS_INVALID_SCALING = 4125;
-exports.ER_SRS_INVALID_ZONE_WIDTH = 4126;
-exports.ER_SRS_INVALID_LATITUDE_POLAR_STERE_VAR_A = 4127;
-exports.ER_WARN_DEPRECATED_CLIENT_NO_SCHEMA_OPTION = 4128;
-exports.ER_TABLE_NOT_EMPTY = 4129;
-exports.ER_TABLE_NO_PRIMARY_KEY = 4130;
-exports.ER_TABLE_IN_SHARED_TABLESPACE = 4131;
-exports.ER_INDEX_OTHER_THAN_PK = 4132;
-exports.ER_LOAD_BULK_DATA_UNSORTED = 4133;
-exports.ER_BULK_EXECUTOR_ERROR = 4134;
-exports.ER_BULK_READER_LIBCURL_INIT_FAILED = 4135;
-exports.ER_BULK_READER_LIBCURL_ERROR = 4136;
-exports.ER_BULK_READER_SERVER_ERROR = 4137;
-exports.ER_BULK_READER_COMMUNICATION_ERROR = 4138;
-exports.ER_BULK_LOAD_DATA_FAILED = 4139;
-exports.ER_BULK_LOADER_COLUMN_TOO_BIG_FOR_LEFTOVER_BUFFER = 4140;
-exports.ER_BULK_LOADER_COMPONENT_ERROR = 4141;
-exports.ER_BULK_LOADER_FILE_CONTAINS_LESS_LINES_THAN_IGNORE_CLAUSE = 4142;
-exports.ER_BULK_PARSER_MISSING_ENCLOSED_BY = 4143;
-exports.ER_BULK_PARSER_ROW_BUFFER_MAX_TOTAL_COLS_EXCEEDED = 4144;
-exports.ER_BULK_PARSER_COPY_BUFFER_SIZE_EXCEEDED = 4145;
-exports.ER_BULK_PARSER_UNEXPECTED_END_OF_INPUT = 4146;
-exports.ER_BULK_PARSER_UNEXPECTED_ROW_TERMINATOR = 4147;
-exports.ER_BULK_PARSER_UNEXPECTED_CHAR_AFTER_ENDING_ENCLOSED_BY = 4148;
-exports.ER_BULK_PARSER_UNEXPECTED_CHAR_AFTER_NULL_ESCAPE = 4149;
-exports.ER_BULK_PARSER_UNEXPECTED_CHAR_AFTER_COLUMN_TERMINATOR = 4150;
-exports.ER_BULK_PARSER_INCOMPLETE_ESCAPE_SEQUENCE = 4151;
-exports.ER_LOAD_BULK_DATA_FAILED = 4152;
-exports.ER_LOAD_BULK_DATA_WRONG_VALUE_FOR_FIELD = 4153;
-exports.ER_LOAD_BULK_DATA_WARN_NULL_TO_NOTNULL = 4154;
-exports.ER_REQUIRE_TABLE_PRIMARY_KEY_CHECK_GENERATE_WITH_GR = 4155;
-exports.ER_CANT_CHANGE_SYS_VAR_IN_READ_ONLY_MODE = 4156;
-exports.ER_INNODB_INSTANT_ADD_DROP_NOT_SUPPORTED_MAX_SIZE = 4157;
-exports.ER_INNODB_INSTANT_ADD_NOT_SUPPORTED_MAX_FIELDS = 4158;
-exports.ER_CANT_SET_PERSISTED = 4159;
-exports.ER_INSTALL_COMPONENT_SET_NULL_VALUE = 4160;
-exports.ER_INSTALL_COMPONENT_SET_UNUSED_VALUE = 4161;
-exports.ER_WARN_DEPRECATED_USER_DEFINED_COLLATIONS = 4162;
-
-// Lookup-by-number table
-exports[1] = 'EE_CANTCREATEFILE';
-exports[2] = 'EE_READ';
-exports[3] = 'EE_WRITE';
-exports[4] = 'EE_BADCLOSE';
-exports[5] = 'EE_OUTOFMEMORY';
-exports[6] = 'EE_DELETE';
-exports[7] = 'EE_LINK';
-exports[9] = 'EE_EOFERR';
-exports[10] = 'EE_CANTLOCK';
-exports[11] = 'EE_CANTUNLOCK';
-exports[12] = 'EE_DIR';
-exports[13] = 'EE_STAT';
-exports[14] = 'EE_CANT_CHSIZE';
-exports[15] = 'EE_CANT_OPEN_STREAM';
-exports[16] = 'EE_GETWD';
-exports[17] = 'EE_SETWD';
-exports[18] = 'EE_LINK_WARNING';
-exports[19] = 'EE_OPEN_WARNING';
-exports[20] = 'EE_DISK_FULL';
-exports[21] = 'EE_CANT_MKDIR';
-exports[22] = 'EE_UNKNOWN_CHARSET';
-exports[23] = 'EE_OUT_OF_FILERESOURCES';
-exports[24] = 'EE_CANT_READLINK';
-exports[25] = 'EE_CANT_SYMLINK';
-exports[26] = 'EE_REALPATH';
-exports[27] = 'EE_SYNC';
-exports[28] = 'EE_UNKNOWN_COLLATION';
-exports[29] = 'EE_FILENOTFOUND';
-exports[30] = 'EE_FILE_NOT_CLOSED';
-exports[31] = 'EE_CHANGE_OWNERSHIP';
-exports[32] = 'EE_CHANGE_PERMISSIONS';
-exports[33] = 'EE_CANT_SEEK';
-exports[34] = 'EE_CAPACITY_EXCEEDED';
-exports[35] = 'EE_DISK_FULL_WITH_RETRY_MSG';
-exports[36] = 'EE_FAILED_TO_CREATE_TIMER';
-exports[37] = 'EE_FAILED_TO_DELETE_TIMER';
-exports[38] = 'EE_FAILED_TO_CREATE_TIMER_QUEUE';
-exports[39] = 'EE_FAILED_TO_START_TIMER_NOTIFY_THREAD';
-exports[40] = 'EE_FAILED_TO_CREATE_TIMER_NOTIFY_THREAD_INTERRUPT_EVENT';
-exports[41] = 'EE_EXITING_TIMER_NOTIFY_THREAD';
-exports[42] = 'EE_WIN_LIBRARY_LOAD_FAILED';
-exports[43] = 'EE_WIN_RUN_TIME_ERROR_CHECK';
-exports[44] = 'EE_FAILED_TO_DETERMINE_LARGE_PAGE_SIZE';
-exports[45] = 'EE_FAILED_TO_KILL_ALL_THREADS';
-exports[46] = 'EE_FAILED_TO_CREATE_IO_COMPLETION_PORT';
-exports[47] = 'EE_FAILED_TO_OPEN_DEFAULTS_FILE';
-exports[48] = 'EE_FAILED_TO_HANDLE_DEFAULTS_FILE';
-exports[49] = 'EE_WRONG_DIRECTIVE_IN_CONFIG_FILE';
-exports[50] = 'EE_SKIPPING_DIRECTIVE_DUE_TO_MAX_INCLUDE_RECURSION';
-exports[51] = 'EE_INCORRECT_GRP_DEFINITION_IN_CONFIG_FILE';
-exports[52] = 'EE_OPTION_WITHOUT_GRP_IN_CONFIG_FILE';
-exports[53] = 'EE_CONFIG_FILE_PERMISSION_ERROR';
-exports[54] = 'EE_IGNORE_WORLD_WRITABLE_CONFIG_FILE';
-exports[55] = 'EE_USING_DISABLED_OPTION';
-exports[56] = 'EE_USING_DISABLED_SHORT_OPTION';
-exports[57] = 'EE_USING_PASSWORD_ON_CLI_IS_INSECURE';
-exports[58] = 'EE_UNKNOWN_SUFFIX_FOR_VARIABLE';
-exports[59] = 'EE_SSL_ERROR_FROM_FILE';
-exports[60] = 'EE_SSL_ERROR';
-exports[61] = 'EE_NET_SEND_ERROR_IN_BOOTSTRAP';
-exports[62] = 'EE_PACKETS_OUT_OF_ORDER';
-exports[63] = 'EE_UNKNOWN_PROTOCOL_OPTION';
-exports[64] = 'EE_FAILED_TO_LOCATE_SERVER_PUBLIC_KEY';
-exports[65] = 'EE_PUBLIC_KEY_NOT_IN_PEM_FORMAT';
-exports[66] = 'EE_DEBUG_INFO';
-exports[67] = 'EE_UNKNOWN_VARIABLE';
-exports[68] = 'EE_UNKNOWN_OPTION';
-exports[69] = 'EE_UNKNOWN_SHORT_OPTION';
-exports[70] = 'EE_OPTION_WITHOUT_ARGUMENT';
-exports[71] = 'EE_OPTION_REQUIRES_ARGUMENT';
-exports[72] = 'EE_SHORT_OPTION_REQUIRES_ARGUMENT';
-exports[73] = 'EE_OPTION_IGNORED_DUE_TO_INVALID_VALUE';
-exports[74] = 'EE_OPTION_WITH_EMPTY_VALUE';
-exports[75] = 'EE_FAILED_TO_ASSIGN_MAX_VALUE_TO_OPTION';
-exports[76] = 'EE_INCORRECT_BOOLEAN_VALUE_FOR_OPTION';
-exports[77] = 'EE_FAILED_TO_SET_OPTION_VALUE';
-exports[78] = 'EE_INCORRECT_INT_VALUE_FOR_OPTION';
-exports[79] = 'EE_INCORRECT_UINT_VALUE_FOR_OPTION';
-exports[80] = 'EE_ADJUSTED_SIGNED_VALUE_FOR_OPTION';
-exports[81] = 'EE_ADJUSTED_UNSIGNED_VALUE_FOR_OPTION';
-exports[82] = 'EE_ADJUSTED_ULONGLONG_VALUE_FOR_OPTION';
-exports[83] = 'EE_ADJUSTED_DOUBLE_VALUE_FOR_OPTION';
-exports[84] = 'EE_INVALID_DECIMAL_VALUE_FOR_OPTION';
-exports[85] = 'EE_COLLATION_PARSER_ERROR';
-exports[86] = 'EE_FAILED_TO_RESET_BEFORE_PRIMARY_IGNORABLE_CHAR';
-exports[87] = 'EE_FAILED_TO_RESET_BEFORE_TERTIARY_IGNORABLE_CHAR';
-exports[88] = 'EE_SHIFT_CHAR_OUT_OF_RANGE';
-exports[89] = 'EE_RESET_CHAR_OUT_OF_RANGE';
-exports[90] = 'EE_UNKNOWN_LDML_TAG';
-exports[91] = 'EE_FAILED_TO_RESET_BEFORE_SECONDARY_IGNORABLE_CHAR';
-exports[92] = 'EE_FAILED_PROCESSING_DIRECTIVE';
-exports[93] = 'EE_PTHREAD_KILL_FAILED';
-exports[120] = 'HA_ERR_KEY_NOT_FOUND';
-exports[121] = 'HA_ERR_FOUND_DUPP_KEY';
-exports[122] = 'HA_ERR_INTERNAL_ERROR';
-exports[123] = 'HA_ERR_RECORD_CHANGED';
-exports[124] = 'HA_ERR_WRONG_INDEX';
-exports[125] = 'HA_ERR_ROLLED_BACK';
-exports[126] = 'HA_ERR_CRASHED';
-exports[127] = 'HA_ERR_WRONG_IN_RECORD';
-exports[128] = 'HA_ERR_OUT_OF_MEM';
-exports[130] = 'HA_ERR_NOT_A_TABLE';
-exports[131] = 'HA_ERR_WRONG_COMMAND';
-exports[132] = 'HA_ERR_OLD_FILE';
-exports[133] = 'HA_ERR_NO_ACTIVE_RECORD';
-exports[134] = 'HA_ERR_RECORD_DELETED';
-exports[135] = 'HA_ERR_RECORD_FILE_FULL';
-exports[136] = 'HA_ERR_INDEX_FILE_FULL';
-exports[137] = 'HA_ERR_END_OF_FILE';
-exports[138] = 'HA_ERR_UNSUPPORTED';
-exports[139] = 'HA_ERR_TOO_BIG_ROW';
-exports[140] = 'HA_WRONG_CREATE_OPTION';
-exports[141] = 'HA_ERR_FOUND_DUPP_UNIQUE';
-exports[142] = 'HA_ERR_UNKNOWN_CHARSET';
-exports[143] = 'HA_ERR_WRONG_MRG_TABLE_DEF';
-exports[144] = 'HA_ERR_CRASHED_ON_REPAIR';
-exports[145] = 'HA_ERR_CRASHED_ON_USAGE';
-exports[146] = 'HA_ERR_LOCK_WAIT_TIMEOUT';
-exports[147] = 'HA_ERR_LOCK_TABLE_FULL';
-exports[148] = 'HA_ERR_READ_ONLY_TRANSACTION';
-exports[149] = 'HA_ERR_LOCK_DEADLOCK';
-exports[150] = 'HA_ERR_CANNOT_ADD_FOREIGN';
-exports[151] = 'HA_ERR_NO_REFERENCED_ROW';
-exports[152] = 'HA_ERR_ROW_IS_REFERENCED';
-exports[153] = 'HA_ERR_NO_SAVEPOINT';
-exports[154] = 'HA_ERR_NON_UNIQUE_BLOCK_SIZE';
-exports[155] = 'HA_ERR_NO_SUCH_TABLE';
-exports[156] = 'HA_ERR_TABLE_EXIST';
-exports[157] = 'HA_ERR_NO_CONNECTION';
-exports[158] = 'HA_ERR_NULL_IN_SPATIAL';
-exports[159] = 'HA_ERR_TABLE_DEF_CHANGED';
-exports[160] = 'HA_ERR_NO_PARTITION_FOUND';
-exports[161] = 'HA_ERR_RBR_LOGGING_FAILED';
-exports[162] = 'HA_ERR_DROP_INDEX_FK';
-exports[163] = 'HA_ERR_FOREIGN_DUPLICATE_KEY';
-exports[164] = 'HA_ERR_TABLE_NEEDS_UPGRADE';
-exports[165] = 'HA_ERR_TABLE_READONLY';
-exports[166] = 'HA_ERR_AUTOINC_READ_FAILED';
-exports[167] = 'HA_ERR_AUTOINC_ERANGE';
-exports[168] = 'HA_ERR_GENERIC';
-exports[169] = 'HA_ERR_RECORD_IS_THE_SAME';
-exports[170] = 'HA_ERR_LOGGING_IMPOSSIBLE';
-exports[171] = 'HA_ERR_CORRUPT_EVENT';
-exports[172] = 'HA_ERR_NEW_FILE';
-exports[173] = 'HA_ERR_ROWS_EVENT_APPLY';
-exports[174] = 'HA_ERR_INITIALIZATION';
-exports[175] = 'HA_ERR_FILE_TOO_SHORT';
-exports[176] = 'HA_ERR_WRONG_CRC';
-exports[177] = 'HA_ERR_TOO_MANY_CONCURRENT_TRXS';
-exports[178] = 'HA_ERR_NOT_IN_LOCK_PARTITIONS';
-exports[179] = 'HA_ERR_INDEX_COL_TOO_LONG';
-exports[180] = 'HA_ERR_INDEX_CORRUPT';
-exports[181] = 'HA_ERR_UNDO_REC_TOO_BIG';
-exports[182] = 'HA_FTS_INVALID_DOCID';
-exports[183] = 'HA_ERR_TABLE_IN_FK_CHECK';
-exports[184] = 'HA_ERR_TABLESPACE_EXISTS';
-exports[185] = 'HA_ERR_TOO_MANY_FIELDS';
-exports[186] = 'HA_ERR_ROW_IN_WRONG_PARTITION';
-exports[187] = 'HA_ERR_INNODB_READ_ONLY';
-exports[188] = 'HA_ERR_FTS_EXCEED_RESULT_CACHE_LIMIT';
-exports[189] = 'HA_ERR_TEMP_FILE_WRITE_FAILURE';
-exports[190] = 'HA_ERR_INNODB_FORCED_RECOVERY';
-exports[191] = 'HA_ERR_FTS_TOO_MANY_WORDS_IN_PHRASE';
-exports[192] = 'HA_ERR_FK_DEPTH_EXCEEDED';
-exports[193] = 'HA_MISSING_CREATE_OPTION';
-exports[194] = 'HA_ERR_SE_OUT_OF_MEMORY';
-exports[195] = 'HA_ERR_TABLE_CORRUPT';
-exports[196] = 'HA_ERR_QUERY_INTERRUPTED';
-exports[197] = 'HA_ERR_TABLESPACE_MISSING';
-exports[198] = 'HA_ERR_TABLESPACE_IS_NOT_EMPTY';
-exports[199] = 'HA_ERR_WRONG_FILE_NAME';
-exports[200] = 'HA_ERR_NOT_ALLOWED_COMMAND';
-exports[201] = 'HA_ERR_COMPUTE_FAILED';
-exports[202] = 'HA_ERR_ROW_FORMAT_CHANGED';
-exports[203] = 'HA_ERR_NO_WAIT_LOCK';
-exports[204] = 'HA_ERR_DISK_FULL_NOWAIT';
-exports[205] = 'HA_ERR_NO_SESSION_TEMP';
-exports[206] = 'HA_ERR_WRONG_TABLE_NAME';
-exports[207] = 'HA_ERR_TOO_LONG_PATH';
-exports[208] = 'HA_ERR_SAMPLING_INIT_FAILED';
-exports[209] = 'HA_ERR_FTS_TOO_MANY_NESTED_EXP';
-exports[1000] = 'ER_HASHCHK';
-exports[1001] = 'ER_NISAMCHK';
-exports[1002] = 'ER_NO';
-exports[1003] = 'ER_YES';
-exports[1004] = 'ER_CANT_CREATE_FILE';
-exports[1005] = 'ER_CANT_CREATE_TABLE';
-exports[1006] = 'ER_CANT_CREATE_DB';
-exports[1007] = 'ER_DB_CREATE_EXISTS';
-exports[1008] = 'ER_DB_DROP_EXISTS';
-exports[1009] = 'ER_DB_DROP_DELETE';
-exports[1010] = 'ER_DB_DROP_RMDIR';
-exports[1011] = 'ER_CANT_DELETE_FILE';
-exports[1012] = 'ER_CANT_FIND_SYSTEM_REC';
-exports[1013] = 'ER_CANT_GET_STAT';
-exports[1014] = 'ER_CANT_GET_WD';
-exports[1015] = 'ER_CANT_LOCK';
-exports[1016] = 'ER_CANT_OPEN_FILE';
-exports[1017] = 'ER_FILE_NOT_FOUND';
-exports[1018] = 'ER_CANT_READ_DIR';
-exports[1019] = 'ER_CANT_SET_WD';
-exports[1020] = 'ER_CHECKREAD';
-exports[1021] = 'ER_DISK_FULL';
-exports[1022] = 'ER_DUP_KEY';
-exports[1023] = 'ER_ERROR_ON_CLOSE';
-exports[1024] = 'ER_ERROR_ON_READ';
-exports[1025] = 'ER_ERROR_ON_RENAME';
-exports[1026] = 'ER_ERROR_ON_WRITE';
-exports[1027] = 'ER_FILE_USED';
-exports[1028] = 'ER_FILSORT_ABORT';
-exports[1029] = 'ER_FORM_NOT_FOUND';
-exports[1030] = 'ER_GET_ERRNO';
-exports[1031] = 'ER_ILLEGAL_HA';
-exports[1032] = 'ER_KEY_NOT_FOUND';
-exports[1033] = 'ER_NOT_FORM_FILE';
-exports[1034] = 'ER_NOT_KEYFILE';
-exports[1035] = 'ER_OLD_KEYFILE';
-exports[1036] = 'ER_OPEN_AS_READONLY';
-exports[1037] = 'ER_OUTOFMEMORY';
-exports[1038] = 'ER_OUT_OF_SORTMEMORY';
-exports[1039] = 'ER_UNEXPECTED_EOF';
-exports[1040] = 'ER_CON_COUNT_ERROR';
-exports[1041] = 'ER_OUT_OF_RESOURCES';
-exports[1042] = 'ER_BAD_HOST_ERROR';
-exports[1043] = 'ER_HANDSHAKE_ERROR';
-exports[1044] = 'ER_DBACCESS_DENIED_ERROR';
-exports[1045] = 'ER_ACCESS_DENIED_ERROR';
-exports[1046] = 'ER_NO_DB_ERROR';
-exports[1047] = 'ER_UNKNOWN_COM_ERROR';
-exports[1048] = 'ER_BAD_NULL_ERROR';
-exports[1049] = 'ER_BAD_DB_ERROR';
-exports[1050] = 'ER_TABLE_EXISTS_ERROR';
-exports[1051] = 'ER_BAD_TABLE_ERROR';
-exports[1052] = 'ER_NON_UNIQ_ERROR';
-exports[1053] = 'ER_SERVER_SHUTDOWN';
-exports[1054] = 'ER_BAD_FIELD_ERROR';
-exports[1055] = 'ER_WRONG_FIELD_WITH_GROUP';
-exports[1056] = 'ER_WRONG_GROUP_FIELD';
-exports[1057] = 'ER_WRONG_SUM_SELECT';
-exports[1058] = 'ER_WRONG_VALUE_COUNT';
-exports[1059] = 'ER_TOO_LONG_IDENT';
-exports[1060] = 'ER_DUP_FIELDNAME';
-exports[1061] = 'ER_DUP_KEYNAME';
-exports[1062] = 'ER_DUP_ENTRY';
-exports[1063] = 'ER_WRONG_FIELD_SPEC';
-exports[1064] = 'ER_PARSE_ERROR';
-exports[1065] = 'ER_EMPTY_QUERY';
-exports[1066] = 'ER_NONUNIQ_TABLE';
-exports[1067] = 'ER_INVALID_DEFAULT';
-exports[1068] = 'ER_MULTIPLE_PRI_KEY';
-exports[1069] = 'ER_TOO_MANY_KEYS';
-exports[1070] = 'ER_TOO_MANY_KEY_PARTS';
-exports[1071] = 'ER_TOO_LONG_KEY';
-exports[1072] = 'ER_KEY_COLUMN_DOES_NOT_EXITS';
-exports[1073] = 'ER_BLOB_USED_AS_KEY';
-exports[1074] = 'ER_TOO_BIG_FIELDLENGTH';
-exports[1075] = 'ER_WRONG_AUTO_KEY';
-exports[1076] = 'ER_READY';
-exports[1077] = 'ER_NORMAL_SHUTDOWN';
-exports[1078] = 'ER_GOT_SIGNAL';
-exports[1079] = 'ER_SHUTDOWN_COMPLETE';
-exports[1080] = 'ER_FORCING_CLOSE';
-exports[1081] = 'ER_IPSOCK_ERROR';
-exports[1082] = 'ER_NO_SUCH_INDEX';
-exports[1083] = 'ER_WRONG_FIELD_TERMINATORS';
-exports[1084] = 'ER_BLOBS_AND_NO_TERMINATED';
-exports[1085] = 'ER_TEXTFILE_NOT_READABLE';
-exports[1086] = 'ER_FILE_EXISTS_ERROR';
-exports[1087] = 'ER_LOAD_INFO';
-exports[1088] = 'ER_ALTER_INFO';
-exports[1089] = 'ER_WRONG_SUB_KEY';
-exports[1090] = 'ER_CANT_REMOVE_ALL_FIELDS';
-exports[1091] = 'ER_CANT_DROP_FIELD_OR_KEY';
-exports[1092] = 'ER_INSERT_INFO';
-exports[1093] = 'ER_UPDATE_TABLE_USED';
-exports[1094] = 'ER_NO_SUCH_THREAD';
-exports[1095] = 'ER_KILL_DENIED_ERROR';
-exports[1096] = 'ER_NO_TABLES_USED';
-exports[1097] = 'ER_TOO_BIG_SET';
-exports[1098] = 'ER_NO_UNIQUE_LOGFILE';
-exports[1099] = 'ER_TABLE_NOT_LOCKED_FOR_WRITE';
-exports[1100] = 'ER_TABLE_NOT_LOCKED';
-exports[1101] = 'ER_BLOB_CANT_HAVE_DEFAULT';
-exports[1102] = 'ER_WRONG_DB_NAME';
-exports[1103] = 'ER_WRONG_TABLE_NAME';
-exports[1104] = 'ER_TOO_BIG_SELECT';
-exports[1105] = 'ER_UNKNOWN_ERROR';
-exports[1106] = 'ER_UNKNOWN_PROCEDURE';
-exports[1107] = 'ER_WRONG_PARAMCOUNT_TO_PROCEDURE';
-exports[1108] = 'ER_WRONG_PARAMETERS_TO_PROCEDURE';
-exports[1109] = 'ER_UNKNOWN_TABLE';
-exports[1110] = 'ER_FIELD_SPECIFIED_TWICE';
-exports[1111] = 'ER_INVALID_GROUP_FUNC_USE';
-exports[1112] = 'ER_UNSUPPORTED_EXTENSION';
-exports[1113] = 'ER_TABLE_MUST_HAVE_COLUMNS';
-exports[1114] = 'ER_RECORD_FILE_FULL';
-exports[1115] = 'ER_UNKNOWN_CHARACTER_SET';
-exports[1116] = 'ER_TOO_MANY_TABLES';
-exports[1117] = 'ER_TOO_MANY_FIELDS';
-exports[1118] = 'ER_TOO_BIG_ROWSIZE';
-exports[1119] = 'ER_STACK_OVERRUN';
-exports[1120] = 'ER_WRONG_OUTER_JOIN';
-exports[1121] = 'ER_NULL_COLUMN_IN_INDEX';
-exports[1122] = 'ER_CANT_FIND_UDF';
-exports[1123] = 'ER_CANT_INITIALIZE_UDF';
-exports[1124] = 'ER_UDF_NO_PATHS';
-exports[1125] = 'ER_UDF_EXISTS';
-exports[1126] = 'ER_CANT_OPEN_LIBRARY';
-exports[1127] = 'ER_CANT_FIND_DL_ENTRY';
-exports[1128] = 'ER_FUNCTION_NOT_DEFINED';
-exports[1129] = 'ER_HOST_IS_BLOCKED';
-exports[1130] = 'ER_HOST_NOT_PRIVILEGED';
-exports[1131] = 'ER_PASSWORD_ANONYMOUS_USER';
-exports[1132] = 'ER_PASSWORD_NOT_ALLOWED';
-exports[1133] = 'ER_PASSWORD_NO_MATCH';
-exports[1134] = 'ER_UPDATE_INFO';
-exports[1135] = 'ER_CANT_CREATE_THREAD';
-exports[1136] = 'ER_WRONG_VALUE_COUNT_ON_ROW';
-exports[1137] = 'ER_CANT_REOPEN_TABLE';
-exports[1138] = 'ER_INVALID_USE_OF_NULL';
-exports[1139] = 'ER_REGEXP_ERROR';
-exports[1140] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS';
-exports[1141] = 'ER_NONEXISTING_GRANT';
-exports[1142] = 'ER_TABLEACCESS_DENIED_ERROR';
-exports[1143] = 'ER_COLUMNACCESS_DENIED_ERROR';
-exports[1144] = 'ER_ILLEGAL_GRANT_FOR_TABLE';
-exports[1145] = 'ER_GRANT_WRONG_HOST_OR_USER';
-exports[1146] = 'ER_NO_SUCH_TABLE';
-exports[1147] = 'ER_NONEXISTING_TABLE_GRANT';
-exports[1148] = 'ER_NOT_ALLOWED_COMMAND';
-exports[1149] = 'ER_SYNTAX_ERROR';
-exports[1150] = 'ER_UNUSED1';
-exports[1151] = 'ER_UNUSED2';
-exports[1152] = 'ER_ABORTING_CONNECTION';
-exports[1153] = 'ER_NET_PACKET_TOO_LARGE';
-exports[1154] = 'ER_NET_READ_ERROR_FROM_PIPE';
-exports[1155] = 'ER_NET_FCNTL_ERROR';
-exports[1156] = 'ER_NET_PACKETS_OUT_OF_ORDER';
-exports[1157] = 'ER_NET_UNCOMPRESS_ERROR';
-exports[1158] = 'ER_NET_READ_ERROR';
-exports[1159] = 'ER_NET_READ_INTERRUPTED';
-exports[1160] = 'ER_NET_ERROR_ON_WRITE';
-exports[1161] = 'ER_NET_WRITE_INTERRUPTED';
-exports[1162] = 'ER_TOO_LONG_STRING';
-exports[1163] = 'ER_TABLE_CANT_HANDLE_BLOB';
-exports[1164] = 'ER_TABLE_CANT_HANDLE_AUTO_INCREMENT';
-exports[1165] = 'ER_UNUSED3';
-exports[1166] = 'ER_WRONG_COLUMN_NAME';
-exports[1167] = 'ER_WRONG_KEY_COLUMN';
-exports[1168] = 'ER_WRONG_MRG_TABLE';
-exports[1169] = 'ER_DUP_UNIQUE';
-exports[1170] = 'ER_BLOB_KEY_WITHOUT_LENGTH';
-exports[1171] = 'ER_PRIMARY_CANT_HAVE_NULL';
-exports[1172] = 'ER_TOO_MANY_ROWS';
-exports[1173] = 'ER_REQUIRES_PRIMARY_KEY';
-exports[1174] = 'ER_NO_RAID_COMPILED';
-exports[1175] = 'ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE';
-exports[1176] = 'ER_KEY_DOES_NOT_EXITS';
-exports[1177] = 'ER_CHECK_NO_SUCH_TABLE';
-exports[1178] = 'ER_CHECK_NOT_IMPLEMENTED';
-exports[1179] = 'ER_CANT_DO_THIS_DURING_AN_TRANSACTION';
-exports[1180] = 'ER_ERROR_DURING_COMMIT';
-exports[1181] = 'ER_ERROR_DURING_ROLLBACK';
-exports[1182] = 'ER_ERROR_DURING_FLUSH_LOGS';
-exports[1183] = 'ER_ERROR_DURING_CHECKPOINT';
-exports[1184] = 'ER_NEW_ABORTING_CONNECTION';
-exports[1185] = 'ER_DUMP_NOT_IMPLEMENTED';
-exports[1186] = 'ER_FLUSH_MASTER_BINLOG_CLOSED';
-exports[1187] = 'ER_INDEX_REBUILD';
-exports[1188] = 'ER_SOURCE';
-exports[1189] = 'ER_SOURCE_NET_READ';
-exports[1190] = 'ER_SOURCE_NET_WRITE';
-exports[1191] = 'ER_FT_MATCHING_KEY_NOT_FOUND';
-exports[1192] = 'ER_LOCK_OR_ACTIVE_TRANSACTION';
-exports[1193] = 'ER_UNKNOWN_SYSTEM_VARIABLE';
-exports[1194] = 'ER_CRASHED_ON_USAGE';
-exports[1195] = 'ER_CRASHED_ON_REPAIR';
-exports[1196] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK';
-exports[1197] = 'ER_TRANS_CACHE_FULL';
-exports[1198] = 'ER_SLAVE_MUST_STOP';
-exports[1199] = 'ER_REPLICA_NOT_RUNNING';
-exports[1200] = 'ER_BAD_REPLICA';
-exports[1201] = 'ER_CONNECTION_METADATA';
-exports[1202] = 'ER_REPLICA_THREAD';
-exports[1203] = 'ER_TOO_MANY_USER_CONNECTIONS';
-exports[1204] = 'ER_SET_CONSTANTS_ONLY';
-exports[1205] = 'ER_LOCK_WAIT_TIMEOUT';
-exports[1206] = 'ER_LOCK_TABLE_FULL';
-exports[1207] = 'ER_READ_ONLY_TRANSACTION';
-exports[1208] = 'ER_DROP_DB_WITH_READ_LOCK';
-exports[1209] = 'ER_CREATE_DB_WITH_READ_LOCK';
-exports[1210] = 'ER_WRONG_ARGUMENTS';
-exports[1211] = 'ER_NO_PERMISSION_TO_CREATE_USER';
-exports[1212] = 'ER_UNION_TABLES_IN_DIFFERENT_DIR';
-exports[1213] = 'ER_LOCK_DEADLOCK';
-exports[1214] = 'ER_TABLE_CANT_HANDLE_FT';
-exports[1215] = 'ER_CANNOT_ADD_FOREIGN';
-exports[1216] = 'ER_NO_REFERENCED_ROW';
-exports[1217] = 'ER_ROW_IS_REFERENCED';
-exports[1218] = 'ER_CONNECT_TO_SOURCE';
-exports[1219] = 'ER_QUERY_ON_MASTER';
-exports[1220] = 'ER_ERROR_WHEN_EXECUTING_COMMAND';
-exports[1221] = 'ER_WRONG_USAGE';
-exports[1222] = 'ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT';
-exports[1223] = 'ER_CANT_UPDATE_WITH_READLOCK';
-exports[1224] = 'ER_MIXING_NOT_ALLOWED';
-exports[1225] = 'ER_DUP_ARGUMENT';
-exports[1226] = 'ER_USER_LIMIT_REACHED';
-exports[1227] = 'ER_SPECIFIC_ACCESS_DENIED_ERROR';
-exports[1228] = 'ER_LOCAL_VARIABLE';
-exports[1229] = 'ER_GLOBAL_VARIABLE';
-exports[1230] = 'ER_NO_DEFAULT';
-exports[1231] = 'ER_WRONG_VALUE_FOR_VAR';
-exports[1232] = 'ER_WRONG_TYPE_FOR_VAR';
-exports[1233] = 'ER_VAR_CANT_BE_READ';
-exports[1234] = 'ER_CANT_USE_OPTION_HERE';
-exports[1235] = 'ER_NOT_SUPPORTED_YET';
-exports[1236] = 'ER_SOURCE_FATAL_ERROR_READING_BINLOG';
-exports[1237] = 'ER_REPLICA_IGNORED_TABLE';
-exports[1238] = 'ER_INCORRECT_GLOBAL_LOCAL_VAR';
-exports[1239] = 'ER_WRONG_FK_DEF';
-exports[1240] = 'ER_KEY_REF_DO_NOT_MATCH_TABLE_REF';
-exports[1241] = 'ER_OPERAND_COLUMNS';
-exports[1242] = 'ER_SUBQUERY_NO_1_ROW';
-exports[1243] = 'ER_UNKNOWN_STMT_HANDLER';
-exports[1244] = 'ER_CORRUPT_HELP_DB';
-exports[1245] = 'ER_CYCLIC_REFERENCE';
-exports[1246] = 'ER_AUTO_CONVERT';
-exports[1247] = 'ER_ILLEGAL_REFERENCE';
-exports[1248] = 'ER_DERIVED_MUST_HAVE_ALIAS';
-exports[1249] = 'ER_SELECT_REDUCED';
-exports[1250] = 'ER_TABLENAME_NOT_ALLOWED_HERE';
-exports[1251] = 'ER_NOT_SUPPORTED_AUTH_MODE';
-exports[1252] = 'ER_SPATIAL_CANT_HAVE_NULL';
-exports[1253] = 'ER_COLLATION_CHARSET_MISMATCH';
-exports[1254] = 'ER_SLAVE_WAS_RUNNING';
-exports[1255] = 'ER_SLAVE_WAS_NOT_RUNNING';
-exports[1256] = 'ER_TOO_BIG_FOR_UNCOMPRESS';
-exports[1257] = 'ER_ZLIB_Z_MEM_ERROR';
-exports[1258] = 'ER_ZLIB_Z_BUF_ERROR';
-exports[1259] = 'ER_ZLIB_Z_DATA_ERROR';
-exports[1260] = 'ER_CUT_VALUE_GROUP_CONCAT';
-exports[1261] = 'ER_WARN_TOO_FEW_RECORDS';
-exports[1262] = 'ER_WARN_TOO_MANY_RECORDS';
-exports[1263] = 'ER_WARN_NULL_TO_NOTNULL';
-exports[1264] = 'ER_WARN_DATA_OUT_OF_RANGE';
-exports[1265] = 'WARN_DATA_TRUNCATED';
-exports[1266] = 'ER_WARN_USING_OTHER_HANDLER';
-exports[1267] = 'ER_CANT_AGGREGATE_2COLLATIONS';
-exports[1268] = 'ER_DROP_USER';
-exports[1269] = 'ER_REVOKE_GRANTS';
-exports[1270] = 'ER_CANT_AGGREGATE_3COLLATIONS';
-exports[1271] = 'ER_CANT_AGGREGATE_NCOLLATIONS';
-exports[1272] = 'ER_VARIABLE_IS_NOT_STRUCT';
-exports[1273] = 'ER_UNKNOWN_COLLATION';
-exports[1274] = 'ER_REPLICA_IGNORED_SSL_PARAMS';
-exports[1275] = 'ER_SERVER_IS_IN_SECURE_AUTH_MODE';
-exports[1276] = 'ER_WARN_FIELD_RESOLVED';
-exports[1277] = 'ER_BAD_REPLICA_UNTIL_COND';
-exports[1278] = 'ER_MISSING_SKIP_REPLICA';
-exports[1279] = 'ER_UNTIL_COND_IGNORED';
-exports[1280] = 'ER_WRONG_NAME_FOR_INDEX';
-exports[1281] = 'ER_WRONG_NAME_FOR_CATALOG';
-exports[1282] = 'ER_WARN_QC_RESIZE';
-exports[1283] = 'ER_BAD_FT_COLUMN';
-exports[1284] = 'ER_UNKNOWN_KEY_CACHE';
-exports[1285] = 'ER_WARN_HOSTNAME_WONT_WORK';
-exports[1286] = 'ER_UNKNOWN_STORAGE_ENGINE';
-exports[1287] = 'ER_WARN_DEPRECATED_SYNTAX';
-exports[1288] = 'ER_NON_UPDATABLE_TABLE';
-exports[1289] = 'ER_FEATURE_DISABLED';
-exports[1290] = 'ER_OPTION_PREVENTS_STATEMENT';
-exports[1291] = 'ER_DUPLICATED_VALUE_IN_TYPE';
-exports[1292] = 'ER_TRUNCATED_WRONG_VALUE';
-exports[1293] = 'ER_TOO_MUCH_AUTO_TIMESTAMP_COLS';
-exports[1294] = 'ER_INVALID_ON_UPDATE';
-exports[1295] = 'ER_UNSUPPORTED_PS';
-exports[1296] = 'ER_GET_ERRMSG';
-exports[1297] = 'ER_GET_TEMPORARY_ERRMSG';
-exports[1298] = 'ER_UNKNOWN_TIME_ZONE';
-exports[1299] = 'ER_WARN_INVALID_TIMESTAMP';
-exports[1300] = 'ER_INVALID_CHARACTER_STRING';
-exports[1301] = 'ER_WARN_ALLOWED_PACKET_OVERFLOWED';
-exports[1302] = 'ER_CONFLICTING_DECLARATIONS';
-exports[1303] = 'ER_SP_NO_RECURSIVE_CREATE';
-exports[1304] = 'ER_SP_ALREADY_EXISTS';
-exports[1305] = 'ER_SP_DOES_NOT_EXIST';
-exports[1306] = 'ER_SP_DROP_FAILED';
-exports[1307] = 'ER_SP_STORE_FAILED';
-exports[1308] = 'ER_SP_LILABEL_MISMATCH';
-exports[1309] = 'ER_SP_LABEL_REDEFINE';
-exports[1310] = 'ER_SP_LABEL_MISMATCH';
-exports[1311] = 'ER_SP_UNINIT_VAR';
-exports[1312] = 'ER_SP_BADSELECT';
-exports[1313] = 'ER_SP_BADRETURN';
-exports[1314] = 'ER_SP_BADSTATEMENT';
-exports[1315] = 'ER_UPDATE_LOG_DEPRECATED_IGNORED';
-exports[1316] = 'ER_UPDATE_LOG_DEPRECATED_TRANSLATED';
-exports[1317] = 'ER_QUERY_INTERRUPTED';
-exports[1318] = 'ER_SP_WRONG_NO_OF_ARGS';
-exports[1319] = 'ER_SP_COND_MISMATCH';
-exports[1320] = 'ER_SP_NORETURN';
-exports[1321] = 'ER_SP_NORETURNEND';
-exports[1322] = 'ER_SP_BAD_CURSOR_QUERY';
-exports[1323] = 'ER_SP_BAD_CURSOR_SELECT';
-exports[1324] = 'ER_SP_CURSOR_MISMATCH';
-exports[1325] = 'ER_SP_CURSOR_ALREADY_OPEN';
-exports[1326] = 'ER_SP_CURSOR_NOT_OPEN';
-exports[1327] = 'ER_SP_UNDECLARED_VAR';
-exports[1328] = 'ER_SP_WRONG_NO_OF_FETCH_ARGS';
-exports[1329] = 'ER_SP_FETCH_NO_DATA';
-exports[1330] = 'ER_SP_DUP_PARAM';
-exports[1331] = 'ER_SP_DUP_VAR';
-exports[1332] = 'ER_SP_DUP_COND';
-exports[1333] = 'ER_SP_DUP_CURS';
-exports[1334] = 'ER_SP_CANT_ALTER';
-exports[1335] = 'ER_SP_SUBSELECT_NYI';
-exports[1336] = 'ER_STMT_NOT_ALLOWED_IN_SF_OR_TRG';
-exports[1337] = 'ER_SP_VARCOND_AFTER_CURSHNDLR';
-exports[1338] = 'ER_SP_CURSOR_AFTER_HANDLER';
-exports[1339] = 'ER_SP_CASE_NOT_FOUND';
-exports[1340] = 'ER_FPARSER_TOO_BIG_FILE';
-exports[1341] = 'ER_FPARSER_BAD_HEADER';
-exports[1342] = 'ER_FPARSER_EOF_IN_COMMENT';
-exports[1343] = 'ER_FPARSER_ERROR_IN_PARAMETER';
-exports[1344] = 'ER_FPARSER_EOF_IN_UNKNOWN_PARAMETER';
-exports[1345] = 'ER_VIEW_NO_EXPLAIN';
-exports[1346] = 'ER_FRM_UNKNOWN_TYPE';
-exports[1347] = 'ER_WRONG_OBJECT';
-exports[1348] = 'ER_NONUPDATEABLE_COLUMN';
-exports[1349] = 'ER_VIEW_SELECT_DERIVED';
-exports[1350] = 'ER_VIEW_SELECT_CLAUSE';
-exports[1351] = 'ER_VIEW_SELECT_VARIABLE';
-exports[1352] = 'ER_VIEW_SELECT_TMPTABLE';
-exports[1353] = 'ER_VIEW_WRONG_LIST';
-exports[1354] = 'ER_WARN_VIEW_MERGE';
-exports[1355] = 'ER_WARN_VIEW_WITHOUT_KEY';
-exports[1356] = 'ER_VIEW_INVALID';
-exports[1357] = 'ER_SP_NO_DROP_SP';
-exports[1358] = 'ER_SP_GOTO_IN_HNDLR';
-exports[1359] = 'ER_TRG_ALREADY_EXISTS';
-exports[1360] = 'ER_TRG_DOES_NOT_EXIST';
-exports[1361] = 'ER_TRG_ON_VIEW_OR_TEMP_TABLE';
-exports[1362] = 'ER_TRG_CANT_CHANGE_ROW';
-exports[1363] = 'ER_TRG_NO_SUCH_ROW_IN_TRG';
-exports[1364] = 'ER_NO_DEFAULT_FOR_FIELD';
-exports[1365] = 'ER_DIVISION_BY_ZERO';
-exports[1366] = 'ER_TRUNCATED_WRONG_VALUE_FOR_FIELD';
-exports[1367] = 'ER_ILLEGAL_VALUE_FOR_TYPE';
-exports[1368] = 'ER_VIEW_NONUPD_CHECK';
-exports[1369] = 'ER_VIEW_CHECK_FAILED';
-exports[1370] = 'ER_PROCACCESS_DENIED_ERROR';
-exports[1371] = 'ER_RELAY_LOG_FAIL';
-exports[1372] = 'ER_PASSWD_LENGTH';
-exports[1373] = 'ER_UNKNOWN_TARGET_BINLOG';
-exports[1374] = 'ER_IO_ERR_LOG_INDEX_READ';
-exports[1375] = 'ER_BINLOG_PURGE_PROHIBITED';
-exports[1376] = 'ER_FSEEK_FAIL';
-exports[1377] = 'ER_BINLOG_PURGE_FATAL_ERR';
-exports[1378] = 'ER_LOG_IN_USE';
-exports[1379] = 'ER_LOG_PURGE_UNKNOWN_ERR';
-exports[1380] = 'ER_RELAY_LOG_INIT';
-exports[1381] = 'ER_NO_BINARY_LOGGING';
-exports[1382] = 'ER_RESERVED_SYNTAX';
-exports[1383] = 'ER_WSAS_FAILED';
-exports[1384] = 'ER_DIFF_GROUPS_PROC';
-exports[1385] = 'ER_NO_GROUP_FOR_PROC';
-exports[1386] = 'ER_ORDER_WITH_PROC';
-exports[1387] = 'ER_LOGGING_PROHIBIT_CHANGING_OF';
-exports[1388] = 'ER_NO_FILE_MAPPING';
-exports[1389] = 'ER_WRONG_MAGIC';
-exports[1390] = 'ER_PS_MANY_PARAM';
-exports[1391] = 'ER_KEY_PART_0';
-exports[1392] = 'ER_VIEW_CHECKSUM';
-exports[1393] = 'ER_VIEW_MULTIUPDATE';
-exports[1394] = 'ER_VIEW_NO_INSERT_FIELD_LIST';
-exports[1395] = 'ER_VIEW_DELETE_MERGE_VIEW';
-exports[1396] = 'ER_CANNOT_USER';
-exports[1397] = 'ER_XAER_NOTA';
-exports[1398] = 'ER_XAER_INVAL';
-exports[1399] = 'ER_XAER_RMFAIL';
-exports[1400] = 'ER_XAER_OUTSIDE';
-exports[1401] = 'ER_XAER_RMERR';
-exports[1402] = 'ER_XA_RBROLLBACK';
-exports[1403] = 'ER_NONEXISTING_PROC_GRANT';
-exports[1404] = 'ER_PROC_AUTO_GRANT_FAIL';
-exports[1405] = 'ER_PROC_AUTO_REVOKE_FAIL';
-exports[1406] = 'ER_DATA_TOO_LONG';
-exports[1407] = 'ER_SP_BAD_SQLSTATE';
-exports[1408] = 'ER_STARTUP';
-exports[1409] = 'ER_LOAD_FROM_FIXED_SIZE_ROWS_TO_VAR';
-exports[1410] = 'ER_CANT_CREATE_USER_WITH_GRANT';
-exports[1411] = 'ER_WRONG_VALUE_FOR_TYPE';
-exports[1412] = 'ER_TABLE_DEF_CHANGED';
-exports[1413] = 'ER_SP_DUP_HANDLER';
-exports[1414] = 'ER_SP_NOT_VAR_ARG';
-exports[1415] = 'ER_SP_NO_RETSET';
-exports[1416] = 'ER_CANT_CREATE_GEOMETRY_OBJECT';
-exports[1417] = 'ER_FAILED_ROUTINE_BREAK_BINLOG';
-exports[1418] = 'ER_BINLOG_UNSAFE_ROUTINE';
-exports[1419] = 'ER_BINLOG_CREATE_ROUTINE_NEED_SUPER';
-exports[1420] = 'ER_EXEC_STMT_WITH_OPEN_CURSOR';
-exports[1421] = 'ER_STMT_HAS_NO_OPEN_CURSOR';
-exports[1422] = 'ER_COMMIT_NOT_ALLOWED_IN_SF_OR_TRG';
-exports[1423] = 'ER_NO_DEFAULT_FOR_VIEW_FIELD';
-exports[1424] = 'ER_SP_NO_RECURSION';
-exports[1425] = 'ER_TOO_BIG_SCALE';
-exports[1426] = 'ER_TOO_BIG_PRECISION';
-exports[1427] = 'ER_M_BIGGER_THAN_D';
-exports[1428] = 'ER_WRONG_LOCK_OF_SYSTEM_TABLE';
-exports[1429] = 'ER_CONNECT_TO_FOREIGN_DATA_SOURCE';
-exports[1430] = 'ER_QUERY_ON_FOREIGN_DATA_SOURCE';
-exports[1431] = 'ER_FOREIGN_DATA_SOURCE_DOESNT_EXIST';
-exports[1432] = 'ER_FOREIGN_DATA_STRING_INVALID_CANT_CREATE';
-exports[1433] = 'ER_FOREIGN_DATA_STRING_INVALID';
-exports[1434] = 'ER_CANT_CREATE_FEDERATED_TABLE';
-exports[1435] = 'ER_TRG_IN_WRONG_SCHEMA';
-exports[1436] = 'ER_STACK_OVERRUN_NEED_MORE';
-exports[1437] = 'ER_TOO_LONG_BODY';
-exports[1438] = 'ER_WARN_CANT_DROP_DEFAULT_KEYCACHE';
-exports[1439] = 'ER_TOO_BIG_DISPLAYWIDTH';
-exports[1440] = 'ER_XAER_DUPID';
-exports[1441] = 'ER_DATETIME_FUNCTION_OVERFLOW';
-exports[1442] = 'ER_CANT_UPDATE_USED_TABLE_IN_SF_OR_TRG';
-exports[1443] = 'ER_VIEW_PREVENT_UPDATE';
-exports[1444] = 'ER_PS_NO_RECURSION';
-exports[1445] = 'ER_SP_CANT_SET_AUTOCOMMIT';
-exports[1446] = 'ER_MALFORMED_DEFINER';
-exports[1447] = 'ER_VIEW_FRM_NO_USER';
-exports[1448] = 'ER_VIEW_OTHER_USER';
-exports[1449] = 'ER_NO_SUCH_USER';
-exports[1450] = 'ER_FORBID_SCHEMA_CHANGE';
-exports[1451] = 'ER_ROW_IS_REFERENCED_2';
-exports[1452] = 'ER_NO_REFERENCED_ROW_2';
-exports[1453] = 'ER_SP_BAD_VAR_SHADOW';
-exports[1454] = 'ER_TRG_NO_DEFINER';
-exports[1455] = 'ER_OLD_FILE_FORMAT';
-exports[1456] = 'ER_SP_RECURSION_LIMIT';
-exports[1457] = 'ER_SP_PROC_TABLE_CORRUPT';
-exports[1458] = 'ER_SP_WRONG_NAME';
-exports[1459] = 'ER_TABLE_NEEDS_UPGRADE';
-exports[1460] = 'ER_SP_NO_AGGREGATE';
-exports[1461] = 'ER_MAX_PREPARED_STMT_COUNT_REACHED';
-exports[1462] = 'ER_VIEW_RECURSIVE';
-exports[1463] = 'ER_NON_GROUPING_FIELD_USED';
-exports[1464] = 'ER_TABLE_CANT_HANDLE_SPKEYS';
-exports[1465] = 'ER_NO_TRIGGERS_ON_SYSTEM_SCHEMA';
-exports[1466] = 'ER_REMOVED_SPACES';
-exports[1467] = 'ER_AUTOINC_READ_FAILED';
-exports[1468] = 'ER_USERNAME';
-exports[1469] = 'ER_HOSTNAME';
-exports[1470] = 'ER_WRONG_STRING_LENGTH';
-exports[1471] = 'ER_NON_INSERTABLE_TABLE';
-exports[1472] = 'ER_ADMIN_WRONG_MRG_TABLE';
-exports[1473] = 'ER_TOO_HIGH_LEVEL_OF_NESTING_FOR_SELECT';
-exports[1474] = 'ER_NAME_BECOMES_EMPTY';
-exports[1475] = 'ER_AMBIGUOUS_FIELD_TERM';
-exports[1476] = 'ER_FOREIGN_SERVER_EXISTS';
-exports[1477] = 'ER_FOREIGN_SERVER_DOESNT_EXIST';
-exports[1478] = 'ER_ILLEGAL_HA_CREATE_OPTION';
-exports[1479] = 'ER_PARTITION_REQUIRES_VALUES_ERROR';
-exports[1480] = 'ER_PARTITION_WRONG_VALUES_ERROR';
-exports[1481] = 'ER_PARTITION_MAXVALUE_ERROR';
-exports[1482] = 'ER_PARTITION_SUBPARTITION_ERROR';
-exports[1483] = 'ER_PARTITION_SUBPART_MIX_ERROR';
-exports[1484] = 'ER_PARTITION_WRONG_NO_PART_ERROR';
-exports[1485] = 'ER_PARTITION_WRONG_NO_SUBPART_ERROR';
-exports[1486] = 'ER_WRONG_EXPR_IN_PARTITION_FUNC_ERROR';
-exports[1487] = 'ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR';
-exports[1488] = 'ER_FIELD_NOT_FOUND_PART_ERROR';
-exports[1489] = 'ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR';
-exports[1490] = 'ER_INCONSISTENT_PARTITION_INFO_ERROR';
-exports[1491] = 'ER_PARTITION_FUNC_NOT_ALLOWED_ERROR';
-exports[1492] = 'ER_PARTITIONS_MUST_BE_DEFINED_ERROR';
-exports[1493] = 'ER_RANGE_NOT_INCREASING_ERROR';
-exports[1494] = 'ER_INCONSISTENT_TYPE_OF_FUNCTIONS_ERROR';
-exports[1495] = 'ER_MULTIPLE_DEF_CONST_IN_LIST_PART_ERROR';
-exports[1496] = 'ER_PARTITION_ENTRY_ERROR';
-exports[1497] = 'ER_MIX_HANDLER_ERROR';
-exports[1498] = 'ER_PARTITION_NOT_DEFINED_ERROR';
-exports[1499] = 'ER_TOO_MANY_PARTITIONS_ERROR';
-exports[1500] = 'ER_SUBPARTITION_ERROR';
-exports[1501] = 'ER_CANT_CREATE_HANDLER_FILE';
-exports[1502] = 'ER_BLOB_FIELD_IN_PART_FUNC_ERROR';
-exports[1503] = 'ER_UNIQUE_KEY_NEED_ALL_FIELDS_IN_PF';
-exports[1504] = 'ER_NO_PARTS_ERROR';
-exports[1505] = 'ER_PARTITION_MGMT_ON_NONPARTITIONED';
-exports[1506] = 'ER_FOREIGN_KEY_ON_PARTITIONED';
-exports[1507] = 'ER_DROP_PARTITION_NON_EXISTENT';
-exports[1508] = 'ER_DROP_LAST_PARTITION';
-exports[1509] = 'ER_COALESCE_ONLY_ON_HASH_PARTITION';
-exports[1510] = 'ER_REORG_HASH_ONLY_ON_SAME_NO';
-exports[1511] = 'ER_REORG_NO_PARAM_ERROR';
-exports[1512] = 'ER_ONLY_ON_RANGE_LIST_PARTITION';
-exports[1513] = 'ER_ADD_PARTITION_SUBPART_ERROR';
-exports[1514] = 'ER_ADD_PARTITION_NO_NEW_PARTITION';
-exports[1515] = 'ER_COALESCE_PARTITION_NO_PARTITION';
-exports[1516] = 'ER_REORG_PARTITION_NOT_EXIST';
-exports[1517] = 'ER_SAME_NAME_PARTITION';
-exports[1518] = 'ER_NO_BINLOG_ERROR';
-exports[1519] = 'ER_CONSECUTIVE_REORG_PARTITIONS';
-exports[1520] = 'ER_REORG_OUTSIDE_RANGE';
-exports[1521] = 'ER_PARTITION_FUNCTION_FAILURE';
-exports[1522] = 'ER_PART_STATE_ERROR';
-exports[1523] = 'ER_LIMITED_PART_RANGE';
-exports[1524] = 'ER_PLUGIN_IS_NOT_LOADED';
-exports[1525] = 'ER_WRONG_VALUE';
-exports[1526] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE';
-exports[1527] = 'ER_FILEGROUP_OPTION_ONLY_ONCE';
-exports[1528] = 'ER_CREATE_FILEGROUP_FAILED';
-exports[1529] = 'ER_DROP_FILEGROUP_FAILED';
-exports[1530] = 'ER_TABLESPACE_AUTO_EXTEND_ERROR';
-exports[1531] = 'ER_WRONG_SIZE_NUMBER';
-exports[1532] = 'ER_SIZE_OVERFLOW_ERROR';
-exports[1533] = 'ER_ALTER_FILEGROUP_FAILED';
-exports[1534] = 'ER_BINLOG_ROW_LOGGING_FAILED';
-exports[1535] = 'ER_BINLOG_ROW_WRONG_TABLE_DEF';
-exports[1536] = 'ER_BINLOG_ROW_RBR_TO_SBR';
-exports[1537] = 'ER_EVENT_ALREADY_EXISTS';
-exports[1538] = 'ER_EVENT_STORE_FAILED';
-exports[1539] = 'ER_EVENT_DOES_NOT_EXIST';
-exports[1540] = 'ER_EVENT_CANT_ALTER';
-exports[1541] = 'ER_EVENT_DROP_FAILED';
-exports[1542] = 'ER_EVENT_INTERVAL_NOT_POSITIVE_OR_TOO_BIG';
-exports[1543] = 'ER_EVENT_ENDS_BEFORE_STARTS';
-exports[1544] = 'ER_EVENT_EXEC_TIME_IN_THE_PAST';
-exports[1545] = 'ER_EVENT_OPEN_TABLE_FAILED';
-exports[1546] = 'ER_EVENT_NEITHER_M_EXPR_NOR_M_AT';
-exports[1547] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED';
-exports[1548] = 'ER_CANNOT_LOAD_FROM_TABLE';
-exports[1549] = 'ER_EVENT_CANNOT_DELETE';
-exports[1550] = 'ER_EVENT_COMPILE_ERROR';
-exports[1551] = 'ER_EVENT_SAME_NAME';
-exports[1552] = 'ER_EVENT_DATA_TOO_LONG';
-exports[1553] = 'ER_DROP_INDEX_FK';
-exports[1554] = 'ER_WARN_DEPRECATED_SYNTAX_WITH_VER';
-exports[1555] = 'ER_CANT_WRITE_LOCK_LOG_TABLE';
-exports[1556] = 'ER_CANT_LOCK_LOG_TABLE';
-exports[1557] = 'ER_FOREIGN_DUPLICATE_KEY';
-exports[1558] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE';
-exports[1559] = 'ER_TEMP_TABLE_PREVENTS_SWITCH_OUT_OF_RBR';
-exports[1560] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_FORMAT';
-exports[1561] = 'ER_NDB_CANT_SWITCH_BINLOG_FORMAT';
-exports[1562] = 'ER_PARTITION_NO_TEMPORARY';
-exports[1563] = 'ER_PARTITION_CONST_DOMAIN_ERROR';
-exports[1564] = 'ER_PARTITION_FUNCTION_IS_NOT_ALLOWED';
-exports[1565] = 'ER_DDL_LOG_ERROR';
-exports[1566] = 'ER_NULL_IN_VALUES_LESS_THAN';
-exports[1567] = 'ER_WRONG_PARTITION_NAME';
-exports[1568] = 'ER_CANT_CHANGE_TX_CHARACTERISTICS';
-exports[1569] = 'ER_DUP_ENTRY_AUTOINCREMENT_CASE';
-exports[1570] = 'ER_EVENT_MODIFY_QUEUE_ERROR';
-exports[1571] = 'ER_EVENT_SET_VAR_ERROR';
-exports[1572] = 'ER_PARTITION_MERGE_ERROR';
-exports[1573] = 'ER_CANT_ACTIVATE_LOG';
-exports[1574] = 'ER_RBR_NOT_AVAILABLE';
-exports[1575] = 'ER_BASE64_DECODE_ERROR';
-exports[1576] = 'ER_EVENT_RECURSION_FORBIDDEN';
-exports[1577] = 'ER_EVENTS_DB_ERROR';
-exports[1578] = 'ER_ONLY_INTEGERS_ALLOWED';
-exports[1579] = 'ER_UNSUPORTED_LOG_ENGINE';
-exports[1580] = 'ER_BAD_LOG_STATEMENT';
-exports[1581] = 'ER_CANT_RENAME_LOG_TABLE';
-exports[1582] = 'ER_WRONG_PARAMCOUNT_TO_NATIVE_FCT';
-exports[1583] = 'ER_WRONG_PARAMETERS_TO_NATIVE_FCT';
-exports[1584] = 'ER_WRONG_PARAMETERS_TO_STORED_FCT';
-exports[1585] = 'ER_NATIVE_FCT_NAME_COLLISION';
-exports[1586] = 'ER_DUP_ENTRY_WITH_KEY_NAME';
-exports[1587] = 'ER_BINLOG_PURGE_EMFILE';
-exports[1588] = 'ER_EVENT_CANNOT_CREATE_IN_THE_PAST';
-exports[1589] = 'ER_EVENT_CANNOT_ALTER_IN_THE_PAST';
-exports[1590] = 'ER_SLAVE_INCIDENT';
-exports[1591] = 'ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT';
-exports[1592] = 'ER_BINLOG_UNSAFE_STATEMENT';
-exports[1593] = 'ER_BINLOG_FATAL_ERROR';
-exports[1594] = 'ER_SLAVE_RELAY_LOG_READ_FAILURE';
-exports[1595] = 'ER_SLAVE_RELAY_LOG_WRITE_FAILURE';
-exports[1596] = 'ER_SLAVE_CREATE_EVENT_FAILURE';
-exports[1597] = 'ER_SLAVE_MASTER_COM_FAILURE';
-exports[1598] = 'ER_BINLOG_LOGGING_IMPOSSIBLE';
-exports[1599] = 'ER_VIEW_NO_CREATION_CTX';
-exports[1600] = 'ER_VIEW_INVALID_CREATION_CTX';
-exports[1601] = 'ER_SR_INVALID_CREATION_CTX';
-exports[1602] = 'ER_TRG_CORRUPTED_FILE';
-exports[1603] = 'ER_TRG_NO_CREATION_CTX';
-exports[1604] = 'ER_TRG_INVALID_CREATION_CTX';
-exports[1605] = 'ER_EVENT_INVALID_CREATION_CTX';
-exports[1606] = 'ER_TRG_CANT_OPEN_TABLE';
-exports[1607] = 'ER_CANT_CREATE_SROUTINE';
-exports[1608] = 'ER_NEVER_USED';
-exports[1609] = 'ER_NO_FORMAT_DESCRIPTION_EVENT_BEFORE_BINLOG_STATEMENT';
-exports[1610] = 'ER_REPLICA_CORRUPT_EVENT';
-exports[1611] = 'ER_LOAD_DATA_INVALID_COLUMN';
-exports[1612] = 'ER_LOG_PURGE_NO_FILE';
-exports[1613] = 'ER_XA_RBTIMEOUT';
-exports[1614] = 'ER_XA_RBDEADLOCK';
-exports[1615] = 'ER_NEED_REPREPARE';
-exports[1616] = 'ER_DELAYED_NOT_SUPPORTED';
-exports[1617] = 'WARN_NO_CONNECTION_METADATA';
-exports[1618] = 'WARN_OPTION_IGNORED';
-exports[1619] = 'ER_PLUGIN_DELETE_BUILTIN';
-exports[1620] = 'WARN_PLUGIN_BUSY';
-exports[1621] = 'ER_VARIABLE_IS_READONLY';
-exports[1622] = 'ER_WARN_ENGINE_TRANSACTION_ROLLBACK';
-exports[1623] = 'ER_SLAVE_HEARTBEAT_FAILURE';
-exports[1624] = 'ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE';
-exports[1625] = 'ER_NDB_REPLICATION_SCHEMA_ERROR';
-exports[1626] = 'ER_CONFLICT_FN_PARSE_ERROR';
-exports[1627] = 'ER_EXCEPTIONS_WRITE_ERROR';
-exports[1628] = 'ER_TOO_LONG_TABLE_COMMENT';
-exports[1629] = 'ER_TOO_LONG_FIELD_COMMENT';
-exports[1630] = 'ER_FUNC_INEXISTENT_NAME_COLLISION';
-exports[1631] = 'ER_DATABASE_NAME';
-exports[1632] = 'ER_TABLE_NAME';
-exports[1633] = 'ER_PARTITION_NAME';
-exports[1634] = 'ER_SUBPARTITION_NAME';
-exports[1635] = 'ER_TEMPORARY_NAME';
-exports[1636] = 'ER_RENAMED_NAME';
-exports[1637] = 'ER_TOO_MANY_CONCURRENT_TRXS';
-exports[1638] = 'WARN_NON_ASCII_SEPARATOR_NOT_IMPLEMENTED';
-exports[1639] = 'ER_DEBUG_SYNC_TIMEOUT';
-exports[1640] = 'ER_DEBUG_SYNC_HIT_LIMIT';
-exports[1641] = 'ER_DUP_SIGNAL_SET';
-exports[1642] = 'ER_SIGNAL_WARN';
-exports[1643] = 'ER_SIGNAL_NOT_FOUND';
-exports[1644] = 'ER_SIGNAL_EXCEPTION';
-exports[1645] = 'ER_RESIGNAL_WITHOUT_ACTIVE_HANDLER';
-exports[1646] = 'ER_SIGNAL_BAD_CONDITION_TYPE';
-exports[1647] = 'WARN_COND_ITEM_TRUNCATED';
-exports[1648] = 'ER_COND_ITEM_TOO_LONG';
-exports[1649] = 'ER_UNKNOWN_LOCALE';
-exports[1650] = 'ER_REPLICA_IGNORE_SERVER_IDS';
-exports[1651] = 'ER_QUERY_CACHE_DISABLED';
-exports[1652] = 'ER_SAME_NAME_PARTITION_FIELD';
-exports[1653] = 'ER_PARTITION_COLUMN_LIST_ERROR';
-exports[1654] = 'ER_WRONG_TYPE_COLUMN_VALUE_ERROR';
-exports[1655] = 'ER_TOO_MANY_PARTITION_FUNC_FIELDS_ERROR';
-exports[1656] = 'ER_MAXVALUE_IN_VALUES_IN';
-exports[1657] = 'ER_TOO_MANY_VALUES_ERROR';
-exports[1658] = 'ER_ROW_SINGLE_PARTITION_FIELD_ERROR';
-exports[1659] = 'ER_FIELD_TYPE_NOT_ALLOWED_AS_PARTITION_FIELD';
-exports[1660] = 'ER_PARTITION_FIELDS_TOO_LONG';
-exports[1661] = 'ER_BINLOG_ROW_ENGINE_AND_STMT_ENGINE';
-exports[1662] = 'ER_BINLOG_ROW_MODE_AND_STMT_ENGINE';
-exports[1663] = 'ER_BINLOG_UNSAFE_AND_STMT_ENGINE';
-exports[1664] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_ENGINE';
-exports[1665] = 'ER_BINLOG_STMT_MODE_AND_ROW_ENGINE';
-exports[1666] = 'ER_BINLOG_ROW_INJECTION_AND_STMT_MODE';
-exports[1667] = 'ER_BINLOG_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE';
-exports[1668] = 'ER_BINLOG_UNSAFE_LIMIT';
-exports[1669] = 'ER_UNUSED4';
-exports[1670] = 'ER_BINLOG_UNSAFE_SYSTEM_TABLE';
-exports[1671] = 'ER_BINLOG_UNSAFE_AUTOINC_COLUMNS';
-exports[1672] = 'ER_BINLOG_UNSAFE_UDF';
-exports[1673] = 'ER_BINLOG_UNSAFE_SYSTEM_VARIABLE';
-exports[1674] = 'ER_BINLOG_UNSAFE_SYSTEM_FUNCTION';
-exports[1675] = 'ER_BINLOG_UNSAFE_NONTRANS_AFTER_TRANS';
-exports[1676] = 'ER_MESSAGE_AND_STATEMENT';
-exports[1677] = 'ER_SLAVE_CONVERSION_FAILED';
-exports[1678] = 'ER_REPLICA_CANT_CREATE_CONVERSION';
-exports[1679] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_FORMAT';
-exports[1680] = 'ER_PATH_LENGTH';
-exports[1681] = 'ER_WARN_DEPRECATED_SYNTAX_NO_REPLACEMENT';
-exports[1682] = 'ER_WRONG_NATIVE_TABLE_STRUCTURE';
-exports[1683] = 'ER_WRONG_PERFSCHEMA_USAGE';
-exports[1684] = 'ER_WARN_I_S_SKIPPED_TABLE';
-exports[1685] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_BINLOG_DIRECT';
-exports[1686] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_BINLOG_DIRECT';
-exports[1687] = 'ER_SPATIAL_MUST_HAVE_GEOM_COL';
-exports[1688] = 'ER_TOO_LONG_INDEX_COMMENT';
-exports[1689] = 'ER_LOCK_ABORTED';
-exports[1690] = 'ER_DATA_OUT_OF_RANGE';
-exports[1691] = 'ER_WRONG_SPVAR_TYPE_IN_LIMIT';
-exports[1692] = 'ER_BINLOG_UNSAFE_MULTIPLE_ENGINES_AND_SELF_LOGGING_ENGINE';
-exports[1693] = 'ER_BINLOG_UNSAFE_MIXED_STATEMENT';
-exports[1694] = 'ER_INSIDE_TRANSACTION_PREVENTS_SWITCH_SQL_LOG_BIN';
-exports[1695] = 'ER_STORED_FUNCTION_PREVENTS_SWITCH_SQL_LOG_BIN';
-exports[1696] = 'ER_FAILED_READ_FROM_PAR_FILE';
-exports[1697] = 'ER_VALUES_IS_NOT_INT_TYPE_ERROR';
-exports[1698] = 'ER_ACCESS_DENIED_NO_PASSWORD_ERROR';
-exports[1699] = 'ER_SET_PASSWORD_AUTH_PLUGIN';
-exports[1700] = 'ER_GRANT_PLUGIN_USER_EXISTS';
-exports[1701] = 'ER_TRUNCATE_ILLEGAL_FK';
-exports[1702] = 'ER_PLUGIN_IS_PERMANENT';
-exports[1703] = 'ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE_MIN';
-exports[1704] = 'ER_REPLICA_HEARTBEAT_VALUE_OUT_OF_RANGE_MAX';
-exports[1705] = 'ER_STMT_CACHE_FULL';
-exports[1706] = 'ER_MULTI_UPDATE_KEY_CONFLICT';
-exports[1707] = 'ER_TABLE_NEEDS_REBUILD';
-exports[1708] = 'WARN_OPTION_BELOW_LIMIT';
-exports[1709] = 'ER_INDEX_COLUMN_TOO_LONG';
-exports[1710] = 'ER_ERROR_IN_TRIGGER_BODY';
-exports[1711] = 'ER_ERROR_IN_UNKNOWN_TRIGGER_BODY';
-exports[1712] = 'ER_INDEX_CORRUPT';
-exports[1713] = 'ER_UNDO_RECORD_TOO_BIG';
-exports[1714] = 'ER_BINLOG_UNSAFE_INSERT_IGNORE_SELECT';
-exports[1715] = 'ER_BINLOG_UNSAFE_INSERT_SELECT_UPDATE';
-exports[1716] = 'ER_BINLOG_UNSAFE_REPLACE_SELECT';
-exports[1717] = 'ER_BINLOG_UNSAFE_CREATE_IGNORE_SELECT';
-exports[1718] = 'ER_BINLOG_UNSAFE_CREATE_REPLACE_SELECT';
-exports[1719] = 'ER_BINLOG_UNSAFE_UPDATE_IGNORE';
-exports[1720] = 'ER_PLUGIN_NO_UNINSTALL';
-exports[1721] = 'ER_PLUGIN_NO_INSTALL';
-exports[1722] = 'ER_BINLOG_UNSAFE_WRITE_AUTOINC_SELECT';
-exports[1723] = 'ER_BINLOG_UNSAFE_CREATE_SELECT_AUTOINC';
-exports[1724] = 'ER_BINLOG_UNSAFE_INSERT_TWO_KEYS';
-exports[1725] = 'ER_TABLE_IN_FK_CHECK';
-exports[1726] = 'ER_UNSUPPORTED_ENGINE';
-exports[1727] = 'ER_BINLOG_UNSAFE_AUTOINC_NOT_FIRST';
-exports[1728] = 'ER_CANNOT_LOAD_FROM_TABLE_V2';
-exports[1729] = 'ER_SOURCE_DELAY_VALUE_OUT_OF_RANGE';
-exports[1730] = 'ER_ONLY_FD_AND_RBR_EVENTS_ALLOWED_IN_BINLOG_STATEMENT';
-exports[1731] = 'ER_PARTITION_EXCHANGE_DIFFERENT_OPTION';
-exports[1732] = 'ER_PARTITION_EXCHANGE_PART_TABLE';
-exports[1733] = 'ER_PARTITION_EXCHANGE_TEMP_TABLE';
-exports[1734] = 'ER_PARTITION_INSTEAD_OF_SUBPARTITION';
-exports[1735] = 'ER_UNKNOWN_PARTITION';
-exports[1736] = 'ER_TABLES_DIFFERENT_METADATA';
-exports[1737] = 'ER_ROW_DOES_NOT_MATCH_PARTITION';
-exports[1738] = 'ER_BINLOG_CACHE_SIZE_GREATER_THAN_MAX';
-exports[1739] = 'ER_WARN_INDEX_NOT_APPLICABLE';
-exports[1740] = 'ER_PARTITION_EXCHANGE_FOREIGN_KEY';
-exports[1741] = 'ER_NO_SUCH_KEY_VALUE';
-exports[1742] = 'ER_RPL_INFO_DATA_TOO_LONG';
-exports[1743] = 'ER_NETWORK_READ_EVENT_CHECKSUM_FAILURE';
-exports[1744] = 'ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE';
-exports[1745] = 'ER_BINLOG_STMT_CACHE_SIZE_GREATER_THAN_MAX';
-exports[1746] = 'ER_CANT_UPDATE_TABLE_IN_CREATE_TABLE_SELECT';
-exports[1747] = 'ER_PARTITION_CLAUSE_ON_NONPARTITIONED';
-exports[1748] = 'ER_ROW_DOES_NOT_MATCH_GIVEN_PARTITION_SET';
-exports[1749] = 'ER_NO_SUCH_PARTITION';
-exports[1750] = 'ER_CHANGE_RPL_INFO_REPOSITORY_FAILURE';
-exports[1751] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_CREATED_TEMP_TABLE';
-exports[1752] = 'ER_WARNING_NOT_COMPLETE_ROLLBACK_WITH_DROPPED_TEMP_TABLE';
-exports[1753] = 'ER_MTA_FEATURE_IS_NOT_SUPPORTED';
-exports[1754] = 'ER_MTA_UPDATED_DBS_GREATER_MAX';
-exports[1755] = 'ER_MTA_CANT_PARALLEL';
-exports[1756] = 'ER_MTA_INCONSISTENT_DATA';
-exports[1757] = 'ER_FULLTEXT_NOT_SUPPORTED_WITH_PARTITIONING';
-exports[1758] = 'ER_DA_INVALID_CONDITION_NUMBER';
-exports[1759] = 'ER_INSECURE_PLAIN_TEXT';
-exports[1760] = 'ER_INSECURE_CHANGE_SOURCE';
-exports[1761] = 'ER_FOREIGN_DUPLICATE_KEY_WITH_CHILD_INFO';
-exports[1762] = 'ER_FOREIGN_DUPLICATE_KEY_WITHOUT_CHILD_INFO';
-exports[1763] = 'ER_SQLTHREAD_WITH_SECURE_REPLICA';
-exports[1764] = 'ER_TABLE_HAS_NO_FT';
-exports[1765] = 'ER_VARIABLE_NOT_SETTABLE_IN_SF_OR_TRIGGER';
-exports[1766] = 'ER_VARIABLE_NOT_SETTABLE_IN_TRANSACTION';
-exports[1767] = 'ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST';
-exports[1768] = 'ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION';
-exports[1769] = 'ER_SET_STATEMENT_CANNOT_INVOKE_FUNCTION';
-exports[1770] = 'ER_GTID_NEXT_CANT_BE_AUTOMATIC_IF_GTID_NEXT_LIST_IS_NON_NULL';
-exports[1771] = 'ER_SKIPPING_LOGGED_TRANSACTION';
-exports[1772] = 'ER_MALFORMED_GTID_SET_SPECIFICATION';
-exports[1773] = 'ER_MALFORMED_GTID_SET_ENCODING';
-exports[1774] = 'ER_MALFORMED_GTID_SPECIFICATION';
-exports[1775] = 'ER_GNO_EXHAUSTED';
-exports[1776] = 'ER_BAD_REPLICA_AUTO_POSITION';
-exports[1777] = 'ER_AUTO_POSITION_REQUIRES_GTID_MODE_NOT_OFF';
-exports[1778] = 'ER_CANT_DO_IMPLICIT_COMMIT_IN_TRX_WHEN_GTID_NEXT_IS_SET';
-exports[1779] = 'ER_GTID_MODE_ON_REQUIRES_ENFORCE_GTID_CONSISTENCY_ON';
-exports[1780] = 'ER_GTID_MODE_REQUIRES_BINLOG';
-exports[1781] = 'ER_CANT_SET_GTID_NEXT_TO_GTID_WHEN_GTID_MODE_IS_OFF';
-exports[1782] = 'ER_CANT_SET_GTID_NEXT_TO_ANONYMOUS_WHEN_GTID_MODE_IS_ON';
-exports[1783] = 'ER_CANT_SET_GTID_NEXT_LIST_TO_NON_NULL_WHEN_GTID_MODE_IS_OFF';
-exports[1784] = 'ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF';
-exports[1785] = 'ER_GTID_UNSAFE_NON_TRANSACTIONAL_TABLE';
-exports[1786] = 'ER_GTID_UNSAFE_CREATE_SELECT';
-exports[1787] = 'ER_GTID_UNSAFE_CREATE_DROP_TEMP_TABLE_IN_TRANSACTION';
-exports[1788] = 'ER_GTID_MODE_CAN_ONLY_CHANGE_ONE_STEP_AT_A_TIME';
-exports[1789] = 'ER_SOURCE_HAS_PURGED_REQUIRED_GTIDS';
-exports[1790] = 'ER_CANT_SET_GTID_NEXT_WHEN_OWNING_GTID';
-exports[1791] = 'ER_UNKNOWN_EXPLAIN_FORMAT';
-exports[1792] = 'ER_CANT_EXECUTE_IN_READ_ONLY_TRANSACTION';
-exports[1793] = 'ER_TOO_LONG_TABLE_PARTITION_COMMENT';
-exports[1794] = 'ER_REPLICA_CONFIGURATION';
-exports[1795] = 'ER_INNODB_FT_LIMIT';
-exports[1796] = 'ER_INNODB_NO_FT_TEMP_TABLE';
-exports[1797] = 'ER_INNODB_FT_WRONG_DOCID_COLUMN';
-exports[1798] = 'ER_INNODB_FT_WRONG_DOCID_INDEX';
-exports[1799] = 'ER_INNODB_ONLINE_LOG_TOO_BIG';
-exports[1800] = 'ER_UNKNOWN_ALTER_ALGORITHM';
-exports[1801] = 'ER_UNKNOWN_ALTER_LOCK';
-exports[1802] = 'ER_MTA_CHANGE_SOURCE_CANT_RUN_WITH_GAPS';
-exports[1803] = 'ER_MTA_RECOVERY_FAILURE';
-exports[1804] = 'ER_MTA_RESET_WORKERS';
-exports[1805] = 'ER_COL_COUNT_DOESNT_MATCH_CORRUPTED_V2';
-exports[1806] = 'ER_REPLICA_SILENT_RETRY_TRANSACTION';
-exports[1807] = 'ER_DISCARD_FK_CHECKS_RUNNING';
-exports[1808] = 'ER_TABLE_SCHEMA_MISMATCH';
-exports[1809] = 'ER_TABLE_IN_SYSTEM_TABLESPACE';
-exports[1810] = 'ER_IO_READ_ERROR';
-exports[1811] = 'ER_IO_WRITE_ERROR';
-exports[1812] = 'ER_TABLESPACE_MISSING';
-exports[1813] = 'ER_TABLESPACE_EXISTS';
-exports[1814] = 'ER_TABLESPACE_DISCARDED';
-exports[1815] = 'ER_INTERNAL_ERROR';
-exports[1816] = 'ER_INNODB_IMPORT_ERROR';
-exports[1817] = 'ER_INNODB_INDEX_CORRUPT';
-exports[1818] = 'ER_INVALID_YEAR_COLUMN_LENGTH';
-exports[1819] = 'ER_NOT_VALID_PASSWORD';
-exports[1820] = 'ER_MUST_CHANGE_PASSWORD';
-exports[1821] = 'ER_FK_NO_INDEX_CHILD';
-exports[1822] = 'ER_FK_NO_INDEX_PARENT';
-exports[1823] = 'ER_FK_FAIL_ADD_SYSTEM';
-exports[1824] = 'ER_FK_CANNOT_OPEN_PARENT';
-exports[1825] = 'ER_FK_INCORRECT_OPTION';
-exports[1826] = 'ER_FK_DUP_NAME';
-exports[1827] = 'ER_PASSWORD_FORMAT';
-exports[1828] = 'ER_FK_COLUMN_CANNOT_DROP';
-exports[1829] = 'ER_FK_COLUMN_CANNOT_DROP_CHILD';
-exports[1830] = 'ER_FK_COLUMN_NOT_NULL';
-exports[1831] = 'ER_DUP_INDEX';
-exports[1832] = 'ER_FK_COLUMN_CANNOT_CHANGE';
-exports[1833] = 'ER_FK_COLUMN_CANNOT_CHANGE_CHILD';
-exports[1834] = 'ER_UNUSED5';
-exports[1835] = 'ER_MALFORMED_PACKET';
-exports[1836] = 'ER_READ_ONLY_MODE';
-exports[1837] = 'ER_GTID_NEXT_TYPE_UNDEFINED_GTID';
-exports[1838] = 'ER_VARIABLE_NOT_SETTABLE_IN_SP';
-exports[1839] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF';
-exports[1840] = 'ER_CANT_SET_GTID_PURGED_WHEN_GTID_EXECUTED_IS_NOT_EMPTY';
-exports[1841] = 'ER_CANT_SET_GTID_PURGED_WHEN_OWNED_GTIDS_IS_NOT_EMPTY';
-exports[1842] = 'ER_GTID_PURGED_WAS_CHANGED';
-exports[1843] = 'ER_GTID_EXECUTED_WAS_CHANGED';
-exports[1844] = 'ER_BINLOG_STMT_MODE_AND_NO_REPL_TABLES';
-exports[1845] = 'ER_ALTER_OPERATION_NOT_SUPPORTED';
-exports[1846] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON';
-exports[1847] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COPY';
-exports[1848] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_PARTITION';
-exports[1849] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_RENAME';
-exports[1850] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE';
-exports[1851] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FK_CHECK';
-exports[1852] = 'ER_UNUSED6';
-exports[1853] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOPK';
-exports[1854] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_AUTOINC';
-exports[1855] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_HIDDEN_FTS';
-exports[1856] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_CHANGE_FTS';
-exports[1857] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_FTS';
-exports[1858] = 'ER_SQL_REPLICA_SKIP_COUNTER_NOT_SETTABLE_IN_GTID_MODE';
-exports[1859] = 'ER_DUP_UNKNOWN_IN_INDEX';
-exports[1860] = 'ER_IDENT_CAUSES_TOO_LONG_PATH';
-exports[1861] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_NOT_NULL';
-exports[1862] = 'ER_MUST_CHANGE_PASSWORD_LOGIN';
-exports[1863] = 'ER_ROW_IN_WRONG_PARTITION';
-exports[1864] = 'ER_MTA_EVENT_BIGGER_PENDING_JOBS_SIZE_MAX';
-exports[1865] = 'ER_INNODB_NO_FT_USES_PARSER';
-exports[1866] = 'ER_BINLOG_LOGICAL_CORRUPTION';
-exports[1867] = 'ER_WARN_PURGE_LOG_IN_USE';
-exports[1868] = 'ER_WARN_PURGE_LOG_IS_ACTIVE';
-exports[1869] = 'ER_AUTO_INCREMENT_CONFLICT';
-exports[1870] = 'WARN_ON_BLOCKHOLE_IN_RBR';
-exports[1871] = 'ER_REPLICA_CM_INIT_REPOSITORY';
-exports[1872] = 'ER_REPLICA_AM_INIT_REPOSITORY';
-exports[1873] = 'ER_ACCESS_DENIED_CHANGE_USER_ERROR';
-exports[1874] = 'ER_INNODB_READ_ONLY';
-exports[1875] = 'ER_STOP_REPLICA_SQL_THREAD_TIMEOUT';
-exports[1876] = 'ER_STOP_REPLICA_IO_THREAD_TIMEOUT';
-exports[1877] = 'ER_TABLE_CORRUPT';
-exports[1878] = 'ER_TEMP_FILE_WRITE_FAILURE';
-exports[1879] = 'ER_INNODB_FT_AUX_NOT_HEX_ID';
-exports[1880] = 'ER_OLD_TEMPORALS_UPGRADED';
-exports[1881] = 'ER_INNODB_FORCED_RECOVERY';
-exports[1882] = 'ER_AES_INVALID_IV';
-exports[1883] = 'ER_PLUGIN_CANNOT_BE_UNINSTALLED';
-exports[1884] = 'ER_GTID_UNSAFE_BINLOG_SPLITTABLE_STATEMENT_AND_ASSIGNED_GTID';
-exports[1885] = 'ER_REPLICA_HAS_MORE_GTIDS_THAN_SOURCE';
-exports[1886] = 'ER_MISSING_KEY';
-exports[1887] = 'WARN_NAMED_PIPE_ACCESS_EVERYONE';
-exports[3000] = 'ER_FILE_CORRUPT';
-exports[3001] = 'ER_ERROR_ON_SOURCE';
-exports[3002] = 'ER_INCONSISTENT_ERROR';
-exports[3003] = 'ER_STORAGE_ENGINE_NOT_LOADED';
-exports[3004] = 'ER_GET_STACKED_DA_WITHOUT_ACTIVE_HANDLER';
-exports[3005] = 'ER_WARN_LEGACY_SYNTAX_CONVERTED';
-exports[3006] = 'ER_BINLOG_UNSAFE_FULLTEXT_PLUGIN';
-exports[3007] = 'ER_CANNOT_DISCARD_TEMPORARY_TABLE';
-exports[3008] = 'ER_FK_DEPTH_EXCEEDED';
-exports[3009] = 'ER_COL_COUNT_DOESNT_MATCH_PLEASE_UPDATE_V2';
-exports[3010] = 'ER_WARN_TRIGGER_DOESNT_HAVE_CREATED';
-exports[3011] = 'ER_REFERENCED_TRG_DOES_NOT_EXIST';
-exports[3012] = 'ER_EXPLAIN_NOT_SUPPORTED';
-exports[3013] = 'ER_INVALID_FIELD_SIZE';
-exports[3014] = 'ER_MISSING_HA_CREATE_OPTION';
-exports[3015] = 'ER_ENGINE_OUT_OF_MEMORY';
-exports[3016] = 'ER_PASSWORD_EXPIRE_ANONYMOUS_USER';
-exports[3017] = 'ER_REPLICA_SQL_THREAD_MUST_STOP';
-exports[3018] = 'ER_NO_FT_MATERIALIZED_SUBQUERY';
-exports[3019] = 'ER_INNODB_UNDO_LOG_FULL';
-exports[3020] = 'ER_INVALID_ARGUMENT_FOR_LOGARITHM';
-exports[3021] = 'ER_REPLICA_CHANNEL_IO_THREAD_MUST_STOP';
-exports[3022] = 'ER_WARN_OPEN_TEMP_TABLES_MUST_BE_ZERO';
-exports[3023] = 'ER_WARN_ONLY_SOURCE_LOG_FILE_NO_POS';
-exports[3024] = 'ER_QUERY_TIMEOUT';
-exports[3025] = 'ER_NON_RO_SELECT_DISABLE_TIMER';
-exports[3026] = 'ER_DUP_LIST_ENTRY';
-exports[3027] = 'ER_SQL_MODE_NO_EFFECT';
-exports[3028] = 'ER_AGGREGATE_ORDER_FOR_UNION';
-exports[3029] = 'ER_AGGREGATE_ORDER_NON_AGG_QUERY';
-exports[3030] = 'ER_REPLICA_WORKER_STOPPED_PREVIOUS_THD_ERROR';
-exports[3031] = 'ER_DONT_SUPPORT_REPLICA_PRESERVE_COMMIT_ORDER';
-exports[3032] = 'ER_SERVER_OFFLINE_MODE';
-exports[3033] = 'ER_GIS_DIFFERENT_SRIDS';
-exports[3034] = 'ER_GIS_UNSUPPORTED_ARGUMENT';
-exports[3035] = 'ER_GIS_UNKNOWN_ERROR';
-exports[3036] = 'ER_GIS_UNKNOWN_EXCEPTION';
-exports[3037] = 'ER_GIS_INVALID_DATA';
-exports[3038] = 'ER_BOOST_GEOMETRY_EMPTY_INPUT_EXCEPTION';
-exports[3039] = 'ER_BOOST_GEOMETRY_CENTROID_EXCEPTION';
-exports[3040] = 'ER_BOOST_GEOMETRY_OVERLAY_INVALID_INPUT_EXCEPTION';
-exports[3041] = 'ER_BOOST_GEOMETRY_TURN_INFO_EXCEPTION';
-exports[3042] = 'ER_BOOST_GEOMETRY_SELF_INTERSECTION_POINT_EXCEPTION';
-exports[3043] = 'ER_BOOST_GEOMETRY_UNKNOWN_EXCEPTION';
-exports[3044] = 'ER_STD_BAD_ALLOC_ERROR';
-exports[3045] = 'ER_STD_DOMAIN_ERROR';
-exports[3046] = 'ER_STD_LENGTH_ERROR';
-exports[3047] = 'ER_STD_INVALID_ARGUMENT';
-exports[3048] = 'ER_STD_OUT_OF_RANGE_ERROR';
-exports[3049] = 'ER_STD_OVERFLOW_ERROR';
-exports[3050] = 'ER_STD_RANGE_ERROR';
-exports[3051] = 'ER_STD_UNDERFLOW_ERROR';
-exports[3052] = 'ER_STD_LOGIC_ERROR';
-exports[3053] = 'ER_STD_RUNTIME_ERROR';
-exports[3054] = 'ER_STD_UNKNOWN_EXCEPTION';
-exports[3055] = 'ER_GIS_DATA_WRONG_ENDIANESS';
-exports[3056] = 'ER_CHANGE_SOURCE_PASSWORD_LENGTH';
-exports[3057] = 'ER_USER_LOCK_WRONG_NAME';
-exports[3058] = 'ER_USER_LOCK_DEADLOCK';
-exports[3059] = 'ER_REPLACE_INACCESSIBLE_ROWS';
-exports[3060] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_GIS';
-exports[3061] = 'ER_ILLEGAL_USER_VAR';
-exports[3062] = 'ER_GTID_MODE_OFF';
-exports[3063] = 'ER_UNSUPPORTED_BY_REPLICATION_THREAD';
-exports[3064] = 'ER_INCORRECT_TYPE';
-exports[3065] = 'ER_FIELD_IN_ORDER_NOT_SELECT';
-exports[3066] = 'ER_AGGREGATE_IN_ORDER_NOT_SELECT';
-exports[3067] = 'ER_INVALID_RPL_WILD_TABLE_FILTER_PATTERN';
-exports[3068] = 'ER_NET_OK_PACKET_TOO_LARGE';
-exports[3069] = 'ER_INVALID_JSON_DATA';
-exports[3070] = 'ER_INVALID_GEOJSON_MISSING_MEMBER';
-exports[3071] = 'ER_INVALID_GEOJSON_WRONG_TYPE';
-exports[3072] = 'ER_INVALID_GEOJSON_UNSPECIFIED';
-exports[3073] = 'ER_DIMENSION_UNSUPPORTED';
-exports[3074] = 'ER_REPLICA_CHANNEL_DOES_NOT_EXIST';
-exports[3075] = 'ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT';
-exports[3076] = 'ER_REPLICA_CHANNEL_NAME_INVALID_OR_TOO_LONG';
-exports[3077] = 'ER_REPLICA_NEW_CHANNEL_WRONG_REPOSITORY';
-exports[3078] = 'ER_SLAVE_CHANNEL_DELETE';
-exports[3079] = 'ER_REPLICA_MULTIPLE_CHANNELS_CMD';
-exports[3080] = 'ER_REPLICA_MAX_CHANNELS_EXCEEDED';
-exports[3081] = 'ER_REPLICA_CHANNEL_MUST_STOP';
-exports[3082] = 'ER_REPLICA_CHANNEL_NOT_RUNNING';
-exports[3083] = 'ER_REPLICA_CHANNEL_WAS_RUNNING';
-exports[3084] = 'ER_REPLICA_CHANNEL_WAS_NOT_RUNNING';
-exports[3085] = 'ER_REPLICA_CHANNEL_SQL_THREAD_MUST_STOP';
-exports[3086] = 'ER_REPLICA_CHANNEL_SQL_SKIP_COUNTER';
-exports[3087] = 'ER_WRONG_FIELD_WITH_GROUP_V2';
-exports[3088] = 'ER_MIX_OF_GROUP_FUNC_AND_FIELDS_V2';
-exports[3089] = 'ER_WARN_DEPRECATED_SYSVAR_UPDATE';
-exports[3090] = 'ER_WARN_DEPRECATED_SQLMODE';
-exports[3091] = 'ER_CANNOT_LOG_PARTIAL_DROP_DATABASE_WITH_GTID';
-exports[3092] = 'ER_GROUP_REPLICATION_CONFIGURATION';
-exports[3093] = 'ER_GROUP_REPLICATION_RUNNING';
-exports[3094] = 'ER_GROUP_REPLICATION_APPLIER_INIT_ERROR';
-exports[3095] = 'ER_GROUP_REPLICATION_STOP_APPLIER_THREAD_TIMEOUT';
-exports[3096] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_SESSION_ERROR';
-exports[3097] = 'ER_GROUP_REPLICATION_COMMUNICATION_LAYER_JOIN_ERROR';
-exports[3098] = 'ER_BEFORE_DML_VALIDATION_ERROR';
-exports[3099] = 'ER_PREVENTS_VARIABLE_WITHOUT_RBR';
-exports[3100] = 'ER_RUN_HOOK_ERROR';
-exports[3101] = 'ER_TRANSACTION_ROLLBACK_DURING_COMMIT';
-exports[3102] = 'ER_GENERATED_COLUMN_FUNCTION_IS_NOT_ALLOWED';
-exports[3103] = 'ER_UNSUPPORTED_ALTER_INPLACE_ON_VIRTUAL_COLUMN';
-exports[3104] = 'ER_WRONG_FK_OPTION_FOR_GENERATED_COLUMN';
-exports[3105] = 'ER_NON_DEFAULT_VALUE_FOR_GENERATED_COLUMN';
-exports[3106] = 'ER_UNSUPPORTED_ACTION_ON_GENERATED_COLUMN';
-exports[3107] = 'ER_GENERATED_COLUMN_NON_PRIOR';
-exports[3108] = 'ER_DEPENDENT_BY_GENERATED_COLUMN';
-exports[3109] = 'ER_GENERATED_COLUMN_REF_AUTO_INC';
-exports[3110] = 'ER_FEATURE_NOT_AVAILABLE';
-exports[3111] = 'ER_CANT_SET_GTID_MODE';
-exports[3112] = 'ER_CANT_USE_AUTO_POSITION_WITH_GTID_MODE_OFF';
-exports[3113] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_AUTO_POSITION';
-exports[3114] = 'ER_CANT_REPLICATE_ANONYMOUS_WITH_GTID_MODE_ON';
-exports[3115] = 'ER_CANT_REPLICATE_GTID_WITH_GTID_MODE_OFF';
-exports[3116] =
-  'ER_CANT_ENFORCE_GTID_CONSISTENCY_WITH_ONGOING_GTID_VIOLATING_TX';
-exports[3117] =
-  'ER_ENFORCE_GTID_CONSISTENCY_WARN_WITH_ONGOING_GTID_VIOLATING_TX';
-exports[3118] = 'ER_ACCOUNT_HAS_BEEN_LOCKED';
-exports[3119] = 'ER_WRONG_TABLESPACE_NAME';
-exports[3120] = 'ER_TABLESPACE_IS_NOT_EMPTY';
-exports[3121] = 'ER_WRONG_FILE_NAME';
-exports[3122] = 'ER_BOOST_GEOMETRY_INCONSISTENT_TURNS_EXCEPTION';
-exports[3123] = 'ER_WARN_OPTIMIZER_HINT_SYNTAX_ERROR';
-exports[3124] = 'ER_WARN_BAD_MAX_EXECUTION_TIME';
-exports[3125] = 'ER_WARN_UNSUPPORTED_MAX_EXECUTION_TIME';
-exports[3126] = 'ER_WARN_CONFLICTING_HINT';
-exports[3127] = 'ER_WARN_UNKNOWN_QB_NAME';
-exports[3128] = 'ER_UNRESOLVED_HINT_NAME';
-exports[3129] = 'ER_WARN_ON_MODIFYING_GTID_EXECUTED_TABLE';
-exports[3130] = 'ER_PLUGGABLE_PROTOCOL_COMMAND_NOT_SUPPORTED';
-exports[3131] = 'ER_LOCKING_SERVICE_WRONG_NAME';
-exports[3132] = 'ER_LOCKING_SERVICE_DEADLOCK';
-exports[3133] = 'ER_LOCKING_SERVICE_TIMEOUT';
-exports[3134] = 'ER_GIS_MAX_POINTS_IN_GEOMETRY_OVERFLOWED';
-exports[3135] = 'ER_SQL_MODE_MERGED';
-exports[3136] = 'ER_VTOKEN_PLUGIN_TOKEN_MISMATCH';
-exports[3137] = 'ER_VTOKEN_PLUGIN_TOKEN_NOT_FOUND';
-exports[3138] = 'ER_CANT_SET_VARIABLE_WHEN_OWNING_GTID';
-exports[3139] = 'ER_REPLICA_CHANNEL_OPERATION_NOT_ALLOWED';
-exports[3140] = 'ER_INVALID_JSON_TEXT';
-exports[3141] = 'ER_INVALID_JSON_TEXT_IN_PARAM';
-exports[3142] = 'ER_INVALID_JSON_BINARY_DATA';
-exports[3143] = 'ER_INVALID_JSON_PATH';
-exports[3144] = 'ER_INVALID_JSON_CHARSET';
-exports[3145] = 'ER_INVALID_JSON_CHARSET_IN_FUNCTION';
-exports[3146] = 'ER_INVALID_TYPE_FOR_JSON';
-exports[3147] = 'ER_INVALID_CAST_TO_JSON';
-exports[3148] = 'ER_INVALID_JSON_PATH_CHARSET';
-exports[3149] = 'ER_INVALID_JSON_PATH_WILDCARD';
-exports[3150] = 'ER_JSON_VALUE_TOO_BIG';
-exports[3151] = 'ER_JSON_KEY_TOO_BIG';
-exports[3152] = 'ER_JSON_USED_AS_KEY';
-exports[3153] = 'ER_JSON_VACUOUS_PATH';
-exports[3154] = 'ER_JSON_BAD_ONE_OR_ALL_ARG';
-exports[3155] = 'ER_NUMERIC_JSON_VALUE_OUT_OF_RANGE';
-exports[3156] = 'ER_INVALID_JSON_VALUE_FOR_CAST';
-exports[3157] = 'ER_JSON_DOCUMENT_TOO_DEEP';
-exports[3158] = 'ER_JSON_DOCUMENT_NULL_KEY';
-exports[3159] = 'ER_SECURE_TRANSPORT_REQUIRED';
-exports[3160] = 'ER_NO_SECURE_TRANSPORTS_CONFIGURED';
-exports[3161] = 'ER_DISABLED_STORAGE_ENGINE';
-exports[3162] = 'ER_USER_DOES_NOT_EXIST';
-exports[3163] = 'ER_USER_ALREADY_EXISTS';
-exports[3164] = 'ER_AUDIT_API_ABORT';
-exports[3165] = 'ER_INVALID_JSON_PATH_ARRAY_CELL';
-exports[3166] = 'ER_BUFPOOL_RESIZE_INPROGRESS';
-exports[3167] = 'ER_FEATURE_DISABLED_SEE_DOC';
-exports[3168] = 'ER_SERVER_ISNT_AVAILABLE';
-exports[3169] = 'ER_SESSION_WAS_KILLED';
-exports[3170] = 'ER_CAPACITY_EXCEEDED';
-exports[3171] = 'ER_CAPACITY_EXCEEDED_IN_RANGE_OPTIMIZER';
-exports[3172] = 'ER_TABLE_NEEDS_UPG_PART';
-exports[3173] = 'ER_CANT_WAIT_FOR_EXECUTED_GTID_SET_WHILE_OWNING_A_GTID';
-exports[3174] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_VIRTUAL';
-exports[3175] = 'ER_CANNOT_CREATE_VIRTUAL_INDEX_CONSTRAINT';
-exports[3176] = 'ER_ERROR_ON_MODIFYING_GTID_EXECUTED_TABLE';
-exports[3177] = 'ER_LOCK_REFUSED_BY_ENGINE';
-exports[3178] = 'ER_UNSUPPORTED_ALTER_ONLINE_ON_VIRTUAL_COLUMN';
-exports[3179] = 'ER_MASTER_KEY_ROTATION_NOT_SUPPORTED_BY_SE';
-exports[3180] = 'ER_MASTER_KEY_ROTATION_ERROR_BY_SE';
-exports[3181] = 'ER_MASTER_KEY_ROTATION_BINLOG_FAILED';
-exports[3182] = 'ER_MASTER_KEY_ROTATION_SE_UNAVAILABLE';
-exports[3183] = 'ER_TABLESPACE_CANNOT_ENCRYPT';
-exports[3184] = 'ER_INVALID_ENCRYPTION_OPTION';
-exports[3185] = 'ER_CANNOT_FIND_KEY_IN_KEYRING';
-exports[3186] = 'ER_CAPACITY_EXCEEDED_IN_PARSER';
-exports[3187] = 'ER_UNSUPPORTED_ALTER_ENCRYPTION_INPLACE';
-exports[3188] = 'ER_KEYRING_UDF_KEYRING_SERVICE_ERROR';
-exports[3189] = 'ER_USER_COLUMN_OLD_LENGTH';
-exports[3190] = 'ER_CANT_RESET_SOURCE';
-exports[3191] = 'ER_GROUP_REPLICATION_MAX_GROUP_SIZE';
-exports[3192] = 'ER_CANNOT_ADD_FOREIGN_BASE_COL_STORED';
-exports[3193] = 'ER_TABLE_REFERENCED';
-exports[3194] = 'ER_PARTITION_ENGINE_DEPRECATED_FOR_TABLE';
-exports[3195] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID_ZERO';
-exports[3196] = 'ER_WARN_USING_GEOMFROMWKB_TO_SET_SRID';
-exports[3197] = 'ER_XA_RETRY';
-exports[3198] = 'ER_KEYRING_AWS_UDF_AWS_KMS_ERROR';
-exports[3199] = 'ER_BINLOG_UNSAFE_XA';
-exports[3200] = 'ER_UDF_ERROR';
-exports[3201] = 'ER_KEYRING_MIGRATION_FAILURE';
-exports[3202] = 'ER_KEYRING_ACCESS_DENIED_ERROR';
-exports[3203] = 'ER_KEYRING_MIGRATION_STATUS';
-exports[3204] = 'ER_PLUGIN_FAILED_TO_OPEN_TABLES';
-exports[3205] = 'ER_PLUGIN_FAILED_TO_OPEN_TABLE';
-exports[3206] = 'ER_AUDIT_LOG_NO_KEYRING_PLUGIN_INSTALLED';
-exports[3207] = 'ER_AUDIT_LOG_ENCRYPTION_PASSWORD_HAS_NOT_BEEN_SET';
-exports[3208] = 'ER_AUDIT_LOG_COULD_NOT_CREATE_AES_KEY';
-exports[3209] = 'ER_AUDIT_LOG_ENCRYPTION_PASSWORD_CANNOT_BE_FETCHED';
-exports[3210] = 'ER_AUDIT_LOG_JSON_FILTERING_NOT_ENABLED';
-exports[3211] = 'ER_AUDIT_LOG_UDF_INSUFFICIENT_PRIVILEGE';
-exports[3212] = 'ER_AUDIT_LOG_SUPER_PRIVILEGE_REQUIRED';
-exports[3213] = 'ER_COULD_NOT_REINITIALIZE_AUDIT_LOG_FILTERS';
-exports[3214] = 'ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_TYPE';
-exports[3215] = 'ER_AUDIT_LOG_UDF_INVALID_ARGUMENT_COUNT';
-exports[3216] = 'ER_AUDIT_LOG_HAS_NOT_BEEN_INSTALLED';
-exports[3217] = 'ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_TYPE';
-exports[3218] = 'ER_AUDIT_LOG_UDF_READ_INVALID_MAX_ARRAY_LENGTH_ARG_VALUE';
-exports[3219] = 'ER_AUDIT_LOG_JSON_FILTER_PARSING_ERROR';
-exports[3220] = 'ER_AUDIT_LOG_JSON_FILTER_NAME_CANNOT_BE_EMPTY';
-exports[3221] = 'ER_AUDIT_LOG_JSON_USER_NAME_CANNOT_BE_EMPTY';
-exports[3222] = 'ER_AUDIT_LOG_JSON_FILTER_DOES_NOT_EXISTS';
-exports[3223] = 'ER_AUDIT_LOG_USER_FIRST_CHARACTER_MUST_BE_ALPHANUMERIC';
-exports[3224] = 'ER_AUDIT_LOG_USER_NAME_INVALID_CHARACTER';
-exports[3225] = 'ER_AUDIT_LOG_HOST_NAME_INVALID_CHARACTER';
-exports[3226] = 'WARN_DEPRECATED_MAXDB_SQL_MODE_FOR_TIMESTAMP';
-exports[3227] = 'ER_XA_REPLICATION_FILTERS';
-exports[3228] = 'ER_CANT_OPEN_ERROR_LOG';
-exports[3229] = 'ER_GROUPING_ON_TIMESTAMP_IN_DST';
-exports[3230] = 'ER_CANT_START_SERVER_NAMED_PIPE';
-exports[3231] = 'ER_WRITE_SET_EXCEEDS_LIMIT';
-exports[3232] = 'ER_DEPRECATED_TLS_VERSION_SESSION_57';
-exports[3233] = 'ER_WARN_DEPRECATED_TLS_VERSION_57';
-exports[3234] = 'ER_WARN_WRONG_NATIVE_TABLE_STRUCTURE';
-exports[3235] = 'ER_AES_INVALID_KDF_NAME';
-exports[3236] = 'ER_AES_INVALID_KDF_ITERATIONS';
-exports[3237] = 'WARN_AES_KEY_SIZE';
-exports[3238] = 'ER_AES_INVALID_KDF_OPTION_SIZE';
-exports[3500] = 'ER_UNSUPPORT_COMPRESSED_TEMPORARY_TABLE';
-exports[3501] = 'ER_ACL_OPERATION_FAILED';
-exports[3502] = 'ER_UNSUPPORTED_INDEX_ALGORITHM';
-exports[3503] = 'ER_NO_SUCH_DB';
-exports[3504] = 'ER_TOO_BIG_ENUM';
-exports[3505] = 'ER_TOO_LONG_SET_ENUM_VALUE';
-exports[3506] = 'ER_INVALID_DD_OBJECT';
-exports[3507] = 'ER_UPDATING_DD_TABLE';
-exports[3508] = 'ER_INVALID_DD_OBJECT_ID';
-exports[3509] = 'ER_INVALID_DD_OBJECT_NAME';
-exports[3510] = 'ER_TABLESPACE_MISSING_WITH_NAME';
-exports[3511] = 'ER_TOO_LONG_ROUTINE_COMMENT';
-exports[3512] = 'ER_SP_LOAD_FAILED';
-exports[3513] = 'ER_INVALID_BITWISE_OPERANDS_SIZE';
-exports[3514] = 'ER_INVALID_BITWISE_AGGREGATE_OPERANDS_SIZE';
-exports[3515] = 'ER_WARN_UNSUPPORTED_HINT';
-exports[3516] = 'ER_UNEXPECTED_GEOMETRY_TYPE';
-exports[3517] = 'ER_SRS_PARSE_ERROR';
-exports[3518] = 'ER_SRS_PROJ_PARAMETER_MISSING';
-exports[3519] = 'ER_WARN_SRS_NOT_FOUND';
-exports[3520] = 'ER_SRS_NOT_CARTESIAN';
-exports[3521] = 'ER_SRS_NOT_CARTESIAN_UNDEFINED';
-exports[3522] = 'ER_PK_INDEX_CANT_BE_INVISIBLE';
-exports[3523] = 'ER_UNKNOWN_AUTHID';
-exports[3524] = 'ER_FAILED_ROLE_GRANT';
-exports[3525] = 'ER_OPEN_ROLE_TABLES';
-exports[3526] = 'ER_FAILED_DEFAULT_ROLES';
-exports[3527] = 'ER_COMPONENTS_NO_SCHEME';
-exports[3528] = 'ER_COMPONENTS_NO_SCHEME_SERVICE';
-exports[3529] = 'ER_COMPONENTS_CANT_LOAD';
-exports[3530] = 'ER_ROLE_NOT_GRANTED';
-exports[3531] = 'ER_FAILED_REVOKE_ROLE';
-exports[3532] = 'ER_RENAME_ROLE';
-exports[3533] = 'ER_COMPONENTS_CANT_ACQUIRE_SERVICE_IMPLEMENTATION';
-exports[3534] = 'ER_COMPONENTS_CANT_SATISFY_DEPENDENCY';
-exports[3535] = 'ER_COMPONENTS_LOAD_CANT_REGISTER_SERVICE_IMPLEMENTATION';
-exports[3536] = 'ER_COMPONENTS_LOAD_CANT_INITIALIZE';
-exports[3537] = 'ER_COMPONENTS_UNLOAD_NOT_LOADED';
-exports[3538] = 'ER_COMPONENTS_UNLOAD_CANT_DEINITIALIZE';
-exports[3539] = 'ER_COMPONENTS_CANT_RELEASE_SERVICE';
-exports[3540] = 'ER_COMPONENTS_UNLOAD_CANT_UNREGISTER_SERVICE';
-exports[3541] = 'ER_COMPONENTS_CANT_UNLOAD';
-exports[3542] = 'ER_WARN_UNLOAD_THE_NOT_PERSISTED';
-exports[3543] = 'ER_COMPONENT_TABLE_INCORRECT';
-exports[3544] = 'ER_COMPONENT_MANIPULATE_ROW_FAILED';
-exports[3545] = 'ER_COMPONENTS_UNLOAD_DUPLICATE_IN_GROUP';
-exports[3546] = 'ER_CANT_SET_GTID_PURGED_DUE_SETS_CONSTRAINTS';
-exports[3547] = 'ER_CANNOT_LOCK_USER_MANAGEMENT_CACHES';
-exports[3548] = 'ER_SRS_NOT_FOUND';
-exports[3549] = 'ER_VARIABLE_NOT_PERSISTED';
-exports[3550] = 'ER_IS_QUERY_INVALID_CLAUSE';
-exports[3551] = 'ER_UNABLE_TO_STORE_STATISTICS';
-exports[3552] = 'ER_NO_SYSTEM_SCHEMA_ACCESS';
-exports[3553] = 'ER_NO_SYSTEM_TABLESPACE_ACCESS';
-exports[3554] = 'ER_NO_SYSTEM_TABLE_ACCESS';
-exports[3555] = 'ER_NO_SYSTEM_TABLE_ACCESS_FOR_DICTIONARY_TABLE';
-exports[3556] = 'ER_NO_SYSTEM_TABLE_ACCESS_FOR_SYSTEM_TABLE';
-exports[3557] = 'ER_NO_SYSTEM_TABLE_ACCESS_FOR_TABLE';
-exports[3558] = 'ER_INVALID_OPTION_KEY';
-exports[3559] = 'ER_INVALID_OPTION_VALUE';
-exports[3560] = 'ER_INVALID_OPTION_KEY_VALUE_PAIR';
-exports[3561] = 'ER_INVALID_OPTION_START_CHARACTER';
-exports[3562] = 'ER_INVALID_OPTION_END_CHARACTER';
-exports[3563] = 'ER_INVALID_OPTION_CHARACTERS';
-exports[3564] = 'ER_DUPLICATE_OPTION_KEY';
-exports[3565] = 'ER_WARN_SRS_NOT_FOUND_AXIS_ORDER';
-exports[3566] = 'ER_NO_ACCESS_TO_NATIVE_FCT';
-exports[3567] = 'ER_RESET_SOURCE_TO_VALUE_OUT_OF_RANGE';
-exports[3568] = 'ER_UNRESOLVED_TABLE_LOCK';
-exports[3569] = 'ER_DUPLICATE_TABLE_LOCK';
-exports[3570] = 'ER_BINLOG_UNSAFE_SKIP_LOCKED';
-exports[3571] = 'ER_BINLOG_UNSAFE_NOWAIT';
-exports[3572] = 'ER_LOCK_NOWAIT';
-exports[3573] = 'ER_CTE_RECURSIVE_REQUIRES_UNION';
-exports[3574] = 'ER_CTE_RECURSIVE_REQUIRES_NONRECURSIVE_FIRST';
-exports[3575] = 'ER_CTE_RECURSIVE_FORBIDS_AGGREGATION';
-exports[3576] = 'ER_CTE_RECURSIVE_FORBIDDEN_JOIN_ORDER';
-exports[3577] = 'ER_CTE_RECURSIVE_REQUIRES_SINGLE_REFERENCE';
-exports[3578] = 'ER_SWITCH_TMP_ENGINE';
-exports[3579] = 'ER_WINDOW_NO_SUCH_WINDOW';
-exports[3580] = 'ER_WINDOW_CIRCULARITY_IN_WINDOW_GRAPH';
-exports[3581] = 'ER_WINDOW_NO_CHILD_PARTITIONING';
-exports[3582] = 'ER_WINDOW_NO_INHERIT_FRAME';
-exports[3583] = 'ER_WINDOW_NO_REDEFINE_ORDER_BY';
-exports[3584] = 'ER_WINDOW_FRAME_START_ILLEGAL';
-exports[3585] = 'ER_WINDOW_FRAME_END_ILLEGAL';
-exports[3586] = 'ER_WINDOW_FRAME_ILLEGAL';
-exports[3587] = 'ER_WINDOW_RANGE_FRAME_ORDER_TYPE';
-exports[3588] = 'ER_WINDOW_RANGE_FRAME_TEMPORAL_TYPE';
-exports[3589] = 'ER_WINDOW_RANGE_FRAME_NUMERIC_TYPE';
-exports[3590] = 'ER_WINDOW_RANGE_BOUND_NOT_CONSTANT';
-exports[3591] = 'ER_WINDOW_DUPLICATE_NAME';
-exports[3592] = 'ER_WINDOW_ILLEGAL_ORDER_BY';
-exports[3593] = 'ER_WINDOW_INVALID_WINDOW_FUNC_USE';
-exports[3594] = 'ER_WINDOW_INVALID_WINDOW_FUNC_ALIAS_USE';
-exports[3595] = 'ER_WINDOW_NESTED_WINDOW_FUNC_USE_IN_WINDOW_SPEC';
-exports[3596] = 'ER_WINDOW_ROWS_INTERVAL_USE';
-exports[3597] = 'ER_WINDOW_NO_GROUP_ORDER';
-exports[3598] = 'ER_WINDOW_EXPLAIN_JSON';
-exports[3599] = 'ER_WINDOW_FUNCTION_IGNORES_FRAME';
-exports[3600] = 'ER_WL9236_NOW';
-exports[3601] = 'ER_INVALID_NO_OF_ARGS';
-exports[3602] = 'ER_FIELD_IN_GROUPING_NOT_GROUP_BY';
-exports[3603] = 'ER_TOO_LONG_TABLESPACE_COMMENT';
-exports[3604] = 'ER_ENGINE_CANT_DROP_TABLE';
-exports[3605] = 'ER_ENGINE_CANT_DROP_MISSING_TABLE';
-exports[3606] = 'ER_TABLESPACE_DUP_FILENAME';
-exports[3607] = 'ER_DB_DROP_RMDIR2';
-exports[3608] = 'ER_IMP_NO_FILES_MATCHED';
-exports[3609] = 'ER_IMP_SCHEMA_DOES_NOT_EXIST';
-exports[3610] = 'ER_IMP_TABLE_ALREADY_EXISTS';
-exports[3611] = 'ER_IMP_INCOMPATIBLE_MYSQLD_VERSION';
-exports[3612] = 'ER_IMP_INCOMPATIBLE_DD_VERSION';
-exports[3613] = 'ER_IMP_INCOMPATIBLE_SDI_VERSION';
-exports[3614] = 'ER_WARN_INVALID_HINT';
-exports[3615] = 'ER_VAR_DOES_NOT_EXIST';
-exports[3616] = 'ER_LONGITUDE_OUT_OF_RANGE';
-exports[3617] = 'ER_LATITUDE_OUT_OF_RANGE';
-exports[3618] = 'ER_NOT_IMPLEMENTED_FOR_GEOGRAPHIC_SRS';
-exports[3619] = 'ER_ILLEGAL_PRIVILEGE_LEVEL';
-exports[3620] = 'ER_NO_SYSTEM_VIEW_ACCESS';
-exports[3621] = 'ER_COMPONENT_FILTER_FLABBERGASTED';
-exports[3622] = 'ER_PART_EXPR_TOO_LONG';
-exports[3623] = 'ER_UDF_DROP_DYNAMICALLY_REGISTERED';
-exports[3624] = 'ER_UNABLE_TO_STORE_COLUMN_STATISTICS';
-exports[3625] = 'ER_UNABLE_TO_UPDATE_COLUMN_STATISTICS';
-exports[3626] = 'ER_UNABLE_TO_DROP_COLUMN_STATISTICS';
-exports[3627] = 'ER_UNABLE_TO_BUILD_HISTOGRAM';
-exports[3628] = 'ER_MANDATORY_ROLE';
-exports[3629] = 'ER_MISSING_TABLESPACE_FILE';
-exports[3630] = 'ER_PERSIST_ONLY_ACCESS_DENIED_ERROR';
-exports[3631] = 'ER_CMD_NEED_SUPER';
-exports[3632] = 'ER_PATH_IN_DATADIR';
-exports[3633] = 'ER_CLONE_DDL_IN_PROGRESS';
-exports[3634] = 'ER_CLONE_TOO_MANY_CONCURRENT_CLONES';
-exports[3635] = 'ER_APPLIER_LOG_EVENT_VALIDATION_ERROR';
-exports[3636] = 'ER_CTE_MAX_RECURSION_DEPTH';
-exports[3637] = 'ER_NOT_HINT_UPDATABLE_VARIABLE';
-exports[3638] = 'ER_CREDENTIALS_CONTRADICT_TO_HISTORY';
-exports[3639] = 'ER_WARNING_PASSWORD_HISTORY_CLAUSES_VOID';
-exports[3640] = 'ER_CLIENT_DOES_NOT_SUPPORT';
-exports[3641] = 'ER_I_S_SKIPPED_TABLESPACE';
-exports[3642] = 'ER_TABLESPACE_ENGINE_MISMATCH';
-exports[3643] = 'ER_WRONG_SRID_FOR_COLUMN';
-exports[3644] = 'ER_CANNOT_ALTER_SRID_DUE_TO_INDEX';
-exports[3645] = 'ER_WARN_BINLOG_PARTIAL_UPDATES_DISABLED';
-exports[3646] = 'ER_WARN_BINLOG_V1_ROW_EVENTS_DISABLED';
-exports[3647] = 'ER_WARN_BINLOG_PARTIAL_UPDATES_SUGGESTS_PARTIAL_IMAGES';
-exports[3648] = 'ER_COULD_NOT_APPLY_JSON_DIFF';
-exports[3649] = 'ER_CORRUPTED_JSON_DIFF';
-exports[3650] = 'ER_RESOURCE_GROUP_EXISTS';
-exports[3651] = 'ER_RESOURCE_GROUP_NOT_EXISTS';
-exports[3652] = 'ER_INVALID_VCPU_ID';
-exports[3653] = 'ER_INVALID_VCPU_RANGE';
-exports[3654] = 'ER_INVALID_THREAD_PRIORITY';
-exports[3655] = 'ER_DISALLOWED_OPERATION';
-exports[3656] = 'ER_RESOURCE_GROUP_BUSY';
-exports[3657] = 'ER_RESOURCE_GROUP_DISABLED';
-exports[3658] = 'ER_FEATURE_UNSUPPORTED';
-exports[3659] = 'ER_ATTRIBUTE_IGNORED';
-exports[3660] = 'ER_INVALID_THREAD_ID';
-exports[3661] = 'ER_RESOURCE_GROUP_BIND_FAILED';
-exports[3662] = 'ER_INVALID_USE_OF_FORCE_OPTION';
-exports[3663] = 'ER_GROUP_REPLICATION_COMMAND_FAILURE';
-exports[3664] = 'ER_SDI_OPERATION_FAILED';
-exports[3665] = 'ER_MISSING_JSON_TABLE_VALUE';
-exports[3666] = 'ER_WRONG_JSON_TABLE_VALUE';
-exports[3667] = 'ER_TF_MUST_HAVE_ALIAS';
-exports[3668] = 'ER_TF_FORBIDDEN_JOIN_TYPE';
-exports[3669] = 'ER_JT_VALUE_OUT_OF_RANGE';
-exports[3670] = 'ER_JT_MAX_NESTED_PATH';
-exports[3671] = 'ER_PASSWORD_EXPIRATION_NOT_SUPPORTED_BY_AUTH_METHOD';
-exports[3672] = 'ER_INVALID_GEOJSON_CRS_NOT_TOP_LEVEL';
-exports[3673] = 'ER_BAD_NULL_ERROR_NOT_IGNORED';
-exports[3674] = 'WARN_USELESS_SPATIAL_INDEX';
-exports[3675] = 'ER_DISK_FULL_NOWAIT';
-exports[3676] = 'ER_PARSE_ERROR_IN_DIGEST_FN';
-exports[3677] = 'ER_UNDISCLOSED_PARSE_ERROR_IN_DIGEST_FN';
-exports[3678] = 'ER_SCHEMA_DIR_EXISTS';
-exports[3679] = 'ER_SCHEMA_DIR_MISSING';
-exports[3680] = 'ER_SCHEMA_DIR_CREATE_FAILED';
-exports[3681] = 'ER_SCHEMA_DIR_UNKNOWN';
-exports[3682] = 'ER_ONLY_IMPLEMENTED_FOR_SRID_0_AND_4326';
-exports[3683] = 'ER_BINLOG_EXPIRE_LOG_DAYS_AND_SECS_USED_TOGETHER';
-exports[3684] = 'ER_REGEXP_BUFFER_OVERFLOW';
-exports[3685] = 'ER_REGEXP_ILLEGAL_ARGUMENT';
-exports[3686] = 'ER_REGEXP_INDEX_OUTOFBOUNDS_ERROR';
-exports[3687] = 'ER_REGEXP_INTERNAL_ERROR';
-exports[3688] = 'ER_REGEXP_RULE_SYNTAX';
-exports[3689] = 'ER_REGEXP_BAD_ESCAPE_SEQUENCE';
-exports[3690] = 'ER_REGEXP_UNIMPLEMENTED';
-exports[3691] = 'ER_REGEXP_MISMATCHED_PAREN';
-exports[3692] = 'ER_REGEXP_BAD_INTERVAL';
-exports[3693] = 'ER_REGEXP_MAX_LT_MIN';
-exports[3694] = 'ER_REGEXP_INVALID_BACK_REF';
-exports[3695] = 'ER_REGEXP_LOOK_BEHIND_LIMIT';
-exports[3696] = 'ER_REGEXP_MISSING_CLOSE_BRACKET';
-exports[3697] = 'ER_REGEXP_INVALID_RANGE';
-exports[3698] = 'ER_REGEXP_STACK_OVERFLOW';
-exports[3699] = 'ER_REGEXP_TIME_OUT';
-exports[3700] = 'ER_REGEXP_PATTERN_TOO_BIG';
-exports[3701] = 'ER_CANT_SET_ERROR_LOG_SERVICE';
-exports[3702] = 'ER_EMPTY_PIPELINE_FOR_ERROR_LOG_SERVICE';
-exports[3703] = 'ER_COMPONENT_FILTER_DIAGNOSTICS';
-exports[3704] = 'ER_NOT_IMPLEMENTED_FOR_CARTESIAN_SRS';
-exports[3705] = 'ER_NOT_IMPLEMENTED_FOR_PROJECTED_SRS';
-exports[3706] = 'ER_NONPOSITIVE_RADIUS';
-exports[3707] = 'ER_RESTART_SERVER_FAILED';
-exports[3708] = 'ER_SRS_MISSING_MANDATORY_ATTRIBUTE';
-exports[3709] = 'ER_SRS_MULTIPLE_ATTRIBUTE_DEFINITIONS';
-exports[3710] = 'ER_SRS_NAME_CANT_BE_EMPTY_OR_WHITESPACE';
-exports[3711] = 'ER_SRS_ORGANIZATION_CANT_BE_EMPTY_OR_WHITESPACE';
-exports[3712] = 'ER_SRS_ID_ALREADY_EXISTS';
-exports[3713] = 'ER_WARN_SRS_ID_ALREADY_EXISTS';
-exports[3714] = 'ER_CANT_MODIFY_SRID_0';
-exports[3715] = 'ER_WARN_RESERVED_SRID_RANGE';
-exports[3716] = 'ER_CANT_MODIFY_SRS_USED_BY_COLUMN';
-exports[3717] = 'ER_SRS_INVALID_CHARACTER_IN_ATTRIBUTE';
-exports[3718] = 'ER_SRS_ATTRIBUTE_STRING_TOO_LONG';
-exports[3719] = 'ER_DEPRECATED_UTF8_ALIAS';
-exports[3720] = 'ER_DEPRECATED_NATIONAL';
-exports[3721] = 'ER_INVALID_DEFAULT_UTF8MB4_COLLATION';
-exports[3722] = 'ER_UNABLE_TO_COLLECT_LOG_STATUS';
-exports[3723] = 'ER_RESERVED_TABLESPACE_NAME';
-exports[3724] = 'ER_UNABLE_TO_SET_OPTION';
-exports[3725] = 'ER_REPLICA_POSSIBLY_DIVERGED_AFTER_DDL';
-exports[3726] = 'ER_SRS_NOT_GEOGRAPHIC';
-exports[3727] = 'ER_POLYGON_TOO_LARGE';
-exports[3728] = 'ER_SPATIAL_UNIQUE_INDEX';
-exports[3729] = 'ER_INDEX_TYPE_NOT_SUPPORTED_FOR_SPATIAL_INDEX';
-exports[3730] = 'ER_FK_CANNOT_DROP_PARENT';
-exports[3731] = 'ER_GEOMETRY_PARAM_LONGITUDE_OUT_OF_RANGE';
-exports[3732] = 'ER_GEOMETRY_PARAM_LATITUDE_OUT_OF_RANGE';
-exports[3733] = 'ER_FK_CANNOT_USE_VIRTUAL_COLUMN';
-exports[3734] = 'ER_FK_NO_COLUMN_PARENT';
-exports[3735] = 'ER_CANT_SET_ERROR_SUPPRESSION_LIST';
-exports[3736] = 'ER_SRS_GEOGCS_INVALID_AXES';
-exports[3737] = 'ER_SRS_INVALID_SEMI_MAJOR_AXIS';
-exports[3738] = 'ER_SRS_INVALID_INVERSE_FLATTENING';
-exports[3739] = 'ER_SRS_INVALID_ANGULAR_UNIT';
-exports[3740] = 'ER_SRS_INVALID_PRIME_MERIDIAN';
-exports[3741] = 'ER_TRANSFORM_SOURCE_SRS_NOT_SUPPORTED';
-exports[3742] = 'ER_TRANSFORM_TARGET_SRS_NOT_SUPPORTED';
-exports[3743] = 'ER_TRANSFORM_SOURCE_SRS_MISSING_TOWGS84';
-exports[3744] = 'ER_TRANSFORM_TARGET_SRS_MISSING_TOWGS84';
-exports[3745] = 'ER_TEMP_TABLE_PREVENTS_SWITCH_SESSION_BINLOG_FORMAT';
-exports[3746] = 'ER_TEMP_TABLE_PREVENTS_SWITCH_GLOBAL_BINLOG_FORMAT';
-exports[3747] = 'ER_RUNNING_APPLIER_PREVENTS_SWITCH_GLOBAL_BINLOG_FORMAT';
-exports[3748] = 'ER_CLIENT_GTID_UNSAFE_CREATE_DROP_TEMP_TABLE_IN_TRX_IN_SBR';
-exports[3749] = 'ER_XA_CANT_CREATE_MDL_BACKUP';
-exports[3750] = 'ER_TABLE_WITHOUT_PK';
-exports[3751] = 'ER_WARN_DATA_TRUNCATED_FUNCTIONAL_INDEX';
-exports[3752] = 'ER_WARN_DATA_OUT_OF_RANGE_FUNCTIONAL_INDEX';
-exports[3753] = 'ER_FUNCTIONAL_INDEX_ON_JSON_OR_GEOMETRY_FUNCTION';
-exports[3754] = 'ER_FUNCTIONAL_INDEX_REF_AUTO_INCREMENT';
-exports[3755] = 'ER_CANNOT_DROP_COLUMN_FUNCTIONAL_INDEX';
-exports[3756] = 'ER_FUNCTIONAL_INDEX_PRIMARY_KEY';
-exports[3757] = 'ER_FUNCTIONAL_INDEX_ON_LOB';
-exports[3758] = 'ER_FUNCTIONAL_INDEX_FUNCTION_IS_NOT_ALLOWED';
-exports[3759] = 'ER_FULLTEXT_FUNCTIONAL_INDEX';
-exports[3760] = 'ER_SPATIAL_FUNCTIONAL_INDEX';
-exports[3761] = 'ER_WRONG_KEY_COLUMN_FUNCTIONAL_INDEX';
-exports[3762] = 'ER_FUNCTIONAL_INDEX_ON_FIELD';
-exports[3763] = 'ER_GENERATED_COLUMN_NAMED_FUNCTION_IS_NOT_ALLOWED';
-exports[3764] = 'ER_GENERATED_COLUMN_ROW_VALUE';
-exports[3765] = 'ER_GENERATED_COLUMN_VARIABLES';
-exports[3766] = 'ER_DEPENDENT_BY_DEFAULT_GENERATED_VALUE';
-exports[3767] = 'ER_DEFAULT_VAL_GENERATED_NON_PRIOR';
-exports[3768] = 'ER_DEFAULT_VAL_GENERATED_REF_AUTO_INC';
-exports[3769] = 'ER_DEFAULT_VAL_GENERATED_FUNCTION_IS_NOT_ALLOWED';
-exports[3770] = 'ER_DEFAULT_VAL_GENERATED_NAMED_FUNCTION_IS_NOT_ALLOWED';
-exports[3771] = 'ER_DEFAULT_VAL_GENERATED_ROW_VALUE';
-exports[3772] = 'ER_DEFAULT_VAL_GENERATED_VARIABLES';
-exports[3773] = 'ER_DEFAULT_AS_VAL_GENERATED';
-exports[3774] = 'ER_UNSUPPORTED_ACTION_ON_DEFAULT_VAL_GENERATED';
-exports[3775] = 'ER_GTID_UNSAFE_ALTER_ADD_COL_WITH_DEFAULT_EXPRESSION';
-exports[3776] = 'ER_FK_CANNOT_CHANGE_ENGINE';
-exports[3777] = 'ER_WARN_DEPRECATED_USER_SET_EXPR';
-exports[3778] = 'ER_WARN_DEPRECATED_UTF8MB3_COLLATION';
-exports[3779] = 'ER_WARN_DEPRECATED_NESTED_COMMENT_SYNTAX';
-exports[3780] = 'ER_FK_INCOMPATIBLE_COLUMNS';
-exports[3781] = 'ER_GR_HOLD_WAIT_TIMEOUT';
-exports[3782] = 'ER_GR_HOLD_KILLED';
-exports[3783] = 'ER_GR_HOLD_MEMBER_STATUS_ERROR';
-exports[3784] = 'ER_RPL_ENCRYPTION_FAILED_TO_FETCH_KEY';
-exports[3785] = 'ER_RPL_ENCRYPTION_KEY_NOT_FOUND';
-exports[3786] = 'ER_RPL_ENCRYPTION_KEYRING_INVALID_KEY';
-exports[3787] = 'ER_RPL_ENCRYPTION_HEADER_ERROR';
-exports[3788] = 'ER_RPL_ENCRYPTION_FAILED_TO_ROTATE_LOGS';
-exports[3789] = 'ER_RPL_ENCRYPTION_KEY_EXISTS_UNEXPECTED';
-exports[3790] = 'ER_RPL_ENCRYPTION_FAILED_TO_GENERATE_KEY';
-exports[3791] = 'ER_RPL_ENCRYPTION_FAILED_TO_STORE_KEY';
-exports[3792] = 'ER_RPL_ENCRYPTION_FAILED_TO_REMOVE_KEY';
-exports[3793] = 'ER_RPL_ENCRYPTION_UNABLE_TO_CHANGE_OPTION';
-exports[3794] = 'ER_RPL_ENCRYPTION_MASTER_KEY_RECOVERY_FAILED';
-exports[3795] = 'ER_SLOW_LOG_MODE_IGNORED_WHEN_NOT_LOGGING_TO_FILE';
-exports[3796] = 'ER_GRP_TRX_CONSISTENCY_NOT_ALLOWED';
-exports[3797] = 'ER_GRP_TRX_CONSISTENCY_BEFORE';
-exports[3798] = 'ER_GRP_TRX_CONSISTENCY_AFTER_ON_TRX_BEGIN';
-exports[3799] = 'ER_GRP_TRX_CONSISTENCY_BEGIN_NOT_ALLOWED';
-exports[3800] = 'ER_FUNCTIONAL_INDEX_ROW_VALUE_IS_NOT_ALLOWED';
-exports[3801] = 'ER_RPL_ENCRYPTION_FAILED_TO_ENCRYPT';
-exports[3802] = 'ER_PAGE_TRACKING_NOT_STARTED';
-exports[3803] = 'ER_PAGE_TRACKING_RANGE_NOT_TRACKED';
-exports[3804] = 'ER_PAGE_TRACKING_CANNOT_PURGE';
-exports[3805] = 'ER_RPL_ENCRYPTION_CANNOT_ROTATE_BINLOG_MASTER_KEY';
-exports[3806] = 'ER_BINLOG_MASTER_KEY_RECOVERY_OUT_OF_COMBINATION';
-exports[3807] = 'ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_OPERATE_KEY';
-exports[3808] = 'ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_ROTATE_LOGS';
-exports[3809] = 'ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_REENCRYPT_LOG';
-exports[3810] = 'ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_CLEANUP_UNUSED_KEYS';
-exports[3811] = 'ER_BINLOG_MASTER_KEY_ROTATION_FAIL_TO_CLEANUP_AUX_KEY';
-exports[3812] = 'ER_NON_BOOLEAN_EXPR_FOR_CHECK_CONSTRAINT';
-exports[3813] = 'ER_COLUMN_CHECK_CONSTRAINT_REFERENCES_OTHER_COLUMN';
-exports[3814] = 'ER_CHECK_CONSTRAINT_NAMED_FUNCTION_IS_NOT_ALLOWED';
-exports[3815] = 'ER_CHECK_CONSTRAINT_FUNCTION_IS_NOT_ALLOWED';
-exports[3816] = 'ER_CHECK_CONSTRAINT_VARIABLES';
-exports[3817] = 'ER_CHECK_CONSTRAINT_ROW_VALUE';
-exports[3818] = 'ER_CHECK_CONSTRAINT_REFERS_AUTO_INCREMENT_COLUMN';
-exports[3819] = 'ER_CHECK_CONSTRAINT_VIOLATED';
-exports[3820] = 'ER_CHECK_CONSTRAINT_REFERS_UNKNOWN_COLUMN';
-exports[3821] = 'ER_CHECK_CONSTRAINT_NOT_FOUND';
-exports[3822] = 'ER_CHECK_CONSTRAINT_DUP_NAME';
-exports[3823] = 'ER_CHECK_CONSTRAINT_CLAUSE_USING_FK_REFER_ACTION_COLUMN';
-exports[3824] = 'WARN_UNENCRYPTED_TABLE_IN_ENCRYPTED_DB';
-exports[3825] = 'ER_INVALID_ENCRYPTION_REQUEST';
-exports[3826] = 'ER_CANNOT_SET_TABLE_ENCRYPTION';
-exports[3827] = 'ER_CANNOT_SET_DATABASE_ENCRYPTION';
-exports[3828] = 'ER_CANNOT_SET_TABLESPACE_ENCRYPTION';
-exports[3829] = 'ER_TABLESPACE_CANNOT_BE_ENCRYPTED';
-exports[3830] = 'ER_TABLESPACE_CANNOT_BE_DECRYPTED';
-exports[3831] = 'ER_TABLESPACE_TYPE_UNKNOWN';
-exports[3832] = 'ER_TARGET_TABLESPACE_UNENCRYPTED';
-exports[3833] = 'ER_CANNOT_USE_ENCRYPTION_CLAUSE';
-exports[3834] = 'ER_INVALID_MULTIPLE_CLAUSES';
-exports[3835] = 'ER_UNSUPPORTED_USE_OF_GRANT_AS';
-exports[3836] = 'ER_UKNOWN_AUTH_ID_OR_ACCESS_DENIED_FOR_GRANT_AS';
-exports[3837] = 'ER_DEPENDENT_BY_FUNCTIONAL_INDEX';
-exports[3838] = 'ER_PLUGIN_NOT_EARLY';
-exports[3839] = 'ER_INNODB_REDO_LOG_ARCHIVE_START_SUBDIR_PATH';
-exports[3840] = 'ER_INNODB_REDO_LOG_ARCHIVE_START_TIMEOUT';
-exports[3841] = 'ER_INNODB_REDO_LOG_ARCHIVE_DIRS_INVALID';
-exports[3842] = 'ER_INNODB_REDO_LOG_ARCHIVE_LABEL_NOT_FOUND';
-exports[3843] = 'ER_INNODB_REDO_LOG_ARCHIVE_DIR_EMPTY';
-exports[3844] = 'ER_INNODB_REDO_LOG_ARCHIVE_NO_SUCH_DIR';
-exports[3845] = 'ER_INNODB_REDO_LOG_ARCHIVE_DIR_CLASH';
-exports[3846] = 'ER_INNODB_REDO_LOG_ARCHIVE_DIR_PERMISSIONS';
-exports[3847] = 'ER_INNODB_REDO_LOG_ARCHIVE_FILE_CREATE';
-exports[3848] = 'ER_INNODB_REDO_LOG_ARCHIVE_ACTIVE';
-exports[3849] = 'ER_INNODB_REDO_LOG_ARCHIVE_INACTIVE';
-exports[3850] = 'ER_INNODB_REDO_LOG_ARCHIVE_FAILED';
-exports[3851] = 'ER_INNODB_REDO_LOG_ARCHIVE_SESSION';
-exports[3852] = 'ER_STD_REGEX_ERROR';
-exports[3853] = 'ER_INVALID_JSON_TYPE';
-exports[3854] = 'ER_CANNOT_CONVERT_STRING';
-exports[3855] = 'ER_DEPENDENT_BY_PARTITION_FUNC';
-exports[3856] = 'ER_WARN_DEPRECATED_FLOAT_AUTO_INCREMENT';
-exports[3857] = 'ER_RPL_CANT_STOP_REPLICA_WHILE_LOCKED_BACKUP';
-exports[3858] = 'ER_WARN_DEPRECATED_FLOAT_DIGITS';
-exports[3859] = 'ER_WARN_DEPRECATED_FLOAT_UNSIGNED';
-exports[3860] = 'ER_WARN_DEPRECATED_INTEGER_DISPLAY_WIDTH';
-exports[3861] = 'ER_WARN_DEPRECATED_ZEROFILL';
-exports[3862] = 'ER_CLONE_DONOR';
-exports[3863] = 'ER_CLONE_PROTOCOL';
-exports[3864] = 'ER_CLONE_DONOR_VERSION';
-exports[3865] = 'ER_CLONE_OS';
-exports[3866] = 'ER_CLONE_PLATFORM';
-exports[3867] = 'ER_CLONE_CHARSET';
-exports[3868] = 'ER_CLONE_CONFIG';
-exports[3869] = 'ER_CLONE_SYS_CONFIG';
-exports[3870] = 'ER_CLONE_PLUGIN_MATCH';
-exports[3871] = 'ER_CLONE_LOOPBACK';
-exports[3872] = 'ER_CLONE_ENCRYPTION';
-exports[3873] = 'ER_CLONE_DISK_SPACE';
-exports[3874] = 'ER_CLONE_IN_PROGRESS';
-exports[3875] = 'ER_CLONE_DISALLOWED';
-exports[3876] = 'ER_CANNOT_GRANT_ROLES_TO_ANONYMOUS_USER';
-exports[3877] = 'ER_SECONDARY_ENGINE_PLUGIN';
-exports[3878] = 'ER_SECOND_PASSWORD_CANNOT_BE_EMPTY';
-exports[3879] = 'ER_DB_ACCESS_DENIED';
-exports[3880] = 'ER_DA_AUTH_ID_WITH_SYSTEM_USER_PRIV_IN_MANDATORY_ROLES';
-exports[3881] = 'ER_DA_RPL_GTID_TABLE_CANNOT_OPEN';
-exports[3882] = 'ER_GEOMETRY_IN_UNKNOWN_LENGTH_UNIT';
-exports[3883] = 'ER_DA_PLUGIN_INSTALL_ERROR';
-exports[3884] = 'ER_NO_SESSION_TEMP';
-exports[3885] = 'ER_DA_UNKNOWN_ERROR_NUMBER';
-exports[3886] = 'ER_COLUMN_CHANGE_SIZE';
-exports[3887] = 'ER_REGEXP_INVALID_CAPTURE_GROUP_NAME';
-exports[3888] = 'ER_DA_SSL_LIBRARY_ERROR';
-exports[3889] = 'ER_SECONDARY_ENGINE';
-exports[3890] = 'ER_SECONDARY_ENGINE_DDL';
-exports[3891] = 'ER_INCORRECT_CURRENT_PASSWORD';
-exports[3892] = 'ER_MISSING_CURRENT_PASSWORD';
-exports[3893] = 'ER_CURRENT_PASSWORD_NOT_REQUIRED';
-exports[3894] = 'ER_PASSWORD_CANNOT_BE_RETAINED_ON_PLUGIN_CHANGE';
-exports[3895] = 'ER_CURRENT_PASSWORD_CANNOT_BE_RETAINED';
-exports[3896] = 'ER_PARTIAL_REVOKES_EXIST';
-exports[3897] = 'ER_CANNOT_GRANT_SYSTEM_PRIV_TO_MANDATORY_ROLE';
-exports[3898] = 'ER_XA_REPLICATION_FILTERS';
-exports[3899] = 'ER_UNSUPPORTED_SQL_MODE';
-exports[3900] = 'ER_REGEXP_INVALID_FLAG';
-exports[3901] = 'ER_PARTIAL_REVOKE_AND_DB_GRANT_BOTH_EXISTS';
-exports[3902] = 'ER_UNIT_NOT_FOUND';
-exports[3903] = 'ER_INVALID_JSON_VALUE_FOR_FUNC_INDEX';
-exports[3904] = 'ER_JSON_VALUE_OUT_OF_RANGE_FOR_FUNC_INDEX';
-exports[3905] = 'ER_EXCEEDED_MV_KEYS_NUM';
-exports[3906] = 'ER_EXCEEDED_MV_KEYS_SPACE';
-exports[3907] = 'ER_FUNCTIONAL_INDEX_DATA_IS_TOO_LONG';
-exports[3908] = 'ER_WRONG_MVI_VALUE';
-exports[3909] = 'ER_WARN_FUNC_INDEX_NOT_APPLICABLE';
-exports[3910] = 'ER_GRP_RPL_UDF_ERROR';
-exports[3911] = 'ER_UPDATE_GTID_PURGED_WITH_GR';
-exports[3912] = 'ER_GROUPING_ON_TIMESTAMP_IN_DST';
-exports[3913] = 'ER_TABLE_NAME_CAUSES_TOO_LONG_PATH';
-exports[3914] = 'ER_AUDIT_LOG_INSUFFICIENT_PRIVILEGE';
-exports[3915] = 'ER_AUDIT_LOG_PASSWORD_HAS_BEEN_COPIED';
-exports[3916] = 'ER_DA_GRP_RPL_STARTED_AUTO_REJOIN';
-exports[3917] = 'ER_SYSVAR_CHANGE_DURING_QUERY';
-exports[3918] = 'ER_GLOBSTAT_CHANGE_DURING_QUERY';
-exports[3919] = 'ER_GRP_RPL_MESSAGE_SERVICE_INIT_FAILURE';
-exports[3920] = 'ER_CHANGE_SOURCE_WRONG_COMPRESSION_ALGORITHM_CLIENT';
-exports[3921] = 'ER_CHANGE_SOURCE_WRONG_COMPRESSION_LEVEL_CLIENT';
-exports[3922] = 'ER_WRONG_COMPRESSION_ALGORITHM_CLIENT';
-exports[3923] = 'ER_WRONG_COMPRESSION_LEVEL_CLIENT';
-exports[3924] = 'ER_CHANGE_SOURCE_WRONG_COMPRESSION_ALGORITHM_LIST_CLIENT';
-exports[3925] = 'ER_CLIENT_PRIVILEGE_CHECKS_USER_CANNOT_BE_ANONYMOUS';
-exports[3926] = 'ER_CLIENT_PRIVILEGE_CHECKS_USER_DOES_NOT_EXIST';
-exports[3927] = 'ER_CLIENT_PRIVILEGE_CHECKS_USER_CORRUPT';
-exports[3928] = 'ER_CLIENT_PRIVILEGE_CHECKS_USER_NEEDS_RPL_APPLIER_PRIV';
-exports[3929] = 'ER_WARN_DA_PRIVILEGE_NOT_REGISTERED';
-exports[3930] = 'ER_CLIENT_KEYRING_UDF_KEY_INVALID';
-exports[3931] = 'ER_CLIENT_KEYRING_UDF_KEY_TYPE_INVALID';
-exports[3932] = 'ER_CLIENT_KEYRING_UDF_KEY_TOO_LONG';
-exports[3933] = 'ER_CLIENT_KEYRING_UDF_KEY_TYPE_TOO_LONG';
-exports[3934] = 'ER_JSON_SCHEMA_VALIDATION_ERROR_WITH_DETAILED_REPORT';
-exports[3935] = 'ER_DA_UDF_INVALID_CHARSET_SPECIFIED';
-exports[3936] = 'ER_DA_UDF_INVALID_CHARSET';
-exports[3937] = 'ER_DA_UDF_INVALID_COLLATION';
-exports[3938] = 'ER_DA_UDF_INVALID_EXTENSION_ARGUMENT_TYPE';
-exports[3939] = 'ER_MULTIPLE_CONSTRAINTS_WITH_SAME_NAME';
-exports[3940] = 'ER_CONSTRAINT_NOT_FOUND';
-exports[3941] = 'ER_ALTER_CONSTRAINT_ENFORCEMENT_NOT_SUPPORTED';
-exports[3942] = 'ER_TABLE_VALUE_CONSTRUCTOR_MUST_HAVE_COLUMNS';
-exports[3943] = 'ER_TABLE_VALUE_CONSTRUCTOR_CANNOT_HAVE_DEFAULT';
-exports[3944] = 'ER_CLIENT_QUERY_FAILURE_INVALID_NON_ROW_FORMAT';
-exports[3945] = 'ER_REQUIRE_ROW_FORMAT_INVALID_VALUE';
-exports[3946] = 'ER_FAILED_TO_DETERMINE_IF_ROLE_IS_MANDATORY';
-exports[3947] = 'ER_FAILED_TO_FETCH_MANDATORY_ROLE_LIST';
-exports[3948] = 'ER_CLIENT_LOCAL_FILES_DISABLED';
-exports[3949] = 'ER_IMP_INCOMPATIBLE_CFG_VERSION';
-exports[3950] = 'ER_DA_OOM';
-exports[3951] = 'ER_DA_UDF_INVALID_ARGUMENT_TO_SET_CHARSET';
-exports[3952] = 'ER_DA_UDF_INVALID_RETURN_TYPE_TO_SET_CHARSET';
-exports[3953] = 'ER_MULTIPLE_INTO_CLAUSES';
-exports[3954] = 'ER_MISPLACED_INTO';
-exports[3955] =
-  'ER_USER_ACCESS_DENIED_FOR_USER_ACCOUNT_BLOCKED_BY_PASSWORD_LOCK';
-exports[3956] = 'ER_WARN_DEPRECATED_YEAR_UNSIGNED';
-exports[3957] = 'ER_CLONE_NETWORK_PACKET';
-exports[3958] = 'ER_SDI_OPERATION_FAILED_MISSING_RECORD';
-exports[3959] = 'ER_DEPENDENT_BY_CHECK_CONSTRAINT';
-exports[3960] = 'ER_GRP_OPERATION_NOT_ALLOWED_GR_MUST_STOP';
-exports[3961] = 'ER_WARN_DEPRECATED_JSON_TABLE_ON_ERROR_ON_EMPTY';
-exports[3962] = 'ER_WARN_DEPRECATED_INNER_INTO';
-exports[3963] = 'ER_WARN_DEPRECATED_VALUES_FUNCTION_ALWAYS_NULL';
-exports[3964] = 'ER_WARN_DEPRECATED_SQL_CALC_FOUND_ROWS';
-exports[3965] = 'ER_WARN_DEPRECATED_FOUND_ROWS';
-exports[3966] = 'ER_MISSING_JSON_VALUE';
-exports[3967] = 'ER_MULTIPLE_JSON_VALUES';
-exports[3968] = 'ER_HOSTNAME_TOO_LONG';
-exports[3969] = 'ER_WARN_CLIENT_DEPRECATED_PARTITION_PREFIX_KEY';
-exports[3970] = 'ER_GROUP_REPLICATION_USER_EMPTY_MSG';
-exports[3971] = 'ER_GROUP_REPLICATION_USER_MANDATORY_MSG';
-exports[3972] = 'ER_GROUP_REPLICATION_PASSWORD_LENGTH';
-exports[3973] = 'ER_SUBQUERY_TRANSFORM_REJECTED';
-exports[3974] = 'ER_DA_GRP_RPL_RECOVERY_ENDPOINT_FORMAT';
-exports[3975] = 'ER_DA_GRP_RPL_RECOVERY_ENDPOINT_INVALID';
-exports[3976] = 'ER_WRONG_VALUE_FOR_VAR_PLUS_ACTIONABLE_PART';
-exports[3977] = 'ER_STATEMENT_NOT_ALLOWED_AFTER_START_TRANSACTION';
-exports[3978] = 'ER_FOREIGN_KEY_WITH_ATOMIC_CREATE_SELECT';
-exports[3979] = 'ER_NOT_ALLOWED_WITH_START_TRANSACTION';
-exports[3980] = 'ER_INVALID_JSON_ATTRIBUTE';
-exports[3981] = 'ER_ENGINE_ATTRIBUTE_NOT_SUPPORTED';
-exports[3982] = 'ER_INVALID_USER_ATTRIBUTE_JSON';
-exports[3983] = 'ER_INNODB_REDO_DISABLED';
-exports[3984] = 'ER_INNODB_REDO_ARCHIVING_ENABLED';
-exports[3985] = 'ER_MDL_OUT_OF_RESOURCES';
-exports[3986] = 'ER_IMPLICIT_COMPARISON_FOR_JSON';
-exports[3987] = 'ER_FUNCTION_DOES_NOT_SUPPORT_CHARACTER_SET';
-exports[3988] = 'ER_IMPOSSIBLE_STRING_CONVERSION';
-exports[3989] = 'ER_SCHEMA_READ_ONLY';
-exports[3990] = 'ER_RPL_ASYNC_RECONNECT_GTID_MODE_OFF';
-exports[3991] = 'ER_RPL_ASYNC_RECONNECT_AUTO_POSITION_OFF';
-exports[3992] = 'ER_DISABLE_GTID_MODE_REQUIRES_ASYNC_RECONNECT_OFF';
-exports[3993] = 'ER_DISABLE_AUTO_POSITION_REQUIRES_ASYNC_RECONNECT_OFF';
-exports[3994] = 'ER_INVALID_PARAMETER_USE';
-exports[3995] = 'ER_CHARACTER_SET_MISMATCH';
-exports[3996] = 'ER_WARN_VAR_VALUE_CHANGE_NOT_SUPPORTED';
-exports[3997] = 'ER_INVALID_TIME_ZONE_INTERVAL';
-exports[3998] = 'ER_INVALID_CAST';
-exports[3999] = 'ER_HYPERGRAPH_NOT_SUPPORTED_YET';
-exports[4000] = 'ER_WARN_HYPERGRAPH_EXPERIMENTAL';
-exports[4001] = 'ER_DA_NO_ERROR_LOG_PARSER_CONFIGURED';
-exports[4002] = 'ER_DA_ERROR_LOG_TABLE_DISABLED';
-exports[4003] = 'ER_DA_ERROR_LOG_MULTIPLE_FILTERS';
-exports[4004] = 'ER_DA_CANT_OPEN_ERROR_LOG';
-exports[4005] = 'ER_USER_REFERENCED_AS_DEFINER';
-exports[4006] = 'ER_CANNOT_USER_REFERENCED_AS_DEFINER';
-exports[4007] = 'ER_REGEX_NUMBER_TOO_BIG';
-exports[4008] = 'ER_SPVAR_NONINTEGER_TYPE';
-exports[4009] = 'WARN_UNSUPPORTED_ACL_TABLES_READ';
-exports[4010] = 'ER_BINLOG_UNSAFE_ACL_TABLE_READ_IN_DML_DDL';
-exports[4011] = 'ER_STOP_REPLICA_MONITOR_IO_THREAD_TIMEOUT';
-exports[4012] = 'ER_STARTING_REPLICA_MONITOR_IO_THREAD';
-exports[4013] = 'ER_CANT_USE_ANONYMOUS_TO_GTID_WITH_GTID_MODE_NOT_ON';
-exports[4014] = 'ER_CANT_COMBINE_ANONYMOUS_TO_GTID_AND_AUTOPOSITION';
-exports[4015] =
-  'ER_ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_REQUIRES_GTID_MODE_ON';
-exports[4016] = 'ER_SQL_REPLICA_SKIP_COUNTER_USED_WITH_GTID_MODE_ON';
-exports[4017] =
-  'ER_USING_ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS_AS_LOCAL_OR_UUID';
-exports[4018] =
-  'ER_CANT_SET_ANONYMOUS_TO_GTID_AND_WAIT_UNTIL_SQL_THD_AFTER_GTIDS';
-exports[4019] = 'ER_CANT_SET_SQL_AFTER_OR_BEFORE_GTIDS_WITH_ANONYMOUS_TO_GTID';
-exports[4020] = 'ER_ANONYMOUS_TO_GTID_UUID_SAME_AS_GROUP_NAME';
-exports[4021] = 'ER_CANT_USE_SAME_UUID_AS_GROUP_NAME';
-exports[4022] = 'ER_GRP_RPL_RECOVERY_CHANNEL_STILL_RUNNING';
-exports[4023] = 'ER_INNODB_INVALID_AUTOEXTEND_SIZE_VALUE';
-exports[4024] = 'ER_INNODB_INCOMPATIBLE_WITH_TABLESPACE';
-exports[4025] = 'ER_INNODB_AUTOEXTEND_SIZE_OUT_OF_RANGE';
-exports[4026] = 'ER_CANNOT_USE_AUTOEXTEND_SIZE_CLAUSE';
-exports[4027] = 'ER_ROLE_GRANTED_TO_ITSELF';
-exports[4028] = 'ER_TABLE_MUST_HAVE_A_VISIBLE_COLUMN';
-exports[4029] = 'ER_INNODB_COMPRESSION_FAILURE';
-exports[4030] = 'ER_WARN_ASYNC_CONN_FAILOVER_NETWORK_NAMESPACE';
-exports[4031] = 'ER_CLIENT_INTERACTION_TIMEOUT';
-exports[4032] = 'ER_INVALID_CAST_TO_GEOMETRY';
-exports[4033] = 'ER_INVALID_CAST_POLYGON_RING_DIRECTION';
-exports[4034] = 'ER_GIS_DIFFERENT_SRIDS_AGGREGATION';
-exports[4035] = 'ER_RELOAD_KEYRING_FAILURE';
-exports[4036] = 'ER_SDI_GET_KEYS_INVALID_TABLESPACE';
-exports[4037] = 'ER_CHANGE_RPL_SRC_WRONG_COMPRESSION_ALGORITHM_SIZE';
-exports[4038] = 'ER_WARN_DEPRECATED_TLS_VERSION_FOR_CHANNEL_CLI';
-exports[4039] = 'ER_CANT_USE_SAME_UUID_AS_VIEW_CHANGE_UUID';
-exports[4040] = 'ER_ANONYMOUS_TO_GTID_UUID_SAME_AS_VIEW_CHANGE_UUID';
-exports[4041] = 'ER_GRP_RPL_VIEW_CHANGE_UUID_FAIL_GET_VARIABLE';
-exports[4042] = 'ER_WARN_ADUIT_LOG_MAX_SIZE_AND_PRUNE_SECONDS';
-exports[4043] = 'ER_WARN_ADUIT_LOG_MAX_SIZE_CLOSE_TO_ROTATE_ON_SIZE';
-exports[4044] = 'ER_KERBEROS_CREATE_USER';
-exports[4045] = 'ER_INSTALL_PLUGIN_CONFLICT_CLIENT';
-exports[4046] = 'ER_DA_ERROR_LOG_COMPONENT_FLUSH_FAILED';
-exports[4047] = 'ER_WARN_SQL_AFTER_MTS_GAPS_GAP_NOT_CALCULATED';
-exports[4048] = 'ER_INVALID_ASSIGNMENT_TARGET';
-exports[4049] = 'ER_OPERATION_NOT_ALLOWED_ON_GR_SECONDARY';
-exports[4050] = 'ER_GRP_RPL_FAILOVER_CHANNEL_STATUS_PROPAGATION';
-exports[4051] = 'ER_WARN_AUDIT_LOG_FORMAT_UNIX_TIMESTAMP_ONLY_WHEN_JSON';
-exports[4052] = 'ER_INVALID_MFA_PLUGIN_SPECIFIED';
-exports[4053] = 'ER_IDENTIFIED_BY_UNSUPPORTED';
-exports[4054] = 'ER_INVALID_PLUGIN_FOR_REGISTRATION';
-exports[4055] = 'ER_PLUGIN_REQUIRES_REGISTRATION';
-exports[4056] = 'ER_MFA_METHOD_EXISTS';
-exports[4057] = 'ER_MFA_METHOD_NOT_EXISTS';
-exports[4058] = 'ER_AUTHENTICATION_POLICY_MISMATCH';
-exports[4059] = 'ER_PLUGIN_REGISTRATION_DONE';
-exports[4060] = 'ER_INVALID_USER_FOR_REGISTRATION';
-exports[4061] = 'ER_USER_REGISTRATION_FAILED';
-exports[4062] = 'ER_MFA_METHODS_INVALID_ORDER';
-exports[4063] = 'ER_MFA_METHODS_IDENTICAL';
-exports[4064] = 'ER_INVALID_MFA_OPERATIONS_FOR_PASSWORDLESS_USER';
-exports[4065] = 'ER_CHANGE_REPLICATION_SOURCE_NO_OPTIONS_FOR_GTID_ONLY';
-exports[4066] =
-  'ER_CHANGE_REP_SOURCE_CANT_DISABLE_REQ_ROW_FORMAT_WITH_GTID_ONLY';
-exports[4067] =
-  'ER_CHANGE_REP_SOURCE_CANT_DISABLE_AUTO_POSITION_WITH_GTID_ONLY';
-exports[4068] = 'ER_CHANGE_REP_SOURCE_CANT_DISABLE_GTID_ONLY_WITHOUT_POSITIONS';
-exports[4069] = 'ER_CHANGE_REP_SOURCE_CANT_DISABLE_AUTO_POS_WITHOUT_POSITIONS';
-exports[4070] = 'ER_CHANGE_REP_SOURCE_GR_CHANNEL_WITH_GTID_MODE_NOT_ON';
-exports[4071] = 'ER_CANT_USE_GTID_ONLY_WITH_GTID_MODE_NOT_ON';
-exports[4072] = 'ER_WARN_C_DISABLE_GTID_ONLY_WITH_SOURCE_AUTO_POS_INVALID_POS';
-exports[4073] = 'ER_DA_SSL_FIPS_MODE_ERROR';
-exports[4074] = 'ER_VALUE_OUT_OF_RANGE';
-exports[4075] = 'ER_FULLTEXT_WITH_ROLLUP';
-exports[4076] = 'ER_REGEXP_MISSING_RESOURCE';
-exports[4077] = 'ER_WARN_REGEXP_USING_DEFAULT';
-exports[4078] = 'ER_REGEXP_MISSING_FILE';
-exports[4079] = 'ER_WARN_DEPRECATED_COLLATION';
-exports[4080] = 'ER_CONCURRENT_PROCEDURE_USAGE';
-exports[4081] = 'ER_DA_GLOBAL_CONN_LIMIT';
-exports[4082] = 'ER_DA_CONN_LIMIT';
-exports[4083] = 'ER_ALTER_OPERATION_NOT_SUPPORTED_REASON_COLUMN_TYPE_INSTANT';
-exports[4084] = 'ER_WARN_SF_UDF_NAME_COLLISION';
-exports[4085] = 'ER_CANNOT_PURGE_BINLOG_WITH_BACKUP_LOCK';
-exports[4086] = 'ER_TOO_MANY_WINDOWS';
-exports[4087] = 'ER_MYSQLBACKUP_CLIENT_MSG';
-exports[4088] = 'ER_COMMENT_CONTAINS_INVALID_STRING';
-exports[4089] = 'ER_DEFINITION_CONTAINS_INVALID_STRING';
-exports[4090] = 'ER_CANT_EXECUTE_COMMAND_WITH_ASSIGNED_GTID_NEXT';
-exports[4091] = 'ER_XA_TEMP_TABLE';
-exports[4092] = 'ER_INNODB_MAX_ROW_VERSION';
-exports[4093] = 'ER_INNODB_INSTANT_ADD_NOT_SUPPORTED_MAX_SIZE';
-exports[4094] = 'ER_OPERATION_NOT_ALLOWED_WHILE_PRIMARY_CHANGE_IS_RUNNING';
-exports[4095] = 'ER_WARN_DEPRECATED_DATETIME_DELIMITER';
-exports[4096] = 'ER_WARN_DEPRECATED_SUPERFLUOUS_DELIMITER';
-exports[4097] = 'ER_CANNOT_PERSIST_SENSITIVE_VARIABLES';
-exports[4098] = 'ER_WARN_CANNOT_SECURELY_PERSIST_SENSITIVE_VARIABLES';
-exports[4099] = 'ER_WARN_TRG_ALREADY_EXISTS';
-exports[4100] = 'ER_IF_NOT_EXISTS_UNSUPPORTED_TRG_EXISTS_ON_DIFFERENT_TABLE';
-exports[4101] = 'ER_IF_NOT_EXISTS_UNSUPPORTED_UDF_NATIVE_FCT_NAME_COLLISION';
-exports[4102] = 'ER_SET_PASSWORD_AUTH_PLUGIN_ERROR';
-exports[4103] = 'ER_REDUCED_DBLWR_FILE_CORRUPTED';
-exports[4104] = 'ER_REDUCED_DBLWR_PAGE_FOUND';
-exports[4105] = 'ER_SRS_INVALID_LATITUDE_OF_ORIGIN';
-exports[4106] = 'ER_SRS_INVALID_LONGITUDE_OF_ORIGIN';
-exports[4107] = 'ER_SRS_UNUSED_PROJ_PARAMETER_PRESENT';
-exports[4108] = 'ER_GIPK_COLUMN_EXISTS';
-exports[4109] = 'ER_GIPK_FAILED_AUTOINC_COLUMN_EXISTS';
-exports[4110] = 'ER_GIPK_COLUMN_ALTER_NOT_ALLOWED';
-exports[4111] = 'ER_DROP_PK_COLUMN_TO_DROP_GIPK';
-exports[4112] = 'ER_CREATE_SELECT_WITH_GIPK_DISALLOWED_IN_SBR';
-exports[4113] = 'ER_DA_EXPIRE_LOGS_DAYS_IGNORED';
-exports[4114] = 'ER_CTE_RECURSIVE_NOT_UNION';
-exports[4115] = 'ER_COMMAND_BACKEND_FAILED_TO_FETCH_SECURITY_CTX';
-exports[4116] = 'ER_COMMAND_SERVICE_BACKEND_FAILED';
-exports[4117] = 'ER_CLIENT_FILE_PRIVILEGE_FOR_REPLICATION_CHECKS';
-exports[4118] = 'ER_GROUP_REPLICATION_FORCE_MEMBERS_COMMAND_FAILURE';
-exports[4119] = 'ER_WARN_DEPRECATED_IDENT';
-exports[4120] = 'ER_INTERSECT_ALL_MAX_DUPLICATES_EXCEEDED';
-exports[4121] = 'ER_TP_QUERY_THRS_PER_GRP_EXCEEDS_TXN_THR_LIMIT';
-exports[4122] = 'ER_BAD_TIMESTAMP_FORMAT';
-exports[4123] = 'ER_SHAPE_PRIDICTION_UDF';
-exports[4124] = 'ER_SRS_INVALID_HEIGHT';
-exports[4125] = 'ER_SRS_INVALID_SCALING';
-exports[4126] = 'ER_SRS_INVALID_ZONE_WIDTH';
-exports[4127] = 'ER_SRS_INVALID_LATITUDE_POLAR_STERE_VAR_A';
-exports[4128] = 'ER_WARN_DEPRECATED_CLIENT_NO_SCHEMA_OPTION';
-exports[4129] = 'ER_TABLE_NOT_EMPTY';
-exports[4130] = 'ER_TABLE_NO_PRIMARY_KEY';
-exports[4131] = 'ER_TABLE_IN_SHARED_TABLESPACE';
-exports[4132] = 'ER_INDEX_OTHER_THAN_PK';
-exports[4133] = 'ER_LOAD_BULK_DATA_UNSORTED';
-exports[4134] = 'ER_BULK_EXECUTOR_ERROR';
-exports[4135] = 'ER_BULK_READER_LIBCURL_INIT_FAILED';
-exports[4136] = 'ER_BULK_READER_LIBCURL_ERROR';
-exports[4137] = 'ER_BULK_READER_SERVER_ERROR';
-exports[4138] = 'ER_BULK_READER_COMMUNICATION_ERROR';
-exports[4139] = 'ER_BULK_LOAD_DATA_FAILED';
-exports[4140] = 'ER_BULK_LOADER_COLUMN_TOO_BIG_FOR_LEFTOVER_BUFFER';
-exports[4141] = 'ER_BULK_LOADER_COMPONENT_ERROR';
-exports[4142] = 'ER_BULK_LOADER_FILE_CONTAINS_LESS_LINES_THAN_IGNORE_CLAUSE';
-exports[4143] = 'ER_BULK_PARSER_MISSING_ENCLOSED_BY';
-exports[4144] = 'ER_BULK_PARSER_ROW_BUFFER_MAX_TOTAL_COLS_EXCEEDED';
-exports[4145] = 'ER_BULK_PARSER_COPY_BUFFER_SIZE_EXCEEDED';
-exports[4146] = 'ER_BULK_PARSER_UNEXPECTED_END_OF_INPUT';
-exports[4147] = 'ER_BULK_PARSER_UNEXPECTED_ROW_TERMINATOR';
-exports[4148] = 'ER_BULK_PARSER_UNEXPECTED_CHAR_AFTER_ENDING_ENCLOSED_BY';
-exports[4149] = 'ER_BULK_PARSER_UNEXPECTED_CHAR_AFTER_NULL_ESCAPE';
-exports[4150] = 'ER_BULK_PARSER_UNEXPECTED_CHAR_AFTER_COLUMN_TERMINATOR';
-exports[4151] = 'ER_BULK_PARSER_INCOMPLETE_ESCAPE_SEQUENCE';
-exports[4152] = 'ER_LOAD_BULK_DATA_FAILED';
-exports[4153] = 'ER_LOAD_BULK_DATA_WRONG_VALUE_FOR_FIELD';
-exports[4154] = 'ER_LOAD_BULK_DATA_WARN_NULL_TO_NOTNULL';
-exports[4155] = 'ER_REQUIRE_TABLE_PRIMARY_KEY_CHECK_GENERATE_WITH_GR';
-exports[4156] = 'ER_CANT_CHANGE_SYS_VAR_IN_READ_ONLY_MODE';
-exports[4157] = 'ER_INNODB_INSTANT_ADD_DROP_NOT_SUPPORTED_MAX_SIZE';
-exports[4158] = 'ER_INNODB_INSTANT_ADD_NOT_SUPPORTED_MAX_FIELDS';
-exports[4159] = 'ER_CANT_SET_PERSISTED';
-exports[4160] = 'ER_INSTALL_COMPONENT_SET_NULL_VALUE';
-exports[4161] = 'ER_INSTALL_COMPONENT_SET_UNUSED_VALUE';
-exports[4162] = 'ER_WARN_DEPRECATED_USER_DEFINED_COLLATIONS';
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/field_flags.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/field_flags.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,20 +1,0 @@
-'use strict';
-
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-exports.NOT_NULL = 1; /* Field can't be NULL */
-exports.PRI_KEY = 2; /* Field is part of a primary key */
-exports.UNIQUE_KEY = 4; /* Field is part of a unique key */
-exports.MULTIPLE_KEY = 8; /* Field is part of a key */
-exports.BLOB = 16; /* Field is a blob */
-exports.UNSIGNED = 32; /* Field is unsigned */
-exports.ZEROFILL = 64; /* Field is zerofill */
-exports.BINARY = 128; /* Field is binary   */
-
-/* The following are only sent to new clients */
-exports.ENUM = 256; /* field is an enum */
-exports.AUTO_INCREMENT = 512; /* field is a autoincrement field */
-exports.TIMESTAMP = 1024; /* Field is a timestamp */
-exports.SET = 2048; /* field is a set */
-exports.NO_DEFAULT_VALUE = 4096; /* Field doesn't have default value */
-exports.ON_UPDATE_NOW = 8192; /* Field is set to NOW on UPDATE */
-exports.NUM = 32768; /* Field is num (for clients) */
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/server_status.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/server_status.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,44 +1,0 @@
-'use strict';
-
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-
-/**
-  Is raised when a multi-statement transaction
-  has been started, either explicitly, by means
-  of BEGIN or COMMIT AND CHAIN, or
-  implicitly, by the first transactional
-  statement, when autocommit=off.
-*/
-exports.SERVER_STATUS_IN_TRANS = 1;
-exports.SERVER_STATUS_AUTOCOMMIT = 2; /* Server in auto_commit mode */
-exports.SERVER_MORE_RESULTS_EXISTS = 8; /* Multi query - next query exists */
-exports.SERVER_QUERY_NO_GOOD_INDEX_USED = 16;
-exports.SERVER_QUERY_NO_INDEX_USED = 32;
-/**
-  The server was able to fulfill the clients request and opened a
-  read-only non-scrollable cursor for a query. This flag comes
-  in reply to COM_STMT_EXECUTE and COM_STMT_FETCH commands.
-*/
-exports.SERVER_STATUS_CURSOR_EXISTS = 64;
-/**
-  This flag is sent when a read-only cursor is exhausted, in reply to
-  COM_STMT_FETCH command.
-*/
-exports.SERVER_STATUS_LAST_ROW_SENT = 128;
-exports.SERVER_STATUS_DB_DROPPED = 256; /* A database was dropped */
-exports.SERVER_STATUS_NO_BACKSLASH_ESCAPES = 512;
-/**
-  Sent to the client if after a prepared statement reprepare
-  we discovered that the new statement returns a different
-  number of result set columns.
-*/
-exports.SERVER_STATUS_METADATA_CHANGED = 1024;
-exports.SERVER_QUERY_WAS_SLOW = 2048;
-
-/**
-  To mark ResultSet containing output parameter values.
-*/
-exports.SERVER_PS_OUT_PARAMS = 4096;
-
-exports.SERVER_STATUS_IN_TRANS_READONLY = 0x2000; // in a read-only transaction
-exports.SERVER_SESSION_STATE_CHANGED = 0x4000;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/session_track.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/session_track.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,11 +1,0 @@
-'use strict';
-
-exports.SYSTEM_VARIABLES = 0;
-exports.SCHEMA = 1;
-exports.STATE_CHANGE = 2;
-exports.STATE_GTIDS = 3;
-exports.TRANSACTION_CHARACTERISTICS = 4;
-exports.TRANSACTION_STATE = 5;
-
-exports.FIRST_KEY = exports.SYSTEM_VARIABLES;
-exports.LAST_KEY = exports.TRANSACTION_STATE;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/ssl_profiles.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/ssl_profiles.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,11 +1,0 @@
-'use strict';
-
-const awsCaBundle = require('aws-ssl-profiles');
-
-/**
- * @deprecated
- * Please, use [**aws-ssl-profiles**](https://github.com/mysqljs/aws-ssl-profiles).
- */
-exports['Amazon RDS'] = {
-  ca: awsCaBundle.ca,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/types.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/constants/types.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,64 +1,0 @@
-'use strict';
-
-module.exports = {
-  0x00: 'DECIMAL', // aka DECIMAL
-  0x01: 'TINY', // aka TINYINT, 1 byte
-  0x02: 'SHORT', // aka SMALLINT, 2 bytes
-  0x03: 'LONG', // aka INT, 4 bytes
-  0x04: 'FLOAT', // aka FLOAT, 4-8 bytes
-  0x05: 'DOUBLE', // aka DOUBLE, 8 bytes
-  0x06: 'NULL', // NULL (used for prepared statements, I think)
-  0x07: 'TIMESTAMP', // aka TIMESTAMP
-  0x08: 'LONGLONG', // aka BIGINT, 8 bytes
-  0x09: 'INT24', // aka MEDIUMINT, 3 bytes
-  0x0a: 'DATE', // aka DATE
-  0x0b: 'TIME', // aka TIME
-  0x0c: 'DATETIME', // aka DATETIME
-  0x0d: 'YEAR', // aka YEAR, 1 byte (don't ask)
-  0x0e: 'NEWDATE', // aka ?
-  0x0f: 'VARCHAR', // aka VARCHAR (?)
-  0x10: 'BIT', // aka BIT, 1-8 byte
-  0xf5: 'JSON',
-  0xf6: 'NEWDECIMAL', // aka DECIMAL
-  0xf7: 'ENUM', // aka ENUM
-  0xf8: 'SET', // aka SET
-  0xf9: 'TINY_BLOB', // aka TINYBLOB, TINYTEXT
-  0xfa: 'MEDIUM_BLOB', // aka MEDIUMBLOB, MEDIUMTEXT
-  0xfb: 'LONG_BLOB', // aka LONGBLOG, LONGTEXT
-  0xfc: 'BLOB', // aka BLOB, TEXT
-  0xfd: 'VAR_STRING', // aka VARCHAR, VARBINARY
-  0xfe: 'STRING', // aka CHAR, BINARY
-  0xff: 'GEOMETRY', // aka GEOMETRY
-};
-
-// Manually extracted from mysql-5.5.23/include/mysql_com.h
-// some more info here: http://dev.mysql.com/doc/refman/5.5/en/c-api-prepared-statement-type-codes.html
-module.exports.DECIMAL = 0x00; // aka DECIMAL (http://dev.mysql.com/doc/refman/5.0/en/precision-math-decimal-changes.html)
-module.exports.TINY = 0x01; // aka TINYINT, 1 byte
-module.exports.SHORT = 0x02; // aka SMALLINT, 2 bytes
-module.exports.LONG = 0x03; // aka INT, 4 bytes
-module.exports.FLOAT = 0x04; // aka FLOAT, 4-8 bytes
-module.exports.DOUBLE = 0x05; // aka DOUBLE, 8 bytes
-module.exports.NULL = 0x06; // NULL (used for prepared statements, I think)
-module.exports.TIMESTAMP = 0x07; // aka TIMESTAMP
-module.exports.LONGLONG = 0x08; // aka BIGINT, 8 bytes
-module.exports.INT24 = 0x09; // aka MEDIUMINT, 3 bytes
-module.exports.DATE = 0x0a; // aka DATE
-module.exports.TIME = 0x0b; // aka TIME
-module.exports.DATETIME = 0x0c; // aka DATETIME
-module.exports.YEAR = 0x0d; // aka YEAR, 1 byte (don't ask)
-module.exports.NEWDATE = 0x0e; // aka ?
-module.exports.VARCHAR = 0x0f; // aka VARCHAR (?)
-module.exports.BIT = 0x10; // aka BIT, 1-8 byte
-module.exports.VECTOR = 0xf2;
-module.exports.JSON = 0xf5;
-module.exports.NEWDECIMAL = 0xf6; // aka DECIMAL
-module.exports.ENUM = 0xf7; // aka ENUM
-module.exports.SET = 0xf8; // aka SET
-module.exports.TINY_BLOB = 0xf9; // aka TINYBLOB, TINYTEXT
-module.exports.MEDIUM_BLOB = 0xfa; // aka MEDIUMBLOB, MEDIUMTEXT
-module.exports.LONG_BLOB = 0xfb; // aka LONGBLOG, LONGTEXT
-module.exports.BLOB = 0xfc; // aka BLOB, TEXT
-module.exports.VAR_STRING = 0xfd; // aka VARCHAR, VARBINARY
-module.exports.STRING = 0xfe; // aka CHAR, BINARY
-module.exports.GEOMETRY = 0xff; // aka GEOMETRY
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/create_connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/create_connection.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,10 +1,0 @@
-'use strict';
-
-const Connection = require('./connection.js');
-const ConnectionConfig = require('./connection_config.js');
-
-function createConnection(opts) {
-  return new Connection({ config: new ConnectionConfig(opts) });
-}
-
-module.exports = createConnection;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/create_pool.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/create_pool.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,10 +1,0 @@
-'use strict';
-
-const Pool = require('./pool.js');
-const PoolConfig = require('./pool_config.js');
-
-function createPool(config) {
-  return new Pool({ config: new PoolConfig(config) });
-}
-
-module.exports = createPool;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/create_pool_cluster.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/create_pool_cluster.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,9 +1,0 @@
-'use strict';
-
-const PoolCluster = require('./pool_cluster.js');
-
-function createPoolCluster(config) {
-  return new PoolCluster(config);
-}
-
-module.exports = createPoolCluster;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/helpers.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/helpers.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,86 +1,0 @@
-'use strict';
-
-/*
-
-  this seems to be not only shorter, but faster than
-  string.replace(/\\/g, '\\\\').
-            replace(/\u0008/g, '\\b').
-            replace(/\t/g, '\\t').
-            replace(/\n/g, '\\n').
-            replace(/\f/g, '\\f').
-            replace(/\r/g, '\\r').
-            replace(/'/g, '\\\'').
-            replace(/"/g, '\\"');
-  or string.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")
-  see http://jsperf.com/string-escape-regexp-vs-json-stringify
-  */
-function srcEscape(str) {
-  return JSON.stringify({
-    [str]: 1,
-  }).slice(1, -3);
-}
-
-exports.srcEscape = srcEscape;
-
-let highlightFn;
-let cardinalRecommended = false;
-try {
-  // the purpose of this is to prevent projects using Webpack from displaying a warning during runtime if cardinal is not a dependency
-  const REQUIRE_TERMINATOR = '';
-  highlightFn = require(`cardinal${REQUIRE_TERMINATOR}`).highlight;
-} catch (err) {
-  highlightFn = (text) => {
-    if (!cardinalRecommended) {
-      // eslint-disable-next-line no-console
-      console.log('For nicer debug output consider install cardinal@^2.0.0');
-      cardinalRecommended = true;
-    }
-    return text;
-  };
-}
-
-/**
- * Prints debug message with code frame, will try to use `cardinal` if available.
- */
-function printDebugWithCode(msg, code) {
-  // eslint-disable-next-line no-console
-  console.log(`\n\n${msg}:\n`);
-  // eslint-disable-next-line no-console
-  console.log(`${highlightFn(code)}\n`);
-}
-
-exports.printDebugWithCode = printDebugWithCode;
-
-/**
- * checks whether the `type` is in the `list`
- */
-function typeMatch(type, list, Types) {
-  if (Array.isArray(list)) {
-    return list.some((t) => type === Types[t]);
-  }
-
-  return !!list;
-}
-
-exports.typeMatch = typeMatch;
-
-const privateObjectProps = new Set([
-  '__defineGetter__',
-  '__defineSetter__',
-  '__lookupGetter__',
-  '__lookupSetter__',
-  '__proto__',
-]);
-
-exports.privateObjectProps = privateObjectProps;
-
-const fieldEscape = (field, isEval = true) => {
-  if (privateObjectProps.has(field)) {
-    throw new Error(
-      `The field name (${field}) can't be the same as an object's private property.`
-    );
-  }
-
-  return isEval ? srcEscape(field) : field;
-};
-exports.fieldEscape = fieldEscape;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packet_parser.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packet_parser.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,195 +1,0 @@
-'use strict';
-
-const Packet = require('./packets/packet.js');
-
-const MAX_PACKET_LENGTH = 16777215;
-
-function readPacketLength(b, off) {
-  const b0 = b[off];
-  const b1 = b[off + 1];
-  const b2 = b[off + 2];
-  if (b1 + b2 === 0) {
-    return b0;
-  }
-  return b0 + (b1 << 8) + (b2 << 16);
-}
-
-class PacketParser {
-  constructor(onPacket, packetHeaderLength) {
-    // 4 for normal packets, 7 for comprssed protocol packets
-    if (typeof packetHeaderLength === 'undefined') {
-      packetHeaderLength = 4;
-    }
-    // array of last payload chunks
-    // only used when current payload is not complete
-    this.buffer = [];
-    // total length of chunks on buffer
-    this.bufferLength = 0;
-    this.packetHeaderLength = packetHeaderLength;
-    // incomplete header state: number of header bytes received
-    this.headerLen = 0;
-    // expected payload length
-    this.length = 0;
-    this.largePacketParts = [];
-    this.firstPacketSequenceId = 0;
-    this.onPacket = onPacket;
-    this.execute = PacketParser.prototype.executeStart;
-    this._flushLargePacket =
-      packetHeaderLength === 7
-        ? this._flushLargePacket7
-        : this._flushLargePacket4;
-  }
-
-  _flushLargePacket4() {
-    const numPackets = this.largePacketParts.length;
-    this.largePacketParts.unshift(Buffer.from([0, 0, 0, 0])); // insert header
-    const body = Buffer.concat(this.largePacketParts);
-    const packet = new Packet(this.firstPacketSequenceId, body, 0, body.length);
-    this.largePacketParts.length = 0;
-    packet.numPackets = numPackets;
-    this.onPacket(packet);
-  }
-
-  _flushLargePacket7() {
-    const numPackets = this.largePacketParts.length;
-    this.largePacketParts.unshift(Buffer.from([0, 0, 0, 0, 0, 0, 0])); // insert header
-    const body = Buffer.concat(this.largePacketParts);
-    this.largePacketParts.length = 0;
-    const packet = new Packet(this.firstPacketSequenceId, body, 0, body.length);
-    packet.numPackets = numPackets;
-    this.onPacket(packet);
-  }
-
-  executeStart(chunk) {
-    let start = 0;
-    const end = chunk.length;
-    while (end - start >= 3) {
-      this.length = readPacketLength(chunk, start);
-      if (end - start >= this.length + this.packetHeaderLength) {
-        // at least one full packet
-        const sequenceId = chunk[start + 3];
-        if (
-          this.length < MAX_PACKET_LENGTH &&
-          this.largePacketParts.length === 0
-        ) {
-          this.onPacket(
-            new Packet(
-              sequenceId,
-              chunk,
-              start,
-              start + this.packetHeaderLength + this.length
-            )
-          );
-        } else {
-          // first large packet - remember it's id
-          if (this.largePacketParts.length === 0) {
-            this.firstPacketSequenceId = sequenceId;
-          }
-          this.largePacketParts.push(
-            chunk.slice(
-              start + this.packetHeaderLength,
-              start + this.packetHeaderLength + this.length
-            )
-          );
-          if (this.length < MAX_PACKET_LENGTH) {
-            this._flushLargePacket();
-          }
-        }
-        start += this.packetHeaderLength + this.length;
-      } else {
-        // payload is incomplete
-        this.buffer = [chunk.slice(start + 3, end)];
-        this.bufferLength = end - start - 3;
-        this.execute = PacketParser.prototype.executePayload;
-        return;
-      }
-    }
-    if (end - start > 0) {
-      // there is start of length header, but it's not full 3 bytes
-      this.headerLen = end - start; // 1 or 2 bytes
-      this.length = chunk[start];
-      if (this.headerLen === 2) {
-        this.length = chunk[start] + (chunk[start + 1] << 8);
-        this.execute = PacketParser.prototype.executeHeader3;
-      } else {
-        this.execute = PacketParser.prototype.executeHeader2;
-      }
-    }
-  }
-
-  executePayload(chunk) {
-    let start = 0;
-    const end = chunk.length;
-    const remainingPayload =
-      this.length - this.bufferLength + this.packetHeaderLength - 3;
-    if (end - start >= remainingPayload) {
-      // last chunk for payload
-      const payload = Buffer.allocUnsafe(this.length + this.packetHeaderLength);
-      let offset = 3;
-      for (let i = 0; i < this.buffer.length; ++i) {
-        this.buffer[i].copy(payload, offset);
-        offset += this.buffer[i].length;
-      }
-      chunk.copy(payload, offset, start, start + remainingPayload);
-      const sequenceId = payload[3];
-      if (
-        this.length < MAX_PACKET_LENGTH &&
-        this.largePacketParts.length === 0
-      ) {
-        this.onPacket(
-          new Packet(
-            sequenceId,
-            payload,
-            0,
-            this.length + this.packetHeaderLength
-          )
-        );
-      } else {
-        // first large packet - remember it's id
-        if (this.largePacketParts.length === 0) {
-          this.firstPacketSequenceId = sequenceId;
-        }
-        this.largePacketParts.push(
-          payload.slice(
-            this.packetHeaderLength,
-            this.packetHeaderLength + this.length
-          )
-        );
-        if (this.length < MAX_PACKET_LENGTH) {
-          this._flushLargePacket();
-        }
-      }
-      this.buffer = [];
-      this.bufferLength = 0;
-      this.execute = PacketParser.prototype.executeStart;
-      start += remainingPayload;
-      if (end - start > 0) {
-        return this.execute(chunk.slice(start, end));
-      }
-    } else {
-      this.buffer.push(chunk);
-      this.bufferLength += chunk.length;
-    }
-    return null;
-  }
-
-  executeHeader2(chunk) {
-    this.length += chunk[0] << 8;
-    if (chunk.length > 1) {
-      this.length += chunk[1] << 16;
-      this.execute = PacketParser.prototype.executePayload;
-      return this.executePayload(chunk.slice(2));
-    }
-    this.execute = PacketParser.prototype.executeHeader3;
-
-    return null;
-  }
-
-  executeHeader3(chunk) {
-    this.length += chunk[0] << 16;
-    this.execute = PacketParser.prototype.executePayload;
-    return this.executePayload(chunk.slice(1));
-  }
-}
-
-module.exports = PacketParser;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_next_factor.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_next_factor.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,35 +1,0 @@
-// Copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const Packet = require('../packets/packet');
-
-class AuthNextFactor {
-  constructor(opts) {
-    this.pluginName = opts.pluginName;
-    this.pluginData = opts.pluginData;
-  }
-
-  toPacket(encoding) {
-    const length = 6 + this.pluginName.length + this.pluginData.length;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(0x02);
-    packet.writeNullTerminatedString(this.pluginName, encoding);
-    packet.writeBuffer(this.pluginData);
-    return packet;
-  }
-
-  static fromPacket(packet, encoding) {
-    packet.readInt8(); // marker
-    const name = packet.readNullTerminatedString(encoding);
-    const data = packet.readBuffer();
-    return new AuthNextFactor({
-      pluginName: name,
-      pluginData: data,
-    });
-  }
-}
-
-module.exports = AuthNextFactor;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_switch_request.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_switch_request.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,38 +1,0 @@
-'use strict';
-
-// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchRequest
-
-const Packet = require('../packets/packet');
-
-class AuthSwitchRequest {
-  constructor(opts) {
-    this.pluginName = opts.pluginName;
-    this.pluginData = opts.pluginData;
-  }
-
-  toPacket() {
-    const length = 6 + this.pluginName.length + this.pluginData.length;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(0xfe);
-    // TODO: use server encoding
-    packet.writeNullTerminatedString(this.pluginName, 'cesu8');
-    packet.writeBuffer(this.pluginData);
-    return packet;
-  }
-
-  static fromPacket(packet) {
-    packet.readInt8(); // marker
-    // assert marker == 0xfe?
-    // TODO: use server encoding
-    const name = packet.readNullTerminatedString('cesu8');
-    const data = packet.readBuffer();
-    return new AuthSwitchRequest({
-      pluginName: name,
-      pluginData: data,
-    });
-  }
-}
-
-module.exports = AuthSwitchRequest;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_switch_request_more_data.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_switch_request_more_data.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,33 +1,0 @@
-'use strict';
-
-// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchRequest
-
-const Packet = require('../packets/packet');
-
-class AuthSwitchRequestMoreData {
-  constructor(data) {
-    this.data = data;
-  }
-
-  toPacket() {
-    const length = 5 + this.data.length;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(0x01);
-    packet.writeBuffer(this.data);
-    return packet;
-  }
-
-  static fromPacket(packet) {
-    packet.readInt8(); // marker
-    const data = packet.readBuffer();
-    return new AuthSwitchRequestMoreData(data);
-  }
-
-  static verifyMarker(packet) {
-    return packet.peekByte() === 0x01;
-  }
-}
-
-module.exports = AuthSwitchRequestMoreData;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_switch_response.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/auth_switch_response.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,30 +1,0 @@
-'use strict';
-
-// http://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchRequest
-
-const Packet = require('../packets/packet');
-
-class AuthSwitchResponse {
-  constructor(data) {
-    if (!Buffer.isBuffer(data)) {
-      data = Buffer.from(data);
-    }
-    this.data = data;
-  }
-
-  toPacket() {
-    const length = 4 + this.data.length;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeBuffer(this.data);
-    return packet;
-  }
-
-  static fromPacket(packet) {
-    const data = packet.readBuffer();
-    return new AuthSwitchResponse(data);
-  }
-}
-
-module.exports = AuthSwitchResponse;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/binary_row.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/binary_row.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,95 +1,0 @@
-'use strict';
-
-const Types = require('../constants/types');
-const Packet = require('../packets/packet');
-
-const binaryReader = new Array(256);
-
-class BinaryRow {
-  constructor(columns) {
-    this.columns = columns || [];
-  }
-
-  static toPacket(columns, encoding) {
-    // throw new Error('Not implemented');
-    const sequenceId = 0; // TODO remove, this is calculated now in connecton
-    let length = 0;
-    columns.forEach((val) => {
-      if (val === null || typeof val === 'undefined') {
-        ++length;
-        return;
-      }
-      length += Packet.lengthCodedStringLength(val.toString(10), encoding);
-    });
-
-    length = length + 2;
-
-    const buffer = Buffer.allocUnsafe(length + 4);
-    const packet = new Packet(sequenceId, buffer, 0, length + 4);
-    packet.offset = 4;
-
-    packet.writeInt8(0);
-
-    let bitmap = 0;
-    let bitValue = 1;
-    columns.forEach((parameter) => {
-      if (parameter.type === Types.NULL) {
-        bitmap += bitValue;
-      }
-      bitValue *= 2;
-      if (bitValue === 256) {
-        packet.writeInt8(bitmap);
-        bitmap = 0;
-        bitValue = 1;
-      }
-    });
-    if (bitValue !== 1) {
-      packet.writeInt8(bitmap);
-    }
-
-    columns.forEach((val) => {
-      if (val === null) {
-        packet.writeNull();
-        return;
-      }
-      if (typeof val === 'undefined') {
-        packet.writeInt8(0);
-        return;
-      }
-      packet.writeLengthCodedString(val.toString(10), encoding);
-    });
-    return packet;
-  }
-
-  // TODO: complete list of types...
-  static fromPacket(fields, packet) {
-    const columns = new Array(fields.length);
-    packet.readInt8(); // TODO check it's 0
-    const nullBitmapLength = Math.floor((fields.length + 7 + 2) / 8);
-    // TODO: read and interpret null bitmap
-    packet.skip(nullBitmapLength);
-    for (let i = 0; i < columns.length; ++i) {
-      columns[i] = binaryReader[fields[i].columnType].apply(packet);
-    }
-    return new BinaryRow(columns);
-  }
-}
-
-// TODO: replace with constants.MYSQL_TYPE_*
-binaryReader[Types.DECIMAL] = Packet.prototype.readLengthCodedString;
-binaryReader[1] = Packet.prototype.readInt8; // tiny
-binaryReader[2] = Packet.prototype.readInt16; // short
-binaryReader[3] = Packet.prototype.readInt32; // long
-binaryReader[4] = Packet.prototype.readFloat; // float
-binaryReader[5] = Packet.prototype.readDouble; // double
-binaryReader[6] = Packet.prototype.assertInvalid; // null, should be skipped vie null bitmap
-binaryReader[7] = Packet.prototype.readTimestamp; // timestamp, http://dev.mysql.com/doc/internals/en/prepared-statements.html#packet-ProtocolBinary::MYSQL_TYPE_TIMESTAMP
-binaryReader[8] = Packet.prototype.readInt64; // long long
-binaryReader[9] = Packet.prototype.readInt32; // int24
-binaryReader[10] = Packet.prototype.readTimestamp; // date
-binaryReader[11] = Packet.prototype.readTime; // time, http://dev.mysql.com/doc/internals/en/prepared-statements.html#packet-ProtocolBinary::MYSQL_TYPE_TIME
-binaryReader[12] = Packet.prototype.readDateTime; // datetime, http://dev.mysql.com/doc/internals/en/prepared-statements.html#packet-ProtocolBinary::MYSQL_TYPE_DATETIME
-binaryReader[13] = Packet.prototype.readInt16; // year
-binaryReader[Types.VAR_STRING] = Packet.prototype.readLengthCodedString; // var string
-
-module.exports = BinaryRow;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/binlog_dump.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/binlog_dump.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,33 +1,0 @@
-'use strict';
-
-// http://dev.mysql.com/doc/internals/en/com-binlog-dump.html#packet-COM_BINLOG_DUMP
-
-const Packet = require('../packets/packet');
-const CommandCodes = require('../constants/commands');
-
-// TODO: add flag to constants
-// 0x01 - BINLOG_DUMP_NON_BLOCK
-// send EOF instead of blocking
-class BinlogDump {
-  constructor(opts) {
-    this.binlogPos = opts.binlogPos || 0;
-    this.serverId = opts.serverId || 0;
-    this.flags = opts.flags || 0;
-    this.filename = opts.filename || '';
-  }
-
-  toPacket() {
-    const length = 15 + Buffer.byteLength(this.filename, 'utf8'); // TODO: should be ascii?
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(CommandCodes.BINLOG_DUMP);
-    packet.writeInt32(this.binlogPos);
-    packet.writeInt16(this.flags);
-    packet.writeInt32(this.serverId);
-    packet.writeString(this.filename);
-    return packet;
-  }
-}
-
-module.exports = BinlogDump;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/binlog_query_statusvars.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/binlog_query_statusvars.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,115 +1,0 @@
-'use strict';
-
-// http://dev.mysql.com/doc/internals/en/query-event.html
-
-const keys = {
-  FLAGS2: 0,
-  SQL_MODE: 1,
-  CATALOG: 2,
-  AUTO_INCREMENT: 3,
-  CHARSET: 4,
-  TIME_ZONE: 5,
-  CATALOG_NZ: 6,
-  LC_TIME_NAMES: 7,
-  CHARSET_DATABASE: 8,
-  TABLE_MAP_FOR_UPDATE: 9,
-  MASTER_DATA_WRITTEN: 10,
-  INVOKERS: 11,
-  UPDATED_DB_NAMES: 12,
-  MICROSECONDS: 3,
-};
-
-module.exports = function parseStatusVars(buffer) {
-  const result = {};
-  let offset = 0;
-  let key, length, prevOffset;
-  while (offset < buffer.length) {
-    key = buffer[offset++];
-    switch (key) {
-      case keys.FLAGS2:
-        result.flags = buffer.readUInt32LE(offset);
-        offset += 4;
-        break;
-      case keys.SQL_MODE:
-        // value is 8 bytes, but all dcumented flags are in first 4 bytes
-        result.sqlMode = buffer.readUInt32LE(offset);
-        offset += 8;
-        break;
-      case keys.CATALOG:
-        length = buffer[offset++];
-        result.catalog = buffer.toString('utf8', offset, offset + length);
-        offset += length + 1; // null byte after string
-        break;
-      case keys.CHARSET:
-        result.clientCharset = buffer.readUInt16LE(offset);
-        result.connectionCollation = buffer.readUInt16LE(offset + 2);
-        result.serverCharset = buffer.readUInt16LE(offset + 4);
-        offset += 6;
-        break;
-      case keys.TIME_ZONE:
-        length = buffer[offset++];
-        result.timeZone = buffer.toString('utf8', offset, offset + length);
-        offset += length; // no null byte
-        break;
-      case keys.CATALOG_NZ:
-        length = buffer[offset++];
-        result.catalogNz = buffer.toString('utf8', offset, offset + length);
-        offset += length; // no null byte
-        break;
-      case keys.LC_TIME_NAMES:
-        result.lcTimeNames = buffer.readUInt16LE(offset);
-        offset += 2;
-        break;
-      case keys.CHARSET_DATABASE:
-        result.schemaCharset = buffer.readUInt16LE(offset);
-        offset += 2;
-        break;
-      case keys.TABLE_MAP_FOR_UPDATE:
-        result.mapForUpdate1 = buffer.readUInt32LE(offset);
-        result.mapForUpdate2 = buffer.readUInt32LE(offset + 4);
-        offset += 8;
-        break;
-      case keys.MASTER_DATA_WRITTEN:
-        result.masterDataWritten = buffer.readUInt32LE(offset);
-        offset += 4;
-        break;
-      case keys.INVOKERS:
-        length = buffer[offset++];
-        result.invokerUsername = buffer.toString(
-          'utf8',
-          offset,
-          offset + length
-        );
-        offset += length;
-        length = buffer[offset++];
-        result.invokerHostname = buffer.toString(
-          'utf8',
-          offset,
-          offset + length
-        );
-        offset += length;
-        break;
-      case keys.UPDATED_DB_NAMES:
-        length = buffer[offset++];
-        // length - number of null-terminated strings
-        result.updatedDBs = []; // we'll store them as array here
-        for (; length; --length) {
-          prevOffset = offset;
-          // fast forward to null terminating byte
-          while (buffer[offset++] && offset < buffer.length) {
-            // empty body, everything inside while condition
-          }
-          result.updatedDBs.push(
-            buffer.toString('utf8', prevOffset, offset - 1)
-          );
-        }
-        break;
-      case keys.MICROSECONDS:
-        result.microseconds =
-          // REVIEW: INVALID UNKNOWN VARIABLE!
-          buffer.readInt16LE(offset) + (buffer[offset + 2] << 16);
-        offset += 3;
-    }
-  }
-  return result;
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/change_user.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/change_user.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,97 +1,0 @@
-'use strict';
-
-const CommandCode = require('../constants/commands.js');
-const ClientConstants = require('../constants/client.js');
-const Packet = require('../packets/packet.js');
-const auth41 = require('../auth_41.js');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-
-// https://dev.mysql.com/doc/internals/en/com-change-user.html#packet-COM_CHANGE_USER
-class ChangeUser {
-  constructor(opts) {
-    this.flags = opts.flags;
-    this.user = opts.user || '';
-    this.database = opts.database || '';
-    this.password = opts.password || '';
-    this.passwordSha1 = opts.passwordSha1;
-    this.authPluginData1 = opts.authPluginData1;
-    this.authPluginData2 = opts.authPluginData2;
-    this.connectAttributes = opts.connectAttrinutes || {};
-    let authToken;
-    if (this.passwordSha1) {
-      authToken = auth41.calculateTokenFromPasswordSha(
-        this.passwordSha1,
-        this.authPluginData1,
-        this.authPluginData2
-      );
-    } else {
-      authToken = auth41.calculateToken(
-        this.password,
-        this.authPluginData1,
-        this.authPluginData2
-      );
-    }
-    this.authToken = authToken;
-    this.charsetNumber = opts.charsetNumber;
-  }
-
-  // TODO
-  // ChangeUser.fromPacket = function(packet)
-  // };
-  serializeToBuffer(buffer) {
-    const isSet = (flag) => this.flags & ClientConstants[flag];
-    const packet = new Packet(0, buffer, 0, buffer.length);
-    packet.offset = 4;
-    const encoding = CharsetToEncoding[this.charsetNumber];
-    packet.writeInt8(CommandCode.CHANGE_USER);
-    packet.writeNullTerminatedString(this.user, encoding);
-    if (isSet('SECURE_CONNECTION')) {
-      packet.writeInt8(this.authToken.length);
-      packet.writeBuffer(this.authToken);
-    } else {
-      packet.writeBuffer(this.authToken);
-      packet.writeInt8(0);
-    }
-    packet.writeNullTerminatedString(this.database, encoding);
-    packet.writeInt16(this.charsetNumber);
-    if (isSet('PLUGIN_AUTH')) {
-      // TODO: read this from parameters
-      packet.writeNullTerminatedString('mysql_native_password', 'latin1');
-    }
-    if (isSet('CONNECT_ATTRS')) {
-      const connectAttributes = this.connectAttributes;
-      const attrNames = Object.keys(connectAttributes);
-      let keysLength = 0;
-      for (let k = 0; k < attrNames.length; ++k) {
-        keysLength += Packet.lengthCodedStringLength(attrNames[k], encoding);
-        keysLength += Packet.lengthCodedStringLength(
-          connectAttributes[attrNames[k]],
-          encoding
-        );
-      }
-      packet.writeLengthCodedNumber(keysLength);
-      for (let k = 0; k < attrNames.length; ++k) {
-        packet.writeLengthCodedString(attrNames[k], encoding);
-        packet.writeLengthCodedString(
-          connectAttributes[attrNames[k]],
-          encoding
-        );
-      }
-    }
-    return packet;
-  }
-
-  toPacket() {
-    if (typeof this.user !== 'string') {
-      throw new Error('"user" connection config property must be a string');
-    }
-    if (typeof this.database !== 'string') {
-      throw new Error('"database" connection config property must be a string');
-    }
-    // dry run: calculate resulting packet length
-    const p = this.serializeToBuffer(Packet.MockBuffer());
-    return this.serializeToBuffer(Buffer.allocUnsafe(p.offset));
-  }
-}
-
-module.exports = ChangeUser;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/close_statement.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/close_statement.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,21 +1,0 @@
-'use strict';
-
-const Packet = require('../packets/packet');
-const CommandCodes = require('../constants/commands');
-
-class CloseStatement {
-  constructor(id) {
-    this.id = id;
-  }
-
-  // note: no response sent back
-  toPacket() {
-    const packet = new Packet(0, Buffer.allocUnsafe(9), 0, 9);
-    packet.offset = 4;
-    packet.writeInt8(CommandCodes.STMT_CLOSE);
-    packet.writeInt32(this.id);
-    return packet;
-  }
-}
-
-module.exports = CloseStatement;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/column_definition.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/column_definition.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,291 +1,0 @@
-'use strict';
-
-const Packet = require('../packets/packet');
-const StringParser = require('../parsers/string');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-
-const fields = ['catalog', 'schema', 'table', 'orgTable', 'name', 'orgName'];
-
-// creating JS string is relatively expensive (compared to
-// reading few bytes from buffer) because all string properties
-// except for name are unlikely to be used we postpone
-// string conversion until property access
-//
-// TODO: watch for integration benchmarks (one with real network buffer)
-// there could be bad side effect as keeping reference to a buffer makes it
-// sit in the memory longer (usually until final .query() callback)
-// Latest v8 perform much better in regard to bufferer -> string conversion,
-// at some point of time this optimisation might become unnecessary
-// see https://github.com/sidorares/node-mysql2/pull/137
-//
-class ColumnDefinition {
-  constructor(packet, clientEncoding) {
-    this._buf = packet.buffer;
-    this._clientEncoding = clientEncoding;
-    this._catalogLength = packet.readLengthCodedNumber();
-    this._catalogStart = packet.offset;
-    packet.offset += this._catalogLength;
-    this._schemaLength = packet.readLengthCodedNumber();
-    this._schemaStart = packet.offset;
-    packet.offset += this._schemaLength;
-    this._tableLength = packet.readLengthCodedNumber();
-    this._tableStart = packet.offset;
-    packet.offset += this._tableLength;
-    this._orgTableLength = packet.readLengthCodedNumber();
-    this._orgTableStart = packet.offset;
-    packet.offset += this._orgTableLength;
-    // name is always used, don't make it lazy
-    const _nameLength = packet.readLengthCodedNumber();
-    const _nameStart = packet.offset;
-    packet.offset += _nameLength;
-    this._orgNameLength = packet.readLengthCodedNumber();
-    this._orgNameStart = packet.offset;
-    packet.offset += this._orgNameLength;
-    packet.skip(1); //  length of the following fields (always 0x0c)
-    this.characterSet = packet.readInt16();
-    this.encoding = CharsetToEncoding[this.characterSet];
-    this.name = StringParser.decode(
-      this._buf,
-      this.encoding === 'binary' ? this._clientEncoding : this.encoding,
-      _nameStart,
-      _nameStart + _nameLength
-    );
-    this.columnLength = packet.readInt32();
-    this.columnType = packet.readInt8();
-    this.type = this.columnType;
-    this.flags = packet.readInt16();
-    this.decimals = packet.readInt8();
-  }
-
-  inspect() {
-    return {
-      catalog: this.catalog,
-      schema: this.schema,
-      name: this.name,
-      orgName: this.orgName,
-      table: this.table,
-      orgTable: this.orgTable,
-      characterSet: this.characterSet,
-      encoding: this.encoding,
-      columnLength: this.columnLength,
-      type: this.columnType,
-      flags: this.flags,
-      decimals: this.decimals,
-    };
-  }
-
-  [Symbol.for('nodejs.util.inspect.custom')](depth, inspectOptions, inspect) {
-    const Types = require('../constants/types.js');
-    const typeNames = [];
-    for (const t in Types) {
-      typeNames[Types[t]] = t;
-    }
-    const fiedFlags = require('../constants/field_flags.js');
-    const flagNames = [];
-    // TODO: respect inspectOptions.showHidden
-    //const inspectFlags = inspectOptions.showHidden ? this.flags : this.flags & ~fiedFlags.PRI_KEY;
-    const inspectFlags = this.flags;
-    for (const f in fiedFlags) {
-      if (inspectFlags & fiedFlags[f]) {
-        if (f === 'PRI_KEY') {
-          flagNames.push('PRIMARY KEY');
-        } else if (f === 'NOT_NULL') {
-          flagNames.push('NOT NULL');
-        } else if (f === 'BINARY') {
-          // ignore flag for now
-        } else if (f === 'MULTIPLE_KEY') {
-          // not sure if that should be part of inspection.
-          // in the schema usually this is part of index definition
-          // example: UNIQUE KEY `my_uniq_id` (`id_box_elements`,`id_router`)
-          // note that only first column has MULTIPLE_KEY flag set in this case
-          // so there is no good way of knowing that this is part of index just
-          // by looking at indifidual field flags
-        } else if (f === 'NO_DEFAULT_VALUE') {
-          // almost the same as NOT_NULL?
-        } else if (f === 'BLOB') {
-          // included in the type
-        } else if (f === 'UNSIGNED') {
-          // this should be first after type
-        } else if (f === 'TIMESTAMP') {
-          // timestamp flag is redundant for inspection - already included in type
-        } else if (f === 'ON_UPDATE_NOW') {
-          flagNames.push('ON UPDATE CURRENT_TIMESTAMP');
-        } else {
-          flagNames.push(f);
-        }
-      }
-    }
-
-    if (depth > 1) {
-      return inspect({
-        ...this.inspect(),
-        typeName: typeNames[this.columnType],
-        flags: flagNames,
-      });
-    }
-
-    const isUnsigned = this.flags & fiedFlags.UNSIGNED;
-
-    let typeName = typeNames[this.columnType];
-    if (typeName === 'BLOB') {
-      // TODO: check for non-utf8mb4 encoding
-      if (this.columnLength === 4294967295) {
-        typeName = 'LONGTEXT';
-      } else if (this.columnLength === 67108860) {
-        typeName = 'MEDIUMTEXT';
-      } else if (this.columnLength === 262140) {
-        typeName = 'TEXT';
-      } else if (this.columnLength === 1020) {
-        // 255*4
-        typeName = 'TINYTEXT';
-      } else {
-        typeName = `BLOB(${this.columnLength})`;
-      }
-    } else if (typeName === 'VAR_STRING') {
-      // TODO: check for non-utf8mb4 encoding
-      typeName = `VARCHAR(${Math.ceil(this.columnLength / 4)})`;
-    } else if (typeName === 'TINY') {
-      if (
-        (this.columnLength === 3 && isUnsigned) ||
-        (this.columnLength === 4 && !isUnsigned)
-      ) {
-        typeName = 'TINYINT';
-      } else {
-        typeName = `TINYINT(${this.columnLength})`;
-      }
-    } else if (typeName === 'LONGLONG') {
-      if (this.columnLength === 20) {
-        typeName = 'BIGINT';
-      } else {
-        typeName = `BIGINT(${this.columnLength})`;
-      }
-    } else if (typeName === 'SHORT') {
-      if (isUnsigned && this.columnLength === 5) {
-        typeName = 'SMALLINT';
-      } else if (!isUnsigned && this.columnLength === 6) {
-        typeName = 'SMALLINT';
-      } else {
-        typeName = `SMALLINT(${this.columnLength})`;
-      }
-    } else if (typeName === 'LONG') {
-      if (isUnsigned && this.columnLength === 10) {
-        typeName = 'INT';
-      } else if (!isUnsigned && this.columnLength === 11) {
-        typeName = 'INT';
-      } else {
-        typeName = `INT(${this.columnLength})`;
-      }
-    } else if (typeName === 'INT24') {
-      if (isUnsigned && this.columnLength === 8) {
-        typeName = 'MEDIUMINT';
-      } else if (!isUnsigned && this.columnLength === 9) {
-        typeName = 'MEDIUMINT';
-      } else {
-        typeName = `MEDIUMINT(${this.columnLength})`;
-      }
-    } else if (typeName === 'DOUBLE') {
-      // DOUBLE without modifiers is reported as DOUBLE(22, 31)
-      if (this.columnLength === 22 && this.decimals === 31) {
-        typeName = 'DOUBLE';
-      } else {
-        typeName = `DOUBLE(${this.columnLength},${this.decimals})`;
-      }
-    } else if (typeName === 'FLOAT') {
-      // FLOAT without modifiers is reported as FLOAT(12, 31)
-      if (this.columnLength === 12 && this.decimals === 31) {
-        typeName = 'FLOAT';
-      } else {
-        typeName = `FLOAT(${this.columnLength},${this.decimals})`;
-      }
-    } else if (typeName === 'NEWDECIMAL') {
-      if (this.columnLength === 11 && this.decimals === 0) {
-        typeName = 'DECIMAL';
-      } else if (this.decimals === 0) {
-        // not sure why, but DECIMAL(13) is reported as DECIMAL(14, 0)
-        // and DECIMAL(13, 9) is reported as NEWDECIMAL(15, 9)
-        if (isUnsigned) {
-          typeName = `DECIMAL(${this.columnLength})`;
-        } else {
-          typeName = `DECIMAL(${this.columnLength - 1})`;
-        }
-      } else {
-        typeName = `DECIMAL(${this.columnLength - 2},${this.decimals})`;
-      }
-    } else {
-      typeName = `${typeNames[this.columnType]}(${this.columnLength})`;
-    }
-
-    if (isUnsigned) {
-      typeName += ' UNSIGNED';
-    }
-
-    // TODO respect colors option
-    return `\`${this.name}\` ${[typeName, ...flagNames].join(' ')}`;
-  }
-
-  static toPacket(column, sequenceId) {
-    let length = 17; // = 4 padding + 1 + 12 for the rest
-    fields.forEach((field) => {
-      length += Packet.lengthCodedStringLength(
-        column[field],
-        CharsetToEncoding[column.characterSet]
-      );
-    });
-    const buffer = Buffer.allocUnsafe(length);
-
-    const packet = new Packet(sequenceId, buffer, 0, length);
-    function writeField(name) {
-      packet.writeLengthCodedString(
-        column[name],
-        CharsetToEncoding[column.characterSet]
-      );
-    }
-    packet.offset = 4;
-    fields.forEach(writeField);
-    packet.writeInt8(0x0c);
-    packet.writeInt16(column.characterSet);
-    packet.writeInt32(column.columnLength);
-    packet.writeInt8(column.columnType);
-    packet.writeInt16(column.flags);
-    packet.writeInt8(column.decimals);
-    packet.writeInt16(0); // filler
-    return packet;
-  }
-
-  // node-mysql compatibility: alias "db" to "schema"
-  get db() {
-    return this.schema;
-  }
-}
-
-const addString = function (name) {
-  Object.defineProperty(ColumnDefinition.prototype, name, {
-    get: function () {
-      const start = this[`_${name}Start`];
-      const end = start + this[`_${name}Length`];
-      const val = StringParser.decode(
-        this._buf,
-        this.encoding === 'binary' ? this._clientEncoding : this.encoding,
-        start,
-        end
-      );
-
-      Object.defineProperty(this, name, {
-        value: val,
-        writable: false,
-        configurable: false,
-        enumerable: false,
-      });
-
-      return val;
-    },
-  });
-};
-
-addString('catalog');
-addString('schema');
-addString('table');
-addString('orgTable');
-addString('orgName');
-
-module.exports = ColumnDefinition;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/execute.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/execute.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,214 +1,0 @@
-'use strict';
-
-const CursorType = require('../constants/cursor');
-const CommandCodes = require('../constants/commands');
-const Types = require('../constants/types');
-const Packet = require('../packets/packet');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-
-function isJSON(value) {
-  return (
-    Array.isArray(value) ||
-    value.constructor === Object ||
-    (typeof value.toJSON === 'function' && !Buffer.isBuffer(value))
-  );
-}
-
-/**
- * Converts a value to an object describing type, String/Buffer representation and length
- * @param {*} value
- */
-function toParameter(value, encoding, timezone) {
-  let type = Types.VAR_STRING;
-  let length;
-  let writer = function (value) {
-    // eslint-disable-next-line no-invalid-this
-    return Packet.prototype.writeLengthCodedString.call(this, value, encoding);
-  };
-  if (value !== null) {
-    switch (typeof value) {
-      case 'undefined':
-        throw new TypeError('Bind parameters must not contain undefined');
-
-      case 'number':
-        type = Types.DOUBLE;
-        length = 8;
-        writer = Packet.prototype.writeDouble;
-        break;
-
-      case 'boolean':
-        value = value | 0;
-        type = Types.TINY;
-        length = 1;
-        writer = Packet.prototype.writeInt8;
-        break;
-
-      case 'object':
-        if (Object.prototype.toString.call(value) === '[object Date]') {
-          type = Types.DATETIME;
-          length = 12;
-          writer = function (value) {
-            // eslint-disable-next-line no-invalid-this
-            return Packet.prototype.writeDate.call(this, value, timezone);
-          };
-        } else if (isJSON(value)) {
-          value = JSON.stringify(value);
-          type = Types.JSON;
-        } else if (Buffer.isBuffer(value)) {
-          length = Packet.lengthCodedNumberLength(value.length) + value.length;
-          writer = Packet.prototype.writeLengthCodedBuffer;
-        }
-        break;
-
-      default:
-        value = value.toString();
-    }
-  } else {
-    value = '';
-    type = Types.NULL;
-  }
-  if (!length) {
-    length = Packet.lengthCodedStringLength(value, encoding);
-  }
-  return { value, type, length, writer };
-}
-
-class Execute {
-  constructor(id, parameters, charsetNumber, timezone) {
-    this.id = id;
-    this.parameters = parameters;
-    this.encoding = CharsetToEncoding[charsetNumber];
-    this.timezone = timezone;
-  }
-
-  static fromPacket(packet, encoding) {
-    const stmtId = packet.readInt32();
-    const flags = packet.readInt8();
-    const iterationCount = packet.readInt32();
-
-    let i = packet.offset;
-    while (i < packet.end - 1) {
-      if (
-        (packet.buffer[i + 1] === Types.VAR_STRING ||
-          packet.buffer[i + 1] === Types.NULL ||
-          packet.buffer[i + 1] === Types.DOUBLE ||
-          packet.buffer[i + 1] === Types.TINY ||
-          packet.buffer[i + 1] === Types.DATETIME ||
-          packet.buffer[i + 1] === Types.JSON) &&
-        packet.buffer[i] === 1 &&
-        packet.buffer[i + 2] === 0
-      ) {
-        break;
-      } else {
-        packet.readInt8();
-      }
-      i++;
-    }
-
-    const types = [];
-
-    for (let i = packet.offset + 1; i < packet.end - 1; i++) {
-      if (
-        (packet.buffer[i] === Types.VAR_STRING ||
-          packet.buffer[i] === Types.NULL ||
-          packet.buffer[i] === Types.DOUBLE ||
-          packet.buffer[i] === Types.TINY ||
-          packet.buffer[i] === Types.DATETIME ||
-          packet.buffer[i] === Types.JSON) &&
-        packet.buffer[i + 1] === 0
-      ) {
-        types.push(packet.buffer[i]);
-        packet.skip(2);
-      }
-    }
-
-    packet.skip(1);
-
-    const values = [];
-    for (let i = 0; i < types.length; i++) {
-      if (types[i] === Types.VAR_STRING) {
-        values.push(packet.readLengthCodedString(encoding));
-      } else if (types[i] === Types.DOUBLE) {
-        values.push(packet.readDouble());
-      } else if (types[i] === Types.TINY) {
-        values.push(packet.readInt8());
-      } else if (types[i] === Types.DATETIME) {
-        values.push(packet.readDateTime());
-      } else if (types[i] === Types.JSON) {
-        values.push(JSON.parse(packet.readLengthCodedString(encoding)));
-      }
-      if (types[i] === Types.NULL) {
-        values.push(null);
-      }
-    }
-
-    return { stmtId, flags, iterationCount, values };
-  }
-
-  toPacket() {
-    // TODO: don't try to calculate packet length in advance, allocate some big buffer in advance (header + 256 bytes?)
-    // and copy + reallocate if not enough
-    // 0 + 4 - length, seqId
-    // 4 + 1 - COM_EXECUTE
-    // 5 + 4 - stmtId
-    // 9 + 1 - flags
-    // 10 + 4 - iteration-count (always 1)
-    let length = 14;
-    let parameters;
-    if (this.parameters && this.parameters.length > 0) {
-      length += Math.floor((this.parameters.length + 7) / 8);
-      length += 1; // new-params-bound-flag
-      length += 2 * this.parameters.length; // type byte for each parameter if new-params-bound-flag is set
-      parameters = this.parameters.map((value) =>
-        toParameter(value, this.encoding, this.timezone)
-      );
-      length += parameters.reduce(
-        (accumulator, parameter) => accumulator + parameter.length,
-        0
-      );
-    }
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(CommandCodes.STMT_EXECUTE);
-    packet.writeInt32(this.id);
-    packet.writeInt8(CursorType.NO_CURSOR); // flags
-    packet.writeInt32(1); // iteration-count, always 1
-    if (parameters) {
-      let bitmap = 0;
-      let bitValue = 1;
-      parameters.forEach((parameter) => {
-        if (parameter.type === Types.NULL) {
-          bitmap += bitValue;
-        }
-        bitValue *= 2;
-        if (bitValue === 256) {
-          packet.writeInt8(bitmap);
-          bitmap = 0;
-          bitValue = 1;
-        }
-      });
-      if (bitValue !== 1) {
-        packet.writeInt8(bitmap);
-      }
-      // TODO: explain meaning of the flag
-      // afaik, if set n*2 bytes with type of parameter are sent before parameters
-      // if not, previous execution types are used (TODO prooflink)
-      packet.writeInt8(1); // new-params-bound-flag
-      // Write parameter types
-      parameters.forEach((parameter) => {
-        packet.writeInt8(parameter.type); // field type
-        packet.writeInt8(0); // parameter flag
-      });
-      // Write parameter values
-      parameters.forEach((parameter) => {
-        if (parameter.type !== Types.NULL) {
-          parameter.writer.call(packet, parameter.value);
-        }
-      });
-    }
-    return packet;
-  }
-}
-
-module.exports = Execute;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/handshake.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/handshake.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,112 +1,0 @@
-'use strict';
-
-const Packet = require('../packets/packet');
-const ClientConstants = require('../constants/client.js');
-
-// https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::Handshake
-
-class Handshake {
-  constructor(args) {
-    this.protocolVersion = args.protocolVersion;
-    this.serverVersion = args.serverVersion;
-    this.capabilityFlags = args.capabilityFlags;
-    this.connectionId = args.connectionId;
-    this.authPluginData1 = args.authPluginData1;
-    this.authPluginData2 = args.authPluginData2;
-    this.characterSet = args.characterSet;
-    this.statusFlags = args.statusFlags;
-    this.authPluginName = args.authPluginName;
-  }
-
-  setScrambleData(cb) {
-    require('crypto').randomBytes(20, (err, data) => {
-      if (err) {
-        cb(err);
-        return;
-      }
-      this.authPluginData1 = data.slice(0, 8);
-      this.authPluginData2 = data.slice(8, 20);
-      cb();
-    });
-  }
-
-  toPacket(sequenceId) {
-    const length = 68 + Buffer.byteLength(this.serverVersion, 'utf8');
-    const buffer = Buffer.alloc(length + 4, 0); // zero fill, 10 bytes filler later needs to contain zeros
-    const packet = new Packet(sequenceId, buffer, 0, length + 4);
-    packet.offset = 4;
-    packet.writeInt8(this.protocolVersion);
-    packet.writeString(this.serverVersion, 'cesu8');
-    packet.writeInt8(0);
-    packet.writeInt32(this.connectionId);
-    packet.writeBuffer(this.authPluginData1);
-    packet.writeInt8(0);
-    const capabilityFlagsBuffer = Buffer.allocUnsafe(4);
-    capabilityFlagsBuffer.writeUInt32LE(this.capabilityFlags, 0);
-    packet.writeBuffer(capabilityFlagsBuffer.slice(0, 2));
-    packet.writeInt8(this.characterSet);
-    packet.writeInt16(this.statusFlags);
-    packet.writeBuffer(capabilityFlagsBuffer.slice(2, 4));
-    packet.writeInt8(21); // authPluginDataLength
-    packet.skip(10);
-    packet.writeBuffer(this.authPluginData2);
-    packet.writeInt8(0);
-    packet.writeString('mysql_native_password', 'latin1');
-    packet.writeInt8(0);
-    return packet;
-  }
-
-  static fromPacket(packet) {
-    const args = {};
-    args.protocolVersion = packet.readInt8();
-    args.serverVersion = packet.readNullTerminatedString('cesu8');
-    args.connectionId = packet.readInt32();
-    args.authPluginData1 = packet.readBuffer(8);
-    packet.skip(1);
-    const capabilityFlagsBuffer = Buffer.allocUnsafe(4);
-    capabilityFlagsBuffer[0] = packet.readInt8();
-    capabilityFlagsBuffer[1] = packet.readInt8();
-    if (packet.haveMoreData()) {
-      args.characterSet = packet.readInt8();
-      args.statusFlags = packet.readInt16();
-      // upper 2 bytes
-      capabilityFlagsBuffer[2] = packet.readInt8();
-      capabilityFlagsBuffer[3] = packet.readInt8();
-      args.capabilityFlags = capabilityFlagsBuffer.readUInt32LE(0);
-      if (args.capabilityFlags & ClientConstants.PLUGIN_AUTH) {
-        args.authPluginDataLength = packet.readInt8();
-      } else {
-        args.authPluginDataLength = 0;
-        packet.skip(1);
-      }
-      packet.skip(10);
-    } else {
-      args.capabilityFlags = capabilityFlagsBuffer.readUInt16LE(0);
-    }
-
-    const isSecureConnection =
-      args.capabilityFlags & ClientConstants.SECURE_CONNECTION;
-    if (isSecureConnection) {
-      const authPluginDataLength = args.authPluginDataLength;
-      if (authPluginDataLength === 0) {
-        // for Secure Password Authentication
-        args.authPluginDataLength = 20;
-        args.authPluginData2 = packet.readBuffer(12);
-        packet.skip(1);
-      } else {
-        // length > 0
-        // for Custom Auth Plugin (PLUGIN_AUTH)
-        const len = Math.max(13, authPluginDataLength - 8);
-        args.authPluginData2 = packet.readBuffer(len);
-      }
-    }
-
-    if (args.capabilityFlags & ClientConstants.PLUGIN_AUTH) {
-      args.authPluginName = packet.readNullTerminatedString('ascii');
-    }
-
-    return new Handshake(args);
-  }
-}
-
-module.exports = Handshake;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/handshake_response.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/handshake_response.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,144 +1,0 @@
-'use strict';
-
-const ClientConstants = require('../constants/client.js');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-const Packet = require('../packets/packet.js');
-
-const auth41 = require('../auth_41.js');
-
-class HandshakeResponse {
-  constructor(handshake) {
-    this.user = handshake.user || '';
-    this.database = handshake.database || '';
-    this.password = handshake.password || '';
-    this.passwordSha1 = handshake.passwordSha1;
-    this.authPluginData1 = handshake.authPluginData1;
-    this.authPluginData2 = handshake.authPluginData2;
-    this.compress = handshake.compress;
-    this.clientFlags = handshake.flags;
-    // TODO: pre-4.1 auth support
-    let authToken;
-    if (this.passwordSha1) {
-      authToken = auth41.calculateTokenFromPasswordSha(
-        this.passwordSha1,
-        this.authPluginData1,
-        this.authPluginData2
-      );
-    } else {
-      authToken = auth41.calculateToken(
-        this.password,
-        this.authPluginData1,
-        this.authPluginData2
-      );
-    }
-    this.authToken = authToken;
-    this.charsetNumber = handshake.charsetNumber;
-    this.encoding = CharsetToEncoding[handshake.charsetNumber];
-    this.connectAttributes = handshake.connectAttributes;
-  }
-
-  serializeResponse(buffer) {
-    const isSet = (flag) => this.clientFlags & ClientConstants[flag];
-    const packet = new Packet(0, buffer, 0, buffer.length);
-    packet.offset = 4;
-    packet.writeInt32(this.clientFlags);
-    packet.writeInt32(0); // max packet size. todo: move to config
-    packet.writeInt8(this.charsetNumber);
-    packet.skip(23);
-    const encoding = this.encoding;
-    packet.writeNullTerminatedString(this.user, encoding);
-    let k;
-    if (isSet('PLUGIN_AUTH_LENENC_CLIENT_DATA')) {
-      packet.writeLengthCodedNumber(this.authToken.length);
-      packet.writeBuffer(this.authToken);
-    } else if (isSet('SECURE_CONNECTION')) {
-      packet.writeInt8(this.authToken.length);
-      packet.writeBuffer(this.authToken);
-    } else {
-      packet.writeBuffer(this.authToken);
-      packet.writeInt8(0);
-    }
-    if (isSet('CONNECT_WITH_DB')) {
-      packet.writeNullTerminatedString(this.database, encoding);
-    }
-    if (isSet('PLUGIN_AUTH')) {
-      // TODO: pass from config
-      packet.writeNullTerminatedString('mysql_native_password', 'latin1');
-    }
-    if (isSet('CONNECT_ATTRS')) {
-      const connectAttributes = this.connectAttributes || {};
-      const attrNames = Object.keys(connectAttributes);
-      let keysLength = 0;
-      for (k = 0; k < attrNames.length; ++k) {
-        keysLength += Packet.lengthCodedStringLength(attrNames[k], encoding);
-        keysLength += Packet.lengthCodedStringLength(
-          connectAttributes[attrNames[k]],
-          encoding
-        );
-      }
-      packet.writeLengthCodedNumber(keysLength);
-      for (k = 0; k < attrNames.length; ++k) {
-        packet.writeLengthCodedString(attrNames[k], encoding);
-        packet.writeLengthCodedString(
-          connectAttributes[attrNames[k]],
-          encoding
-        );
-      }
-    }
-    return packet;
-  }
-
-  toPacket() {
-    if (typeof this.user !== 'string') {
-      throw new Error('"user" connection config property must be a string');
-    }
-    if (typeof this.database !== 'string') {
-      throw new Error('"database" connection config property must be a string');
-    }
-    // dry run: calculate resulting packet length
-    const p = this.serializeResponse(Packet.MockBuffer());
-    return this.serializeResponse(Buffer.alloc(p.offset));
-  }
-  static fromPacket(packet) {
-    const args = {};
-    args.clientFlags = packet.readInt32();
-    function isSet(flag) {
-      return args.clientFlags & ClientConstants[flag];
-    }
-    args.maxPacketSize = packet.readInt32();
-    args.charsetNumber = packet.readInt8();
-    const encoding = CharsetToEncoding[args.charsetNumber];
-    args.encoding = encoding;
-    packet.skip(23);
-    args.user = packet.readNullTerminatedString(encoding);
-    let authTokenLength;
-    if (isSet('PLUGIN_AUTH_LENENC_CLIENT_DATA')) {
-      authTokenLength = packet.readLengthCodedNumber(encoding);
-      args.authToken = packet.readBuffer(authTokenLength);
-    } else if (isSet('SECURE_CONNECTION')) {
-      authTokenLength = packet.readInt8();
-      args.authToken = packet.readBuffer(authTokenLength);
-    } else {
-      args.authToken = packet.readNullTerminatedString(encoding);
-    }
-    if (isSet('CONNECT_WITH_DB')) {
-      args.database = packet.readNullTerminatedString(encoding);
-    }
-    if (isSet('PLUGIN_AUTH')) {
-      args.authPluginName = packet.readNullTerminatedString(encoding);
-    }
-    if (isSet('CONNECT_ATTRS')) {
-      const keysLength = packet.readLengthCodedNumber(encoding);
-      const keysEnd = packet.offset + keysLength;
-      const attrs = {};
-      while (packet.offset < keysEnd) {
-        attrs[packet.readLengthCodedString(encoding)] =
-          packet.readLengthCodedString(encoding);
-      }
-      args.connectAttributes = attrs;
-    }
-    return args;
-  }
-}
-
-module.exports = HandshakeResponse;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,152 +1,0 @@
-// This file was modified by Oracle on June 1, 2021.
-// A utility method was introduced to generate an Error instance from a
-// binary server packet.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-// This file was modified by Oracle on September 21, 2021.
-// The new AuthNextFactor packet is now available.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const process = require('process');
-
-const AuthNextFactor = require('./auth_next_factor');
-const AuthSwitchRequest = require('./auth_switch_request');
-const AuthSwitchRequestMoreData = require('./auth_switch_request_more_data');
-const AuthSwitchResponse = require('./auth_switch_response');
-const BinaryRow = require('./binary_row');
-const BinlogDump = require('./binlog_dump');
-const ChangeUser = require('./change_user');
-const CloseStatement = require('./close_statement');
-const ColumnDefinition = require('./column_definition');
-const Execute = require('./execute');
-const Handshake = require('./handshake');
-const HandshakeResponse = require('./handshake_response');
-const PrepareStatement = require('./prepare_statement');
-const PreparedStatementHeader = require('./prepared_statement_header');
-const Query = require('./query');
-const RegisterSlave = require('./register_slave');
-const ResultSetHeader = require('./resultset_header');
-const SSLRequest = require('./ssl_request');
-const TextRow = require('./text_row');
-
-const ctorMap = {
-  AuthNextFactor,
-  AuthSwitchRequest,
-  AuthSwitchRequestMoreData,
-  AuthSwitchResponse,
-  BinaryRow,
-  BinlogDump,
-  ChangeUser,
-  CloseStatement,
-  ColumnDefinition,
-  Execute,
-  Handshake,
-  HandshakeResponse,
-  PrepareStatement,
-  PreparedStatementHeader,
-  Query,
-  RegisterSlave,
-  ResultSetHeader,
-  SSLRequest,
-  TextRow,
-};
-Object.entries(ctorMap).forEach(([name, ctor]) => {
-  module.exports[name] = ctor;
-  // monkey-patch it to include name if debug is on
-  if (process.env.NODE_DEBUG) {
-    if (ctor.prototype.toPacket) {
-      const old = ctor.prototype.toPacket;
-      ctor.prototype.toPacket = function () {
-        const p = old.call(this);
-        p._name = name;
-        return p;
-      };
-    }
-  }
-});
-
-// simple packets:
-const Packet = require('./packet');
-exports.Packet = Packet;
-
-class OK {
-  static toPacket(args, encoding) {
-    args = args || {};
-    const affectedRows = args.affectedRows || 0;
-    const insertId = args.insertId || 0;
-    const serverStatus = args.serverStatus || 0;
-    const warningCount = args.warningCount || 0;
-    const message = args.message || '';
-
-    let length = 9 + Packet.lengthCodedNumberLength(affectedRows);
-    length += Packet.lengthCodedNumberLength(insertId);
-
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(0);
-    packet.writeLengthCodedNumber(affectedRows);
-    packet.writeLengthCodedNumber(insertId);
-    packet.writeInt16(serverStatus);
-    packet.writeInt16(warningCount);
-    packet.writeString(message, encoding);
-    packet._name = 'OK';
-    return packet;
-  }
-}
-
-exports.OK = OK;
-
-// warnings, statusFlags
-class EOF {
-  static toPacket(warnings, statusFlags) {
-    if (typeof warnings === 'undefined') {
-      warnings = 0;
-    }
-    if (typeof statusFlags === 'undefined') {
-      statusFlags = 0;
-    }
-    const packet = new Packet(0, Buffer.allocUnsafe(9), 0, 9);
-    packet.offset = 4;
-    packet.writeInt8(0xfe);
-    packet.writeInt16(warnings);
-    packet.writeInt16(statusFlags);
-    packet._name = 'EOF';
-    return packet;
-  }
-}
-
-exports.EOF = EOF;
-
-class Error {
-  static toPacket(args, encoding) {
-    const length = 13 + Buffer.byteLength(args.message, 'utf8');
-    const packet = new Packet(0, Buffer.allocUnsafe(length), 0, length);
-    packet.offset = 4;
-    packet.writeInt8(0xff);
-    packet.writeInt16(args.code);
-    // TODO: sql state parameter
-    packet.writeString('#_____', encoding);
-    packet.writeString(args.message, encoding);
-    packet._name = 'Error';
-    return packet;
-  }
-
-  static fromPacket(packet) {
-    packet.readInt8(); // marker
-    const code = packet.readInt16();
-    packet.readString(1, 'ascii'); // sql state marker
-    // The SQL state of the ERR_Packet which is always 5 bytes long.
-    // https://dev.mysql.com/doc/dev/mysql-server/8.0.11/page_protocol_basic_dt_strings.html#sect_protocol_basic_dt_string_fix
-    packet.readString(5, 'ascii'); // sql state (ignore for now)
-    const message = packet.readNullTerminatedString('utf8');
-    const error = new Error();
-    error.message = message;
-    error.code = code;
-    return error;
-  }
-}
-
-exports.Error = Error;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/packet.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/packet.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,931 +1,0 @@
-// This file was modified by Oracle on June 1, 2021.
-// A comment describing some changes in the strict default SQL mode regarding
-// non-standard dates was introduced.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-'use strict';
-
-const ErrorCodeToName = require('../constants/errors.js');
-const NativeBuffer = require('buffer').Buffer;
-const Long = require('long');
-const StringParser = require('../parsers/string.js');
-const Types = require('../constants/types.js');
-const INVALID_DATE = new Date(NaN);
-
-// this is nearly duplicate of previous function so generated code is not slower
-// due to "if (dateStrings)" branching
-const pad = '000000000000';
-function leftPad(num, value) {
-  const s = value.toString();
-  // if we don't need to pad
-  if (s.length >= num) {
-    return s;
-  }
-  return (pad + s).slice(-num);
-}
-
-// The whole reason parse* function below exist
-// is because String creation is relatively expensive (at least with V8), and if we have
-// a buffer with "12345" content ideally we would like to bypass intermediate
-// "12345" string creation and directly build 12345 number out of
-// <Buffer 31 32 33 34 35> data.
-// In my benchmarks the difference is ~25M 8-digit numbers per second vs
-// 4.5 M using Number(packet.readLengthCodedString())
-// not used when size is close to max precision as series of *10 accumulate error
-// and approximate result mihgt be diffreent from (approximate as well) Number(bigNumStringValue))
-// In the futire node version if speed difference is smaller parse* functions might be removed
-// don't consider them as Packet public API
-
-const minus = '-'.charCodeAt(0);
-const plus = '+'.charCodeAt(0);
-
-// TODO: handle E notation
-const dot = '.'.charCodeAt(0);
-const exponent = 'e'.charCodeAt(0);
-const exponentCapital = 'E'.charCodeAt(0);
-
-class Packet {
-  constructor(id, buffer, start, end) {
-    // hot path, enable checks when testing only
-    // if (!Buffer.isBuffer(buffer) || typeof start == 'undefined' || typeof end == 'undefined')
-    //  throw new Error('invalid packet');
-    this.sequenceId = id;
-    this.numPackets = 1;
-    this.buffer = buffer;
-    this.start = start;
-    this.offset = start + 4;
-    this.end = end;
-  }
-
-  // ==============================
-  // readers
-  // ==============================
-  reset() {
-    this.offset = this.start + 4;
-  }
-
-  length() {
-    return this.end - this.start;
-  }
-
-  slice() {
-    return this.buffer.slice(this.start, this.end);
-  }
-
-  dump() {
-    // eslint-disable-next-line no-console
-    console.log(
-      [this.buffer.asciiSlice(this.start, this.end)],
-      this.buffer.slice(this.start, this.end),
-      this.length(),
-      this.sequenceId
-    );
-  }
-
-  haveMoreData() {
-    return this.end > this.offset;
-  }
-
-  skip(num) {
-    this.offset += num;
-  }
-
-  readInt8() {
-    return this.buffer[this.offset++];
-  }
-
-  readInt16() {
-    this.offset += 2;
-    return this.buffer.readUInt16LE(this.offset - 2);
-  }
-
-  readInt24() {
-    return this.readInt16() + (this.readInt8() << 16);
-  }
-
-  readInt32() {
-    this.offset += 4;
-    return this.buffer.readUInt32LE(this.offset - 4);
-  }
-
-  readSInt8() {
-    return this.buffer.readInt8(this.offset++);
-  }
-
-  readSInt16() {
-    this.offset += 2;
-    return this.buffer.readInt16LE(this.offset - 2);
-  }
-
-  readSInt32() {
-    this.offset += 4;
-    return this.buffer.readInt32LE(this.offset - 4);
-  }
-
-  readInt64JSNumber() {
-    const word0 = this.readInt32();
-    const word1 = this.readInt32();
-    const l = new Long(word0, word1, true);
-    return l.toNumber();
-  }
-
-  readSInt64JSNumber() {
-    const word0 = this.readInt32();
-    const word1 = this.readInt32();
-    if (!(word1 & 0x80000000)) {
-      return word0 + 0x100000000 * word1;
-    }
-    const l = new Long(word0, word1, false);
-    return l.toNumber();
-  }
-
-  readInt64String() {
-    const word0 = this.readInt32();
-    const word1 = this.readInt32();
-    const res = new Long(word0, word1, true);
-    return res.toString();
-  }
-
-  readSInt64String() {
-    const word0 = this.readInt32();
-    const word1 = this.readInt32();
-    const res = new Long(word0, word1, false);
-    return res.toString();
-  }
-
-  readInt64() {
-    const word0 = this.readInt32();
-    const word1 = this.readInt32();
-    let res = new Long(word0, word1, true);
-    const resNumber = res.toNumber();
-    const resString = res.toString();
-    res = resNumber.toString() === resString ? resNumber : resString;
-    return res;
-  }
-
-  readSInt64() {
-    const word0 = this.readInt32();
-    const word1 = this.readInt32();
-    let res = new Long(word0, word1, false);
-    const resNumber = res.toNumber();
-    const resString = res.toString();
-    res = resNumber.toString() === resString ? resNumber : resString;
-    return res;
-  }
-
-  isEOF() {
-    return this.buffer[this.offset] === 0xfe && this.length() < 13;
-  }
-
-  eofStatusFlags() {
-    return this.buffer.readInt16LE(this.offset + 3);
-  }
-
-  eofWarningCount() {
-    return this.buffer.readInt16LE(this.offset + 1);
-  }
-
-  readLengthCodedNumber(bigNumberStrings, signed) {
-    const byte1 = this.buffer[this.offset++];
-    if (byte1 < 251) {
-      return byte1;
-    }
-    return this.readLengthCodedNumberExt(byte1, bigNumberStrings, signed);
-  }
-
-  readLengthCodedNumberSigned(bigNumberStrings) {
-    return this.readLengthCodedNumber(bigNumberStrings, true);
-  }
-
-  readLengthCodedNumberExt(tag, bigNumberStrings, signed) {
-    let word0, word1;
-    let res;
-    if (tag === 0xfb) {
-      return null;
-    }
-    if (tag === 0xfc) {
-      return this.readInt8() + (this.readInt8() << 8);
-    }
-    if (tag === 0xfd) {
-      return this.readInt8() + (this.readInt8() << 8) + (this.readInt8() << 16);
-    }
-    if (tag === 0xfe) {
-      // TODO: check version
-      // Up to MySQL 3.22, 0xfe was followed by a 4-byte integer.
-      word0 = this.readInt32();
-      word1 = this.readInt32();
-      if (word1 === 0) {
-        return word0; // don't convert to float if possible
-      }
-      if (word1 < 2097152) {
-        // max exact float point int, 2^52 / 2^32
-        return word1 * 0x100000000 + word0;
-      }
-      res = new Long(word0, word1, !signed); // Long need unsigned
-      const resNumber = res.toNumber();
-      const resString = res.toString();
-      res = resNumber.toString() === resString ? resNumber : resString;
-      return bigNumberStrings ? resString : res;
-    }
-    // eslint-disable-next-line no-console
-    console.trace();
-    throw new Error(`Should not reach here: ${tag}`);
-  }
-
-  readFloat() {
-    const res = this.buffer.readFloatLE(this.offset);
-    this.offset += 4;
-    return res;
-  }
-
-  readDouble() {
-    const res = this.buffer.readDoubleLE(this.offset);
-    this.offset += 8;
-    return res;
-  }
-
-  readBuffer(len) {
-    if (typeof len === 'undefined') {
-      len = this.end - this.offset;
-    }
-    this.offset += len;
-    return this.buffer.slice(this.offset - len, this.offset);
-  }
-
-  // DATE, DATETIME and TIMESTAMP
-  readDateTime(timezone) {
-    if (!timezone || timezone === 'Z' || timezone === 'local') {
-      const length = this.readInt8();
-      if (length === 0xfb) {
-        return null;
-      }
-      let y = 0;
-      let m = 0;
-      let d = 0;
-      let H = 0;
-      let M = 0;
-      let S = 0;
-      let ms = 0;
-      if (length > 3) {
-        y = this.readInt16();
-        m = this.readInt8();
-        d = this.readInt8();
-      }
-      if (length > 6) {
-        H = this.readInt8();
-        M = this.readInt8();
-        S = this.readInt8();
-      }
-      if (length > 10) {
-        ms = this.readInt32() / 1000;
-      }
-      // NO_ZERO_DATE mode and NO_ZERO_IN_DATE mode are part of the strict
-      // default SQL mode used by MySQL 8.0. This means that non-standard
-      // dates like '0000-00-00' become NULL. For older versions and other
-      // possible MySQL flavours we still need to account for the
-      // non-standard behaviour.
-      if (y + m + d + H + M + S + ms === 0) {
-        return INVALID_DATE;
-      }
-      if (timezone === 'Z') {
-        return new Date(Date.UTC(y, m - 1, d, H, M, S, ms));
-      }
-      return new Date(y, m - 1, d, H, M, S, ms);
-    }
-    let str = this.readDateTimeString(6, 'T', null);
-    if (str.length === 10) {
-      str += 'T00:00:00';
-    }
-    return new Date(str + timezone);
-  }
-
-  readDateTimeString(decimals, timeSep, columnType) {
-    const length = this.readInt8();
-    let y = 0;
-    let m = 0;
-    let d = 0;
-    let H = 0;
-    let M = 0;
-    let S = 0;
-    let ms = 0;
-    let str;
-    if (length > 3) {
-      y = this.readInt16();
-      m = this.readInt8();
-      d = this.readInt8();
-      str = [leftPad(4, y), leftPad(2, m), leftPad(2, d)].join('-');
-    }
-    if (length > 6) {
-      H = this.readInt8();
-      M = this.readInt8();
-      S = this.readInt8();
-      str += `${timeSep || ' '}${[
-        leftPad(2, H),
-        leftPad(2, M),
-        leftPad(2, S),
-      ].join(':')}`;
-    } else if (columnType === Types.DATETIME) {
-      str += ' 00:00:00';
-    }
-    if (length > 10) {
-      ms = this.readInt32();
-      str += '.';
-      if (decimals) {
-        ms = leftPad(6, ms);
-        if (ms.length > decimals) {
-          ms = ms.substring(0, decimals); // rounding is done at the MySQL side, only 0 are here
-        }
-      }
-      str += ms;
-    }
-    return str;
-  }
-
-  // TIME - value as a string, Can be negative
-  readTimeString(convertTtoMs) {
-    const length = this.readInt8();
-    if (length === 0) {
-      return '00:00:00';
-    }
-    const sign = this.readInt8() ? -1 : 1; // 'isNegative' flag byte
-    let d = 0;
-    let H = 0;
-    let M = 0;
-    let S = 0;
-    let ms = 0;
-    if (length > 6) {
-      d = this.readInt32();
-      H = this.readInt8();
-      M = this.readInt8();
-      S = this.readInt8();
-    }
-    if (length > 10) {
-      ms = this.readInt32();
-    }
-    if (convertTtoMs) {
-      H += d * 24;
-      M += H * 60;
-      S += M * 60;
-      ms += S * 1000;
-      ms *= sign;
-      return ms;
-    }
-    // Format follows mySQL TIME format ([-][h]hh:mm:ss[.u[u[u[u[u[u]]]]]])
-    // For positive times below 24 hours, this makes it equal to ISO 8601 times
-    return (
-      (sign === -1 ? '-' : '') +
-      [leftPad(2, d * 24 + H), leftPad(2, M), leftPad(2, S)].join(':') +
-      (ms ? `.${ms}`.replace(/0+$/, '') : '')
-    );
-  }
-
-  readLengthCodedString(encoding) {
-    const len = this.readLengthCodedNumber();
-    // TODO: check manually first byte here to avoid polymorphic return type?
-    if (len === null) {
-      return null;
-    }
-    this.offset += len;
-    // TODO: Use characterSetCode to get proper encoding
-    // https://github.com/sidorares/node-mysql2/pull/374
-    return StringParser.decode(
-      this.buffer,
-      encoding,
-      this.offset - len,
-      this.offset
-    );
-  }
-
-  readLengthCodedBuffer() {
-    const len = this.readLengthCodedNumber();
-    if (len === null) {
-      return null;
-    }
-    return this.readBuffer(len);
-  }
-
-  readNullTerminatedString(encoding) {
-    const start = this.offset;
-    let end = this.offset;
-    while (this.buffer[end]) {
-      end = end + 1; // TODO: handle OOB check
-    }
-    this.offset = end + 1;
-    return StringParser.decode(this.buffer, encoding, start, end);
-  }
-
-  // TODO reuse?
-  readString(len, encoding) {
-    if (typeof len === 'string' && typeof encoding === 'undefined') {
-      encoding = len;
-      len = undefined;
-    }
-    if (typeof len === 'undefined') {
-      len = this.end - this.offset;
-    }
-    this.offset += len;
-    return StringParser.decode(
-      this.buffer,
-      encoding,
-      this.offset - len,
-      this.offset
-    );
-  }
-
-  parseInt(len, supportBigNumbers) {
-    if (len === null) {
-      return null;
-    }
-    if (len >= 14 && !supportBigNumbers) {
-      const s = this.buffer.toString('ascii', this.offset, this.offset + len);
-      this.offset += len;
-      return Number(s);
-    }
-    let result = 0;
-    const start = this.offset;
-    const end = this.offset + len;
-    let sign = 1;
-    if (len === 0) {
-      return 0; // TODO: assert? exception?
-    }
-    if (this.buffer[this.offset] === minus) {
-      this.offset++;
-      sign = -1;
-    }
-    // max precise int is 9007199254740992
-    let str;
-    const numDigits = end - this.offset;
-    if (supportBigNumbers) {
-      if (numDigits >= 15) {
-        str = this.readString(end - this.offset, 'binary');
-        result = parseInt(str, 10);
-        if (result.toString() === str) {
-          return sign * result;
-        }
-        return sign === -1 ? `-${str}` : str;
-      }
-      if (numDigits > 16) {
-        str = this.readString(end - this.offset);
-        return sign === -1 ? `-${str}` : str;
-      }
-    }
-    if (this.buffer[this.offset] === plus) {
-      this.offset++; // just ignore
-    }
-    while (this.offset < end) {
-      result *= 10;
-      result += this.buffer[this.offset] - 48;
-      this.offset++;
-    }
-    const num = result * sign;
-    if (!supportBigNumbers) {
-      return num;
-    }
-    str = this.buffer.toString('ascii', start, end);
-    if (num.toString() === str) {
-      return num;
-    }
-    return str;
-  }
-
-  // note that if value of inputNumberAsString is bigger than MAX_SAFE_INTEGER
-  // ( or smaller than MIN_SAFE_INTEGER ) the parseIntNoBigCheck result might be
-  // different from what you would get from Number(inputNumberAsString)
-  // String(parseIntNoBigCheck) <> String(Number(inputNumberAsString)) <> inputNumberAsString
-  parseIntNoBigCheck(len) {
-    if (len === null) {
-      return null;
-    }
-    let result = 0;
-    const end = this.offset + len;
-    let sign = 1;
-    if (len === 0) {
-      return 0; // TODO: assert? exception?
-    }
-    if (this.buffer[this.offset] === minus) {
-      this.offset++;
-      sign = -1;
-    }
-    if (this.buffer[this.offset] === plus) {
-      this.offset++; // just ignore
-    }
-    while (this.offset < end) {
-      result *= 10;
-      result += this.buffer[this.offset] - 48;
-      this.offset++;
-    }
-    return result * sign;
-  }
-
-  // copy-paste from https://github.com/mysqljs/mysql/blob/master/lib/protocol/Parser.js
-  parseGeometryValue() {
-    const buffer = this.readLengthCodedBuffer();
-    let offset = 4;
-    if (buffer === null || !buffer.length) {
-      return null;
-    }
-    function parseGeometry() {
-      let x, y, i, j, numPoints, line;
-      let result = null;
-      const byteOrder = buffer.readUInt8(offset);
-      offset += 1;
-      const wkbType = byteOrder
-        ? buffer.readUInt32LE(offset)
-        : buffer.readUInt32BE(offset);
-      offset += 4;
-      switch (wkbType) {
-        case 1: // WKBPoint
-          x = byteOrder
-            ? buffer.readDoubleLE(offset)
-            : buffer.readDoubleBE(offset);
-          offset += 8;
-          y = byteOrder
-            ? buffer.readDoubleLE(offset)
-            : buffer.readDoubleBE(offset);
-          offset += 8;
-          result = { x: x, y: y };
-          break;
-        case 2: // WKBLineString
-          numPoints = byteOrder
-            ? buffer.readUInt32LE(offset)
-            : buffer.readUInt32BE(offset);
-          offset += 4;
-          result = [];
-          for (i = numPoints; i > 0; i--) {
-            x = byteOrder
-              ? buffer.readDoubleLE(offset)
-              : buffer.readDoubleBE(offset);
-            offset += 8;
-            y = byteOrder
-              ? buffer.readDoubleLE(offset)
-              : buffer.readDoubleBE(offset);
-            offset += 8;
-            result.push({ x: x, y: y });
-          }
-          break;
-        case 3: // WKBPolygon
-          // eslint-disable-next-line no-case-declarations
-          const numRings = byteOrder
-            ? buffer.readUInt32LE(offset)
-            : buffer.readUInt32BE(offset);
-          offset += 4;
-          result = [];
-          for (i = numRings; i > 0; i--) {
-            numPoints = byteOrder
-              ? buffer.readUInt32LE(offset)
-              : buffer.readUInt32BE(offset);
-            offset += 4;
-            line = [];
-            for (j = numPoints; j > 0; j--) {
-              x = byteOrder
-                ? buffer.readDoubleLE(offset)
-                : buffer.readDoubleBE(offset);
-              offset += 8;
-              y = byteOrder
-                ? buffer.readDoubleLE(offset)
-                : buffer.readDoubleBE(offset);
-              offset += 8;
-              line.push({ x: x, y: y });
-            }
-            result.push(line);
-          }
-          break;
-        case 4: // WKBMultiPoint
-        case 5: // WKBMultiLineString
-        case 6: // WKBMultiPolygon
-        case 7: // WKBGeometryCollection
-          // eslint-disable-next-line no-case-declarations
-          const num = byteOrder
-            ? buffer.readUInt32LE(offset)
-            : buffer.readUInt32BE(offset);
-          offset += 4;
-          result = [];
-          for (i = num; i > 0; i--) {
-            result.push(parseGeometry());
-          }
-          break;
-      }
-      return result;
-    }
-    return parseGeometry();
-  }
-
-  parseVector() {
-    const bufLen = this.readLengthCodedNumber();
-    const vectorEnd = this.offset + bufLen;
-    const result = [];
-    while (this.offset < vectorEnd && this.offset < this.end) {
-      result.push(this.readFloat());
-    }
-    return result;
-  }
-
-  parseDate(timezone) {
-    const strLen = this.readLengthCodedNumber();
-    if (strLen === null) {
-      return null;
-    }
-    if (strLen !== 10) {
-      // we expect only YYYY-MM-DD here.
-      // if for some reason it's not the case return invalid date
-      return new Date(NaN);
-    }
-    const y = this.parseInt(4);
-    this.offset++; // -
-    const m = this.parseInt(2);
-    this.offset++; // -
-    const d = this.parseInt(2);
-    if (!timezone || timezone === 'local') {
-      return new Date(y, m - 1, d);
-    }
-    if (timezone === 'Z') {
-      return new Date(Date.UTC(y, m - 1, d));
-    }
-    return new Date(
-      `${leftPad(4, y)}-${leftPad(2, m)}-${leftPad(2, d)}T00:00:00${timezone}`
-    );
-  }
-
-  parseDateTime(timezone) {
-    const str = this.readLengthCodedString('binary');
-    if (str === null) {
-      return null;
-    }
-    if (!timezone || timezone === 'local') {
-      return new Date(str);
-    }
-    return new Date(`${str}${timezone}`);
-  }
-
-  parseFloat(len) {
-    if (len === null) {
-      return null;
-    }
-    let result = 0;
-    const end = this.offset + len;
-    let factor = 1;
-    let pastDot = false;
-    let charCode = 0;
-    if (len === 0) {
-      return 0; // TODO: assert? exception?
-    }
-    if (this.buffer[this.offset] === minus) {
-      this.offset++;
-      factor = -1;
-    }
-    if (this.buffer[this.offset] === plus) {
-      this.offset++; // just ignore
-    }
-    while (this.offset < end) {
-      charCode = this.buffer[this.offset];
-      if (charCode === dot) {
-        pastDot = true;
-        this.offset++;
-      } else if (charCode === exponent || charCode === exponentCapital) {
-        this.offset++;
-        const exponentValue = this.parseInt(end - this.offset);
-        return (result / factor) * Math.pow(10, exponentValue);
-      } else {
-        result *= 10;
-        result += this.buffer[this.offset] - 48;
-        this.offset++;
-        if (pastDot) {
-          factor = factor * 10;
-        }
-      }
-    }
-    return result / factor;
-  }
-
-  parseLengthCodedIntNoBigCheck() {
-    return this.parseIntNoBigCheck(this.readLengthCodedNumber());
-  }
-
-  parseLengthCodedInt(supportBigNumbers) {
-    return this.parseInt(this.readLengthCodedNumber(), supportBigNumbers);
-  }
-
-  parseLengthCodedIntString() {
-    return this.readLengthCodedString('binary');
-  }
-
-  parseLengthCodedFloat() {
-    return this.parseFloat(this.readLengthCodedNumber());
-  }
-
-  peekByte() {
-    return this.buffer[this.offset];
-  }
-
-  // OxFE is often used as "Alt" flag - not ok, not error.
-  // For example, it's first byte of AuthSwitchRequest
-  isAlt() {
-    return this.peekByte() === 0xfe;
-  }
-
-  isError() {
-    return this.peekByte() === 0xff;
-  }
-
-  asError(encoding) {
-    this.reset();
-    this.readInt8(); // fieldCount
-    const errorCode = this.readInt16();
-    let sqlState = '';
-    if (this.buffer[this.offset] === 0x23) {
-      this.skip(1);
-      sqlState = this.readBuffer(5).toString();
-    }
-    const message = this.readString(undefined, encoding);
-    const err = new Error(message);
-    err.code = ErrorCodeToName[errorCode];
-    err.errno = errorCode;
-    err.sqlState = sqlState;
-    err.sqlMessage = message;
-    return err;
-  }
-
-  writeInt32(n) {
-    this.buffer.writeUInt32LE(n, this.offset);
-    this.offset += 4;
-  }
-
-  writeInt24(n) {
-    this.writeInt8(n & 0xff);
-    this.writeInt16(n >> 8);
-  }
-
-  writeInt16(n) {
-    this.buffer.writeUInt16LE(n, this.offset);
-    this.offset += 2;
-  }
-
-  writeInt8(n) {
-    this.buffer.writeUInt8(n, this.offset);
-    this.offset++;
-  }
-
-  writeDouble(n) {
-    this.buffer.writeDoubleLE(n, this.offset);
-    this.offset += 8;
-  }
-
-  writeBuffer(b) {
-    b.copy(this.buffer, this.offset);
-    this.offset += b.length;
-  }
-
-  writeNull() {
-    this.buffer[this.offset] = 0xfb;
-    this.offset++;
-  }
-
-  // TODO: refactor following three?
-  writeNullTerminatedString(s, encoding) {
-    const buf = StringParser.encode(s, encoding);
-    this.buffer.length && buf.copy(this.buffer, this.offset);
-    this.offset += buf.length;
-    this.writeInt8(0);
-  }
-
-  writeString(s, encoding) {
-    if (s === null) {
-      this.writeInt8(0xfb);
-      return;
-    }
-    if (s.length === 0) {
-      return;
-    }
-    // const bytes = Buffer.byteLength(s, 'utf8');
-    // this.buffer.write(s, this.offset, bytes, 'utf8');
-    // this.offset += bytes;
-    const buf = StringParser.encode(s, encoding);
-    this.buffer.length && buf.copy(this.buffer, this.offset);
-    this.offset += buf.length;
-  }
-
-  writeLengthCodedString(s, encoding) {
-    const buf = StringParser.encode(s, encoding);
-    this.writeLengthCodedNumber(buf.length);
-    this.buffer.length && buf.copy(this.buffer, this.offset);
-    this.offset += buf.length;
-  }
-
-  writeLengthCodedBuffer(b) {
-    this.writeLengthCodedNumber(b.length);
-    b.copy(this.buffer, this.offset);
-    this.offset += b.length;
-  }
-
-  writeLengthCodedNumber(n) {
-    if (n < 0xfb) {
-      return this.writeInt8(n);
-    }
-    if (n < 0xffff) {
-      this.writeInt8(0xfc);
-      return this.writeInt16(n);
-    }
-    if (n < 0xffffff) {
-      this.writeInt8(0xfd);
-      return this.writeInt24(n);
-    }
-    if (n === null) {
-      return this.writeInt8(0xfb);
-    }
-    // TODO: check that n is out of int precision
-    this.writeInt8(0xfe);
-    this.buffer.writeUInt32LE(n, this.offset);
-    this.offset += 4;
-    this.buffer.writeUInt32LE(n >> 32, this.offset);
-    this.offset += 4;
-    return this.offset;
-  }
-
-  writeDate(d, timezone) {
-    this.buffer.writeUInt8(11, this.offset);
-    if (!timezone || timezone === 'local') {
-      this.buffer.writeUInt16LE(d.getFullYear(), this.offset + 1);
-      this.buffer.writeUInt8(d.getMonth() + 1, this.offset + 3);
-      this.buffer.writeUInt8(d.getDate(), this.offset + 4);
-      this.buffer.writeUInt8(d.getHours(), this.offset + 5);
-      this.buffer.writeUInt8(d.getMinutes(), this.offset + 6);
-      this.buffer.writeUInt8(d.getSeconds(), this.offset + 7);
-      this.buffer.writeUInt32LE(d.getMilliseconds() * 1000, this.offset + 8);
-    } else {
-      if (timezone !== 'Z') {
-        const offset =
-          (timezone[0] === '-' ? -1 : 1) *
-          (parseInt(timezone.substring(1, 3), 10) * 60 +
-            parseInt(timezone.substring(4), 10));
-        if (offset !== 0) {
-          d = new Date(d.getTime() + 60000 * offset);
-        }
-      }
-      this.buffer.writeUInt16LE(d.getUTCFullYear(), this.offset + 1);
-      this.buffer.writeUInt8(d.getUTCMonth() + 1, this.offset + 3);
-      this.buffer.writeUInt8(d.getUTCDate(), this.offset + 4);
-      this.buffer.writeUInt8(d.getUTCHours(), this.offset + 5);
-      this.buffer.writeUInt8(d.getUTCMinutes(), this.offset + 6);
-      this.buffer.writeUInt8(d.getUTCSeconds(), this.offset + 7);
-      this.buffer.writeUInt32LE(d.getUTCMilliseconds() * 1000, this.offset + 8);
-    }
-    this.offset += 12;
-  }
-
-  writeHeader(sequenceId) {
-    const offset = this.offset;
-    this.offset = 0;
-    this.writeInt24(this.buffer.length - 4);
-    this.writeInt8(sequenceId);
-    this.offset = offset;
-  }
-
-  clone() {
-    return new Packet(this.sequenceId, this.buffer, this.start, this.end);
-  }
-
-  type() {
-    if (this.isEOF()) {
-      return 'EOF';
-    }
-    if (this.isError()) {
-      return 'Error';
-    }
-    if (this.buffer[this.offset] === 0) {
-      return 'maybeOK'; // could be other packet types as well
-    }
-    return '';
-  }
-
-  static lengthCodedNumberLength(n) {
-    if (n < 0xfb) {
-      return 1;
-    }
-    if (n < 0xffff) {
-      return 3;
-    }
-    if (n < 0xffffff) {
-      return 5;
-    }
-    return 9;
-  }
-
-  static lengthCodedStringLength(str, encoding) {
-    const buf = StringParser.encode(str, encoding);
-    const slen = buf.length;
-    return Packet.lengthCodedNumberLength(slen) + slen;
-  }
-
-  static MockBuffer() {
-    const noop = function () {};
-    const res = Buffer.alloc(0);
-    for (const op in NativeBuffer.prototype) {
-      if (typeof res[op] === 'function') {
-        res[op] = noop;
-      }
-    }
-    return res;
-  }
-}
-
-module.exports = Packet;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/prepare_statement.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/prepare_statement.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,27 +1,0 @@
-'use strict';
-
-const Packet = require('../packets/packet');
-const CommandCodes = require('../constants/commands');
-const StringParser = require('../parsers/string.js');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-
-class PrepareStatement {
-  constructor(sql, charsetNumber) {
-    this.query = sql;
-    this.charsetNumber = charsetNumber;
-    this.encoding = CharsetToEncoding[charsetNumber];
-  }
-
-  toPacket() {
-    const buf = StringParser.encode(this.query, this.encoding);
-    const length = 5 + buf.length;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(CommandCodes.STMT_PREPARE);
-    packet.writeBuffer(buf);
-    return packet;
-  }
-}
-
-module.exports = PrepareStatement;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/prepared_statement_header.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/prepared_statement_header.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,16 +1,0 @@
-'use strict';
-
-class PreparedStatementHeader {
-  constructor(packet) {
-    packet.skip(1); // should be 0
-    this.id = packet.readInt32();
-    this.fieldCount = packet.readInt16();
-    this.parameterCount = packet.readInt16();
-    packet.skip(1); // should be 0
-    this.warningCount = packet.readInt16();
-  }
-}
-
-// TODO: toPacket
-
-module.exports = PreparedStatementHeader;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/query.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/query.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,27 +1,0 @@
-'use strict';
-
-const Packet = require('../packets/packet.js');
-const CommandCode = require('../constants/commands.js');
-const StringParser = require('../parsers/string.js');
-const CharsetToEncoding = require('../constants/charset_encodings.js');
-
-class Query {
-  constructor(sql, charsetNumber) {
-    this.query = sql;
-    this.charsetNumber = charsetNumber;
-    this.encoding = CharsetToEncoding[charsetNumber];
-  }
-
-  toPacket() {
-    const buf = StringParser.encode(this.query, this.encoding);
-    const length = 5 + buf.length;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(CommandCode.QUERY);
-    packet.writeBuffer(buf);
-    return packet;
-  }
-}
-
-module.exports = Query;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/register_slave.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/register_slave.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,46 +1,0 @@
-'use strict';
-
-// http://dev.mysql.com/doc/internals/en/com-register-slave.html
-// note that documentation is incorrect, for example command code is actually 0x15 but documented as 0x14
-
-const Packet = require('../packets/packet');
-const CommandCodes = require('../constants/commands');
-
-class RegisterSlave {
-  constructor(opts) {
-    this.serverId = opts.serverId || 0;
-    this.slaveHostname = opts.slaveHostname || '';
-    this.slaveUser = opts.slaveUser || '';
-    this.slavePassword = opts.slavePassword || '';
-    this.slavePort = opts.slavePort || 0;
-    this.replicationRank = opts.replicationRank || 0;
-    this.masterId = opts.masterId || 0;
-  }
-
-  toPacket() {
-    const length =
-      15 + // TODO: should be ascii?
-      Buffer.byteLength(this.slaveHostname, 'utf8') +
-      Buffer.byteLength(this.slaveUser, 'utf8') +
-      Buffer.byteLength(this.slavePassword, 'utf8') +
-      3 +
-      4;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeInt8(CommandCodes.REGISTER_SLAVE);
-    packet.writeInt32(this.serverId);
-    packet.writeInt8(Buffer.byteLength(this.slaveHostname, 'utf8'));
-    packet.writeString(this.slaveHostname);
-    packet.writeInt8(Buffer.byteLength(this.slaveUser, 'utf8'));
-    packet.writeString(this.slaveUser);
-    packet.writeInt8(Buffer.byteLength(this.slavePassword, 'utf8'));
-    packet.writeString(this.slavePassword);
-    packet.writeInt16(this.slavePort);
-    packet.writeInt32(this.replicationRank);
-    packet.writeInt32(this.masterId);
-    return packet;
-  }
-}
-
-module.exports = RegisterSlave;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/resultset_header.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/resultset_header.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,124 +1,0 @@
-'use strict';
-
-// TODO: rename to OK packet
-// https://dev.mysql.com/doc/internals/en/packet-OK_Packet.html
-
-const Packet = require('./packet.js');
-const ClientConstants = require('../constants/client.js');
-const ServerSatusFlags = require('../constants/server_status.js');
-
-const EncodingToCharset = require('../constants/encoding_charset.js');
-const sessionInfoTypes = require('../constants/session_track.js');
-
-class ResultSetHeader {
-  constructor(packet, connection) {
-    const bigNumberStrings = connection.config.bigNumberStrings;
-    const encoding = connection.serverEncoding;
-    const flags = connection._handshakePacket.capabilityFlags;
-    const isSet = function (flag) {
-      return flags & ClientConstants[flag];
-    };
-    if (packet.buffer[packet.offset] !== 0) {
-      this.fieldCount = packet.readLengthCodedNumber();
-      if (this.fieldCount === null) {
-        this.infileName = packet.readString(undefined, encoding);
-      }
-      return;
-    }
-    this.fieldCount = packet.readInt8(); // skip OK byte
-    this.affectedRows = packet.readLengthCodedNumber(bigNumberStrings);
-    this.insertId = packet.readLengthCodedNumberSigned(bigNumberStrings);
-    this.info = '';
-    if (isSet('PROTOCOL_41')) {
-      this.serverStatus = packet.readInt16();
-      this.warningStatus = packet.readInt16();
-    } else if (isSet('TRANSACTIONS')) {
-      this.serverStatus = packet.readInt16();
-    }
-    let stateChanges = null;
-    if (isSet('SESSION_TRACK') && packet.offset < packet.end) {
-      this.info = packet.readLengthCodedString(encoding);
-
-      if (this.serverStatus && ServerSatusFlags.SERVER_SESSION_STATE_CHANGED) {
-        // session change info record - see
-        // https://dev.mysql.com/doc/internals/en/packet-OK_Packet.html#cs-sect-packet-ok-sessioninfo
-        let len =
-          packet.offset < packet.end ? packet.readLengthCodedNumber() : 0;
-        const end = packet.offset + len;
-        let type, key, stateEnd;
-        if (len > 0) {
-          stateChanges = {
-            systemVariables: {},
-            schema: null,
-            gtids: [],
-            trackStateChange: null,
-          };
-        }
-        while (packet.offset < end) {
-          type = packet.readInt8();
-          len = packet.readLengthCodedNumber();
-          stateEnd = packet.offset + len;
-          if (type === sessionInfoTypes.SYSTEM_VARIABLES) {
-            key = packet.readLengthCodedString(encoding);
-            const val = packet.readLengthCodedString(encoding);
-            stateChanges.systemVariables[key] = val;
-            if (key === 'character_set_client') {
-              const charsetNumber = EncodingToCharset[val];
-              // TODO - better api for driver users to handle unknown encodings?
-              // maybe custom coverter in the config?
-              // For now just ignore character_set_client command if there is
-              // no known mapping from reported encoding to a charset code
-              if (typeof charsetNumber !== 'undefined') {
-                connection.config.charsetNumber = charsetNumber;
-              }
-            }
-          } else if (type === sessionInfoTypes.SCHEMA) {
-            key = packet.readLengthCodedString(encoding);
-            stateChanges.schema = key;
-          } else if (type === sessionInfoTypes.STATE_CHANGE) {
-            stateChanges.trackStateChange =
-              packet.readLengthCodedString(encoding);
-          } else if (type === sessionInfoTypes.STATE_GTIDS) {
-            // TODO: find if the first length coded string means anything. Usually comes as empty
-            // eslint-disable-next-line no-unused-vars
-            const _unknownString = packet.readLengthCodedString(encoding);
-            const gtid = packet.readLengthCodedString(encoding);
-            stateChanges.gtids = gtid.split(',');
-          } else {
-            // unsupported session track type. For now just ignore
-          }
-          packet.offset = stateEnd;
-        }
-      }
-    } else {
-      this.info = packet.readString(undefined, encoding);
-    }
-    if (stateChanges) {
-      this.stateChanges = stateChanges;
-    }
-    const m = this.info.match(/\schanged:\s*(\d+)/i);
-    if (m !== null) {
-      this.changedRows = parseInt(m[1], 10);
-    } else {
-      this.changedRows = 0;
-    }
-  }
-
-  // TODO: should be consistent instance member, but it's just easier here to have just function
-  static toPacket(fieldCount, insertId) {
-    let length = 4 + Packet.lengthCodedNumberLength(fieldCount);
-    if (typeof insertId !== 'undefined') {
-      length += Packet.lengthCodedNumberLength(insertId);
-    }
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    packet.offset = 4;
-    packet.writeLengthCodedNumber(fieldCount);
-    if (typeof insertId !== 'undefined') {
-      packet.writeLengthCodedNumber(insertId);
-    }
-    return packet;
-  }
-}
-
-module.exports = ResultSetHeader;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/ssl_request.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/ssl_request.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,25 +1,0 @@
-'use strict';
-
-const ClientConstants = require('../constants/client');
-const Packet = require('../packets/packet');
-
-class SSLRequest {
-  constructor(flags, charset) {
-    this.clientFlags = flags | ClientConstants.SSL;
-    this.charset = charset;
-  }
-
-  toPacket() {
-    const length = 36;
-    const buffer = Buffer.allocUnsafe(length);
-    const packet = new Packet(0, buffer, 0, length);
-    buffer.fill(0);
-    packet.offset = 4;
-    packet.writeInt32(this.clientFlags);
-    packet.writeInt32(0); // max packet size. todo: move to config
-    packet.writeInt8(this.charset);
-    return packet;
-  }
-}
-
-module.exports = SSLRequest;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/text_row.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/packets/text_row.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,47 +1,0 @@
-'use strict';
-
-const Packet = require('../packets/packet');
-
-class TextRow {
-  constructor(columns) {
-    this.columns = columns || [];
-  }
-
-  static fromPacket(packet) {
-    // packet.reset(); // set offset to starting point?
-    const columns = [];
-    while (packet.haveMoreData()) {
-      columns.push(packet.readLengthCodedString());
-    }
-    return new TextRow(columns);
-  }
-
-  static toPacket(columns, encoding) {
-    const sequenceId = 0; // TODO remove, this is calculated now in connecton
-    let length = 0;
-    columns.forEach((val) => {
-      if (val === null || typeof val === 'undefined') {
-        ++length;
-        return;
-      }
-      length += Packet.lengthCodedStringLength(val.toString(10), encoding);
-    });
-    const buffer = Buffer.allocUnsafe(length + 4);
-    const packet = new Packet(sequenceId, buffer, 0, length + 4);
-    packet.offset = 4;
-    columns.forEach((val) => {
-      if (val === null) {
-        packet.writeNull();
-        return;
-      }
-      if (typeof val === 'undefined') {
-        packet.writeInt8(0);
-        return;
-      }
-      packet.writeLengthCodedString(val.toString(10), encoding);
-    });
-    return packet;
-  }
-}
-
-module.exports = TextRow;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/binary_parser.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/binary_parser.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,231 +1,0 @@
-'use strict';
-
-const FieldFlags = require('../constants/field_flags.js');
-const Charsets = require('../constants/charsets.js');
-const Types = require('../constants/types.js');
-const helpers = require('../helpers');
-const genFunc = require('generate-function');
-const parserCache = require('./parser_cache.js');
-const typeNames = [];
-for (const t in Types) {
-  typeNames[Types[t]] = t;
-}
-
-function readCodeFor(field, config, options, fieldNum) {
-  const supportBigNumbers = Boolean(
-    options.supportBigNumbers || config.supportBigNumbers
-  );
-  const bigNumberStrings = Boolean(
-    options.bigNumberStrings || config.bigNumberStrings
-  );
-  const timezone = options.timezone || config.timezone;
-  const dateStrings = options.dateStrings || config.dateStrings;
-  const unsigned = field.flags & FieldFlags.UNSIGNED;
-  switch (field.columnType) {
-    case Types.TINY:
-      return unsigned ? 'packet.readInt8();' : 'packet.readSInt8();';
-    case Types.SHORT:
-      return unsigned ? 'packet.readInt16();' : 'packet.readSInt16();';
-    case Types.LONG:
-    case Types.INT24: // in binary protocol int24 is encoded in 4 bytes int32
-      return unsigned ? 'packet.readInt32();' : 'packet.readSInt32();';
-    case Types.YEAR:
-      return 'packet.readInt16()';
-    case Types.FLOAT:
-      return 'packet.readFloat();';
-    case Types.DOUBLE:
-      return 'packet.readDouble();';
-    case Types.NULL:
-      return 'null;';
-    case Types.DATE:
-    case Types.DATETIME:
-    case Types.TIMESTAMP:
-    case Types.NEWDATE:
-      if (helpers.typeMatch(field.columnType, dateStrings, Types)) {
-        return `packet.readDateTimeString(${parseInt(field.decimals, 10)}, ${null}, ${field.columnType});`;
-      }
-      return `packet.readDateTime(${helpers.srcEscape(timezone)});`;
-    case Types.TIME:
-      return 'packet.readTimeString()';
-    case Types.DECIMAL:
-    case Types.NEWDECIMAL:
-      if (config.decimalNumbers) {
-        return 'packet.parseLengthCodedFloat();';
-      }
-      return 'packet.readLengthCodedString("ascii");';
-    case Types.GEOMETRY:
-      return 'packet.parseGeometryValue();';
-    case Types.VECTOR:
-      return 'packet.parseVector()';
-    case Types.JSON:
-      // Since for JSON columns mysql always returns charset 63 (BINARY),
-      // we have to handle it according to JSON specs and use "utf8",
-      // see https://github.com/sidorares/node-mysql2/issues/409
-      return config.jsonStrings
-        ? 'packet.readLengthCodedString("utf8")'
-        : 'JSON.parse(packet.readLengthCodedString("utf8"));';
-    case Types.LONGLONG:
-      if (!supportBigNumbers) {
-        return unsigned
-          ? 'packet.readInt64JSNumber();'
-          : 'packet.readSInt64JSNumber();';
-      }
-      if (bigNumberStrings) {
-        return unsigned
-          ? 'packet.readInt64String();'
-          : 'packet.readSInt64String();';
-      }
-      return unsigned ? 'packet.readInt64();' : 'packet.readSInt64();';
-
-    default:
-      if (field.characterSet === Charsets.BINARY) {
-        return 'packet.readLengthCodedBuffer();';
-      }
-      return `packet.readLengthCodedString(fields[${fieldNum}].encoding)`;
-  }
-}
-
-function compile(fields, options, config) {
-  const parserFn = genFunc();
-  const nullBitmapLength = Math.floor((fields.length + 7 + 2) / 8);
-
-  function wrap(field, packet) {
-    return {
-      type: typeNames[field.columnType],
-      length: field.columnLength,
-      db: field.schema,
-      table: field.table,
-      name: field.name,
-      string: function (encoding = field.encoding) {
-        if (field.columnType === Types.JSON && encoding === field.encoding) {
-          // Since for JSON columns mysql always returns charset 63 (BINARY),
-          // we have to handle it according to JSON specs and use "utf8",
-          // see https://github.com/sidorares/node-mysql2/issues/1661
-          console.warn(
-            `typeCast: JSON column "${field.name}" is interpreted as BINARY by default, recommended to manually set utf8 encoding: \`field.string("utf8")\``
-          );
-        }
-
-        if (
-          [Types.DATETIME, Types.NEWDATE, Types.TIMESTAMP, Types.DATE].includes(
-            field.columnType
-          )
-        ) {
-          return packet.readDateTimeString(parseInt(field.decimals, 10));
-        }
-
-        if (field.columnType === Types.TINY) {
-          const unsigned = field.flags & FieldFlags.UNSIGNED;
-
-          return String(unsigned ? packet.readInt8() : packet.readSInt8());
-        }
-
-        if (field.columnType === Types.TIME) {
-          return packet.readTimeString();
-        }
-
-        return packet.readLengthCodedString(encoding);
-      },
-      buffer: function () {
-        return packet.readLengthCodedBuffer();
-      },
-      geometry: function () {
-        return packet.parseGeometryValue();
-      },
-    };
-  }
-
-  parserFn('(function(){');
-  parserFn('return class BinaryRow {');
-  parserFn('constructor() {');
-  parserFn('}');
-
-  parserFn('next(packet, fields, options) {');
-  if (options.rowsAsArray) {
-    parserFn(`const result = new Array(${fields.length});`);
-  } else {
-    parserFn('const result = {};');
-  }
-
-  // Global typeCast
-  if (
-    typeof config.typeCast === 'function' &&
-    typeof options.typeCast !== 'function'
-  ) {
-    options.typeCast = config.typeCast;
-  }
-
-  parserFn('packet.readInt8();'); // status byte
-  for (let i = 0; i < nullBitmapLength; ++i) {
-    parserFn(`const nullBitmaskByte${i} = packet.readInt8();`);
-  }
-
-  let lvalue = '';
-  let currentFieldNullBit = 4;
-  let nullByteIndex = 0;
-  let fieldName = '';
-  let tableName = '';
-
-  for (let i = 0; i < fields.length; i++) {
-    fieldName = helpers.fieldEscape(fields[i].name);
-    // parserFn(`// ${fieldName}: ${typeNames[fields[i].columnType]}`);
-
-    if (typeof options.nestTables === 'string') {
-      lvalue = `result[${helpers.fieldEscape(fields[i].table + options.nestTables + fields[i].name)}]`;
-    } else if (options.nestTables === true) {
-      tableName = helpers.fieldEscape(fields[i].table);
-
-      parserFn(`if (!result[${tableName}]) result[${tableName}] = {};`);
-      lvalue = `result[${tableName}][${fieldName}]`;
-    } else if (options.rowsAsArray) {
-      lvalue = `result[${i.toString(10)}]`;
-    } else {
-      lvalue = `result[${fieldName}]`;
-    }
-
-    parserFn(`if (nullBitmaskByte${nullByteIndex} & ${currentFieldNullBit}) `);
-    parserFn(`${lvalue} = null;`);
-    parserFn('else {');
-
-    if (options.typeCast === false) {
-      parserFn(`${lvalue} = packet.readLengthCodedBuffer();`);
-    } else {
-      const fieldWrapperVar = `fieldWrapper${i}`;
-      parserFn(`const ${fieldWrapperVar} = wrap(fields[${i}], packet);`);
-      const readCode = readCodeFor(fields[i], config, options, i);
-
-      if (typeof options.typeCast === 'function') {
-        parserFn(
-          `${lvalue} = options.typeCast(${fieldWrapperVar}, function() { return ${readCode} });`
-        );
-      } else {
-        parserFn(`${lvalue} = ${readCode};`);
-      }
-    }
-    parserFn('}');
-
-    currentFieldNullBit *= 2;
-    if (currentFieldNullBit === 0x100) {
-      currentFieldNullBit = 1;
-      nullByteIndex++;
-    }
-  }
-
-  parserFn('return result;');
-  parserFn('}');
-  parserFn('};')('})()');
-
-  if (config.debug) {
-    helpers.printDebugWithCode(
-      'Compiled binary protocol row parser',
-      parserFn.toString()
-    );
-  }
-  return parserFn.toFunction({ wrap });
-}
-
-function getBinaryParser(fields, options, config) {
-  return parserCache.getParser('binary', fields, options, config, compile);
-}
-
-module.exports = getBinaryParser;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/parser_cache.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/parser_cache.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,66 +1,0 @@
-'use strict';
-
-const { createLRU } = require('lru.min');
-
-const parserCache = createLRU({
-  max: 15000,
-});
-
-function keyFromFields(type, fields, options, config) {
-  const res = [
-    type,
-    typeof options.nestTables,
-    options.nestTables,
-    Boolean(options.rowsAsArray),
-    Boolean(options.supportBigNumbers || config.supportBigNumbers),
-    Boolean(options.bigNumberStrings || config.bigNumberStrings),
-    typeof options.typeCast,
-    options.timezone || config.timezone,
-    Boolean(options.decimalNumbers),
-    options.dateStrings,
-  ];
-
-  for (let i = 0; i < fields.length; ++i) {
-    const field = fields[i];
-
-    res.push([
-      field.name,
-      field.columnType,
-      field.length,
-      field.schema,
-      field.table,
-      field.flags,
-      field.characterSet,
-    ]);
-  }
-
-  return JSON.stringify(res, null, 0);
-}
-
-function getParser(type, fields, options, config, compiler) {
-  const key = keyFromFields(type, fields, options, config);
-  let parser = parserCache.get(key);
-
-  if (parser) {
-    return parser;
-  }
-
-  parser = compiler(fields, options, config);
-  parserCache.set(key, parser);
-  return parser;
-}
-
-function setMaxCache(max) {
-  parserCache.resize(max);
-}
-
-function clearCache() {
-  parserCache.clear();
-}
-
-module.exports = {
-  getParser: getParser,
-  setMaxCache: setMaxCache,
-  clearCache: clearCache,
-  _keyFromFields: keyFromFields,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/static_binary_parser.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/static_binary_parser.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,211 +1,0 @@
-'use strict';
-
-const FieldFlags = require('../constants/field_flags.js');
-const Charsets = require('../constants/charsets.js');
-const Types = require('../constants/types.js');
-const helpers = require('../helpers');
-
-const typeNames = [];
-for (const t in Types) {
-  typeNames[Types[t]] = t;
-}
-
-function getBinaryParser(fields, _options, config) {
-  function readCode(field, config, options, fieldNum, packet) {
-    const supportBigNumbers = Boolean(
-      options.supportBigNumbers || config.supportBigNumbers
-    );
-    const bigNumberStrings = Boolean(
-      options.bigNumberStrings || config.bigNumberStrings
-    );
-    const timezone = options.timezone || config.timezone;
-    const dateStrings = options.dateStrings || config.dateStrings;
-    const unsigned = field.flags & FieldFlags.UNSIGNED;
-
-    switch (field.columnType) {
-      case Types.TINY:
-        return unsigned ? packet.readInt8() : packet.readSInt8();
-      case Types.SHORT:
-        return unsigned ? packet.readInt16() : packet.readSInt16();
-      case Types.LONG:
-      case Types.INT24: // in binary protocol int24 is encoded in 4 bytes int32
-        return unsigned ? packet.readInt32() : packet.readSInt32();
-      case Types.YEAR:
-        return packet.readInt16();
-      case Types.FLOAT:
-        return packet.readFloat();
-      case Types.DOUBLE:
-        return packet.readDouble();
-      case Types.NULL:
-        return null;
-      case Types.DATE:
-      case Types.DATETIME:
-      case Types.TIMESTAMP:
-      case Types.NEWDATE:
-        return helpers.typeMatch(field.columnType, dateStrings, Types)
-          ? packet.readDateTimeString(
-              parseInt(field.decimals, 10),
-              null,
-              field.columnType
-            )
-          : packet.readDateTime(timezone);
-      case Types.TIME:
-        return packet.readTimeString();
-      case Types.DECIMAL:
-      case Types.NEWDECIMAL:
-        return config.decimalNumbers
-          ? packet.parseLengthCodedFloat()
-          : packet.readLengthCodedString('ascii');
-      case Types.GEOMETRY:
-        return packet.parseGeometryValue();
-      case Types.VECTOR:
-        return packet.parseVector();
-      case Types.JSON:
-        // Since for JSON columns mysql always returns charset 63 (BINARY),
-        // we have to handle it according to JSON specs and use "utf8",
-        // see https://github.com/sidorares/node-mysql2/issues/409
-        return config.jsonStrings
-          ? packet.readLengthCodedString('utf8')
-          : JSON.parse(packet.readLengthCodedString('utf8'));
-      case Types.LONGLONG:
-        if (!supportBigNumbers)
-          return unsigned
-            ? packet.readInt64JSNumber()
-            : packet.readSInt64JSNumber();
-        return bigNumberStrings
-          ? unsigned
-            ? packet.readInt64String()
-            : packet.readSInt64String()
-          : unsigned
-            ? packet.readInt64()
-            : packet.readSInt64();
-      default:
-        return field.characterSet === Charsets.BINARY
-          ? packet.readLengthCodedBuffer()
-          : packet.readLengthCodedString(fields[fieldNum].encoding);
-    }
-  }
-
-  return class BinaryRow {
-    constructor() {}
-
-    next(packet, fields, options) {
-      packet.readInt8(); // status byte
-
-      const nullBitmapLength = Math.floor((fields.length + 7 + 2) / 8);
-      const nullBitmaskBytes = new Array(nullBitmapLength);
-
-      for (let i = 0; i < nullBitmapLength; i++) {
-        nullBitmaskBytes[i] = packet.readInt8();
-      }
-
-      const result = options.rowsAsArray ? new Array(fields.length) : {};
-      let currentFieldNullBit = 4;
-      let nullByteIndex = 0;
-
-      for (let i = 0; i < fields.length; i++) {
-        const field = fields[i];
-        const typeCast =
-          options.typeCast !== undefined ? options.typeCast : config.typeCast;
-
-        let value;
-        if (nullBitmaskBytes[nullByteIndex] & currentFieldNullBit) {
-          value = null;
-        } else if (options.typeCast === false) {
-          value = packet.readLengthCodedBuffer();
-        } else {
-          const next = () => readCode(field, config, options, i, packet);
-          value =
-            typeof typeCast === 'function'
-              ? typeCast(
-                  {
-                    type: typeNames[field.columnType],
-                    length: field.columnLength,
-                    db: field.schema,
-                    table: field.table,
-                    name: field.name,
-                    string: function (encoding = field.encoding) {
-                      if (
-                        field.columnType === Types.JSON &&
-                        encoding === field.encoding
-                      ) {
-                        // Since for JSON columns mysql always returns charset 63 (BINARY),
-                        // we have to handle it according to JSON specs and use "utf8",
-                        // see https://github.com/sidorares/node-mysql2/issues/1661
-                        console.warn(
-                          `typeCast: JSON column "${field.name}" is interpreted as BINARY by default, recommended to manually set utf8 encoding: \`field.string("utf8")\``
-                        );
-                      }
-
-                      if (
-                        [
-                          Types.DATETIME,
-                          Types.NEWDATE,
-                          Types.TIMESTAMP,
-                          Types.DATE,
-                        ].includes(field.columnType)
-                      ) {
-                        return packet.readDateTimeString(
-                          parseInt(field.decimals, 10)
-                        );
-                      }
-
-                      if (field.columnType === Types.TINY) {
-                        const unsigned = field.flags & FieldFlags.UNSIGNED;
-
-                        return String(
-                          unsigned ? packet.readInt8() : packet.readSInt8()
-                        );
-                      }
-
-                      if (field.columnType === Types.TIME) {
-                        return packet.readTimeString();
-                      }
-
-                      return packet.readLengthCodedString(encoding);
-                    },
-                    buffer: function () {
-                      return packet.readLengthCodedBuffer();
-                    },
-                    geometry: function () {
-                      return packet.parseGeometryValue();
-                    },
-                  },
-                  next
-                )
-              : next();
-        }
-
-        if (options.rowsAsArray) {
-          result[i] = value;
-        } else if (typeof options.nestTables === 'string') {
-          const key = helpers.fieldEscape(
-            field.table + options.nestTables + field.name,
-            false
-          );
-          result[key] = value;
-        } else if (options.nestTables === true) {
-          const tableName = helpers.fieldEscape(field.table, false);
-          if (!result[tableName]) {
-            result[tableName] = {};
-          }
-          const fieldName = helpers.fieldEscape(field.name, false);
-          result[tableName][fieldName] = value;
-        } else {
-          const key = helpers.fieldEscape(field.name, false);
-          result[key] = value;
-        }
-
-        currentFieldNullBit *= 2;
-        if (currentFieldNullBit === 0x100) {
-          currentFieldNullBit = 1;
-          nullByteIndex++;
-        }
-      }
-
-      return result;
-    }
-  };
-}
-
-module.exports = getBinaryParser;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/static_text_parser.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/static_text_parser.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,152 +1,0 @@
-'use strict';
-
-const Types = require('../constants/types.js');
-const Charsets = require('../constants/charsets.js');
-const helpers = require('../helpers');
-
-const typeNames = [];
-for (const t in Types) {
-  typeNames[Types[t]] = t;
-}
-
-function readField({ packet, type, charset, encoding, config, options }) {
-  const supportBigNumbers = Boolean(
-    options.supportBigNumbers || config.supportBigNumbers
-  );
-  const bigNumberStrings = Boolean(
-    options.bigNumberStrings || config.bigNumberStrings
-  );
-  const timezone = options.timezone || config.timezone;
-  const dateStrings = options.dateStrings || config.dateStrings;
-
-  switch (type) {
-    case Types.TINY:
-    case Types.SHORT:
-    case Types.LONG:
-    case Types.INT24:
-    case Types.YEAR:
-      return packet.parseLengthCodedIntNoBigCheck();
-    case Types.LONGLONG:
-      if (supportBigNumbers && bigNumberStrings) {
-        return packet.parseLengthCodedIntString();
-      }
-      return packet.parseLengthCodedInt(supportBigNumbers);
-    case Types.FLOAT:
-    case Types.DOUBLE:
-      return packet.parseLengthCodedFloat();
-    case Types.NULL:
-    case Types.DECIMAL:
-    case Types.NEWDECIMAL:
-      if (config.decimalNumbers) {
-        return packet.parseLengthCodedFloat();
-      }
-      return packet.readLengthCodedString('ascii');
-    case Types.DATE:
-      if (helpers.typeMatch(type, dateStrings, Types)) {
-        return packet.readLengthCodedString('ascii');
-      }
-      return packet.parseDate(timezone);
-    case Types.DATETIME:
-    case Types.TIMESTAMP:
-      if (helpers.typeMatch(type, dateStrings, Types)) {
-        return packet.readLengthCodedString('ascii');
-      }
-      return packet.parseDateTime(timezone);
-    case Types.TIME:
-      return packet.readLengthCodedString('ascii');
-    case Types.GEOMETRY:
-      return packet.parseGeometryValue();
-    case Types.VECTOR:
-      return packet.parseVector();
-    case Types.JSON:
-      // Since for JSON columns mysql always returns charset 63 (BINARY),
-      // we have to handle it according to JSON specs and use "utf8",
-      // see https://github.com/sidorares/node-mysql2/issues/409
-      return config.jsonStrings
-        ? packet.readLengthCodedString('utf8')
-        : JSON.parse(packet.readLengthCodedString('utf8'));
-    default:
-      if (charset === Charsets.BINARY) {
-        return packet.readLengthCodedBuffer();
-      }
-      return packet.readLengthCodedString(encoding);
-  }
-}
-
-function createTypecastField(field, packet) {
-  return {
-    type: typeNames[field.columnType],
-    length: field.columnLength,
-    db: field.schema,
-    table: field.table,
-    name: field.name,
-    string: function (encoding = field.encoding) {
-      if (field.columnType === Types.JSON && encoding === field.encoding) {
-        // Since for JSON columns mysql always returns charset 63 (BINARY),
-        // we have to handle it according to JSON specs and use "utf8",
-        // see https://github.com/sidorares/node-mysql2/issues/1661
-        console.warn(
-          `typeCast: JSON column "${field.name}" is interpreted as BINARY by default, recommended to manually set utf8 encoding: \`field.string("utf8")\``
-        );
-      }
-      return packet.readLengthCodedString(encoding);
-    },
-    buffer: function () {
-      return packet.readLengthCodedBuffer();
-    },
-    geometry: function () {
-      return packet.parseGeometryValue();
-    },
-  };
-}
-
-function getTextParser(_fields, _options, config) {
-  return {
-    next(packet, fields, options) {
-      const result = options.rowsAsArray ? [] : {};
-      for (let i = 0; i < fields.length; i++) {
-        const field = fields[i];
-        const typeCast = options.typeCast ? options.typeCast : config.typeCast;
-        const next = () =>
-          readField({
-            packet,
-            type: field.columnType,
-            encoding: field.encoding,
-            charset: field.characterSet,
-            config,
-            options,
-          });
-
-        let value;
-
-        if (options.typeCast === false) {
-          value = packet.readLengthCodedBuffer();
-        } else if (typeof typeCast === 'function') {
-          value = typeCast(createTypecastField(field, packet), next);
-        } else {
-          value = next();
-        }
-
-        if (options.rowsAsArray) {
-          result.push(value);
-        } else if (typeof options.nestTables === 'string') {
-          result[
-            `${helpers.fieldEscape(field.table, false)}${options.nestTables}${helpers.fieldEscape(field.name, false)}`
-          ] = value;
-        } else if (options.nestTables) {
-          const tableName = helpers.fieldEscape(field.table, false);
-          if (!result[tableName]) {
-            result[tableName] = {};
-          }
-          result[tableName][helpers.fieldEscape(field.name, false)] = value;
-        } else {
-          result[helpers.fieldEscape(field.name, false)] = value;
-        }
-      }
-
-      return result;
-    },
-  };
-}
-
-module.exports = getTextParser;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/string.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/string.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,50 +1,0 @@
-'use strict';
-
-const Iconv = require('iconv-lite');
-const { createLRU } = require('lru.min');
-
-const decoderCache = createLRU({
-  max: 500,
-});
-
-exports.decode = function (buffer, encoding, start, end, options) {
-  if (Buffer.isEncoding(encoding)) {
-    return buffer.toString(encoding, start, end);
-  }
-
-  // Optimize for common case: encoding="short_string", options=undefined.
-  let decoder;
-  if (!options) {
-    decoder = decoderCache.get(encoding);
-    if (!decoder) {
-      decoder = Iconv.getDecoder(encoding);
-      decoderCache.set(encoding, decoder);
-    }
-  } else {
-    const decoderArgs = { encoding, options };
-    const decoderKey = JSON.stringify(decoderArgs);
-    decoder = decoderCache.get(decoderKey);
-    if (!decoder) {
-      decoder = Iconv.getDecoder(decoderArgs.encoding, decoderArgs.options);
-      decoderCache.set(decoderKey, decoder);
-    }
-  }
-
-  const res = decoder.write(buffer.slice(start, end));
-  const trail = decoder.end();
-
-  return trail ? res + trail : res;
-};
-
-exports.encode = function (string, encoding, options) {
-  if (Buffer.isEncoding(encoding)) {
-    return Buffer.from(string, encoding);
-  }
-
-  const encoder = Iconv.getEncoder(encoding, options || {});
-
-  const res = encoder.write(string);
-  const trail = encoder.end();
-
-  return trail && trail.length > 0 ? Buffer.concat([res, trail]) : res;
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/text_parser.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/parsers/text_parser.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,214 +1,0 @@
-'use strict';
-
-const Types = require('../constants/types.js');
-const Charsets = require('../constants/charsets.js');
-const helpers = require('../helpers');
-const genFunc = require('generate-function');
-const parserCache = require('./parser_cache.js');
-
-const typeNames = [];
-for (const t in Types) {
-  typeNames[Types[t]] = t;
-}
-
-function readCodeFor(type, charset, encodingExpr, config, options) {
-  const supportBigNumbers = Boolean(
-    options.supportBigNumbers || config.supportBigNumbers
-  );
-  const bigNumberStrings = Boolean(
-    options.bigNumberStrings || config.bigNumberStrings
-  );
-  const timezone = options.timezone || config.timezone;
-  const dateStrings = options.dateStrings || config.dateStrings;
-
-  switch (type) {
-    case Types.TINY:
-    case Types.SHORT:
-    case Types.LONG:
-    case Types.INT24:
-    case Types.YEAR:
-      return 'packet.parseLengthCodedIntNoBigCheck()';
-    case Types.LONGLONG:
-      if (supportBigNumbers && bigNumberStrings) {
-        return 'packet.parseLengthCodedIntString()';
-      }
-      return `packet.parseLengthCodedInt(${supportBigNumbers})`;
-    case Types.FLOAT:
-    case Types.DOUBLE:
-      return 'packet.parseLengthCodedFloat()';
-    case Types.NULL:
-      return 'packet.readLengthCodedNumber()';
-    case Types.DECIMAL:
-    case Types.NEWDECIMAL:
-      if (config.decimalNumbers) {
-        return 'packet.parseLengthCodedFloat()';
-      }
-      return 'packet.readLengthCodedString("ascii")';
-    case Types.DATE:
-      if (helpers.typeMatch(type, dateStrings, Types)) {
-        return 'packet.readLengthCodedString("ascii")';
-      }
-      return `packet.parseDate(${helpers.srcEscape(timezone)})`;
-    case Types.DATETIME:
-    case Types.TIMESTAMP:
-      if (helpers.typeMatch(type, dateStrings, Types)) {
-        return 'packet.readLengthCodedString("ascii")';
-      }
-      return `packet.parseDateTime(${helpers.srcEscape(timezone)})`;
-    case Types.TIME:
-      return 'packet.readLengthCodedString("ascii")';
-    case Types.GEOMETRY:
-      return 'packet.parseGeometryValue()';
-    case Types.VECTOR:
-      return 'packet.parseVector()';
-    case Types.JSON:
-      // Since for JSON columns mysql always returns charset 63 (BINARY),
-      // we have to handle it according to JSON specs and use "utf8",
-      // see https://github.com/sidorares/node-mysql2/issues/409
-      return config.jsonStrings
-        ? 'packet.readLengthCodedString("utf8")'
-        : 'JSON.parse(packet.readLengthCodedString("utf8"))';
-    default:
-      if (charset === Charsets.BINARY) {
-        return 'packet.readLengthCodedBuffer()';
-      }
-      return `packet.readLengthCodedString(${encodingExpr})`;
-  }
-}
-
-function compile(fields, options, config) {
-  // use global typeCast if current query doesn't specify one
-  if (
-    typeof config.typeCast === 'function' &&
-    typeof options.typeCast !== 'function'
-  ) {
-    options.typeCast = config.typeCast;
-  }
-
-  function wrap(field, _this) {
-    return {
-      type: typeNames[field.columnType],
-      length: field.columnLength,
-      db: field.schema,
-      table: field.table,
-      name: field.name,
-      string: function (encoding = field.encoding) {
-        if (field.columnType === Types.JSON && encoding === field.encoding) {
-          // Since for JSON columns mysql always returns charset 63 (BINARY),
-          // we have to handle it according to JSON specs and use "utf8",
-          // see https://github.com/sidorares/node-mysql2/issues/1661
-          console.warn(
-            `typeCast: JSON column "${field.name}" is interpreted as BINARY by default, recommended to manually set utf8 encoding: \`field.string("utf8")\``
-          );
-        }
-
-        return _this.packet.readLengthCodedString(encoding);
-      },
-      buffer: function () {
-        return _this.packet.readLengthCodedBuffer();
-      },
-      geometry: function () {
-        return _this.packet.parseGeometryValue();
-      },
-    };
-  }
-
-  const parserFn = genFunc();
-
-  parserFn('(function () {')('return class TextRow {');
-
-  // constructor method
-  parserFn('constructor(fields) {');
-  // node-mysql typeCast compatibility wrapper
-  // see https://github.com/mysqljs/mysql/blob/96fdd0566b654436624e2375c7b6604b1f50f825/lib/protocol/packets/Field.js
-  if (typeof options.typeCast === 'function') {
-    parserFn('const _this = this;');
-    parserFn('for(let i=0; i<fields.length; ++i) {');
-    parserFn('this[`wrap${i}`] = wrap(fields[i], _this);');
-    parserFn('}');
-  }
-  parserFn('}');
-
-  // next method
-  parserFn('next(packet, fields, options) {');
-  parserFn('this.packet = packet;');
-  if (options.rowsAsArray) {
-    parserFn(`const result = new Array(${fields.length});`);
-  } else {
-    parserFn('const result = {};');
-  }
-
-  const resultTables = {};
-  let resultTablesArray = [];
-
-  if (options.nestTables === true) {
-    for (let i = 0; i < fields.length; i++) {
-      resultTables[fields[i].table] = 1;
-    }
-    resultTablesArray = Object.keys(resultTables);
-    for (let i = 0; i < resultTablesArray.length; i++) {
-      parserFn(`result[${helpers.fieldEscape(resultTablesArray[i])}] = {};`);
-    }
-  }
-
-  let lvalue = '';
-  let fieldName = '';
-  let tableName = '';
-  for (let i = 0; i < fields.length; i++) {
-    fieldName = helpers.fieldEscape(fields[i].name);
-    // parserFn(`// ${fieldName}: ${typeNames[fields[i].columnType]}`);
-
-    if (typeof options.nestTables === 'string') {
-      lvalue = `result[${helpers.fieldEscape(fields[i].table + options.nestTables + fields[i].name)}]`;
-    } else if (options.nestTables === true) {
-      tableName = helpers.fieldEscape(fields[i].table);
-
-      parserFn(`if (!result[${tableName}]) result[${tableName}] = {};`);
-      lvalue = `result[${tableName}][${fieldName}]`;
-    } else if (options.rowsAsArray) {
-      lvalue = `result[${i.toString(10)}]`;
-    } else {
-      lvalue = `result[${fieldName}]`;
-    }
-    if (options.typeCast === false) {
-      parserFn(`${lvalue} = packet.readLengthCodedBuffer();`);
-    } else {
-      const encodingExpr = `fields[${i}].encoding`;
-      const readCode = readCodeFor(
-        fields[i].columnType,
-        fields[i].characterSet,
-        encodingExpr,
-        config,
-        options
-      );
-      if (typeof options.typeCast === 'function') {
-        parserFn(
-          `${lvalue} = options.typeCast(this.wrap${i}, function() { return ${readCode} });`
-        );
-      } else {
-        parserFn(`${lvalue} = ${readCode};`);
-      }
-    }
-  }
-
-  parserFn('return result;');
-  parserFn('}');
-  parserFn('};')('})()');
-
-  if (config.debug) {
-    helpers.printDebugWithCode(
-      'Compiled text protocol row parser',
-      parserFn.toString()
-    );
-  }
-  if (typeof options.typeCast === 'function') {
-    return parserFn.toFunction({ wrap });
-  }
-  return parserFn.toFunction();
-}
-
-function getTextParser(fields, options, config) {
-  return parserCache.getParser('text', fields, options, config, compile);
-}
-
-module.exports = getTextParser;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,12 +1,0 @@
-'use strict';
-
-const BasePool = require('./base/pool.js');
-
-class Pool extends BasePool {
-  promise(promiseImpl) {
-    const PromisePool = require('./promise/pool.js');
-    return new PromisePool(this, promiseImpl);
-  }
-}
-
-module.exports = Pool;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool_cluster.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool_cluster.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,369 +1,0 @@
-'use strict';
-
-const process = require('process');
-
-const Pool = require('./pool.js');
-const PoolConfig = require('./pool_config.js');
-const Connection = require('./connection.js');
-const EventEmitter = require('events').EventEmitter;
-
-/**
- * Selector
- */
-const makeSelector = {
-  RR() {
-    let index = 0;
-    return (clusterIds) => clusterIds[index++ % clusterIds.length];
-  },
-  RANDOM() {
-    return (clusterIds) =>
-      clusterIds[Math.floor(Math.random() * clusterIds.length)];
-  },
-  ORDER() {
-    return (clusterIds) => clusterIds[0];
-  },
-};
-
-const getMonotonicMilliseconds = function () {
-  let ms;
-
-  if (typeof process.hrtime === 'function') {
-    ms = process.hrtime();
-    ms = ms[0] * 1e3 + ms[1] * 1e-6;
-  } else {
-    ms = process.uptime() * 1000;
-  }
-
-  return Math.floor(ms);
-};
-
-const patternRegExp = function (pattern) {
-  if (pattern instanceof RegExp) {
-    return pattern;
-  }
-
-  const source = pattern
-    .replace(/([.+?^=!:${}()|[\]/\\])/g, '\\$1')
-    .replace(/\*/g, '.*');
-
-  return new RegExp(`^${source}$`);
-};
-
-class PoolNamespace {
-  constructor(cluster, pattern, selector) {
-    this._cluster = cluster;
-    this._pattern = pattern;
-    this._selector = makeSelector[selector]();
-  }
-
-  getConnection(cb) {
-    const clusterNode = this._getClusterNode();
-    if (clusterNode === null) {
-      let err = new Error('Pool does Not exist.');
-      err.code = 'POOL_NOEXIST';
-
-      if (this._cluster._findNodeIds(this._pattern, true).length !== 0) {
-        err = new Error('Pool does Not have online node.');
-        err.code = 'POOL_NONEONLINE';
-      }
-
-      return cb(err);
-    }
-    return this._cluster._getConnection(clusterNode, (err, connection) => {
-      if (err) {
-        if (
-          this._cluster._canRetry &&
-          this._cluster._findNodeIds(this._pattern).length !== 0
-        ) {
-          this._cluster.emit('warn', err);
-          return this.getConnection(cb);
-        }
-
-        return cb(err);
-      }
-      return cb(null, connection);
-    });
-  }
-
-  /**
-   * pool cluster query
-   * @param {*} sql
-   * @param {*} values
-   * @param {*} cb
-   * @returns query
-   */
-  query(sql, values, cb) {
-    const query = Connection.createQuery(sql, values, cb, {});
-    this.getConnection((err, conn) => {
-      if (err) {
-        if (typeof query.onResult === 'function') {
-          query.onResult(err);
-        } else {
-          query.emit('error', err);
-        }
-        return;
-      }
-      try {
-        conn.query(query).once('end', () => {
-          conn.release();
-        });
-      } catch (e) {
-        conn.release();
-        throw e;
-      }
-    });
-    return query;
-  }
-
-  /**
-   * pool cluster execute
-   * @param {*} sql
-   * @param {*} values
-   * @param {*} cb
-   */
-  execute(sql, values, cb) {
-    if (typeof values === 'function') {
-      cb = values;
-      values = [];
-    }
-    this.getConnection((err, conn) => {
-      if (err) {
-        return cb(err);
-      }
-      try {
-        conn.execute(sql, values, cb).once('end', () => {
-          conn.release();
-        });
-      } catch (e) {
-        conn.release();
-        throw e;
-      }
-    });
-  }
-
-  _getClusterNode() {
-    const foundNodeIds = this._cluster._findNodeIds(this._pattern);
-    if (foundNodeIds.length === 0) {
-      return null;
-    }
-    const nodeId =
-      foundNodeIds.length === 1
-        ? foundNodeIds[0]
-        : this._selector(foundNodeIds);
-    return this._cluster._getNode(nodeId);
-  }
-}
-
-class PoolCluster extends EventEmitter {
-  constructor(config) {
-    super();
-    config = config || {};
-    this._canRetry =
-      typeof config.canRetry === 'undefined' ? true : config.canRetry;
-    this._removeNodeErrorCount = config.removeNodeErrorCount || 5;
-    this._restoreNodeTimeout = config.restoreNodeTimeout || 0;
-    this._defaultSelector = config.defaultSelector || 'RR';
-    this._closed = false;
-    this._lastId = 0;
-    this._nodes = {};
-    this._serviceableNodeIds = [];
-    this._namespaces = {};
-    this._findCaches = {};
-  }
-
-  of(pattern, selector) {
-    pattern = pattern || '*';
-    selector = selector || this._defaultSelector;
-    selector = selector.toUpperCase();
-    if (!makeSelector[selector] === 'undefined') {
-      selector = this._defaultSelector;
-    }
-    const key = pattern + selector;
-    if (typeof this._namespaces[key] === 'undefined') {
-      this._namespaces[key] = new PoolNamespace(this, pattern, selector);
-    }
-    return this._namespaces[key];
-  }
-
-  add(id, config) {
-    if (typeof id === 'object') {
-      config = id;
-      id = `CLUSTER::${++this._lastId}`;
-    }
-    if (typeof this._nodes[id] === 'undefined') {
-      this._nodes[id] = {
-        id: id,
-        errorCount: 0,
-        pool: new Pool({ config: new PoolConfig(config) }),
-        _offlineUntil: 0,
-      };
-      this._serviceableNodeIds.push(id);
-      this._clearFindCaches();
-    }
-  }
-
-  remove(pattern) {
-    const foundNodeIds = this._findNodeIds(pattern, true);
-
-    for (let i = 0; i < foundNodeIds.length; i++) {
-      const node = this._getNode(foundNodeIds[i]);
-
-      if (node) {
-        this._removeNode(node);
-      }
-    }
-  }
-
-  getConnection(pattern, selector, cb) {
-    let namespace;
-    if (typeof pattern === 'function') {
-      cb = pattern;
-      namespace = this.of();
-    } else {
-      if (typeof selector === 'function') {
-        cb = selector;
-        selector = this._defaultSelector;
-      }
-      namespace = this.of(pattern, selector);
-    }
-    namespace.getConnection(cb);
-  }
-
-  end(callback) {
-    const cb =
-      callback !== undefined
-        ? callback
-        : (err) => {
-            if (err) {
-              throw err;
-            }
-          };
-    if (this._closed) {
-      process.nextTick(cb);
-      return;
-    }
-
-    this._closed = true;
-
-    let calledBack = false;
-    let waitingClose = 0;
-    const onEnd = (err) => {
-      if (!calledBack && (err || --waitingClose <= 0)) {
-        calledBack = true;
-        return cb(err);
-      }
-    };
-
-    for (const id in this._nodes) {
-      waitingClose++;
-      this._nodes[id].pool.end(onEnd);
-    }
-
-    if (waitingClose === 0) {
-      process.nextTick(onEnd);
-    }
-  }
-
-  _findNodeIds(pattern, includeOffline) {
-    let currentTime = 0;
-    let foundNodeIds = this._findCaches[pattern];
-
-    if (foundNodeIds === undefined) {
-      const expression = patternRegExp(pattern);
-
-      foundNodeIds = this._serviceableNodeIds.filter((id) =>
-        id.match(expression)
-      );
-    }
-
-    this._findCaches[pattern] = foundNodeIds;
-
-    if (includeOffline) {
-      return foundNodeIds;
-    }
-
-    return foundNodeIds.filter((nodeId) => {
-      const node = this._getNode(nodeId);
-
-      if (!node._offlineUntil) {
-        return true;
-      }
-
-      if (!currentTime) {
-        currentTime = getMonotonicMilliseconds();
-      }
-
-      return node._offlineUntil <= currentTime;
-    });
-  }
-
-  _getNode(id) {
-    return this._nodes[id] || null;
-  }
-
-  _increaseErrorCount(node) {
-    const errorCount = ++node.errorCount;
-
-    if (this._removeNodeErrorCount > errorCount) {
-      return;
-    }
-
-    if (this._restoreNodeTimeout > 0) {
-      node._offlineUntil =
-        getMonotonicMilliseconds() + this._restoreNodeTimeout;
-      this.emit('offline', node.id);
-      return;
-    }
-
-    this._removeNode(node);
-    this.emit('remove', node.id);
-  }
-
-  _decreaseErrorCount(node) {
-    let errorCount = node.errorCount;
-
-    if (errorCount > this._removeNodeErrorCount) {
-      errorCount = this._removeNodeErrorCount;
-    }
-
-    if (errorCount < 1) {
-      errorCount = 1;
-    }
-
-    node.errorCount = errorCount - 1;
-
-    if (node._offlineUntil) {
-      node._offlineUntil = 0;
-      this.emit('online', node.id);
-    }
-  }
-
-  _getConnection(node, cb) {
-    node.pool.getConnection((err, connection) => {
-      if (err) {
-        this._increaseErrorCount(node);
-        return cb(err);
-      }
-      this._decreaseErrorCount(node);
-
-      connection._clusterId = node.id;
-      return cb(null, connection);
-    });
-  }
-
-  _removeNode(node) {
-    const index = this._serviceableNodeIds.indexOf(node.id);
-    if (index !== -1) {
-      this._serviceableNodeIds.splice(index, 1);
-      delete this._nodes[node.id];
-      this._clearFindCaches();
-      node.pool.end();
-    }
-  }
-
-  _clearFindCaches() {
-    this._findCaches = {};
-  }
-}
-
-module.exports = PoolCluster;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool_config.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool_config.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,30 +1,0 @@
-'use strict';
-
-const ConnectionConfig = require('./connection_config.js');
-
-class PoolConfig {
-  constructor(options) {
-    if (typeof options === 'string') {
-      options = ConnectionConfig.parseUrl(options);
-    }
-    this.connectionConfig = new ConnectionConfig(options);
-    this.waitForConnections =
-      options.waitForConnections === undefined
-        ? true
-        : Boolean(options.waitForConnections);
-    this.connectionLimit = isNaN(options.connectionLimit)
-      ? 10
-      : Number(options.connectionLimit);
-    this.maxIdle = isNaN(options.maxIdle)
-      ? this.connectionLimit
-      : Number(options.maxIdle);
-    this.idleTimeout = isNaN(options.idleTimeout)
-      ? 60000
-      : Number(options.idleTimeout);
-    this.queueLimit = isNaN(options.queueLimit)
-      ? 0
-      : Number(options.queueLimit);
-  }
-}
-
-module.exports = PoolConfig;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool_connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/pool_connection.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,12 +1,0 @@
-'use strict';
-
-const BasePoolConnection = require('./base/pool_connection.js');
-
-class PoolConnection extends BasePoolConnection {
-  promise(promiseImpl) {
-    const PromisePoolConnection = require('./promise/pool_connection.js');
-    return new PromisePoolConnection(this, promiseImpl);
-  }
-}
-
-module.exports = PoolConnection;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/connection.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,222 +1,0 @@
-'use strict';
-
-const EventEmitter = require('events').EventEmitter;
-const PromisePreparedStatementInfo = require('./prepared_statement_info.js');
-const makeDoneCb = require('./make_done_cb.js');
-const inheritEvents = require('./inherit_events.js');
-const BaseConnection = require('../base/connection.js');
-
-class PromiseConnection extends EventEmitter {
-  constructor(connection, promiseImpl) {
-    super();
-    this.connection = connection;
-    this.Promise = promiseImpl || Promise;
-    inheritEvents(connection, this, [
-      'error',
-      'drain',
-      'connect',
-      'end',
-      'enqueue',
-    ]);
-  }
-
-  release() {
-    this.connection.release();
-  }
-
-  query(query, params) {
-    const c = this.connection;
-    const localErr = new Error();
-    if (typeof params === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      if (params !== undefined) {
-        c.query(query, params, done);
-      } else {
-        c.query(query, done);
-      }
-    });
-  }
-
-  execute(query, params) {
-    const c = this.connection;
-    const localErr = new Error();
-    if (typeof params === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      if (params !== undefined) {
-        c.execute(query, params, done);
-      } else {
-        c.execute(query, done);
-      }
-    });
-  }
-
-  end() {
-    return new this.Promise((resolve) => {
-      this.connection.end(resolve);
-    });
-  }
-
-  beginTransaction() {
-    const c = this.connection;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      c.beginTransaction(done);
-    });
-  }
-
-  commit() {
-    const c = this.connection;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      c.commit(done);
-    });
-  }
-
-  rollback() {
-    const c = this.connection;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      c.rollback(done);
-    });
-  }
-
-  ping() {
-    const c = this.connection;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      c.ping((err) => {
-        if (err) {
-          localErr.message = err.message;
-          localErr.code = err.code;
-          localErr.errno = err.errno;
-          localErr.sqlState = err.sqlState;
-          localErr.sqlMessage = err.sqlMessage;
-          reject(localErr);
-        } else {
-          resolve(true);
-        }
-      });
-    });
-  }
-
-  connect() {
-    const c = this.connection;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      c.connect((err, param) => {
-        if (err) {
-          localErr.message = err.message;
-          localErr.code = err.code;
-          localErr.errno = err.errno;
-          localErr.sqlState = err.sqlState;
-          localErr.sqlMessage = err.sqlMessage;
-          reject(localErr);
-        } else {
-          resolve(param);
-        }
-      });
-    });
-  }
-
-  prepare(options) {
-    const c = this.connection;
-    const promiseImpl = this.Promise;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      c.prepare(options, (err, statement) => {
-        if (err) {
-          localErr.message = err.message;
-          localErr.code = err.code;
-          localErr.errno = err.errno;
-          localErr.sqlState = err.sqlState;
-          localErr.sqlMessage = err.sqlMessage;
-          reject(localErr);
-        } else {
-          const wrappedStatement = new PromisePreparedStatementInfo(
-            statement,
-            promiseImpl
-          );
-          resolve(wrappedStatement);
-        }
-      });
-    });
-  }
-
-  changeUser(options) {
-    const c = this.connection;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      c.changeUser(options, (err) => {
-        if (err) {
-          localErr.message = err.message;
-          localErr.code = err.code;
-          localErr.errno = err.errno;
-          localErr.sqlState = err.sqlState;
-          localErr.sqlMessage = err.sqlMessage;
-          reject(localErr);
-        } else {
-          resolve();
-        }
-      });
-    });
-  }
-
-  get config() {
-    return this.connection.config;
-  }
-
-  get threadId() {
-    return this.connection.threadId;
-  }
-}
-// patching PromiseConnection
-// create facade functions for prototype functions on "Connection" that are not yet
-// implemented with PromiseConnection
-
-// proxy synchronous functions only
-(function (functionsToWrap) {
-  for (let i = 0; functionsToWrap && i < functionsToWrap.length; i++) {
-    const func = functionsToWrap[i];
-
-    if (
-      typeof BaseConnection.prototype[func] === 'function' &&
-      PromiseConnection.prototype[func] === undefined
-    ) {
-      PromiseConnection.prototype[func] = (function factory(funcName) {
-        return function () {
-          return BaseConnection.prototype[funcName].apply(
-            this.connection,
-            arguments
-          );
-        };
-      })(func);
-    }
-  }
-})([
-  // synchronous functions
-  'close',
-  'createBinlogStream',
-  'destroy',
-  'escape',
-  'escapeId',
-  'format',
-  'pause',
-  'pipe',
-  'resume',
-  'unprepare',
-]);
-
-module.exports = PromiseConnection;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/inherit_events.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/inherit_events.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,27 +1,0 @@
-'use strict';
-
-function inheritEvents(source, target, events) {
-  const listeners = {};
-  target
-    .on('newListener', (eventName) => {
-      if (events.indexOf(eventName) >= 0 && !target.listenerCount(eventName)) {
-        source.on(
-          eventName,
-          (listeners[eventName] = function () {
-            const args = [].slice.call(arguments);
-            args.unshift(eventName);
-
-            target.emit.apply(target, args);
-          })
-        );
-      }
-    })
-    .on('removeListener', (eventName) => {
-      if (events.indexOf(eventName) >= 0 && !target.listenerCount(eventName)) {
-        source.removeListener(eventName, listeners[eventName]);
-        delete listeners[eventName];
-      }
-    });
-}
-
-module.exports = inheritEvents;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/make_done_cb.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/make_done_cb.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,19 +1,0 @@
-'use strict';
-
-function makeDoneCb(resolve, reject, localErr) {
-  return function (err, rows, fields) {
-    if (err) {
-      localErr.message = err.message;
-      localErr.code = err.code;
-      localErr.errno = err.errno;
-      localErr.sql = err.sql;
-      localErr.sqlState = err.sqlState;
-      localErr.sqlMessage = err.sqlMessage;
-      reject(localErr);
-    } else {
-      resolve([rows, fields]);
-    }
-  };
-}
-
-module.exports = makeDoneCb;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/pool.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/pool.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,112 +1,0 @@
-'use strict';
-
-const EventEmitter = require('events').EventEmitter;
-const makeDoneCb = require('./make_done_cb.js');
-const PromisePoolConnection = require('./pool_connection.js');
-const inheritEvents = require('./inherit_events.js');
-const BasePool = require('../base/pool.js');
-
-class PromisePool extends EventEmitter {
-  constructor(pool, thePromise) {
-    super();
-    this.pool = pool;
-    this.Promise = thePromise || Promise;
-    inheritEvents(pool, this, ['acquire', 'connection', 'enqueue', 'release']);
-  }
-
-  getConnection() {
-    const corePool = this.pool;
-    return new this.Promise((resolve, reject) => {
-      corePool.getConnection((err, coreConnection) => {
-        if (err) {
-          reject(err);
-        } else {
-          resolve(new PromisePoolConnection(coreConnection, this.Promise));
-        }
-      });
-    });
-  }
-
-  releaseConnection(connection) {
-    if (connection instanceof PromisePoolConnection) connection.release();
-  }
-
-  query(sql, args) {
-    const corePool = this.pool;
-    const localErr = new Error();
-    if (typeof args === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      if (args !== undefined) {
-        corePool.query(sql, args, done);
-      } else {
-        corePool.query(sql, done);
-      }
-    });
-  }
-
-  execute(sql, args) {
-    const corePool = this.pool;
-    const localErr = new Error();
-    if (typeof args === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      if (args) {
-        corePool.execute(sql, args, done);
-      } else {
-        corePool.execute(sql, done);
-      }
-    });
-  }
-
-  end() {
-    const corePool = this.pool;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      corePool.end((err) => {
-        if (err) {
-          localErr.message = err.message;
-          localErr.code = err.code;
-          localErr.errno = err.errno;
-          localErr.sqlState = err.sqlState;
-          localErr.sqlMessage = err.sqlMessage;
-          reject(localErr);
-        } else {
-          resolve();
-        }
-      });
-    });
-  }
-}
-
-(function (functionsToWrap) {
-  for (let i = 0; functionsToWrap && i < functionsToWrap.length; i++) {
-    const func = functionsToWrap[i];
-
-    if (
-      typeof BasePool.prototype[func] === 'function' &&
-      PromisePool.prototype[func] === undefined
-    ) {
-      PromisePool.prototype[func] = (function factory(funcName) {
-        return function () {
-          return BasePool.prototype[funcName].apply(this.pool, arguments);
-        };
-      })(func);
-    }
-  }
-})([
-  // synchronous functions
-  'escape',
-  'escapeId',
-  'format',
-]);
-
-module.exports = PromisePool;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/pool_cluster.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/pool_cluster.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,54 +1,0 @@
-'use strict';
-
-const PromisePoolConnection = require('./pool_connection');
-const makeDoneCb = require('./make_done_cb');
-
-class PromisePoolNamespace {
-  constructor(poolNamespace, thePromise) {
-    this.poolNamespace = poolNamespace;
-    this.Promise = thePromise || Promise;
-  }
-
-  getConnection() {
-    const corePoolNamespace = this.poolNamespace;
-    return new this.Promise((resolve, reject) => {
-      corePoolNamespace.getConnection((err, coreConnection) => {
-        if (err) {
-          reject(err);
-        } else {
-          resolve(new PromisePoolConnection(coreConnection, this.Promise));
-        }
-      });
-    });
-  }
-
-  query(sql, values) {
-    const corePoolNamespace = this.poolNamespace;
-    const localErr = new Error();
-    if (typeof values === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      corePoolNamespace.query(sql, values, done);
-    });
-  }
-
-  execute(sql, values) {
-    const corePoolNamespace = this.poolNamespace;
-    const localErr = new Error();
-    if (typeof values === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      corePoolNamespace.execute(sql, values, done);
-    });
-  }
-}
-
-module.exports = PromisePoolNamespace;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/pool_connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/pool_connection.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,19 +1,0 @@
-'use strict';
-
-const PromiseConnection = require('./connection.js');
-const BasePoolConnection = require('../base/pool_connection.js');
-
-class PromisePoolConnection extends PromiseConnection {
-  constructor(connection, promiseImpl) {
-    super(connection, promiseImpl);
-  }
-
-  destroy() {
-    return BasePoolConnection.prototype.destroy.apply(
-      this.connection,
-      arguments
-    );
-  }
-}
-
-module.exports = PromisePoolConnection;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/prepared_statement_info.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/promise/prepared_statement_info.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,32 +1,0 @@
-'use strict';
-
-const makeDoneCb = require('./make_done_cb.js');
-
-class PromisePreparedStatementInfo {
-  constructor(statement, promiseImpl) {
-    this.statement = statement;
-    this.Promise = promiseImpl;
-  }
-
-  execute(parameters) {
-    const s = this.statement;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      if (parameters) {
-        s.execute(parameters, done);
-      } else {
-        s.execute(done);
-      }
-    });
-  }
-
-  close() {
-    return new this.Promise((resolve) => {
-      this.statement.close();
-      resolve();
-    });
-  }
-}
-
-module.exports = PromisePreparedStatementInfo;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/results_stream.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/results_stream.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,38 +1,0 @@
-'use strict';
-
-const Readable = require('stream').Readable;
-
-// copy-paste from https://github.com/mysqljs/mysql/blob/master/lib/protocol/sequences/Query.js
-module.exports = function (command, connectionStream) {
-  command.stream = function (options) {
-    let stream;
-
-    options = options || {};
-    options.objectMode = true;
-    (stream = new Readable(options)),
-      (stream._read = function () {
-        connectionStream.resume();
-      });
-
-    this.on('result', (row, i) => {
-      if (!stream.push(row)) {
-        connectionStream.pause();
-      }
-      stream.emit('result', row, i); // replicate old emitter
-    });
-
-    this.on('error', (err) => {
-      stream.emit('error', err); // Pass on any errors
-    });
-
-    this.on('end', () => {
-      stream.push(null); // pushing null, indicating EOF
-    });
-
-    this.on('fields', (fields, i) => {
-      stream.emit('fields', fields, i); // replicate old emitter
-    });
-
-    return stream;
-  };
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/lib/server.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/lib/server.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,37 +1,0 @@
-'use strict';
-
-const net = require('net');
-const EventEmitter = require('events').EventEmitter;
-
-const Connection = require('./connection');
-const ConnectionConfig = require('./connection_config');
-
-// TODO: inherit Server from net.Server
-class Server extends EventEmitter {
-  constructor() {
-    super();
-    this.connections = [];
-    this._server = net.createServer(this._handleConnection.bind(this));
-  }
-
-  _handleConnection(socket) {
-    const connectionConfig = new ConnectionConfig({
-      stream: socket,
-      isServer: true,
-    });
-    const connection = new Connection({ config: connectionConfig });
-    this.emit('connection', connection);
-  }
-
-  listen(port) {
-    this._port = port;
-    this._server.listen.apply(this._server, arguments);
-    return this;
-  }
-
-  close(cb) {
-    this._server.close(cb);
-  }
-}
-
-module.exports = Server;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,80 +1,0 @@
-{
-  "name": "mysql2",
-  "version": "3.14.1",
-  "description": "fast mysql driver. Implements core protocol, prepared statements, ssl and compression in native JS",
-  "main": "index.js",
-  "typings": "typings/mysql/index",
-  "type": "commonjs",
-  "scripts": {
-    "lint": "eslint . && prettier --check .",
-    "lint:fix": "eslint . --fix && prettier --write .",
-    "test": "poku -d -r=verbose --sequential test/esm test/unit test/integration",
-    "test:bun": "bun poku -d --sequential test/esm test/unit test/integration",
-    "test:deno": "deno run --allow-read --allow-env --allow-run npm:poku -d --sequential --denoAllow=\"read,env,net,sys\" test/esm test/unit test/integration",
-    "test:tsc-build": "cd \"test/tsc-build\" && npx tsc -p \"tsconfig.json\"",
-    "coverage-test": "c8 npm run test",
-    "benchmark": "node ./benchmarks/benchmark.js",
-    "wait-port": "wait-on"
-  },
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/sidorares/node-mysql2.git"
-  },
-  "homepage": "https://sidorares.github.io/node-mysql2/docs",
-  "keywords": [
-    "mysql",
-    "client",
-    "server"
-  ],
-  "files": [
-    "lib",
-    "typings/mysql",
-    "index.js",
-    "index.d.ts",
-    "promise.js",
-    "promise.d.ts"
-  ],
-  "exports": {
-    ".": "./index.js",
-    "./package.json": "./package.json",
-    "./promise": "./promise.js",
-    "./promise.js": "./promise.js"
-  },
-  "engines": {
-    "node": ">= 8.0"
-  },
-  "author": "Andrey Sidorov <andrey.sidorov@gmail.com>",
-  "license": "MIT",
-  "dependencies": {
-    "aws-ssl-profiles": "^1.1.1",
-    "denque": "^2.1.0",
-    "generate-function": "^2.3.1",
-    "iconv-lite": "^0.6.3",
-    "long": "^5.2.1",
-    "lru.min": "^1.0.0",
-    "named-placeholders": "^1.1.3",
-    "seq-queue": "^0.0.5",
-    "sqlstring": "^2.3.2"
-  },
-  "devDependencies": {
-    "@eslint/eslintrc": "^3.3.0",
-    "@eslint/js": "^9.21.0",
-    "@eslint/markdown": "^6.2.2",
-    "@types/node": "^22.0.0",
-    "@typescript-eslint/eslint-plugin": "^8.26.0",
-    "@typescript-eslint/parser": "^8.26.0",
-    "assert-diff": "^3.0.2",
-    "benchmark": "^2.1.4",
-    "c8": "^10.1.1",
-    "error-stack-parser": "^2.0.3",
-    "eslint-config-prettier": "^10.0.2",
-    "eslint-plugin-async-await": "^0.0.0",
-    "eslint-plugin-markdown": "^5.1.0",
-    "eslint-plugin-prettier": "^5.2.3",
-    "globals": "^16.0.0",
-    "poku": "^3.0.0",
-    "portfinder": "^1.0.28",
-    "prettier": "^3.0.0",
-    "typescript": "^5.0.2"
-  }
-}
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/promise.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/promise.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,131 +1,0 @@
-import { EventEmitter } from 'events';
-
-import {
-  RowDataPacket,
-  OkPacket,
-  ResultSetHeader,
-  FieldPacket,
-  QueryOptions,
-  ConnectionOptions,
-  PoolOptions,
-  PoolClusterOptions,
-  Pool as CorePool,
-} from './index.js';
-import { ExecutableBase as ExecutableBaseClass } from './typings/mysql/lib/protocol/sequences/promise/ExecutableBase.js';
-import { QueryableBase as QueryableBaseClass } from './typings/mysql/lib/protocol/sequences/promise/QueryableBase.js';
-
-export * from './index.js';
-
-// Expose class interfaces
-declare class QueryableAndExecutableBase extends QueryableBaseClass(
-  ExecutableBaseClass(EventEmitter)
-) {}
-
-export interface PreparedStatementInfo {
-  close(): Promise<void>;
-  execute(
-    parameters: any | any[] | { [param: string]: any }
-  ): Promise<
-    [
-      (
-        | RowDataPacket[][]
-        | RowDataPacket[]
-        | OkPacket
-        | OkPacket[]
-        | ResultSetHeader
-      ),
-      FieldPacket[],
-    ]
-  >;
-}
-
-export interface Connection extends QueryableAndExecutableBase {
-  config: ConnectionOptions;
-
-  threadId: number;
-
-  connect(): Promise<void>;
-
-  ping(): Promise<void>;
-
-  beginTransaction(): Promise<void>;
-
-  commit(): Promise<void>;
-
-  rollback(): Promise<void>;
-
-  changeUser(options: ConnectionOptions): Promise<void>;
-
-  prepare(options: string | QueryOptions): Promise<PreparedStatementInfo>;
-
-  unprepare(sql: string | QueryOptions): void;
-
-  end(options?: any): Promise<void>;
-
-  destroy(): void;
-
-  pause(): void;
-
-  resume(): void;
-
-  escape(value: any): string;
-
-  escapeId(value: string): string;
-  escapeId(values: string[]): string;
-
-  format(sql: string, values?: any | any[] | { [param: string]: any }): string;
-}
-
-export interface PoolConnection extends Connection {
-  release(): void;
-  connection: Connection;
-}
-
-export interface Pool extends Connection {
-  getConnection(): Promise<PoolConnection>;
-
-  releaseConnection(connection: PoolConnection): void;
-
-  on(event: 'connection', listener: (connection: PoolConnection) => any): this;
-  on(event: 'acquire', listener: (connection: PoolConnection) => any): this;
-  on(event: 'release', listener: (connection: PoolConnection) => any): this;
-  on(event: 'enqueue', listener: () => any): this;
-
-  end(): Promise<void>;
-
-  pool: CorePool;
-}
-
-export interface PoolNamespace extends QueryableAndExecutableBase {
-  getConnection(): Promise<PoolConnection>;
-}
-
-export interface PoolCluster extends EventEmitter {
-  config: PoolClusterOptions;
-
-  add(config: PoolOptions): void;
-  add(group: string, connectionUri: string): void;
-  add(group: string, config: PoolOptions): void;
-
-  end(): Promise<void>;
-
-  getConnection(): Promise<PoolConnection>;
-  getConnection(group: string): Promise<PoolConnection>;
-  getConnection(group: string, selector: string): Promise<PoolConnection>;
-
-  of(pattern: string, selector?: string): PoolNamespace;
-
-  on(event: string, listener: (...args: any[]) => void): this;
-  on(event: 'remove', listener: (nodeId: number) => void): this;
-  on(event: 'warn', listener: (err: Error) => void): this;
-}
-
-export function createConnection(connectionUri: string): Promise<Connection>;
-export function createConnection(
-  config: ConnectionOptions
-): Promise<Connection>;
-
-export function createPool(connectionUri: string): Pool;
-export function createPool(config: PoolOptions): Pool;
-
-export function createPoolCluster(config?: PoolClusterOptions): PoolCluster;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/promise.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/promise.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,202 +1,0 @@
-'use strict';
-
-const SqlString = require('sqlstring');
-const EventEmitter = require('events').EventEmitter;
-const parserCache = require('./lib/parsers/parser_cache.js');
-const PoolCluster = require('./lib/pool_cluster.js');
-const createConnection = require('./lib/create_connection.js');
-const createPool = require('./lib/create_pool.js');
-const createPoolCluster = require('./lib/create_pool_cluster.js');
-const PromiseConnection = require('./lib/promise/connection.js');
-const PromisePool = require('./lib/promise/pool.js');
-const makeDoneCb = require('./lib/promise/make_done_cb.js');
-const PromisePoolConnection = require('./lib/promise/pool_connection.js');
-const inheritEvents = require('./lib/promise/inherit_events.js');
-const PromisePoolNamespace = require('./lib/promise/pool_cluster');
-
-function createConnectionPromise(opts) {
-  const coreConnection = createConnection(opts);
-  const createConnectionErr = new Error();
-  const thePromise = opts.Promise || Promise;
-  if (!thePromise) {
-    throw new Error(
-      'no Promise implementation available.' +
-        'Use promise-enabled node version or pass userland Promise' +
-        " implementation as parameter, for example: { Promise: require('bluebird') }"
-    );
-  }
-  return new thePromise((resolve, reject) => {
-    coreConnection.once('connect', () => {
-      resolve(new PromiseConnection(coreConnection, thePromise));
-    });
-    coreConnection.once('error', (err) => {
-      createConnectionErr.message = err.message;
-      createConnectionErr.code = err.code;
-      createConnectionErr.errno = err.errno;
-      createConnectionErr.sqlState = err.sqlState;
-      reject(createConnectionErr);
-    });
-  });
-}
-
-// note: the callback of "changeUser" is not called on success
-// hence there is no possibility to call "resolve"
-
-function createPromisePool(opts) {
-  const corePool = createPool(opts);
-  const thePromise = opts.Promise || Promise;
-  if (!thePromise) {
-    throw new Error(
-      'no Promise implementation available.' +
-        'Use promise-enabled node version or pass userland Promise' +
-        " implementation as parameter, for example: { Promise: require('bluebird') }"
-    );
-  }
-
-  return new PromisePool(corePool, thePromise);
-}
-
-class PromisePoolCluster extends EventEmitter {
-  constructor(poolCluster, thePromise) {
-    super();
-    this.poolCluster = poolCluster;
-    this.Promise = thePromise || Promise;
-    inheritEvents(poolCluster, this, ['warn', 'remove', 'online', 'offline']);
-  }
-
-  getConnection(pattern, selector) {
-    const corePoolCluster = this.poolCluster;
-    return new this.Promise((resolve, reject) => {
-      corePoolCluster.getConnection(
-        pattern,
-        selector,
-        (err, coreConnection) => {
-          if (err) {
-            reject(err);
-          } else {
-            resolve(new PromisePoolConnection(coreConnection, this.Promise));
-          }
-        }
-      );
-    });
-  }
-
-  query(sql, args) {
-    const corePoolCluster = this.poolCluster;
-    const localErr = new Error();
-    if (typeof args === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      corePoolCluster.query(sql, args, done);
-    });
-  }
-
-  execute(sql, args) {
-    const corePoolCluster = this.poolCluster;
-    const localErr = new Error();
-    if (typeof args === 'function') {
-      throw new Error(
-        'Callback function is not available with promise clients.'
-      );
-    }
-    return new this.Promise((resolve, reject) => {
-      const done = makeDoneCb(resolve, reject, localErr);
-      corePoolCluster.execute(sql, args, done);
-    });
-  }
-
-  of(pattern, selector) {
-    return new PromisePoolNamespace(
-      this.poolCluster.of(pattern, selector),
-      this.Promise
-    );
-  }
-
-  end() {
-    const corePoolCluster = this.poolCluster;
-    const localErr = new Error();
-    return new this.Promise((resolve, reject) => {
-      corePoolCluster.end((err) => {
-        if (err) {
-          localErr.message = err.message;
-          localErr.code = err.code;
-          localErr.errno = err.errno;
-          localErr.sqlState = err.sqlState;
-          localErr.sqlMessage = err.sqlMessage;
-          reject(localErr);
-        } else {
-          resolve();
-        }
-      });
-    });
-  }
-}
-
-/**
- * proxy poolCluster synchronous functions
- */
-(function (functionsToWrap) {
-  for (let i = 0; functionsToWrap && i < functionsToWrap.length; i++) {
-    const func = functionsToWrap[i];
-
-    if (
-      typeof PoolCluster.prototype[func] === 'function' &&
-      PromisePoolCluster.prototype[func] === undefined
-    ) {
-      PromisePoolCluster.prototype[func] = (function factory(funcName) {
-        return function () {
-          return PoolCluster.prototype[funcName].apply(
-            this.poolCluster,
-            arguments
-          );
-        };
-      })(func);
-    }
-  }
-})(['add', 'remove']);
-
-function createPromisePoolCluster(opts) {
-  const corePoolCluster = createPoolCluster(opts);
-  const thePromise = (opts && opts.Promise) || Promise;
-  if (!thePromise) {
-    throw new Error(
-      'no Promise implementation available.' +
-        'Use promise-enabled node version or pass userland Promise' +
-        " implementation as parameter, for example: { Promise: require('bluebird') }"
-    );
-  }
-  return new PromisePoolCluster(corePoolCluster, thePromise);
-}
-
-exports.createConnection = createConnectionPromise;
-exports.createPool = createPromisePool;
-exports.createPoolCluster = createPromisePoolCluster;
-exports.escape = SqlString.escape;
-exports.escapeId = SqlString.escapeId;
-exports.format = SqlString.format;
-exports.raw = SqlString.raw;
-exports.PromisePool = PromisePool;
-exports.PromiseConnection = PromiseConnection;
-exports.PromisePoolConnection = PromisePoolConnection;
-
-exports.__defineGetter__('Types', () => require('./lib/constants/types.js'));
-
-exports.__defineGetter__('Charsets', () =>
-  require('./lib/constants/charsets.js')
-);
-
-exports.__defineGetter__('CharsetToEncoding', () =>
-  require('./lib/constants/charset_encodings.js')
-);
-
-exports.setMaxParserCache = function (max) {
-  parserCache.setMaxCache(max);
-};
-
-exports.clearParserCache = function () {
-  parserCache.clearCache();
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/LICENSE.txt
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/LICENSE.txt	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,15 +1,0 @@
-ISC License
-
-Copyright (c) 2016, Felix Frederick Becker
-
-Permission to use, copy, modify, and/or distribute this software for any
-purpose with or without fee is hereby granted, provided that the above
-copyright notice and this permission notice appear in all copies.
-
-THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
-WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
-ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
-OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,95 +1,0 @@
-/**
- * sqlstring types are based on https://www.npmjs.com/package/@types/sqlstring, version 2.3.2
- */
-import { Pool as BasePool, PoolOptions } from './lib/Pool.js';
-import {
-  Connection as BaseConnection,
-  ConnectionOptions,
-  SslOptions,
-} from './lib/Connection.js';
-import {
-  Query as BaseQuery,
-  QueryOptions,
-  QueryError,
-} from './lib/protocol/sequences/Query.js';
-import {
-  PoolCluster as BasePoolCluster,
-  PoolClusterOptions,
-  PoolNamespace,
-} from './lib/PoolCluster.js';
-import { PoolConnection as BasePoolConnection } from './lib/PoolConnection.js';
-import {
-  Prepare as BasePrepare,
-  PrepareStatementInfo,
-} from './lib/protocol/sequences/Prepare.js';
-import { Server } from './lib/Server.js';
-
-export {
-  ConnectionOptions,
-  SslOptions,
-  PoolOptions,
-  PoolClusterOptions,
-  PoolNamespace,
-  QueryOptions,
-  QueryError,
-  PrepareStatementInfo,
-};
-
-export * from './lib/protocol/packets/index.js';
-export * from './lib/Auth.js';
-export * from './lib/constants/index.js';
-export * from './lib/parsers/index.js';
-
-// Expose class interfaces
-export interface Connection extends BaseConnection {}
-export interface Pool extends BasePool {}
-export interface PoolConnection extends BasePoolConnection {}
-export interface PoolCluster extends BasePoolCluster {}
-export interface Query extends BaseQuery {}
-export interface Prepare extends BasePrepare {}
-
-export function createConnection(connectionUri: string): BaseConnection;
-export function createConnection(config: ConnectionOptions): BaseConnection;
-
-export function createPool(connectionUri: string): BasePool;
-export function createPool(config: PoolOptions): BasePool;
-
-export function createPoolCluster(config?: PoolClusterOptions): PoolCluster;
-
-type TimeZone = 'local' | 'Z' | (string & NonNullable<unknown>);
-export function escape(
-  value: any,
-  stringifyObjects?: boolean,
-  timeZone?: TimeZone
-): string;
-
-export function escapeId(value: any, forbidQualified?: boolean): string;
-
-export function format(sql: string): string;
-export function format(
-  sql: string,
-  values: any | any[],
-  stringifyObjects?: boolean,
-  timeZone?: TimeZone
-): string;
-
-export function raw(sql: string): {
-  toSqlString: () => string;
-};
-
-export interface ConnectionConfig extends ConnectionOptions {
-  mergeFlags(defaultFlags: string[], userFlags: string[] | string): number;
-  getDefaultFlags(options?: ConnectionOptions): string[];
-  getCharsetNumber(charset: string): number;
-  getSSLProfile(name: string): { ca: string[] };
-  parseUrl(url: string): {
-    host: string;
-    port: number;
-    database: string;
-    user: string;
-    password: string;
-    [key: string]: any;
-  };
-}
-
-export function createServer(handler: (conn: BaseConnection) => any): Server;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/info.txt
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/info.txt	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1 +1,0 @@
-temporary workaround, see https://github.com/sidorares/node-mysql2/issues/1210
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Auth.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Auth.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,30 +1,0 @@
-import { RsaPublicKey, RsaPrivateKey, KeyLike } from 'crypto';
-import { Connection } from './Connection.js';
-
-export type AuthPlugin = (pluginMetadata: {
-  connection: Connection;
-  command: string;
-}) => (
-  pluginData: Buffer
-) => Promise<string> | string | Buffer | Promise<Buffer> | null;
-
-type AuthPluginDefinition<T> = (pluginOptions?: T) => AuthPlugin;
-
-export const authPlugins: {
-  caching_sha2_password: AuthPluginDefinition<{
-    overrideIsSecure?: boolean;
-    serverPublicKey?: RsaPublicKey | RsaPrivateKey | KeyLike;
-    onServerPublicKey?: (data: Buffer) => void;
-  }>;
-  mysql_clear_password: AuthPluginDefinition<{
-    password?: string;
-  }>;
-  mysql_native_password: AuthPluginDefinition<{
-    password?: string;
-    passwordSha1?: string;
-  }>;
-  sha256_password: AuthPluginDefinition<{
-    serverPublicKey?: RsaPublicKey | RsaPrivateKey | KeyLike;
-    onServerPublicKey?: (data: Buffer) => void;
-  }>;
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Connection.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Connection.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,428 +1,0 @@
-// This file was modified by Oracle on November 04, 2021.
-// Type definitions and corresponding descriptions were introduced for the
-// connection options relevant for multifactor authentication.
-// Modifications copyright (c) 2021, Oracle and/or its affiliates.
-
-import { EventEmitter } from 'events';
-import { Readable } from 'stream';
-import { Query, QueryError } from './protocol/sequences/Query.js';
-import { Prepare, PrepareStatementInfo } from './protocol/sequences/Prepare.js';
-import {
-  OkPacket,
-  FieldPacket,
-  RowDataPacket,
-  ResultSetHeader,
-  OkPacketParams,
-  ErrorPacketParams,
-} from './protocol/packets/index.js';
-import { Connection as PromiseConnection } from '../../../promise.js';
-import { AuthPlugin } from './Auth.js';
-import { QueryableBase } from './protocol/sequences/QueryableBase.js';
-import { ExecutableBase } from './protocol/sequences/ExecutableBase.js';
-import { TypeCast } from './parsers/typeCast.js';
-
-export interface SslOptions {
-  /**
-   * A string or buffer holding the PFX or PKCS12 encoded private key, certificate and CA certificates
-   */
-  pfx?: string;
-
-  /**
-   * Either a string/buffer or list of strings/Buffers holding the PEM encoded private key(s) to use
-   */
-  key?: string | string[] | Buffer | Buffer[];
-
-  /**
-   * A string of passphrase for the private key or pfx
-   */
-  passphrase?: string;
-
-  /**
-   * A string/buffer or list of strings/Buffers holding the PEM encoded certificate(s)
-   */
-  cert?: string | string[] | Buffer | Buffer[];
-
-  /**
-   * Either a string/Buffer or list of strings/Buffers of PEM encoded CA certificates to trust.
-   */
-  ca?: string | string[] | Buffer | Buffer[];
-
-  /**
-   * Either a string or list of strings of PEM encoded CRLs (Certificate Revocation List)
-   */
-  crl?: string | string[];
-
-  /**
-   * A string describing the ciphers to use or exclude
-   */
-  ciphers?: string;
-
-  /**
-   * You can also connect to a MySQL server without properly providing the appropriate CA to trust. You should not do this.
-   */
-  rejectUnauthorized?: boolean;
-
-  /**
-   * Configure the minimum supported version of SSL, the default is TLSv1.2.
-   */
-  minVersion?: string;
-
-  /**
-   * Configure the maximum supported version of SSL, the default is TLSv1.3.
-   */
-  maxVersion?: string;
-
-  /**
-   * You can verify the server name identity presented on the server certificate when connecting to a MySQL server.
-   * You should enable this but it is disabled by default right now for backwards compatibility.
-   */
-  verifyIdentity?: boolean;
-}
-
-export interface ConnectionOptions {
-  /**
-   * DECIMAL and NEWDECIMAL types will be returned as numbers if this option is set to `true` ( default: `false`).
-   */
-  decimalNumbers?: boolean;
-
-  /**
-   * The MySQL user to authenticate as
-   */
-  user?: string;
-
-  /**
-   * The password of that MySQL user
-   */
-  password?: string;
-
-  /**
-   * Alias for the MySQL user password. Makes a bit more sense in a multifactor authentication setup (see
-   * "password2" and "password3")
-   */
-  password1?: string;
-
-  /**
-   * 2nd factor authentication password. Mandatory when the authentication policy for the MySQL user account
-   * requires an additional authentication method that needs a password.
-   * https://dev.mysql.com/doc/refman/8.0/en/multifactor-authentication.html
-   */
-  password2?: string;
-
-  /**
-   * 3rd factor authentication password. Mandatory when the authentication policy for the MySQL user account
-   * requires two additional authentication methods and the last one needs a password.
-   * https://dev.mysql.com/doc/refman/8.0/en/multifactor-authentication.html
-   */
-  password3?: string;
-
-  /**
-   * Name of the database to use for this connection
-   */
-  database?: string;
-
-  /**
-   * The charset for the connection. This is called 'collation' in the SQL-level of MySQL (like utf8_general_ci).
-   * If a SQL-level charset is specified (like utf8mb4) then the default collation for that charset is used.
-   * (Default: 'UTF8_GENERAL_CI')
-   */
-  charset?: string;
-
-  /**
-   * The hostname of the database you are connecting to. (Default: localhost)
-   */
-  host?: string;
-
-  /**
-   * The port number to connect to. (Default: 3306)
-   */
-  port?: number;
-
-  /**
-   * The source IP address to use for TCP connection
-   */
-  localAddress?: string;
-
-  /**
-   * The path to a unix domain socket to connect to. When used host and port are ignored
-   */
-  socketPath?: string;
-
-  /**
-   * The timezone used to store local dates. (Default: 'local')
-   */
-  timezone?: string | 'local';
-
-  /**
-   * The milliseconds before a timeout occurs during the initial connection to the MySQL server. (Default: 10 seconds)
-   */
-  connectTimeout?: number;
-
-  /**
-   * Stringify objects instead of converting to values. (Default: 'false')
-   */
-  stringifyObjects?: boolean;
-
-  /**
-   * Allow connecting to MySQL instances that ask for the old (insecure) authentication method. (Default: false)
-   */
-  insecureAuth?: boolean;
-
-  /**
-   * By specifying a function that returns a readable stream, an arbitrary stream can be sent when sending a local fs file.
-   */
-  infileStreamFactory?: (path: string) => Readable;
-
-  /**
-   * Determines if column values should be converted to native JavaScript types.
-   *
-   * @default true
-   *
-   * It is not recommended (and may go away / change in the future) to disable type casting, but you can currently do so on either the connection or query level.
-   *
-   * ---
-   *
-   * You can also specify a function to do the type casting yourself:
-   * ```ts
-   * (field: Field, next: () => unknown) => {
-   *   return next();
-   * }
-   * ```
-   *
-   * ---
-   *
-   * **WARNING:**
-   *
-   * YOU MUST INVOKE the parser using one of these three field functions in your custom typeCast callback. They can only be called once:
-   *
-   * ```js
-   * field.string();
-   * field.buffer();
-   * field.geometry();
-   * ```
-
-   * Which are aliases for:
-   *
-   * ```js
-   * parser.parseLengthCodedString();
-   * parser.parseLengthCodedBuffer();
-   * parser.parseGeometryValue();
-   * ```
-   *
-   * You can find which field function you need to use by looking at `RowDataPacket.prototype._typeCast`.
-   */
-  typeCast?: TypeCast;
-
-  /**
-   * A custom query format function
-   */
-  queryFormat?: (query: string, values: any) => void;
-
-  /**
-   * When dealing with big numbers (BIGINT and DECIMAL columns) in the database, you should enable this option
-   * (Default: false)
-   */
-  supportBigNumbers?: boolean;
-
-  /**
-   * Enabling both supportBigNumbers and bigNumberStrings forces big numbers (BIGINT and DECIMAL columns) to be
-   * always returned as JavaScript String objects (Default: false). Enabling supportBigNumbers but leaving
-   * bigNumberStrings disabled will return big numbers as String objects only when they cannot be accurately
-   * represented with [JavaScript Number objects](https://262.ecma-international.org/5.1/#sec-8.5)
-   * (which happens when they exceed the [-2^53, +2^53] range), otherwise they will be returned as Number objects.
-   * This option is ignored if supportBigNumbers is disabled.
-   */
-  bigNumberStrings?: boolean;
-
-  /**
-   * Force date types (TIMESTAMP, DATETIME, DATE) to be returned as strings rather then inflated into JavaScript Date
-   * objects. Can be true/false or an array of type names to keep as strings.
-   *
-   * (Default: false)
-   */
-  dateStrings?: boolean | Array<'TIMESTAMP' | 'DATETIME' | 'DATE'>;
-
-  /**
-   * This will print all incoming and outgoing packets on stdout.
-   * You can also restrict debugging to packet types by passing an array of types (strings) to debug;
-   *
-   * (Default: false)
-   */
-  debug?: any;
-
-  /**
-   * Generates stack traces on Error to include call site of library entrance ('long stack traces'). Slight
-   * performance penalty for most calls. (Default: true)
-   */
-  trace?: boolean;
-
-  /**
-   * Allow multiple mysql statements per query. Be careful with this, it exposes you to SQL injection attacks. (Default: false)
-   */
-  multipleStatements?: boolean;
-
-  /**
-   * List of connection flags to use other than the default ones. It is also possible to blacklist default ones
-   */
-  flags?: Array<string>;
-
-  /**
-   * object with ssl parameters or a string containing name of ssl profile
-   */
-  ssl?: string | SslOptions;
-
-  /**
-   * Return each row as an array, not as an object.
-   * This is useful when you have duplicate column names.
-   * This can also be set in the `QueryOption` object to be applied per-query.
-   */
-  rowsAsArray?: boolean;
-
-  /**
-   * Enable keep-alive on the socket. (Default: true)
-   */
-  enableKeepAlive?: boolean;
-
-  /**
-   * If keep-alive is enabled users can supply an initial delay. (Default: 0)
-   */
-  keepAliveInitialDelay?: number;
-
-  charsetNumber?: number;
-
-  compress?: boolean;
-
-  authSwitchHandler?: (data: any, callback: () => void) => any;
-
-  connectAttributes?: { [param: string]: any };
-
-  isServer?: boolean;
-
-  maxPreparedStatements?: number;
-
-  namedPlaceholders?: boolean;
-
-  nestTables?: boolean | string;
-
-  passwordSha1?: string;
-
-  pool?: any;
-
-  stream?: any;
-
-  uri?: string;
-
-  connectionLimit?: number;
-
-  maxIdle?: number;
-
-  idleTimeout?: number;
-
-  Promise?: any;
-
-  queueLimit?: number;
-
-  waitForConnections?: boolean;
-
-  disableEval?: boolean;
-
-  authPlugins?: {
-    [key: string]: AuthPlugin;
-  };
-
-  /**
-   * Force JSON to be returned as string
-   *
-   * (Default: false)
-   */
-  jsonStrings?: boolean;
-}
-
-declare class Connection extends QueryableBase(ExecutableBase(EventEmitter)) {
-  config: ConnectionOptions;
-
-  threadId: number;
-
-  authorized: boolean;
-
-  static createQuery<
-    T extends
-      | RowDataPacket[][]
-      | RowDataPacket[]
-      | OkPacket
-      | OkPacket[]
-      | ResultSetHeader,
-  >(
-    sql: string,
-    callback?: (err: QueryError | null, result: T, fields: FieldPacket[]) => any
-  ): Query;
-  static createQuery<
-    T extends
-      | RowDataPacket[][]
-      | RowDataPacket[]
-      | OkPacket
-      | OkPacket[]
-      | ResultSetHeader,
-  >(
-    sql: string,
-    values: any | any[] | { [param: string]: any },
-    callback?: (err: QueryError | null, result: T, fields: FieldPacket[]) => any
-  ): Query;
-
-  beginTransaction(callback: (err: QueryError | null) => void): void;
-
-  connect(callback?: (err: QueryError | null) => void): void;
-
-  commit(callback?: (err: QueryError | null) => void): void;
-
-  changeUser(
-    options: ConnectionOptions,
-    callback?: (err: QueryError | null) => void
-  ): void;
-
-  end(callback?: (err: QueryError | null) => void): void;
-  end(options: any, callback?: (err: QueryError | null) => void): void;
-
-  destroy(): void;
-
-  pause(): void;
-
-  resume(): void;
-
-  escape(value: any): string;
-
-  escapeId(value: string): string;
-  escapeId(values: string[]): string;
-
-  format(sql: string, values?: any | any[] | { [param: string]: any }): string;
-
-  on(event: string, listener: (...args: any[]) => void): this;
-
-  rollback(callback: (err: QueryError | null) => void): void;
-
-  prepare(
-    sql: string,
-    callback?: (err: QueryError | null, statement: PrepareStatementInfo) => any
-  ): Prepare;
-
-  unprepare(sql: string): PrepareStatementInfo;
-
-  serverHandshake(args: any): any;
-
-  promise(promiseImpl?: PromiseConstructor): PromiseConnection;
-
-  ping(callback?: (err: QueryError | null) => any): void;
-
-  writeOk(args?: OkPacketParams): void;
-
-  writeError(args?: ErrorPacketParams): void;
-
-  writeEof(warnings?: number, statusFlags?: number): void;
-
-  writeTextResult(rows?: Array<any>, columns?: Array<any>): void;
-
-  writePacket(packet: any): void;
-
-  sequenceId: number;
-}
-
-export { Connection };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Pool.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Pool.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,69 +1,0 @@
-import { EventEmitter } from 'events';
-import { PrepareStatementInfo } from './protocol/sequences/Prepare.js';
-import { ConnectionOptions } from './Connection.js';
-import { PoolConnection } from './PoolConnection.js';
-import {
-  Pool as PromisePool,
-  PoolConnection as PromisePoolConnection,
-} from '../../../promise.js';
-import { QueryableBase } from './protocol/sequences/QueryableBase.js';
-import { ExecutableBase } from './protocol/sequences/ExecutableBase.js';
-
-export interface PoolOptions extends ConnectionOptions {
-  /**
-   * Determines the pool's action when no connections are available and the limit has been reached. If true, the pool will queue
-   * the connection request and call it when one becomes available. If false, the pool will immediately call back with an error.
-   * (Default: true)
-   */
-  waitForConnections?: boolean;
-
-  /**
-   * The maximum number of connections to create at once. (Default: 10)
-   */
-  connectionLimit?: number;
-
-  /**
-   * The maximum number of idle connections. (Default: same as `connectionLimit`)
-   */
-  maxIdle?: number;
-
-  /**
-   * The idle connections timeout, in milliseconds. (Default: 60000)
-   */
-  idleTimeout?: number;
-
-  /**
-   * The maximum number of connection requests the pool will queue before returning an error from getConnection. If set to 0, there
-   * is no limit to the number of queued connection requests. (Default: 0)
-   */
-  queueLimit?: number;
-}
-
-declare class Pool extends QueryableBase(ExecutableBase(EventEmitter)) {
-  getConnection(
-    callback: (
-      err: NodeJS.ErrnoException | null,
-      connection: PoolConnection
-    ) => any
-  ): void;
-
-  releaseConnection(connection: PoolConnection | PromisePoolConnection): void;
-
-  end(
-    callback?: (err: NodeJS.ErrnoException | null, ...args: any[]) => any
-  ): void;
-
-  on(event: string, listener: (...args: any[]) => void): this;
-  on(event: 'connection', listener: (connection: PoolConnection) => any): this;
-  on(event: 'acquire', listener: (connection: PoolConnection) => any): this;
-  on(event: 'release', listener: (connection: PoolConnection) => any): this;
-  on(event: 'enqueue', listener: () => any): this;
-
-  unprepare(sql: string): PrepareStatementInfo;
-
-  promise(promiseImpl?: PromiseConstructor): PromisePool;
-
-  config: PoolOptions;
-}
-
-export { Pool };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/PoolCluster.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/PoolCluster.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,90 +1,0 @@
-import { EventEmitter } from 'events';
-import { PoolConnection } from './PoolConnection.js';
-import { PoolOptions } from './Pool.js';
-import { ExecutableBase as ExecutableBaseClass } from './protocol/sequences/ExecutableBase.js';
-import { QueryableBase as QueryableBaseClass } from './protocol/sequences/QueryableBase.js';
-
-// Expose class interfaces
-declare class QueryableAndExecutableBase extends QueryableBaseClass(
-  ExecutableBaseClass(EventEmitter)
-) {}
-
-export interface PoolClusterOptions {
-  /**
-   * If true, PoolCluster will attempt to reconnect when connection fails. (Default: true)
-   */
-  canRetry?: boolean;
-
-  /**
-   * If connection fails, node's errorCount increases. When errorCount is greater than removeNodeErrorCount,
-   * remove a node in the PoolCluster. (Default: 5)
-   */
-  removeNodeErrorCount?: number;
-
-  /**
-   * If connection fails, specifies the number of milliseconds before another connection attempt will be made.
-   * If set to 0, then node will be removed instead and never re-used. (Default: 0)
-   */
-  restoreNodeTimeout?: number;
-
-  /**
-   * The default selector. (Default: RR)
-   * RR: Select one alternately. (Round-Robin)
-   * RANDOM: Select the node by random function.
-   * ORDER: Select the first node available unconditionally.
-   */
-  defaultSelector?: string;
-}
-
-export interface PoolNamespace extends QueryableAndExecutableBase {
-  getConnection(
-    callback: (
-      err: NodeJS.ErrnoException | null,
-      connection: PoolConnection
-    ) => any
-  ): void;
-}
-
-declare class PoolCluster extends EventEmitter {
-  config: PoolClusterOptions;
-
-  add(config: PoolOptions): void;
-  add(group: string, connectionUri: string): void;
-  add(group: string, config: PoolOptions): void;
-
-  remove(pattern: string): void;
-
-  end(): void;
-
-  getConnection(
-    callback: (
-      err: NodeJS.ErrnoException | null,
-      connection: PoolConnection
-    ) => void
-  ): void;
-  getConnection(
-    group: string,
-    callback: (
-      err: NodeJS.ErrnoException | null,
-      connection: PoolConnection
-    ) => void
-  ): void;
-  getConnection(
-    group: string,
-    selector: string,
-    callback: (
-      err: NodeJS.ErrnoException | null,
-      connection: PoolConnection
-    ) => void
-  ): void;
-
-  of(pattern: string, selector?: string): PoolNamespace;
-
-  on(event: string, listener: (...args: any[]) => void): this;
-  on(event: 'online', listener: (nodeId: number) => void): this;
-  on(event: 'offline', listener: (nodeId: number) => void): this;
-  on(event: 'remove', listener: (nodeId: number) => void): this;
-  on(event: 'warn', listener: (err: Error) => void): this;
-}
-
-export { PoolCluster };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/PoolConnection.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/PoolConnection.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,10 +1,0 @@
-import { Connection } from './Connection.js';
-import { Pool as PromisePool } from '../../../promise.js';
-
-declare class PoolConnection extends Connection {
-  connection: Connection;
-  release(): void;
-  promise(promiseImpl?: PromiseConstructor): PromisePool;
-}
-
-export { PoolConnection };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Server.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/Server.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,11 +1,0 @@
-import { EventEmitter } from 'events';
-import { Connection } from './Connection.js';
-
-declare class Server extends EventEmitter {
-  connections: Array<Connection>;
-
-  listen(port: number): Server;
-  close(callback: (error: Error, count: number) => any): void;
-}
-
-export { Server };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/CharsetToEncoding.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/CharsetToEncoding.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,8 +1,0 @@
-/**
- * Constant `CharsetToEncoding`.
- *
- * Please note that `CharsetToEncoding` can only be accessed from the `mysql` object and not imported directly.
- */
-declare const CharsetToEncoding: string[];
-
-export { CharsetToEncoding };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/Charsets.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/Charsets.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,326 +1,0 @@
-interface Charsets {
-  BIG5_CHINESE_CI: number;
-  LATIN2_CZECH_CS: number;
-  DEC8_SWEDISH_CI: number;
-  CP850_GENERAL_CI: number;
-  LATIN1_GERMAN1_CI: number;
-  HP8_ENGLISH_CI: number;
-  KOI8R_GENERAL_CI: number;
-  LATIN1_SWEDISH_CI: number;
-  LATIN2_GENERAL_CI: number;
-  SWE7_SWEDISH_CI: number;
-  ASCII_GENERAL_CI: number;
-  UJIS_JAPANESE_CI: number;
-  SJIS_JAPANESE_CI: number;
-  CP1251_BULGARIAN_CI: number;
-  LATIN1_DANISH_CI: number;
-  HEBREW_GENERAL_CI: number;
-  TIS620_THAI_CI: number;
-  EUCKR_KOREAN_CI: number;
-  LATIN7_ESTONIAN_CS: number;
-  LATIN2_HUNGARIAN_CI: number;
-  KOI8U_GENERAL_CI: number;
-  CP1251_UKRAINIAN_CI: number;
-  GB2312_CHINESE_CI: number;
-  GREEK_GENERAL_CI: number;
-  CP1250_GENERAL_CI: number;
-  LATIN2_CROATIAN_CI: number;
-  GBK_CHINESE_CI: number;
-  CP1257_LITHUANIAN_CI: number;
-  LATIN5_TURKISH_CI: number;
-  LATIN1_GERMAN2_CI: number;
-  ARMSCII8_GENERAL_CI: number;
-  UTF8_GENERAL_CI: number;
-  CP1250_CZECH_CS: number;
-  UCS2_GENERAL_CI: number;
-  CP866_GENERAL_CI: number;
-  KEYBCS2_GENERAL_CI: number;
-  MACCE_GENERAL_CI: number;
-  MACROMAN_GENERAL_CI: number;
-  CP852_GENERAL_CI: number;
-  LATIN7_GENERAL_CI: number;
-  LATIN7_GENERAL_CS: number;
-  MACCE_BIN: number;
-  CP1250_CROATIAN_CI: number;
-  UTF8MB4_GENERAL_CI: number;
-  UTF8MB4_BIN: number;
-  LATIN1_BIN: number;
-  LATIN1_GENERAL_CI: number;
-  LATIN1_GENERAL_CS: number;
-  CP1251_BIN: number;
-  CP1251_GENERAL_CI: number;
-  CP1251_GENERAL_CS: number;
-  MACROMAN_BIN: number;
-  UTF16_GENERAL_CI: number;
-  UTF16_BIN: number;
-  UTF16LE_GENERAL_CI: number;
-  CP1256_GENERAL_CI: number;
-  CP1257_BIN: number;
-  CP1257_GENERAL_CI: number;
-  UTF32_GENERAL_CI: number;
-  UTF32_BIN: number;
-  UTF16LE_BIN: number;
-  BINARY: number;
-  ARMSCII8_BIN: number;
-  ASCII_BIN: number;
-  CP1250_BIN: number;
-  CP1256_BIN: number;
-  CP866_BIN: number;
-  DEC8_BIN: number;
-  GREEK_BIN: number;
-  HEBREW_BIN: number;
-  HP8_BIN: number;
-  KEYBCS2_BIN: number;
-  KOI8R_BIN: number;
-  KOI8U_BIN: number;
-  UTF8_TOLOWER_CI: number;
-  LATIN2_BIN: number;
-  LATIN5_BIN: number;
-  LATIN7_BIN: number;
-  CP850_BIN: number;
-  CP852_BIN: number;
-  SWE7_BIN: number;
-  UTF8_BIN: number;
-  BIG5_BIN: number;
-  EUCKR_BIN: number;
-  GB2312_BIN: number;
-  GBK_BIN: number;
-  SJIS_BIN: number;
-  TIS620_BIN: number;
-  UCS2_BIN: number;
-  UJIS_BIN: number;
-  GEOSTD8_GENERAL_CI: number;
-  GEOSTD8_BIN: number;
-  LATIN1_SPANISH_CI: number;
-  CP932_JAPANESE_CI: number;
-  CP932_BIN: number;
-  EUCJPMS_JAPANESE_CI: number;
-  EUCJPMS_BIN: number;
-  CP1250_POLISH_CI: number;
-  UTF16_UNICODE_CI: number;
-  UTF16_ICELANDIC_CI: number;
-  UTF16_LATVIAN_CI: number;
-  UTF16_ROMANIAN_CI: number;
-  UTF16_SLOVENIAN_CI: number;
-  UTF16_POLISH_CI: number;
-  UTF16_ESTONIAN_CI: number;
-  UTF16_SPANISH_CI: number;
-  UTF16_SWEDISH_CI: number;
-  UTF16_TURKISH_CI: number;
-  UTF16_CZECH_CI: number;
-  UTF16_DANISH_CI: number;
-  UTF16_LITHUANIAN_CI: number;
-  UTF16_SLOVAK_CI: number;
-  UTF16_SPANISH2_CI: number;
-  UTF16_ROMAN_CI: number;
-  UTF16_PERSIAN_CI: number;
-  UTF16_ESPERANTO_CI: number;
-  UTF16_HUNGARIAN_CI: number;
-  UTF16_SINHALA_CI: number;
-  UTF16_GERMAN2_CI: number;
-  UTF16_CROATIAN_CI: number;
-  UTF16_UNICODE_520_CI: number;
-  UTF16_VIETNAMESE_CI: number;
-  UCS2_UNICODE_CI: number;
-  UCS2_ICELANDIC_CI: number;
-  UCS2_LATVIAN_CI: number;
-  UCS2_ROMANIAN_CI: number;
-  UCS2_SLOVENIAN_CI: number;
-  UCS2_POLISH_CI: number;
-  UCS2_ESTONIAN_CI: number;
-  UCS2_SPANISH_CI: number;
-  UCS2_SWEDISH_CI: number;
-  UCS2_TURKISH_CI: number;
-  UCS2_CZECH_CI: number;
-  UCS2_DANISH_CI: number;
-  UCS2_LITHUANIAN_CI: number;
-  UCS2_SLOVAK_CI: number;
-  UCS2_SPANISH2_CI: number;
-  UCS2_ROMAN_CI: number;
-  UCS2_PERSIAN_CI: number;
-  UCS2_ESPERANTO_CI: number;
-  UCS2_HUNGARIAN_CI: number;
-  UCS2_SINHALA_CI: number;
-  UCS2_GERMAN2_CI: number;
-  UCS2_CROATIAN_CI: number;
-  UCS2_UNICODE_520_CI: number;
-  UCS2_VIETNAMESE_CI: number;
-  UCS2_GENERAL_MYSQL500_CI: number;
-  UTF32_UNICODE_CI: number;
-  UTF32_ICELANDIC_CI: number;
-  UTF32_LATVIAN_CI: number;
-  UTF32_ROMANIAN_CI: number;
-  UTF32_SLOVENIAN_CI: number;
-  UTF32_POLISH_CI: number;
-  UTF32_ESTONIAN_CI: number;
-  UTF32_SPANISH_CI: number;
-  UTF32_SWEDISH_CI: number;
-  UTF32_TURKISH_CI: number;
-  UTF32_CZECH_CI: number;
-  UTF32_DANISH_CI: number;
-  UTF32_LITHUANIAN_CI: number;
-  UTF32_SLOVAK_CI: number;
-  UTF32_SPANISH2_CI: number;
-  UTF32_ROMAN_CI: number;
-  UTF32_PERSIAN_CI: number;
-  UTF32_ESPERANTO_CI: number;
-  UTF32_HUNGARIAN_CI: number;
-  UTF32_SINHALA_CI: number;
-  UTF32_GERMAN2_CI: number;
-  UTF32_CROATIAN_CI: number;
-  UTF32_UNICODE_520_CI: number;
-  UTF32_VIETNAMESE_CI: number;
-  UTF8_UNICODE_CI: number;
-  UTF8_ICELANDIC_CI: number;
-  UTF8_LATVIAN_CI: number;
-  UTF8_ROMANIAN_CI: number;
-  UTF8_SLOVENIAN_CI: number;
-  UTF8_POLISH_CI: number;
-  UTF8_ESTONIAN_CI: number;
-  UTF8_SPANISH_CI: number;
-  UTF8_SWEDISH_CI: number;
-  UTF8_TURKISH_CI: number;
-  UTF8_CZECH_CI: number;
-  UTF8_DANISH_CI: number;
-  UTF8_LITHUANIAN_CI: number;
-  UTF8_SLOVAK_CI: number;
-  UTF8_SPANISH2_CI: number;
-  UTF8_ROMAN_CI: number;
-  UTF8_PERSIAN_CI: number;
-  UTF8_ESPERANTO_CI: number;
-  UTF8_HUNGARIAN_CI: number;
-  UTF8_SINHALA_CI: number;
-  UTF8_GERMAN2_CI: number;
-  UTF8_CROATIAN_CI: number;
-  UTF8_UNICODE_520_CI: number;
-  UTF8_VIETNAMESE_CI: number;
-  UTF8_GENERAL_MYSQL500_CI: number;
-  UTF8MB4_UNICODE_CI: number;
-  UTF8MB4_ICELANDIC_CI: number;
-  UTF8MB4_LATVIAN_CI: number;
-  UTF8MB4_ROMANIAN_CI: number;
-  UTF8MB4_SLOVENIAN_CI: number;
-  UTF8MB4_POLISH_CI: number;
-  UTF8MB4_ESTONIAN_CI: number;
-  UTF8MB4_SPANISH_CI: number;
-  UTF8MB4_SWEDISH_CI: number;
-  UTF8MB4_TURKISH_CI: number;
-  UTF8MB4_CZECH_CI: number;
-  UTF8MB4_DANISH_CI: number;
-  UTF8MB4_LITHUANIAN_CI: number;
-  UTF8MB4_SLOVAK_CI: number;
-  UTF8MB4_SPANISH2_CI: number;
-  UTF8MB4_ROMAN_CI: number;
-  UTF8MB4_PERSIAN_CI: number;
-  UTF8MB4_ESPERANTO_CI: number;
-  UTF8MB4_HUNGARIAN_CI: number;
-  UTF8MB4_SINHALA_CI: number;
-  UTF8MB4_GERMAN2_CI: number;
-  UTF8MB4_CROATIAN_CI: number;
-  UTF8MB4_UNICODE_520_CI: number;
-  UTF8MB4_VIETNAMESE_CI: number;
-  GB18030_CHINESE_CI: number;
-  GB18030_BIN: number;
-  GB18030_UNICODE_520_CI: number;
-  /** @deprecated */
-  UTF8_GENERAL50_CI: number;
-  UTF8MB4_0900_AI_CI: number;
-  UTF8MB4_DE_PB_0900_AI_CI: number;
-  UTF8MB4_IS_0900_AI_CI: number;
-  UTF8MB4_LV_0900_AI_CI: number;
-  UTF8MB4_RO_0900_AI_CI: number;
-  UTF8MB4_SL_0900_AI_CI: number;
-  UTF8MB4_PL_0900_AI_CI: number;
-  UTF8MB4_ET_0900_AI_CI: number;
-  UTF8MB4_ES_0900_AI_CI: number;
-  UTF8MB4_SV_0900_AI_CI: number;
-  UTF8MB4_TR_0900_AI_CI: number;
-  UTF8MB4_CS_0900_AI_CI: number;
-  UTF8MB4_DA_0900_AI_CI: number;
-  UTF8MB4_LT_0900_AI_CI: number;
-  UTF8MB4_SK_0900_AI_CI: number;
-  UTF8MB4_ES_TRAD_0900_AI_CI: number;
-  UTF8MB4_LA_0900_AI_CI: number;
-  UTF8MB4_EO_0900_AI_CI: number;
-  UTF8MB4_HU_0900_AI_CI: number;
-  UTF8MB4_HR_0900_AI_CI: number;
-  UTF8MB4_VI_0900_AI_CI: number;
-  UTF8MB4_0900_AS_CS: number;
-  UTF8MB4_DE_PB_0900_AS_CS: number;
-  UTF8MB4_IS_0900_AS_CS: number;
-  UTF8MB4_LV_0900_AS_CS: number;
-  UTF8MB4_RO_0900_AS_CS: number;
-  UTF8MB4_SL_0900_AS_CS: number;
-  UTF8MB4_PL_0900_AS_CS: number;
-  UTF8MB4_ET_0900_AS_CS: number;
-  UTF8MB4_ES_0900_AS_CS: number;
-  UTF8MB4_SV_0900_AS_CS: number;
-  UTF8MB4_TR_0900_AS_CS: number;
-  UTF8MB4_CS_0900_AS_CS: number;
-  UTF8MB4_DA_0900_AS_CS: number;
-  UTF8MB4_LT_0900_AS_CS: number;
-  UTF8MB4_SK_0900_AS_CS: number;
-  UTF8MB4_ES_TRAD_0900_AS_CS: number;
-  UTF8MB4_LA_0900_AS_CS: number;
-  UTF8MB4_EO_0900_AS_CS: number;
-  UTF8MB4_HU_0900_AS_CS: number;
-  UTF8MB4_HR_0900_AS_CS: number;
-  UTF8MB4_VI_0900_AS_CS: number;
-  UTF8MB4_JA_0900_AS_CS: number;
-  UTF8MB4_JA_0900_AS_CS_KS: number;
-  UTF8MB4_0900_AS_CI: number;
-  UTF8MB4_RU_0900_AI_CI: number;
-  UTF8MB4_RU_0900_AS_CS: number;
-  UTF8MB4_ZH_0900_AS_CS: number;
-  UTF8MB4_0900_BIN: number;
-
-  BIG5: number;
-  DEC8: number;
-  CP850: number;
-  HP8: number;
-  KOI8R: number;
-  LATIN1: number;
-  LATIN2: number;
-  SWE7: number;
-  ASCII: number;
-  UJIS: number;
-  SJIS: number;
-  HEBREW: number;
-  TIS620: number;
-  EUCKR: number;
-  KOI8U: number;
-  GB2312: number;
-  GREEK: number;
-  CP1250: number;
-  GBK: number;
-  LATIN5: number;
-  ARMSCII8: number;
-  UTF8: number;
-  UCS2: number;
-  CP866: number;
-  KEYBCS2: number;
-  MACCE: number;
-  MACROMAN: number;
-  CP852: number;
-  LATIN7: number;
-  UTF8MB4: number;
-  CP1251: number;
-  UTF16: number;
-  UTF16LE: number;
-  CP1256: number;
-  CP1257: number;
-  UTF32: number;
-  CP932: number;
-  EUCJPMS: number;
-  GB18030: number;
-  GEOSTD8: number;
-}
-
-/**
- * Constant `Charsets`.
- *
- * Please note that `Charsets` can only be accessed from the `mysql` object and not imported directly.
- */
-declare const Charsets: Charsets;
-
-export { Charsets };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/Types.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/Types.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,70 +1,0 @@
-interface Types {
-  0x00: string;
-  0x01: string;
-  0x02: string;
-  0x03: string;
-  0x04: string;
-  0x05: string;
-  0x06: string;
-  0x07: string;
-  0x08: string;
-  0x09: string;
-  0x0a: string;
-  0x0b: string;
-  0x0c: string;
-  0x0d: string;
-  0x0e: string;
-  0x0f: string;
-  0x10: string;
-  0xf2: string;
-  0xf5: string;
-  0xf6: string;
-  0xf7: string;
-  0xf8: string;
-  0xf9: string;
-  0xfa: string;
-  0xfb: string;
-  0xfc: string;
-  0xfd: string;
-  0xfe: string;
-  0xff: string;
-
-  DECIMAL: number;
-  TINY: number;
-  SHORT: number;
-  LONG: number;
-  FLOAT: number;
-  DOUBLE: number;
-  NULL: number;
-  TIMESTAMP: number;
-  LONGLONG: number;
-  INT24: number;
-  DATE: number;
-  TIME: number;
-  DATETIME: number;
-  YEAR: number;
-  NEWDATE: number;
-  VARCHAR: number;
-  BIT: number;
-  VECTOR: number;
-  JSON: number;
-  NEWDECIMAL: number;
-  ENUM: number;
-  SET: number;
-  TINY_BLOB: number;
-  MEDIUM_BLOB: number;
-  LONG_BLOB: number;
-  BLOB: number;
-  VAR_STRING: number;
-  STRING: number;
-  GEOMETRY: number;
-}
-
-/**
- * Constant `Types`.
- *
- * Please note that `Types` can only be accessed from the `mysql` object and not imported directly.
- */
-declare const Types: Types;
-
-export { Types };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/constants/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,5 +1,0 @@
-import { Types } from './Types.js';
-import { Charsets } from './Charsets.js';
-import { CharsetToEncoding } from './CharsetToEncoding.js';
-
-export { Types, Charsets, CharsetToEncoding };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/parsers/ParserCache.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/parsers/ParserCache.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,4 +1,0 @@
-declare function setMaxParserCache(max: number): void;
-declare function clearParserCache(): void;
-
-export { setMaxParserCache, clearParserCache };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/parsers/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/parsers/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,18 +1,0 @@
-import { setMaxParserCache, clearParserCache } from './ParserCache.js';
-import {
-  TypeCast,
-  Field as TypeCastField,
-  Geometry as TypeCastGeometry,
-  Next as TypeCastNext,
-  Type as TypeCastType,
-} from './typeCast.js';
-
-export {
-  setMaxParserCache,
-  clearParserCache,
-  TypeCast,
-  TypeCastField,
-  TypeCastGeometry,
-  TypeCastNext,
-  TypeCastType,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/parsers/typeCast.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/parsers/typeCast.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,54 +1,0 @@
-export type Geometry = {
-  x: number;
-  y: number;
-};
-
-export type Type = {
-  type:
-    | 'DECIMAL'
-    | 'TINY'
-    | 'SHORT'
-    | 'LONG'
-    | 'FLOAT'
-    | 'DOUBLE'
-    | 'NULL'
-    | 'TIMESTAMP'
-    | 'TIMESTAMP2'
-    | 'LONGLONG'
-    | 'INT24'
-    | 'DATE'
-    | 'TIME'
-    | 'TIME2'
-    | 'DATETIME'
-    | 'DATETIME2'
-    | 'YEAR'
-    | 'NEWDATE'
-    | 'VARCHAR'
-    | 'BIT'
-    | 'VECTOR'
-    | 'JSON'
-    | 'NEWDECIMAL'
-    | 'ENUM'
-    | 'SET'
-    | 'TINY_BLOB'
-    | 'MEDIUM_BLOB'
-    | 'LONG_BLOB'
-    | 'BLOB'
-    | 'VAR_STRING'
-    | 'STRING'
-    | 'GEOMETRY';
-};
-
-export type Field = Type & {
-  length: number;
-  db: string;
-  table: string;
-  name: string;
-  string: (encoding?: BufferEncoding | string | undefined) => string | null;
-  buffer: () => Buffer | null;
-  geometry: () => Geometry | Geometry[] | null;
-};
-
-export type Next = () => unknown;
-
-export type TypeCast = ((field: Field, next: Next) => any) | boolean;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/Field.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/Field.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,10 +1,0 @@
-// TODO (major version): remove workaround for `Field` compatibility.
-import { TypeCastField } from '../../../lib/parsers/index.js';
-
-/**
- * @deprecated
- * `Field` is deprecated and might be removed in the future major release. Please use `TypeCastField` type instead.
- */
-declare interface Field extends TypeCastField {}
-
-export { Field };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/FieldPacket.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/FieldPacket.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,27 +1,0 @@
-declare interface FieldPacket {
-  constructor: {
-    name: 'FieldPacket';
-  };
-  catalog: string;
-  charsetNr?: number;
-  db?: string;
-  schema?: string;
-  characterSet?: number;
-  decimals: number;
-  default?: any;
-  flags: number | string[];
-  length?: number;
-  name: string;
-  orgName: string;
-  orgTable: string;
-  protocol41?: boolean;
-  table: string;
-  type?: number;
-  columnType?: number;
-  zerofill?: boolean;
-  typeName?: string;
-  encoding?: string;
-  columnLength?: number;
-}
-
-export { FieldPacket };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/OkPacket.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/OkPacket.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,23 +1,0 @@
-/**
- * @deprecated
- * `OkPacket` is deprecated and might be removed in the future major release. Please use `ResultSetHeader` instead.
- */
-declare interface OkPacket {
-  constructor: {
-    name: 'OkPacket';
-  };
-  fieldCount: number;
-  affectedRows: number;
-  /**
-   * @deprecated
-   * `changedRows` is deprecated and might be removed in the future major release. Please use `affectedRows` property instead.
-   */
-  changedRows: number;
-  insertId: number;
-  serverStatus: number;
-  warningCount: number;
-  message: string;
-  protocol41: boolean;
-}
-
-export { OkPacket };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/ProcedurePacket.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/ProcedurePacket.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,13 +1,0 @@
-import { OkPacket } from './OkPacket.js';
-import { ResultSetHeader } from './ResultSetHeader.js';
-import { RowDataPacket } from './RowDataPacket.js';
-
-declare type ProcedureCallPacket<
-  T = [RowDataPacket[], ResultSetHeader] | ResultSetHeader,
-> = T extends RowDataPacket[]
-  ? [T, ResultSetHeader]
-  : T extends ResultSetHeader | OkPacket
-    ? ResultSetHeader
-    : [RowDataPacket[], ResultSetHeader] | ResultSetHeader;
-
-export { ProcedureCallPacket };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/ResultSetHeader.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/ResultSetHeader.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,18 +1,0 @@
-declare interface ResultSetHeader {
-  constructor: {
-    name: 'ResultSetHeader';
-  };
-  affectedRows: number;
-  fieldCount: number;
-  info: string;
-  insertId: number;
-  serverStatus: number;
-  warningStatus: number;
-  /**
-   * @deprecated
-   * `changedRows` is deprecated and might be removed in the future major release. Please use `affectedRows` property instead.
-   */
-  changedRows: number;
-}
-
-export { ResultSetHeader };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/RowDataPacket.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/RowDataPacket.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,9 +1,0 @@
-declare interface RowDataPacket {
-  constructor: {
-    name: 'RowDataPacket';
-  };
-  [column: string]: any;
-  [column: number]: any;
-}
-
-export { RowDataPacket };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/index.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,28 +1,0 @@
-import { OkPacket } from './OkPacket.js';
-import { RowDataPacket } from './RowDataPacket.js';
-import { FieldPacket } from './FieldPacket.js';
-import { Field } from './Field.js';
-import { ProcedureCallPacket } from './ProcedurePacket.js';
-import { ResultSetHeader } from './ResultSetHeader.js';
-import { OkPacketParams } from './params/OkPacketParams.js';
-import { ErrorPacketParams } from './params/ErrorPacketParams.js';
-
-export type QueryResult =
-  | OkPacket
-  | ResultSetHeader
-  | ResultSetHeader[]
-  | RowDataPacket[]
-  | RowDataPacket[][]
-  | OkPacket[]
-  | ProcedureCallPacket;
-
-export {
-  OkPacket,
-  RowDataPacket,
-  FieldPacket,
-  Field,
-  ProcedureCallPacket,
-  ResultSetHeader,
-  OkPacketParams,
-  ErrorPacketParams,
-};
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/params/ErrorPacketParams.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/params/ErrorPacketParams.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,6 +1,0 @@
-declare interface ErrorPacketParams {
-  message?: string;
-  code?: number | string;
-}
-
-export { ErrorPacketParams };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/params/OkPacketParams.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/packets/params/OkPacketParams.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,9 +1,0 @@
-declare interface OkPacketParams {
-  affectedRows?: number;
-  insertId?: number;
-  serverStatus?: number;
-  warningCount?: number;
-  message?: string;
-}
-
-export { OkPacketParams };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/ExecutableBase.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/ExecutableBase.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,40 +1,0 @@
-import { FieldPacket, QueryResult } from '../packets/index.js';
-import {
-  Query,
-  QueryError,
-  QueryOptions,
-  QueryableConstructor,
-} from './Query.js';
-
-export declare function ExecutableBase<T extends QueryableConstructor>(
-  Base?: T
-): {
-  new (...args: any[]): {
-    execute<T extends QueryResult>(
-      sql: string,
-      callback?:
-        | ((err: QueryError | null, result: T, fields: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-    execute<T extends QueryResult>(
-      sql: string,
-      values: any,
-      callback?:
-        | ((err: QueryError | null, result: T, fields: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-    execute<T extends QueryResult>(
-      options: QueryOptions,
-      callback?:
-        | ((err: QueryError | null, result: T, fields?: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-    execute<T extends QueryResult>(
-      options: QueryOptions,
-      values: any,
-      callback?:
-        | ((err: QueryError | null, result: T, fields: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-  };
-} & T;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/Prepare.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/Prepare.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,65 +1,0 @@
-import { Sequence } from './Sequence.js';
-import { Query, QueryError, StreamOptions } from '../sequences/Query.js';
-import {
-  OkPacket,
-  FieldPacket,
-  RowDataPacket,
-  ResultSetHeader,
-} from '../packets/index.js';
-import { Readable } from 'stream';
-
-export class PrepareStatementInfo {
-  close(): void;
-  execute<
-    T extends
-      | RowDataPacket[][]
-      | RowDataPacket[]
-      | OkPacket
-      | OkPacket[]
-      | ResultSetHeader,
-  >(
-    parameters: any | any[] | { [param: string]: any },
-    callback?: (err: QueryError | null, result: T, fields: FieldPacket[]) => any
-  ): Query;
-}
-
-declare class Prepare extends Sequence {
-  /**
-   * The SQL for a constructed query
-   */
-  sql: string;
-
-  /**
-   * Emits a query packet to start the query
-   */
-  start(): void;
-
-  /**
-   * Determines the packet class to use given the first byte of the packet.
-   *
-   * @param firstByte The first byte of the packet
-   * @param parser The packet parser
-   */
-  determinePacket(firstByte: number, parser: any): any;
-
-  /**
-   * Creates a Readable stream with the given options
-   *
-   * @param options The options for the stream.
-   */
-  stream(options?: StreamOptions): Readable;
-
-  on(event: string, listener: (args: []) => void): this;
-  on(event: 'error', listener: (err: QueryError) => any): this;
-  on(
-    event: 'fields',
-    listener: (fields: FieldPacket, index: number) => any
-  ): this;
-  on(
-    event: 'result',
-    listener: (result: RowDataPacket | OkPacket, index: number) => any
-  ): this;
-  on(event: 'end', listener: () => any): this;
-}
-
-export { Prepare };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/Query.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/Query.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,170 +1,0 @@
-import { Sequence } from './Sequence.js';
-import { OkPacket, RowDataPacket, FieldPacket } from '../packets/index.js';
-import { Readable } from 'stream';
-import { TypeCast } from '../../parsers/typeCast.js';
-
-export interface QueryOptions {
-  /**
-   * The SQL for the query
-   */
-  sql: string;
-
-  /**
-   * The values for the query
-   */
-  values?: any | any[] | { [param: string]: any };
-
-  /**
-   * This overrides the namedPlaceholders option set at the connection level.
-   */
-  namedPlaceholders?: boolean;
-
-  /**
-   * Every operation takes an optional inactivity timeout option. This allows you to specify appropriate timeouts for
-   * operations. It is important to note that these timeouts are not part of the MySQL protocol, and rather timeout
-   * operations through the client. This means that when a timeout is reached, the connection it occurred on will be
-   * destroyed and no further operations can be performed.
-   */
-  timeout?: number;
-
-  /**
-   * Either a boolean or string. If true, tables will be nested objects. If string (e.g. '_'), tables will be
-   * nested as tableName_fieldName
-   */
-  nestTables?: any;
-
-  /**
-   * Determines if column values should be converted to native JavaScript types.
-   *
-   * @default true
-   *
-   * It is not recommended (and may go away / change in the future) to disable type casting, but you can currently do so on either the connection or query level.
-   *
-   * ---
-   *
-   * You can also specify a function to do the type casting yourself:
-   * ```ts
-   * (field: Field, next: () => unknown) => {
-   *   return next();
-   * }
-   * ```
-   *
-   * ---
-   *
-   * **WARNING:**
-   *
-   * YOU MUST INVOKE the parser using one of these three field functions in your custom typeCast callback. They can only be called once:
-   *
-   * ```js
-   * field.string();
-   * field.buffer();
-   * field.geometry();
-   * ```
-
-   * Which are aliases for:
-   *
-   * ```js
-   * parser.parseLengthCodedString();
-   * parser.parseLengthCodedBuffer();
-   * parser.parseGeometryValue();
-   * ```
-   *
-   * You can find which field function you need to use by looking at `RowDataPacket.prototype._typeCast`.
-   */
-  typeCast?: TypeCast;
-
-  /**
-   * This overrides the same option set at the connection level.
-   *
-   */
-  rowsAsArray?: boolean;
-
-  /**
-   * By specifying a function that returns a readable stream, an arbitrary stream can be sent when sending a local fs file.
-   */
-  infileStreamFactory?: (path: string) => Readable;
-}
-
-export interface StreamOptions {
-  /**
-   * Sets the max buffer size in objects of a stream
-   */
-  highWaterMark?: number;
-
-  /**
-   * The object mode of the stream (Default: true)
-   */
-  objectMode?: any;
-}
-
-export interface QueryError extends NodeJS.ErrnoException {
-  /**
-   * Either a MySQL server error (e.g. 'ER_ACCESS_DENIED_ERROR'),
-   * a node.js error (e.g. 'ECONNREFUSED') or an internal error
-   * (e.g. 'PROTOCOL_CONNECTION_LOST').
-   */
-  code: string;
-
-  /**
-   * The sql state marker
-   */
-  sqlStateMarker?: string;
-
-  /**
-   * The sql state
-   */
-  sqlState?: string;
-
-  /**
-   * The field count
-   */
-  fieldCount?: number;
-
-  /**
-   * Boolean, indicating if this error is terminal to the connection object.
-   */
-  fatal: boolean;
-}
-
-declare class Query extends Sequence {
-  /**
-   * The SQL for a constructed query
-   */
-  sql: string;
-
-  /**
-   * Emits a query packet to start the query
-   */
-  start(): void;
-
-  /**
-   * Determines the packet class to use given the first byte of the packet.
-   *
-   * @param firstByte The first byte of the packet
-   * @param parser The packet parser
-   */
-  determinePacket(firstByte: number, parser: any): any;
-
-  /**
-   * Creates a Readable stream with the given options
-   *
-   * @param options The options for the stream.
-   */
-  stream(options?: StreamOptions): Readable;
-
-  on(event: string, listener: (...args: any[]) => void): this;
-  on(event: 'error', listener: (err: QueryError) => any): this;
-  on(
-    event: 'fields',
-    listener: (fields: FieldPacket, index: number) => any
-  ): this;
-  on(
-    event: 'result',
-    listener: (result: RowDataPacket | OkPacket, index: number) => any
-  ): this;
-  on(event: 'end', listener: () => any): this;
-}
-
-export type QueryableConstructor<T = object> = new (...args: any[]) => T;
-
-export { Query };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/QueryableBase.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/QueryableBase.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,40 +1,0 @@
-import { FieldPacket, QueryResult } from '../packets/index.js';
-import {
-  Query,
-  QueryError,
-  QueryOptions,
-  QueryableConstructor,
-} from './Query.js';
-
-export declare function QueryableBase<T extends QueryableConstructor>(
-  Base?: T
-): {
-  new (...args: any[]): {
-    query<T extends QueryResult>(
-      sql: string,
-      callback?:
-        | ((err: QueryError | null, result: T, fields: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-    query<T extends QueryResult>(
-      sql: string,
-      values: any,
-      callback?:
-        | ((err: QueryError | null, result: T, fields: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-    query<T extends QueryResult>(
-      options: QueryOptions,
-      callback?:
-        | ((err: QueryError | null, result: T, fields?: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-    query<T extends QueryResult>(
-      options: QueryOptions,
-      values: any,
-      callback?:
-        | ((err: QueryError | null, result: T, fields: FieldPacket[]) => any)
-        | undefined
-    ): Query;
-  };
-} & T;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/Sequence.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/Sequence.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,5 +1,0 @@
-import { EventEmitter } from 'events';
-
-declare class Sequence extends EventEmitter {}
-
-export { Sequence };
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/promise/ExecutableBase.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/promise/ExecutableBase.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,21 +1,0 @@
-import { FieldPacket, QueryResult } from '../../packets/index.js';
-import { QueryOptions, QueryableConstructor } from '../Query.js';
-
-export declare function ExecutableBase<T extends QueryableConstructor>(
-  Base?: T
-): {
-  new (...args: any[]): {
-    execute<T extends QueryResult>(sql: string): Promise<[T, FieldPacket[]]>;
-    execute<T extends QueryResult>(
-      sql: string,
-      values: any
-    ): Promise<[T, FieldPacket[]]>;
-    execute<T extends QueryResult>(
-      options: QueryOptions
-    ): Promise<[T, FieldPacket[]]>;
-    execute<T extends QueryResult>(
-      options: QueryOptions,
-      values: any
-    ): Promise<[T, FieldPacket[]]>;
-  };
-} & T;
Index: uckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/promise/QueryableBase.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/mysql2/typings/mysql/lib/protocol/sequences/promise/QueryableBase.d.ts	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,21 +1,0 @@
-import { FieldPacket, QueryResult } from '../../packets/index.js';
-import { QueryOptions, QueryableConstructor } from '../Query.js';
-
-export declare function QueryableBase<T extends QueryableConstructor>(
-  Base?: T
-): {
-  new (...args: any[]): {
-    query<T extends QueryResult>(sql: string): Promise<[T, FieldPacket[]]>;
-    query<T extends QueryResult>(
-      sql: string,
-      values: any
-    ): Promise<[T, FieldPacket[]]>;
-    query<T extends QueryResult>(
-      options: QueryOptions
-    ): Promise<[T, FieldPacket[]]>;
-    query<T extends QueryResult>(
-      options: QueryOptions,
-      values: any
-    ): Promise<[T, FieldPacket[]]>;
-  };
-} & T;
Index: uckSimulator-main/ds-db-ws/node_modules/named-placeholders/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/named-placeholders/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,21 +1,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2014 Andrey Sidorov
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/named-placeholders/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/named-placeholders/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,29 +1,0 @@
-[![Flattr this git repo](http://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/submit/auto?user_id=sidorares&url=https://github.com/sidorares/named-placeholders&title=named-placeholders&language=&tags=github&category=software)
-
-[![NPM](https://nodei.co/npm/named-placeholders.png?downloads=true&stars=true)](https://nodei.co/npm/named-placeholders/)
-
-[![CI](https://github.com/mysqljs/named-placeholders/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/mysqljs/named-placeholders/actions/workflows/ci.yml)
-
-# named-placeholders
-
-compiles "select foo where foo.id = :bar and foo.baz < :baz" into "select foo where foo.id = ? and foo.baz < ?" + ["bar", "baz"]
-
-## usage
-
-```sh
-npm install named-placeholders
-```
-
-see [this mysql2 discussion](https://github.com/sidorares/node-mysql2/issues/117)
-
-```js
-var mysql = require('mysql');
-var toUnnamed = require('named-placeholders')();
-
-var q = toUnnamed('select 1+:test', { test: 123});
-mysql.createConnection().query(q[0], q[1]);
-```
-
-## credits
-
-parser is based on @mscdex code of his excellent [node-mariasql](https://github.com/mscdex/node-mariasql) library
Index: uckSimulator-main/ds-db-ws/node_modules/named-placeholders/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/named-placeholders/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,179 +1,0 @@
-'use strict';
-
-// based on code from Brian White @mscdex mariasql library - https://github.com/mscdex/node-mariasql/blob/master/lib/Client.js#L272-L332
-// License: https://github.com/mscdex/node-mariasql/blob/master/LICENSE
-
-const RE_PARAM = /(?:\?)|(?::(\d+|(?:[a-zA-Z][a-zA-Z0-9_]*)))/g,
-DQUOTE = 34,
-SQUOTE = 39,
-BSLASH = 92;
-
-function parse(query) {
-  let ppos = RE_PARAM.exec(query);
-  let curpos = 0;
-  let start = 0;
-  let end;
-  const parts = [];
-  let inQuote = false;
-  let escape = false;
-  let qchr;
-  const tokens = [];
-  let qcnt = 0;
-  let lastTokenEndPos = 0;
-  let i;
-
-  if (ppos) {
-    do {
-      for (i=curpos,end=ppos.index; i<end; ++i) {
-        let chr = query.charCodeAt(i);
-        if (chr === BSLASH)
-        escape = !escape;
-        else {
-          if (escape) {
-            escape = false;
-            continue;
-          }
-          if (inQuote && chr === qchr) {
-            if (query.charCodeAt(i + 1) === qchr) {
-              // quote escaped via "" or ''
-              ++i;
-              continue;
-            }
-            inQuote = false;
-          } else if (chr === DQUOTE || chr === SQUOTE) {
-            inQuote = true;
-            qchr = chr;
-          }
-        }
-      }
-      if (!inQuote) {
-        parts.push(query.substring(start, end));
-        tokens.push(ppos[0].length === 1 ? qcnt++ : ppos[1]);
-        start = end + ppos[0].length;
-        lastTokenEndPos = start;
-      }
-      curpos = end + ppos[0].length;
-    } while (ppos = RE_PARAM.exec(query));
-
-    if (tokens.length) {
-      if (curpos < query.length) {
-        parts.push(query.substring(lastTokenEndPos));
-      }
-      return [parts, tokens];
-    }
-  }
-  return [query];
-};
-
-function createCompiler(config) {
-  if (!config)
-  config = {};
-  if (!config.placeholder) {
-    config.placeholder = '?';
-  }
-  let ncache = 100;
-  let cache;
-  if (typeof config.cache === 'number') {
-    ncache = config.cache;
-  }
-  if (typeof config.cache === 'object') {
-    cache = config.cache;
-  }
-  if (config.cache !== false && !cache) {
-    cache = new (require('lru-cache'))({ max: ncache });
-  }
-
-  function toArrayParams(tree, params) {
-    const arr = [];
-    if (tree.length == 1) {
-      return [tree[0], []];
-    }
-
-    if (typeof params == 'undefined')
-      throw new Error('Named query contains placeholders, but parameters object is undefined');
-
-    const tokens = tree[1];
-    for (let i=0; i < tokens.length; ++i) {
-      arr.push(params[tokens[i]]);
-    }
-    return [tree[0], arr];
-  }
-
-  function noTailingSemicolon(s) {
-    if (s.slice(-1) == ':') {
-      return s.slice(0, -1);
-    }
-    return s;
-  }
-
-  function join(tree) {
-    if (tree.length == 1) {
-      return tree;
-    }
-
-    let unnamed = noTailingSemicolon(tree[0][0]);
-    for (let i=1; i < tree[0].length; ++i) {
-      if (tree[0][i-1].slice(-1) == ':') {
-        unnamed += config.placeholder;
-      }
-      unnamed += config.placeholder;
-      unnamed += noTailingSemicolon(tree[0][i]);
-    }
-
-    const last = tree[0][tree[0].length -1];
-    if (tree[0].length == tree[1].length) {
-      if (last.slice(-1) == ':') {
-        unnamed += config.placeholder;
-      }
-      unnamed += config.placeholder;
-    }
-    return [unnamed, tree[1]];
-  }
-
-  function compile(query, paramsObj) {
-    let tree;
-    if (cache && (tree = cache.get(query))) {
-      return toArrayParams(tree, paramsObj)
-    }
-    tree = join(parse(query));
-    if(cache) {
-      cache.set(query, tree);
-    }
-    return toArrayParams(tree, paramsObj);
-  }
-
-  compile.parse = parse;
-  return compile;
-}
-
-// named :one :two to postgres-style numbered $1 $2 $3
-function toNumbered(q, params) {
-  const tree = parse(q);
-  const paramsArr = [];
-  if (tree.length == 1) {
-    return [tree[0], paramsArr];
-  }
-
-  const pIndexes = {};
-  let pLastIndex = 0;
-  let qs = '';
-  let varIndex;
-  const varNames = [];
-  for (let i=0; i < tree[0].length; ++i) {
-    varIndex = pIndexes[tree[1][i]];
-    if (!varIndex) {
-      varIndex = ++pLastIndex;
-      pIndexes[tree[1][i]] = varIndex;
-    }
-    if (tree[1][i]) {
-      varNames[varIndex - 1] = tree[1][i];
-      qs += tree[0][i] + '$' + varIndex;
-    } else {
-      qs += tree[0][i];
-    }
-  }
-  return [qs, varNames.map(n => params[n])];
-}
-
-module.exports = createCompiler;
-module.exports.toNumbered = toNumbered;
Index: uckSimulator-main/ds-db-ws/node_modules/named-placeholders/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/named-placeholders/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,32 +1,0 @@
-{
-  "name": "named-placeholders",
-  "version": "1.1.3",
-  "description": "sql named placeholders to unnamed compiler",
-  "main": "index.js",
-  "scripts": {
-    "test": "mocha"
-  },
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/sidorares/named-placeholders"
-  },
-  "keywords": [
-    "sql",
-    "pdo",
-    "named",
-    "placeholders"
-  ],
-  "engines": {
-    "node": ">=12.0.0"
-  },
-  "author": "Andrey Sidorov <sidorares@yandex.com>",
-  "files": [],
-  "license": "MIT",
-  "devDependencies": {
-    "mocha": "^5.2.0",
-    "should": "^13.2.3"
-  },
-  "dependencies": {
-    "lru-cache": "^7.14.1"
-  }
-}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2010 - 2021 Brian Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,112 @@
+# pg-cloudflare
+
+`pg-cloudflare` makes it easier to take an existing package that relies on `tls` and `net`, and make it work in environments where only `connect()` is supported, such as Cloudflare Workers.
+
+`pg-cloudflare` wraps `connect()`, the [TCP Socket API](https://github.com/wintercg/proposal-sockets-api) proposed within WinterCG, and implemented in [Cloudflare Workers](https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/), and exposes an interface with methods similar to what the `net` and `tls` modules in Node.js expose. (ex: `net.connect(path[, options][, callback])`). This minimizes the number of changes needed in order to make an existing package work across JavaScript runtimes.
+
+## Installation
+
+```
+npm i --save-dev pg-cloudflare
+```
+
+The package uses conditional exports to support bundlers that don't know about
+`cloudflare:sockets`, so the consumer code by default imports an empty file. To
+enable the package, resolve to the `cloudflare` condition in your bundler's
+config. For example:
+
+- `webpack.config.js`
+  ```js
+  export default {
+    ...,
+    resolve: { conditionNames: [..., "workerd"] },
+    plugins: [
+      // ignore cloudflare:sockets imports
+      new webpack.IgnorePlugin({
+        resourceRegExp: /^cloudflare:sockets$/,
+      }),
+    ],
+  }
+  ```
+- `vite.config.js`
+
+  > [!NOTE]
+  > If you are using the [Cloudflare Vite plugin](https://www.npmjs.com/package/@cloudflare/vite-plugin) then the following configuration is not necessary.
+
+  ```js
+  export default defineConfig({
+    ...,
+    resolve: {
+      conditions: [..., "workerd"],
+    },
+    build: {
+      ...,
+      // don't try to bundle cloudflare:sockets
+      rollupOptions: {
+        external: [..., 'cloudflare:sockets'],
+      },
+    },
+  })
+  ```
+
+- `rollup.config.js`
+  ```js
+  export default defineConfig({
+    ...,
+    plugins: [..., nodeResolve({ exportConditions: [..., 'workerd'] })],
+    // don't try to bundle cloudflare:sockets
+    external: [..., 'cloudflare:sockets'],
+  })
+  ```
+- `esbuild.config.js`
+  ```js
+  await esbuild.build({
+    ...,
+    conditions: [..., 'workerd'],
+  })
+  ```
+
+The concrete examples can be found in `packages/pg-bundler-test`.
+
+## How to use conditionally, in non-Node.js environments
+
+As implemented in `pg` [here](https://github.com/brianc/node-postgres/commit/07553428e9c0eacf761a5d4541a3300ff7859578#diff-34588ad868ebcb232660aba7ee6a99d1e02f4bc93f73497d2688c3f074e60533R5-R13), a typical use case might look as follows, where in a Node.js environment the `net` module is used, while in a non-Node.js environment, where `net` is unavailable, `pg-cloudflare` is used instead, providing an equivalent interface:
+
+```js
+module.exports.getStream = function getStream(ssl = false) {
+  const net = require('net')
+  if (typeof net.Socket === 'function') {
+    return net.Socket()
+  }
+  const { CloudflareSocket } = require('pg-cloudflare')
+  return new CloudflareSocket(ssl)
+}
+```
+
+## Node.js implementation of the Socket API proposal
+
+If you're looking for a way to rely on `connect()` as the interface you use to interact with raw sockets, but need this interface to be available in a Node.js environment, [`@arrowood.dev/socket`](https://github.com/Ethan-Arrowood/socket) provides a Node.js implementation of the Socket API.
+
+### license
+
+The MIT License (MIT)
+
+Copyright (c) 2023 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,2 @@
+declare const _default: {};
+export default _default;
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+// This is an empty module that is served up when outside of a workerd environment
+// See the `exports` field in package.json
+exports.default = {};
+//# sourceMappingURL=empty.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/empty.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"empty.js","sourceRoot":"","sources":["../src/empty.ts"],"names":[],"mappings":";;AAAA,kFAAkF;AAClF,0CAA0C;AAC1C,kBAAe,EAAE,CAAA"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,31 @@
+/// <reference types="node" />
+/// <reference types="node" />
+/// <reference types="node" />
+import { TlsOptions } from 'cloudflare:sockets';
+import { EventEmitter } from 'events';
+/**
+ * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
+ */
+export declare class CloudflareSocket extends EventEmitter {
+    readonly ssl: boolean;
+    writable: boolean;
+    destroyed: boolean;
+    private _upgrading;
+    private _upgraded;
+    private _cfSocket;
+    private _cfWriter;
+    private _cfReader;
+    constructor(ssl: boolean);
+    setNoDelay(): this;
+    setKeepAlive(): this;
+    ref(): this;
+    unref(): this;
+    connect(port: number, host: string, connectListener?: (...args: unknown[]) => void): Promise<this | undefined>;
+    _listen(): Promise<void>;
+    _listenOnce(): Promise<void>;
+    write(data: Uint8Array | string, encoding?: BufferEncoding, callback?: (...args: unknown[]) => void): true | void;
+    end(data?: Buffer, encoding?: BufferEncoding, callback?: (...args: unknown[]) => void): this;
+    destroy(reason: string): this;
+    startTls(options: TlsOptions): void;
+    _addClosedHandler(): void;
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,152 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CloudflareSocket = void 0;
+const events_1 = require("events");
+/**
+ * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
+ */
+class CloudflareSocket extends events_1.EventEmitter {
+    constructor(ssl) {
+        super();
+        this.ssl = ssl;
+        this.writable = false;
+        this.destroyed = false;
+        this._upgrading = false;
+        this._upgraded = false;
+        this._cfSocket = null;
+        this._cfWriter = null;
+        this._cfReader = null;
+    }
+    setNoDelay() {
+        return this;
+    }
+    setKeepAlive() {
+        return this;
+    }
+    ref() {
+        return this;
+    }
+    unref() {
+        return this;
+    }
+    async connect(port, host, connectListener) {
+        try {
+            log('connecting');
+            if (connectListener)
+                this.once('connect', connectListener);
+            const options = this.ssl ? { secureTransport: 'starttls' } : {};
+            const mod = await import('cloudflare:sockets');
+            const connect = mod.connect;
+            this._cfSocket = connect(`${host}:${port}`, options);
+            this._cfWriter = this._cfSocket.writable.getWriter();
+            this._addClosedHandler();
+            this._cfReader = this._cfSocket.readable.getReader();
+            if (this.ssl) {
+                this._listenOnce().catch((e) => this.emit('error', e));
+            }
+            else {
+                this._listen().catch((e) => this.emit('error', e));
+            }
+            await this._cfWriter.ready;
+            log('socket ready');
+            this.writable = true;
+            this.emit('connect');
+            return this;
+        }
+        catch (e) {
+            this.emit('error', e);
+        }
+    }
+    async _listen() {
+        // eslint-disable-next-line no-constant-condition
+        while (true) {
+            log('awaiting receive from CF socket');
+            const { done, value } = await this._cfReader.read();
+            log('CF socket received:', done, value);
+            if (done) {
+                log('done');
+                break;
+            }
+            this.emit('data', Buffer.from(value));
+        }
+    }
+    async _listenOnce() {
+        log('awaiting first receive from CF socket');
+        const { done, value } = await this._cfReader.read();
+        log('First CF socket received:', done, value);
+        this.emit('data', Buffer.from(value));
+    }
+    write(data, encoding = 'utf8', callback = () => { }) {
+        if (data.length === 0)
+            return callback();
+        if (typeof data === 'string')
+            data = Buffer.from(data, encoding);
+        log('sending data direct:', data);
+        this._cfWriter.write(data).then(() => {
+            log('data sent');
+            callback();
+        }, (err) => {
+            log('send error', err);
+            callback(err);
+        });
+        return true;
+    }
+    end(data = Buffer.alloc(0), encoding = 'utf8', callback = () => { }) {
+        log('ending CF socket');
+        this.write(data, encoding, (err) => {
+            this._cfSocket.close();
+            if (callback)
+                callback(err);
+        });
+        return this;
+    }
+    destroy(reason) {
+        log('destroying CF socket', reason);
+        this.destroyed = true;
+        return this.end();
+    }
+    startTls(options) {
+        if (this._upgraded) {
+            // Don't try to upgrade again.
+            this.emit('error', 'Cannot call `startTls()` more than once on a socket');
+            return;
+        }
+        this._cfWriter.releaseLock();
+        this._cfReader.releaseLock();
+        this._upgrading = true;
+        this._cfSocket = this._cfSocket.startTls(options);
+        this._cfWriter = this._cfSocket.writable.getWriter();
+        this._cfReader = this._cfSocket.readable.getReader();
+        this._addClosedHandler();
+        this._listen().catch((e) => this.emit('error', e));
+    }
+    _addClosedHandler() {
+        this._cfSocket.closed.then(() => {
+            if (!this._upgrading) {
+                log('CF socket closed');
+                this._cfSocket = null;
+                this.emit('close');
+            }
+            else {
+                this._upgrading = false;
+                this._upgraded = true;
+            }
+        }).catch((e) => this.emit('error', e));
+    }
+}
+exports.CloudflareSocket = CloudflareSocket;
+const debug = false;
+function dump(data) {
+    if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
+        const hex = Buffer.from(data).toString('hex');
+        const str = new TextDecoder().decode(data);
+        return `\n>>> STR: "${str.replace(/\n/g, '\\n')}"\n>>> HEX: ${hex}\n`;
+    }
+    else {
+        return data;
+    }
+}
+function log(...args) {
+    debug && console.log(...args.map(dump));
+}
+//# sourceMappingURL=index.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/esm/index.mjs
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,3 @@
+import cf from '../dist/index.js'
+
+export const CloudflareSocket = cf.CloudflareSocket
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,38 @@
+{
+  "name": "pg-cloudflare",
+  "version": "1.2.7",
+  "description": "A socket implementation that can run on Cloudflare Workers using native TCP connections.",
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
+  "license": "MIT",
+  "devDependencies": {
+    "ts-node": "^8.5.4",
+    "typescript": "^4.0.3"
+  },
+  "exports": {
+    ".": {
+      "workerd": {
+        "import": "./esm/index.mjs",
+        "require": "./dist/index.js"
+      },
+      "default": "./dist/empty.js"
+    }
+  },
+  "scripts": {
+    "build": "tsc",
+    "build:watch": "tsc --watch",
+    "prepublish": "yarn build",
+    "test": "echo e2e test in pg package"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-cloudflare"
+  },
+  "files": [
+    "/dist/*{js,ts,map}",
+    "/src",
+    "/esm"
+  ],
+  "gitHead": "8f8e7315e8f7c1bb01e98fdb41c8c92585510782"
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/empty.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/empty.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/empty.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,3 @@
+// This is an empty module that is served up when outside of a workerd environment
+// See the `exports` field in package.json
+export default {}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/index.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,166 @@
+import { SocketOptions, Socket, TlsOptions } from 'cloudflare:sockets'
+import { EventEmitter } from 'events'
+
+/**
+ * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
+ */
+export class CloudflareSocket extends EventEmitter {
+  writable = false
+  destroyed = false
+
+  private _upgrading = false
+  private _upgraded = false
+  private _cfSocket: Socket | null = null
+  private _cfWriter: WritableStreamDefaultWriter | null = null
+  private _cfReader: ReadableStreamDefaultReader | null = null
+
+  constructor(readonly ssl: boolean) {
+    super()
+  }
+
+  setNoDelay() {
+    return this
+  }
+  setKeepAlive() {
+    return this
+  }
+  ref() {
+    return this
+  }
+  unref() {
+    return this
+  }
+
+  async connect(port: number, host: string, connectListener?: (...args: unknown[]) => void) {
+    try {
+      log('connecting')
+      if (connectListener) this.once('connect', connectListener)
+
+      const options: SocketOptions = this.ssl ? { secureTransport: 'starttls' } : {}
+      const mod = await import('cloudflare:sockets')
+      const connect = mod.connect
+      this._cfSocket = connect(`${host}:${port}`, options)
+      this._cfWriter = this._cfSocket.writable.getWriter()
+      this._addClosedHandler()
+
+      this._cfReader = this._cfSocket.readable.getReader()
+      if (this.ssl) {
+        this._listenOnce().catch((e) => this.emit('error', e))
+      } else {
+        this._listen().catch((e) => this.emit('error', e))
+      }
+
+      await this._cfWriter!.ready
+      log('socket ready')
+      this.writable = true
+      this.emit('connect')
+
+      return this
+    } catch (e) {
+      this.emit('error', e)
+    }
+  }
+
+  async _listen() {
+    // eslint-disable-next-line no-constant-condition
+    while (true) {
+      log('awaiting receive from CF socket')
+      const { done, value } = await this._cfReader!.read()
+      log('CF socket received:', done, value)
+      if (done) {
+        log('done')
+        break
+      }
+      this.emit('data', Buffer.from(value))
+    }
+  }
+
+  async _listenOnce() {
+    log('awaiting first receive from CF socket')
+    const { done, value } = await this._cfReader!.read()
+    log('First CF socket received:', done, value)
+    this.emit('data', Buffer.from(value))
+  }
+
+  write(
+    data: Uint8Array | string,
+    encoding: BufferEncoding = 'utf8',
+    callback: (...args: unknown[]) => void = () => {}
+  ) {
+    if (data.length === 0) return callback()
+    if (typeof data === 'string') data = Buffer.from(data, encoding)
+
+    log('sending data direct:', data)
+    this._cfWriter!.write(data).then(
+      () => {
+        log('data sent')
+        callback()
+      },
+      (err) => {
+        log('send error', err)
+        callback(err)
+      }
+    )
+    return true
+  }
+
+  end(data = Buffer.alloc(0), encoding: BufferEncoding = 'utf8', callback: (...args: unknown[]) => void = () => {}) {
+    log('ending CF socket')
+    this.write(data, encoding, (err) => {
+      this._cfSocket!.close()
+      if (callback) callback(err)
+    })
+    return this
+  }
+
+  destroy(reason: string) {
+    log('destroying CF socket', reason)
+    this.destroyed = true
+    return this.end()
+  }
+
+  startTls(options: TlsOptions) {
+    if (this._upgraded) {
+      // Don't try to upgrade again.
+      this.emit('error', 'Cannot call `startTls()` more than once on a socket')
+      return
+    }
+    this._cfWriter!.releaseLock()
+    this._cfReader!.releaseLock()
+    this._upgrading = true
+    this._cfSocket = this._cfSocket!.startTls(options)
+    this._cfWriter = this._cfSocket.writable.getWriter()
+    this._cfReader = this._cfSocket.readable.getReader()
+    this._addClosedHandler()
+    this._listen().catch((e) => this.emit('error', e))
+  }
+
+  _addClosedHandler() {
+    this._cfSocket!.closed.then(() => {
+      if (!this._upgrading) {
+        log('CF socket closed')
+        this._cfSocket = null
+        this.emit('close')
+      } else {
+        this._upgrading = false
+        this._upgraded = true
+      }
+    }).catch((e) => this.emit('error', e))
+  }
+}
+
+const debug = false
+
+function dump(data: unknown) {
+  if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
+    const hex = Buffer.from(data).toString('hex')
+    const str = new TextDecoder().decode(data)
+    return `\n>>> STR: "${str.replace(/\n/g, '\\n')}"\n>>> HEX: ${hex}\n`
+  } else {
+    return data
+  }
+}
+
+function log(...args: unknown[]) {
+  debug && console.log(...args.map(dump))
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/types.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/types.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-cloudflare/src/types.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,25 @@
+declare module 'cloudflare:sockets' {
+  export class Socket {
+    public readonly readable: any
+    public readonly writable: any
+    public readonly closed: Promise<void>
+    public close(): Promise<void>
+    public startTls(options: TlsOptions): Socket
+  }
+
+  export type TlsOptions = {
+    expectedServerHostname?: string
+  }
+
+  export type SocketAddress = {
+    hostname: string
+    port: number
+  }
+
+  export type SocketOptions = {
+    secureTransport?: 'off' | 'on' | 'starttls'
+    allowHalfOpen?: boolean
+  }
+
+  export function connect(address: string | SocketAddress, options?: SocketOptions): Socket
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Iced Development
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,105 @@
+pg-connection-string
+====================
+
+[![NPM](https://nodei.co/npm/pg-connection-string.png?compact=true)](https://nodei.co/npm/pg-connection-string/)
+
+Functions for dealing with a PostgresSQL connection string
+
+`parse` method taken from [node-postgres](https://github.com/brianc/node-postgres.git)
+Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)
+MIT License
+
+## Usage
+
+```js
+const parse = require('pg-connection-string').parse;
+
+const config = parse('postgres://someuser:somepassword@somehost:381/somedatabase')
+```
+
+The resulting config contains a subset of the following properties:
+
+* `user` - User with which to authenticate to the server
+* `password` - Corresponding password
+* `host` - Postgres server hostname or, for UNIX domain sockets, the socket filename
+* `port` - port on which to connect
+* `database` - Database name within the server
+* `client_encoding` - string encoding the client will use
+* `ssl`, either a boolean or an object with properties
+  * `rejectUnauthorized`
+  * `cert`
+  * `key`
+  * `ca`
+* any other query parameters (for example, `application_name`) are preserved intact.
+
+### ClientConfig Compatibility for TypeScript
+
+The pg-connection-string `ConnectionOptions` interface is not compatible with the `ClientConfig` interface that [pg.Client](https://node-postgres.com/apis/client) expects. To remedy this, use the `parseIntoClientConfig` function instead of `parse`:
+
+```ts
+import { ClientConfig } from 'pg';
+import { parseIntoClientConfig } from 'pg-connection-string';
+
+const config: ClientConfig = parseIntoClientConfig('postgres://someuser:somepassword@somehost:381/somedatabase')
+```
+
+You can also use `toClientConfig` to convert an existing `ConnectionOptions` interface into a `ClientConfig` interface:
+
+```ts
+import { ClientConfig } from 'pg';
+import { parse, toClientConfig } from 'pg-connection-string';
+
+const config = parse('postgres://someuser:somepassword@somehost:381/somedatabase')
+const clientConfig: ClientConfig = toClientConfig(config)
+```
+
+## Connection Strings
+
+The short summary of acceptable URLs is:
+
+ * `socket:<path>?<query>` - UNIX domain socket
+ * `postgres://<user>:<password>@<host>:<port>/<database>?<query>` - TCP connection
+
+But see below for more details.
+
+### UNIX Domain Sockets
+
+When user and password are not given, the socket path follows `socket:`, as in `socket:/var/run/pgsql`.
+This form can be shortened to just a path: `/var/run/pgsql`.
+
+When user and password are given, they are included in the typical URL positions, with an empty `host`, as in `socket://user:pass@/var/run/pgsql`.
+
+Query parameters follow a `?` character, including the following special query parameters:
+
+ * `db=<database>` - sets the database name (urlencoded)
+ * `encoding=<encoding>` - sets the `client_encoding` property
+
+### TCP Connections
+
+TCP connections to the Postgres server are indicated with `pg:` or `postgres:` schemes (in fact, any scheme but `socket:` is accepted).
+If username and password are included, they should be urlencoded.
+The database name, however, should *not* be urlencoded.
+
+Query parameters follow a `?` character, including the following special query parameters:
+ * `host=<host>` - sets `host` property, overriding the URL's host
+ * `encoding=<encoding>` - sets the `client_encoding` property
+ * `ssl=1`, `ssl=true`, `ssl=0`, `ssl=false` - sets `ssl` to true or false, accordingly
+ * `uselibpqcompat=true` - use libpq semantics
+ * `sslmode=<sslmode>` when `uselibpqcompat=true` is not set
+   * `sslmode=disable` - sets `ssl` to false
+   * `sslmode=no-verify` - sets `ssl` to `{ rejectUnauthorized: false }`
+   * `sslmode=prefer`, `sslmode=require`, `sslmode=verify-ca`, `sslmode=verify-full` - sets `ssl` to true
+ * `sslmode=<sslmode>` when `uselibpqcompat=true`
+   * `sslmode=disable` - sets `ssl` to false
+   * `sslmode=prefer` - sets `ssl` to `{ rejectUnauthorized: false }`
+   * `sslmode=require` - sets `ssl` to `{ rejectUnauthorized: false }` unless `sslrootcert` is specified, in which case it behaves like `verify-ca`
+   * `sslmode=verify-ca` - sets `ssl` to `{ checkServerIdentity: no-op }` (verify CA, but not server identity). This verifies the presented certificate against the effective CA specified in sslrootcert.
+   * `sslmode=verify-full` - sets `ssl` to `{}` (verify CA and server identity)
+ * `sslcert=<filename>` - reads data from the given file and includes the result as `ssl.cert`
+ * `sslkey=<filename>` - reads data from the given file and includes the result as `ssl.key`
+ * `sslrootcert=<filename>` - reads data from the given file and includes the result as `ssl.ca`
+
+A bare relative URL, such as `salesdata`, will indicate a database name while leaving other properties empty.
+
+> [!CAUTION]
+> Choosing an sslmode other than verify-full has serious security implications. Please read https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS to understand the trade-offs.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/esm/index.mjs
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,8 @@
+// ESM wrapper for pg-connection-string
+import connectionString from '../index.js'
+
+// Re-export the parse function
+export default connectionString.parse
+export const parse = connectionString.parse
+export const toClientConfig = connectionString.toClientConfig
+export const parseIntoClientConfig = connectionString.parseIntoClientConfig
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,36 @@
+import { ClientConfig } from 'pg'
+
+export function parse(connectionString: string, options?: Options): ConnectionOptions
+
+export interface Options {
+  // Use libpq semantics when interpreting the connection string
+  useLibpqCompat?: boolean
+}
+
+interface SSLConfig {
+  ca?: string
+  cert?: string | null
+  key?: string
+  rejectUnauthorized?: boolean
+}
+
+export interface ConnectionOptions {
+  host: string | null
+  password?: string
+  user?: string
+  port?: string | null
+  database: string | null | undefined
+  client_encoding?: string
+  ssl?: boolean | string | SSLConfig
+
+  application_name?: string
+  fallback_application_name?: string
+  options?: string
+  keepalives?: number
+
+  // We allow any other options to be passed through
+  [key: string]: unknown
+}
+
+export function toClientConfig(config: ConnectionOptions): ClientConfig
+export function parseIntoClientConfig(connectionString: string): ClientConfig
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,213 @@
+'use strict'
+
+//Parse method copied from https://github.com/brianc/node-postgres
+//Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)
+//MIT License
+
+//parses a connection string
+function parse(str, options = {}) {
+  //unix socket
+  if (str.charAt(0) === '/') {
+    const config = str.split(' ')
+    return { host: config[0], database: config[1] }
+  }
+
+  // Check for empty host in URL
+
+  const config = {}
+  let result
+  let dummyHost = false
+  if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {
+    // Ensure spaces are encoded as %20
+    str = encodeURI(str).replace(/%25(\d\d)/g, '%$1')
+  }
+
+  try {
+    try {
+      result = new URL(str, 'postgres://base')
+    } catch (e) {
+      // The URL is invalid so try again with a dummy host
+      result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base')
+      dummyHost = true
+    }
+  } catch (err) {
+    // Remove the input from the error message to avoid leaking sensitive information
+    err.input && (err.input = '*****REDACTED*****')
+  }
+
+  // We'd like to use Object.fromEntries() here but Node.js 10 does not support it
+  for (const entry of result.searchParams.entries()) {
+    config[entry[0]] = entry[1]
+  }
+
+  config.user = config.user || decodeURIComponent(result.username)
+  config.password = config.password || decodeURIComponent(result.password)
+
+  if (result.protocol == 'socket:') {
+    config.host = decodeURI(result.pathname)
+    config.database = result.searchParams.get('db')
+    config.client_encoding = result.searchParams.get('encoding')
+    return config
+  }
+  const hostname = dummyHost ? '' : result.hostname
+  if (!config.host) {
+    // Only set the host if there is no equivalent query param.
+    config.host = decodeURIComponent(hostname)
+  } else if (hostname && /^%2f/i.test(hostname)) {
+    // Only prepend the hostname to the pathname if it is not a URL encoded Unix socket host.
+    result.pathname = hostname + result.pathname
+  }
+  if (!config.port) {
+    // Only set the port if there is no equivalent query param.
+    config.port = result.port
+  }
+
+  const pathname = result.pathname.slice(1) || null
+  config.database = pathname ? decodeURI(pathname) : null
+
+  if (config.ssl === 'true' || config.ssl === '1') {
+    config.ssl = true
+  }
+
+  if (config.ssl === '0') {
+    config.ssl = false
+  }
+
+  if (config.sslcert || config.sslkey || config.sslrootcert || config.sslmode) {
+    config.ssl = {}
+  }
+
+  // Only try to load fs if we expect to read from the disk
+  const fs = config.sslcert || config.sslkey || config.sslrootcert ? require('fs') : null
+
+  if (config.sslcert) {
+    config.ssl.cert = fs.readFileSync(config.sslcert).toString()
+  }
+
+  if (config.sslkey) {
+    config.ssl.key = fs.readFileSync(config.sslkey).toString()
+  }
+
+  if (config.sslrootcert) {
+    config.ssl.ca = fs.readFileSync(config.sslrootcert).toString()
+  }
+
+  if (options.useLibpqCompat && config.uselibpqcompat) {
+    throw new Error('Both useLibpqCompat and uselibpqcompat are set. Please use only one of them.')
+  }
+
+  if (config.uselibpqcompat === 'true' || options.useLibpqCompat) {
+    switch (config.sslmode) {
+      case 'disable': {
+        config.ssl = false
+        break
+      }
+      case 'prefer': {
+        config.ssl.rejectUnauthorized = false
+        break
+      }
+      case 'require': {
+        if (config.sslrootcert) {
+          // If a root CA is specified, behavior of `sslmode=require` will be the same as that of `verify-ca`
+          config.ssl.checkServerIdentity = function () {}
+        } else {
+          config.ssl.rejectUnauthorized = false
+        }
+        break
+      }
+      case 'verify-ca': {
+        if (!config.ssl.ca) {
+          throw new Error(
+            'SECURITY WARNING: Using sslmode=verify-ca requires specifying a CA with sslrootcert. If a public CA is used, verify-ca allows connections to a server that somebody else may have registered with the CA, making you vulnerable to Man-in-the-Middle attacks. Either specify a custom CA certificate with sslrootcert parameter or use sslmode=verify-full for proper security.'
+          )
+        }
+        config.ssl.checkServerIdentity = function () {}
+        break
+      }
+      case 'verify-full': {
+        break
+      }
+    }
+  } else {
+    switch (config.sslmode) {
+      case 'disable': {
+        config.ssl = false
+        break
+      }
+      case 'prefer':
+      case 'require':
+      case 'verify-ca':
+      case 'verify-full': {
+        break
+      }
+      case 'no-verify': {
+        config.ssl.rejectUnauthorized = false
+        break
+      }
+    }
+  }
+
+  return config
+}
+
+// convert pg-connection-string ssl config to a ClientConfig.ConnectionOptions
+function toConnectionOptions(sslConfig) {
+  const connectionOptions = Object.entries(sslConfig).reduce((c, [key, value]) => {
+    // we explicitly check for undefined and null instead of `if (value)` because some
+    // options accept falsy values. Example: `ssl.rejectUnauthorized = false`
+    if (value !== undefined && value !== null) {
+      c[key] = value
+    }
+
+    return c
+  }, {})
+
+  return connectionOptions
+}
+
+// convert pg-connection-string config to a ClientConfig
+function toClientConfig(config) {
+  const poolConfig = Object.entries(config).reduce((c, [key, value]) => {
+    if (key === 'ssl') {
+      const sslConfig = value
+
+      if (typeof sslConfig === 'boolean') {
+        c[key] = sslConfig
+      }
+
+      if (typeof sslConfig === 'object') {
+        c[key] = toConnectionOptions(sslConfig)
+      }
+    } else if (value !== undefined && value !== null) {
+      if (key === 'port') {
+        // when port is not specified, it is converted into an empty string
+        // we want to avoid NaN or empty string as a values in ClientConfig
+        if (value !== '') {
+          const v = parseInt(value, 10)
+          if (isNaN(v)) {
+            throw new Error(`Invalid ${key}: ${value}`)
+          }
+
+          c[key] = v
+        }
+      } else {
+        c[key] = value
+      }
+    }
+
+    return c
+  }, {})
+
+  return poolConfig
+}
+
+// parses a connection string into ClientConfig
+function parseIntoClientConfig(str) {
+  return toClientConfig(parse(str))
+}
+
+module.exports = parse
+
+parse.parse = parse
+parse.toClientConfig = toClientConfig
+parse.parseIntoClientConfig = parseIntoClientConfig
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-connection-string/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,52 @@
+{
+  "name": "pg-connection-string",
+  "version": "2.9.1",
+  "description": "Functions for dealing with a PostgresSQL connection string",
+  "main": "./index.js",
+  "types": "./index.d.ts",
+  "exports": {
+    ".": {
+      "types": "./index.d.ts",
+      "import": "./esm/index.mjs",
+      "require": "./index.js",
+      "default": "./index.js"
+    }
+  },
+  "scripts": {
+    "test": "nyc --reporter=lcov mocha && npm run check-coverage",
+    "check-coverage": "nyc check-coverage --statements 100 --branches 100 --lines 100 --functions 100"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-connection-string"
+  },
+  "keywords": [
+    "pg",
+    "connection",
+    "string",
+    "parse"
+  ],
+  "author": "Blaine Bublitz <blaine@iceddev.com> (http://iceddev.com/)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/brianc/node-postgres/issues"
+  },
+  "homepage": "https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string",
+  "devDependencies": {
+    "@types/pg": "^8.12.0",
+    "chai": "^4.1.1",
+    "coveralls": "^3.0.4",
+    "istanbul": "^0.4.5",
+    "mocha": "^10.5.2",
+    "nyc": "^15",
+    "tsx": "^4.19.4",
+    "typescript": "^4.0.3"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "esm"
+  ],
+  "gitHead": "cd877a57612a39335a97b593111710d26126279d"
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-int8/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-int8/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-int8/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,13 @@
+Copyright © 2017, Charmander <~@charmander.me>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-int8/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-int8/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-int8/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,16 @@
+[![Build status][ci image]][ci]
+
+64-bit big-endian signed integer-to-string conversion designed for [pg][].
+
+```js
+const readInt8 = require('pg-int8');
+
+readInt8(Buffer.from([0, 1, 2, 3, 4, 5, 6, 7]))
+// '283686952306183'
+```
+
+
+  [pg]: https://github.com/brianc/node-postgres
+
+  [ci]: https://travis-ci.org/charmander/pg-int8
+  [ci image]: https://api.travis-ci.org/charmander/pg-int8.svg
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-int8/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-int8/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-int8/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,100 @@
+'use strict';
+
+// selected so (BASE - 1) * 0x100000000 + 0xffffffff is a safe integer
+var BASE = 1000000;
+
+function readInt8(buffer) {
+	var high = buffer.readInt32BE(0);
+	var low = buffer.readUInt32BE(4);
+	var sign = '';
+
+	if (high < 0) {
+		high = ~high + (low === 0);
+		low = (~low + 1) >>> 0;
+		sign = '-';
+	}
+
+	var result = '';
+	var carry;
+	var t;
+	var digits;
+	var pad;
+	var l;
+	var i;
+
+	{
+		carry = high % BASE;
+		high = high / BASE >>> 0;
+
+		t = 0x100000000 * carry + low;
+		low = t / BASE >>> 0;
+		digits = '' + (t - BASE * low);
+
+		if (low === 0 && high === 0) {
+			return sign + digits + result;
+		}
+
+		pad = '';
+		l = 6 - digits.length;
+
+		for (i = 0; i < l; i++) {
+			pad += '0';
+		}
+
+		result = pad + digits + result;
+	}
+
+	{
+		carry = high % BASE;
+		high = high / BASE >>> 0;
+
+		t = 0x100000000 * carry + low;
+		low = t / BASE >>> 0;
+		digits = '' + (t - BASE * low);
+
+		if (low === 0 && high === 0) {
+			return sign + digits + result;
+		}
+
+		pad = '';
+		l = 6 - digits.length;
+
+		for (i = 0; i < l; i++) {
+			pad += '0';
+		}
+
+		result = pad + digits + result;
+	}
+
+	{
+		carry = high % BASE;
+		high = high / BASE >>> 0;
+
+		t = 0x100000000 * carry + low;
+		low = t / BASE >>> 0;
+		digits = '' + (t - BASE * low);
+
+		if (low === 0 && high === 0) {
+			return sign + digits + result;
+		}
+
+		pad = '';
+		l = 6 - digits.length;
+
+		for (i = 0; i < l; i++) {
+			pad += '0';
+		}
+
+		result = pad + digits + result;
+	}
+
+	{
+		carry = high % BASE;
+		t = 0x100000000 * carry + low;
+		digits = '' + t % BASE;
+
+		return sign + digits + result;
+	}
+}
+
+module.exports = readInt8;
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-int8/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-int8/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-int8/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,24 @@
+{
+	"name": "pg-int8",
+	"version": "1.0.1",
+	"description": "64-bit big-endian signed integer-to-string conversion",
+	"bugs": "https://github.com/charmander/pg-int8/issues",
+	"license": "ISC",
+	"files": [
+		"index.js"
+	],
+	"repository": {
+		"type": "git",
+		"url": "https://github.com/charmander/pg-int8"
+	},
+	"scripts": {
+		"test": "tap test"
+	},
+	"devDependencies": {
+		"@charmander/eslint-config-base": "1.0.2",
+		"tap": "10.7.3"
+	},
+	"engines": {
+		"node": ">=4.0.0"
+	}
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-pool/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-pool/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-pool/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-pool/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-pool/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-pool/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,376 @@
+# pg-pool
+[![Build Status](https://travis-ci.org/brianc/node-pg-pool.svg?branch=master)](https://travis-ci.org/brianc/node-pg-pool)
+
+A connection pool for node-postgres
+
+## install
+```sh
+npm i pg-pool pg
+```
+
+## use
+
+### create
+
+to use pg-pool you must first create an instance of a pool
+
+```js
+const Pool = require('pg-pool')
+
+// by default the pool uses the same
+// configuration as whatever `pg` version you have installed
+const pool = new Pool()
+
+// you can pass properties to the pool
+// these properties are passed unchanged to both the node-postgres Client constructor
+// and the node-pool (https://github.com/coopernurse/node-pool) constructor
+// allowing you to fully configure the behavior of both
+const pool2 = new Pool({
+  database: 'postgres',
+  user: 'brianc',
+  password: 'secret!',
+  port: 5432,
+  ssl: true,
+  max: 20, // set pool max size to 20
+  idleTimeoutMillis: 1000, // close idle clients after 1 second
+  connectionTimeoutMillis: 1000, // return an error after 1 second if connection could not be established
+  maxUses: 7500, // close (and replace) a connection after it has been used 7500 times (see below for discussion)
+})
+
+// you can supply a custom client constructor
+// if you want to use the native postgres client
+const NativeClient = require('pg').native.Client
+const nativePool = new Pool({ Client: NativeClient })
+
+// you can even pool pg-native clients directly
+const PgNativeClient = require('pg-native')
+const pgNativePool = new Pool({ Client: PgNativeClient })
+```
+
+##### Note:
+The Pool constructor does not support passing a Database URL as the parameter. To use pg-pool on heroku, for example, you need to parse the URL into a config object. Here is an example of how to parse a Database URL.
+
+```js
+const Pool = require('pg-pool');
+const url = require('url')
+
+const params = url.parse(process.env.DATABASE_URL);
+const auth = params.auth.split(':');
+
+const config = {
+  user: auth[0],
+  password: auth[1],
+  host: params.hostname,
+  port: params.port,
+  database: params.pathname.split('/')[1],
+  ssl: true
+};
+
+const pool = new Pool(config);
+
+/*
+  Transforms, 'postgres://DBuser:secret@DBHost:#####/myDB', into
+  config = {
+    user: 'DBuser',
+    password: 'secret',
+    host: 'DBHost',
+    port: '#####',
+    database: 'myDB',
+    ssl: true
+  }
+*/
+``` 
+
+### acquire clients with a promise
+
+pg-pool supports a fully promise-based api for acquiring clients
+
+```js
+const pool = new Pool()
+pool.connect().then(client => {
+  client.query('select $1::text as name', ['pg-pool']).then(res => {
+    client.release()
+    console.log('hello from', res.rows[0].name)
+  })
+  .catch(e => {
+    client.release()
+    console.error('query error', e.message, e.stack)
+  })
+})
+```
+
+### plays nice with async/await
+
+this ends up looking much nicer if you're using [co](https://github.com/tj/co) or async/await:
+
+```js
+// with async/await
+(async () => {
+  const pool = new Pool()
+  const client = await pool.connect()
+  try {
+    const result = await client.query('select $1::text as name', ['brianc'])
+    console.log('hello from', result.rows[0])
+  } finally {
+    client.release()
+  }
+})().catch(e => console.error(e.message, e.stack))
+
+// with co
+co(function * () {
+  const client = yield pool.connect()
+  try {
+    const result = yield client.query('select $1::text as name', ['brianc'])
+    console.log('hello from', result.rows[0])
+  } finally {
+    client.release()
+  }
+}).catch(e => console.error(e.message, e.stack))
+```
+
+### your new favorite helper method
+
+because its so common to just run a query and return the client to the pool afterward pg-pool has this built-in:
+
+```js
+const pool = new Pool()
+const time = await pool.query('SELECT NOW()')
+const name = await pool.query('select $1::text as name', ['brianc'])
+console.log(name.rows[0].name, 'says hello at', time.rows[0].now)
+```
+
+you can also use a callback here if you'd like:
+
+```js
+const pool = new Pool()
+pool.query('SELECT $1::text as name', ['brianc'], function (err, res) {
+  console.log(res.rows[0].name) // brianc
+})
+```
+
+__pro tip:__ unless you need to run a transaction (which requires a single client for multiple queries) or you
+have some other edge case like [streaming rows](https://github.com/brianc/node-pg-query-stream) or using a [cursor](https://github.com/brianc/node-pg-cursor)
+you should almost always just use `pool.query`.  Its easy, it does the right thing :tm:, and wont ever forget to return
+clients back to the pool after the query is done.
+
+### drop-in backwards compatible
+
+pg-pool still and will always support the traditional callback api for acquiring a client.  This is the exact API node-postgres has shipped with for years:
+
+```js
+const pool = new Pool()
+pool.connect((err, client, done) => {
+  if (err) return done(err)
+
+  client.query('SELECT $1::text as name', ['pg-pool'], (err, res) => {
+    done()
+    if (err) {
+      return console.error('query error', err.message, err.stack)
+    }
+    console.log('hello from', res.rows[0].name)
+  })
+})
+```
+
+### shut it down
+
+When you are finished with the pool if all the clients are idle the pool will close them after `config.idleTimeoutMillis` and your app
+will shutdown gracefully.  If you don't want to wait for the timeout you can end the pool as follows:
+
+```js
+const pool = new Pool()
+const client = await pool.connect()
+console.log(await client.query('select now()'))
+client.release()
+await pool.end()
+```
+
+### a note on instances
+
+The pool should be a __long-lived object__ in your application.  Generally you'll want to instantiate one pool when your app starts up and use the same instance of the pool throughout the lifetime of your application.  If you are frequently creating a new pool within your code you likely don't have your pool initialization code in the correct place.  Example:
+
+```js
+// assume this is a file in your program at ./your-app/lib/db.js
+
+// correct usage: create the pool and let it live
+// 'globally' here, controlling access to it through exported methods
+const pool = new pg.Pool()
+
+// this is the right way to export the query method
+module.exports.query = (text, values) => {
+  console.log('query:', text, values)
+  return pool.query(text, values)
+}
+
+// this would be the WRONG way to export the connect method
+module.exports.connect = () => {
+  // notice how we would be creating a pool instance here
+  // every time we called 'connect' to get a new client?
+  // that's a bad thing & results in creating an unbounded
+  // number of pools & therefore connections
+  const aPool = new pg.Pool()
+  return aPool.connect()
+}
+```
+
+### events
+
+Every instance of a `Pool` is an event emitter.  These instances emit the following events:
+
+#### error
+
+Emitted whenever an idle client in the pool encounters an error.  This is common when your PostgreSQL server shuts down, reboots, or a network partition otherwise causes it to become unavailable while your pool has connected clients.
+
+Example:
+
+```js
+const Pool = require('pg-pool')
+const pool = new Pool()
+
+// attach an error handler to the pool for when a connected, idle client
+// receives an error by being disconnected, etc
+pool.on('error', function(error, client) {
+  // handle this in the same way you would treat process.on('uncaughtException')
+  // it is supplied the error as well as the idle client which received the error
+})
+```
+
+#### connect
+
+Fired whenever the pool creates a __new__ `pg.Client` instance and successfully connects it to the backend.
+
+Example:
+
+```js
+const Pool = require('pg-pool')
+const pool = new Pool()
+
+const count = 0
+
+pool.on('connect', client => {
+  client.count = count++
+})
+
+pool
+  .connect()
+  .then(client => {
+    return client
+      .query('SELECT $1::int AS "clientCount"', [client.count])
+      .then(res => console.log(res.rows[0].clientCount)) // outputs 0
+      .then(() => client)
+  })
+  .then(client => client.release())
+
+```
+
+#### acquire
+
+Fired whenever a client is acquired from the pool
+
+Example:
+
+This allows you to count the number of clients which have ever been acquired from the pool.
+
+```js
+const Pool = require('pg-pool')
+const pool = new Pool()
+
+const acquireCount = 0
+pool.on('acquire', function (client) {
+  acquireCount++
+})
+
+const connectCount = 0
+pool.on('connect', function () {
+  connectCount++
+})
+
+for (let i = 0; i < 200; i++) {
+  pool.query('SELECT NOW()')
+}
+
+setTimeout(function () {
+  console.log('connect count:', connectCount) // output: connect count: 10
+  console.log('acquire count:', acquireCount) // output: acquire count: 200
+}, 100)
+
+```
+
+### environment variables
+
+pg-pool & node-postgres support some of the same environment variables as `psql` supports.  The most common are:
+
+```
+PGDATABASE=my_db
+PGUSER=username
+PGPASSWORD="my awesome password"
+PGPORT=5432
+PGSSLMODE=require
+```
+
+Usually I will export these into my local environment via a `.env` file with environment settings or export them in `~/.bash_profile` or something similar.  This way I get configurability which works with both the postgres suite of tools (`psql`, `pg_dump`, `pg_restore`) and node, I can vary the environment variables locally and in production, and it supports the concept of a [12-factor app](http://12factor.net/) out of the box.
+
+## bring your own promise
+
+In versions of node `<=0.12.x` there is no native promise implementation available globally.  You can polyfill the promise globally like this:
+
+```js
+// first run `npm install promise-polyfill --save
+if (typeof Promise == 'undefined') {
+  global.Promise = require('promise-polyfill')
+}
+```
+
+You can use any other promise implementation you'd like.  The pool also allows you to configure the promise implementation on a per-pool level:
+
+```js
+const bluebirdPool = new Pool({
+  Promise: require('bluebird')
+})
+```
+
+__please note:__ in node `<=0.12.x` the pool will throw if you do not provide a promise constructor in one of the two ways mentioned above.  In node `>=4.0.0` the pool will use the native promise implementation by default; however, the two methods above still allow you to "bring your own."
+
+## maxUses and read-replica autoscaling (e.g. AWS Aurora)
+
+The maxUses config option can help an application instance rebalance load against a replica set that has been auto-scaled after the connection pool is already full of healthy connections.
+
+The mechanism here is that a connection is considered "expended" after it has been acquired and released `maxUses` number of times.  Depending on the load on your system, this means there will be an approximate time in which any given connection will live, thus creating a window for rebalancing.
+
+Imagine a scenario where you have 10 app instances providing an API running against a replica cluster of 3 that are accessed via a round-robin DNS entry.  Each instance runs a connection pool size of 20.  With an ambient load of 50 requests per second, the connection pool will likely fill up in a few minutes with healthy connections.
+
+If you have weekly bursts of traffic which peak at 1,000 requests per second, you might want to grow your replicas to 10 during this period.  Without setting `maxUses`, the new replicas will not be adopted by the app servers without an intervention -- namely, restarting each in turn in order to build up new connection pools that are balanced against all the replicas.  Adding additional app server instances will help to some extent because they will adopt all the replicas in an even way, but the initial app servers will continue to focus additional load on the original replicas.
+
+This is where the `maxUses` configuration option comes into play.  Setting `maxUses` to 7500 will ensure that over a period of 30 minutes or so the new replicas will be adopted as the pre-existing connections are closed and replaced with new ones, thus creating a window for eventual balance.
+
+You'll want to test based on your own scenarios, but one way to make a first guess at `maxUses` is to identify an acceptable window for rebalancing and then solve for the value:
+
+```
+maxUses = rebalanceWindowSeconds * totalRequestsPerSecond / numAppInstances / poolSize
+```
+
+In the example above, assuming we acquire and release 1 connection per request and we are aiming for a 30 minute rebalancing window:
+
+```
+maxUses = rebalanceWindowSeconds * totalRequestsPerSecond / numAppInstances / poolSize
+   7200 =        1800            *          1000          /        10       /    25
+```
+
+## tests
+
+To run tests clone the repo, `npm i` in the working dir, and then run `npm test`
+
+## contributions
+
+I love contributions.  Please make sure they have tests, and submit a PR.  If you're not sure if the issue is worth it or will be accepted it never hurts to open an issue to begin the conversation.  If you're interested in keeping up with node-postgres releated stuff, you can follow me on twitter at [@briancarlson](https://twitter.com/briancarlson) - I generally announce any noteworthy updates there.
+
+## license
+
+The MIT License (MIT)
+Copyright (c) 2016 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-pool/esm/index.mjs
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-pool/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-pool/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,5 @@
+// ESM wrapper for pg-pool
+import Pool from '../index.js'
+
+// Export as default only to match CJS module
+export default Pool
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-pool/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-pool/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-pool/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,479 @@
+'use strict'
+const EventEmitter = require('events').EventEmitter
+
+const NOOP = function () {}
+
+const removeWhere = (list, predicate) => {
+  const i = list.findIndex(predicate)
+
+  return i === -1 ? undefined : list.splice(i, 1)[0]
+}
+
+class IdleItem {
+  constructor(client, idleListener, timeoutId) {
+    this.client = client
+    this.idleListener = idleListener
+    this.timeoutId = timeoutId
+  }
+}
+
+class PendingItem {
+  constructor(callback) {
+    this.callback = callback
+  }
+}
+
+function throwOnDoubleRelease() {
+  throw new Error('Release called on client which has already been released to the pool.')
+}
+
+function promisify(Promise, callback) {
+  if (callback) {
+    return { callback: callback, result: undefined }
+  }
+  let rej
+  let res
+  const cb = function (err, client) {
+    err ? rej(err) : res(client)
+  }
+  const result = new Promise(function (resolve, reject) {
+    res = resolve
+    rej = reject
+  }).catch((err) => {
+    // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the
+    // application that created the query
+    Error.captureStackTrace(err)
+    throw err
+  })
+  return { callback: cb, result: result }
+}
+
+function makeIdleListener(pool, client) {
+  return function idleListener(err) {
+    err.client = client
+
+    client.removeListener('error', idleListener)
+    client.on('error', () => {
+      pool.log('additional client error after disconnection due to error', err)
+    })
+    pool._remove(client)
+    // TODO - document that once the pool emits an error
+    // the client has already been closed & purged and is unusable
+    pool.emit('error', err, client)
+  }
+}
+
+class Pool extends EventEmitter {
+  constructor(options, Client) {
+    super()
+    this.options = Object.assign({}, options)
+
+    if (options != null && 'password' in options) {
+      // "hiding" the password so it doesn't show up in stack traces
+      // or if the client is console.logged
+      Object.defineProperty(this.options, 'password', {
+        configurable: true,
+        enumerable: false,
+        writable: true,
+        value: options.password,
+      })
+    }
+    if (options != null && options.ssl && options.ssl.key) {
+      // "hiding" the ssl->key so it doesn't show up in stack traces
+      // or if the client is console.logged
+      Object.defineProperty(this.options.ssl, 'key', {
+        enumerable: false,
+      })
+    }
+
+    this.options.max = this.options.max || this.options.poolSize || 10
+    this.options.min = this.options.min || 0
+    this.options.maxUses = this.options.maxUses || Infinity
+    this.options.allowExitOnIdle = this.options.allowExitOnIdle || false
+    this.options.maxLifetimeSeconds = this.options.maxLifetimeSeconds || 0
+    this.log = this.options.log || function () {}
+    this.Client = this.options.Client || Client || require('pg').Client
+    this.Promise = this.options.Promise || global.Promise
+
+    if (typeof this.options.idleTimeoutMillis === 'undefined') {
+      this.options.idleTimeoutMillis = 10000
+    }
+
+    this._clients = []
+    this._idle = []
+    this._expired = new WeakSet()
+    this._pendingQueue = []
+    this._endCallback = undefined
+    this.ending = false
+    this.ended = false
+  }
+
+  _isFull() {
+    return this._clients.length >= this.options.max
+  }
+
+  _isAboveMin() {
+    return this._clients.length > this.options.min
+  }
+
+  _pulseQueue() {
+    this.log('pulse queue')
+    if (this.ended) {
+      this.log('pulse queue ended')
+      return
+    }
+    if (this.ending) {
+      this.log('pulse queue on ending')
+      if (this._idle.length) {
+        this._idle.slice().map((item) => {
+          this._remove(item.client)
+        })
+      }
+      if (!this._clients.length) {
+        this.ended = true
+        this._endCallback()
+      }
+      return
+    }
+
+    // if we don't have any waiting, do nothing
+    if (!this._pendingQueue.length) {
+      this.log('no queued requests')
+      return
+    }
+    // if we don't have any idle clients and we have no more room do nothing
+    if (!this._idle.length && this._isFull()) {
+      return
+    }
+    const pendingItem = this._pendingQueue.shift()
+    if (this._idle.length) {
+      const idleItem = this._idle.pop()
+      clearTimeout(idleItem.timeoutId)
+      const client = idleItem.client
+      client.ref && client.ref()
+      const idleListener = idleItem.idleListener
+
+      return this._acquireClient(client, pendingItem, idleListener, false)
+    }
+    if (!this._isFull()) {
+      return this.newClient(pendingItem)
+    }
+    throw new Error('unexpected condition')
+  }
+
+  _remove(client, callback) {
+    const removed = removeWhere(this._idle, (item) => item.client === client)
+
+    if (removed !== undefined) {
+      clearTimeout(removed.timeoutId)
+    }
+
+    this._clients = this._clients.filter((c) => c !== client)
+    const context = this
+    client.end(() => {
+      context.emit('remove', client)
+
+      if (typeof callback === 'function') {
+        callback()
+      }
+    })
+  }
+
+  connect(cb) {
+    if (this.ending) {
+      const err = new Error('Cannot use a pool after calling end on the pool')
+      return cb ? cb(err) : this.Promise.reject(err)
+    }
+
+    const response = promisify(this.Promise, cb)
+    const result = response.result
+
+    // if we don't have to connect a new client, don't do so
+    if (this._isFull() || this._idle.length) {
+      // if we have idle clients schedule a pulse immediately
+      if (this._idle.length) {
+        process.nextTick(() => this._pulseQueue())
+      }
+
+      if (!this.options.connectionTimeoutMillis) {
+        this._pendingQueue.push(new PendingItem(response.callback))
+        return result
+      }
+
+      const queueCallback = (err, res, done) => {
+        clearTimeout(tid)
+        response.callback(err, res, done)
+      }
+
+      const pendingItem = new PendingItem(queueCallback)
+
+      // set connection timeout on checking out an existing client
+      const tid = setTimeout(() => {
+        // remove the callback from pending waiters because
+        // we're going to call it with a timeout error
+        removeWhere(this._pendingQueue, (i) => i.callback === queueCallback)
+        pendingItem.timedOut = true
+        response.callback(new Error('timeout exceeded when trying to connect'))
+      }, this.options.connectionTimeoutMillis)
+
+      if (tid.unref) {
+        tid.unref()
+      }
+
+      this._pendingQueue.push(pendingItem)
+      return result
+    }
+
+    this.newClient(new PendingItem(response.callback))
+
+    return result
+  }
+
+  newClient(pendingItem) {
+    const client = new this.Client(this.options)
+    this._clients.push(client)
+    const idleListener = makeIdleListener(this, client)
+
+    this.log('checking client timeout')
+
+    // connection timeout logic
+    let tid
+    let timeoutHit = false
+    if (this.options.connectionTimeoutMillis) {
+      tid = setTimeout(() => {
+        this.log('ending client due to timeout')
+        timeoutHit = true
+        // force kill the node driver, and let libpq do its teardown
+        client.connection ? client.connection.stream.destroy() : client.end()
+      }, this.options.connectionTimeoutMillis)
+    }
+
+    this.log('connecting new client')
+    client.connect((err) => {
+      if (tid) {
+        clearTimeout(tid)
+      }
+      client.on('error', idleListener)
+      if (err) {
+        this.log('client failed to connect', err)
+        // remove the dead client from our list of clients
+        this._clients = this._clients.filter((c) => c !== client)
+        if (timeoutHit) {
+          err = new Error('Connection terminated due to connection timeout', { cause: err })
+        }
+
+        // this client won’t be released, so move on immediately
+        this._pulseQueue()
+
+        if (!pendingItem.timedOut) {
+          pendingItem.callback(err, undefined, NOOP)
+        }
+      } else {
+        this.log('new client connected')
+
+        if (this.options.maxLifetimeSeconds !== 0) {
+          const maxLifetimeTimeout = setTimeout(() => {
+            this.log('ending client due to expired lifetime')
+            this._expired.add(client)
+            const idleIndex = this._idle.findIndex((idleItem) => idleItem.client === client)
+            if (idleIndex !== -1) {
+              this._acquireClient(
+                client,
+                new PendingItem((err, client, clientRelease) => clientRelease()),
+                idleListener,
+                false
+              )
+            }
+          }, this.options.maxLifetimeSeconds * 1000)
+
+          maxLifetimeTimeout.unref()
+          client.once('end', () => clearTimeout(maxLifetimeTimeout))
+        }
+
+        return this._acquireClient(client, pendingItem, idleListener, true)
+      }
+    })
+  }
+
+  // acquire a client for a pending work item
+  _acquireClient(client, pendingItem, idleListener, isNew) {
+    if (isNew) {
+      this.emit('connect', client)
+    }
+
+    this.emit('acquire', client)
+
+    client.release = this._releaseOnce(client, idleListener)
+
+    client.removeListener('error', idleListener)
+
+    if (!pendingItem.timedOut) {
+      if (isNew && this.options.verify) {
+        this.options.verify(client, (err) => {
+          if (err) {
+            client.release(err)
+            return pendingItem.callback(err, undefined, NOOP)
+          }
+
+          pendingItem.callback(undefined, client, client.release)
+        })
+      } else {
+        pendingItem.callback(undefined, client, client.release)
+      }
+    } else {
+      if (isNew && this.options.verify) {
+        this.options.verify(client, client.release)
+      } else {
+        client.release()
+      }
+    }
+  }
+
+  // returns a function that wraps _release and throws if called more than once
+  _releaseOnce(client, idleListener) {
+    let released = false
+
+    return (err) => {
+      if (released) {
+        throwOnDoubleRelease()
+      }
+
+      released = true
+      this._release(client, idleListener, err)
+    }
+  }
+
+  // release a client back to the poll, include an error
+  // to remove it from the pool
+  _release(client, idleListener, err) {
+    client.on('error', idleListener)
+
+    client._poolUseCount = (client._poolUseCount || 0) + 1
+
+    this.emit('release', err, client)
+
+    // TODO(bmc): expose a proper, public interface _queryable and _ending
+    if (err || this.ending || !client._queryable || client._ending || client._poolUseCount >= this.options.maxUses) {
+      if (client._poolUseCount >= this.options.maxUses) {
+        this.log('remove expended client')
+      }
+
+      return this._remove(client, this._pulseQueue.bind(this))
+    }
+
+    const isExpired = this._expired.has(client)
+    if (isExpired) {
+      this.log('remove expired client')
+      this._expired.delete(client)
+      return this._remove(client, this._pulseQueue.bind(this))
+    }
+
+    // idle timeout
+    let tid
+    if (this.options.idleTimeoutMillis && this._isAboveMin()) {
+      tid = setTimeout(() => {
+        this.log('remove idle client')
+        this._remove(client, this._pulseQueue.bind(this))
+      }, this.options.idleTimeoutMillis)
+
+      if (this.options.allowExitOnIdle) {
+        // allow Node to exit if this is all that's left
+        tid.unref()
+      }
+    }
+
+    if (this.options.allowExitOnIdle) {
+      client.unref()
+    }
+
+    this._idle.push(new IdleItem(client, idleListener, tid))
+    this._pulseQueue()
+  }
+
+  query(text, values, cb) {
+    // guard clause against passing a function as the first parameter
+    if (typeof text === 'function') {
+      const response = promisify(this.Promise, text)
+      setImmediate(function () {
+        return response.callback(new Error('Passing a function as the first parameter to pool.query is not supported'))
+      })
+      return response.result
+    }
+
+    // allow plain text query without values
+    if (typeof values === 'function') {
+      cb = values
+      values = undefined
+    }
+    const response = promisify(this.Promise, cb)
+    cb = response.callback
+
+    this.connect((err, client) => {
+      if (err) {
+        return cb(err)
+      }
+
+      let clientReleased = false
+      const onError = (err) => {
+        if (clientReleased) {
+          return
+        }
+        clientReleased = true
+        client.release(err)
+        cb(err)
+      }
+
+      client.once('error', onError)
+      this.log('dispatching query')
+      try {
+        client.query(text, values, (err, res) => {
+          this.log('query dispatched')
+          client.removeListener('error', onError)
+          if (clientReleased) {
+            return
+          }
+          clientReleased = true
+          client.release(err)
+          if (err) {
+            return cb(err)
+          }
+          return cb(undefined, res)
+        })
+      } catch (err) {
+        client.release(err)
+        return cb(err)
+      }
+    })
+    return response.result
+  }
+
+  end(cb) {
+    this.log('ending')
+    if (this.ending) {
+      const err = new Error('Called end on pool more than once')
+      return cb ? cb(err) : this.Promise.reject(err)
+    }
+    this.ending = true
+    const promised = promisify(this.Promise, cb)
+    this._endCallback = promised.callback
+    this._pulseQueue()
+    return promised.result
+  }
+
+  get waitingCount() {
+    return this._pendingQueue.length
+  }
+
+  get idleCount() {
+    return this._idle.length
+  }
+
+  get expiredCount() {
+    return this._clients.reduce((acc, client) => acc + (this._expired.has(client) ? 1 : 0), 0)
+  }
+
+  get totalCount() {
+    return this._clients.length
+  }
+}
+module.exports = Pool
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-pool/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-pool/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-pool/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,51 @@
+{
+  "name": "pg-pool",
+  "version": "3.10.1",
+  "description": "Connection pool for node-postgres",
+  "main": "index.js",
+  "exports": {
+    ".": {
+      "import": "./esm/index.mjs",
+      "require": "./index.js",
+      "default": "./index.js"
+    }
+  },
+  "directories": {
+    "test": "test"
+  },
+  "scripts": {
+    "test": " node_modules/.bin/mocha"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-pool"
+  },
+  "keywords": [
+    "pg",
+    "postgres",
+    "pool",
+    "database"
+  ],
+  "author": "Brian M. Carlson",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/brianc/node-pg-pool/issues"
+  },
+  "homepage": "https://github.com/brianc/node-pg-pool#readme",
+  "devDependencies": {
+    "bluebird": "3.7.2",
+    "co": "4.6.0",
+    "expect.js": "0.3.1",
+    "lodash": "^4.17.11",
+    "mocha": "^10.5.2"
+  },
+  "peerDependencies": {
+    "pg": ">=8.0"
+  },
+  "files": [
+    "index.js",
+    "esm"
+  ],
+  "gitHead": "cd877a57612a39335a97b593111710d26126279d"
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2010 - 2021 Brian Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,3 @@
+# pg-protocol
+
+Low level postgres wire protocol parser and serializer written in Typescript. Used by node-postgres. Needs more documentation. :smile:
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+export {};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,23 @@
+"use strict";
+// file for microbenchmarking
+Object.defineProperty(exports, "__esModule", { value: true });
+const buffer_reader_1 = require("./buffer-reader");
+const LOOPS = 1000;
+let count = 0;
+const start = performance.now();
+const reader = new buffer_reader_1.BufferReader();
+const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0]);
+const run = () => {
+    if (count > LOOPS) {
+        console.log(performance.now() - start);
+        return;
+    }
+    count++;
+    for (let i = 0; i < LOOPS; i++) {
+        reader.setBuffer(0, buffer);
+        reader.cstring();
+    }
+    setImmediate(run);
+};
+run();
+//# sourceMappingURL=b.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/b.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"b.js","sourceRoot":"","sources":["../src/b.ts"],"names":[],"mappings":";AAAA,6BAA6B;;AAE7B,mDAA8C;AAE9C,MAAM,KAAK,GAAG,IAAI,CAAA;AAClB,IAAI,KAAK,GAAG,CAAC,CAAA;AACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;AAE/B,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAA;AACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;AAE3D,MAAM,GAAG,GAAG,GAAG,EAAE;IACf,IAAI,KAAK,GAAG,KAAK,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;QACtC,OAAM;KACP;IACD,KAAK,EAAE,CAAA;IACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAC3B,MAAM,CAAC,OAAO,EAAE,CAAA;KACjB;IACD,YAAY,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC,CAAA;AAED,GAAG,EAAE,CAAA"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,15 @@
+/// <reference types="node" />
+export declare class BufferReader {
+    private offset;
+    private buffer;
+    private encoding;
+    constructor(offset?: number);
+    setBuffer(offset: number, buffer: Buffer): void;
+    int16(): number;
+    byte(): number;
+    int32(): number;
+    uint32(): number;
+    string(length: number): string;
+    cstring(): string;
+    bytes(length: number): Buffer;
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,56 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BufferReader = void 0;
+const emptyBuffer = Buffer.allocUnsafe(0);
+class BufferReader {
+    constructor(offset = 0) {
+        this.offset = offset;
+        this.buffer = emptyBuffer;
+        // TODO(bmc): support non-utf8 encoding?
+        this.encoding = 'utf-8';
+    }
+    setBuffer(offset, buffer) {
+        this.offset = offset;
+        this.buffer = buffer;
+    }
+    int16() {
+        const result = this.buffer.readInt16BE(this.offset);
+        this.offset += 2;
+        return result;
+    }
+    byte() {
+        const result = this.buffer[this.offset];
+        this.offset++;
+        return result;
+    }
+    int32() {
+        const result = this.buffer.readInt32BE(this.offset);
+        this.offset += 4;
+        return result;
+    }
+    uint32() {
+        const result = this.buffer.readUInt32BE(this.offset);
+        this.offset += 4;
+        return result;
+    }
+    string(length) {
+        const result = this.buffer.toString(this.encoding, this.offset, this.offset + length);
+        this.offset += length;
+        return result;
+    }
+    cstring() {
+        const start = this.offset;
+        let end = start;
+        // eslint-disable-next-line no-empty
+        while (this.buffer[end++] !== 0) { }
+        this.offset = end;
+        return this.buffer.toString(this.encoding, start, end - 1);
+    }
+    bytes(length) {
+        const result = this.buffer.slice(this.offset, this.offset + length);
+        this.offset += length;
+        return result;
+    }
+}
+exports.BufferReader = BufferReader;
+//# sourceMappingURL=buffer-reader.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-reader.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"buffer-reader.js","sourceRoot":"","sources":["../src/buffer-reader.ts"],"names":[],"mappings":";;;AAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAEzC,MAAa,YAAY;IAMvB,YAAoB,SAAiB,CAAC;QAAlB,WAAM,GAAN,MAAM,CAAY;QAL9B,WAAM,GAAW,WAAW,CAAA;QAEpC,wCAAwC;QAChC,aAAQ,GAAW,OAAO,CAAA;IAEO,CAAC;IAEnC,SAAS,CAAC,MAAc,EAAE,MAAc;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEM,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,IAAI;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,MAAM;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,MAAM,CAAC,MAAc;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QACrF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,GAAG,GAAG,KAAK,CAAA;QACf,oCAAoC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,GAAE;QACnC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;IAC5D,CAAC;IAEM,KAAK,CAAC,MAAc;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QACnE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAzDD,oCAyDC"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,16 @@
+/// <reference types="node" />
+export declare class Writer {
+    private size;
+    private buffer;
+    private offset;
+    private headerPosition;
+    constructor(size?: number);
+    private ensure;
+    addInt32(num: number): Writer;
+    addInt16(num: number): Writer;
+    addCString(string: string): Writer;
+    addString(string?: string): Writer;
+    add(otherBuffer: Buffer): Writer;
+    private join;
+    flush(code?: number): Buffer;
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,81 @@
+"use strict";
+//binary data writer tuned for encoding binary specific to the postgres binary protocol
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Writer = void 0;
+class Writer {
+    constructor(size = 256) {
+        this.size = size;
+        this.offset = 5;
+        this.headerPosition = 0;
+        this.buffer = Buffer.allocUnsafe(size);
+    }
+    ensure(size) {
+        const remaining = this.buffer.length - this.offset;
+        if (remaining < size) {
+            const oldBuffer = this.buffer;
+            // exponential growth factor of around ~ 1.5
+            // https://stackoverflow.com/questions/2269063/buffer-growth-strategy
+            const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size;
+            this.buffer = Buffer.allocUnsafe(newSize);
+            oldBuffer.copy(this.buffer);
+        }
+    }
+    addInt32(num) {
+        this.ensure(4);
+        this.buffer[this.offset++] = (num >>> 24) & 0xff;
+        this.buffer[this.offset++] = (num >>> 16) & 0xff;
+        this.buffer[this.offset++] = (num >>> 8) & 0xff;
+        this.buffer[this.offset++] = (num >>> 0) & 0xff;
+        return this;
+    }
+    addInt16(num) {
+        this.ensure(2);
+        this.buffer[this.offset++] = (num >>> 8) & 0xff;
+        this.buffer[this.offset++] = (num >>> 0) & 0xff;
+        return this;
+    }
+    addCString(string) {
+        if (!string) {
+            this.ensure(1);
+        }
+        else {
+            const len = Buffer.byteLength(string);
+            this.ensure(len + 1); // +1 for null terminator
+            this.buffer.write(string, this.offset, 'utf-8');
+            this.offset += len;
+        }
+        this.buffer[this.offset++] = 0; // null terminator
+        return this;
+    }
+    addString(string = '') {
+        const len = Buffer.byteLength(string);
+        this.ensure(len);
+        this.buffer.write(string, this.offset);
+        this.offset += len;
+        return this;
+    }
+    add(otherBuffer) {
+        this.ensure(otherBuffer.length);
+        otherBuffer.copy(this.buffer, this.offset);
+        this.offset += otherBuffer.length;
+        return this;
+    }
+    join(code) {
+        if (code) {
+            this.buffer[this.headerPosition] = code;
+            //length is everything in this packet minus the code
+            const length = this.offset - (this.headerPosition + 1);
+            this.buffer.writeInt32BE(length, this.headerPosition + 1);
+        }
+        return this.buffer.slice(code ? 0 : 5, this.offset);
+    }
+    flush(code) {
+        const result = this.join(code);
+        this.offset = 5;
+        this.headerPosition = 0;
+        this.buffer = Buffer.allocUnsafe(this.size);
+        return result;
+    }
+}
+exports.Writer = Writer;
+//# sourceMappingURL=buffer-writer.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/buffer-writer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"buffer-writer.js","sourceRoot":"","sources":["../src/buffer-writer.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+export {};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,524 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const test_buffers_1 = __importDefault(require("./testing/test-buffers"));
+const buffer_list_1 = __importDefault(require("./testing/buffer-list"));
+const _1 = require(".");
+const assert_1 = __importDefault(require("assert"));
+const stream_1 = require("stream");
+const authOkBuffer = test_buffers_1.default.authenticationOk();
+const paramStatusBuffer = test_buffers_1.default.parameterStatus('client_encoding', 'UTF8');
+const readyForQueryBuffer = test_buffers_1.default.readyForQuery();
+const backendKeyDataBuffer = test_buffers_1.default.backendKeyData(1, 2);
+const commandCompleteBuffer = test_buffers_1.default.commandComplete('SELECT 3');
+const parseCompleteBuffer = test_buffers_1.default.parseComplete();
+const bindCompleteBuffer = test_buffers_1.default.bindComplete();
+const portalSuspendedBuffer = test_buffers_1.default.portalSuspended();
+const row1 = {
+    name: 'id',
+    tableID: 1,
+    attributeNumber: 2,
+    dataTypeID: 3,
+    dataTypeSize: 4,
+    typeModifier: 5,
+    formatCode: 0,
+};
+const oneRowDescBuff = test_buffers_1.default.rowDescription([row1]);
+row1.name = 'bang';
+const twoRowBuf = test_buffers_1.default.rowDescription([
+    row1,
+    {
+        name: 'whoah',
+        tableID: 10,
+        attributeNumber: 11,
+        dataTypeID: 12,
+        dataTypeSize: 13,
+        typeModifier: 14,
+        formatCode: 0,
+    },
+]);
+const rowWithBigOids = {
+    name: 'bigoid',
+    tableID: 3000000001,
+    attributeNumber: 2,
+    dataTypeID: 3000000003,
+    dataTypeSize: 4,
+    typeModifier: 5,
+    formatCode: 0,
+};
+const bigOidDescBuff = test_buffers_1.default.rowDescription([rowWithBigOids]);
+const emptyRowFieldBuf = test_buffers_1.default.dataRow([]);
+const oneFieldBuf = test_buffers_1.default.dataRow(['test']);
+const expectedAuthenticationOkayMessage = {
+    name: 'authenticationOk',
+    length: 8,
+};
+const expectedParameterStatusMessage = {
+    name: 'parameterStatus',
+    parameterName: 'client_encoding',
+    parameterValue: 'UTF8',
+    length: 25,
+};
+const expectedBackendKeyDataMessage = {
+    name: 'backendKeyData',
+    processID: 1,
+    secretKey: 2,
+};
+const expectedReadyForQueryMessage = {
+    name: 'readyForQuery',
+    length: 5,
+    status: 'I',
+};
+const expectedCommandCompleteMessage = {
+    name: 'commandComplete',
+    length: 13,
+    text: 'SELECT 3',
+};
+const emptyRowDescriptionBuffer = new buffer_list_1.default()
+    .addInt16(0) // number of fields
+    .join(true, 'T');
+const expectedEmptyRowDescriptionMessage = {
+    name: 'rowDescription',
+    length: 6,
+    fieldCount: 0,
+    fields: [],
+};
+const expectedOneRowMessage = {
+    name: 'rowDescription',
+    length: 27,
+    fieldCount: 1,
+    fields: [
+        {
+            name: 'id',
+            tableID: 1,
+            columnID: 2,
+            dataTypeID: 3,
+            dataTypeSize: 4,
+            dataTypeModifier: 5,
+            format: 'text',
+        },
+    ],
+};
+const expectedTwoRowMessage = {
+    name: 'rowDescription',
+    length: 53,
+    fieldCount: 2,
+    fields: [
+        {
+            name: 'bang',
+            tableID: 1,
+            columnID: 2,
+            dataTypeID: 3,
+            dataTypeSize: 4,
+            dataTypeModifier: 5,
+            format: 'text',
+        },
+        {
+            name: 'whoah',
+            tableID: 10,
+            columnID: 11,
+            dataTypeID: 12,
+            dataTypeSize: 13,
+            dataTypeModifier: 14,
+            format: 'text',
+        },
+    ],
+};
+const expectedBigOidMessage = {
+    name: 'rowDescription',
+    length: 31,
+    fieldCount: 1,
+    fields: [
+        {
+            name: 'bigoid',
+            tableID: 3000000001,
+            columnID: 2,
+            dataTypeID: 3000000003,
+            dataTypeSize: 4,
+            dataTypeModifier: 5,
+            format: 'text',
+        },
+    ],
+};
+const emptyParameterDescriptionBuffer = new buffer_list_1.default()
+    .addInt16(0) // number of parameters
+    .join(true, 't');
+const oneParameterDescBuf = test_buffers_1.default.parameterDescription([1111]);
+const twoParameterDescBuf = test_buffers_1.default.parameterDescription([2222, 3333]);
+const expectedEmptyParameterDescriptionMessage = {
+    name: 'parameterDescription',
+    length: 6,
+    parameterCount: 0,
+    dataTypeIDs: [],
+};
+const expectedOneParameterMessage = {
+    name: 'parameterDescription',
+    length: 10,
+    parameterCount: 1,
+    dataTypeIDs: [1111],
+};
+const expectedTwoParameterMessage = {
+    name: 'parameterDescription',
+    length: 14,
+    parameterCount: 2,
+    dataTypeIDs: [2222, 3333],
+};
+const testForMessage = function (buffer, expectedMessage) {
+    it('receives and parses ' + expectedMessage.name, () => __awaiter(this, void 0, void 0, function* () {
+        const messages = yield parseBuffers([buffer]);
+        const [lastMessage] = messages;
+        for (const key in expectedMessage) {
+            assert_1.default.deepEqual(lastMessage[key], expectedMessage[key]);
+        }
+    }));
+};
+const plainPasswordBuffer = test_buffers_1.default.authenticationCleartextPassword();
+const md5PasswordBuffer = test_buffers_1.default.authenticationMD5Password();
+const SASLBuffer = test_buffers_1.default.authenticationSASL();
+const SASLContinueBuffer = test_buffers_1.default.authenticationSASLContinue();
+const SASLFinalBuffer = test_buffers_1.default.authenticationSASLFinal();
+const expectedPlainPasswordMessage = {
+    name: 'authenticationCleartextPassword',
+};
+const expectedMD5PasswordMessage = {
+    name: 'authenticationMD5Password',
+    salt: Buffer.from([1, 2, 3, 4]),
+};
+const expectedSASLMessage = {
+    name: 'authenticationSASL',
+    mechanisms: ['SCRAM-SHA-256'],
+};
+const expectedSASLContinueMessage = {
+    name: 'authenticationSASLContinue',
+    data: 'data',
+};
+const expectedSASLFinalMessage = {
+    name: 'authenticationSASLFinal',
+    data: 'data',
+};
+const notificationResponseBuffer = test_buffers_1.default.notification(4, 'hi', 'boom');
+const expectedNotificationResponseMessage = {
+    name: 'notification',
+    processId: 4,
+    channel: 'hi',
+    payload: 'boom',
+};
+const parseBuffers = (buffers) => __awaiter(void 0, void 0, void 0, function* () {
+    const stream = new stream_1.PassThrough();
+    for (const buffer of buffers) {
+        stream.write(buffer);
+    }
+    stream.end();
+    const msgs = [];
+    yield (0, _1.parse)(stream, (msg) => msgs.push(msg));
+    return msgs;
+});
+describe('PgPacketStream', function () {
+    testForMessage(authOkBuffer, expectedAuthenticationOkayMessage);
+    testForMessage(plainPasswordBuffer, expectedPlainPasswordMessage);
+    testForMessage(md5PasswordBuffer, expectedMD5PasswordMessage);
+    testForMessage(SASLBuffer, expectedSASLMessage);
+    testForMessage(SASLContinueBuffer, expectedSASLContinueMessage);
+    // this exercises a found bug in the parser:
+    // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+    // and adds a test which is deterministic, rather than relying on network packet chunking
+    const extendedSASLContinueBuffer = Buffer.concat([SASLContinueBuffer, Buffer.from([1, 2, 3, 4])]);
+    testForMessage(extendedSASLContinueBuffer, expectedSASLContinueMessage);
+    testForMessage(SASLFinalBuffer, expectedSASLFinalMessage);
+    // this exercises a found bug in the parser:
+    // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+    // and adds a test which is deterministic, rather than relying on network packet chunking
+    const extendedSASLFinalBuffer = Buffer.concat([SASLFinalBuffer, Buffer.from([1, 2, 4, 5])]);
+    testForMessage(extendedSASLFinalBuffer, expectedSASLFinalMessage);
+    testForMessage(paramStatusBuffer, expectedParameterStatusMessage);
+    testForMessage(backendKeyDataBuffer, expectedBackendKeyDataMessage);
+    testForMessage(readyForQueryBuffer, expectedReadyForQueryMessage);
+    testForMessage(commandCompleteBuffer, expectedCommandCompleteMessage);
+    testForMessage(notificationResponseBuffer, expectedNotificationResponseMessage);
+    testForMessage(test_buffers_1.default.emptyQuery(), {
+        name: 'emptyQuery',
+        length: 4,
+    });
+    testForMessage(Buffer.from([0x6e, 0, 0, 0, 4]), {
+        name: 'noData',
+    });
+    describe('rowDescription messages', function () {
+        testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage);
+        testForMessage(oneRowDescBuff, expectedOneRowMessage);
+        testForMessage(twoRowBuf, expectedTwoRowMessage);
+        testForMessage(bigOidDescBuff, expectedBigOidMessage);
+    });
+    describe('parameterDescription messages', function () {
+        testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage);
+        testForMessage(oneParameterDescBuf, expectedOneParameterMessage);
+        testForMessage(twoParameterDescBuf, expectedTwoParameterMessage);
+    });
+    describe('parsing rows', function () {
+        describe('parsing empty row', function () {
+            testForMessage(emptyRowFieldBuf, {
+                name: 'dataRow',
+                fieldCount: 0,
+            });
+        });
+        describe('parsing data row with fields', function () {
+            testForMessage(oneFieldBuf, {
+                name: 'dataRow',
+                fieldCount: 1,
+                fields: ['test'],
+            });
+        });
+    });
+    describe('notice message', function () {
+        // this uses the same logic as error message
+        const buff = test_buffers_1.default.notice([{ type: 'C', value: 'code' }]);
+        testForMessage(buff, {
+            name: 'notice',
+            code: 'code',
+        });
+    });
+    testForMessage(test_buffers_1.default.error([]), {
+        name: 'error',
+    });
+    describe('with all the fields', function () {
+        const buffer = test_buffers_1.default.error([
+            {
+                type: 'S',
+                value: 'ERROR',
+            },
+            {
+                type: 'C',
+                value: 'code',
+            },
+            {
+                type: 'M',
+                value: 'message',
+            },
+            {
+                type: 'D',
+                value: 'details',
+            },
+            {
+                type: 'H',
+                value: 'hint',
+            },
+            {
+                type: 'P',
+                value: '100',
+            },
+            {
+                type: 'p',
+                value: '101',
+            },
+            {
+                type: 'q',
+                value: 'query',
+            },
+            {
+                type: 'W',
+                value: 'where',
+            },
+            {
+                type: 'F',
+                value: 'file',
+            },
+            {
+                type: 'L',
+                value: 'line',
+            },
+            {
+                type: 'R',
+                value: 'routine',
+            },
+            {
+                type: 'Z',
+                value: 'alsdkf',
+            },
+        ]);
+        testForMessage(buffer, {
+            name: 'error',
+            severity: 'ERROR',
+            code: 'code',
+            message: 'message',
+            detail: 'details',
+            hint: 'hint',
+            position: '100',
+            internalPosition: '101',
+            internalQuery: 'query',
+            where: 'where',
+            file: 'file',
+            line: 'line',
+            routine: 'routine',
+        });
+    });
+    testForMessage(parseCompleteBuffer, {
+        name: 'parseComplete',
+    });
+    testForMessage(bindCompleteBuffer, {
+        name: 'bindComplete',
+    });
+    testForMessage(bindCompleteBuffer, {
+        name: 'bindComplete',
+    });
+    testForMessage(test_buffers_1.default.closeComplete(), {
+        name: 'closeComplete',
+    });
+    describe('parses portal suspended message', function () {
+        testForMessage(portalSuspendedBuffer, {
+            name: 'portalSuspended',
+        });
+    });
+    describe('parses replication start message', function () {
+        testForMessage(Buffer.from([0x57, 0x00, 0x00, 0x00, 0x04]), {
+            name: 'replicationStart',
+            length: 4,
+        });
+    });
+    describe('copy', () => {
+        testForMessage(test_buffers_1.default.copyIn(0), {
+            name: 'copyInResponse',
+            length: 7,
+            binary: false,
+            columnTypes: [],
+        });
+        testForMessage(test_buffers_1.default.copyIn(2), {
+            name: 'copyInResponse',
+            length: 11,
+            binary: false,
+            columnTypes: [0, 1],
+        });
+        testForMessage(test_buffers_1.default.copyOut(0), {
+            name: 'copyOutResponse',
+            length: 7,
+            binary: false,
+            columnTypes: [],
+        });
+        testForMessage(test_buffers_1.default.copyOut(3), {
+            name: 'copyOutResponse',
+            length: 13,
+            binary: false,
+            columnTypes: [0, 1, 2],
+        });
+        testForMessage(test_buffers_1.default.copyDone(), {
+            name: 'copyDone',
+            length: 4,
+        });
+        testForMessage(test_buffers_1.default.copyData(Buffer.from([5, 6, 7])), {
+            name: 'copyData',
+            length: 7,
+            chunk: Buffer.from([5, 6, 7]),
+        });
+    });
+    // since the data message on a stream can randomly divide the incomming
+    // tcp packets anywhere, we need to make sure we can parse every single
+    // split on a tcp message
+    describe('split buffer, single message parsing', function () {
+        const fullBuffer = test_buffers_1.default.dataRow([null, 'bang', 'zug zug', null, '!']);
+        it('parses when full buffer comes in', function () {
+            return __awaiter(this, void 0, void 0, function* () {
+                const messages = yield parseBuffers([fullBuffer]);
+                const message = messages[0];
+                assert_1.default.equal(message.fields.length, 5);
+                assert_1.default.equal(message.fields[0], null);
+                assert_1.default.equal(message.fields[1], 'bang');
+                assert_1.default.equal(message.fields[2], 'zug zug');
+                assert_1.default.equal(message.fields[3], null);
+                assert_1.default.equal(message.fields[4], '!');
+            });
+        });
+        const testMessageReceivedAfterSplitAt = function (split) {
+            return __awaiter(this, void 0, void 0, function* () {
+                const firstBuffer = Buffer.alloc(fullBuffer.length - split);
+                const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length);
+                fullBuffer.copy(firstBuffer, 0, 0);
+                fullBuffer.copy(secondBuffer, 0, firstBuffer.length);
+                const messages = yield parseBuffers([firstBuffer, secondBuffer]);
+                const message = messages[0];
+                assert_1.default.equal(message.fields.length, 5);
+                assert_1.default.equal(message.fields[0], null);
+                assert_1.default.equal(message.fields[1], 'bang');
+                assert_1.default.equal(message.fields[2], 'zug zug');
+                assert_1.default.equal(message.fields[3], null);
+                assert_1.default.equal(message.fields[4], '!');
+            });
+        };
+        it('parses when split in the middle', function () {
+            return testMessageReceivedAfterSplitAt(6);
+        });
+        it('parses when split at end', function () {
+            return testMessageReceivedAfterSplitAt(2);
+        });
+        it('parses when split at beginning', function () {
+            return Promise.all([
+                testMessageReceivedAfterSplitAt(fullBuffer.length - 2),
+                testMessageReceivedAfterSplitAt(fullBuffer.length - 1),
+                testMessageReceivedAfterSplitAt(fullBuffer.length - 5),
+            ]);
+        });
+    });
+    describe('split buffer, multiple message parsing', function () {
+        const dataRowBuffer = test_buffers_1.default.dataRow(['!']);
+        const readyForQueryBuffer = test_buffers_1.default.readyForQuery();
+        const fullBuffer = Buffer.alloc(dataRowBuffer.length + readyForQueryBuffer.length);
+        dataRowBuffer.copy(fullBuffer, 0, 0);
+        readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0);
+        const verifyMessages = function (messages) {
+            assert_1.default.strictEqual(messages.length, 2);
+            assert_1.default.deepEqual(messages[0], {
+                name: 'dataRow',
+                fieldCount: 1,
+                length: 11,
+                fields: ['!'],
+            });
+            assert_1.default.equal(messages[0].fields[0], '!');
+            assert_1.default.deepEqual(messages[1], {
+                name: 'readyForQuery',
+                length: 5,
+                status: 'I',
+            });
+        };
+        // sanity check
+        it('receives both messages when packet is not split', function () {
+            return __awaiter(this, void 0, void 0, function* () {
+                const messages = yield parseBuffers([fullBuffer]);
+                verifyMessages(messages);
+            });
+        });
+        const splitAndVerifyTwoMessages = function (split) {
+            return __awaiter(this, void 0, void 0, function* () {
+                const firstBuffer = Buffer.alloc(fullBuffer.length - split);
+                const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length);
+                fullBuffer.copy(firstBuffer, 0, 0);
+                fullBuffer.copy(secondBuffer, 0, firstBuffer.length);
+                const messages = yield parseBuffers([firstBuffer, secondBuffer]);
+                verifyMessages(messages);
+            });
+        };
+        describe('receives both messages when packet is split', function () {
+            it('in the middle', function () {
+                return splitAndVerifyTwoMessages(11);
+            });
+            it('at the front', function () {
+                return Promise.all([
+                    splitAndVerifyTwoMessages(fullBuffer.length - 1),
+                    splitAndVerifyTwoMessages(fullBuffer.length - 4),
+                    splitAndVerifyTwoMessages(fullBuffer.length - 6),
+                ]);
+            });
+            it('at the end', function () {
+                return Promise.all([splitAndVerifyTwoMessages(8), splitAndVerifyTwoMessages(1)]);
+            });
+        });
+    });
+});
+//# sourceMappingURL=inbound-parser.test.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/inbound-parser.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"inbound-parser.test.js","sourceRoot":"","sources":["../src/inbound-parser.test.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,6 @@
+/// <reference types="node" />
+import { DatabaseError } from './messages';
+import { serialize } from './serializer';
+import { MessageCallback } from './parser';
+export declare function parse(stream: NodeJS.ReadableStream, callback: MessageCallback): Promise<void>;
+export { serialize, DatabaseError };
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,15 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DatabaseError = exports.serialize = exports.parse = void 0;
+const messages_1 = require("./messages");
+Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function () { return messages_1.DatabaseError; } });
+const serializer_1 = require("./serializer");
+Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return serializer_1.serialize; } });
+const parser_1 = require("./parser");
+function parse(stream, callback) {
+    const parser = new parser_1.Parser();
+    stream.on('data', (buffer) => parser.parse(buffer, callback));
+    return new Promise((resolve) => stream.on('end', () => resolve()));
+}
+exports.parse = parse;
+//# sourceMappingURL=index.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA0C;AAUtB,8FAVX,wBAAa,OAUW;AATjC,6CAAwC;AAS/B,0FATA,sBAAS,OASA;AARlB,qCAAkD;AAElD,SAAgB,KAAK,CAAC,MAA6B,EAAE,QAAyB;IAC5E,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACpE,CAAC;AAJD,sBAIC"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,162 @@
+/// <reference types="node" />
+export declare type Mode = 'text' | 'binary';
+export declare type MessageName = 'parseComplete' | 'bindComplete' | 'closeComplete' | 'noData' | 'portalSuspended' | 'replicationStart' | 'emptyQuery' | 'copyDone' | 'copyData' | 'rowDescription' | 'parameterDescription' | 'parameterStatus' | 'backendKeyData' | 'notification' | 'readyForQuery' | 'commandComplete' | 'dataRow' | 'copyInResponse' | 'copyOutResponse' | 'authenticationOk' | 'authenticationMD5Password' | 'authenticationCleartextPassword' | 'authenticationSASL' | 'authenticationSASLContinue' | 'authenticationSASLFinal' | 'error' | 'notice';
+export interface BackendMessage {
+    name: MessageName;
+    length: number;
+}
+export declare const parseComplete: BackendMessage;
+export declare const bindComplete: BackendMessage;
+export declare const closeComplete: BackendMessage;
+export declare const noData: BackendMessage;
+export declare const portalSuspended: BackendMessage;
+export declare const replicationStart: BackendMessage;
+export declare const emptyQuery: BackendMessage;
+export declare const copyDone: BackendMessage;
+interface NoticeOrError {
+    message: string | undefined;
+    severity: string | undefined;
+    code: string | undefined;
+    detail: string | undefined;
+    hint: string | undefined;
+    position: string | undefined;
+    internalPosition: string | undefined;
+    internalQuery: string | undefined;
+    where: string | undefined;
+    schema: string | undefined;
+    table: string | undefined;
+    column: string | undefined;
+    dataType: string | undefined;
+    constraint: string | undefined;
+    file: string | undefined;
+    line: string | undefined;
+    routine: string | undefined;
+}
+export declare class DatabaseError extends Error implements NoticeOrError {
+    readonly length: number;
+    readonly name: MessageName;
+    severity: string | undefined;
+    code: string | undefined;
+    detail: string | undefined;
+    hint: string | undefined;
+    position: string | undefined;
+    internalPosition: string | undefined;
+    internalQuery: string | undefined;
+    where: string | undefined;
+    schema: string | undefined;
+    table: string | undefined;
+    column: string | undefined;
+    dataType: string | undefined;
+    constraint: string | undefined;
+    file: string | undefined;
+    line: string | undefined;
+    routine: string | undefined;
+    constructor(message: string, length: number, name: MessageName);
+}
+export declare class CopyDataMessage {
+    readonly length: number;
+    readonly chunk: Buffer;
+    readonly name = "copyData";
+    constructor(length: number, chunk: Buffer);
+}
+export declare class CopyResponse {
+    readonly length: number;
+    readonly name: MessageName;
+    readonly binary: boolean;
+    readonly columnTypes: number[];
+    constructor(length: number, name: MessageName, binary: boolean, columnCount: number);
+}
+export declare class Field {
+    readonly name: string;
+    readonly tableID: number;
+    readonly columnID: number;
+    readonly dataTypeID: number;
+    readonly dataTypeSize: number;
+    readonly dataTypeModifier: number;
+    readonly format: Mode;
+    constructor(name: string, tableID: number, columnID: number, dataTypeID: number, dataTypeSize: number, dataTypeModifier: number, format: Mode);
+}
+export declare class RowDescriptionMessage {
+    readonly length: number;
+    readonly fieldCount: number;
+    readonly name: MessageName;
+    readonly fields: Field[];
+    constructor(length: number, fieldCount: number);
+}
+export declare class ParameterDescriptionMessage {
+    readonly length: number;
+    readonly parameterCount: number;
+    readonly name: MessageName;
+    readonly dataTypeIDs: number[];
+    constructor(length: number, parameterCount: number);
+}
+export declare class ParameterStatusMessage {
+    readonly length: number;
+    readonly parameterName: string;
+    readonly parameterValue: string;
+    readonly name: MessageName;
+    constructor(length: number, parameterName: string, parameterValue: string);
+}
+export declare class AuthenticationMD5Password implements BackendMessage {
+    readonly length: number;
+    readonly salt: Buffer;
+    readonly name: MessageName;
+    constructor(length: number, salt: Buffer);
+}
+export declare class BackendKeyDataMessage {
+    readonly length: number;
+    readonly processID: number;
+    readonly secretKey: number;
+    readonly name: MessageName;
+    constructor(length: number, processID: number, secretKey: number);
+}
+export declare class NotificationResponseMessage {
+    readonly length: number;
+    readonly processId: number;
+    readonly channel: string;
+    readonly payload: string;
+    readonly name: MessageName;
+    constructor(length: number, processId: number, channel: string, payload: string);
+}
+export declare class ReadyForQueryMessage {
+    readonly length: number;
+    readonly status: string;
+    readonly name: MessageName;
+    constructor(length: number, status: string);
+}
+export declare class CommandCompleteMessage {
+    readonly length: number;
+    readonly text: string;
+    readonly name: MessageName;
+    constructor(length: number, text: string);
+}
+export declare class DataRowMessage {
+    length: number;
+    fields: any[];
+    readonly fieldCount: number;
+    readonly name: MessageName;
+    constructor(length: number, fields: any[]);
+}
+export declare class NoticeMessage implements BackendMessage, NoticeOrError {
+    readonly length: number;
+    readonly message: string | undefined;
+    constructor(length: number, message: string | undefined);
+    readonly name = "notice";
+    severity: string | undefined;
+    code: string | undefined;
+    detail: string | undefined;
+    hint: string | undefined;
+    position: string | undefined;
+    internalPosition: string | undefined;
+    internalQuery: string | undefined;
+    where: string | undefined;
+    schema: string | undefined;
+    table: string | undefined;
+    column: string | undefined;
+    dataType: string | undefined;
+    constraint: string | undefined;
+    file: string | undefined;
+    line: string | undefined;
+    routine: string | undefined;
+}
+export {};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,160 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.NoticeMessage = exports.DataRowMessage = exports.CommandCompleteMessage = exports.ReadyForQueryMessage = exports.NotificationResponseMessage = exports.BackendKeyDataMessage = exports.AuthenticationMD5Password = exports.ParameterStatusMessage = exports.ParameterDescriptionMessage = exports.RowDescriptionMessage = exports.Field = exports.CopyResponse = exports.CopyDataMessage = exports.DatabaseError = exports.copyDone = exports.emptyQuery = exports.replicationStart = exports.portalSuspended = exports.noData = exports.closeComplete = exports.bindComplete = exports.parseComplete = void 0;
+exports.parseComplete = {
+    name: 'parseComplete',
+    length: 5,
+};
+exports.bindComplete = {
+    name: 'bindComplete',
+    length: 5,
+};
+exports.closeComplete = {
+    name: 'closeComplete',
+    length: 5,
+};
+exports.noData = {
+    name: 'noData',
+    length: 5,
+};
+exports.portalSuspended = {
+    name: 'portalSuspended',
+    length: 5,
+};
+exports.replicationStart = {
+    name: 'replicationStart',
+    length: 4,
+};
+exports.emptyQuery = {
+    name: 'emptyQuery',
+    length: 4,
+};
+exports.copyDone = {
+    name: 'copyDone',
+    length: 4,
+};
+class DatabaseError extends Error {
+    constructor(message, length, name) {
+        super(message);
+        this.length = length;
+        this.name = name;
+    }
+}
+exports.DatabaseError = DatabaseError;
+class CopyDataMessage {
+    constructor(length, chunk) {
+        this.length = length;
+        this.chunk = chunk;
+        this.name = 'copyData';
+    }
+}
+exports.CopyDataMessage = CopyDataMessage;
+class CopyResponse {
+    constructor(length, name, binary, columnCount) {
+        this.length = length;
+        this.name = name;
+        this.binary = binary;
+        this.columnTypes = new Array(columnCount);
+    }
+}
+exports.CopyResponse = CopyResponse;
+class Field {
+    constructor(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, format) {
+        this.name = name;
+        this.tableID = tableID;
+        this.columnID = columnID;
+        this.dataTypeID = dataTypeID;
+        this.dataTypeSize = dataTypeSize;
+        this.dataTypeModifier = dataTypeModifier;
+        this.format = format;
+    }
+}
+exports.Field = Field;
+class RowDescriptionMessage {
+    constructor(length, fieldCount) {
+        this.length = length;
+        this.fieldCount = fieldCount;
+        this.name = 'rowDescription';
+        this.fields = new Array(this.fieldCount);
+    }
+}
+exports.RowDescriptionMessage = RowDescriptionMessage;
+class ParameterDescriptionMessage {
+    constructor(length, parameterCount) {
+        this.length = length;
+        this.parameterCount = parameterCount;
+        this.name = 'parameterDescription';
+        this.dataTypeIDs = new Array(this.parameterCount);
+    }
+}
+exports.ParameterDescriptionMessage = ParameterDescriptionMessage;
+class ParameterStatusMessage {
+    constructor(length, parameterName, parameterValue) {
+        this.length = length;
+        this.parameterName = parameterName;
+        this.parameterValue = parameterValue;
+        this.name = 'parameterStatus';
+    }
+}
+exports.ParameterStatusMessage = ParameterStatusMessage;
+class AuthenticationMD5Password {
+    constructor(length, salt) {
+        this.length = length;
+        this.salt = salt;
+        this.name = 'authenticationMD5Password';
+    }
+}
+exports.AuthenticationMD5Password = AuthenticationMD5Password;
+class BackendKeyDataMessage {
+    constructor(length, processID, secretKey) {
+        this.length = length;
+        this.processID = processID;
+        this.secretKey = secretKey;
+        this.name = 'backendKeyData';
+    }
+}
+exports.BackendKeyDataMessage = BackendKeyDataMessage;
+class NotificationResponseMessage {
+    constructor(length, processId, channel, payload) {
+        this.length = length;
+        this.processId = processId;
+        this.channel = channel;
+        this.payload = payload;
+        this.name = 'notification';
+    }
+}
+exports.NotificationResponseMessage = NotificationResponseMessage;
+class ReadyForQueryMessage {
+    constructor(length, status) {
+        this.length = length;
+        this.status = status;
+        this.name = 'readyForQuery';
+    }
+}
+exports.ReadyForQueryMessage = ReadyForQueryMessage;
+class CommandCompleteMessage {
+    constructor(length, text) {
+        this.length = length;
+        this.text = text;
+        this.name = 'commandComplete';
+    }
+}
+exports.CommandCompleteMessage = CommandCompleteMessage;
+class DataRowMessage {
+    constructor(length, fields) {
+        this.length = length;
+        this.fields = fields;
+        this.name = 'dataRow';
+        this.fieldCount = fields.length;
+    }
+}
+exports.DataRowMessage = DataRowMessage;
+class NoticeMessage {
+    constructor(length, message) {
+        this.length = length;
+        this.message = message;
+        this.name = 'notice';
+    }
+}
+exports.NoticeMessage = NoticeMessage;
+//# sourceMappingURL=messages.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/messages.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+export {};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,252 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const assert_1 = __importDefault(require("assert"));
+const serializer_1 = require("./serializer");
+const buffer_list_1 = __importDefault(require("./testing/buffer-list"));
+describe('serializer', () => {
+    it('builds startup message', function () {
+        const actual = serializer_1.serialize.startup({
+            user: 'brian',
+            database: 'bang',
+        });
+        assert_1.default.deepEqual(actual, new buffer_list_1.default()
+            .addInt16(3)
+            .addInt16(0)
+            .addCString('user')
+            .addCString('brian')
+            .addCString('database')
+            .addCString('bang')
+            .addCString('client_encoding')
+            .addCString('UTF8')
+            .addCString('')
+            .join(true));
+    });
+    it('builds password message', function () {
+        const actual = serializer_1.serialize.password('!');
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('!').join(true, 'p'));
+    });
+    it('builds request ssl message', function () {
+        const actual = serializer_1.serialize.requestSsl();
+        const expected = new buffer_list_1.default().addInt32(80877103).join(true);
+        assert_1.default.deepEqual(actual, expected);
+    });
+    it('builds SASLInitialResponseMessage message', function () {
+        const actual = serializer_1.serialize.sendSASLInitialResponseMessage('mech', 'data');
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('mech').addInt32(4).addString('data').join(true, 'p'));
+    });
+    it('builds SCRAMClientFinalMessage message', function () {
+        const actual = serializer_1.serialize.sendSCRAMClientFinalMessage('data');
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addString('data').join(true, 'p'));
+    });
+    it('builds query message', function () {
+        const txt = 'select * from boom';
+        const actual = serializer_1.serialize.query(txt);
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString(txt).join(true, 'Q'));
+    });
+    describe('parse message', () => {
+        it('builds parse message', function () {
+            const actual = serializer_1.serialize.parse({ text: '!' });
+            const expected = new buffer_list_1.default().addCString('').addCString('!').addInt16(0).join(true, 'P');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('builds parse message with named query', function () {
+            const actual = serializer_1.serialize.parse({
+                name: 'boom',
+                text: 'select * from boom',
+                types: [],
+            });
+            const expected = new buffer_list_1.default().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('with multiple parameters', function () {
+            const actual = serializer_1.serialize.parse({
+                name: 'force',
+                text: 'select * from bang where name = $1',
+                types: [1, 2, 3, 4],
+            });
+            const expected = new buffer_list_1.default()
+                .addCString('force')
+                .addCString('select * from bang where name = $1')
+                .addInt16(4)
+                .addInt32(1)
+                .addInt32(2)
+                .addInt32(3)
+                .addInt32(4)
+                .join(true, 'P');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    describe('bind messages', function () {
+        it('with no values', function () {
+            const actual = serializer_1.serialize.bind();
+            const expectedBuffer = new buffer_list_1.default()
+                .addCString('')
+                .addCString('')
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(1)
+                .addInt16(0)
+                .join(true, 'B');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+        it('with named statement, portal, and values', function () {
+            const actual = serializer_1.serialize.bind({
+                portal: 'bang',
+                statement: 'woo',
+                values: ['1', 'hi', null, 'zing'],
+            });
+            const expectedBuffer = new buffer_list_1.default()
+                .addCString('bang') // portal name
+                .addCString('woo') // statement name
+                .addInt16(4)
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(4)
+                .addInt32(1)
+                .add(Buffer.from('1'))
+                .addInt32(2)
+                .add(Buffer.from('hi'))
+                .addInt32(-1)
+                .addInt32(4)
+                .add(Buffer.from('zing'))
+                .addInt16(1)
+                .addInt16(0)
+                .join(true, 'B');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+    });
+    it('with custom valueMapper', function () {
+        const actual = serializer_1.serialize.bind({
+            portal: 'bang',
+            statement: 'woo',
+            values: ['1', 'hi', null, 'zing'],
+            valueMapper: () => null,
+        });
+        const expectedBuffer = new buffer_list_1.default()
+            .addCString('bang') // portal name
+            .addCString('woo') // statement name
+            .addInt16(4)
+            .addInt16(0)
+            .addInt16(0)
+            .addInt16(0)
+            .addInt16(0)
+            .addInt16(4)
+            .addInt32(-1)
+            .addInt32(-1)
+            .addInt32(-1)
+            .addInt32(-1)
+            .addInt16(1)
+            .addInt16(0)
+            .join(true, 'B');
+        assert_1.default.deepEqual(actual, expectedBuffer);
+    });
+    it('with named statement, portal, and buffer value', function () {
+        const actual = serializer_1.serialize.bind({
+            portal: 'bang',
+            statement: 'woo',
+            values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
+        });
+        const expectedBuffer = new buffer_list_1.default()
+            .addCString('bang') // portal name
+            .addCString('woo') // statement name
+            .addInt16(4) // value count
+            .addInt16(0) // string
+            .addInt16(0) // string
+            .addInt16(0) // string
+            .addInt16(1) // binary
+            .addInt16(4)
+            .addInt32(1)
+            .add(Buffer.from('1'))
+            .addInt32(2)
+            .add(Buffer.from('hi'))
+            .addInt32(-1)
+            .addInt32(4)
+            .add(Buffer.from('zing', 'utf-8'))
+            .addInt16(1)
+            .addInt16(0)
+            .join(true, 'B');
+        assert_1.default.deepEqual(actual, expectedBuffer);
+    });
+    describe('builds execute message', function () {
+        it('for unamed portal with no row limit', function () {
+            const actual = serializer_1.serialize.execute();
+            const expectedBuffer = new buffer_list_1.default().addCString('').addInt32(0).join(true, 'E');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+        it('for named portal with row limit', function () {
+            const actual = serializer_1.serialize.execute({
+                portal: 'my favorite portal',
+                rows: 100,
+            });
+            const expectedBuffer = new buffer_list_1.default().addCString('my favorite portal').addInt32(100).join(true, 'E');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+    });
+    it('builds flush command', function () {
+        const actual = serializer_1.serialize.flush();
+        const expected = new buffer_list_1.default().join(true, 'H');
+        assert_1.default.deepEqual(actual, expected);
+    });
+    it('builds sync command', function () {
+        const actual = serializer_1.serialize.sync();
+        const expected = new buffer_list_1.default().join(true, 'S');
+        assert_1.default.deepEqual(actual, expected);
+    });
+    it('builds end command', function () {
+        const actual = serializer_1.serialize.end();
+        const expected = Buffer.from([0x58, 0, 0, 0, 4]);
+        assert_1.default.deepEqual(actual, expected);
+    });
+    describe('builds describe command', function () {
+        it('describe statement', function () {
+            const actual = serializer_1.serialize.describe({ type: 'S', name: 'bang' });
+            const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'D');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('describe unnamed portal', function () {
+            const actual = serializer_1.serialize.describe({ type: 'P' });
+            const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'D');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    describe('builds close command', function () {
+        it('describe statement', function () {
+            const actual = serializer_1.serialize.close({ type: 'S', name: 'bang' });
+            const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'C');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('describe unnamed portal', function () {
+            const actual = serializer_1.serialize.close({ type: 'P' });
+            const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'C');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    describe('copy messages', function () {
+        it('builds copyFromChunk', () => {
+            const actual = serializer_1.serialize.copyData(Buffer.from([1, 2, 3]));
+            const expected = new buffer_list_1.default().add(Buffer.from([1, 2, 3])).join(true, 'd');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('builds copy fail', () => {
+            const actual = serializer_1.serialize.copyFail('err!');
+            const expected = new buffer_list_1.default().addCString('err!').join(true, 'f');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('builds copy done', () => {
+            const actual = serializer_1.serialize.copyDone();
+            const expected = new buffer_list_1.default().join(true, 'c');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    it('builds cancel message', () => {
+        const actual = serializer_1.serialize.cancel(3, 4);
+        const expected = new buffer_list_1.default().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true);
+        assert_1.default.deepEqual(actual, expected);
+    });
+});
+//# sourceMappingURL=outbound-serializer.test.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/outbound-serializer.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"outbound-serializer.test.js","sourceRoot":"","sources":["../src/outbound-serializer.test.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,39 @@
+/// <reference types="node" />
+/// <reference types="node" />
+import { TransformOptions } from 'stream';
+import { Mode, BackendMessage } from './messages';
+export declare type Packet = {
+    code: number;
+    packet: Buffer;
+};
+declare type StreamOptions = TransformOptions & {
+    mode: Mode;
+};
+export declare type MessageCallback = (msg: BackendMessage) => void;
+export declare class Parser {
+    private buffer;
+    private bufferLength;
+    private bufferOffset;
+    private reader;
+    private mode;
+    constructor(opts?: StreamOptions);
+    parse(buffer: Buffer, callback: MessageCallback): void;
+    private mergeBuffer;
+    private handlePacket;
+    private parseReadyForQueryMessage;
+    private parseCommandCompleteMessage;
+    private parseCopyData;
+    private parseCopyInMessage;
+    private parseCopyOutMessage;
+    private parseCopyMessage;
+    private parseNotificationMessage;
+    private parseRowDescriptionMessage;
+    private parseField;
+    private parseParameterDescriptionMessage;
+    private parseDataRowMessage;
+    private parseParameterStatusMessage;
+    private parseBackendKeyData;
+    parseAuthenticationResponse(offset: number, length: number, bytes: Buffer): any;
+    private parseErrorMessage;
+}
+export {};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,306 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Parser = void 0;
+const messages_1 = require("./messages");
+const buffer_reader_1 = require("./buffer-reader");
+// every message is prefixed with a single bye
+const CODE_LENGTH = 1;
+// every message has an int32 length which includes itself but does
+// NOT include the code in the length
+const LEN_LENGTH = 4;
+const HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH;
+const emptyBuffer = Buffer.allocUnsafe(0);
+class Parser {
+    constructor(opts) {
+        this.buffer = emptyBuffer;
+        this.bufferLength = 0;
+        this.bufferOffset = 0;
+        this.reader = new buffer_reader_1.BufferReader();
+        if ((opts === null || opts === void 0 ? void 0 : opts.mode) === 'binary') {
+            throw new Error('Binary mode not supported yet');
+        }
+        this.mode = (opts === null || opts === void 0 ? void 0 : opts.mode) || 'text';
+    }
+    parse(buffer, callback) {
+        this.mergeBuffer(buffer);
+        const bufferFullLength = this.bufferOffset + this.bufferLength;
+        let offset = this.bufferOffset;
+        while (offset + HEADER_LENGTH <= bufferFullLength) {
+            // code is 1 byte long - it identifies the message type
+            const code = this.buffer[offset];
+            // length is 1 Uint32BE - it is the length of the message EXCLUDING the code
+            const length = this.buffer.readUInt32BE(offset + CODE_LENGTH);
+            const fullMessageLength = CODE_LENGTH + length;
+            if (fullMessageLength + offset <= bufferFullLength) {
+                const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer);
+                callback(message);
+                offset += fullMessageLength;
+            }
+            else {
+                break;
+            }
+        }
+        if (offset === bufferFullLength) {
+            // No more use for the buffer
+            this.buffer = emptyBuffer;
+            this.bufferLength = 0;
+            this.bufferOffset = 0;
+        }
+        else {
+            // Adjust the cursors of remainingBuffer
+            this.bufferLength = bufferFullLength - offset;
+            this.bufferOffset = offset;
+        }
+    }
+    mergeBuffer(buffer) {
+        if (this.bufferLength > 0) {
+            const newLength = this.bufferLength + buffer.byteLength;
+            const newFullLength = newLength + this.bufferOffset;
+            if (newFullLength > this.buffer.byteLength) {
+                // We can't concat the new buffer with the remaining one
+                let newBuffer;
+                if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {
+                    // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer
+                    newBuffer = this.buffer;
+                }
+                else {
+                    // Allocate a new larger buffer
+                    let newBufferLength = this.buffer.byteLength * 2;
+                    while (newLength >= newBufferLength) {
+                        newBufferLength *= 2;
+                    }
+                    newBuffer = Buffer.allocUnsafe(newBufferLength);
+                }
+                // Move the remaining buffer to the new one
+                this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength);
+                this.buffer = newBuffer;
+                this.bufferOffset = 0;
+            }
+            // Concat the new buffer with the remaining one
+            buffer.copy(this.buffer, this.bufferOffset + this.bufferLength);
+            this.bufferLength = newLength;
+        }
+        else {
+            this.buffer = buffer;
+            this.bufferOffset = 0;
+            this.bufferLength = buffer.byteLength;
+        }
+    }
+    handlePacket(offset, code, length, bytes) {
+        switch (code) {
+            case 50 /* MessageCodes.BindComplete */:
+                return messages_1.bindComplete;
+            case 49 /* MessageCodes.ParseComplete */:
+                return messages_1.parseComplete;
+            case 51 /* MessageCodes.CloseComplete */:
+                return messages_1.closeComplete;
+            case 110 /* MessageCodes.NoData */:
+                return messages_1.noData;
+            case 115 /* MessageCodes.PortalSuspended */:
+                return messages_1.portalSuspended;
+            case 99 /* MessageCodes.CopyDone */:
+                return messages_1.copyDone;
+            case 87 /* MessageCodes.ReplicationStart */:
+                return messages_1.replicationStart;
+            case 73 /* MessageCodes.EmptyQuery */:
+                return messages_1.emptyQuery;
+            case 68 /* MessageCodes.DataRow */:
+                return this.parseDataRowMessage(offset, length, bytes);
+            case 67 /* MessageCodes.CommandComplete */:
+                return this.parseCommandCompleteMessage(offset, length, bytes);
+            case 90 /* MessageCodes.ReadyForQuery */:
+                return this.parseReadyForQueryMessage(offset, length, bytes);
+            case 65 /* MessageCodes.NotificationResponse */:
+                return this.parseNotificationMessage(offset, length, bytes);
+            case 82 /* MessageCodes.AuthenticationResponse */:
+                return this.parseAuthenticationResponse(offset, length, bytes);
+            case 83 /* MessageCodes.ParameterStatus */:
+                return this.parseParameterStatusMessage(offset, length, bytes);
+            case 75 /* MessageCodes.BackendKeyData */:
+                return this.parseBackendKeyData(offset, length, bytes);
+            case 69 /* MessageCodes.ErrorMessage */:
+                return this.parseErrorMessage(offset, length, bytes, 'error');
+            case 78 /* MessageCodes.NoticeMessage */:
+                return this.parseErrorMessage(offset, length, bytes, 'notice');
+            case 84 /* MessageCodes.RowDescriptionMessage */:
+                return this.parseRowDescriptionMessage(offset, length, bytes);
+            case 116 /* MessageCodes.ParameterDescriptionMessage */:
+                return this.parseParameterDescriptionMessage(offset, length, bytes);
+            case 71 /* MessageCodes.CopyIn */:
+                return this.parseCopyInMessage(offset, length, bytes);
+            case 72 /* MessageCodes.CopyOut */:
+                return this.parseCopyOutMessage(offset, length, bytes);
+            case 100 /* MessageCodes.CopyData */:
+                return this.parseCopyData(offset, length, bytes);
+            default:
+                return new messages_1.DatabaseError('received invalid response: ' + code.toString(16), length, 'error');
+        }
+    }
+    parseReadyForQueryMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const status = this.reader.string(1);
+        return new messages_1.ReadyForQueryMessage(length, status);
+    }
+    parseCommandCompleteMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const text = this.reader.cstring();
+        return new messages_1.CommandCompleteMessage(length, text);
+    }
+    parseCopyData(offset, length, bytes) {
+        const chunk = bytes.slice(offset, offset + (length - 4));
+        return new messages_1.CopyDataMessage(length, chunk);
+    }
+    parseCopyInMessage(offset, length, bytes) {
+        return this.parseCopyMessage(offset, length, bytes, 'copyInResponse');
+    }
+    parseCopyOutMessage(offset, length, bytes) {
+        return this.parseCopyMessage(offset, length, bytes, 'copyOutResponse');
+    }
+    parseCopyMessage(offset, length, bytes, messageName) {
+        this.reader.setBuffer(offset, bytes);
+        const isBinary = this.reader.byte() !== 0;
+        const columnCount = this.reader.int16();
+        const message = new messages_1.CopyResponse(length, messageName, isBinary, columnCount);
+        for (let i = 0; i < columnCount; i++) {
+            message.columnTypes[i] = this.reader.int16();
+        }
+        return message;
+    }
+    parseNotificationMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const processId = this.reader.int32();
+        const channel = this.reader.cstring();
+        const payload = this.reader.cstring();
+        return new messages_1.NotificationResponseMessage(length, processId, channel, payload);
+    }
+    parseRowDescriptionMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const fieldCount = this.reader.int16();
+        const message = new messages_1.RowDescriptionMessage(length, fieldCount);
+        for (let i = 0; i < fieldCount; i++) {
+            message.fields[i] = this.parseField();
+        }
+        return message;
+    }
+    parseField() {
+        const name = this.reader.cstring();
+        const tableID = this.reader.uint32();
+        const columnID = this.reader.int16();
+        const dataTypeID = this.reader.uint32();
+        const dataTypeSize = this.reader.int16();
+        const dataTypeModifier = this.reader.int32();
+        const mode = this.reader.int16() === 0 ? 'text' : 'binary';
+        return new messages_1.Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode);
+    }
+    parseParameterDescriptionMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const parameterCount = this.reader.int16();
+        const message = new messages_1.ParameterDescriptionMessage(length, parameterCount);
+        for (let i = 0; i < parameterCount; i++) {
+            message.dataTypeIDs[i] = this.reader.int32();
+        }
+        return message;
+    }
+    parseDataRowMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const fieldCount = this.reader.int16();
+        const fields = new Array(fieldCount);
+        for (let i = 0; i < fieldCount; i++) {
+            const len = this.reader.int32();
+            // a -1 for length means the value of the field is null
+            fields[i] = len === -1 ? null : this.reader.string(len);
+        }
+        return new messages_1.DataRowMessage(length, fields);
+    }
+    parseParameterStatusMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const name = this.reader.cstring();
+        const value = this.reader.cstring();
+        return new messages_1.ParameterStatusMessage(length, name, value);
+    }
+    parseBackendKeyData(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const processID = this.reader.int32();
+        const secretKey = this.reader.int32();
+        return new messages_1.BackendKeyDataMessage(length, processID, secretKey);
+    }
+    parseAuthenticationResponse(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const code = this.reader.int32();
+        // TODO(bmc): maybe better types here
+        const message = {
+            name: 'authenticationOk',
+            length,
+        };
+        switch (code) {
+            case 0: // AuthenticationOk
+                break;
+            case 3: // AuthenticationCleartextPassword
+                if (message.length === 8) {
+                    message.name = 'authenticationCleartextPassword';
+                }
+                break;
+            case 5: // AuthenticationMD5Password
+                if (message.length === 12) {
+                    message.name = 'authenticationMD5Password';
+                    const salt = this.reader.bytes(4);
+                    return new messages_1.AuthenticationMD5Password(length, salt);
+                }
+                break;
+            case 10: // AuthenticationSASL
+                {
+                    message.name = 'authenticationSASL';
+                    message.mechanisms = [];
+                    let mechanism;
+                    do {
+                        mechanism = this.reader.cstring();
+                        if (mechanism) {
+                            message.mechanisms.push(mechanism);
+                        }
+                    } while (mechanism);
+                }
+                break;
+            case 11: // AuthenticationSASLContinue
+                message.name = 'authenticationSASLContinue';
+                message.data = this.reader.string(length - 8);
+                break;
+            case 12: // AuthenticationSASLFinal
+                message.name = 'authenticationSASLFinal';
+                message.data = this.reader.string(length - 8);
+                break;
+            default:
+                throw new Error('Unknown authenticationOk message type ' + code);
+        }
+        return message;
+    }
+    parseErrorMessage(offset, length, bytes, name) {
+        this.reader.setBuffer(offset, bytes);
+        const fields = {};
+        let fieldType = this.reader.string(1);
+        while (fieldType !== '\0') {
+            fields[fieldType] = this.reader.cstring();
+            fieldType = this.reader.string(1);
+        }
+        const messageValue = fields.M;
+        const message = name === 'notice' ? new messages_1.NoticeMessage(length, messageValue) : new messages_1.DatabaseError(messageValue, length, name);
+        message.severity = fields.S;
+        message.code = fields.C;
+        message.detail = fields.D;
+        message.hint = fields.H;
+        message.position = fields.P;
+        message.internalPosition = fields.p;
+        message.internalQuery = fields.q;
+        message.where = fields.W;
+        message.schema = fields.s;
+        message.table = fields.t;
+        message.column = fields.c;
+        message.dataType = fields.d;
+        message.constraint = fields.n;
+        message.file = fields.F;
+        message.line = fields.L;
+        message.routine = fields.R;
+        return message;
+    }
+}
+exports.Parser = Parser;
+//# sourceMappingURL=parser.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/parser.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,42 @@
+declare type ParseOpts = {
+    name?: string;
+    types?: number[];
+    text: string;
+};
+declare type ValueMapper = (param: any, index: number) => any;
+declare type BindOpts = {
+    portal?: string;
+    binary?: boolean;
+    statement?: string;
+    values?: any[];
+    valueMapper?: ValueMapper;
+};
+declare type ExecOpts = {
+    portal?: string;
+    rows?: number;
+};
+declare type PortalOpts = {
+    type: 'S' | 'P';
+    name?: string;
+};
+declare const serialize: {
+    startup: (opts: Record<string, string>) => Buffer;
+    password: (password: string) => Buffer;
+    requestSsl: () => Buffer;
+    sendSASLInitialResponseMessage: (mechanism: string, initialResponse: string) => Buffer;
+    sendSCRAMClientFinalMessage: (additionalData: string) => Buffer;
+    query: (text: string) => Buffer;
+    parse: (query: ParseOpts) => Buffer;
+    bind: (config?: BindOpts) => Buffer;
+    execute: (config?: ExecOpts) => Buffer;
+    describe: (msg: PortalOpts) => Buffer;
+    close: (msg: PortalOpts) => Buffer;
+    flush: () => Buffer;
+    sync: () => Buffer;
+    end: () => Buffer;
+    copyData: (chunk: Buffer) => Buffer;
+    copyDone: () => Buffer;
+    copyFail: (message: string) => Buffer;
+    cancel: (processID: number, secretKey: number) => Buffer;
+};
+export { serialize };
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,189 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.serialize = void 0;
+const buffer_writer_1 = require("./buffer-writer");
+const writer = new buffer_writer_1.Writer();
+const startup = (opts) => {
+    // protocol version
+    writer.addInt16(3).addInt16(0);
+    for (const key of Object.keys(opts)) {
+        writer.addCString(key).addCString(opts[key]);
+    }
+    writer.addCString('client_encoding').addCString('UTF8');
+    const bodyBuffer = writer.addCString('').flush();
+    // this message is sent without a code
+    const length = bodyBuffer.length + 4;
+    return new buffer_writer_1.Writer().addInt32(length).add(bodyBuffer).flush();
+};
+const requestSsl = () => {
+    const response = Buffer.allocUnsafe(8);
+    response.writeInt32BE(8, 0);
+    response.writeInt32BE(80877103, 4);
+    return response;
+};
+const password = (password) => {
+    return writer.addCString(password).flush(112 /* code.startup */);
+};
+const sendSASLInitialResponseMessage = function (mechanism, initialResponse) {
+    // 0x70 = 'p'
+    writer.addCString(mechanism).addInt32(Buffer.byteLength(initialResponse)).addString(initialResponse);
+    return writer.flush(112 /* code.startup */);
+};
+const sendSCRAMClientFinalMessage = function (additionalData) {
+    return writer.addString(additionalData).flush(112 /* code.startup */);
+};
+const query = (text) => {
+    return writer.addCString(text).flush(81 /* code.query */);
+};
+const emptyArray = [];
+const parse = (query) => {
+    // expect something like this:
+    // { name: 'queryName',
+    //   text: 'select * from blah',
+    //   types: ['int8', 'bool'] }
+    // normalize missing query names to allow for null
+    const name = query.name || '';
+    if (name.length > 63) {
+        console.error('Warning! Postgres only supports 63 characters for query names.');
+        console.error('You supplied %s (%s)', name, name.length);
+        console.error('This can cause conflicts and silent errors executing queries');
+    }
+    const types = query.types || emptyArray;
+    const len = types.length;
+    const buffer = writer
+        .addCString(name) // name of query
+        .addCString(query.text) // actual query text
+        .addInt16(len);
+    for (let i = 0; i < len; i++) {
+        buffer.addInt32(types[i]);
+    }
+    return writer.flush(80 /* code.parse */);
+};
+const paramWriter = new buffer_writer_1.Writer();
+const writeValues = function (values, valueMapper) {
+    for (let i = 0; i < values.length; i++) {
+        const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i];
+        if (mappedVal == null) {
+            // add the param type (string) to the writer
+            writer.addInt16(0 /* ParamType.STRING */);
+            // write -1 to the param writer to indicate null
+            paramWriter.addInt32(-1);
+        }
+        else if (mappedVal instanceof Buffer) {
+            // add the param type (binary) to the writer
+            writer.addInt16(1 /* ParamType.BINARY */);
+            // add the buffer to the param writer
+            paramWriter.addInt32(mappedVal.length);
+            paramWriter.add(mappedVal);
+        }
+        else {
+            // add the param type (string) to the writer
+            writer.addInt16(0 /* ParamType.STRING */);
+            paramWriter.addInt32(Buffer.byteLength(mappedVal));
+            paramWriter.addString(mappedVal);
+        }
+    }
+};
+const bind = (config = {}) => {
+    // normalize config
+    const portal = config.portal || '';
+    const statement = config.statement || '';
+    const binary = config.binary || false;
+    const values = config.values || emptyArray;
+    const len = values.length;
+    writer.addCString(portal).addCString(statement);
+    writer.addInt16(len);
+    writeValues(values, config.valueMapper);
+    writer.addInt16(len);
+    writer.add(paramWriter.flush());
+    // all results use the same format code
+    writer.addInt16(1);
+    // format code
+    writer.addInt16(binary ? 1 /* ParamType.BINARY */ : 0 /* ParamType.STRING */);
+    return writer.flush(66 /* code.bind */);
+};
+const emptyExecute = Buffer.from([69 /* code.execute */, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]);
+const execute = (config) => {
+    // this is the happy path for most queries
+    if (!config || (!config.portal && !config.rows)) {
+        return emptyExecute;
+    }
+    const portal = config.portal || '';
+    const rows = config.rows || 0;
+    const portalLength = Buffer.byteLength(portal);
+    const len = 4 + portalLength + 1 + 4;
+    // one extra bit for code
+    const buff = Buffer.allocUnsafe(1 + len);
+    buff[0] = 69 /* code.execute */;
+    buff.writeInt32BE(len, 1);
+    buff.write(portal, 5, 'utf-8');
+    buff[portalLength + 5] = 0; // null terminate portal cString
+    buff.writeUInt32BE(rows, buff.length - 4);
+    return buff;
+};
+const cancel = (processID, secretKey) => {
+    const buffer = Buffer.allocUnsafe(16);
+    buffer.writeInt32BE(16, 0);
+    buffer.writeInt16BE(1234, 4);
+    buffer.writeInt16BE(5678, 6);
+    buffer.writeInt32BE(processID, 8);
+    buffer.writeInt32BE(secretKey, 12);
+    return buffer;
+};
+const cstringMessage = (code, string) => {
+    const stringLen = Buffer.byteLength(string);
+    const len = 4 + stringLen + 1;
+    // one extra bit for code
+    const buffer = Buffer.allocUnsafe(1 + len);
+    buffer[0] = code;
+    buffer.writeInt32BE(len, 1);
+    buffer.write(string, 5, 'utf-8');
+    buffer[len] = 0; // null terminate cString
+    return buffer;
+};
+const emptyDescribePortal = writer.addCString('P').flush(68 /* code.describe */);
+const emptyDescribeStatement = writer.addCString('S').flush(68 /* code.describe */);
+const describe = (msg) => {
+    return msg.name
+        ? cstringMessage(68 /* code.describe */, `${msg.type}${msg.name || ''}`)
+        : msg.type === 'P'
+            ? emptyDescribePortal
+            : emptyDescribeStatement;
+};
+const close = (msg) => {
+    const text = `${msg.type}${msg.name || ''}`;
+    return cstringMessage(67 /* code.close */, text);
+};
+const copyData = (chunk) => {
+    return writer.add(chunk).flush(100 /* code.copyFromChunk */);
+};
+const copyFail = (message) => {
+    return cstringMessage(102 /* code.copyFail */, message);
+};
+const codeOnlyBuffer = (code) => Buffer.from([code, 0x00, 0x00, 0x00, 0x04]);
+const flushBuffer = codeOnlyBuffer(72 /* code.flush */);
+const syncBuffer = codeOnlyBuffer(83 /* code.sync */);
+const endBuffer = codeOnlyBuffer(88 /* code.end */);
+const copyDoneBuffer = codeOnlyBuffer(99 /* code.copyDone */);
+const serialize = {
+    startup,
+    password,
+    requestSsl,
+    sendSASLInitialResponseMessage,
+    sendSCRAMClientFinalMessage,
+    query,
+    parse,
+    bind,
+    execute,
+    describe,
+    close,
+    flush: () => flushBuffer,
+    sync: () => syncBuffer,
+    end: () => endBuffer,
+    copyData,
+    copyDone: () => copyDoneBuffer,
+    copyFail,
+    cancel,
+};
+exports.serialize = serialize;
+//# sourceMappingURL=serializer.js.map
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.js.map
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/dist/serializer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/esm/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/esm/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/esm/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,11 @@
+// ESM wrapper for pg-protocol
+import * as protocol from '../dist/index.js'
+
+// Re-export all the properties
+export const DatabaseError = protocol.DatabaseError
+export const SASL = protocol.SASL
+export const serialize = protocol.serialize
+export const parse = protocol.parse
+
+// Re-export the default
+export default protocol
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,45 @@
+{
+  "name": "pg-protocol",
+  "version": "1.10.3",
+  "description": "The postgres client/server binary protocol, implemented in TypeScript",
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
+  "exports": {
+    ".": {
+      "import": "./esm/index.js",
+      "require": "./dist/index.js",
+      "default": "./dist/index.js"
+    },
+    "./dist/*": "./dist/*.js",
+    "./dist/*.js": "./dist/*.js"
+  },
+  "license": "MIT",
+  "devDependencies": {
+    "@types/chai": "^4.2.7",
+    "@types/mocha": "^10.0.7",
+    "@types/node": "^12.12.21",
+    "chai": "^4.2.0",
+    "chunky": "^0.0.0",
+    "mocha": "^10.5.2",
+    "ts-node": "^8.5.4",
+    "typescript": "^4.0.3"
+  },
+  "scripts": {
+    "test": "mocha dist/**/*.test.js",
+    "build": "tsc",
+    "build:watch": "tsc --watch",
+    "prepublish": "yarn build",
+    "pretest": "yarn build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-protocol"
+  },
+  "files": [
+    "/dist/*{js,ts,map}",
+    "/src",
+    "/esm"
+  ],
+  "gitHead": "8f8e7315e8f7c1bb01e98fdb41c8c92585510782"
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/b.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/b.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/b.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,25 @@
+// file for microbenchmarking
+
+import { BufferReader } from './buffer-reader'
+
+const LOOPS = 1000
+let count = 0
+const start = performance.now()
+
+const reader = new BufferReader()
+const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0])
+
+const run = () => {
+  if (count > LOOPS) {
+    console.log(performance.now() - start)
+    return
+  }
+  count++
+  for (let i = 0; i < LOOPS; i++) {
+    reader.setBuffer(0, buffer)
+    reader.cstring()
+  }
+  setImmediate(run)
+}
+
+run()
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/buffer-reader.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/buffer-reader.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/buffer-reader.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,60 @@
+const emptyBuffer = Buffer.allocUnsafe(0)
+
+export class BufferReader {
+  private buffer: Buffer = emptyBuffer
+
+  // TODO(bmc): support non-utf8 encoding?
+  private encoding: string = 'utf-8'
+
+  constructor(private offset: number = 0) {}
+
+  public setBuffer(offset: number, buffer: Buffer): void {
+    this.offset = offset
+    this.buffer = buffer
+  }
+
+  public int16(): number {
+    const result = this.buffer.readInt16BE(this.offset)
+    this.offset += 2
+    return result
+  }
+
+  public byte(): number {
+    const result = this.buffer[this.offset]
+    this.offset++
+    return result
+  }
+
+  public int32(): number {
+    const result = this.buffer.readInt32BE(this.offset)
+    this.offset += 4
+    return result
+  }
+
+  public uint32(): number {
+    const result = this.buffer.readUInt32BE(this.offset)
+    this.offset += 4
+    return result
+  }
+
+  public string(length: number): string {
+    const result = this.buffer.toString(this.encoding, this.offset, this.offset + length)
+    this.offset += length
+    return result
+  }
+
+  public cstring(): string {
+    const start = this.offset
+    let end = start
+    // eslint-disable-next-line no-empty
+    while (this.buffer[end++] !== 0) {}
+    this.offset = end
+    return this.buffer.toString(this.encoding, start, end - 1)
+  }
+
+  public bytes(length: number): Buffer {
+    const result = this.buffer.slice(this.offset, this.offset + length)
+    this.offset += length
+    return result
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/buffer-writer.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/buffer-writer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/buffer-writer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,85 @@
+//binary data writer tuned for encoding binary specific to the postgres binary protocol
+
+export class Writer {
+  private buffer: Buffer
+  private offset: number = 5
+  private headerPosition: number = 0
+  constructor(private size = 256) {
+    this.buffer = Buffer.allocUnsafe(size)
+  }
+
+  private ensure(size: number): void {
+    const remaining = this.buffer.length - this.offset
+    if (remaining < size) {
+      const oldBuffer = this.buffer
+      // exponential growth factor of around ~ 1.5
+      // https://stackoverflow.com/questions/2269063/buffer-growth-strategy
+      const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size
+      this.buffer = Buffer.allocUnsafe(newSize)
+      oldBuffer.copy(this.buffer)
+    }
+  }
+
+  public addInt32(num: number): Writer {
+    this.ensure(4)
+    this.buffer[this.offset++] = (num >>> 24) & 0xff
+    this.buffer[this.offset++] = (num >>> 16) & 0xff
+    this.buffer[this.offset++] = (num >>> 8) & 0xff
+    this.buffer[this.offset++] = (num >>> 0) & 0xff
+    return this
+  }
+
+  public addInt16(num: number): Writer {
+    this.ensure(2)
+    this.buffer[this.offset++] = (num >>> 8) & 0xff
+    this.buffer[this.offset++] = (num >>> 0) & 0xff
+    return this
+  }
+
+  public addCString(string: string): Writer {
+    if (!string) {
+      this.ensure(1)
+    } else {
+      const len = Buffer.byteLength(string)
+      this.ensure(len + 1) // +1 for null terminator
+      this.buffer.write(string, this.offset, 'utf-8')
+      this.offset += len
+    }
+
+    this.buffer[this.offset++] = 0 // null terminator
+    return this
+  }
+
+  public addString(string: string = ''): Writer {
+    const len = Buffer.byteLength(string)
+    this.ensure(len)
+    this.buffer.write(string, this.offset)
+    this.offset += len
+    return this
+  }
+
+  public add(otherBuffer: Buffer): Writer {
+    this.ensure(otherBuffer.length)
+    otherBuffer.copy(this.buffer, this.offset)
+    this.offset += otherBuffer.length
+    return this
+  }
+
+  private join(code?: number): Buffer {
+    if (code) {
+      this.buffer[this.headerPosition] = code
+      //length is everything in this packet minus the code
+      const length = this.offset - (this.headerPosition + 1)
+      this.buffer.writeInt32BE(length, this.headerPosition + 1)
+    }
+    return this.buffer.slice(code ? 0 : 5, this.offset)
+  }
+
+  public flush(code?: number): Buffer {
+    const result = this.join(code)
+    this.offset = 5
+    this.headerPosition = 0
+    this.buffer = Buffer.allocUnsafe(this.size)
+    return result
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/inbound-parser.test.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/inbound-parser.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/inbound-parser.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,568 @@
+import buffers from './testing/test-buffers'
+import BufferList from './testing/buffer-list'
+import { parse } from '.'
+import assert from 'assert'
+import { PassThrough } from 'stream'
+import { BackendMessage } from './messages'
+
+const authOkBuffer = buffers.authenticationOk()
+const paramStatusBuffer = buffers.parameterStatus('client_encoding', 'UTF8')
+const readyForQueryBuffer = buffers.readyForQuery()
+const backendKeyDataBuffer = buffers.backendKeyData(1, 2)
+const commandCompleteBuffer = buffers.commandComplete('SELECT 3')
+const parseCompleteBuffer = buffers.parseComplete()
+const bindCompleteBuffer = buffers.bindComplete()
+const portalSuspendedBuffer = buffers.portalSuspended()
+
+const row1 = {
+  name: 'id',
+  tableID: 1,
+  attributeNumber: 2,
+  dataTypeID: 3,
+  dataTypeSize: 4,
+  typeModifier: 5,
+  formatCode: 0,
+}
+const oneRowDescBuff = buffers.rowDescription([row1])
+row1.name = 'bang'
+
+const twoRowBuf = buffers.rowDescription([
+  row1,
+  {
+    name: 'whoah',
+    tableID: 10,
+    attributeNumber: 11,
+    dataTypeID: 12,
+    dataTypeSize: 13,
+    typeModifier: 14,
+    formatCode: 0,
+  },
+])
+
+const rowWithBigOids = {
+  name: 'bigoid',
+  tableID: 3000000001,
+  attributeNumber: 2,
+  dataTypeID: 3000000003,
+  dataTypeSize: 4,
+  typeModifier: 5,
+  formatCode: 0,
+}
+const bigOidDescBuff = buffers.rowDescription([rowWithBigOids])
+
+const emptyRowFieldBuf = buffers.dataRow([])
+
+const oneFieldBuf = buffers.dataRow(['test'])
+
+const expectedAuthenticationOkayMessage = {
+  name: 'authenticationOk',
+  length: 8,
+}
+
+const expectedParameterStatusMessage = {
+  name: 'parameterStatus',
+  parameterName: 'client_encoding',
+  parameterValue: 'UTF8',
+  length: 25,
+}
+
+const expectedBackendKeyDataMessage = {
+  name: 'backendKeyData',
+  processID: 1,
+  secretKey: 2,
+}
+
+const expectedReadyForQueryMessage = {
+  name: 'readyForQuery',
+  length: 5,
+  status: 'I',
+}
+
+const expectedCommandCompleteMessage = {
+  name: 'commandComplete',
+  length: 13,
+  text: 'SELECT 3',
+}
+const emptyRowDescriptionBuffer = new BufferList()
+  .addInt16(0) // number of fields
+  .join(true, 'T')
+
+const expectedEmptyRowDescriptionMessage = {
+  name: 'rowDescription',
+  length: 6,
+  fieldCount: 0,
+  fields: [],
+}
+const expectedOneRowMessage = {
+  name: 'rowDescription',
+  length: 27,
+  fieldCount: 1,
+  fields: [
+    {
+      name: 'id',
+      tableID: 1,
+      columnID: 2,
+      dataTypeID: 3,
+      dataTypeSize: 4,
+      dataTypeModifier: 5,
+      format: 'text',
+    },
+  ],
+}
+
+const expectedTwoRowMessage = {
+  name: 'rowDescription',
+  length: 53,
+  fieldCount: 2,
+  fields: [
+    {
+      name: 'bang',
+      tableID: 1,
+      columnID: 2,
+      dataTypeID: 3,
+      dataTypeSize: 4,
+      dataTypeModifier: 5,
+      format: 'text',
+    },
+    {
+      name: 'whoah',
+      tableID: 10,
+      columnID: 11,
+      dataTypeID: 12,
+      dataTypeSize: 13,
+      dataTypeModifier: 14,
+      format: 'text',
+    },
+  ],
+}
+const expectedBigOidMessage = {
+  name: 'rowDescription',
+  length: 31,
+  fieldCount: 1,
+  fields: [
+    {
+      name: 'bigoid',
+      tableID: 3000000001,
+      columnID: 2,
+      dataTypeID: 3000000003,
+      dataTypeSize: 4,
+      dataTypeModifier: 5,
+      format: 'text',
+    },
+  ],
+}
+
+const emptyParameterDescriptionBuffer = new BufferList()
+  .addInt16(0) // number of parameters
+  .join(true, 't')
+
+const oneParameterDescBuf = buffers.parameterDescription([1111])
+
+const twoParameterDescBuf = buffers.parameterDescription([2222, 3333])
+
+const expectedEmptyParameterDescriptionMessage = {
+  name: 'parameterDescription',
+  length: 6,
+  parameterCount: 0,
+  dataTypeIDs: [],
+}
+
+const expectedOneParameterMessage = {
+  name: 'parameterDescription',
+  length: 10,
+  parameterCount: 1,
+  dataTypeIDs: [1111],
+}
+
+const expectedTwoParameterMessage = {
+  name: 'parameterDescription',
+  length: 14,
+  parameterCount: 2,
+  dataTypeIDs: [2222, 3333],
+}
+
+const testForMessage = function (buffer: Buffer, expectedMessage: any) {
+  it('receives and parses ' + expectedMessage.name, async () => {
+    const messages = await parseBuffers([buffer])
+    const [lastMessage] = messages
+
+    for (const key in expectedMessage) {
+      assert.deepEqual((lastMessage as any)[key], expectedMessage[key])
+    }
+  })
+}
+
+const plainPasswordBuffer = buffers.authenticationCleartextPassword()
+const md5PasswordBuffer = buffers.authenticationMD5Password()
+const SASLBuffer = buffers.authenticationSASL()
+const SASLContinueBuffer = buffers.authenticationSASLContinue()
+const SASLFinalBuffer = buffers.authenticationSASLFinal()
+
+const expectedPlainPasswordMessage = {
+  name: 'authenticationCleartextPassword',
+}
+
+const expectedMD5PasswordMessage = {
+  name: 'authenticationMD5Password',
+  salt: Buffer.from([1, 2, 3, 4]),
+}
+
+const expectedSASLMessage = {
+  name: 'authenticationSASL',
+  mechanisms: ['SCRAM-SHA-256'],
+}
+
+const expectedSASLContinueMessage = {
+  name: 'authenticationSASLContinue',
+  data: 'data',
+}
+
+const expectedSASLFinalMessage = {
+  name: 'authenticationSASLFinal',
+  data: 'data',
+}
+
+const notificationResponseBuffer = buffers.notification(4, 'hi', 'boom')
+const expectedNotificationResponseMessage = {
+  name: 'notification',
+  processId: 4,
+  channel: 'hi',
+  payload: 'boom',
+}
+
+const parseBuffers = async (buffers: Buffer[]): Promise<BackendMessage[]> => {
+  const stream = new PassThrough()
+  for (const buffer of buffers) {
+    stream.write(buffer)
+  }
+  stream.end()
+  const msgs: BackendMessage[] = []
+  await parse(stream, (msg) => msgs.push(msg))
+  return msgs
+}
+
+describe('PgPacketStream', function () {
+  testForMessage(authOkBuffer, expectedAuthenticationOkayMessage)
+  testForMessage(plainPasswordBuffer, expectedPlainPasswordMessage)
+  testForMessage(md5PasswordBuffer, expectedMD5PasswordMessage)
+  testForMessage(SASLBuffer, expectedSASLMessage)
+  testForMessage(SASLContinueBuffer, expectedSASLContinueMessage)
+
+  // this exercises a found bug in the parser:
+  // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+  // and adds a test which is deterministic, rather than relying on network packet chunking
+  const extendedSASLContinueBuffer = Buffer.concat([SASLContinueBuffer, Buffer.from([1, 2, 3, 4])])
+  testForMessage(extendedSASLContinueBuffer, expectedSASLContinueMessage)
+
+  testForMessage(SASLFinalBuffer, expectedSASLFinalMessage)
+
+  // this exercises a found bug in the parser:
+  // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+  // and adds a test which is deterministic, rather than relying on network packet chunking
+  const extendedSASLFinalBuffer = Buffer.concat([SASLFinalBuffer, Buffer.from([1, 2, 4, 5])])
+  testForMessage(extendedSASLFinalBuffer, expectedSASLFinalMessage)
+
+  testForMessage(paramStatusBuffer, expectedParameterStatusMessage)
+  testForMessage(backendKeyDataBuffer, expectedBackendKeyDataMessage)
+  testForMessage(readyForQueryBuffer, expectedReadyForQueryMessage)
+  testForMessage(commandCompleteBuffer, expectedCommandCompleteMessage)
+  testForMessage(notificationResponseBuffer, expectedNotificationResponseMessage)
+  testForMessage(buffers.emptyQuery(), {
+    name: 'emptyQuery',
+    length: 4,
+  })
+
+  testForMessage(Buffer.from([0x6e, 0, 0, 0, 4]), {
+    name: 'noData',
+  })
+
+  describe('rowDescription messages', function () {
+    testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage)
+    testForMessage(oneRowDescBuff, expectedOneRowMessage)
+    testForMessage(twoRowBuf, expectedTwoRowMessage)
+    testForMessage(bigOidDescBuff, expectedBigOidMessage)
+  })
+
+  describe('parameterDescription messages', function () {
+    testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage)
+    testForMessage(oneParameterDescBuf, expectedOneParameterMessage)
+    testForMessage(twoParameterDescBuf, expectedTwoParameterMessage)
+  })
+
+  describe('parsing rows', function () {
+    describe('parsing empty row', function () {
+      testForMessage(emptyRowFieldBuf, {
+        name: 'dataRow',
+        fieldCount: 0,
+      })
+    })
+
+    describe('parsing data row with fields', function () {
+      testForMessage(oneFieldBuf, {
+        name: 'dataRow',
+        fieldCount: 1,
+        fields: ['test'],
+      })
+    })
+  })
+
+  describe('notice message', function () {
+    // this uses the same logic as error message
+    const buff = buffers.notice([{ type: 'C', value: 'code' }])
+    testForMessage(buff, {
+      name: 'notice',
+      code: 'code',
+    })
+  })
+
+  testForMessage(buffers.error([]), {
+    name: 'error',
+  })
+
+  describe('with all the fields', function () {
+    const buffer = buffers.error([
+      {
+        type: 'S',
+        value: 'ERROR',
+      },
+      {
+        type: 'C',
+        value: 'code',
+      },
+      {
+        type: 'M',
+        value: 'message',
+      },
+      {
+        type: 'D',
+        value: 'details',
+      },
+      {
+        type: 'H',
+        value: 'hint',
+      },
+      {
+        type: 'P',
+        value: '100',
+      },
+      {
+        type: 'p',
+        value: '101',
+      },
+      {
+        type: 'q',
+        value: 'query',
+      },
+      {
+        type: 'W',
+        value: 'where',
+      },
+      {
+        type: 'F',
+        value: 'file',
+      },
+      {
+        type: 'L',
+        value: 'line',
+      },
+      {
+        type: 'R',
+        value: 'routine',
+      },
+      {
+        type: 'Z', // ignored
+        value: 'alsdkf',
+      },
+    ])
+
+    testForMessage(buffer, {
+      name: 'error',
+      severity: 'ERROR',
+      code: 'code',
+      message: 'message',
+      detail: 'details',
+      hint: 'hint',
+      position: '100',
+      internalPosition: '101',
+      internalQuery: 'query',
+      where: 'where',
+      file: 'file',
+      line: 'line',
+      routine: 'routine',
+    })
+  })
+
+  testForMessage(parseCompleteBuffer, {
+    name: 'parseComplete',
+  })
+
+  testForMessage(bindCompleteBuffer, {
+    name: 'bindComplete',
+  })
+
+  testForMessage(bindCompleteBuffer, {
+    name: 'bindComplete',
+  })
+
+  testForMessage(buffers.closeComplete(), {
+    name: 'closeComplete',
+  })
+
+  describe('parses portal suspended message', function () {
+    testForMessage(portalSuspendedBuffer, {
+      name: 'portalSuspended',
+    })
+  })
+
+  describe('parses replication start message', function () {
+    testForMessage(Buffer.from([0x57, 0x00, 0x00, 0x00, 0x04]), {
+      name: 'replicationStart',
+      length: 4,
+    })
+  })
+
+  describe('copy', () => {
+    testForMessage(buffers.copyIn(0), {
+      name: 'copyInResponse',
+      length: 7,
+      binary: false,
+      columnTypes: [],
+    })
+
+    testForMessage(buffers.copyIn(2), {
+      name: 'copyInResponse',
+      length: 11,
+      binary: false,
+      columnTypes: [0, 1],
+    })
+
+    testForMessage(buffers.copyOut(0), {
+      name: 'copyOutResponse',
+      length: 7,
+      binary: false,
+      columnTypes: [],
+    })
+
+    testForMessage(buffers.copyOut(3), {
+      name: 'copyOutResponse',
+      length: 13,
+      binary: false,
+      columnTypes: [0, 1, 2],
+    })
+
+    testForMessage(buffers.copyDone(), {
+      name: 'copyDone',
+      length: 4,
+    })
+
+    testForMessage(buffers.copyData(Buffer.from([5, 6, 7])), {
+      name: 'copyData',
+      length: 7,
+      chunk: Buffer.from([5, 6, 7]),
+    })
+  })
+
+  // since the data message on a stream can randomly divide the incomming
+  // tcp packets anywhere, we need to make sure we can parse every single
+  // split on a tcp message
+  describe('split buffer, single message parsing', function () {
+    const fullBuffer = buffers.dataRow([null, 'bang', 'zug zug', null, '!'])
+
+    it('parses when full buffer comes in', async function () {
+      const messages = await parseBuffers([fullBuffer])
+      const message = messages[0] as any
+      assert.equal(message.fields.length, 5)
+      assert.equal(message.fields[0], null)
+      assert.equal(message.fields[1], 'bang')
+      assert.equal(message.fields[2], 'zug zug')
+      assert.equal(message.fields[3], null)
+      assert.equal(message.fields[4], '!')
+    })
+
+    const testMessageReceivedAfterSplitAt = async function (split: number) {
+      const firstBuffer = Buffer.alloc(fullBuffer.length - split)
+      const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
+      fullBuffer.copy(firstBuffer, 0, 0)
+      fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
+      const messages = await parseBuffers([firstBuffer, secondBuffer])
+      const message = messages[0] as any
+      assert.equal(message.fields.length, 5)
+      assert.equal(message.fields[0], null)
+      assert.equal(message.fields[1], 'bang')
+      assert.equal(message.fields[2], 'zug zug')
+      assert.equal(message.fields[3], null)
+      assert.equal(message.fields[4], '!')
+    }
+
+    it('parses when split in the middle', function () {
+      return testMessageReceivedAfterSplitAt(6)
+    })
+
+    it('parses when split at end', function () {
+      return testMessageReceivedAfterSplitAt(2)
+    })
+
+    it('parses when split at beginning', function () {
+      return Promise.all([
+        testMessageReceivedAfterSplitAt(fullBuffer.length - 2),
+        testMessageReceivedAfterSplitAt(fullBuffer.length - 1),
+        testMessageReceivedAfterSplitAt(fullBuffer.length - 5),
+      ])
+    })
+  })
+
+  describe('split buffer, multiple message parsing', function () {
+    const dataRowBuffer = buffers.dataRow(['!'])
+    const readyForQueryBuffer = buffers.readyForQuery()
+    const fullBuffer = Buffer.alloc(dataRowBuffer.length + readyForQueryBuffer.length)
+    dataRowBuffer.copy(fullBuffer, 0, 0)
+    readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0)
+
+    const verifyMessages = function (messages: any[]) {
+      assert.strictEqual(messages.length, 2)
+      assert.deepEqual(messages[0], {
+        name: 'dataRow',
+        fieldCount: 1,
+        length: 11,
+        fields: ['!'],
+      })
+      assert.equal(messages[0].fields[0], '!')
+      assert.deepEqual(messages[1], {
+        name: 'readyForQuery',
+        length: 5,
+        status: 'I',
+      })
+    }
+    // sanity check
+    it('receives both messages when packet is not split', async function () {
+      const messages = await parseBuffers([fullBuffer])
+      verifyMessages(messages)
+    })
+
+    const splitAndVerifyTwoMessages = async function (split: number) {
+      const firstBuffer = Buffer.alloc(fullBuffer.length - split)
+      const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
+      fullBuffer.copy(firstBuffer, 0, 0)
+      fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
+      const messages = await parseBuffers([firstBuffer, secondBuffer])
+      verifyMessages(messages)
+    }
+
+    describe('receives both messages when packet is split', function () {
+      it('in the middle', function () {
+        return splitAndVerifyTwoMessages(11)
+      })
+      it('at the front', function () {
+        return Promise.all([
+          splitAndVerifyTwoMessages(fullBuffer.length - 1),
+          splitAndVerifyTwoMessages(fullBuffer.length - 4),
+          splitAndVerifyTwoMessages(fullBuffer.length - 6),
+        ])
+      })
+
+      it('at the end', function () {
+        return Promise.all([splitAndVerifyTwoMessages(8), splitAndVerifyTwoMessages(1)])
+      })
+    })
+  })
+})
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/index.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,11 @@
+import { DatabaseError } from './messages'
+import { serialize } from './serializer'
+import { Parser, MessageCallback } from './parser'
+
+export function parse(stream: NodeJS.ReadableStream, callback: MessageCallback): Promise<void> {
+  const parser = new Parser()
+  stream.on('data', (buffer: Buffer) => parser.parse(buffer, callback))
+  return new Promise((resolve) => stream.on('end', () => resolve()))
+}
+
+export { serialize, DatabaseError }
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/messages.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/messages.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/messages.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,262 @@
+export type Mode = 'text' | 'binary'
+
+export type MessageName =
+  | 'parseComplete'
+  | 'bindComplete'
+  | 'closeComplete'
+  | 'noData'
+  | 'portalSuspended'
+  | 'replicationStart'
+  | 'emptyQuery'
+  | 'copyDone'
+  | 'copyData'
+  | 'rowDescription'
+  | 'parameterDescription'
+  | 'parameterStatus'
+  | 'backendKeyData'
+  | 'notification'
+  | 'readyForQuery'
+  | 'commandComplete'
+  | 'dataRow'
+  | 'copyInResponse'
+  | 'copyOutResponse'
+  | 'authenticationOk'
+  | 'authenticationMD5Password'
+  | 'authenticationCleartextPassword'
+  | 'authenticationSASL'
+  | 'authenticationSASLContinue'
+  | 'authenticationSASLFinal'
+  | 'error'
+  | 'notice'
+
+export interface BackendMessage {
+  name: MessageName
+  length: number
+}
+
+export const parseComplete: BackendMessage = {
+  name: 'parseComplete',
+  length: 5,
+}
+
+export const bindComplete: BackendMessage = {
+  name: 'bindComplete',
+  length: 5,
+}
+
+export const closeComplete: BackendMessage = {
+  name: 'closeComplete',
+  length: 5,
+}
+
+export const noData: BackendMessage = {
+  name: 'noData',
+  length: 5,
+}
+
+export const portalSuspended: BackendMessage = {
+  name: 'portalSuspended',
+  length: 5,
+}
+
+export const replicationStart: BackendMessage = {
+  name: 'replicationStart',
+  length: 4,
+}
+
+export const emptyQuery: BackendMessage = {
+  name: 'emptyQuery',
+  length: 4,
+}
+
+export const copyDone: BackendMessage = {
+  name: 'copyDone',
+  length: 4,
+}
+
+interface NoticeOrError {
+  message: string | undefined
+  severity: string | undefined
+  code: string | undefined
+  detail: string | undefined
+  hint: string | undefined
+  position: string | undefined
+  internalPosition: string | undefined
+  internalQuery: string | undefined
+  where: string | undefined
+  schema: string | undefined
+  table: string | undefined
+  column: string | undefined
+  dataType: string | undefined
+  constraint: string | undefined
+  file: string | undefined
+  line: string | undefined
+  routine: string | undefined
+}
+
+export class DatabaseError extends Error implements NoticeOrError {
+  public severity: string | undefined
+  public code: string | undefined
+  public detail: string | undefined
+  public hint: string | undefined
+  public position: string | undefined
+  public internalPosition: string | undefined
+  public internalQuery: string | undefined
+  public where: string | undefined
+  public schema: string | undefined
+  public table: string | undefined
+  public column: string | undefined
+  public dataType: string | undefined
+  public constraint: string | undefined
+  public file: string | undefined
+  public line: string | undefined
+  public routine: string | undefined
+  constructor(
+    message: string,
+    public readonly length: number,
+    public readonly name: MessageName
+  ) {
+    super(message)
+  }
+}
+
+export class CopyDataMessage {
+  public readonly name = 'copyData'
+  constructor(
+    public readonly length: number,
+    public readonly chunk: Buffer
+  ) {}
+}
+
+export class CopyResponse {
+  public readonly columnTypes: number[]
+  constructor(
+    public readonly length: number,
+    public readonly name: MessageName,
+    public readonly binary: boolean,
+    columnCount: number
+  ) {
+    this.columnTypes = new Array(columnCount)
+  }
+}
+
+export class Field {
+  constructor(
+    public readonly name: string,
+    public readonly tableID: number,
+    public readonly columnID: number,
+    public readonly dataTypeID: number,
+    public readonly dataTypeSize: number,
+    public readonly dataTypeModifier: number,
+    public readonly format: Mode
+  ) {}
+}
+
+export class RowDescriptionMessage {
+  public readonly name: MessageName = 'rowDescription'
+  public readonly fields: Field[]
+  constructor(
+    public readonly length: number,
+    public readonly fieldCount: number
+  ) {
+    this.fields = new Array(this.fieldCount)
+  }
+}
+
+export class ParameterDescriptionMessage {
+  public readonly name: MessageName = 'parameterDescription'
+  public readonly dataTypeIDs: number[]
+  constructor(
+    public readonly length: number,
+    public readonly parameterCount: number
+  ) {
+    this.dataTypeIDs = new Array(this.parameterCount)
+  }
+}
+
+export class ParameterStatusMessage {
+  public readonly name: MessageName = 'parameterStatus'
+  constructor(
+    public readonly length: number,
+    public readonly parameterName: string,
+    public readonly parameterValue: string
+  ) {}
+}
+
+export class AuthenticationMD5Password implements BackendMessage {
+  public readonly name: MessageName = 'authenticationMD5Password'
+  constructor(
+    public readonly length: number,
+    public readonly salt: Buffer
+  ) {}
+}
+
+export class BackendKeyDataMessage {
+  public readonly name: MessageName = 'backendKeyData'
+  constructor(
+    public readonly length: number,
+    public readonly processID: number,
+    public readonly secretKey: number
+  ) {}
+}
+
+export class NotificationResponseMessage {
+  public readonly name: MessageName = 'notification'
+  constructor(
+    public readonly length: number,
+    public readonly processId: number,
+    public readonly channel: string,
+    public readonly payload: string
+  ) {}
+}
+
+export class ReadyForQueryMessage {
+  public readonly name: MessageName = 'readyForQuery'
+  constructor(
+    public readonly length: number,
+    public readonly status: string
+  ) {}
+}
+
+export class CommandCompleteMessage {
+  public readonly name: MessageName = 'commandComplete'
+  constructor(
+    public readonly length: number,
+    public readonly text: string
+  ) {}
+}
+
+export class DataRowMessage {
+  public readonly fieldCount: number
+  public readonly name: MessageName = 'dataRow'
+  constructor(
+    public length: number,
+    public fields: any[]
+  ) {
+    this.fieldCount = fields.length
+  }
+}
+
+export class NoticeMessage implements BackendMessage, NoticeOrError {
+  constructor(
+    public readonly length: number,
+    public readonly message: string | undefined
+  ) {}
+  public readonly name = 'notice'
+  public severity: string | undefined
+  public code: string | undefined
+  public detail: string | undefined
+  public hint: string | undefined
+  public position: string | undefined
+  public internalPosition: string | undefined
+  public internalQuery: string | undefined
+  public where: string | undefined
+  public schema: string | undefined
+  public table: string | undefined
+  public column: string | undefined
+  public dataType: string | undefined
+  public constraint: string | undefined
+  public file: string | undefined
+  public line: string | undefined
+  public routine: string | undefined
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/outbound-serializer.test.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/outbound-serializer.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/outbound-serializer.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,276 @@
+import assert from 'assert'
+import { serialize } from './serializer'
+import BufferList from './testing/buffer-list'
+
+describe('serializer', () => {
+  it('builds startup message', function () {
+    const actual = serialize.startup({
+      user: 'brian',
+      database: 'bang',
+    })
+    assert.deepEqual(
+      actual,
+      new BufferList()
+        .addInt16(3)
+        .addInt16(0)
+        .addCString('user')
+        .addCString('brian')
+        .addCString('database')
+        .addCString('bang')
+        .addCString('client_encoding')
+        .addCString('UTF8')
+        .addCString('')
+        .join(true)
+    )
+  })
+
+  it('builds password message', function () {
+    const actual = serialize.password('!')
+    assert.deepEqual(actual, new BufferList().addCString('!').join(true, 'p'))
+  })
+
+  it('builds request ssl message', function () {
+    const actual = serialize.requestSsl()
+    const expected = new BufferList().addInt32(80877103).join(true)
+    assert.deepEqual(actual, expected)
+  })
+
+  it('builds SASLInitialResponseMessage message', function () {
+    const actual = serialize.sendSASLInitialResponseMessage('mech', 'data')
+    assert.deepEqual(actual, new BufferList().addCString('mech').addInt32(4).addString('data').join(true, 'p'))
+  })
+
+  it('builds SCRAMClientFinalMessage message', function () {
+    const actual = serialize.sendSCRAMClientFinalMessage('data')
+    assert.deepEqual(actual, new BufferList().addString('data').join(true, 'p'))
+  })
+
+  it('builds query message', function () {
+    const txt = 'select * from boom'
+    const actual = serialize.query(txt)
+    assert.deepEqual(actual, new BufferList().addCString(txt).join(true, 'Q'))
+  })
+
+  describe('parse message', () => {
+    it('builds parse message', function () {
+      const actual = serialize.parse({ text: '!' })
+      const expected = new BufferList().addCString('').addCString('!').addInt16(0).join(true, 'P')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('builds parse message with named query', function () {
+      const actual = serialize.parse({
+        name: 'boom',
+        text: 'select * from boom',
+        types: [],
+      })
+      const expected = new BufferList().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('with multiple parameters', function () {
+      const actual = serialize.parse({
+        name: 'force',
+        text: 'select * from bang where name = $1',
+        types: [1, 2, 3, 4],
+      })
+      const expected = new BufferList()
+        .addCString('force')
+        .addCString('select * from bang where name = $1')
+        .addInt16(4)
+        .addInt32(1)
+        .addInt32(2)
+        .addInt32(3)
+        .addInt32(4)
+        .join(true, 'P')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  describe('bind messages', function () {
+    it('with no values', function () {
+      const actual = serialize.bind()
+
+      const expectedBuffer = new BufferList()
+        .addCString('')
+        .addCString('')
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(1)
+        .addInt16(0)
+        .join(true, 'B')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+
+    it('with named statement, portal, and values', function () {
+      const actual = serialize.bind({
+        portal: 'bang',
+        statement: 'woo',
+        values: ['1', 'hi', null, 'zing'],
+      })
+      const expectedBuffer = new BufferList()
+        .addCString('bang') // portal name
+        .addCString('woo') // statement name
+        .addInt16(4)
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(4)
+        .addInt32(1)
+        .add(Buffer.from('1'))
+        .addInt32(2)
+        .add(Buffer.from('hi'))
+        .addInt32(-1)
+        .addInt32(4)
+        .add(Buffer.from('zing'))
+        .addInt16(1)
+        .addInt16(0)
+        .join(true, 'B')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+  })
+
+  it('with custom valueMapper', function () {
+    const actual = serialize.bind({
+      portal: 'bang',
+      statement: 'woo',
+      values: ['1', 'hi', null, 'zing'],
+      valueMapper: () => null,
+    })
+    const expectedBuffer = new BufferList()
+      .addCString('bang') // portal name
+      .addCString('woo') // statement name
+      .addInt16(4)
+      .addInt16(0)
+      .addInt16(0)
+      .addInt16(0)
+      .addInt16(0)
+      .addInt16(4)
+      .addInt32(-1)
+      .addInt32(-1)
+      .addInt32(-1)
+      .addInt32(-1)
+      .addInt16(1)
+      .addInt16(0)
+      .join(true, 'B')
+    assert.deepEqual(actual, expectedBuffer)
+  })
+
+  it('with named statement, portal, and buffer value', function () {
+    const actual = serialize.bind({
+      portal: 'bang',
+      statement: 'woo',
+      values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
+    })
+    const expectedBuffer = new BufferList()
+      .addCString('bang') // portal name
+      .addCString('woo') // statement name
+      .addInt16(4) // value count
+      .addInt16(0) // string
+      .addInt16(0) // string
+      .addInt16(0) // string
+      .addInt16(1) // binary
+      .addInt16(4)
+      .addInt32(1)
+      .add(Buffer.from('1'))
+      .addInt32(2)
+      .add(Buffer.from('hi'))
+      .addInt32(-1)
+      .addInt32(4)
+      .add(Buffer.from('zing', 'utf-8'))
+      .addInt16(1)
+      .addInt16(0)
+      .join(true, 'B')
+    assert.deepEqual(actual, expectedBuffer)
+  })
+
+  describe('builds execute message', function () {
+    it('for unamed portal with no row limit', function () {
+      const actual = serialize.execute()
+      const expectedBuffer = new BufferList().addCString('').addInt32(0).join(true, 'E')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+
+    it('for named portal with row limit', function () {
+      const actual = serialize.execute({
+        portal: 'my favorite portal',
+        rows: 100,
+      })
+      const expectedBuffer = new BufferList().addCString('my favorite portal').addInt32(100).join(true, 'E')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+  })
+
+  it('builds flush command', function () {
+    const actual = serialize.flush()
+    const expected = new BufferList().join(true, 'H')
+    assert.deepEqual(actual, expected)
+  })
+
+  it('builds sync command', function () {
+    const actual = serialize.sync()
+    const expected = new BufferList().join(true, 'S')
+    assert.deepEqual(actual, expected)
+  })
+
+  it('builds end command', function () {
+    const actual = serialize.end()
+    const expected = Buffer.from([0x58, 0, 0, 0, 4])
+    assert.deepEqual(actual, expected)
+  })
+
+  describe('builds describe command', function () {
+    it('describe statement', function () {
+      const actual = serialize.describe({ type: 'S', name: 'bang' })
+      const expected = new BufferList().addChar('S').addCString('bang').join(true, 'D')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('describe unnamed portal', function () {
+      const actual = serialize.describe({ type: 'P' })
+      const expected = new BufferList().addChar('P').addCString('').join(true, 'D')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  describe('builds close command', function () {
+    it('describe statement', function () {
+      const actual = serialize.close({ type: 'S', name: 'bang' })
+      const expected = new BufferList().addChar('S').addCString('bang').join(true, 'C')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('describe unnamed portal', function () {
+      const actual = serialize.close({ type: 'P' })
+      const expected = new BufferList().addChar('P').addCString('').join(true, 'C')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  describe('copy messages', function () {
+    it('builds copyFromChunk', () => {
+      const actual = serialize.copyData(Buffer.from([1, 2, 3]))
+      const expected = new BufferList().add(Buffer.from([1, 2, 3])).join(true, 'd')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('builds copy fail', () => {
+      const actual = serialize.copyFail('err!')
+      const expected = new BufferList().addCString('err!').join(true, 'f')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('builds copy done', () => {
+      const actual = serialize.copyDone()
+      const expected = new BufferList().join(true, 'c')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  it('builds cancel message', () => {
+    const actual = serialize.cancel(3, 4)
+    const expected = new BufferList().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true)
+    assert.deepEqual(actual, expected)
+  })
+})
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/parser.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/parser.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/parser.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,389 @@
+import { TransformOptions } from 'stream'
+import {
+  Mode,
+  bindComplete,
+  parseComplete,
+  closeComplete,
+  noData,
+  portalSuspended,
+  copyDone,
+  replicationStart,
+  emptyQuery,
+  ReadyForQueryMessage,
+  CommandCompleteMessage,
+  CopyDataMessage,
+  CopyResponse,
+  NotificationResponseMessage,
+  RowDescriptionMessage,
+  ParameterDescriptionMessage,
+  Field,
+  DataRowMessage,
+  ParameterStatusMessage,
+  BackendKeyDataMessage,
+  DatabaseError,
+  BackendMessage,
+  MessageName,
+  AuthenticationMD5Password,
+  NoticeMessage,
+} from './messages'
+import { BufferReader } from './buffer-reader'
+
+// every message is prefixed with a single bye
+const CODE_LENGTH = 1
+// every message has an int32 length which includes itself but does
+// NOT include the code in the length
+const LEN_LENGTH = 4
+
+const HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH
+
+export type Packet = {
+  code: number
+  packet: Buffer
+}
+
+const emptyBuffer = Buffer.allocUnsafe(0)
+
+type StreamOptions = TransformOptions & {
+  mode: Mode
+}
+
+const enum MessageCodes {
+  DataRow = 0x44, // D
+  ParseComplete = 0x31, // 1
+  BindComplete = 0x32, // 2
+  CloseComplete = 0x33, // 3
+  CommandComplete = 0x43, // C
+  ReadyForQuery = 0x5a, // Z
+  NoData = 0x6e, // n
+  NotificationResponse = 0x41, // A
+  AuthenticationResponse = 0x52, // R
+  ParameterStatus = 0x53, // S
+  BackendKeyData = 0x4b, // K
+  ErrorMessage = 0x45, // E
+  NoticeMessage = 0x4e, // N
+  RowDescriptionMessage = 0x54, // T
+  ParameterDescriptionMessage = 0x74, // t
+  PortalSuspended = 0x73, // s
+  ReplicationStart = 0x57, // W
+  EmptyQuery = 0x49, // I
+  CopyIn = 0x47, // G
+  CopyOut = 0x48, // H
+  CopyDone = 0x63, // c
+  CopyData = 0x64, // d
+}
+
+export type MessageCallback = (msg: BackendMessage) => void
+
+export class Parser {
+  private buffer: Buffer = emptyBuffer
+  private bufferLength: number = 0
+  private bufferOffset: number = 0
+  private reader = new BufferReader()
+  private mode: Mode
+
+  constructor(opts?: StreamOptions) {
+    if (opts?.mode === 'binary') {
+      throw new Error('Binary mode not supported yet')
+    }
+    this.mode = opts?.mode || 'text'
+  }
+
+  public parse(buffer: Buffer, callback: MessageCallback) {
+    this.mergeBuffer(buffer)
+    const bufferFullLength = this.bufferOffset + this.bufferLength
+    let offset = this.bufferOffset
+    while (offset + HEADER_LENGTH <= bufferFullLength) {
+      // code is 1 byte long - it identifies the message type
+      const code = this.buffer[offset]
+      // length is 1 Uint32BE - it is the length of the message EXCLUDING the code
+      const length = this.buffer.readUInt32BE(offset + CODE_LENGTH)
+      const fullMessageLength = CODE_LENGTH + length
+      if (fullMessageLength + offset <= bufferFullLength) {
+        const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer)
+        callback(message)
+        offset += fullMessageLength
+      } else {
+        break
+      }
+    }
+    if (offset === bufferFullLength) {
+      // No more use for the buffer
+      this.buffer = emptyBuffer
+      this.bufferLength = 0
+      this.bufferOffset = 0
+    } else {
+      // Adjust the cursors of remainingBuffer
+      this.bufferLength = bufferFullLength - offset
+      this.bufferOffset = offset
+    }
+  }
+
+  private mergeBuffer(buffer: Buffer): void {
+    if (this.bufferLength > 0) {
+      const newLength = this.bufferLength + buffer.byteLength
+      const newFullLength = newLength + this.bufferOffset
+      if (newFullLength > this.buffer.byteLength) {
+        // We can't concat the new buffer with the remaining one
+        let newBuffer: Buffer
+        if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {
+          // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer
+          newBuffer = this.buffer
+        } else {
+          // Allocate a new larger buffer
+          let newBufferLength = this.buffer.byteLength * 2
+          while (newLength >= newBufferLength) {
+            newBufferLength *= 2
+          }
+          newBuffer = Buffer.allocUnsafe(newBufferLength)
+        }
+        // Move the remaining buffer to the new one
+        this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength)
+        this.buffer = newBuffer
+        this.bufferOffset = 0
+      }
+      // Concat the new buffer with the remaining one
+      buffer.copy(this.buffer, this.bufferOffset + this.bufferLength)
+      this.bufferLength = newLength
+    } else {
+      this.buffer = buffer
+      this.bufferOffset = 0
+      this.bufferLength = buffer.byteLength
+    }
+  }
+
+  private handlePacket(offset: number, code: number, length: number, bytes: Buffer): BackendMessage {
+    switch (code) {
+      case MessageCodes.BindComplete:
+        return bindComplete
+      case MessageCodes.ParseComplete:
+        return parseComplete
+      case MessageCodes.CloseComplete:
+        return closeComplete
+      case MessageCodes.NoData:
+        return noData
+      case MessageCodes.PortalSuspended:
+        return portalSuspended
+      case MessageCodes.CopyDone:
+        return copyDone
+      case MessageCodes.ReplicationStart:
+        return replicationStart
+      case MessageCodes.EmptyQuery:
+        return emptyQuery
+      case MessageCodes.DataRow:
+        return this.parseDataRowMessage(offset, length, bytes)
+      case MessageCodes.CommandComplete:
+        return this.parseCommandCompleteMessage(offset, length, bytes)
+      case MessageCodes.ReadyForQuery:
+        return this.parseReadyForQueryMessage(offset, length, bytes)
+      case MessageCodes.NotificationResponse:
+        return this.parseNotificationMessage(offset, length, bytes)
+      case MessageCodes.AuthenticationResponse:
+        return this.parseAuthenticationResponse(offset, length, bytes)
+      case MessageCodes.ParameterStatus:
+        return this.parseParameterStatusMessage(offset, length, bytes)
+      case MessageCodes.BackendKeyData:
+        return this.parseBackendKeyData(offset, length, bytes)
+      case MessageCodes.ErrorMessage:
+        return this.parseErrorMessage(offset, length, bytes, 'error')
+      case MessageCodes.NoticeMessage:
+        return this.parseErrorMessage(offset, length, bytes, 'notice')
+      case MessageCodes.RowDescriptionMessage:
+        return this.parseRowDescriptionMessage(offset, length, bytes)
+      case MessageCodes.ParameterDescriptionMessage:
+        return this.parseParameterDescriptionMessage(offset, length, bytes)
+      case MessageCodes.CopyIn:
+        return this.parseCopyInMessage(offset, length, bytes)
+      case MessageCodes.CopyOut:
+        return this.parseCopyOutMessage(offset, length, bytes)
+      case MessageCodes.CopyData:
+        return this.parseCopyData(offset, length, bytes)
+      default:
+        return new DatabaseError('received invalid response: ' + code.toString(16), length, 'error')
+    }
+  }
+
+  private parseReadyForQueryMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const status = this.reader.string(1)
+    return new ReadyForQueryMessage(length, status)
+  }
+
+  private parseCommandCompleteMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const text = this.reader.cstring()
+    return new CommandCompleteMessage(length, text)
+  }
+
+  private parseCopyData(offset: number, length: number, bytes: Buffer) {
+    const chunk = bytes.slice(offset, offset + (length - 4))
+    return new CopyDataMessage(length, chunk)
+  }
+
+  private parseCopyInMessage(offset: number, length: number, bytes: Buffer) {
+    return this.parseCopyMessage(offset, length, bytes, 'copyInResponse')
+  }
+
+  private parseCopyOutMessage(offset: number, length: number, bytes: Buffer) {
+    return this.parseCopyMessage(offset, length, bytes, 'copyOutResponse')
+  }
+
+  private parseCopyMessage(offset: number, length: number, bytes: Buffer, messageName: MessageName) {
+    this.reader.setBuffer(offset, bytes)
+    const isBinary = this.reader.byte() !== 0
+    const columnCount = this.reader.int16()
+    const message = new CopyResponse(length, messageName, isBinary, columnCount)
+    for (let i = 0; i < columnCount; i++) {
+      message.columnTypes[i] = this.reader.int16()
+    }
+    return message
+  }
+
+  private parseNotificationMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const processId = this.reader.int32()
+    const channel = this.reader.cstring()
+    const payload = this.reader.cstring()
+    return new NotificationResponseMessage(length, processId, channel, payload)
+  }
+
+  private parseRowDescriptionMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const fieldCount = this.reader.int16()
+    const message = new RowDescriptionMessage(length, fieldCount)
+    for (let i = 0; i < fieldCount; i++) {
+      message.fields[i] = this.parseField()
+    }
+    return message
+  }
+
+  private parseField(): Field {
+    const name = this.reader.cstring()
+    const tableID = this.reader.uint32()
+    const columnID = this.reader.int16()
+    const dataTypeID = this.reader.uint32()
+    const dataTypeSize = this.reader.int16()
+    const dataTypeModifier = this.reader.int32()
+    const mode = this.reader.int16() === 0 ? 'text' : 'binary'
+    return new Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode)
+  }
+
+  private parseParameterDescriptionMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const parameterCount = this.reader.int16()
+    const message = new ParameterDescriptionMessage(length, parameterCount)
+    for (let i = 0; i < parameterCount; i++) {
+      message.dataTypeIDs[i] = this.reader.int32()
+    }
+    return message
+  }
+
+  private parseDataRowMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const fieldCount = this.reader.int16()
+    const fields: any[] = new Array(fieldCount)
+    for (let i = 0; i < fieldCount; i++) {
+      const len = this.reader.int32()
+      // a -1 for length means the value of the field is null
+      fields[i] = len === -1 ? null : this.reader.string(len)
+    }
+    return new DataRowMessage(length, fields)
+  }
+
+  private parseParameterStatusMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const name = this.reader.cstring()
+    const value = this.reader.cstring()
+    return new ParameterStatusMessage(length, name, value)
+  }
+
+  private parseBackendKeyData(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const processID = this.reader.int32()
+    const secretKey = this.reader.int32()
+    return new BackendKeyDataMessage(length, processID, secretKey)
+  }
+
+  public parseAuthenticationResponse(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const code = this.reader.int32()
+    // TODO(bmc): maybe better types here
+    const message: BackendMessage & any = {
+      name: 'authenticationOk',
+      length,
+    }
+
+    switch (code) {
+      case 0: // AuthenticationOk
+        break
+      case 3: // AuthenticationCleartextPassword
+        if (message.length === 8) {
+          message.name = 'authenticationCleartextPassword'
+        }
+        break
+      case 5: // AuthenticationMD5Password
+        if (message.length === 12) {
+          message.name = 'authenticationMD5Password'
+          const salt = this.reader.bytes(4)
+          return new AuthenticationMD5Password(length, salt)
+        }
+        break
+      case 10: // AuthenticationSASL
+        {
+          message.name = 'authenticationSASL'
+          message.mechanisms = []
+          let mechanism: string
+          do {
+            mechanism = this.reader.cstring()
+            if (mechanism) {
+              message.mechanisms.push(mechanism)
+            }
+          } while (mechanism)
+        }
+        break
+      case 11: // AuthenticationSASLContinue
+        message.name = 'authenticationSASLContinue'
+        message.data = this.reader.string(length - 8)
+        break
+      case 12: // AuthenticationSASLFinal
+        message.name = 'authenticationSASLFinal'
+        message.data = this.reader.string(length - 8)
+        break
+      default:
+        throw new Error('Unknown authenticationOk message type ' + code)
+    }
+    return message
+  }
+
+  private parseErrorMessage(offset: number, length: number, bytes: Buffer, name: MessageName) {
+    this.reader.setBuffer(offset, bytes)
+    const fields: Record<string, string> = {}
+    let fieldType = this.reader.string(1)
+    while (fieldType !== '\0') {
+      fields[fieldType] = this.reader.cstring()
+      fieldType = this.reader.string(1)
+    }
+
+    const messageValue = fields.M
+
+    const message =
+      name === 'notice' ? new NoticeMessage(length, messageValue) : new DatabaseError(messageValue, length, name)
+
+    message.severity = fields.S
+    message.code = fields.C
+    message.detail = fields.D
+    message.hint = fields.H
+    message.position = fields.P
+    message.internalPosition = fields.p
+    message.internalQuery = fields.q
+    message.where = fields.W
+    message.schema = fields.s
+    message.table = fields.t
+    message.column = fields.c
+    message.dataType = fields.d
+    message.constraint = fields.n
+    message.file = fields.F
+    message.line = fields.L
+    message.routine = fields.R
+    return message
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/serializer.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/serializer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/serializer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,274 @@
+import { Writer } from './buffer-writer'
+
+const enum code {
+  startup = 0x70,
+  query = 0x51,
+  parse = 0x50,
+  bind = 0x42,
+  execute = 0x45,
+  flush = 0x48,
+  sync = 0x53,
+  end = 0x58,
+  close = 0x43,
+  describe = 0x44,
+  copyFromChunk = 0x64,
+  copyDone = 0x63,
+  copyFail = 0x66,
+}
+
+const writer = new Writer()
+
+const startup = (opts: Record<string, string>): Buffer => {
+  // protocol version
+  writer.addInt16(3).addInt16(0)
+  for (const key of Object.keys(opts)) {
+    writer.addCString(key).addCString(opts[key])
+  }
+
+  writer.addCString('client_encoding').addCString('UTF8')
+
+  const bodyBuffer = writer.addCString('').flush()
+  // this message is sent without a code
+
+  const length = bodyBuffer.length + 4
+
+  return new Writer().addInt32(length).add(bodyBuffer).flush()
+}
+
+const requestSsl = (): Buffer => {
+  const response = Buffer.allocUnsafe(8)
+  response.writeInt32BE(8, 0)
+  response.writeInt32BE(80877103, 4)
+  return response
+}
+
+const password = (password: string): Buffer => {
+  return writer.addCString(password).flush(code.startup)
+}
+
+const sendSASLInitialResponseMessage = function (mechanism: string, initialResponse: string): Buffer {
+  // 0x70 = 'p'
+  writer.addCString(mechanism).addInt32(Buffer.byteLength(initialResponse)).addString(initialResponse)
+
+  return writer.flush(code.startup)
+}
+
+const sendSCRAMClientFinalMessage = function (additionalData: string): Buffer {
+  return writer.addString(additionalData).flush(code.startup)
+}
+
+const query = (text: string): Buffer => {
+  return writer.addCString(text).flush(code.query)
+}
+
+type ParseOpts = {
+  name?: string
+  types?: number[]
+  text: string
+}
+
+const emptyArray: any[] = []
+
+const parse = (query: ParseOpts): Buffer => {
+  // expect something like this:
+  // { name: 'queryName',
+  //   text: 'select * from blah',
+  //   types: ['int8', 'bool'] }
+
+  // normalize missing query names to allow for null
+  const name = query.name || ''
+  if (name.length > 63) {
+    console.error('Warning! Postgres only supports 63 characters for query names.')
+    console.error('You supplied %s (%s)', name, name.length)
+    console.error('This can cause conflicts and silent errors executing queries')
+  }
+
+  const types = query.types || emptyArray
+
+  const len = types.length
+
+  const buffer = writer
+    .addCString(name) // name of query
+    .addCString(query.text) // actual query text
+    .addInt16(len)
+
+  for (let i = 0; i < len; i++) {
+    buffer.addInt32(types[i])
+  }
+
+  return writer.flush(code.parse)
+}
+
+type ValueMapper = (param: any, index: number) => any
+
+type BindOpts = {
+  portal?: string
+  binary?: boolean
+  statement?: string
+  values?: any[]
+  // optional map from JS value to postgres value per parameter
+  valueMapper?: ValueMapper
+}
+
+const paramWriter = new Writer()
+
+// make this a const enum so typescript will inline the value
+const enum ParamType {
+  STRING = 0,
+  BINARY = 1,
+}
+
+const writeValues = function (values: any[], valueMapper?: ValueMapper): void {
+  for (let i = 0; i < values.length; i++) {
+    const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i]
+    if (mappedVal == null) {
+      // add the param type (string) to the writer
+      writer.addInt16(ParamType.STRING)
+      // write -1 to the param writer to indicate null
+      paramWriter.addInt32(-1)
+    } else if (mappedVal instanceof Buffer) {
+      // add the param type (binary) to the writer
+      writer.addInt16(ParamType.BINARY)
+      // add the buffer to the param writer
+      paramWriter.addInt32(mappedVal.length)
+      paramWriter.add(mappedVal)
+    } else {
+      // add the param type (string) to the writer
+      writer.addInt16(ParamType.STRING)
+      paramWriter.addInt32(Buffer.byteLength(mappedVal))
+      paramWriter.addString(mappedVal)
+    }
+  }
+}
+
+const bind = (config: BindOpts = {}): Buffer => {
+  // normalize config
+  const portal = config.portal || ''
+  const statement = config.statement || ''
+  const binary = config.binary || false
+  const values = config.values || emptyArray
+  const len = values.length
+
+  writer.addCString(portal).addCString(statement)
+  writer.addInt16(len)
+
+  writeValues(values, config.valueMapper)
+
+  writer.addInt16(len)
+  writer.add(paramWriter.flush())
+
+  // all results use the same format code
+  writer.addInt16(1)
+  // format code
+  writer.addInt16(binary ? ParamType.BINARY : ParamType.STRING)
+  return writer.flush(code.bind)
+}
+
+type ExecOpts = {
+  portal?: string
+  rows?: number
+}
+
+const emptyExecute = Buffer.from([code.execute, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00])
+
+const execute = (config?: ExecOpts): Buffer => {
+  // this is the happy path for most queries
+  if (!config || (!config.portal && !config.rows)) {
+    return emptyExecute
+  }
+
+  const portal = config.portal || ''
+  const rows = config.rows || 0
+
+  const portalLength = Buffer.byteLength(portal)
+  const len = 4 + portalLength + 1 + 4
+  // one extra bit for code
+  const buff = Buffer.allocUnsafe(1 + len)
+  buff[0] = code.execute
+  buff.writeInt32BE(len, 1)
+  buff.write(portal, 5, 'utf-8')
+  buff[portalLength + 5] = 0 // null terminate portal cString
+  buff.writeUInt32BE(rows, buff.length - 4)
+  return buff
+}
+
+const cancel = (processID: number, secretKey: number): Buffer => {
+  const buffer = Buffer.allocUnsafe(16)
+  buffer.writeInt32BE(16, 0)
+  buffer.writeInt16BE(1234, 4)
+  buffer.writeInt16BE(5678, 6)
+  buffer.writeInt32BE(processID, 8)
+  buffer.writeInt32BE(secretKey, 12)
+  return buffer
+}
+
+type PortalOpts = {
+  type: 'S' | 'P'
+  name?: string
+}
+
+const cstringMessage = (code: code, string: string): Buffer => {
+  const stringLen = Buffer.byteLength(string)
+  const len = 4 + stringLen + 1
+  // one extra bit for code
+  const buffer = Buffer.allocUnsafe(1 + len)
+  buffer[0] = code
+  buffer.writeInt32BE(len, 1)
+  buffer.write(string, 5, 'utf-8')
+  buffer[len] = 0 // null terminate cString
+  return buffer
+}
+
+const emptyDescribePortal = writer.addCString('P').flush(code.describe)
+const emptyDescribeStatement = writer.addCString('S').flush(code.describe)
+
+const describe = (msg: PortalOpts): Buffer => {
+  return msg.name
+    ? cstringMessage(code.describe, `${msg.type}${msg.name || ''}`)
+    : msg.type === 'P'
+    ? emptyDescribePortal
+    : emptyDescribeStatement
+}
+
+const close = (msg: PortalOpts): Buffer => {
+  const text = `${msg.type}${msg.name || ''}`
+  return cstringMessage(code.close, text)
+}
+
+const copyData = (chunk: Buffer): Buffer => {
+  return writer.add(chunk).flush(code.copyFromChunk)
+}
+
+const copyFail = (message: string): Buffer => {
+  return cstringMessage(code.copyFail, message)
+}
+
+const codeOnlyBuffer = (code: code): Buffer => Buffer.from([code, 0x00, 0x00, 0x00, 0x04])
+
+const flushBuffer = codeOnlyBuffer(code.flush)
+const syncBuffer = codeOnlyBuffer(code.sync)
+const endBuffer = codeOnlyBuffer(code.end)
+const copyDoneBuffer = codeOnlyBuffer(code.copyDone)
+
+const serialize = {
+  startup,
+  password,
+  requestSsl,
+  sendSASLInitialResponseMessage,
+  sendSCRAMClientFinalMessage,
+  query,
+  parse,
+  bind,
+  execute,
+  describe,
+  close,
+  flush: () => flushBuffer,
+  sync: () => syncBuffer,
+  end: () => endBuffer,
+  copyData,
+  copyDone: () => copyDoneBuffer,
+  copyFail,
+  cancel,
+}
+
+export { serialize }
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/testing/buffer-list.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/testing/buffer-list.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/testing/buffer-list.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,67 @@
+export default class BufferList {
+  constructor(public buffers: Buffer[] = []) {}
+
+  public add(buffer: Buffer, front?: boolean) {
+    this.buffers[front ? 'unshift' : 'push'](buffer)
+    return this
+  }
+
+  public addInt16(val: number, front?: boolean) {
+    return this.add(Buffer.from([val >>> 8, val >>> 0]), front)
+  }
+
+  public getByteLength() {
+    return this.buffers.reduce(function (previous, current) {
+      return previous + current.length
+    }, 0)
+  }
+
+  public addInt32(val: number, first?: boolean) {
+    return this.add(
+      Buffer.from([(val >>> 24) & 0xff, (val >>> 16) & 0xff, (val >>> 8) & 0xff, (val >>> 0) & 0xff]),
+      first
+    )
+  }
+
+  public addCString(val: string, front?: boolean) {
+    const len = Buffer.byteLength(val)
+    const buffer = Buffer.alloc(len + 1)
+    buffer.write(val)
+    buffer[len] = 0
+    return this.add(buffer, front)
+  }
+
+  public addString(val: string, front?: boolean) {
+    const len = Buffer.byteLength(val)
+    const buffer = Buffer.alloc(len)
+    buffer.write(val)
+    return this.add(buffer, front)
+  }
+
+  public addChar(char: string, first?: boolean) {
+    return this.add(Buffer.from(char, 'utf8'), first)
+  }
+
+  public addByte(byte: number) {
+    return this.add(Buffer.from([byte]))
+  }
+
+  public join(appendLength?: boolean, char?: string): Buffer {
+    let length = this.getByteLength()
+    if (appendLength) {
+      this.addInt32(length + 4, true)
+      return this.join(false, char)
+    }
+    if (char) {
+      this.addChar(char, true)
+      length++
+    }
+    const result = Buffer.alloc(length)
+    let index = 0
+    this.buffers.forEach(function (buffer) {
+      buffer.copy(result, index, 0)
+      index += buffer.length
+    })
+    return result
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/testing/test-buffers.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/testing/test-buffers.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/testing/test-buffers.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,166 @@
+// https://www.postgresql.org/docs/current/protocol-message-formats.html
+import BufferList from './buffer-list'
+
+const buffers = {
+  readyForQuery: function () {
+    return new BufferList().add(Buffer.from('I')).join(true, 'Z')
+  },
+
+  authenticationOk: function () {
+    return new BufferList().addInt32(0).join(true, 'R')
+  },
+
+  authenticationCleartextPassword: function () {
+    return new BufferList().addInt32(3).join(true, 'R')
+  },
+
+  authenticationMD5Password: function () {
+    return new BufferList()
+      .addInt32(5)
+      .add(Buffer.from([1, 2, 3, 4]))
+      .join(true, 'R')
+  },
+
+  authenticationSASL: function () {
+    return new BufferList().addInt32(10).addCString('SCRAM-SHA-256').addCString('').join(true, 'R')
+  },
+
+  authenticationSASLContinue: function () {
+    return new BufferList().addInt32(11).addString('data').join(true, 'R')
+  },
+
+  authenticationSASLFinal: function () {
+    return new BufferList().addInt32(12).addString('data').join(true, 'R')
+  },
+
+  parameterStatus: function (name: string, value: string) {
+    return new BufferList().addCString(name).addCString(value).join(true, 'S')
+  },
+
+  backendKeyData: function (processID: number, secretKey: number) {
+    return new BufferList().addInt32(processID).addInt32(secretKey).join(true, 'K')
+  },
+
+  commandComplete: function (string: string) {
+    return new BufferList().addCString(string).join(true, 'C')
+  },
+
+  rowDescription: function (fields: any[]) {
+    fields = fields || []
+    const buf = new BufferList()
+    buf.addInt16(fields.length)
+    fields.forEach(function (field) {
+      buf
+        .addCString(field.name)
+        .addInt32(field.tableID || 0)
+        .addInt16(field.attributeNumber || 0)
+        .addInt32(field.dataTypeID || 0)
+        .addInt16(field.dataTypeSize || 0)
+        .addInt32(field.typeModifier || 0)
+        .addInt16(field.formatCode || 0)
+    })
+    return buf.join(true, 'T')
+  },
+
+  parameterDescription: function (dataTypeIDs: number[]) {
+    dataTypeIDs = dataTypeIDs || []
+    const buf = new BufferList()
+    buf.addInt16(dataTypeIDs.length)
+    dataTypeIDs.forEach(function (dataTypeID) {
+      buf.addInt32(dataTypeID)
+    })
+    return buf.join(true, 't')
+  },
+
+  dataRow: function (columns: any[]) {
+    columns = columns || []
+    const buf = new BufferList()
+    buf.addInt16(columns.length)
+    columns.forEach(function (col) {
+      if (col == null) {
+        buf.addInt32(-1)
+      } else {
+        const strBuf = Buffer.from(col, 'utf8')
+        buf.addInt32(strBuf.length)
+        buf.add(strBuf)
+      }
+    })
+    return buf.join(true, 'D')
+  },
+
+  error: function (fields: any) {
+    return buffers.errorOrNotice(fields).join(true, 'E')
+  },
+
+  notice: function (fields: any) {
+    return buffers.errorOrNotice(fields).join(true, 'N')
+  },
+
+  errorOrNotice: function (fields: any) {
+    fields = fields || []
+    const buf = new BufferList()
+    fields.forEach(function (field: any) {
+      buf.addChar(field.type)
+      buf.addCString(field.value)
+    })
+    return buf.add(Buffer.from([0])) // terminator
+  },
+
+  parseComplete: function () {
+    return new BufferList().join(true, '1')
+  },
+
+  bindComplete: function () {
+    return new BufferList().join(true, '2')
+  },
+
+  notification: function (id: number, channel: string, payload: string) {
+    return new BufferList().addInt32(id).addCString(channel).addCString(payload).join(true, 'A')
+  },
+
+  emptyQuery: function () {
+    return new BufferList().join(true, 'I')
+  },
+
+  portalSuspended: function () {
+    return new BufferList().join(true, 's')
+  },
+
+  closeComplete: function () {
+    return new BufferList().join(true, '3')
+  },
+
+  copyIn: function (cols: number) {
+    const list = new BufferList()
+      // text mode
+      .addByte(0)
+      // column count
+      .addInt16(cols)
+    for (let i = 0; i < cols; i++) {
+      list.addInt16(i)
+    }
+    return list.join(true, 'G')
+  },
+
+  copyOut: function (cols: number) {
+    const list = new BufferList()
+      // text mode
+      .addByte(0)
+      // column count
+      .addInt16(cols)
+    for (let i = 0; i < cols; i++) {
+      list.addInt16(i)
+    }
+    return list.join(true, 'H')
+  },
+
+  copyData: function (bytes: Buffer) {
+    return new BufferList().add(bytes).join(true, 'd')
+  },
+
+  copyDone: function () {
+    return new BufferList().join(true, 'c')
+  },
+}
+
+export default buffers
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/types/chunky.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/types/chunky.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-protocol/src/types/chunky.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+declare module 'chunky'
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/.travis.yml
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/.travis.yml	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/.travis.yml	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,7 @@
+language: node_js
+node_js:
+  - '4'
+  - 'lts/*'
+  - 'node'
+env:
+  - PGUSER=postgres
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/Makefile
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/Makefile	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/Makefile	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,14 @@
+.PHONY: publish-patch test
+
+test:
+	npm test
+
+patch: test
+	npm version patch -m "Bump version"
+	git push origin master --tags
+	npm publish
+
+minor: test
+	npm version minor -m "Bump version"
+	git push origin master --tags
+	npm publish
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,75 @@
+# pg-types
+
+This is the code that turns all the raw text from postgres into JavaScript types for [node-postgres](https://github.com/brianc/node-postgres.git)
+
+## use
+
+This module is consumed and exported from the root `pg` object of node-postgres.  To access it, do the following:
+
+```js
+var types = require('pg').types
+```
+
+Generally what you'll want to do is override how a specific data-type is parsed and turned into a JavaScript type.  By default the PostgreSQL backend server returns everything as strings.  Every data type corresponds to a unique `OID` within the server, and these `OIDs` are sent back with the query response.  So, you need to match a particluar `OID` to a function you'd like to use to take the raw text input and produce a valid JavaScript object as a result. `null` values are never parsed.
+
+Let's do something I commonly like to do on projects: return 64-bit integers `(int8)` as JavaScript integers.  Because JavaScript doesn't have support for 64-bit integers node-postgres cannot confidently parse `int8` data type results as numbers because if you have a _huge_ number it will overflow and the result you'd get back from node-postgres would not be the result in the datbase.  That would be a __very bad thing__ so node-postgres just returns `int8` results as strings and leaves the parsing up to you.  Let's say that you know you don't and wont ever have numbers greater than `int4` in your database, but you're tired of recieving results from the `COUNT(*)` function as strings (because that function returns `int8`).  You would do this:
+
+```js
+var types = require('pg').types
+types.setTypeParser(20, function(val) {
+  return parseInt(val)
+})
+```
+
+__boom__: now you get numbers instead of strings.
+
+Just as another example -- not saying this is a good idea -- let's say you want to return all dates from your database as [moment](http://momentjs.com/docs/) objects.  Okay, do this:
+
+```js
+var types = require('pg').types
+var moment = require('moment')
+var parseFn = function(val) {
+   return val === null ? null : moment(val)
+}
+types.setTypeParser(types.builtins.TIMESTAMPTZ, parseFn)
+types.setTypeParser(types.builtins.TIMESTAMP, parseFn)
+```
+_note: I've never done that with my dates, and I'm not 100% sure moment can parse all the date strings returned from postgres.  It's just an example!_
+
+If you're thinking "gee, this seems pretty handy, but how can I get a list of all the OIDs in the database and what they correspond to?!?!?!" worry not:
+
+```bash
+$ psql -c "select typname, oid, typarray from pg_type order by oid"
+```
+
+If you want to find out the OID of a specific type:
+
+```bash
+$ psql -c "select typname, oid, typarray from pg_type where typname = 'daterange' order by oid"
+```
+
+:smile:
+
+## license
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,137 @@
+export enum TypeId {
+    BOOL = 16,
+    BYTEA = 17,
+    CHAR = 18,
+    INT8 = 20,
+    INT2 = 21,
+    INT4 = 23,
+    REGPROC = 24,
+    TEXT = 25,
+    OID = 26,
+    TID = 27,
+    XID = 28,
+    CID = 29,
+    JSON = 114,
+    XML = 142,
+    PG_NODE_TREE = 194,
+    SMGR = 210,
+    PATH = 602,
+    POLYGON = 604,
+    CIDR = 650,
+    FLOAT4 = 700,
+    FLOAT8 = 701,
+    ABSTIME = 702,
+    RELTIME = 703,
+    TINTERVAL = 704,
+    CIRCLE = 718,
+    MACADDR8 = 774,
+    MONEY = 790,
+    MACADDR = 829,
+    INET = 869,
+    ACLITEM = 1033,
+    BPCHAR = 1042,
+    VARCHAR = 1043,
+    DATE = 1082,
+    TIME = 1083,
+    TIMESTAMP = 1114,
+    TIMESTAMPTZ = 1184,
+    INTERVAL = 1186,
+    TIMETZ = 1266,
+    BIT = 1560,
+    VARBIT = 1562,
+    NUMERIC = 1700,
+    REFCURSOR = 1790,
+    REGPROCEDURE = 2202,
+    REGOPER = 2203,
+    REGOPERATOR = 2204,
+    REGCLASS = 2205,
+    REGTYPE = 2206,
+    UUID = 2950,
+    TXID_SNAPSHOT = 2970,
+    PG_LSN = 3220,
+    PG_NDISTINCT = 3361,
+    PG_DEPENDENCIES = 3402,
+    TSVECTOR = 3614,
+    TSQUERY = 3615,
+    GTSVECTOR = 3642,
+    REGCONFIG = 3734,
+    REGDICTIONARY = 3769,
+    JSONB = 3802,
+    REGNAMESPACE = 4089,
+    REGROLE = 4096
+}
+
+export type builtinsTypes =
+    'BOOL' |
+    'BYTEA' |
+    'CHAR' |
+    'INT8' |
+    'INT2' |
+    'INT4' |
+    'REGPROC' |
+    'TEXT' |
+    'OID' |
+    'TID' |
+    'XID' |
+    'CID' |
+    'JSON' |
+    'XML' |
+    'PG_NODE_TREE' |
+    'SMGR' |
+    'PATH' |
+    'POLYGON' |
+    'CIDR' |
+    'FLOAT4' |
+    'FLOAT8' |
+    'ABSTIME' |
+    'RELTIME' |
+    'TINTERVAL' |
+    'CIRCLE' |
+    'MACADDR8' |
+    'MONEY' |
+    'MACADDR' |
+    'INET' |
+    'ACLITEM' |
+    'BPCHAR' |
+    'VARCHAR' |
+    'DATE' |
+    'TIME' |
+    'TIMESTAMP' |
+    'TIMESTAMPTZ' |
+    'INTERVAL' |
+    'TIMETZ' |
+    'BIT' |
+    'VARBIT' |
+    'NUMERIC' |
+    'REFCURSOR' |
+    'REGPROCEDURE' |
+    'REGOPER' |
+    'REGOPERATOR' |
+    'REGCLASS' |
+    'REGTYPE' |
+    'UUID' |
+    'TXID_SNAPSHOT' |
+    'PG_LSN' |
+    'PG_NDISTINCT' |
+    'PG_DEPENDENCIES' |
+    'TSVECTOR' |
+    'TSQUERY' |
+    'GTSVECTOR' |
+    'REGCONFIG' |
+    'REGDICTIONARY' |
+    'JSONB' |
+    'REGNAMESPACE' |
+    'REGROLE';
+
+export type TypesBuiltins = {[key in builtinsTypes]: TypeId};
+
+export type TypeFormat = 'text' | 'binary';
+
+export const builtins: TypesBuiltins;
+
+export function setTypeParser (id: TypeId, parseFn: ((value: string) => any)): void;
+export function setTypeParser (id: TypeId, format: TypeFormat, parseFn: (value: string) => any): void;
+
+export const getTypeParser: (id: TypeId, format?: TypeFormat) => any
+
+export const arrayParser: (source: string, transform: (entry: any) => any) => any[];
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,47 @@
+var textParsers = require('./lib/textParsers');
+var binaryParsers = require('./lib/binaryParsers');
+var arrayParser = require('./lib/arrayParser');
+var builtinTypes = require('./lib/builtins');
+
+exports.getTypeParser = getTypeParser;
+exports.setTypeParser = setTypeParser;
+exports.arrayParser = arrayParser;
+exports.builtins = builtinTypes;
+
+var typeParsers = {
+  text: {},
+  binary: {}
+};
+
+//the empty parse function
+function noParse (val) {
+  return String(val);
+};
+
+//returns a function used to convert a specific type (specified by
+//oid) into a result javascript type
+//note: the oid can be obtained via the following sql query:
+//SELECT oid FROM pg_type WHERE typname = 'TYPE_NAME_HERE';
+function getTypeParser (oid, format) {
+  format = format || 'text';
+  if (!typeParsers[format]) {
+    return noParse;
+  }
+  return typeParsers[format][oid] || noParse;
+};
+
+function setTypeParser (oid, format, parseFn) {
+  if(typeof format == 'function') {
+    parseFn = format;
+    format = 'text';
+  }
+  typeParsers[format][oid] = parseFn;
+};
+
+textParsers.init(function(oid, converter) {
+  typeParsers.text[oid] = converter;
+});
+
+binaryParsers.init(function(oid, converter) {
+  typeParsers.binary[oid] = converter;
+});
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.test-d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.test-d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/index.test-d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+import * as types from '.';
+import { expectType } from 'tsd';
+
+// builtins
+expectType<types.TypesBuiltins>(types.builtins);
+
+// getTypeParser
+const noParse = types.getTypeParser(types.builtins.NUMERIC, 'text');
+const numericParser = types.getTypeParser(types.builtins.NUMERIC, 'binary');
+expectType<string>(noParse('noParse'));
+expectType<number>(numericParser([200, 1, 0, 15]));
+
+// getArrayParser 
+const value = types.arrayParser('{1,2,3}', (num) => parseInt(num));
+expectType<number[]>(value);
+
+//setTypeParser
+types.setTypeParser(types.builtins.INT8, parseInt);
+types.setTypeParser(types.builtins.FLOAT8, parseFloat);
+types.setTypeParser(types.builtins.FLOAT8, 'binary', (data) => data[0]);
+types.setTypeParser(types.builtins.FLOAT8, 'text', parseFloat);
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/arrayParser.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/arrayParser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/arrayParser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,11 @@
+var array = require('postgres-array');
+
+module.exports = {
+  create: function (source, transform) {
+    return {
+      parse: function() {
+        return array.parse(source, transform);
+      }
+    };
+  }
+};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/binaryParsers.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/binaryParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/binaryParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,257 @@
+var parseInt64 = require('pg-int8');
+
+var parseBits = function(data, bits, offset, invert, callback) {
+  offset = offset || 0;
+  invert = invert || false;
+  callback = callback || function(lastValue, newValue, bits) { return (lastValue * Math.pow(2, bits)) + newValue; };
+  var offsetBytes = offset >> 3;
+
+  var inv = function(value) {
+    if (invert) {
+      return ~value & 0xff;
+    }
+
+    return value;
+  };
+
+  // read first (maybe partial) byte
+  var mask = 0xff;
+  var firstBits = 8 - (offset % 8);
+  if (bits < firstBits) {
+    mask = (0xff << (8 - bits)) & 0xff;
+    firstBits = bits;
+  }
+
+  if (offset) {
+    mask = mask >> (offset % 8);
+  }
+
+  var result = 0;
+  if ((offset % 8) + bits >= 8) {
+    result = callback(0, inv(data[offsetBytes]) & mask, firstBits);
+  }
+
+  // read bytes
+  var bytes = (bits + offset) >> 3;
+  for (var i = offsetBytes + 1; i < bytes; i++) {
+    result = callback(result, inv(data[i]), 8);
+  }
+
+  // bits to read, that are not a complete byte
+  var lastBits = (bits + offset) % 8;
+  if (lastBits > 0) {
+    result = callback(result, inv(data[bytes]) >> (8 - lastBits), lastBits);
+  }
+
+  return result;
+};
+
+var parseFloatFromBits = function(data, precisionBits, exponentBits) {
+  var bias = Math.pow(2, exponentBits - 1) - 1;
+  var sign = parseBits(data, 1);
+  var exponent = parseBits(data, exponentBits, 1);
+
+  if (exponent === 0) {
+    return 0;
+  }
+
+  // parse mantissa
+  var precisionBitsCounter = 1;
+  var parsePrecisionBits = function(lastValue, newValue, bits) {
+    if (lastValue === 0) {
+      lastValue = 1;
+    }
+
+    for (var i = 1; i <= bits; i++) {
+      precisionBitsCounter /= 2;
+      if ((newValue & (0x1 << (bits - i))) > 0) {
+        lastValue += precisionBitsCounter;
+      }
+    }
+
+    return lastValue;
+  };
+
+  var mantissa = parseBits(data, precisionBits, exponentBits + 1, false, parsePrecisionBits);
+
+  // special cases
+  if (exponent == (Math.pow(2, exponentBits + 1) - 1)) {
+    if (mantissa === 0) {
+      return (sign === 0) ? Infinity : -Infinity;
+    }
+
+    return NaN;
+  }
+
+  // normale number
+  return ((sign === 0) ? 1 : -1) * Math.pow(2, exponent - bias) * mantissa;
+};
+
+var parseInt16 = function(value) {
+  if (parseBits(value, 1) == 1) {
+    return -1 * (parseBits(value, 15, 1, true) + 1);
+  }
+
+  return parseBits(value, 15, 1);
+};
+
+var parseInt32 = function(value) {
+  if (parseBits(value, 1) == 1) {
+    return -1 * (parseBits(value, 31, 1, true) + 1);
+  }
+
+  return parseBits(value, 31, 1);
+};
+
+var parseFloat32 = function(value) {
+  return parseFloatFromBits(value, 23, 8);
+};
+
+var parseFloat64 = function(value) {
+  return parseFloatFromBits(value, 52, 11);
+};
+
+var parseNumeric = function(value) {
+  var sign = parseBits(value, 16, 32);
+  if (sign == 0xc000) {
+    return NaN;
+  }
+
+  var weight = Math.pow(10000, parseBits(value, 16, 16));
+  var result = 0;
+
+  var digits = [];
+  var ndigits = parseBits(value, 16);
+  for (var i = 0; i < ndigits; i++) {
+    result += parseBits(value, 16, 64 + (16 * i)) * weight;
+    weight /= 10000;
+  }
+
+  var scale = Math.pow(10, parseBits(value, 16, 48));
+  return ((sign === 0) ? 1 : -1) * Math.round(result * scale) / scale;
+};
+
+var parseDate = function(isUTC, value) {
+  var sign = parseBits(value, 1);
+  var rawValue = parseBits(value, 63, 1);
+
+  // discard usecs and shift from 2000 to 1970
+  var result = new Date((((sign === 0) ? 1 : -1) * rawValue / 1000) + 946684800000);
+
+  if (!isUTC) {
+    result.setTime(result.getTime() + result.getTimezoneOffset() * 60000);
+  }
+
+  // add microseconds to the date
+  result.usec = rawValue % 1000;
+  result.getMicroSeconds = function() {
+    return this.usec;
+  };
+  result.setMicroSeconds = function(value) {
+    this.usec = value;
+  };
+  result.getUTCMicroSeconds = function() {
+    return this.usec;
+  };
+
+  return result;
+};
+
+var parseArray = function(value) {
+  var dim = parseBits(value, 32);
+
+  var flags = parseBits(value, 32, 32);
+  var elementType = parseBits(value, 32, 64);
+
+  var offset = 96;
+  var dims = [];
+  for (var i = 0; i < dim; i++) {
+    // parse dimension
+    dims[i] = parseBits(value, 32, offset);
+    offset += 32;
+
+    // ignore lower bounds
+    offset += 32;
+  }
+
+  var parseElement = function(elementType) {
+    // parse content length
+    var length = parseBits(value, 32, offset);
+    offset += 32;
+
+    // parse null values
+    if (length == 0xffffffff) {
+      return null;
+    }
+
+    var result;
+    if ((elementType == 0x17) || (elementType == 0x14)) {
+      // int/bigint
+      result = parseBits(value, length * 8, offset);
+      offset += length * 8;
+      return result;
+    }
+    else if (elementType == 0x19) {
+      // string
+      result = value.toString(this.encoding, offset >> 3, (offset += (length << 3)) >> 3);
+      return result;
+    }
+    else {
+      console.log("ERROR: ElementType not implemented: " + elementType);
+    }
+  };
+
+  var parse = function(dimension, elementType) {
+    var array = [];
+    var i;
+
+    if (dimension.length > 1) {
+      var count = dimension.shift();
+      for (i = 0; i < count; i++) {
+        array[i] = parse(dimension, elementType);
+      }
+      dimension.unshift(count);
+    }
+    else {
+      for (i = 0; i < dimension[0]; i++) {
+        array[i] = parseElement(elementType);
+      }
+    }
+
+    return array;
+  };
+
+  return parse(dims, elementType);
+};
+
+var parseText = function(value) {
+  return value.toString('utf8');
+};
+
+var parseBool = function(value) {
+  if(value === null) return null;
+  return (parseBits(value, 8) > 0);
+};
+
+var init = function(register) {
+  register(20, parseInt64);
+  register(21, parseInt16);
+  register(23, parseInt32);
+  register(26, parseInt32);
+  register(1700, parseNumeric);
+  register(700, parseFloat32);
+  register(701, parseFloat64);
+  register(16, parseBool);
+  register(1114, parseDate.bind(null, false));
+  register(1184, parseDate.bind(null, true));
+  register(1000, parseArray);
+  register(1007, parseArray);
+  register(1016, parseArray);
+  register(1008, parseArray);
+  register(1009, parseArray);
+  register(25, parseText);
+};
+
+module.exports = {
+  init: init
+};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/builtins.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/builtins.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/builtins.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,73 @@
+/**
+ * Following query was used to generate this file:
+
+ SELECT json_object_agg(UPPER(PT.typname), PT.oid::int4 ORDER BY pt.oid)
+ FROM pg_type PT
+ WHERE typnamespace = (SELECT pgn.oid FROM pg_namespace pgn WHERE nspname = 'pg_catalog') -- Take only builting Postgres types with stable OID (extension types are not guaranted to be stable)
+ AND typtype = 'b' -- Only basic types
+ AND typelem = 0 -- Ignore aliases
+ AND typisdefined -- Ignore undefined types
+ */
+
+module.exports = {
+    BOOL: 16,
+    BYTEA: 17,
+    CHAR: 18,
+    INT8: 20,
+    INT2: 21,
+    INT4: 23,
+    REGPROC: 24,
+    TEXT: 25,
+    OID: 26,
+    TID: 27,
+    XID: 28,
+    CID: 29,
+    JSON: 114,
+    XML: 142,
+    PG_NODE_TREE: 194,
+    SMGR: 210,
+    PATH: 602,
+    POLYGON: 604,
+    CIDR: 650,
+    FLOAT4: 700,
+    FLOAT8: 701,
+    ABSTIME: 702,
+    RELTIME: 703,
+    TINTERVAL: 704,
+    CIRCLE: 718,
+    MACADDR8: 774,
+    MONEY: 790,
+    MACADDR: 829,
+    INET: 869,
+    ACLITEM: 1033,
+    BPCHAR: 1042,
+    VARCHAR: 1043,
+    DATE: 1082,
+    TIME: 1083,
+    TIMESTAMP: 1114,
+    TIMESTAMPTZ: 1184,
+    INTERVAL: 1186,
+    TIMETZ: 1266,
+    BIT: 1560,
+    VARBIT: 1562,
+    NUMERIC: 1700,
+    REFCURSOR: 1790,
+    REGPROCEDURE: 2202,
+    REGOPER: 2203,
+    REGOPERATOR: 2204,
+    REGCLASS: 2205,
+    REGTYPE: 2206,
+    UUID: 2950,
+    TXID_SNAPSHOT: 2970,
+    PG_LSN: 3220,
+    PG_NDISTINCT: 3361,
+    PG_DEPENDENCIES: 3402,
+    TSVECTOR: 3614,
+    TSQUERY: 3615,
+    GTSVECTOR: 3642,
+    REGCONFIG: 3734,
+    REGDICTIONARY: 3769,
+    JSONB: 3802,
+    REGNAMESPACE: 4089,
+    REGROLE: 4096
+};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/textParsers.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/textParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/lib/textParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,215 @@
+var array = require('postgres-array')
+var arrayParser = require('./arrayParser');
+var parseDate = require('postgres-date');
+var parseInterval = require('postgres-interval');
+var parseByteA = require('postgres-bytea');
+
+function allowNull (fn) {
+  return function nullAllowed (value) {
+    if (value === null) return value
+    return fn(value)
+  }
+}
+
+function parseBool (value) {
+  if (value === null) return value
+  return value === 'TRUE' ||
+    value === 't' ||
+    value === 'true' ||
+    value === 'y' ||
+    value === 'yes' ||
+    value === 'on' ||
+    value === '1';
+}
+
+function parseBoolArray (value) {
+  if (!value) return null
+  return array.parse(value, parseBool)
+}
+
+function parseBaseTenInt (string) {
+  return parseInt(string, 10)
+}
+
+function parseIntegerArray (value) {
+  if (!value) return null
+  return array.parse(value, allowNull(parseBaseTenInt))
+}
+
+function parseBigIntegerArray (value) {
+  if (!value) return null
+  return array.parse(value, allowNull(function (entry) {
+    return parseBigInteger(entry).trim()
+  }))
+}
+
+var parsePointArray = function(value) {
+  if(!value) { return null; }
+  var p = arrayParser.create(value, function(entry) {
+    if(entry !== null) {
+      entry = parsePoint(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseFloatArray = function(value) {
+  if(!value) { return null; }
+  var p = arrayParser.create(value, function(entry) {
+    if(entry !== null) {
+      entry = parseFloat(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseStringArray = function(value) {
+  if(!value) { return null; }
+
+  var p = arrayParser.create(value);
+  return p.parse();
+};
+
+var parseDateArray = function(value) {
+  if (!value) { return null; }
+
+  var p = arrayParser.create(value, function(entry) {
+    if (entry !== null) {
+      entry = parseDate(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseIntervalArray = function(value) {
+  if (!value) { return null; }
+
+  var p = arrayParser.create(value, function(entry) {
+    if (entry !== null) {
+      entry = parseInterval(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseByteAArray = function(value) {
+  if (!value) { return null; }
+
+  return array.parse(value, allowNull(parseByteA));
+};
+
+var parseInteger = function(value) {
+  return parseInt(value, 10);
+};
+
+var parseBigInteger = function(value) {
+  var valStr = String(value);
+  if (/^\d+$/.test(valStr)) { return valStr; }
+  return value;
+};
+
+var parseJsonArray = function(value) {
+  if (!value) { return null; }
+
+  return array.parse(value, allowNull(JSON.parse));
+};
+
+var parsePoint = function(value) {
+  if (value[0] !== '(') { return null; }
+
+  value = value.substring( 1, value.length - 1 ).split(',');
+
+  return {
+    x: parseFloat(value[0])
+  , y: parseFloat(value[1])
+  };
+};
+
+var parseCircle = function(value) {
+  if (value[0] !== '<' && value[1] !== '(') { return null; }
+
+  var point = '(';
+  var radius = '';
+  var pointParsed = false;
+  for (var i = 2; i < value.length - 1; i++){
+    if (!pointParsed) {
+      point += value[i];
+    }
+
+    if (value[i] === ')') {
+      pointParsed = true;
+      continue;
+    } else if (!pointParsed) {
+      continue;
+    }
+
+    if (value[i] === ','){
+      continue;
+    }
+
+    radius += value[i];
+  }
+  var result = parsePoint(point);
+  result.radius = parseFloat(radius);
+
+  return result;
+};
+
+var init = function(register) {
+  register(20, parseBigInteger); // int8
+  register(21, parseInteger); // int2
+  register(23, parseInteger); // int4
+  register(26, parseInteger); // oid
+  register(700, parseFloat); // float4/real
+  register(701, parseFloat); // float8/double
+  register(16, parseBool);
+  register(1082, parseDate); // date
+  register(1114, parseDate); // timestamp without timezone
+  register(1184, parseDate); // timestamp
+  register(600, parsePoint); // point
+  register(651, parseStringArray); // cidr[]
+  register(718, parseCircle); // circle
+  register(1000, parseBoolArray);
+  register(1001, parseByteAArray);
+  register(1005, parseIntegerArray); // _int2
+  register(1007, parseIntegerArray); // _int4
+  register(1028, parseIntegerArray); // oid[]
+  register(1016, parseBigIntegerArray); // _int8
+  register(1017, parsePointArray); // point[]
+  register(1021, parseFloatArray); // _float4
+  register(1022, parseFloatArray); // _float8
+  register(1231, parseFloatArray); // _numeric
+  register(1014, parseStringArray); //char
+  register(1015, parseStringArray); //varchar
+  register(1008, parseStringArray);
+  register(1009, parseStringArray);
+  register(1040, parseStringArray); // macaddr[]
+  register(1041, parseStringArray); // inet[]
+  register(1115, parseDateArray); // timestamp without time zone[]
+  register(1182, parseDateArray); // _date
+  register(1185, parseDateArray); // timestamp with time zone[]
+  register(1186, parseInterval);
+  register(1187, parseIntervalArray);
+  register(17, parseByteA);
+  register(114, JSON.parse.bind(JSON)); // json
+  register(3802, JSON.parse.bind(JSON)); // jsonb
+  register(199, parseJsonArray); // json[]
+  register(3807, parseJsonArray); // jsonb[]
+  register(3907, parseStringArray); // numrange[]
+  register(2951, parseStringArray); // uuid[]
+  register(791, parseStringArray); // money[]
+  register(1183, parseStringArray); // time[]
+  register(1270, parseStringArray); // timetz[]
+};
+
+module.exports = {
+  init: init
+};
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,42 @@
+{
+  "name": "pg-types",
+  "version": "2.2.0",
+  "description": "Query result type converters for node-postgres",
+  "main": "index.js",
+  "scripts": {
+    "test": "tape test/*.js | tap-spec && npm run test-ts",
+    "test-ts": "if-node-version '>= 8' tsd"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-pg-types.git"
+  },
+  "keywords": [
+    "postgres",
+    "PostgreSQL",
+    "pg"
+  ],
+  "author": "Brian M. Carlson",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/brianc/node-pg-types/issues"
+  },
+  "homepage": "https://github.com/brianc/node-pg-types",
+  "devDependencies": {
+    "if-node-version": "^1.1.1",
+    "pff": "^1.0.0",
+    "tap-spec": "^4.0.0",
+    "tape": "^4.0.0",
+    "tsd": "^0.7.4"
+  },
+  "dependencies": {
+    "pg-int8": "1.0.1",
+    "postgres-array": "~2.0.0",
+    "postgres-bytea": "~1.0.0",
+    "postgres-date": "~1.0.4",
+    "postgres-interval": "^1.1.0"
+  },
+  "engines": {
+    "node": ">=4"
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/test/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/test/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/test/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,24 @@
+
+var test = require('tape')
+var printf = require('pff')
+var getTypeParser = require('../').getTypeParser
+var types = require('./types')
+
+test('types', function (t) {
+  Object.keys(types).forEach(function (typeName) {
+    var type = types[typeName]
+    t.test(typeName, function (t) {
+      var parser = getTypeParser(type.id, type.format)
+      type.tests.forEach(function (tests) {
+        var input = tests[0]
+        var expected = tests[1]
+        var result = parser(input)
+        if (typeof expected === 'function') {
+          return expected(t, result)
+        }
+        t.equal(result, expected)
+      })
+      t.end()
+    })
+  })
+})
Index: TruckSimulator-main/ds-db-ws/node_modules/pg-types/test/types.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg-types/test/types.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg-types/test/types.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,597 @@
+'use strict'
+
+exports['string/varchar'] = {
+  format: 'text',
+  id: 1043,
+  tests: [
+    ['bang', 'bang']
+  ]
+}
+
+exports['integer/int4'] = {
+  format: 'text',
+  id: 23,
+  tests: [
+    ['2147483647', 2147483647]
+  ]
+}
+
+exports['smallint/int2'] = {
+  format: 'text',
+  id: 21,
+  tests: [
+    ['32767', 32767]
+  ]
+}
+
+exports['bigint/int8'] = {
+  format: 'text',
+  id: 20,
+  tests: [
+    ['9223372036854775807', '9223372036854775807']
+  ]
+}
+
+exports.oid = {
+  format: 'text',
+  id: 26,
+  tests: [
+    ['103', 103]
+  ]
+}
+
+var bignum = '31415926535897932384626433832795028841971693993751058.16180339887498948482045868343656381177203091798057628'
+exports.numeric = {
+  format: 'text',
+  id: 1700,
+  tests: [
+    [bignum, bignum]
+  ]
+}
+
+exports['real/float4'] = {
+  format: 'text',
+  id: 700,
+  tests: [
+    ['123.456', 123.456]
+  ]
+}
+
+exports['double precision / float 8'] = {
+  format: 'text',
+  id: 701,
+  tests: [
+    ['12345678.12345678', 12345678.12345678]
+  ]
+}
+
+exports.boolean = {
+  format: 'text',
+  id: 16,
+  tests: [
+    ['TRUE', true],
+    ['t', true],
+    ['true', true],
+    ['y', true],
+    ['yes', true],
+    ['on', true],
+    ['1', true],
+    ['f', false],
+    [null, null]
+  ]
+}
+
+exports.timestamptz = {
+  format: 'text',
+  id: 1184,
+  tests: [
+    [
+      '2010-10-31 14:54:13.74-05:30',
+      dateEquals(2010, 9, 31, 20, 24, 13, 740)
+    ],
+    [
+      '2011-01-23 22:05:00.68-06',
+       dateEquals(2011, 0, 24, 4, 5, 0, 680)
+    ],
+    [
+      '2010-10-30 14:11:12.730838Z',
+      dateEquals(2010, 9, 30, 14, 11, 12, 730)
+    ],
+    [
+      '2010-10-30 13:10:01+05',
+      dateEquals(2010, 9, 30, 8, 10, 1, 0)
+    ]
+  ]
+}
+
+exports.timestamp = {
+  format: 'text',
+  id: 1114,
+  tests: [
+    [
+      '2010-10-31 00:00:00',
+      function (t, value) {
+        t.equal(
+          value.toUTCString(),
+          new Date(2010, 9, 31, 0, 0, 0, 0, 0).toUTCString()
+        )
+        t.equal(
+          value.toString(),
+          new Date(2010, 9, 31, 0, 0, 0, 0, 0, 0).toString()
+        )
+      }
+    ]
+  ]
+}
+
+exports.date = {
+  format: 'text',
+  id: 1082,
+  tests: [
+    ['2010-10-31', function (t, value) {
+      var now = new Date(2010, 9, 31)
+      dateEquals(
+        2010,
+        now.getUTCMonth(),
+        now.getUTCDate(),
+        now.getUTCHours(), 0, 0, 0)(t, value)
+      t.equal(value.getHours(), now.getHours())
+    }]
+  ]
+}
+
+exports.inet = {
+  format: 'text',
+  id: 869,
+  tests: [
+    ['8.8.8.8', '8.8.8.8'],
+    ['2001:4860:4860::8888', '2001:4860:4860::8888'],
+    ['127.0.0.1', '127.0.0.1'],
+    ['fd00:1::40e', 'fd00:1::40e'],
+    ['1.2.3.4', '1.2.3.4']
+  ]
+}
+
+exports.cidr = {
+  format: 'text',
+  id: 650,
+  tests: [
+    ['172.16.0.0/12', '172.16.0.0/12'],
+    ['fe80::/10', 'fe80::/10'],
+    ['fc00::/7', 'fc00::/7'],
+    ['192.168.0.0/24', '192.168.0.0/24'],
+    ['10.0.0.0/8', '10.0.0.0/8']
+  ]
+}
+
+exports.macaddr = {
+  format: 'text',
+  id: 829,
+  tests: [
+    ['08:00:2b:01:02:03', '08:00:2b:01:02:03'],
+    ['16:10:9f:0d:66:00', '16:10:9f:0d:66:00']
+  ]
+}
+
+exports.numrange = {
+  format: 'text',
+  id: 3906,
+  tests: [
+    ['[,]', '[,]'],
+    ['(,)', '(,)'],
+    ['(,]', '(,]'],
+    ['[1,)', '[1,)'],
+    ['[,1]', '[,1]'],
+    ['(1,2)', '(1,2)'],
+    ['(1,20.5]', '(1,20.5]']
+  ]
+}
+
+exports.interval = {
+  format: 'text',
+  id: 1186,
+  tests: [
+    ['01:02:03', function (t, value) {
+      t.equal(value.toPostgres(), '3 seconds 2 minutes 1 hours')
+      t.deepEqual(value, {hours: 1, minutes: 2, seconds: 3})
+    }],
+    ['01:02:03.456', function (t, value) {
+      t.deepEqual(value, {hours: 1, minutes:2, seconds: 3, milliseconds: 456})
+    }],
+    ['1 year -32 days', function (t, value) {
+      t.equal(value.toPostgres(), '-32 days 1 years')
+      t.deepEqual(value, {years: 1, days: -32})
+    }],
+    ['1 day -00:00:03', function (t, value) {
+      t.equal(value.toPostgres(), '-3 seconds 1 days')
+      t.deepEqual(value, {days: 1, seconds: -3})
+    }]
+  ]
+}
+
+exports.bytea = {
+  format: 'text',
+  id: 17,
+  tests: [
+    ['foo\\000\\200\\\\\\377', function (t, value) {
+      var buffer = new Buffer([102, 111, 111, 0, 128, 92, 255])
+      t.ok(buffer.equals(value))
+    }],
+    ['', function (t, value) {
+      var buffer = new Buffer(0)
+      t.ok(buffer.equals(value))
+    }]
+  ]
+}
+
+exports['array/boolean'] = {
+    format: 'text',
+    id: 1000,
+    tests: [
+        ['{true,false}', function (t, value) {
+            t.deepEqual(value, [true, false])
+        }]
+    ]
+}
+
+exports['array/char'] = {
+  format: 'text',
+  id: 1014,
+  tests: [
+    ['{foo,bar}', function (t, value) {
+      t.deepEqual(value, ['foo', 'bar'])
+    }]
+  ]
+}
+
+exports['array/varchar'] = {
+  format: 'text',
+  id: 1015,
+  tests: [
+    ['{foo,bar}', function (t, value) {
+      t.deepEqual(value, ['foo', 'bar'])
+    }]
+  ]
+}
+
+exports['array/text'] = {
+  format: 'text',
+  id: 1008,
+  tests: [
+    ['{foo}', function (t, value) {
+      t.deepEqual(value, ['foo'])
+    }]
+  ]
+}
+
+exports['array/bytea'] = {
+  format: 'text',
+  id: 1001,
+  tests: [
+    ['{"\\\\x00000000"}', function (t, value) {
+      var buffer = new Buffer('00000000', 'hex')
+      t.ok(Array.isArray(value))
+      t.equal(value.length, 1)
+      t.ok(buffer.equals(value[0]))
+    }],
+    ['{NULL,"\\\\x4e554c4c"}', function (t, value) {
+      var buffer = new Buffer('4e554c4c', 'hex')
+      t.ok(Array.isArray(value))
+      t.equal(value.length, 2)
+      t.equal(value[0], null)
+      t.ok(buffer.equals(value[1]))
+    }],
+  ]
+}
+
+exports['array/numeric'] = {
+  format: 'text',
+  id: 1231,
+  tests: [
+    ['{1.2,3.4}', function (t, value) {
+      t.deepEqual(value, [1.2, 3.4])
+    }]
+  ]
+}
+
+exports['array/int2'] = {
+  format: 'text',
+  id: 1005,
+  tests: [
+    ['{-32768, -32767, 32766, 32767}', function (t, value) {
+      t.deepEqual(value, [-32768, -32767, 32766, 32767])
+    }]
+  ]
+}
+
+exports['array/int4'] = {
+  format: 'text',
+  id: 1005,
+  tests: [
+    ['{-2147483648, -2147483647, 2147483646, 2147483647}', function (t, value) {
+      t.deepEqual(value, [-2147483648, -2147483647, 2147483646, 2147483647])
+    }]
+  ]
+}
+
+exports['array/int8'] = {
+  format: 'text',
+  id: 1016,
+  tests: [
+    [
+      '{-9223372036854775808, -9223372036854775807, 9223372036854775806, 9223372036854775807}',
+      function (t, value) {
+        t.deepEqual(value, [
+          '-9223372036854775808',
+          '-9223372036854775807',
+          '9223372036854775806',
+          '9223372036854775807'
+        ])
+      }
+    ]
+  ]
+}
+
+exports['array/json'] = {
+  format: 'text',
+  id: 199,
+  tests: [
+    [
+      '{{1,2},{[3],"[4,5]"},{null,NULL}}',
+      function (t, value) {
+        t.deepEqual(value, [
+          [1, 2],
+          [[3], [4, 5]],
+          [null, null],
+        ])
+      }
+    ]
+  ]
+}
+
+exports['array/jsonb'] = {
+  format: 'text',
+  id: 3807,
+  tests: exports['array/json'].tests
+}
+
+exports['array/point'] = {
+  format: 'text',
+  id: 1017,
+  tests: [
+    ['{"(25.1,50.5)","(10.1,40)"}', function (t, value) {
+      t.deepEqual(value, [{x: 25.1, y: 50.5}, {x: 10.1, y: 40}])
+    }]
+  ]
+}
+
+exports['array/oid'] = {
+  format: 'text',
+  id: 1028,
+  tests: [
+    ['{25864,25860}', function (t, value) {
+      t.deepEqual(value, [25864, 25860])
+    }]
+  ]
+}
+
+exports['array/float4'] = {
+  format: 'text',
+  id: 1021,
+  tests: [
+    ['{1.2, 3.4}', function (t, value) {
+      t.deepEqual(value, [1.2, 3.4])
+    }]
+  ]
+}
+
+exports['array/float8'] = {
+  format: 'text',
+  id: 1022,
+  tests: [
+    ['{-12345678.1234567, 12345678.12345678}', function (t, value) {
+      t.deepEqual(value, [-12345678.1234567, 12345678.12345678])
+    }]
+  ]
+}
+
+exports['array/date'] = {
+  format: 'text',
+  id: 1182,
+  tests: [
+    ['{2014-01-01,2015-12-31}', function (t, value) {
+      var expecteds = [new Date(2014, 0, 1), new Date(2015, 11, 31)]
+      t.equal(value.length, 2)
+      value.forEach(function (date, index) {
+        var expected = expecteds[index]
+        dateEquals(
+          expected.getUTCFullYear(),
+          expected.getUTCMonth(),
+          expected.getUTCDate(),
+          expected.getUTCHours(), 0, 0, 0)(t, date)
+      })
+    }]
+  ]
+}
+
+exports['array/interval'] = {
+  format: 'text',
+  id: 1187,
+  tests: [
+    ['{01:02:03,1 day -00:00:03}', function (t, value) {
+      var expecteds = [{hours: 1, minutes: 2, seconds: 3},
+                       {days: 1, seconds: -3}]
+      t.equal(value.length, 2)
+      t.deepEqual(value, expecteds);
+    }]
+  ]
+}
+
+exports['array/inet'] = {
+  format: 'text',
+  id: 1041,
+  tests: [
+    ['{8.8.8.8}', function (t, value) {
+      t.deepEqual(value, ['8.8.8.8']);
+    }],
+    ['{2001:4860:4860::8888}', function (t, value) {
+      t.deepEqual(value, ['2001:4860:4860::8888']);
+    }],
+    ['{127.0.0.1,fd00:1::40e,1.2.3.4}', function (t, value) {
+      t.deepEqual(value, ['127.0.0.1', 'fd00:1::40e', '1.2.3.4']);
+    }]
+  ]
+}
+
+exports['array/cidr'] = {
+  format: 'text',
+  id: 651,
+  tests: [
+    ['{172.16.0.0/12}', function (t, value) {
+      t.deepEqual(value, ['172.16.0.0/12']);
+    }],
+    ['{fe80::/10}', function (t, value) {
+      t.deepEqual(value, ['fe80::/10']);
+    }],
+    ['{10.0.0.0/8,fc00::/7,192.168.0.0/24}', function (t, value) {
+      t.deepEqual(value, ['10.0.0.0/8', 'fc00::/7', '192.168.0.0/24']);
+    }]
+  ]
+}
+
+exports['array/macaddr'] = {
+  format: 'text',
+  id: 1040,
+  tests: [
+    ['{08:00:2b:01:02:03,16:10:9f:0d:66:00}', function (t, value) {
+      t.deepEqual(value, ['08:00:2b:01:02:03', '16:10:9f:0d:66:00']);
+    }]
+  ]
+}
+
+exports['array/numrange'] = {
+  format: 'text',
+  id: 3907,
+  tests: [
+    ['{"[1,2]","(4.5,8)","[10,40)","(-21.2,60.3]"}', function (t, value) {
+      t.deepEqual(value, ['[1,2]', '(4.5,8)', '[10,40)', '(-21.2,60.3]']);
+    }],
+    ['{"[,20]","[3,]","[,]","(,35)","(1,)","(,)"}', function (t, value) {
+      t.deepEqual(value, ['[,20]', '[3,]', '[,]', '(,35)', '(1,)', '(,)']);
+    }],
+    ['{"[,20)","[3,)","[,)","[,35)","[1,)","[,)"}', function (t, value) {
+      t.deepEqual(value, ['[,20)', '[3,)', '[,)', '[,35)', '[1,)', '[,)']);
+    }]
+  ]
+}
+
+exports['binary-string/varchar'] = {
+  format: 'binary',
+  id: 1043,
+  tests: [
+    ['bang', 'bang']
+  ]
+}
+
+exports['binary-integer/int4'] = {
+  format: 'binary',
+  id: 23,
+  tests: [
+    [[0, 0, 0, 100], 100]
+  ]
+}
+
+exports['binary-smallint/int2'] = {
+  format: 'binary',
+  id: 21,
+  tests: [
+    [[0, 101], 101]
+  ]
+}
+
+exports['binary-bigint/int8'] = {
+  format: 'binary',
+  id: 20,
+  tests: [
+    [new Buffer([0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), '9223372036854775807']
+  ]
+}
+
+exports['binary-oid'] = {
+  format: 'binary',
+  id: 26,
+  tests: [
+    [[0, 0, 0, 103], 103]
+  ]
+}
+
+exports['binary-numeric'] = {
+  format: 'binary',
+  id: 1700,
+  tests: [
+    [
+      [0, 2, 0, 0, 0, 0, 0, hex('0x64'), 0, 12, hex('0xd'), hex('0x48'), 0, 0, 0, 0],
+      12.34
+    ]
+  ]
+}
+
+exports['binary-real/float4'] = {
+  format: 'binary',
+  id: 700,
+  tests: [
+    [['0x41', '0x48', '0x00', '0x00'].map(hex), 12.5]
+  ]
+}
+
+exports['binary-boolean'] = {
+  format: 'binary',
+  id: 16,
+  tests: [
+    [[1], true],
+    [[0], false],
+    [null, null]
+  ]
+}
+
+exports['binary-string'] = {
+  format: 'binary',
+  id: 25,
+  tests: [
+    [
+      new Buffer(['0x73', '0x6c', '0x61', '0x64', '0x64', '0x61'].map(hex)),
+      'sladda'
+    ]
+  ]
+}
+
+exports.point = {
+  format: 'text',
+  id: 600,
+  tests: [
+    ['(25.1,50.5)', function (t, value) {
+      t.deepEqual(value, {x: 25.1, y: 50.5})
+    }]
+  ]
+}
+
+exports.circle = {
+  format: 'text',
+  id: 718,
+  tests: [
+    ['<(25,10),5>', function (t, value) {
+      t.deepEqual(value, {x: 25, y: 10, radius: 5})
+    }]
+  ]
+}
+
+function hex (string) {
+  return parseInt(string, 16)
+}
+
+function dateEquals () {
+  var timestamp = Date.UTC.apply(Date, arguments)
+  return function (t, value) {
+    t.equal(value.toUTCString(), new Date(timestamp).toUTCString())
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2010 - 2021 Brian Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,95 @@
+# node-postgres
+
+[![Build Status](https://secure.travis-ci.org/brianc/node-postgres.svg?branch=master)](http://travis-ci.org/brianc/node-postgres)
+<span class="badge-npmversion"><a href="https://npmjs.org/package/pg" title="View this project on NPM"><img src="https://img.shields.io/npm/v/pg.svg" alt="NPM version" /></a></span>
+<span class="badge-npmdownloads"><a href="https://npmjs.org/package/pg" title="View this project on NPM"><img src="https://img.shields.io/npm/dm/pg.svg" alt="NPM downloads" /></a></span>
+
+Non-blocking PostgreSQL client for Node.js. Pure JavaScript and optional native libpq bindings.
+
+## Install
+
+```sh
+$ npm install pg
+```
+
+---
+
+## :star: [Documentation](https://node-postgres.com) :star:
+
+### Features
+
+- Pure JavaScript client and native libpq bindings share _the same API_
+- Connection pooling
+- Extensible JS ↔ PostgreSQL data-type coercion
+- Supported PostgreSQL features
+  - Parameterized queries
+  - Named statements with query plan caching
+  - Async notifications with `LISTEN/NOTIFY`
+  - Bulk import & export with `COPY TO/COPY FROM`
+
+### Extras
+
+node-postgres is by design pretty light on abstractions. These are some handy modules we've been using over the years to complete the picture.
+The entire list can be found on our [wiki](https://github.com/brianc/node-postgres/wiki/Extras).
+
+## Support
+
+node-postgres is free software. If you encounter a bug with the library please open an issue on the [GitHub repo](https://github.com/brianc/node-postgres). If you have questions unanswered by the documentation please open an issue pointing out how the documentation was unclear & I will do my best to make it better!
+
+When you open an issue please provide:
+
+- version of Node
+- version of Postgres
+- smallest possible snippet of code to reproduce the problem
+
+You can also follow me [@briancarlson](https://twitter.com/briancarlson) if that's your thing. I try to always announce noteworthy changes & developments with node-postgres on Twitter.
+
+## Sponsorship :two_hearts:
+
+node-postgres's continued development has been made possible in part by generous financial support from [the community](https://github.com/brianc/node-postgres/blob/master/SPONSORS.md).
+
+If you or your company are benefiting from node-postgres and would like to help keep the project financially sustainable [please consider supporting](https://github.com/sponsors/brianc) its development.
+
+### Featured sponsor
+
+Special thanks to [medplum](https://medplum.com) for their generous and thoughtful support of node-postgres!
+
+![medplum](https://raw.githubusercontent.com/medplum/medplum-logo/refs/heads/main/medplum-logo.png)
+
+## Contributing
+
+**:heart: contributions!**
+
+I will **happily** accept your pull request if it:
+
+- **has tests**
+- looks reasonable
+- does not break backwards compatibility
+
+If your change involves breaking backwards compatibility please please point that out in the pull request & we can discuss & plan when and how to release it and what type of documentation or communicate it will require.
+
+## Troubleshooting and FAQ
+
+The causes and solutions to common errors can be found among the [Frequently Asked Questions (FAQ)](https://github.com/brianc/node-postgres/wiki/FAQ)
+
+## License
+
+Copyright (c) 2010-2020 Brian Carlson (brian.m.carlson@gmail.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/esm/index.mjs
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,20 @@
+// ESM wrapper for pg
+import pg from '../lib/index.js'
+
+// Re-export all the properties
+export const Client = pg.Client
+export const Pool = pg.Pool
+export const Connection = pg.Connection
+export const types = pg.types
+export const Query = pg.Query
+export const DatabaseError = pg.DatabaseError
+export const escapeIdentifier = pg.escapeIdentifier
+export const escapeLiteral = pg.escapeLiteral
+export const Result = pg.Result
+export const TypeOverrides = pg.TypeOverrides
+
+// Also export the defaults
+export const defaults = pg.defaults
+
+// Re-export the default
+export default pg
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/client.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,650 @@
+'use strict'
+
+const EventEmitter = require('events').EventEmitter
+const utils = require('./utils')
+const sasl = require('./crypto/sasl')
+const TypeOverrides = require('./type-overrides')
+
+const ConnectionParameters = require('./connection-parameters')
+const Query = require('./query')
+const defaults = require('./defaults')
+const Connection = require('./connection')
+const crypto = require('./crypto/utils')
+
+class Client extends EventEmitter {
+  constructor(config) {
+    super()
+
+    this.connectionParameters = new ConnectionParameters(config)
+    this.user = this.connectionParameters.user
+    this.database = this.connectionParameters.database
+    this.port = this.connectionParameters.port
+    this.host = this.connectionParameters.host
+
+    // "hiding" the password so it doesn't show up in stack traces
+    // or if the client is console.logged
+    Object.defineProperty(this, 'password', {
+      configurable: true,
+      enumerable: false,
+      writable: true,
+      value: this.connectionParameters.password,
+    })
+
+    this.replication = this.connectionParameters.replication
+
+    const c = config || {}
+
+    this._Promise = c.Promise || global.Promise
+    this._types = new TypeOverrides(c.types)
+    this._ending = false
+    this._ended = false
+    this._connecting = false
+    this._connected = false
+    this._connectionError = false
+    this._queryable = true
+
+    this.enableChannelBinding = Boolean(c.enableChannelBinding) // set true to use SCRAM-SHA-256-PLUS when offered
+    this.connection =
+      c.connection ||
+      new Connection({
+        stream: c.stream,
+        ssl: this.connectionParameters.ssl,
+        keepAlive: c.keepAlive || false,
+        keepAliveInitialDelayMillis: c.keepAliveInitialDelayMillis || 0,
+        encoding: this.connectionParameters.client_encoding || 'utf8',
+      })
+    this.queryQueue = []
+    this.binary = c.binary || defaults.binary
+    this.processID = null
+    this.secretKey = null
+    this.ssl = this.connectionParameters.ssl || false
+    // As with Password, make SSL->Key (the private key) non-enumerable.
+    // It won't show up in stack traces
+    // or if the client is console.logged
+    if (this.ssl && this.ssl.key) {
+      Object.defineProperty(this.ssl, 'key', {
+        enumerable: false,
+      })
+    }
+
+    this._connectionTimeoutMillis = c.connectionTimeoutMillis || 0
+  }
+
+  _errorAllQueries(err) {
+    const enqueueError = (query) => {
+      process.nextTick(() => {
+        query.handleError(err, this.connection)
+      })
+    }
+
+    if (this.activeQuery) {
+      enqueueError(this.activeQuery)
+      this.activeQuery = null
+    }
+
+    this.queryQueue.forEach(enqueueError)
+    this.queryQueue.length = 0
+  }
+
+  _connect(callback) {
+    const self = this
+    const con = this.connection
+    this._connectionCallback = callback
+
+    if (this._connecting || this._connected) {
+      const err = new Error('Client has already been connected. You cannot reuse a client.')
+      process.nextTick(() => {
+        callback(err)
+      })
+      return
+    }
+    this._connecting = true
+
+    if (this._connectionTimeoutMillis > 0) {
+      this.connectionTimeoutHandle = setTimeout(() => {
+        con._ending = true
+        con.stream.destroy(new Error('timeout expired'))
+      }, this._connectionTimeoutMillis)
+
+      if (this.connectionTimeoutHandle.unref) {
+        this.connectionTimeoutHandle.unref()
+      }
+    }
+
+    if (this.host && this.host.indexOf('/') === 0) {
+      con.connect(this.host + '/.s.PGSQL.' + this.port)
+    } else {
+      con.connect(this.port, this.host)
+    }
+
+    // once connection is established send startup message
+    con.on('connect', function () {
+      if (self.ssl) {
+        con.requestSsl()
+      } else {
+        con.startup(self.getStartupConf())
+      }
+    })
+
+    con.on('sslconnect', function () {
+      con.startup(self.getStartupConf())
+    })
+
+    this._attachListeners(con)
+
+    con.once('end', () => {
+      const error = this._ending ? new Error('Connection terminated') : new Error('Connection terminated unexpectedly')
+
+      clearTimeout(this.connectionTimeoutHandle)
+      this._errorAllQueries(error)
+      this._ended = true
+
+      if (!this._ending) {
+        // if the connection is ended without us calling .end()
+        // on this client then we have an unexpected disconnection
+        // treat this as an error unless we've already emitted an error
+        // during connection.
+        if (this._connecting && !this._connectionError) {
+          if (this._connectionCallback) {
+            this._connectionCallback(error)
+          } else {
+            this._handleErrorEvent(error)
+          }
+        } else if (!this._connectionError) {
+          this._handleErrorEvent(error)
+        }
+      }
+
+      process.nextTick(() => {
+        this.emit('end')
+      })
+    })
+  }
+
+  connect(callback) {
+    if (callback) {
+      this._connect(callback)
+      return
+    }
+
+    return new this._Promise((resolve, reject) => {
+      this._connect((error) => {
+        if (error) {
+          reject(error)
+        } else {
+          resolve()
+        }
+      })
+    })
+  }
+
+  _attachListeners(con) {
+    // password request handling
+    con.on('authenticationCleartextPassword', this._handleAuthCleartextPassword.bind(this))
+    // password request handling
+    con.on('authenticationMD5Password', this._handleAuthMD5Password.bind(this))
+    // password request handling (SASL)
+    con.on('authenticationSASL', this._handleAuthSASL.bind(this))
+    con.on('authenticationSASLContinue', this._handleAuthSASLContinue.bind(this))
+    con.on('authenticationSASLFinal', this._handleAuthSASLFinal.bind(this))
+    con.on('backendKeyData', this._handleBackendKeyData.bind(this))
+    con.on('error', this._handleErrorEvent.bind(this))
+    con.on('errorMessage', this._handleErrorMessage.bind(this))
+    con.on('readyForQuery', this._handleReadyForQuery.bind(this))
+    con.on('notice', this._handleNotice.bind(this))
+    con.on('rowDescription', this._handleRowDescription.bind(this))
+    con.on('dataRow', this._handleDataRow.bind(this))
+    con.on('portalSuspended', this._handlePortalSuspended.bind(this))
+    con.on('emptyQuery', this._handleEmptyQuery.bind(this))
+    con.on('commandComplete', this._handleCommandComplete.bind(this))
+    con.on('parseComplete', this._handleParseComplete.bind(this))
+    con.on('copyInResponse', this._handleCopyInResponse.bind(this))
+    con.on('copyData', this._handleCopyData.bind(this))
+    con.on('notification', this._handleNotification.bind(this))
+  }
+
+  // TODO(bmc): deprecate pgpass "built in" integration since this.password can be a function
+  // it can be supplied by the user if required - this is a breaking change!
+  _checkPgPass(cb) {
+    const con = this.connection
+    if (typeof this.password === 'function') {
+      this._Promise
+        .resolve()
+        .then(() => this.password())
+        .then((pass) => {
+          if (pass !== undefined) {
+            if (typeof pass !== 'string') {
+              con.emit('error', new TypeError('Password must be a string'))
+              return
+            }
+            this.connectionParameters.password = this.password = pass
+          } else {
+            this.connectionParameters.password = this.password = null
+          }
+          cb()
+        })
+        .catch((err) => {
+          con.emit('error', err)
+        })
+    } else if (this.password !== null) {
+      cb()
+    } else {
+      try {
+        const pgPass = require('pgpass')
+        pgPass(this.connectionParameters, (pass) => {
+          if (undefined !== pass) {
+            this.connectionParameters.password = this.password = pass
+          }
+          cb()
+        })
+      } catch (e) {
+        this.emit('error', e)
+      }
+    }
+  }
+
+  _handleAuthCleartextPassword(msg) {
+    this._checkPgPass(() => {
+      this.connection.password(this.password)
+    })
+  }
+
+  _handleAuthMD5Password(msg) {
+    this._checkPgPass(async () => {
+      try {
+        const hashedPassword = await crypto.postgresMd5PasswordHash(this.user, this.password, msg.salt)
+        this.connection.password(hashedPassword)
+      } catch (e) {
+        this.emit('error', e)
+      }
+    })
+  }
+
+  _handleAuthSASL(msg) {
+    this._checkPgPass(() => {
+      try {
+        this.saslSession = sasl.startSession(msg.mechanisms, this.enableChannelBinding && this.connection.stream)
+        this.connection.sendSASLInitialResponseMessage(this.saslSession.mechanism, this.saslSession.response)
+      } catch (err) {
+        this.connection.emit('error', err)
+      }
+    })
+  }
+
+  async _handleAuthSASLContinue(msg) {
+    try {
+      await sasl.continueSession(
+        this.saslSession,
+        this.password,
+        msg.data,
+        this.enableChannelBinding && this.connection.stream
+      )
+      this.connection.sendSCRAMClientFinalMessage(this.saslSession.response)
+    } catch (err) {
+      this.connection.emit('error', err)
+    }
+  }
+
+  _handleAuthSASLFinal(msg) {
+    try {
+      sasl.finalizeSession(this.saslSession, msg.data)
+      this.saslSession = null
+    } catch (err) {
+      this.connection.emit('error', err)
+    }
+  }
+
+  _handleBackendKeyData(msg) {
+    this.processID = msg.processID
+    this.secretKey = msg.secretKey
+  }
+
+  _handleReadyForQuery(msg) {
+    if (this._connecting) {
+      this._connecting = false
+      this._connected = true
+      clearTimeout(this.connectionTimeoutHandle)
+
+      // process possible callback argument to Client#connect
+      if (this._connectionCallback) {
+        this._connectionCallback(null, this)
+        // remove callback for proper error handling
+        // after the connect event
+        this._connectionCallback = null
+      }
+      this.emit('connect')
+    }
+    const { activeQuery } = this
+    this.activeQuery = null
+    this.readyForQuery = true
+    if (activeQuery) {
+      activeQuery.handleReadyForQuery(this.connection)
+    }
+    this._pulseQueryQueue()
+  }
+
+  // if we receive an error event or error message
+  // during the connection process we handle it here
+  _handleErrorWhileConnecting(err) {
+    if (this._connectionError) {
+      // TODO(bmc): this is swallowing errors - we shouldn't do this
+      return
+    }
+    this._connectionError = true
+    clearTimeout(this.connectionTimeoutHandle)
+    if (this._connectionCallback) {
+      return this._connectionCallback(err)
+    }
+    this.emit('error', err)
+  }
+
+  // if we're connected and we receive an error event from the connection
+  // this means the socket is dead - do a hard abort of all queries and emit
+  // the socket error on the client as well
+  _handleErrorEvent(err) {
+    if (this._connecting) {
+      return this._handleErrorWhileConnecting(err)
+    }
+    this._queryable = false
+    this._errorAllQueries(err)
+    this.emit('error', err)
+  }
+
+  // handle error messages from the postgres backend
+  _handleErrorMessage(msg) {
+    if (this._connecting) {
+      return this._handleErrorWhileConnecting(msg)
+    }
+    const activeQuery = this.activeQuery
+
+    if (!activeQuery) {
+      this._handleErrorEvent(msg)
+      return
+    }
+
+    this.activeQuery = null
+    activeQuery.handleError(msg, this.connection)
+  }
+
+  _handleRowDescription(msg) {
+    // delegate rowDescription to active query
+    this.activeQuery.handleRowDescription(msg)
+  }
+
+  _handleDataRow(msg) {
+    // delegate dataRow to active query
+    this.activeQuery.handleDataRow(msg)
+  }
+
+  _handlePortalSuspended(msg) {
+    // delegate portalSuspended to active query
+    this.activeQuery.handlePortalSuspended(this.connection)
+  }
+
+  _handleEmptyQuery(msg) {
+    // delegate emptyQuery to active query
+    this.activeQuery.handleEmptyQuery(this.connection)
+  }
+
+  _handleCommandComplete(msg) {
+    if (this.activeQuery == null) {
+      const error = new Error('Received unexpected commandComplete message from backend.')
+      this._handleErrorEvent(error)
+      return
+    }
+    // delegate commandComplete to active query
+    this.activeQuery.handleCommandComplete(msg, this.connection)
+  }
+
+  _handleParseComplete() {
+    if (this.activeQuery == null) {
+      const error = new Error('Received unexpected parseComplete message from backend.')
+      this._handleErrorEvent(error)
+      return
+    }
+    // if a prepared statement has a name and properly parses
+    // we track that its already been executed so we don't parse
+    // it again on the same client
+    if (this.activeQuery.name) {
+      this.connection.parsedStatements[this.activeQuery.name] = this.activeQuery.text
+    }
+  }
+
+  _handleCopyInResponse(msg) {
+    this.activeQuery.handleCopyInResponse(this.connection)
+  }
+
+  _handleCopyData(msg) {
+    this.activeQuery.handleCopyData(msg, this.connection)
+  }
+
+  _handleNotification(msg) {
+    this.emit('notification', msg)
+  }
+
+  _handleNotice(msg) {
+    this.emit('notice', msg)
+  }
+
+  getStartupConf() {
+    const params = this.connectionParameters
+
+    const data = {
+      user: params.user,
+      database: params.database,
+    }
+
+    const appName = params.application_name || params.fallback_application_name
+    if (appName) {
+      data.application_name = appName
+    }
+    if (params.replication) {
+      data.replication = '' + params.replication
+    }
+    if (params.statement_timeout) {
+      data.statement_timeout = String(parseInt(params.statement_timeout, 10))
+    }
+    if (params.lock_timeout) {
+      data.lock_timeout = String(parseInt(params.lock_timeout, 10))
+    }
+    if (params.idle_in_transaction_session_timeout) {
+      data.idle_in_transaction_session_timeout = String(parseInt(params.idle_in_transaction_session_timeout, 10))
+    }
+    if (params.options) {
+      data.options = params.options
+    }
+
+    return data
+  }
+
+  cancel(client, query) {
+    if (client.activeQuery === query) {
+      const con = this.connection
+
+      if (this.host && this.host.indexOf('/') === 0) {
+        con.connect(this.host + '/.s.PGSQL.' + this.port)
+      } else {
+        con.connect(this.port, this.host)
+      }
+
+      // once connection is established send cancel message
+      con.on('connect', function () {
+        con.cancel(client.processID, client.secretKey)
+      })
+    } else if (client.queryQueue.indexOf(query) !== -1) {
+      client.queryQueue.splice(client.queryQueue.indexOf(query), 1)
+    }
+  }
+
+  setTypeParser(oid, format, parseFn) {
+    return this._types.setTypeParser(oid, format, parseFn)
+  }
+
+  getTypeParser(oid, format) {
+    return this._types.getTypeParser(oid, format)
+  }
+
+  // escapeIdentifier and escapeLiteral moved to utility functions & exported
+  // on PG
+  // re-exported here for backwards compatibility
+  escapeIdentifier(str) {
+    return utils.escapeIdentifier(str)
+  }
+
+  escapeLiteral(str) {
+    return utils.escapeLiteral(str)
+  }
+
+  _pulseQueryQueue() {
+    if (this.readyForQuery === true) {
+      this.activeQuery = this.queryQueue.shift()
+      if (this.activeQuery) {
+        this.readyForQuery = false
+        this.hasExecuted = true
+
+        const queryError = this.activeQuery.submit(this.connection)
+        if (queryError) {
+          process.nextTick(() => {
+            this.activeQuery.handleError(queryError, this.connection)
+            this.readyForQuery = true
+            this._pulseQueryQueue()
+          })
+        }
+      } else if (this.hasExecuted) {
+        this.activeQuery = null
+        this.emit('drain')
+      }
+    }
+  }
+
+  query(config, values, callback) {
+    // can take in strings, config object or query object
+    let query
+    let result
+    let readTimeout
+    let readTimeoutTimer
+    let queryCallback
+
+    if (config === null || config === undefined) {
+      throw new TypeError('Client was passed a null or undefined query')
+    } else if (typeof config.submit === 'function') {
+      readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+      result = query = config
+      if (typeof values === 'function') {
+        query.callback = query.callback || values
+      }
+    } else {
+      readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+      query = new Query(config, values, callback)
+      if (!query.callback) {
+        result = new this._Promise((resolve, reject) => {
+          query.callback = (err, res) => (err ? reject(err) : resolve(res))
+        }).catch((err) => {
+          // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the
+          // application that created the query
+          Error.captureStackTrace(err)
+          throw err
+        })
+      }
+    }
+
+    if (readTimeout) {
+      queryCallback = query.callback
+
+      readTimeoutTimer = setTimeout(() => {
+        const error = new Error('Query read timeout')
+
+        process.nextTick(() => {
+          query.handleError(error, this.connection)
+        })
+
+        queryCallback(error)
+
+        // we already returned an error,
+        // just do nothing if query completes
+        query.callback = () => {}
+
+        // Remove from queue
+        const index = this.queryQueue.indexOf(query)
+        if (index > -1) {
+          this.queryQueue.splice(index, 1)
+        }
+
+        this._pulseQueryQueue()
+      }, readTimeout)
+
+      query.callback = (err, res) => {
+        clearTimeout(readTimeoutTimer)
+        queryCallback(err, res)
+      }
+    }
+
+    if (this.binary && !query.binary) {
+      query.binary = true
+    }
+
+    if (query._result && !query._result._types) {
+      query._result._types = this._types
+    }
+
+    if (!this._queryable) {
+      process.nextTick(() => {
+        query.handleError(new Error('Client has encountered a connection error and is not queryable'), this.connection)
+      })
+      return result
+    }
+
+    if (this._ending) {
+      process.nextTick(() => {
+        query.handleError(new Error('Client was closed and is not queryable'), this.connection)
+      })
+      return result
+    }
+
+    this.queryQueue.push(query)
+    this._pulseQueryQueue()
+    return result
+  }
+
+  ref() {
+    this.connection.ref()
+  }
+
+  unref() {
+    this.connection.unref()
+  }
+
+  end(cb) {
+    this._ending = true
+
+    // if we have never connected, then end is a noop, callback immediately
+    if (!this.connection._connecting || this._ended) {
+      if (cb) {
+        cb()
+      } else {
+        return this._Promise.resolve()
+      }
+    }
+
+    if (this.activeQuery || !this._queryable) {
+      // if we have an active query we need to force a disconnect
+      // on the socket - otherwise a hung query could block end forever
+      this.connection.stream.destroy()
+    } else {
+      this.connection.end()
+    }
+
+    if (cb) {
+      this.connection.once('end', cb)
+    } else {
+      return new this._Promise((resolve) => {
+        this.connection.once('end', resolve)
+      })
+    }
+  }
+}
+
+// expose a Query constructor
+Client.Query = Query
+
+module.exports = Client
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/connection-parameters.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/connection-parameters.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/connection-parameters.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,167 @@
+'use strict'
+
+const dns = require('dns')
+
+const defaults = require('./defaults')
+
+const parse = require('pg-connection-string').parse // parses a connection string
+
+const val = function (key, config, envVar) {
+  if (envVar === undefined) {
+    envVar = process.env['PG' + key.toUpperCase()]
+  } else if (envVar === false) {
+    // do nothing ... use false
+  } else {
+    envVar = process.env[envVar]
+  }
+
+  return config[key] || envVar || defaults[key]
+}
+
+const readSSLConfigFromEnvironment = function () {
+  switch (process.env.PGSSLMODE) {
+    case 'disable':
+      return false
+    case 'prefer':
+    case 'require':
+    case 'verify-ca':
+    case 'verify-full':
+      return true
+    case 'no-verify':
+      return { rejectUnauthorized: false }
+  }
+  return defaults.ssl
+}
+
+// Convert arg to a string, surround in single quotes, and escape single quotes and backslashes
+const quoteParamValue = function (value) {
+  return "'" + ('' + value).replace(/\\/g, '\\\\').replace(/'/g, "\\'") + "'"
+}
+
+const add = function (params, config, paramName) {
+  const value = config[paramName]
+  if (value !== undefined && value !== null) {
+    params.push(paramName + '=' + quoteParamValue(value))
+  }
+}
+
+class ConnectionParameters {
+  constructor(config) {
+    // if a string is passed, it is a raw connection string so we parse it into a config
+    config = typeof config === 'string' ? parse(config) : config || {}
+
+    // if the config has a connectionString defined, parse IT into the config we use
+    // this will override other default values with what is stored in connectionString
+    if (config.connectionString) {
+      config = Object.assign({}, config, parse(config.connectionString))
+    }
+
+    this.user = val('user', config)
+    this.database = val('database', config)
+
+    if (this.database === undefined) {
+      this.database = this.user
+    }
+
+    this.port = parseInt(val('port', config), 10)
+    this.host = val('host', config)
+
+    // "hiding" the password so it doesn't show up in stack traces
+    // or if the client is console.logged
+    Object.defineProperty(this, 'password', {
+      configurable: true,
+      enumerable: false,
+      writable: true,
+      value: val('password', config),
+    })
+
+    this.binary = val('binary', config)
+    this.options = val('options', config)
+
+    this.ssl = typeof config.ssl === 'undefined' ? readSSLConfigFromEnvironment() : config.ssl
+
+    if (typeof this.ssl === 'string') {
+      if (this.ssl === 'true') {
+        this.ssl = true
+      }
+    }
+    // support passing in ssl=no-verify via connection string
+    if (this.ssl === 'no-verify') {
+      this.ssl = { rejectUnauthorized: false }
+    }
+    if (this.ssl && this.ssl.key) {
+      Object.defineProperty(this.ssl, 'key', {
+        enumerable: false,
+      })
+    }
+
+    this.client_encoding = val('client_encoding', config)
+    this.replication = val('replication', config)
+    // a domain socket begins with '/'
+    this.isDomainSocket = !(this.host || '').indexOf('/')
+
+    this.application_name = val('application_name', config, 'PGAPPNAME')
+    this.fallback_application_name = val('fallback_application_name', config, false)
+    this.statement_timeout = val('statement_timeout', config, false)
+    this.lock_timeout = val('lock_timeout', config, false)
+    this.idle_in_transaction_session_timeout = val('idle_in_transaction_session_timeout', config, false)
+    this.query_timeout = val('query_timeout', config, false)
+
+    if (config.connectionTimeoutMillis === undefined) {
+      this.connect_timeout = process.env.PGCONNECT_TIMEOUT || 0
+    } else {
+      this.connect_timeout = Math.floor(config.connectionTimeoutMillis / 1000)
+    }
+
+    if (config.keepAlive === false) {
+      this.keepalives = 0
+    } else if (config.keepAlive === true) {
+      this.keepalives = 1
+    }
+
+    if (typeof config.keepAliveInitialDelayMillis === 'number') {
+      this.keepalives_idle = Math.floor(config.keepAliveInitialDelayMillis / 1000)
+    }
+  }
+
+  getLibpqConnectionString(cb) {
+    const params = []
+    add(params, this, 'user')
+    add(params, this, 'password')
+    add(params, this, 'port')
+    add(params, this, 'application_name')
+    add(params, this, 'fallback_application_name')
+    add(params, this, 'connect_timeout')
+    add(params, this, 'options')
+
+    const ssl = typeof this.ssl === 'object' ? this.ssl : this.ssl ? { sslmode: this.ssl } : {}
+    add(params, ssl, 'sslmode')
+    add(params, ssl, 'sslca')
+    add(params, ssl, 'sslkey')
+    add(params, ssl, 'sslcert')
+    add(params, ssl, 'sslrootcert')
+
+    if (this.database) {
+      params.push('dbname=' + quoteParamValue(this.database))
+    }
+    if (this.replication) {
+      params.push('replication=' + quoteParamValue(this.replication))
+    }
+    if (this.host) {
+      params.push('host=' + quoteParamValue(this.host))
+    }
+    if (this.isDomainSocket) {
+      return cb(null, params.join(' '))
+    }
+    if (this.client_encoding) {
+      params.push('client_encoding=' + quoteParamValue(this.client_encoding))
+    }
+    dns.lookup(this.host, function (err, address) {
+      if (err) return cb(err, null)
+      params.push('hostaddr=' + quoteParamValue(address))
+      return cb(null, params.join(' '))
+    })
+  }
+}
+
+module.exports = ConnectionParameters
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/connection.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/connection.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/connection.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,222 @@
+'use strict'
+
+const EventEmitter = require('events').EventEmitter
+
+const { parse, serialize } = require('pg-protocol')
+const { getStream, getSecureStream } = require('./stream')
+
+const flushBuffer = serialize.flush()
+const syncBuffer = serialize.sync()
+const endBuffer = serialize.end()
+
+// TODO(bmc) support binary mode at some point
+class Connection extends EventEmitter {
+  constructor(config) {
+    super()
+    config = config || {}
+
+    this.stream = config.stream || getStream(config.ssl)
+    if (typeof this.stream === 'function') {
+      this.stream = this.stream(config)
+    }
+
+    this._keepAlive = config.keepAlive
+    this._keepAliveInitialDelayMillis = config.keepAliveInitialDelayMillis
+    this.lastBuffer = false
+    this.parsedStatements = {}
+    this.ssl = config.ssl || false
+    this._ending = false
+    this._emitMessage = false
+    const self = this
+    this.on('newListener', function (eventName) {
+      if (eventName === 'message') {
+        self._emitMessage = true
+      }
+    })
+  }
+
+  connect(port, host) {
+    const self = this
+
+    this._connecting = true
+    this.stream.setNoDelay(true)
+    this.stream.connect(port, host)
+
+    this.stream.once('connect', function () {
+      if (self._keepAlive) {
+        self.stream.setKeepAlive(true, self._keepAliveInitialDelayMillis)
+      }
+      self.emit('connect')
+    })
+
+    const reportStreamError = function (error) {
+      // errors about disconnections should be ignored during disconnect
+      if (self._ending && (error.code === 'ECONNRESET' || error.code === 'EPIPE')) {
+        return
+      }
+      self.emit('error', error)
+    }
+    this.stream.on('error', reportStreamError)
+
+    this.stream.on('close', function () {
+      self.emit('end')
+    })
+
+    if (!this.ssl) {
+      return this.attachListeners(this.stream)
+    }
+
+    this.stream.once('data', function (buffer) {
+      const responseCode = buffer.toString('utf8')
+      switch (responseCode) {
+        case 'S': // Server supports SSL connections, continue with a secure connection
+          break
+        case 'N': // Server does not support SSL connections
+          self.stream.end()
+          return self.emit('error', new Error('The server does not support SSL connections'))
+        default:
+          // Any other response byte, including 'E' (ErrorResponse) indicating a server error
+          self.stream.end()
+          return self.emit('error', new Error('There was an error establishing an SSL connection'))
+      }
+      const options = {
+        socket: self.stream,
+      }
+
+      if (self.ssl !== true) {
+        Object.assign(options, self.ssl)
+
+        if ('key' in self.ssl) {
+          options.key = self.ssl.key
+        }
+      }
+
+      const net = require('net')
+      if (net.isIP && net.isIP(host) === 0) {
+        options.servername = host
+      }
+      try {
+        self.stream = getSecureStream(options)
+      } catch (err) {
+        return self.emit('error', err)
+      }
+      self.attachListeners(self.stream)
+      self.stream.on('error', reportStreamError)
+
+      self.emit('sslconnect')
+    })
+  }
+
+  attachListeners(stream) {
+    parse(stream, (msg) => {
+      const eventName = msg.name === 'error' ? 'errorMessage' : msg.name
+      if (this._emitMessage) {
+        this.emit('message', msg)
+      }
+      this.emit(eventName, msg)
+    })
+  }
+
+  requestSsl() {
+    this.stream.write(serialize.requestSsl())
+  }
+
+  startup(config) {
+    this.stream.write(serialize.startup(config))
+  }
+
+  cancel(processID, secretKey) {
+    this._send(serialize.cancel(processID, secretKey))
+  }
+
+  password(password) {
+    this._send(serialize.password(password))
+  }
+
+  sendSASLInitialResponseMessage(mechanism, initialResponse) {
+    this._send(serialize.sendSASLInitialResponseMessage(mechanism, initialResponse))
+  }
+
+  sendSCRAMClientFinalMessage(additionalData) {
+    this._send(serialize.sendSCRAMClientFinalMessage(additionalData))
+  }
+
+  _send(buffer) {
+    if (!this.stream.writable) {
+      return false
+    }
+    return this.stream.write(buffer)
+  }
+
+  query(text) {
+    this._send(serialize.query(text))
+  }
+
+  // send parse message
+  parse(query) {
+    this._send(serialize.parse(query))
+  }
+
+  // send bind message
+  bind(config) {
+    this._send(serialize.bind(config))
+  }
+
+  // send execute message
+  execute(config) {
+    this._send(serialize.execute(config))
+  }
+
+  flush() {
+    if (this.stream.writable) {
+      this.stream.write(flushBuffer)
+    }
+  }
+
+  sync() {
+    this._ending = true
+    this._send(syncBuffer)
+  }
+
+  ref() {
+    this.stream.ref()
+  }
+
+  unref() {
+    this.stream.unref()
+  }
+
+  end() {
+    // 0x58 = 'X'
+    this._ending = true
+    if (!this._connecting || !this.stream.writable) {
+      this.stream.end()
+      return
+    }
+    return this.stream.write(endBuffer, () => {
+      this.stream.end()
+    })
+  }
+
+  close(msg) {
+    this._send(serialize.close(msg))
+  }
+
+  describe(msg) {
+    this._send(serialize.describe(msg))
+  }
+
+  sendCopyFromChunk(chunk) {
+    this._send(serialize.copyData(chunk))
+  }
+
+  endCopyFrom() {
+    this._send(serialize.copyDone())
+  }
+
+  sendCopyFail(msg) {
+    this._send(serialize.copyFail(msg))
+  }
+}
+
+module.exports = Connection
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/cert-signatures.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/cert-signatures.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/cert-signatures.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,122 @@
+function x509Error(msg, cert) {
+  return new Error('SASL channel binding: ' + msg + ' when parsing public certificate ' + cert.toString('base64'))
+}
+
+function readASN1Length(data, index) {
+  let length = data[index++]
+  if (length < 0x80) return { length, index }
+
+  const lengthBytes = length & 0x7f
+  if (lengthBytes > 4) throw x509Error('bad length', data)
+
+  length = 0
+  for (let i = 0; i < lengthBytes; i++) {
+    length = (length << 8) | data[index++]
+  }
+
+  return { length, index }
+}
+
+function readASN1OID(data, index) {
+  if (data[index++] !== 0x6) throw x509Error('non-OID data', data) // 6 = OID
+
+  const { length: OIDLength, index: indexAfterOIDLength } = readASN1Length(data, index)
+  index = indexAfterOIDLength
+  const lastIndex = index + OIDLength
+
+  const byte1 = data[index++]
+  let oid = ((byte1 / 40) >> 0) + '.' + (byte1 % 40)
+
+  while (index < lastIndex) {
+    // loop over numbers in OID
+    let value = 0
+    while (index < lastIndex) {
+      // loop over bytes in number
+      const nextByte = data[index++]
+      value = (value << 7) | (nextByte & 0x7f)
+      if (nextByte < 0x80) break
+    }
+    oid += '.' + value
+  }
+
+  return { oid, index }
+}
+
+function expectASN1Seq(data, index) {
+  if (data[index++] !== 0x30) throw x509Error('non-sequence data', data) // 30 = Sequence
+  return readASN1Length(data, index)
+}
+
+function signatureAlgorithmHashFromCertificate(data, index) {
+  // read this thread: https://www.postgresql.org/message-id/17760-b6c61e752ec07060%40postgresql.org
+  if (index === undefined) index = 0
+  index = expectASN1Seq(data, index).index
+  const { length: certInfoLength, index: indexAfterCertInfoLength } = expectASN1Seq(data, index)
+  index = indexAfterCertInfoLength + certInfoLength // skip over certificate info
+  index = expectASN1Seq(data, index).index // skip over signature length field
+  const { oid, index: indexAfterOID } = readASN1OID(data, index)
+  switch (oid) {
+    // RSA
+    case '1.2.840.113549.1.1.4':
+      return 'MD5'
+    case '1.2.840.113549.1.1.5':
+      return 'SHA-1'
+    case '1.2.840.113549.1.1.11':
+      return 'SHA-256'
+    case '1.2.840.113549.1.1.12':
+      return 'SHA-384'
+    case '1.2.840.113549.1.1.13':
+      return 'SHA-512'
+    case '1.2.840.113549.1.1.14':
+      return 'SHA-224'
+    case '1.2.840.113549.1.1.15':
+      return 'SHA512-224'
+    case '1.2.840.113549.1.1.16':
+      return 'SHA512-256'
+    // ECDSA
+    case '1.2.840.10045.4.1':
+      return 'SHA-1'
+    case '1.2.840.10045.4.3.1':
+      return 'SHA-224'
+    case '1.2.840.10045.4.3.2':
+      return 'SHA-256'
+    case '1.2.840.10045.4.3.3':
+      return 'SHA-384'
+    case '1.2.840.10045.4.3.4':
+      return 'SHA-512'
+    // RSASSA-PSS: hash is indicated separately
+    case '1.2.840.113549.1.1.10': {
+      index = indexAfterOID
+      index = expectASN1Seq(data, index).index
+      if (data[index++] !== 0xa0) throw x509Error('non-tag data', data) // a0 = constructed tag 0
+      index = readASN1Length(data, index).index // skip over tag length field
+      index = expectASN1Seq(data, index).index // skip over sequence length field
+      const { oid: hashOID } = readASN1OID(data, index)
+      switch (hashOID) {
+        // standalone hash OIDs
+        case '1.2.840.113549.2.5':
+          return 'MD5'
+        case '1.3.14.3.2.26':
+          return 'SHA-1'
+        case '2.16.840.1.101.3.4.2.1':
+          return 'SHA-256'
+        case '2.16.840.1.101.3.4.2.2':
+          return 'SHA-384'
+        case '2.16.840.1.101.3.4.2.3':
+          return 'SHA-512'
+      }
+      throw x509Error('unknown hash OID ' + hashOID, data)
+    }
+    // Ed25519 -- see https: return//github.com/openssl/openssl/issues/15477
+    case '1.3.101.110':
+    case '1.3.101.112': // ph
+      return 'SHA-512'
+    // Ed448 -- still not in pg 17.2 (if supported, digest would be SHAKE256 x 64 bytes)
+    case '1.3.101.111':
+    case '1.3.101.113': // ph
+      throw x509Error('Ed448 certificate channel binding is not currently supported by Postgres')
+  }
+  throw x509Error('unknown OID ' + oid, data)
+}
+
+module.exports = { signatureAlgorithmHashFromCertificate }
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/sasl.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/sasl.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/sasl.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,212 @@
+'use strict'
+const crypto = require('./utils')
+const { signatureAlgorithmHashFromCertificate } = require('./cert-signatures')
+
+function startSession(mechanisms, stream) {
+  const candidates = ['SCRAM-SHA-256']
+  if (stream) candidates.unshift('SCRAM-SHA-256-PLUS') // higher-priority, so placed first
+
+  const mechanism = candidates.find((candidate) => mechanisms.includes(candidate))
+
+  if (!mechanism) {
+    throw new Error('SASL: Only mechanism(s) ' + candidates.join(' and ') + ' are supported')
+  }
+
+  if (mechanism === 'SCRAM-SHA-256-PLUS' && typeof stream.getPeerCertificate !== 'function') {
+    // this should never happen if we are really talking to a Postgres server
+    throw new Error('SASL: Mechanism SCRAM-SHA-256-PLUS requires a certificate')
+  }
+
+  const clientNonce = crypto.randomBytes(18).toString('base64')
+  const gs2Header = mechanism === 'SCRAM-SHA-256-PLUS' ? 'p=tls-server-end-point' : stream ? 'y' : 'n'
+
+  return {
+    mechanism,
+    clientNonce,
+    response: gs2Header + ',,n=*,r=' + clientNonce,
+    message: 'SASLInitialResponse',
+  }
+}
+
+async function continueSession(session, password, serverData, stream) {
+  if (session.message !== 'SASLInitialResponse') {
+    throw new Error('SASL: Last message was not SASLInitialResponse')
+  }
+  if (typeof password !== 'string') {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')
+  }
+  if (password === '') {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a non-empty string')
+  }
+  if (typeof serverData !== 'string') {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: serverData must be a string')
+  }
+
+  const sv = parseServerFirstMessage(serverData)
+
+  if (!sv.nonce.startsWith(session.clientNonce)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce does not start with client nonce')
+  } else if (sv.nonce.length === session.clientNonce.length) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce is too short')
+  }
+
+  const clientFirstMessageBare = 'n=*,r=' + session.clientNonce
+  const serverFirstMessage = 'r=' + sv.nonce + ',s=' + sv.salt + ',i=' + sv.iteration
+
+  // without channel binding:
+  let channelBinding = stream ? 'eSws' : 'biws' // 'y,,' or 'n,,', base64-encoded
+
+  // override if channel binding is in use:
+  if (session.mechanism === 'SCRAM-SHA-256-PLUS') {
+    const peerCert = stream.getPeerCertificate().raw
+    let hashName = signatureAlgorithmHashFromCertificate(peerCert)
+    if (hashName === 'MD5' || hashName === 'SHA-1') hashName = 'SHA-256'
+    const certHash = await crypto.hashByName(hashName, peerCert)
+    const bindingData = Buffer.concat([Buffer.from('p=tls-server-end-point,,'), Buffer.from(certHash)])
+    channelBinding = bindingData.toString('base64')
+  }
+
+  const clientFinalMessageWithoutProof = 'c=' + channelBinding + ',r=' + sv.nonce
+  const authMessage = clientFirstMessageBare + ',' + serverFirstMessage + ',' + clientFinalMessageWithoutProof
+
+  const saltBytes = Buffer.from(sv.salt, 'base64')
+  const saltedPassword = await crypto.deriveKey(password, saltBytes, sv.iteration)
+  const clientKey = await crypto.hmacSha256(saltedPassword, 'Client Key')
+  const storedKey = await crypto.sha256(clientKey)
+  const clientSignature = await crypto.hmacSha256(storedKey, authMessage)
+  const clientProof = xorBuffers(Buffer.from(clientKey), Buffer.from(clientSignature)).toString('base64')
+  const serverKey = await crypto.hmacSha256(saltedPassword, 'Server Key')
+  const serverSignatureBytes = await crypto.hmacSha256(serverKey, authMessage)
+
+  session.message = 'SASLResponse'
+  session.serverSignature = Buffer.from(serverSignatureBytes).toString('base64')
+  session.response = clientFinalMessageWithoutProof + ',p=' + clientProof
+}
+
+function finalizeSession(session, serverData) {
+  if (session.message !== 'SASLResponse') {
+    throw new Error('SASL: Last message was not SASLResponse')
+  }
+  if (typeof serverData !== 'string') {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: serverData must be a string')
+  }
+
+  const { serverSignature } = parseServerFinalMessage(serverData)
+
+  if (serverSignature !== session.serverSignature) {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature does not match')
+  }
+}
+
+/**
+ * printable       = %x21-2B / %x2D-7E
+ *                   ;; Printable ASCII except ",".
+ *                   ;; Note that any "printable" is also
+ *                   ;; a valid "value".
+ */
+function isPrintableChars(text) {
+  if (typeof text !== 'string') {
+    throw new TypeError('SASL: text must be a string')
+  }
+  return text
+    .split('')
+    .map((_, i) => text.charCodeAt(i))
+    .every((c) => (c >= 0x21 && c <= 0x2b) || (c >= 0x2d && c <= 0x7e))
+}
+
+/**
+ * base64-char     = ALPHA / DIGIT / "/" / "+"
+ *
+ * base64-4        = 4base64-char
+ *
+ * base64-3        = 3base64-char "="
+ *
+ * base64-2        = 2base64-char "=="
+ *
+ * base64          = *base64-4 [base64-3 / base64-2]
+ */
+function isBase64(text) {
+  return /^(?:[a-zA-Z0-9+/]{4})*(?:[a-zA-Z0-9+/]{2}==|[a-zA-Z0-9+/]{3}=)?$/.test(text)
+}
+
+function parseAttributePairs(text) {
+  if (typeof text !== 'string') {
+    throw new TypeError('SASL: attribute pairs text must be a string')
+  }
+
+  return new Map(
+    text.split(',').map((attrValue) => {
+      if (!/^.=/.test(attrValue)) {
+        throw new Error('SASL: Invalid attribute pair entry')
+      }
+      const name = attrValue[0]
+      const value = attrValue.substring(2)
+      return [name, value]
+    })
+  )
+}
+
+function parseServerFirstMessage(data) {
+  const attrPairs = parseAttributePairs(data)
+
+  const nonce = attrPairs.get('r')
+  if (!nonce) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce missing')
+  } else if (!isPrintableChars(nonce)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce must only contain printable characters')
+  }
+  const salt = attrPairs.get('s')
+  if (!salt) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt missing')
+  } else if (!isBase64(salt)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt must be base64')
+  }
+  const iterationText = attrPairs.get('i')
+  if (!iterationText) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: iteration missing')
+  } else if (!/^[1-9][0-9]*$/.test(iterationText)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: invalid iteration count')
+  }
+  const iteration = parseInt(iterationText, 10)
+
+  return {
+    nonce,
+    salt,
+    iteration,
+  }
+}
+
+function parseServerFinalMessage(serverData) {
+  const attrPairs = parseAttributePairs(serverData)
+  const serverSignature = attrPairs.get('v')
+  if (!serverSignature) {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature is missing')
+  } else if (!isBase64(serverSignature)) {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature must be base64')
+  }
+  return {
+    serverSignature,
+  }
+}
+
+function xorBuffers(a, b) {
+  if (!Buffer.isBuffer(a)) {
+    throw new TypeError('first argument must be a Buffer')
+  }
+  if (!Buffer.isBuffer(b)) {
+    throw new TypeError('second argument must be a Buffer')
+  }
+  if (a.length !== b.length) {
+    throw new Error('Buffer lengths must match')
+  }
+  if (a.length === 0) {
+    throw new Error('Buffers cannot be empty')
+  }
+  return Buffer.from(a.map((_, i) => a[i] ^ b[i]))
+}
+
+module.exports = {
+  startSession,
+  continueSession,
+  finalizeSession,
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils-legacy.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils-legacy.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils-legacy.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,43 @@
+'use strict'
+// This file contains crypto utility functions for versions of Node.js < 15.0.0,
+// which does not support the WebCrypto.subtle API.
+
+const nodeCrypto = require('crypto')
+
+function md5(string) {
+  return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')
+}
+
+// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html
+function postgresMd5PasswordHash(user, password, salt) {
+  const inner = md5(password + user)
+  const outer = md5(Buffer.concat([Buffer.from(inner), salt]))
+  return 'md5' + outer
+}
+
+function sha256(text) {
+  return nodeCrypto.createHash('sha256').update(text).digest()
+}
+
+function hashByName(hashName, text) {
+  hashName = hashName.replace(/(\D)-/, '$1') // e.g. SHA-256 -> SHA256
+  return nodeCrypto.createHash(hashName).update(text).digest()
+}
+
+function hmacSha256(key, msg) {
+  return nodeCrypto.createHmac('sha256', key).update(msg).digest()
+}
+
+async function deriveKey(password, salt, iterations) {
+  return nodeCrypto.pbkdf2Sync(password, salt, iterations, 32, 'sha256')
+}
+
+module.exports = {
+  postgresMd5PasswordHash,
+  randomBytes: nodeCrypto.randomBytes,
+  deriveKey,
+  sha256,
+  hashByName,
+  hmacSha256,
+  md5,
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils-webcrypto.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils-webcrypto.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils-webcrypto.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,89 @@
+const nodeCrypto = require('crypto')
+
+module.exports = {
+  postgresMd5PasswordHash,
+  randomBytes,
+  deriveKey,
+  sha256,
+  hashByName,
+  hmacSha256,
+  md5,
+}
+
+/**
+ * The Web Crypto API - grabbed from the Node.js library or the global
+ * @type Crypto
+ */
+// eslint-disable-next-line no-undef
+const webCrypto = nodeCrypto.webcrypto || globalThis.crypto
+/**
+ * The SubtleCrypto API for low level crypto operations.
+ * @type SubtleCrypto
+ */
+const subtleCrypto = webCrypto.subtle
+const textEncoder = new TextEncoder()
+
+/**
+ *
+ * @param {*} length
+ * @returns
+ */
+function randomBytes(length) {
+  return webCrypto.getRandomValues(Buffer.alloc(length))
+}
+
+async function md5(string) {
+  try {
+    return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')
+  } catch (e) {
+    // `createHash()` failed so we are probably not in Node.js, use the WebCrypto API instead.
+    // Note that the MD5 algorithm on WebCrypto is not available in Node.js.
+    // This is why we cannot just use WebCrypto in all environments.
+    const data = typeof string === 'string' ? textEncoder.encode(string) : string
+    const hash = await subtleCrypto.digest('MD5', data)
+    return Array.from(new Uint8Array(hash))
+      .map((b) => b.toString(16).padStart(2, '0'))
+      .join('')
+  }
+}
+
+// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html
+async function postgresMd5PasswordHash(user, password, salt) {
+  const inner = await md5(password + user)
+  const outer = await md5(Buffer.concat([Buffer.from(inner), salt]))
+  return 'md5' + outer
+}
+
+/**
+ * Create a SHA-256 digest of the given data
+ * @param {Buffer} data
+ */
+async function sha256(text) {
+  return await subtleCrypto.digest('SHA-256', text)
+}
+
+async function hashByName(hashName, text) {
+  return await subtleCrypto.digest(hashName, text)
+}
+
+/**
+ * Sign the message with the given key
+ * @param {ArrayBuffer} keyBuffer
+ * @param {string} msg
+ */
+async function hmacSha256(keyBuffer, msg) {
+  const key = await subtleCrypto.importKey('raw', keyBuffer, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])
+  return await subtleCrypto.sign('HMAC', key, textEncoder.encode(msg))
+}
+
+/**
+ * Derive a key from the password and salt
+ * @param {string} password
+ * @param {Uint8Array} salt
+ * @param {number} iterations
+ */
+async function deriveKey(password, salt, iterations) {
+  const key = await subtleCrypto.importKey('raw', textEncoder.encode(password), 'PBKDF2', false, ['deriveBits'])
+  const params = { name: 'PBKDF2', hash: 'SHA-256', salt: salt, iterations: iterations }
+  return await subtleCrypto.deriveBits(params, key, 32 * 8, ['deriveBits'])
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/crypto/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,9 @@
+'use strict'
+
+const useLegacyCrypto = parseInt(process.versions && process.versions.node && process.versions.node.split('.')[0]) < 15
+if (useLegacyCrypto) {
+  // We are on an old version of Node.js that requires legacy crypto utilities.
+  module.exports = require('./utils-legacy')
+} else {
+  module.exports = require('./utils-webcrypto')
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/defaults.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/defaults.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/defaults.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,84 @@
+'use strict'
+
+module.exports = {
+  // database host. defaults to localhost
+  host: 'localhost',
+
+  // database user's name
+  user: process.platform === 'win32' ? process.env.USERNAME : process.env.USER,
+
+  // name of database to connect
+  database: undefined,
+
+  // database user's password
+  password: null,
+
+  // a Postgres connection string to be used instead of setting individual connection items
+  // NOTE:  Setting this value will cause it to override any other value (such as database or user) defined
+  // in the defaults object.
+  connectionString: undefined,
+
+  // database port
+  port: 5432,
+
+  // number of rows to return at a time from a prepared statement's
+  // portal. 0 will return all rows at once
+  rows: 0,
+
+  // binary result mode
+  binary: false,
+
+  // Connection pool options - see https://github.com/brianc/node-pg-pool
+
+  // number of connections to use in connection pool
+  // 0 will disable connection pooling
+  max: 10,
+
+  // max milliseconds a client can go unused before it is removed
+  // from the pool and destroyed
+  idleTimeoutMillis: 30000,
+
+  client_encoding: '',
+
+  ssl: false,
+
+  application_name: undefined,
+
+  fallback_application_name: undefined,
+
+  options: undefined,
+
+  parseInputDatesAsUTC: false,
+
+  // max milliseconds any query using this connection will execute for before timing out in error.
+  // false=unlimited
+  statement_timeout: false,
+
+  // Abort any statement that waits longer than the specified duration in milliseconds while attempting to acquire a lock.
+  // false=unlimited
+  lock_timeout: false,
+
+  // Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds
+  // false=unlimited
+  idle_in_transaction_session_timeout: false,
+
+  // max milliseconds to wait for query to complete (client side)
+  query_timeout: false,
+
+  connect_timeout: 0,
+
+  keepalives: 1,
+
+  keepalives_idle: 0,
+}
+
+const pgTypes = require('pg-types')
+// save default parsers
+const parseBigInteger = pgTypes.getTypeParser(20, 'text')
+const parseBigIntegerArray = pgTypes.getTypeParser(1016, 'text')
+
+// parse int8 so you can get your count values as actual numbers
+module.exports.__defineSetter__('parseInt8', function (val) {
+  pgTypes.setTypeParser(20, 'text', val ? pgTypes.getTypeParser(23, 'text') : parseBigInteger)
+  pgTypes.setTypeParser(1016, 'text', val ? pgTypes.getTypeParser(1007, 'text') : parseBigIntegerArray)
+})
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,64 @@
+'use strict'
+
+const Client = require('./client')
+const defaults = require('./defaults')
+const Connection = require('./connection')
+const Result = require('./result')
+const utils = require('./utils')
+const Pool = require('pg-pool')
+const TypeOverrides = require('./type-overrides')
+const { DatabaseError } = require('pg-protocol')
+const { escapeIdentifier, escapeLiteral } = require('./utils')
+
+const poolFactory = (Client) => {
+  return class BoundPool extends Pool {
+    constructor(options) {
+      super(options, Client)
+    }
+  }
+}
+
+const PG = function (clientConstructor) {
+  this.defaults = defaults
+  this.Client = clientConstructor
+  this.Query = this.Client.Query
+  this.Pool = poolFactory(this.Client)
+  this._pools = []
+  this.Connection = Connection
+  this.types = require('pg-types')
+  this.DatabaseError = DatabaseError
+  this.TypeOverrides = TypeOverrides
+  this.escapeIdentifier = escapeIdentifier
+  this.escapeLiteral = escapeLiteral
+  this.Result = Result
+  this.utils = utils
+}
+
+if (typeof process.env.NODE_PG_FORCE_NATIVE !== 'undefined') {
+  module.exports = new PG(require('./native'))
+} else {
+  module.exports = new PG(Client)
+
+  // lazy require native module...the native module may not have installed
+  Object.defineProperty(module.exports, 'native', {
+    configurable: true,
+    enumerable: false,
+    get() {
+      let native = null
+      try {
+        native = new PG(require('./native'))
+      } catch (err) {
+        if (err.code !== 'MODULE_NOT_FOUND') {
+          throw err
+        }
+      }
+
+      // overwrite module.exports.native so that getter is never called again
+      Object.defineProperty(module.exports, 'native', {
+        value: native,
+      })
+
+      return native
+    },
+  })
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/client.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,308 @@
+'use strict'
+
+// eslint-disable-next-line
+var Native
+// eslint-disable-next-line no-useless-catch
+try {
+  // Wrap this `require()` in a try-catch to avoid upstream bundlers from complaining that this might not be available since it is an optional import
+  Native = require('pg-native')
+} catch (e) {
+  throw e
+}
+const TypeOverrides = require('../type-overrides')
+const EventEmitter = require('events').EventEmitter
+const util = require('util')
+const ConnectionParameters = require('../connection-parameters')
+
+const NativeQuery = require('./query')
+
+const Client = (module.exports = function (config) {
+  EventEmitter.call(this)
+  config = config || {}
+
+  this._Promise = config.Promise || global.Promise
+  this._types = new TypeOverrides(config.types)
+
+  this.native = new Native({
+    types: this._types,
+  })
+
+  this._queryQueue = []
+  this._ending = false
+  this._connecting = false
+  this._connected = false
+  this._queryable = true
+
+  // keep these on the object for legacy reasons
+  // for the time being. TODO: deprecate all this jazz
+  const cp = (this.connectionParameters = new ConnectionParameters(config))
+  if (config.nativeConnectionString) cp.nativeConnectionString = config.nativeConnectionString
+  this.user = cp.user
+
+  // "hiding" the password so it doesn't show up in stack traces
+  // or if the client is console.logged
+  Object.defineProperty(this, 'password', {
+    configurable: true,
+    enumerable: false,
+    writable: true,
+    value: cp.password,
+  })
+  this.database = cp.database
+  this.host = cp.host
+  this.port = cp.port
+
+  // a hash to hold named queries
+  this.namedQueries = {}
+})
+
+Client.Query = NativeQuery
+
+util.inherits(Client, EventEmitter)
+
+Client.prototype._errorAllQueries = function (err) {
+  const enqueueError = (query) => {
+    process.nextTick(() => {
+      query.native = this.native
+      query.handleError(err)
+    })
+  }
+
+  if (this._hasActiveQuery()) {
+    enqueueError(this._activeQuery)
+    this._activeQuery = null
+  }
+
+  this._queryQueue.forEach(enqueueError)
+  this._queryQueue.length = 0
+}
+
+// connect to the backend
+// pass an optional callback to be called once connected
+// or with an error if there was a connection error
+Client.prototype._connect = function (cb) {
+  const self = this
+
+  if (this._connecting) {
+    process.nextTick(() => cb(new Error('Client has already been connected. You cannot reuse a client.')))
+    return
+  }
+
+  this._connecting = true
+
+  this.connectionParameters.getLibpqConnectionString(function (err, conString) {
+    if (self.connectionParameters.nativeConnectionString) conString = self.connectionParameters.nativeConnectionString
+    if (err) return cb(err)
+    self.native.connect(conString, function (err) {
+      if (err) {
+        self.native.end()
+        return cb(err)
+      }
+
+      // set internal states to connected
+      self._connected = true
+
+      // handle connection errors from the native layer
+      self.native.on('error', function (err) {
+        self._queryable = false
+        self._errorAllQueries(err)
+        self.emit('error', err)
+      })
+
+      self.native.on('notification', function (msg) {
+        self.emit('notification', {
+          channel: msg.relname,
+          payload: msg.extra,
+        })
+      })
+
+      // signal we are connected now
+      self.emit('connect')
+      self._pulseQueryQueue(true)
+
+      cb()
+    })
+  })
+}
+
+Client.prototype.connect = function (callback) {
+  if (callback) {
+    this._connect(callback)
+    return
+  }
+
+  return new this._Promise((resolve, reject) => {
+    this._connect((error) => {
+      if (error) {
+        reject(error)
+      } else {
+        resolve()
+      }
+    })
+  })
+}
+
+// send a query to the server
+// this method is highly overloaded to take
+// 1) string query, optional array of parameters, optional function callback
+// 2) object query with {
+//    string query
+//    optional array values,
+//    optional function callback instead of as a separate parameter
+//    optional string name to name & cache the query plan
+//    optional string rowMode = 'array' for an array of results
+//  }
+Client.prototype.query = function (config, values, callback) {
+  let query
+  let result
+  let readTimeout
+  let readTimeoutTimer
+  let queryCallback
+
+  if (config === null || config === undefined) {
+    throw new TypeError('Client was passed a null or undefined query')
+  } else if (typeof config.submit === 'function') {
+    readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+    result = query = config
+    // accept query(new Query(...), (err, res) => { }) style
+    if (typeof values === 'function') {
+      config.callback = values
+    }
+  } else {
+    readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+    query = new NativeQuery(config, values, callback)
+    if (!query.callback) {
+      let resolveOut, rejectOut
+      result = new this._Promise((resolve, reject) => {
+        resolveOut = resolve
+        rejectOut = reject
+      }).catch((err) => {
+        Error.captureStackTrace(err)
+        throw err
+      })
+      query.callback = (err, res) => (err ? rejectOut(err) : resolveOut(res))
+    }
+  }
+
+  if (readTimeout) {
+    queryCallback = query.callback
+
+    readTimeoutTimer = setTimeout(() => {
+      const error = new Error('Query read timeout')
+
+      process.nextTick(() => {
+        query.handleError(error, this.connection)
+      })
+
+      queryCallback(error)
+
+      // we already returned an error,
+      // just do nothing if query completes
+      query.callback = () => {}
+
+      // Remove from queue
+      const index = this._queryQueue.indexOf(query)
+      if (index > -1) {
+        this._queryQueue.splice(index, 1)
+      }
+
+      this._pulseQueryQueue()
+    }, readTimeout)
+
+    query.callback = (err, res) => {
+      clearTimeout(readTimeoutTimer)
+      queryCallback(err, res)
+    }
+  }
+
+  if (!this._queryable) {
+    query.native = this.native
+    process.nextTick(() => {
+      query.handleError(new Error('Client has encountered a connection error and is not queryable'))
+    })
+    return result
+  }
+
+  if (this._ending) {
+    query.native = this.native
+    process.nextTick(() => {
+      query.handleError(new Error('Client was closed and is not queryable'))
+    })
+    return result
+  }
+
+  this._queryQueue.push(query)
+  this._pulseQueryQueue()
+  return result
+}
+
+// disconnect from the backend server
+Client.prototype.end = function (cb) {
+  const self = this
+
+  this._ending = true
+
+  if (!this._connected) {
+    this.once('connect', this.end.bind(this, cb))
+  }
+  let result
+  if (!cb) {
+    result = new this._Promise(function (resolve, reject) {
+      cb = (err) => (err ? reject(err) : resolve())
+    })
+  }
+  this.native.end(function () {
+    self._errorAllQueries(new Error('Connection terminated'))
+
+    process.nextTick(() => {
+      self.emit('end')
+      if (cb) cb()
+    })
+  })
+  return result
+}
+
+Client.prototype._hasActiveQuery = function () {
+  return this._activeQuery && this._activeQuery.state !== 'error' && this._activeQuery.state !== 'end'
+}
+
+Client.prototype._pulseQueryQueue = function (initialConnection) {
+  if (!this._connected) {
+    return
+  }
+  if (this._hasActiveQuery()) {
+    return
+  }
+  const query = this._queryQueue.shift()
+  if (!query) {
+    if (!initialConnection) {
+      this.emit('drain')
+    }
+    return
+  }
+  this._activeQuery = query
+  query.submit(this)
+  const self = this
+  query.once('_done', function () {
+    self._pulseQueryQueue()
+  })
+}
+
+// attempt to cancel an in-progress query
+Client.prototype.cancel = function (query) {
+  if (this._activeQuery === query) {
+    this.native.cancel(function () {})
+  } else if (this._queryQueue.indexOf(query) !== -1) {
+    this._queryQueue.splice(this._queryQueue.indexOf(query), 1)
+  }
+}
+
+Client.prototype.ref = function () {}
+Client.prototype.unref = function () {}
+
+Client.prototype.setTypeParser = function (oid, format, parseFn) {
+  return this._types.setTypeParser(oid, format, parseFn)
+}
+
+Client.prototype.getTypeParser = function (oid, format) {
+  return this._types.getTypeParser(oid, format)
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,2 @@
+'use strict'
+module.exports = require('./client')
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/query.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/native/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,165 @@
+'use strict'
+
+const EventEmitter = require('events').EventEmitter
+const util = require('util')
+const utils = require('../utils')
+
+const NativeQuery = (module.exports = function (config, values, callback) {
+  EventEmitter.call(this)
+  config = utils.normalizeQueryConfig(config, values, callback)
+  this.text = config.text
+  this.values = config.values
+  this.name = config.name
+  this.queryMode = config.queryMode
+  this.callback = config.callback
+  this.state = 'new'
+  this._arrayMode = config.rowMode === 'array'
+
+  // if the 'row' event is listened for
+  // then emit them as they come in
+  // without setting singleRowMode to true
+  // this has almost no meaning because libpq
+  // reads all rows into memory before returning any
+  this._emitRowEvents = false
+  this.on(
+    'newListener',
+    function (event) {
+      if (event === 'row') this._emitRowEvents = true
+    }.bind(this)
+  )
+})
+
+util.inherits(NativeQuery, EventEmitter)
+
+const errorFieldMap = {
+  sqlState: 'code',
+  statementPosition: 'position',
+  messagePrimary: 'message',
+  context: 'where',
+  schemaName: 'schema',
+  tableName: 'table',
+  columnName: 'column',
+  dataTypeName: 'dataType',
+  constraintName: 'constraint',
+  sourceFile: 'file',
+  sourceLine: 'line',
+  sourceFunction: 'routine',
+}
+
+NativeQuery.prototype.handleError = function (err) {
+  // copy pq error fields into the error object
+  const fields = this.native.pq.resultErrorFields()
+  if (fields) {
+    for (const key in fields) {
+      const normalizedFieldName = errorFieldMap[key] || key
+      err[normalizedFieldName] = fields[key]
+    }
+  }
+  if (this.callback) {
+    this.callback(err)
+  } else {
+    this.emit('error', err)
+  }
+  this.state = 'error'
+}
+
+NativeQuery.prototype.then = function (onSuccess, onFailure) {
+  return this._getPromise().then(onSuccess, onFailure)
+}
+
+NativeQuery.prototype.catch = function (callback) {
+  return this._getPromise().catch(callback)
+}
+
+NativeQuery.prototype._getPromise = function () {
+  if (this._promise) return this._promise
+  this._promise = new Promise(
+    function (resolve, reject) {
+      this._once('end', resolve)
+      this._once('error', reject)
+    }.bind(this)
+  )
+  return this._promise
+}
+
+NativeQuery.prototype.submit = function (client) {
+  this.state = 'running'
+  const self = this
+  this.native = client.native
+  client.native.arrayMode = this._arrayMode
+
+  let after = function (err, rows, results) {
+    client.native.arrayMode = false
+    setImmediate(function () {
+      self.emit('_done')
+    })
+
+    // handle possible query error
+    if (err) {
+      return self.handleError(err)
+    }
+
+    // emit row events for each row in the result
+    if (self._emitRowEvents) {
+      if (results.length > 1) {
+        rows.forEach((rowOfRows, i) => {
+          rowOfRows.forEach((row) => {
+            self.emit('row', row, results[i])
+          })
+        })
+      } else {
+        rows.forEach(function (row) {
+          self.emit('row', row, results)
+        })
+      }
+    }
+
+    // handle successful result
+    self.state = 'end'
+    self.emit('end', results)
+    if (self.callback) {
+      self.callback(null, results)
+    }
+  }
+
+  if (process.domain) {
+    after = process.domain.bind(after)
+  }
+
+  // named query
+  if (this.name) {
+    if (this.name.length > 63) {
+      console.error('Warning! Postgres only supports 63 characters for query names.')
+      console.error('You supplied %s (%s)', this.name, this.name.length)
+      console.error('This can cause conflicts and silent errors executing queries')
+    }
+    const values = (this.values || []).map(utils.prepareValue)
+
+    // check if the client has already executed this named query
+    // if so...just execute it again - skip the planning phase
+    if (client.namedQueries[this.name]) {
+      if (this.text && client.namedQueries[this.name] !== this.text) {
+        const err = new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)
+        return after(err)
+      }
+      return client.native.execute(this.name, values, after)
+    }
+    // plan the named query the first time, then execute it
+    return client.native.prepare(this.name, this.text, values.length, function (err) {
+      if (err) return after(err)
+      client.namedQueries[self.name] = self.text
+      return self.native.execute(self.name, values, after)
+    })
+  } else if (this.values) {
+    if (!Array.isArray(this.values)) {
+      const err = new Error('Query values must be an array')
+      return after(err)
+    }
+    const vals = this.values.map(utils.prepareValue)
+    client.native.query(this.text, vals, after)
+  } else if (this.queryMode === 'extended') {
+    client.native.query(this.text, [], after)
+  } else {
+    client.native.query(this.text, after)
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/query.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,252 @@
+'use strict'
+
+const { EventEmitter } = require('events')
+
+const Result = require('./result')
+const utils = require('./utils')
+
+class Query extends EventEmitter {
+  constructor(config, values, callback) {
+    super()
+
+    config = utils.normalizeQueryConfig(config, values, callback)
+
+    this.text = config.text
+    this.values = config.values
+    this.rows = config.rows
+    this.types = config.types
+    this.name = config.name
+    this.queryMode = config.queryMode
+    this.binary = config.binary
+    // use unique portal name each time
+    this.portal = config.portal || ''
+    this.callback = config.callback
+    this._rowMode = config.rowMode
+    if (process.domain && config.callback) {
+      this.callback = process.domain.bind(config.callback)
+    }
+    this._result = new Result(this._rowMode, this.types)
+
+    // potential for multiple results
+    this._results = this._result
+    this._canceledDueToError = false
+  }
+
+  requiresPreparation() {
+    if (this.queryMode === 'extended') {
+      return true
+    }
+
+    // named queries must always be prepared
+    if (this.name) {
+      return true
+    }
+    // always prepare if there are max number of rows expected per
+    // portal execution
+    if (this.rows) {
+      return true
+    }
+    // don't prepare empty text queries
+    if (!this.text) {
+      return false
+    }
+    // prepare if there are values
+    if (!this.values) {
+      return false
+    }
+    return this.values.length > 0
+  }
+
+  _checkForMultirow() {
+    // if we already have a result with a command property
+    // then we've already executed one query in a multi-statement simple query
+    // turn our results into an array of results
+    if (this._result.command) {
+      if (!Array.isArray(this._results)) {
+        this._results = [this._result]
+      }
+      this._result = new Result(this._rowMode, this._result._types)
+      this._results.push(this._result)
+    }
+  }
+
+  // associates row metadata from the supplied
+  // message with this query object
+  // metadata used when parsing row results
+  handleRowDescription(msg) {
+    this._checkForMultirow()
+    this._result.addFields(msg.fields)
+    this._accumulateRows = this.callback || !this.listeners('row').length
+  }
+
+  handleDataRow(msg) {
+    let row
+
+    if (this._canceledDueToError) {
+      return
+    }
+
+    try {
+      row = this._result.parseRow(msg.fields)
+    } catch (err) {
+      this._canceledDueToError = err
+      return
+    }
+
+    this.emit('row', row, this._result)
+    if (this._accumulateRows) {
+      this._result.addRow(row)
+    }
+  }
+
+  handleCommandComplete(msg, connection) {
+    this._checkForMultirow()
+    this._result.addCommandComplete(msg)
+    // need to sync after each command complete of a prepared statement
+    // if we were using a row count which results in multiple calls to _getRows
+    if (this.rows) {
+      connection.sync()
+    }
+  }
+
+  // if a named prepared statement is created with empty query text
+  // the backend will send an emptyQuery message but *not* a command complete message
+  // since we pipeline sync immediately after execute we don't need to do anything here
+  // unless we have rows specified, in which case we did not pipeline the initial sync call
+  handleEmptyQuery(connection) {
+    if (this.rows) {
+      connection.sync()
+    }
+  }
+
+  handleError(err, connection) {
+    // need to sync after error during a prepared statement
+    if (this._canceledDueToError) {
+      err = this._canceledDueToError
+      this._canceledDueToError = false
+    }
+    // if callback supplied do not emit error event as uncaught error
+    // events will bubble up to node process
+    if (this.callback) {
+      return this.callback(err)
+    }
+    this.emit('error', err)
+  }
+
+  handleReadyForQuery(con) {
+    if (this._canceledDueToError) {
+      return this.handleError(this._canceledDueToError, con)
+    }
+    if (this.callback) {
+      try {
+        this.callback(null, this._results)
+      } catch (err) {
+        process.nextTick(() => {
+          throw err
+        })
+      }
+    }
+    this.emit('end', this._results)
+  }
+
+  submit(connection) {
+    if (typeof this.text !== 'string' && typeof this.name !== 'string') {
+      return new Error('A query must have either text or a name. Supplying neither is unsupported.')
+    }
+    const previous = connection.parsedStatements[this.name]
+    if (this.text && previous && this.text !== previous) {
+      return new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)
+    }
+    if (this.values && !Array.isArray(this.values)) {
+      return new Error('Query values must be an array')
+    }
+    if (this.requiresPreparation()) {
+      // If we're using the extended query protocol we fire off several separate commands
+      // to the backend. On some versions of node & some operating system versions
+      // the network stack writes each message separately instead of buffering them together
+      // causing the client & network to send more slowly. Corking & uncorking the stream
+      // allows node to buffer up the messages internally before sending them all off at once.
+      // note: we're checking for existence of cork/uncork because some versions of streams
+      // might not have this (cloudflare?)
+      connection.stream.cork && connection.stream.cork()
+      try {
+        this.prepare(connection)
+      } finally {
+        // while unlikely for this.prepare to throw, if it does & we don't uncork this stream
+        // this client becomes unresponsive, so put in finally block "just in case"
+        connection.stream.uncork && connection.stream.uncork()
+      }
+    } else {
+      connection.query(this.text)
+    }
+    return null
+  }
+
+  hasBeenParsed(connection) {
+    return this.name && connection.parsedStatements[this.name]
+  }
+
+  handlePortalSuspended(connection) {
+    this._getRows(connection, this.rows)
+  }
+
+  _getRows(connection, rows) {
+    connection.execute({
+      portal: this.portal,
+      rows: rows,
+    })
+    // if we're not reading pages of rows send the sync command
+    // to indicate the pipeline is finished
+    if (!rows) {
+      connection.sync()
+    } else {
+      // otherwise flush the call out to read more rows
+      connection.flush()
+    }
+  }
+
+  // http://developer.postgresql.org/pgdocs/postgres/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY
+  prepare(connection) {
+    // TODO refactor this poor encapsulation
+    if (!this.hasBeenParsed(connection)) {
+      connection.parse({
+        text: this.text,
+        name: this.name,
+        types: this.types,
+      })
+    }
+
+    // because we're mapping user supplied values to
+    // postgres wire protocol compatible values it could
+    // throw an exception, so try/catch this section
+    try {
+      connection.bind({
+        portal: this.portal,
+        statement: this.name,
+        values: this.values,
+        binary: this.binary,
+        valueMapper: utils.prepareValue,
+      })
+    } catch (err) {
+      this.handleError(err, connection)
+      return
+    }
+
+    connection.describe({
+      type: 'P',
+      name: this.portal || '',
+    })
+
+    this._getRows(connection, this.rows)
+  }
+
+  handleCopyInResponse(connection) {
+    connection.sendCopyFail('No source stream defined')
+  }
+
+  handleCopyData(msg, connection) {
+    // noop
+  }
+}
+
+module.exports = Query
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/result.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/result.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/result.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,109 @@
+'use strict'
+
+const types = require('pg-types')
+
+const matchRegexp = /^([A-Za-z]+)(?: (\d+))?(?: (\d+))?/
+
+// result object returned from query
+// in the 'end' event and also
+// passed as second argument to provided callback
+class Result {
+  constructor(rowMode, types) {
+    this.command = null
+    this.rowCount = null
+    this.oid = null
+    this.rows = []
+    this.fields = []
+    this._parsers = undefined
+    this._types = types
+    this.RowCtor = null
+    this.rowAsArray = rowMode === 'array'
+    if (this.rowAsArray) {
+      this.parseRow = this._parseRowAsArray
+    }
+    this._prebuiltEmptyResultObject = null
+  }
+
+  // adds a command complete message
+  addCommandComplete(msg) {
+    let match
+    if (msg.text) {
+      // pure javascript
+      match = matchRegexp.exec(msg.text)
+    } else {
+      // native bindings
+      match = matchRegexp.exec(msg.command)
+    }
+    if (match) {
+      this.command = match[1]
+      if (match[3]) {
+        // COMMAND OID ROWS
+        this.oid = parseInt(match[2], 10)
+        this.rowCount = parseInt(match[3], 10)
+      } else if (match[2]) {
+        // COMMAND ROWS
+        this.rowCount = parseInt(match[2], 10)
+      }
+    }
+  }
+
+  _parseRowAsArray(rowData) {
+    const row = new Array(rowData.length)
+    for (let i = 0, len = rowData.length; i < len; i++) {
+      const rawValue = rowData[i]
+      if (rawValue !== null) {
+        row[i] = this._parsers[i](rawValue)
+      } else {
+        row[i] = null
+      }
+    }
+    return row
+  }
+
+  parseRow(rowData) {
+    const row = { ...this._prebuiltEmptyResultObject }
+    for (let i = 0, len = rowData.length; i < len; i++) {
+      const rawValue = rowData[i]
+      const field = this.fields[i].name
+      if (rawValue !== null) {
+        const v = this.fields[i].format === 'binary' ? Buffer.from(rawValue) : rawValue
+        row[field] = this._parsers[i](v)
+      } else {
+        row[field] = null
+      }
+    }
+    return row
+  }
+
+  addRow(row) {
+    this.rows.push(row)
+  }
+
+  addFields(fieldDescriptions) {
+    // clears field definitions
+    // multiple query statements in 1 action can result in multiple sets
+    // of rowDescriptions...eg: 'select NOW(); select 1::int;'
+    // you need to reset the fields
+    this.fields = fieldDescriptions
+    if (this.fields.length) {
+      this._parsers = new Array(fieldDescriptions.length)
+    }
+
+    const row = {}
+
+    for (let i = 0; i < fieldDescriptions.length; i++) {
+      const desc = fieldDescriptions[i]
+      row[desc.name] = null
+
+      if (this._types) {
+        this._parsers[i] = this._types.getTypeParser(desc.dataTypeID, desc.format || 'text')
+      } else {
+        this._parsers[i] = types.getTypeParser(desc.dataTypeID, desc.format || 'text')
+      }
+    }
+
+    this._prebuiltEmptyResultObject = { ...row }
+  }
+}
+
+module.exports = Result
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/stream.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/stream.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/stream.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,83 @@
+const { getStream, getSecureStream } = getStreamFuncs()
+
+module.exports = {
+  /**
+   * Get a socket stream compatible with the current runtime environment.
+   * @returns {Duplex}
+   */
+  getStream,
+  /**
+   * Get a TLS secured socket, compatible with the current environment,
+   * using the socket and other settings given in `options`.
+   * @returns {Duplex}
+   */
+  getSecureStream,
+}
+
+/**
+ * The stream functions that work in Node.js
+ */
+function getNodejsStreamFuncs() {
+  function getStream(ssl) {
+    const net = require('net')
+    return new net.Socket()
+  }
+
+  function getSecureStream(options) {
+    const tls = require('tls')
+    return tls.connect(options)
+  }
+  return {
+    getStream,
+    getSecureStream,
+  }
+}
+
+/**
+ * The stream functions that work in Cloudflare Workers
+ */
+function getCloudflareStreamFuncs() {
+  function getStream(ssl) {
+    const { CloudflareSocket } = require('pg-cloudflare')
+    return new CloudflareSocket(ssl)
+  }
+
+  function getSecureStream(options) {
+    options.socket.startTls(options)
+    return options.socket
+  }
+  return {
+    getStream,
+    getSecureStream,
+  }
+}
+
+/**
+ * Are we running in a Cloudflare Worker?
+ *
+ * @returns true if the code is currently running inside a Cloudflare Worker.
+ */
+function isCloudflareRuntime() {
+  // Since 2022-03-21 the `global_navigator` compatibility flag is on for Cloudflare Workers
+  // which means that `navigator.userAgent` will be defined.
+  // eslint-disable-next-line no-undef
+  if (typeof navigator === 'object' && navigator !== null && typeof navigator.userAgent === 'string') {
+    // eslint-disable-next-line no-undef
+    return navigator.userAgent === 'Cloudflare-Workers'
+  }
+  // In case `navigator` or `navigator.userAgent` is not defined then try a more sneaky approach
+  if (typeof Response === 'function') {
+    const resp = new Response(null, { cf: { thing: true } })
+    if (typeof resp.cf === 'object' && resp.cf !== null && resp.cf.thing) {
+      return true
+    }
+  }
+  return false
+}
+
+function getStreamFuncs() {
+  if (isCloudflareRuntime()) {
+    return getCloudflareStreamFuncs()
+  }
+  return getNodejsStreamFuncs()
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/type-overrides.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/type-overrides.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/type-overrides.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,35 @@
+'use strict'
+
+const types = require('pg-types')
+
+function TypeOverrides(userTypes) {
+  this._types = userTypes || types
+  this.text = {}
+  this.binary = {}
+}
+
+TypeOverrides.prototype.getOverrides = function (format) {
+  switch (format) {
+    case 'text':
+      return this.text
+    case 'binary':
+      return this.binary
+    default:
+      return {}
+  }
+}
+
+TypeOverrides.prototype.setTypeParser = function (oid, format, parseFn) {
+  if (typeof format === 'function') {
+    parseFn = format
+    format = 'text'
+  }
+  this.getOverrides(format)[oid] = parseFn
+}
+
+TypeOverrides.prototype.getTypeParser = function (oid, format) {
+  format = format || 'text'
+  return this.getOverrides(format)[oid] || this._types.getTypeParser(oid, format)
+}
+
+module.exports = TypeOverrides
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/lib/utils.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/lib/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/lib/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,217 @@
+'use strict'
+
+const defaults = require('./defaults')
+
+const util = require('util')
+const { isDate } = util.types || util // Node 8 doesn't have `util.types`
+
+function escapeElement(elementRepresentation) {
+  const escaped = elementRepresentation.replace(/\\/g, '\\\\').replace(/"/g, '\\"')
+
+  return '"' + escaped + '"'
+}
+
+// convert a JS array to a postgres array literal
+// uses comma separator so won't work for types like box that use
+// a different array separator.
+function arrayString(val) {
+  let result = '{'
+  for (let i = 0; i < val.length; i++) {
+    if (i > 0) {
+      result = result + ','
+    }
+    if (val[i] === null || typeof val[i] === 'undefined') {
+      result = result + 'NULL'
+    } else if (Array.isArray(val[i])) {
+      result = result + arrayString(val[i])
+    } else if (ArrayBuffer.isView(val[i])) {
+      let item = val[i]
+      if (!(item instanceof Buffer)) {
+        const buf = Buffer.from(item.buffer, item.byteOffset, item.byteLength)
+        if (buf.length === item.byteLength) {
+          item = buf
+        } else {
+          item = buf.slice(item.byteOffset, item.byteOffset + item.byteLength)
+        }
+      }
+      result += '\\\\x' + item.toString('hex')
+    } else {
+      result += escapeElement(prepareValue(val[i]))
+    }
+  }
+  result = result + '}'
+  return result
+}
+
+// converts values from javascript types
+// to their 'raw' counterparts for use as a postgres parameter
+// note: you can override this function to provide your own conversion mechanism
+// for complex types, etc...
+const prepareValue = function (val, seen) {
+  // null and undefined are both null for postgres
+  if (val == null) {
+    return null
+  }
+  if (typeof val === 'object') {
+    if (val instanceof Buffer) {
+      return val
+    }
+    if (ArrayBuffer.isView(val)) {
+      const buf = Buffer.from(val.buffer, val.byteOffset, val.byteLength)
+      if (buf.length === val.byteLength) {
+        return buf
+      }
+      return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params
+    }
+    if (isDate(val)) {
+      if (defaults.parseInputDatesAsUTC) {
+        return dateToStringUTC(val)
+      } else {
+        return dateToString(val)
+      }
+    }
+    if (Array.isArray(val)) {
+      return arrayString(val)
+    }
+
+    return prepareObject(val, seen)
+  }
+  return val.toString()
+}
+
+function prepareObject(val, seen) {
+  if (val && typeof val.toPostgres === 'function') {
+    seen = seen || []
+    if (seen.indexOf(val) !== -1) {
+      throw new Error('circular reference detected while preparing "' + val + '" for query')
+    }
+    seen.push(val)
+
+    return prepareValue(val.toPostgres(prepareValue), seen)
+  }
+  return JSON.stringify(val)
+}
+
+function dateToString(date) {
+  let offset = -date.getTimezoneOffset()
+
+  let year = date.getFullYear()
+  const isBCYear = year < 1
+  if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation
+
+  let ret =
+    String(year).padStart(4, '0') +
+    '-' +
+    String(date.getMonth() + 1).padStart(2, '0') +
+    '-' +
+    String(date.getDate()).padStart(2, '0') +
+    'T' +
+    String(date.getHours()).padStart(2, '0') +
+    ':' +
+    String(date.getMinutes()).padStart(2, '0') +
+    ':' +
+    String(date.getSeconds()).padStart(2, '0') +
+    '.' +
+    String(date.getMilliseconds()).padStart(3, '0')
+
+  if (offset < 0) {
+    ret += '-'
+    offset *= -1
+  } else {
+    ret += '+'
+  }
+
+  ret += String(Math.floor(offset / 60)).padStart(2, '0') + ':' + String(offset % 60).padStart(2, '0')
+  if (isBCYear) ret += ' BC'
+  return ret
+}
+
+function dateToStringUTC(date) {
+  let year = date.getUTCFullYear()
+  const isBCYear = year < 1
+  if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation
+
+  let ret =
+    String(year).padStart(4, '0') +
+    '-' +
+    String(date.getUTCMonth() + 1).padStart(2, '0') +
+    '-' +
+    String(date.getUTCDate()).padStart(2, '0') +
+    'T' +
+    String(date.getUTCHours()).padStart(2, '0') +
+    ':' +
+    String(date.getUTCMinutes()).padStart(2, '0') +
+    ':' +
+    String(date.getUTCSeconds()).padStart(2, '0') +
+    '.' +
+    String(date.getUTCMilliseconds()).padStart(3, '0')
+
+  ret += '+00:00'
+  if (isBCYear) ret += ' BC'
+  return ret
+}
+
+function normalizeQueryConfig(config, values, callback) {
+  // can take in strings or config objects
+  config = typeof config === 'string' ? { text: config } : config
+  if (values) {
+    if (typeof values === 'function') {
+      config.callback = values
+    } else {
+      config.values = values
+    }
+  }
+  if (callback) {
+    config.callback = callback
+  }
+  return config
+}
+
+// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c
+const escapeIdentifier = function (str) {
+  return '"' + str.replace(/"/g, '""') + '"'
+}
+
+const escapeLiteral = function (str) {
+  let hasBackslash = false
+  let escaped = "'"
+
+  if (str == null) {
+    return "''"
+  }
+
+  if (typeof str !== 'string') {
+    return "''"
+  }
+
+  for (let i = 0; i < str.length; i++) {
+    const c = str[i]
+    if (c === "'") {
+      escaped += c + c
+    } else if (c === '\\') {
+      escaped += c + c
+      hasBackslash = true
+    } else {
+      escaped += c
+    }
+  }
+
+  escaped += "'"
+
+  if (hasBackslash === true) {
+    escaped = ' E' + escaped
+  }
+
+  return escaped
+}
+
+module.exports = {
+  prepareValue: function prepareValueWrapper(value) {
+    // this ensures that extra arguments do not get passed into prepareValue
+    // by accident, eg: from calling values.map(utils.prepareValue)
+    return prepareValue(value)
+  },
+  normalizeQueryConfig,
+  escapeIdentifier,
+  escapeLiteral,
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pg/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pg/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pg/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,76 @@
+{
+  "name": "pg",
+  "version": "8.16.3",
+  "description": "PostgreSQL client - pure javascript & libpq with the same API",
+  "keywords": [
+    "database",
+    "libpq",
+    "pg",
+    "postgre",
+    "postgres",
+    "postgresql",
+    "rdbms"
+  ],
+  "homepage": "https://github.com/brianc/node-postgres",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg"
+  },
+  "author": "Brian Carlson <brian.m.carlson@gmail.com>",
+  "main": "./lib",
+  "exports": {
+    ".": {
+      "import": "./esm/index.mjs",
+      "require": "./lib/index.js",
+      "default": "./lib/index.js"
+    },
+    "./package.json": {
+      "default": "./package.json"
+    },
+    "./lib/*": "./lib/*.js",
+    "./lib/*.js": "./lib/*.js"
+  },
+  "dependencies": {
+    "pg-connection-string": "^2.9.1",
+    "pg-pool": "^3.10.1",
+    "pg-protocol": "^1.10.3",
+    "pg-types": "2.2.0",
+    "pgpass": "1.0.5"
+  },
+  "devDependencies": {
+    "@cloudflare/vitest-pool-workers": "0.8.23",
+    "@cloudflare/workers-types": "^4.20230404.0",
+    "async": "2.6.4",
+    "bluebird": "3.7.2",
+    "co": "4.6.0",
+    "pg-copy-streams": "0.3.0",
+    "typescript": "^4.0.3",
+    "vitest": "~3.0.9",
+    "wrangler": "^3.x"
+  },
+  "optionalDependencies": {
+    "pg-cloudflare": "^1.2.7"
+  },
+  "peerDependencies": {
+    "pg-native": ">=3.0.1"
+  },
+  "peerDependenciesMeta": {
+    "pg-native": {
+      "optional": true
+    }
+  },
+  "scripts": {
+    "test": "make test-all"
+  },
+  "files": [
+    "lib",
+    "esm",
+    "SPONSORS.md"
+  ],
+  "license": "MIT",
+  "engines": {
+    "node": ">= 16.0.0"
+  },
+  "gitHead": "8f8e7315e8f7c1bb01e98fdb41c8c92585510782"
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/pgpass/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pgpass/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pgpass/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,74 @@
+# pgpass
+
+[![Build Status](https://github.com/hoegaarden/pgpass/workflows/CI/badge.svg?branch=master)](https://github.com/hoegaarden/pgpass/actions?query=workflow%3ACI+branch%3Amaster)
+
+## Install
+
+```sh
+npm install pgpass
+```
+
+## Usage
+```js
+var pgPass = require('pgpass');
+
+var connInfo = {
+  'host' : 'pgserver' ,
+  'user' : 'the_user_name' ,
+};
+
+pgPass(connInfo, function(pass){
+  conn_info.password = pass;
+  // connect to postgresql server
+});
+```
+
+## Description
+
+This module tries to read the `~/.pgpass` file (or the equivalent for windows systems). If the environment variable `PGPASSFILE` is set, this file is used instead. If everything goes right, the password from said file is passed to the callback; if the password cannot be read `undefined` is passed to the callback.
+
+Cases where `undefined` is returned:
+
+- the environment variable `PGPASSWORD` is set
+- the file cannot be read (wrong permissions, no such file, ...)
+- for non windows systems: the file is write-/readable by the group or by other users
+- there is no matching line for the given connection info
+
+There should be no need to use this module directly; it is already included in `node-postgres`.
+
+## Configuration
+
+The module reads the environment variable `PGPASS_NO_DEESCAPE` to decide if the the read tokens from the password file should be de-escaped or not. Default is to do de-escaping. For further information on this see [this commit](https://github.com/postgres/postgres/commit/8d15e3ec4fcb735875a8a70a09ec0c62153c3329).
+
+
+## Tests
+
+There are tests in `./test/`; including linting and coverage testing. Running `npm test` runs:
+
+- `jshint`
+- `mocha` tests
+- `jscoverage` and `mocha -R html-cov`
+
+You can see the coverage report in `coverage.html`.
+
+
+## Development, Patches, Bugs, ...
+
+If you find Bugs or have improvements, please feel free to open a issue on GitHub. If you provide a pull request, I'm more than happy to merge them, just make sure to add tests for your changes.
+
+## Links
+
+- https://github.com/hoegaarden/node-pgpass
+- http://www.postgresql.org/docs/current/static/libpq-pgpass.html
+- https://wiki.postgresql.org/wiki/Pgpass
+- https://github.com/postgres/postgres/blob/master/src/interfaces/libpq/fe-connect.c
+
+## License
+
+Copyright (c) 2013-2016 Hannes Hörl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/pgpass/lib/helper.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pgpass/lib/helper.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pgpass/lib/helper.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,233 @@
+'use strict';
+
+var path = require('path')
+  , Stream = require('stream').Stream
+  , split = require('split2')
+  , util = require('util')
+  , defaultPort = 5432
+  , isWin = (process.platform === 'win32')
+  , warnStream = process.stderr
+;
+
+
+var S_IRWXG = 56     //    00070(8)
+  , S_IRWXO = 7      //    00007(8)
+  , S_IFMT  = 61440  // 00170000(8)
+  , S_IFREG = 32768  //  0100000(8)
+;
+function isRegFile(mode) {
+    return ((mode & S_IFMT) == S_IFREG);
+}
+
+var fieldNames = [ 'host', 'port', 'database', 'user', 'password' ];
+var nrOfFields = fieldNames.length;
+var passKey = fieldNames[ nrOfFields -1 ];
+
+
+function warn() {
+    var isWritable = (
+        warnStream instanceof Stream &&
+          true === warnStream.writable
+    );
+
+    if (isWritable) {
+        var args = Array.prototype.slice.call(arguments).concat("\n");
+        warnStream.write( util.format.apply(util, args) );
+    }
+}
+
+
+Object.defineProperty(module.exports, 'isWin', {
+    get : function() {
+        return isWin;
+    } ,
+    set : function(val) {
+        isWin = val;
+    }
+});
+
+
+module.exports.warnTo = function(stream) {
+    var old = warnStream;
+    warnStream = stream;
+    return old;
+};
+
+module.exports.getFileName = function(rawEnv){
+    var env = rawEnv || process.env;
+    var file = env.PGPASSFILE || (
+        isWin ?
+          path.join( env.APPDATA || './' , 'postgresql', 'pgpass.conf' ) :
+          path.join( env.HOME || './', '.pgpass' )
+    );
+    return file;
+};
+
+module.exports.usePgPass = function(stats, fname) {
+    if (Object.prototype.hasOwnProperty.call(process.env, 'PGPASSWORD')) {
+        return false;
+    }
+
+    if (isWin) {
+        return true;
+    }
+
+    fname = fname || '<unkn>';
+
+    if (! isRegFile(stats.mode)) {
+        warn('WARNING: password file "%s" is not a plain file', fname);
+        return false;
+    }
+
+    if (stats.mode & (S_IRWXG | S_IRWXO)) {
+        /* If password file is insecure, alert the user and ignore it. */
+        warn('WARNING: password file "%s" has group or world access; permissions should be u=rw (0600) or less', fname);
+        return false;
+    }
+
+    return true;
+};
+
+
+var matcher = module.exports.match = function(connInfo, entry) {
+    return fieldNames.slice(0, -1).reduce(function(prev, field, idx){
+        if (idx == 1) {
+            // the port
+            if ( Number( connInfo[field] || defaultPort ) === Number( entry[field] ) ) {
+                return prev && true;
+            }
+        }
+        return prev && (
+            entry[field] === '*' ||
+              entry[field] === connInfo[field]
+        );
+    }, true);
+};
+
+
+module.exports.getPassword = function(connInfo, stream, cb) {
+    var pass;
+    var lineStream = stream.pipe(split());
+
+    function onLine(line) {
+        var entry = parseLine(line);
+        if (entry && isValidEntry(entry) && matcher(connInfo, entry)) {
+            pass = entry[passKey];
+            lineStream.end(); // -> calls onEnd(), but pass is set now
+        }
+    }
+
+    var onEnd = function() {
+        stream.destroy();
+        cb(pass);
+    };
+
+    var onErr = function(err) {
+        stream.destroy();
+        warn('WARNING: error on reading file: %s', err);
+        cb(undefined);
+    };
+
+    stream.on('error', onErr);
+    lineStream
+        .on('data', onLine)
+        .on('end', onEnd)
+        .on('error', onErr)
+    ;
+
+};
+
+
+var parseLine = module.exports.parseLine = function(line) {
+    if (line.length < 11 || line.match(/^\s+#/)) {
+        return null;
+    }
+
+    var curChar = '';
+    var prevChar = '';
+    var fieldIdx = 0;
+    var startIdx = 0;
+    var endIdx = 0;
+    var obj = {};
+    var isLastField = false;
+    var addToObj = function(idx, i0, i1) {
+        var field = line.substring(i0, i1);
+
+        if (! Object.hasOwnProperty.call(process.env, 'PGPASS_NO_DEESCAPE')) {
+            field = field.replace(/\\([:\\])/g, '$1');
+        }
+
+        obj[ fieldNames[idx] ] = field;
+    };
+
+    for (var i = 0 ; i < line.length-1 ; i += 1) {
+        curChar = line.charAt(i+1);
+        prevChar = line.charAt(i);
+
+        isLastField = (fieldIdx == nrOfFields-1);
+
+        if (isLastField) {
+            addToObj(fieldIdx, startIdx);
+            break;
+        }
+
+        if (i >= 0 && curChar == ':' && prevChar !== '\\') {
+            addToObj(fieldIdx, startIdx, i+1);
+
+            startIdx = i+2;
+            fieldIdx += 1;
+        }
+    }
+
+    obj = ( Object.keys(obj).length === nrOfFields ) ? obj : null;
+
+    return obj;
+};
+
+
+var isValidEntry = module.exports.isValidEntry = function(entry){
+    var rules = {
+        // host
+        0 : function(x){
+            return x.length > 0;
+        } ,
+        // port
+        1 : function(x){
+            if (x === '*') {
+                return true;
+            }
+            x = Number(x);
+            return (
+                isFinite(x) &&
+                  x > 0 &&
+                  x < 9007199254740992 &&
+                  Math.floor(x) === x
+            );
+        } ,
+        // database
+        2 : function(x){
+            return x.length > 0;
+        } ,
+        // username
+        3 : function(x){
+            return x.length > 0;
+        } ,
+        // password
+        4 : function(x){
+            return x.length > 0;
+        }
+    };
+
+    for (var idx = 0 ; idx < fieldNames.length ; idx += 1) {
+        var rule = rules[idx];
+        var value = entry[ fieldNames[idx] ] || '';
+
+        var res = rule(value);
+        if (!res) {
+            return false;
+        }
+    }
+
+    return true;
+};
+
Index: TruckSimulator-main/ds-db-ws/node_modules/pgpass/lib/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pgpass/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pgpass/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,23 @@
+'use strict';
+
+var path = require('path')
+  , fs = require('fs')
+  , helper = require('./helper.js')
+;
+
+
+module.exports = function(connInfo, cb) {
+    var file = helper.getFileName();
+    
+    fs.stat(file, function(err, stat){
+        if (err || !helper.usePgPass(stat, file)) {
+            return cb(undefined);
+        }
+
+        var st = fs.createReadStream(file);
+
+        helper.getPassword(connInfo, st, cb);
+    });
+};
+
+module.exports.warnTo = helper.warnTo;
Index: TruckSimulator-main/ds-db-ws/node_modules/pgpass/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/pgpass/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/pgpass/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,41 @@
+{
+  "name": "pgpass",
+  "version": "1.0.5",
+  "description": "Module for reading .pgpass",
+  "main": "lib/index",
+  "scripts": {
+    "pretest": "chmod 600 ./test/_pgpass",
+    "_hint": "jshint --exclude node_modules --verbose lib test",
+    "_test": "mocha --recursive -R list",
+    "_covered_test": "nyc --reporter html --reporter text \"$npm_execpath\" run _test",
+    "test": "\"$npm_execpath\" run _hint && \"$npm_execpath\" run _covered_test"
+  },
+  "author": "Hannes Hörl <hannes.hoerl+pgpass@snowreporter.com>",
+  "license": "MIT",
+  "dependencies": {
+    "split2": "^4.1.0"
+  },
+  "devDependencies": {
+    "jshint": "^2.12.0",
+    "mocha": "^8.2.0",
+    "nyc": "^15.1.0",
+    "pg": "^8.4.1",
+    "pg-escape": "^0.2.0",
+    "pg-native": "3.0.0",
+    "resumer": "0.0.0",
+    "tmp": "^0.2.1",
+    "which": "^2.0.2"
+  },
+  "keywords": [
+    "postgres",
+    "pg",
+    "pgpass",
+    "password",
+    "postgresql"
+  ],
+  "bugs": "https://github.com/hoegaarden/pgpass/issues",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/hoegaarden/pgpass.git"
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-array/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-array/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-array/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,4 @@
+
+export function parse(source: string): string[];
+export function parse<T>(source: string, transform: (value: string) => T): T[];
+
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-array/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-array/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-array/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,97 @@
+'use strict'
+
+exports.parse = function (source, transform) {
+  return new ArrayParser(source, transform).parse()
+}
+
+class ArrayParser {
+  constructor (source, transform) {
+    this.source = source
+    this.transform = transform || identity
+    this.position = 0
+    this.entries = []
+    this.recorded = []
+    this.dimension = 0
+  }
+
+  isEof () {
+    return this.position >= this.source.length
+  }
+
+  nextCharacter () {
+    var character = this.source[this.position++]
+    if (character === '\\') {
+      return {
+        value: this.source[this.position++],
+        escaped: true
+      }
+    }
+    return {
+      value: character,
+      escaped: false
+    }
+  }
+
+  record (character) {
+    this.recorded.push(character)
+  }
+
+  newEntry (includeEmpty) {
+    var entry
+    if (this.recorded.length > 0 || includeEmpty) {
+      entry = this.recorded.join('')
+      if (entry === 'NULL' && !includeEmpty) {
+        entry = null
+      }
+      if (entry !== null) entry = this.transform(entry)
+      this.entries.push(entry)
+      this.recorded = []
+    }
+  }
+
+  consumeDimensions () {
+    if (this.source[0] === '[') {
+      while (!this.isEof()) {
+        var char = this.nextCharacter()
+        if (char.value === '=') break
+      }
+    }
+  }
+
+  parse (nested) {
+    var character, parser, quote
+    this.consumeDimensions()
+    while (!this.isEof()) {
+      character = this.nextCharacter()
+      if (character.value === '{' && !quote) {
+        this.dimension++
+        if (this.dimension > 1) {
+          parser = new ArrayParser(this.source.substr(this.position - 1), this.transform)
+          this.entries.push(parser.parse(true))
+          this.position += parser.position - 2
+        }
+      } else if (character.value === '}' && !quote) {
+        this.dimension--
+        if (!this.dimension) {
+          this.newEntry()
+          if (nested) return this.entries
+        }
+      } else if (character.value === '"' && !character.escaped) {
+        if (quote) this.newEntry(true)
+        quote = !quote
+      } else if (character.value === ',' && !quote) {
+        this.newEntry()
+      } else {
+        this.record(character.value)
+      }
+    }
+    if (this.dimension !== 0) {
+      throw new Error('array dimension not balanced')
+    }
+    return this.entries
+  }
+}
+
+function identity (value) {
+  return value
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-array/license
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-array/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-array/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-array/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-array/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-array/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,35 @@
+{
+  "name": "postgres-array",
+  "main": "index.js",
+  "version": "2.0.0",
+  "description": "Parse postgres array columns",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-array",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "types": "index.d.ts",
+  "keywords": [
+    "postgres",
+    "array",
+    "parser"
+  ],
+  "dependencies": {},
+  "devDependencies": {
+    "standard": "^12.0.1",
+    "tape": "^4.0.0"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-array/readme.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-array/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-array/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,43 @@
+# postgres-array [![Build Status](https://travis-ci.org/bendrucker/postgres-array.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-array)
+
+> Parse postgres array columns
+
+
+## Install
+
+```
+$ npm install --save postgres-array
+```
+
+
+## Usage
+
+```js
+var postgresArray = require('postgres-array')
+
+postgresArray.parse('{1,2,3}', (value) => parseInt(value, 10))
+//=> [1, 2, 3]
+```
+
+## API
+
+#### `parse(input, [transform])` -> `array`
+
+##### input
+
+*Required*  
+Type: `string`
+
+A Postgres array string.
+
+##### transform
+
+Type: `function`  
+Default: `identity`
+
+A function that transforms non-null values inserted into the array.
+
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,31 @@
+'use strict'
+
+module.exports = function parseBytea (input) {
+  if (/^\\x/.test(input)) {
+    // new 'hex' style response (pg >9.0)
+    return new Buffer(input.substr(2), 'hex')
+  }
+  var output = ''
+  var i = 0
+  while (i < input.length) {
+    if (input[i] !== '\\') {
+      output += input[i]
+      ++i
+    } else {
+      if (/[0-7]{3}/.test(input.substr(i + 1, 3))) {
+        output += String.fromCharCode(parseInt(input.substr(i + 1, 3), 8))
+        i += 4
+      } else {
+        var backslashes = 1
+        while (i + backslashes < input.length && input[i + backslashes] === '\\') {
+          backslashes++
+        }
+        for (var k = 0; k < Math.floor(backslashes / 2); ++k) {
+          output += '\\'
+        }
+        i += Math.floor(backslashes / 2) * 2
+      }
+    }
+  }
+  return new Buffer(output, 'binary')
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/license
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,34 @@
+{
+  "name": "postgres-bytea",
+  "main": "index.js",
+  "version": "1.0.0",
+  "description": "Postgres bytea parser",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-bytea",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "keywords": [
+    "bytea",
+    "postgres",
+    "binary",
+    "parser"
+  ],
+  "dependencies": {},
+  "devDependencies": {
+    "tape": "^4.0.0",
+    "standard": "^4.0.0"
+  },
+  "files": [
+    "index.js",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/readme.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-bytea/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,34 @@
+# postgres-bytea [![Build Status](https://travis-ci.org/bendrucker/postgres-bytea.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-bytea)
+
+> Postgres bytea parser
+
+
+## Install
+
+```
+$ npm install --save postgres-bytea
+```
+
+
+## Usage
+
+```js
+var bytea = require('postgres-bytea');
+bytea('\\000\\100\\200')
+//=> buffer
+```
+
+## API
+
+#### `bytea(input)` -> `buffer`
+
+##### input
+
+*Required*  
+Type: `string`
+
+A Postgres bytea binary string.
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-date/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-date/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-date/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,116 @@
+'use strict'
+
+var DATE_TIME = /(\d{1,})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(\.\d{1,})?.*?( BC)?$/
+var DATE = /^(\d{1,})-(\d{2})-(\d{2})( BC)?$/
+var TIME_ZONE = /([Z+-])(\d{2})?:?(\d{2})?:?(\d{2})?/
+var INFINITY = /^-?infinity$/
+
+module.exports = function parseDate (isoDate) {
+  if (INFINITY.test(isoDate)) {
+    // Capitalize to Infinity before passing to Number
+    return Number(isoDate.replace('i', 'I'))
+  }
+  var matches = DATE_TIME.exec(isoDate)
+
+  if (!matches) {
+    // Force YYYY-MM-DD dates to be parsed as local time
+    return getDate(isoDate) || null
+  }
+
+  var isBC = !!matches[8]
+  var year = parseInt(matches[1], 10)
+  if (isBC) {
+    year = bcYearToNegativeYear(year)
+  }
+
+  var month = parseInt(matches[2], 10) - 1
+  var day = matches[3]
+  var hour = parseInt(matches[4], 10)
+  var minute = parseInt(matches[5], 10)
+  var second = parseInt(matches[6], 10)
+
+  var ms = matches[7]
+  ms = ms ? 1000 * parseFloat(ms) : 0
+
+  var date
+  var offset = timeZoneOffset(isoDate)
+  if (offset != null) {
+    date = new Date(Date.UTC(year, month, day, hour, minute, second, ms))
+
+    // Account for years from 0 to 99 being interpreted as 1900-1999
+    // by Date.UTC / the multi-argument form of the Date constructor
+    if (is0To99(year)) {
+      date.setUTCFullYear(year)
+    }
+
+    if (offset !== 0) {
+      date.setTime(date.getTime() - offset)
+    }
+  } else {
+    date = new Date(year, month, day, hour, minute, second, ms)
+
+    if (is0To99(year)) {
+      date.setFullYear(year)
+    }
+  }
+
+  return date
+}
+
+function getDate (isoDate) {
+  var matches = DATE.exec(isoDate)
+  if (!matches) {
+    return
+  }
+
+  var year = parseInt(matches[1], 10)
+  var isBC = !!matches[4]
+  if (isBC) {
+    year = bcYearToNegativeYear(year)
+  }
+
+  var month = parseInt(matches[2], 10) - 1
+  var day = matches[3]
+  // YYYY-MM-DD will be parsed as local time
+  var date = new Date(year, month, day)
+
+  if (is0To99(year)) {
+    date.setFullYear(year)
+  }
+
+  return date
+}
+
+// match timezones:
+// Z (UTC)
+// -05
+// +06:30
+function timeZoneOffset (isoDate) {
+  if (isoDate.endsWith('+00')) {
+    return 0
+  }
+
+  var zone = TIME_ZONE.exec(isoDate.split(' ')[1])
+  if (!zone) return
+  var type = zone[1]
+
+  if (type === 'Z') {
+    return 0
+  }
+  var sign = type === '-' ? -1 : 1
+  var offset = parseInt(zone[2], 10) * 3600 +
+    parseInt(zone[3] || 0, 10) * 60 +
+    parseInt(zone[4] || 0, 10)
+
+  return offset * sign * 1000
+}
+
+function bcYearToNegativeYear (year) {
+  // Account for numerical difference between representations of BC years
+  // See: https://github.com/bendrucker/postgres-date/issues/5
+  return -(year - 1)
+}
+
+function is0To99 (num) {
+  return num >= 0 && num < 100
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-date/license
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-date/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-date/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-date/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-date/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-date/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,33 @@
+{
+  "name": "postgres-date",
+  "main": "index.js",
+  "version": "1.0.7",
+  "description": "Postgres date column parser",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-date",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "keywords": [
+    "postgres",
+    "date",
+    "parser"
+  ],
+  "dependencies": {},
+  "devDependencies": {
+    "standard": "^14.0.0",
+    "tape": "^5.0.0"
+  },
+  "files": [
+    "index.js",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-date/readme.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-date/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-date/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,49 @@
+# postgres-date [![Build Status](https://travis-ci.org/bendrucker/postgres-date.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-date) [![Greenkeeper badge](https://badges.greenkeeper.io/bendrucker/postgres-date.svg)](https://greenkeeper.io/)
+
+> Postgres date output parser
+
+This package parses [date/time outputs](https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-DATETIME-OUTPUT) from Postgres into Javascript `Date` objects. Its goal is to match Postgres behavior and preserve data accuracy.
+
+If you find a case where a valid Postgres output results in incorrect parsing (including loss of precision), please [create a pull request](https://github.com/bendrucker/postgres-date/compare) and provide a failing test.
+
+**Supported Postgres Versions:** `>= 9.6`
+
+All prior versions of Postgres are likely compatible but not officially supported.
+
+## Install
+
+```
+$ npm install --save postgres-date
+```
+
+
+## Usage
+
+```js
+var parse = require('postgres-date')
+parse('2011-01-23 22:15:51Z')
+// => 2011-01-23T22:15:51.000Z
+```
+
+## API
+
+#### `parse(isoDate)` -> `date`
+
+##### isoDate
+
+*Required*  
+Type: `string`
+
+A date string from Postgres.
+
+## Releases
+
+The following semantic versioning increments will be used for changes:
+
+* **Major**: Removal of support for Node.js versions or Postgres versions (not expected)
+* **Minor**: Unused, since Postgres returns dates in standard ISO 8601 format
+* **Patch**: Any fix for parsing behavior
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/index.d.ts
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,20 @@
+declare namespace PostgresInterval {
+  export interface IPostgresInterval {
+    years?: number;
+    months?: number;
+    days?: number;
+    hours?: number;
+    minutes?: number;
+    seconds?: number;
+    milliseconds?: number;
+
+    toPostgres(): string;
+
+    toISO(): string;
+    toISOString(): string;
+  }
+}
+
+declare function PostgresInterval(raw: string): PostgresInterval.IPostgresInterval;
+
+export = PostgresInterval;
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,125 @@
+'use strict'
+
+var extend = require('xtend/mutable')
+
+module.exports = PostgresInterval
+
+function PostgresInterval (raw) {
+  if (!(this instanceof PostgresInterval)) {
+    return new PostgresInterval(raw)
+  }
+  extend(this, parse(raw))
+}
+var properties = ['seconds', 'minutes', 'hours', 'days', 'months', 'years']
+PostgresInterval.prototype.toPostgres = function () {
+  var filtered = properties.filter(this.hasOwnProperty, this)
+
+  // In addition to `properties`, we need to account for fractions of seconds.
+  if (this.milliseconds && filtered.indexOf('seconds') < 0) {
+    filtered.push('seconds')
+  }
+
+  if (filtered.length === 0) return '0'
+  return filtered
+    .map(function (property) {
+      var value = this[property] || 0
+
+      // Account for fractional part of seconds,
+      // remove trailing zeroes.
+      if (property === 'seconds' && this.milliseconds) {
+        value = (value + this.milliseconds / 1000).toFixed(6).replace(/\.?0+$/, '')
+      }
+
+      return value + ' ' + property
+    }, this)
+    .join(' ')
+}
+
+var propertiesISOEquivalent = {
+  years: 'Y',
+  months: 'M',
+  days: 'D',
+  hours: 'H',
+  minutes: 'M',
+  seconds: 'S'
+}
+var dateProperties = ['years', 'months', 'days']
+var timeProperties = ['hours', 'minutes', 'seconds']
+// according to ISO 8601
+PostgresInterval.prototype.toISOString = PostgresInterval.prototype.toISO = function () {
+  var datePart = dateProperties
+    .map(buildProperty, this)
+    .join('')
+
+  var timePart = timeProperties
+    .map(buildProperty, this)
+    .join('')
+
+  return 'P' + datePart + 'T' + timePart
+
+  function buildProperty (property) {
+    var value = this[property] || 0
+
+    // Account for fractional part of seconds,
+    // remove trailing zeroes.
+    if (property === 'seconds' && this.milliseconds) {
+      value = (value + this.milliseconds / 1000).toFixed(6).replace(/0+$/, '')
+    }
+
+    return value + propertiesISOEquivalent[property]
+  }
+}
+
+var NUMBER = '([+-]?\\d+)'
+var YEAR = NUMBER + '\\s+years?'
+var MONTH = NUMBER + '\\s+mons?'
+var DAY = NUMBER + '\\s+days?'
+var TIME = '([+-])?([\\d]*):(\\d\\d):(\\d\\d)\\.?(\\d{1,6})?'
+var INTERVAL = new RegExp([YEAR, MONTH, DAY, TIME].map(function (regexString) {
+  return '(' + regexString + ')?'
+})
+  .join('\\s*'))
+
+// Positions of values in regex match
+var positions = {
+  years: 2,
+  months: 4,
+  days: 6,
+  hours: 9,
+  minutes: 10,
+  seconds: 11,
+  milliseconds: 12
+}
+// We can use negative time
+var negatives = ['hours', 'minutes', 'seconds', 'milliseconds']
+
+function parseMilliseconds (fraction) {
+  // add omitted zeroes
+  var microseconds = fraction + '000000'.slice(fraction.length)
+  return parseInt(microseconds, 10) / 1000
+}
+
+function parse (interval) {
+  if (!interval) return {}
+  var matches = INTERVAL.exec(interval)
+  var isNegative = matches[8] === '-'
+  return Object.keys(positions)
+    .reduce(function (parsed, property) {
+      var position = positions[property]
+      var value = matches[position]
+      // no empty string
+      if (!value) return parsed
+      // milliseconds are actually microseconds (up to 6 digits)
+      // with omitted trailing zeroes.
+      value = property === 'milliseconds'
+        ? parseMilliseconds(value)
+        : parseInt(value, 10)
+      // no zeros
+      if (!value) return parsed
+      if (isNegative && ~negatives.indexOf(property)) {
+        value *= -1
+      }
+      parsed[property] = value
+      return parsed
+    }, {})
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/license
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,36 @@
+{
+  "name": "postgres-interval",
+  "main": "index.js",
+  "version": "1.2.0",
+  "description": "Parse Postgres interval columns",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-interval",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "keywords": [
+    "postgres",
+    "interval",
+    "parser"
+  ],
+  "dependencies": {
+    "xtend": "^4.0.0"
+  },
+  "devDependencies": {
+    "tape": "^4.0.0",
+    "standard": "^12.0.1"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/readme.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/postgres-interval/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,48 @@
+# postgres-interval [![Build Status](https://travis-ci.org/bendrucker/postgres-interval.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-interval) [![Greenkeeper badge](https://badges.greenkeeper.io/bendrucker/postgres-interval.svg)](https://greenkeeper.io/)
+
+> Parse Postgres interval columns
+
+
+## Install
+
+```
+$ npm install --save postgres-interval
+```
+
+
+## Usage
+
+```js
+var parse = require('postgres-interval')
+var interval = parse('01:02:03')
+//=> {hours: 1, minutes: 2, seconds: 3}
+interval.toPostgres()
+// 3 seconds 2 minutes 1 hours
+interval.toISO()
+// P0Y0M0DT1H2M3S
+```
+
+## API
+
+#### `parse(pgInterval)` -> `interval`
+
+##### pgInterval
+
+*Required*  
+Type: `string`
+
+A Postgres interval string.
+
+#### `interval.toPostgres()` -> `string`
+
+Returns an interval string. This allows the interval object to be passed into prepared statements.
+
+#### `interval.toISOString()` -> `string`
+
+Returns an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Durations) compliant string.
+
+Also available as `interval.toISO()` for backwards compatibility.
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/.jshintrc
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/.jshintrc	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,19 +1,0 @@
-{
-  "predef": [
-    "describe", 
-    "it", 
-    "before", 
-    "after", 
-    "window", 
-    "__resources__"
-  ],
-  "es5": true,  
-  "node": true, 
-  "eqeqeq": true, 
-  "undef": true, 
-  "curly": true, 
-  "bitwise": true, 
-  "immed": false, 
-  "newcap": true, 
-  "nonew": true
-}
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/.npmignore
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/.npmignore	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,3 +1,0 @@
-.project
-node_modules/
-lib/doc/
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/AUTHORS
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/AUTHORS	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1 +1,0 @@
-* Yongchang Zhou <changchang005@gmail.com>
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,22 +1,0 @@
-(The MIT License)
-
-Copyright (c) 2012 Netease, Inc. and other pomelo contributors
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-'Software'), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/Makefile
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/Makefile	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,9 +1,0 @@
-TESTS = test/*.js
-REPORTER = spec
-TIMEOUT = 5000
-
-test:
-	@./node_modules/.bin/mocha \
-		--reporter $(REPORTER) --timeout $(TIMEOUT) $(TESTS)
-
-.PHONY: test
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,75 +1,0 @@
-seq-queue - queue to keep request process in sequence
-=====================================================
-
-Seq-queue is simple tool to keep requests to be executed in order.
-
-As we known, Node.js codes run in asynchronous mode and the callbacks are unordered. But sometimes we may need the requests to be processed in order. For example, in a game, a player would do some operations such as turn right and go ahead. And in the server side, we would like to process these requests one by one, not do them all at the same time.
-
-Seq-queue takes the responsibility to make the asynchronous, unordered processing flow into serial and ordered. It's simple but not a repeated wheel.
-
-Seq-queue is a FIFO task queue and we can push tasks as we wish, anytime(before the queue closed), anywhere(if we hold the queue instance). A task is known as a function and we can do anything in the function and just need to call `task.done()` to tell the queue current task has finished. It promises that a task in queue would not be executed util all tasks before it finished.
-
-Seq-queue add timeout for each task execution. If a task throws an uncaught exception in its call back or a developer forgets to call `task.done()` callback, queue would be blocked and would not execute the left tasks. To avoid these situations, seq-queue set a timeout for each task. If a task timeout, queue would drop the task and notify develop by a 'timeout' event and then invoke the next task. Any `task.done()` invoked in a timeout task would be ignored.
-
- * Tags: node.js
-
-##Installation
-```
-npm install seq-queue
-```
-
-##Usage
-``` javascript
-var seqqueue = require('seq-queue');
-
-var queue = seqqueue.createQueue(1000);
-
-queue.push(
-  function(task) {
-    setTimeout(function() {
-      console.log('hello ');
-      task.done();
-    }, 500);
-  }, 
-  function() {
-    console.log('task timeout');
-  }, 
-  1000
-);
-
-queue.push(
-  function(task) {
-    setTimeout(function() {
-      console.log('world~');
-      task.done();
-    }, 500);
-  }
-);
-``` 
-
-##API
-###seqqueue.createQueue(timeout)
-Create a new queue instance. A global timeout value in ms for the new instance can be set by `timeout` parameter or use the default timeout (3s) by no parameter.
-
-###queue.push(fn, ontimeout, timeout)
-Add a task into the queue instance. 
-####Arguments
-+ fn(task) - The function that describes the content of task and would be invoke by queue. `fn` takes a arguemnt task and we *must* call task.done() to tell queue current task has finished.
-+ ontimeout() - Callback for task timeout. 
-+ timeout - Timeout in ms for `fn`. If specified, it would overwrite the global timeout that set by `createQueue` for `fn`.
-
-###queue.close(force)
-Close the queue. A closed queue would stop receiving new task immediately. And the left tasks would be treated in different ways decided by `force`.
-####Arguments
-+ force - If true, queue would stop working immediately and ignore any tasks left in queue. Otherwise queue would execute the tasks in queue and then stop.
-
-##Event
-Seq-queue instances extend the EventEmitter and would emit events in their life cycles.
-###'timeout'(totask)
-If current task not invoke task.done() within the timeout ms, a timeout event would be emit. totask.fn and totask.timeout is the `fn` and `timeout` arguments that passed by `queue.push(2)`.
-###'error'(err, task)
-If the task function (not callbacks) throws an uncaught error, queue would emit an error event and passes the err and task informations by event callback arguments.
-###'closed'
-Emit when the close(false) is invoked.
-###'drained'
-Emit when close(true) is invoked or all tasks left have finished in closed status.
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1 +1,0 @@
-module.exports = require('./lib/seq-queue');
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/lib/seq-queue.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/lib/seq-queue.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,199 +1,0 @@
-var EventEmitter = require('events').EventEmitter;
-var util = require('util');
-
-var DEFAULT_TIMEOUT = 3000;
-var INIT_ID = 0;
-var EVENT_CLOSED = 'closed';
-var EVENT_DRAINED = 'drained';
-
-/**
- * Instance a new queue
- *
- * @param {Number} timeout a global timeout for new queue
- * @class
- * @constructor
- */
-var SeqQueue = function(timeout) {
-	EventEmitter.call(this);
-	
-	if(timeout && timeout > 0) {
-		this.timeout = timeout;
-	} else {
-		this.timeout = DEFAULT_TIMEOUT;
-	}
-	
-	this.status = SeqQueueManager.STATUS_IDLE;
-	this.curId = INIT_ID;
-	this.queue = [];
-};
-util.inherits(SeqQueue, EventEmitter);
-
-/**
- * Add a task into queue.
- * 
- * @param fn new request
- * @param ontimeout callback when task timeout
- * @param timeout timeout for current request. take the global timeout if this is invalid
- * @returns true or false
- */
-SeqQueue.prototype.push = function(fn, ontimeout, timeout) {
-	if(this.status !== SeqQueueManager.STATUS_IDLE && this.status !== SeqQueueManager.STATUS_BUSY) {
-		//ignore invalid status
-		return false;
-	}
-	
-	if(typeof fn !== 'function') {
-		throw new Error('fn should be a function.');
-	}
-	this.queue.push({fn: fn, ontimeout: ontimeout, timeout: timeout});
-
-	if(this.status === SeqQueueManager.STATUS_IDLE) {
-		this.status = SeqQueueManager.STATUS_BUSY;
-		var self = this;
-		process.nextTick(function() {
-			self._next(self.curId);
-		});
-	}
-	return true;
-};
-
-/**
- * Close queue
- * 
- * @param {Boolean} force if true will close the queue immediately else will execute the rest task in queue
- */
-SeqQueue.prototype.close = function(force) {
-	if(this.status !== SeqQueueManager.STATUS_IDLE && this.status !== SeqQueueManager.STATUS_BUSY) {
-		//ignore invalid status
-		return;
-	}
-	
-	if(force) {
-		this.status = SeqQueueManager.STATUS_DRAINED;
-		if(this.timerId) {
-			clearTimeout(this.timerId);
-			this.timerId = undefined;
-		}
-		this.emit(EVENT_DRAINED);
-	} else {
-		this.status = SeqQueueManager.STATUS_CLOSED;
-		this.emit(EVENT_CLOSED);
-	}
-};
-
-/**
- * Invoke next task
- * 
- * @param {String|Number} tid last executed task id
- * @api private
- */
-SeqQueue.prototype._next = function(tid) {
-	if(tid !== this.curId || this.status !== SeqQueueManager.STATUS_BUSY && this.status !== SeqQueueManager.STATUS_CLOSED) {
-		//ignore invalid next call
-		return;
-	}
-	
-	if(this.timerId) {
-		clearTimeout(this.timerId);
-		this.timerId = undefined;
-	}
-	
-	var task = this.queue.shift();
-	if(!task) {
-		if(this.status === SeqQueueManager.STATUS_BUSY) {
-			this.status = SeqQueueManager.STATUS_IDLE;
-			this.curId++;	//modify curId to invalidate timeout task
-		} else {
-			this.status = SeqQueueManager.STATUS_DRAINED;
-			this.emit(EVENT_DRAINED);
-		}
-		return;
-	}
-	
-	var self = this;
-	task.id = ++this.curId;
-
-	var timeout = task.timeout > 0 ? task.timeout : this.timeout;
-	timeout = timeout > 0 ? timeout : DEFAULT_TIMEOUT;
-	this.timerId = setTimeout(function() {
-		process.nextTick(function() {
-			self._next(task.id);
-		});
-		self.emit('timeout', task);
-		if(task.ontimeout) {
-			task.ontimeout();
-		}
-	}, timeout);
-
-	try {
-		task.fn({
-			done: function() {
-				var res = task.id === self.curId;
-				process.nextTick(function() {
-					self._next(task.id);
-				});
-				return res;
-			}
-		});
-	} catch(err) {
-		self.emit('error', err, task);
-		process.nextTick(function() {
-			self._next(task.id);
-		});
-	}
-};
-
-/**
- * Queue manager.
- * 
- * @module
- */
-var SeqQueueManager = module.exports;
-
-/**
- * Queue status: idle, welcome new tasks
- *
- * @const
- * @type {Number}
- * @memberOf SeqQueueManager
- */
-SeqQueueManager.STATUS_IDLE = 0;
-
-/**
- * Queue status: busy, queue is working for some tasks now
- *
- * @const
- * @type {Number}
- * @memberOf SeqQueueManager
- */
-SeqQueueManager.STATUS_BUSY = 1;
-
-/**
- * Queue status: closed, queue has closed and would not receive task any more 
- * 					and is processing the remaining tasks now.
- *
- * @const
- * @type {Number}
- * @memberOf SeqQueueManager
- */
-SeqQueueManager.STATUS_CLOSED = 2; 
-
-/**
- * Queue status: drained, queue is ready to be destroy
- *
- * @const
- * @type {Number}
- * @memberOf SeqQueueManager
- */
-SeqQueueManager.STATUS_DRAINED = 3;
-
-/**
- * Create Sequence queue
- * 
- * @param  {Number} timeout a global timeout for the new queue instance
- * @return {Object}         new queue instance
- * @memberOf SeqQueueManager
- */
-SeqQueueManager.createQueue = function(timeout) {
-	return new SeqQueue(timeout);
-};
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,17 +1,0 @@
-{
-	"name": "seq-queue", 
-	"author": "changchang <changchang005@gmail.com>", 
-	"version": "0.0.5", 
-	"description": "A simple tool to keep requests to be executed in order.", 
-	"homepage": "https://github.com/changchang/seq-queue", 
-	"repository": {
-		"type": "git", 
-		"url": "git@github.com:changchang/seq-queue.git"
-	}, 
-	"dependencies": {
-	}, 
-	"devDependencies": {
-		"mocha": ">=0.0.1", 
-		"should": ">=0.0.1"
-	}
-}
Index: uckSimulator-main/ds-db-ws/node_modules/seq-queue/test/seq-queue-test.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/seq-queue/test/seq-queue-test.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,307 +1,0 @@
-var should = require('should');
-var SeqQueue = require('../lib/seq-queue');
-
-var timeout = 1000;
-
-describe('seq-queue', function() {
-	
-	describe('#createQueue', function() {
-		it('should return a seq-queue instance with init properties', function() {
-			var queue = SeqQueue.createQueue(timeout);
-			should.exist(queue);
-			queue.should.have.property('timeout', timeout);
-			queue.should.have.property('status', SeqQueue.IDLE);
-		});
-	});
-	
-	describe('#push' , function() {
-		it('should change the queue status from idle to busy and invoke the task at once when task finish when queue idle', function(done) {
-			var queue = SeqQueue.createQueue(timeout);
-			queue.should.have.property('status', SeqQueue.IDLE);
-			queue.push(function(task) {
-				should.exist(task);
-				task.done();
-				queue.should.have.property('status', SeqQueue.IDLE);
-				done();
-			});
-			queue.should.have.property('status', SeqQueue.BUSY);
-		});
-		
-		it('should keep the status busy and keep the new task wait until the former tasks finish when queue busy', function(done) {
-			var queue = SeqQueue.createQueue(timeout);
-			var formerTaskFinished = false;
-			//add first task
-			queue.push(function(task) {
-				formerTaskFinished = true;
-				task.done();
-			});
-			queue.should.have.property('status', SeqQueue.BUSY);
-			//add second task
-			queue.push(function(task) {
-				formerTaskFinished.should.be.true;
-				queue.should.have.property('status', SeqQueue.BUSY);
-				task.done();
-				queue.should.have.property('status', SeqQueue.IDLE);
-				done();
-			});
-			queue.should.have.property('status', SeqQueue.BUSY);
-		});
-		
-		it('should ok if the task call done() directly', function(done) {
-			var queue = SeqQueue.createQueue();
-			var taskCount = 0;
-			queue.push(function(task) {
-				taskCount++;
-				task.done();
-			});
-			queue.push(function(task) {
-				taskCount++;
-				task.done();
-			});
-			setTimeout(function() {
-				taskCount.should.equal(2);
-				done();
-			}, 500);
-		});
-	});
-	
-	describe('#close', function() {
-		it('should not accept new request but should execute the rest task in queue when close gracefully', function(done) {
-			var queue = SeqQueue.createQueue(timeout);
-			var closedEventCount = 0;
-			var drainedEventCount = 0;
-			queue.on('closed', function() {
-				closedEventCount++;
-			});
-			queue.on('drained', function() {
-				drainedEventCount++;
-			});
-			var executedTaskCount = 0;
-			queue.push(function(task) {
-				executedTaskCount++;
-				task.done();
-			}).should.be.true;
-			queue.close(false);
-			queue.should.have.property('status', SeqQueue.CLOSED);
-			
-			queue.push(function(task) {
-				// never should be executed
-				executedTaskCount++;
-				task.done();
-			}).should.be.false;
-			
-			// wait all task finished
-			setTimeout(function() {
-				executedTaskCount.should.equal(1);
-				closedEventCount.should.equal(1);
-				drainedEventCount.should.equal(1);
-				done();
-			}, 1000);
-		});
-		
-		it('should not execute any task and emit a drained event when close forcefully', function(done) {
-			var queue = SeqQueue.createQueue(timeout);
-			var drainedEventCount = 0;
-			queue.on('drained', function() {
-				drainedEventCount++;
-			});
-			var executedTaskCount = 0;
-			queue.push(function(task) {
-				//never should be executed
-				executedTaskCount++;
-				task.done();
-			}).should.be.true;
-			queue.close(true);
-			queue.should.have.property('status', SeqQueue.DRAINED);
-			
-			// wait all task finished
-			setTimeout(function() {
-				executedTaskCount.should.equal(0);
-				drainedEventCount.should.equal(1);
-				done();
-			}, 1000);
-		});
-	});
-	
-	describe('#timeout', function() {
-		it('should emit timeout event and execute the next task when a task timeout by default', function(done) {
-			var queue = SeqQueue.createQueue();
-			var executedTaskCount = 0;
-			var timeoutCount = 0;
-			var onTimeoutCount = 0;
-			//add timeout listener
-			queue.on('timeout', function(task) {
-				task.should.be.a('object');
-				task.fn.should.be.a('function');
-				timeoutCount++;
-			});
-			
-			queue.push(function(task) {
-				executedTaskCount++;
-				//no task.done() invoke to cause a timeout
-			}, function() {
-				onTimeoutCount++;
-			}).should.be.true;
-			
-			queue.push(function(task) {
-				executedTaskCount++;
-				task.done();
-			}).should.be.true;
-			
-			setTimeout(function() {
-				//wait all task finish
-				executedTaskCount.should.be.equal(2);
-				timeoutCount.should.be.equal(1);
-				onTimeoutCount.should.be.equal(1);
-				done();
-			}, 4000);	//default timeout is 3s
-		});
-		
-		it('should return false when invoke task.done() if task has already timeout', function(done) {
-			var queue = SeqQueue.createQueue();
-			var executedTaskCount = 0;
-			var timeoutCount = 0;
-			var timeout = 1000;
-			
-			//add timeout listener
-			queue.on('timeout', function(task) {
-				task.should.be.a('object');
-				task.fn.should.be.a('function');
-				timeoutCount++;
-			});
-			
-			queue.push(function(task) {
-				executedTaskCount++;
-				task.done().should.be.true;
-			}).should.be.true;
-			
-			queue.push(function(task) {
-				//sleep to make a timeout
-				setTimeout(function() {
-					executedTaskCount++;
-					task.done().should.be.false;
-				}, timeout + 1000);
-			}, null, timeout).should.be.true;
-			
-			setTimeout(function() {
-				//wait all task finish
-				executedTaskCount.should.be.equal(2);
-				timeoutCount.should.be.equal(1);
-				done();
-			}, 4000);
-		});
-		
-		it('should never timeout after close forcefully', function(done) {
-			var queue = SeqQueue.createQueue(timeout);
-			var timeoutCount = 0;
-			//add timeout listener
-			queue.on('timeout', function(task) {
-				//should never enter here
-				timeoutCount++;
-			});
-			
-			queue.push(function(task) {
-				//no task.done() invoke to cause a timeout
-			}).should.be.true;
-			
-			queue.close(true);
-			
-			setTimeout(function() {
-				//wait all task finish
-				timeoutCount.should.be.equal(0);
-				done();
-			}, timeout * 2);
-		});
-		
-		it('should use the global timeout value by default', function(done) {
-			var globalTimeout = timeout + 100;
-			var queue = SeqQueue.createQueue(globalTimeout);
-			//add timeout listener
-			queue.on('timeout', function(task) {
-				(Date.now() - start).should.not.be.below(globalTimeout);
-				done();
-			});
-			
-			queue.push(function(task) {
-				//no task.done() invoke to cause a timeout
-			}).should.be.true;
-			var start = Date.now();
-		});
-		
-		it('should use the timeout value in #push if it was assigned', function(done) {
-			var localTimeout = timeout / 2;
-			var queue = SeqQueue.createQueue(timeout);
-			//add timeout listener
-			queue.on('timeout', function(task) {
-				var diff = Date.now() - start;
-				diff.should.not.be.below(localTimeout);
-				diff.should.not.be.above(timeout);
-				done();
-			});
-			
-			queue.push(function(task) {
-				//no task.done() invoke to cause a timeout
-			}, null, localTimeout).should.be.true;
-			var start = Date.now();
-		});
-	});
-	
-	describe('#error', function() {
-		it('should emit an error event and invoke next task when a task throws an event', function(done) {
-			var queue = SeqQueue.createQueue();
-			var errorCount = 0;
-			var taskCount = 0;
-			//add timeout listener
-			queue.on('error', function(err, task) {
-				errorCount++;
-				should.exist(err);
-				should.exist(task);
-			});
-			
-			queue.push(function(task) {
-				taskCount++;
-				throw new Error('some error');
-			}).should.be.true;
-			
-			queue.push(function(task) {
-				taskCount++;
-				task.done();
-			});
-			
-			setTimeout(function() {
-				taskCount.should.equal(2);
-				errorCount.should.equal(1);
-				done();
-			}, 500);
-		});
-
-		it('should be ok when task throw a error after done was invoked', function(done) {
-			var queue = SeqQueue.createQueue();
-			var errorCount = 0;
-			var taskCount = 0;
-			//add timeout listener
-			queue.on('error', function(err, task) {
-				errorCount++;
-				should.exist(err);
-				should.exist(task);
-			});
-			
-			queue.push(function(task) {
-				taskCount++;
-				task.done();
-				throw new Error('some error');
-			}).should.be.true;
-			
-			queue.push(function(task) {
-				taskCount++;
-				task.done();
-			});
-			
-			setTimeout(function() {
-				taskCount.should.equal(2);
-				errorCount.should.equal(1);
-				done();
-			}, 500);
-		});
-	});
-});
Index: TruckSimulator-main/ds-db-ws/node_modules/split2/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/split2/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/split2/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,13 @@
+Copyright (c) 2014-2018, Matteo Collina <hello@matteocollina.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/split2/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/split2/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/split2/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,85 @@
+# Split2(matcher, mapper, options)
+
+![ci](https://github.com/mcollina/split2/workflows/ci/badge.svg)
+
+Break up a stream and reassemble it so that each line is a chunk.
+`split2` is inspired by [@dominictarr](https://github.com/dominictarr) [`split`](https://github.com/dominictarr/split) module,
+and it is totally API compatible with it.
+However, it is based on Node.js core [`Transform`](https://nodejs.org/api/stream.html#stream_new_stream_transform_options).
+
+`matcher` may be a `String`, or a `RegExp`. Example, read every line in a file ...
+
+``` js
+  fs.createReadStream(file)
+    .pipe(split2())
+    .on('data', function (line) {
+      //each chunk now is a separate line!
+    })
+
+```
+
+`split` takes the same arguments as `string.split` except it defaults to '/\r?\n/', and the optional `limit` paremeter is ignored.
+[String#split](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split)
+
+`split` takes an optional options object on it's third argument, which
+is directly passed as a
+[Transform](https://nodejs.org/api/stream.html#stream_new_stream_transform_options)
+option.
+
+Additionally, the `.maxLength` and `.skipOverflow` options are implemented, which set limits on the internal
+buffer size and the stream's behavior when the limit is exceeded. There is no limit unless `maxLength` is set. When
+the internal buffer size exceeds `maxLength`, the stream emits an error by default. You may also set `skipOverflow` to
+true to suppress the error and instead skip past any lines that cause the internal buffer to exceed `maxLength`.
+
+Calling `.destroy` will make the stream emit `close`. Use this to perform cleanup logic
+
+``` js
+var splitFile = function(filename) {
+  var file = fs.createReadStream(filename)
+
+  return file
+    .pipe(split2())
+    .on('close', function() {
+      // destroy the file stream in case the split stream was destroyed
+      file.destroy()
+    })
+}
+
+var stream = splitFile('my-file.txt')
+
+stream.destroy() // will destroy the input file stream
+```
+
+# NDJ - Newline Delimited Json
+
+`split2` accepts a function which transforms each line.
+
+``` js
+fs.createReadStream(file)
+  .pipe(split2(JSON.parse))
+  .on('data', function (obj) {
+    //each chunk now is a js object
+  })
+  .on("error", function(error) {
+    //handling parsing errors
+  })
+```
+
+However, in [@dominictarr](https://github.com/dominictarr) [`split`](https://github.com/dominictarr/split) the mapper
+is wrapped in a try-catch, while here it is not: if your parsing logic can throw, wrap it yourself. Otherwise, you can also use the stream error handling when mapper function throw.
+
+# License
+
+Copyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/split2/bench.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/split2/bench.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/split2/bench.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,27 @@
+'use strict'
+
+const split = require('./')
+const bench = require('fastbench')
+const binarySplit = require('binary-split')
+const fs = require('fs')
+
+function benchSplit (cb) {
+  fs.createReadStream('package.json')
+    .pipe(split())
+    .on('end', cb)
+    .resume()
+}
+
+function benchBinarySplit (cb) {
+  fs.createReadStream('package.json')
+    .pipe(binarySplit())
+    .on('end', cb)
+    .resume()
+}
+
+const run = bench([
+  benchSplit,
+  benchBinarySplit
+], 10000)
+
+run(run)
Index: TruckSimulator-main/ds-db-ws/node_modules/split2/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/split2/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/split2/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,141 @@
+/*
+Copyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+'use strict'
+
+const { Transform } = require('stream')
+const { StringDecoder } = require('string_decoder')
+const kLast = Symbol('last')
+const kDecoder = Symbol('decoder')
+
+function transform (chunk, enc, cb) {
+  let list
+  if (this.overflow) { // Line buffer is full. Skip to start of next line.
+    const buf = this[kDecoder].write(chunk)
+    list = buf.split(this.matcher)
+
+    if (list.length === 1) return cb() // Line ending not found. Discard entire chunk.
+
+    // Line ending found. Discard trailing fragment of previous line and reset overflow state.
+    list.shift()
+    this.overflow = false
+  } else {
+    this[kLast] += this[kDecoder].write(chunk)
+    list = this[kLast].split(this.matcher)
+  }
+
+  this[kLast] = list.pop()
+
+  for (let i = 0; i < list.length; i++) {
+    try {
+      push(this, this.mapper(list[i]))
+    } catch (error) {
+      return cb(error)
+    }
+  }
+
+  this.overflow = this[kLast].length > this.maxLength
+  if (this.overflow && !this.skipOverflow) {
+    cb(new Error('maximum buffer reached'))
+    return
+  }
+
+  cb()
+}
+
+function flush (cb) {
+  // forward any gibberish left in there
+  this[kLast] += this[kDecoder].end()
+
+  if (this[kLast]) {
+    try {
+      push(this, this.mapper(this[kLast]))
+    } catch (error) {
+      return cb(error)
+    }
+  }
+
+  cb()
+}
+
+function push (self, val) {
+  if (val !== undefined) {
+    self.push(val)
+  }
+}
+
+function noop (incoming) {
+  return incoming
+}
+
+function split (matcher, mapper, options) {
+  // Set defaults for any arguments not supplied.
+  matcher = matcher || /\r?\n/
+  mapper = mapper || noop
+  options = options || {}
+
+  // Test arguments explicitly.
+  switch (arguments.length) {
+    case 1:
+      // If mapper is only argument.
+      if (typeof matcher === 'function') {
+        mapper = matcher
+        matcher = /\r?\n/
+      // If options is only argument.
+      } else if (typeof matcher === 'object' && !(matcher instanceof RegExp) && !matcher[Symbol.split]) {
+        options = matcher
+        matcher = /\r?\n/
+      }
+      break
+
+    case 2:
+      // If mapper and options are arguments.
+      if (typeof matcher === 'function') {
+        options = mapper
+        mapper = matcher
+        matcher = /\r?\n/
+      // If matcher and options are arguments.
+      } else if (typeof mapper === 'object') {
+        options = mapper
+        mapper = noop
+      }
+  }
+
+  options = Object.assign({}, options)
+  options.autoDestroy = true
+  options.transform = transform
+  options.flush = flush
+  options.readableObjectMode = true
+
+  const stream = new Transform(options)
+
+  stream[kLast] = ''
+  stream[kDecoder] = new StringDecoder('utf8')
+  stream.matcher = matcher
+  stream.mapper = mapper
+  stream.maxLength = options.maxLength
+  stream.skipOverflow = options.skipOverflow || false
+  stream.overflow = false
+  stream._destroy = function (err, cb) {
+    // Weird Node v12 bug that we need to work around
+    this._writableState.errorEmitted = false
+    cb(err)
+  }
+
+  return stream
+}
+
+module.exports = split
Index: TruckSimulator-main/ds-db-ws/node_modules/split2/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/split2/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/split2/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,39 @@
+{
+  "name": "split2",
+  "version": "4.2.0",
+  "description": "split a Text Stream into a Line Stream, using Stream 3",
+  "main": "index.js",
+  "scripts": {
+    "lint": "standard --verbose",
+    "unit": "nyc --lines 100 --branches 100 --functions 100 --check-coverage --reporter=text tape test.js",
+    "coverage": "nyc --reporter=html --reporter=cobertura --reporter=text tape test/test.js",
+    "test:report": "npm run lint && npm run unit:report",
+    "test": "npm run lint && npm run unit",
+    "legacy": "tape test.js"
+  },
+  "pre-commit": [
+    "test"
+  ],
+  "website": "https://github.com/mcollina/split2",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mcollina/split2.git"
+  },
+  "bugs": {
+    "url": "http://github.com/mcollina/split2/issues"
+  },
+  "engines": {
+    "node": ">= 10.x"
+  },
+  "author": "Matteo Collina <hello@matteocollina.com>",
+  "license": "ISC",
+  "devDependencies": {
+    "binary-split": "^1.0.3",
+    "callback-stream": "^1.1.0",
+    "fastbench": "^1.0.0",
+    "nyc": "^15.0.1",
+    "pre-commit": "^1.1.2",
+    "standard": "^17.0.0",
+    "tape": "^5.0.0"
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/split2/test.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/split2/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/split2/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,409 @@
+'use strict'
+
+const test = require('tape')
+const split = require('./')
+const callback = require('callback-stream')
+const strcb = callback.bind(null, { decodeStrings: false })
+const objcb = callback.bind(null, { objectMode: true })
+
+test('split two lines on end', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello\nworld')
+})
+
+test('split two lines on two writes', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.write('hello')
+  input.write('\nworld')
+  input.end()
+})
+
+test('split four lines on three writes', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world', 'bye', 'world'])
+  }))
+
+  input.write('hello\nwor')
+  input.write('ld\nbye\nwo')
+  input.write('rld')
+  input.end()
+})
+
+test('accumulate multiple writes', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['helloworld'])
+  }))
+
+  input.write('hello')
+  input.write('world')
+  input.end()
+})
+
+test('split using a custom string matcher', function (t) {
+  t.plan(2)
+
+  const input = split('~')
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
+
+test('split using a custom regexp matcher', function (t) {
+  t.plan(2)
+
+  const input = split(/~/)
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
+
+test('support an option argument', function (t) {
+  t.plan(2)
+
+  const input = split({ highWaterMark: 2 })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello\nworld')
+})
+
+test('support a mapper function', function (t) {
+  t.plan(2)
+
+  const a = { a: '42' }
+  const b = { b: '24' }
+
+  const input = split(JSON.parse)
+
+  input.pipe(objcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, [a, b])
+  }))
+
+  input.write(JSON.stringify(a))
+  input.write('\n')
+  input.end(JSON.stringify(b))
+})
+
+test('split lines windows-style', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello\r\nworld')
+})
+
+test('splits a buffer', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end(Buffer.from('hello\nworld'))
+})
+
+test('do not end on undefined', function (t) {
+  t.plan(2)
+
+  const input = split(function (line) { })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, [])
+  }))
+
+  input.end(Buffer.from('hello\nworld'))
+})
+
+test('has destroy method', function (t) {
+  t.plan(1)
+
+  const input = split(function (line) { })
+
+  input.on('close', function () {
+    t.ok(true, 'close emitted')
+    t.end()
+  })
+
+  input.destroy()
+})
+
+test('support custom matcher and mapper', function (t) {
+  t.plan(4)
+
+  const a = { a: '42' }
+  const b = { b: '24' }
+  const input = split('~', JSON.parse)
+
+  t.equal(input.matcher, '~')
+  t.equal(typeof input.mapper, 'function')
+
+  input.pipe(objcb(function (err, list) {
+    t.notOk(err, 'no errors')
+    t.deepEqual(list, [a, b])
+  }))
+
+  input.write(JSON.stringify(a))
+  input.write('~')
+  input.end(JSON.stringify(b))
+})
+
+test('support custom matcher and options', function (t) {
+  t.plan(6)
+
+  const input = split('~', { highWaterMark: 1024 })
+
+  t.equal(input.matcher, '~')
+  t.equal(typeof input.mapper, 'function')
+  t.equal(input._readableState.highWaterMark, 1024)
+  t.equal(input._writableState.highWaterMark, 1024)
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
+
+test('support mapper and options', function (t) {
+  t.plan(6)
+
+  const a = { a: '42' }
+  const b = { b: '24' }
+  const input = split(JSON.parse, { highWaterMark: 1024 })
+
+  t.ok(input.matcher instanceof RegExp, 'matcher is RegExp')
+  t.equal(typeof input.mapper, 'function')
+  t.equal(input._readableState.highWaterMark, 1024)
+  t.equal(input._writableState.highWaterMark, 1024)
+
+  input.pipe(objcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, [a, b])
+  }))
+
+  input.write(JSON.stringify(a))
+  input.write('\n')
+  input.end(JSON.stringify(b))
+})
+
+test('split utf8 chars', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['烫烫烫', '锟斤拷'])
+  }))
+
+  const buf = Buffer.from('烫烫烫\r\n锟斤拷', 'utf8')
+  for (let i = 0; i < buf.length; ++i) {
+    input.write(buf.slice(i, i + 1))
+  }
+  input.end()
+})
+
+test('split utf8 chars 2by2', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['烫烫烫', '烫烫烫'])
+  }))
+
+  const str = '烫烫烫\r\n烫烫烫'
+  const buf = Buffer.from(str, 'utf8')
+  for (let i = 0; i < buf.length; i += 2) {
+    input.write(buf.slice(i, i + 2))
+  }
+  input.end()
+})
+
+test('split lines when the \n comes at the end of a chunk', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.write('hello\n')
+  input.end('world')
+})
+
+test('truncated utf-8 char', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['烫' + Buffer.from('e7', 'hex').toString()])
+  }))
+
+  const str = '烫烫'
+  const buf = Buffer.from(str, 'utf8')
+
+  input.write(buf.slice(0, 3))
+  input.end(buf.slice(3, 4))
+})
+
+test('maximum buffer limit', function (t) {
+  t.plan(1)
+
+  const input = split({ maxLength: 2 })
+  input.on('error', function (err) {
+    t.ok(err)
+  })
+
+  input.resume()
+
+  input.write('hey')
+})
+
+test('readable highWaterMark', function (t) {
+  const input = split()
+  t.equal(input._readableState.highWaterMark, 16)
+  t.end()
+})
+
+test('maxLength < chunk size', function (t) {
+  t.plan(2)
+
+  const input = split({ maxLength: 2 })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['a', 'b'])
+  }))
+
+  input.end('a\nb')
+})
+
+test('maximum buffer limit w/skip', function (t) {
+  t.plan(2)
+
+  const input = split({ maxLength: 2, skipOverflow: true })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['a', 'b', 'c'])
+  }))
+
+  input.write('a\n123')
+  input.write('456')
+  input.write('789\nb\nc')
+  input.end()
+})
+
+test("don't modify the options object", function (t) {
+  t.plan(2)
+
+  const options = {}
+  const input = split(options)
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.same(options, {})
+  }))
+
+  input.end()
+})
+
+test('mapper throws flush', function (t) {
+  t.plan(1)
+  const error = new Error()
+  const input = split(function () {
+    throw error
+  })
+
+  input.on('error', (err, list) => {
+    t.same(err, error)
+  })
+  input.end('hello')
+})
+
+test('mapper throws on transform', function (t) {
+  t.plan(1)
+
+  const error = new Error()
+  const input = split(function (l) {
+    throw error
+  })
+
+  input.on('error', (err) => {
+    t.same(err, error)
+  })
+  input.write('a')
+  input.write('\n')
+  input.end('b')
+})
+
+test('supports Symbol.split', function (t) {
+  t.plan(2)
+
+  const input = split({
+    [Symbol.split] (str) {
+      return str.split('~')
+    }
+  })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
Index: uckSimulator-main/ds-db-ws/node_modules/sqlstring/HISTORY.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/sqlstring/HISTORY.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,53 +1,0 @@
-2.3.3 / 2022-03-06
-==================
-
-  * Fix escaping `Date` objects from foreign isolates
-
-2.3.2 / 2020-04-15
-==================
-
-  * perf: remove outdated array pattern
-
-2.3.1 / 2018-02-24
-==================
-
-  * Fix incorrectly replacing non-placeholders in SQL
-
-2.3.0 / 2017-10-01
-==================
-
-  * Add `.toSqlString()` escape overriding
-  * Add `raw` method to wrap raw strings for escape overriding
-  * Small performance improvement on `escapeId`
-
-2.2.0 / 2016-11-01
-==================
-
-  * Escape invalid `Date` objects as `NULL`
-
-2.1.0 / 2016-09-26
-==================
-
-  * Accept numbers and other value types in `escapeId`
-  * Run `buffer.toString()` through escaping
-
-2.0.1 / 2016-06-06
-==================
-
-  * Fix npm package to include missing `lib/` directory
-
-2.0.0 / 2016-06-06
-==================
-
-  * Bring repository up-to-date with `mysql` module changes
-  * Support Node.js 0.6.x
-
-1.0.0 / 2014-11-09
-==================
-
-  * Support Node.js 0.8.x
-
-0.0.1 / 2014-02-25
-==================
-
-  * Initial release
Index: uckSimulator-main/ds-db-ws/node_modules/sqlstring/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/sqlstring/LICENSE	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,19 +1,0 @@
-Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors
-
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
Index: uckSimulator-main/ds-db-ws/node_modules/sqlstring/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/sqlstring/README.md	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,205 +1,0 @@
-# sqlstring
-
-[![NPM Version][npm-version-image]][npm-url]
-[![NPM Downloads][npm-downloads-image]][npm-url]
-[![Node.js Version][node-image]][node-url]
-[![Build Status][github-actions-ci-image]][github-actions-ci-url]
-[![Coverage Status][coveralls-image]][coveralls-url]
-
-Simple SQL escape and format for MySQL
-
-## Install
-
-```sh
-$ npm install sqlstring
-```
-
-## Usage
-
-
-```js
-var SqlString = require('sqlstring');
-```
-
-### Escaping query values
-
-**Caution** These methods of escaping values only works when the
-[NO_BACKSLASH_ESCAPES](https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_backslash_escapes)
-SQL mode is disabled (which is the default state for MySQL servers).
-
-In order to avoid SQL Injection attacks, you should always escape any user
-provided data before using it inside a SQL query. You can do so using the
-`SqlString.escape()` method:
-
-```js
-var userId = 'some user provided value';
-var sql    = 'SELECT * FROM users WHERE id = ' + SqlString.escape(userId);
-console.log(sql); // SELECT * FROM users WHERE id = 'some user provided value'
-```
-
-Alternatively, you can use `?` characters as placeholders for values you would
-like to have escaped like this:
-
-```js
-var userId = 1;
-var sql    = SqlString.format('SELECT * FROM users WHERE id = ?', [userId]);
-console.log(sql); // SELECT * FROM users WHERE id = 1
-```
-
-Multiple placeholders are mapped to values in the same order as passed. For example,
-in the following query `foo` equals `a`, `bar` equals `b`, `baz` equals `c`, and
-`id` will be `userId`:
-
-```js
-var userId = 1;
-var sql    = SqlString.format('UPDATE users SET foo = ?, bar = ?, baz = ? WHERE id = ?',
-  ['a', 'b', 'c', userId]);
-console.log(sql); // UPDATE users SET foo = 'a', bar = 'b', baz = 'c' WHERE id = 1
-```
-
-This looks similar to prepared statements in MySQL, however it really just uses
-the same `SqlString.escape()` method internally.
-
-**Caution** This also differs from prepared statements in that all `?` are
-replaced, even those contained in comments and strings.
-
-Different value types are escaped differently, here is how:
-
-* Numbers are left untouched
-* Booleans are converted to `true` / `false`
-* Date objects are converted to `'YYYY-mm-dd HH:ii:ss'` strings
-* Buffers are converted to hex strings, e.g. `X'0fa5'`
-* Strings are safely escaped
-* Arrays are turned into list, e.g. `['a', 'b']` turns into `'a', 'b'`
-* Nested arrays are turned into grouped lists (for bulk inserts), e.g. `[['a',
-  'b'], ['c', 'd']]` turns into `('a', 'b'), ('c', 'd')`
-* Objects that have a `toSqlString` method will have `.toSqlString()` called
-  and the returned value is used as the raw SQL.
-* Objects are turned into `key = 'val'` pairs for each enumerable property on
-  the object. If the property's value is a function, it is skipped; if the
-  property's value is an object, toString() is called on it and the returned
-  value is used.
-* `undefined` / `null` are converted to `NULL`
-* `NaN` / `Infinity` are left as-is. MySQL does not support these, and trying
-  to insert them as values will trigger MySQL errors until they implement
-  support.
-
-You may have noticed that this escaping allows you to do neat things like this:
-
-```js
-var post  = {id: 1, title: 'Hello MySQL'};
-var sql = SqlString.format('INSERT INTO posts SET ?', post);
-console.log(sql); // INSERT INTO posts SET `id` = 1, `title` = 'Hello MySQL'
-```
-
-And the `toSqlString` method allows you to form complex queries with functions:
-
-```js
-var CURRENT_TIMESTAMP = { toSqlString: function() { return 'CURRENT_TIMESTAMP()'; } };
-var sql = SqlString.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]);
-console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42
-```
-
-To generate objects with a `toSqlString` method, the `SqlString.raw()` method can
-be used. This creates an object that will be left un-touched when using in a `?`
-placeholder, useful for using functions as dynamic values:
-
-**Caution** The string provided to `SqlString.raw()` will skip all escaping
-functions when used, so be careful when passing in unvalidated input.
-
-```js
-var CURRENT_TIMESTAMP = SqlString.raw('CURRENT_TIMESTAMP()');
-var sql = SqlString.format('UPDATE posts SET modified = ? WHERE id = ?', [CURRENT_TIMESTAMP, 42]);
-console.log(sql); // UPDATE posts SET modified = CURRENT_TIMESTAMP() WHERE id = 42
-```
-
-If you feel the need to escape queries by yourself, you can also use the escaping
-function directly:
-
-```js
-var sql = 'SELECT * FROM posts WHERE title=' + SqlString.escape('Hello MySQL');
-console.log(sql); // SELECT * FROM posts WHERE title='Hello MySQL'
-```
-
-### Escaping query identifiers
-
-If you can't trust an SQL identifier (database / table / column name) because it is
-provided by a user, you should escape it with `SqlString.escapeId(identifier)` like this:
-
-```js
-var sorter = 'date';
-var sql    = 'SELECT * FROM posts ORDER BY ' + SqlString.escapeId(sorter);
-console.log(sql); // SELECT * FROM posts ORDER BY `date`
-```
-
-It also supports adding qualified identifiers. It will escape both parts.
-
-```js
-var sorter = 'date';
-var sql    = 'SELECT * FROM posts ORDER BY ' + SqlString.escapeId('posts.' + sorter);
-console.log(sql); // SELECT * FROM posts ORDER BY `posts`.`date`
-```
-
-If you do not want to treat `.` as qualified identifiers, you can set the second
-argument to `true` in order to keep the string as a literal identifier:
-
-```js
-var sorter = 'date.2';
-var sql    = 'SELECT * FROM posts ORDER BY ' + SqlString.escapeId(sorter, true);
-console.log(sql); // SELECT * FROM posts ORDER BY `date.2`
-```
-
-Alternatively, you can use `??` characters as placeholders for identifiers you would
-like to have escaped like this:
-
-```js
-var userId = 1;
-var columns = ['username', 'email'];
-var sql     = SqlString.format('SELECT ?? FROM ?? WHERE id = ?', [columns, 'users', userId]);
-console.log(sql); // SELECT `username`, `email` FROM `users` WHERE id = 1
-```
-**Please note that this last character sequence is experimental and syntax might change**
-
-When you pass an Object to `.escape()` or `.format()`, `.escapeId()` is used to avoid SQL injection in object keys.
-
-### Formatting queries
-
-You can use `SqlString.format` to prepare a query with multiple insertion points,
-utilizing the proper escaping for ids and values. A simple example of this follows:
-
-```js
-var userId  = 1;
-var inserts = ['users', 'id', userId];
-var sql     = SqlString.format('SELECT * FROM ?? WHERE ?? = ?', inserts);
-console.log(sql); // SELECT * FROM `users` WHERE `id` = 1
-```
-
-Following this you then have a valid, escaped query that you can then send to the database safely.
-This is useful if you are looking to prepare the query before actually sending it to the database.
-You also have the option (but are not required) to pass in `stringifyObject` and `timeZone`,
-allowing you provide a custom means of turning objects into strings, as well as a
-location-specific/timezone-aware `Date`.
-
-This can be further combined with the `SqlString.raw()` helper to generate SQL
-that includes MySQL functions as dynamic vales:
-
-```js
-var userId = 1;
-var data   = { email: 'foobar@example.com', modified: SqlString.raw('NOW()') };
-var sql    = SqlString.format('UPDATE ?? SET ? WHERE `id` = ?', ['users', data, userId]);
-console.log(sql); // UPDATE `users` SET `email` = 'foobar@example.com', `modified` = NOW() WHERE `id` = 1
-```
-
-## License
-
-[MIT](LICENSE)
-
-[npm-version-image]: https://img.shields.io/npm/v/sqlstring.svg
-[npm-downloads-image]: https://img.shields.io/npm/dm/sqlstring.svg
-[npm-url]: https://npmjs.org/package/sqlstring
-[coveralls-image]: https://img.shields.io/coveralls/mysqljs/sqlstring/master.svg
-[coveralls-url]: https://coveralls.io/r/mysqljs/sqlstring?branch=master
-[github-actions-ci-image]: https://img.shields.io/github/workflow/status/mysqljs/sqlstring/ci/master?label=build
-[github-actions-ci-url]: https://github.com/mysqljs/sqlstring/actions/workflows/ci.yml
-[node-image]: https://img.shields.io/node/v/sqlstring.svg
-[node-url]: https://nodejs.org/en/download
Index: uckSimulator-main/ds-db-ws/node_modules/sqlstring/index.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/sqlstring/index.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,1 +1,0 @@
-module.exports = require('./lib/SqlString');
Index: uckSimulator-main/ds-db-ws/node_modules/sqlstring/lib/SqlString.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/sqlstring/lib/SqlString.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,237 +1,0 @@
-var SqlString  = exports;
-
-var ID_GLOBAL_REGEXP    = /`/g;
-var QUAL_GLOBAL_REGEXP  = /\./g;
-var CHARS_GLOBAL_REGEXP = /[\0\b\t\n\r\x1a\"\'\\]/g; // eslint-disable-line no-control-regex
-var CHARS_ESCAPE_MAP    = {
-  '\0'   : '\\0',
-  '\b'   : '\\b',
-  '\t'   : '\\t',
-  '\n'   : '\\n',
-  '\r'   : '\\r',
-  '\x1a' : '\\Z',
-  '"'    : '\\"',
-  '\''   : '\\\'',
-  '\\'   : '\\\\'
-};
-
-SqlString.escapeId = function escapeId(val, forbidQualified) {
-  if (Array.isArray(val)) {
-    var sql = '';
-
-    for (var i = 0; i < val.length; i++) {
-      sql += (i === 0 ? '' : ', ') + SqlString.escapeId(val[i], forbidQualified);
-    }
-
-    return sql;
-  } else if (forbidQualified) {
-    return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``') + '`';
-  } else {
-    return '`' + String(val).replace(ID_GLOBAL_REGEXP, '``').replace(QUAL_GLOBAL_REGEXP, '`.`') + '`';
-  }
-};
-
-SqlString.escape = function escape(val, stringifyObjects, timeZone) {
-  if (val === undefined || val === null) {
-    return 'NULL';
-  }
-
-  switch (typeof val) {
-    case 'boolean': return (val) ? 'true' : 'false';
-    case 'number': return val + '';
-    case 'object':
-      if (Object.prototype.toString.call(val) === '[object Date]') {
-        return SqlString.dateToString(val, timeZone || 'local');
-      } else if (Array.isArray(val)) {
-        return SqlString.arrayToList(val, timeZone);
-      } else if (Buffer.isBuffer(val)) {
-        return SqlString.bufferToString(val);
-      } else if (typeof val.toSqlString === 'function') {
-        return String(val.toSqlString());
-      } else if (stringifyObjects) {
-        return escapeString(val.toString());
-      } else {
-        return SqlString.objectToValues(val, timeZone);
-      }
-    default: return escapeString(val);
-  }
-};
-
-SqlString.arrayToList = function arrayToList(array, timeZone) {
-  var sql = '';
-
-  for (var i = 0; i < array.length; i++) {
-    var val = array[i];
-
-    if (Array.isArray(val)) {
-      sql += (i === 0 ? '' : ', ') + '(' + SqlString.arrayToList(val, timeZone) + ')';
-    } else {
-      sql += (i === 0 ? '' : ', ') + SqlString.escape(val, true, timeZone);
-    }
-  }
-
-  return sql;
-};
-
-SqlString.format = function format(sql, values, stringifyObjects, timeZone) {
-  if (values == null) {
-    return sql;
-  }
-
-  if (!Array.isArray(values)) {
-    values = [values];
-  }
-
-  var chunkIndex        = 0;
-  var placeholdersRegex = /\?+/g;
-  var result            = '';
-  var valuesIndex       = 0;
-  var match;
-
-  while (valuesIndex < values.length && (match = placeholdersRegex.exec(sql))) {
-    var len = match[0].length;
-
-    if (len > 2) {
-      continue;
-    }
-
-    var value = len === 2
-      ? SqlString.escapeId(values[valuesIndex])
-      : SqlString.escape(values[valuesIndex], stringifyObjects, timeZone);
-
-    result += sql.slice(chunkIndex, match.index) + value;
-    chunkIndex = placeholdersRegex.lastIndex;
-    valuesIndex++;
-  }
-
-  if (chunkIndex === 0) {
-    // Nothing was replaced
-    return sql;
-  }
-
-  if (chunkIndex < sql.length) {
-    return result + sql.slice(chunkIndex);
-  }
-
-  return result;
-};
-
-SqlString.dateToString = function dateToString(date, timeZone) {
-  var dt = new Date(date);
-
-  if (isNaN(dt.getTime())) {
-    return 'NULL';
-  }
-
-  var year;
-  var month;
-  var day;
-  var hour;
-  var minute;
-  var second;
-  var millisecond;
-
-  if (timeZone === 'local') {
-    year        = dt.getFullYear();
-    month       = dt.getMonth() + 1;
-    day         = dt.getDate();
-    hour        = dt.getHours();
-    minute      = dt.getMinutes();
-    second      = dt.getSeconds();
-    millisecond = dt.getMilliseconds();
-  } else {
-    var tz = convertTimezone(timeZone);
-
-    if (tz !== false && tz !== 0) {
-      dt.setTime(dt.getTime() + (tz * 60000));
-    }
-
-    year       = dt.getUTCFullYear();
-    month       = dt.getUTCMonth() + 1;
-    day         = dt.getUTCDate();
-    hour        = dt.getUTCHours();
-    minute      = dt.getUTCMinutes();
-    second      = dt.getUTCSeconds();
-    millisecond = dt.getUTCMilliseconds();
-  }
-
-  // YYYY-MM-DD HH:mm:ss.mmm
-  var str = zeroPad(year, 4) + '-' + zeroPad(month, 2) + '-' + zeroPad(day, 2) + ' ' +
-    zeroPad(hour, 2) + ':' + zeroPad(minute, 2) + ':' + zeroPad(second, 2) + '.' +
-    zeroPad(millisecond, 3);
-
-  return escapeString(str);
-};
-
-SqlString.bufferToString = function bufferToString(buffer) {
-  return 'X' + escapeString(buffer.toString('hex'));
-};
-
-SqlString.objectToValues = function objectToValues(object, timeZone) {
-  var sql = '';
-
-  for (var key in object) {
-    var val = object[key];
-
-    if (typeof val === 'function') {
-      continue;
-    }
-
-    sql += (sql.length === 0 ? '' : ', ') + SqlString.escapeId(key) + ' = ' + SqlString.escape(val, true, timeZone);
-  }
-
-  return sql;
-};
-
-SqlString.raw = function raw(sql) {
-  if (typeof sql !== 'string') {
-    throw new TypeError('argument sql must be a string');
-  }
-
-  return {
-    toSqlString: function toSqlString() { return sql; }
-  };
-};
-
-function escapeString(val) {
-  var chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex = 0;
-  var escapedVal = '';
-  var match;
-
-  while ((match = CHARS_GLOBAL_REGEXP.exec(val))) {
-    escapedVal += val.slice(chunkIndex, match.index) + CHARS_ESCAPE_MAP[match[0]];
-    chunkIndex = CHARS_GLOBAL_REGEXP.lastIndex;
-  }
-
-  if (chunkIndex === 0) {
-    // Nothing was escaped
-    return "'" + val + "'";
-  }
-
-  if (chunkIndex < val.length) {
-    return "'" + escapedVal + val.slice(chunkIndex) + "'";
-  }
-
-  return "'" + escapedVal + "'";
-}
-
-function zeroPad(number, length) {
-  number = number.toString();
-  while (number.length < length) {
-    number = '0' + number;
-  }
-
-  return number;
-}
-
-function convertTimezone(tz) {
-  if (tz === 'Z') {
-    return 0;
-  }
-
-  var m = tz.match(/([\+\-\s])(\d\d):?(\d\d)?/);
-  if (m) {
-    return (m[1] === '-' ? -1 : 1) * (parseInt(m[2], 10) + ((m[3] ? parseInt(m[3], 10) : 0) / 60)) * 60;
-  }
-  return false;
-}
Index: uckSimulator-main/ds-db-ws/node_modules/sqlstring/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/sqlstring/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ 	(revision )
@@ -1,47 +1,0 @@
-{
-  "name": "sqlstring",
-  "description": "Simple SQL escape and format for MySQL",
-  "version": "2.3.3",
-  "contributors": [
-    "Adri Van Houdt <adri.van.houdt@gmail.com>",
-    "Douglas Christopher Wilson <doug@somethingdoug.com>",
-    "fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)",
-    "Kevin Jose Martin <kevin@tiliq.com>",
-    "Nathan Woltman <nwoltman@outlook.com>",
-    "Sergej Sintschilin <seregpie@gmail.com>"
-  ],
-  "license": "MIT",
-  "keywords": [
-    "sqlstring",
-    "sql",
-    "escape",
-    "sql escape"
-  ],
-  "repository": "mysqljs/sqlstring",
-  "devDependencies": {
-    "beautify-benchmark": "0.2.4",
-    "benchmark": "2.1.4",
-    "eslint": "7.32.0",
-    "eslint-plugin-markdown": "2.2.1",
-    "nyc": "15.1.0",
-    "urun": "0.0.8",
-    "utest": "0.0.8"
-  },
-  "files": [
-    "lib/",
-    "HISTORY.md",
-    "LICENSE",
-    "README.md",
-    "index.js"
-  ],
-  "engines": {
-    "node": ">= 0.6"
-  },
-  "scripts": {
-    "bench": "node benchmark/index.js",
-    "lint": "eslint .",
-    "test": "node test/run.js",
-    "test-ci": "nyc --reporter=lcovonly --reporter=text npm test",
-    "test-cov": "nyc --reporter=html --reporter=text npm test"
-  }
-}
Index: TruckSimulator-main/ds-db-ws/node_modules/xtend/.jshintrc
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/xtend/.jshintrc	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/xtend/.jshintrc	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,30 @@
+{
+    "maxdepth": 4,
+    "maxstatements": 200,
+    "maxcomplexity": 12,
+    "maxlen": 80,
+    "maxparams": 5,
+
+    "curly": true,
+    "eqeqeq": true,
+    "immed": true,
+    "latedef": false,
+    "noarg": true,
+    "noempty": true,
+    "nonew": true,
+    "undef": true,
+    "unused": "vars",
+    "trailing": true,
+
+    "quotmark": true,
+    "expr": true,
+    "asi": true,
+
+    "browser": false,
+    "esnext": true,
+    "devel": false,
+    "node": false,
+    "nonstandard": false,
+
+    "predef": ["require", "module", "__dirname", "__filename"]
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/xtend/LICENSE
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/xtend/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/xtend/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+Copyright (c) 2012-2014 Raynos.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/ds-db-ws/node_modules/xtend/README.md
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/xtend/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/xtend/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,32 @@
+# xtend
+
+[![browser support][3]][4]
+
+[![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges)
+
+Extend like a boss
+
+xtend is a basic utility library which allows you to extend an object by appending all of the properties from each object in a list. When there are identical properties, the right-most property takes precedence.
+
+## Examples
+
+```js
+var extend = require("xtend")
+
+// extend returns a new object. Does not mutate arguments
+var combination = extend({
+    a: "a",
+    b: "c"
+}, {
+    b: "b"
+})
+// { a: "a", b: "b" }
+```
+
+## Stability status: Locked
+
+## MIT Licensed 
+
+
+  [3]: http://ci.testling.com/Raynos/xtend.png
+  [4]: http://ci.testling.com/Raynos/xtend
Index: TruckSimulator-main/ds-db-ws/node_modules/xtend/immutable.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/xtend/immutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/xtend/immutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,19 @@
+module.exports = extend
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function extend() {
+    var target = {}
+
+    for (var i = 0; i < arguments.length; i++) {
+        var source = arguments[i]
+
+        for (var key in source) {
+            if (hasOwnProperty.call(source, key)) {
+                target[key] = source[key]
+            }
+        }
+    }
+
+    return target
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/xtend/mutable.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/xtend/mutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/xtend/mutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,17 @@
+module.exports = extend
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function extend(target) {
+    for (var i = 1; i < arguments.length; i++) {
+        var source = arguments[i]
+
+        for (var key in source) {
+            if (hasOwnProperty.call(source, key)) {
+                target[key] = source[key]
+            }
+        }
+    }
+
+    return target
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/xtend/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/xtend/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/xtend/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,55 @@
+{
+  "name": "xtend",
+  "version": "4.0.2",
+  "description": "extend like a boss",
+  "keywords": [
+    "extend",
+    "merge",
+    "options",
+    "opts",
+    "object",
+    "array"
+  ],
+  "author": "Raynos <raynos2@gmail.com>",
+  "repository": "git://github.com/Raynos/xtend.git",
+  "main": "immutable",
+  "scripts": {
+    "test": "node test"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "tape": "~1.1.0"
+  },
+  "homepage": "https://github.com/Raynos/xtend",
+  "contributors": [
+    {
+      "name": "Jake Verbaten"
+    },
+    {
+      "name": "Matt Esch"
+    }
+  ],
+  "bugs": {
+    "url": "https://github.com/Raynos/xtend/issues",
+    "email": "raynos2@gmail.com"
+  },
+  "license": "MIT",
+  "testling": {
+    "files": "test.js",
+    "browsers": [
+      "ie/7..latest",
+      "firefox/16..latest",
+      "firefox/nightly",
+      "chrome/22..latest",
+      "chrome/canary",
+      "opera/12..latest",
+      "opera/next",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest"
+    ]
+  },
+  "engines": {
+    "node": ">=0.4"
+  }
+}
Index: TruckSimulator-main/ds-db-ws/node_modules/xtend/test.js
===================================================================
--- TruckSimulator-main/ds-db-ws/node_modules/xtend/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/ds-db-ws/node_modules/xtend/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,103 @@
+var test = require("tape")
+var extend = require("./")
+var mutableExtend = require("./mutable")
+
+test("merge", function(assert) {
+    var a = { a: "foo" }
+    var b = { b: "bar" }
+
+    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
+    assert.end()
+})
+
+test("replace", function(assert) {
+    var a = { a: "foo" }
+    var b = { a: "bar" }
+
+    assert.deepEqual(extend(a, b), { a: "bar" })
+    assert.end()
+})
+
+test("undefined", function(assert) {
+    var a = { a: undefined }
+    var b = { b: "foo" }
+
+    assert.deepEqual(extend(a, b), { a: undefined, b: "foo" })
+    assert.deepEqual(extend(b, a), { a: undefined, b: "foo" })
+    assert.end()
+})
+
+test("handle 0", function(assert) {
+    var a = { a: "default" }
+    var b = { a: 0 }
+
+    assert.deepEqual(extend(a, b), { a: 0 })
+    assert.deepEqual(extend(b, a), { a: "default" })
+    assert.end()
+})
+
+test("is immutable", function (assert) {
+    var record = {}
+
+    extend(record, { foo: "bar" })
+    assert.equal(record.foo, undefined)
+    assert.end()
+})
+
+test("null as argument", function (assert) {
+    var a = { foo: "bar" }
+    var b = null
+    var c = void 0
+
+    assert.deepEqual(extend(b, a, c), { foo: "bar" })
+    assert.end()
+})
+
+test("mutable", function (assert) {
+    var a = { foo: "bar" }
+
+    mutableExtend(a, { bar: "baz" })
+
+    assert.equal(a.bar, "baz")
+    assert.end()
+})
+
+test("null prototype", function(assert) {
+    var a = { a: "foo" }
+    var b = Object.create(null)
+    b.b = "bar";
+
+    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
+    assert.end()
+})
+
+test("null prototype mutable", function (assert) {
+    var a = { foo: "bar" }
+    var b = Object.create(null)
+    b.bar = "baz";
+
+    mutableExtend(a, b)
+
+    assert.equal(a.bar, "baz")
+    assert.end()
+})
+
+test("prototype pollution", function (assert) {
+    var a = {}
+    var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
+
+    assert.strictEqual(a.oops, undefined)
+    extend({}, maliciousPayload)
+    assert.strictEqual(a.oops, undefined)
+    assert.end()
+})
+
+test("prototype pollution mutable", function (assert) {
+    var a = {}
+    var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
+
+    assert.strictEqual(a.oops, undefined)
+    mutableExtend({}, maliciousPayload)
+    assert.strictEqual(a.oops, undefined)
+    assert.end()
+})
Index: TruckSimulator-main/ds-db-ws/package-lock.json
===================================================================
--- TruckSimulator-main/ds-db-ws/package-lock.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/package-lock.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -14,5 +14,5 @@
         "express": "^5.1.0",
         "express-session": "^1.18.1",
-        "mysql2": "^3.14.1",
+        "pg": "^8.11.3",
         "uuid": "^11.1.0"
       }
@@ -29,13 +29,4 @@
       "engines": {
         "node": ">= 0.6"
-      }
-    },
-    "node_modules/aws-ssl-profiles": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
-      "integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 6.0.0"
       }
     },
@@ -175,13 +166,4 @@
           "optional": true
         }
-      }
-    },
-    "node_modules/denque": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
-      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
-      "license": "Apache-2.0",
-      "engines": {
-        "node": ">=0.10"
       }
     },
@@ -395,13 +377,4 @@
       }
     },
-    "node_modules/generate-function": {
-      "version": "2.3.1",
-      "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
-      "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
-      "license": "MIT",
-      "dependencies": {
-        "is-property": "^1.0.2"
-      }
-    },
     "node_modules/get-intrinsic": {
       "version": "1.3.0",
@@ -526,40 +499,4 @@
       "license": "MIT"
     },
-    "node_modules/is-property": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-      "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
-      "license": "MIT"
-    },
-    "node_modules/long": {
-      "version": "5.3.2",
-      "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
-      "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
-      "license": "Apache-2.0"
-    },
-    "node_modules/lru-cache": {
-      "version": "7.18.3",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
-      "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
-      "license": "ISC",
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/lru.min": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.2.tgz",
-      "integrity": "sha512-Nv9KddBcQSlQopmBHXSsZVY5xsdlZkdH/Iey0BlcBYggMd4two7cZnKOK9vmy3nY0O5RGH99z1PCeTpPqszUYg==",
-      "license": "MIT",
-      "engines": {
-        "bun": ">=1.0.0",
-        "deno": ">=1.30.0",
-        "node": ">=8.0.0"
-      },
-      "funding": {
-        "type": "github",
-        "url": "https://github.com/sponsors/wellwelwel"
-      }
-    },
     "node_modules/math-intrinsics": {
       "version": "1.1.0",
@@ -619,36 +556,4 @@
       "license": "MIT"
     },
-    "node_modules/mysql2": {
-      "version": "3.14.1",
-      "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.14.1.tgz",
-      "integrity": "sha512-7ytuPQJjQB8TNAYX/H2yhL+iQOnIBjAMam361R7UAL0lOVXWjtdrmoL9HYKqKoLp/8UUTRcvo1QPvK9KL7wA8w==",
-      "license": "MIT",
-      "dependencies": {
-        "aws-ssl-profiles": "^1.1.1",
-        "denque": "^2.1.0",
-        "generate-function": "^2.3.1",
-        "iconv-lite": "^0.6.3",
-        "long": "^5.2.1",
-        "lru.min": "^1.0.0",
-        "named-placeholders": "^1.1.3",
-        "seq-queue": "^0.0.5",
-        "sqlstring": "^2.3.2"
-      },
-      "engines": {
-        "node": ">= 8.0"
-      }
-    },
-    "node_modules/named-placeholders": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
-      "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
-      "license": "MIT",
-      "dependencies": {
-        "lru-cache": "^7.14.1"
-      },
-      "engines": {
-        "node": ">=12.0.0"
-      }
-    },
     "node_modules/negotiator": {
       "version": "1.0.0",
@@ -738,4 +643,132 @@
       "engines": {
         "node": ">=16"
+      }
+    },
+    "node_modules/pg": {
+      "version": "8.16.3",
+      "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz",
+      "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-connection-string": "^2.9.1",
+        "pg-pool": "^3.10.1",
+        "pg-protocol": "^1.10.3",
+        "pg-types": "2.2.0",
+        "pgpass": "1.0.5"
+      },
+      "engines": {
+        "node": ">= 16.0.0"
+      },
+      "optionalDependencies": {
+        "pg-cloudflare": "^1.2.7"
+      },
+      "peerDependencies": {
+        "pg-native": ">=3.0.1"
+      },
+      "peerDependenciesMeta": {
+        "pg-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pg-cloudflare": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz",
+      "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/pg-connection-string": {
+      "version": "2.9.1",
+      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
+      "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
+      "license": "MIT"
+    },
+    "node_modules/pg-int8": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/pg-pool": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz",
+      "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "pg": ">=8.0"
+      }
+    },
+    "node_modules/pg-protocol": {
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz",
+      "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==",
+      "license": "MIT"
+    },
+    "node_modules/pg-types": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-int8": "1.0.1",
+        "postgres-array": "~2.0.0",
+        "postgres-bytea": "~1.0.0",
+        "postgres-date": "~1.0.4",
+        "postgres-interval": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pgpass": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+      "license": "MIT",
+      "dependencies": {
+        "split2": "^4.1.0"
+      }
+    },
+    "node_modules/postgres-array": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postgres-bytea": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-date": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-interval": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "xtend": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
       }
     },
@@ -865,9 +898,4 @@
       }
     },
-    "node_modules/seq-queue": {
-      "version": "0.0.5",
-      "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
-      "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
-    },
     "node_modules/serve-static": {
       "version": "2.2.0",
@@ -963,11 +991,11 @@
       }
     },
-    "node_modules/sqlstring": {
-      "version": "2.3.3",
-      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
-      "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">= 10.x"
       }
     },
@@ -1052,4 +1080,13 @@
       "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
       "license": "ISC"
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4"
+      }
     }
   }
Index: TruckSimulator-main/ds-db-ws/package.json
===================================================================
--- TruckSimulator-main/ds-db-ws/package.json	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -16,5 +16,5 @@
     "express": "^5.1.0",
     "express-session": "^1.18.1",
-    "mysql2": "^3.14.1",
+    "pg": "^8.11.3",
     "uuid": "^11.1.0"
   }
Index: TruckSimulator-main/ds-db-ws/public/scripts.js
===================================================================
--- TruckSimulator-main/ds-db-ws/public/scripts.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/public/scripts.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -1,15 +1,22 @@
 let isEmployee = false;
 
-
-document.getElementById("type-select").addEventListener("change", function () {
+// Render spec inputs based on current selection
+function renderSpecInputs() {
+  const select = document.getElementById("type-select");
   const container = document.getElementById("spec-container");
-  if (this.value === "truck") {
+  if (!select || !container) return;
+  if (select.value === "truck") {
     container.innerHTML = `<input class="form-control" name="HP" type="number" placeholder="Horsepower (HP)" required>`;
-  } else if (this.value === "trailer") {
+  } else if (select.value === "trailer") {
     container.innerHTML = `<input class="form-control" name="Capacity" type="number" step="0.01" placeholder="Capacity (tons)" required>`;
   } else {
     container.innerHTML = "";
   }
-});
+}
+
+document.getElementById("type-select")?.addEventListener("change", renderSpecInputs);
+
+// Initialize on load in case user selects immediately
+renderSpecInputs();
 
 
@@ -49,4 +56,10 @@
 
       document.getElementById('add-form').style.display = "block";
+      // Default to Truck so HP is visible immediately, then render spec inputs
+      const typeSelect = document.getElementById("type-select");
+      if (typeSelect && !typeSelect.value) {
+        typeSelect.value = "truck";
+      }
+      renderSpecInputs();
     }
 
@@ -117,8 +130,11 @@
 
         let extraSpec = '';
+        let extraInput = '';
         if (p.type === 'truck') {
           extraSpec = `<strong>HP:</strong> ${p.specs?.HP || 'N/A'}`;
+          extraInput = isEmployee ? `<input class="form-control mb-2" value="${p.specs?.HP || ''}" data-id="${p.ProductID}" data-field="HP" type="number" placeholder="HP">` : '';
         } else if (p.type === 'trailer') {
           extraSpec = `<strong>Capacity:</strong> ${p.specs?.Capacity || 'N/A'} tons`;
+          extraInput = isEmployee ? `<input class="form-control mb-2" value="${p.specs?.Capacity || ''}" data-id="${p.ProductID}" data-field="Capacity" type="number" step="0.01" placeholder="Capacity (tons)">` : '';
         }
 
@@ -135,4 +151,5 @@
         <option ${p.Status === 'maintenance' ? 'selected' : ''}>maintenance</option>
       </select>
+      ${extraInput}
 
       <p class="mt-2">
@@ -509,8 +526,8 @@
       const select = document.getElementById("maintenance-product-select");
       select.innerHTML = '<option value="">Select Product</option>';
-      products.filter(p => p.Status !== 'maintenance' && p.Status === 'available').forEach(p => {
+      products.filter(p => p.status !== 'maintenance' && p.status === 'available').forEach(p => {
         const opt = document.createElement("option");
-        opt.value = p.ProductID;
-        opt.textContent = `${p.Model} (${p.LicensePlate || 'No Plate'})`;
+        opt.value = p.productid;
+        opt.textContent = `${p.model} (${p.licenseplate || 'No Plate'})`;
         select.appendChild(opt);
       });
Index: TruckSimulator-main/ds-db-ws/routes/notificationRoutes.js
===================================================================
--- TruckSimulator-main/ds-db-ws/routes/notificationRoutes.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/routes/notificationRoutes.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -14,5 +14,5 @@
       SELECT DISTINCT p.TransactionID, p.Status
       FROM procurement p
-      WHERE p.CustomerID = ?
+      WHERE p.CustomerID = $1
         AND p.Status IN ('Approved', 'Rejected')
         AND p.Notified = FALSE
@@ -22,5 +22,5 @@
       const txIds = rows.map(r => r.TransactionID);
       await pool.query(
-        `UPDATE procurement SET Notified = TRUE WHERE CustomerID = ? AND TransactionID IN (?)`,
+        `UPDATE procurement SET Notified = TRUE WHERE CustomerID = $1 AND TransactionID = ANY($2)`,
         [customerId, txIds]
       );
Index: TruckSimulator-main/ds-db-ws/routes/productRoutes.js
===================================================================
--- TruckSimulator-main/ds-db-ws/routes/productRoutes.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/routes/productRoutes.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -6,18 +6,28 @@
 router.get("/", async (req, res) => {
     try {
-      const [rows] = await pool.query(`
+      const result = await pool.query(`
         SELECT 
-          p.ProductID, p.Model, p.Price, p.LicensePlate, p.Status,
+          p.productid, p.model, p.price, p.licenseplate, p.status,
           CASE 
-            WHEN t.HP IS NOT NULL THEN 'truck'
-            WHEN tr.Capacity IS NOT NULL THEN 'trailer'
+            WHEN t.hp IS NOT NULL THEN 'truck'
+            WHEN tr.capacity IS NOT NULL THEN 'trailer'
           END AS type,
-          JSON_OBJECT('HP', t.HP, 'Capacity', tr.Capacity) AS specs
+          JSON_BUILD_OBJECT('HP', t.hp, 'Capacity', tr.capacity) AS specs
         FROM product p
-        LEFT JOIN truck t ON p.ProductID = t.ProductID
-        LEFT JOIN trailer tr ON p.ProductID = tr.ProductID
+        LEFT JOIN truck t ON p.productid = t.productid
+        LEFT JOIN trailer tr ON p.productid = tr.productid
       `);
   
-      res.json(rows);
+      const products = result.rows.map(p => ({
+        ProductID: p.productid,
+        Model: p.model,
+        Price: p.price,
+        LicensePlate: p.licenseplate,
+        Status: p.status,
+        type: p.type,
+        specs: typeof p.specs === 'string' ? JSON.parse(p.specs) : p.specs
+      }));
+      
+      res.json(products);
     } catch (err) {
       console.error("Error loading products:", err);
Index: TruckSimulator-main/ds-db-ws/routes/walletRoutes.js
===================================================================
--- TruckSimulator-main/ds-db-ws/routes/walletRoutes.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/routes/walletRoutes.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -12,5 +12,5 @@
   try {
     const [rows] = await pool.query(
-      `SELECT WalletID AS CardID, CardNumber, Balance, CardHolderName FROM wallet WHERE CustomerID = ?`,
+      `SELECT WalletID AS CardID, CardNumber, Balance, CardHolderName FROM wallet WHERE CustomerID = $1`,
       [customerId]
     );
Index: TruckSimulator-main/ds-db-ws/server.js
===================================================================
--- TruckSimulator-main/ds-db-ws/server.js	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/ds-db-ws/server.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -85,12 +85,12 @@
   try {
     const customerId = req.session.user.id;
-    const [rows] = await pool.query(`
+    const result = await pool.query(`
       SELECT TransactionID, Status
       FROM procurement
-      WHERE CustomerID = ?
+      WHERE CustomerID = $1
       ORDER BY ProcurementDate DESC
     `, [customerId]);
 
-    res.json(rows);
+    res.json(result.rows);
   } catch (err) {
     console.error('Notifications fetch error:', err);
Index: TruckSimulator-main/node_modules/.package-lock.json
===================================================================
--- TruckSimulator-main/node_modules/.package-lock.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/.package-lock.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,153 @@
+{
+  "name": "TruckSimulator-main",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/pg": {
+      "version": "8.16.3",
+      "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz",
+      "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-connection-string": "^2.9.1",
+        "pg-pool": "^3.10.1",
+        "pg-protocol": "^1.10.3",
+        "pg-types": "2.2.0",
+        "pgpass": "1.0.5"
+      },
+      "engines": {
+        "node": ">= 16.0.0"
+      },
+      "optionalDependencies": {
+        "pg-cloudflare": "^1.2.7"
+      },
+      "peerDependencies": {
+        "pg-native": ">=3.0.1"
+      },
+      "peerDependenciesMeta": {
+        "pg-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pg-cloudflare": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz",
+      "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/pg-connection-string": {
+      "version": "2.9.1",
+      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
+      "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
+      "license": "MIT"
+    },
+    "node_modules/pg-int8": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/pg-pool": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz",
+      "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "pg": ">=8.0"
+      }
+    },
+    "node_modules/pg-protocol": {
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz",
+      "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==",
+      "license": "MIT"
+    },
+    "node_modules/pg-types": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-int8": "1.0.1",
+        "postgres-array": "~2.0.0",
+        "postgres-bytea": "~1.0.0",
+        "postgres-date": "~1.0.4",
+        "postgres-interval": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pgpass": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+      "license": "MIT",
+      "dependencies": {
+        "split2": "^4.1.0"
+      }
+    },
+    "node_modules/postgres-array": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postgres-bytea": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-date": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-interval": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "xtend": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">= 10.x"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4"
+      }
+    }
+  }
+}
Index: TruckSimulator-main/node_modules/pg-cloudflare/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2010 - 2021 Brian Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-cloudflare/README.md
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,112 @@
+# pg-cloudflare
+
+`pg-cloudflare` makes it easier to take an existing package that relies on `tls` and `net`, and make it work in environments where only `connect()` is supported, such as Cloudflare Workers.
+
+`pg-cloudflare` wraps `connect()`, the [TCP Socket API](https://github.com/wintercg/proposal-sockets-api) proposed within WinterCG, and implemented in [Cloudflare Workers](https://developers.cloudflare.com/workers/runtime-apis/tcp-sockets/), and exposes an interface with methods similar to what the `net` and `tls` modules in Node.js expose. (ex: `net.connect(path[, options][, callback])`). This minimizes the number of changes needed in order to make an existing package work across JavaScript runtimes.
+
+## Installation
+
+```
+npm i --save-dev pg-cloudflare
+```
+
+The package uses conditional exports to support bundlers that don't know about
+`cloudflare:sockets`, so the consumer code by default imports an empty file. To
+enable the package, resolve to the `cloudflare` condition in your bundler's
+config. For example:
+
+- `webpack.config.js`
+  ```js
+  export default {
+    ...,
+    resolve: { conditionNames: [..., "workerd"] },
+    plugins: [
+      // ignore cloudflare:sockets imports
+      new webpack.IgnorePlugin({
+        resourceRegExp: /^cloudflare:sockets$/,
+      }),
+    ],
+  }
+  ```
+- `vite.config.js`
+
+  > [!NOTE]
+  > If you are using the [Cloudflare Vite plugin](https://www.npmjs.com/package/@cloudflare/vite-plugin) then the following configuration is not necessary.
+
+  ```js
+  export default defineConfig({
+    ...,
+    resolve: {
+      conditions: [..., "workerd"],
+    },
+    build: {
+      ...,
+      // don't try to bundle cloudflare:sockets
+      rollupOptions: {
+        external: [..., 'cloudflare:sockets'],
+      },
+    },
+  })
+  ```
+
+- `rollup.config.js`
+  ```js
+  export default defineConfig({
+    ...,
+    plugins: [..., nodeResolve({ exportConditions: [..., 'workerd'] })],
+    // don't try to bundle cloudflare:sockets
+    external: [..., 'cloudflare:sockets'],
+  })
+  ```
+- `esbuild.config.js`
+  ```js
+  await esbuild.build({
+    ...,
+    conditions: [..., 'workerd'],
+  })
+  ```
+
+The concrete examples can be found in `packages/pg-bundler-test`.
+
+## How to use conditionally, in non-Node.js environments
+
+As implemented in `pg` [here](https://github.com/brianc/node-postgres/commit/07553428e9c0eacf761a5d4541a3300ff7859578#diff-34588ad868ebcb232660aba7ee6a99d1e02f4bc93f73497d2688c3f074e60533R5-R13), a typical use case might look as follows, where in a Node.js environment the `net` module is used, while in a non-Node.js environment, where `net` is unavailable, `pg-cloudflare` is used instead, providing an equivalent interface:
+
+```js
+module.exports.getStream = function getStream(ssl = false) {
+  const net = require('net')
+  if (typeof net.Socket === 'function') {
+    return net.Socket()
+  }
+  const { CloudflareSocket } = require('pg-cloudflare')
+  return new CloudflareSocket(ssl)
+}
+```
+
+## Node.js implementation of the Socket API proposal
+
+If you're looking for a way to rely on `connect()` as the interface you use to interact with raw sockets, but need this interface to be available in a Node.js environment, [`@arrowood.dev/socket`](https://github.com/Ethan-Arrowood/socket) provides a Node.js implementation of the Socket API.
+
+### license
+
+The MIT License (MIT)
+
+Copyright (c) 2023 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,2 @@
+declare const _default: {};
+export default _default;
Index: TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.js
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+// This is an empty module that is served up when outside of a workerd environment
+// See the `exports` field in package.json
+exports.default = {};
+//# sourceMappingURL=empty.js.map
Index: TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/dist/empty.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"empty.js","sourceRoot":"","sources":["../src/empty.ts"],"names":[],"mappings":";;AAAA,kFAAkF;AAClF,0CAA0C;AAC1C,kBAAe,EAAE,CAAA"}
Index: TruckSimulator-main/node_modules/pg-cloudflare/dist/index.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,31 @@
+/// <reference types="node" />
+/// <reference types="node" />
+/// <reference types="node" />
+import { TlsOptions } from 'cloudflare:sockets';
+import { EventEmitter } from 'events';
+/**
+ * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
+ */
+export declare class CloudflareSocket extends EventEmitter {
+    readonly ssl: boolean;
+    writable: boolean;
+    destroyed: boolean;
+    private _upgrading;
+    private _upgraded;
+    private _cfSocket;
+    private _cfWriter;
+    private _cfReader;
+    constructor(ssl: boolean);
+    setNoDelay(): this;
+    setKeepAlive(): this;
+    ref(): this;
+    unref(): this;
+    connect(port: number, host: string, connectListener?: (...args: unknown[]) => void): Promise<this | undefined>;
+    _listen(): Promise<void>;
+    _listenOnce(): Promise<void>;
+    write(data: Uint8Array | string, encoding?: BufferEncoding, callback?: (...args: unknown[]) => void): true | void;
+    end(data?: Buffer, encoding?: BufferEncoding, callback?: (...args: unknown[]) => void): this;
+    destroy(reason: string): this;
+    startTls(options: TlsOptions): void;
+    _addClosedHandler(): void;
+}
Index: TruckSimulator-main/node_modules/pg-cloudflare/dist/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,152 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.CloudflareSocket = void 0;
+const events_1 = require("events");
+/**
+ * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
+ */
+class CloudflareSocket extends events_1.EventEmitter {
+    constructor(ssl) {
+        super();
+        this.ssl = ssl;
+        this.writable = false;
+        this.destroyed = false;
+        this._upgrading = false;
+        this._upgraded = false;
+        this._cfSocket = null;
+        this._cfWriter = null;
+        this._cfReader = null;
+    }
+    setNoDelay() {
+        return this;
+    }
+    setKeepAlive() {
+        return this;
+    }
+    ref() {
+        return this;
+    }
+    unref() {
+        return this;
+    }
+    async connect(port, host, connectListener) {
+        try {
+            log('connecting');
+            if (connectListener)
+                this.once('connect', connectListener);
+            const options = this.ssl ? { secureTransport: 'starttls' } : {};
+            const mod = await import('cloudflare:sockets');
+            const connect = mod.connect;
+            this._cfSocket = connect(`${host}:${port}`, options);
+            this._cfWriter = this._cfSocket.writable.getWriter();
+            this._addClosedHandler();
+            this._cfReader = this._cfSocket.readable.getReader();
+            if (this.ssl) {
+                this._listenOnce().catch((e) => this.emit('error', e));
+            }
+            else {
+                this._listen().catch((e) => this.emit('error', e));
+            }
+            await this._cfWriter.ready;
+            log('socket ready');
+            this.writable = true;
+            this.emit('connect');
+            return this;
+        }
+        catch (e) {
+            this.emit('error', e);
+        }
+    }
+    async _listen() {
+        // eslint-disable-next-line no-constant-condition
+        while (true) {
+            log('awaiting receive from CF socket');
+            const { done, value } = await this._cfReader.read();
+            log('CF socket received:', done, value);
+            if (done) {
+                log('done');
+                break;
+            }
+            this.emit('data', Buffer.from(value));
+        }
+    }
+    async _listenOnce() {
+        log('awaiting first receive from CF socket');
+        const { done, value } = await this._cfReader.read();
+        log('First CF socket received:', done, value);
+        this.emit('data', Buffer.from(value));
+    }
+    write(data, encoding = 'utf8', callback = () => { }) {
+        if (data.length === 0)
+            return callback();
+        if (typeof data === 'string')
+            data = Buffer.from(data, encoding);
+        log('sending data direct:', data);
+        this._cfWriter.write(data).then(() => {
+            log('data sent');
+            callback();
+        }, (err) => {
+            log('send error', err);
+            callback(err);
+        });
+        return true;
+    }
+    end(data = Buffer.alloc(0), encoding = 'utf8', callback = () => { }) {
+        log('ending CF socket');
+        this.write(data, encoding, (err) => {
+            this._cfSocket.close();
+            if (callback)
+                callback(err);
+        });
+        return this;
+    }
+    destroy(reason) {
+        log('destroying CF socket', reason);
+        this.destroyed = true;
+        return this.end();
+    }
+    startTls(options) {
+        if (this._upgraded) {
+            // Don't try to upgrade again.
+            this.emit('error', 'Cannot call `startTls()` more than once on a socket');
+            return;
+        }
+        this._cfWriter.releaseLock();
+        this._cfReader.releaseLock();
+        this._upgrading = true;
+        this._cfSocket = this._cfSocket.startTls(options);
+        this._cfWriter = this._cfSocket.writable.getWriter();
+        this._cfReader = this._cfSocket.readable.getReader();
+        this._addClosedHandler();
+        this._listen().catch((e) => this.emit('error', e));
+    }
+    _addClosedHandler() {
+        this._cfSocket.closed.then(() => {
+            if (!this._upgrading) {
+                log('CF socket closed');
+                this._cfSocket = null;
+                this.emit('close');
+            }
+            else {
+                this._upgrading = false;
+                this._upgraded = true;
+            }
+        }).catch((e) => this.emit('error', e));
+    }
+}
+exports.CloudflareSocket = CloudflareSocket;
+const debug = false;
+function dump(data) {
+    if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
+        const hex = Buffer.from(data).toString('hex');
+        const str = new TextDecoder().decode(data);
+        return `\n>>> STR: "${str.replace(/\n/g, '\\n')}"\n>>> HEX: ${hex}\n`;
+    }
+    else {
+        return data;
+    }
+}
+function log(...args) {
+    debug && console.log(...args.map(dump));
+}
+//# sourceMappingURL=index.js.map
Index: TruckSimulator-main/node_modules/pg-cloudflare/dist/index.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/node_modules/pg-cloudflare/esm/index.mjs
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,3 @@
+import cf from '../dist/index.js'
+
+export const CloudflareSocket = cf.CloudflareSocket
Index: TruckSimulator-main/node_modules/pg-cloudflare/package.json
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,38 @@
+{
+  "name": "pg-cloudflare",
+  "version": "1.2.7",
+  "description": "A socket implementation that can run on Cloudflare Workers using native TCP connections.",
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
+  "license": "MIT",
+  "devDependencies": {
+    "ts-node": "^8.5.4",
+    "typescript": "^4.0.3"
+  },
+  "exports": {
+    ".": {
+      "workerd": {
+        "import": "./esm/index.mjs",
+        "require": "./dist/index.js"
+      },
+      "default": "./dist/empty.js"
+    }
+  },
+  "scripts": {
+    "build": "tsc",
+    "build:watch": "tsc --watch",
+    "prepublish": "yarn build",
+    "test": "echo e2e test in pg package"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-cloudflare"
+  },
+  "files": [
+    "/dist/*{js,ts,map}",
+    "/src",
+    "/esm"
+  ],
+  "gitHead": "8f8e7315e8f7c1bb01e98fdb41c8c92585510782"
+}
Index: TruckSimulator-main/node_modules/pg-cloudflare/src/empty.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/src/empty.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/src/empty.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,3 @@
+// This is an empty module that is served up when outside of a workerd environment
+// See the `exports` field in package.json
+export default {}
Index: TruckSimulator-main/node_modules/pg-cloudflare/src/index.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,166 @@
+import { SocketOptions, Socket, TlsOptions } from 'cloudflare:sockets'
+import { EventEmitter } from 'events'
+
+/**
+ * Wrapper around the Cloudflare built-in socket that can be used by the `Connection`.
+ */
+export class CloudflareSocket extends EventEmitter {
+  writable = false
+  destroyed = false
+
+  private _upgrading = false
+  private _upgraded = false
+  private _cfSocket: Socket | null = null
+  private _cfWriter: WritableStreamDefaultWriter | null = null
+  private _cfReader: ReadableStreamDefaultReader | null = null
+
+  constructor(readonly ssl: boolean) {
+    super()
+  }
+
+  setNoDelay() {
+    return this
+  }
+  setKeepAlive() {
+    return this
+  }
+  ref() {
+    return this
+  }
+  unref() {
+    return this
+  }
+
+  async connect(port: number, host: string, connectListener?: (...args: unknown[]) => void) {
+    try {
+      log('connecting')
+      if (connectListener) this.once('connect', connectListener)
+
+      const options: SocketOptions = this.ssl ? { secureTransport: 'starttls' } : {}
+      const mod = await import('cloudflare:sockets')
+      const connect = mod.connect
+      this._cfSocket = connect(`${host}:${port}`, options)
+      this._cfWriter = this._cfSocket.writable.getWriter()
+      this._addClosedHandler()
+
+      this._cfReader = this._cfSocket.readable.getReader()
+      if (this.ssl) {
+        this._listenOnce().catch((e) => this.emit('error', e))
+      } else {
+        this._listen().catch((e) => this.emit('error', e))
+      }
+
+      await this._cfWriter!.ready
+      log('socket ready')
+      this.writable = true
+      this.emit('connect')
+
+      return this
+    } catch (e) {
+      this.emit('error', e)
+    }
+  }
+
+  async _listen() {
+    // eslint-disable-next-line no-constant-condition
+    while (true) {
+      log('awaiting receive from CF socket')
+      const { done, value } = await this._cfReader!.read()
+      log('CF socket received:', done, value)
+      if (done) {
+        log('done')
+        break
+      }
+      this.emit('data', Buffer.from(value))
+    }
+  }
+
+  async _listenOnce() {
+    log('awaiting first receive from CF socket')
+    const { done, value } = await this._cfReader!.read()
+    log('First CF socket received:', done, value)
+    this.emit('data', Buffer.from(value))
+  }
+
+  write(
+    data: Uint8Array | string,
+    encoding: BufferEncoding = 'utf8',
+    callback: (...args: unknown[]) => void = () => {}
+  ) {
+    if (data.length === 0) return callback()
+    if (typeof data === 'string') data = Buffer.from(data, encoding)
+
+    log('sending data direct:', data)
+    this._cfWriter!.write(data).then(
+      () => {
+        log('data sent')
+        callback()
+      },
+      (err) => {
+        log('send error', err)
+        callback(err)
+      }
+    )
+    return true
+  }
+
+  end(data = Buffer.alloc(0), encoding: BufferEncoding = 'utf8', callback: (...args: unknown[]) => void = () => {}) {
+    log('ending CF socket')
+    this.write(data, encoding, (err) => {
+      this._cfSocket!.close()
+      if (callback) callback(err)
+    })
+    return this
+  }
+
+  destroy(reason: string) {
+    log('destroying CF socket', reason)
+    this.destroyed = true
+    return this.end()
+  }
+
+  startTls(options: TlsOptions) {
+    if (this._upgraded) {
+      // Don't try to upgrade again.
+      this.emit('error', 'Cannot call `startTls()` more than once on a socket')
+      return
+    }
+    this._cfWriter!.releaseLock()
+    this._cfReader!.releaseLock()
+    this._upgrading = true
+    this._cfSocket = this._cfSocket!.startTls(options)
+    this._cfWriter = this._cfSocket.writable.getWriter()
+    this._cfReader = this._cfSocket.readable.getReader()
+    this._addClosedHandler()
+    this._listen().catch((e) => this.emit('error', e))
+  }
+
+  _addClosedHandler() {
+    this._cfSocket!.closed.then(() => {
+      if (!this._upgrading) {
+        log('CF socket closed')
+        this._cfSocket = null
+        this.emit('close')
+      } else {
+        this._upgrading = false
+        this._upgraded = true
+      }
+    }).catch((e) => this.emit('error', e))
+  }
+}
+
+const debug = false
+
+function dump(data: unknown) {
+  if (data instanceof Uint8Array || data instanceof ArrayBuffer) {
+    const hex = Buffer.from(data).toString('hex')
+    const str = new TextDecoder().decode(data)
+    return `\n>>> STR: "${str.replace(/\n/g, '\\n')}"\n>>> HEX: ${hex}\n`
+  } else {
+    return data
+  }
+}
+
+function log(...args: unknown[]) {
+  debug && console.log(...args.map(dump))
+}
Index: TruckSimulator-main/node_modules/pg-cloudflare/src/types.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-cloudflare/src/types.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-cloudflare/src/types.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,25 @@
+declare module 'cloudflare:sockets' {
+  export class Socket {
+    public readonly readable: any
+    public readonly writable: any
+    public readonly closed: Promise<void>
+    public close(): Promise<void>
+    public startTls(options: TlsOptions): Socket
+  }
+
+  export type TlsOptions = {
+    expectedServerHostname?: string
+  }
+
+  export type SocketAddress = {
+    hostname: string
+    port: number
+  }
+
+  export type SocketOptions = {
+    secureTransport?: 'off' | 'on' | 'starttls'
+    allowHalfOpen?: boolean
+  }
+
+  export function connect(address: string | SocketAddress, options?: SocketOptions): Socket
+}
Index: TruckSimulator-main/node_modules/pg-connection-string/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/pg-connection-string/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-connection-string/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Iced Development
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-connection-string/README.md
===================================================================
--- TruckSimulator-main/node_modules/pg-connection-string/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-connection-string/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,105 @@
+pg-connection-string
+====================
+
+[![NPM](https://nodei.co/npm/pg-connection-string.png?compact=true)](https://nodei.co/npm/pg-connection-string/)
+
+Functions for dealing with a PostgresSQL connection string
+
+`parse` method taken from [node-postgres](https://github.com/brianc/node-postgres.git)
+Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)
+MIT License
+
+## Usage
+
+```js
+const parse = require('pg-connection-string').parse;
+
+const config = parse('postgres://someuser:somepassword@somehost:381/somedatabase')
+```
+
+The resulting config contains a subset of the following properties:
+
+* `user` - User with which to authenticate to the server
+* `password` - Corresponding password
+* `host` - Postgres server hostname or, for UNIX domain sockets, the socket filename
+* `port` - port on which to connect
+* `database` - Database name within the server
+* `client_encoding` - string encoding the client will use
+* `ssl`, either a boolean or an object with properties
+  * `rejectUnauthorized`
+  * `cert`
+  * `key`
+  * `ca`
+* any other query parameters (for example, `application_name`) are preserved intact.
+
+### ClientConfig Compatibility for TypeScript
+
+The pg-connection-string `ConnectionOptions` interface is not compatible with the `ClientConfig` interface that [pg.Client](https://node-postgres.com/apis/client) expects. To remedy this, use the `parseIntoClientConfig` function instead of `parse`:
+
+```ts
+import { ClientConfig } from 'pg';
+import { parseIntoClientConfig } from 'pg-connection-string';
+
+const config: ClientConfig = parseIntoClientConfig('postgres://someuser:somepassword@somehost:381/somedatabase')
+```
+
+You can also use `toClientConfig` to convert an existing `ConnectionOptions` interface into a `ClientConfig` interface:
+
+```ts
+import { ClientConfig } from 'pg';
+import { parse, toClientConfig } from 'pg-connection-string';
+
+const config = parse('postgres://someuser:somepassword@somehost:381/somedatabase')
+const clientConfig: ClientConfig = toClientConfig(config)
+```
+
+## Connection Strings
+
+The short summary of acceptable URLs is:
+
+ * `socket:<path>?<query>` - UNIX domain socket
+ * `postgres://<user>:<password>@<host>:<port>/<database>?<query>` - TCP connection
+
+But see below for more details.
+
+### UNIX Domain Sockets
+
+When user and password are not given, the socket path follows `socket:`, as in `socket:/var/run/pgsql`.
+This form can be shortened to just a path: `/var/run/pgsql`.
+
+When user and password are given, they are included in the typical URL positions, with an empty `host`, as in `socket://user:pass@/var/run/pgsql`.
+
+Query parameters follow a `?` character, including the following special query parameters:
+
+ * `db=<database>` - sets the database name (urlencoded)
+ * `encoding=<encoding>` - sets the `client_encoding` property
+
+### TCP Connections
+
+TCP connections to the Postgres server are indicated with `pg:` or `postgres:` schemes (in fact, any scheme but `socket:` is accepted).
+If username and password are included, they should be urlencoded.
+The database name, however, should *not* be urlencoded.
+
+Query parameters follow a `?` character, including the following special query parameters:
+ * `host=<host>` - sets `host` property, overriding the URL's host
+ * `encoding=<encoding>` - sets the `client_encoding` property
+ * `ssl=1`, `ssl=true`, `ssl=0`, `ssl=false` - sets `ssl` to true or false, accordingly
+ * `uselibpqcompat=true` - use libpq semantics
+ * `sslmode=<sslmode>` when `uselibpqcompat=true` is not set
+   * `sslmode=disable` - sets `ssl` to false
+   * `sslmode=no-verify` - sets `ssl` to `{ rejectUnauthorized: false }`
+   * `sslmode=prefer`, `sslmode=require`, `sslmode=verify-ca`, `sslmode=verify-full` - sets `ssl` to true
+ * `sslmode=<sslmode>` when `uselibpqcompat=true`
+   * `sslmode=disable` - sets `ssl` to false
+   * `sslmode=prefer` - sets `ssl` to `{ rejectUnauthorized: false }`
+   * `sslmode=require` - sets `ssl` to `{ rejectUnauthorized: false }` unless `sslrootcert` is specified, in which case it behaves like `verify-ca`
+   * `sslmode=verify-ca` - sets `ssl` to `{ checkServerIdentity: no-op }` (verify CA, but not server identity). This verifies the presented certificate against the effective CA specified in sslrootcert.
+   * `sslmode=verify-full` - sets `ssl` to `{}` (verify CA and server identity)
+ * `sslcert=<filename>` - reads data from the given file and includes the result as `ssl.cert`
+ * `sslkey=<filename>` - reads data from the given file and includes the result as `ssl.key`
+ * `sslrootcert=<filename>` - reads data from the given file and includes the result as `ssl.ca`
+
+A bare relative URL, such as `salesdata`, will indicate a database name while leaving other properties empty.
+
+> [!CAUTION]
+> Choosing an sslmode other than verify-full has serious security implications. Please read https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS to understand the trade-offs.
Index: TruckSimulator-main/node_modules/pg-connection-string/esm/index.mjs
===================================================================
--- TruckSimulator-main/node_modules/pg-connection-string/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-connection-string/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,8 @@
+// ESM wrapper for pg-connection-string
+import connectionString from '../index.js'
+
+// Re-export the parse function
+export default connectionString.parse
+export const parse = connectionString.parse
+export const toClientConfig = connectionString.toClientConfig
+export const parseIntoClientConfig = connectionString.parseIntoClientConfig
Index: TruckSimulator-main/node_modules/pg-connection-string/index.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-connection-string/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-connection-string/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,36 @@
+import { ClientConfig } from 'pg'
+
+export function parse(connectionString: string, options?: Options): ConnectionOptions
+
+export interface Options {
+  // Use libpq semantics when interpreting the connection string
+  useLibpqCompat?: boolean
+}
+
+interface SSLConfig {
+  ca?: string
+  cert?: string | null
+  key?: string
+  rejectUnauthorized?: boolean
+}
+
+export interface ConnectionOptions {
+  host: string | null
+  password?: string
+  user?: string
+  port?: string | null
+  database: string | null | undefined
+  client_encoding?: string
+  ssl?: boolean | string | SSLConfig
+
+  application_name?: string
+  fallback_application_name?: string
+  options?: string
+  keepalives?: number
+
+  // We allow any other options to be passed through
+  [key: string]: unknown
+}
+
+export function toClientConfig(config: ConnectionOptions): ClientConfig
+export function parseIntoClientConfig(connectionString: string): ClientConfig
Index: TruckSimulator-main/node_modules/pg-connection-string/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-connection-string/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-connection-string/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,213 @@
+'use strict'
+
+//Parse method copied from https://github.com/brianc/node-postgres
+//Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com)
+//MIT License
+
+//parses a connection string
+function parse(str, options = {}) {
+  //unix socket
+  if (str.charAt(0) === '/') {
+    const config = str.split(' ')
+    return { host: config[0], database: config[1] }
+  }
+
+  // Check for empty host in URL
+
+  const config = {}
+  let result
+  let dummyHost = false
+  if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) {
+    // Ensure spaces are encoded as %20
+    str = encodeURI(str).replace(/%25(\d\d)/g, '%$1')
+  }
+
+  try {
+    try {
+      result = new URL(str, 'postgres://base')
+    } catch (e) {
+      // The URL is invalid so try again with a dummy host
+      result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base')
+      dummyHost = true
+    }
+  } catch (err) {
+    // Remove the input from the error message to avoid leaking sensitive information
+    err.input && (err.input = '*****REDACTED*****')
+  }
+
+  // We'd like to use Object.fromEntries() here but Node.js 10 does not support it
+  for (const entry of result.searchParams.entries()) {
+    config[entry[0]] = entry[1]
+  }
+
+  config.user = config.user || decodeURIComponent(result.username)
+  config.password = config.password || decodeURIComponent(result.password)
+
+  if (result.protocol == 'socket:') {
+    config.host = decodeURI(result.pathname)
+    config.database = result.searchParams.get('db')
+    config.client_encoding = result.searchParams.get('encoding')
+    return config
+  }
+  const hostname = dummyHost ? '' : result.hostname
+  if (!config.host) {
+    // Only set the host if there is no equivalent query param.
+    config.host = decodeURIComponent(hostname)
+  } else if (hostname && /^%2f/i.test(hostname)) {
+    // Only prepend the hostname to the pathname if it is not a URL encoded Unix socket host.
+    result.pathname = hostname + result.pathname
+  }
+  if (!config.port) {
+    // Only set the port if there is no equivalent query param.
+    config.port = result.port
+  }
+
+  const pathname = result.pathname.slice(1) || null
+  config.database = pathname ? decodeURI(pathname) : null
+
+  if (config.ssl === 'true' || config.ssl === '1') {
+    config.ssl = true
+  }
+
+  if (config.ssl === '0') {
+    config.ssl = false
+  }
+
+  if (config.sslcert || config.sslkey || config.sslrootcert || config.sslmode) {
+    config.ssl = {}
+  }
+
+  // Only try to load fs if we expect to read from the disk
+  const fs = config.sslcert || config.sslkey || config.sslrootcert ? require('fs') : null
+
+  if (config.sslcert) {
+    config.ssl.cert = fs.readFileSync(config.sslcert).toString()
+  }
+
+  if (config.sslkey) {
+    config.ssl.key = fs.readFileSync(config.sslkey).toString()
+  }
+
+  if (config.sslrootcert) {
+    config.ssl.ca = fs.readFileSync(config.sslrootcert).toString()
+  }
+
+  if (options.useLibpqCompat && config.uselibpqcompat) {
+    throw new Error('Both useLibpqCompat and uselibpqcompat are set. Please use only one of them.')
+  }
+
+  if (config.uselibpqcompat === 'true' || options.useLibpqCompat) {
+    switch (config.sslmode) {
+      case 'disable': {
+        config.ssl = false
+        break
+      }
+      case 'prefer': {
+        config.ssl.rejectUnauthorized = false
+        break
+      }
+      case 'require': {
+        if (config.sslrootcert) {
+          // If a root CA is specified, behavior of `sslmode=require` will be the same as that of `verify-ca`
+          config.ssl.checkServerIdentity = function () {}
+        } else {
+          config.ssl.rejectUnauthorized = false
+        }
+        break
+      }
+      case 'verify-ca': {
+        if (!config.ssl.ca) {
+          throw new Error(
+            'SECURITY WARNING: Using sslmode=verify-ca requires specifying a CA with sslrootcert. If a public CA is used, verify-ca allows connections to a server that somebody else may have registered with the CA, making you vulnerable to Man-in-the-Middle attacks. Either specify a custom CA certificate with sslrootcert parameter or use sslmode=verify-full for proper security.'
+          )
+        }
+        config.ssl.checkServerIdentity = function () {}
+        break
+      }
+      case 'verify-full': {
+        break
+      }
+    }
+  } else {
+    switch (config.sslmode) {
+      case 'disable': {
+        config.ssl = false
+        break
+      }
+      case 'prefer':
+      case 'require':
+      case 'verify-ca':
+      case 'verify-full': {
+        break
+      }
+      case 'no-verify': {
+        config.ssl.rejectUnauthorized = false
+        break
+      }
+    }
+  }
+
+  return config
+}
+
+// convert pg-connection-string ssl config to a ClientConfig.ConnectionOptions
+function toConnectionOptions(sslConfig) {
+  const connectionOptions = Object.entries(sslConfig).reduce((c, [key, value]) => {
+    // we explicitly check for undefined and null instead of `if (value)` because some
+    // options accept falsy values. Example: `ssl.rejectUnauthorized = false`
+    if (value !== undefined && value !== null) {
+      c[key] = value
+    }
+
+    return c
+  }, {})
+
+  return connectionOptions
+}
+
+// convert pg-connection-string config to a ClientConfig
+function toClientConfig(config) {
+  const poolConfig = Object.entries(config).reduce((c, [key, value]) => {
+    if (key === 'ssl') {
+      const sslConfig = value
+
+      if (typeof sslConfig === 'boolean') {
+        c[key] = sslConfig
+      }
+
+      if (typeof sslConfig === 'object') {
+        c[key] = toConnectionOptions(sslConfig)
+      }
+    } else if (value !== undefined && value !== null) {
+      if (key === 'port') {
+        // when port is not specified, it is converted into an empty string
+        // we want to avoid NaN or empty string as a values in ClientConfig
+        if (value !== '') {
+          const v = parseInt(value, 10)
+          if (isNaN(v)) {
+            throw new Error(`Invalid ${key}: ${value}`)
+          }
+
+          c[key] = v
+        }
+      } else {
+        c[key] = value
+      }
+    }
+
+    return c
+  }, {})
+
+  return poolConfig
+}
+
+// parses a connection string into ClientConfig
+function parseIntoClientConfig(str) {
+  return toClientConfig(parse(str))
+}
+
+module.exports = parse
+
+parse.parse = parse
+parse.toClientConfig = toClientConfig
+parse.parseIntoClientConfig = parseIntoClientConfig
Index: TruckSimulator-main/node_modules/pg-connection-string/package.json
===================================================================
--- TruckSimulator-main/node_modules/pg-connection-string/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-connection-string/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,52 @@
+{
+  "name": "pg-connection-string",
+  "version": "2.9.1",
+  "description": "Functions for dealing with a PostgresSQL connection string",
+  "main": "./index.js",
+  "types": "./index.d.ts",
+  "exports": {
+    ".": {
+      "types": "./index.d.ts",
+      "import": "./esm/index.mjs",
+      "require": "./index.js",
+      "default": "./index.js"
+    }
+  },
+  "scripts": {
+    "test": "nyc --reporter=lcov mocha && npm run check-coverage",
+    "check-coverage": "nyc check-coverage --statements 100 --branches 100 --lines 100 --functions 100"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-connection-string"
+  },
+  "keywords": [
+    "pg",
+    "connection",
+    "string",
+    "parse"
+  ],
+  "author": "Blaine Bublitz <blaine@iceddev.com> (http://iceddev.com/)",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/brianc/node-postgres/issues"
+  },
+  "homepage": "https://github.com/brianc/node-postgres/tree/master/packages/pg-connection-string",
+  "devDependencies": {
+    "@types/pg": "^8.12.0",
+    "chai": "^4.1.1",
+    "coveralls": "^3.0.4",
+    "istanbul": "^0.4.5",
+    "mocha": "^10.5.2",
+    "nyc": "^15",
+    "tsx": "^4.19.4",
+    "typescript": "^4.0.3"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "esm"
+  ],
+  "gitHead": "cd877a57612a39335a97b593111710d26126279d"
+}
Index: TruckSimulator-main/node_modules/pg-int8/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/pg-int8/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-int8/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,13 @@
+Copyright © 2017, Charmander <~@charmander.me>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED “AS IS” AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-int8/README.md
===================================================================
--- TruckSimulator-main/node_modules/pg-int8/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-int8/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,16 @@
+[![Build status][ci image]][ci]
+
+64-bit big-endian signed integer-to-string conversion designed for [pg][].
+
+```js
+const readInt8 = require('pg-int8');
+
+readInt8(Buffer.from([0, 1, 2, 3, 4, 5, 6, 7]))
+// '283686952306183'
+```
+
+
+  [pg]: https://github.com/brianc/node-postgres
+
+  [ci]: https://travis-ci.org/charmander/pg-int8
+  [ci image]: https://api.travis-ci.org/charmander/pg-int8.svg
Index: TruckSimulator-main/node_modules/pg-int8/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-int8/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-int8/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,100 @@
+'use strict';
+
+// selected so (BASE - 1) * 0x100000000 + 0xffffffff is a safe integer
+var BASE = 1000000;
+
+function readInt8(buffer) {
+	var high = buffer.readInt32BE(0);
+	var low = buffer.readUInt32BE(4);
+	var sign = '';
+
+	if (high < 0) {
+		high = ~high + (low === 0);
+		low = (~low + 1) >>> 0;
+		sign = '-';
+	}
+
+	var result = '';
+	var carry;
+	var t;
+	var digits;
+	var pad;
+	var l;
+	var i;
+
+	{
+		carry = high % BASE;
+		high = high / BASE >>> 0;
+
+		t = 0x100000000 * carry + low;
+		low = t / BASE >>> 0;
+		digits = '' + (t - BASE * low);
+
+		if (low === 0 && high === 0) {
+			return sign + digits + result;
+		}
+
+		pad = '';
+		l = 6 - digits.length;
+
+		for (i = 0; i < l; i++) {
+			pad += '0';
+		}
+
+		result = pad + digits + result;
+	}
+
+	{
+		carry = high % BASE;
+		high = high / BASE >>> 0;
+
+		t = 0x100000000 * carry + low;
+		low = t / BASE >>> 0;
+		digits = '' + (t - BASE * low);
+
+		if (low === 0 && high === 0) {
+			return sign + digits + result;
+		}
+
+		pad = '';
+		l = 6 - digits.length;
+
+		for (i = 0; i < l; i++) {
+			pad += '0';
+		}
+
+		result = pad + digits + result;
+	}
+
+	{
+		carry = high % BASE;
+		high = high / BASE >>> 0;
+
+		t = 0x100000000 * carry + low;
+		low = t / BASE >>> 0;
+		digits = '' + (t - BASE * low);
+
+		if (low === 0 && high === 0) {
+			return sign + digits + result;
+		}
+
+		pad = '';
+		l = 6 - digits.length;
+
+		for (i = 0; i < l; i++) {
+			pad += '0';
+		}
+
+		result = pad + digits + result;
+	}
+
+	{
+		carry = high % BASE;
+		t = 0x100000000 * carry + low;
+		digits = '' + t % BASE;
+
+		return sign + digits + result;
+	}
+}
+
+module.exports = readInt8;
Index: TruckSimulator-main/node_modules/pg-int8/package.json
===================================================================
--- TruckSimulator-main/node_modules/pg-int8/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-int8/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,24 @@
+{
+	"name": "pg-int8",
+	"version": "1.0.1",
+	"description": "64-bit big-endian signed integer-to-string conversion",
+	"bugs": "https://github.com/charmander/pg-int8/issues",
+	"license": "ISC",
+	"files": [
+		"index.js"
+	],
+	"repository": {
+		"type": "git",
+		"url": "https://github.com/charmander/pg-int8"
+	},
+	"scripts": {
+		"test": "tap test"
+	},
+	"devDependencies": {
+		"@charmander/eslint-config-base": "1.0.2",
+		"tap": "10.7.3"
+	},
+	"engines": {
+		"node": ">=4.0.0"
+	}
+}
Index: TruckSimulator-main/node_modules/pg-pool/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/pg-pool/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-pool/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-pool/README.md
===================================================================
--- TruckSimulator-main/node_modules/pg-pool/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-pool/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,376 @@
+# pg-pool
+[![Build Status](https://travis-ci.org/brianc/node-pg-pool.svg?branch=master)](https://travis-ci.org/brianc/node-pg-pool)
+
+A connection pool for node-postgres
+
+## install
+```sh
+npm i pg-pool pg
+```
+
+## use
+
+### create
+
+to use pg-pool you must first create an instance of a pool
+
+```js
+const Pool = require('pg-pool')
+
+// by default the pool uses the same
+// configuration as whatever `pg` version you have installed
+const pool = new Pool()
+
+// you can pass properties to the pool
+// these properties are passed unchanged to both the node-postgres Client constructor
+// and the node-pool (https://github.com/coopernurse/node-pool) constructor
+// allowing you to fully configure the behavior of both
+const pool2 = new Pool({
+  database: 'postgres',
+  user: 'brianc',
+  password: 'secret!',
+  port: 5432,
+  ssl: true,
+  max: 20, // set pool max size to 20
+  idleTimeoutMillis: 1000, // close idle clients after 1 second
+  connectionTimeoutMillis: 1000, // return an error after 1 second if connection could not be established
+  maxUses: 7500, // close (and replace) a connection after it has been used 7500 times (see below for discussion)
+})
+
+// you can supply a custom client constructor
+// if you want to use the native postgres client
+const NativeClient = require('pg').native.Client
+const nativePool = new Pool({ Client: NativeClient })
+
+// you can even pool pg-native clients directly
+const PgNativeClient = require('pg-native')
+const pgNativePool = new Pool({ Client: PgNativeClient })
+```
+
+##### Note:
+The Pool constructor does not support passing a Database URL as the parameter. To use pg-pool on heroku, for example, you need to parse the URL into a config object. Here is an example of how to parse a Database URL.
+
+```js
+const Pool = require('pg-pool');
+const url = require('url')
+
+const params = url.parse(process.env.DATABASE_URL);
+const auth = params.auth.split(':');
+
+const config = {
+  user: auth[0],
+  password: auth[1],
+  host: params.hostname,
+  port: params.port,
+  database: params.pathname.split('/')[1],
+  ssl: true
+};
+
+const pool = new Pool(config);
+
+/*
+  Transforms, 'postgres://DBuser:secret@DBHost:#####/myDB', into
+  config = {
+    user: 'DBuser',
+    password: 'secret',
+    host: 'DBHost',
+    port: '#####',
+    database: 'myDB',
+    ssl: true
+  }
+*/
+``` 
+
+### acquire clients with a promise
+
+pg-pool supports a fully promise-based api for acquiring clients
+
+```js
+const pool = new Pool()
+pool.connect().then(client => {
+  client.query('select $1::text as name', ['pg-pool']).then(res => {
+    client.release()
+    console.log('hello from', res.rows[0].name)
+  })
+  .catch(e => {
+    client.release()
+    console.error('query error', e.message, e.stack)
+  })
+})
+```
+
+### plays nice with async/await
+
+this ends up looking much nicer if you're using [co](https://github.com/tj/co) or async/await:
+
+```js
+// with async/await
+(async () => {
+  const pool = new Pool()
+  const client = await pool.connect()
+  try {
+    const result = await client.query('select $1::text as name', ['brianc'])
+    console.log('hello from', result.rows[0])
+  } finally {
+    client.release()
+  }
+})().catch(e => console.error(e.message, e.stack))
+
+// with co
+co(function * () {
+  const client = yield pool.connect()
+  try {
+    const result = yield client.query('select $1::text as name', ['brianc'])
+    console.log('hello from', result.rows[0])
+  } finally {
+    client.release()
+  }
+}).catch(e => console.error(e.message, e.stack))
+```
+
+### your new favorite helper method
+
+because its so common to just run a query and return the client to the pool afterward pg-pool has this built-in:
+
+```js
+const pool = new Pool()
+const time = await pool.query('SELECT NOW()')
+const name = await pool.query('select $1::text as name', ['brianc'])
+console.log(name.rows[0].name, 'says hello at', time.rows[0].now)
+```
+
+you can also use a callback here if you'd like:
+
+```js
+const pool = new Pool()
+pool.query('SELECT $1::text as name', ['brianc'], function (err, res) {
+  console.log(res.rows[0].name) // brianc
+})
+```
+
+__pro tip:__ unless you need to run a transaction (which requires a single client for multiple queries) or you
+have some other edge case like [streaming rows](https://github.com/brianc/node-pg-query-stream) or using a [cursor](https://github.com/brianc/node-pg-cursor)
+you should almost always just use `pool.query`.  Its easy, it does the right thing :tm:, and wont ever forget to return
+clients back to the pool after the query is done.
+
+### drop-in backwards compatible
+
+pg-pool still and will always support the traditional callback api for acquiring a client.  This is the exact API node-postgres has shipped with for years:
+
+```js
+const pool = new Pool()
+pool.connect((err, client, done) => {
+  if (err) return done(err)
+
+  client.query('SELECT $1::text as name', ['pg-pool'], (err, res) => {
+    done()
+    if (err) {
+      return console.error('query error', err.message, err.stack)
+    }
+    console.log('hello from', res.rows[0].name)
+  })
+})
+```
+
+### shut it down
+
+When you are finished with the pool if all the clients are idle the pool will close them after `config.idleTimeoutMillis` and your app
+will shutdown gracefully.  If you don't want to wait for the timeout you can end the pool as follows:
+
+```js
+const pool = new Pool()
+const client = await pool.connect()
+console.log(await client.query('select now()'))
+client.release()
+await pool.end()
+```
+
+### a note on instances
+
+The pool should be a __long-lived object__ in your application.  Generally you'll want to instantiate one pool when your app starts up and use the same instance of the pool throughout the lifetime of your application.  If you are frequently creating a new pool within your code you likely don't have your pool initialization code in the correct place.  Example:
+
+```js
+// assume this is a file in your program at ./your-app/lib/db.js
+
+// correct usage: create the pool and let it live
+// 'globally' here, controlling access to it through exported methods
+const pool = new pg.Pool()
+
+// this is the right way to export the query method
+module.exports.query = (text, values) => {
+  console.log('query:', text, values)
+  return pool.query(text, values)
+}
+
+// this would be the WRONG way to export the connect method
+module.exports.connect = () => {
+  // notice how we would be creating a pool instance here
+  // every time we called 'connect' to get a new client?
+  // that's a bad thing & results in creating an unbounded
+  // number of pools & therefore connections
+  const aPool = new pg.Pool()
+  return aPool.connect()
+}
+```
+
+### events
+
+Every instance of a `Pool` is an event emitter.  These instances emit the following events:
+
+#### error
+
+Emitted whenever an idle client in the pool encounters an error.  This is common when your PostgreSQL server shuts down, reboots, or a network partition otherwise causes it to become unavailable while your pool has connected clients.
+
+Example:
+
+```js
+const Pool = require('pg-pool')
+const pool = new Pool()
+
+// attach an error handler to the pool for when a connected, idle client
+// receives an error by being disconnected, etc
+pool.on('error', function(error, client) {
+  // handle this in the same way you would treat process.on('uncaughtException')
+  // it is supplied the error as well as the idle client which received the error
+})
+```
+
+#### connect
+
+Fired whenever the pool creates a __new__ `pg.Client` instance and successfully connects it to the backend.
+
+Example:
+
+```js
+const Pool = require('pg-pool')
+const pool = new Pool()
+
+const count = 0
+
+pool.on('connect', client => {
+  client.count = count++
+})
+
+pool
+  .connect()
+  .then(client => {
+    return client
+      .query('SELECT $1::int AS "clientCount"', [client.count])
+      .then(res => console.log(res.rows[0].clientCount)) // outputs 0
+      .then(() => client)
+  })
+  .then(client => client.release())
+
+```
+
+#### acquire
+
+Fired whenever a client is acquired from the pool
+
+Example:
+
+This allows you to count the number of clients which have ever been acquired from the pool.
+
+```js
+const Pool = require('pg-pool')
+const pool = new Pool()
+
+const acquireCount = 0
+pool.on('acquire', function (client) {
+  acquireCount++
+})
+
+const connectCount = 0
+pool.on('connect', function () {
+  connectCount++
+})
+
+for (let i = 0; i < 200; i++) {
+  pool.query('SELECT NOW()')
+}
+
+setTimeout(function () {
+  console.log('connect count:', connectCount) // output: connect count: 10
+  console.log('acquire count:', acquireCount) // output: acquire count: 200
+}, 100)
+
+```
+
+### environment variables
+
+pg-pool & node-postgres support some of the same environment variables as `psql` supports.  The most common are:
+
+```
+PGDATABASE=my_db
+PGUSER=username
+PGPASSWORD="my awesome password"
+PGPORT=5432
+PGSSLMODE=require
+```
+
+Usually I will export these into my local environment via a `.env` file with environment settings or export them in `~/.bash_profile` or something similar.  This way I get configurability which works with both the postgres suite of tools (`psql`, `pg_dump`, `pg_restore`) and node, I can vary the environment variables locally and in production, and it supports the concept of a [12-factor app](http://12factor.net/) out of the box.
+
+## bring your own promise
+
+In versions of node `<=0.12.x` there is no native promise implementation available globally.  You can polyfill the promise globally like this:
+
+```js
+// first run `npm install promise-polyfill --save
+if (typeof Promise == 'undefined') {
+  global.Promise = require('promise-polyfill')
+}
+```
+
+You can use any other promise implementation you'd like.  The pool also allows you to configure the promise implementation on a per-pool level:
+
+```js
+const bluebirdPool = new Pool({
+  Promise: require('bluebird')
+})
+```
+
+__please note:__ in node `<=0.12.x` the pool will throw if you do not provide a promise constructor in one of the two ways mentioned above.  In node `>=4.0.0` the pool will use the native promise implementation by default; however, the two methods above still allow you to "bring your own."
+
+## maxUses and read-replica autoscaling (e.g. AWS Aurora)
+
+The maxUses config option can help an application instance rebalance load against a replica set that has been auto-scaled after the connection pool is already full of healthy connections.
+
+The mechanism here is that a connection is considered "expended" after it has been acquired and released `maxUses` number of times.  Depending on the load on your system, this means there will be an approximate time in which any given connection will live, thus creating a window for rebalancing.
+
+Imagine a scenario where you have 10 app instances providing an API running against a replica cluster of 3 that are accessed via a round-robin DNS entry.  Each instance runs a connection pool size of 20.  With an ambient load of 50 requests per second, the connection pool will likely fill up in a few minutes with healthy connections.
+
+If you have weekly bursts of traffic which peak at 1,000 requests per second, you might want to grow your replicas to 10 during this period.  Without setting `maxUses`, the new replicas will not be adopted by the app servers without an intervention -- namely, restarting each in turn in order to build up new connection pools that are balanced against all the replicas.  Adding additional app server instances will help to some extent because they will adopt all the replicas in an even way, but the initial app servers will continue to focus additional load on the original replicas.
+
+This is where the `maxUses` configuration option comes into play.  Setting `maxUses` to 7500 will ensure that over a period of 30 minutes or so the new replicas will be adopted as the pre-existing connections are closed and replaced with new ones, thus creating a window for eventual balance.
+
+You'll want to test based on your own scenarios, but one way to make a first guess at `maxUses` is to identify an acceptable window for rebalancing and then solve for the value:
+
+```
+maxUses = rebalanceWindowSeconds * totalRequestsPerSecond / numAppInstances / poolSize
+```
+
+In the example above, assuming we acquire and release 1 connection per request and we are aiming for a 30 minute rebalancing window:
+
+```
+maxUses = rebalanceWindowSeconds * totalRequestsPerSecond / numAppInstances / poolSize
+   7200 =        1800            *          1000          /        10       /    25
+```
+
+## tests
+
+To run tests clone the repo, `npm i` in the working dir, and then run `npm test`
+
+## contributions
+
+I love contributions.  Please make sure they have tests, and submit a PR.  If you're not sure if the issue is worth it or will be accepted it never hurts to open an issue to begin the conversation.  If you're interested in keeping up with node-postgres releated stuff, you can follow me on twitter at [@briancarlson](https://twitter.com/briancarlson) - I generally announce any noteworthy updates there.
+
+## license
+
+The MIT License (MIT)
+Copyright (c) 2016 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-pool/esm/index.mjs
===================================================================
--- TruckSimulator-main/node_modules/pg-pool/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-pool/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,5 @@
+// ESM wrapper for pg-pool
+import Pool from '../index.js'
+
+// Export as default only to match CJS module
+export default Pool
Index: TruckSimulator-main/node_modules/pg-pool/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-pool/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-pool/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,479 @@
+'use strict'
+const EventEmitter = require('events').EventEmitter
+
+const NOOP = function () {}
+
+const removeWhere = (list, predicate) => {
+  const i = list.findIndex(predicate)
+
+  return i === -1 ? undefined : list.splice(i, 1)[0]
+}
+
+class IdleItem {
+  constructor(client, idleListener, timeoutId) {
+    this.client = client
+    this.idleListener = idleListener
+    this.timeoutId = timeoutId
+  }
+}
+
+class PendingItem {
+  constructor(callback) {
+    this.callback = callback
+  }
+}
+
+function throwOnDoubleRelease() {
+  throw new Error('Release called on client which has already been released to the pool.')
+}
+
+function promisify(Promise, callback) {
+  if (callback) {
+    return { callback: callback, result: undefined }
+  }
+  let rej
+  let res
+  const cb = function (err, client) {
+    err ? rej(err) : res(client)
+  }
+  const result = new Promise(function (resolve, reject) {
+    res = resolve
+    rej = reject
+  }).catch((err) => {
+    // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the
+    // application that created the query
+    Error.captureStackTrace(err)
+    throw err
+  })
+  return { callback: cb, result: result }
+}
+
+function makeIdleListener(pool, client) {
+  return function idleListener(err) {
+    err.client = client
+
+    client.removeListener('error', idleListener)
+    client.on('error', () => {
+      pool.log('additional client error after disconnection due to error', err)
+    })
+    pool._remove(client)
+    // TODO - document that once the pool emits an error
+    // the client has already been closed & purged and is unusable
+    pool.emit('error', err, client)
+  }
+}
+
+class Pool extends EventEmitter {
+  constructor(options, Client) {
+    super()
+    this.options = Object.assign({}, options)
+
+    if (options != null && 'password' in options) {
+      // "hiding" the password so it doesn't show up in stack traces
+      // or if the client is console.logged
+      Object.defineProperty(this.options, 'password', {
+        configurable: true,
+        enumerable: false,
+        writable: true,
+        value: options.password,
+      })
+    }
+    if (options != null && options.ssl && options.ssl.key) {
+      // "hiding" the ssl->key so it doesn't show up in stack traces
+      // or if the client is console.logged
+      Object.defineProperty(this.options.ssl, 'key', {
+        enumerable: false,
+      })
+    }
+
+    this.options.max = this.options.max || this.options.poolSize || 10
+    this.options.min = this.options.min || 0
+    this.options.maxUses = this.options.maxUses || Infinity
+    this.options.allowExitOnIdle = this.options.allowExitOnIdle || false
+    this.options.maxLifetimeSeconds = this.options.maxLifetimeSeconds || 0
+    this.log = this.options.log || function () {}
+    this.Client = this.options.Client || Client || require('pg').Client
+    this.Promise = this.options.Promise || global.Promise
+
+    if (typeof this.options.idleTimeoutMillis === 'undefined') {
+      this.options.idleTimeoutMillis = 10000
+    }
+
+    this._clients = []
+    this._idle = []
+    this._expired = new WeakSet()
+    this._pendingQueue = []
+    this._endCallback = undefined
+    this.ending = false
+    this.ended = false
+  }
+
+  _isFull() {
+    return this._clients.length >= this.options.max
+  }
+
+  _isAboveMin() {
+    return this._clients.length > this.options.min
+  }
+
+  _pulseQueue() {
+    this.log('pulse queue')
+    if (this.ended) {
+      this.log('pulse queue ended')
+      return
+    }
+    if (this.ending) {
+      this.log('pulse queue on ending')
+      if (this._idle.length) {
+        this._idle.slice().map((item) => {
+          this._remove(item.client)
+        })
+      }
+      if (!this._clients.length) {
+        this.ended = true
+        this._endCallback()
+      }
+      return
+    }
+
+    // if we don't have any waiting, do nothing
+    if (!this._pendingQueue.length) {
+      this.log('no queued requests')
+      return
+    }
+    // if we don't have any idle clients and we have no more room do nothing
+    if (!this._idle.length && this._isFull()) {
+      return
+    }
+    const pendingItem = this._pendingQueue.shift()
+    if (this._idle.length) {
+      const idleItem = this._idle.pop()
+      clearTimeout(idleItem.timeoutId)
+      const client = idleItem.client
+      client.ref && client.ref()
+      const idleListener = idleItem.idleListener
+
+      return this._acquireClient(client, pendingItem, idleListener, false)
+    }
+    if (!this._isFull()) {
+      return this.newClient(pendingItem)
+    }
+    throw new Error('unexpected condition')
+  }
+
+  _remove(client, callback) {
+    const removed = removeWhere(this._idle, (item) => item.client === client)
+
+    if (removed !== undefined) {
+      clearTimeout(removed.timeoutId)
+    }
+
+    this._clients = this._clients.filter((c) => c !== client)
+    const context = this
+    client.end(() => {
+      context.emit('remove', client)
+
+      if (typeof callback === 'function') {
+        callback()
+      }
+    })
+  }
+
+  connect(cb) {
+    if (this.ending) {
+      const err = new Error('Cannot use a pool after calling end on the pool')
+      return cb ? cb(err) : this.Promise.reject(err)
+    }
+
+    const response = promisify(this.Promise, cb)
+    const result = response.result
+
+    // if we don't have to connect a new client, don't do so
+    if (this._isFull() || this._idle.length) {
+      // if we have idle clients schedule a pulse immediately
+      if (this._idle.length) {
+        process.nextTick(() => this._pulseQueue())
+      }
+
+      if (!this.options.connectionTimeoutMillis) {
+        this._pendingQueue.push(new PendingItem(response.callback))
+        return result
+      }
+
+      const queueCallback = (err, res, done) => {
+        clearTimeout(tid)
+        response.callback(err, res, done)
+      }
+
+      const pendingItem = new PendingItem(queueCallback)
+
+      // set connection timeout on checking out an existing client
+      const tid = setTimeout(() => {
+        // remove the callback from pending waiters because
+        // we're going to call it with a timeout error
+        removeWhere(this._pendingQueue, (i) => i.callback === queueCallback)
+        pendingItem.timedOut = true
+        response.callback(new Error('timeout exceeded when trying to connect'))
+      }, this.options.connectionTimeoutMillis)
+
+      if (tid.unref) {
+        tid.unref()
+      }
+
+      this._pendingQueue.push(pendingItem)
+      return result
+    }
+
+    this.newClient(new PendingItem(response.callback))
+
+    return result
+  }
+
+  newClient(pendingItem) {
+    const client = new this.Client(this.options)
+    this._clients.push(client)
+    const idleListener = makeIdleListener(this, client)
+
+    this.log('checking client timeout')
+
+    // connection timeout logic
+    let tid
+    let timeoutHit = false
+    if (this.options.connectionTimeoutMillis) {
+      tid = setTimeout(() => {
+        this.log('ending client due to timeout')
+        timeoutHit = true
+        // force kill the node driver, and let libpq do its teardown
+        client.connection ? client.connection.stream.destroy() : client.end()
+      }, this.options.connectionTimeoutMillis)
+    }
+
+    this.log('connecting new client')
+    client.connect((err) => {
+      if (tid) {
+        clearTimeout(tid)
+      }
+      client.on('error', idleListener)
+      if (err) {
+        this.log('client failed to connect', err)
+        // remove the dead client from our list of clients
+        this._clients = this._clients.filter((c) => c !== client)
+        if (timeoutHit) {
+          err = new Error('Connection terminated due to connection timeout', { cause: err })
+        }
+
+        // this client won’t be released, so move on immediately
+        this._pulseQueue()
+
+        if (!pendingItem.timedOut) {
+          pendingItem.callback(err, undefined, NOOP)
+        }
+      } else {
+        this.log('new client connected')
+
+        if (this.options.maxLifetimeSeconds !== 0) {
+          const maxLifetimeTimeout = setTimeout(() => {
+            this.log('ending client due to expired lifetime')
+            this._expired.add(client)
+            const idleIndex = this._idle.findIndex((idleItem) => idleItem.client === client)
+            if (idleIndex !== -1) {
+              this._acquireClient(
+                client,
+                new PendingItem((err, client, clientRelease) => clientRelease()),
+                idleListener,
+                false
+              )
+            }
+          }, this.options.maxLifetimeSeconds * 1000)
+
+          maxLifetimeTimeout.unref()
+          client.once('end', () => clearTimeout(maxLifetimeTimeout))
+        }
+
+        return this._acquireClient(client, pendingItem, idleListener, true)
+      }
+    })
+  }
+
+  // acquire a client for a pending work item
+  _acquireClient(client, pendingItem, idleListener, isNew) {
+    if (isNew) {
+      this.emit('connect', client)
+    }
+
+    this.emit('acquire', client)
+
+    client.release = this._releaseOnce(client, idleListener)
+
+    client.removeListener('error', idleListener)
+
+    if (!pendingItem.timedOut) {
+      if (isNew && this.options.verify) {
+        this.options.verify(client, (err) => {
+          if (err) {
+            client.release(err)
+            return pendingItem.callback(err, undefined, NOOP)
+          }
+
+          pendingItem.callback(undefined, client, client.release)
+        })
+      } else {
+        pendingItem.callback(undefined, client, client.release)
+      }
+    } else {
+      if (isNew && this.options.verify) {
+        this.options.verify(client, client.release)
+      } else {
+        client.release()
+      }
+    }
+  }
+
+  // returns a function that wraps _release and throws if called more than once
+  _releaseOnce(client, idleListener) {
+    let released = false
+
+    return (err) => {
+      if (released) {
+        throwOnDoubleRelease()
+      }
+
+      released = true
+      this._release(client, idleListener, err)
+    }
+  }
+
+  // release a client back to the poll, include an error
+  // to remove it from the pool
+  _release(client, idleListener, err) {
+    client.on('error', idleListener)
+
+    client._poolUseCount = (client._poolUseCount || 0) + 1
+
+    this.emit('release', err, client)
+
+    // TODO(bmc): expose a proper, public interface _queryable and _ending
+    if (err || this.ending || !client._queryable || client._ending || client._poolUseCount >= this.options.maxUses) {
+      if (client._poolUseCount >= this.options.maxUses) {
+        this.log('remove expended client')
+      }
+
+      return this._remove(client, this._pulseQueue.bind(this))
+    }
+
+    const isExpired = this._expired.has(client)
+    if (isExpired) {
+      this.log('remove expired client')
+      this._expired.delete(client)
+      return this._remove(client, this._pulseQueue.bind(this))
+    }
+
+    // idle timeout
+    let tid
+    if (this.options.idleTimeoutMillis && this._isAboveMin()) {
+      tid = setTimeout(() => {
+        this.log('remove idle client')
+        this._remove(client, this._pulseQueue.bind(this))
+      }, this.options.idleTimeoutMillis)
+
+      if (this.options.allowExitOnIdle) {
+        // allow Node to exit if this is all that's left
+        tid.unref()
+      }
+    }
+
+    if (this.options.allowExitOnIdle) {
+      client.unref()
+    }
+
+    this._idle.push(new IdleItem(client, idleListener, tid))
+    this._pulseQueue()
+  }
+
+  query(text, values, cb) {
+    // guard clause against passing a function as the first parameter
+    if (typeof text === 'function') {
+      const response = promisify(this.Promise, text)
+      setImmediate(function () {
+        return response.callback(new Error('Passing a function as the first parameter to pool.query is not supported'))
+      })
+      return response.result
+    }
+
+    // allow plain text query without values
+    if (typeof values === 'function') {
+      cb = values
+      values = undefined
+    }
+    const response = promisify(this.Promise, cb)
+    cb = response.callback
+
+    this.connect((err, client) => {
+      if (err) {
+        return cb(err)
+      }
+
+      let clientReleased = false
+      const onError = (err) => {
+        if (clientReleased) {
+          return
+        }
+        clientReleased = true
+        client.release(err)
+        cb(err)
+      }
+
+      client.once('error', onError)
+      this.log('dispatching query')
+      try {
+        client.query(text, values, (err, res) => {
+          this.log('query dispatched')
+          client.removeListener('error', onError)
+          if (clientReleased) {
+            return
+          }
+          clientReleased = true
+          client.release(err)
+          if (err) {
+            return cb(err)
+          }
+          return cb(undefined, res)
+        })
+      } catch (err) {
+        client.release(err)
+        return cb(err)
+      }
+    })
+    return response.result
+  }
+
+  end(cb) {
+    this.log('ending')
+    if (this.ending) {
+      const err = new Error('Called end on pool more than once')
+      return cb ? cb(err) : this.Promise.reject(err)
+    }
+    this.ending = true
+    const promised = promisify(this.Promise, cb)
+    this._endCallback = promised.callback
+    this._pulseQueue()
+    return promised.result
+  }
+
+  get waitingCount() {
+    return this._pendingQueue.length
+  }
+
+  get idleCount() {
+    return this._idle.length
+  }
+
+  get expiredCount() {
+    return this._clients.reduce((acc, client) => acc + (this._expired.has(client) ? 1 : 0), 0)
+  }
+
+  get totalCount() {
+    return this._clients.length
+  }
+}
+module.exports = Pool
Index: TruckSimulator-main/node_modules/pg-pool/package.json
===================================================================
--- TruckSimulator-main/node_modules/pg-pool/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-pool/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,51 @@
+{
+  "name": "pg-pool",
+  "version": "3.10.1",
+  "description": "Connection pool for node-postgres",
+  "main": "index.js",
+  "exports": {
+    ".": {
+      "import": "./esm/index.mjs",
+      "require": "./index.js",
+      "default": "./index.js"
+    }
+  },
+  "directories": {
+    "test": "test"
+  },
+  "scripts": {
+    "test": " node_modules/.bin/mocha"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-pool"
+  },
+  "keywords": [
+    "pg",
+    "postgres",
+    "pool",
+    "database"
+  ],
+  "author": "Brian M. Carlson",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/brianc/node-pg-pool/issues"
+  },
+  "homepage": "https://github.com/brianc/node-pg-pool#readme",
+  "devDependencies": {
+    "bluebird": "3.7.2",
+    "co": "4.6.0",
+    "expect.js": "0.3.1",
+    "lodash": "^4.17.11",
+    "mocha": "^10.5.2"
+  },
+  "peerDependencies": {
+    "pg": ">=8.0"
+  },
+  "files": [
+    "index.js",
+    "esm"
+  ],
+  "gitHead": "cd877a57612a39335a97b593111710d26126279d"
+}
Index: TruckSimulator-main/node_modules/pg-protocol/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2010 - 2021 Brian Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-protocol/README.md
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,3 @@
+# pg-protocol
+
+Low level postgres wire protocol parser and serializer written in Typescript. Used by node-postgres. Needs more documentation. :smile:
Index: TruckSimulator-main/node_modules/pg-protocol/dist/b.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/b.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/b.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+export {};
Index: TruckSimulator-main/node_modules/pg-protocol/dist/b.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/b.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/b.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,23 @@
+"use strict";
+// file for microbenchmarking
+Object.defineProperty(exports, "__esModule", { value: true });
+const buffer_reader_1 = require("./buffer-reader");
+const LOOPS = 1000;
+let count = 0;
+const start = performance.now();
+const reader = new buffer_reader_1.BufferReader();
+const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0]);
+const run = () => {
+    if (count > LOOPS) {
+        console.log(performance.now() - start);
+        return;
+    }
+    count++;
+    for (let i = 0; i < LOOPS; i++) {
+        reader.setBuffer(0, buffer);
+        reader.cstring();
+    }
+    setImmediate(run);
+};
+run();
+//# sourceMappingURL=b.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/b.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/b.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/b.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"b.js","sourceRoot":"","sources":["../src/b.ts"],"names":[],"mappings":";AAAA,6BAA6B;;AAE7B,mDAA8C;AAE9C,MAAM,KAAK,GAAG,IAAI,CAAA;AAClB,IAAI,KAAK,GAAG,CAAC,CAAA;AACb,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;AAE/B,MAAM,MAAM,GAAG,IAAI,4BAAY,EAAE,CAAA;AACjC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;AAE3D,MAAM,GAAG,GAAG,GAAG,EAAE;IACf,IAAI,KAAK,GAAG,KAAK,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAA;QACtC,OAAM;KACP;IACD,KAAK,EAAE,CAAA;IACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAC3B,MAAM,CAAC,OAAO,EAAE,CAAA;KACjB;IACD,YAAY,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC,CAAA;AAED,GAAG,EAAE,CAAA"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,15 @@
+/// <reference types="node" />
+export declare class BufferReader {
+    private offset;
+    private buffer;
+    private encoding;
+    constructor(offset?: number);
+    setBuffer(offset: number, buffer: Buffer): void;
+    int16(): number;
+    byte(): number;
+    int32(): number;
+    uint32(): number;
+    string(length: number): string;
+    cstring(): string;
+    bytes(length: number): Buffer;
+}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,56 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.BufferReader = void 0;
+const emptyBuffer = Buffer.allocUnsafe(0);
+class BufferReader {
+    constructor(offset = 0) {
+        this.offset = offset;
+        this.buffer = emptyBuffer;
+        // TODO(bmc): support non-utf8 encoding?
+        this.encoding = 'utf-8';
+    }
+    setBuffer(offset, buffer) {
+        this.offset = offset;
+        this.buffer = buffer;
+    }
+    int16() {
+        const result = this.buffer.readInt16BE(this.offset);
+        this.offset += 2;
+        return result;
+    }
+    byte() {
+        const result = this.buffer[this.offset];
+        this.offset++;
+        return result;
+    }
+    int32() {
+        const result = this.buffer.readInt32BE(this.offset);
+        this.offset += 4;
+        return result;
+    }
+    uint32() {
+        const result = this.buffer.readUInt32BE(this.offset);
+        this.offset += 4;
+        return result;
+    }
+    string(length) {
+        const result = this.buffer.toString(this.encoding, this.offset, this.offset + length);
+        this.offset += length;
+        return result;
+    }
+    cstring() {
+        const start = this.offset;
+        let end = start;
+        // eslint-disable-next-line no-empty
+        while (this.buffer[end++] !== 0) { }
+        this.offset = end;
+        return this.buffer.toString(this.encoding, start, end - 1);
+    }
+    bytes(length) {
+        const result = this.buffer.slice(this.offset, this.offset + length);
+        this.offset += length;
+        return result;
+    }
+}
+exports.BufferReader = BufferReader;
+//# sourceMappingURL=buffer-reader.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/buffer-reader.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"buffer-reader.js","sourceRoot":"","sources":["../src/buffer-reader.ts"],"names":[],"mappings":";;;AAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAEzC,MAAa,YAAY;IAMvB,YAAoB,SAAiB,CAAC;QAAlB,WAAM,GAAN,MAAM,CAAY;QAL9B,WAAM,GAAW,WAAW,CAAA;QAEpC,wCAAwC;QAChC,aAAQ,GAAW,OAAO,CAAA;IAEO,CAAC;IAEnC,SAAS,CAAC,MAAc,EAAE,MAAc;QAC7C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEM,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,IAAI;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACvC,IAAI,CAAC,MAAM,EAAE,CAAA;QACb,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,KAAK;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,MAAM;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpD,IAAI,CAAC,MAAM,IAAI,CAAC,CAAA;QAChB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,MAAM,CAAC,MAAc;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QACrF,IAAI,CAAC,MAAM,IAAI,MAAM,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;IAEM,OAAO;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAA;QACzB,IAAI,GAAG,GAAG,KAAK,CAAA;QACf,oCAAoC;QACpC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,EAAE,GAAE;QACnC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAA;QACjB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAA;IAC5D,CAAC;IAEM,KAAK,CAAC,MAAc;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAA;QACnE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAA;QACrB,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AAzDD,oCAyDC"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,16 @@
+/// <reference types="node" />
+export declare class Writer {
+    private size;
+    private buffer;
+    private offset;
+    private headerPosition;
+    constructor(size?: number);
+    private ensure;
+    addInt32(num: number): Writer;
+    addInt16(num: number): Writer;
+    addCString(string: string): Writer;
+    addString(string?: string): Writer;
+    add(otherBuffer: Buffer): Writer;
+    private join;
+    flush(code?: number): Buffer;
+}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,81 @@
+"use strict";
+//binary data writer tuned for encoding binary specific to the postgres binary protocol
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Writer = void 0;
+class Writer {
+    constructor(size = 256) {
+        this.size = size;
+        this.offset = 5;
+        this.headerPosition = 0;
+        this.buffer = Buffer.allocUnsafe(size);
+    }
+    ensure(size) {
+        const remaining = this.buffer.length - this.offset;
+        if (remaining < size) {
+            const oldBuffer = this.buffer;
+            // exponential growth factor of around ~ 1.5
+            // https://stackoverflow.com/questions/2269063/buffer-growth-strategy
+            const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size;
+            this.buffer = Buffer.allocUnsafe(newSize);
+            oldBuffer.copy(this.buffer);
+        }
+    }
+    addInt32(num) {
+        this.ensure(4);
+        this.buffer[this.offset++] = (num >>> 24) & 0xff;
+        this.buffer[this.offset++] = (num >>> 16) & 0xff;
+        this.buffer[this.offset++] = (num >>> 8) & 0xff;
+        this.buffer[this.offset++] = (num >>> 0) & 0xff;
+        return this;
+    }
+    addInt16(num) {
+        this.ensure(2);
+        this.buffer[this.offset++] = (num >>> 8) & 0xff;
+        this.buffer[this.offset++] = (num >>> 0) & 0xff;
+        return this;
+    }
+    addCString(string) {
+        if (!string) {
+            this.ensure(1);
+        }
+        else {
+            const len = Buffer.byteLength(string);
+            this.ensure(len + 1); // +1 for null terminator
+            this.buffer.write(string, this.offset, 'utf-8');
+            this.offset += len;
+        }
+        this.buffer[this.offset++] = 0; // null terminator
+        return this;
+    }
+    addString(string = '') {
+        const len = Buffer.byteLength(string);
+        this.ensure(len);
+        this.buffer.write(string, this.offset);
+        this.offset += len;
+        return this;
+    }
+    add(otherBuffer) {
+        this.ensure(otherBuffer.length);
+        otherBuffer.copy(this.buffer, this.offset);
+        this.offset += otherBuffer.length;
+        return this;
+    }
+    join(code) {
+        if (code) {
+            this.buffer[this.headerPosition] = code;
+            //length is everything in this packet minus the code
+            const length = this.offset - (this.headerPosition + 1);
+            this.buffer.writeInt32BE(length, this.headerPosition + 1);
+        }
+        return this.buffer.slice(code ? 0 : 5, this.offset);
+    }
+    flush(code) {
+        const result = this.join(code);
+        this.offset = 5;
+        this.headerPosition = 0;
+        this.buffer = Buffer.allocUnsafe(this.size);
+        return result;
+    }
+}
+exports.Writer = Writer;
+//# sourceMappingURL=buffer-writer.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/buffer-writer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"buffer-writer.js","sourceRoot":"","sources":["../src/buffer-writer.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+export {};
Index: TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,524 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const test_buffers_1 = __importDefault(require("./testing/test-buffers"));
+const buffer_list_1 = __importDefault(require("./testing/buffer-list"));
+const _1 = require(".");
+const assert_1 = __importDefault(require("assert"));
+const stream_1 = require("stream");
+const authOkBuffer = test_buffers_1.default.authenticationOk();
+const paramStatusBuffer = test_buffers_1.default.parameterStatus('client_encoding', 'UTF8');
+const readyForQueryBuffer = test_buffers_1.default.readyForQuery();
+const backendKeyDataBuffer = test_buffers_1.default.backendKeyData(1, 2);
+const commandCompleteBuffer = test_buffers_1.default.commandComplete('SELECT 3');
+const parseCompleteBuffer = test_buffers_1.default.parseComplete();
+const bindCompleteBuffer = test_buffers_1.default.bindComplete();
+const portalSuspendedBuffer = test_buffers_1.default.portalSuspended();
+const row1 = {
+    name: 'id',
+    tableID: 1,
+    attributeNumber: 2,
+    dataTypeID: 3,
+    dataTypeSize: 4,
+    typeModifier: 5,
+    formatCode: 0,
+};
+const oneRowDescBuff = test_buffers_1.default.rowDescription([row1]);
+row1.name = 'bang';
+const twoRowBuf = test_buffers_1.default.rowDescription([
+    row1,
+    {
+        name: 'whoah',
+        tableID: 10,
+        attributeNumber: 11,
+        dataTypeID: 12,
+        dataTypeSize: 13,
+        typeModifier: 14,
+        formatCode: 0,
+    },
+]);
+const rowWithBigOids = {
+    name: 'bigoid',
+    tableID: 3000000001,
+    attributeNumber: 2,
+    dataTypeID: 3000000003,
+    dataTypeSize: 4,
+    typeModifier: 5,
+    formatCode: 0,
+};
+const bigOidDescBuff = test_buffers_1.default.rowDescription([rowWithBigOids]);
+const emptyRowFieldBuf = test_buffers_1.default.dataRow([]);
+const oneFieldBuf = test_buffers_1.default.dataRow(['test']);
+const expectedAuthenticationOkayMessage = {
+    name: 'authenticationOk',
+    length: 8,
+};
+const expectedParameterStatusMessage = {
+    name: 'parameterStatus',
+    parameterName: 'client_encoding',
+    parameterValue: 'UTF8',
+    length: 25,
+};
+const expectedBackendKeyDataMessage = {
+    name: 'backendKeyData',
+    processID: 1,
+    secretKey: 2,
+};
+const expectedReadyForQueryMessage = {
+    name: 'readyForQuery',
+    length: 5,
+    status: 'I',
+};
+const expectedCommandCompleteMessage = {
+    name: 'commandComplete',
+    length: 13,
+    text: 'SELECT 3',
+};
+const emptyRowDescriptionBuffer = new buffer_list_1.default()
+    .addInt16(0) // number of fields
+    .join(true, 'T');
+const expectedEmptyRowDescriptionMessage = {
+    name: 'rowDescription',
+    length: 6,
+    fieldCount: 0,
+    fields: [],
+};
+const expectedOneRowMessage = {
+    name: 'rowDescription',
+    length: 27,
+    fieldCount: 1,
+    fields: [
+        {
+            name: 'id',
+            tableID: 1,
+            columnID: 2,
+            dataTypeID: 3,
+            dataTypeSize: 4,
+            dataTypeModifier: 5,
+            format: 'text',
+        },
+    ],
+};
+const expectedTwoRowMessage = {
+    name: 'rowDescription',
+    length: 53,
+    fieldCount: 2,
+    fields: [
+        {
+            name: 'bang',
+            tableID: 1,
+            columnID: 2,
+            dataTypeID: 3,
+            dataTypeSize: 4,
+            dataTypeModifier: 5,
+            format: 'text',
+        },
+        {
+            name: 'whoah',
+            tableID: 10,
+            columnID: 11,
+            dataTypeID: 12,
+            dataTypeSize: 13,
+            dataTypeModifier: 14,
+            format: 'text',
+        },
+    ],
+};
+const expectedBigOidMessage = {
+    name: 'rowDescription',
+    length: 31,
+    fieldCount: 1,
+    fields: [
+        {
+            name: 'bigoid',
+            tableID: 3000000001,
+            columnID: 2,
+            dataTypeID: 3000000003,
+            dataTypeSize: 4,
+            dataTypeModifier: 5,
+            format: 'text',
+        },
+    ],
+};
+const emptyParameterDescriptionBuffer = new buffer_list_1.default()
+    .addInt16(0) // number of parameters
+    .join(true, 't');
+const oneParameterDescBuf = test_buffers_1.default.parameterDescription([1111]);
+const twoParameterDescBuf = test_buffers_1.default.parameterDescription([2222, 3333]);
+const expectedEmptyParameterDescriptionMessage = {
+    name: 'parameterDescription',
+    length: 6,
+    parameterCount: 0,
+    dataTypeIDs: [],
+};
+const expectedOneParameterMessage = {
+    name: 'parameterDescription',
+    length: 10,
+    parameterCount: 1,
+    dataTypeIDs: [1111],
+};
+const expectedTwoParameterMessage = {
+    name: 'parameterDescription',
+    length: 14,
+    parameterCount: 2,
+    dataTypeIDs: [2222, 3333],
+};
+const testForMessage = function (buffer, expectedMessage) {
+    it('receives and parses ' + expectedMessage.name, () => __awaiter(this, void 0, void 0, function* () {
+        const messages = yield parseBuffers([buffer]);
+        const [lastMessage] = messages;
+        for (const key in expectedMessage) {
+            assert_1.default.deepEqual(lastMessage[key], expectedMessage[key]);
+        }
+    }));
+};
+const plainPasswordBuffer = test_buffers_1.default.authenticationCleartextPassword();
+const md5PasswordBuffer = test_buffers_1.default.authenticationMD5Password();
+const SASLBuffer = test_buffers_1.default.authenticationSASL();
+const SASLContinueBuffer = test_buffers_1.default.authenticationSASLContinue();
+const SASLFinalBuffer = test_buffers_1.default.authenticationSASLFinal();
+const expectedPlainPasswordMessage = {
+    name: 'authenticationCleartextPassword',
+};
+const expectedMD5PasswordMessage = {
+    name: 'authenticationMD5Password',
+    salt: Buffer.from([1, 2, 3, 4]),
+};
+const expectedSASLMessage = {
+    name: 'authenticationSASL',
+    mechanisms: ['SCRAM-SHA-256'],
+};
+const expectedSASLContinueMessage = {
+    name: 'authenticationSASLContinue',
+    data: 'data',
+};
+const expectedSASLFinalMessage = {
+    name: 'authenticationSASLFinal',
+    data: 'data',
+};
+const notificationResponseBuffer = test_buffers_1.default.notification(4, 'hi', 'boom');
+const expectedNotificationResponseMessage = {
+    name: 'notification',
+    processId: 4,
+    channel: 'hi',
+    payload: 'boom',
+};
+const parseBuffers = (buffers) => __awaiter(void 0, void 0, void 0, function* () {
+    const stream = new stream_1.PassThrough();
+    for (const buffer of buffers) {
+        stream.write(buffer);
+    }
+    stream.end();
+    const msgs = [];
+    yield (0, _1.parse)(stream, (msg) => msgs.push(msg));
+    return msgs;
+});
+describe('PgPacketStream', function () {
+    testForMessage(authOkBuffer, expectedAuthenticationOkayMessage);
+    testForMessage(plainPasswordBuffer, expectedPlainPasswordMessage);
+    testForMessage(md5PasswordBuffer, expectedMD5PasswordMessage);
+    testForMessage(SASLBuffer, expectedSASLMessage);
+    testForMessage(SASLContinueBuffer, expectedSASLContinueMessage);
+    // this exercises a found bug in the parser:
+    // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+    // and adds a test which is deterministic, rather than relying on network packet chunking
+    const extendedSASLContinueBuffer = Buffer.concat([SASLContinueBuffer, Buffer.from([1, 2, 3, 4])]);
+    testForMessage(extendedSASLContinueBuffer, expectedSASLContinueMessage);
+    testForMessage(SASLFinalBuffer, expectedSASLFinalMessage);
+    // this exercises a found bug in the parser:
+    // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+    // and adds a test which is deterministic, rather than relying on network packet chunking
+    const extendedSASLFinalBuffer = Buffer.concat([SASLFinalBuffer, Buffer.from([1, 2, 4, 5])]);
+    testForMessage(extendedSASLFinalBuffer, expectedSASLFinalMessage);
+    testForMessage(paramStatusBuffer, expectedParameterStatusMessage);
+    testForMessage(backendKeyDataBuffer, expectedBackendKeyDataMessage);
+    testForMessage(readyForQueryBuffer, expectedReadyForQueryMessage);
+    testForMessage(commandCompleteBuffer, expectedCommandCompleteMessage);
+    testForMessage(notificationResponseBuffer, expectedNotificationResponseMessage);
+    testForMessage(test_buffers_1.default.emptyQuery(), {
+        name: 'emptyQuery',
+        length: 4,
+    });
+    testForMessage(Buffer.from([0x6e, 0, 0, 0, 4]), {
+        name: 'noData',
+    });
+    describe('rowDescription messages', function () {
+        testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage);
+        testForMessage(oneRowDescBuff, expectedOneRowMessage);
+        testForMessage(twoRowBuf, expectedTwoRowMessage);
+        testForMessage(bigOidDescBuff, expectedBigOidMessage);
+    });
+    describe('parameterDescription messages', function () {
+        testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage);
+        testForMessage(oneParameterDescBuf, expectedOneParameterMessage);
+        testForMessage(twoParameterDescBuf, expectedTwoParameterMessage);
+    });
+    describe('parsing rows', function () {
+        describe('parsing empty row', function () {
+            testForMessage(emptyRowFieldBuf, {
+                name: 'dataRow',
+                fieldCount: 0,
+            });
+        });
+        describe('parsing data row with fields', function () {
+            testForMessage(oneFieldBuf, {
+                name: 'dataRow',
+                fieldCount: 1,
+                fields: ['test'],
+            });
+        });
+    });
+    describe('notice message', function () {
+        // this uses the same logic as error message
+        const buff = test_buffers_1.default.notice([{ type: 'C', value: 'code' }]);
+        testForMessage(buff, {
+            name: 'notice',
+            code: 'code',
+        });
+    });
+    testForMessage(test_buffers_1.default.error([]), {
+        name: 'error',
+    });
+    describe('with all the fields', function () {
+        const buffer = test_buffers_1.default.error([
+            {
+                type: 'S',
+                value: 'ERROR',
+            },
+            {
+                type: 'C',
+                value: 'code',
+            },
+            {
+                type: 'M',
+                value: 'message',
+            },
+            {
+                type: 'D',
+                value: 'details',
+            },
+            {
+                type: 'H',
+                value: 'hint',
+            },
+            {
+                type: 'P',
+                value: '100',
+            },
+            {
+                type: 'p',
+                value: '101',
+            },
+            {
+                type: 'q',
+                value: 'query',
+            },
+            {
+                type: 'W',
+                value: 'where',
+            },
+            {
+                type: 'F',
+                value: 'file',
+            },
+            {
+                type: 'L',
+                value: 'line',
+            },
+            {
+                type: 'R',
+                value: 'routine',
+            },
+            {
+                type: 'Z',
+                value: 'alsdkf',
+            },
+        ]);
+        testForMessage(buffer, {
+            name: 'error',
+            severity: 'ERROR',
+            code: 'code',
+            message: 'message',
+            detail: 'details',
+            hint: 'hint',
+            position: '100',
+            internalPosition: '101',
+            internalQuery: 'query',
+            where: 'where',
+            file: 'file',
+            line: 'line',
+            routine: 'routine',
+        });
+    });
+    testForMessage(parseCompleteBuffer, {
+        name: 'parseComplete',
+    });
+    testForMessage(bindCompleteBuffer, {
+        name: 'bindComplete',
+    });
+    testForMessage(bindCompleteBuffer, {
+        name: 'bindComplete',
+    });
+    testForMessage(test_buffers_1.default.closeComplete(), {
+        name: 'closeComplete',
+    });
+    describe('parses portal suspended message', function () {
+        testForMessage(portalSuspendedBuffer, {
+            name: 'portalSuspended',
+        });
+    });
+    describe('parses replication start message', function () {
+        testForMessage(Buffer.from([0x57, 0x00, 0x00, 0x00, 0x04]), {
+            name: 'replicationStart',
+            length: 4,
+        });
+    });
+    describe('copy', () => {
+        testForMessage(test_buffers_1.default.copyIn(0), {
+            name: 'copyInResponse',
+            length: 7,
+            binary: false,
+            columnTypes: [],
+        });
+        testForMessage(test_buffers_1.default.copyIn(2), {
+            name: 'copyInResponse',
+            length: 11,
+            binary: false,
+            columnTypes: [0, 1],
+        });
+        testForMessage(test_buffers_1.default.copyOut(0), {
+            name: 'copyOutResponse',
+            length: 7,
+            binary: false,
+            columnTypes: [],
+        });
+        testForMessage(test_buffers_1.default.copyOut(3), {
+            name: 'copyOutResponse',
+            length: 13,
+            binary: false,
+            columnTypes: [0, 1, 2],
+        });
+        testForMessage(test_buffers_1.default.copyDone(), {
+            name: 'copyDone',
+            length: 4,
+        });
+        testForMessage(test_buffers_1.default.copyData(Buffer.from([5, 6, 7])), {
+            name: 'copyData',
+            length: 7,
+            chunk: Buffer.from([5, 6, 7]),
+        });
+    });
+    // since the data message on a stream can randomly divide the incomming
+    // tcp packets anywhere, we need to make sure we can parse every single
+    // split on a tcp message
+    describe('split buffer, single message parsing', function () {
+        const fullBuffer = test_buffers_1.default.dataRow([null, 'bang', 'zug zug', null, '!']);
+        it('parses when full buffer comes in', function () {
+            return __awaiter(this, void 0, void 0, function* () {
+                const messages = yield parseBuffers([fullBuffer]);
+                const message = messages[0];
+                assert_1.default.equal(message.fields.length, 5);
+                assert_1.default.equal(message.fields[0], null);
+                assert_1.default.equal(message.fields[1], 'bang');
+                assert_1.default.equal(message.fields[2], 'zug zug');
+                assert_1.default.equal(message.fields[3], null);
+                assert_1.default.equal(message.fields[4], '!');
+            });
+        });
+        const testMessageReceivedAfterSplitAt = function (split) {
+            return __awaiter(this, void 0, void 0, function* () {
+                const firstBuffer = Buffer.alloc(fullBuffer.length - split);
+                const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length);
+                fullBuffer.copy(firstBuffer, 0, 0);
+                fullBuffer.copy(secondBuffer, 0, firstBuffer.length);
+                const messages = yield parseBuffers([firstBuffer, secondBuffer]);
+                const message = messages[0];
+                assert_1.default.equal(message.fields.length, 5);
+                assert_1.default.equal(message.fields[0], null);
+                assert_1.default.equal(message.fields[1], 'bang');
+                assert_1.default.equal(message.fields[2], 'zug zug');
+                assert_1.default.equal(message.fields[3], null);
+                assert_1.default.equal(message.fields[4], '!');
+            });
+        };
+        it('parses when split in the middle', function () {
+            return testMessageReceivedAfterSplitAt(6);
+        });
+        it('parses when split at end', function () {
+            return testMessageReceivedAfterSplitAt(2);
+        });
+        it('parses when split at beginning', function () {
+            return Promise.all([
+                testMessageReceivedAfterSplitAt(fullBuffer.length - 2),
+                testMessageReceivedAfterSplitAt(fullBuffer.length - 1),
+                testMessageReceivedAfterSplitAt(fullBuffer.length - 5),
+            ]);
+        });
+    });
+    describe('split buffer, multiple message parsing', function () {
+        const dataRowBuffer = test_buffers_1.default.dataRow(['!']);
+        const readyForQueryBuffer = test_buffers_1.default.readyForQuery();
+        const fullBuffer = Buffer.alloc(dataRowBuffer.length + readyForQueryBuffer.length);
+        dataRowBuffer.copy(fullBuffer, 0, 0);
+        readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0);
+        const verifyMessages = function (messages) {
+            assert_1.default.strictEqual(messages.length, 2);
+            assert_1.default.deepEqual(messages[0], {
+                name: 'dataRow',
+                fieldCount: 1,
+                length: 11,
+                fields: ['!'],
+            });
+            assert_1.default.equal(messages[0].fields[0], '!');
+            assert_1.default.deepEqual(messages[1], {
+                name: 'readyForQuery',
+                length: 5,
+                status: 'I',
+            });
+        };
+        // sanity check
+        it('receives both messages when packet is not split', function () {
+            return __awaiter(this, void 0, void 0, function* () {
+                const messages = yield parseBuffers([fullBuffer]);
+                verifyMessages(messages);
+            });
+        });
+        const splitAndVerifyTwoMessages = function (split) {
+            return __awaiter(this, void 0, void 0, function* () {
+                const firstBuffer = Buffer.alloc(fullBuffer.length - split);
+                const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length);
+                fullBuffer.copy(firstBuffer, 0, 0);
+                fullBuffer.copy(secondBuffer, 0, firstBuffer.length);
+                const messages = yield parseBuffers([firstBuffer, secondBuffer]);
+                verifyMessages(messages);
+            });
+        };
+        describe('receives both messages when packet is split', function () {
+            it('in the middle', function () {
+                return splitAndVerifyTwoMessages(11);
+            });
+            it('at the front', function () {
+                return Promise.all([
+                    splitAndVerifyTwoMessages(fullBuffer.length - 1),
+                    splitAndVerifyTwoMessages(fullBuffer.length - 4),
+                    splitAndVerifyTwoMessages(fullBuffer.length - 6),
+                ]);
+            });
+            it('at the end', function () {
+                return Promise.all([splitAndVerifyTwoMessages(8), splitAndVerifyTwoMessages(1)]);
+            });
+        });
+    });
+});
+//# sourceMappingURL=inbound-parser.test.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/inbound-parser.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"inbound-parser.test.js","sourceRoot":"","sources":["../src/inbound-parser.test.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/index.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,6 @@
+/// <reference types="node" />
+import { DatabaseError } from './messages';
+import { serialize } from './serializer';
+import { MessageCallback } from './parser';
+export declare function parse(stream: NodeJS.ReadableStream, callback: MessageCallback): Promise<void>;
+export { serialize, DatabaseError };
Index: TruckSimulator-main/node_modules/pg-protocol/dist/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,15 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.DatabaseError = exports.serialize = exports.parse = void 0;
+const messages_1 = require("./messages");
+Object.defineProperty(exports, "DatabaseError", { enumerable: true, get: function () { return messages_1.DatabaseError; } });
+const serializer_1 = require("./serializer");
+Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return serializer_1.serialize; } });
+const parser_1 = require("./parser");
+function parse(stream, callback) {
+    const parser = new parser_1.Parser();
+    stream.on('data', (buffer) => parser.parse(buffer, callback));
+    return new Promise((resolve) => stream.on('end', () => resolve()));
+}
+exports.parse = parse;
+//# sourceMappingURL=index.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/index.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/index.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAA0C;AAUtB,8FAVX,wBAAa,OAUW;AATjC,6CAAwC;AAS/B,0FATA,sBAAS,OASA;AARlB,qCAAkD;AAElD,SAAgB,KAAK,CAAC,MAA6B,EAAE,QAAyB;IAC5E,MAAM,MAAM,GAAG,IAAI,eAAM,EAAE,CAAA;IAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAA;IACrE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACpE,CAAC;AAJD,sBAIC"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/messages.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/messages.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/messages.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,162 @@
+/// <reference types="node" />
+export declare type Mode = 'text' | 'binary';
+export declare type MessageName = 'parseComplete' | 'bindComplete' | 'closeComplete' | 'noData' | 'portalSuspended' | 'replicationStart' | 'emptyQuery' | 'copyDone' | 'copyData' | 'rowDescription' | 'parameterDescription' | 'parameterStatus' | 'backendKeyData' | 'notification' | 'readyForQuery' | 'commandComplete' | 'dataRow' | 'copyInResponse' | 'copyOutResponse' | 'authenticationOk' | 'authenticationMD5Password' | 'authenticationCleartextPassword' | 'authenticationSASL' | 'authenticationSASLContinue' | 'authenticationSASLFinal' | 'error' | 'notice';
+export interface BackendMessage {
+    name: MessageName;
+    length: number;
+}
+export declare const parseComplete: BackendMessage;
+export declare const bindComplete: BackendMessage;
+export declare const closeComplete: BackendMessage;
+export declare const noData: BackendMessage;
+export declare const portalSuspended: BackendMessage;
+export declare const replicationStart: BackendMessage;
+export declare const emptyQuery: BackendMessage;
+export declare const copyDone: BackendMessage;
+interface NoticeOrError {
+    message: string | undefined;
+    severity: string | undefined;
+    code: string | undefined;
+    detail: string | undefined;
+    hint: string | undefined;
+    position: string | undefined;
+    internalPosition: string | undefined;
+    internalQuery: string | undefined;
+    where: string | undefined;
+    schema: string | undefined;
+    table: string | undefined;
+    column: string | undefined;
+    dataType: string | undefined;
+    constraint: string | undefined;
+    file: string | undefined;
+    line: string | undefined;
+    routine: string | undefined;
+}
+export declare class DatabaseError extends Error implements NoticeOrError {
+    readonly length: number;
+    readonly name: MessageName;
+    severity: string | undefined;
+    code: string | undefined;
+    detail: string | undefined;
+    hint: string | undefined;
+    position: string | undefined;
+    internalPosition: string | undefined;
+    internalQuery: string | undefined;
+    where: string | undefined;
+    schema: string | undefined;
+    table: string | undefined;
+    column: string | undefined;
+    dataType: string | undefined;
+    constraint: string | undefined;
+    file: string | undefined;
+    line: string | undefined;
+    routine: string | undefined;
+    constructor(message: string, length: number, name: MessageName);
+}
+export declare class CopyDataMessage {
+    readonly length: number;
+    readonly chunk: Buffer;
+    readonly name = "copyData";
+    constructor(length: number, chunk: Buffer);
+}
+export declare class CopyResponse {
+    readonly length: number;
+    readonly name: MessageName;
+    readonly binary: boolean;
+    readonly columnTypes: number[];
+    constructor(length: number, name: MessageName, binary: boolean, columnCount: number);
+}
+export declare class Field {
+    readonly name: string;
+    readonly tableID: number;
+    readonly columnID: number;
+    readonly dataTypeID: number;
+    readonly dataTypeSize: number;
+    readonly dataTypeModifier: number;
+    readonly format: Mode;
+    constructor(name: string, tableID: number, columnID: number, dataTypeID: number, dataTypeSize: number, dataTypeModifier: number, format: Mode);
+}
+export declare class RowDescriptionMessage {
+    readonly length: number;
+    readonly fieldCount: number;
+    readonly name: MessageName;
+    readonly fields: Field[];
+    constructor(length: number, fieldCount: number);
+}
+export declare class ParameterDescriptionMessage {
+    readonly length: number;
+    readonly parameterCount: number;
+    readonly name: MessageName;
+    readonly dataTypeIDs: number[];
+    constructor(length: number, parameterCount: number);
+}
+export declare class ParameterStatusMessage {
+    readonly length: number;
+    readonly parameterName: string;
+    readonly parameterValue: string;
+    readonly name: MessageName;
+    constructor(length: number, parameterName: string, parameterValue: string);
+}
+export declare class AuthenticationMD5Password implements BackendMessage {
+    readonly length: number;
+    readonly salt: Buffer;
+    readonly name: MessageName;
+    constructor(length: number, salt: Buffer);
+}
+export declare class BackendKeyDataMessage {
+    readonly length: number;
+    readonly processID: number;
+    readonly secretKey: number;
+    readonly name: MessageName;
+    constructor(length: number, processID: number, secretKey: number);
+}
+export declare class NotificationResponseMessage {
+    readonly length: number;
+    readonly processId: number;
+    readonly channel: string;
+    readonly payload: string;
+    readonly name: MessageName;
+    constructor(length: number, processId: number, channel: string, payload: string);
+}
+export declare class ReadyForQueryMessage {
+    readonly length: number;
+    readonly status: string;
+    readonly name: MessageName;
+    constructor(length: number, status: string);
+}
+export declare class CommandCompleteMessage {
+    readonly length: number;
+    readonly text: string;
+    readonly name: MessageName;
+    constructor(length: number, text: string);
+}
+export declare class DataRowMessage {
+    length: number;
+    fields: any[];
+    readonly fieldCount: number;
+    readonly name: MessageName;
+    constructor(length: number, fields: any[]);
+}
+export declare class NoticeMessage implements BackendMessage, NoticeOrError {
+    readonly length: number;
+    readonly message: string | undefined;
+    constructor(length: number, message: string | undefined);
+    readonly name = "notice";
+    severity: string | undefined;
+    code: string | undefined;
+    detail: string | undefined;
+    hint: string | undefined;
+    position: string | undefined;
+    internalPosition: string | undefined;
+    internalQuery: string | undefined;
+    where: string | undefined;
+    schema: string | undefined;
+    table: string | undefined;
+    column: string | undefined;
+    dataType: string | undefined;
+    constraint: string | undefined;
+    file: string | undefined;
+    line: string | undefined;
+    routine: string | undefined;
+}
+export {};
Index: TruckSimulator-main/node_modules/pg-protocol/dist/messages.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/messages.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/messages.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,160 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.NoticeMessage = exports.DataRowMessage = exports.CommandCompleteMessage = exports.ReadyForQueryMessage = exports.NotificationResponseMessage = exports.BackendKeyDataMessage = exports.AuthenticationMD5Password = exports.ParameterStatusMessage = exports.ParameterDescriptionMessage = exports.RowDescriptionMessage = exports.Field = exports.CopyResponse = exports.CopyDataMessage = exports.DatabaseError = exports.copyDone = exports.emptyQuery = exports.replicationStart = exports.portalSuspended = exports.noData = exports.closeComplete = exports.bindComplete = exports.parseComplete = void 0;
+exports.parseComplete = {
+    name: 'parseComplete',
+    length: 5,
+};
+exports.bindComplete = {
+    name: 'bindComplete',
+    length: 5,
+};
+exports.closeComplete = {
+    name: 'closeComplete',
+    length: 5,
+};
+exports.noData = {
+    name: 'noData',
+    length: 5,
+};
+exports.portalSuspended = {
+    name: 'portalSuspended',
+    length: 5,
+};
+exports.replicationStart = {
+    name: 'replicationStart',
+    length: 4,
+};
+exports.emptyQuery = {
+    name: 'emptyQuery',
+    length: 4,
+};
+exports.copyDone = {
+    name: 'copyDone',
+    length: 4,
+};
+class DatabaseError extends Error {
+    constructor(message, length, name) {
+        super(message);
+        this.length = length;
+        this.name = name;
+    }
+}
+exports.DatabaseError = DatabaseError;
+class CopyDataMessage {
+    constructor(length, chunk) {
+        this.length = length;
+        this.chunk = chunk;
+        this.name = 'copyData';
+    }
+}
+exports.CopyDataMessage = CopyDataMessage;
+class CopyResponse {
+    constructor(length, name, binary, columnCount) {
+        this.length = length;
+        this.name = name;
+        this.binary = binary;
+        this.columnTypes = new Array(columnCount);
+    }
+}
+exports.CopyResponse = CopyResponse;
+class Field {
+    constructor(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, format) {
+        this.name = name;
+        this.tableID = tableID;
+        this.columnID = columnID;
+        this.dataTypeID = dataTypeID;
+        this.dataTypeSize = dataTypeSize;
+        this.dataTypeModifier = dataTypeModifier;
+        this.format = format;
+    }
+}
+exports.Field = Field;
+class RowDescriptionMessage {
+    constructor(length, fieldCount) {
+        this.length = length;
+        this.fieldCount = fieldCount;
+        this.name = 'rowDescription';
+        this.fields = new Array(this.fieldCount);
+    }
+}
+exports.RowDescriptionMessage = RowDescriptionMessage;
+class ParameterDescriptionMessage {
+    constructor(length, parameterCount) {
+        this.length = length;
+        this.parameterCount = parameterCount;
+        this.name = 'parameterDescription';
+        this.dataTypeIDs = new Array(this.parameterCount);
+    }
+}
+exports.ParameterDescriptionMessage = ParameterDescriptionMessage;
+class ParameterStatusMessage {
+    constructor(length, parameterName, parameterValue) {
+        this.length = length;
+        this.parameterName = parameterName;
+        this.parameterValue = parameterValue;
+        this.name = 'parameterStatus';
+    }
+}
+exports.ParameterStatusMessage = ParameterStatusMessage;
+class AuthenticationMD5Password {
+    constructor(length, salt) {
+        this.length = length;
+        this.salt = salt;
+        this.name = 'authenticationMD5Password';
+    }
+}
+exports.AuthenticationMD5Password = AuthenticationMD5Password;
+class BackendKeyDataMessage {
+    constructor(length, processID, secretKey) {
+        this.length = length;
+        this.processID = processID;
+        this.secretKey = secretKey;
+        this.name = 'backendKeyData';
+    }
+}
+exports.BackendKeyDataMessage = BackendKeyDataMessage;
+class NotificationResponseMessage {
+    constructor(length, processId, channel, payload) {
+        this.length = length;
+        this.processId = processId;
+        this.channel = channel;
+        this.payload = payload;
+        this.name = 'notification';
+    }
+}
+exports.NotificationResponseMessage = NotificationResponseMessage;
+class ReadyForQueryMessage {
+    constructor(length, status) {
+        this.length = length;
+        this.status = status;
+        this.name = 'readyForQuery';
+    }
+}
+exports.ReadyForQueryMessage = ReadyForQueryMessage;
+class CommandCompleteMessage {
+    constructor(length, text) {
+        this.length = length;
+        this.text = text;
+        this.name = 'commandComplete';
+    }
+}
+exports.CommandCompleteMessage = CommandCompleteMessage;
+class DataRowMessage {
+    constructor(length, fields) {
+        this.length = length;
+        this.fields = fields;
+        this.name = 'dataRow';
+        this.fieldCount = fields.length;
+    }
+}
+exports.DataRowMessage = DataRowMessage;
+class NoticeMessage {
+    constructor(length, message) {
+        this.length = length;
+        this.message = message;
+        this.name = 'notice';
+    }
+}
+exports.NoticeMessage = NoticeMessage;
+//# sourceMappingURL=messages.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/messages.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/messages.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/messages.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"messages.js","sourceRoot":"","sources":["../src/messages.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+export {};
Index: TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,252 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const assert_1 = __importDefault(require("assert"));
+const serializer_1 = require("./serializer");
+const buffer_list_1 = __importDefault(require("./testing/buffer-list"));
+describe('serializer', () => {
+    it('builds startup message', function () {
+        const actual = serializer_1.serialize.startup({
+            user: 'brian',
+            database: 'bang',
+        });
+        assert_1.default.deepEqual(actual, new buffer_list_1.default()
+            .addInt16(3)
+            .addInt16(0)
+            .addCString('user')
+            .addCString('brian')
+            .addCString('database')
+            .addCString('bang')
+            .addCString('client_encoding')
+            .addCString('UTF8')
+            .addCString('')
+            .join(true));
+    });
+    it('builds password message', function () {
+        const actual = serializer_1.serialize.password('!');
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('!').join(true, 'p'));
+    });
+    it('builds request ssl message', function () {
+        const actual = serializer_1.serialize.requestSsl();
+        const expected = new buffer_list_1.default().addInt32(80877103).join(true);
+        assert_1.default.deepEqual(actual, expected);
+    });
+    it('builds SASLInitialResponseMessage message', function () {
+        const actual = serializer_1.serialize.sendSASLInitialResponseMessage('mech', 'data');
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString('mech').addInt32(4).addString('data').join(true, 'p'));
+    });
+    it('builds SCRAMClientFinalMessage message', function () {
+        const actual = serializer_1.serialize.sendSCRAMClientFinalMessage('data');
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addString('data').join(true, 'p'));
+    });
+    it('builds query message', function () {
+        const txt = 'select * from boom';
+        const actual = serializer_1.serialize.query(txt);
+        assert_1.default.deepEqual(actual, new buffer_list_1.default().addCString(txt).join(true, 'Q'));
+    });
+    describe('parse message', () => {
+        it('builds parse message', function () {
+            const actual = serializer_1.serialize.parse({ text: '!' });
+            const expected = new buffer_list_1.default().addCString('').addCString('!').addInt16(0).join(true, 'P');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('builds parse message with named query', function () {
+            const actual = serializer_1.serialize.parse({
+                name: 'boom',
+                text: 'select * from boom',
+                types: [],
+            });
+            const expected = new buffer_list_1.default().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('with multiple parameters', function () {
+            const actual = serializer_1.serialize.parse({
+                name: 'force',
+                text: 'select * from bang where name = $1',
+                types: [1, 2, 3, 4],
+            });
+            const expected = new buffer_list_1.default()
+                .addCString('force')
+                .addCString('select * from bang where name = $1')
+                .addInt16(4)
+                .addInt32(1)
+                .addInt32(2)
+                .addInt32(3)
+                .addInt32(4)
+                .join(true, 'P');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    describe('bind messages', function () {
+        it('with no values', function () {
+            const actual = serializer_1.serialize.bind();
+            const expectedBuffer = new buffer_list_1.default()
+                .addCString('')
+                .addCString('')
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(1)
+                .addInt16(0)
+                .join(true, 'B');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+        it('with named statement, portal, and values', function () {
+            const actual = serializer_1.serialize.bind({
+                portal: 'bang',
+                statement: 'woo',
+                values: ['1', 'hi', null, 'zing'],
+            });
+            const expectedBuffer = new buffer_list_1.default()
+                .addCString('bang') // portal name
+                .addCString('woo') // statement name
+                .addInt16(4)
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(0)
+                .addInt16(4)
+                .addInt32(1)
+                .add(Buffer.from('1'))
+                .addInt32(2)
+                .add(Buffer.from('hi'))
+                .addInt32(-1)
+                .addInt32(4)
+                .add(Buffer.from('zing'))
+                .addInt16(1)
+                .addInt16(0)
+                .join(true, 'B');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+    });
+    it('with custom valueMapper', function () {
+        const actual = serializer_1.serialize.bind({
+            portal: 'bang',
+            statement: 'woo',
+            values: ['1', 'hi', null, 'zing'],
+            valueMapper: () => null,
+        });
+        const expectedBuffer = new buffer_list_1.default()
+            .addCString('bang') // portal name
+            .addCString('woo') // statement name
+            .addInt16(4)
+            .addInt16(0)
+            .addInt16(0)
+            .addInt16(0)
+            .addInt16(0)
+            .addInt16(4)
+            .addInt32(-1)
+            .addInt32(-1)
+            .addInt32(-1)
+            .addInt32(-1)
+            .addInt16(1)
+            .addInt16(0)
+            .join(true, 'B');
+        assert_1.default.deepEqual(actual, expectedBuffer);
+    });
+    it('with named statement, portal, and buffer value', function () {
+        const actual = serializer_1.serialize.bind({
+            portal: 'bang',
+            statement: 'woo',
+            values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
+        });
+        const expectedBuffer = new buffer_list_1.default()
+            .addCString('bang') // portal name
+            .addCString('woo') // statement name
+            .addInt16(4) // value count
+            .addInt16(0) // string
+            .addInt16(0) // string
+            .addInt16(0) // string
+            .addInt16(1) // binary
+            .addInt16(4)
+            .addInt32(1)
+            .add(Buffer.from('1'))
+            .addInt32(2)
+            .add(Buffer.from('hi'))
+            .addInt32(-1)
+            .addInt32(4)
+            .add(Buffer.from('zing', 'utf-8'))
+            .addInt16(1)
+            .addInt16(0)
+            .join(true, 'B');
+        assert_1.default.deepEqual(actual, expectedBuffer);
+    });
+    describe('builds execute message', function () {
+        it('for unamed portal with no row limit', function () {
+            const actual = serializer_1.serialize.execute();
+            const expectedBuffer = new buffer_list_1.default().addCString('').addInt32(0).join(true, 'E');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+        it('for named portal with row limit', function () {
+            const actual = serializer_1.serialize.execute({
+                portal: 'my favorite portal',
+                rows: 100,
+            });
+            const expectedBuffer = new buffer_list_1.default().addCString('my favorite portal').addInt32(100).join(true, 'E');
+            assert_1.default.deepEqual(actual, expectedBuffer);
+        });
+    });
+    it('builds flush command', function () {
+        const actual = serializer_1.serialize.flush();
+        const expected = new buffer_list_1.default().join(true, 'H');
+        assert_1.default.deepEqual(actual, expected);
+    });
+    it('builds sync command', function () {
+        const actual = serializer_1.serialize.sync();
+        const expected = new buffer_list_1.default().join(true, 'S');
+        assert_1.default.deepEqual(actual, expected);
+    });
+    it('builds end command', function () {
+        const actual = serializer_1.serialize.end();
+        const expected = Buffer.from([0x58, 0, 0, 0, 4]);
+        assert_1.default.deepEqual(actual, expected);
+    });
+    describe('builds describe command', function () {
+        it('describe statement', function () {
+            const actual = serializer_1.serialize.describe({ type: 'S', name: 'bang' });
+            const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'D');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('describe unnamed portal', function () {
+            const actual = serializer_1.serialize.describe({ type: 'P' });
+            const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'D');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    describe('builds close command', function () {
+        it('describe statement', function () {
+            const actual = serializer_1.serialize.close({ type: 'S', name: 'bang' });
+            const expected = new buffer_list_1.default().addChar('S').addCString('bang').join(true, 'C');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('describe unnamed portal', function () {
+            const actual = serializer_1.serialize.close({ type: 'P' });
+            const expected = new buffer_list_1.default().addChar('P').addCString('').join(true, 'C');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    describe('copy messages', function () {
+        it('builds copyFromChunk', () => {
+            const actual = serializer_1.serialize.copyData(Buffer.from([1, 2, 3]));
+            const expected = new buffer_list_1.default().add(Buffer.from([1, 2, 3])).join(true, 'd');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('builds copy fail', () => {
+            const actual = serializer_1.serialize.copyFail('err!');
+            const expected = new buffer_list_1.default().addCString('err!').join(true, 'f');
+            assert_1.default.deepEqual(actual, expected);
+        });
+        it('builds copy done', () => {
+            const actual = serializer_1.serialize.copyDone();
+            const expected = new buffer_list_1.default().join(true, 'c');
+            assert_1.default.deepEqual(actual, expected);
+        });
+    });
+    it('builds cancel message', () => {
+        const actual = serializer_1.serialize.cancel(3, 4);
+        const expected = new buffer_list_1.default().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true);
+        assert_1.default.deepEqual(actual, expected);
+    });
+});
+//# sourceMappingURL=outbound-serializer.test.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/outbound-serializer.test.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"outbound-serializer.test.js","sourceRoot":"","sources":["../src/outbound-serializer.test.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/parser.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/parser.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/parser.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,39 @@
+/// <reference types="node" />
+/// <reference types="node" />
+import { TransformOptions } from 'stream';
+import { Mode, BackendMessage } from './messages';
+export declare type Packet = {
+    code: number;
+    packet: Buffer;
+};
+declare type StreamOptions = TransformOptions & {
+    mode: Mode;
+};
+export declare type MessageCallback = (msg: BackendMessage) => void;
+export declare class Parser {
+    private buffer;
+    private bufferLength;
+    private bufferOffset;
+    private reader;
+    private mode;
+    constructor(opts?: StreamOptions);
+    parse(buffer: Buffer, callback: MessageCallback): void;
+    private mergeBuffer;
+    private handlePacket;
+    private parseReadyForQueryMessage;
+    private parseCommandCompleteMessage;
+    private parseCopyData;
+    private parseCopyInMessage;
+    private parseCopyOutMessage;
+    private parseCopyMessage;
+    private parseNotificationMessage;
+    private parseRowDescriptionMessage;
+    private parseField;
+    private parseParameterDescriptionMessage;
+    private parseDataRowMessage;
+    private parseParameterStatusMessage;
+    private parseBackendKeyData;
+    parseAuthenticationResponse(offset: number, length: number, bytes: Buffer): any;
+    private parseErrorMessage;
+}
+export {};
Index: TruckSimulator-main/node_modules/pg-protocol/dist/parser.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/parser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/parser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,306 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.Parser = void 0;
+const messages_1 = require("./messages");
+const buffer_reader_1 = require("./buffer-reader");
+// every message is prefixed with a single bye
+const CODE_LENGTH = 1;
+// every message has an int32 length which includes itself but does
+// NOT include the code in the length
+const LEN_LENGTH = 4;
+const HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH;
+const emptyBuffer = Buffer.allocUnsafe(0);
+class Parser {
+    constructor(opts) {
+        this.buffer = emptyBuffer;
+        this.bufferLength = 0;
+        this.bufferOffset = 0;
+        this.reader = new buffer_reader_1.BufferReader();
+        if ((opts === null || opts === void 0 ? void 0 : opts.mode) === 'binary') {
+            throw new Error('Binary mode not supported yet');
+        }
+        this.mode = (opts === null || opts === void 0 ? void 0 : opts.mode) || 'text';
+    }
+    parse(buffer, callback) {
+        this.mergeBuffer(buffer);
+        const bufferFullLength = this.bufferOffset + this.bufferLength;
+        let offset = this.bufferOffset;
+        while (offset + HEADER_LENGTH <= bufferFullLength) {
+            // code is 1 byte long - it identifies the message type
+            const code = this.buffer[offset];
+            // length is 1 Uint32BE - it is the length of the message EXCLUDING the code
+            const length = this.buffer.readUInt32BE(offset + CODE_LENGTH);
+            const fullMessageLength = CODE_LENGTH + length;
+            if (fullMessageLength + offset <= bufferFullLength) {
+                const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer);
+                callback(message);
+                offset += fullMessageLength;
+            }
+            else {
+                break;
+            }
+        }
+        if (offset === bufferFullLength) {
+            // No more use for the buffer
+            this.buffer = emptyBuffer;
+            this.bufferLength = 0;
+            this.bufferOffset = 0;
+        }
+        else {
+            // Adjust the cursors of remainingBuffer
+            this.bufferLength = bufferFullLength - offset;
+            this.bufferOffset = offset;
+        }
+    }
+    mergeBuffer(buffer) {
+        if (this.bufferLength > 0) {
+            const newLength = this.bufferLength + buffer.byteLength;
+            const newFullLength = newLength + this.bufferOffset;
+            if (newFullLength > this.buffer.byteLength) {
+                // We can't concat the new buffer with the remaining one
+                let newBuffer;
+                if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {
+                    // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer
+                    newBuffer = this.buffer;
+                }
+                else {
+                    // Allocate a new larger buffer
+                    let newBufferLength = this.buffer.byteLength * 2;
+                    while (newLength >= newBufferLength) {
+                        newBufferLength *= 2;
+                    }
+                    newBuffer = Buffer.allocUnsafe(newBufferLength);
+                }
+                // Move the remaining buffer to the new one
+                this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength);
+                this.buffer = newBuffer;
+                this.bufferOffset = 0;
+            }
+            // Concat the new buffer with the remaining one
+            buffer.copy(this.buffer, this.bufferOffset + this.bufferLength);
+            this.bufferLength = newLength;
+        }
+        else {
+            this.buffer = buffer;
+            this.bufferOffset = 0;
+            this.bufferLength = buffer.byteLength;
+        }
+    }
+    handlePacket(offset, code, length, bytes) {
+        switch (code) {
+            case 50 /* MessageCodes.BindComplete */:
+                return messages_1.bindComplete;
+            case 49 /* MessageCodes.ParseComplete */:
+                return messages_1.parseComplete;
+            case 51 /* MessageCodes.CloseComplete */:
+                return messages_1.closeComplete;
+            case 110 /* MessageCodes.NoData */:
+                return messages_1.noData;
+            case 115 /* MessageCodes.PortalSuspended */:
+                return messages_1.portalSuspended;
+            case 99 /* MessageCodes.CopyDone */:
+                return messages_1.copyDone;
+            case 87 /* MessageCodes.ReplicationStart */:
+                return messages_1.replicationStart;
+            case 73 /* MessageCodes.EmptyQuery */:
+                return messages_1.emptyQuery;
+            case 68 /* MessageCodes.DataRow */:
+                return this.parseDataRowMessage(offset, length, bytes);
+            case 67 /* MessageCodes.CommandComplete */:
+                return this.parseCommandCompleteMessage(offset, length, bytes);
+            case 90 /* MessageCodes.ReadyForQuery */:
+                return this.parseReadyForQueryMessage(offset, length, bytes);
+            case 65 /* MessageCodes.NotificationResponse */:
+                return this.parseNotificationMessage(offset, length, bytes);
+            case 82 /* MessageCodes.AuthenticationResponse */:
+                return this.parseAuthenticationResponse(offset, length, bytes);
+            case 83 /* MessageCodes.ParameterStatus */:
+                return this.parseParameterStatusMessage(offset, length, bytes);
+            case 75 /* MessageCodes.BackendKeyData */:
+                return this.parseBackendKeyData(offset, length, bytes);
+            case 69 /* MessageCodes.ErrorMessage */:
+                return this.parseErrorMessage(offset, length, bytes, 'error');
+            case 78 /* MessageCodes.NoticeMessage */:
+                return this.parseErrorMessage(offset, length, bytes, 'notice');
+            case 84 /* MessageCodes.RowDescriptionMessage */:
+                return this.parseRowDescriptionMessage(offset, length, bytes);
+            case 116 /* MessageCodes.ParameterDescriptionMessage */:
+                return this.parseParameterDescriptionMessage(offset, length, bytes);
+            case 71 /* MessageCodes.CopyIn */:
+                return this.parseCopyInMessage(offset, length, bytes);
+            case 72 /* MessageCodes.CopyOut */:
+                return this.parseCopyOutMessage(offset, length, bytes);
+            case 100 /* MessageCodes.CopyData */:
+                return this.parseCopyData(offset, length, bytes);
+            default:
+                return new messages_1.DatabaseError('received invalid response: ' + code.toString(16), length, 'error');
+        }
+    }
+    parseReadyForQueryMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const status = this.reader.string(1);
+        return new messages_1.ReadyForQueryMessage(length, status);
+    }
+    parseCommandCompleteMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const text = this.reader.cstring();
+        return new messages_1.CommandCompleteMessage(length, text);
+    }
+    parseCopyData(offset, length, bytes) {
+        const chunk = bytes.slice(offset, offset + (length - 4));
+        return new messages_1.CopyDataMessage(length, chunk);
+    }
+    parseCopyInMessage(offset, length, bytes) {
+        return this.parseCopyMessage(offset, length, bytes, 'copyInResponse');
+    }
+    parseCopyOutMessage(offset, length, bytes) {
+        return this.parseCopyMessage(offset, length, bytes, 'copyOutResponse');
+    }
+    parseCopyMessage(offset, length, bytes, messageName) {
+        this.reader.setBuffer(offset, bytes);
+        const isBinary = this.reader.byte() !== 0;
+        const columnCount = this.reader.int16();
+        const message = new messages_1.CopyResponse(length, messageName, isBinary, columnCount);
+        for (let i = 0; i < columnCount; i++) {
+            message.columnTypes[i] = this.reader.int16();
+        }
+        return message;
+    }
+    parseNotificationMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const processId = this.reader.int32();
+        const channel = this.reader.cstring();
+        const payload = this.reader.cstring();
+        return new messages_1.NotificationResponseMessage(length, processId, channel, payload);
+    }
+    parseRowDescriptionMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const fieldCount = this.reader.int16();
+        const message = new messages_1.RowDescriptionMessage(length, fieldCount);
+        for (let i = 0; i < fieldCount; i++) {
+            message.fields[i] = this.parseField();
+        }
+        return message;
+    }
+    parseField() {
+        const name = this.reader.cstring();
+        const tableID = this.reader.uint32();
+        const columnID = this.reader.int16();
+        const dataTypeID = this.reader.uint32();
+        const dataTypeSize = this.reader.int16();
+        const dataTypeModifier = this.reader.int32();
+        const mode = this.reader.int16() === 0 ? 'text' : 'binary';
+        return new messages_1.Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode);
+    }
+    parseParameterDescriptionMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const parameterCount = this.reader.int16();
+        const message = new messages_1.ParameterDescriptionMessage(length, parameterCount);
+        for (let i = 0; i < parameterCount; i++) {
+            message.dataTypeIDs[i] = this.reader.int32();
+        }
+        return message;
+    }
+    parseDataRowMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const fieldCount = this.reader.int16();
+        const fields = new Array(fieldCount);
+        for (let i = 0; i < fieldCount; i++) {
+            const len = this.reader.int32();
+            // a -1 for length means the value of the field is null
+            fields[i] = len === -1 ? null : this.reader.string(len);
+        }
+        return new messages_1.DataRowMessage(length, fields);
+    }
+    parseParameterStatusMessage(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const name = this.reader.cstring();
+        const value = this.reader.cstring();
+        return new messages_1.ParameterStatusMessage(length, name, value);
+    }
+    parseBackendKeyData(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const processID = this.reader.int32();
+        const secretKey = this.reader.int32();
+        return new messages_1.BackendKeyDataMessage(length, processID, secretKey);
+    }
+    parseAuthenticationResponse(offset, length, bytes) {
+        this.reader.setBuffer(offset, bytes);
+        const code = this.reader.int32();
+        // TODO(bmc): maybe better types here
+        const message = {
+            name: 'authenticationOk',
+            length,
+        };
+        switch (code) {
+            case 0: // AuthenticationOk
+                break;
+            case 3: // AuthenticationCleartextPassword
+                if (message.length === 8) {
+                    message.name = 'authenticationCleartextPassword';
+                }
+                break;
+            case 5: // AuthenticationMD5Password
+                if (message.length === 12) {
+                    message.name = 'authenticationMD5Password';
+                    const salt = this.reader.bytes(4);
+                    return new messages_1.AuthenticationMD5Password(length, salt);
+                }
+                break;
+            case 10: // AuthenticationSASL
+                {
+                    message.name = 'authenticationSASL';
+                    message.mechanisms = [];
+                    let mechanism;
+                    do {
+                        mechanism = this.reader.cstring();
+                        if (mechanism) {
+                            message.mechanisms.push(mechanism);
+                        }
+                    } while (mechanism);
+                }
+                break;
+            case 11: // AuthenticationSASLContinue
+                message.name = 'authenticationSASLContinue';
+                message.data = this.reader.string(length - 8);
+                break;
+            case 12: // AuthenticationSASLFinal
+                message.name = 'authenticationSASLFinal';
+                message.data = this.reader.string(length - 8);
+                break;
+            default:
+                throw new Error('Unknown authenticationOk message type ' + code);
+        }
+        return message;
+    }
+    parseErrorMessage(offset, length, bytes, name) {
+        this.reader.setBuffer(offset, bytes);
+        const fields = {};
+        let fieldType = this.reader.string(1);
+        while (fieldType !== '\0') {
+            fields[fieldType] = this.reader.cstring();
+            fieldType = this.reader.string(1);
+        }
+        const messageValue = fields.M;
+        const message = name === 'notice' ? new messages_1.NoticeMessage(length, messageValue) : new messages_1.DatabaseError(messageValue, length, name);
+        message.severity = fields.S;
+        message.code = fields.C;
+        message.detail = fields.D;
+        message.hint = fields.H;
+        message.position = fields.P;
+        message.internalPosition = fields.p;
+        message.internalQuery = fields.q;
+        message.where = fields.W;
+        message.schema = fields.s;
+        message.table = fields.t;
+        message.column = fields.c;
+        message.dataType = fields.d;
+        message.constraint = fields.n;
+        message.file = fields.F;
+        message.line = fields.L;
+        message.routine = fields.R;
+        return message;
+    }
+}
+exports.Parser = Parser;
+//# sourceMappingURL=parser.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/parser.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/parser.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/parser.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/node_modules/pg-protocol/dist/serializer.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/serializer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/serializer.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,42 @@
+declare type ParseOpts = {
+    name?: string;
+    types?: number[];
+    text: string;
+};
+declare type ValueMapper = (param: any, index: number) => any;
+declare type BindOpts = {
+    portal?: string;
+    binary?: boolean;
+    statement?: string;
+    values?: any[];
+    valueMapper?: ValueMapper;
+};
+declare type ExecOpts = {
+    portal?: string;
+    rows?: number;
+};
+declare type PortalOpts = {
+    type: 'S' | 'P';
+    name?: string;
+};
+declare const serialize: {
+    startup: (opts: Record<string, string>) => Buffer;
+    password: (password: string) => Buffer;
+    requestSsl: () => Buffer;
+    sendSASLInitialResponseMessage: (mechanism: string, initialResponse: string) => Buffer;
+    sendSCRAMClientFinalMessage: (additionalData: string) => Buffer;
+    query: (text: string) => Buffer;
+    parse: (query: ParseOpts) => Buffer;
+    bind: (config?: BindOpts) => Buffer;
+    execute: (config?: ExecOpts) => Buffer;
+    describe: (msg: PortalOpts) => Buffer;
+    close: (msg: PortalOpts) => Buffer;
+    flush: () => Buffer;
+    sync: () => Buffer;
+    end: () => Buffer;
+    copyData: (chunk: Buffer) => Buffer;
+    copyDone: () => Buffer;
+    copyFail: (message: string) => Buffer;
+    cancel: (processID: number, secretKey: number) => Buffer;
+};
+export { serialize };
Index: TruckSimulator-main/node_modules/pg-protocol/dist/serializer.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/serializer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/serializer.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,189 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.serialize = void 0;
+const buffer_writer_1 = require("./buffer-writer");
+const writer = new buffer_writer_1.Writer();
+const startup = (opts) => {
+    // protocol version
+    writer.addInt16(3).addInt16(0);
+    for (const key of Object.keys(opts)) {
+        writer.addCString(key).addCString(opts[key]);
+    }
+    writer.addCString('client_encoding').addCString('UTF8');
+    const bodyBuffer = writer.addCString('').flush();
+    // this message is sent without a code
+    const length = bodyBuffer.length + 4;
+    return new buffer_writer_1.Writer().addInt32(length).add(bodyBuffer).flush();
+};
+const requestSsl = () => {
+    const response = Buffer.allocUnsafe(8);
+    response.writeInt32BE(8, 0);
+    response.writeInt32BE(80877103, 4);
+    return response;
+};
+const password = (password) => {
+    return writer.addCString(password).flush(112 /* code.startup */);
+};
+const sendSASLInitialResponseMessage = function (mechanism, initialResponse) {
+    // 0x70 = 'p'
+    writer.addCString(mechanism).addInt32(Buffer.byteLength(initialResponse)).addString(initialResponse);
+    return writer.flush(112 /* code.startup */);
+};
+const sendSCRAMClientFinalMessage = function (additionalData) {
+    return writer.addString(additionalData).flush(112 /* code.startup */);
+};
+const query = (text) => {
+    return writer.addCString(text).flush(81 /* code.query */);
+};
+const emptyArray = [];
+const parse = (query) => {
+    // expect something like this:
+    // { name: 'queryName',
+    //   text: 'select * from blah',
+    //   types: ['int8', 'bool'] }
+    // normalize missing query names to allow for null
+    const name = query.name || '';
+    if (name.length > 63) {
+        console.error('Warning! Postgres only supports 63 characters for query names.');
+        console.error('You supplied %s (%s)', name, name.length);
+        console.error('This can cause conflicts and silent errors executing queries');
+    }
+    const types = query.types || emptyArray;
+    const len = types.length;
+    const buffer = writer
+        .addCString(name) // name of query
+        .addCString(query.text) // actual query text
+        .addInt16(len);
+    for (let i = 0; i < len; i++) {
+        buffer.addInt32(types[i]);
+    }
+    return writer.flush(80 /* code.parse */);
+};
+const paramWriter = new buffer_writer_1.Writer();
+const writeValues = function (values, valueMapper) {
+    for (let i = 0; i < values.length; i++) {
+        const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i];
+        if (mappedVal == null) {
+            // add the param type (string) to the writer
+            writer.addInt16(0 /* ParamType.STRING */);
+            // write -1 to the param writer to indicate null
+            paramWriter.addInt32(-1);
+        }
+        else if (mappedVal instanceof Buffer) {
+            // add the param type (binary) to the writer
+            writer.addInt16(1 /* ParamType.BINARY */);
+            // add the buffer to the param writer
+            paramWriter.addInt32(mappedVal.length);
+            paramWriter.add(mappedVal);
+        }
+        else {
+            // add the param type (string) to the writer
+            writer.addInt16(0 /* ParamType.STRING */);
+            paramWriter.addInt32(Buffer.byteLength(mappedVal));
+            paramWriter.addString(mappedVal);
+        }
+    }
+};
+const bind = (config = {}) => {
+    // normalize config
+    const portal = config.portal || '';
+    const statement = config.statement || '';
+    const binary = config.binary || false;
+    const values = config.values || emptyArray;
+    const len = values.length;
+    writer.addCString(portal).addCString(statement);
+    writer.addInt16(len);
+    writeValues(values, config.valueMapper);
+    writer.addInt16(len);
+    writer.add(paramWriter.flush());
+    // all results use the same format code
+    writer.addInt16(1);
+    // format code
+    writer.addInt16(binary ? 1 /* ParamType.BINARY */ : 0 /* ParamType.STRING */);
+    return writer.flush(66 /* code.bind */);
+};
+const emptyExecute = Buffer.from([69 /* code.execute */, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00]);
+const execute = (config) => {
+    // this is the happy path for most queries
+    if (!config || (!config.portal && !config.rows)) {
+        return emptyExecute;
+    }
+    const portal = config.portal || '';
+    const rows = config.rows || 0;
+    const portalLength = Buffer.byteLength(portal);
+    const len = 4 + portalLength + 1 + 4;
+    // one extra bit for code
+    const buff = Buffer.allocUnsafe(1 + len);
+    buff[0] = 69 /* code.execute */;
+    buff.writeInt32BE(len, 1);
+    buff.write(portal, 5, 'utf-8');
+    buff[portalLength + 5] = 0; // null terminate portal cString
+    buff.writeUInt32BE(rows, buff.length - 4);
+    return buff;
+};
+const cancel = (processID, secretKey) => {
+    const buffer = Buffer.allocUnsafe(16);
+    buffer.writeInt32BE(16, 0);
+    buffer.writeInt16BE(1234, 4);
+    buffer.writeInt16BE(5678, 6);
+    buffer.writeInt32BE(processID, 8);
+    buffer.writeInt32BE(secretKey, 12);
+    return buffer;
+};
+const cstringMessage = (code, string) => {
+    const stringLen = Buffer.byteLength(string);
+    const len = 4 + stringLen + 1;
+    // one extra bit for code
+    const buffer = Buffer.allocUnsafe(1 + len);
+    buffer[0] = code;
+    buffer.writeInt32BE(len, 1);
+    buffer.write(string, 5, 'utf-8');
+    buffer[len] = 0; // null terminate cString
+    return buffer;
+};
+const emptyDescribePortal = writer.addCString('P').flush(68 /* code.describe */);
+const emptyDescribeStatement = writer.addCString('S').flush(68 /* code.describe */);
+const describe = (msg) => {
+    return msg.name
+        ? cstringMessage(68 /* code.describe */, `${msg.type}${msg.name || ''}`)
+        : msg.type === 'P'
+            ? emptyDescribePortal
+            : emptyDescribeStatement;
+};
+const close = (msg) => {
+    const text = `${msg.type}${msg.name || ''}`;
+    return cstringMessage(67 /* code.close */, text);
+};
+const copyData = (chunk) => {
+    return writer.add(chunk).flush(100 /* code.copyFromChunk */);
+};
+const copyFail = (message) => {
+    return cstringMessage(102 /* code.copyFail */, message);
+};
+const codeOnlyBuffer = (code) => Buffer.from([code, 0x00, 0x00, 0x00, 0x04]);
+const flushBuffer = codeOnlyBuffer(72 /* code.flush */);
+const syncBuffer = codeOnlyBuffer(83 /* code.sync */);
+const endBuffer = codeOnlyBuffer(88 /* code.end */);
+const copyDoneBuffer = codeOnlyBuffer(99 /* code.copyDone */);
+const serialize = {
+    startup,
+    password,
+    requestSsl,
+    sendSASLInitialResponseMessage,
+    sendSCRAMClientFinalMessage,
+    query,
+    parse,
+    bind,
+    execute,
+    describe,
+    close,
+    flush: () => flushBuffer,
+    sync: () => syncBuffer,
+    end: () => endBuffer,
+    copyData,
+    copyDone: () => copyDoneBuffer,
+    copyFail,
+    cancel,
+};
+exports.serialize = serialize;
+//# sourceMappingURL=serializer.js.map
Index: TruckSimulator-main/node_modules/pg-protocol/dist/serializer.js.map
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/dist/serializer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/dist/serializer.js.map	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+{"version":3,"file":"serializer.js","sourceRoot":"","sources":["../src/serializer.ts"],"names":[],"mappings":"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"}
Index: TruckSimulator-main/node_modules/pg-protocol/esm/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/esm/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/esm/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,11 @@
+// ESM wrapper for pg-protocol
+import * as protocol from '../dist/index.js'
+
+// Re-export all the properties
+export const DatabaseError = protocol.DatabaseError
+export const SASL = protocol.SASL
+export const serialize = protocol.serialize
+export const parse = protocol.parse
+
+// Re-export the default
+export default protocol
Index: TruckSimulator-main/node_modules/pg-protocol/package.json
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,45 @@
+{
+  "name": "pg-protocol",
+  "version": "1.10.3",
+  "description": "The postgres client/server binary protocol, implemented in TypeScript",
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
+  "exports": {
+    ".": {
+      "import": "./esm/index.js",
+      "require": "./dist/index.js",
+      "default": "./dist/index.js"
+    },
+    "./dist/*": "./dist/*.js",
+    "./dist/*.js": "./dist/*.js"
+  },
+  "license": "MIT",
+  "devDependencies": {
+    "@types/chai": "^4.2.7",
+    "@types/mocha": "^10.0.7",
+    "@types/node": "^12.12.21",
+    "chai": "^4.2.0",
+    "chunky": "^0.0.0",
+    "mocha": "^10.5.2",
+    "ts-node": "^8.5.4",
+    "typescript": "^4.0.3"
+  },
+  "scripts": {
+    "test": "mocha dist/**/*.test.js",
+    "build": "tsc",
+    "build:watch": "tsc --watch",
+    "prepublish": "yarn build",
+    "pretest": "yarn build"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg-protocol"
+  },
+  "files": [
+    "/dist/*{js,ts,map}",
+    "/src",
+    "/esm"
+  ],
+  "gitHead": "8f8e7315e8f7c1bb01e98fdb41c8c92585510782"
+}
Index: TruckSimulator-main/node_modules/pg-protocol/src/b.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/b.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/b.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,25 @@
+// file for microbenchmarking
+
+import { BufferReader } from './buffer-reader'
+
+const LOOPS = 1000
+let count = 0
+const start = performance.now()
+
+const reader = new BufferReader()
+const buffer = Buffer.from([33, 33, 33, 33, 33, 33, 33, 0])
+
+const run = () => {
+  if (count > LOOPS) {
+    console.log(performance.now() - start)
+    return
+  }
+  count++
+  for (let i = 0; i < LOOPS; i++) {
+    reader.setBuffer(0, buffer)
+    reader.cstring()
+  }
+  setImmediate(run)
+}
+
+run()
Index: TruckSimulator-main/node_modules/pg-protocol/src/buffer-reader.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/buffer-reader.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/buffer-reader.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,60 @@
+const emptyBuffer = Buffer.allocUnsafe(0)
+
+export class BufferReader {
+  private buffer: Buffer = emptyBuffer
+
+  // TODO(bmc): support non-utf8 encoding?
+  private encoding: string = 'utf-8'
+
+  constructor(private offset: number = 0) {}
+
+  public setBuffer(offset: number, buffer: Buffer): void {
+    this.offset = offset
+    this.buffer = buffer
+  }
+
+  public int16(): number {
+    const result = this.buffer.readInt16BE(this.offset)
+    this.offset += 2
+    return result
+  }
+
+  public byte(): number {
+    const result = this.buffer[this.offset]
+    this.offset++
+    return result
+  }
+
+  public int32(): number {
+    const result = this.buffer.readInt32BE(this.offset)
+    this.offset += 4
+    return result
+  }
+
+  public uint32(): number {
+    const result = this.buffer.readUInt32BE(this.offset)
+    this.offset += 4
+    return result
+  }
+
+  public string(length: number): string {
+    const result = this.buffer.toString(this.encoding, this.offset, this.offset + length)
+    this.offset += length
+    return result
+  }
+
+  public cstring(): string {
+    const start = this.offset
+    let end = start
+    // eslint-disable-next-line no-empty
+    while (this.buffer[end++] !== 0) {}
+    this.offset = end
+    return this.buffer.toString(this.encoding, start, end - 1)
+  }
+
+  public bytes(length: number): Buffer {
+    const result = this.buffer.slice(this.offset, this.offset + length)
+    this.offset += length
+    return result
+  }
+}
Index: TruckSimulator-main/node_modules/pg-protocol/src/buffer-writer.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/buffer-writer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/buffer-writer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,85 @@
+//binary data writer tuned for encoding binary specific to the postgres binary protocol
+
+export class Writer {
+  private buffer: Buffer
+  private offset: number = 5
+  private headerPosition: number = 0
+  constructor(private size = 256) {
+    this.buffer = Buffer.allocUnsafe(size)
+  }
+
+  private ensure(size: number): void {
+    const remaining = this.buffer.length - this.offset
+    if (remaining < size) {
+      const oldBuffer = this.buffer
+      // exponential growth factor of around ~ 1.5
+      // https://stackoverflow.com/questions/2269063/buffer-growth-strategy
+      const newSize = oldBuffer.length + (oldBuffer.length >> 1) + size
+      this.buffer = Buffer.allocUnsafe(newSize)
+      oldBuffer.copy(this.buffer)
+    }
+  }
+
+  public addInt32(num: number): Writer {
+    this.ensure(4)
+    this.buffer[this.offset++] = (num >>> 24) & 0xff
+    this.buffer[this.offset++] = (num >>> 16) & 0xff
+    this.buffer[this.offset++] = (num >>> 8) & 0xff
+    this.buffer[this.offset++] = (num >>> 0) & 0xff
+    return this
+  }
+
+  public addInt16(num: number): Writer {
+    this.ensure(2)
+    this.buffer[this.offset++] = (num >>> 8) & 0xff
+    this.buffer[this.offset++] = (num >>> 0) & 0xff
+    return this
+  }
+
+  public addCString(string: string): Writer {
+    if (!string) {
+      this.ensure(1)
+    } else {
+      const len = Buffer.byteLength(string)
+      this.ensure(len + 1) // +1 for null terminator
+      this.buffer.write(string, this.offset, 'utf-8')
+      this.offset += len
+    }
+
+    this.buffer[this.offset++] = 0 // null terminator
+    return this
+  }
+
+  public addString(string: string = ''): Writer {
+    const len = Buffer.byteLength(string)
+    this.ensure(len)
+    this.buffer.write(string, this.offset)
+    this.offset += len
+    return this
+  }
+
+  public add(otherBuffer: Buffer): Writer {
+    this.ensure(otherBuffer.length)
+    otherBuffer.copy(this.buffer, this.offset)
+    this.offset += otherBuffer.length
+    return this
+  }
+
+  private join(code?: number): Buffer {
+    if (code) {
+      this.buffer[this.headerPosition] = code
+      //length is everything in this packet minus the code
+      const length = this.offset - (this.headerPosition + 1)
+      this.buffer.writeInt32BE(length, this.headerPosition + 1)
+    }
+    return this.buffer.slice(code ? 0 : 5, this.offset)
+  }
+
+  public flush(code?: number): Buffer {
+    const result = this.join(code)
+    this.offset = 5
+    this.headerPosition = 0
+    this.buffer = Buffer.allocUnsafe(this.size)
+    return result
+  }
+}
Index: TruckSimulator-main/node_modules/pg-protocol/src/inbound-parser.test.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/inbound-parser.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/inbound-parser.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,568 @@
+import buffers from './testing/test-buffers'
+import BufferList from './testing/buffer-list'
+import { parse } from '.'
+import assert from 'assert'
+import { PassThrough } from 'stream'
+import { BackendMessage } from './messages'
+
+const authOkBuffer = buffers.authenticationOk()
+const paramStatusBuffer = buffers.parameterStatus('client_encoding', 'UTF8')
+const readyForQueryBuffer = buffers.readyForQuery()
+const backendKeyDataBuffer = buffers.backendKeyData(1, 2)
+const commandCompleteBuffer = buffers.commandComplete('SELECT 3')
+const parseCompleteBuffer = buffers.parseComplete()
+const bindCompleteBuffer = buffers.bindComplete()
+const portalSuspendedBuffer = buffers.portalSuspended()
+
+const row1 = {
+  name: 'id',
+  tableID: 1,
+  attributeNumber: 2,
+  dataTypeID: 3,
+  dataTypeSize: 4,
+  typeModifier: 5,
+  formatCode: 0,
+}
+const oneRowDescBuff = buffers.rowDescription([row1])
+row1.name = 'bang'
+
+const twoRowBuf = buffers.rowDescription([
+  row1,
+  {
+    name: 'whoah',
+    tableID: 10,
+    attributeNumber: 11,
+    dataTypeID: 12,
+    dataTypeSize: 13,
+    typeModifier: 14,
+    formatCode: 0,
+  },
+])
+
+const rowWithBigOids = {
+  name: 'bigoid',
+  tableID: 3000000001,
+  attributeNumber: 2,
+  dataTypeID: 3000000003,
+  dataTypeSize: 4,
+  typeModifier: 5,
+  formatCode: 0,
+}
+const bigOidDescBuff = buffers.rowDescription([rowWithBigOids])
+
+const emptyRowFieldBuf = buffers.dataRow([])
+
+const oneFieldBuf = buffers.dataRow(['test'])
+
+const expectedAuthenticationOkayMessage = {
+  name: 'authenticationOk',
+  length: 8,
+}
+
+const expectedParameterStatusMessage = {
+  name: 'parameterStatus',
+  parameterName: 'client_encoding',
+  parameterValue: 'UTF8',
+  length: 25,
+}
+
+const expectedBackendKeyDataMessage = {
+  name: 'backendKeyData',
+  processID: 1,
+  secretKey: 2,
+}
+
+const expectedReadyForQueryMessage = {
+  name: 'readyForQuery',
+  length: 5,
+  status: 'I',
+}
+
+const expectedCommandCompleteMessage = {
+  name: 'commandComplete',
+  length: 13,
+  text: 'SELECT 3',
+}
+const emptyRowDescriptionBuffer = new BufferList()
+  .addInt16(0) // number of fields
+  .join(true, 'T')
+
+const expectedEmptyRowDescriptionMessage = {
+  name: 'rowDescription',
+  length: 6,
+  fieldCount: 0,
+  fields: [],
+}
+const expectedOneRowMessage = {
+  name: 'rowDescription',
+  length: 27,
+  fieldCount: 1,
+  fields: [
+    {
+      name: 'id',
+      tableID: 1,
+      columnID: 2,
+      dataTypeID: 3,
+      dataTypeSize: 4,
+      dataTypeModifier: 5,
+      format: 'text',
+    },
+  ],
+}
+
+const expectedTwoRowMessage = {
+  name: 'rowDescription',
+  length: 53,
+  fieldCount: 2,
+  fields: [
+    {
+      name: 'bang',
+      tableID: 1,
+      columnID: 2,
+      dataTypeID: 3,
+      dataTypeSize: 4,
+      dataTypeModifier: 5,
+      format: 'text',
+    },
+    {
+      name: 'whoah',
+      tableID: 10,
+      columnID: 11,
+      dataTypeID: 12,
+      dataTypeSize: 13,
+      dataTypeModifier: 14,
+      format: 'text',
+    },
+  ],
+}
+const expectedBigOidMessage = {
+  name: 'rowDescription',
+  length: 31,
+  fieldCount: 1,
+  fields: [
+    {
+      name: 'bigoid',
+      tableID: 3000000001,
+      columnID: 2,
+      dataTypeID: 3000000003,
+      dataTypeSize: 4,
+      dataTypeModifier: 5,
+      format: 'text',
+    },
+  ],
+}
+
+const emptyParameterDescriptionBuffer = new BufferList()
+  .addInt16(0) // number of parameters
+  .join(true, 't')
+
+const oneParameterDescBuf = buffers.parameterDescription([1111])
+
+const twoParameterDescBuf = buffers.parameterDescription([2222, 3333])
+
+const expectedEmptyParameterDescriptionMessage = {
+  name: 'parameterDescription',
+  length: 6,
+  parameterCount: 0,
+  dataTypeIDs: [],
+}
+
+const expectedOneParameterMessage = {
+  name: 'parameterDescription',
+  length: 10,
+  parameterCount: 1,
+  dataTypeIDs: [1111],
+}
+
+const expectedTwoParameterMessage = {
+  name: 'parameterDescription',
+  length: 14,
+  parameterCount: 2,
+  dataTypeIDs: [2222, 3333],
+}
+
+const testForMessage = function (buffer: Buffer, expectedMessage: any) {
+  it('receives and parses ' + expectedMessage.name, async () => {
+    const messages = await parseBuffers([buffer])
+    const [lastMessage] = messages
+
+    for (const key in expectedMessage) {
+      assert.deepEqual((lastMessage as any)[key], expectedMessage[key])
+    }
+  })
+}
+
+const plainPasswordBuffer = buffers.authenticationCleartextPassword()
+const md5PasswordBuffer = buffers.authenticationMD5Password()
+const SASLBuffer = buffers.authenticationSASL()
+const SASLContinueBuffer = buffers.authenticationSASLContinue()
+const SASLFinalBuffer = buffers.authenticationSASLFinal()
+
+const expectedPlainPasswordMessage = {
+  name: 'authenticationCleartextPassword',
+}
+
+const expectedMD5PasswordMessage = {
+  name: 'authenticationMD5Password',
+  salt: Buffer.from([1, 2, 3, 4]),
+}
+
+const expectedSASLMessage = {
+  name: 'authenticationSASL',
+  mechanisms: ['SCRAM-SHA-256'],
+}
+
+const expectedSASLContinueMessage = {
+  name: 'authenticationSASLContinue',
+  data: 'data',
+}
+
+const expectedSASLFinalMessage = {
+  name: 'authenticationSASLFinal',
+  data: 'data',
+}
+
+const notificationResponseBuffer = buffers.notification(4, 'hi', 'boom')
+const expectedNotificationResponseMessage = {
+  name: 'notification',
+  processId: 4,
+  channel: 'hi',
+  payload: 'boom',
+}
+
+const parseBuffers = async (buffers: Buffer[]): Promise<BackendMessage[]> => {
+  const stream = new PassThrough()
+  for (const buffer of buffers) {
+    stream.write(buffer)
+  }
+  stream.end()
+  const msgs: BackendMessage[] = []
+  await parse(stream, (msg) => msgs.push(msg))
+  return msgs
+}
+
+describe('PgPacketStream', function () {
+  testForMessage(authOkBuffer, expectedAuthenticationOkayMessage)
+  testForMessage(plainPasswordBuffer, expectedPlainPasswordMessage)
+  testForMessage(md5PasswordBuffer, expectedMD5PasswordMessage)
+  testForMessage(SASLBuffer, expectedSASLMessage)
+  testForMessage(SASLContinueBuffer, expectedSASLContinueMessage)
+
+  // this exercises a found bug in the parser:
+  // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+  // and adds a test which is deterministic, rather than relying on network packet chunking
+  const extendedSASLContinueBuffer = Buffer.concat([SASLContinueBuffer, Buffer.from([1, 2, 3, 4])])
+  testForMessage(extendedSASLContinueBuffer, expectedSASLContinueMessage)
+
+  testForMessage(SASLFinalBuffer, expectedSASLFinalMessage)
+
+  // this exercises a found bug in the parser:
+  // https://github.com/brianc/node-postgres/pull/2210#issuecomment-627626084
+  // and adds a test which is deterministic, rather than relying on network packet chunking
+  const extendedSASLFinalBuffer = Buffer.concat([SASLFinalBuffer, Buffer.from([1, 2, 4, 5])])
+  testForMessage(extendedSASLFinalBuffer, expectedSASLFinalMessage)
+
+  testForMessage(paramStatusBuffer, expectedParameterStatusMessage)
+  testForMessage(backendKeyDataBuffer, expectedBackendKeyDataMessage)
+  testForMessage(readyForQueryBuffer, expectedReadyForQueryMessage)
+  testForMessage(commandCompleteBuffer, expectedCommandCompleteMessage)
+  testForMessage(notificationResponseBuffer, expectedNotificationResponseMessage)
+  testForMessage(buffers.emptyQuery(), {
+    name: 'emptyQuery',
+    length: 4,
+  })
+
+  testForMessage(Buffer.from([0x6e, 0, 0, 0, 4]), {
+    name: 'noData',
+  })
+
+  describe('rowDescription messages', function () {
+    testForMessage(emptyRowDescriptionBuffer, expectedEmptyRowDescriptionMessage)
+    testForMessage(oneRowDescBuff, expectedOneRowMessage)
+    testForMessage(twoRowBuf, expectedTwoRowMessage)
+    testForMessage(bigOidDescBuff, expectedBigOidMessage)
+  })
+
+  describe('parameterDescription messages', function () {
+    testForMessage(emptyParameterDescriptionBuffer, expectedEmptyParameterDescriptionMessage)
+    testForMessage(oneParameterDescBuf, expectedOneParameterMessage)
+    testForMessage(twoParameterDescBuf, expectedTwoParameterMessage)
+  })
+
+  describe('parsing rows', function () {
+    describe('parsing empty row', function () {
+      testForMessage(emptyRowFieldBuf, {
+        name: 'dataRow',
+        fieldCount: 0,
+      })
+    })
+
+    describe('parsing data row with fields', function () {
+      testForMessage(oneFieldBuf, {
+        name: 'dataRow',
+        fieldCount: 1,
+        fields: ['test'],
+      })
+    })
+  })
+
+  describe('notice message', function () {
+    // this uses the same logic as error message
+    const buff = buffers.notice([{ type: 'C', value: 'code' }])
+    testForMessage(buff, {
+      name: 'notice',
+      code: 'code',
+    })
+  })
+
+  testForMessage(buffers.error([]), {
+    name: 'error',
+  })
+
+  describe('with all the fields', function () {
+    const buffer = buffers.error([
+      {
+        type: 'S',
+        value: 'ERROR',
+      },
+      {
+        type: 'C',
+        value: 'code',
+      },
+      {
+        type: 'M',
+        value: 'message',
+      },
+      {
+        type: 'D',
+        value: 'details',
+      },
+      {
+        type: 'H',
+        value: 'hint',
+      },
+      {
+        type: 'P',
+        value: '100',
+      },
+      {
+        type: 'p',
+        value: '101',
+      },
+      {
+        type: 'q',
+        value: 'query',
+      },
+      {
+        type: 'W',
+        value: 'where',
+      },
+      {
+        type: 'F',
+        value: 'file',
+      },
+      {
+        type: 'L',
+        value: 'line',
+      },
+      {
+        type: 'R',
+        value: 'routine',
+      },
+      {
+        type: 'Z', // ignored
+        value: 'alsdkf',
+      },
+    ])
+
+    testForMessage(buffer, {
+      name: 'error',
+      severity: 'ERROR',
+      code: 'code',
+      message: 'message',
+      detail: 'details',
+      hint: 'hint',
+      position: '100',
+      internalPosition: '101',
+      internalQuery: 'query',
+      where: 'where',
+      file: 'file',
+      line: 'line',
+      routine: 'routine',
+    })
+  })
+
+  testForMessage(parseCompleteBuffer, {
+    name: 'parseComplete',
+  })
+
+  testForMessage(bindCompleteBuffer, {
+    name: 'bindComplete',
+  })
+
+  testForMessage(bindCompleteBuffer, {
+    name: 'bindComplete',
+  })
+
+  testForMessage(buffers.closeComplete(), {
+    name: 'closeComplete',
+  })
+
+  describe('parses portal suspended message', function () {
+    testForMessage(portalSuspendedBuffer, {
+      name: 'portalSuspended',
+    })
+  })
+
+  describe('parses replication start message', function () {
+    testForMessage(Buffer.from([0x57, 0x00, 0x00, 0x00, 0x04]), {
+      name: 'replicationStart',
+      length: 4,
+    })
+  })
+
+  describe('copy', () => {
+    testForMessage(buffers.copyIn(0), {
+      name: 'copyInResponse',
+      length: 7,
+      binary: false,
+      columnTypes: [],
+    })
+
+    testForMessage(buffers.copyIn(2), {
+      name: 'copyInResponse',
+      length: 11,
+      binary: false,
+      columnTypes: [0, 1],
+    })
+
+    testForMessage(buffers.copyOut(0), {
+      name: 'copyOutResponse',
+      length: 7,
+      binary: false,
+      columnTypes: [],
+    })
+
+    testForMessage(buffers.copyOut(3), {
+      name: 'copyOutResponse',
+      length: 13,
+      binary: false,
+      columnTypes: [0, 1, 2],
+    })
+
+    testForMessage(buffers.copyDone(), {
+      name: 'copyDone',
+      length: 4,
+    })
+
+    testForMessage(buffers.copyData(Buffer.from([5, 6, 7])), {
+      name: 'copyData',
+      length: 7,
+      chunk: Buffer.from([5, 6, 7]),
+    })
+  })
+
+  // since the data message on a stream can randomly divide the incomming
+  // tcp packets anywhere, we need to make sure we can parse every single
+  // split on a tcp message
+  describe('split buffer, single message parsing', function () {
+    const fullBuffer = buffers.dataRow([null, 'bang', 'zug zug', null, '!'])
+
+    it('parses when full buffer comes in', async function () {
+      const messages = await parseBuffers([fullBuffer])
+      const message = messages[0] as any
+      assert.equal(message.fields.length, 5)
+      assert.equal(message.fields[0], null)
+      assert.equal(message.fields[1], 'bang')
+      assert.equal(message.fields[2], 'zug zug')
+      assert.equal(message.fields[3], null)
+      assert.equal(message.fields[4], '!')
+    })
+
+    const testMessageReceivedAfterSplitAt = async function (split: number) {
+      const firstBuffer = Buffer.alloc(fullBuffer.length - split)
+      const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
+      fullBuffer.copy(firstBuffer, 0, 0)
+      fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
+      const messages = await parseBuffers([firstBuffer, secondBuffer])
+      const message = messages[0] as any
+      assert.equal(message.fields.length, 5)
+      assert.equal(message.fields[0], null)
+      assert.equal(message.fields[1], 'bang')
+      assert.equal(message.fields[2], 'zug zug')
+      assert.equal(message.fields[3], null)
+      assert.equal(message.fields[4], '!')
+    }
+
+    it('parses when split in the middle', function () {
+      return testMessageReceivedAfterSplitAt(6)
+    })
+
+    it('parses when split at end', function () {
+      return testMessageReceivedAfterSplitAt(2)
+    })
+
+    it('parses when split at beginning', function () {
+      return Promise.all([
+        testMessageReceivedAfterSplitAt(fullBuffer.length - 2),
+        testMessageReceivedAfterSplitAt(fullBuffer.length - 1),
+        testMessageReceivedAfterSplitAt(fullBuffer.length - 5),
+      ])
+    })
+  })
+
+  describe('split buffer, multiple message parsing', function () {
+    const dataRowBuffer = buffers.dataRow(['!'])
+    const readyForQueryBuffer = buffers.readyForQuery()
+    const fullBuffer = Buffer.alloc(dataRowBuffer.length + readyForQueryBuffer.length)
+    dataRowBuffer.copy(fullBuffer, 0, 0)
+    readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0)
+
+    const verifyMessages = function (messages: any[]) {
+      assert.strictEqual(messages.length, 2)
+      assert.deepEqual(messages[0], {
+        name: 'dataRow',
+        fieldCount: 1,
+        length: 11,
+        fields: ['!'],
+      })
+      assert.equal(messages[0].fields[0], '!')
+      assert.deepEqual(messages[1], {
+        name: 'readyForQuery',
+        length: 5,
+        status: 'I',
+      })
+    }
+    // sanity check
+    it('receives both messages when packet is not split', async function () {
+      const messages = await parseBuffers([fullBuffer])
+      verifyMessages(messages)
+    })
+
+    const splitAndVerifyTwoMessages = async function (split: number) {
+      const firstBuffer = Buffer.alloc(fullBuffer.length - split)
+      const secondBuffer = Buffer.alloc(fullBuffer.length - firstBuffer.length)
+      fullBuffer.copy(firstBuffer, 0, 0)
+      fullBuffer.copy(secondBuffer, 0, firstBuffer.length)
+      const messages = await parseBuffers([firstBuffer, secondBuffer])
+      verifyMessages(messages)
+    }
+
+    describe('receives both messages when packet is split', function () {
+      it('in the middle', function () {
+        return splitAndVerifyTwoMessages(11)
+      })
+      it('at the front', function () {
+        return Promise.all([
+          splitAndVerifyTwoMessages(fullBuffer.length - 1),
+          splitAndVerifyTwoMessages(fullBuffer.length - 4),
+          splitAndVerifyTwoMessages(fullBuffer.length - 6),
+        ])
+      })
+
+      it('at the end', function () {
+        return Promise.all([splitAndVerifyTwoMessages(8), splitAndVerifyTwoMessages(1)])
+      })
+    })
+  })
+})
Index: TruckSimulator-main/node_modules/pg-protocol/src/index.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/index.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,11 @@
+import { DatabaseError } from './messages'
+import { serialize } from './serializer'
+import { Parser, MessageCallback } from './parser'
+
+export function parse(stream: NodeJS.ReadableStream, callback: MessageCallback): Promise<void> {
+  const parser = new Parser()
+  stream.on('data', (buffer: Buffer) => parser.parse(buffer, callback))
+  return new Promise((resolve) => stream.on('end', () => resolve()))
+}
+
+export { serialize, DatabaseError }
Index: TruckSimulator-main/node_modules/pg-protocol/src/messages.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/messages.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/messages.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,262 @@
+export type Mode = 'text' | 'binary'
+
+export type MessageName =
+  | 'parseComplete'
+  | 'bindComplete'
+  | 'closeComplete'
+  | 'noData'
+  | 'portalSuspended'
+  | 'replicationStart'
+  | 'emptyQuery'
+  | 'copyDone'
+  | 'copyData'
+  | 'rowDescription'
+  | 'parameterDescription'
+  | 'parameterStatus'
+  | 'backendKeyData'
+  | 'notification'
+  | 'readyForQuery'
+  | 'commandComplete'
+  | 'dataRow'
+  | 'copyInResponse'
+  | 'copyOutResponse'
+  | 'authenticationOk'
+  | 'authenticationMD5Password'
+  | 'authenticationCleartextPassword'
+  | 'authenticationSASL'
+  | 'authenticationSASLContinue'
+  | 'authenticationSASLFinal'
+  | 'error'
+  | 'notice'
+
+export interface BackendMessage {
+  name: MessageName
+  length: number
+}
+
+export const parseComplete: BackendMessage = {
+  name: 'parseComplete',
+  length: 5,
+}
+
+export const bindComplete: BackendMessage = {
+  name: 'bindComplete',
+  length: 5,
+}
+
+export const closeComplete: BackendMessage = {
+  name: 'closeComplete',
+  length: 5,
+}
+
+export const noData: BackendMessage = {
+  name: 'noData',
+  length: 5,
+}
+
+export const portalSuspended: BackendMessage = {
+  name: 'portalSuspended',
+  length: 5,
+}
+
+export const replicationStart: BackendMessage = {
+  name: 'replicationStart',
+  length: 4,
+}
+
+export const emptyQuery: BackendMessage = {
+  name: 'emptyQuery',
+  length: 4,
+}
+
+export const copyDone: BackendMessage = {
+  name: 'copyDone',
+  length: 4,
+}
+
+interface NoticeOrError {
+  message: string | undefined
+  severity: string | undefined
+  code: string | undefined
+  detail: string | undefined
+  hint: string | undefined
+  position: string | undefined
+  internalPosition: string | undefined
+  internalQuery: string | undefined
+  where: string | undefined
+  schema: string | undefined
+  table: string | undefined
+  column: string | undefined
+  dataType: string | undefined
+  constraint: string | undefined
+  file: string | undefined
+  line: string | undefined
+  routine: string | undefined
+}
+
+export class DatabaseError extends Error implements NoticeOrError {
+  public severity: string | undefined
+  public code: string | undefined
+  public detail: string | undefined
+  public hint: string | undefined
+  public position: string | undefined
+  public internalPosition: string | undefined
+  public internalQuery: string | undefined
+  public where: string | undefined
+  public schema: string | undefined
+  public table: string | undefined
+  public column: string | undefined
+  public dataType: string | undefined
+  public constraint: string | undefined
+  public file: string | undefined
+  public line: string | undefined
+  public routine: string | undefined
+  constructor(
+    message: string,
+    public readonly length: number,
+    public readonly name: MessageName
+  ) {
+    super(message)
+  }
+}
+
+export class CopyDataMessage {
+  public readonly name = 'copyData'
+  constructor(
+    public readonly length: number,
+    public readonly chunk: Buffer
+  ) {}
+}
+
+export class CopyResponse {
+  public readonly columnTypes: number[]
+  constructor(
+    public readonly length: number,
+    public readonly name: MessageName,
+    public readonly binary: boolean,
+    columnCount: number
+  ) {
+    this.columnTypes = new Array(columnCount)
+  }
+}
+
+export class Field {
+  constructor(
+    public readonly name: string,
+    public readonly tableID: number,
+    public readonly columnID: number,
+    public readonly dataTypeID: number,
+    public readonly dataTypeSize: number,
+    public readonly dataTypeModifier: number,
+    public readonly format: Mode
+  ) {}
+}
+
+export class RowDescriptionMessage {
+  public readonly name: MessageName = 'rowDescription'
+  public readonly fields: Field[]
+  constructor(
+    public readonly length: number,
+    public readonly fieldCount: number
+  ) {
+    this.fields = new Array(this.fieldCount)
+  }
+}
+
+export class ParameterDescriptionMessage {
+  public readonly name: MessageName = 'parameterDescription'
+  public readonly dataTypeIDs: number[]
+  constructor(
+    public readonly length: number,
+    public readonly parameterCount: number
+  ) {
+    this.dataTypeIDs = new Array(this.parameterCount)
+  }
+}
+
+export class ParameterStatusMessage {
+  public readonly name: MessageName = 'parameterStatus'
+  constructor(
+    public readonly length: number,
+    public readonly parameterName: string,
+    public readonly parameterValue: string
+  ) {}
+}
+
+export class AuthenticationMD5Password implements BackendMessage {
+  public readonly name: MessageName = 'authenticationMD5Password'
+  constructor(
+    public readonly length: number,
+    public readonly salt: Buffer
+  ) {}
+}
+
+export class BackendKeyDataMessage {
+  public readonly name: MessageName = 'backendKeyData'
+  constructor(
+    public readonly length: number,
+    public readonly processID: number,
+    public readonly secretKey: number
+  ) {}
+}
+
+export class NotificationResponseMessage {
+  public readonly name: MessageName = 'notification'
+  constructor(
+    public readonly length: number,
+    public readonly processId: number,
+    public readonly channel: string,
+    public readonly payload: string
+  ) {}
+}
+
+export class ReadyForQueryMessage {
+  public readonly name: MessageName = 'readyForQuery'
+  constructor(
+    public readonly length: number,
+    public readonly status: string
+  ) {}
+}
+
+export class CommandCompleteMessage {
+  public readonly name: MessageName = 'commandComplete'
+  constructor(
+    public readonly length: number,
+    public readonly text: string
+  ) {}
+}
+
+export class DataRowMessage {
+  public readonly fieldCount: number
+  public readonly name: MessageName = 'dataRow'
+  constructor(
+    public length: number,
+    public fields: any[]
+  ) {
+    this.fieldCount = fields.length
+  }
+}
+
+export class NoticeMessage implements BackendMessage, NoticeOrError {
+  constructor(
+    public readonly length: number,
+    public readonly message: string | undefined
+  ) {}
+  public readonly name = 'notice'
+  public severity: string | undefined
+  public code: string | undefined
+  public detail: string | undefined
+  public hint: string | undefined
+  public position: string | undefined
+  public internalPosition: string | undefined
+  public internalQuery: string | undefined
+  public where: string | undefined
+  public schema: string | undefined
+  public table: string | undefined
+  public column: string | undefined
+  public dataType: string | undefined
+  public constraint: string | undefined
+  public file: string | undefined
+  public line: string | undefined
+  public routine: string | undefined
+}
Index: TruckSimulator-main/node_modules/pg-protocol/src/outbound-serializer.test.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/outbound-serializer.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/outbound-serializer.test.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,276 @@
+import assert from 'assert'
+import { serialize } from './serializer'
+import BufferList from './testing/buffer-list'
+
+describe('serializer', () => {
+  it('builds startup message', function () {
+    const actual = serialize.startup({
+      user: 'brian',
+      database: 'bang',
+    })
+    assert.deepEqual(
+      actual,
+      new BufferList()
+        .addInt16(3)
+        .addInt16(0)
+        .addCString('user')
+        .addCString('brian')
+        .addCString('database')
+        .addCString('bang')
+        .addCString('client_encoding')
+        .addCString('UTF8')
+        .addCString('')
+        .join(true)
+    )
+  })
+
+  it('builds password message', function () {
+    const actual = serialize.password('!')
+    assert.deepEqual(actual, new BufferList().addCString('!').join(true, 'p'))
+  })
+
+  it('builds request ssl message', function () {
+    const actual = serialize.requestSsl()
+    const expected = new BufferList().addInt32(80877103).join(true)
+    assert.deepEqual(actual, expected)
+  })
+
+  it('builds SASLInitialResponseMessage message', function () {
+    const actual = serialize.sendSASLInitialResponseMessage('mech', 'data')
+    assert.deepEqual(actual, new BufferList().addCString('mech').addInt32(4).addString('data').join(true, 'p'))
+  })
+
+  it('builds SCRAMClientFinalMessage message', function () {
+    const actual = serialize.sendSCRAMClientFinalMessage('data')
+    assert.deepEqual(actual, new BufferList().addString('data').join(true, 'p'))
+  })
+
+  it('builds query message', function () {
+    const txt = 'select * from boom'
+    const actual = serialize.query(txt)
+    assert.deepEqual(actual, new BufferList().addCString(txt).join(true, 'Q'))
+  })
+
+  describe('parse message', () => {
+    it('builds parse message', function () {
+      const actual = serialize.parse({ text: '!' })
+      const expected = new BufferList().addCString('').addCString('!').addInt16(0).join(true, 'P')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('builds parse message with named query', function () {
+      const actual = serialize.parse({
+        name: 'boom',
+        text: 'select * from boom',
+        types: [],
+      })
+      const expected = new BufferList().addCString('boom').addCString('select * from boom').addInt16(0).join(true, 'P')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('with multiple parameters', function () {
+      const actual = serialize.parse({
+        name: 'force',
+        text: 'select * from bang where name = $1',
+        types: [1, 2, 3, 4],
+      })
+      const expected = new BufferList()
+        .addCString('force')
+        .addCString('select * from bang where name = $1')
+        .addInt16(4)
+        .addInt32(1)
+        .addInt32(2)
+        .addInt32(3)
+        .addInt32(4)
+        .join(true, 'P')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  describe('bind messages', function () {
+    it('with no values', function () {
+      const actual = serialize.bind()
+
+      const expectedBuffer = new BufferList()
+        .addCString('')
+        .addCString('')
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(1)
+        .addInt16(0)
+        .join(true, 'B')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+
+    it('with named statement, portal, and values', function () {
+      const actual = serialize.bind({
+        portal: 'bang',
+        statement: 'woo',
+        values: ['1', 'hi', null, 'zing'],
+      })
+      const expectedBuffer = new BufferList()
+        .addCString('bang') // portal name
+        .addCString('woo') // statement name
+        .addInt16(4)
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(0)
+        .addInt16(4)
+        .addInt32(1)
+        .add(Buffer.from('1'))
+        .addInt32(2)
+        .add(Buffer.from('hi'))
+        .addInt32(-1)
+        .addInt32(4)
+        .add(Buffer.from('zing'))
+        .addInt16(1)
+        .addInt16(0)
+        .join(true, 'B')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+  })
+
+  it('with custom valueMapper', function () {
+    const actual = serialize.bind({
+      portal: 'bang',
+      statement: 'woo',
+      values: ['1', 'hi', null, 'zing'],
+      valueMapper: () => null,
+    })
+    const expectedBuffer = new BufferList()
+      .addCString('bang') // portal name
+      .addCString('woo') // statement name
+      .addInt16(4)
+      .addInt16(0)
+      .addInt16(0)
+      .addInt16(0)
+      .addInt16(0)
+      .addInt16(4)
+      .addInt32(-1)
+      .addInt32(-1)
+      .addInt32(-1)
+      .addInt32(-1)
+      .addInt16(1)
+      .addInt16(0)
+      .join(true, 'B')
+    assert.deepEqual(actual, expectedBuffer)
+  })
+
+  it('with named statement, portal, and buffer value', function () {
+    const actual = serialize.bind({
+      portal: 'bang',
+      statement: 'woo',
+      values: ['1', 'hi', null, Buffer.from('zing', 'utf8')],
+    })
+    const expectedBuffer = new BufferList()
+      .addCString('bang') // portal name
+      .addCString('woo') // statement name
+      .addInt16(4) // value count
+      .addInt16(0) // string
+      .addInt16(0) // string
+      .addInt16(0) // string
+      .addInt16(1) // binary
+      .addInt16(4)
+      .addInt32(1)
+      .add(Buffer.from('1'))
+      .addInt32(2)
+      .add(Buffer.from('hi'))
+      .addInt32(-1)
+      .addInt32(4)
+      .add(Buffer.from('zing', 'utf-8'))
+      .addInt16(1)
+      .addInt16(0)
+      .join(true, 'B')
+    assert.deepEqual(actual, expectedBuffer)
+  })
+
+  describe('builds execute message', function () {
+    it('for unamed portal with no row limit', function () {
+      const actual = serialize.execute()
+      const expectedBuffer = new BufferList().addCString('').addInt32(0).join(true, 'E')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+
+    it('for named portal with row limit', function () {
+      const actual = serialize.execute({
+        portal: 'my favorite portal',
+        rows: 100,
+      })
+      const expectedBuffer = new BufferList().addCString('my favorite portal').addInt32(100).join(true, 'E')
+      assert.deepEqual(actual, expectedBuffer)
+    })
+  })
+
+  it('builds flush command', function () {
+    const actual = serialize.flush()
+    const expected = new BufferList().join(true, 'H')
+    assert.deepEqual(actual, expected)
+  })
+
+  it('builds sync command', function () {
+    const actual = serialize.sync()
+    const expected = new BufferList().join(true, 'S')
+    assert.deepEqual(actual, expected)
+  })
+
+  it('builds end command', function () {
+    const actual = serialize.end()
+    const expected = Buffer.from([0x58, 0, 0, 0, 4])
+    assert.deepEqual(actual, expected)
+  })
+
+  describe('builds describe command', function () {
+    it('describe statement', function () {
+      const actual = serialize.describe({ type: 'S', name: 'bang' })
+      const expected = new BufferList().addChar('S').addCString('bang').join(true, 'D')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('describe unnamed portal', function () {
+      const actual = serialize.describe({ type: 'P' })
+      const expected = new BufferList().addChar('P').addCString('').join(true, 'D')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  describe('builds close command', function () {
+    it('describe statement', function () {
+      const actual = serialize.close({ type: 'S', name: 'bang' })
+      const expected = new BufferList().addChar('S').addCString('bang').join(true, 'C')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('describe unnamed portal', function () {
+      const actual = serialize.close({ type: 'P' })
+      const expected = new BufferList().addChar('P').addCString('').join(true, 'C')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  describe('copy messages', function () {
+    it('builds copyFromChunk', () => {
+      const actual = serialize.copyData(Buffer.from([1, 2, 3]))
+      const expected = new BufferList().add(Buffer.from([1, 2, 3])).join(true, 'd')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('builds copy fail', () => {
+      const actual = serialize.copyFail('err!')
+      const expected = new BufferList().addCString('err!').join(true, 'f')
+      assert.deepEqual(actual, expected)
+    })
+
+    it('builds copy done', () => {
+      const actual = serialize.copyDone()
+      const expected = new BufferList().join(true, 'c')
+      assert.deepEqual(actual, expected)
+    })
+  })
+
+  it('builds cancel message', () => {
+    const actual = serialize.cancel(3, 4)
+    const expected = new BufferList().addInt16(1234).addInt16(5678).addInt32(3).addInt32(4).join(true)
+    assert.deepEqual(actual, expected)
+  })
+})
Index: TruckSimulator-main/node_modules/pg-protocol/src/parser.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/parser.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/parser.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,389 @@
+import { TransformOptions } from 'stream'
+import {
+  Mode,
+  bindComplete,
+  parseComplete,
+  closeComplete,
+  noData,
+  portalSuspended,
+  copyDone,
+  replicationStart,
+  emptyQuery,
+  ReadyForQueryMessage,
+  CommandCompleteMessage,
+  CopyDataMessage,
+  CopyResponse,
+  NotificationResponseMessage,
+  RowDescriptionMessage,
+  ParameterDescriptionMessage,
+  Field,
+  DataRowMessage,
+  ParameterStatusMessage,
+  BackendKeyDataMessage,
+  DatabaseError,
+  BackendMessage,
+  MessageName,
+  AuthenticationMD5Password,
+  NoticeMessage,
+} from './messages'
+import { BufferReader } from './buffer-reader'
+
+// every message is prefixed with a single bye
+const CODE_LENGTH = 1
+// every message has an int32 length which includes itself but does
+// NOT include the code in the length
+const LEN_LENGTH = 4
+
+const HEADER_LENGTH = CODE_LENGTH + LEN_LENGTH
+
+export type Packet = {
+  code: number
+  packet: Buffer
+}
+
+const emptyBuffer = Buffer.allocUnsafe(0)
+
+type StreamOptions = TransformOptions & {
+  mode: Mode
+}
+
+const enum MessageCodes {
+  DataRow = 0x44, // D
+  ParseComplete = 0x31, // 1
+  BindComplete = 0x32, // 2
+  CloseComplete = 0x33, // 3
+  CommandComplete = 0x43, // C
+  ReadyForQuery = 0x5a, // Z
+  NoData = 0x6e, // n
+  NotificationResponse = 0x41, // A
+  AuthenticationResponse = 0x52, // R
+  ParameterStatus = 0x53, // S
+  BackendKeyData = 0x4b, // K
+  ErrorMessage = 0x45, // E
+  NoticeMessage = 0x4e, // N
+  RowDescriptionMessage = 0x54, // T
+  ParameterDescriptionMessage = 0x74, // t
+  PortalSuspended = 0x73, // s
+  ReplicationStart = 0x57, // W
+  EmptyQuery = 0x49, // I
+  CopyIn = 0x47, // G
+  CopyOut = 0x48, // H
+  CopyDone = 0x63, // c
+  CopyData = 0x64, // d
+}
+
+export type MessageCallback = (msg: BackendMessage) => void
+
+export class Parser {
+  private buffer: Buffer = emptyBuffer
+  private bufferLength: number = 0
+  private bufferOffset: number = 0
+  private reader = new BufferReader()
+  private mode: Mode
+
+  constructor(opts?: StreamOptions) {
+    if (opts?.mode === 'binary') {
+      throw new Error('Binary mode not supported yet')
+    }
+    this.mode = opts?.mode || 'text'
+  }
+
+  public parse(buffer: Buffer, callback: MessageCallback) {
+    this.mergeBuffer(buffer)
+    const bufferFullLength = this.bufferOffset + this.bufferLength
+    let offset = this.bufferOffset
+    while (offset + HEADER_LENGTH <= bufferFullLength) {
+      // code is 1 byte long - it identifies the message type
+      const code = this.buffer[offset]
+      // length is 1 Uint32BE - it is the length of the message EXCLUDING the code
+      const length = this.buffer.readUInt32BE(offset + CODE_LENGTH)
+      const fullMessageLength = CODE_LENGTH + length
+      if (fullMessageLength + offset <= bufferFullLength) {
+        const message = this.handlePacket(offset + HEADER_LENGTH, code, length, this.buffer)
+        callback(message)
+        offset += fullMessageLength
+      } else {
+        break
+      }
+    }
+    if (offset === bufferFullLength) {
+      // No more use for the buffer
+      this.buffer = emptyBuffer
+      this.bufferLength = 0
+      this.bufferOffset = 0
+    } else {
+      // Adjust the cursors of remainingBuffer
+      this.bufferLength = bufferFullLength - offset
+      this.bufferOffset = offset
+    }
+  }
+
+  private mergeBuffer(buffer: Buffer): void {
+    if (this.bufferLength > 0) {
+      const newLength = this.bufferLength + buffer.byteLength
+      const newFullLength = newLength + this.bufferOffset
+      if (newFullLength > this.buffer.byteLength) {
+        // We can't concat the new buffer with the remaining one
+        let newBuffer: Buffer
+        if (newLength <= this.buffer.byteLength && this.bufferOffset >= this.bufferLength) {
+          // We can move the relevant part to the beginning of the buffer instead of allocating a new buffer
+          newBuffer = this.buffer
+        } else {
+          // Allocate a new larger buffer
+          let newBufferLength = this.buffer.byteLength * 2
+          while (newLength >= newBufferLength) {
+            newBufferLength *= 2
+          }
+          newBuffer = Buffer.allocUnsafe(newBufferLength)
+        }
+        // Move the remaining buffer to the new one
+        this.buffer.copy(newBuffer, 0, this.bufferOffset, this.bufferOffset + this.bufferLength)
+        this.buffer = newBuffer
+        this.bufferOffset = 0
+      }
+      // Concat the new buffer with the remaining one
+      buffer.copy(this.buffer, this.bufferOffset + this.bufferLength)
+      this.bufferLength = newLength
+    } else {
+      this.buffer = buffer
+      this.bufferOffset = 0
+      this.bufferLength = buffer.byteLength
+    }
+  }
+
+  private handlePacket(offset: number, code: number, length: number, bytes: Buffer): BackendMessage {
+    switch (code) {
+      case MessageCodes.BindComplete:
+        return bindComplete
+      case MessageCodes.ParseComplete:
+        return parseComplete
+      case MessageCodes.CloseComplete:
+        return closeComplete
+      case MessageCodes.NoData:
+        return noData
+      case MessageCodes.PortalSuspended:
+        return portalSuspended
+      case MessageCodes.CopyDone:
+        return copyDone
+      case MessageCodes.ReplicationStart:
+        return replicationStart
+      case MessageCodes.EmptyQuery:
+        return emptyQuery
+      case MessageCodes.DataRow:
+        return this.parseDataRowMessage(offset, length, bytes)
+      case MessageCodes.CommandComplete:
+        return this.parseCommandCompleteMessage(offset, length, bytes)
+      case MessageCodes.ReadyForQuery:
+        return this.parseReadyForQueryMessage(offset, length, bytes)
+      case MessageCodes.NotificationResponse:
+        return this.parseNotificationMessage(offset, length, bytes)
+      case MessageCodes.AuthenticationResponse:
+        return this.parseAuthenticationResponse(offset, length, bytes)
+      case MessageCodes.ParameterStatus:
+        return this.parseParameterStatusMessage(offset, length, bytes)
+      case MessageCodes.BackendKeyData:
+        return this.parseBackendKeyData(offset, length, bytes)
+      case MessageCodes.ErrorMessage:
+        return this.parseErrorMessage(offset, length, bytes, 'error')
+      case MessageCodes.NoticeMessage:
+        return this.parseErrorMessage(offset, length, bytes, 'notice')
+      case MessageCodes.RowDescriptionMessage:
+        return this.parseRowDescriptionMessage(offset, length, bytes)
+      case MessageCodes.ParameterDescriptionMessage:
+        return this.parseParameterDescriptionMessage(offset, length, bytes)
+      case MessageCodes.CopyIn:
+        return this.parseCopyInMessage(offset, length, bytes)
+      case MessageCodes.CopyOut:
+        return this.parseCopyOutMessage(offset, length, bytes)
+      case MessageCodes.CopyData:
+        return this.parseCopyData(offset, length, bytes)
+      default:
+        return new DatabaseError('received invalid response: ' + code.toString(16), length, 'error')
+    }
+  }
+
+  private parseReadyForQueryMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const status = this.reader.string(1)
+    return new ReadyForQueryMessage(length, status)
+  }
+
+  private parseCommandCompleteMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const text = this.reader.cstring()
+    return new CommandCompleteMessage(length, text)
+  }
+
+  private parseCopyData(offset: number, length: number, bytes: Buffer) {
+    const chunk = bytes.slice(offset, offset + (length - 4))
+    return new CopyDataMessage(length, chunk)
+  }
+
+  private parseCopyInMessage(offset: number, length: number, bytes: Buffer) {
+    return this.parseCopyMessage(offset, length, bytes, 'copyInResponse')
+  }
+
+  private parseCopyOutMessage(offset: number, length: number, bytes: Buffer) {
+    return this.parseCopyMessage(offset, length, bytes, 'copyOutResponse')
+  }
+
+  private parseCopyMessage(offset: number, length: number, bytes: Buffer, messageName: MessageName) {
+    this.reader.setBuffer(offset, bytes)
+    const isBinary = this.reader.byte() !== 0
+    const columnCount = this.reader.int16()
+    const message = new CopyResponse(length, messageName, isBinary, columnCount)
+    for (let i = 0; i < columnCount; i++) {
+      message.columnTypes[i] = this.reader.int16()
+    }
+    return message
+  }
+
+  private parseNotificationMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const processId = this.reader.int32()
+    const channel = this.reader.cstring()
+    const payload = this.reader.cstring()
+    return new NotificationResponseMessage(length, processId, channel, payload)
+  }
+
+  private parseRowDescriptionMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const fieldCount = this.reader.int16()
+    const message = new RowDescriptionMessage(length, fieldCount)
+    for (let i = 0; i < fieldCount; i++) {
+      message.fields[i] = this.parseField()
+    }
+    return message
+  }
+
+  private parseField(): Field {
+    const name = this.reader.cstring()
+    const tableID = this.reader.uint32()
+    const columnID = this.reader.int16()
+    const dataTypeID = this.reader.uint32()
+    const dataTypeSize = this.reader.int16()
+    const dataTypeModifier = this.reader.int32()
+    const mode = this.reader.int16() === 0 ? 'text' : 'binary'
+    return new Field(name, tableID, columnID, dataTypeID, dataTypeSize, dataTypeModifier, mode)
+  }
+
+  private parseParameterDescriptionMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const parameterCount = this.reader.int16()
+    const message = new ParameterDescriptionMessage(length, parameterCount)
+    for (let i = 0; i < parameterCount; i++) {
+      message.dataTypeIDs[i] = this.reader.int32()
+    }
+    return message
+  }
+
+  private parseDataRowMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const fieldCount = this.reader.int16()
+    const fields: any[] = new Array(fieldCount)
+    for (let i = 0; i < fieldCount; i++) {
+      const len = this.reader.int32()
+      // a -1 for length means the value of the field is null
+      fields[i] = len === -1 ? null : this.reader.string(len)
+    }
+    return new DataRowMessage(length, fields)
+  }
+
+  private parseParameterStatusMessage(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const name = this.reader.cstring()
+    const value = this.reader.cstring()
+    return new ParameterStatusMessage(length, name, value)
+  }
+
+  private parseBackendKeyData(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const processID = this.reader.int32()
+    const secretKey = this.reader.int32()
+    return new BackendKeyDataMessage(length, processID, secretKey)
+  }
+
+  public parseAuthenticationResponse(offset: number, length: number, bytes: Buffer) {
+    this.reader.setBuffer(offset, bytes)
+    const code = this.reader.int32()
+    // TODO(bmc): maybe better types here
+    const message: BackendMessage & any = {
+      name: 'authenticationOk',
+      length,
+    }
+
+    switch (code) {
+      case 0: // AuthenticationOk
+        break
+      case 3: // AuthenticationCleartextPassword
+        if (message.length === 8) {
+          message.name = 'authenticationCleartextPassword'
+        }
+        break
+      case 5: // AuthenticationMD5Password
+        if (message.length === 12) {
+          message.name = 'authenticationMD5Password'
+          const salt = this.reader.bytes(4)
+          return new AuthenticationMD5Password(length, salt)
+        }
+        break
+      case 10: // AuthenticationSASL
+        {
+          message.name = 'authenticationSASL'
+          message.mechanisms = []
+          let mechanism: string
+          do {
+            mechanism = this.reader.cstring()
+            if (mechanism) {
+              message.mechanisms.push(mechanism)
+            }
+          } while (mechanism)
+        }
+        break
+      case 11: // AuthenticationSASLContinue
+        message.name = 'authenticationSASLContinue'
+        message.data = this.reader.string(length - 8)
+        break
+      case 12: // AuthenticationSASLFinal
+        message.name = 'authenticationSASLFinal'
+        message.data = this.reader.string(length - 8)
+        break
+      default:
+        throw new Error('Unknown authenticationOk message type ' + code)
+    }
+    return message
+  }
+
+  private parseErrorMessage(offset: number, length: number, bytes: Buffer, name: MessageName) {
+    this.reader.setBuffer(offset, bytes)
+    const fields: Record<string, string> = {}
+    let fieldType = this.reader.string(1)
+    while (fieldType !== '\0') {
+      fields[fieldType] = this.reader.cstring()
+      fieldType = this.reader.string(1)
+    }
+
+    const messageValue = fields.M
+
+    const message =
+      name === 'notice' ? new NoticeMessage(length, messageValue) : new DatabaseError(messageValue, length, name)
+
+    message.severity = fields.S
+    message.code = fields.C
+    message.detail = fields.D
+    message.hint = fields.H
+    message.position = fields.P
+    message.internalPosition = fields.p
+    message.internalQuery = fields.q
+    message.where = fields.W
+    message.schema = fields.s
+    message.table = fields.t
+    message.column = fields.c
+    message.dataType = fields.d
+    message.constraint = fields.n
+    message.file = fields.F
+    message.line = fields.L
+    message.routine = fields.R
+    return message
+  }
+}
Index: TruckSimulator-main/node_modules/pg-protocol/src/serializer.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/serializer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/serializer.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,274 @@
+import { Writer } from './buffer-writer'
+
+const enum code {
+  startup = 0x70,
+  query = 0x51,
+  parse = 0x50,
+  bind = 0x42,
+  execute = 0x45,
+  flush = 0x48,
+  sync = 0x53,
+  end = 0x58,
+  close = 0x43,
+  describe = 0x44,
+  copyFromChunk = 0x64,
+  copyDone = 0x63,
+  copyFail = 0x66,
+}
+
+const writer = new Writer()
+
+const startup = (opts: Record<string, string>): Buffer => {
+  // protocol version
+  writer.addInt16(3).addInt16(0)
+  for (const key of Object.keys(opts)) {
+    writer.addCString(key).addCString(opts[key])
+  }
+
+  writer.addCString('client_encoding').addCString('UTF8')
+
+  const bodyBuffer = writer.addCString('').flush()
+  // this message is sent without a code
+
+  const length = bodyBuffer.length + 4
+
+  return new Writer().addInt32(length).add(bodyBuffer).flush()
+}
+
+const requestSsl = (): Buffer => {
+  const response = Buffer.allocUnsafe(8)
+  response.writeInt32BE(8, 0)
+  response.writeInt32BE(80877103, 4)
+  return response
+}
+
+const password = (password: string): Buffer => {
+  return writer.addCString(password).flush(code.startup)
+}
+
+const sendSASLInitialResponseMessage = function (mechanism: string, initialResponse: string): Buffer {
+  // 0x70 = 'p'
+  writer.addCString(mechanism).addInt32(Buffer.byteLength(initialResponse)).addString(initialResponse)
+
+  return writer.flush(code.startup)
+}
+
+const sendSCRAMClientFinalMessage = function (additionalData: string): Buffer {
+  return writer.addString(additionalData).flush(code.startup)
+}
+
+const query = (text: string): Buffer => {
+  return writer.addCString(text).flush(code.query)
+}
+
+type ParseOpts = {
+  name?: string
+  types?: number[]
+  text: string
+}
+
+const emptyArray: any[] = []
+
+const parse = (query: ParseOpts): Buffer => {
+  // expect something like this:
+  // { name: 'queryName',
+  //   text: 'select * from blah',
+  //   types: ['int8', 'bool'] }
+
+  // normalize missing query names to allow for null
+  const name = query.name || ''
+  if (name.length > 63) {
+    console.error('Warning! Postgres only supports 63 characters for query names.')
+    console.error('You supplied %s (%s)', name, name.length)
+    console.error('This can cause conflicts and silent errors executing queries')
+  }
+
+  const types = query.types || emptyArray
+
+  const len = types.length
+
+  const buffer = writer
+    .addCString(name) // name of query
+    .addCString(query.text) // actual query text
+    .addInt16(len)
+
+  for (let i = 0; i < len; i++) {
+    buffer.addInt32(types[i])
+  }
+
+  return writer.flush(code.parse)
+}
+
+type ValueMapper = (param: any, index: number) => any
+
+type BindOpts = {
+  portal?: string
+  binary?: boolean
+  statement?: string
+  values?: any[]
+  // optional map from JS value to postgres value per parameter
+  valueMapper?: ValueMapper
+}
+
+const paramWriter = new Writer()
+
+// make this a const enum so typescript will inline the value
+const enum ParamType {
+  STRING = 0,
+  BINARY = 1,
+}
+
+const writeValues = function (values: any[], valueMapper?: ValueMapper): void {
+  for (let i = 0; i < values.length; i++) {
+    const mappedVal = valueMapper ? valueMapper(values[i], i) : values[i]
+    if (mappedVal == null) {
+      // add the param type (string) to the writer
+      writer.addInt16(ParamType.STRING)
+      // write -1 to the param writer to indicate null
+      paramWriter.addInt32(-1)
+    } else if (mappedVal instanceof Buffer) {
+      // add the param type (binary) to the writer
+      writer.addInt16(ParamType.BINARY)
+      // add the buffer to the param writer
+      paramWriter.addInt32(mappedVal.length)
+      paramWriter.add(mappedVal)
+    } else {
+      // add the param type (string) to the writer
+      writer.addInt16(ParamType.STRING)
+      paramWriter.addInt32(Buffer.byteLength(mappedVal))
+      paramWriter.addString(mappedVal)
+    }
+  }
+}
+
+const bind = (config: BindOpts = {}): Buffer => {
+  // normalize config
+  const portal = config.portal || ''
+  const statement = config.statement || ''
+  const binary = config.binary || false
+  const values = config.values || emptyArray
+  const len = values.length
+
+  writer.addCString(portal).addCString(statement)
+  writer.addInt16(len)
+
+  writeValues(values, config.valueMapper)
+
+  writer.addInt16(len)
+  writer.add(paramWriter.flush())
+
+  // all results use the same format code
+  writer.addInt16(1)
+  // format code
+  writer.addInt16(binary ? ParamType.BINARY : ParamType.STRING)
+  return writer.flush(code.bind)
+}
+
+type ExecOpts = {
+  portal?: string
+  rows?: number
+}
+
+const emptyExecute = Buffer.from([code.execute, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00])
+
+const execute = (config?: ExecOpts): Buffer => {
+  // this is the happy path for most queries
+  if (!config || (!config.portal && !config.rows)) {
+    return emptyExecute
+  }
+
+  const portal = config.portal || ''
+  const rows = config.rows || 0
+
+  const portalLength = Buffer.byteLength(portal)
+  const len = 4 + portalLength + 1 + 4
+  // one extra bit for code
+  const buff = Buffer.allocUnsafe(1 + len)
+  buff[0] = code.execute
+  buff.writeInt32BE(len, 1)
+  buff.write(portal, 5, 'utf-8')
+  buff[portalLength + 5] = 0 // null terminate portal cString
+  buff.writeUInt32BE(rows, buff.length - 4)
+  return buff
+}
+
+const cancel = (processID: number, secretKey: number): Buffer => {
+  const buffer = Buffer.allocUnsafe(16)
+  buffer.writeInt32BE(16, 0)
+  buffer.writeInt16BE(1234, 4)
+  buffer.writeInt16BE(5678, 6)
+  buffer.writeInt32BE(processID, 8)
+  buffer.writeInt32BE(secretKey, 12)
+  return buffer
+}
+
+type PortalOpts = {
+  type: 'S' | 'P'
+  name?: string
+}
+
+const cstringMessage = (code: code, string: string): Buffer => {
+  const stringLen = Buffer.byteLength(string)
+  const len = 4 + stringLen + 1
+  // one extra bit for code
+  const buffer = Buffer.allocUnsafe(1 + len)
+  buffer[0] = code
+  buffer.writeInt32BE(len, 1)
+  buffer.write(string, 5, 'utf-8')
+  buffer[len] = 0 // null terminate cString
+  return buffer
+}
+
+const emptyDescribePortal = writer.addCString('P').flush(code.describe)
+const emptyDescribeStatement = writer.addCString('S').flush(code.describe)
+
+const describe = (msg: PortalOpts): Buffer => {
+  return msg.name
+    ? cstringMessage(code.describe, `${msg.type}${msg.name || ''}`)
+    : msg.type === 'P'
+    ? emptyDescribePortal
+    : emptyDescribeStatement
+}
+
+const close = (msg: PortalOpts): Buffer => {
+  const text = `${msg.type}${msg.name || ''}`
+  return cstringMessage(code.close, text)
+}
+
+const copyData = (chunk: Buffer): Buffer => {
+  return writer.add(chunk).flush(code.copyFromChunk)
+}
+
+const copyFail = (message: string): Buffer => {
+  return cstringMessage(code.copyFail, message)
+}
+
+const codeOnlyBuffer = (code: code): Buffer => Buffer.from([code, 0x00, 0x00, 0x00, 0x04])
+
+const flushBuffer = codeOnlyBuffer(code.flush)
+const syncBuffer = codeOnlyBuffer(code.sync)
+const endBuffer = codeOnlyBuffer(code.end)
+const copyDoneBuffer = codeOnlyBuffer(code.copyDone)
+
+const serialize = {
+  startup,
+  password,
+  requestSsl,
+  sendSASLInitialResponseMessage,
+  sendSCRAMClientFinalMessage,
+  query,
+  parse,
+  bind,
+  execute,
+  describe,
+  close,
+  flush: () => flushBuffer,
+  sync: () => syncBuffer,
+  end: () => endBuffer,
+  copyData,
+  copyDone: () => copyDoneBuffer,
+  copyFail,
+  cancel,
+}
+
+export { serialize }
Index: TruckSimulator-main/node_modules/pg-protocol/src/testing/buffer-list.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/testing/buffer-list.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/testing/buffer-list.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,67 @@
+export default class BufferList {
+  constructor(public buffers: Buffer[] = []) {}
+
+  public add(buffer: Buffer, front?: boolean) {
+    this.buffers[front ? 'unshift' : 'push'](buffer)
+    return this
+  }
+
+  public addInt16(val: number, front?: boolean) {
+    return this.add(Buffer.from([val >>> 8, val >>> 0]), front)
+  }
+
+  public getByteLength() {
+    return this.buffers.reduce(function (previous, current) {
+      return previous + current.length
+    }, 0)
+  }
+
+  public addInt32(val: number, first?: boolean) {
+    return this.add(
+      Buffer.from([(val >>> 24) & 0xff, (val >>> 16) & 0xff, (val >>> 8) & 0xff, (val >>> 0) & 0xff]),
+      first
+    )
+  }
+
+  public addCString(val: string, front?: boolean) {
+    const len = Buffer.byteLength(val)
+    const buffer = Buffer.alloc(len + 1)
+    buffer.write(val)
+    buffer[len] = 0
+    return this.add(buffer, front)
+  }
+
+  public addString(val: string, front?: boolean) {
+    const len = Buffer.byteLength(val)
+    const buffer = Buffer.alloc(len)
+    buffer.write(val)
+    return this.add(buffer, front)
+  }
+
+  public addChar(char: string, first?: boolean) {
+    return this.add(Buffer.from(char, 'utf8'), first)
+  }
+
+  public addByte(byte: number) {
+    return this.add(Buffer.from([byte]))
+  }
+
+  public join(appendLength?: boolean, char?: string): Buffer {
+    let length = this.getByteLength()
+    if (appendLength) {
+      this.addInt32(length + 4, true)
+      return this.join(false, char)
+    }
+    if (char) {
+      this.addChar(char, true)
+      length++
+    }
+    const result = Buffer.alloc(length)
+    let index = 0
+    this.buffers.forEach(function (buffer) {
+      buffer.copy(result, index, 0)
+      index += buffer.length
+    })
+    return result
+  }
+}
Index: TruckSimulator-main/node_modules/pg-protocol/src/testing/test-buffers.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/testing/test-buffers.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/testing/test-buffers.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,166 @@
+// https://www.postgresql.org/docs/current/protocol-message-formats.html
+import BufferList from './buffer-list'
+
+const buffers = {
+  readyForQuery: function () {
+    return new BufferList().add(Buffer.from('I')).join(true, 'Z')
+  },
+
+  authenticationOk: function () {
+    return new BufferList().addInt32(0).join(true, 'R')
+  },
+
+  authenticationCleartextPassword: function () {
+    return new BufferList().addInt32(3).join(true, 'R')
+  },
+
+  authenticationMD5Password: function () {
+    return new BufferList()
+      .addInt32(5)
+      .add(Buffer.from([1, 2, 3, 4]))
+      .join(true, 'R')
+  },
+
+  authenticationSASL: function () {
+    return new BufferList().addInt32(10).addCString('SCRAM-SHA-256').addCString('').join(true, 'R')
+  },
+
+  authenticationSASLContinue: function () {
+    return new BufferList().addInt32(11).addString('data').join(true, 'R')
+  },
+
+  authenticationSASLFinal: function () {
+    return new BufferList().addInt32(12).addString('data').join(true, 'R')
+  },
+
+  parameterStatus: function (name: string, value: string) {
+    return new BufferList().addCString(name).addCString(value).join(true, 'S')
+  },
+
+  backendKeyData: function (processID: number, secretKey: number) {
+    return new BufferList().addInt32(processID).addInt32(secretKey).join(true, 'K')
+  },
+
+  commandComplete: function (string: string) {
+    return new BufferList().addCString(string).join(true, 'C')
+  },
+
+  rowDescription: function (fields: any[]) {
+    fields = fields || []
+    const buf = new BufferList()
+    buf.addInt16(fields.length)
+    fields.forEach(function (field) {
+      buf
+        .addCString(field.name)
+        .addInt32(field.tableID || 0)
+        .addInt16(field.attributeNumber || 0)
+        .addInt32(field.dataTypeID || 0)
+        .addInt16(field.dataTypeSize || 0)
+        .addInt32(field.typeModifier || 0)
+        .addInt16(field.formatCode || 0)
+    })
+    return buf.join(true, 'T')
+  },
+
+  parameterDescription: function (dataTypeIDs: number[]) {
+    dataTypeIDs = dataTypeIDs || []
+    const buf = new BufferList()
+    buf.addInt16(dataTypeIDs.length)
+    dataTypeIDs.forEach(function (dataTypeID) {
+      buf.addInt32(dataTypeID)
+    })
+    return buf.join(true, 't')
+  },
+
+  dataRow: function (columns: any[]) {
+    columns = columns || []
+    const buf = new BufferList()
+    buf.addInt16(columns.length)
+    columns.forEach(function (col) {
+      if (col == null) {
+        buf.addInt32(-1)
+      } else {
+        const strBuf = Buffer.from(col, 'utf8')
+        buf.addInt32(strBuf.length)
+        buf.add(strBuf)
+      }
+    })
+    return buf.join(true, 'D')
+  },
+
+  error: function (fields: any) {
+    return buffers.errorOrNotice(fields).join(true, 'E')
+  },
+
+  notice: function (fields: any) {
+    return buffers.errorOrNotice(fields).join(true, 'N')
+  },
+
+  errorOrNotice: function (fields: any) {
+    fields = fields || []
+    const buf = new BufferList()
+    fields.forEach(function (field: any) {
+      buf.addChar(field.type)
+      buf.addCString(field.value)
+    })
+    return buf.add(Buffer.from([0])) // terminator
+  },
+
+  parseComplete: function () {
+    return new BufferList().join(true, '1')
+  },
+
+  bindComplete: function () {
+    return new BufferList().join(true, '2')
+  },
+
+  notification: function (id: number, channel: string, payload: string) {
+    return new BufferList().addInt32(id).addCString(channel).addCString(payload).join(true, 'A')
+  },
+
+  emptyQuery: function () {
+    return new BufferList().join(true, 'I')
+  },
+
+  portalSuspended: function () {
+    return new BufferList().join(true, 's')
+  },
+
+  closeComplete: function () {
+    return new BufferList().join(true, '3')
+  },
+
+  copyIn: function (cols: number) {
+    const list = new BufferList()
+      // text mode
+      .addByte(0)
+      // column count
+      .addInt16(cols)
+    for (let i = 0; i < cols; i++) {
+      list.addInt16(i)
+    }
+    return list.join(true, 'G')
+  },
+
+  copyOut: function (cols: number) {
+    const list = new BufferList()
+      // text mode
+      .addByte(0)
+      // column count
+      .addInt16(cols)
+    for (let i = 0; i < cols; i++) {
+      list.addInt16(i)
+    }
+    return list.join(true, 'H')
+  },
+
+  copyData: function (bytes: Buffer) {
+    return new BufferList().add(bytes).join(true, 'd')
+  },
+
+  copyDone: function () {
+    return new BufferList().join(true, 'c')
+  },
+}
+
+export default buffers
Index: TruckSimulator-main/node_modules/pg-protocol/src/types/chunky.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-protocol/src/types/chunky.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-protocol/src/types/chunky.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,1 @@
+declare module 'chunky'
Index: TruckSimulator-main/node_modules/pg-types/.travis.yml
===================================================================
--- TruckSimulator-main/node_modules/pg-types/.travis.yml	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/.travis.yml	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,7 @@
+language: node_js
+node_js:
+  - '4'
+  - 'lts/*'
+  - 'node'
+env:
+  - PGUSER=postgres
Index: TruckSimulator-main/node_modules/pg-types/Makefile
===================================================================
--- TruckSimulator-main/node_modules/pg-types/Makefile	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/Makefile	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,14 @@
+.PHONY: publish-patch test
+
+test:
+	npm test
+
+patch: test
+	npm version patch -m "Bump version"
+	git push origin master --tags
+	npm publish
+
+minor: test
+	npm version minor -m "Bump version"
+	git push origin master --tags
+	npm publish
Index: TruckSimulator-main/node_modules/pg-types/README.md
===================================================================
--- TruckSimulator-main/node_modules/pg-types/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,75 @@
+# pg-types
+
+This is the code that turns all the raw text from postgres into JavaScript types for [node-postgres](https://github.com/brianc/node-postgres.git)
+
+## use
+
+This module is consumed and exported from the root `pg` object of node-postgres.  To access it, do the following:
+
+```js
+var types = require('pg').types
+```
+
+Generally what you'll want to do is override how a specific data-type is parsed and turned into a JavaScript type.  By default the PostgreSQL backend server returns everything as strings.  Every data type corresponds to a unique `OID` within the server, and these `OIDs` are sent back with the query response.  So, you need to match a particluar `OID` to a function you'd like to use to take the raw text input and produce a valid JavaScript object as a result. `null` values are never parsed.
+
+Let's do something I commonly like to do on projects: return 64-bit integers `(int8)` as JavaScript integers.  Because JavaScript doesn't have support for 64-bit integers node-postgres cannot confidently parse `int8` data type results as numbers because if you have a _huge_ number it will overflow and the result you'd get back from node-postgres would not be the result in the datbase.  That would be a __very bad thing__ so node-postgres just returns `int8` results as strings and leaves the parsing up to you.  Let's say that you know you don't and wont ever have numbers greater than `int4` in your database, but you're tired of recieving results from the `COUNT(*)` function as strings (because that function returns `int8`).  You would do this:
+
+```js
+var types = require('pg').types
+types.setTypeParser(20, function(val) {
+  return parseInt(val)
+})
+```
+
+__boom__: now you get numbers instead of strings.
+
+Just as another example -- not saying this is a good idea -- let's say you want to return all dates from your database as [moment](http://momentjs.com/docs/) objects.  Okay, do this:
+
+```js
+var types = require('pg').types
+var moment = require('moment')
+var parseFn = function(val) {
+   return val === null ? null : moment(val)
+}
+types.setTypeParser(types.builtins.TIMESTAMPTZ, parseFn)
+types.setTypeParser(types.builtins.TIMESTAMP, parseFn)
+```
+_note: I've never done that with my dates, and I'm not 100% sure moment can parse all the date strings returned from postgres.  It's just an example!_
+
+If you're thinking "gee, this seems pretty handy, but how can I get a list of all the OIDs in the database and what they correspond to?!?!?!" worry not:
+
+```bash
+$ psql -c "select typname, oid, typarray from pg_type order by oid"
+```
+
+If you want to find out the OID of a specific type:
+
+```bash
+$ psql -c "select typname, oid, typarray from pg_type where typname = 'daterange' order by oid"
+```
+
+:smile:
+
+## license
+
+The MIT License (MIT)
+
+Copyright (c) 2014 Brian M. Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/pg-types/index.d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-types/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,137 @@
+export enum TypeId {
+    BOOL = 16,
+    BYTEA = 17,
+    CHAR = 18,
+    INT8 = 20,
+    INT2 = 21,
+    INT4 = 23,
+    REGPROC = 24,
+    TEXT = 25,
+    OID = 26,
+    TID = 27,
+    XID = 28,
+    CID = 29,
+    JSON = 114,
+    XML = 142,
+    PG_NODE_TREE = 194,
+    SMGR = 210,
+    PATH = 602,
+    POLYGON = 604,
+    CIDR = 650,
+    FLOAT4 = 700,
+    FLOAT8 = 701,
+    ABSTIME = 702,
+    RELTIME = 703,
+    TINTERVAL = 704,
+    CIRCLE = 718,
+    MACADDR8 = 774,
+    MONEY = 790,
+    MACADDR = 829,
+    INET = 869,
+    ACLITEM = 1033,
+    BPCHAR = 1042,
+    VARCHAR = 1043,
+    DATE = 1082,
+    TIME = 1083,
+    TIMESTAMP = 1114,
+    TIMESTAMPTZ = 1184,
+    INTERVAL = 1186,
+    TIMETZ = 1266,
+    BIT = 1560,
+    VARBIT = 1562,
+    NUMERIC = 1700,
+    REFCURSOR = 1790,
+    REGPROCEDURE = 2202,
+    REGOPER = 2203,
+    REGOPERATOR = 2204,
+    REGCLASS = 2205,
+    REGTYPE = 2206,
+    UUID = 2950,
+    TXID_SNAPSHOT = 2970,
+    PG_LSN = 3220,
+    PG_NDISTINCT = 3361,
+    PG_DEPENDENCIES = 3402,
+    TSVECTOR = 3614,
+    TSQUERY = 3615,
+    GTSVECTOR = 3642,
+    REGCONFIG = 3734,
+    REGDICTIONARY = 3769,
+    JSONB = 3802,
+    REGNAMESPACE = 4089,
+    REGROLE = 4096
+}
+
+export type builtinsTypes =
+    'BOOL' |
+    'BYTEA' |
+    'CHAR' |
+    'INT8' |
+    'INT2' |
+    'INT4' |
+    'REGPROC' |
+    'TEXT' |
+    'OID' |
+    'TID' |
+    'XID' |
+    'CID' |
+    'JSON' |
+    'XML' |
+    'PG_NODE_TREE' |
+    'SMGR' |
+    'PATH' |
+    'POLYGON' |
+    'CIDR' |
+    'FLOAT4' |
+    'FLOAT8' |
+    'ABSTIME' |
+    'RELTIME' |
+    'TINTERVAL' |
+    'CIRCLE' |
+    'MACADDR8' |
+    'MONEY' |
+    'MACADDR' |
+    'INET' |
+    'ACLITEM' |
+    'BPCHAR' |
+    'VARCHAR' |
+    'DATE' |
+    'TIME' |
+    'TIMESTAMP' |
+    'TIMESTAMPTZ' |
+    'INTERVAL' |
+    'TIMETZ' |
+    'BIT' |
+    'VARBIT' |
+    'NUMERIC' |
+    'REFCURSOR' |
+    'REGPROCEDURE' |
+    'REGOPER' |
+    'REGOPERATOR' |
+    'REGCLASS' |
+    'REGTYPE' |
+    'UUID' |
+    'TXID_SNAPSHOT' |
+    'PG_LSN' |
+    'PG_NDISTINCT' |
+    'PG_DEPENDENCIES' |
+    'TSVECTOR' |
+    'TSQUERY' |
+    'GTSVECTOR' |
+    'REGCONFIG' |
+    'REGDICTIONARY' |
+    'JSONB' |
+    'REGNAMESPACE' |
+    'REGROLE';
+
+export type TypesBuiltins = {[key in builtinsTypes]: TypeId};
+
+export type TypeFormat = 'text' | 'binary';
+
+export const builtins: TypesBuiltins;
+
+export function setTypeParser (id: TypeId, parseFn: ((value: string) => any)): void;
+export function setTypeParser (id: TypeId, format: TypeFormat, parseFn: (value: string) => any): void;
+
+export const getTypeParser: (id: TypeId, format?: TypeFormat) => any
+
+export const arrayParser: (source: string, transform: (entry: any) => any) => any[];
Index: TruckSimulator-main/node_modules/pg-types/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-types/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,47 @@
+var textParsers = require('./lib/textParsers');
+var binaryParsers = require('./lib/binaryParsers');
+var arrayParser = require('./lib/arrayParser');
+var builtinTypes = require('./lib/builtins');
+
+exports.getTypeParser = getTypeParser;
+exports.setTypeParser = setTypeParser;
+exports.arrayParser = arrayParser;
+exports.builtins = builtinTypes;
+
+var typeParsers = {
+  text: {},
+  binary: {}
+};
+
+//the empty parse function
+function noParse (val) {
+  return String(val);
+};
+
+//returns a function used to convert a specific type (specified by
+//oid) into a result javascript type
+//note: the oid can be obtained via the following sql query:
+//SELECT oid FROM pg_type WHERE typname = 'TYPE_NAME_HERE';
+function getTypeParser (oid, format) {
+  format = format || 'text';
+  if (!typeParsers[format]) {
+    return noParse;
+  }
+  return typeParsers[format][oid] || noParse;
+};
+
+function setTypeParser (oid, format, parseFn) {
+  if(typeof format == 'function') {
+    parseFn = format;
+    format = 'text';
+  }
+  typeParsers[format][oid] = parseFn;
+};
+
+textParsers.init(function(oid, converter) {
+  typeParsers.text[oid] = converter;
+});
+
+binaryParsers.init(function(oid, converter) {
+  typeParsers.binary[oid] = converter;
+});
Index: TruckSimulator-main/node_modules/pg-types/index.test-d.ts
===================================================================
--- TruckSimulator-main/node_modules/pg-types/index.test-d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/index.test-d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+import * as types from '.';
+import { expectType } from 'tsd';
+
+// builtins
+expectType<types.TypesBuiltins>(types.builtins);
+
+// getTypeParser
+const noParse = types.getTypeParser(types.builtins.NUMERIC, 'text');
+const numericParser = types.getTypeParser(types.builtins.NUMERIC, 'binary');
+expectType<string>(noParse('noParse'));
+expectType<number>(numericParser([200, 1, 0, 15]));
+
+// getArrayParser 
+const value = types.arrayParser('{1,2,3}', (num) => parseInt(num));
+expectType<number[]>(value);
+
+//setTypeParser
+types.setTypeParser(types.builtins.INT8, parseInt);
+types.setTypeParser(types.builtins.FLOAT8, parseFloat);
+types.setTypeParser(types.builtins.FLOAT8, 'binary', (data) => data[0]);
+types.setTypeParser(types.builtins.FLOAT8, 'text', parseFloat);
Index: TruckSimulator-main/node_modules/pg-types/lib/arrayParser.js
===================================================================
--- TruckSimulator-main/node_modules/pg-types/lib/arrayParser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/lib/arrayParser.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,11 @@
+var array = require('postgres-array');
+
+module.exports = {
+  create: function (source, transform) {
+    return {
+      parse: function() {
+        return array.parse(source, transform);
+      }
+    };
+  }
+};
Index: TruckSimulator-main/node_modules/pg-types/lib/binaryParsers.js
===================================================================
--- TruckSimulator-main/node_modules/pg-types/lib/binaryParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/lib/binaryParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,257 @@
+var parseInt64 = require('pg-int8');
+
+var parseBits = function(data, bits, offset, invert, callback) {
+  offset = offset || 0;
+  invert = invert || false;
+  callback = callback || function(lastValue, newValue, bits) { return (lastValue * Math.pow(2, bits)) + newValue; };
+  var offsetBytes = offset >> 3;
+
+  var inv = function(value) {
+    if (invert) {
+      return ~value & 0xff;
+    }
+
+    return value;
+  };
+
+  // read first (maybe partial) byte
+  var mask = 0xff;
+  var firstBits = 8 - (offset % 8);
+  if (bits < firstBits) {
+    mask = (0xff << (8 - bits)) & 0xff;
+    firstBits = bits;
+  }
+
+  if (offset) {
+    mask = mask >> (offset % 8);
+  }
+
+  var result = 0;
+  if ((offset % 8) + bits >= 8) {
+    result = callback(0, inv(data[offsetBytes]) & mask, firstBits);
+  }
+
+  // read bytes
+  var bytes = (bits + offset) >> 3;
+  for (var i = offsetBytes + 1; i < bytes; i++) {
+    result = callback(result, inv(data[i]), 8);
+  }
+
+  // bits to read, that are not a complete byte
+  var lastBits = (bits + offset) % 8;
+  if (lastBits > 0) {
+    result = callback(result, inv(data[bytes]) >> (8 - lastBits), lastBits);
+  }
+
+  return result;
+};
+
+var parseFloatFromBits = function(data, precisionBits, exponentBits) {
+  var bias = Math.pow(2, exponentBits - 1) - 1;
+  var sign = parseBits(data, 1);
+  var exponent = parseBits(data, exponentBits, 1);
+
+  if (exponent === 0) {
+    return 0;
+  }
+
+  // parse mantissa
+  var precisionBitsCounter = 1;
+  var parsePrecisionBits = function(lastValue, newValue, bits) {
+    if (lastValue === 0) {
+      lastValue = 1;
+    }
+
+    for (var i = 1; i <= bits; i++) {
+      precisionBitsCounter /= 2;
+      if ((newValue & (0x1 << (bits - i))) > 0) {
+        lastValue += precisionBitsCounter;
+      }
+    }
+
+    return lastValue;
+  };
+
+  var mantissa = parseBits(data, precisionBits, exponentBits + 1, false, parsePrecisionBits);
+
+  // special cases
+  if (exponent == (Math.pow(2, exponentBits + 1) - 1)) {
+    if (mantissa === 0) {
+      return (sign === 0) ? Infinity : -Infinity;
+    }
+
+    return NaN;
+  }
+
+  // normale number
+  return ((sign === 0) ? 1 : -1) * Math.pow(2, exponent - bias) * mantissa;
+};
+
+var parseInt16 = function(value) {
+  if (parseBits(value, 1) == 1) {
+    return -1 * (parseBits(value, 15, 1, true) + 1);
+  }
+
+  return parseBits(value, 15, 1);
+};
+
+var parseInt32 = function(value) {
+  if (parseBits(value, 1) == 1) {
+    return -1 * (parseBits(value, 31, 1, true) + 1);
+  }
+
+  return parseBits(value, 31, 1);
+};
+
+var parseFloat32 = function(value) {
+  return parseFloatFromBits(value, 23, 8);
+};
+
+var parseFloat64 = function(value) {
+  return parseFloatFromBits(value, 52, 11);
+};
+
+var parseNumeric = function(value) {
+  var sign = parseBits(value, 16, 32);
+  if (sign == 0xc000) {
+    return NaN;
+  }
+
+  var weight = Math.pow(10000, parseBits(value, 16, 16));
+  var result = 0;
+
+  var digits = [];
+  var ndigits = parseBits(value, 16);
+  for (var i = 0; i < ndigits; i++) {
+    result += parseBits(value, 16, 64 + (16 * i)) * weight;
+    weight /= 10000;
+  }
+
+  var scale = Math.pow(10, parseBits(value, 16, 48));
+  return ((sign === 0) ? 1 : -1) * Math.round(result * scale) / scale;
+};
+
+var parseDate = function(isUTC, value) {
+  var sign = parseBits(value, 1);
+  var rawValue = parseBits(value, 63, 1);
+
+  // discard usecs and shift from 2000 to 1970
+  var result = new Date((((sign === 0) ? 1 : -1) * rawValue / 1000) + 946684800000);
+
+  if (!isUTC) {
+    result.setTime(result.getTime() + result.getTimezoneOffset() * 60000);
+  }
+
+  // add microseconds to the date
+  result.usec = rawValue % 1000;
+  result.getMicroSeconds = function() {
+    return this.usec;
+  };
+  result.setMicroSeconds = function(value) {
+    this.usec = value;
+  };
+  result.getUTCMicroSeconds = function() {
+    return this.usec;
+  };
+
+  return result;
+};
+
+var parseArray = function(value) {
+  var dim = parseBits(value, 32);
+
+  var flags = parseBits(value, 32, 32);
+  var elementType = parseBits(value, 32, 64);
+
+  var offset = 96;
+  var dims = [];
+  for (var i = 0; i < dim; i++) {
+    // parse dimension
+    dims[i] = parseBits(value, 32, offset);
+    offset += 32;
+
+    // ignore lower bounds
+    offset += 32;
+  }
+
+  var parseElement = function(elementType) {
+    // parse content length
+    var length = parseBits(value, 32, offset);
+    offset += 32;
+
+    // parse null values
+    if (length == 0xffffffff) {
+      return null;
+    }
+
+    var result;
+    if ((elementType == 0x17) || (elementType == 0x14)) {
+      // int/bigint
+      result = parseBits(value, length * 8, offset);
+      offset += length * 8;
+      return result;
+    }
+    else if (elementType == 0x19) {
+      // string
+      result = value.toString(this.encoding, offset >> 3, (offset += (length << 3)) >> 3);
+      return result;
+    }
+    else {
+      console.log("ERROR: ElementType not implemented: " + elementType);
+    }
+  };
+
+  var parse = function(dimension, elementType) {
+    var array = [];
+    var i;
+
+    if (dimension.length > 1) {
+      var count = dimension.shift();
+      for (i = 0; i < count; i++) {
+        array[i] = parse(dimension, elementType);
+      }
+      dimension.unshift(count);
+    }
+    else {
+      for (i = 0; i < dimension[0]; i++) {
+        array[i] = parseElement(elementType);
+      }
+    }
+
+    return array;
+  };
+
+  return parse(dims, elementType);
+};
+
+var parseText = function(value) {
+  return value.toString('utf8');
+};
+
+var parseBool = function(value) {
+  if(value === null) return null;
+  return (parseBits(value, 8) > 0);
+};
+
+var init = function(register) {
+  register(20, parseInt64);
+  register(21, parseInt16);
+  register(23, parseInt32);
+  register(26, parseInt32);
+  register(1700, parseNumeric);
+  register(700, parseFloat32);
+  register(701, parseFloat64);
+  register(16, parseBool);
+  register(1114, parseDate.bind(null, false));
+  register(1184, parseDate.bind(null, true));
+  register(1000, parseArray);
+  register(1007, parseArray);
+  register(1016, parseArray);
+  register(1008, parseArray);
+  register(1009, parseArray);
+  register(25, parseText);
+};
+
+module.exports = {
+  init: init
+};
Index: TruckSimulator-main/node_modules/pg-types/lib/builtins.js
===================================================================
--- TruckSimulator-main/node_modules/pg-types/lib/builtins.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/lib/builtins.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,73 @@
+/**
+ * Following query was used to generate this file:
+
+ SELECT json_object_agg(UPPER(PT.typname), PT.oid::int4 ORDER BY pt.oid)
+ FROM pg_type PT
+ WHERE typnamespace = (SELECT pgn.oid FROM pg_namespace pgn WHERE nspname = 'pg_catalog') -- Take only builting Postgres types with stable OID (extension types are not guaranted to be stable)
+ AND typtype = 'b' -- Only basic types
+ AND typelem = 0 -- Ignore aliases
+ AND typisdefined -- Ignore undefined types
+ */
+
+module.exports = {
+    BOOL: 16,
+    BYTEA: 17,
+    CHAR: 18,
+    INT8: 20,
+    INT2: 21,
+    INT4: 23,
+    REGPROC: 24,
+    TEXT: 25,
+    OID: 26,
+    TID: 27,
+    XID: 28,
+    CID: 29,
+    JSON: 114,
+    XML: 142,
+    PG_NODE_TREE: 194,
+    SMGR: 210,
+    PATH: 602,
+    POLYGON: 604,
+    CIDR: 650,
+    FLOAT4: 700,
+    FLOAT8: 701,
+    ABSTIME: 702,
+    RELTIME: 703,
+    TINTERVAL: 704,
+    CIRCLE: 718,
+    MACADDR8: 774,
+    MONEY: 790,
+    MACADDR: 829,
+    INET: 869,
+    ACLITEM: 1033,
+    BPCHAR: 1042,
+    VARCHAR: 1043,
+    DATE: 1082,
+    TIME: 1083,
+    TIMESTAMP: 1114,
+    TIMESTAMPTZ: 1184,
+    INTERVAL: 1186,
+    TIMETZ: 1266,
+    BIT: 1560,
+    VARBIT: 1562,
+    NUMERIC: 1700,
+    REFCURSOR: 1790,
+    REGPROCEDURE: 2202,
+    REGOPER: 2203,
+    REGOPERATOR: 2204,
+    REGCLASS: 2205,
+    REGTYPE: 2206,
+    UUID: 2950,
+    TXID_SNAPSHOT: 2970,
+    PG_LSN: 3220,
+    PG_NDISTINCT: 3361,
+    PG_DEPENDENCIES: 3402,
+    TSVECTOR: 3614,
+    TSQUERY: 3615,
+    GTSVECTOR: 3642,
+    REGCONFIG: 3734,
+    REGDICTIONARY: 3769,
+    JSONB: 3802,
+    REGNAMESPACE: 4089,
+    REGROLE: 4096
+};
Index: TruckSimulator-main/node_modules/pg-types/lib/textParsers.js
===================================================================
--- TruckSimulator-main/node_modules/pg-types/lib/textParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/lib/textParsers.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,215 @@
+var array = require('postgres-array')
+var arrayParser = require('./arrayParser');
+var parseDate = require('postgres-date');
+var parseInterval = require('postgres-interval');
+var parseByteA = require('postgres-bytea');
+
+function allowNull (fn) {
+  return function nullAllowed (value) {
+    if (value === null) return value
+    return fn(value)
+  }
+}
+
+function parseBool (value) {
+  if (value === null) return value
+  return value === 'TRUE' ||
+    value === 't' ||
+    value === 'true' ||
+    value === 'y' ||
+    value === 'yes' ||
+    value === 'on' ||
+    value === '1';
+}
+
+function parseBoolArray (value) {
+  if (!value) return null
+  return array.parse(value, parseBool)
+}
+
+function parseBaseTenInt (string) {
+  return parseInt(string, 10)
+}
+
+function parseIntegerArray (value) {
+  if (!value) return null
+  return array.parse(value, allowNull(parseBaseTenInt))
+}
+
+function parseBigIntegerArray (value) {
+  if (!value) return null
+  return array.parse(value, allowNull(function (entry) {
+    return parseBigInteger(entry).trim()
+  }))
+}
+
+var parsePointArray = function(value) {
+  if(!value) { return null; }
+  var p = arrayParser.create(value, function(entry) {
+    if(entry !== null) {
+      entry = parsePoint(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseFloatArray = function(value) {
+  if(!value) { return null; }
+  var p = arrayParser.create(value, function(entry) {
+    if(entry !== null) {
+      entry = parseFloat(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseStringArray = function(value) {
+  if(!value) { return null; }
+
+  var p = arrayParser.create(value);
+  return p.parse();
+};
+
+var parseDateArray = function(value) {
+  if (!value) { return null; }
+
+  var p = arrayParser.create(value, function(entry) {
+    if (entry !== null) {
+      entry = parseDate(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseIntervalArray = function(value) {
+  if (!value) { return null; }
+
+  var p = arrayParser.create(value, function(entry) {
+    if (entry !== null) {
+      entry = parseInterval(entry);
+    }
+    return entry;
+  });
+
+  return p.parse();
+};
+
+var parseByteAArray = function(value) {
+  if (!value) { return null; }
+
+  return array.parse(value, allowNull(parseByteA));
+};
+
+var parseInteger = function(value) {
+  return parseInt(value, 10);
+};
+
+var parseBigInteger = function(value) {
+  var valStr = String(value);
+  if (/^\d+$/.test(valStr)) { return valStr; }
+  return value;
+};
+
+var parseJsonArray = function(value) {
+  if (!value) { return null; }
+
+  return array.parse(value, allowNull(JSON.parse));
+};
+
+var parsePoint = function(value) {
+  if (value[0] !== '(') { return null; }
+
+  value = value.substring( 1, value.length - 1 ).split(',');
+
+  return {
+    x: parseFloat(value[0])
+  , y: parseFloat(value[1])
+  };
+};
+
+var parseCircle = function(value) {
+  if (value[0] !== '<' && value[1] !== '(') { return null; }
+
+  var point = '(';
+  var radius = '';
+  var pointParsed = false;
+  for (var i = 2; i < value.length - 1; i++){
+    if (!pointParsed) {
+      point += value[i];
+    }
+
+    if (value[i] === ')') {
+      pointParsed = true;
+      continue;
+    } else if (!pointParsed) {
+      continue;
+    }
+
+    if (value[i] === ','){
+      continue;
+    }
+
+    radius += value[i];
+  }
+  var result = parsePoint(point);
+  result.radius = parseFloat(radius);
+
+  return result;
+};
+
+var init = function(register) {
+  register(20, parseBigInteger); // int8
+  register(21, parseInteger); // int2
+  register(23, parseInteger); // int4
+  register(26, parseInteger); // oid
+  register(700, parseFloat); // float4/real
+  register(701, parseFloat); // float8/double
+  register(16, parseBool);
+  register(1082, parseDate); // date
+  register(1114, parseDate); // timestamp without timezone
+  register(1184, parseDate); // timestamp
+  register(600, parsePoint); // point
+  register(651, parseStringArray); // cidr[]
+  register(718, parseCircle); // circle
+  register(1000, parseBoolArray);
+  register(1001, parseByteAArray);
+  register(1005, parseIntegerArray); // _int2
+  register(1007, parseIntegerArray); // _int4
+  register(1028, parseIntegerArray); // oid[]
+  register(1016, parseBigIntegerArray); // _int8
+  register(1017, parsePointArray); // point[]
+  register(1021, parseFloatArray); // _float4
+  register(1022, parseFloatArray); // _float8
+  register(1231, parseFloatArray); // _numeric
+  register(1014, parseStringArray); //char
+  register(1015, parseStringArray); //varchar
+  register(1008, parseStringArray);
+  register(1009, parseStringArray);
+  register(1040, parseStringArray); // macaddr[]
+  register(1041, parseStringArray); // inet[]
+  register(1115, parseDateArray); // timestamp without time zone[]
+  register(1182, parseDateArray); // _date
+  register(1185, parseDateArray); // timestamp with time zone[]
+  register(1186, parseInterval);
+  register(1187, parseIntervalArray);
+  register(17, parseByteA);
+  register(114, JSON.parse.bind(JSON)); // json
+  register(3802, JSON.parse.bind(JSON)); // jsonb
+  register(199, parseJsonArray); // json[]
+  register(3807, parseJsonArray); // jsonb[]
+  register(3907, parseStringArray); // numrange[]
+  register(2951, parseStringArray); // uuid[]
+  register(791, parseStringArray); // money[]
+  register(1183, parseStringArray); // time[]
+  register(1270, parseStringArray); // timetz[]
+};
+
+module.exports = {
+  init: init
+};
Index: TruckSimulator-main/node_modules/pg-types/package.json
===================================================================
--- TruckSimulator-main/node_modules/pg-types/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,42 @@
+{
+  "name": "pg-types",
+  "version": "2.2.0",
+  "description": "Query result type converters for node-postgres",
+  "main": "index.js",
+  "scripts": {
+    "test": "tape test/*.js | tap-spec && npm run test-ts",
+    "test-ts": "if-node-version '>= 8' tsd"
+  },
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-pg-types.git"
+  },
+  "keywords": [
+    "postgres",
+    "PostgreSQL",
+    "pg"
+  ],
+  "author": "Brian M. Carlson",
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/brianc/node-pg-types/issues"
+  },
+  "homepage": "https://github.com/brianc/node-pg-types",
+  "devDependencies": {
+    "if-node-version": "^1.1.1",
+    "pff": "^1.0.0",
+    "tap-spec": "^4.0.0",
+    "tape": "^4.0.0",
+    "tsd": "^0.7.4"
+  },
+  "dependencies": {
+    "pg-int8": "1.0.1",
+    "postgres-array": "~2.0.0",
+    "postgres-bytea": "~1.0.0",
+    "postgres-date": "~1.0.4",
+    "postgres-interval": "^1.1.0"
+  },
+  "engines": {
+    "node": ">=4"
+  }
+}
Index: TruckSimulator-main/node_modules/pg-types/test/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg-types/test/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/test/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,24 @@
+
+var test = require('tape')
+var printf = require('pff')
+var getTypeParser = require('../').getTypeParser
+var types = require('./types')
+
+test('types', function (t) {
+  Object.keys(types).forEach(function (typeName) {
+    var type = types[typeName]
+    t.test(typeName, function (t) {
+      var parser = getTypeParser(type.id, type.format)
+      type.tests.forEach(function (tests) {
+        var input = tests[0]
+        var expected = tests[1]
+        var result = parser(input)
+        if (typeof expected === 'function') {
+          return expected(t, result)
+        }
+        t.equal(result, expected)
+      })
+      t.end()
+    })
+  })
+})
Index: TruckSimulator-main/node_modules/pg-types/test/types.js
===================================================================
--- TruckSimulator-main/node_modules/pg-types/test/types.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg-types/test/types.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,597 @@
+'use strict'
+
+exports['string/varchar'] = {
+  format: 'text',
+  id: 1043,
+  tests: [
+    ['bang', 'bang']
+  ]
+}
+
+exports['integer/int4'] = {
+  format: 'text',
+  id: 23,
+  tests: [
+    ['2147483647', 2147483647]
+  ]
+}
+
+exports['smallint/int2'] = {
+  format: 'text',
+  id: 21,
+  tests: [
+    ['32767', 32767]
+  ]
+}
+
+exports['bigint/int8'] = {
+  format: 'text',
+  id: 20,
+  tests: [
+    ['9223372036854775807', '9223372036854775807']
+  ]
+}
+
+exports.oid = {
+  format: 'text',
+  id: 26,
+  tests: [
+    ['103', 103]
+  ]
+}
+
+var bignum = '31415926535897932384626433832795028841971693993751058.16180339887498948482045868343656381177203091798057628'
+exports.numeric = {
+  format: 'text',
+  id: 1700,
+  tests: [
+    [bignum, bignum]
+  ]
+}
+
+exports['real/float4'] = {
+  format: 'text',
+  id: 700,
+  tests: [
+    ['123.456', 123.456]
+  ]
+}
+
+exports['double precision / float 8'] = {
+  format: 'text',
+  id: 701,
+  tests: [
+    ['12345678.12345678', 12345678.12345678]
+  ]
+}
+
+exports.boolean = {
+  format: 'text',
+  id: 16,
+  tests: [
+    ['TRUE', true],
+    ['t', true],
+    ['true', true],
+    ['y', true],
+    ['yes', true],
+    ['on', true],
+    ['1', true],
+    ['f', false],
+    [null, null]
+  ]
+}
+
+exports.timestamptz = {
+  format: 'text',
+  id: 1184,
+  tests: [
+    [
+      '2010-10-31 14:54:13.74-05:30',
+      dateEquals(2010, 9, 31, 20, 24, 13, 740)
+    ],
+    [
+      '2011-01-23 22:05:00.68-06',
+       dateEquals(2011, 0, 24, 4, 5, 0, 680)
+    ],
+    [
+      '2010-10-30 14:11:12.730838Z',
+      dateEquals(2010, 9, 30, 14, 11, 12, 730)
+    ],
+    [
+      '2010-10-30 13:10:01+05',
+      dateEquals(2010, 9, 30, 8, 10, 1, 0)
+    ]
+  ]
+}
+
+exports.timestamp = {
+  format: 'text',
+  id: 1114,
+  tests: [
+    [
+      '2010-10-31 00:00:00',
+      function (t, value) {
+        t.equal(
+          value.toUTCString(),
+          new Date(2010, 9, 31, 0, 0, 0, 0, 0).toUTCString()
+        )
+        t.equal(
+          value.toString(),
+          new Date(2010, 9, 31, 0, 0, 0, 0, 0, 0).toString()
+        )
+      }
+    ]
+  ]
+}
+
+exports.date = {
+  format: 'text',
+  id: 1082,
+  tests: [
+    ['2010-10-31', function (t, value) {
+      var now = new Date(2010, 9, 31)
+      dateEquals(
+        2010,
+        now.getUTCMonth(),
+        now.getUTCDate(),
+        now.getUTCHours(), 0, 0, 0)(t, value)
+      t.equal(value.getHours(), now.getHours())
+    }]
+  ]
+}
+
+exports.inet = {
+  format: 'text',
+  id: 869,
+  tests: [
+    ['8.8.8.8', '8.8.8.8'],
+    ['2001:4860:4860::8888', '2001:4860:4860::8888'],
+    ['127.0.0.1', '127.0.0.1'],
+    ['fd00:1::40e', 'fd00:1::40e'],
+    ['1.2.3.4', '1.2.3.4']
+  ]
+}
+
+exports.cidr = {
+  format: 'text',
+  id: 650,
+  tests: [
+    ['172.16.0.0/12', '172.16.0.0/12'],
+    ['fe80::/10', 'fe80::/10'],
+    ['fc00::/7', 'fc00::/7'],
+    ['192.168.0.0/24', '192.168.0.0/24'],
+    ['10.0.0.0/8', '10.0.0.0/8']
+  ]
+}
+
+exports.macaddr = {
+  format: 'text',
+  id: 829,
+  tests: [
+    ['08:00:2b:01:02:03', '08:00:2b:01:02:03'],
+    ['16:10:9f:0d:66:00', '16:10:9f:0d:66:00']
+  ]
+}
+
+exports.numrange = {
+  format: 'text',
+  id: 3906,
+  tests: [
+    ['[,]', '[,]'],
+    ['(,)', '(,)'],
+    ['(,]', '(,]'],
+    ['[1,)', '[1,)'],
+    ['[,1]', '[,1]'],
+    ['(1,2)', '(1,2)'],
+    ['(1,20.5]', '(1,20.5]']
+  ]
+}
+
+exports.interval = {
+  format: 'text',
+  id: 1186,
+  tests: [
+    ['01:02:03', function (t, value) {
+      t.equal(value.toPostgres(), '3 seconds 2 minutes 1 hours')
+      t.deepEqual(value, {hours: 1, minutes: 2, seconds: 3})
+    }],
+    ['01:02:03.456', function (t, value) {
+      t.deepEqual(value, {hours: 1, minutes:2, seconds: 3, milliseconds: 456})
+    }],
+    ['1 year -32 days', function (t, value) {
+      t.equal(value.toPostgres(), '-32 days 1 years')
+      t.deepEqual(value, {years: 1, days: -32})
+    }],
+    ['1 day -00:00:03', function (t, value) {
+      t.equal(value.toPostgres(), '-3 seconds 1 days')
+      t.deepEqual(value, {days: 1, seconds: -3})
+    }]
+  ]
+}
+
+exports.bytea = {
+  format: 'text',
+  id: 17,
+  tests: [
+    ['foo\\000\\200\\\\\\377', function (t, value) {
+      var buffer = new Buffer([102, 111, 111, 0, 128, 92, 255])
+      t.ok(buffer.equals(value))
+    }],
+    ['', function (t, value) {
+      var buffer = new Buffer(0)
+      t.ok(buffer.equals(value))
+    }]
+  ]
+}
+
+exports['array/boolean'] = {
+    format: 'text',
+    id: 1000,
+    tests: [
+        ['{true,false}', function (t, value) {
+            t.deepEqual(value, [true, false])
+        }]
+    ]
+}
+
+exports['array/char'] = {
+  format: 'text',
+  id: 1014,
+  tests: [
+    ['{foo,bar}', function (t, value) {
+      t.deepEqual(value, ['foo', 'bar'])
+    }]
+  ]
+}
+
+exports['array/varchar'] = {
+  format: 'text',
+  id: 1015,
+  tests: [
+    ['{foo,bar}', function (t, value) {
+      t.deepEqual(value, ['foo', 'bar'])
+    }]
+  ]
+}
+
+exports['array/text'] = {
+  format: 'text',
+  id: 1008,
+  tests: [
+    ['{foo}', function (t, value) {
+      t.deepEqual(value, ['foo'])
+    }]
+  ]
+}
+
+exports['array/bytea'] = {
+  format: 'text',
+  id: 1001,
+  tests: [
+    ['{"\\\\x00000000"}', function (t, value) {
+      var buffer = new Buffer('00000000', 'hex')
+      t.ok(Array.isArray(value))
+      t.equal(value.length, 1)
+      t.ok(buffer.equals(value[0]))
+    }],
+    ['{NULL,"\\\\x4e554c4c"}', function (t, value) {
+      var buffer = new Buffer('4e554c4c', 'hex')
+      t.ok(Array.isArray(value))
+      t.equal(value.length, 2)
+      t.equal(value[0], null)
+      t.ok(buffer.equals(value[1]))
+    }],
+  ]
+}
+
+exports['array/numeric'] = {
+  format: 'text',
+  id: 1231,
+  tests: [
+    ['{1.2,3.4}', function (t, value) {
+      t.deepEqual(value, [1.2, 3.4])
+    }]
+  ]
+}
+
+exports['array/int2'] = {
+  format: 'text',
+  id: 1005,
+  tests: [
+    ['{-32768, -32767, 32766, 32767}', function (t, value) {
+      t.deepEqual(value, [-32768, -32767, 32766, 32767])
+    }]
+  ]
+}
+
+exports['array/int4'] = {
+  format: 'text',
+  id: 1005,
+  tests: [
+    ['{-2147483648, -2147483647, 2147483646, 2147483647}', function (t, value) {
+      t.deepEqual(value, [-2147483648, -2147483647, 2147483646, 2147483647])
+    }]
+  ]
+}
+
+exports['array/int8'] = {
+  format: 'text',
+  id: 1016,
+  tests: [
+    [
+      '{-9223372036854775808, -9223372036854775807, 9223372036854775806, 9223372036854775807}',
+      function (t, value) {
+        t.deepEqual(value, [
+          '-9223372036854775808',
+          '-9223372036854775807',
+          '9223372036854775806',
+          '9223372036854775807'
+        ])
+      }
+    ]
+  ]
+}
+
+exports['array/json'] = {
+  format: 'text',
+  id: 199,
+  tests: [
+    [
+      '{{1,2},{[3],"[4,5]"},{null,NULL}}',
+      function (t, value) {
+        t.deepEqual(value, [
+          [1, 2],
+          [[3], [4, 5]],
+          [null, null],
+        ])
+      }
+    ]
+  ]
+}
+
+exports['array/jsonb'] = {
+  format: 'text',
+  id: 3807,
+  tests: exports['array/json'].tests
+}
+
+exports['array/point'] = {
+  format: 'text',
+  id: 1017,
+  tests: [
+    ['{"(25.1,50.5)","(10.1,40)"}', function (t, value) {
+      t.deepEqual(value, [{x: 25.1, y: 50.5}, {x: 10.1, y: 40}])
+    }]
+  ]
+}
+
+exports['array/oid'] = {
+  format: 'text',
+  id: 1028,
+  tests: [
+    ['{25864,25860}', function (t, value) {
+      t.deepEqual(value, [25864, 25860])
+    }]
+  ]
+}
+
+exports['array/float4'] = {
+  format: 'text',
+  id: 1021,
+  tests: [
+    ['{1.2, 3.4}', function (t, value) {
+      t.deepEqual(value, [1.2, 3.4])
+    }]
+  ]
+}
+
+exports['array/float8'] = {
+  format: 'text',
+  id: 1022,
+  tests: [
+    ['{-12345678.1234567, 12345678.12345678}', function (t, value) {
+      t.deepEqual(value, [-12345678.1234567, 12345678.12345678])
+    }]
+  ]
+}
+
+exports['array/date'] = {
+  format: 'text',
+  id: 1182,
+  tests: [
+    ['{2014-01-01,2015-12-31}', function (t, value) {
+      var expecteds = [new Date(2014, 0, 1), new Date(2015, 11, 31)]
+      t.equal(value.length, 2)
+      value.forEach(function (date, index) {
+        var expected = expecteds[index]
+        dateEquals(
+          expected.getUTCFullYear(),
+          expected.getUTCMonth(),
+          expected.getUTCDate(),
+          expected.getUTCHours(), 0, 0, 0)(t, date)
+      })
+    }]
+  ]
+}
+
+exports['array/interval'] = {
+  format: 'text',
+  id: 1187,
+  tests: [
+    ['{01:02:03,1 day -00:00:03}', function (t, value) {
+      var expecteds = [{hours: 1, minutes: 2, seconds: 3},
+                       {days: 1, seconds: -3}]
+      t.equal(value.length, 2)
+      t.deepEqual(value, expecteds);
+    }]
+  ]
+}
+
+exports['array/inet'] = {
+  format: 'text',
+  id: 1041,
+  tests: [
+    ['{8.8.8.8}', function (t, value) {
+      t.deepEqual(value, ['8.8.8.8']);
+    }],
+    ['{2001:4860:4860::8888}', function (t, value) {
+      t.deepEqual(value, ['2001:4860:4860::8888']);
+    }],
+    ['{127.0.0.1,fd00:1::40e,1.2.3.4}', function (t, value) {
+      t.deepEqual(value, ['127.0.0.1', 'fd00:1::40e', '1.2.3.4']);
+    }]
+  ]
+}
+
+exports['array/cidr'] = {
+  format: 'text',
+  id: 651,
+  tests: [
+    ['{172.16.0.0/12}', function (t, value) {
+      t.deepEqual(value, ['172.16.0.0/12']);
+    }],
+    ['{fe80::/10}', function (t, value) {
+      t.deepEqual(value, ['fe80::/10']);
+    }],
+    ['{10.0.0.0/8,fc00::/7,192.168.0.0/24}', function (t, value) {
+      t.deepEqual(value, ['10.0.0.0/8', 'fc00::/7', '192.168.0.0/24']);
+    }]
+  ]
+}
+
+exports['array/macaddr'] = {
+  format: 'text',
+  id: 1040,
+  tests: [
+    ['{08:00:2b:01:02:03,16:10:9f:0d:66:00}', function (t, value) {
+      t.deepEqual(value, ['08:00:2b:01:02:03', '16:10:9f:0d:66:00']);
+    }]
+  ]
+}
+
+exports['array/numrange'] = {
+  format: 'text',
+  id: 3907,
+  tests: [
+    ['{"[1,2]","(4.5,8)","[10,40)","(-21.2,60.3]"}', function (t, value) {
+      t.deepEqual(value, ['[1,2]', '(4.5,8)', '[10,40)', '(-21.2,60.3]']);
+    }],
+    ['{"[,20]","[3,]","[,]","(,35)","(1,)","(,)"}', function (t, value) {
+      t.deepEqual(value, ['[,20]', '[3,]', '[,]', '(,35)', '(1,)', '(,)']);
+    }],
+    ['{"[,20)","[3,)","[,)","[,35)","[1,)","[,)"}', function (t, value) {
+      t.deepEqual(value, ['[,20)', '[3,)', '[,)', '[,35)', '[1,)', '[,)']);
+    }]
+  ]
+}
+
+exports['binary-string/varchar'] = {
+  format: 'binary',
+  id: 1043,
+  tests: [
+    ['bang', 'bang']
+  ]
+}
+
+exports['binary-integer/int4'] = {
+  format: 'binary',
+  id: 23,
+  tests: [
+    [[0, 0, 0, 100], 100]
+  ]
+}
+
+exports['binary-smallint/int2'] = {
+  format: 'binary',
+  id: 21,
+  tests: [
+    [[0, 101], 101]
+  ]
+}
+
+exports['binary-bigint/int8'] = {
+  format: 'binary',
+  id: 20,
+  tests: [
+    [new Buffer([0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), '9223372036854775807']
+  ]
+}
+
+exports['binary-oid'] = {
+  format: 'binary',
+  id: 26,
+  tests: [
+    [[0, 0, 0, 103], 103]
+  ]
+}
+
+exports['binary-numeric'] = {
+  format: 'binary',
+  id: 1700,
+  tests: [
+    [
+      [0, 2, 0, 0, 0, 0, 0, hex('0x64'), 0, 12, hex('0xd'), hex('0x48'), 0, 0, 0, 0],
+      12.34
+    ]
+  ]
+}
+
+exports['binary-real/float4'] = {
+  format: 'binary',
+  id: 700,
+  tests: [
+    [['0x41', '0x48', '0x00', '0x00'].map(hex), 12.5]
+  ]
+}
+
+exports['binary-boolean'] = {
+  format: 'binary',
+  id: 16,
+  tests: [
+    [[1], true],
+    [[0], false],
+    [null, null]
+  ]
+}
+
+exports['binary-string'] = {
+  format: 'binary',
+  id: 25,
+  tests: [
+    [
+      new Buffer(['0x73', '0x6c', '0x61', '0x64', '0x64', '0x61'].map(hex)),
+      'sladda'
+    ]
+  ]
+}
+
+exports.point = {
+  format: 'text',
+  id: 600,
+  tests: [
+    ['(25.1,50.5)', function (t, value) {
+      t.deepEqual(value, {x: 25.1, y: 50.5})
+    }]
+  ]
+}
+
+exports.circle = {
+  format: 'text',
+  id: 718,
+  tests: [
+    ['<(25,10),5>', function (t, value) {
+      t.deepEqual(value, {x: 25, y: 10, radius: 5})
+    }]
+  ]
+}
+
+function hex (string) {
+  return parseInt(string, 16)
+}
+
+function dateEquals () {
+  var timestamp = Date.UTC.apply(Date, arguments)
+  return function (t, value) {
+    t.equal(value.toUTCString(), new Date(timestamp).toUTCString())
+  }
+}
Index: TruckSimulator-main/node_modules/pg/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/pg/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2010 - 2021 Brian Carlson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: TruckSimulator-main/node_modules/pg/README.md
===================================================================
--- TruckSimulator-main/node_modules/pg/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,95 @@
+# node-postgres
+
+[![Build Status](https://secure.travis-ci.org/brianc/node-postgres.svg?branch=master)](http://travis-ci.org/brianc/node-postgres)
+<span class="badge-npmversion"><a href="https://npmjs.org/package/pg" title="View this project on NPM"><img src="https://img.shields.io/npm/v/pg.svg" alt="NPM version" /></a></span>
+<span class="badge-npmdownloads"><a href="https://npmjs.org/package/pg" title="View this project on NPM"><img src="https://img.shields.io/npm/dm/pg.svg" alt="NPM downloads" /></a></span>
+
+Non-blocking PostgreSQL client for Node.js. Pure JavaScript and optional native libpq bindings.
+
+## Install
+
+```sh
+$ npm install pg
+```
+
+---
+
+## :star: [Documentation](https://node-postgres.com) :star:
+
+### Features
+
+- Pure JavaScript client and native libpq bindings share _the same API_
+- Connection pooling
+- Extensible JS ↔ PostgreSQL data-type coercion
+- Supported PostgreSQL features
+  - Parameterized queries
+  - Named statements with query plan caching
+  - Async notifications with `LISTEN/NOTIFY`
+  - Bulk import & export with `COPY TO/COPY FROM`
+
+### Extras
+
+node-postgres is by design pretty light on abstractions. These are some handy modules we've been using over the years to complete the picture.
+The entire list can be found on our [wiki](https://github.com/brianc/node-postgres/wiki/Extras).
+
+## Support
+
+node-postgres is free software. If you encounter a bug with the library please open an issue on the [GitHub repo](https://github.com/brianc/node-postgres). If you have questions unanswered by the documentation please open an issue pointing out how the documentation was unclear & I will do my best to make it better!
+
+When you open an issue please provide:
+
+- version of Node
+- version of Postgres
+- smallest possible snippet of code to reproduce the problem
+
+You can also follow me [@briancarlson](https://twitter.com/briancarlson) if that's your thing. I try to always announce noteworthy changes & developments with node-postgres on Twitter.
+
+## Sponsorship :two_hearts:
+
+node-postgres's continued development has been made possible in part by generous financial support from [the community](https://github.com/brianc/node-postgres/blob/master/SPONSORS.md).
+
+If you or your company are benefiting from node-postgres and would like to help keep the project financially sustainable [please consider supporting](https://github.com/sponsors/brianc) its development.
+
+### Featured sponsor
+
+Special thanks to [medplum](https://medplum.com) for their generous and thoughtful support of node-postgres!
+
+![medplum](https://raw.githubusercontent.com/medplum/medplum-logo/refs/heads/main/medplum-logo.png)
+
+## Contributing
+
+**:heart: contributions!**
+
+I will **happily** accept your pull request if it:
+
+- **has tests**
+- looks reasonable
+- does not break backwards compatibility
+
+If your change involves breaking backwards compatibility please please point that out in the pull request & we can discuss & plan when and how to release it and what type of documentation or communicate it will require.
+
+## Troubleshooting and FAQ
+
+The causes and solutions to common errors can be found among the [Frequently Asked Questions (FAQ)](https://github.com/brianc/node-postgres/wiki/FAQ)
+
+## License
+
+Copyright (c) 2010-2020 Brian Carlson (brian.m.carlson@gmail.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/pg/esm/index.mjs
===================================================================
--- TruckSimulator-main/node_modules/pg/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/esm/index.mjs	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,20 @@
+// ESM wrapper for pg
+import pg from '../lib/index.js'
+
+// Re-export all the properties
+export const Client = pg.Client
+export const Pool = pg.Pool
+export const Connection = pg.Connection
+export const types = pg.types
+export const Query = pg.Query
+export const DatabaseError = pg.DatabaseError
+export const escapeIdentifier = pg.escapeIdentifier
+export const escapeLiteral = pg.escapeLiteral
+export const Result = pg.Result
+export const TypeOverrides = pg.TypeOverrides
+
+// Also export the defaults
+export const defaults = pg.defaults
+
+// Re-export the default
+export default pg
Index: TruckSimulator-main/node_modules/pg/lib/client.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,650 @@
+'use strict'
+
+const EventEmitter = require('events').EventEmitter
+const utils = require('./utils')
+const sasl = require('./crypto/sasl')
+const TypeOverrides = require('./type-overrides')
+
+const ConnectionParameters = require('./connection-parameters')
+const Query = require('./query')
+const defaults = require('./defaults')
+const Connection = require('./connection')
+const crypto = require('./crypto/utils')
+
+class Client extends EventEmitter {
+  constructor(config) {
+    super()
+
+    this.connectionParameters = new ConnectionParameters(config)
+    this.user = this.connectionParameters.user
+    this.database = this.connectionParameters.database
+    this.port = this.connectionParameters.port
+    this.host = this.connectionParameters.host
+
+    // "hiding" the password so it doesn't show up in stack traces
+    // or if the client is console.logged
+    Object.defineProperty(this, 'password', {
+      configurable: true,
+      enumerable: false,
+      writable: true,
+      value: this.connectionParameters.password,
+    })
+
+    this.replication = this.connectionParameters.replication
+
+    const c = config || {}
+
+    this._Promise = c.Promise || global.Promise
+    this._types = new TypeOverrides(c.types)
+    this._ending = false
+    this._ended = false
+    this._connecting = false
+    this._connected = false
+    this._connectionError = false
+    this._queryable = true
+
+    this.enableChannelBinding = Boolean(c.enableChannelBinding) // set true to use SCRAM-SHA-256-PLUS when offered
+    this.connection =
+      c.connection ||
+      new Connection({
+        stream: c.stream,
+        ssl: this.connectionParameters.ssl,
+        keepAlive: c.keepAlive || false,
+        keepAliveInitialDelayMillis: c.keepAliveInitialDelayMillis || 0,
+        encoding: this.connectionParameters.client_encoding || 'utf8',
+      })
+    this.queryQueue = []
+    this.binary = c.binary || defaults.binary
+    this.processID = null
+    this.secretKey = null
+    this.ssl = this.connectionParameters.ssl || false
+    // As with Password, make SSL->Key (the private key) non-enumerable.
+    // It won't show up in stack traces
+    // or if the client is console.logged
+    if (this.ssl && this.ssl.key) {
+      Object.defineProperty(this.ssl, 'key', {
+        enumerable: false,
+      })
+    }
+
+    this._connectionTimeoutMillis = c.connectionTimeoutMillis || 0
+  }
+
+  _errorAllQueries(err) {
+    const enqueueError = (query) => {
+      process.nextTick(() => {
+        query.handleError(err, this.connection)
+      })
+    }
+
+    if (this.activeQuery) {
+      enqueueError(this.activeQuery)
+      this.activeQuery = null
+    }
+
+    this.queryQueue.forEach(enqueueError)
+    this.queryQueue.length = 0
+  }
+
+  _connect(callback) {
+    const self = this
+    const con = this.connection
+    this._connectionCallback = callback
+
+    if (this._connecting || this._connected) {
+      const err = new Error('Client has already been connected. You cannot reuse a client.')
+      process.nextTick(() => {
+        callback(err)
+      })
+      return
+    }
+    this._connecting = true
+
+    if (this._connectionTimeoutMillis > 0) {
+      this.connectionTimeoutHandle = setTimeout(() => {
+        con._ending = true
+        con.stream.destroy(new Error('timeout expired'))
+      }, this._connectionTimeoutMillis)
+
+      if (this.connectionTimeoutHandle.unref) {
+        this.connectionTimeoutHandle.unref()
+      }
+    }
+
+    if (this.host && this.host.indexOf('/') === 0) {
+      con.connect(this.host + '/.s.PGSQL.' + this.port)
+    } else {
+      con.connect(this.port, this.host)
+    }
+
+    // once connection is established send startup message
+    con.on('connect', function () {
+      if (self.ssl) {
+        con.requestSsl()
+      } else {
+        con.startup(self.getStartupConf())
+      }
+    })
+
+    con.on('sslconnect', function () {
+      con.startup(self.getStartupConf())
+    })
+
+    this._attachListeners(con)
+
+    con.once('end', () => {
+      const error = this._ending ? new Error('Connection terminated') : new Error('Connection terminated unexpectedly')
+
+      clearTimeout(this.connectionTimeoutHandle)
+      this._errorAllQueries(error)
+      this._ended = true
+
+      if (!this._ending) {
+        // if the connection is ended without us calling .end()
+        // on this client then we have an unexpected disconnection
+        // treat this as an error unless we've already emitted an error
+        // during connection.
+        if (this._connecting && !this._connectionError) {
+          if (this._connectionCallback) {
+            this._connectionCallback(error)
+          } else {
+            this._handleErrorEvent(error)
+          }
+        } else if (!this._connectionError) {
+          this._handleErrorEvent(error)
+        }
+      }
+
+      process.nextTick(() => {
+        this.emit('end')
+      })
+    })
+  }
+
+  connect(callback) {
+    if (callback) {
+      this._connect(callback)
+      return
+    }
+
+    return new this._Promise((resolve, reject) => {
+      this._connect((error) => {
+        if (error) {
+          reject(error)
+        } else {
+          resolve()
+        }
+      })
+    })
+  }
+
+  _attachListeners(con) {
+    // password request handling
+    con.on('authenticationCleartextPassword', this._handleAuthCleartextPassword.bind(this))
+    // password request handling
+    con.on('authenticationMD5Password', this._handleAuthMD5Password.bind(this))
+    // password request handling (SASL)
+    con.on('authenticationSASL', this._handleAuthSASL.bind(this))
+    con.on('authenticationSASLContinue', this._handleAuthSASLContinue.bind(this))
+    con.on('authenticationSASLFinal', this._handleAuthSASLFinal.bind(this))
+    con.on('backendKeyData', this._handleBackendKeyData.bind(this))
+    con.on('error', this._handleErrorEvent.bind(this))
+    con.on('errorMessage', this._handleErrorMessage.bind(this))
+    con.on('readyForQuery', this._handleReadyForQuery.bind(this))
+    con.on('notice', this._handleNotice.bind(this))
+    con.on('rowDescription', this._handleRowDescription.bind(this))
+    con.on('dataRow', this._handleDataRow.bind(this))
+    con.on('portalSuspended', this._handlePortalSuspended.bind(this))
+    con.on('emptyQuery', this._handleEmptyQuery.bind(this))
+    con.on('commandComplete', this._handleCommandComplete.bind(this))
+    con.on('parseComplete', this._handleParseComplete.bind(this))
+    con.on('copyInResponse', this._handleCopyInResponse.bind(this))
+    con.on('copyData', this._handleCopyData.bind(this))
+    con.on('notification', this._handleNotification.bind(this))
+  }
+
+  // TODO(bmc): deprecate pgpass "built in" integration since this.password can be a function
+  // it can be supplied by the user if required - this is a breaking change!
+  _checkPgPass(cb) {
+    const con = this.connection
+    if (typeof this.password === 'function') {
+      this._Promise
+        .resolve()
+        .then(() => this.password())
+        .then((pass) => {
+          if (pass !== undefined) {
+            if (typeof pass !== 'string') {
+              con.emit('error', new TypeError('Password must be a string'))
+              return
+            }
+            this.connectionParameters.password = this.password = pass
+          } else {
+            this.connectionParameters.password = this.password = null
+          }
+          cb()
+        })
+        .catch((err) => {
+          con.emit('error', err)
+        })
+    } else if (this.password !== null) {
+      cb()
+    } else {
+      try {
+        const pgPass = require('pgpass')
+        pgPass(this.connectionParameters, (pass) => {
+          if (undefined !== pass) {
+            this.connectionParameters.password = this.password = pass
+          }
+          cb()
+        })
+      } catch (e) {
+        this.emit('error', e)
+      }
+    }
+  }
+
+  _handleAuthCleartextPassword(msg) {
+    this._checkPgPass(() => {
+      this.connection.password(this.password)
+    })
+  }
+
+  _handleAuthMD5Password(msg) {
+    this._checkPgPass(async () => {
+      try {
+        const hashedPassword = await crypto.postgresMd5PasswordHash(this.user, this.password, msg.salt)
+        this.connection.password(hashedPassword)
+      } catch (e) {
+        this.emit('error', e)
+      }
+    })
+  }
+
+  _handleAuthSASL(msg) {
+    this._checkPgPass(() => {
+      try {
+        this.saslSession = sasl.startSession(msg.mechanisms, this.enableChannelBinding && this.connection.stream)
+        this.connection.sendSASLInitialResponseMessage(this.saslSession.mechanism, this.saslSession.response)
+      } catch (err) {
+        this.connection.emit('error', err)
+      }
+    })
+  }
+
+  async _handleAuthSASLContinue(msg) {
+    try {
+      await sasl.continueSession(
+        this.saslSession,
+        this.password,
+        msg.data,
+        this.enableChannelBinding && this.connection.stream
+      )
+      this.connection.sendSCRAMClientFinalMessage(this.saslSession.response)
+    } catch (err) {
+      this.connection.emit('error', err)
+    }
+  }
+
+  _handleAuthSASLFinal(msg) {
+    try {
+      sasl.finalizeSession(this.saslSession, msg.data)
+      this.saslSession = null
+    } catch (err) {
+      this.connection.emit('error', err)
+    }
+  }
+
+  _handleBackendKeyData(msg) {
+    this.processID = msg.processID
+    this.secretKey = msg.secretKey
+  }
+
+  _handleReadyForQuery(msg) {
+    if (this._connecting) {
+      this._connecting = false
+      this._connected = true
+      clearTimeout(this.connectionTimeoutHandle)
+
+      // process possible callback argument to Client#connect
+      if (this._connectionCallback) {
+        this._connectionCallback(null, this)
+        // remove callback for proper error handling
+        // after the connect event
+        this._connectionCallback = null
+      }
+      this.emit('connect')
+    }
+    const { activeQuery } = this
+    this.activeQuery = null
+    this.readyForQuery = true
+    if (activeQuery) {
+      activeQuery.handleReadyForQuery(this.connection)
+    }
+    this._pulseQueryQueue()
+  }
+
+  // if we receive an error event or error message
+  // during the connection process we handle it here
+  _handleErrorWhileConnecting(err) {
+    if (this._connectionError) {
+      // TODO(bmc): this is swallowing errors - we shouldn't do this
+      return
+    }
+    this._connectionError = true
+    clearTimeout(this.connectionTimeoutHandle)
+    if (this._connectionCallback) {
+      return this._connectionCallback(err)
+    }
+    this.emit('error', err)
+  }
+
+  // if we're connected and we receive an error event from the connection
+  // this means the socket is dead - do a hard abort of all queries and emit
+  // the socket error on the client as well
+  _handleErrorEvent(err) {
+    if (this._connecting) {
+      return this._handleErrorWhileConnecting(err)
+    }
+    this._queryable = false
+    this._errorAllQueries(err)
+    this.emit('error', err)
+  }
+
+  // handle error messages from the postgres backend
+  _handleErrorMessage(msg) {
+    if (this._connecting) {
+      return this._handleErrorWhileConnecting(msg)
+    }
+    const activeQuery = this.activeQuery
+
+    if (!activeQuery) {
+      this._handleErrorEvent(msg)
+      return
+    }
+
+    this.activeQuery = null
+    activeQuery.handleError(msg, this.connection)
+  }
+
+  _handleRowDescription(msg) {
+    // delegate rowDescription to active query
+    this.activeQuery.handleRowDescription(msg)
+  }
+
+  _handleDataRow(msg) {
+    // delegate dataRow to active query
+    this.activeQuery.handleDataRow(msg)
+  }
+
+  _handlePortalSuspended(msg) {
+    // delegate portalSuspended to active query
+    this.activeQuery.handlePortalSuspended(this.connection)
+  }
+
+  _handleEmptyQuery(msg) {
+    // delegate emptyQuery to active query
+    this.activeQuery.handleEmptyQuery(this.connection)
+  }
+
+  _handleCommandComplete(msg) {
+    if (this.activeQuery == null) {
+      const error = new Error('Received unexpected commandComplete message from backend.')
+      this._handleErrorEvent(error)
+      return
+    }
+    // delegate commandComplete to active query
+    this.activeQuery.handleCommandComplete(msg, this.connection)
+  }
+
+  _handleParseComplete() {
+    if (this.activeQuery == null) {
+      const error = new Error('Received unexpected parseComplete message from backend.')
+      this._handleErrorEvent(error)
+      return
+    }
+    // if a prepared statement has a name and properly parses
+    // we track that its already been executed so we don't parse
+    // it again on the same client
+    if (this.activeQuery.name) {
+      this.connection.parsedStatements[this.activeQuery.name] = this.activeQuery.text
+    }
+  }
+
+  _handleCopyInResponse(msg) {
+    this.activeQuery.handleCopyInResponse(this.connection)
+  }
+
+  _handleCopyData(msg) {
+    this.activeQuery.handleCopyData(msg, this.connection)
+  }
+
+  _handleNotification(msg) {
+    this.emit('notification', msg)
+  }
+
+  _handleNotice(msg) {
+    this.emit('notice', msg)
+  }
+
+  getStartupConf() {
+    const params = this.connectionParameters
+
+    const data = {
+      user: params.user,
+      database: params.database,
+    }
+
+    const appName = params.application_name || params.fallback_application_name
+    if (appName) {
+      data.application_name = appName
+    }
+    if (params.replication) {
+      data.replication = '' + params.replication
+    }
+    if (params.statement_timeout) {
+      data.statement_timeout = String(parseInt(params.statement_timeout, 10))
+    }
+    if (params.lock_timeout) {
+      data.lock_timeout = String(parseInt(params.lock_timeout, 10))
+    }
+    if (params.idle_in_transaction_session_timeout) {
+      data.idle_in_transaction_session_timeout = String(parseInt(params.idle_in_transaction_session_timeout, 10))
+    }
+    if (params.options) {
+      data.options = params.options
+    }
+
+    return data
+  }
+
+  cancel(client, query) {
+    if (client.activeQuery === query) {
+      const con = this.connection
+
+      if (this.host && this.host.indexOf('/') === 0) {
+        con.connect(this.host + '/.s.PGSQL.' + this.port)
+      } else {
+        con.connect(this.port, this.host)
+      }
+
+      // once connection is established send cancel message
+      con.on('connect', function () {
+        con.cancel(client.processID, client.secretKey)
+      })
+    } else if (client.queryQueue.indexOf(query) !== -1) {
+      client.queryQueue.splice(client.queryQueue.indexOf(query), 1)
+    }
+  }
+
+  setTypeParser(oid, format, parseFn) {
+    return this._types.setTypeParser(oid, format, parseFn)
+  }
+
+  getTypeParser(oid, format) {
+    return this._types.getTypeParser(oid, format)
+  }
+
+  // escapeIdentifier and escapeLiteral moved to utility functions & exported
+  // on PG
+  // re-exported here for backwards compatibility
+  escapeIdentifier(str) {
+    return utils.escapeIdentifier(str)
+  }
+
+  escapeLiteral(str) {
+    return utils.escapeLiteral(str)
+  }
+
+  _pulseQueryQueue() {
+    if (this.readyForQuery === true) {
+      this.activeQuery = this.queryQueue.shift()
+      if (this.activeQuery) {
+        this.readyForQuery = false
+        this.hasExecuted = true
+
+        const queryError = this.activeQuery.submit(this.connection)
+        if (queryError) {
+          process.nextTick(() => {
+            this.activeQuery.handleError(queryError, this.connection)
+            this.readyForQuery = true
+            this._pulseQueryQueue()
+          })
+        }
+      } else if (this.hasExecuted) {
+        this.activeQuery = null
+        this.emit('drain')
+      }
+    }
+  }
+
+  query(config, values, callback) {
+    // can take in strings, config object or query object
+    let query
+    let result
+    let readTimeout
+    let readTimeoutTimer
+    let queryCallback
+
+    if (config === null || config === undefined) {
+      throw new TypeError('Client was passed a null or undefined query')
+    } else if (typeof config.submit === 'function') {
+      readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+      result = query = config
+      if (typeof values === 'function') {
+        query.callback = query.callback || values
+      }
+    } else {
+      readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+      query = new Query(config, values, callback)
+      if (!query.callback) {
+        result = new this._Promise((resolve, reject) => {
+          query.callback = (err, res) => (err ? reject(err) : resolve(res))
+        }).catch((err) => {
+          // replace the stack trace that leads to `TCP.onStreamRead` with one that leads back to the
+          // application that created the query
+          Error.captureStackTrace(err)
+          throw err
+        })
+      }
+    }
+
+    if (readTimeout) {
+      queryCallback = query.callback
+
+      readTimeoutTimer = setTimeout(() => {
+        const error = new Error('Query read timeout')
+
+        process.nextTick(() => {
+          query.handleError(error, this.connection)
+        })
+
+        queryCallback(error)
+
+        // we already returned an error,
+        // just do nothing if query completes
+        query.callback = () => {}
+
+        // Remove from queue
+        const index = this.queryQueue.indexOf(query)
+        if (index > -1) {
+          this.queryQueue.splice(index, 1)
+        }
+
+        this._pulseQueryQueue()
+      }, readTimeout)
+
+      query.callback = (err, res) => {
+        clearTimeout(readTimeoutTimer)
+        queryCallback(err, res)
+      }
+    }
+
+    if (this.binary && !query.binary) {
+      query.binary = true
+    }
+
+    if (query._result && !query._result._types) {
+      query._result._types = this._types
+    }
+
+    if (!this._queryable) {
+      process.nextTick(() => {
+        query.handleError(new Error('Client has encountered a connection error and is not queryable'), this.connection)
+      })
+      return result
+    }
+
+    if (this._ending) {
+      process.nextTick(() => {
+        query.handleError(new Error('Client was closed and is not queryable'), this.connection)
+      })
+      return result
+    }
+
+    this.queryQueue.push(query)
+    this._pulseQueryQueue()
+    return result
+  }
+
+  ref() {
+    this.connection.ref()
+  }
+
+  unref() {
+    this.connection.unref()
+  }
+
+  end(cb) {
+    this._ending = true
+
+    // if we have never connected, then end is a noop, callback immediately
+    if (!this.connection._connecting || this._ended) {
+      if (cb) {
+        cb()
+      } else {
+        return this._Promise.resolve()
+      }
+    }
+
+    if (this.activeQuery || !this._queryable) {
+      // if we have an active query we need to force a disconnect
+      // on the socket - otherwise a hung query could block end forever
+      this.connection.stream.destroy()
+    } else {
+      this.connection.end()
+    }
+
+    if (cb) {
+      this.connection.once('end', cb)
+    } else {
+      return new this._Promise((resolve) => {
+        this.connection.once('end', resolve)
+      })
+    }
+  }
+}
+
+// expose a Query constructor
+Client.Query = Query
+
+module.exports = Client
Index: TruckSimulator-main/node_modules/pg/lib/connection-parameters.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/connection-parameters.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/connection-parameters.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,167 @@
+'use strict'
+
+const dns = require('dns')
+
+const defaults = require('./defaults')
+
+const parse = require('pg-connection-string').parse // parses a connection string
+
+const val = function (key, config, envVar) {
+  if (envVar === undefined) {
+    envVar = process.env['PG' + key.toUpperCase()]
+  } else if (envVar === false) {
+    // do nothing ... use false
+  } else {
+    envVar = process.env[envVar]
+  }
+
+  return config[key] || envVar || defaults[key]
+}
+
+const readSSLConfigFromEnvironment = function () {
+  switch (process.env.PGSSLMODE) {
+    case 'disable':
+      return false
+    case 'prefer':
+    case 'require':
+    case 'verify-ca':
+    case 'verify-full':
+      return true
+    case 'no-verify':
+      return { rejectUnauthorized: false }
+  }
+  return defaults.ssl
+}
+
+// Convert arg to a string, surround in single quotes, and escape single quotes and backslashes
+const quoteParamValue = function (value) {
+  return "'" + ('' + value).replace(/\\/g, '\\\\').replace(/'/g, "\\'") + "'"
+}
+
+const add = function (params, config, paramName) {
+  const value = config[paramName]
+  if (value !== undefined && value !== null) {
+    params.push(paramName + '=' + quoteParamValue(value))
+  }
+}
+
+class ConnectionParameters {
+  constructor(config) {
+    // if a string is passed, it is a raw connection string so we parse it into a config
+    config = typeof config === 'string' ? parse(config) : config || {}
+
+    // if the config has a connectionString defined, parse IT into the config we use
+    // this will override other default values with what is stored in connectionString
+    if (config.connectionString) {
+      config = Object.assign({}, config, parse(config.connectionString))
+    }
+
+    this.user = val('user', config)
+    this.database = val('database', config)
+
+    if (this.database === undefined) {
+      this.database = this.user
+    }
+
+    this.port = parseInt(val('port', config), 10)
+    this.host = val('host', config)
+
+    // "hiding" the password so it doesn't show up in stack traces
+    // or if the client is console.logged
+    Object.defineProperty(this, 'password', {
+      configurable: true,
+      enumerable: false,
+      writable: true,
+      value: val('password', config),
+    })
+
+    this.binary = val('binary', config)
+    this.options = val('options', config)
+
+    this.ssl = typeof config.ssl === 'undefined' ? readSSLConfigFromEnvironment() : config.ssl
+
+    if (typeof this.ssl === 'string') {
+      if (this.ssl === 'true') {
+        this.ssl = true
+      }
+    }
+    // support passing in ssl=no-verify via connection string
+    if (this.ssl === 'no-verify') {
+      this.ssl = { rejectUnauthorized: false }
+    }
+    if (this.ssl && this.ssl.key) {
+      Object.defineProperty(this.ssl, 'key', {
+        enumerable: false,
+      })
+    }
+
+    this.client_encoding = val('client_encoding', config)
+    this.replication = val('replication', config)
+    // a domain socket begins with '/'
+    this.isDomainSocket = !(this.host || '').indexOf('/')
+
+    this.application_name = val('application_name', config, 'PGAPPNAME')
+    this.fallback_application_name = val('fallback_application_name', config, false)
+    this.statement_timeout = val('statement_timeout', config, false)
+    this.lock_timeout = val('lock_timeout', config, false)
+    this.idle_in_transaction_session_timeout = val('idle_in_transaction_session_timeout', config, false)
+    this.query_timeout = val('query_timeout', config, false)
+
+    if (config.connectionTimeoutMillis === undefined) {
+      this.connect_timeout = process.env.PGCONNECT_TIMEOUT || 0
+    } else {
+      this.connect_timeout = Math.floor(config.connectionTimeoutMillis / 1000)
+    }
+
+    if (config.keepAlive === false) {
+      this.keepalives = 0
+    } else if (config.keepAlive === true) {
+      this.keepalives = 1
+    }
+
+    if (typeof config.keepAliveInitialDelayMillis === 'number') {
+      this.keepalives_idle = Math.floor(config.keepAliveInitialDelayMillis / 1000)
+    }
+  }
+
+  getLibpqConnectionString(cb) {
+    const params = []
+    add(params, this, 'user')
+    add(params, this, 'password')
+    add(params, this, 'port')
+    add(params, this, 'application_name')
+    add(params, this, 'fallback_application_name')
+    add(params, this, 'connect_timeout')
+    add(params, this, 'options')
+
+    const ssl = typeof this.ssl === 'object' ? this.ssl : this.ssl ? { sslmode: this.ssl } : {}
+    add(params, ssl, 'sslmode')
+    add(params, ssl, 'sslca')
+    add(params, ssl, 'sslkey')
+    add(params, ssl, 'sslcert')
+    add(params, ssl, 'sslrootcert')
+
+    if (this.database) {
+      params.push('dbname=' + quoteParamValue(this.database))
+    }
+    if (this.replication) {
+      params.push('replication=' + quoteParamValue(this.replication))
+    }
+    if (this.host) {
+      params.push('host=' + quoteParamValue(this.host))
+    }
+    if (this.isDomainSocket) {
+      return cb(null, params.join(' '))
+    }
+    if (this.client_encoding) {
+      params.push('client_encoding=' + quoteParamValue(this.client_encoding))
+    }
+    dns.lookup(this.host, function (err, address) {
+      if (err) return cb(err, null)
+      params.push('hostaddr=' + quoteParamValue(address))
+      return cb(null, params.join(' '))
+    })
+  }
+}
+
+module.exports = ConnectionParameters
Index: TruckSimulator-main/node_modules/pg/lib/connection.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/connection.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/connection.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,222 @@
+'use strict'
+
+const EventEmitter = require('events').EventEmitter
+
+const { parse, serialize } = require('pg-protocol')
+const { getStream, getSecureStream } = require('./stream')
+
+const flushBuffer = serialize.flush()
+const syncBuffer = serialize.sync()
+const endBuffer = serialize.end()
+
+// TODO(bmc) support binary mode at some point
+class Connection extends EventEmitter {
+  constructor(config) {
+    super()
+    config = config || {}
+
+    this.stream = config.stream || getStream(config.ssl)
+    if (typeof this.stream === 'function') {
+      this.stream = this.stream(config)
+    }
+
+    this._keepAlive = config.keepAlive
+    this._keepAliveInitialDelayMillis = config.keepAliveInitialDelayMillis
+    this.lastBuffer = false
+    this.parsedStatements = {}
+    this.ssl = config.ssl || false
+    this._ending = false
+    this._emitMessage = false
+    const self = this
+    this.on('newListener', function (eventName) {
+      if (eventName === 'message') {
+        self._emitMessage = true
+      }
+    })
+  }
+
+  connect(port, host) {
+    const self = this
+
+    this._connecting = true
+    this.stream.setNoDelay(true)
+    this.stream.connect(port, host)
+
+    this.stream.once('connect', function () {
+      if (self._keepAlive) {
+        self.stream.setKeepAlive(true, self._keepAliveInitialDelayMillis)
+      }
+      self.emit('connect')
+    })
+
+    const reportStreamError = function (error) {
+      // errors about disconnections should be ignored during disconnect
+      if (self._ending && (error.code === 'ECONNRESET' || error.code === 'EPIPE')) {
+        return
+      }
+      self.emit('error', error)
+    }
+    this.stream.on('error', reportStreamError)
+
+    this.stream.on('close', function () {
+      self.emit('end')
+    })
+
+    if (!this.ssl) {
+      return this.attachListeners(this.stream)
+    }
+
+    this.stream.once('data', function (buffer) {
+      const responseCode = buffer.toString('utf8')
+      switch (responseCode) {
+        case 'S': // Server supports SSL connections, continue with a secure connection
+          break
+        case 'N': // Server does not support SSL connections
+          self.stream.end()
+          return self.emit('error', new Error('The server does not support SSL connections'))
+        default:
+          // Any other response byte, including 'E' (ErrorResponse) indicating a server error
+          self.stream.end()
+          return self.emit('error', new Error('There was an error establishing an SSL connection'))
+      }
+      const options = {
+        socket: self.stream,
+      }
+
+      if (self.ssl !== true) {
+        Object.assign(options, self.ssl)
+
+        if ('key' in self.ssl) {
+          options.key = self.ssl.key
+        }
+      }
+
+      const net = require('net')
+      if (net.isIP && net.isIP(host) === 0) {
+        options.servername = host
+      }
+      try {
+        self.stream = getSecureStream(options)
+      } catch (err) {
+        return self.emit('error', err)
+      }
+      self.attachListeners(self.stream)
+      self.stream.on('error', reportStreamError)
+
+      self.emit('sslconnect')
+    })
+  }
+
+  attachListeners(stream) {
+    parse(stream, (msg) => {
+      const eventName = msg.name === 'error' ? 'errorMessage' : msg.name
+      if (this._emitMessage) {
+        this.emit('message', msg)
+      }
+      this.emit(eventName, msg)
+    })
+  }
+
+  requestSsl() {
+    this.stream.write(serialize.requestSsl())
+  }
+
+  startup(config) {
+    this.stream.write(serialize.startup(config))
+  }
+
+  cancel(processID, secretKey) {
+    this._send(serialize.cancel(processID, secretKey))
+  }
+
+  password(password) {
+    this._send(serialize.password(password))
+  }
+
+  sendSASLInitialResponseMessage(mechanism, initialResponse) {
+    this._send(serialize.sendSASLInitialResponseMessage(mechanism, initialResponse))
+  }
+
+  sendSCRAMClientFinalMessage(additionalData) {
+    this._send(serialize.sendSCRAMClientFinalMessage(additionalData))
+  }
+
+  _send(buffer) {
+    if (!this.stream.writable) {
+      return false
+    }
+    return this.stream.write(buffer)
+  }
+
+  query(text) {
+    this._send(serialize.query(text))
+  }
+
+  // send parse message
+  parse(query) {
+    this._send(serialize.parse(query))
+  }
+
+  // send bind message
+  bind(config) {
+    this._send(serialize.bind(config))
+  }
+
+  // send execute message
+  execute(config) {
+    this._send(serialize.execute(config))
+  }
+
+  flush() {
+    if (this.stream.writable) {
+      this.stream.write(flushBuffer)
+    }
+  }
+
+  sync() {
+    this._ending = true
+    this._send(syncBuffer)
+  }
+
+  ref() {
+    this.stream.ref()
+  }
+
+  unref() {
+    this.stream.unref()
+  }
+
+  end() {
+    // 0x58 = 'X'
+    this._ending = true
+    if (!this._connecting || !this.stream.writable) {
+      this.stream.end()
+      return
+    }
+    return this.stream.write(endBuffer, () => {
+      this.stream.end()
+    })
+  }
+
+  close(msg) {
+    this._send(serialize.close(msg))
+  }
+
+  describe(msg) {
+    this._send(serialize.describe(msg))
+  }
+
+  sendCopyFromChunk(chunk) {
+    this._send(serialize.copyData(chunk))
+  }
+
+  endCopyFrom() {
+    this._send(serialize.copyDone())
+  }
+
+  sendCopyFail(msg) {
+    this._send(serialize.copyFail(msg))
+  }
+}
+
+module.exports = Connection
Index: TruckSimulator-main/node_modules/pg/lib/crypto/cert-signatures.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/crypto/cert-signatures.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/crypto/cert-signatures.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,122 @@
+function x509Error(msg, cert) {
+  return new Error('SASL channel binding: ' + msg + ' when parsing public certificate ' + cert.toString('base64'))
+}
+
+function readASN1Length(data, index) {
+  let length = data[index++]
+  if (length < 0x80) return { length, index }
+
+  const lengthBytes = length & 0x7f
+  if (lengthBytes > 4) throw x509Error('bad length', data)
+
+  length = 0
+  for (let i = 0; i < lengthBytes; i++) {
+    length = (length << 8) | data[index++]
+  }
+
+  return { length, index }
+}
+
+function readASN1OID(data, index) {
+  if (data[index++] !== 0x6) throw x509Error('non-OID data', data) // 6 = OID
+
+  const { length: OIDLength, index: indexAfterOIDLength } = readASN1Length(data, index)
+  index = indexAfterOIDLength
+  const lastIndex = index + OIDLength
+
+  const byte1 = data[index++]
+  let oid = ((byte1 / 40) >> 0) + '.' + (byte1 % 40)
+
+  while (index < lastIndex) {
+    // loop over numbers in OID
+    let value = 0
+    while (index < lastIndex) {
+      // loop over bytes in number
+      const nextByte = data[index++]
+      value = (value << 7) | (nextByte & 0x7f)
+      if (nextByte < 0x80) break
+    }
+    oid += '.' + value
+  }
+
+  return { oid, index }
+}
+
+function expectASN1Seq(data, index) {
+  if (data[index++] !== 0x30) throw x509Error('non-sequence data', data) // 30 = Sequence
+  return readASN1Length(data, index)
+}
+
+function signatureAlgorithmHashFromCertificate(data, index) {
+  // read this thread: https://www.postgresql.org/message-id/17760-b6c61e752ec07060%40postgresql.org
+  if (index === undefined) index = 0
+  index = expectASN1Seq(data, index).index
+  const { length: certInfoLength, index: indexAfterCertInfoLength } = expectASN1Seq(data, index)
+  index = indexAfterCertInfoLength + certInfoLength // skip over certificate info
+  index = expectASN1Seq(data, index).index // skip over signature length field
+  const { oid, index: indexAfterOID } = readASN1OID(data, index)
+  switch (oid) {
+    // RSA
+    case '1.2.840.113549.1.1.4':
+      return 'MD5'
+    case '1.2.840.113549.1.1.5':
+      return 'SHA-1'
+    case '1.2.840.113549.1.1.11':
+      return 'SHA-256'
+    case '1.2.840.113549.1.1.12':
+      return 'SHA-384'
+    case '1.2.840.113549.1.1.13':
+      return 'SHA-512'
+    case '1.2.840.113549.1.1.14':
+      return 'SHA-224'
+    case '1.2.840.113549.1.1.15':
+      return 'SHA512-224'
+    case '1.2.840.113549.1.1.16':
+      return 'SHA512-256'
+    // ECDSA
+    case '1.2.840.10045.4.1':
+      return 'SHA-1'
+    case '1.2.840.10045.4.3.1':
+      return 'SHA-224'
+    case '1.2.840.10045.4.3.2':
+      return 'SHA-256'
+    case '1.2.840.10045.4.3.3':
+      return 'SHA-384'
+    case '1.2.840.10045.4.3.4':
+      return 'SHA-512'
+    // RSASSA-PSS: hash is indicated separately
+    case '1.2.840.113549.1.1.10': {
+      index = indexAfterOID
+      index = expectASN1Seq(data, index).index
+      if (data[index++] !== 0xa0) throw x509Error('non-tag data', data) // a0 = constructed tag 0
+      index = readASN1Length(data, index).index // skip over tag length field
+      index = expectASN1Seq(data, index).index // skip over sequence length field
+      const { oid: hashOID } = readASN1OID(data, index)
+      switch (hashOID) {
+        // standalone hash OIDs
+        case '1.2.840.113549.2.5':
+          return 'MD5'
+        case '1.3.14.3.2.26':
+          return 'SHA-1'
+        case '2.16.840.1.101.3.4.2.1':
+          return 'SHA-256'
+        case '2.16.840.1.101.3.4.2.2':
+          return 'SHA-384'
+        case '2.16.840.1.101.3.4.2.3':
+          return 'SHA-512'
+      }
+      throw x509Error('unknown hash OID ' + hashOID, data)
+    }
+    // Ed25519 -- see https: return//github.com/openssl/openssl/issues/15477
+    case '1.3.101.110':
+    case '1.3.101.112': // ph
+      return 'SHA-512'
+    // Ed448 -- still not in pg 17.2 (if supported, digest would be SHAKE256 x 64 bytes)
+    case '1.3.101.111':
+    case '1.3.101.113': // ph
+      throw x509Error('Ed448 certificate channel binding is not currently supported by Postgres')
+  }
+  throw x509Error('unknown OID ' + oid, data)
+}
+
+module.exports = { signatureAlgorithmHashFromCertificate }
Index: TruckSimulator-main/node_modules/pg/lib/crypto/sasl.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/crypto/sasl.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/crypto/sasl.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,212 @@
+'use strict'
+const crypto = require('./utils')
+const { signatureAlgorithmHashFromCertificate } = require('./cert-signatures')
+
+function startSession(mechanisms, stream) {
+  const candidates = ['SCRAM-SHA-256']
+  if (stream) candidates.unshift('SCRAM-SHA-256-PLUS') // higher-priority, so placed first
+
+  const mechanism = candidates.find((candidate) => mechanisms.includes(candidate))
+
+  if (!mechanism) {
+    throw new Error('SASL: Only mechanism(s) ' + candidates.join(' and ') + ' are supported')
+  }
+
+  if (mechanism === 'SCRAM-SHA-256-PLUS' && typeof stream.getPeerCertificate !== 'function') {
+    // this should never happen if we are really talking to a Postgres server
+    throw new Error('SASL: Mechanism SCRAM-SHA-256-PLUS requires a certificate')
+  }
+
+  const clientNonce = crypto.randomBytes(18).toString('base64')
+  const gs2Header = mechanism === 'SCRAM-SHA-256-PLUS' ? 'p=tls-server-end-point' : stream ? 'y' : 'n'
+
+  return {
+    mechanism,
+    clientNonce,
+    response: gs2Header + ',,n=*,r=' + clientNonce,
+    message: 'SASLInitialResponse',
+  }
+}
+
+async function continueSession(session, password, serverData, stream) {
+  if (session.message !== 'SASLInitialResponse') {
+    throw new Error('SASL: Last message was not SASLInitialResponse')
+  }
+  if (typeof password !== 'string') {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a string')
+  }
+  if (password === '') {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: client password must be a non-empty string')
+  }
+  if (typeof serverData !== 'string') {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: serverData must be a string')
+  }
+
+  const sv = parseServerFirstMessage(serverData)
+
+  if (!sv.nonce.startsWith(session.clientNonce)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce does not start with client nonce')
+  } else if (sv.nonce.length === session.clientNonce.length) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: server nonce is too short')
+  }
+
+  const clientFirstMessageBare = 'n=*,r=' + session.clientNonce
+  const serverFirstMessage = 'r=' + sv.nonce + ',s=' + sv.salt + ',i=' + sv.iteration
+
+  // without channel binding:
+  let channelBinding = stream ? 'eSws' : 'biws' // 'y,,' or 'n,,', base64-encoded
+
+  // override if channel binding is in use:
+  if (session.mechanism === 'SCRAM-SHA-256-PLUS') {
+    const peerCert = stream.getPeerCertificate().raw
+    let hashName = signatureAlgorithmHashFromCertificate(peerCert)
+    if (hashName === 'MD5' || hashName === 'SHA-1') hashName = 'SHA-256'
+    const certHash = await crypto.hashByName(hashName, peerCert)
+    const bindingData = Buffer.concat([Buffer.from('p=tls-server-end-point,,'), Buffer.from(certHash)])
+    channelBinding = bindingData.toString('base64')
+  }
+
+  const clientFinalMessageWithoutProof = 'c=' + channelBinding + ',r=' + sv.nonce
+  const authMessage = clientFirstMessageBare + ',' + serverFirstMessage + ',' + clientFinalMessageWithoutProof
+
+  const saltBytes = Buffer.from(sv.salt, 'base64')
+  const saltedPassword = await crypto.deriveKey(password, saltBytes, sv.iteration)
+  const clientKey = await crypto.hmacSha256(saltedPassword, 'Client Key')
+  const storedKey = await crypto.sha256(clientKey)
+  const clientSignature = await crypto.hmacSha256(storedKey, authMessage)
+  const clientProof = xorBuffers(Buffer.from(clientKey), Buffer.from(clientSignature)).toString('base64')
+  const serverKey = await crypto.hmacSha256(saltedPassword, 'Server Key')
+  const serverSignatureBytes = await crypto.hmacSha256(serverKey, authMessage)
+
+  session.message = 'SASLResponse'
+  session.serverSignature = Buffer.from(serverSignatureBytes).toString('base64')
+  session.response = clientFinalMessageWithoutProof + ',p=' + clientProof
+}
+
+function finalizeSession(session, serverData) {
+  if (session.message !== 'SASLResponse') {
+    throw new Error('SASL: Last message was not SASLResponse')
+  }
+  if (typeof serverData !== 'string') {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: serverData must be a string')
+  }
+
+  const { serverSignature } = parseServerFinalMessage(serverData)
+
+  if (serverSignature !== session.serverSignature) {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature does not match')
+  }
+}
+
+/**
+ * printable       = %x21-2B / %x2D-7E
+ *                   ;; Printable ASCII except ",".
+ *                   ;; Note that any "printable" is also
+ *                   ;; a valid "value".
+ */
+function isPrintableChars(text) {
+  if (typeof text !== 'string') {
+    throw new TypeError('SASL: text must be a string')
+  }
+  return text
+    .split('')
+    .map((_, i) => text.charCodeAt(i))
+    .every((c) => (c >= 0x21 && c <= 0x2b) || (c >= 0x2d && c <= 0x7e))
+}
+
+/**
+ * base64-char     = ALPHA / DIGIT / "/" / "+"
+ *
+ * base64-4        = 4base64-char
+ *
+ * base64-3        = 3base64-char "="
+ *
+ * base64-2        = 2base64-char "=="
+ *
+ * base64          = *base64-4 [base64-3 / base64-2]
+ */
+function isBase64(text) {
+  return /^(?:[a-zA-Z0-9+/]{4})*(?:[a-zA-Z0-9+/]{2}==|[a-zA-Z0-9+/]{3}=)?$/.test(text)
+}
+
+function parseAttributePairs(text) {
+  if (typeof text !== 'string') {
+    throw new TypeError('SASL: attribute pairs text must be a string')
+  }
+
+  return new Map(
+    text.split(',').map((attrValue) => {
+      if (!/^.=/.test(attrValue)) {
+        throw new Error('SASL: Invalid attribute pair entry')
+      }
+      const name = attrValue[0]
+      const value = attrValue.substring(2)
+      return [name, value]
+    })
+  )
+}
+
+function parseServerFirstMessage(data) {
+  const attrPairs = parseAttributePairs(data)
+
+  const nonce = attrPairs.get('r')
+  if (!nonce) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce missing')
+  } else if (!isPrintableChars(nonce)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: nonce must only contain printable characters')
+  }
+  const salt = attrPairs.get('s')
+  if (!salt) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt missing')
+  } else if (!isBase64(salt)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: salt must be base64')
+  }
+  const iterationText = attrPairs.get('i')
+  if (!iterationText) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: iteration missing')
+  } else if (!/^[1-9][0-9]*$/.test(iterationText)) {
+    throw new Error('SASL: SCRAM-SERVER-FIRST-MESSAGE: invalid iteration count')
+  }
+  const iteration = parseInt(iterationText, 10)
+
+  return {
+    nonce,
+    salt,
+    iteration,
+  }
+}
+
+function parseServerFinalMessage(serverData) {
+  const attrPairs = parseAttributePairs(serverData)
+  const serverSignature = attrPairs.get('v')
+  if (!serverSignature) {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature is missing')
+  } else if (!isBase64(serverSignature)) {
+    throw new Error('SASL: SCRAM-SERVER-FINAL-MESSAGE: server signature must be base64')
+  }
+  return {
+    serverSignature,
+  }
+}
+
+function xorBuffers(a, b) {
+  if (!Buffer.isBuffer(a)) {
+    throw new TypeError('first argument must be a Buffer')
+  }
+  if (!Buffer.isBuffer(b)) {
+    throw new TypeError('second argument must be a Buffer')
+  }
+  if (a.length !== b.length) {
+    throw new Error('Buffer lengths must match')
+  }
+  if (a.length === 0) {
+    throw new Error('Buffers cannot be empty')
+  }
+  return Buffer.from(a.map((_, i) => a[i] ^ b[i]))
+}
+
+module.exports = {
+  startSession,
+  continueSession,
+  finalizeSession,
+}
Index: TruckSimulator-main/node_modules/pg/lib/crypto/utils-legacy.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/crypto/utils-legacy.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/crypto/utils-legacy.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,43 @@
+'use strict'
+// This file contains crypto utility functions for versions of Node.js < 15.0.0,
+// which does not support the WebCrypto.subtle API.
+
+const nodeCrypto = require('crypto')
+
+function md5(string) {
+  return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')
+}
+
+// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html
+function postgresMd5PasswordHash(user, password, salt) {
+  const inner = md5(password + user)
+  const outer = md5(Buffer.concat([Buffer.from(inner), salt]))
+  return 'md5' + outer
+}
+
+function sha256(text) {
+  return nodeCrypto.createHash('sha256').update(text).digest()
+}
+
+function hashByName(hashName, text) {
+  hashName = hashName.replace(/(\D)-/, '$1') // e.g. SHA-256 -> SHA256
+  return nodeCrypto.createHash(hashName).update(text).digest()
+}
+
+function hmacSha256(key, msg) {
+  return nodeCrypto.createHmac('sha256', key).update(msg).digest()
+}
+
+async function deriveKey(password, salt, iterations) {
+  return nodeCrypto.pbkdf2Sync(password, salt, iterations, 32, 'sha256')
+}
+
+module.exports = {
+  postgresMd5PasswordHash,
+  randomBytes: nodeCrypto.randomBytes,
+  deriveKey,
+  sha256,
+  hashByName,
+  hmacSha256,
+  md5,
+}
Index: TruckSimulator-main/node_modules/pg/lib/crypto/utils-webcrypto.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/crypto/utils-webcrypto.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/crypto/utils-webcrypto.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,89 @@
+const nodeCrypto = require('crypto')
+
+module.exports = {
+  postgresMd5PasswordHash,
+  randomBytes,
+  deriveKey,
+  sha256,
+  hashByName,
+  hmacSha256,
+  md5,
+}
+
+/**
+ * The Web Crypto API - grabbed from the Node.js library or the global
+ * @type Crypto
+ */
+// eslint-disable-next-line no-undef
+const webCrypto = nodeCrypto.webcrypto || globalThis.crypto
+/**
+ * The SubtleCrypto API for low level crypto operations.
+ * @type SubtleCrypto
+ */
+const subtleCrypto = webCrypto.subtle
+const textEncoder = new TextEncoder()
+
+/**
+ *
+ * @param {*} length
+ * @returns
+ */
+function randomBytes(length) {
+  return webCrypto.getRandomValues(Buffer.alloc(length))
+}
+
+async function md5(string) {
+  try {
+    return nodeCrypto.createHash('md5').update(string, 'utf-8').digest('hex')
+  } catch (e) {
+    // `createHash()` failed so we are probably not in Node.js, use the WebCrypto API instead.
+    // Note that the MD5 algorithm on WebCrypto is not available in Node.js.
+    // This is why we cannot just use WebCrypto in all environments.
+    const data = typeof string === 'string' ? textEncoder.encode(string) : string
+    const hash = await subtleCrypto.digest('MD5', data)
+    return Array.from(new Uint8Array(hash))
+      .map((b) => b.toString(16).padStart(2, '0'))
+      .join('')
+  }
+}
+
+// See AuthenticationMD5Password at https://www.postgresql.org/docs/current/static/protocol-flow.html
+async function postgresMd5PasswordHash(user, password, salt) {
+  const inner = await md5(password + user)
+  const outer = await md5(Buffer.concat([Buffer.from(inner), salt]))
+  return 'md5' + outer
+}
+
+/**
+ * Create a SHA-256 digest of the given data
+ * @param {Buffer} data
+ */
+async function sha256(text) {
+  return await subtleCrypto.digest('SHA-256', text)
+}
+
+async function hashByName(hashName, text) {
+  return await subtleCrypto.digest(hashName, text)
+}
+
+/**
+ * Sign the message with the given key
+ * @param {ArrayBuffer} keyBuffer
+ * @param {string} msg
+ */
+async function hmacSha256(keyBuffer, msg) {
+  const key = await subtleCrypto.importKey('raw', keyBuffer, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign'])
+  return await subtleCrypto.sign('HMAC', key, textEncoder.encode(msg))
+}
+
+/**
+ * Derive a key from the password and salt
+ * @param {string} password
+ * @param {Uint8Array} salt
+ * @param {number} iterations
+ */
+async function deriveKey(password, salt, iterations) {
+  const key = await subtleCrypto.importKey('raw', textEncoder.encode(password), 'PBKDF2', false, ['deriveBits'])
+  const params = { name: 'PBKDF2', hash: 'SHA-256', salt: salt, iterations: iterations }
+  return await subtleCrypto.deriveBits(params, key, 32 * 8, ['deriveBits'])
+}
Index: TruckSimulator-main/node_modules/pg/lib/crypto/utils.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/crypto/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/crypto/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,9 @@
+'use strict'
+
+const useLegacyCrypto = parseInt(process.versions && process.versions.node && process.versions.node.split('.')[0]) < 15
+if (useLegacyCrypto) {
+  // We are on an old version of Node.js that requires legacy crypto utilities.
+  module.exports = require('./utils-legacy')
+} else {
+  module.exports = require('./utils-webcrypto')
+}
Index: TruckSimulator-main/node_modules/pg/lib/defaults.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/defaults.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/defaults.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,84 @@
+'use strict'
+
+module.exports = {
+  // database host. defaults to localhost
+  host: 'localhost',
+
+  // database user's name
+  user: process.platform === 'win32' ? process.env.USERNAME : process.env.USER,
+
+  // name of database to connect
+  database: undefined,
+
+  // database user's password
+  password: null,
+
+  // a Postgres connection string to be used instead of setting individual connection items
+  // NOTE:  Setting this value will cause it to override any other value (such as database or user) defined
+  // in the defaults object.
+  connectionString: undefined,
+
+  // database port
+  port: 5432,
+
+  // number of rows to return at a time from a prepared statement's
+  // portal. 0 will return all rows at once
+  rows: 0,
+
+  // binary result mode
+  binary: false,
+
+  // Connection pool options - see https://github.com/brianc/node-pg-pool
+
+  // number of connections to use in connection pool
+  // 0 will disable connection pooling
+  max: 10,
+
+  // max milliseconds a client can go unused before it is removed
+  // from the pool and destroyed
+  idleTimeoutMillis: 30000,
+
+  client_encoding: '',
+
+  ssl: false,
+
+  application_name: undefined,
+
+  fallback_application_name: undefined,
+
+  options: undefined,
+
+  parseInputDatesAsUTC: false,
+
+  // max milliseconds any query using this connection will execute for before timing out in error.
+  // false=unlimited
+  statement_timeout: false,
+
+  // Abort any statement that waits longer than the specified duration in milliseconds while attempting to acquire a lock.
+  // false=unlimited
+  lock_timeout: false,
+
+  // Terminate any session with an open transaction that has been idle for longer than the specified duration in milliseconds
+  // false=unlimited
+  idle_in_transaction_session_timeout: false,
+
+  // max milliseconds to wait for query to complete (client side)
+  query_timeout: false,
+
+  connect_timeout: 0,
+
+  keepalives: 1,
+
+  keepalives_idle: 0,
+}
+
+const pgTypes = require('pg-types')
+// save default parsers
+const parseBigInteger = pgTypes.getTypeParser(20, 'text')
+const parseBigIntegerArray = pgTypes.getTypeParser(1016, 'text')
+
+// parse int8 so you can get your count values as actual numbers
+module.exports.__defineSetter__('parseInt8', function (val) {
+  pgTypes.setTypeParser(20, 'text', val ? pgTypes.getTypeParser(23, 'text') : parseBigInteger)
+  pgTypes.setTypeParser(1016, 'text', val ? pgTypes.getTypeParser(1007, 'text') : parseBigIntegerArray)
+})
Index: TruckSimulator-main/node_modules/pg/lib/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,64 @@
+'use strict'
+
+const Client = require('./client')
+const defaults = require('./defaults')
+const Connection = require('./connection')
+const Result = require('./result')
+const utils = require('./utils')
+const Pool = require('pg-pool')
+const TypeOverrides = require('./type-overrides')
+const { DatabaseError } = require('pg-protocol')
+const { escapeIdentifier, escapeLiteral } = require('./utils')
+
+const poolFactory = (Client) => {
+  return class BoundPool extends Pool {
+    constructor(options) {
+      super(options, Client)
+    }
+  }
+}
+
+const PG = function (clientConstructor) {
+  this.defaults = defaults
+  this.Client = clientConstructor
+  this.Query = this.Client.Query
+  this.Pool = poolFactory(this.Client)
+  this._pools = []
+  this.Connection = Connection
+  this.types = require('pg-types')
+  this.DatabaseError = DatabaseError
+  this.TypeOverrides = TypeOverrides
+  this.escapeIdentifier = escapeIdentifier
+  this.escapeLiteral = escapeLiteral
+  this.Result = Result
+  this.utils = utils
+}
+
+if (typeof process.env.NODE_PG_FORCE_NATIVE !== 'undefined') {
+  module.exports = new PG(require('./native'))
+} else {
+  module.exports = new PG(Client)
+
+  // lazy require native module...the native module may not have installed
+  Object.defineProperty(module.exports, 'native', {
+    configurable: true,
+    enumerable: false,
+    get() {
+      let native = null
+      try {
+        native = new PG(require('./native'))
+      } catch (err) {
+        if (err.code !== 'MODULE_NOT_FOUND') {
+          throw err
+        }
+      }
+
+      // overwrite module.exports.native so that getter is never called again
+      Object.defineProperty(module.exports, 'native', {
+        value: native,
+      })
+
+      return native
+    },
+  })
+}
Index: TruckSimulator-main/node_modules/pg/lib/native/client.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/native/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/native/client.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,308 @@
+'use strict'
+
+// eslint-disable-next-line
+var Native
+// eslint-disable-next-line no-useless-catch
+try {
+  // Wrap this `require()` in a try-catch to avoid upstream bundlers from complaining that this might not be available since it is an optional import
+  Native = require('pg-native')
+} catch (e) {
+  throw e
+}
+const TypeOverrides = require('../type-overrides')
+const EventEmitter = require('events').EventEmitter
+const util = require('util')
+const ConnectionParameters = require('../connection-parameters')
+
+const NativeQuery = require('./query')
+
+const Client = (module.exports = function (config) {
+  EventEmitter.call(this)
+  config = config || {}
+
+  this._Promise = config.Promise || global.Promise
+  this._types = new TypeOverrides(config.types)
+
+  this.native = new Native({
+    types: this._types,
+  })
+
+  this._queryQueue = []
+  this._ending = false
+  this._connecting = false
+  this._connected = false
+  this._queryable = true
+
+  // keep these on the object for legacy reasons
+  // for the time being. TODO: deprecate all this jazz
+  const cp = (this.connectionParameters = new ConnectionParameters(config))
+  if (config.nativeConnectionString) cp.nativeConnectionString = config.nativeConnectionString
+  this.user = cp.user
+
+  // "hiding" the password so it doesn't show up in stack traces
+  // or if the client is console.logged
+  Object.defineProperty(this, 'password', {
+    configurable: true,
+    enumerable: false,
+    writable: true,
+    value: cp.password,
+  })
+  this.database = cp.database
+  this.host = cp.host
+  this.port = cp.port
+
+  // a hash to hold named queries
+  this.namedQueries = {}
+})
+
+Client.Query = NativeQuery
+
+util.inherits(Client, EventEmitter)
+
+Client.prototype._errorAllQueries = function (err) {
+  const enqueueError = (query) => {
+    process.nextTick(() => {
+      query.native = this.native
+      query.handleError(err)
+    })
+  }
+
+  if (this._hasActiveQuery()) {
+    enqueueError(this._activeQuery)
+    this._activeQuery = null
+  }
+
+  this._queryQueue.forEach(enqueueError)
+  this._queryQueue.length = 0
+}
+
+// connect to the backend
+// pass an optional callback to be called once connected
+// or with an error if there was a connection error
+Client.prototype._connect = function (cb) {
+  const self = this
+
+  if (this._connecting) {
+    process.nextTick(() => cb(new Error('Client has already been connected. You cannot reuse a client.')))
+    return
+  }
+
+  this._connecting = true
+
+  this.connectionParameters.getLibpqConnectionString(function (err, conString) {
+    if (self.connectionParameters.nativeConnectionString) conString = self.connectionParameters.nativeConnectionString
+    if (err) return cb(err)
+    self.native.connect(conString, function (err) {
+      if (err) {
+        self.native.end()
+        return cb(err)
+      }
+
+      // set internal states to connected
+      self._connected = true
+
+      // handle connection errors from the native layer
+      self.native.on('error', function (err) {
+        self._queryable = false
+        self._errorAllQueries(err)
+        self.emit('error', err)
+      })
+
+      self.native.on('notification', function (msg) {
+        self.emit('notification', {
+          channel: msg.relname,
+          payload: msg.extra,
+        })
+      })
+
+      // signal we are connected now
+      self.emit('connect')
+      self._pulseQueryQueue(true)
+
+      cb()
+    })
+  })
+}
+
+Client.prototype.connect = function (callback) {
+  if (callback) {
+    this._connect(callback)
+    return
+  }
+
+  return new this._Promise((resolve, reject) => {
+    this._connect((error) => {
+      if (error) {
+        reject(error)
+      } else {
+        resolve()
+      }
+    })
+  })
+}
+
+// send a query to the server
+// this method is highly overloaded to take
+// 1) string query, optional array of parameters, optional function callback
+// 2) object query with {
+//    string query
+//    optional array values,
+//    optional function callback instead of as a separate parameter
+//    optional string name to name & cache the query plan
+//    optional string rowMode = 'array' for an array of results
+//  }
+Client.prototype.query = function (config, values, callback) {
+  let query
+  let result
+  let readTimeout
+  let readTimeoutTimer
+  let queryCallback
+
+  if (config === null || config === undefined) {
+    throw new TypeError('Client was passed a null or undefined query')
+  } else if (typeof config.submit === 'function') {
+    readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+    result = query = config
+    // accept query(new Query(...), (err, res) => { }) style
+    if (typeof values === 'function') {
+      config.callback = values
+    }
+  } else {
+    readTimeout = config.query_timeout || this.connectionParameters.query_timeout
+    query = new NativeQuery(config, values, callback)
+    if (!query.callback) {
+      let resolveOut, rejectOut
+      result = new this._Promise((resolve, reject) => {
+        resolveOut = resolve
+        rejectOut = reject
+      }).catch((err) => {
+        Error.captureStackTrace(err)
+        throw err
+      })
+      query.callback = (err, res) => (err ? rejectOut(err) : resolveOut(res))
+    }
+  }
+
+  if (readTimeout) {
+    queryCallback = query.callback
+
+    readTimeoutTimer = setTimeout(() => {
+      const error = new Error('Query read timeout')
+
+      process.nextTick(() => {
+        query.handleError(error, this.connection)
+      })
+
+      queryCallback(error)
+
+      // we already returned an error,
+      // just do nothing if query completes
+      query.callback = () => {}
+
+      // Remove from queue
+      const index = this._queryQueue.indexOf(query)
+      if (index > -1) {
+        this._queryQueue.splice(index, 1)
+      }
+
+      this._pulseQueryQueue()
+    }, readTimeout)
+
+    query.callback = (err, res) => {
+      clearTimeout(readTimeoutTimer)
+      queryCallback(err, res)
+    }
+  }
+
+  if (!this._queryable) {
+    query.native = this.native
+    process.nextTick(() => {
+      query.handleError(new Error('Client has encountered a connection error and is not queryable'))
+    })
+    return result
+  }
+
+  if (this._ending) {
+    query.native = this.native
+    process.nextTick(() => {
+      query.handleError(new Error('Client was closed and is not queryable'))
+    })
+    return result
+  }
+
+  this._queryQueue.push(query)
+  this._pulseQueryQueue()
+  return result
+}
+
+// disconnect from the backend server
+Client.prototype.end = function (cb) {
+  const self = this
+
+  this._ending = true
+
+  if (!this._connected) {
+    this.once('connect', this.end.bind(this, cb))
+  }
+  let result
+  if (!cb) {
+    result = new this._Promise(function (resolve, reject) {
+      cb = (err) => (err ? reject(err) : resolve())
+    })
+  }
+  this.native.end(function () {
+    self._errorAllQueries(new Error('Connection terminated'))
+
+    process.nextTick(() => {
+      self.emit('end')
+      if (cb) cb()
+    })
+  })
+  return result
+}
+
+Client.prototype._hasActiveQuery = function () {
+  return this._activeQuery && this._activeQuery.state !== 'error' && this._activeQuery.state !== 'end'
+}
+
+Client.prototype._pulseQueryQueue = function (initialConnection) {
+  if (!this._connected) {
+    return
+  }
+  if (this._hasActiveQuery()) {
+    return
+  }
+  const query = this._queryQueue.shift()
+  if (!query) {
+    if (!initialConnection) {
+      this.emit('drain')
+    }
+    return
+  }
+  this._activeQuery = query
+  query.submit(this)
+  const self = this
+  query.once('_done', function () {
+    self._pulseQueryQueue()
+  })
+}
+
+// attempt to cancel an in-progress query
+Client.prototype.cancel = function (query) {
+  if (this._activeQuery === query) {
+    this.native.cancel(function () {})
+  } else if (this._queryQueue.indexOf(query) !== -1) {
+    this._queryQueue.splice(this._queryQueue.indexOf(query), 1)
+  }
+}
+
+Client.prototype.ref = function () {}
+Client.prototype.unref = function () {}
+
+Client.prototype.setTypeParser = function (oid, format, parseFn) {
+  return this._types.setTypeParser(oid, format, parseFn)
+}
+
+Client.prototype.getTypeParser = function (oid, format) {
+  return this._types.getTypeParser(oid, format)
+}
Index: TruckSimulator-main/node_modules/pg/lib/native/index.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/native/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/native/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,2 @@
+'use strict'
+module.exports = require('./client')
Index: TruckSimulator-main/node_modules/pg/lib/native/query.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/native/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/native/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,165 @@
+'use strict'
+
+const EventEmitter = require('events').EventEmitter
+const util = require('util')
+const utils = require('../utils')
+
+const NativeQuery = (module.exports = function (config, values, callback) {
+  EventEmitter.call(this)
+  config = utils.normalizeQueryConfig(config, values, callback)
+  this.text = config.text
+  this.values = config.values
+  this.name = config.name
+  this.queryMode = config.queryMode
+  this.callback = config.callback
+  this.state = 'new'
+  this._arrayMode = config.rowMode === 'array'
+
+  // if the 'row' event is listened for
+  // then emit them as they come in
+  // without setting singleRowMode to true
+  // this has almost no meaning because libpq
+  // reads all rows into memory before returning any
+  this._emitRowEvents = false
+  this.on(
+    'newListener',
+    function (event) {
+      if (event === 'row') this._emitRowEvents = true
+    }.bind(this)
+  )
+})
+
+util.inherits(NativeQuery, EventEmitter)
+
+const errorFieldMap = {
+  sqlState: 'code',
+  statementPosition: 'position',
+  messagePrimary: 'message',
+  context: 'where',
+  schemaName: 'schema',
+  tableName: 'table',
+  columnName: 'column',
+  dataTypeName: 'dataType',
+  constraintName: 'constraint',
+  sourceFile: 'file',
+  sourceLine: 'line',
+  sourceFunction: 'routine',
+}
+
+NativeQuery.prototype.handleError = function (err) {
+  // copy pq error fields into the error object
+  const fields = this.native.pq.resultErrorFields()
+  if (fields) {
+    for (const key in fields) {
+      const normalizedFieldName = errorFieldMap[key] || key
+      err[normalizedFieldName] = fields[key]
+    }
+  }
+  if (this.callback) {
+    this.callback(err)
+  } else {
+    this.emit('error', err)
+  }
+  this.state = 'error'
+}
+
+NativeQuery.prototype.then = function (onSuccess, onFailure) {
+  return this._getPromise().then(onSuccess, onFailure)
+}
+
+NativeQuery.prototype.catch = function (callback) {
+  return this._getPromise().catch(callback)
+}
+
+NativeQuery.prototype._getPromise = function () {
+  if (this._promise) return this._promise
+  this._promise = new Promise(
+    function (resolve, reject) {
+      this._once('end', resolve)
+      this._once('error', reject)
+    }.bind(this)
+  )
+  return this._promise
+}
+
+NativeQuery.prototype.submit = function (client) {
+  this.state = 'running'
+  const self = this
+  this.native = client.native
+  client.native.arrayMode = this._arrayMode
+
+  let after = function (err, rows, results) {
+    client.native.arrayMode = false
+    setImmediate(function () {
+      self.emit('_done')
+    })
+
+    // handle possible query error
+    if (err) {
+      return self.handleError(err)
+    }
+
+    // emit row events for each row in the result
+    if (self._emitRowEvents) {
+      if (results.length > 1) {
+        rows.forEach((rowOfRows, i) => {
+          rowOfRows.forEach((row) => {
+            self.emit('row', row, results[i])
+          })
+        })
+      } else {
+        rows.forEach(function (row) {
+          self.emit('row', row, results)
+        })
+      }
+    }
+
+    // handle successful result
+    self.state = 'end'
+    self.emit('end', results)
+    if (self.callback) {
+      self.callback(null, results)
+    }
+  }
+
+  if (process.domain) {
+    after = process.domain.bind(after)
+  }
+
+  // named query
+  if (this.name) {
+    if (this.name.length > 63) {
+      console.error('Warning! Postgres only supports 63 characters for query names.')
+      console.error('You supplied %s (%s)', this.name, this.name.length)
+      console.error('This can cause conflicts and silent errors executing queries')
+    }
+    const values = (this.values || []).map(utils.prepareValue)
+
+    // check if the client has already executed this named query
+    // if so...just execute it again - skip the planning phase
+    if (client.namedQueries[this.name]) {
+      if (this.text && client.namedQueries[this.name] !== this.text) {
+        const err = new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)
+        return after(err)
+      }
+      return client.native.execute(this.name, values, after)
+    }
+    // plan the named query the first time, then execute it
+    return client.native.prepare(this.name, this.text, values.length, function (err) {
+      if (err) return after(err)
+      client.namedQueries[self.name] = self.text
+      return self.native.execute(self.name, values, after)
+    })
+  } else if (this.values) {
+    if (!Array.isArray(this.values)) {
+      const err = new Error('Query values must be an array')
+      return after(err)
+    }
+    const vals = this.values.map(utils.prepareValue)
+    client.native.query(this.text, vals, after)
+  } else if (this.queryMode === 'extended') {
+    client.native.query(this.text, [], after)
+  } else {
+    client.native.query(this.text, after)
+  }
+}
Index: TruckSimulator-main/node_modules/pg/lib/query.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/query.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,252 @@
+'use strict'
+
+const { EventEmitter } = require('events')
+
+const Result = require('./result')
+const utils = require('./utils')
+
+class Query extends EventEmitter {
+  constructor(config, values, callback) {
+    super()
+
+    config = utils.normalizeQueryConfig(config, values, callback)
+
+    this.text = config.text
+    this.values = config.values
+    this.rows = config.rows
+    this.types = config.types
+    this.name = config.name
+    this.queryMode = config.queryMode
+    this.binary = config.binary
+    // use unique portal name each time
+    this.portal = config.portal || ''
+    this.callback = config.callback
+    this._rowMode = config.rowMode
+    if (process.domain && config.callback) {
+      this.callback = process.domain.bind(config.callback)
+    }
+    this._result = new Result(this._rowMode, this.types)
+
+    // potential for multiple results
+    this._results = this._result
+    this._canceledDueToError = false
+  }
+
+  requiresPreparation() {
+    if (this.queryMode === 'extended') {
+      return true
+    }
+
+    // named queries must always be prepared
+    if (this.name) {
+      return true
+    }
+    // always prepare if there are max number of rows expected per
+    // portal execution
+    if (this.rows) {
+      return true
+    }
+    // don't prepare empty text queries
+    if (!this.text) {
+      return false
+    }
+    // prepare if there are values
+    if (!this.values) {
+      return false
+    }
+    return this.values.length > 0
+  }
+
+  _checkForMultirow() {
+    // if we already have a result with a command property
+    // then we've already executed one query in a multi-statement simple query
+    // turn our results into an array of results
+    if (this._result.command) {
+      if (!Array.isArray(this._results)) {
+        this._results = [this._result]
+      }
+      this._result = new Result(this._rowMode, this._result._types)
+      this._results.push(this._result)
+    }
+  }
+
+  // associates row metadata from the supplied
+  // message with this query object
+  // metadata used when parsing row results
+  handleRowDescription(msg) {
+    this._checkForMultirow()
+    this._result.addFields(msg.fields)
+    this._accumulateRows = this.callback || !this.listeners('row').length
+  }
+
+  handleDataRow(msg) {
+    let row
+
+    if (this._canceledDueToError) {
+      return
+    }
+
+    try {
+      row = this._result.parseRow(msg.fields)
+    } catch (err) {
+      this._canceledDueToError = err
+      return
+    }
+
+    this.emit('row', row, this._result)
+    if (this._accumulateRows) {
+      this._result.addRow(row)
+    }
+  }
+
+  handleCommandComplete(msg, connection) {
+    this._checkForMultirow()
+    this._result.addCommandComplete(msg)
+    // need to sync after each command complete of a prepared statement
+    // if we were using a row count which results in multiple calls to _getRows
+    if (this.rows) {
+      connection.sync()
+    }
+  }
+
+  // if a named prepared statement is created with empty query text
+  // the backend will send an emptyQuery message but *not* a command complete message
+  // since we pipeline sync immediately after execute we don't need to do anything here
+  // unless we have rows specified, in which case we did not pipeline the initial sync call
+  handleEmptyQuery(connection) {
+    if (this.rows) {
+      connection.sync()
+    }
+  }
+
+  handleError(err, connection) {
+    // need to sync after error during a prepared statement
+    if (this._canceledDueToError) {
+      err = this._canceledDueToError
+      this._canceledDueToError = false
+    }
+    // if callback supplied do not emit error event as uncaught error
+    // events will bubble up to node process
+    if (this.callback) {
+      return this.callback(err)
+    }
+    this.emit('error', err)
+  }
+
+  handleReadyForQuery(con) {
+    if (this._canceledDueToError) {
+      return this.handleError(this._canceledDueToError, con)
+    }
+    if (this.callback) {
+      try {
+        this.callback(null, this._results)
+      } catch (err) {
+        process.nextTick(() => {
+          throw err
+        })
+      }
+    }
+    this.emit('end', this._results)
+  }
+
+  submit(connection) {
+    if (typeof this.text !== 'string' && typeof this.name !== 'string') {
+      return new Error('A query must have either text or a name. Supplying neither is unsupported.')
+    }
+    const previous = connection.parsedStatements[this.name]
+    if (this.text && previous && this.text !== previous) {
+      return new Error(`Prepared statements must be unique - '${this.name}' was used for a different statement`)
+    }
+    if (this.values && !Array.isArray(this.values)) {
+      return new Error('Query values must be an array')
+    }
+    if (this.requiresPreparation()) {
+      // If we're using the extended query protocol we fire off several separate commands
+      // to the backend. On some versions of node & some operating system versions
+      // the network stack writes each message separately instead of buffering them together
+      // causing the client & network to send more slowly. Corking & uncorking the stream
+      // allows node to buffer up the messages internally before sending them all off at once.
+      // note: we're checking for existence of cork/uncork because some versions of streams
+      // might not have this (cloudflare?)
+      connection.stream.cork && connection.stream.cork()
+      try {
+        this.prepare(connection)
+      } finally {
+        // while unlikely for this.prepare to throw, if it does & we don't uncork this stream
+        // this client becomes unresponsive, so put in finally block "just in case"
+        connection.stream.uncork && connection.stream.uncork()
+      }
+    } else {
+      connection.query(this.text)
+    }
+    return null
+  }
+
+  hasBeenParsed(connection) {
+    return this.name && connection.parsedStatements[this.name]
+  }
+
+  handlePortalSuspended(connection) {
+    this._getRows(connection, this.rows)
+  }
+
+  _getRows(connection, rows) {
+    connection.execute({
+      portal: this.portal,
+      rows: rows,
+    })
+    // if we're not reading pages of rows send the sync command
+    // to indicate the pipeline is finished
+    if (!rows) {
+      connection.sync()
+    } else {
+      // otherwise flush the call out to read more rows
+      connection.flush()
+    }
+  }
+
+  // http://developer.postgresql.org/pgdocs/postgres/protocol-flow.html#PROTOCOL-FLOW-EXT-QUERY
+  prepare(connection) {
+    // TODO refactor this poor encapsulation
+    if (!this.hasBeenParsed(connection)) {
+      connection.parse({
+        text: this.text,
+        name: this.name,
+        types: this.types,
+      })
+    }
+
+    // because we're mapping user supplied values to
+    // postgres wire protocol compatible values it could
+    // throw an exception, so try/catch this section
+    try {
+      connection.bind({
+        portal: this.portal,
+        statement: this.name,
+        values: this.values,
+        binary: this.binary,
+        valueMapper: utils.prepareValue,
+      })
+    } catch (err) {
+      this.handleError(err, connection)
+      return
+    }
+
+    connection.describe({
+      type: 'P',
+      name: this.portal || '',
+    })
+
+    this._getRows(connection, this.rows)
+  }
+
+  handleCopyInResponse(connection) {
+    connection.sendCopyFail('No source stream defined')
+  }
+
+  handleCopyData(msg, connection) {
+    // noop
+  }
+}
+
+module.exports = Query
Index: TruckSimulator-main/node_modules/pg/lib/result.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/result.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/result.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,109 @@
+'use strict'
+
+const types = require('pg-types')
+
+const matchRegexp = /^([A-Za-z]+)(?: (\d+))?(?: (\d+))?/
+
+// result object returned from query
+// in the 'end' event and also
+// passed as second argument to provided callback
+class Result {
+  constructor(rowMode, types) {
+    this.command = null
+    this.rowCount = null
+    this.oid = null
+    this.rows = []
+    this.fields = []
+    this._parsers = undefined
+    this._types = types
+    this.RowCtor = null
+    this.rowAsArray = rowMode === 'array'
+    if (this.rowAsArray) {
+      this.parseRow = this._parseRowAsArray
+    }
+    this._prebuiltEmptyResultObject = null
+  }
+
+  // adds a command complete message
+  addCommandComplete(msg) {
+    let match
+    if (msg.text) {
+      // pure javascript
+      match = matchRegexp.exec(msg.text)
+    } else {
+      // native bindings
+      match = matchRegexp.exec(msg.command)
+    }
+    if (match) {
+      this.command = match[1]
+      if (match[3]) {
+        // COMMAND OID ROWS
+        this.oid = parseInt(match[2], 10)
+        this.rowCount = parseInt(match[3], 10)
+      } else if (match[2]) {
+        // COMMAND ROWS
+        this.rowCount = parseInt(match[2], 10)
+      }
+    }
+  }
+
+  _parseRowAsArray(rowData) {
+    const row = new Array(rowData.length)
+    for (let i = 0, len = rowData.length; i < len; i++) {
+      const rawValue = rowData[i]
+      if (rawValue !== null) {
+        row[i] = this._parsers[i](rawValue)
+      } else {
+        row[i] = null
+      }
+    }
+    return row
+  }
+
+  parseRow(rowData) {
+    const row = { ...this._prebuiltEmptyResultObject }
+    for (let i = 0, len = rowData.length; i < len; i++) {
+      const rawValue = rowData[i]
+      const field = this.fields[i].name
+      if (rawValue !== null) {
+        const v = this.fields[i].format === 'binary' ? Buffer.from(rawValue) : rawValue
+        row[field] = this._parsers[i](v)
+      } else {
+        row[field] = null
+      }
+    }
+    return row
+  }
+
+  addRow(row) {
+    this.rows.push(row)
+  }
+
+  addFields(fieldDescriptions) {
+    // clears field definitions
+    // multiple query statements in 1 action can result in multiple sets
+    // of rowDescriptions...eg: 'select NOW(); select 1::int;'
+    // you need to reset the fields
+    this.fields = fieldDescriptions
+    if (this.fields.length) {
+      this._parsers = new Array(fieldDescriptions.length)
+    }
+
+    const row = {}
+
+    for (let i = 0; i < fieldDescriptions.length; i++) {
+      const desc = fieldDescriptions[i]
+      row[desc.name] = null
+
+      if (this._types) {
+        this._parsers[i] = this._types.getTypeParser(desc.dataTypeID, desc.format || 'text')
+      } else {
+        this._parsers[i] = types.getTypeParser(desc.dataTypeID, desc.format || 'text')
+      }
+    }
+
+    this._prebuiltEmptyResultObject = { ...row }
+  }
+}
+
+module.exports = Result
Index: TruckSimulator-main/node_modules/pg/lib/stream.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/stream.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/stream.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,83 @@
+const { getStream, getSecureStream } = getStreamFuncs()
+
+module.exports = {
+  /**
+   * Get a socket stream compatible with the current runtime environment.
+   * @returns {Duplex}
+   */
+  getStream,
+  /**
+   * Get a TLS secured socket, compatible with the current environment,
+   * using the socket and other settings given in `options`.
+   * @returns {Duplex}
+   */
+  getSecureStream,
+}
+
+/**
+ * The stream functions that work in Node.js
+ */
+function getNodejsStreamFuncs() {
+  function getStream(ssl) {
+    const net = require('net')
+    return new net.Socket()
+  }
+
+  function getSecureStream(options) {
+    const tls = require('tls')
+    return tls.connect(options)
+  }
+  return {
+    getStream,
+    getSecureStream,
+  }
+}
+
+/**
+ * The stream functions that work in Cloudflare Workers
+ */
+function getCloudflareStreamFuncs() {
+  function getStream(ssl) {
+    const { CloudflareSocket } = require('pg-cloudflare')
+    return new CloudflareSocket(ssl)
+  }
+
+  function getSecureStream(options) {
+    options.socket.startTls(options)
+    return options.socket
+  }
+  return {
+    getStream,
+    getSecureStream,
+  }
+}
+
+/**
+ * Are we running in a Cloudflare Worker?
+ *
+ * @returns true if the code is currently running inside a Cloudflare Worker.
+ */
+function isCloudflareRuntime() {
+  // Since 2022-03-21 the `global_navigator` compatibility flag is on for Cloudflare Workers
+  // which means that `navigator.userAgent` will be defined.
+  // eslint-disable-next-line no-undef
+  if (typeof navigator === 'object' && navigator !== null && typeof navigator.userAgent === 'string') {
+    // eslint-disable-next-line no-undef
+    return navigator.userAgent === 'Cloudflare-Workers'
+  }
+  // In case `navigator` or `navigator.userAgent` is not defined then try a more sneaky approach
+  if (typeof Response === 'function') {
+    const resp = new Response(null, { cf: { thing: true } })
+    if (typeof resp.cf === 'object' && resp.cf !== null && resp.cf.thing) {
+      return true
+    }
+  }
+  return false
+}
+
+function getStreamFuncs() {
+  if (isCloudflareRuntime()) {
+    return getCloudflareStreamFuncs()
+  }
+  return getNodejsStreamFuncs()
+}
Index: TruckSimulator-main/node_modules/pg/lib/type-overrides.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/type-overrides.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/type-overrides.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,35 @@
+'use strict'
+
+const types = require('pg-types')
+
+function TypeOverrides(userTypes) {
+  this._types = userTypes || types
+  this.text = {}
+  this.binary = {}
+}
+
+TypeOverrides.prototype.getOverrides = function (format) {
+  switch (format) {
+    case 'text':
+      return this.text
+    case 'binary':
+      return this.binary
+    default:
+      return {}
+  }
+}
+
+TypeOverrides.prototype.setTypeParser = function (oid, format, parseFn) {
+  if (typeof format === 'function') {
+    parseFn = format
+    format = 'text'
+  }
+  this.getOverrides(format)[oid] = parseFn
+}
+
+TypeOverrides.prototype.getTypeParser = function (oid, format) {
+  format = format || 'text'
+  return this.getOverrides(format)[oid] || this._types.getTypeParser(oid, format)
+}
+
+module.exports = TypeOverrides
Index: TruckSimulator-main/node_modules/pg/lib/utils.js
===================================================================
--- TruckSimulator-main/node_modules/pg/lib/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/lib/utils.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,217 @@
+'use strict'
+
+const defaults = require('./defaults')
+
+const util = require('util')
+const { isDate } = util.types || util // Node 8 doesn't have `util.types`
+
+function escapeElement(elementRepresentation) {
+  const escaped = elementRepresentation.replace(/\\/g, '\\\\').replace(/"/g, '\\"')
+
+  return '"' + escaped + '"'
+}
+
+// convert a JS array to a postgres array literal
+// uses comma separator so won't work for types like box that use
+// a different array separator.
+function arrayString(val) {
+  let result = '{'
+  for (let i = 0; i < val.length; i++) {
+    if (i > 0) {
+      result = result + ','
+    }
+    if (val[i] === null || typeof val[i] === 'undefined') {
+      result = result + 'NULL'
+    } else if (Array.isArray(val[i])) {
+      result = result + arrayString(val[i])
+    } else if (ArrayBuffer.isView(val[i])) {
+      let item = val[i]
+      if (!(item instanceof Buffer)) {
+        const buf = Buffer.from(item.buffer, item.byteOffset, item.byteLength)
+        if (buf.length === item.byteLength) {
+          item = buf
+        } else {
+          item = buf.slice(item.byteOffset, item.byteOffset + item.byteLength)
+        }
+      }
+      result += '\\\\x' + item.toString('hex')
+    } else {
+      result += escapeElement(prepareValue(val[i]))
+    }
+  }
+  result = result + '}'
+  return result
+}
+
+// converts values from javascript types
+// to their 'raw' counterparts for use as a postgres parameter
+// note: you can override this function to provide your own conversion mechanism
+// for complex types, etc...
+const prepareValue = function (val, seen) {
+  // null and undefined are both null for postgres
+  if (val == null) {
+    return null
+  }
+  if (typeof val === 'object') {
+    if (val instanceof Buffer) {
+      return val
+    }
+    if (ArrayBuffer.isView(val)) {
+      const buf = Buffer.from(val.buffer, val.byteOffset, val.byteLength)
+      if (buf.length === val.byteLength) {
+        return buf
+      }
+      return buf.slice(val.byteOffset, val.byteOffset + val.byteLength) // Node.js v4 does not support those Buffer.from params
+    }
+    if (isDate(val)) {
+      if (defaults.parseInputDatesAsUTC) {
+        return dateToStringUTC(val)
+      } else {
+        return dateToString(val)
+      }
+    }
+    if (Array.isArray(val)) {
+      return arrayString(val)
+    }
+
+    return prepareObject(val, seen)
+  }
+  return val.toString()
+}
+
+function prepareObject(val, seen) {
+  if (val && typeof val.toPostgres === 'function') {
+    seen = seen || []
+    if (seen.indexOf(val) !== -1) {
+      throw new Error('circular reference detected while preparing "' + val + '" for query')
+    }
+    seen.push(val)
+
+    return prepareValue(val.toPostgres(prepareValue), seen)
+  }
+  return JSON.stringify(val)
+}
+
+function dateToString(date) {
+  let offset = -date.getTimezoneOffset()
+
+  let year = date.getFullYear()
+  const isBCYear = year < 1
+  if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation
+
+  let ret =
+    String(year).padStart(4, '0') +
+    '-' +
+    String(date.getMonth() + 1).padStart(2, '0') +
+    '-' +
+    String(date.getDate()).padStart(2, '0') +
+    'T' +
+    String(date.getHours()).padStart(2, '0') +
+    ':' +
+    String(date.getMinutes()).padStart(2, '0') +
+    ':' +
+    String(date.getSeconds()).padStart(2, '0') +
+    '.' +
+    String(date.getMilliseconds()).padStart(3, '0')
+
+  if (offset < 0) {
+    ret += '-'
+    offset *= -1
+  } else {
+    ret += '+'
+  }
+
+  ret += String(Math.floor(offset / 60)).padStart(2, '0') + ':' + String(offset % 60).padStart(2, '0')
+  if (isBCYear) ret += ' BC'
+  return ret
+}
+
+function dateToStringUTC(date) {
+  let year = date.getUTCFullYear()
+  const isBCYear = year < 1
+  if (isBCYear) year = Math.abs(year) + 1 // negative years are 1 off their BC representation
+
+  let ret =
+    String(year).padStart(4, '0') +
+    '-' +
+    String(date.getUTCMonth() + 1).padStart(2, '0') +
+    '-' +
+    String(date.getUTCDate()).padStart(2, '0') +
+    'T' +
+    String(date.getUTCHours()).padStart(2, '0') +
+    ':' +
+    String(date.getUTCMinutes()).padStart(2, '0') +
+    ':' +
+    String(date.getUTCSeconds()).padStart(2, '0') +
+    '.' +
+    String(date.getUTCMilliseconds()).padStart(3, '0')
+
+  ret += '+00:00'
+  if (isBCYear) ret += ' BC'
+  return ret
+}
+
+function normalizeQueryConfig(config, values, callback) {
+  // can take in strings or config objects
+  config = typeof config === 'string' ? { text: config } : config
+  if (values) {
+    if (typeof values === 'function') {
+      config.callback = values
+    } else {
+      config.values = values
+    }
+  }
+  if (callback) {
+    config.callback = callback
+  }
+  return config
+}
+
+// Ported from PostgreSQL 9.2.4 source code in src/interfaces/libpq/fe-exec.c
+const escapeIdentifier = function (str) {
+  return '"' + str.replace(/"/g, '""') + '"'
+}
+
+const escapeLiteral = function (str) {
+  let hasBackslash = false
+  let escaped = "'"
+
+  if (str == null) {
+    return "''"
+  }
+
+  if (typeof str !== 'string') {
+    return "''"
+  }
+
+  for (let i = 0; i < str.length; i++) {
+    const c = str[i]
+    if (c === "'") {
+      escaped += c + c
+    } else if (c === '\\') {
+      escaped += c + c
+      hasBackslash = true
+    } else {
+      escaped += c
+    }
+  }
+
+  escaped += "'"
+
+  if (hasBackslash === true) {
+    escaped = ' E' + escaped
+  }
+
+  return escaped
+}
+
+module.exports = {
+  prepareValue: function prepareValueWrapper(value) {
+    // this ensures that extra arguments do not get passed into prepareValue
+    // by accident, eg: from calling values.map(utils.prepareValue)
+    return prepareValue(value)
+  },
+  normalizeQueryConfig,
+  escapeIdentifier,
+  escapeLiteral,
+}
Index: TruckSimulator-main/node_modules/pg/package.json
===================================================================
--- TruckSimulator-main/node_modules/pg/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pg/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,76 @@
+{
+  "name": "pg",
+  "version": "8.16.3",
+  "description": "PostgreSQL client - pure javascript & libpq with the same API",
+  "keywords": [
+    "database",
+    "libpq",
+    "pg",
+    "postgre",
+    "postgres",
+    "postgresql",
+    "rdbms"
+  ],
+  "homepage": "https://github.com/brianc/node-postgres",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/brianc/node-postgres.git",
+    "directory": "packages/pg"
+  },
+  "author": "Brian Carlson <brian.m.carlson@gmail.com>",
+  "main": "./lib",
+  "exports": {
+    ".": {
+      "import": "./esm/index.mjs",
+      "require": "./lib/index.js",
+      "default": "./lib/index.js"
+    },
+    "./package.json": {
+      "default": "./package.json"
+    },
+    "./lib/*": "./lib/*.js",
+    "./lib/*.js": "./lib/*.js"
+  },
+  "dependencies": {
+    "pg-connection-string": "^2.9.1",
+    "pg-pool": "^3.10.1",
+    "pg-protocol": "^1.10.3",
+    "pg-types": "2.2.0",
+    "pgpass": "1.0.5"
+  },
+  "devDependencies": {
+    "@cloudflare/vitest-pool-workers": "0.8.23",
+    "@cloudflare/workers-types": "^4.20230404.0",
+    "async": "2.6.4",
+    "bluebird": "3.7.2",
+    "co": "4.6.0",
+    "pg-copy-streams": "0.3.0",
+    "typescript": "^4.0.3",
+    "vitest": "~3.0.9",
+    "wrangler": "^3.x"
+  },
+  "optionalDependencies": {
+    "pg-cloudflare": "^1.2.7"
+  },
+  "peerDependencies": {
+    "pg-native": ">=3.0.1"
+  },
+  "peerDependenciesMeta": {
+    "pg-native": {
+      "optional": true
+    }
+  },
+  "scripts": {
+    "test": "make test-all"
+  },
+  "files": [
+    "lib",
+    "esm",
+    "SPONSORS.md"
+  ],
+  "license": "MIT",
+  "engines": {
+    "node": ">= 16.0.0"
+  },
+  "gitHead": "8f8e7315e8f7c1bb01e98fdb41c8c92585510782"
+}
Index: TruckSimulator-main/node_modules/pgpass/README.md
===================================================================
--- TruckSimulator-main/node_modules/pgpass/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pgpass/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,74 @@
+# pgpass
+
+[![Build Status](https://github.com/hoegaarden/pgpass/workflows/CI/badge.svg?branch=master)](https://github.com/hoegaarden/pgpass/actions?query=workflow%3ACI+branch%3Amaster)
+
+## Install
+
+```sh
+npm install pgpass
+```
+
+## Usage
+```js
+var pgPass = require('pgpass');
+
+var connInfo = {
+  'host' : 'pgserver' ,
+  'user' : 'the_user_name' ,
+};
+
+pgPass(connInfo, function(pass){
+  conn_info.password = pass;
+  // connect to postgresql server
+});
+```
+
+## Description
+
+This module tries to read the `~/.pgpass` file (or the equivalent for windows systems). If the environment variable `PGPASSFILE` is set, this file is used instead. If everything goes right, the password from said file is passed to the callback; if the password cannot be read `undefined` is passed to the callback.
+
+Cases where `undefined` is returned:
+
+- the environment variable `PGPASSWORD` is set
+- the file cannot be read (wrong permissions, no such file, ...)
+- for non windows systems: the file is write-/readable by the group or by other users
+- there is no matching line for the given connection info
+
+There should be no need to use this module directly; it is already included in `node-postgres`.
+
+## Configuration
+
+The module reads the environment variable `PGPASS_NO_DEESCAPE` to decide if the the read tokens from the password file should be de-escaped or not. Default is to do de-escaping. For further information on this see [this commit](https://github.com/postgres/postgres/commit/8d15e3ec4fcb735875a8a70a09ec0c62153c3329).
+
+
+## Tests
+
+There are tests in `./test/`; including linting and coverage testing. Running `npm test` runs:
+
+- `jshint`
+- `mocha` tests
+- `jscoverage` and `mocha -R html-cov`
+
+You can see the coverage report in `coverage.html`.
+
+
+## Development, Patches, Bugs, ...
+
+If you find Bugs or have improvements, please feel free to open a issue on GitHub. If you provide a pull request, I'm more than happy to merge them, just make sure to add tests for your changes.
+
+## Links
+
+- https://github.com/hoegaarden/node-pgpass
+- http://www.postgresql.org/docs/current/static/libpq-pgpass.html
+- https://wiki.postgresql.org/wiki/Pgpass
+- https://github.com/postgres/postgres/blob/master/src/interfaces/libpq/fe-connect.c
+
+## License
+
+Copyright (c) 2013-2016 Hannes Hörl
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: TruckSimulator-main/node_modules/pgpass/lib/helper.js
===================================================================
--- TruckSimulator-main/node_modules/pgpass/lib/helper.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pgpass/lib/helper.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,233 @@
+'use strict';
+
+var path = require('path')
+  , Stream = require('stream').Stream
+  , split = require('split2')
+  , util = require('util')
+  , defaultPort = 5432
+  , isWin = (process.platform === 'win32')
+  , warnStream = process.stderr
+;
+
+
+var S_IRWXG = 56     //    00070(8)
+  , S_IRWXO = 7      //    00007(8)
+  , S_IFMT  = 61440  // 00170000(8)
+  , S_IFREG = 32768  //  0100000(8)
+;
+function isRegFile(mode) {
+    return ((mode & S_IFMT) == S_IFREG);
+}
+
+var fieldNames = [ 'host', 'port', 'database', 'user', 'password' ];
+var nrOfFields = fieldNames.length;
+var passKey = fieldNames[ nrOfFields -1 ];
+
+
+function warn() {
+    var isWritable = (
+        warnStream instanceof Stream &&
+          true === warnStream.writable
+    );
+
+    if (isWritable) {
+        var args = Array.prototype.slice.call(arguments).concat("\n");
+        warnStream.write( util.format.apply(util, args) );
+    }
+}
+
+
+Object.defineProperty(module.exports, 'isWin', {
+    get : function() {
+        return isWin;
+    } ,
+    set : function(val) {
+        isWin = val;
+    }
+});
+
+
+module.exports.warnTo = function(stream) {
+    var old = warnStream;
+    warnStream = stream;
+    return old;
+};
+
+module.exports.getFileName = function(rawEnv){
+    var env = rawEnv || process.env;
+    var file = env.PGPASSFILE || (
+        isWin ?
+          path.join( env.APPDATA || './' , 'postgresql', 'pgpass.conf' ) :
+          path.join( env.HOME || './', '.pgpass' )
+    );
+    return file;
+};
+
+module.exports.usePgPass = function(stats, fname) {
+    if (Object.prototype.hasOwnProperty.call(process.env, 'PGPASSWORD')) {
+        return false;
+    }
+
+    if (isWin) {
+        return true;
+    }
+
+    fname = fname || '<unkn>';
+
+    if (! isRegFile(stats.mode)) {
+        warn('WARNING: password file "%s" is not a plain file', fname);
+        return false;
+    }
+
+    if (stats.mode & (S_IRWXG | S_IRWXO)) {
+        /* If password file is insecure, alert the user and ignore it. */
+        warn('WARNING: password file "%s" has group or world access; permissions should be u=rw (0600) or less', fname);
+        return false;
+    }
+
+    return true;
+};
+
+
+var matcher = module.exports.match = function(connInfo, entry) {
+    return fieldNames.slice(0, -1).reduce(function(prev, field, idx){
+        if (idx == 1) {
+            // the port
+            if ( Number( connInfo[field] || defaultPort ) === Number( entry[field] ) ) {
+                return prev && true;
+            }
+        }
+        return prev && (
+            entry[field] === '*' ||
+              entry[field] === connInfo[field]
+        );
+    }, true);
+};
+
+
+module.exports.getPassword = function(connInfo, stream, cb) {
+    var pass;
+    var lineStream = stream.pipe(split());
+
+    function onLine(line) {
+        var entry = parseLine(line);
+        if (entry && isValidEntry(entry) && matcher(connInfo, entry)) {
+            pass = entry[passKey];
+            lineStream.end(); // -> calls onEnd(), but pass is set now
+        }
+    }
+
+    var onEnd = function() {
+        stream.destroy();
+        cb(pass);
+    };
+
+    var onErr = function(err) {
+        stream.destroy();
+        warn('WARNING: error on reading file: %s', err);
+        cb(undefined);
+    };
+
+    stream.on('error', onErr);
+    lineStream
+        .on('data', onLine)
+        .on('end', onEnd)
+        .on('error', onErr)
+    ;
+
+};
+
+
+var parseLine = module.exports.parseLine = function(line) {
+    if (line.length < 11 || line.match(/^\s+#/)) {
+        return null;
+    }
+
+    var curChar = '';
+    var prevChar = '';
+    var fieldIdx = 0;
+    var startIdx = 0;
+    var endIdx = 0;
+    var obj = {};
+    var isLastField = false;
+    var addToObj = function(idx, i0, i1) {
+        var field = line.substring(i0, i1);
+
+        if (! Object.hasOwnProperty.call(process.env, 'PGPASS_NO_DEESCAPE')) {
+            field = field.replace(/\\([:\\])/g, '$1');
+        }
+
+        obj[ fieldNames[idx] ] = field;
+    };
+
+    for (var i = 0 ; i < line.length-1 ; i += 1) {
+        curChar = line.charAt(i+1);
+        prevChar = line.charAt(i);
+
+        isLastField = (fieldIdx == nrOfFields-1);
+
+        if (isLastField) {
+            addToObj(fieldIdx, startIdx);
+            break;
+        }
+
+        if (i >= 0 && curChar == ':' && prevChar !== '\\') {
+            addToObj(fieldIdx, startIdx, i+1);
+
+            startIdx = i+2;
+            fieldIdx += 1;
+        }
+    }
+
+    obj = ( Object.keys(obj).length === nrOfFields ) ? obj : null;
+
+    return obj;
+};
+
+
+var isValidEntry = module.exports.isValidEntry = function(entry){
+    var rules = {
+        // host
+        0 : function(x){
+            return x.length > 0;
+        } ,
+        // port
+        1 : function(x){
+            if (x === '*') {
+                return true;
+            }
+            x = Number(x);
+            return (
+                isFinite(x) &&
+                  x > 0 &&
+                  x < 9007199254740992 &&
+                  Math.floor(x) === x
+            );
+        } ,
+        // database
+        2 : function(x){
+            return x.length > 0;
+        } ,
+        // username
+        3 : function(x){
+            return x.length > 0;
+        } ,
+        // password
+        4 : function(x){
+            return x.length > 0;
+        }
+    };
+
+    for (var idx = 0 ; idx < fieldNames.length ; idx += 1) {
+        var rule = rules[idx];
+        var value = entry[ fieldNames[idx] ] || '';
+
+        var res = rule(value);
+        if (!res) {
+            return false;
+        }
+    }
+
+    return true;
+};
+
Index: TruckSimulator-main/node_modules/pgpass/lib/index.js
===================================================================
--- TruckSimulator-main/node_modules/pgpass/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pgpass/lib/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,23 @@
+'use strict';
+
+var path = require('path')
+  , fs = require('fs')
+  , helper = require('./helper.js')
+;
+
+
+module.exports = function(connInfo, cb) {
+    var file = helper.getFileName();
+    
+    fs.stat(file, function(err, stat){
+        if (err || !helper.usePgPass(stat, file)) {
+            return cb(undefined);
+        }
+
+        var st = fs.createReadStream(file);
+
+        helper.getPassword(connInfo, st, cb);
+    });
+};
+
+module.exports.warnTo = helper.warnTo;
Index: TruckSimulator-main/node_modules/pgpass/package.json
===================================================================
--- TruckSimulator-main/node_modules/pgpass/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/pgpass/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,41 @@
+{
+  "name": "pgpass",
+  "version": "1.0.5",
+  "description": "Module for reading .pgpass",
+  "main": "lib/index",
+  "scripts": {
+    "pretest": "chmod 600 ./test/_pgpass",
+    "_hint": "jshint --exclude node_modules --verbose lib test",
+    "_test": "mocha --recursive -R list",
+    "_covered_test": "nyc --reporter html --reporter text \"$npm_execpath\" run _test",
+    "test": "\"$npm_execpath\" run _hint && \"$npm_execpath\" run _covered_test"
+  },
+  "author": "Hannes Hörl <hannes.hoerl+pgpass@snowreporter.com>",
+  "license": "MIT",
+  "dependencies": {
+    "split2": "^4.1.0"
+  },
+  "devDependencies": {
+    "jshint": "^2.12.0",
+    "mocha": "^8.2.0",
+    "nyc": "^15.1.0",
+    "pg": "^8.4.1",
+    "pg-escape": "^0.2.0",
+    "pg-native": "3.0.0",
+    "resumer": "0.0.0",
+    "tmp": "^0.2.1",
+    "which": "^2.0.2"
+  },
+  "keywords": [
+    "postgres",
+    "pg",
+    "pgpass",
+    "password",
+    "postgresql"
+  ],
+  "bugs": "https://github.com/hoegaarden/pgpass/issues",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/hoegaarden/pgpass.git"
+  }
+}
Index: TruckSimulator-main/node_modules/postgres-array/index.d.ts
===================================================================
--- TruckSimulator-main/node_modules/postgres-array/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-array/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,4 @@
+
+export function parse(source: string): string[];
+export function parse<T>(source: string, transform: (value: string) => T): T[];
+
Index: TruckSimulator-main/node_modules/postgres-array/index.js
===================================================================
--- TruckSimulator-main/node_modules/postgres-array/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-array/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,97 @@
+'use strict'
+
+exports.parse = function (source, transform) {
+  return new ArrayParser(source, transform).parse()
+}
+
+class ArrayParser {
+  constructor (source, transform) {
+    this.source = source
+    this.transform = transform || identity
+    this.position = 0
+    this.entries = []
+    this.recorded = []
+    this.dimension = 0
+  }
+
+  isEof () {
+    return this.position >= this.source.length
+  }
+
+  nextCharacter () {
+    var character = this.source[this.position++]
+    if (character === '\\') {
+      return {
+        value: this.source[this.position++],
+        escaped: true
+      }
+    }
+    return {
+      value: character,
+      escaped: false
+    }
+  }
+
+  record (character) {
+    this.recorded.push(character)
+  }
+
+  newEntry (includeEmpty) {
+    var entry
+    if (this.recorded.length > 0 || includeEmpty) {
+      entry = this.recorded.join('')
+      if (entry === 'NULL' && !includeEmpty) {
+        entry = null
+      }
+      if (entry !== null) entry = this.transform(entry)
+      this.entries.push(entry)
+      this.recorded = []
+    }
+  }
+
+  consumeDimensions () {
+    if (this.source[0] === '[') {
+      while (!this.isEof()) {
+        var char = this.nextCharacter()
+        if (char.value === '=') break
+      }
+    }
+  }
+
+  parse (nested) {
+    var character, parser, quote
+    this.consumeDimensions()
+    while (!this.isEof()) {
+      character = this.nextCharacter()
+      if (character.value === '{' && !quote) {
+        this.dimension++
+        if (this.dimension > 1) {
+          parser = new ArrayParser(this.source.substr(this.position - 1), this.transform)
+          this.entries.push(parser.parse(true))
+          this.position += parser.position - 2
+        }
+      } else if (character.value === '}' && !quote) {
+        this.dimension--
+        if (!this.dimension) {
+          this.newEntry()
+          if (nested) return this.entries
+        }
+      } else if (character.value === '"' && !character.escaped) {
+        if (quote) this.newEntry(true)
+        quote = !quote
+      } else if (character.value === ',' && !quote) {
+        this.newEntry()
+      } else {
+        this.record(character.value)
+      }
+    }
+    if (this.dimension !== 0) {
+      throw new Error('array dimension not balanced')
+    }
+    return this.entries
+  }
+}
+
+function identity (value) {
+  return value
+}
Index: TruckSimulator-main/node_modules/postgres-array/license
===================================================================
--- TruckSimulator-main/node_modules/postgres-array/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-array/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/postgres-array/package.json
===================================================================
--- TruckSimulator-main/node_modules/postgres-array/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-array/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,35 @@
+{
+  "name": "postgres-array",
+  "main": "index.js",
+  "version": "2.0.0",
+  "description": "Parse postgres array columns",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-array",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=4"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "types": "index.d.ts",
+  "keywords": [
+    "postgres",
+    "array",
+    "parser"
+  ],
+  "dependencies": {},
+  "devDependencies": {
+    "standard": "^12.0.1",
+    "tape": "^4.0.0"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/node_modules/postgres-array/readme.md
===================================================================
--- TruckSimulator-main/node_modules/postgres-array/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-array/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,43 @@
+# postgres-array [![Build Status](https://travis-ci.org/bendrucker/postgres-array.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-array)
+
+> Parse postgres array columns
+
+
+## Install
+
+```
+$ npm install --save postgres-array
+```
+
+
+## Usage
+
+```js
+var postgresArray = require('postgres-array')
+
+postgresArray.parse('{1,2,3}', (value) => parseInt(value, 10))
+//=> [1, 2, 3]
+```
+
+## API
+
+#### `parse(input, [transform])` -> `array`
+
+##### input
+
+*Required*  
+Type: `string`
+
+A Postgres array string.
+
+##### transform
+
+Type: `function`  
+Default: `identity`
+
+A function that transforms non-null values inserted into the array.
+
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: TruckSimulator-main/node_modules/postgres-bytea/index.js
===================================================================
--- TruckSimulator-main/node_modules/postgres-bytea/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-bytea/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,31 @@
+'use strict'
+
+module.exports = function parseBytea (input) {
+  if (/^\\x/.test(input)) {
+    // new 'hex' style response (pg >9.0)
+    return new Buffer(input.substr(2), 'hex')
+  }
+  var output = ''
+  var i = 0
+  while (i < input.length) {
+    if (input[i] !== '\\') {
+      output += input[i]
+      ++i
+    } else {
+      if (/[0-7]{3}/.test(input.substr(i + 1, 3))) {
+        output += String.fromCharCode(parseInt(input.substr(i + 1, 3), 8))
+        i += 4
+      } else {
+        var backslashes = 1
+        while (i + backslashes < input.length && input[i + backslashes] === '\\') {
+          backslashes++
+        }
+        for (var k = 0; k < Math.floor(backslashes / 2); ++k) {
+          output += '\\'
+        }
+        i += Math.floor(backslashes / 2) * 2
+      }
+    }
+  }
+  return new Buffer(output, 'binary')
+}
Index: TruckSimulator-main/node_modules/postgres-bytea/license
===================================================================
--- TruckSimulator-main/node_modules/postgres-bytea/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-bytea/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/postgres-bytea/package.json
===================================================================
--- TruckSimulator-main/node_modules/postgres-bytea/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-bytea/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,34 @@
+{
+  "name": "postgres-bytea",
+  "main": "index.js",
+  "version": "1.0.0",
+  "description": "Postgres bytea parser",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-bytea",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "keywords": [
+    "bytea",
+    "postgres",
+    "binary",
+    "parser"
+  ],
+  "dependencies": {},
+  "devDependencies": {
+    "tape": "^4.0.0",
+    "standard": "^4.0.0"
+  },
+  "files": [
+    "index.js",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/node_modules/postgres-bytea/readme.md
===================================================================
--- TruckSimulator-main/node_modules/postgres-bytea/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-bytea/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,34 @@
+# postgres-bytea [![Build Status](https://travis-ci.org/bendrucker/postgres-bytea.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-bytea)
+
+> Postgres bytea parser
+
+
+## Install
+
+```
+$ npm install --save postgres-bytea
+```
+
+
+## Usage
+
+```js
+var bytea = require('postgres-bytea');
+bytea('\\000\\100\\200')
+//=> buffer
+```
+
+## API
+
+#### `bytea(input)` -> `buffer`
+
+##### input
+
+*Required*  
+Type: `string`
+
+A Postgres bytea binary string.
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: TruckSimulator-main/node_modules/postgres-date/index.js
===================================================================
--- TruckSimulator-main/node_modules/postgres-date/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-date/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,116 @@
+'use strict'
+
+var DATE_TIME = /(\d{1,})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(\.\d{1,})?.*?( BC)?$/
+var DATE = /^(\d{1,})-(\d{2})-(\d{2})( BC)?$/
+var TIME_ZONE = /([Z+-])(\d{2})?:?(\d{2})?:?(\d{2})?/
+var INFINITY = /^-?infinity$/
+
+module.exports = function parseDate (isoDate) {
+  if (INFINITY.test(isoDate)) {
+    // Capitalize to Infinity before passing to Number
+    return Number(isoDate.replace('i', 'I'))
+  }
+  var matches = DATE_TIME.exec(isoDate)
+
+  if (!matches) {
+    // Force YYYY-MM-DD dates to be parsed as local time
+    return getDate(isoDate) || null
+  }
+
+  var isBC = !!matches[8]
+  var year = parseInt(matches[1], 10)
+  if (isBC) {
+    year = bcYearToNegativeYear(year)
+  }
+
+  var month = parseInt(matches[2], 10) - 1
+  var day = matches[3]
+  var hour = parseInt(matches[4], 10)
+  var minute = parseInt(matches[5], 10)
+  var second = parseInt(matches[6], 10)
+
+  var ms = matches[7]
+  ms = ms ? 1000 * parseFloat(ms) : 0
+
+  var date
+  var offset = timeZoneOffset(isoDate)
+  if (offset != null) {
+    date = new Date(Date.UTC(year, month, day, hour, minute, second, ms))
+
+    // Account for years from 0 to 99 being interpreted as 1900-1999
+    // by Date.UTC / the multi-argument form of the Date constructor
+    if (is0To99(year)) {
+      date.setUTCFullYear(year)
+    }
+
+    if (offset !== 0) {
+      date.setTime(date.getTime() - offset)
+    }
+  } else {
+    date = new Date(year, month, day, hour, minute, second, ms)
+
+    if (is0To99(year)) {
+      date.setFullYear(year)
+    }
+  }
+
+  return date
+}
+
+function getDate (isoDate) {
+  var matches = DATE.exec(isoDate)
+  if (!matches) {
+    return
+  }
+
+  var year = parseInt(matches[1], 10)
+  var isBC = !!matches[4]
+  if (isBC) {
+    year = bcYearToNegativeYear(year)
+  }
+
+  var month = parseInt(matches[2], 10) - 1
+  var day = matches[3]
+  // YYYY-MM-DD will be parsed as local time
+  var date = new Date(year, month, day)
+
+  if (is0To99(year)) {
+    date.setFullYear(year)
+  }
+
+  return date
+}
+
+// match timezones:
+// Z (UTC)
+// -05
+// +06:30
+function timeZoneOffset (isoDate) {
+  if (isoDate.endsWith('+00')) {
+    return 0
+  }
+
+  var zone = TIME_ZONE.exec(isoDate.split(' ')[1])
+  if (!zone) return
+  var type = zone[1]
+
+  if (type === 'Z') {
+    return 0
+  }
+  var sign = type === '-' ? -1 : 1
+  var offset = parseInt(zone[2], 10) * 3600 +
+    parseInt(zone[3] || 0, 10) * 60 +
+    parseInt(zone[4] || 0, 10)
+
+  return offset * sign * 1000
+}
+
+function bcYearToNegativeYear (year) {
+  // Account for numerical difference between representations of BC years
+  // See: https://github.com/bendrucker/postgres-date/issues/5
+  return -(year - 1)
+}
+
+function is0To99 (num) {
+  return num >= 0 && num < 100
+}
Index: TruckSimulator-main/node_modules/postgres-date/license
===================================================================
--- TruckSimulator-main/node_modules/postgres-date/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-date/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/postgres-date/package.json
===================================================================
--- TruckSimulator-main/node_modules/postgres-date/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-date/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,33 @@
+{
+  "name": "postgres-date",
+  "main": "index.js",
+  "version": "1.0.7",
+  "description": "Postgres date column parser",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-date",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "keywords": [
+    "postgres",
+    "date",
+    "parser"
+  ],
+  "dependencies": {},
+  "devDependencies": {
+    "standard": "^14.0.0",
+    "tape": "^5.0.0"
+  },
+  "files": [
+    "index.js",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/node_modules/postgres-date/readme.md
===================================================================
--- TruckSimulator-main/node_modules/postgres-date/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-date/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,49 @@
+# postgres-date [![Build Status](https://travis-ci.org/bendrucker/postgres-date.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-date) [![Greenkeeper badge](https://badges.greenkeeper.io/bendrucker/postgres-date.svg)](https://greenkeeper.io/)
+
+> Postgres date output parser
+
+This package parses [date/time outputs](https://www.postgresql.org/docs/current/datatype-datetime.html#DATATYPE-DATETIME-OUTPUT) from Postgres into Javascript `Date` objects. Its goal is to match Postgres behavior and preserve data accuracy.
+
+If you find a case where a valid Postgres output results in incorrect parsing (including loss of precision), please [create a pull request](https://github.com/bendrucker/postgres-date/compare) and provide a failing test.
+
+**Supported Postgres Versions:** `>= 9.6`
+
+All prior versions of Postgres are likely compatible but not officially supported.
+
+## Install
+
+```
+$ npm install --save postgres-date
+```
+
+
+## Usage
+
+```js
+var parse = require('postgres-date')
+parse('2011-01-23 22:15:51Z')
+// => 2011-01-23T22:15:51.000Z
+```
+
+## API
+
+#### `parse(isoDate)` -> `date`
+
+##### isoDate
+
+*Required*  
+Type: `string`
+
+A date string from Postgres.
+
+## Releases
+
+The following semantic versioning increments will be used for changes:
+
+* **Major**: Removal of support for Node.js versions or Postgres versions (not expected)
+* **Minor**: Unused, since Postgres returns dates in standard ISO 8601 format
+* **Patch**: Any fix for parsing behavior
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: TruckSimulator-main/node_modules/postgres-interval/index.d.ts
===================================================================
--- TruckSimulator-main/node_modules/postgres-interval/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-interval/index.d.ts	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,20 @@
+declare namespace PostgresInterval {
+  export interface IPostgresInterval {
+    years?: number;
+    months?: number;
+    days?: number;
+    hours?: number;
+    minutes?: number;
+    seconds?: number;
+    milliseconds?: number;
+
+    toPostgres(): string;
+
+    toISO(): string;
+    toISOString(): string;
+  }
+}
+
+declare function PostgresInterval(raw: string): PostgresInterval.IPostgresInterval;
+
+export = PostgresInterval;
Index: TruckSimulator-main/node_modules/postgres-interval/index.js
===================================================================
--- TruckSimulator-main/node_modules/postgres-interval/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-interval/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,125 @@
+'use strict'
+
+var extend = require('xtend/mutable')
+
+module.exports = PostgresInterval
+
+function PostgresInterval (raw) {
+  if (!(this instanceof PostgresInterval)) {
+    return new PostgresInterval(raw)
+  }
+  extend(this, parse(raw))
+}
+var properties = ['seconds', 'minutes', 'hours', 'days', 'months', 'years']
+PostgresInterval.prototype.toPostgres = function () {
+  var filtered = properties.filter(this.hasOwnProperty, this)
+
+  // In addition to `properties`, we need to account for fractions of seconds.
+  if (this.milliseconds && filtered.indexOf('seconds') < 0) {
+    filtered.push('seconds')
+  }
+
+  if (filtered.length === 0) return '0'
+  return filtered
+    .map(function (property) {
+      var value = this[property] || 0
+
+      // Account for fractional part of seconds,
+      // remove trailing zeroes.
+      if (property === 'seconds' && this.milliseconds) {
+        value = (value + this.milliseconds / 1000).toFixed(6).replace(/\.?0+$/, '')
+      }
+
+      return value + ' ' + property
+    }, this)
+    .join(' ')
+}
+
+var propertiesISOEquivalent = {
+  years: 'Y',
+  months: 'M',
+  days: 'D',
+  hours: 'H',
+  minutes: 'M',
+  seconds: 'S'
+}
+var dateProperties = ['years', 'months', 'days']
+var timeProperties = ['hours', 'minutes', 'seconds']
+// according to ISO 8601
+PostgresInterval.prototype.toISOString = PostgresInterval.prototype.toISO = function () {
+  var datePart = dateProperties
+    .map(buildProperty, this)
+    .join('')
+
+  var timePart = timeProperties
+    .map(buildProperty, this)
+    .join('')
+
+  return 'P' + datePart + 'T' + timePart
+
+  function buildProperty (property) {
+    var value = this[property] || 0
+
+    // Account for fractional part of seconds,
+    // remove trailing zeroes.
+    if (property === 'seconds' && this.milliseconds) {
+      value = (value + this.milliseconds / 1000).toFixed(6).replace(/0+$/, '')
+    }
+
+    return value + propertiesISOEquivalent[property]
+  }
+}
+
+var NUMBER = '([+-]?\\d+)'
+var YEAR = NUMBER + '\\s+years?'
+var MONTH = NUMBER + '\\s+mons?'
+var DAY = NUMBER + '\\s+days?'
+var TIME = '([+-])?([\\d]*):(\\d\\d):(\\d\\d)\\.?(\\d{1,6})?'
+var INTERVAL = new RegExp([YEAR, MONTH, DAY, TIME].map(function (regexString) {
+  return '(' + regexString + ')?'
+})
+  .join('\\s*'))
+
+// Positions of values in regex match
+var positions = {
+  years: 2,
+  months: 4,
+  days: 6,
+  hours: 9,
+  minutes: 10,
+  seconds: 11,
+  milliseconds: 12
+}
+// We can use negative time
+var negatives = ['hours', 'minutes', 'seconds', 'milliseconds']
+
+function parseMilliseconds (fraction) {
+  // add omitted zeroes
+  var microseconds = fraction + '000000'.slice(fraction.length)
+  return parseInt(microseconds, 10) / 1000
+}
+
+function parse (interval) {
+  if (!interval) return {}
+  var matches = INTERVAL.exec(interval)
+  var isNegative = matches[8] === '-'
+  return Object.keys(positions)
+    .reduce(function (parsed, property) {
+      var position = positions[property]
+      var value = matches[position]
+      // no empty string
+      if (!value) return parsed
+      // milliseconds are actually microseconds (up to 6 digits)
+      // with omitted trailing zeroes.
+      value = property === 'milliseconds'
+        ? parseMilliseconds(value)
+        : parseInt(value, 10)
+      // no zeros
+      if (!value) return parsed
+      if (isNegative && ~negatives.indexOf(property)) {
+        value *= -1
+      }
+      parsed[property] = value
+      return parsed
+    }, {})
+}
Index: TruckSimulator-main/node_modules/postgres-interval/license
===================================================================
--- TruckSimulator-main/node_modules/postgres-interval/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-interval/license	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) Ben Drucker <bvdrucker@gmail.com> (bendrucker.me)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/postgres-interval/package.json
===================================================================
--- TruckSimulator-main/node_modules/postgres-interval/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-interval/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,36 @@
+{
+  "name": "postgres-interval",
+  "main": "index.js",
+  "version": "1.2.0",
+  "description": "Parse Postgres interval columns",
+  "license": "MIT",
+  "repository": "bendrucker/postgres-interval",
+  "author": {
+    "name": "Ben Drucker",
+    "email": "bvdrucker@gmail.com",
+    "url": "bendrucker.me"
+  },
+  "engines": {
+    "node": ">=0.10.0"
+  },
+  "scripts": {
+    "test": "standard && tape test.js"
+  },
+  "keywords": [
+    "postgres",
+    "interval",
+    "parser"
+  ],
+  "dependencies": {
+    "xtend": "^4.0.0"
+  },
+  "devDependencies": {
+    "tape": "^4.0.0",
+    "standard": "^12.0.1"
+  },
+  "files": [
+    "index.js",
+    "index.d.ts",
+    "readme.md"
+  ]
+}
Index: TruckSimulator-main/node_modules/postgres-interval/readme.md
===================================================================
--- TruckSimulator-main/node_modules/postgres-interval/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/postgres-interval/readme.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,48 @@
+# postgres-interval [![Build Status](https://travis-ci.org/bendrucker/postgres-interval.svg?branch=master)](https://travis-ci.org/bendrucker/postgres-interval) [![Greenkeeper badge](https://badges.greenkeeper.io/bendrucker/postgres-interval.svg)](https://greenkeeper.io/)
+
+> Parse Postgres interval columns
+
+
+## Install
+
+```
+$ npm install --save postgres-interval
+```
+
+
+## Usage
+
+```js
+var parse = require('postgres-interval')
+var interval = parse('01:02:03')
+//=> {hours: 1, minutes: 2, seconds: 3}
+interval.toPostgres()
+// 3 seconds 2 minutes 1 hours
+interval.toISO()
+// P0Y0M0DT1H2M3S
+```
+
+## API
+
+#### `parse(pgInterval)` -> `interval`
+
+##### pgInterval
+
+*Required*  
+Type: `string`
+
+A Postgres interval string.
+
+#### `interval.toPostgres()` -> `string`
+
+Returns an interval string. This allows the interval object to be passed into prepared statements.
+
+#### `interval.toISOString()` -> `string`
+
+Returns an [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601#Durations) compliant string.
+
+Also available as `interval.toISO()` for backwards compatibility.
+
+## License
+
+MIT © [Ben Drucker](http://bendrucker.me)
Index: TruckSimulator-main/node_modules/split2/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/split2/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/split2/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,13 @@
+Copyright (c) 2014-2018, Matteo Collina <hello@matteocollina.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: TruckSimulator-main/node_modules/split2/README.md
===================================================================
--- TruckSimulator-main/node_modules/split2/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/split2/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,85 @@
+# Split2(matcher, mapper, options)
+
+![ci](https://github.com/mcollina/split2/workflows/ci/badge.svg)
+
+Break up a stream and reassemble it so that each line is a chunk.
+`split2` is inspired by [@dominictarr](https://github.com/dominictarr) [`split`](https://github.com/dominictarr/split) module,
+and it is totally API compatible with it.
+However, it is based on Node.js core [`Transform`](https://nodejs.org/api/stream.html#stream_new_stream_transform_options).
+
+`matcher` may be a `String`, or a `RegExp`. Example, read every line in a file ...
+
+``` js
+  fs.createReadStream(file)
+    .pipe(split2())
+    .on('data', function (line) {
+      //each chunk now is a separate line!
+    })
+
+```
+
+`split` takes the same arguments as `string.split` except it defaults to '/\r?\n/', and the optional `limit` paremeter is ignored.
+[String#split](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/split)
+
+`split` takes an optional options object on it's third argument, which
+is directly passed as a
+[Transform](https://nodejs.org/api/stream.html#stream_new_stream_transform_options)
+option.
+
+Additionally, the `.maxLength` and `.skipOverflow` options are implemented, which set limits on the internal
+buffer size and the stream's behavior when the limit is exceeded. There is no limit unless `maxLength` is set. When
+the internal buffer size exceeds `maxLength`, the stream emits an error by default. You may also set `skipOverflow` to
+true to suppress the error and instead skip past any lines that cause the internal buffer to exceed `maxLength`.
+
+Calling `.destroy` will make the stream emit `close`. Use this to perform cleanup logic
+
+``` js
+var splitFile = function(filename) {
+  var file = fs.createReadStream(filename)
+
+  return file
+    .pipe(split2())
+    .on('close', function() {
+      // destroy the file stream in case the split stream was destroyed
+      file.destroy()
+    })
+}
+
+var stream = splitFile('my-file.txt')
+
+stream.destroy() // will destroy the input file stream
+```
+
+# NDJ - Newline Delimited Json
+
+`split2` accepts a function which transforms each line.
+
+``` js
+fs.createReadStream(file)
+  .pipe(split2(JSON.parse))
+  .on('data', function (obj) {
+    //each chunk now is a js object
+  })
+  .on("error", function(error) {
+    //handling parsing errors
+  })
+```
+
+However, in [@dominictarr](https://github.com/dominictarr) [`split`](https://github.com/dominictarr/split) the mapper
+is wrapped in a try-catch, while here it is not: if your parsing logic can throw, wrap it yourself. Otherwise, you can also use the stream error handling when mapper function throw.
+
+# License
+
+Copyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Index: TruckSimulator-main/node_modules/split2/bench.js
===================================================================
--- TruckSimulator-main/node_modules/split2/bench.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/split2/bench.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,27 @@
+'use strict'
+
+const split = require('./')
+const bench = require('fastbench')
+const binarySplit = require('binary-split')
+const fs = require('fs')
+
+function benchSplit (cb) {
+  fs.createReadStream('package.json')
+    .pipe(split())
+    .on('end', cb)
+    .resume()
+}
+
+function benchBinarySplit (cb) {
+  fs.createReadStream('package.json')
+    .pipe(binarySplit())
+    .on('end', cb)
+    .resume()
+}
+
+const run = bench([
+  benchSplit,
+  benchBinarySplit
+], 10000)
+
+run(run)
Index: TruckSimulator-main/node_modules/split2/index.js
===================================================================
--- TruckSimulator-main/node_modules/split2/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/split2/index.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,141 @@
+/*
+Copyright (c) 2014-2021, Matteo Collina <hello@matteocollina.com>
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+*/
+
+'use strict'
+
+const { Transform } = require('stream')
+const { StringDecoder } = require('string_decoder')
+const kLast = Symbol('last')
+const kDecoder = Symbol('decoder')
+
+function transform (chunk, enc, cb) {
+  let list
+  if (this.overflow) { // Line buffer is full. Skip to start of next line.
+    const buf = this[kDecoder].write(chunk)
+    list = buf.split(this.matcher)
+
+    if (list.length === 1) return cb() // Line ending not found. Discard entire chunk.
+
+    // Line ending found. Discard trailing fragment of previous line and reset overflow state.
+    list.shift()
+    this.overflow = false
+  } else {
+    this[kLast] += this[kDecoder].write(chunk)
+    list = this[kLast].split(this.matcher)
+  }
+
+  this[kLast] = list.pop()
+
+  for (let i = 0; i < list.length; i++) {
+    try {
+      push(this, this.mapper(list[i]))
+    } catch (error) {
+      return cb(error)
+    }
+  }
+
+  this.overflow = this[kLast].length > this.maxLength
+  if (this.overflow && !this.skipOverflow) {
+    cb(new Error('maximum buffer reached'))
+    return
+  }
+
+  cb()
+}
+
+function flush (cb) {
+  // forward any gibberish left in there
+  this[kLast] += this[kDecoder].end()
+
+  if (this[kLast]) {
+    try {
+      push(this, this.mapper(this[kLast]))
+    } catch (error) {
+      return cb(error)
+    }
+  }
+
+  cb()
+}
+
+function push (self, val) {
+  if (val !== undefined) {
+    self.push(val)
+  }
+}
+
+function noop (incoming) {
+  return incoming
+}
+
+function split (matcher, mapper, options) {
+  // Set defaults for any arguments not supplied.
+  matcher = matcher || /\r?\n/
+  mapper = mapper || noop
+  options = options || {}
+
+  // Test arguments explicitly.
+  switch (arguments.length) {
+    case 1:
+      // If mapper is only argument.
+      if (typeof matcher === 'function') {
+        mapper = matcher
+        matcher = /\r?\n/
+      // If options is only argument.
+      } else if (typeof matcher === 'object' && !(matcher instanceof RegExp) && !matcher[Symbol.split]) {
+        options = matcher
+        matcher = /\r?\n/
+      }
+      break
+
+    case 2:
+      // If mapper and options are arguments.
+      if (typeof matcher === 'function') {
+        options = mapper
+        mapper = matcher
+        matcher = /\r?\n/
+      // If matcher and options are arguments.
+      } else if (typeof mapper === 'object') {
+        options = mapper
+        mapper = noop
+      }
+  }
+
+  options = Object.assign({}, options)
+  options.autoDestroy = true
+  options.transform = transform
+  options.flush = flush
+  options.readableObjectMode = true
+
+  const stream = new Transform(options)
+
+  stream[kLast] = ''
+  stream[kDecoder] = new StringDecoder('utf8')
+  stream.matcher = matcher
+  stream.mapper = mapper
+  stream.maxLength = options.maxLength
+  stream.skipOverflow = options.skipOverflow || false
+  stream.overflow = false
+  stream._destroy = function (err, cb) {
+    // Weird Node v12 bug that we need to work around
+    this._writableState.errorEmitted = false
+    cb(err)
+  }
+
+  return stream
+}
+
+module.exports = split
Index: TruckSimulator-main/node_modules/split2/package.json
===================================================================
--- TruckSimulator-main/node_modules/split2/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/split2/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,39 @@
+{
+  "name": "split2",
+  "version": "4.2.0",
+  "description": "split a Text Stream into a Line Stream, using Stream 3",
+  "main": "index.js",
+  "scripts": {
+    "lint": "standard --verbose",
+    "unit": "nyc --lines 100 --branches 100 --functions 100 --check-coverage --reporter=text tape test.js",
+    "coverage": "nyc --reporter=html --reporter=cobertura --reporter=text tape test/test.js",
+    "test:report": "npm run lint && npm run unit:report",
+    "test": "npm run lint && npm run unit",
+    "legacy": "tape test.js"
+  },
+  "pre-commit": [
+    "test"
+  ],
+  "website": "https://github.com/mcollina/split2",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mcollina/split2.git"
+  },
+  "bugs": {
+    "url": "http://github.com/mcollina/split2/issues"
+  },
+  "engines": {
+    "node": ">= 10.x"
+  },
+  "author": "Matteo Collina <hello@matteocollina.com>",
+  "license": "ISC",
+  "devDependencies": {
+    "binary-split": "^1.0.3",
+    "callback-stream": "^1.1.0",
+    "fastbench": "^1.0.0",
+    "nyc": "^15.0.1",
+    "pre-commit": "^1.1.2",
+    "standard": "^17.0.0",
+    "tape": "^5.0.0"
+  }
+}
Index: TruckSimulator-main/node_modules/split2/test.js
===================================================================
--- TruckSimulator-main/node_modules/split2/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/split2/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,409 @@
+'use strict'
+
+const test = require('tape')
+const split = require('./')
+const callback = require('callback-stream')
+const strcb = callback.bind(null, { decodeStrings: false })
+const objcb = callback.bind(null, { objectMode: true })
+
+test('split two lines on end', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello\nworld')
+})
+
+test('split two lines on two writes', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.write('hello')
+  input.write('\nworld')
+  input.end()
+})
+
+test('split four lines on three writes', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world', 'bye', 'world'])
+  }))
+
+  input.write('hello\nwor')
+  input.write('ld\nbye\nwo')
+  input.write('rld')
+  input.end()
+})
+
+test('accumulate multiple writes', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['helloworld'])
+  }))
+
+  input.write('hello')
+  input.write('world')
+  input.end()
+})
+
+test('split using a custom string matcher', function (t) {
+  t.plan(2)
+
+  const input = split('~')
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
+
+test('split using a custom regexp matcher', function (t) {
+  t.plan(2)
+
+  const input = split(/~/)
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
+
+test('support an option argument', function (t) {
+  t.plan(2)
+
+  const input = split({ highWaterMark: 2 })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello\nworld')
+})
+
+test('support a mapper function', function (t) {
+  t.plan(2)
+
+  const a = { a: '42' }
+  const b = { b: '24' }
+
+  const input = split(JSON.parse)
+
+  input.pipe(objcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, [a, b])
+  }))
+
+  input.write(JSON.stringify(a))
+  input.write('\n')
+  input.end(JSON.stringify(b))
+})
+
+test('split lines windows-style', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello\r\nworld')
+})
+
+test('splits a buffer', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end(Buffer.from('hello\nworld'))
+})
+
+test('do not end on undefined', function (t) {
+  t.plan(2)
+
+  const input = split(function (line) { })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, [])
+  }))
+
+  input.end(Buffer.from('hello\nworld'))
+})
+
+test('has destroy method', function (t) {
+  t.plan(1)
+
+  const input = split(function (line) { })
+
+  input.on('close', function () {
+    t.ok(true, 'close emitted')
+    t.end()
+  })
+
+  input.destroy()
+})
+
+test('support custom matcher and mapper', function (t) {
+  t.plan(4)
+
+  const a = { a: '42' }
+  const b = { b: '24' }
+  const input = split('~', JSON.parse)
+
+  t.equal(input.matcher, '~')
+  t.equal(typeof input.mapper, 'function')
+
+  input.pipe(objcb(function (err, list) {
+    t.notOk(err, 'no errors')
+    t.deepEqual(list, [a, b])
+  }))
+
+  input.write(JSON.stringify(a))
+  input.write('~')
+  input.end(JSON.stringify(b))
+})
+
+test('support custom matcher and options', function (t) {
+  t.plan(6)
+
+  const input = split('~', { highWaterMark: 1024 })
+
+  t.equal(input.matcher, '~')
+  t.equal(typeof input.mapper, 'function')
+  t.equal(input._readableState.highWaterMark, 1024)
+  t.equal(input._writableState.highWaterMark, 1024)
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
+
+test('support mapper and options', function (t) {
+  t.plan(6)
+
+  const a = { a: '42' }
+  const b = { b: '24' }
+  const input = split(JSON.parse, { highWaterMark: 1024 })
+
+  t.ok(input.matcher instanceof RegExp, 'matcher is RegExp')
+  t.equal(typeof input.mapper, 'function')
+  t.equal(input._readableState.highWaterMark, 1024)
+  t.equal(input._writableState.highWaterMark, 1024)
+
+  input.pipe(objcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, [a, b])
+  }))
+
+  input.write(JSON.stringify(a))
+  input.write('\n')
+  input.end(JSON.stringify(b))
+})
+
+test('split utf8 chars', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['烫烫烫', '锟斤拷'])
+  }))
+
+  const buf = Buffer.from('烫烫烫\r\n锟斤拷', 'utf8')
+  for (let i = 0; i < buf.length; ++i) {
+    input.write(buf.slice(i, i + 1))
+  }
+  input.end()
+})
+
+test('split utf8 chars 2by2', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['烫烫烫', '烫烫烫'])
+  }))
+
+  const str = '烫烫烫\r\n烫烫烫'
+  const buf = Buffer.from(str, 'utf8')
+  for (let i = 0; i < buf.length; i += 2) {
+    input.write(buf.slice(i, i + 2))
+  }
+  input.end()
+})
+
+test('split lines when the \n comes at the end of a chunk', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.write('hello\n')
+  input.end('world')
+})
+
+test('truncated utf-8 char', function (t) {
+  t.plan(2)
+
+  const input = split()
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['烫' + Buffer.from('e7', 'hex').toString()])
+  }))
+
+  const str = '烫烫'
+  const buf = Buffer.from(str, 'utf8')
+
+  input.write(buf.slice(0, 3))
+  input.end(buf.slice(3, 4))
+})
+
+test('maximum buffer limit', function (t) {
+  t.plan(1)
+
+  const input = split({ maxLength: 2 })
+  input.on('error', function (err) {
+    t.ok(err)
+  })
+
+  input.resume()
+
+  input.write('hey')
+})
+
+test('readable highWaterMark', function (t) {
+  const input = split()
+  t.equal(input._readableState.highWaterMark, 16)
+  t.end()
+})
+
+test('maxLength < chunk size', function (t) {
+  t.plan(2)
+
+  const input = split({ maxLength: 2 })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['a', 'b'])
+  }))
+
+  input.end('a\nb')
+})
+
+test('maximum buffer limit w/skip', function (t) {
+  t.plan(2)
+
+  const input = split({ maxLength: 2, skipOverflow: true })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['a', 'b', 'c'])
+  }))
+
+  input.write('a\n123')
+  input.write('456')
+  input.write('789\nb\nc')
+  input.end()
+})
+
+test("don't modify the options object", function (t) {
+  t.plan(2)
+
+  const options = {}
+  const input = split(options)
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.same(options, {})
+  }))
+
+  input.end()
+})
+
+test('mapper throws flush', function (t) {
+  t.plan(1)
+  const error = new Error()
+  const input = split(function () {
+    throw error
+  })
+
+  input.on('error', (err, list) => {
+    t.same(err, error)
+  })
+  input.end('hello')
+})
+
+test('mapper throws on transform', function (t) {
+  t.plan(1)
+
+  const error = new Error()
+  const input = split(function (l) {
+    throw error
+  })
+
+  input.on('error', (err) => {
+    t.same(err, error)
+  })
+  input.write('a')
+  input.write('\n')
+  input.end('b')
+})
+
+test('supports Symbol.split', function (t) {
+  t.plan(2)
+
+  const input = split({
+    [Symbol.split] (str) {
+      return str.split('~')
+    }
+  })
+
+  input.pipe(strcb(function (err, list) {
+    t.error(err)
+    t.deepEqual(list, ['hello', 'world'])
+  }))
+
+  input.end('hello~world')
+})
Index: TruckSimulator-main/node_modules/xtend/.jshintrc
===================================================================
--- TruckSimulator-main/node_modules/xtend/.jshintrc	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/xtend/.jshintrc	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,30 @@
+{
+    "maxdepth": 4,
+    "maxstatements": 200,
+    "maxcomplexity": 12,
+    "maxlen": 80,
+    "maxparams": 5,
+
+    "curly": true,
+    "eqeqeq": true,
+    "immed": true,
+    "latedef": false,
+    "noarg": true,
+    "noempty": true,
+    "nonew": true,
+    "undef": true,
+    "unused": "vars",
+    "trailing": true,
+
+    "quotmark": true,
+    "expr": true,
+    "asi": true,
+
+    "browser": false,
+    "esnext": true,
+    "devel": false,
+    "node": false,
+    "nonstandard": false,
+
+    "predef": ["require", "module", "__dirname", "__filename"]
+}
Index: TruckSimulator-main/node_modules/xtend/LICENSE
===================================================================
--- TruckSimulator-main/node_modules/xtend/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/xtend/LICENSE	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+Copyright (c) 2012-2014 Raynos.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: TruckSimulator-main/node_modules/xtend/README.md
===================================================================
--- TruckSimulator-main/node_modules/xtend/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/xtend/README.md	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,32 @@
+# xtend
+
+[![browser support][3]][4]
+
+[![locked](http://badges.github.io/stability-badges/dist/locked.svg)](http://github.com/badges/stability-badges)
+
+Extend like a boss
+
+xtend is a basic utility library which allows you to extend an object by appending all of the properties from each object in a list. When there are identical properties, the right-most property takes precedence.
+
+## Examples
+
+```js
+var extend = require("xtend")
+
+// extend returns a new object. Does not mutate arguments
+var combination = extend({
+    a: "a",
+    b: "c"
+}, {
+    b: "b"
+})
+// { a: "a", b: "b" }
+```
+
+## Stability status: Locked
+
+## MIT Licensed 
+
+
+  [3]: http://ci.testling.com/Raynos/xtend.png
+  [4]: http://ci.testling.com/Raynos/xtend
Index: TruckSimulator-main/node_modules/xtend/immutable.js
===================================================================
--- TruckSimulator-main/node_modules/xtend/immutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/xtend/immutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,19 @@
+module.exports = extend
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function extend() {
+    var target = {}
+
+    for (var i = 0; i < arguments.length; i++) {
+        var source = arguments[i]
+
+        for (var key in source) {
+            if (hasOwnProperty.call(source, key)) {
+                target[key] = source[key]
+            }
+        }
+    }
+
+    return target
+}
Index: TruckSimulator-main/node_modules/xtend/mutable.js
===================================================================
--- TruckSimulator-main/node_modules/xtend/mutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/xtend/mutable.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,17 @@
+module.exports = extend
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+function extend(target) {
+    for (var i = 1; i < arguments.length; i++) {
+        var source = arguments[i]
+
+        for (var key in source) {
+            if (hasOwnProperty.call(source, key)) {
+                target[key] = source[key]
+            }
+        }
+    }
+
+    return target
+}
Index: TruckSimulator-main/node_modules/xtend/package.json
===================================================================
--- TruckSimulator-main/node_modules/xtend/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/xtend/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,55 @@
+{
+  "name": "xtend",
+  "version": "4.0.2",
+  "description": "extend like a boss",
+  "keywords": [
+    "extend",
+    "merge",
+    "options",
+    "opts",
+    "object",
+    "array"
+  ],
+  "author": "Raynos <raynos2@gmail.com>",
+  "repository": "git://github.com/Raynos/xtend.git",
+  "main": "immutable",
+  "scripts": {
+    "test": "node test"
+  },
+  "dependencies": {},
+  "devDependencies": {
+    "tape": "~1.1.0"
+  },
+  "homepage": "https://github.com/Raynos/xtend",
+  "contributors": [
+    {
+      "name": "Jake Verbaten"
+    },
+    {
+      "name": "Matt Esch"
+    }
+  ],
+  "bugs": {
+    "url": "https://github.com/Raynos/xtend/issues",
+    "email": "raynos2@gmail.com"
+  },
+  "license": "MIT",
+  "testling": {
+    "files": "test.js",
+    "browsers": [
+      "ie/7..latest",
+      "firefox/16..latest",
+      "firefox/nightly",
+      "chrome/22..latest",
+      "chrome/canary",
+      "opera/12..latest",
+      "opera/next",
+      "safari/5.1..latest",
+      "ipad/6.0..latest",
+      "iphone/6.0..latest"
+    ]
+  },
+  "engines": {
+    "node": ">=0.4"
+  }
+}
Index: TruckSimulator-main/node_modules/xtend/test.js
===================================================================
--- TruckSimulator-main/node_modules/xtend/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/node_modules/xtend/test.js	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,103 @@
+var test = require("tape")
+var extend = require("./")
+var mutableExtend = require("./mutable")
+
+test("merge", function(assert) {
+    var a = { a: "foo" }
+    var b = { b: "bar" }
+
+    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
+    assert.end()
+})
+
+test("replace", function(assert) {
+    var a = { a: "foo" }
+    var b = { a: "bar" }
+
+    assert.deepEqual(extend(a, b), { a: "bar" })
+    assert.end()
+})
+
+test("undefined", function(assert) {
+    var a = { a: undefined }
+    var b = { b: "foo" }
+
+    assert.deepEqual(extend(a, b), { a: undefined, b: "foo" })
+    assert.deepEqual(extend(b, a), { a: undefined, b: "foo" })
+    assert.end()
+})
+
+test("handle 0", function(assert) {
+    var a = { a: "default" }
+    var b = { a: 0 }
+
+    assert.deepEqual(extend(a, b), { a: 0 })
+    assert.deepEqual(extend(b, a), { a: "default" })
+    assert.end()
+})
+
+test("is immutable", function (assert) {
+    var record = {}
+
+    extend(record, { foo: "bar" })
+    assert.equal(record.foo, undefined)
+    assert.end()
+})
+
+test("null as argument", function (assert) {
+    var a = { foo: "bar" }
+    var b = null
+    var c = void 0
+
+    assert.deepEqual(extend(b, a, c), { foo: "bar" })
+    assert.end()
+})
+
+test("mutable", function (assert) {
+    var a = { foo: "bar" }
+
+    mutableExtend(a, { bar: "baz" })
+
+    assert.equal(a.bar, "baz")
+    assert.end()
+})
+
+test("null prototype", function(assert) {
+    var a = { a: "foo" }
+    var b = Object.create(null)
+    b.b = "bar";
+
+    assert.deepEqual(extend(a, b), { a: "foo", b: "bar" })
+    assert.end()
+})
+
+test("null prototype mutable", function (assert) {
+    var a = { foo: "bar" }
+    var b = Object.create(null)
+    b.bar = "baz";
+
+    mutableExtend(a, b)
+
+    assert.equal(a.bar, "baz")
+    assert.end()
+})
+
+test("prototype pollution", function (assert) {
+    var a = {}
+    var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
+
+    assert.strictEqual(a.oops, undefined)
+    extend({}, maliciousPayload)
+    assert.strictEqual(a.oops, undefined)
+    assert.end()
+})
+
+test("prototype pollution mutable", function (assert) {
+    var a = {}
+    var maliciousPayload = '{"__proto__":{"oops":"It works!"}}'
+
+    assert.strictEqual(a.oops, undefined)
+    mutableExtend({}, maliciousPayload)
+    assert.strictEqual(a.oops, undefined)
+    assert.end()
+})
Index: TruckSimulator-main/package-lock.json
===================================================================
--- TruckSimulator-main/package-lock.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/package-lock.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,158 @@
+{
+  "name": "TruckSimulator-main",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "pg": "^8.16.3"
+      }
+    },
+    "node_modules/pg": {
+      "version": "8.16.3",
+      "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz",
+      "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-connection-string": "^2.9.1",
+        "pg-pool": "^3.10.1",
+        "pg-protocol": "^1.10.3",
+        "pg-types": "2.2.0",
+        "pgpass": "1.0.5"
+      },
+      "engines": {
+        "node": ">= 16.0.0"
+      },
+      "optionalDependencies": {
+        "pg-cloudflare": "^1.2.7"
+      },
+      "peerDependencies": {
+        "pg-native": ">=3.0.1"
+      },
+      "peerDependenciesMeta": {
+        "pg-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pg-cloudflare": {
+      "version": "1.2.7",
+      "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz",
+      "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==",
+      "license": "MIT",
+      "optional": true
+    },
+    "node_modules/pg-connection-string": {
+      "version": "2.9.1",
+      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz",
+      "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==",
+      "license": "MIT"
+    },
+    "node_modules/pg-int8": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "license": "ISC",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/pg-pool": {
+      "version": "3.10.1",
+      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz",
+      "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==",
+      "license": "MIT",
+      "peerDependencies": {
+        "pg": ">=8.0"
+      }
+    },
+    "node_modules/pg-protocol": {
+      "version": "1.10.3",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz",
+      "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==",
+      "license": "MIT"
+    },
+    "node_modules/pg-types": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+      "license": "MIT",
+      "dependencies": {
+        "pg-int8": "1.0.1",
+        "postgres-array": "~2.0.0",
+        "postgres-bytea": "~1.0.0",
+        "postgres-date": "~1.0.4",
+        "postgres-interval": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pgpass": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+      "license": "MIT",
+      "dependencies": {
+        "split2": "^4.1.0"
+      }
+    },
+    "node_modules/postgres-array": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postgres-bytea": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-date": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-interval": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+      "license": "MIT",
+      "dependencies": {
+        "xtend": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "license": "ISC",
+      "engines": {
+        "node": ">= 10.x"
+      }
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "license": "MIT",
+      "engines": {
+        "node": ">=0.4"
+      }
+    }
+  }
+}
Index: TruckSimulator-main/package.json
===================================================================
--- TruckSimulator-main/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
+++ TruckSimulator-main/package.json	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "pg": "^8.16.3"
+  }
+}
Index: TruckSimulator-main/sql data base/TruckSimulator.sql
===================================================================
--- TruckSimulator-main/sql data base/TruckSimulator.sql	(revision 9fff28e6e1ca79a7a7056d91738df1d9072d8019)
+++ TruckSimulator-main/sql data base/TruckSimulator.sql	(revision a8a2745f6a6abd1c91c0eba41b5542108751668f)
@@ -1,467 +1,222 @@
--- MySQL dump 10.13  Distrib 8.0.42, for Win64 (x86_64)
---
--- Host: localhost    Database: trucksimulator
--- ------------------------------------------------------
--- Server version	8.0.42
-
-/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
-/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
-/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
-/*!50503 SET NAMES utf8 */;
-/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
-/*!40103 SET TIME_ZONE='+00:00' */;
-/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
-/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
-/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
-/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
-
---
--- Temporary view structure for view `aktivniprodukti`
---
-
-DROP TABLE IF EXISTS `aktivniprodukti`;
-/*!50001 DROP VIEW IF EXISTS `aktivniprodukti`*/;
-SET @saved_cs_client     = @@character_set_client;
-/*!50503 SET character_set_client = utf8mb4 */;
-/*!50001 CREATE VIEW `aktivniprodukti` AS SELECT 
- 1 AS `ProductID`,
- 1 AS `Model`,
- 1 AS `Price`,
- 1 AS `LicensePlate`*/;
-SET character_set_client = @saved_cs_client;
-
---
--- Table structure for table `customer`
---
-
-DROP TABLE IF EXISTS `customer`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `customer` (
-  `CustomerID` int NOT NULL,
-  `CustomerName` varchar(100) DEFAULT NULL,
-  `CustomerSurName` varchar(100) DEFAULT NULL,
-  `Email` varchar(100) DEFAULT NULL,
-  `Address` varchar(255) DEFAULT NULL,
-  `CustomerContact` varchar(20) DEFAULT NULL,
-  `Password` varchar(255) NOT NULL,
-  PRIMARY KEY (`CustomerID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `customer`
---
-
-LOCK TABLES `customer` WRITE;
-/*!40000 ALTER TABLE `customer` DISABLE KEYS */;
-INSERT INTO `customer` VALUES (1,'Marko','Markovski','marko@example.com','Street 123, Skopje','070123456','marko123'),(2,'Elena','Stojanova','elena@example.com','Boulevard 45, Bitola','071987654','elena123'),(3,'David','Trajchev','davidtrajchev@gmail.com','UL.ANASTAS MITREV BR.4/1-2','076999813','$2b$10$1zc9OAt9TJLKGx7qQe2p7.8kVFao1dqOiPNacw4eT7EXGVFNQ1AsW'),(4,'David-v2','Trajchev','V2davidtrajchev@gmail.com','UL.ANASTAS MITREV BR.4/1-2','077999813','$2b$10$4IlcLjFqjDtQd0bOMxLP7eyU4hUBlUm.iBp2mOoHtX3KnDKYtXQPe'),(5,'Davidd','Trajchev','ddavidtrajchev@gmail.com','UL.ANASTAS MITREV BR.4/1-2','076999813','$2b$10$Ujq1p39MmCJob/lP7mrW5.Z12rjApH8mKAVBQyYzc0IJMHhoB86GC');
-/*!40000 ALTER TABLE `customer` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `customerfeedback`
---
-
-DROP TABLE IF EXISTS `customerfeedback`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `customerfeedback` (
-  `FeedbackID` int NOT NULL,
-  `CustomerID` int DEFAULT NULL,
-  `ProductID` int DEFAULT NULL,
-  `Rating` int DEFAULT NULL,
-  `Comment` text,
-  `FeedbackDate` date DEFAULT NULL,
-  `TransactionID` int DEFAULT NULL,
-  PRIMARY KEY (`FeedbackID`),
-  KEY `CustomerID` (`CustomerID`),
-  KEY `ProductID` (`ProductID`),
-  KEY `fk_feedback_transaction` (`TransactionID`),
-  CONSTRAINT `customerfeedback_ibfk_1` FOREIGN KEY (`CustomerID`) REFERENCES `customer` (`CustomerID`),
-  CONSTRAINT `customerfeedback_ibfk_2` FOREIGN KEY (`ProductID`) REFERENCES `product` (`ProductID`),
-  CONSTRAINT `fk_feedback_transaction` FOREIGN KEY (`TransactionID`) REFERENCES `procurement` (`TransactionID`),
-  CONSTRAINT `customerfeedback_chk_1` CHECK ((`Rating` between 1 and 5))
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `customerfeedback`
---
-
-LOCK TABLES `customerfeedback` WRITE;
-/*!40000 ALTER TABLE `customerfeedback` DISABLE KEYS */;
-INSERT INTO `customerfeedback` VALUES (1,1,1,5,'Odlichen kamion, mnogu zadovolen!','2025-04-05',1),(2,2,2,4,'Dobar kamion, no malo skapo.','2025-04-15',2),(3,3,1,1,'test 1 feedback','2025-05-22',22),(4,3,1,5,'test 2 feedback','2025-05-22',20),(5,3,1,3,'test 3 feedback','2025-05-22',11),(6,3,2,5,'Test za Procurement','2025-05-26',23),(7,3,2,3,'test test','2025-05-26',24),(8,3,3,5,'ff','2025-05-28',26),(9,3,2,5,'test so wallet ','2025-05-29',28),(10,3,1,1,'dd','2025-05-29',29),(11,3,1,5,'tt','2025-06-01',44),(12,3,2,1,'rtrf','2025-06-01',43),(13,3,4,5,'test v3','2025-06-01',48),(14,3,4,5,'sdsd','2025-06-04',61),(15,3,3,5,'final test','2025-06-08',65),(16,3,7,3,'-','2025-06-08',70);
-/*!40000 ALTER TABLE `customerfeedback` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `employee`
---
-
-DROP TABLE IF EXISTS `employee`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `employee` (
-  `EmployeeID` int NOT NULL,
-  `EmployeeName` varchar(100) DEFAULT NULL,
-  `EmployeeSurName` varchar(100) DEFAULT NULL,
-  `Position` varchar(100) DEFAULT NULL,
-  `Department` varchar(100) DEFAULT NULL,
-  `Email` varchar(100) DEFAULT NULL,
-  `Password` varchar(100) DEFAULT NULL,
-  PRIMARY KEY (`EmployeeID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `employee`
---
-
-LOCK TABLES `employee` WRITE;
-/*!40000 ALTER TABLE `employee` DISABLE KEYS */;
-INSERT INTO `employee` VALUES (1,'Ivan','Petrov','Sales Manager','Sales','ivan@example.com','ivan123'),(2,'Ana','Kostova','Maintenance Specialist','Maintenance','ana@example.com','ana123'),(1000,'Admin','User','Admin','Admin','admin@example.com','admin123'),(1001,'David','Trajchev','Test','Maintenance','david@example.com','david123'),(1002,'Leon','Zlatkovski','Test 2','Sales','leon@example.com','leon123'),(1003,'Test','test','Test 3','Sales','test@example.com','test123'),(1004,'v2 test','v2 test','v2 test','Sales','v2 test@example.com','v2 test123'),(1005,'V2','TEST','V2 tESTER','Maintenance','v2@example.com','v2123');
-/*!40000 ALTER TABLE `employee` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `maintenance`
---
-
-DROP TABLE IF EXISTS `maintenance`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `maintenance` (
-  `MainID` int NOT NULL,
-  `EmployeeID` int DEFAULT NULL,
-  `ProductID` int DEFAULT NULL,
-  `MainDate` date DEFAULT NULL,
-  `Description` text,
-  `Cost` decimal(10,2) DEFAULT NULL,
-  `Status` enum('Pending','Completed') DEFAULT 'Pending',
-  `StartTime` datetime DEFAULT CURRENT_TIMESTAMP,
-  `EndTime` datetime DEFAULT NULL,
-  PRIMARY KEY (`MainID`),
-  KEY `EmployeeID` (`EmployeeID`),
-  KEY `ProductID` (`ProductID`),
-  CONSTRAINT `maintenance_ibfk_1` FOREIGN KEY (`EmployeeID`) REFERENCES `employee` (`EmployeeID`),
-  CONSTRAINT `maintenance_ibfk_2` FOREIGN KEY (`ProductID`) REFERENCES `product` (`ProductID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `maintenance`
---
-
-LOCK TABLES `maintenance` WRITE;
-/*!40000 ALTER TABLE `maintenance` DISABLE KEYS */;
-INSERT INTO `maintenance` VALUES (2,2,2,'2025-05-04','0',0.00,'Completed','2025-06-01 13:27:50',NULL),(3,2,NULL,'2025-05-22','',0.00,'Pending','2025-06-01 13:27:50',NULL),(4,2,NULL,'2025-05-22','',0.00,'Pending','2025-06-01 13:27:50',NULL),(5,2,1,'2025-05-22','test test',100.00,'Completed','2025-06-01 13:27:50',NULL),(6,2,1,'2025-05-22','asasasasasa',0.00,'Completed','2025-06-01 13:27:50',NULL),(7,2,2,'2025-05-22','0',0.00,'Completed','2025-06-01 13:27:50',NULL),(8,2,2,'2025-05-22','test2-0 completed',100.00,'Completed','2025-06-01 13:27:50',NULL),(9,2,3,'2025-05-26','Zavrshen Test',100.00,'Completed','2025-06-01 13:27:50',NULL),(10,2,3,'2025-05-26','ss',1.00,'Completed','2025-06-01 13:27:50',NULL),(11,2,1,'2025-05-26','test 22',100.00,'Completed','2025-06-01 13:27:50',NULL),(12,2,1,'2025-05-27','test v2 works',0.00,'Completed','2025-06-01 13:27:50',NULL),(13,2,1,'2025-05-29','works',0.00,'Completed','2025-06-01 13:27:50',NULL),(14,2,1,'2025-05-29','xx',0.00,'Completed','2025-06-01 13:27:50',NULL),(15,2,1,'2025-06-01','test 3 done',10.00,'Completed','2025-06-01 13:32:02','2025-06-01 13:33:58'),(16,2,2,'2025-06-04','ff',0.00,'Completed','2025-06-04 00:36:29','2025-06-04 00:40:40'),(17,2,6,'2025-06-08','final test done',0.00,'Completed','2025-06-08 13:43:12','2025-06-08 13:43:28'),(18,2,2,'2025-06-08','FF',1.00,'Completed','2025-06-08 20:38:06','2025-06-08 20:38:26');
-/*!40000 ALTER TABLE `maintenance` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `procurement`
---
-
-DROP TABLE IF EXISTS `procurement`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `procurement` (
-  `TransactionID` int NOT NULL,
-  `EmployeeID` int DEFAULT NULL,
-  `CustomerID` int DEFAULT NULL,
-  `ProductID` int DEFAULT NULL,
-  `ProcurementDate` date DEFAULT NULL,
-  `Quantity` int DEFAULT NULL,
-  `Status` enum('Pending','Approved','Rejected') DEFAULT 'Pending',
-  `Notified` tinyint(1) DEFAULT '0',
-  `GroupID` varchar(255) DEFAULT NULL,
-  PRIMARY KEY (`TransactionID`),
-  KEY `EmployeeID` (`EmployeeID`),
-  KEY `CustomerID` (`CustomerID`),
-  KEY `ProductID` (`ProductID`),
-  CONSTRAINT `procurement_ibfk_1` FOREIGN KEY (`EmployeeID`) REFERENCES `employee` (`EmployeeID`),
-  CONSTRAINT `procurement_ibfk_2` FOREIGN KEY (`CustomerID`) REFERENCES `customer` (`CustomerID`),
-  CONSTRAINT `procurement_ibfk_3` FOREIGN KEY (`ProductID`) REFERENCES `product` (`ProductID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `procurement`
---
-
-LOCK TABLES `procurement` WRITE;
-/*!40000 ALTER TABLE `procurement` DISABLE KEYS */;
-INSERT INTO `procurement` VALUES (1,1,1,1,'2025-04-01',1,'Rejected',0,NULL),(2,1,2,2,'2025-04-10',1,'Rejected',0,NULL),(3,1,2,3,'2025-05-04',1,'Rejected',0,NULL),(4,1,3,1,'2025-05-20',1,'Approved',1,NULL),(5,1,3,2,'2025-05-20',1,'Approved',1,NULL),(6,1,3,1,'2025-05-20',1,'Rejected',1,NULL),(7,1,3,1,'2025-05-20',1,'Rejected',1,NULL),(8,1,3,3,'2025-05-20',1,'Rejected',1,NULL),(9,1,3,3,'2025-05-20',1,'Approved',1,NULL),(10,2,3,3,'2025-05-20',1,'Rejected',1,NULL),(11,2,3,1,'2025-05-20',1,'Approved',1,NULL),(12,2,3,2,'2025-05-20',1,'Rejected',1,NULL),(13,2,3,3,'2025-05-20',1,'Approved',1,NULL),(14,2,3,2,'2025-05-20',1,'Approved',1,NULL),(15,2,3,3,'2025-05-20',1,'Approved',1,NULL),(16,2,3,1,'2025-05-20',1,'Approved',1,NULL),(17,2,3,2,'2025-05-20',1,'Approved',1,NULL),(18,2,3,1,'2025-05-20',1,'Approved',1,NULL),(19,2,3,1,'2025-05-20',1,'Rejected',1,NULL),(20,2,3,1,'2025-05-20',1,'Approved',1,NULL),(21,2,3,2,'2025-05-20',1,'Rejected',1,NULL),(22,1,3,1,'2025-05-22',1,'Approved',1,NULL),(23,1,3,2,'2025-05-26',1,'Approved',1,NULL),(24,1,3,2,'2025-05-26',1,'Approved',1,NULL),(25,NULL,3,1,'2025-05-26',1,'Rejected',1,NULL),(26,1,3,3,'2025-05-27',1,'Approved',1,NULL),(27,1,3,4,'2025-05-28',1,'Approved',1,NULL),(28,1,3,2,'2025-05-29',1,'Approved',1,NULL),(29,1,3,1,'2025-05-29',1,'Approved',1,NULL),(30,1,3,5,'2025-05-31',1,'Approved',1,NULL),(31,1,3,3,'2025-05-31',1,'Approved',1,NULL),(32,1,3,2,'2025-05-31',1,'Approved',1,NULL),(33,1,3,1,'2025-05-31',1,'Approved',1,NULL),(34,1,3,2,'2025-05-31',1,'Approved',1,'59fa5a1c-1057-4d73-8c52-0452a016e540'),(35,1,3,2,'2025-05-31',1,'Approved',1,'59fa5a1c-1057-4d73-8c52-0452a016e540'),(36,1,3,2,'2025-05-31',1,'Approved',1,'59fa5a1c-1057-4d73-8c52-0452a016e540'),(37,1,3,4,'2025-05-31',1,'Approved',1,'59fa5a1c-1057-4d73-8c52-0452a016e540'),(38,1,3,5,'2025-05-31',1,'Approved',1,'4eddd7f5-c077-453a-9c92-7319764eb2d9'),(39,1,3,4,'2025-05-31',1,'Approved',1,'3d2fefa9-f9ba-4c15-a33d-8554f554a289'),(40,1,3,4,'2025-05-31',1,'Approved',1,'3d2fefa9-f9ba-4c15-a33d-8554f554a289'),(41,1,3,4,'2025-06-01',1,'Approved',1,'3d2fefa9-f9ba-4c15-a33d-8554f554a289'),(42,1,3,4,'2025-06-01',1,'Approved',1,'3d2fefa9-f9ba-4c15-a33d-8554f554a289'),(43,1,3,2,'2025-06-01',1,'Approved',1,'3d2fefa9-f9ba-4c15-a33d-8554f554a289'),(44,1,3,1,'2025-06-01',1,'Approved',1,'4f4d2173-9167-40f7-bdd3-223316070bd8'),(45,1,3,4,'2025-06-01',1,'Approved',1,'06392197-9788-4af9-b2c5-18482655ef0b'),(46,1,3,2,'2025-06-01',1,'Approved',1,'06392197-9788-4af9-b2c5-18482655ef0b'),(47,1,3,2,'2025-06-01',1,'Approved',1,'09909582-a574-4a4c-9ee7-52e443345ed9'),(48,1,3,4,'2025-06-01',1,'Approved',1,'09909582-a574-4a4c-9ee7-52e443345ed9'),(49,1,3,5,'2025-06-01',1,'Approved',1,'a1e0a1de-14eb-45fa-b58c-682a5ea5f357'),(50,1,3,1,'2025-06-01',1,'Approved',1,'cecc23a9-21a8-4dce-9b90-b3e7980fdecf'),(51,1,3,3,'2025-06-01',1,'Approved',1,'cecc23a9-21a8-4dce-9b90-b3e7980fdecf'),(52,1,3,2,'2025-06-01',1,'Approved',1,'74589bc5-00b8-4914-9bc4-640a6e9653d9'),(53,1,3,4,'2025-06-01',1,'Approved',1,'74589bc5-00b8-4914-9bc4-640a6e9653d9'),(54,1,5,4,'2025-06-03',1,'Approved',1,'38a3bb62-7d7f-413d-81c5-b89e2b44cb22'),(55,1,3,1,'2025-06-03',1,'Approved',1,'f4b1417e-8695-469a-a36f-a0819ed61ac3'),(56,1,3,2,'2025-06-03',1,'Approved',1,'54fecf01-70e3-4e48-b2aa-0dad10ea2138'),(57,1,3,2,'2025-06-03',1,'Approved',1,'27e5fd60-78b0-4ba2-aca5-9bd6243e7940'),(58,1,3,4,'2025-06-03',1,'Approved',1,'b0d94491-5ef1-458b-b55e-6e291702fb16'),(59,1,3,2,'2025-06-03',1,'Approved',1,'2963e415-3cd8-4ce1-8ac4-f6b400646447'),(60,1,3,3,'2025-06-04',1,'Approved',1,'f8e05dc9-cb2d-4c1a-bac4-c6eaf0ad03b8'),(61,1,3,4,'2025-06-04',1,'Approved',1,'f8e05dc9-cb2d-4c1a-bac4-c6eaf0ad03b8'),(62,1,3,2,'2025-06-04',1,'Approved',1,'26c2e101-ea4c-42c0-b1f4-0b70e4370c22'),(63,1,3,4,'2025-06-04',1,'Approved',1,'26c2e101-ea4c-42c0-b1f4-0b70e4370c22'),(64,1,3,8,'2025-06-04',1,'Approved',1,'52485536-17f9-42f5-8706-e2a6f14dc86b'),(65,1,3,3,'2025-06-08',1,'Approved',1,'6dac92de-4b41-4161-b983-d8ca4949d33a'),(66,1,3,9,'2025-06-08',1,'Approved',1,'6dac92de-4b41-4161-b983-d8ca4949d33a'),(67,1,3,6,'2025-06-08',1,'Approved',1,'4092b7e8-c3e0-4a68-a8b7-19761f532763'),(68,1,3,13,'2025-06-08',1,'Approved',1,'2b55f879-8240-42f0-9bcf-e4c8b8edd9c3'),(69,1,3,13,'2025-06-08',1,'Approved',1,'9bcb6489-69f5-4607-b152-e3b78ef98f85'),(70,1,3,7,'2025-06-08',1,'Approved',1,'04456eef-b97e-4269-a235-15a03248449e');
-/*!40000 ALTER TABLE `procurement` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `procurement_request`
---
-
-DROP TABLE IF EXISTS `procurement_request`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `procurement_request` (
-  `RequestID` int NOT NULL AUTO_INCREMENT,
-  `CustomerID` int NOT NULL,
-  `ProductID` int NOT NULL,
-  `Quantity` int DEFAULT '1',
-  `RequestedAt` datetime DEFAULT CURRENT_TIMESTAMP,
-  `Status` enum('Pending','Approved','Rejected') DEFAULT 'Pending',
-  `PaymentMethod` varchar(20) DEFAULT NULL,
-  `PaymentStatus` enum('Reserved','Charged','Refunded') DEFAULT 'Reserved',
-  `MonthlyPay` decimal(10,2) DEFAULT NULL,
-  `TotalPrice` decimal(10,2) DEFAULT NULL,
-  `Duration` int DEFAULT NULL,
-  `CardID` int DEFAULT NULL,
-  `TransactionType` enum('Buy','Rent') DEFAULT 'Buy',
-  `GroupID` varchar(36) DEFAULT NULL,
-  PRIMARY KEY (`RequestID`),
-  KEY `CustomerID` (`CustomerID`),
-  KEY `ProductID` (`ProductID`),
-  CONSTRAINT `procurement_request_ibfk_1` FOREIGN KEY (`CustomerID`) REFERENCES `customer` (`CustomerID`),
-  CONSTRAINT `procurement_request_ibfk_2` FOREIGN KEY (`ProductID`) REFERENCES `product` (`ProductID`)
-) ENGINE=InnoDB AUTO_INCREMENT=109 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `procurement_request`
---
-
-LOCK TABLES `procurement_request` WRITE;
-/*!40000 ALTER TABLE `procurement_request` DISABLE KEYS */;
-INSERT INTO `procurement_request` VALUES (1,3,2,1,'2025-05-28 18:48:35','Rejected',NULL,'Reserved',95000.00,2280000.00,24,NULL,'Buy',NULL),(2,3,2,1,'2025-05-28 19:30:58','Rejected',NULL,'Reserved',95000.00,2280000.00,24,NULL,'Buy',NULL),(3,3,2,1,'2025-05-28 19:43:39','Rejected',NULL,'Reserved',95000.00,2280000.00,24,NULL,'Buy',NULL),(4,3,2,1,'2025-05-28 19:49:48','Rejected',NULL,'Reserved',NULL,95000.00,NULL,NULL,'Buy',NULL),(5,3,1,1,'2025-05-28 19:54:24','Rejected',NULL,'Reserved',120000.00,2880000.00,24,NULL,'Buy',NULL),(6,3,2,1,'2025-05-28 19:54:53','Rejected',NULL,'Reserved',95000.00,2280000.00,24,NULL,'Buy',NULL),(7,3,2,1,'2025-05-28 19:56:40','Rejected',NULL,'Reserved',100.00,2400.00,24,NULL,'Buy',NULL),(38,3,2,1,'2025-05-29 00:59:48','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy',NULL),(39,3,1,1,'2025-05-29 03:25:03','Rejected','Card','Reserved',2.81,36.53,13,5,'Rent',NULL),(40,3,1,1,'2025-05-29 23:35:28','Approved','Card','Reserved',NULL,101.00,NULL,5,'Buy',NULL),(41,3,1,1,'2025-05-30 00:10:51','Rejected','Card','Reserved',2.81,64.63,23,5,'Rent',NULL),(47,3,1,1,'2025-05-31 18:43:41','Rejected','Card','Reserved',NULL,3500.00,NULL,5,'Buy',NULL),(48,3,5,1,'2025-05-31 18:43:41','Approved','Card','Reserved',NULL,3300.00,NULL,5,'Buy',NULL),(49,3,1,1,'2025-05-31 18:57:00','Approved','Card','Reserved',NULL,3500.00,NULL,5,'Buy',NULL),(50,3,2,1,'2025-05-31 18:57:00','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy',NULL),(51,3,3,1,'2025-05-31 18:57:00','Approved','Card','Reserved',NULL,30000.00,NULL,5,'Buy',NULL),(52,3,4,1,'2025-05-31 19:07:38','Rejected','Card','Reserved',NULL,100.00,NULL,5,'Buy',NULL),(53,3,5,1,'2025-05-31 19:07:38','Rejected','Card','Reserved',NULL,3300.00,NULL,5,'Buy',NULL),(54,3,4,1,'2025-05-31 20:21:09','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','a3a71529-9c8d-4a0a-9d5a-aa454801b4ff'),(55,3,5,1,'2025-05-31 20:21:09','Rejected','Card','Refunded',NULL,3300.00,NULL,5,'Buy','a3a71529-9c8d-4a0a-9d5a-aa454801b4ff'),(56,3,4,1,'2025-05-31 20:26:49','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','ec53361e-8cc9-40e7-bb4f-1367573b76f8'),(57,3,5,1,'2025-05-31 20:26:49','Rejected','Card','Refunded',NULL,3300.00,NULL,5,'Buy','ec53361e-8cc9-40e7-bb4f-1367573b76f8'),(58,3,4,1,'2025-05-31 20:32:22','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','ab516bca-b99e-4c3a-8654-2c0116f60ef1'),(59,3,5,1,'2025-05-31 20:32:22','Rejected','Card','Refunded',NULL,3300.00,NULL,5,'Buy','ab516bca-b99e-4c3a-8654-2c0116f60ef1'),(60,3,4,1,'2025-05-31 21:43:51','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','d2f79fc8-dc44-4110-9abc-15a46d792e45'),(61,3,4,1,'2025-05-31 22:08:55','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','e07e9e86-66fd-437a-b2e1-d0fafce7690a'),(62,3,2,1,'2025-05-31 22:15:55','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','59fa5a1c-1057-4d73-8c52-0452a016e540'),(63,3,4,1,'2025-05-31 22:15:55','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','59fa5a1c-1057-4d73-8c52-0452a016e540'),(64,3,5,1,'2025-05-31 22:27:56','Approved','Card','Reserved',91.67,91.67,1,5,'Rent','4eddd7f5-c077-453a-9c92-7319764eb2d9'),(65,3,4,1,'2025-05-31 23:46:50','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','3d2fefa9-f9ba-4c15-a33d-8554f554a289'),(66,3,2,1,'2025-05-31 23:46:50','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','3d2fefa9-f9ba-4c15-a33d-8554f554a289'),(67,3,1,1,'2025-06-01 00:12:25','Approved','Card','Reserved',97.22,3499.92,36,5,'Rent','4f4d2173-9167-40f7-bdd3-223316070bd8'),(68,3,4,1,'2025-06-01 00:19:19','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','06392197-9788-4af9-b2c5-18482655ef0b'),(69,3,2,1,'2025-06-01 00:19:19','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','06392197-9788-4af9-b2c5-18482655ef0b'),(70,3,2,1,'2025-06-01 02:28:44','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','09909582-a574-4a4c-9ee7-52e443345ed9'),(71,3,4,1,'2025-06-01 02:28:44','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','09909582-a574-4a4c-9ee7-52e443345ed9'),(72,3,5,1,'2025-06-01 02:29:14','Approved','Card','Reserved',91.67,2750.10,30,5,'Rent','a1e0a1de-14eb-45fa-b58c-682a5ea5f357'),(73,3,1,1,'2025-06-01 02:40:15','Rejected','Card','Refunded',NULL,3500.00,NULL,5,'Buy','de010939-bd22-4e53-beb4-64a1839d0705'),(74,3,3,1,'2025-06-01 02:40:15','Rejected','Card','Refunded',NULL,30000.00,NULL,5,'Buy','de010939-bd22-4e53-beb4-64a1839d0705'),(75,3,1,1,'2025-06-01 02:52:09','Rejected','Card','Refunded',NULL,3500.00,NULL,5,'Buy','896e19a0-3948-49d3-ad1a-b342a958c298'),(76,3,3,1,'2025-06-01 02:52:09','Rejected','Card','Refunded',NULL,30000.00,NULL,5,'Buy','896e19a0-3948-49d3-ad1a-b342a958c298'),(77,3,1,1,'2025-06-01 02:59:13','Approved','Card','Reserved',NULL,3500.00,NULL,5,'Buy','cecc23a9-21a8-4dce-9b90-b3e7980fdecf'),(78,3,3,1,'2025-06-01 02:59:13','Approved','Card','Reserved',NULL,30000.00,NULL,5,'Buy','cecc23a9-21a8-4dce-9b90-b3e7980fdecf'),(79,3,2,1,'2025-06-01 03:12:18','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','74589bc5-00b8-4914-9bc4-640a6e9653d9'),(80,3,4,1,'2025-06-01 03:12:18','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','74589bc5-00b8-4914-9bc4-640a6e9653d9'),(81,5,2,1,'2025-06-02 11:52:48','Rejected','Card','Refunded',NULL,100.00,NULL,9,'Buy','a9420694-235d-4f22-b622-1a77e03f737e'),(82,5,4,1,'2025-06-02 11:52:48','Rejected','Card','Refunded',NULL,100.00,NULL,9,'Buy','a9420694-235d-4f22-b622-1a77e03f737e'),(83,3,1,1,'2025-06-02 12:31:02','Rejected','Card','Refunded',NULL,3500.00,NULL,5,'Buy','197813dc-a87f-49a4-8b8b-7ecc92b3619d'),(84,3,2,1,'2025-06-02 12:31:02','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','197813dc-a87f-49a4-8b8b-7ecc92b3619d'),(85,3,4,1,'2025-06-03 19:51:32','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','74f61e0d-69bf-42e2-8558-2d2167822b59'),(86,5,4,1,'2025-06-03 19:53:55','Approved','Card','Reserved',NULL,100.00,NULL,9,'Buy','38a3bb62-7d7f-413d-81c5-b89e2b44cb22'),(87,3,2,1,'2025-06-03 20:59:36','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','5ce75e52-6001-4688-b4b1-79fe0e720506'),(88,3,1,1,'2025-06-03 21:00:11','Approved','Card','Reserved',NULL,3500.00,NULL,5,'Buy','f4b1417e-8695-469a-a36f-a0819ed61ac3'),(89,3,2,1,'2025-06-03 21:17:28','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','54fecf01-70e3-4e48-b2aa-0dad10ea2138'),(90,3,2,1,'2025-06-03 21:33:19','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','27e5fd60-78b0-4ba2-aca5-9bd6243e7940'),(91,3,4,1,'2025-06-03 21:42:16','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','b0d94491-5ef1-458b-b55e-6e291702fb16'),(92,3,2,1,'2025-06-03 21:44:21','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','2963e415-3cd8-4ce1-8ac4-f6b400646447'),(93,3,3,1,'2025-06-04 00:34:15','Approved','Card','Reserved',NULL,300.00,NULL,5,'Buy','f8e05dc9-cb2d-4c1a-bac4-c6eaf0ad03b8'),(94,3,4,1,'2025-06-04 00:34:15','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','f8e05dc9-cb2d-4c1a-bac4-c6eaf0ad03b8'),(95,3,2,1,'2025-06-04 13:10:35','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','26c2e101-ea4c-42c0-b1f4-0b70e4370c22'),(96,3,4,1,'2025-06-04 13:10:35','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','26c2e101-ea4c-42c0-b1f4-0b70e4370c22'),(97,3,8,1,'2025-06-04 13:50:20','Approved','Card','Reserved',NULL,300.00,NULL,5,'Buy','52485536-17f9-42f5-8706-e2a6f14dc86b'),(98,3,3,1,'2025-06-08 13:42:07','Approved','Card','Reserved',NULL,300.00,NULL,5,'Buy','6dac92de-4b41-4161-b983-d8ca4949d33a'),(99,3,9,1,'2025-06-08 13:42:07','Approved','Card','Reserved',NULL,300.00,NULL,5,'Buy','6dac92de-4b41-4161-b983-d8ca4949d33a'),(100,3,6,1,'2025-06-08 15:01:18','Approved','Card','Reserved',NULL,3500.00,NULL,5,'Buy','4092b7e8-c3e0-4a68-a8b7-19761f532763'),(101,3,13,1,'2025-06-08 18:24:02','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','2b55f879-8240-42f0-9bcf-e4c8b8edd9c3'),(102,3,13,1,'2025-06-08 18:29:02','Approved','Card','Reserved',NULL,100.00,NULL,5,'Buy','9bcb6489-69f5-4607-b152-e3b78ef98f85'),(103,3,12,1,'2025-06-08 18:34:25','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','aebc6836-90cb-491e-8b27-92a92b93fc62'),(104,3,11,1,'2025-06-08 18:34:25','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','aebc6836-90cb-491e-8b27-92a92b93fc62'),(105,3,11,1,'2025-06-08 18:56:31','Rejected','Card','Refunded',NULL,100.00,NULL,5,'Buy','8b6d340b-f2cd-451f-97e6-fd802ead53ba'),(106,5,10,1,'2025-06-08 18:57:55','Rejected','Card','Refunded',NULL,100.00,NULL,9,'Buy','eb151b4f-ca2c-405f-8bd9-fc2267468c63'),(107,3,7,1,'2025-06-08 20:06:48','Rejected','Card','Refunded',97.22,97.22,1,5,'Rent','ce325e94-9a32-421e-91b9-11f94e084231'),(108,3,7,1,'2025-06-08 20:11:06','Approved','Card','Reserved',97.22,97.22,1,5,'Rent','04456eef-b97e-4269-a235-15a03248449e');
-/*!40000 ALTER TABLE `procurement_request` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `product`
---
-
-DROP TABLE IF EXISTS `product`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `product` (
-  `ProductID` int NOT NULL,
-  `Model` varchar(100) DEFAULT NULL,
-  `Price` decimal(10,2) DEFAULT NULL,
-  `LicensePlate` varchar(50) DEFAULT NULL,
-  `Status` enum('available','sold','rented','maintenance') NOT NULL,
-  PRIMARY KEY (`ProductID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `product`
---
-
-LOCK TABLES `product` WRITE;
-/*!40000 ALTER TABLE `product` DISABLE KEYS */;
-INSERT INTO `product` VALUES (1,'Volvo FH16',3500.00,'SK-1234-AB','sold'),(2,'Scania R500',100.00,'BT-5678-CD','available'),(3,'Kögel Trailer',300.00,'SK-2468-EF','available'),(4,'DAF(808)',100.00,'SK-1111-LL','available'),(5,'Test V2',3300.00,'SK-1111-TT','available'),(6,'Volvo FH16',3500.00,'SK-1235-AB','sold'),(7,'Volvo FH16',3500.00,'SK-1236-AB','available'),(8,'Kögel Trailer',300.00,'SK-2469-EF','available'),(9,'Kögel Trailer',300.00,'SK-2470-EF','available'),(10,'DAF(808)',100.00,'SK-1112-LL','available'),(11,'DAF(808)',100.00,'SK-1113-LL','available'),(12,'Scania R500',100.00,'BT-5679-CD','available'),(13,'Scania R500',100.00,'BT-5680-CD','available');
-/*!40000 ALTER TABLE `product` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `t_type`
---
-
-DROP TABLE IF EXISTS `t_type`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `t_type` (
-  `TransactionID` int NOT NULL,
-  `Type` enum('Rent','Buy') NOT NULL,
-  `Duration` int DEFAULT NULL,
-  `MonthlyPay` decimal(10,2) DEFAULT NULL,
-  `TotalPrice` decimal(10,2) DEFAULT NULL,
-  PRIMARY KEY (`TransactionID`),
-  CONSTRAINT `t_type_ibfk_1` FOREIGN KEY (`TransactionID`) REFERENCES `procurement` (`TransactionID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `t_type`
---
-
-LOCK TABLES `t_type` WRITE;
-/*!40000 ALTER TABLE `t_type` DISABLE KEYS */;
-INSERT INTO `t_type` VALUES (3,'Buy',NULL,NULL,30000.00),(11,'Buy',NULL,NULL,120000.00),(12,'Rent',24,3958.33,95000.00),(13,'Rent',2,15000.00,30000.00),(14,'Rent',2,2638.89,5277.78),(15,'Buy',NULL,NULL,30000.00),(16,'Rent',36,3333.33,119999.88),(17,'Buy',NULL,NULL,95000.00),(18,'Buy',NULL,NULL,120000.00),(19,'Rent',2,3333.33,6666.66),(20,'Rent',20,3333.33,66666.60),(21,'Buy',NULL,NULL,95000.00),(22,'Buy',NULL,NULL,120000.00),(23,'Rent',1,2638.89,2638.89),(24,'Buy',NULL,NULL,95000.00),(25,'Buy',NULL,NULL,120000.00),(26,'Buy',NULL,NULL,30000.00),(27,'Rent',2,2.78,5.56),(28,'Buy',NULL,NULL,100.00),(29,'Buy',NULL,NULL,101.00),(30,'Buy',NULL,NULL,3300.00),(31,'Buy',NULL,NULL,30000.00),(32,'Buy',NULL,NULL,100.00),(33,'Buy',NULL,NULL,3500.00),(40,'Buy',NULL,NULL,100.00),(41,'Buy',NULL,NULL,100.00),(42,'Buy',NULL,NULL,100.00),(43,'Buy',NULL,NULL,100.00),(44,'Rent',36,97.22,3499.92),(45,'Buy',NULL,NULL,100.00),(46,'Buy',NULL,NULL,100.00),(47,'Buy',NULL,NULL,100.00),(48,'Buy',NULL,NULL,100.00),(49,'Rent',30,91.67,2750.10),(50,'Buy',NULL,NULL,3500.00),(51,'Buy',NULL,NULL,30000.00),(52,'Buy',NULL,NULL,100.00),(53,'Buy',NULL,NULL,100.00),(54,'Buy',NULL,NULL,100.00),(55,'Buy',NULL,NULL,3500.00),(56,'Buy',NULL,NULL,100.00),(57,'Buy',NULL,NULL,100.00),(58,'Buy',NULL,NULL,100.00),(59,'Buy',NULL,NULL,100.00),(60,'Buy',NULL,NULL,300.00),(61,'Buy',NULL,NULL,100.00),(62,'Buy',NULL,NULL,100.00),(63,'Buy',NULL,NULL,100.00),(64,'Buy',NULL,NULL,300.00),(65,'Buy',NULL,NULL,300.00),(66,'Buy',NULL,NULL,300.00),(67,'Buy',NULL,NULL,3500.00),(68,'Buy',NULL,NULL,100.00),(69,'Buy',NULL,NULL,100.00),(70,'Rent',1,97.22,97.22);
-/*!40000 ALTER TABLE `t_type` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `trailer`
---
-
-DROP TABLE IF EXISTS `trailer`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `trailer` (
-  `ProductID` int NOT NULL,
-  `Capacity` decimal(10,2) DEFAULT NULL,
-  PRIMARY KEY (`ProductID`),
-  CONSTRAINT `trailer_ibfk_1` FOREIGN KEY (`ProductID`) REFERENCES `product` (`ProductID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `trailer`
---
-
-LOCK TABLES `trailer` WRITE;
-/*!40000 ALTER TABLE `trailer` DISABLE KEYS */;
-INSERT INTO `trailer` VALUES (3,20.50),(5,99.00),(8,20.50),(9,20.50);
-/*!40000 ALTER TABLE `trailer` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Temporary view structure for view `transakciisodetali`
---
-
-DROP TABLE IF EXISTS `transakciisodetali`;
-/*!50001 DROP VIEW IF EXISTS `transakciisodetali`*/;
-SET @saved_cs_client     = @@character_set_client;
-/*!50503 SET character_set_client = utf8mb4 */;
-/*!50001 CREATE VIEW `transakciisodetali` AS SELECT 
- 1 AS `TransactionID`,
- 1 AS `CustomerName`,
- 1 AS `CustomerSurName`,
- 1 AS `Model`,
- 1 AS `Type`,
- 1 AS `Duration`,
- 1 AS `MonthlyPay`,
- 1 AS `TotalPrice`,
- 1 AS `ProcurementDate`*/;
-SET character_set_client = @saved_cs_client;
-
---
--- Table structure for table `truck`
---
-
-DROP TABLE IF EXISTS `truck`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `truck` (
-  `ProductID` int NOT NULL,
-  `HP` int DEFAULT NULL,
-  PRIMARY KEY (`ProductID`),
-  CONSTRAINT `truck_ibfk_1` FOREIGN KEY (`ProductID`) REFERENCES `product` (`ProductID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `truck`
---
-
-LOCK TABLES `truck` WRITE;
-/*!40000 ALTER TABLE `truck` DISABLE KEYS */;
-INSERT INTO `truck` VALUES (1,750),(2,500),(4,999),(6,750),(7,750),(10,999),(11,999),(12,500),(13,500);
-/*!40000 ALTER TABLE `truck` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `views`
---
-
-DROP TABLE IF EXISTS `views`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `views` (
-  `CustomerID` int NOT NULL,
-  `ProductID` int NOT NULL,
-  PRIMARY KEY (`CustomerID`,`ProductID`),
-  KEY `ProductID` (`ProductID`),
-  CONSTRAINT `views_ibfk_1` FOREIGN KEY (`CustomerID`) REFERENCES `customer` (`CustomerID`),
-  CONSTRAINT `views_ibfk_2` FOREIGN KEY (`ProductID`) REFERENCES `product` (`ProductID`)
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `views`
---
-
-LOCK TABLES `views` WRITE;
-/*!40000 ALTER TABLE `views` DISABLE KEYS */;
-INSERT INTO `views` VALUES (1,1),(2,2),(1,3);
-/*!40000 ALTER TABLE `views` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Table structure for table `wallet`
---
-
-DROP TABLE IF EXISTS `wallet`;
-/*!40101 SET @saved_cs_client     = @@character_set_client */;
-/*!50503 SET character_set_client = utf8mb4 */;
-CREATE TABLE `wallet` (
-  `WalletID` int NOT NULL AUTO_INCREMENT,
-  `CustomerID` int NOT NULL,
-  `Balance` decimal(10,2) NOT NULL DEFAULT '0.00',
-  `CardNumber` varchar(16) DEFAULT NULL,
-  `ExpiryDate` date DEFAULT NULL,
-  `CVV` varchar(4) DEFAULT NULL,
-  `CardHolderName` varchar(100) DEFAULT NULL,
-  PRIMARY KEY (`WalletID`),
-  KEY `CustomerID` (`CustomerID`),
-  CONSTRAINT `wallet_ibfk_1` FOREIGN KEY (`CustomerID`) REFERENCES `customer` (`CustomerID`)
-) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
-/*!40101 SET character_set_client = @saved_cs_client */;
-
---
--- Dumping data for table `wallet`
---
-
-LOCK TABLES `wallet` WRITE;
-/*!40000 ALTER TABLE `wallet` DISABLE KEYS */;
-INSERT INTO `wallet` VALUES (5,3,27006257.09,'4444444444444444','2027-12-31','123','David Trajchev'),(6,4,3000.00,'5500000000000004','2028-11-30','456','David-v2 Trajchev'),(7,2,3000.00,'5500000000000000','2026-11-30','456','Elena Stojanova'),(8,2,3000.00,'5500000000000001','2026-11-30','456','David Trajchev'),(9,5,2705.56,'5500000000000001','2026-11-30','456','David Trajchev');
-/*!40000 ALTER TABLE `wallet` ENABLE KEYS */;
-UNLOCK TABLES;
-
---
--- Final view structure for view `aktivniprodukti`
---
-
-/*!50001 DROP VIEW IF EXISTS `aktivniprodukti`*/;
-/*!50001 SET @saved_cs_client          = @@character_set_client */;
-/*!50001 SET @saved_cs_results         = @@character_set_results */;
-/*!50001 SET @saved_col_connection     = @@collation_connection */;
-/*!50001 SET character_set_client      = utf8mb4 */;
-/*!50001 SET character_set_results     = utf8mb4 */;
-/*!50001 SET collation_connection      = utf8mb4_0900_ai_ci */;
-/*!50001 CREATE ALGORITHM=UNDEFINED */
-/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `aktivniprodukti` AS select `product`.`ProductID` AS `ProductID`,`product`.`Model` AS `Model`,`product`.`Price` AS `Price`,`product`.`LicensePlate` AS `LicensePlate` from `product` where (`product`.`Status` = 'available') */;
-/*!50001 SET character_set_client      = @saved_cs_client */;
-/*!50001 SET character_set_results     = @saved_cs_results */;
-/*!50001 SET collation_connection      = @saved_col_connection */;
-
---
--- Final view structure for view `transakciisodetali`
---
-
-/*!50001 DROP VIEW IF EXISTS `transakciisodetali`*/;
-/*!50001 SET @saved_cs_client          = @@character_set_client */;
-/*!50001 SET @saved_cs_results         = @@character_set_results */;
-/*!50001 SET @saved_col_connection     = @@collation_connection */;
-/*!50001 SET character_set_client      = utf8mb4 */;
-/*!50001 SET character_set_results     = utf8mb4 */;
-/*!50001 SET collation_connection      = utf8mb4_0900_ai_ci */;
-/*!50001 CREATE ALGORITHM=UNDEFINED */
-/*!50013 DEFINER=`root`@`localhost` SQL SECURITY DEFINER */
-/*!50001 VIEW `transakciisodetali` AS select `p`.`TransactionID` AS `TransactionID`,`c`.`CustomerName` AS `CustomerName`,`c`.`CustomerSurName` AS `CustomerSurName`,`pr`.`Model` AS `Model`,`t`.`Type` AS `Type`,`t`.`Duration` AS `Duration`,`t`.`MonthlyPay` AS `MonthlyPay`,`t`.`TotalPrice` AS `TotalPrice`,`p`.`ProcurementDate` AS `ProcurementDate` from (((`procurement` `p` join `customer` `c` on((`p`.`CustomerID` = `c`.`CustomerID`))) join `product` `pr` on((`p`.`ProductID` = `pr`.`ProductID`))) join `t_type` `t` on((`p`.`TransactionID` = `t`.`TransactionID`))) */;
-/*!50001 SET character_set_client      = @saved_cs_client */;
-/*!50001 SET character_set_results     = @saved_cs_results */;
-/*!50001 SET collation_connection      = @saved_col_connection */;
-/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
-
-/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
-/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
-/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
-/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
-/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
-/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-
--- Dump completed on 2025-06-08 20:47:29
+-- Drop tables if they exist, cascade to drop dependent objects (views, constraints)
+DROP TABLE IF EXISTS aktivniprodukti CASCADE;
+
+DROP TABLE IF EXISTS customer CASCADE;
+
+DROP TABLE IF EXISTS customerfeedback CASCADE;
+
+DROP TABLE IF EXISTS employee CASCADE;
+
+DROP TABLE IF EXISTS maintenance CASCADE;
+
+DROP TABLE IF EXISTS procurement CASCADE;
+
+
+-- Create tables
+
+CREATE TABLE customer (
+  CustomerID integer PRIMARY KEY,
+  CustomerName varchar(100),
+  CustomerSurName varchar(100),
+  Email varchar(100),
+  Address varchar(255),
+  CustomerContact varchar(20),
+  Password varchar(255) NOT NULL
+);
+
+CREATE TABLE employee (
+  EmployeeID integer PRIMARY KEY,
+  EmployeeName varchar(100),
+  EmployeeSurName varchar(100),
+  Position varchar(100),
+  Department varchar(100),
+  Email varchar(100),
+  Password varchar(100)
+);
+
+-- Enum replacement for maintenance.Status column as CHECK constraint:
+CREATE TABLE maintenance (
+  MainID integer PRIMARY KEY,
+  EmployeeID integer,
+  ProductID integer,
+  MainDate date,
+  Description text,
+  Cost numeric(10,2),
+  Status varchar(10) DEFAULT 'Pending',
+  StartTime timestamp DEFAULT CURRENT_TIMESTAMP,
+  EndTime timestamp,
+  CONSTRAINT maintenance_status_check CHECK (Status IN ('Pending', 'Completed')),
+  CONSTRAINT maintenance_employee_fk FOREIGN KEY (EmployeeID) REFERENCES employee(EmployeeID),
+  CONSTRAINT maintenance_product_fk FOREIGN KEY (ProductID) REFERENCES product(ProductID) -- Note: product table not provided here
+);
+
+CREATE TABLE procurement (
+  TransactionID integer PRIMARY KEY,
+  EmployeeID integer,
+  CustomerID integer,
+  ProductID integer,
+  ProcurementDate date,
+  Quantity integer,
+  Status varchar(10) DEFAULT 'Pending',
+  Notified boolean DEFAULT FALSE,
+  GroupID varchar(255),
+  CONSTRAINT procurement_employee_fk FOREIGN KEY (EmployeeID) REFERENCES employee(EmployeeID),
+  CONSTRAINT procurement_customer_fk FOREIGN KEY (CustomerID) REFERENCES customer(CustomerID),
+  CONSTRAINT procurement_product_fk FOREIGN KEY (ProductID) REFERENCES product(ProductID) -- product table not provided here
+);
+
+CREATE TABLE customerfeedback (
+  FeedbackID integer PRIMARY KEY,
+  CustomerID integer,
+  ProductID integer,
+  Rating integer,
+  Comment text,
+  FeedbackDate date,
+  TransactionID integer,
+  CONSTRAINT feedback_rating_check CHECK (Rating BETWEEN 1 AND 5),
+  CONSTRAINT feedback_customer_fk FOREIGN KEY (CustomerID) REFERENCES customer(CustomerID),
+  CONSTRAINT feedback_product_fk FOREIGN KEY (ProductID) REFERENCES product(ProductID),
+  CONSTRAINT feedback_transaction_fk FOREIGN KEY (TransactionID) REFERENCES procurement(TransactionID)
+);
+
+-- Insert sample data for customer table
+INSERT INTO customer (CustomerID, CustomerName, CustomerSurName, Email, Address, CustomerContact, Password) VALUES
+(1,'Marko','Markovski','marko@example.com','Street 123, Skopje','070123456','marko123'),
+(2,'Elena','Stojanova','elena@example.com','Boulevard 45, Bitola','071987654','elena123'),
+(3,'David','Trajchev','davidtrajchev@gmail.com','UL.ANASTAS MITREV BR.4/1-2','076999813','$2b$10$1zc9OAt9TJLKGx7qQe2p7.8kVFao1dqOiPNacw4eT7EXGVFNQ1AsW'),
+(4,'David-v2','Trajchev','V2davidtrajchev@gmail.com','UL.ANASTAS MITREV BR.4/1-2','077999813','$2b$10$4IlcLjFqjDtQd0bOMxLP7eyU4hUBlUm.iBp2mOoHtX3KnDKYtXQPe'),
+(5,'Davidd','Trajchev','ddavidtrajchev@gmail.com','UL.ANASTAS MITREV BR.4/1-2','076999813','$2b$10$Ujq1p39MmCJob/lP7mrW5.Z12rjApH8mKAVBQyYzc0IJMHhoB86GC');
+
+-- Insert sample data for employee
+INSERT INTO employee (EmployeeID, EmployeeName, EmployeeSurName, Position, Department, Email, Password) VALUES
+(1,'Ivan','Petrov','Sales Manager','Sales','ivan@example.com','ivan123'),
+(2,'Ana','Kostova','Maintenance Specialist','Maintenance','ana@example.com','ana123'),
+(1000,'Admin','User','Admin','Admin','admin@example.com','admin123'),
+(1001,'David','Trajchev','Test','Maintenance','david@example.com','david123'),
+(1002,'Leon','Zlatkovski','Test 2','Sales','leon@example.com','leon123'),
+(1003,'Test','test','Test 3','Sales','test@example.com','test123'),
+(1004,'v2 test','v2 test','v2 test','Sales','v2 test@example.com','v2 test123'),
+(1005,'V2','TEST','V2 tESTER','Maintenance','v2@example.com','v2123');
+
+-- Insert sample data and other tables data can be converted similarly.
+
+
+
+-- Drop tables if exist with cascade to remove dependencies
+DROP TABLE IF EXISTS procurement_request CASCADE;
+DROP TABLE IF EXISTS product CASCADE;
+DROP TABLE IF EXISTS t_type CASCADE;
+DROP TABLE IF EXISTS trailer CASCADE;
+DROP TABLE IF EXISTS transakciisodetali CASCADE;
+DROP TABLE IF EXISTS truck CASCADE;
+DROP TABLE IF EXISTS views CASCADE;
+DROP TABLE IF EXISTS wallet CASCADE;
+
+-- Create tables with PostgreSQL-compatible syntax
+CREATE TABLE procurement_request (
+  RequestID serial PRIMARY KEY,
+  CustomerID integer NOT NULL,
+  ProductID integer NOT NULL,
+  Quantity integer DEFAULT 1,
+  RequestedAt timestamp DEFAULT CURRENT_TIMESTAMP,
+  Status varchar(10) DEFAULT 'Pending',
+  PaymentMethod varchar(20),
+  PaymentStatus varchar(10) DEFAULT 'Reserved',
+  MonthlyPay numeric(10,2),
+  TotalPrice numeric(10,2),
+  Duration integer,
+  CardID integer,
+  TransactionType varchar(10) DEFAULT 'Buy',
+  GroupID varchar(36),
+  CONSTRAINT procurement_request_customer_fk FOREIGN KEY (CustomerID) REFERENCES customer(CustomerID),
+  CONSTRAINT procurement_request_product_fk FOREIGN KEY (ProductID) REFERENCES product(ProductID),
+  CONSTRAINT procurement_request_status_check CHECK (Status IN ('Pending','Approved','Rejected')),
+  CONSTRAINT procurement_request_paymentstatus_check CHECK (PaymentStatus IN ('Reserved','Charged','Refunded')),
+  CONSTRAINT procurement_request_transactiontype_check CHECK (TransactionType IN ('Buy','Rent'))
+);
+
+CREATE TABLE product (
+  ProductID integer PRIMARY KEY,
+  Model varchar(100),
+  Price numeric(10,2),
+  LicensePlate varchar(50),
+  Status varchar(15) NOT NULL,
+  CONSTRAINT product_status_check CHECK (Status IN ('available','sold','rented','maintenance'))
+);
+
+CREATE TABLE t_type (
+  TransactionID integer PRIMARY KEY,
+  Type varchar(10) NOT NULL,
+  Duration integer,
+  MonthlyPay numeric(10,2),
+  TotalPrice numeric(10,2),
+  CONSTRAINT t_type_type_check CHECK (Type IN ('Rent','Buy')),
+  CONSTRAINT t_type_transaction_fk FOREIGN KEY (TransactionID) REFERENCES procurement(TransactionID)
+);
+
+CREATE TABLE trailer (
+  ProductID integer PRIMARY KEY,
+  Capacity numeric(10,2),
+  CONSTRAINT trailer_product_fk FOREIGN KEY (ProductID) REFERENCES product(ProductID)
+);
+
+-- View 'transakciisodetali' omitted because original incomplete and PostgreSQL views created with CREATE VIEW statement.
+
+CREATE TABLE truck (
+  ProductID integer PRIMARY KEY,
+  HP integer,
+  CONSTRAINT truck_product_fk FOREIGN KEY (ProductID) REFERENCES product(ProductID)
+);
+
+CREATE TABLE views (
+  CustomerID integer NOT NULL,
+  ProductID integer NOT NULL,
+  PRIMARY KEY (CustomerID, ProductID),
+  CONSTRAINT views_customer_fk FOREIGN KEY (CustomerID) REFERENCES customer(CustomerID),
+  CONSTRAINT views_product_fk FOREIGN KEY (ProductID) REFERENCES product(ProductID)
+);
+
+CREATE TABLE wallet (
+  WalletID serial PRIMARY KEY,
+  CustomerID integer NOT NULL,
+  Balance numeric(10,2) NOT NULL DEFAULT 0.00,
+  CardNumber varchar(16),
+  ExpiryDate date,
+  CVV varchar(4),
+  CardHolderName varchar(100),
+  CONSTRAINT wallet_customer_fk FOREIGN KEY (CustomerID) REFERENCES customer(CustomerID)
+);
+
+-- Inserts adapted removing backticks, boolean/enum replaced with text and constraints enforced by checks
+
+-- Example insert for procurement_request (the rest removed for brevity; to fully port them add similarly)
+INSERT INTO procurement_request
+(RequestID, CustomerID, ProductID, Quantity, RequestedAt, Status, PaymentMethod, PaymentStatus, MonthlyPay, TotalPrice, Duration, CardID, TransactionType, GroupID)
+VALUES
+(1,3,2,1,'2025-05-28 18:48:35','Rejected',NULL,'Reserved',95000.00,2280000.00,24,NULL,'Buy',NULL);
+
+-- Example insert for product
+INSERT INTO product VALUES
+(1,'Volvo FH16',3500.00,'SK-1234-AB','sold'),
+(2,'Scania R500',100.00,'BT-5678-CD','available');
+
+-- Example insert for t_type
+INSERT INTO t_type VALUES
+(3,'Buy',NULL,NULL,30000.00);
+
+-- Example insert for trailer
+INSERT INTO trailer VALUES
+(3,20.50);
+
+-- Example insert for truck
+INSERT INTO truck VALUES
+(1,750);
+
+-- Example insert for views
+INSERT INTO views VALUES
+(1,1);
+
+-- Example insert for wallet
+INSERT INTO wallet VALUES
+(5,3,27006257.09,'4444444444444444','2027-12-31','123','David Trajchev');
+
