{"ScriptPreparationCode":"\r\nconst _record = JSON.parse(\u0027{\u0022actionTaken\u0022:null,\u0022ruleId\u0022:\u0022K2OhwBr8uXgoCLSV7qfYIt\u0022,\u0022sessionId\u0022:8367,\u0022segmentLogicalId\u0022:\u0022c4aa605c-b959-4ba3-8834-5627c379252a\u0022,\u0022inputInterface\u0022:\u0022VCF\u0022,\u0022protocol\u0022:1,\u0022sourceIp\u0022:\u0022233.39.61.186\u0022,\u0022sourcePort\u0022:18120,\u0022destIp\u0022:\u0022228.35.238.47\u0022,\u0022destPort\u0022:51975,\u0022destination\u0022:\u0022https://yNw34UIPhSBZ7ilxDmsb21.com\u0022,\u0022domainName\u0022:\u0022yNw34UIPhSBZ7ilxDmsb21.com\u0022,\u0022firewallPolicyName\u0022:\u0022CLOSE_7036\u0022,\u0022segmentName\u0022:\u0022Global\u0022,\u0022application\u0022:\u0022Firefox\u0022,\u0022sessionDurationSecs\u0022:921,\u0022bytesSent\u0022:4128,\u0022bytesReceived\u0022:20606,\u0022closeReason\u0022:\u0022\u0022,\u0022enterpriseLogicalId\u0022:\u00224b534ae2-8f67-4ec8-85a9-768cd4354fcb\u0022,\u0022edgeLogicalId\u0022:\u0022f1db426c-8278-4252-b30a-2d905cfb4918\u0022,\u0022timestamp\u0022:\u00222025-07-15 04:28:58\u0022,\u0022engineTypes\u0022:[3,4],\u0022urlCategories\u0022:[38],\u0022urlCatFilterAction\u0022:\u0022DENY\u0022,\u0022urlRisk\u0022:\u0022MEDIUM\u0022,\u0022urlReputationAction\u0022:\u0022DENY\u0022}\u0027);\r\nconst _schemaFields = JSON.parse(\u0027[\u0022actionTaken\u0022,\u0022ruleId\u0022,\u0022sessionId\u0022,\u0022segmentLogicalId\u0022,\u0022inputInterface\u0022,\u0022protocol\u0022,\u0022sourceIp\u0022,\u0022destIp\u0022,\u0022sourcePort\u0022,\u0022destPort\u0022,\u0022destination\u0022,\u0022domainName\u0022,\u0022firewallPolicyName\u0022,\u0022segmentName\u0022,\u0022extensionHeader\u0022,\u0022application\u0022,\u0022sessionDurationSecs\u0022,\u0022bytesSent\u0022,\u0022bytesReceived\u0022,\u0022closeReason\u0022,\u0022signatureId\u0022,\u0022signatureName\u0022,\u0022signatureCategory\u0022,\u0022signatureSeverity\u0022,\u0022threatImpact\u0022,\u0022threatSourceIp\u0022,\u0022threatSourceGeoCountry\u0022,\u0022threatTargetIp\u0022,\u0022enterpriseLogicalId\u0022,\u0022edgeLogicalId\u0022,\u0022edgeName\u0022,\u0022timestamp\u0022,\u0022idpsAlertType\u0022,\u0022idpsAction\u0022,\u0022urlCategories\u0022,\u0022urlCatFilterAction\u0022,\u0022urlRisk\u0022,\u0022urlReputationAction\u0022,\u0022maliciousIpCategories\u0022,\u0022malIpAction\u0022,\u0022engineType\u0022]\u0027);\r\nconst _schemaFieldMetadata = JSON.parse(\u0060{\u0022actionTaken\u0022:{\u0022name\u0022:\u0022actionTaken\u0022,\u0022type\u0022:\u0022Enum8(\u0027DENY\u0027 = 0, \u0027ALLOW\u0027 = 1, \u0027OPEN\u0027 = 2, \u0027CLOSE\u0027 = 3, \u0027UPDATE\u0027 = 4)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022DENY\u0022:0,\u0022ALLOW\u0022:1,\u0022OPEN\u0022:2,\u0022CLOSE\u0022:3,\u0022UPDATE\u0022:4}},\u0022ruleId\u0022:{\u0022name\u0022:\u0022ruleId\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022sessionId\u0022:{\u0022name\u0022:\u0022sessionId\u0022,\u0022type\u0022:\u0022UInt32\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022segmentLogicalId\u0022:{\u0022name\u0022:\u0022segmentLogicalId\u0022,\u0022type\u0022:\u0022UUID\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022inputInterface\u0022:{\u0022name\u0022:\u0022inputInterface\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022protocol\u0022:{\u0022name\u0022:\u0022protocol\u0022,\u0022type\u0022:\u0022UInt16\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022sourceIp\u0022:{\u0022name\u0022:\u0022sourceIp\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022destIp\u0022:{\u0022name\u0022:\u0022destIp\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022sourcePort\u0022:{\u0022name\u0022:\u0022sourcePort\u0022,\u0022type\u0022:\u0022UInt16\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022destPort\u0022:{\u0022name\u0022:\u0022destPort\u0022,\u0022type\u0022:\u0022UInt16\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022destination\u0022:{\u0022name\u0022:\u0022destination\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022domainName\u0022:{\u0022name\u0022:\u0022domainName\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022firewallPolicyName\u0022:{\u0022name\u0022:\u0022firewallPolicyName\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022segmentName\u0022:{\u0022name\u0022:\u0022segmentName\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022extensionHeader\u0022:{\u0022name\u0022:\u0022extensionHeader\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022application\u0022:{\u0022name\u0022:\u0022application\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022sessionDurationSecs\u0022:{\u0022name\u0022:\u0022sessionDurationSecs\u0022,\u0022type\u0022:\u0022UInt32\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022bytesSent\u0022:{\u0022name\u0022:\u0022bytesSent\u0022,\u0022type\u0022:\u0022UInt32\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022bytesReceived\u0022:{\u0022name\u0022:\u0022bytesReceived\u0022,\u0022type\u0022:\u0022UInt32\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022closeReason\u0022:{\u0022name\u0022:\u0022closeReason\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022signatureId\u0022:{\u0022name\u0022:\u0022signatureId\u0022,\u0022type\u0022:\u0022UInt32\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022signatureName\u0022:{\u0022name\u0022:\u0022signatureName\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022signatureCategory\u0022:{\u0022name\u0022:\u0022signatureCategory\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022signatureSeverity\u0022:{\u0022name\u0022:\u0022signatureSeverity\u0022,\u0022type\u0022:\u0022UInt32\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022threatImpact\u0022:{\u0022name\u0022:\u0022threatImpact\u0022,\u0022type\u0022:\u0022Enum8(\u0027SUSPICIOUS\u0027 = 0, \u0027LOW\u0027 = 1, \u0027MEDIUM\u0027 = 2, \u0027HIGH\u0027 = 3, \u0027CRITICAL\u0027 = 4)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022SUSPICIOUS\u0022:0,\u0022LOW\u0022:1,\u0022MEDIUM\u0022:2,\u0022HIGH\u0022:3,\u0022CRITICAL\u0022:4}},\u0022threatSourceIp\u0022:{\u0022name\u0022:\u0022threatSourceIp\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022threatSourceGeoCountry\u0022:{\u0022name\u0022:\u0022threatSourceGeoCountry\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022threatTargetIp\u0022:{\u0022name\u0022:\u0022threatTargetIp\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022enterpriseLogicalId\u0022:{\u0022name\u0022:\u0022enterpriseLogicalId\u0022,\u0022type\u0022:\u0022UUID\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022edgeLogicalId\u0022:{\u0022name\u0022:\u0022edgeLogicalId\u0022,\u0022type\u0022:\u0022UUID\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022edgeName\u0022:{\u0022name\u0022:\u0022edgeName\u0022,\u0022type\u0022:\u0022String\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022timestamp\u0022:{\u0022name\u0022:\u0022timestamp\u0022,\u0022type\u0022:\u0022DateTime\u0022,\u0022default_type\u0022:\u0022DEFAULT\u0022,\u0022default_expression\u0022:\u0022now()\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022idpsAlertType\u0022:{\u0022name\u0022:\u0022idpsAlertType\u0022,\u0022type\u0022:\u0022Enum8(\u0027IDS\u0027 = 0, \u0027IPS\u0027 = 1)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022IDS\u0022:0,\u0022IPS\u0022:1}},\u0022idpsAction\u0022:{\u0022name\u0022:\u0022idpsAction\u0022,\u0022type\u0022:\u0022Enum8(\u0027ALLOW\u0027 = 0, \u0027MONITOR\u0027 = 1, \u0027DENY\u0027 = 2)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022ALLOW\u0022:0,\u0022MONITOR\u0022:1,\u0022DENY\u0022:2}},\u0022urlCategories\u0022:{\u0022name\u0022:\u0022urlCategories\u0022,\u0022type\u0022:\u0022Array(UInt16)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022urlCatFilterAction\u0022:{\u0022name\u0022:\u0022urlCatFilterAction\u0022,\u0022type\u0022:\u0022Enum8(\u0027ALLOW\u0027 = 0, \u0027MONITOR\u0027 = 1, \u0027DENY\u0027 = 2)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022ALLOW\u0022:0,\u0022MONITOR\u0022:1,\u0022DENY\u0022:2}},\u0022urlRisk\u0022:{\u0022name\u0022:\u0022urlRisk\u0022,\u0022type\u0022:\u0022Enum8(\u0027UNKNOWN\u0027 = 0, \u0027HIGH\u0027 = 1, \u0027SUSPICIOUS\u0027 = 2, \u0027MEDIUM\u0027 = 3, \u0027LOW\u0027 = 4, \u0027TRUSTWORTHY\u0027 = 5)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022UNKNOWN\u0022:0,\u0022HIGH\u0022:1,\u0022SUSPICIOUS\u0022:2,\u0022MEDIUM\u0022:3,\u0022LOW\u0022:4,\u0022TRUSTWORTHY\u0022:5}},\u0022urlReputationAction\u0022:{\u0022name\u0022:\u0022urlReputationAction\u0022,\u0022type\u0022:\u0022Enum8(\u0027ALLOW\u0027 = 0, \u0027MONITOR\u0027 = 1, \u0027DENY\u0027 = 2)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022ALLOW\u0022:0,\u0022MONITOR\u0022:1,\u0022DENY\u0022:2}},\u0022maliciousIpCategories\u0022:{\u0022name\u0022:\u0022maliciousIpCategories\u0022,\u0022type\u0022:\u0022Array(UInt16)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022},\u0022malIpAction\u0022:{\u0022name\u0022:\u0022malIpAction\u0022,\u0022type\u0022:\u0022Enum8(\u0027ALLOW\u0027 = 0, \u0027MONITOR\u0027 = 1, \u0027DENY\u0027 = 2)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022,\u0022enums\u0022:{\u0022ALLOW\u0022:0,\u0022MONITOR\u0022:1,\u0022DENY\u0022:2}},\u0022engineType\u0022:{\u0022name\u0022:\u0022engineType\u0022,\u0022type\u0022:\u0022Array(UInt32)\u0022,\u0022default_type\u0022:\u0022\u0022,\u0022default_expression\u0022:\u0022\u0022,\u0022comment\u0022:\u0022\u0022,\u0022codec_expression\u0022:\u0022\u0022,\u0022ttl_expression\u0022:\u0022\u0022}}\u0060);\r\n\r\nconst records = [];\r\nfor (let i = 0; i \u003C 1000; i\u002B\u002B) {\r\n records.push(_record);\r\n}\r\n\r\nfunction getSchemaFields(statsType) {\r\n return _schemaFields;\r\n}\r\n\r\nfunction getSchemaFieldMetadata(statsType) {\r\n return _schemaFieldMetadata;\r\n}\r\n\r\nfunction hasValue(value) {\r\n if ( (value === null) || (value === undefined) )\r\n return false;\r\n return true;\r\n}\r\n\r\nconst quoteReplaceRegex = /\u0022/g;\r\nfunction quoteField(val) {\r\n if (!_.isNil(val) \u0026\u0026 _.isString(val)) {\r\n return \u0060\u0022${val.replace(quoteReplaceRegex, \u0027\u0022\u0022\u0027)}\u0022\u0060;\r\n } else {\r\n return val;\r\n }\r\n}\r\n\r\nfunction quoteFieldEx(val) {\r\n if (typeof val === \u0022string\u0022) {\r\n return \u0060\u0022${val.replaceAll(\u0027\u0022\u0027, \u0027\u0022\u0022\u0027)}\u0022\u0060;\r\n } else {\r\n return val;\r\n }\r\n}\r\n\r\n\r\n\r\n\r\nfunction serializeCategories (categories) {\r\n if (_.isArray(categories)) {\r\n return \u0060\u0022${categories}\u0022\u0060;\r\n } else {\r\n return categories;\r\n }\r\n}\r\n\r\n\r\nfunction convertMACAddressToInt(macAddress) {\r\n macAddress = (!_.isNil(macAddress) \u0026\u0026 _.isString(macAddress)) ? macAddress.toLowerCase() : \u002700:00:00:00:00:00\u0027;\r\n let pos = 0;\r\n let value = 0;\r\n let octet = \u0027\u0027;\r\n let sep = \u0027:\u0027;\r\n let HEX_RE = /^[a-f0-9]$/;\r\n let chr, tmp;\r\n\r\n function isxdigit(c) {\r\n return HEX_RE.test(c);\r\n }\r\n\r\n function process() {\r\n if (octet.length === 0) {\r\n throw new TypeError(\u0060expected to find a hexadecimal number before ${sep}\u0060);\r\n } else if (octet.length \u003E 2) {\r\n throw new TypeError(\u0060too many hexadecimal digits in ${octet}\u0060);\r\n } else if (pos \u003C 6) {\r\n tmp = parseInt(octet,16);\r\n value *= 0x100;\r\n value \u002B= tmp;\r\n pos \u002B= 1;\r\n octet = \u0027\u0027;\r\n } else {\r\n throw new TypeError(\u0027too many octets in MAC address\u0027);\r\n }\r\n }\r\n\r\n for (let i = 0; i \u003C macAddress.length; i\u002B\u002B) {\r\n chr = macAddress[i];\r\n if (chr === sep) {\r\n process();\r\n } else if (isxdigit(chr)) {\r\n octet \u002B= chr;\r\n } else {\r\n throw new TypeError(\u0060unrecognized character ${chr}\u0060);\r\n }\r\n }\r\n\r\n if (chr === sep) {\r\n throw new TypeError(\u0060trailing ${sep} in MAC address\u0060);\r\n }\r\n\r\n if (pos === 0) {\r\n if (octet.length !== 12) {\r\n throw new TypeError(\u0027MAC address is too short\u0027);\r\n }\r\n value = parseInt(octet, 16);\r\n } else {\r\n process();\r\n if (pos !== 6) {\r\n throw new TypeError(\u0027too few octets in MAC address\u0027);\r\n }\r\n }\r\n\r\n return value;\r\n}\r\n\r\nconst conversionMap = new Map();\r\nconversionMap.set(\u0022sourceMac\u0022, convertMACAddressToInt);\r\nconversionMap.set(\u0022urlCategories\u0022, serializeCategories);\r\nconversionMap.set(\u0022ipCategories\u0022, serializeCategories);","TestCases":[{"Name":"buildCsvEntry","Code":"function buildCsvEntry(record, statsType) {\r\n // Build entry for csv and do any additional operations on specific fields.\r\n // Double quotes are added around string values.\r\n const header = [...getSchemaFields(statsType)];\r\n const columns = [];\r\n for (const csvField of header) {\r\n let val = _.get(record, csvField);\r\n if (hasValue(val)) {\r\n if (conversionMap.has(csvField)) {\r\n val = conversionMap.get(csvField)(val);\r\n }\r\n if ([\u0027String\u0027].includes(getSchemaFieldMetadata(statsType)[csvField].type)) {\r\n val = quoteField(val);\r\n }\r\n columns.push(\u0060${val}\u0060);\r\n }\r\n else {\r\n columns.push(\u0027\u0027);\r\n }\r\n }\r\n // Add trailing comma at end of csv line when joining\r\n columns.push(\u0027\u0027);\r\n header.push(\u0027\u0027);\r\n return { columns, header };\r\n}\r\n\r\nfor (let i = 0; i \u003C records.length; i\u002B\u002B) {\r\n buildCsvEntry(records[i], \u0022statsType\u0022);\r\n}","IsDeferred":false},{"Name":"buildCsvEntry Optimized","Code":"function buildCsvEntryEx(record, statsType) {\r\n // Build entry for csv and do any additional operations on specific fields.\r\n // Double quotes are added around string values.\r\n const header = [...getSchemaFields(statsType)];\r\n const columns = [];\r\n for (const csvField of header) {\r\n let val = record[csvField];\r\n if (hasValue(val)) {\r\n if (conversionMap.has(csvField)) {\r\n val = conversionMap.get(csvField)(val);\r\n }\r\n if (\u0027String\u0027 == getSchemaFieldMetadata(statsType)[csvField].type) {\r\n val = quoteFieldEx(val);\r\n }\r\n columns.push(\u0060${val}\u0060);\r\n }\r\n else {\r\n columns.push(\u0027\u0027);\r\n }\r\n }\r\n // Add trailing comma at end of csv line when joining\r\n columns.push(\u0027\u0027);\r\n header.push(\u0027\u0027);\r\n return { columns, header };\r\n}\r\n\r\nfor (let i = 0; i \u003C records.length; i\u002B\u002B) {\r\n buildCsvEntryEx(records[i], \u0022statsType\u0022);\r\n}","IsDeferred":false}]}