first commit

This commit is contained in:
2023-11-15 13:36:30 +01:00
commit b2be88c07f
24 changed files with 4259 additions and 0 deletions

30
.gitignore vendored Normal file
View File

@ -0,0 +1,30 @@
# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
package-lock.json
*.pyc
*.log
# Other files #
######################
__pycache__/
venv/
node_modules/
tmp/**
profiles/**
logs/**
# Compiled files #
#####################
cube.min.js
assets/js/cube.min.js
assets/js/controller.min.js
.env

3
README.md Normal file
View File

@ -0,0 +1,3 @@
## Job Log Parser
Small Node app that extracts data from DPX Job Logs

102
app.js Normal file
View File

@ -0,0 +1,102 @@
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const pug = require('pug');
const server = require('http').createServer(app);
//const https = require("https");
const cookieParser = require('cookie-parser');
const fs = require('fs');
const path = require('path');
const formidable = require('formidable');
var port = 3000;
app.use(bodyParser.urlencoded({ extended: true, limit: '20mb' }));
app.use(cookieParser());
app.set('view engine', 'pug')
app.use('/assets', express.static('assets'))
app.use('/tmp', express.static('tmp'))
app.use('/files', express.static('profiles'))
// middleware function to check for logged-in users
var sessionChecker = (req, res, next) => {
next();
};
// route for Home-Page
app.get('/', sessionChecker, (req, res) => {
var pageTitle = "Log Parser - Start";
res.render('intro', { title: pageTitle })
});
app.route('/upload')
.get(sessionChecker, (req, res) => {
res.redirect('/');
})
.post((req, res, next) => {
var pageTitle = 'Log Parser - Result';
const form = formidable({ keepExtensions: true, uploadDir: "tmp" });
form.parse(req, (err, fields, files) => {
if (err) {
next(err);
return;
}
fs.open(files.logfile.path, 'r', function (err, f) {
if (err) {
return console.error(err);
}
var result = fs.readFileSync(f).toString().split("\n");
var jobType = "";
/*result.forEach(function(line) {
if (checkJobType(line) !== undefined) {
jobType = checkJobType(line);
}
}); */
res.render('upload', {title: pageTitle, files: files, jobtype: jobType, data: result});
});
});
});
server.listen(port, function(){
console.log('Server started. Listening on *:' + port);
});
// helpers
function uniq(a) {
return a.sort().filter(function(item, pos, ary) {
return !pos || item != ary[pos - 1];
})
}
function isPresetNum(number, def) {
return isNaN(number) || number == "" ? def : parseInt(number);
}
function findDuplicate(users, clientemail) {
let result = users.filter((item) =>
item.email === clientemail &&
item.type === 'attendee').length > 0;
return result;
}
function fmtMSS(s){return(s-(s%=60))/60+(9<s?':':':0')+s}
function checkJobType(line) {
if (/SNBSVH_220J/.test(line)) {
return line.match(/(?:type: )(.*)(?:\))/)[1];
}
if (/SNBJH_3403J/.test(line)) {
return "Condense";
}
if (/SNBJH_3208J/.test(line)) {
return line.match(/job type (.*)\)/)[1];
}
}

7
assets/css/bootstrap.min.css vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

250
assets/css/croppie.css Normal file
View File

@ -0,0 +1,250 @@
.croppie-container {
width: 100%;
height: 100%;
}
.croppie-container .cr-image {
z-index: -1;
position: absolute;
top: 0;
left: 0;
transform-origin: 0 0;
max-height: none;
max-width: none;
}
.croppie-container .cr-boundary {
position: relative;
overflow: hidden;
margin: 0 auto;
z-index: 1;
width: 100%;
height: 100%;
}
.croppie-container .cr-viewport,
.croppie-container .cr-resizer {
position: absolute;
border: 2px solid #fff;
margin: auto;
top: 0;
bottom: 0;
right: 0;
left: 0;
box-shadow: 0 0 2000px 2000px rgba(0, 0, 0, 0.5);
z-index: 0;
}
.croppie-container .cr-resizer {
z-index: 2;
box-shadow: none;
pointer-events: none;
}
.croppie-container .cr-resizer-vertical,
.croppie-container .cr-resizer-horisontal {
position: absolute;
pointer-events: all;
}
.croppie-container .cr-resizer-vertical::after,
.croppie-container .cr-resizer-horisontal::after {
display: block;
position: absolute;
box-sizing: border-box;
border: 1px solid black;
background: #fff;
width: 10px;
height: 10px;
content: '';
}
.croppie-container .cr-resizer-vertical {
bottom: -5px;
cursor: row-resize;
width: 100%;
height: 10px;
}
.croppie-container .cr-resizer-vertical::after {
left: 50%;
margin-left: -5px;
}
.croppie-container .cr-resizer-horisontal {
right: -5px;
cursor: col-resize;
width: 10px;
height: 100%;
}
.croppie-container .cr-resizer-horisontal::after {
top: 50%;
margin-top: -5px;
}
.croppie-container .cr-original-image {
display: none;
}
.croppie-container .cr-vp-circle {
border-radius: 50%;
}
.croppie-container .cr-overlay {
z-index: 1;
position: absolute;
cursor: move;
touch-action: none;
}
.croppie-container .cr-slider-wrap {
width: 75%;
margin: 15px auto;
text-align: center;
}
.croppie-result {
position: relative;
overflow: hidden;
}
.croppie-result img {
position: absolute;
}
.croppie-container .cr-image,
.croppie-container .cr-overlay,
.croppie-container .cr-viewport {
-webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
transform: translateZ(0);
}
/*************************************/
/***** STYLING RANGE INPUT ***********/
/*************************************/
/*http://brennaobrien.com/blog/2014/05/style-input-type-range-in-every-browser.html */
/*************************************/
.cr-slider {
-webkit-appearance: none;
/*removes default webkit styles*/
/*border: 1px solid white; *//*fix for FF unable to apply focus style bug */
width: 300px;
/*required for proper track sizing in FF*/
max-width: 100%;
padding-top: 8px;
padding-bottom: 8px;
background-color: transparent;
}
.cr-slider::-webkit-slider-runnable-track {
width: 100%;
height: 3px;
background: rgba(0, 0, 0, 0.5);
border: 0;
border-radius: 3px;
}
.cr-slider::-webkit-slider-thumb {
-webkit-appearance: none;
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: #ddd;
margin-top: -6px;
}
.cr-slider:focus {
outline: none;
}
/*
.cr-slider:focus::-webkit-slider-runnable-track {
background: #ccc;
}
*/
.cr-slider::-moz-range-track {
width: 100%;
height: 3px;
background: rgba(0, 0, 0, 0.5);
border: 0;
border-radius: 3px;
}
.cr-slider::-moz-range-thumb {
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: #ddd;
margin-top: -6px;
}
/*hide the outline behind the border*/
.cr-slider:-moz-focusring {
outline: 1px solid white;
outline-offset: -1px;
}
.cr-slider::-ms-track {
width: 100%;
height: 5px;
background: transparent;
/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
border-color: transparent;/*leave room for the larger thumb to overflow with a transparent border */
border-width: 6px 0;
color: transparent;/*remove default tick marks*/
}
.cr-slider::-ms-fill-lower {
background: rgba(0, 0, 0, 0.5);
border-radius: 10px;
}
.cr-slider::-ms-fill-upper {
background: rgba(0, 0, 0, 0.5);
border-radius: 10px;
}
.cr-slider::-ms-thumb {
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: #ddd;
margin-top:1px;
}
.cr-slider:focus::-ms-fill-lower {
background: rgba(0, 0, 0, 0.5);
}
.cr-slider:focus::-ms-fill-upper {
background: rgba(0, 0, 0, 0.5);
}
/*******************************************/
/***********************************/
/* Rotation Tools */
/***********************************/
.cr-rotate-controls {
position: absolute;
bottom: 5px;
left: 5px;
z-index: 1;
}
.cr-rotate-controls button {
border: 0;
background: none;
}
.cr-rotate-controls i:before {
display: inline-block;
font-style: normal;
font-weight: 900;
font-size: 22px;
}
.cr-rotate-l i:before {
content: '↺';
}
.cr-rotate-r i:before {
content: '↻';
}

2005
assets/css/main.css Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

BIN
assets/images/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

@ -0,0 +1,691 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 205 39" style="enable-background:new 0 0 205 39;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFFFFF;}
</style>
<metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c148 79.164050, 2019/10/01-18:03:16 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"
xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
<dc:format>image/svg+xml</dc:format>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">Print</rdf:li>
</rdf:Alt>
</dc:title>
<xmp:MetadataDate>2020-10-22T14:50:37+05:30</xmp:MetadataDate>
<xmp:ModifyDate>2020-10-22T14:50:37+05:30</xmp:ModifyDate>
<xmp:CreateDate>2020-10-22T14:50:36+05:30</xmp:CreateDate>
<xmp:CreatorTool>Adobe Illustrator 24.0 (Macintosh)</xmp:CreatorTool>
<xmp:Thumbnails>
<rdf:Alt>
<rdf:li rdf:parseType="Resource">
<xmpGImg:width>256</xmpGImg:width>
<xmpGImg:height>48</xmpGImg:height>
<xmpGImg:format>JPEG</xmpGImg:format>
<xmpGImg:image>/9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA&#xA;AQEsAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAMAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX&#xA;Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FX//2Q==</xmpGImg:image>
</rdf:li>
</rdf:Alt>
</xmp:Thumbnails>
<xmpMM:InstanceID>xmp.iid:e8b181ea-3ea0-46dd-a7e4-99995517ef3f</xmpMM:InstanceID>
<xmpMM:DocumentID>xmp.did:e8b181ea-3ea0-46dd-a7e4-99995517ef3f</xmpMM:DocumentID>
<xmpMM:OriginalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</xmpMM:OriginalDocumentID>
<xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
<xmpMM:DerivedFrom rdf:parseType="Resource">
<stRef:instanceID>xmp.iid:058f80c3-7d21-4764-8fa0-f009ce88cac4</stRef:instanceID>
<stRef:documentID>xmp.did:058f80c3-7d21-4764-8fa0-f009ce88cac4</stRef:documentID>
<stRef:originalDocumentID>uuid:5D20892493BFDB11914A8590D31508C8</stRef:originalDocumentID>
<stRef:renditionClass>proof:pdf</stRef:renditionClass>
</xmpMM:DerivedFrom>
<xmpMM:History>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<stEvt:action>saved</stEvt:action>
<stEvt:instanceID>xmp.iid:1a6392f2-07cb-41ab-9a97-208e72d07d88</stEvt:instanceID>
<stEvt:when>2020-10-22T14:38:20+05:30</stEvt:when>
<stEvt:softwareAgent>Adobe Illustrator 24.0 (Macintosh)</stEvt:softwareAgent>
<stEvt:changed>/</stEvt:changed>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<stEvt:action>saved</stEvt:action>
<stEvt:instanceID>xmp.iid:e8b181ea-3ea0-46dd-a7e4-99995517ef3f</stEvt:instanceID>
<stEvt:when>2020-10-22T14:50:37+05:30</stEvt:when>
<stEvt:softwareAgent>Adobe Illustrator 24.0 (Macintosh)</stEvt:softwareAgent>
<stEvt:changed>/</stEvt:changed>
</rdf:li>
</rdf:Seq>
</xmpMM:History>
<illustrator:StartupProfile>Print</illustrator:StartupProfile>
<xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
<xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
<xmpTPg:NPages>1</xmpTPg:NPages>
<xmpTPg:MaxPageSize rdf:parseType="Resource">
<stDim:w>205.000000</stDim:w>
<stDim:h>39.000000</stDim:h>
<stDim:unit>Pixels</stDim:unit>
</xmpTPg:MaxPageSize>
<xmpTPg:SwatchGroups>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:groupName>Default Swatch Group</xmpG:groupName>
<xmpG:groupType>0</xmpG:groupType>
<xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>White</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>Black</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>100.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>CMYK Red</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>CMYK Green</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>100.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>100.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>CMYK Blue</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>100.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=15 M=100 Y=90 K=10</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>15.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>90.000000</xmpG:yellow>
<xmpG:black>10.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=90 Y=85 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>90.000000</xmpG:magenta>
<xmpG:yellow>85.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=80 Y=95 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>80.000000</xmpG:magenta>
<xmpG:yellow>95.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=50 Y=100 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>50.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=35 Y=85 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>35.000000</xmpG:magenta>
<xmpG:yellow>85.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=5 M=0 Y=90 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>5.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>90.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=20 M=0 Y=100 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>20.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=50 M=0 Y=100 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>50.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=75 M=0 Y=100 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>75.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=85 M=10 Y=100 K=10</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>85.000000</xmpG:cyan>
<xmpG:magenta>10.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>10.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=90 M=30 Y=95 K=30</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>90.000000</xmpG:cyan>
<xmpG:magenta>30.000000</xmpG:magenta>
<xmpG:yellow>95.000000</xmpG:yellow>
<xmpG:black>30.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=75 M=0 Y=75 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>75.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>75.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=80 M=10 Y=45 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>80.000000</xmpG:cyan>
<xmpG:magenta>10.000000</xmpG:magenta>
<xmpG:yellow>45.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>70.000000</xmpG:cyan>
<xmpG:magenta>15.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=85 M=50 Y=0 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>85.000000</xmpG:cyan>
<xmpG:magenta>50.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=100 M=95 Y=5 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>100.000000</xmpG:cyan>
<xmpG:magenta>95.000000</xmpG:magenta>
<xmpG:yellow>5.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=100 M=100 Y=25 K=25</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>100.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>25.000000</xmpG:yellow>
<xmpG:black>25.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=75 M=100 Y=0 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>75.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=50 M=100 Y=0 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>50.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=35 M=100 Y=35 K=10</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>35.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>35.000000</xmpG:yellow>
<xmpG:black>10.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=10 M=100 Y=50 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>10.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>50.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=95 Y=20 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>95.000000</xmpG:magenta>
<xmpG:yellow>20.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=25 M=25 Y=40 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>25.000000</xmpG:cyan>
<xmpG:magenta>25.000000</xmpG:magenta>
<xmpG:yellow>40.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=40 M=45 Y=50 K=5</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>40.000000</xmpG:cyan>
<xmpG:magenta>45.000000</xmpG:magenta>
<xmpG:yellow>50.000000</xmpG:yellow>
<xmpG:black>5.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=50 M=50 Y=60 K=25</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>50.000000</xmpG:cyan>
<xmpG:magenta>50.000000</xmpG:magenta>
<xmpG:yellow>60.000000</xmpG:yellow>
<xmpG:black>25.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=55 M=60 Y=65 K=40</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>55.000000</xmpG:cyan>
<xmpG:magenta>60.000000</xmpG:magenta>
<xmpG:yellow>65.000000</xmpG:yellow>
<xmpG:black>40.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=25 M=40 Y=65 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>25.000000</xmpG:cyan>
<xmpG:magenta>40.000000</xmpG:magenta>
<xmpG:yellow>65.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=30 M=50 Y=75 K=10</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>30.000000</xmpG:cyan>
<xmpG:magenta>50.000000</xmpG:magenta>
<xmpG:yellow>75.000000</xmpG:yellow>
<xmpG:black>10.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=35 M=60 Y=80 K=25</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>35.000000</xmpG:cyan>
<xmpG:magenta>60.000000</xmpG:magenta>
<xmpG:yellow>80.000000</xmpG:yellow>
<xmpG:black>25.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=40 M=65 Y=90 K=35</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>40.000000</xmpG:cyan>
<xmpG:magenta>65.000000</xmpG:magenta>
<xmpG:yellow>90.000000</xmpG:yellow>
<xmpG:black>35.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=40 M=70 Y=100 K=50</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>40.000000</xmpG:cyan>
<xmpG:magenta>70.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>50.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=50 M=70 Y=80 K=70</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>50.000000</xmpG:cyan>
<xmpG:magenta>70.000000</xmpG:magenta>
<xmpG:yellow>80.000000</xmpG:yellow>
<xmpG:black>70.000000</xmpG:black>
</rdf:li>
</rdf:Seq>
</xmpG:Colorants>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:groupName>Grays</xmpG:groupName>
<xmpG:groupType>1</xmpG:groupType>
<xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=100</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>100.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=90</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>89.999400</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=80</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>79.998800</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=70</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>69.999700</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=60</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>59.999100</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=50</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>50.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=40</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>39.999400</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=30</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>29.998800</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=20</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>19.999700</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=10</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>9.999100</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=0 Y=0 K=5</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>0.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>4.998800</xmpG:black>
</rdf:li>
</rdf:Seq>
</xmpG:Colorants>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:groupName>Brights</xmpG:groupName>
<xmpG:groupType>1</xmpG:groupType>
<xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=100 Y=100 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>100.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=75 Y=100 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>75.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=0 M=10 Y=95 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>0.000000</xmpG:cyan>
<xmpG:magenta>10.000000</xmpG:magenta>
<xmpG:yellow>95.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=85 M=10 Y=100 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>85.000000</xmpG:cyan>
<xmpG:magenta>10.000000</xmpG:magenta>
<xmpG:yellow>100.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=100 M=90 Y=0 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>100.000000</xmpG:cyan>
<xmpG:magenta>90.000000</xmpG:magenta>
<xmpG:yellow>0.000000</xmpG:yellow>
<xmpG:black>0.000000</xmpG:black>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>C=60 M=90 Y=0 K=0</xmpG:swatchName>
<xmpG:mode>CMYK</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:cyan>60.000000</xmpG:cyan>
<xmpG:magenta>90.000000</xmpG:magenta>
<xmpG:yellow>0.003100</xmpG:yellow>
<xmpG:black>0.003100</xmpG:black>
</rdf:li>
</rdf:Seq>
</xmpG:Colorants>
</rdf:li>
</rdf:Seq>
</xmpTPg:SwatchGroups>
<pdf:Producer>Adobe PDF library 15.00</pdf:Producer>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
</metadata>
<g>
<path class="st0" d="M57.5,11.4c0.3,0,0.5,0.2,0.5,0.5v2.3c0,0.4-0.2,0.5-0.5,0.5H47.3c-0.6,0-1.1,0.1-1.5,0.1
c-0.4,0.1-0.7,0.3-0.9,0.5c-0.2,0.2-0.4,0.6-0.5,1c-0.1,0.4-0.1,0.9-0.1,1.5v3.3c0,0.6,0,1.1,0.1,1.5c0.1,0.4,0.3,0.7,0.5,1
s0.5,0.4,0.9,0.5c0.4,0.1,0.9,0.1,1.5,0.1h10.2c0.3,0,0.5,0.2,0.5,0.5V27c0,0.3-0.2,0.5-0.5,0.5H47.1c-1.2,0-2.2-0.1-3-0.3
c-0.8-0.2-1.5-0.6-2-1c-0.5-0.5-0.9-1.1-1.1-1.9c-0.2-0.8-0.4-1.7-0.4-2.8v-4c0-1.1,0.1-2,0.4-2.8s0.6-1.4,1.1-1.9
c0.5-0.5,1.2-0.8,2-1.1c0.8-0.2,1.8-0.3,3-0.3H57.5z"/>
<path class="st0" d="M70.7,11.4c0.6,0,1.1,0.1,1.5,0.4c0.4,0.2,0.8,0.7,1.2,1.4L80.9,27c0.1,0.2,0.1,0.3,0.1,0.4
c0,0.1-0.1,0.1-0.3,0.1h-2.9c-0.3,0-0.4-0.1-0.5-0.3l-1.6-3H64.8l-1.6,3c-0.1,0.2-0.3,0.3-0.5,0.3h-3c-0.2,0-0.3,0-0.4-0.1
c0-0.1,0-0.2,0.1-0.4l7.5-13.8c0.4-0.7,0.8-1.2,1.1-1.4c0.4-0.2,0.8-0.4,1.3-0.4H70.7z M66.2,21.6h7.9l-3.7-6.7
c-0.1-0.1-0.1-0.2-0.3-0.2h-0.1c-0.1,0-0.2,0.1-0.3,0.2L66.2,21.6z"/>
<path class="st0" d="M97.4,11.4c0.4,0,0.5,0.2,0.5,0.5v2.3c0,0.4-0.2,0.5-0.5,0.5h-7.2V27c0,0.3-0.2,0.5-0.5,0.5h-2.5
c-0.3,0-0.5-0.2-0.5-0.5V14.7h-7.2c-0.4,0-0.5-0.2-0.5-0.5V12c0-0.3,0.2-0.5,0.5-0.5H97.4z"/>
<path class="st0" d="M107.2,11.4c0.6,0,1.1,0.1,1.5,0.4c0.4,0.2,0.8,0.7,1.2,1.4l7.6,13.8c0.1,0.2,0.1,0.3,0.1,0.4
c0,0.1-0.1,0.1-0.3,0.1h-2.9c-0.3,0-0.4-0.1-0.5-0.3l-1.6-3h-10.8l-1.6,3c-0.1,0.2-0.3,0.3-0.5,0.3h-3c-0.2,0-0.3,0-0.4-0.1
c0-0.1,0-0.2,0.1-0.4l7.5-13.8c0.4-0.7,0.8-1.2,1.1-1.4c0.4-0.2,0.8-0.4,1.3-0.4H107.2z M102.7,21.6h7.9l-3.7-6.7
c-0.1-0.1-0.1-0.2-0.3-0.2h-0.1c-0.1,0-0.2,0.1-0.3,0.2L102.7,21.6z"/>
<path class="st0" d="M121.5,11.4c0.3,0,0.5,0.2,0.5,0.5v9.2c0,0.6,0,1.1,0.1,1.5c0.1,0.4,0.3,0.7,0.5,1c0.2,0.2,0.5,0.4,0.9,0.5
c0.4,0.1,0.9,0.1,1.5,0.1h9.3c0.3,0,0.5,0.2,0.5,0.5V27c0,0.3-0.2,0.5-0.5,0.5h-9.5c-1.2,0-2.2-0.1-3-0.3c-0.8-0.2-1.5-0.6-2-1
c-0.5-0.5-0.9-1.1-1.1-1.9c-0.2-0.8-0.4-1.7-0.4-2.8V12c0-0.3,0.2-0.5,0.5-0.5H121.5z"/>
<path class="st0" d="M150.3,11.4c1.2,0,2.2,0.1,3,0.3c0.8,0.2,1.5,0.6,2,1.1c0.5,0.5,0.9,1.1,1.1,1.9c0.2,0.8,0.3,1.7,0.3,2.8v4
c0,1.1-0.1,2-0.3,2.8c-0.2,0.8-0.6,1.4-1.1,1.9c-0.5,0.5-1.2,0.8-2,1c-0.8,0.2-1.8,0.3-3,0.3h-7.1c-1.2,0-2.2-0.1-3-0.3
c-0.8-0.2-1.5-0.6-2-1c-0.5-0.5-0.9-1.1-1.1-1.9c-0.2-0.8-0.4-1.7-0.4-2.8v-4c0-1.1,0.1-2,0.4-2.8c0.2-0.8,0.6-1.4,1.1-1.9
c0.5-0.5,1.2-0.8,2-1.1c0.8-0.2,1.8-0.3,3-0.3H150.3z M140.2,21.2c0,0.6,0,1.1,0.1,1.5c0.1,0.4,0.3,0.7,0.5,1
c0.2,0.2,0.5,0.4,0.9,0.5c0.4,0.1,0.9,0.1,1.5,0.1h6.8c0.6,0,1.1,0,1.5-0.1c0.4-0.1,0.7-0.3,0.9-0.5c0.2-0.2,0.4-0.6,0.5-1
c0.1-0.4,0.1-0.9,0.1-1.5v-3.4c0-0.6-0.1-1.1-0.1-1.5c-0.1-0.4-0.3-0.7-0.5-1c-0.2-0.2-0.5-0.4-0.9-0.5c-0.4-0.1-0.9-0.1-1.5-0.1
h-6.8c-0.6,0-1.1,0-1.5,0.1c-0.4,0.1-0.7,0.3-0.9,0.5c-0.2,0.2-0.4,0.6-0.5,1c-0.1,0.4-0.1,0.9-0.1,1.5V21.2z"/>
<path class="st0" d="M177.5,11.4c0.3,0,0.5,0.2,0.5,0.5v2.3c0,0.4-0.2,0.5-0.5,0.5H166c-0.6,0-1.1,0.1-1.5,0.1
c-0.4,0.1-0.7,0.3-0.9,0.5c-0.2,0.2-0.4,0.6-0.5,1c-0.1,0.4-0.1,0.9-0.1,1.5v3.3c0,0.6,0,1.1,0.1,1.5c0.1,0.4,0.3,0.7,0.5,1
c0.2,0.2,0.5,0.4,0.9,0.5c0.4,0.1,0.9,0.1,1.5,0.1h7.6c0.4,0,0.7-0.1,0.9-0.3s0.3-0.6,0.3-1.1v-1.9c0-0.2-0.1-0.3-0.3-0.3h-6.7
c-0.3,0-0.5-0.2-0.5-0.5v-1.7c0-0.4,0.2-0.5,0.5-0.5h9.6c0.5,0,0.7,0.2,0.7,0.7V24c0,1.3-0.2,2.2-0.7,2.7c-0.5,0.5-1.2,0.8-2.1,0.8
h-9.3c-1.2,0-2.2-0.1-3-0.3c-0.8-0.2-1.5-0.6-2-1c-0.5-0.5-0.9-1.1-1.1-1.9c-0.2-0.8-0.4-1.7-0.4-2.8v-4c0-1.1,0.1-2,0.4-2.8
c0.2-0.8,0.6-1.4,1.1-1.9c0.5-0.5,1.2-0.8,2-1.1c0.8-0.2,1.8-0.3,3-0.3H177.5z"/>
<path class="st0" d="M183.9,11.4c0.3,0,0.5,0.2,0.5,0.5V27c0,0.3-0.2,0.5-0.5,0.5h-2.5c-0.4,0-0.5-0.2-0.5-0.5V12
c0-0.3,0.2-0.5,0.5-0.5H183.9z"/>
<path class="st0" d="M204.1,11.4c0.3,0,0.5,0.2,0.5,0.5v2.3c0,0.4-0.2,0.5-0.5,0.5h-10.2c-0.6,0-1.1,0.1-1.5,0.1
c-0.4,0.1-0.7,0.3-0.9,0.5c-0.2,0.2-0.4,0.6-0.5,1c-0.1,0.4-0.1,0.9-0.1,1.5v3.3c0,0.6,0,1.1,0.1,1.5c0.1,0.4,0.3,0.7,0.5,1
s0.5,0.4,0.9,0.5c0.4,0.1,0.9,0.1,1.5,0.1h10.2c0.3,0,0.5,0.2,0.5,0.5V27c0,0.3-0.2,0.5-0.5,0.5h-10.4c-1.2,0-2.2-0.1-3-0.3
c-0.8-0.2-1.5-0.6-2-1c-0.5-0.5-0.9-1.1-1.1-1.9c-0.2-0.8-0.4-1.7-0.4-2.8v-4c0-1.1,0.1-2,0.4-2.8c0.2-0.8,0.6-1.4,1.1-1.9
c0.5-0.5,1.2-0.8,2-1.1c0.8-0.2,1.8-0.3,3-0.3H204.1z"/>
</g>
<polygon class="st1" points="18,6.2 9.2,6.2 23.4,22.3 9.2,38.4 18,38.4 32.2,22.3 "/>
<polygon class="st0" points="14.5,0.2 0.3,16.4 14.5,32.5 23.2,32.5 9,16.4 23.2,0.2 "/>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 50 KiB

7
assets/js/bootstrap.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
assets/js/croppie.min.js vendored Normal file

File diff suppressed because one or more lines are too long

4
assets/js/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

5
assets/js/popper.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

21
package.json Normal file
View File

@ -0,0 +1,21 @@
{
"name": "Joblog_Parser",
"version": "0.0.1",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app.js",
"watch": "nodemon app.js"
},
"author": "Patrick Wagner",
"license": "ISC",
"dependencies": {
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"express": "^4.17.1",
"express-session": "^1.17.1",
"formidable": "^1.2.2",
"nodemon": "^2.0.3",
"pug": "^2.0.4"
}
}

13
views/includes/head.pug Normal file
View File

@ -0,0 +1,13 @@
// - includes/head.pug
head
title= title
meta(name="viewport" content="width=device-width, initial-scale=1")
script(src='assets/js/jquery.min.js')
script(src='assets/js/popper.min.js')
link#bootstrap-css(href='assets/css/bootstrap.min.css', rel='stylesheet')
script(src='assets/js/bootstrap.min.js')
link(
rel='stylesheet'
href='assets/css/main.css'
)
link(rel='shortcut icon' type='image/png' href='assets/images/favicon.ico')

View File

@ -0,0 +1,27 @@
// - includes/navigation.pug
.announcement.hidden
.announce
span.icon.icon-eye-slash
nav.navbar.navbar-expand-lg.navbar-light.bg-light
a.navbar-brand(href='/')
img.left-control-logo(src='assets/images/logo-catalogic-colored.svg' alt='Catalogic Log Parser')
span.left-control-title Log Parser
button.navbar-toggler(type='button' data-toggle='collapse' data-target='#navbarNavAltMarkup' aria-controls='navbarNavAltMarkup' aria-expanded='false' aria-label='Toggle navigation')
span.navbar-toggler-icon
#navbarNavAltMarkup.collapse.navbar-collapse
.navbar-nav
a.nav-item.nav-link(href='/' class="d-none d-md-block d-sm-none")
| Upload
span.sr-only (current)
a.nav-item.nav-link(href='https://kb.catalogicsoftware.com/search/' target='_blank') KB
a.nav-item.nav-link(href='https://jira.catalogicsoftware.com/' target='_blank') Jira
a.nav-item.nav-link(href='https://gitlab.ad.catalogic.us/pwagner/joblog-parser/-/issues' target='_blank') Report bug
script.
var path = location.search !== "" ? location.pathname + location.search: location.pathname;
jQuery('.navbar a[href="' + path + '"]').addClass('active');
function closeWin() {
window.close();
}

38
views/intro.pug Normal file
View File

@ -0,0 +1,38 @@
doctype html
include includes/head.pug
body
include includes/navigation.pug
.container-fluid
.row.page-container
.col-md-6.col-sm-12.col-xs-12
.row
.col
h3 &nbsp Welcome to Catalogic Log Parser
.row
.col
.container-fluid
p Upload a file to start.
form.logFile(action='/upload' method='post' enctype='multipart/form-data')
.form-group
input.form-control.upload(id="file" type='file', name='logfile' required)
if (imageSuccess)
span(class="formSuccess") = imageSuccess
div.text-right
p Questions?
a.btn.btnSubmit(href="mailto:pwagner@catalogicsoftware.com") Send Patrick an email
script.
$('input#file').change(function(e) {
e.preventDefault();
var error = $('form.logFile > .formError');
if (error) {
$('form.logFile > .formError').remove();
}
var isLog = /(.log|.txt)$/i.test($('#file').val());
if (isLog) {
$('form.logFile').submit();
} else {
$('<span class="formError">Please use a LOG or TXT file</span>').insertAfter($('#file'));
}
});

345
views/upload.pug Normal file
View File

@ -0,0 +1,345 @@
doctype html
include includes/head.pug
body
include includes/navigation.pug
.container-fluid
.row.page-container
.col-md-12.col-sm-12.col-xs-12
.row
.col
.container-fluid
.tab
button(class="tablinks" onclick="openTab(event, 'Details')") Details
button(class="tablinks hidden" onclick="openTab(event, 'Tasks')") Tasks
button(class="tablinks" onclick="openTab(event, 'Options')") Options
button(class="tablinks hidden" onclick="openTab(event, 'Errors')") Errors
button(class="tablinks hidden" onclick="openTab(event, 'Exceptions')") Exceptions
button(class="tablinks hidden" onclick="openTab(event, 'Warnings')") Warnings
button(class="tablinks" onclick="openTab(event, 'Full')") Full log
#Details(class="tabcontent default")
h3 Details
#Tasks(class="tabcontent")
h3 Tasks
#Options(class="tabcontent")
h3 Options
#Errors(class="tabcontent")
h3 Errors
#Exceptions(class="tabcontent")
h3 Exceptions
#Warnings(class="tabcontent")
h3 Warnings
#Full(class="tabcontent")
h3 Full log
.row
.col.croppie
.container-fluid
#content
script.
var file = !{JSON.stringify(files.logfile.path)}
var data = !{JSON.stringify(data)}
var jobType = !{JSON.stringify(jobtype)}
var details = document.getElementById('Details');
var tasks = document.getElementById('Tasks');
var options = document.getElementById('Options');
var errors = document.getElementById('Errors');
var exceptions = document.getElementById('Exceptions');
var warnings = document.getElementById('Warnings');
var content = document.getElementById('Full');
var alldata = {
'Clients': [],
'Job status': {},
'Tasks': {},
'Warnings': [],
'Errors': [],
'Exceptions': [],
'Job globals': [],
'Job options': [],
'Node options': {}
}
data.forEach(function(line, idx) {
checkVersion(line);
checkJobType(line);
checkJobGlobals(line);
checkJobGlobalOptions(line);
checkJobOptions(line);
checkCompletitionStatus(line);
checkTasks(line);
getClientName(line);
findWarnings(line);
findErrors(line);
findExceptions(line);
writeLog(line, idx + 1);
})
// write to tabs
if (Object.entries(alldata['Clients']).length > 0) {
details.insertAdjacentHTML('beforeend', '<p class="description"><h3>Clients</h3>')
for (let i in alldata['Clients']) {
details.insertAdjacentHTML('beforeend', '<p class="description">' + alldata['Clients'][i] + ' - ' + [i] + '</p>')
}
}
if (Object.entries(alldata['Job status']).length > 0) {
details.insertAdjacentHTML('beforeend', '<p class="description"><h3>Status</h3>')
if (parseInt(alldata['Job status']['Status']) !== 0) {
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Completition status:</b> <span class=" code error">' + alldata['Job status']['Status'] + '</span></p>')
} else {
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Completition status:</b> <span class=" code success">' + alldata['Job status']['Status'] + '</span></p>')
}
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Run time:</b> ' + alldata['Job status']['Run time'] + '</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Data volume:</b> ' + alldata['Job status']['Data volume'] + '</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Throughput:</b> ' + alldata['Job status']['Throughput'] + '</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Transfer rate:</b> ' + alldata['Job status']['Transfer rate'] + '</p>')
}
if (Object.entries(alldata['Tasks']).length > 0) {
Object.entries(alldata['Tasks']).forEach(function(el) {
var status = parseInt(el[1]["Status"]);
var bg = "#9FF781";
if (status !== 0) {
status = '<span class="code error">' + status + '</span>';
bg = "#F5A9A9";
}
tasks.insertAdjacentHTML('beforeend', '<div class="row" style="border: 1px solid black; margin: 8px; background: #fcfcfc"><div class="col-1" style="background: ' + bg + '">Task ' + el[0] + '</div><div class="col">Node: '+ el[1]["Node"] + '<br>Disk: '+ el[1]["Disk"] + '<br>Status: '+ status + '<br>Run time: '+ el[1]["Run time"] + '<br>Data volume: '+ el[1]["Data volume"] + '<br>Throughput: '+ el[1]["Throughput"] + '</div></div>')
})
jQuery('button:contains("Tasks")').removeClass('hidden');
}
if (alldata['Errors'].length > 0) {
alldata['Errors'].forEach(function(el) {
errors.insertAdjacentHTML('beforeend', '<p class="code">' + el + '</p>')
});
jQuery('button:contains("Errors")').removeClass('hidden');
}
if (alldata['Warnings'].length > 0) {
alldata['Warnings'].forEach(function(el) {
warnings.insertAdjacentHTML('beforeend', '<p class="code">' + el + '</p>')
});
jQuery('button:contains("Warnings")').removeClass('hidden');
}
if (alldata['Exceptions'].length > 0) {
alldata['Exceptions'].forEach(function(el) {
exceptions.insertAdjacentHTML('beforeend', '<p class="code">' + el + '</p>')
});
jQuery('button:contains("Exceptions")').removeClass('hidden');
}
if (alldata['Job globals'].length > 0) {
options.insertAdjacentHTML('beforeend', '<p class="description"><b>Job globals:</b></p>')
alldata['Job globals'].forEach(function(el) {
options.insertAdjacentHTML('beforeend', '<p class="description">' + el + '</p>')
});
options.insertAdjacentHTML('beforeend', '<p class="description">&nbsp;</p>')
}
if (alldata['Job options'].length > 0) {
options.insertAdjacentHTML('beforeend', '<p class="description"><b>Job options:</b></p>')
alldata['Job options'].forEach(function(el) {
options.insertAdjacentHTML('beforeend', '<p class="description">' + el + '</p>')
});
options.insertAdjacentHTML('beforeend', '<p class="description">&nbsp;</p>')
}
if (Object.entries(alldata['Node options']).length > 0) {
Object.entries(alldata['Node options']).forEach(function(el) {
options.insertAdjacentHTML('beforeend', '<p class="description"><b>Node options:</b> ' + el[0] + '</p>');
el[1].forEach(function(els) {
options.insertAdjacentHTML('beforeend', '<p class="description">' + els + '</p>');
})
options.insertAdjacentHTML('beforeend', '<p class="description">&nbsp;</p>');
})
}
// extract functions
function checkVersion(line) {
if (/SNBSVH_200J/.test(line)) {
var version = line.match(/([0-9]\.[0-9])(?:;)/)[1];
alldata['Version'] = version;
alldata['Master IP'] = getIp(line);
details.insertAdjacentHTML('beforeend', '<p class="description"><b>DPX Version:</b> ' + version + '</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>DPX Master IP:</b> ' + getIp(line) + '</p>')
}
if (/SNBJH_3075J/.test(line)) {
var version = line.match(/([0-9]\.[0-9])(?:;)/)[1];
alldata['Version'] = version;
alldata['Master IP'] = getIp(line);
details.insertAdjacentHTML('beforeend', '<p class="description"><b>DPX Version:</b> ' + version + '</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>DPX Master IP:</b> ' + getIp(line) + '</p>')
}
}
function checkJobType(line) {
if (/SNBSVH_220J/.test(line)) {
var jobtype = line.match(/(?:type: )(.*)(?:\))/)[1];
var jobname = line.match(/(?:name: )(.*)(?:,)/)[1];
alldata['Job Name'] = jobname;
alldata['Job Type'] = jobtype;
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Name of job:</b> ' + jobname + '</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Type of job:</b> ' + jobtype + '</p>')
}
if (/SNBJH_3403J/.test(line)) {
alldata['Job Name'] = "Condense";
alldata['Job Type'] = "Condense";
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Name of job:</b> Condense</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Type of job:</b> Condense</p>')
}
if (/SNBJH_3208J/.test(line)) {
var jobname = line.match(/New Job ([A-Z,a-z,0-9,\-,_]{1,16})/)[1];
var jobtype = line.match(/job type (.*)\)/)[1];
alldata['Job Name'] = jobname;
alldata['Job Type'] = jobtype;
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Name of job:</b> ' + jobname + '</p>')
details.insertAdjacentHTML('beforeend', '<p class="description"><b>Type of job:</b> ' + jobtype + '</p>')
}
}
function checkJobOptions(line) {
if (/SNBSVH_264J/.test(line)) {
var jobOptions = line.match(/Node\((.*)\) options:(.*)/);
if (alldata['Node options'][jobOptions[1]] == undefined) {
alldata['Node options'][jobOptions[1]] = [];
}
var optionsArray = jobOptions[2].split(',');
optionsArray.forEach(function(el) {
alldata['Node options'][jobOptions[1]].push(el.trim());
});
}
}
function checkJobGlobals(line) {
if (/SNBSVH_361J/.test(line)) {
var jobOptions = line.match(/Job globals:(.*)/);
var optionsArray = jobOptions[1].split(';');
optionsArray.forEach(function(el) {
alldata['Job globals'].push(el.trim());
});
}
}
function checkJobGlobalOptions(line) {
if (/SNBSVH_222J/.test(line)) {
var jobOptions = line.match(/Job options:(.*)/);
var optionsArray = jobOptions[1].split(',');
optionsArray.forEach(function(el) {
alldata['Job options'].push(el.trim());
});
}
if (/SNBJH_3498J/.test(line)) {
var jobOptions = line.match(/Job options: (.*)/);
var optionsArray = jobOptions[1].split(';');
optionsArray.forEach(function(el) {
alldata['Job options'].push(el.trim());
});
}
}
function checkCompletitionStatus(line) {
if (/SNBSVH_225J/.test(line)) {
var status = line.match(/Job [0-9]{10}: (.*)/)[1];
var taskStatus = line.match(/(?:Completion status )([0-9]{1,2});/)[1];
var runTime = line.match(/(?:Run time )([0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2});/)[1];
var dataVolume = line.match(/(?:Data volume)(.+(bytes|KB|MB|GB|n\/a));/)[1];
var throughPut = line.match(/(?:Throughput)(.+(bytes|KB\/s|MB\/s|GB\/s|n\/a));/)[1];
var transferRate = line.match(/(?:Data transfer rate)(.+(bytes|KB\/s|MB\/s|GB\/s|n\/a))/)[1];
alldata['Job status']['Status'] = taskStatus;
alldata['Job status']['Run time'] = runTime;
alldata['Job status']['Data volume'] = dataVolume;
alldata['Job status']['Throughput'] = throughPut;
alldata['Job status']['Transfer rate'] = transferRate;
}
}
function checkTasks(line) {
if (/SNBSVH_232J/.test(line)) {
var tasks = line.match(/Task ([0-9]{1,2})/)[1];
var taskStatus = line.match(/(?:Completion status )([0-9]{1,2});/)[1];
var runTime = line.match(/(?:Run time )([0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2});/)[1];
var dataVolume = line.match(/(?:Data volume)(.+(bytes|KB|MB|GB|n\/a));/)[1];
var throughPut = line.match(/(?:Throughput)(.+(bytes|KB\/s|MB\/s|GB\/s|n\/a))/)[1]
if (alldata['Tasks'][tasks] == undefined) {
alldata['Tasks'][tasks] = {}
}
alldata['Tasks'][tasks]['Status'] = taskStatus;
alldata['Tasks'][tasks]['Run time'] = runTime;
alldata['Tasks'][tasks]['Data volume'] = dataVolume.trim();
alldata['Tasks'][tasks]['Throughput'] = throughPut.trim();
}
if (/SNBSVH_230J/.test(line)) {
var tasks = line.match(/Task ([0-9]{1,2})/)[1];
var taskDisk = line.match(/disk: (.*)\)/)[1];
var taskNode = line.match(/node: (.*)\,/)[1];
if (alldata['Tasks'][tasks] == undefined) {
alldata['Tasks'][tasks] = {}
}
alldata['Tasks'][tasks]['Disk'] = taskDisk;
alldata['Tasks'][tasks]['Node'] = taskNode;
}
}
function findWarnings(line) {
if (/\s[A-Z]{6}([0-9]|_)[0-9]{3}W/.test(line)) {
alldata['Warnings'].push(line);
}
}
function findErrors(line) {
if (/\s[A-Z]{5}([A-Z]|_)([0-9]|_)[0-9]{3}E/.test(line)) {
alldata['Errors'].push(line);
}
}
function findExceptions(line) {
if (/\s[A-Z]{5}([A-Z]|_)([0-9]|_)[0-9]{3}X/.test(line)) {
alldata['Exceptions'].push(line);
}
}
function getIp(line) {
return line.match(/^(?:[0-9]{1,3}\.){3}[0-9]{1,3}/)[0];
}
function getClientName(line) {
if (/SNBAPH_466J/.test(line)) {
var clientIp = getIp(line);
var clientName = line.match(/\((.*)\)/)[1];
alldata['Clients'][clientName] = clientIp;
}
}
function writeLog(line, idx) {
if (/\s[A-Z]{5}([A-Z]|_)([0-9]|_)[0-9]{3}E/.test(line)) {
content.insertAdjacentHTML('beforeend', '<p class="code error"><span class="idx">' + idx + '</span> ' + line + '</p>')
} else if (/\s[A-Z]{5}([A-Z]|_)([0-9]|_)[0-9]{3}W/.test(line)) {
content.insertAdjacentHTML('beforeend', '<p class="code warning"><span class="idx">' + idx + '</span> ' + line + '</p>')
} else if (/\s[A-Z]{5}([A-Z]|_)([0-9]|_)[0-9]{3}X/.test(line)) {
content.insertAdjacentHTML('beforeend', '<p class="code error"><span class="idx">' + idx + '</span> ' + line + '</p>')
}else {
content.insertAdjacentHTML('beforeend', '<p class="code"><span class="idx">' + idx + '</span> ' + line + '</p>')
}
}
function openTab(evt, tabName) {
var i, tabcontent, tablinks;
tabcontent = document.getElementsByClassName("tabcontent");
for (i = 0; i < tabcontent.length; i++) {
tabcontent[i].style.display = "none";
}
tablinks = document.getElementsByClassName("tablinks");
for (i = 0; i < tablinks.length; i++) {
tablinks[i].className = tablinks[i].className.replace(" active", "");
}
document.getElementById(tabName).style.display = "block";
evt.currentTarget.className += " active";
}