From ca021544931e051d0b9f1ef36e1efeaa5c4b8ae2 Mon Sep 17 00:00:00 2001
From: miller45 <rklein@rosen-group.com>
Date: Thu, 6 Jun 2019 14:05:02 +0200
Subject: [PATCH 01/12] added unit test for new lock.file handling removed
 superflus code

---
 tests/reporter/util_metadata_test.js | 141 +++++++++++++++++----------
 1 file changed, 90 insertions(+), 51 deletions(-)

diff --git a/tests/reporter/util_metadata_test.js b/tests/reporter/util_metadata_test.js
index d0cf23b..58568ed 100644
--- a/tests/reporter/util_metadata_test.js
+++ b/tests/reporter/util_metadata_test.js
@@ -158,6 +158,19 @@ describe('unit tests', () => {
                     }).toThrow();
 
                 });
+
+                it('catches error and logs if mkdirSync throws', () => {
+                    const errorMsg = "fake error";
+                    const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
+                    spyOn(fs, 'mkdirSync').and.callFake(() => {
+                        throw new Error(errorMsg);
+                    });
+                    spyOn(console, 'error').and.stub();
+                    util.addMetaData({}, fakePath, {});
+                    expect(console.error).toHaveBeenCalledWith(new Error(errorMsg));
+                });
+
+
             });
 
             describe('working scenarios', () => {
@@ -211,7 +224,6 @@ describe('unit tests', () => {
                     expect(console.error).not.toHaveBeenCalled();
                 });
 
-
                 it('writes contents to target file with preexisting file', () => {
                     const errorMsg = "mock case not expected: ";
                     const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
@@ -262,6 +274,69 @@ describe('unit tests', () => {
                     expect(console.error).not.toHaveBeenCalled();
                 });
 
+                it('retries when locked and writes contents to target file with preexisting file ', () => {
+                    const errorMsg = "mock case not expected: ";
+                    const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
+
+                    function makeFEXISTErr() {
+                        const errorMsg = `EEXIST: file already exists, mkdir '${fakePath}'`;
+                        let err = new Error(errorMsg);
+                        err.code = "EEXIST";
+                        return err;
+                    }
+
+                    //region mocks
+
+                    // for addMetaData
+                    spyOn(fse, "ensureFileSync").and.stub();
+                    spyOn(fs, "rmdirSync").and.stub();
+                    let times = 0;
+                    spyOn(fs, "mkdirSync").and.callFake(() => {
+                        times++;
+                        if (times === 1) {
+                            throw makeFEXISTErr();
+                        }
+                    });
+                    spyOn(fse, "readJsonSync").and.callFake(() => {
+                        return "[]";
+                    });
+                    spyOn(fse, "outputJsonSync").and.stub();
+
+                    spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
+                        if (fpath.endsWith("combined.json")) {
+                            return true;
+                        }
+                        throw new Error(errorMsg + fpath);
+                    });
+
+                    // for addHTMLReport
+                    spyOn(fse, 'copySync').and.stub();
+                    spyOn(fs, 'readFileSync').and.returnValue(
+                        function () {
+                            this.toString = function () {
+                                return "";
+                            };
+                        }
+                    );
+                    spyOn(fs, 'createWriteStream').and.returnValue({
+                        write: jasmine.createSpy('write'),
+                        end: jasmine.createSpy('end')
+                    });
+
+                    // misc
+                    spyOn(console, 'error').and.stub();
+                    //end region mocks
+
+                    const metaData = {};
+                    const options = {
+                        docName: "report.html",
+                        sortFunction: defaultSortFunction
+                    };
+                    util.addMetaData(metaData, fakePath, options);
+
+                    expect(console.error).not.toHaveBeenCalled();
+                });
+
 
             });
 
@@ -287,9 +362,6 @@ describe('unit tests', () => {
                     spyOn(fse, "outputJsonSync").and.stub();
 
                     spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                        if (fpath.endsWith(".lock")) {
-                            return false;
-                        }
                         if (fpath.endsWith("combined.json")) {
                             return true;
                         }
@@ -299,11 +371,11 @@ describe('unit tests', () => {
                     // for addHTMLReport
                     spyOn(fse, 'copySync').and.stub();
                     spyOn(fs, 'readFileSync').and.callFake(() => {
-                        return new Buffer(htmlTemplate);
+                        return Buffer.from(htmlTemplate);
                     });
 
 
-                    spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
+                    spyOn(fs, 'createWriteStream').and.callFake(() => {
                         throw new Error("Weird Error writing file");
                     });
 
@@ -342,9 +414,6 @@ describe('unit tests', () => {
                     spyOn(fse, "outputJsonSync").and.stub();
 
                     spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                        if (fpath.endsWith(".lock")) {
-                            return false;
-                        }
                         if (fpath.endsWith("combined.json")) {
                             return true;
                         }
@@ -354,7 +423,7 @@ describe('unit tests', () => {
                     // for addHTMLReport
                     spyOn(fse, 'copySync').and.stub();
                     spyOn(fs, 'readFileSync').and.callFake(() => {
-                        return new Buffer(htmlTemplate);
+                        return Buffer.from(htmlTemplate);
                     });
 
                     let htmlContents;
@@ -407,9 +476,6 @@ describe('unit tests', () => {
                     spyOn(fse, "outputJsonSync").and.stub();
 
                     spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                        if (fpath.endsWith(".lock")) {
-                            return false;
-                        }
                         if (fpath.endsWith("combined.json")) {
                             return true;
                         }
@@ -419,7 +485,7 @@ describe('unit tests', () => {
                     // for addHTMLReport
                     spyOn(fse, 'copySync').and.stub();
                     spyOn(fs, 'readFileSync').and.callFake(() => {
-                        return new Buffer(htmlTemplate);
+                        return Buffer.from(htmlTemplate);
                     });
 
                     let htmlContents;
@@ -473,9 +539,6 @@ describe('unit tests', () => {
                     spyOn(fse, "outputJsonSync").and.stub();
 
                     spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                        if (fpath.endsWith(".lock")) {
-                            return false;
-                        }
                         if (fpath.endsWith("combined.json")) {
                             return true;
                         }
@@ -485,7 +548,7 @@ describe('unit tests', () => {
                     // for addHTMLReport
                     spyOn(fse, 'copySync').and.stub();
                     spyOn(fs, 'readFileSync').and.callFake(() => {
-                        return new Buffer(htmlTemplate);
+                        return Buffer.from(htmlTemplate);
                     });
 
                     let htmlContents;
@@ -544,9 +607,6 @@ describe('unit tests', () => {
                     spyOn(fse, "outputJsonSync").and.stub();
 
                     spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                        if (fpath.endsWith(".lock")) {
-                            return false;
-                        }
                         if (fpath.endsWith("combined.json")) {
                             return true;
                         }
@@ -556,7 +616,7 @@ describe('unit tests', () => {
                     // for addHTMLReport
                     spyOn(fse, 'copySync').and.stub();
                     spyOn(fs, 'readFileSync').and.callFake(() => {
-                        return new Buffer(jsTemplate);
+                        return Buffer.from(jsTemplate);
                     });
 
                     let jsContents;
@@ -617,9 +677,6 @@ describe('unit tests', () => {
                         spyOn(fse, "outputJsonSync").and.stub();
 
                         spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith(".lock")) {
-                                return false;
-                            }
                             if (fpath.endsWith("combined.json")) {
                                 return true;
                             }
@@ -629,7 +686,7 @@ describe('unit tests', () => {
                         // for addHTMLReport
                         spyOn(fse, 'copySync').and.stub();
                         spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return new Buffer(jsTemplate);
+                            return Buffer.from(jsTemplate);
                         });
 
                         let jsContents;
@@ -686,9 +743,6 @@ describe('unit tests', () => {
                     spyOn(fse, "outputJsonSync").and.stub();
 
                     spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                        if (fpath.endsWith(".lock")) {
-                            return false;
-                        }
                         if (fpath.endsWith("combined.json")) {
                             return true;
                         }
@@ -698,7 +752,7 @@ describe('unit tests', () => {
                     // for addHTMLReport
                     spyOn(fse, 'copySync').and.stub();
                     spyOn(fs, 'readFileSync').and.callFake(() => {
-                        return new Buffer(jsTemplate);
+                        return Buffer.from(jsTemplate);
                     });
 
                     let jsContents;
@@ -733,7 +787,7 @@ describe('unit tests', () => {
                     util.addMetaData(metaData, fakePath, options);
 
                     expect(console.error).not.toHaveBeenCalled();
-                    expect(jsContents).not.toContain('<Sort Function Replacement>')
+                    expect(jsContents).not.toContain('<Sort Function Replacement>');
                     expect(/results\.sort\(/.test(jsContents)).toBeTruthy();
                 });
                 //}
@@ -756,9 +810,6 @@ describe('unit tests', () => {
                         spyOn(fse, "outputJsonSync").and.stub();
 
                         spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith(".lock")) {
-                                return false;
-                            }
                             if (fpath.endsWith("combined.json")) {
                                 return true;
                             }
@@ -768,7 +819,7 @@ describe('unit tests', () => {
                         // for addHTMLReport
                         spyOn(fse, 'copySync').and.stub();
                         spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return new Buffer(jsTemplate);
+                            return Buffer.from(jsTemplate);
                         });
 
                         let jsContents;
@@ -828,9 +879,6 @@ describe('unit tests', () => {
                         spyOn(fse, "outputJsonSync").and.stub();
 
                         spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith(".lock")) {
-                                return false;
-                            }
                             if (fpath.endsWith("combined.json")) {
                                 return true;
                             }
@@ -840,7 +888,7 @@ describe('unit tests', () => {
                         // for addHTMLReport
                         spyOn(fse, 'copySync').and.stub();
                         spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return new Buffer(jsTemplate);
+                            return Buffer.from(jsTemplate);
                         });
 
                         let jsContents;
@@ -896,9 +944,6 @@ describe('unit tests', () => {
                         spyOn(fse, "outputJsonSync").and.stub();
 
                         spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith(".lock")) {
-                                return false;
-                            }
                             if (fpath.endsWith("combined.json")) {
                                 return true;
                             }
@@ -908,7 +953,7 @@ describe('unit tests', () => {
                         // for addHTMLReport
                         spyOn(fse, 'copySync').and.stub();
                         spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return new Buffer(jsTemplate);
+                            return Buffer.from(jsTemplate);
                         });
 
                         let jsContents;
@@ -976,9 +1021,6 @@ describe('unit tests', () => {
                         spyOn(fse, "outputJsonSync").and.stub();
 
                         spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith(".lock")) {
-                                return false;
-                            }
                             if (fpath.endsWith("combined.json")) {
                                 return true;
                             }
@@ -988,7 +1030,7 @@ describe('unit tests', () => {
                         // for addHTMLReport
                         spyOn(fse, 'copySync').and.stub();
                         spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return new Buffer(jsTemplate);
+                            return Buffer.from(jsTemplate);
                         });
 
                         let jsContents;
@@ -1044,9 +1086,6 @@ describe('unit tests', () => {
                         spyOn(fse, "outputJsonSync").and.stub();
 
                         spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith(".lock")) {
-                                return false;
-                            }
                             if (fpath.endsWith("combined.json")) {
                                 return true;
                             }
@@ -1056,7 +1095,7 @@ describe('unit tests', () => {
                         // for addHTMLReport
                         spyOn(fse, 'copySync').and.stub();
                         spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return new Buffer(jsTemplate);
+                            return Buffer.from(jsTemplate);
                         });
 
                         let jsContents;

From 89f1b3a5286836e80e27db0c6382587a9035ed05 Mon Sep 17 00:00:00 2001
From: miller45 <rklein@rosen-group.com>
Date: Thu, 6 Jun 2019 14:22:04 +0200
Subject: [PATCH 02/12] removed tests for oldversion

---
 tests/reporter/util_metadata_test.js | 523 ++++++---------------------
 1 file changed, 114 insertions(+), 409 deletions(-)

diff --git a/tests/reporter/util_metadata_test.js b/tests/reporter/util_metadata_test.js
index 58568ed..8df9601 100644
--- a/tests/reporter/util_metadata_test.js
+++ b/tests/reporter/util_metadata_test.js
@@ -8,8 +8,6 @@ const defaultSortFunction = (a, b) => {
     return (a + b) ? 0 : 0; //
 };
 
-const oldVersion = false; // upcoming need different handling of replacesments
-
 describe('unit tests', () => {
 
     describe('reporter utils', () => {
@@ -588,9 +586,6 @@ describe('unit tests', () => {
 
                 it('replaces results in app.js', () => {
                     let jsTemplate = "    var results = [];//'<Results Replacement>';   ";
-                    if (oldVersion) {
-                        jsTemplate = "    var results = '<Results Replacement>';";
-                    }
 
                     const errorMsg = "mock case not expected: ";
                     const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
@@ -651,80 +646,77 @@ describe('unit tests', () => {
                     };
                     util.addMetaData(metaData, fakePath, options);
                     expect(console.error).not.toHaveBeenCalled();
-                    if (oldVersion) {
-                        expect(jsContents.length).toEqual(15475);
-                    } else {
-                        //fs.writeFileSync(dbgFile,jsContents,'utf-8');
-                        expect(jsContents.length).toEqual(1920);
-                    }
+
+                    // fs.writeFileSync(dbgFile,jsContents,'utf-8');
+                    expect(jsContents.length).toEqual(1920);
+
 
                 });
-                if (!oldVersion) { // use ajax not yet implemwented
-                    it('replaces results with [] clientDefaults.useAjax is true in app.js', () => {
-                        const jsTemplate = "    var results = [];//'<Results Replacement>';  ";
-                        const errorMsg = "mock case not expected: ";
-                        const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
-
-                        //region mocks
-
-                        // for addMetaData
-                        spyOn(fse, "ensureFileSync").and.stub();
-                        spyOn(fs, "rmdirSync").and.stub();
-                        spyOn(fs, "mkdirSync").and.stub();
-                        spyOn(fse, "readJsonSync").and.callFake(() => {
-                            return "[]";
-                        });
-                        spyOn(fse, "outputJsonSync").and.stub();
-
-                        spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith("combined.json")) {
-                                return true;
-                            }
-                            throw new Error(errorMsg + fpath);
-                        });
-
-                        // for addHTMLReport
-                        spyOn(fse, 'copySync').and.stub();
-                        spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return Buffer.from(jsTemplate);
-                        });
-
-                        let jsContents;
-                        spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
-                            if (wfile.endsWith(".js")) {
-                                return {
-                                    write: function (txt) {
-                                        jsContents = txt;
-                                    },
-                                    end: jasmine.createSpy('end')
-                                };
-                            }
+
+                it('replaces results with [] clientDefaults.useAjax is true in app.js', () => {
+                    const jsTemplate = "    var results = [];//'<Results Replacement>';  ";
+                    const errorMsg = "mock case not expected: ";
+                    const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
+
+                    //region mocks
+
+                    // for addMetaData
+                    spyOn(fse, "ensureFileSync").and.stub();
+                    spyOn(fs, "rmdirSync").and.stub();
+                    spyOn(fs, "mkdirSync").and.stub();
+                    spyOn(fse, "readJsonSync").and.callFake(() => {
+                        return "[]";
+                    });
+                    spyOn(fse, "outputJsonSync").and.stub();
+
+                    spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
+                        if (fpath.endsWith("combined.json")) {
+                            return true;
+                        }
+                        throw new Error(errorMsg + fpath);
+                    });
+
+                    // for addHTMLReport
+                    spyOn(fse, 'copySync').and.stub();
+                    spyOn(fs, 'readFileSync').and.callFake(() => {
+                        return Buffer.from(jsTemplate);
+                    });
+
+                    let jsContents;
+                    spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
+                        if (wfile.endsWith(".js")) {
                             return {
-                                write: jasmine.createSpy('write'),
+                                write: function (txt) {
+                                    jsContents = txt;
+                                },
                                 end: jasmine.createSpy('end')
                             };
+                        }
+                        return {
+                            write: jasmine.createSpy('write'),
+                            end: jasmine.createSpy('end')
+                        };
 
-                        });
+                    });
 
-                        // misc
-                        spyOn(console, 'error').and.stub();
-                        //end region mocks
+                    // misc
+                    spyOn(console, 'error').and.stub();
+                    //end region mocks
 
-                        const metaData = testResults[0];
-                        const options = {
-                            docName: "report.html",
-                            docTitle: "my super fance document title",
-                            sortFunction: defaultSortFunction,
-                            clientDefaults: {
-                                useAjax: true
-                            }
-                        };
-                        util.addMetaData(metaData, fakePath, options);
+                    const metaData = testResults[0];
+                    const options = {
+                        docName: "report.html",
+                        docTitle: "my super fance document title",
+                        sortFunction: defaultSortFunction,
+                        clientDefaults: {
+                            useAjax: true
+                        }
+                    };
+                    util.addMetaData(metaData, fakePath, options);
 
-                        expect(console.error).not.toHaveBeenCalled();
-                        expect(jsContents).toEqual('    var results = [];  ');
-                    });
-                }
+                    expect(console.error).not.toHaveBeenCalled();
+                    expect(jsContents).toEqual('    var results = [];  ');
+                });
 
                 it('replaces sortfunction in app.js', () => {
                     const jsTemplate = "        this.results = results.sort(defaultSortFunction/*<Sort Function Replacement>*/);  ";
@@ -790,361 +782,74 @@ describe('unit tests', () => {
                     expect(jsContents).not.toContain('<Sort Function Replacement>');
                     expect(/results\.sort\(/.test(jsContents)).toBeTruthy();
                 });
-                //}
-
-                if (!oldVersion) {
-                    it('replaces clientDefaults in app.js', () => {
-                        const jsTemplate = "    var clientDefaults = {};//'<Client Defaults Replacement>';  ";
-                        const errorMsg = "mock case not expected: ";
-                        const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
-
-                        //region mocks
-
-                        // for addMetaData
-                        spyOn(fse, "ensureFileSync").and.stub();
-                        spyOn(fs, "rmdirSync").and.stub();
-                        spyOn(fs, "mkdirSync").and.stub();
-                        spyOn(fse, "readJsonSync").and.callFake(() => {
-                            return "[]";
-                        });
-                        spyOn(fse, "outputJsonSync").and.stub();
-
-                        spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith("combined.json")) {
-                                return true;
-                            }
-                            throw new Error(errorMsg + fpath);
-                        });
-
-                        // for addHTMLReport
-                        spyOn(fse, 'copySync').and.stub();
-                        spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return Buffer.from(jsTemplate);
-                        });
-
-                        let jsContents;
-                        spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
-                            if (wfile.endsWith(".js")) {
-                                return {
-                                    write: function (txt) {
-                                        jsContents = txt;
-                                    },
-                                    end: jasmine.createSpy('end')
-                                };
-                            }
-                            return {
-                                write: jasmine.createSpy('write'),
-                                end: jasmine.createSpy('end')
-                            };
-
-                        });
-
-                        // misc
-                        spyOn(console, 'error').and.stub();
-                        //end region mocks
-
-                        const metaData = testResults[0];
-                        const options = {
-                            docName: "report.html",
-                            docTitle: "my super fance document title",
-                            sortFunction: defaultSortFunction,
-                            clientDefaults: {
-                                searchSettings: {},
-                                columnSettings: {}
-                            },
-                            prepareAssets: true
-                        };
-                        util.addMetaData(metaData, fakePath, options);
-
-                        expect(console.error).not.toHaveBeenCalled();
-                        const jsContentsWoLF = jsContents.replace(/\r\n/g, "").replace(/\n/g, "");
-                        expect(jsContentsWoLF).toEqual('    var clientDefaults = {    "searchSettings": {},    "columnSettings": {}};  ');
-                    });
-                } else {
-                    it('replaces columnsettings in app.js with defaults', () => {
-                        const jsTemplate = "    var initialColumnSettings = '<Column Settings Replacement>'" +
-                            "; // enable customisation of visible columns on first page hit";
-                        const errorMsg = "mock case not expected: ";
-                        const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
-
-                        //region mocks
-
-                        // for addMetaData
-                        spyOn(fse, "ensureFileSync").and.stub();
-                        spyOn(fs, "rmdirSync").and.stub();
-                        spyOn(fs, "mkdirSync").and.stub();
-                        spyOn(fse, "readJsonSync").and.callFake(() => {
-                            return "[]";
-                        });
-                        spyOn(fse, "outputJsonSync").and.stub();
-
-                        spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith("combined.json")) {
-                                return true;
-                            }
-                            throw new Error(errorMsg + fpath);
-                        });
-
-                        // for addHTMLReport
-                        spyOn(fse, 'copySync').and.stub();
-                        spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return Buffer.from(jsTemplate);
-                        });
-
-                        let jsContents;
-                        spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
-                            if (wfile.endsWith(".js")) {
-                                return {
-                                    write: function (txt) {
-                                        jsContents = txt;
-                                    },
-                                    end: jasmine.createSpy('end')
-                                };
-                            }
-                            return {
-                                write: jasmine.createSpy('write'),
-                                end: jasmine.createSpy('end')
-                            };
 
-                        });
-
-                        // misc
-                        spyOn(console, 'error').and.stub();
-                        //end region mocks
+                it('replaces clientDefaults in app.js', () => {
+                    const jsTemplate = "    var clientDefaults = {};//'<Client Defaults Replacement>';  ";
+                    const errorMsg = "mock case not expected: ";
+                    const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
 
-                        const metaData = testResults[0];
-                        const options = {
-                            docName: "report.html",
-                            docTitle: "my super fance document title",
-                            sortFunction: defaultSortFunction,
-                            prepareAssets: true
-                        };
-                        util.addMetaData(metaData, fakePath, options);
+                    //region mocks
 
-                        expect(console.error).not.toHaveBeenCalled();
-                        expect(/'<Column Settings Replacement>'/.test(jsContents)).toBeFalsy();
-                        expect(/=[ ]*undefined/.test(jsContents)).toBeTruthy("columnSettings should be undefined");
+                    // for addMetaData
+                    spyOn(fse, "ensureFileSync").and.stub();
+                    spyOn(fs, "rmdirSync").and.stub();
+                    spyOn(fs, "mkdirSync").and.stub();
+                    spyOn(fse, "readJsonSync").and.callFake(() => {
+                        return "[]";
                     });
+                    spyOn(fse, "outputJsonSync").and.stub();
 
-                    it('replaces columnsettings in app.js with options', () => {
-                        const jsTemplate = "    var initialColumnSettings = '<Column Settings Replacement>'" +
-                            "; // enable customisation of visible columns on first page hit";
-                        const errorMsg = "mock case not expected: ";
-                        const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
-
-                        //region mocks
-
-                        // for addMetaData
-                        spyOn(fse, "ensureFileSync").and.stub();
-                        spyOn(fs, "rmdirSync").and.stub();
-                        spyOn(fs, "mkdirSync").and.stub();
-                        spyOn(fse, "readJsonSync").and.callFake(() => {
-                            return "[]";
-                        });
-                        spyOn(fse, "outputJsonSync").and.stub();
-
-                        spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith("combined.json")) {
-                                return true;
-                            }
-                            throw new Error(errorMsg + fpath);
-                        });
-
-                        // for addHTMLReport
-                        spyOn(fse, 'copySync').and.stub();
-                        spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return Buffer.from(jsTemplate);
-                        });
-
-                        let jsContents;
-                        spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
-                            if (wfile.endsWith(".js")) {
-                                return {
-                                    write: function (txt) {
-                                        jsContents = txt;
-                                    },
-                                    end: jasmine.createSpy('end')
-                                };
-                            }
-                            return {
-                                write: jasmine.createSpy('write'),
-                                end: jasmine.createSpy('end')
-                            };
+                    spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
+                        if (fpath.endsWith("combined.json")) {
+                            return true;
+                        }
+                        throw new Error(errorMsg + fpath);
+                    });
 
-                        });
-
-                        // misc
-                        spyOn(console, 'error').and.stub();
-                        //end region mocks
-
-                        const metaData = testResults[0];
-                        const options = {
-                            docName: "report.html",
-                            docTitle: "my super fance document title",
-                            sortFunction: defaultSortFunction,
-                            columnSettings: {
-                                displayTime: true,
-                                displayBrowser: false,
-                                displaySessionId: true,
-                                inlineScreenshots: false
-                            },
-                            prepareAssets: true
-                        };
-                        util.addMetaData(metaData, fakePath, options);
-
-                        expect(console.error).not.toHaveBeenCalled();
-                        expect(jsContents).toBeDefined();
-                        expect(/'<Column Settings Replacement>'/.test(jsContents)).toBeFalsy();
-                        let match = /var initialColumnSettings[ ]*=[ ]*([^;]+);/.exec(jsContents);
-                        expect(match).toBeDefined();
-                        let extrSettings = match[1];
-                        expect(extrSettings).toEqual(
-                            '{"displayTime":true,"displayBrowser":false,"displaySessionId":true,"inlineScreenshots":false}'
-                        );
+                    // for addHTMLReport
+                    spyOn(fse, 'copySync').and.stub();
+                    spyOn(fs, 'readFileSync').and.callFake(() => {
+                        return Buffer.from(jsTemplate);
                     });
 
-                    it('replaces searchSettings in app.js with defaults', () => {
-                        const jsTemplate = "}, '<Search Settings Replacement>'); " +
-                            "// enable customisation of search settings on first page hit";
-                        const errorMsg = "mock case not expected: ";
-                        const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
-
-                        //region mocks
-
-                        // for addMetaData
-                        spyOn(fse, "ensureFileSync").and.stub();
-                        spyOn(fs, "rmdirSync").and.stub();
-                        spyOn(fs, "mkdirSync").and.stub();
-                        spyOn(fse, "readJsonSync").and.callFake(() => {
-                            return "[]";
-                        });
-                        spyOn(fse, "outputJsonSync").and.stub();
-
-                        spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith("combined.json")) {
-                                return true;
-                            }
-                            throw new Error(errorMsg + fpath);
-                        });
-
-                        // for addHTMLReport
-                        spyOn(fse, 'copySync').and.stub();
-                        spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return Buffer.from(jsTemplate);
-                        });
-
-                        let jsContents;
-                        spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
-                            if (wfile.endsWith(".js")) {
-                                return {
-                                    write: function (txt) {
-                                        jsContents = txt;
-                                    },
-                                    end: jasmine.createSpy('end')
-                                };
-                            }
+                    let jsContents;
+                    spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
+                        if (wfile.endsWith(".js")) {
                             return {
-                                write: jasmine.createSpy('write'),
+                                write: function (txt) {
+                                    jsContents = txt;
+                                },
                                 end: jasmine.createSpy('end')
                             };
-
-                        });
-
-                        // misc
-                        spyOn(console, 'error').and.stub();
-                        //end region mocks
-
-                        const metaData = testResults[0];
-                        const options = {
-                            docName: "report.html",
-                            docTitle: "my super fance document title",
-                            sortFunction: defaultSortFunction,
-                            prepareAssets: true
+                        }
+                        return {
+                            write: jasmine.createSpy('write'),
+                            end: jasmine.createSpy('end')
                         };
-                        util.addMetaData(metaData, fakePath, options);
 
-                        expect(console.error).not.toHaveBeenCalled();
-                        expect(/'<Search Settings Replacement>'/.test(jsContents)).toBeFalsy("placeholders not replaced");
-                        expect(/\{\}/.test(jsContents)).toBeTruthy("didt not find {} as replacement");
                     });
 
-                    it('replaces searchSettings in app.js with options', () => {
-                        const jsTemplate = "\}, '<Search Settings Replacement>'); " +
-                            "// enable customisation of search settings on first page hit";
-                        const errorMsg = "mock case not expected: ";
-                        const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
-
-                        //region mocks
-
-                        // for addMetaData
-                        spyOn(fse, "ensureFileSync").and.stub();
-                        spyOn(fs, "rmdirSync").and.stub();
-                        spyOn(fs, "mkdirSync").and.stub();
-                        spyOn(fse, "readJsonSync").and.callFake(() => {
-                            return "[]";
-                        });
-                        spyOn(fse, "outputJsonSync").and.stub();
-
-                        spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
-                            if (fpath.endsWith("combined.json")) {
-                                return true;
-                            }
-                            throw new Error(errorMsg + fpath);
-                        });
-
-                        // for addHTMLReport
-                        spyOn(fse, 'copySync').and.stub();
-                        spyOn(fs, 'readFileSync').and.callFake(() => {
-                            return Buffer.from(jsTemplate);
-                        });
-
-                        let jsContents;
-                        spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
-                            if (wfile.endsWith(".js")) {
-                                return {
-                                    write: function (txt) {
-                                        jsContents = txt;
-                                    },
-                                    end: jasmine.createSpy('end')
-                                };
-                            }
-                            return {
-                                write: jasmine.createSpy('write'),
-                                end: jasmine.createSpy('end')
-                            };
+                    // misc
+                    spyOn(console, 'error').and.stub();
+                    //end region mocks
 
-                        });
-
-                        // misc
-                        spyOn(console, 'error').and.stub();
-                        //end region mocks
-
-                        const metaData = testResults;
-                        const options = {
-                            docName: "report.html",
-                            docTitle: "my super fance document title",
-                            sortFunction: defaultSortFunction,
-                            searchSettings: {
-                                allselected: false,
-                                passed: false,
-                                failed: false,
-                                pending: true,
-                                withLog: true
-                            },
-                            prepareAssets: true
-                        };
-                        util.addMetaData(metaData, fakePath, options);
-
-                        expect(console.error).not.toHaveBeenCalled();
-                        expect(/'<Search Settings Replacement>'/.test(jsContents)).toBeFalsy("placeholders not replaced");
-                        let match = /\}[ ]*,[ ]*([^;]+);/.exec(jsContents);
-                        expect(match).toBeDefined();
-                        let extrSettings = match[1];
-                        expect(extrSettings).toEqual(
-                            '{"allselected":false,"passed":false,"failed":false,"pending":true,"withLog":true})'
-                        );
-                    });
-                }
+                    const metaData = testResults[0];
+                    const options = {
+                        docName: "report.html",
+                        docTitle: "my super fance document title",
+                        sortFunction: defaultSortFunction,
+                        clientDefaults: {
+                            searchSettings: {},
+                            columnSettings: {}
+                        },
+                        prepareAssets: true
+                    };
+                    util.addMetaData(metaData, fakePath, options);
+
+                    expect(console.error).not.toHaveBeenCalled();
+                    const jsContentsWoLF = jsContents.replace(/\r\n/g, "").replace(/\n/g, "");
+                    expect(jsContentsWoLF).toEqual('    var clientDefaults = {    "searchSettings": {},    "columnSettings": {}};  ');
+                });
             });
 
         });

From 0671c3978f0b16a90319afaaadf154f6b30909a5 Mon Sep 17 00:00:00 2001
From: miller45 <rklein@rosen-group.com>
Date: Thu, 6 Jun 2019 14:39:01 +0200
Subject: [PATCH 03/12] add tests for css inline option

---
 tests/reporter/util_metadata_test.js | 63 ++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/tests/reporter/util_metadata_test.js b/tests/reporter/util_metadata_test.js
index 8df9601..9b51a75 100644
--- a/tests/reporter/util_metadata_test.js
+++ b/tests/reporter/util_metadata_test.js
@@ -850,6 +850,69 @@ describe('unit tests', () => {
                     const jsContentsWoLF = jsContents.replace(/\r\n/g, "").replace(/\n/g, "");
                     expect(jsContentsWoLF).toEqual('    var clientDefaults = {    "searchSettings": {},    "columnSettings": {}};  ');
                 });
+
+                it('adds customCssInline if configured so', () => {
+                    const htmlTemplate = '<!-- Here will be CSS placed -->';
+                    const errorMsg = "mock case not expected: ";
+                    const fakePath = "./not/existing/path/" + util.generateGuid() + "/subdir";
+
+                    //region mocks
+
+                    // for addMetaData
+                    spyOn(fse, "ensureFileSync").and.stub();
+                    spyOn(fs, "rmdirSync").and.stub();
+                    spyOn(fs, "mkdirSync").and.stub();
+                    spyOn(fse, "readJsonSync").and.callFake(() => {
+                        return "[]";
+                    });
+                    spyOn(fse, "outputJsonSync").and.stub();
+
+                    spyOn(fse, 'pathExistsSync').and.callFake((fpath) => {
+                        if (fpath.endsWith("combined.json")) {
+                            return true;
+                        }
+                        throw new Error(errorMsg + fpath);
+                    });
+
+                    // for addHTMLReport
+                    spyOn(fse, 'copySync').and.stub();
+                    spyOn(fs, 'readFileSync').and.callFake(() => {
+                        return Buffer.from(htmlTemplate);
+                    });
+
+                    let htmlContents;
+                    spyOn(fs, 'createWriteStream').and.callFake((wfile) => {
+                        if (wfile.endsWith(".html")) {
+                            return {
+                                write: function (txt) {
+                                    htmlContents = txt;
+                                },
+                                end: jasmine.createSpy('end')
+                            };
+                        }
+                        return {
+                            write: jasmine.createSpy('write'),
+                            end: jasmine.createSpy('end')
+                        };
+
+                    });
+
+                    // misc
+                    spyOn(console, 'error').and.stub();
+                    //end region mocks
+
+                    const metaData = {};
+                    const options = {
+                        docName: "report.html",
+                        sortFunction: defaultSortFunction,
+                        customCssInline: ".myspecial-custom-class { font-face: bold; }",
+                        prepareAssets: true
+                    };
+                    util.addMetaData(metaData, fakePath, options);
+
+                    expect(console.error).not.toHaveBeenCalled();
+                    expect(htmlContents).toEqual('<link rel="stylesheet" href="assets/bootstrap.css"> <style type="text/css">.myspecial-custom-class { font-face: bold; }</style>');
+                });
             });
 
         });

From 75397064fa93a92d48773be30276b867f2677d17 Mon Sep 17 00:00:00 2001
From: Ramon Klein <gmse45forse@googlemail.com>
Date: Tue, 11 Jun 2019 23:36:13 +0200
Subject: [PATCH 04/12] Update README.md

---
 README.md | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/README.md b/README.md
index 56f3543..9121655 100644
--- a/README.md
+++ b/README.md
@@ -279,6 +279,17 @@ Default is `report.html`.
     , cssOverrideFile: 'css/style.css'
  });
  ```
+ 
+ ### Option to add inline CSS in reporter (optional)
+ If you want to tweak some details you can add/overide css rules into the page.
+ 
+ This example will make the image/browserlogs modal window to occupy more screen real-estate
+ ```javascript
+ new HtmlReporter({
+    baseDirectory: 'tmp/screenshots'
+    , customCssInline: `.modal-lg { width: 88% }`,
+ });
+ ```
 
 ### Preserve base directory (optional)
  You can preserve (or clear) the base directory using `preserveDirectory:` option:

From fb91b3dfa3c89a80c3ffeefbaf2d70aaec2a012a Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Wed, 12 Jun 2019 13:51:51 +0200
Subject: [PATCH 05/12] First update to take multiple screenshots

---
 app/reporter.js                      |   5 +-
 examples/protractor.jasmine2.conf.js |  47 ++-
 index.js                             | 132 ++++----
 lib/assets/bootstrap.css             |   7 +-
 lib/assets/main.css                  |  11 +-
 lib/index.html                       | 452 +++++++++++++++------------
 6 files changed, 393 insertions(+), 261 deletions(-)

diff --git a/app/reporter.js b/app/reporter.js
index de7c72b..7dd4696 100644
--- a/app/reporter.js
+++ b/app/reporter.js
@@ -175,6 +175,7 @@ function ScreenshotReporter(options) {
     this.pathBuilder = options.pathBuilder || defaultPathBuilder;
     this.docTitle = options.docTitle || 'Test Results';
     this.docName = options.docName || 'report.html';
+    this.screenshotArray = options.screenshotArray || [];
     this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder;
     this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder;
     this.sortFunction = options.sortFunction || sortFunction;
@@ -342,7 +343,9 @@ class Jasmine2Reporter {
         let considerScreenshot = !(this._screenshotReporter.takeScreenShotsOnlyForFailedSpecs && result.status === 'passed')
 
         if (considerScreenshot) {
-            metaData.screenShotFile = path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName);
+            this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+            metaData.screenShotFile = [...this._screenshotReporter.screenshotArray];
+            this._screenshotReporter.screenshotArray.length = 0;
         }
 
         if (result.browserLogs) {
diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js
index 7306ab7..56b8bfe 100644
--- a/examples/protractor.jasmine2.conf.js
+++ b/examples/protractor.jasmine2.conf.js
@@ -1,5 +1,8 @@
 var HtmlReporter = require('protractor-beautiful-reporter');
-var path = require('path');
+var util = require('../app/util'),
+  _ = require('underscore'),
+ path = require('path');
+
 
 // ----- Config example for Jasmine 2 -----
 
@@ -84,7 +87,7 @@ exports.config = {
 
     onPrepare: function () {
         // Add a screenshot reporter:
-        jasmine.getEnv().addReporter(new HtmlReporter({
+        var reporter = new HtmlReporter({
             preserveDirectory: false,
             takeScreenShotsOnlyForFailedSpecs: true,
             screenshotsSubfolder: 'images',
@@ -108,7 +111,45 @@ exports.config = {
                     // capabilities.get('browserName'),
                     validDescriptions.join('-'));
             }
-        }).getJasmine2Reporter());
+        })
+        jasmine.getEnv().addReporter(
+            reporter.getJasmine2Reporter()
+        );
+        ExpectFailed(reporter);
+        function ExpectFailed(rep) {
+            var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult;
+            jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) {
+              var self = rep;
+      
+              var makeScreenshotsFromEachBrowsers = false;
+      
+              if (!passed) {
+                makeScreenshotsFromEachBrowsers = true;
+              }
+              if (makeScreenshotsFromEachBrowsers) {
+                let tst = util.generateGuid();
+                let screenShotFileName = path.basename(tst + '.png');
+                let screenShotFilePath = path.join(path.dirname(self.baseName + '.png'), self.screenshotsSubfolder);
+                let screenShotPath = path.join(self.baseDirectory, screenShotFilePath, screenShotFileName);
+                self.screenshotArray.push(path.join(self.screenshotsSubfolder, screenShotFileName));                
+                try {
+                  browser.takeScreenshot().then(png => {
+                    util.storeScreenShot(png, screenShotPath);
+                  });
+                }
+                catch (ex) {
+                  if (ex['name'] === 'NoSuchWindowError') {
+                    console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed');
+                  } else {
+                    console.error(ex);
+                    console.error('Protractor-beautiful-reporter could not take the screenshot');
+                  }
+                  metaData.screenShotFile = void 0;
+                }
+              }
+              return originalAddExpectationResult.apply(this, arguments);
+            }
+          }
     },
 
     jasmineNodeOpts: {
diff --git a/index.js b/index.js
index a40fb41..045bfba 100644
--- a/index.js
+++ b/index.js
@@ -224,12 +224,6 @@ exports.f = __webpack_require__(7) ? Object.defineProperty : function defineProp
 
 /***/ }),
 /* 9 */
-/***/ (function(module, exports) {
-
-module.exports = require("path");
-
-/***/ }),
-/* 10 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 7.1.13 ToObject(argument)
@@ -239,6 +233,12 @@ module.exports = function (it) {
 };
 
 
+/***/ }),
+/* 10 */
+/***/ (function(module, exports) {
+
+module.exports = require("path");
+
 /***/ }),
 /* 11 */
 /***/ (function(module, exports, __webpack_require__) {
@@ -680,7 +680,7 @@ exports.f = __webpack_require__(7) ? gOPD : function getOwnPropertyDescriptor(O,
 
 // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
 var has = __webpack_require__(17);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var IE_PROTO = __webpack_require__(91)('IE_PROTO');
 var ObjectProto = Object.prototype;
 
@@ -741,7 +741,7 @@ module.exports = function (it) {
 /* 23 */
 /***/ (function(module, exports) {
 
-var core = module.exports = { version: '2.6.5' };
+var core = module.exports = { version: '2.6.9' };
 if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
 
 
@@ -812,7 +812,7 @@ module.exports = function (it) {
 // 6 -> Array#findIndex
 var ctx = __webpack_require__(24);
 var IObject = __webpack_require__(53);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toLength = __webpack_require__(6);
 var asc = __webpack_require__(75);
 module.exports = function (TYPE, $create) {
@@ -977,7 +977,7 @@ if (__webpack_require__(7)) {
   var has = __webpack_require__(17);
   var classof = __webpack_require__(48);
   var isObject = __webpack_require__(4);
-  var toObject = __webpack_require__(10);
+  var toObject = __webpack_require__(9);
   var isArrayIter = __webpack_require__(82);
   var create = __webpack_require__(39);
   var getPrototypeOf = __webpack_require__(19);
@@ -2381,7 +2381,7 @@ module.exports = function (S, index, unicode) {
 "use strict";
 // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
 
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toAbsoluteIndex = __webpack_require__(45);
 var toLength = __webpack_require__(6);
 module.exports = function fill(value /* , start = 0, end = @length */) {
@@ -3352,7 +3352,7 @@ module.exports = function (it, msg) {
 "use strict";
 // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
 
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toAbsoluteIndex = __webpack_require__(45);
 var toLength = __webpack_require__(6);
 
@@ -3396,7 +3396,7 @@ module.exports = function (iter, ITERATOR) {
 /***/ (function(module, exports, __webpack_require__) {
 
 var aFunction = __webpack_require__(12);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var IObject = __webpack_require__(53);
 var toLength = __webpack_require__(6);
 
@@ -3901,10 +3901,11 @@ module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh)
 "use strict";
 
 // 19.1.2.1 Object.assign(target, source, ...)
+var DESCRIPTORS = __webpack_require__(7);
 var getKeys = __webpack_require__(41);
 var gOPS = __webpack_require__(64);
 var pIE = __webpack_require__(54);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var IObject = __webpack_require__(53);
 var $assign = Object.assign;
 
@@ -3930,7 +3931,10 @@ module.exports = !$assign || __webpack_require__(3)(function () {
     var length = keys.length;
     var j = 0;
     var key;
-    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
+    while (length > j) {
+      key = keys[j++];
+      if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];
+    }
   } return T;
 } : $assign;
 
@@ -4006,6 +4010,7 @@ module.exports = function (object, names) {
 /* 122 */
 /***/ (function(module, exports, __webpack_require__) {
 
+var DESCRIPTORS = __webpack_require__(7);
 var getKeys = __webpack_require__(41);
 var toIObject = __webpack_require__(20);
 var isEnum = __webpack_require__(54).f;
@@ -4017,9 +4022,13 @@ module.exports = function (isEntries) {
     var i = 0;
     var result = [];
     var key;
-    while (length > i) if (isEnum.call(O, key = keys[i++])) {
-      result.push(isEntries ? [key, O[key]] : O[key]);
-    } return result;
+    while (length > i) {
+      key = keys[i++];
+      if (!DESCRIPTORS || isEnum.call(O, key)) {
+        result.push(isEntries ? [key, O[key]] : O[key]);
+      }
+    }
+    return result;
   };
 };
 
@@ -4313,7 +4322,7 @@ module.exports = {
 // imported from ncp (this is temporary, will rewrite)
 
 var fs = __webpack_require__(11)
-var path = __webpack_require__(9)
+var path = __webpack_require__(10)
 var utimes = __webpack_require__(370)
 
 function ncp (source, dest, options, callback) {
@@ -4620,7 +4629,7 @@ exports.exists = function (filename, callback) {
 "use strict";
 
 
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 
 // get drive on windows
 function getRootPath (p) {
@@ -4677,13 +4686,15 @@ module.exports = require("assert");
 
 var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
 
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
 function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
 
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
 var util = __webpack_require__(145),
     _ = __webpack_require__(375),
-    path = __webpack_require__(9);
+    path = __webpack_require__(10);
 
 /** Function: defaultPathBuilder
  * This function builds paths for a screenshot file. It is appended to the
@@ -4855,6 +4866,7 @@ function ScreenshotReporter(options) {
     this.pathBuilder = options.pathBuilder || defaultPathBuilder;
     this.docTitle = options.docTitle || 'Test Results';
     this.docName = options.docName || 'report.html';
+    this.screenshotArray = options.screenshotArray || [];
     this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder;
     this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder;
     this.sortFunction = options.sortFunction || sortFunction;
@@ -5173,7 +5185,9 @@ var Jasmine2Reporter = function () {
 
 
                                 if (considerScreenshot) {
-                                    metaData.screenShotFile = path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName);
+                                    this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+                                    metaData.screenShotFile = [].concat(_toConsumableArray(this._screenshotReporter.screenshotArray));
+                                    this._screenshotReporter.screenshotArray.length = 0;
                                 }
 
                                 if (result.browserLogs) {
@@ -5325,7 +5339,7 @@ define(String.prototype, "padRight", "".padEnd);
 /***/ (function(module, exports, __webpack_require__) {
 
 const fs = __webpack_require__(72);
-const path = __webpack_require__(9);
+const path = __webpack_require__(10);
 const crypto = __webpack_require__(377);
 const CircularJSON = __webpack_require__(147);
 const fse = __webpack_require__(359);
@@ -6717,7 +6731,7 @@ $export($export.P + $export.F * !STRICT, 'Array', {
 
 var ctx = __webpack_require__(24);
 var $export = __webpack_require__(0);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var call = __webpack_require__(113);
 var isArrayIter = __webpack_require__(82);
 var toLength = __webpack_require__(6);
@@ -6970,7 +6984,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].some, true), 'Array'
 
 var $export = __webpack_require__(0);
 var aFunction = __webpack_require__(12);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var fails = __webpack_require__(3);
 var $sort = [].sort;
 var test = [1, 2, 3];
@@ -7030,7 +7044,7 @@ $export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'D
 "use strict";
 
 var $export = __webpack_require__(0);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toPrimitive = __webpack_require__(30);
 
 $export($export.P + $export.F * __webpack_require__(3)(function () {
@@ -7812,7 +7826,7 @@ __webpack_require__(29)('getOwnPropertyNames', function () {
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.9 Object.getPrototypeOf(O)
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var $getPrototypeOf = __webpack_require__(19);
 
 __webpack_require__(29)('getPrototypeOf', function () {
@@ -7878,7 +7892,7 @@ $export($export.S, 'Object', { is: __webpack_require__(128) });
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.14 Object.keys(O)
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var $keys = __webpack_require__(41);
 
 __webpack_require__(29)('keys', function () {
@@ -8697,7 +8711,7 @@ __webpack_require__(59)('match', 1, function (defined, MATCH, $match, maybeCallN
 
 
 var anObject = __webpack_require__(1);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toLength = __webpack_require__(6);
 var toInteger = __webpack_require__(26);
 var advanceStringIndex = __webpack_require__(73);
@@ -9421,12 +9435,14 @@ var enumKeys = __webpack_require__(152);
 var isArray = __webpack_require__(60);
 var anObject = __webpack_require__(1);
 var isObject = __webpack_require__(4);
+var toObject = __webpack_require__(9);
 var toIObject = __webpack_require__(20);
 var toPrimitive = __webpack_require__(30);
 var createDesc = __webpack_require__(42);
 var _create = __webpack_require__(39);
 var gOPNExt = __webpack_require__(120);
 var $GOPD = __webpack_require__(18);
+var $GOPS = __webpack_require__(64);
 var $DP = __webpack_require__(8);
 var $keys = __webpack_require__(41);
 var gOPD = $GOPD.f;
@@ -9443,7 +9459,7 @@ var SymbolRegistry = shared('symbol-registry');
 var AllSymbols = shared('symbols');
 var OPSymbols = shared('op-symbols');
 var ObjectProto = Object[PROTOTYPE];
-var USE_NATIVE = typeof $Symbol == 'function';
+var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;
 var QObject = global.QObject;
 // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
 var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
@@ -9553,7 +9569,7 @@ if (!USE_NATIVE) {
   $DP.f = $defineProperty;
   __webpack_require__(40).f = gOPNExt.f = $getOwnPropertyNames;
   __webpack_require__(54).f = $propertyIsEnumerable;
-  __webpack_require__(64).f = $getOwnPropertySymbols;
+  $GOPS.f = $getOwnPropertySymbols;
 
   if (DESCRIPTORS && !__webpack_require__(34)) {
     redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
@@ -9604,6 +9620,16 @@ $export($export.S + $export.F * !USE_NATIVE, 'Object', {
   getOwnPropertySymbols: $getOwnPropertySymbols
 });
 
+// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives
+// https://bugs.chromium.org/p/v8/issues/detail?id=3443
+var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });
+
+$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {
+  getOwnPropertySymbols: function getOwnPropertySymbols(it) {
+    return $GOPS.f(toObject(it));
+  }
+});
+
 // 24.3.2 JSON.stringify(value [, replacer [, space]])
 $JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
   var S = $Symbol();
@@ -9830,7 +9856,7 @@ __webpack_require__(58)(WEAK_SET, function (get) {
 // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap
 var $export = __webpack_require__(0);
 var flattenIntoArray = __webpack_require__(109);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toLength = __webpack_require__(6);
 var aFunction = __webpack_require__(12);
 var arraySpeciesCreate = __webpack_require__(75);
@@ -9859,7 +9885,7 @@ __webpack_require__(33)('flatMap');
 // https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten
 var $export = __webpack_require__(0);
 var flattenIntoArray = __webpack_require__(109);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toLength = __webpack_require__(6);
 var toInteger = __webpack_require__(26);
 var arraySpeciesCreate = __webpack_require__(75);
@@ -10154,7 +10180,7 @@ $export($export.S, 'Math', {
 "use strict";
 
 var $export = __webpack_require__(0);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var aFunction = __webpack_require__(12);
 var $defineProperty = __webpack_require__(8);
 
@@ -10173,7 +10199,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object',
 "use strict";
 
 var $export = __webpack_require__(0);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var aFunction = __webpack_require__(12);
 var $defineProperty = __webpack_require__(8);
 
@@ -10235,7 +10261,7 @@ $export($export.S, 'Object', {
 "use strict";
 
 var $export = __webpack_require__(0);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toPrimitive = __webpack_require__(30);
 var getPrototypeOf = __webpack_require__(19);
 var getOwnPropertyDescriptor = __webpack_require__(18).f;
@@ -10260,7 +10286,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object',
 "use strict";
 
 var $export = __webpack_require__(0);
-var toObject = __webpack_require__(10);
+var toObject = __webpack_require__(9);
 var toPrimitive = __webpack_require__(30);
 var getPrototypeOf = __webpack_require__(19);
 var getOwnPropertyDescriptor = __webpack_require__(18).f;
@@ -11283,7 +11309,7 @@ module.exports = copyFileSync
 
 
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const copyFileSync = __webpack_require__(348)
 const mkdir = __webpack_require__(21)
 
@@ -11352,7 +11378,7 @@ module.exports = copySync
 
 
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const ncp = __webpack_require__(138)
 const mkdir = __webpack_require__(21)
 const pathExists = __webpack_require__(36).pathExists
@@ -11424,7 +11450,7 @@ module.exports = {
 
 const u = __webpack_require__(16).fromCallback
 const fs = __webpack_require__(72)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const mkdir = __webpack_require__(21)
 const remove = __webpack_require__(71)
 
@@ -11478,7 +11504,7 @@ module.exports = {
 
 
 const u = __webpack_require__(16).fromCallback
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const fs = __webpack_require__(11)
 const mkdir = __webpack_require__(21)
 const pathExists = __webpack_require__(36).pathExists
@@ -11561,7 +11587,7 @@ module.exports = {
 
 
 const u = __webpack_require__(16).fromCallback
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const fs = __webpack_require__(11)
 const mkdir = __webpack_require__(21)
 const pathExists = __webpack_require__(36).pathExists
@@ -11628,7 +11654,7 @@ module.exports = {
 "use strict";
 
 
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const fs = __webpack_require__(11)
 const pathExists = __webpack_require__(36).pathExists
 
@@ -11773,7 +11799,7 @@ module.exports = {
 
 
 const u = __webpack_require__(16).fromCallback
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const fs = __webpack_require__(11)
 const _mkdirs = __webpack_require__(21)
 const mkdirs = _mkdirs.mkdirs
@@ -11898,7 +11924,7 @@ module.exports = jsonFile
 
 
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const mkdir = __webpack_require__(21)
 const jsonFile = __webpack_require__(100)
 
@@ -11922,7 +11948,7 @@ module.exports = outputJsonSync
 "use strict";
 
 
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const mkdir = __webpack_require__(21)
 const pathExists = __webpack_require__(36).pathExists
 const jsonFile = __webpack_require__(100)
@@ -11957,7 +11983,7 @@ module.exports = outputJson
 
 
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const invalidWin32Path = __webpack_require__(140).invalidWin32Path
 
 const o777 = parseInt('0777', 8)
@@ -12023,7 +12049,7 @@ module.exports = mkdirsSync
 
 
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const invalidWin32Path = __webpack_require__(140).invalidWin32Path
 
 const o777 = parseInt('0777', 8)
@@ -12093,7 +12119,7 @@ module.exports = mkdirs
 
 
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const copySync = __webpack_require__(137).copySync
 const removeSync = __webpack_require__(71).removeSync
 const mkdirpSync = __webpack_require__(21).mkdirsSync
@@ -12226,7 +12252,7 @@ module.exports = {
 const u = __webpack_require__(16).fromCallback
 const fs = __webpack_require__(11)
 const ncp = __webpack_require__(138)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const remove = __webpack_require__(71).remove
 const mkdirp = __webpack_require__(21).mkdirs
 
@@ -12388,7 +12414,7 @@ module.exports = {
 
 const u = __webpack_require__(16).fromCallback
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const mkdir = __webpack_require__(21)
 const pathExists = __webpack_require__(36).pathExists
 
@@ -12434,7 +12460,7 @@ module.exports = {
 
 
 const fs = __webpack_require__(11)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 const assert = __webpack_require__(142)
 
 const isWindows = (process.platform === 'win32')
@@ -12761,7 +12787,7 @@ module.exports = assign
 
 const fs = __webpack_require__(11)
 const os = __webpack_require__(378)
-const path = __webpack_require__(9)
+const path = __webpack_require__(10)
 
 // HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
 function hasMillisResSync () {
diff --git a/lib/assets/bootstrap.css b/lib/assets/bootstrap.css
index 8787780..10c262c 100644
--- a/lib/assets/bootstrap.css
+++ b/lib/assets/bootstrap.css
@@ -1101,12 +1101,13 @@ textarea {
     line-height: inherit;
 }
 a {
-    color: #2196f3;
+    color: #666666;
     text-decoration: none;
+    text-align: center;
 }
 a:hover,
 a:focus {
-    color: #0a6ebd;
+    color: #666666;
     text-decoration: underline;
 }
 a:focus {
@@ -2444,7 +2445,7 @@ table th[class*="col-"] {
     background-color: #f7a6a4;
 }
 .table-responsive {
-    overflow-x: auto;
+    
     min-height: 0.01%;
 }
 @media screen and (max-width: 767px) {
diff --git a/lib/assets/main.css b/lib/assets/main.css
index 8f5f36c..7a085a7 100644
--- a/lib/assets/main.css
+++ b/lib/assets/main.css
@@ -49,6 +49,14 @@ h2 {
     padding-top: 20px !important;
 }
 
+.col{
+    margin-right: 20%;
+}
+
+.table-responsive{
+    margin-top: 3%;
+}
+
 .spec {
     /*background-color: grey;*/
     /*color: white;*/
@@ -121,7 +129,8 @@ table {
 
 .message {
     display: block;
-    white-space: pre-wrap;
+    /* white-space: pre-wrap; */
+    text-align: left;
 }
 
 .message:not(:first-child) {
diff --git a/lib/index.html b/lib/index.html
index b83d577..0984ada 100644
--- a/lib/index.html
+++ b/lib/index.html
@@ -1,9 +1,10 @@
 <!DOCTYPE html>
 <html lang="en" ng-app="reportingApp" ng-csp>
+
 <head>
     <meta charset="UTF-8">
-    <title>Protractor Screenshot Report</title>
-
+    <title>Buglist</title>
+    <link rel="shortcut icon" type="image/x-icon" href="../node_modules/protractor-beautiful-reporter/lib/favicon.ico">
     <link rel="stylesheet" href="assets/main.css">
     <!-- Here will be CSS placed -->
     <script src="assets/angular.min.js"></script>
@@ -13,225 +14,276 @@
     <script src="assets/circular-json.js"></script>
 
 </head>
+
 <body ng-controller="ScreenshotReportController as ctrl" class="ng-cloak">
 
-<!-- Header -->
-<h2>
-    <!-- Here goes title -->
-    <div class="pull-right">
-        <button class="btn btn-default" ng-class="{active: !ctrl.displayTime}"
+    <!-- Header -->
+    <h2>
+        <img src="./assets/assets/logo.svg"> <!-- Here goes title -->
+        <div class="pull-right">
+            <button class="btn btn-default" ng-class="{active: !ctrl.displayTime}"
                 ng-click="ctrl.displayTime = !ctrl.displayTime">TIME
-        </button>
-        <button class="btn btn-default" ng-class="{active: !ctrl.displayBrowser}"
+            </button>
+            <button class="btn btn-default" ng-class="{active: !ctrl.displayBrowser}"
                 ng-click="ctrl.displayBrowser = !ctrl.displayBrowser">BROWSER
-        </button>
-        <button class="btn btn-default" ng-class="{active: !ctrl.displaySessionId}"
+            </button>
+            <button class="btn btn-default" ng-class="{active: !ctrl.displaySessionId}"
                 ng-click="ctrl.displaySessionId = !ctrl.displaySessionId">SESSION ID
-        </button>
-        <button class="btn btn-default" ng-class="{active: !ctrl.displayOS}"
+            </button>
+            <button class="btn btn-default" ng-class="{active: !ctrl.displayOS}"
                 ng-click="ctrl.displayOS = !ctrl.displayOS">OS
-        </button>
-        <button class="btn btn-default" ng-class="{active: ctrl.inlineScreenshots}"
+            </button>
+            <button class="btn btn-default" ng-class="{active: ctrl.inlineScreenshots}"
                 ng-click="ctrl.inlineScreenshots = !ctrl.inlineScreenshots">INLINE SCREENSHOTS
-        </button>
-    </div>
-</h2>
+            </button>
+        </div>
+    </h2>
 
-<!-- Pass/Fail counts -->
-<div class="progress progress-striped">
-    <div class="progress-bar progress-bar-success" ng-if="ctrl.passCount()" data-container="body" data-toggle="tooltip"
-         title="Passed: {{ctrl.passCount()}} {{(ctrl.failCount() ? '' : '(no failures!)')}}"
-         ng-style="{'width': ctrl.passPerc() + '%'}"><div class="statusNumber">{{ctrl.passCount()}}</div></div>
-    <div class="progress-bar progress-bar-warning" ng-if="ctrl.pendingCount()" data-container="body" data-toggle="tooltip" data-placement="{{(ctrl.pendingPerc()<5)?'left':'top'}}"
-         title="Pending: {{ctrl.pendingCount()}}"
-         ng-style="{'width': ctrl.pendingPerc() + '%'}"><div class="statusNumber">{{ctrl.pendingCount()}}</div></div>
-    <div class="progress-bar progress-bar-danger" ng-if="ctrl.failCount()" data-container="body" data-toggle="tooltip"
-         title="Failed: {{ctrl.failCount()}}"
-         ng-style="{'width': ctrl.failPerc() + '%'}"><div class="statusNumber">{{ctrl.failCount()}}</div></div>
-</div>
+    <!-- Pass/Fail counts -->
+    <div class="progress progress-striped">
+        <div class="progress-bar progress-bar-success" ng-if="ctrl.passCount()" data-container="body"
+            data-toggle="tooltip" title="Passed: {{ctrl.passCount()}} {{(ctrl.failCount() ? '' : '(no failures!)')}}"
+            ng-style="{'width': ctrl.passPerc() + '%'}">
+            <div class="statusNumber">{{ctrl.passCount()}}</div>
+        </div>
+        <div class="progress-bar progress-bar-warning" ng-if="ctrl.pendingCount()" data-container="body"
+            data-toggle="tooltip" data-placement="{{(ctrl.pendingPerc()<5)?'left':'top'}}"
+            title="Pending: {{ctrl.pendingCount()}}" ng-style="{'width': ctrl.pendingPerc() + '%'}">
+            <div class="statusNumber">{{ctrl.pendingCount()}}</div>
+        </div>
+        <div class="progress-bar progress-bar-danger" ng-if="ctrl.failCount()" data-container="body"
+            data-toggle="tooltip" title="Failed: {{ctrl.failCount()}}" ng-style="{'width': ctrl.failPerc() + '%'}">
+            <div class="statusNumber">{{ctrl.failCount()}}</div>
+        </div>
+    </div>
 
-<label>Search: <input ng-model="searchSettings.description"></label>
-<div class="pull-right">
-    <button class="btn btn-default" ng-class="{active: searchSettings.allselected}" ng-click="ctrl.chooseAllTypes()">ALL</button>
-    <button class="btn btn-default" ng-class="{active: searchSettings.passed}"
+    <label>Search: <input ng-model="searchSettings.description"></label>
+    <div class="pull-right">
+        <button class="btn btn-default" ng-class="{active: searchSettings.allselected}"
+            ng-click="ctrl.chooseAllTypes()">ALL</button>
+        <button class="btn btn-default" ng-class="{active: searchSettings.passed}"
             ng-click="searchSettings.passed = !searchSettings.passed">PASSED
-    </button>
-    <button class="btn btn-default" ng-class="{active: searchSettings.failed}"
+        </button>
+        <button class="btn btn-default" ng-class="{active: searchSettings.failed}"
             ng-click="searchSettings.failed = !searchSettings.failed">FAILED
-    </button>
-    <button class="btn btn-default" ng-class="{active: searchSettings.pending}"
+        </button>
+        <button class="btn btn-default" ng-class="{active: searchSettings.pending}"
             ng-click="searchSettings.pending = !searchSettings.pending">PENDING
-    </button>
-    <button class="btn btn-default" ng-class="{active: searchSettings.withLog}"
+        </button>
+        <button class="btn btn-default" ng-class="{active: searchSettings.withLog}"
             ng-click="searchSettings.withLog = !searchSettings.withLog">OR WITH LOG
-    </button>
-    <br><br>
-</div>
+        </button>
+        <br><br>
+    </div>
 
-<!-- Test Results Table -->
-<table class="table">
-    <thead>
-    <tr class="active">
-        <th>Status</th>
-        <th ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime">Time</th>
-        <th>Description</th>
-        <th ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">Browser</th>
-        <th ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">Session ID</th>
-        <th ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">OS</th>
-        <th>Message</th>
-        <th>Log</th>
-        <th>Stack</th>
-        <th>Screen</th>
-    </tr>
-    </thead>
-    <tbody ng-repeat="result in ctrl.results | bySearchSettings:searchSettings">
-    <!-- Test Spec Header -->
-    <tr ng-if="result.displaySpecName">
-        <th class="spec" colspan="10">{{ctrl.currentSpec = ctrl.getSpec(result.description)}}</th>
-    </tr>
-    <tr ng-if="ctrl.currentParent != ctrl.getParent(result.description) && ctrl.getParent(result.description)">
-        <th class="testCase" colspan="10">{{ctrl.currentParent = ctrl.getParent(result.description)}}</th>
-    </tr>
+    <!-- Test Results Table -->
+    <div class="table-responsive">
+        <table class="table">
+            <thead>
+                <tr class="active">
+                    <th>Status</th>
+                    <th ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime">Time</th>
+                    <th>Description</th>
+                    <th ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">Browser</th>
+                    <th ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">Session ID</th>
+                    <th ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">OS</th>
+                    <th>Message</th>
+                    <th>Log</th>
+                    <th>Stack</th>
+                    <th>Screen</th>
+                </tr>
+            </thead>
+            <tbody ng-repeat="result in ctrl.results | bySearchSettings:searchSettings">
+                <!-- Test Spec Header -->
+                <tr ng-if="result.displaySpecName">
+                    <th class="spec" colspan="10">
+                        {{ctrl.currentSpec = ctrl.getSpec(result.description)}}
+                    </th>
+                </tr>
+                <tr
+                    ng-if="ctrl.currentParent != ctrl.getParent(result.description) && ctrl.getParent(result.description)">
+                    <th class="testCase" colspan="10">
+                        {{ctrl.currentParent = ctrl.getParent(result.description)}}
+                    </th>
+                </tr>
 
-    <tr ng-class="{danger: !result.passed && !result.pending, warning: result.pending}">
-        <td class="smallColumn status" ng-if="result.passed && !result.pending">
-            <span class="label label-success"><span class="glyphicon glyphicon-ok"></span></span>
-        </td>
-        <td class="smallColumn status" ng-if="!result.passed && !result.pending">
-            <span class="label label-danger"><span class="glyphicon glyphicon-remove"></span></span>
-        </td>
-        <td class="smallColumn status" ng-if="result.pending">
-            <span class="label label-warning"><span class="glyphicon glyphicon-option-horizontal"></span></span>
-        </td>
-        <td class="smallColumn" ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime">
-            <span class="label label-default" ng-class="{'label-warning': result.duration > ctrl.warningTime, 'label-danger': result.duration > ctrl.dangerTime}">{{ctrl.round(result.duration, 1)}} s</span>
-        </td>
-        <td class="mediumColumn">{{ctrl.getShortDescription(result.description)}}</td>
-        <td ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">{{result.browser.name}} {{result.browser.version}}</td>
-        <td ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">{{result.sessionId}}</td>
-        <td ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">{{result.os}}</td>
-        <td>
-            <div ng-if="ctrl.isValueAnArray(result.message)">
-                <span class="message" ng-repeat="message in result.message track by $index">{{message}}</span>
-            </div>
-            <div ng-if="!ctrl.isValueAnArray(result.message)">
-                {{result.message}}
-            </div>
-        </td>
-        <td class="logColumn">
-            <!--<button class="btn btn-warning pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logWarnings > 0">{{result.logWarnings}}</button>-->
-            <!--<button class="btn btn-danger pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logErrors > 0">{{result.logErrors}}</button>-->
-            <span class="label label-default ng-binding label-warning pull-right consoleLogLabel" ng-if="result.logWarnings > 0" data-toggle="modal" data-target="#modal{{$index}}">{{result.logWarnings}}</span>
-            <span class="label label-default ng-binding label-danger pull-right consoleLogLabel" ng-if="result.logErrors > 0" data-toggle="modal" data-target="#modal{{$index}}">{{result.logErrors}}</span>
-        </td>
-        <td class="smallColumn">
-            <!-- Show stacktrace if failure -->
-            <div ng-if="(!result.passed && !result.pending) || result.browserLogs.length > 0">
-                <span class="label label-white ng-binding pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.trace.length > 0">
-                    <span class="glyphicon glyphicon-warning-sign red"></span>
-                </span>
-                <!-- Stacktrace Modal -->
-                <div class="modal" id="modal{{$index}}" tabindex="-1" role="dialog"
-                     aria-labelledby="modalLabel{{$index}}">
-                    <div class="modal-dialog modal-lg" role="document">
-                        <div class="modal-content">
-                            <div class="modal-header">
-                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                                    <span aria-hidden="true">&times;</span>
-                                </button>
-                                <h6 class="modal-title" id="imageModalLabel{{$index}}">
-                                    {{ctrl.getParent(result.description)}}</h6>
-                                <h5 class="modal-title" id="imageModalLabel{{$index}}">
-                                    {{ctrl.getShortDescription(result.description)}}</h5>
-                            </div>
-                            <div class="modal-body">
-                                <div ng-if="result.trace.length > 0">
-                                    <div ng-if="ctrl.isValueAnArray(result.trace)">
-                                        <pre class="logContainer" ng-repeat="trace in result.trace track by $index"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in trace.split('\n') track by $index">{{line}}</div></pre>
-                                    </div>
-                                    <div ng-if="!ctrl.isValueAnArray(result.trace)">
-                                        <pre class="logContainer"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in result.trace.split('\n') track by $index">{{line}}</div></pre>
-                                    </div>
-                                </div>
-                                <div ng-if="result.browserLogs.length > 0">
-                                    <h5 class="modal-title" id="imageModalLabel{{$index}}">
-                                        Browser logs:
-                                    </h5>
+                <tr ng-class="{danger: !result.passed && !result.pending, warning: result.pending}">
+                    <td class="smallColumn status" ng-if="result.passed && !result.pending">
+                        <span class="label label-success"><span class="glyphicon glyphicon-ok"></span></span>
+                    </td>
+                    <td class="smallColumn status" ng-if="!result.passed && !result.pending">
+                        <span class="label label-danger"><span class="glyphicon glyphicon-remove"></span></span>
+                    </td>
+                    <td class="smallColumn status" ng-if="result.pending">
+                        <span class="label label-warning"><span
+                                class="glyphicon glyphicon-option-horizontal"></span></span>
+                    </td>
+                    <td class="smallColumn" ng-if="!ctrl.displayTime" ng-show="ctrl.displayTime">
+                        <span class="label label-default"
+                            ng-class="{'label-warning': result.duration > 14, 'label-danger': result.duration > 19}">{{ctrl.round(result.duration, 1)}}
+                            s</span>
+                    </td>
+                    <td class="mediumColumn">{{ctrl.getShortDescription(result.description)}}</td>
+                    <td ng-if="!ctrl.displayBrowser" ng-show="ctrl.displayBrowser">{{result.browser.name}}
+                        {{result.browser.version}}</td>
+                    <td ng-if="!ctrl.displaySessionId" ng-show="ctrl.displaySessionId">{{result.sessionId}}</td>
+                    <td ng-if="!ctrl.displayOS" ng-show="ctrl.displayOS">{{result.os}}</td>
+                    <td>
+                        <div ng-if="ctrl.isValueAnArray(result.message)">
+                            <span class="message" ng-repeat="message in result.message track by $index">
+                                <a href="" data-toggle="modal"
+                                    data-target="#imageModal{{($parent.$parent.$index *100) + $index}}">{{message}} </a>
+                            </span>
+                        </div>
+                        <div ng-if="!ctrl.isValueAnArray(result.message)">
+                            {{result.message}}
+                        </div>
+                    </td>
+                    <td class="logColumn">
+                        <!--<button class="btn btn-warning pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logWarnings > 0">{{result.logWarnings}}</button>-->
+                        <!--<button class="btn btn-danger pull-right" data-toggle="modal" data-target="#modal{{$index}}" ng-if="result.logErrors > 0">{{result.logErrors}}</button>-->
+                        <span class="label label-default ng-binding label-warning pull-right consoleLogLabel"
+                            ng-if="result.logWarnings > 0" data-toggle="modal"
+                            data-target="#modal{{$index}}">{{result.logWarnings}}</span>
+                        <span class="label label-default ng-binding label-danger pull-right consoleLogLabel"
+                            ng-if="result.logErrors > 0" data-toggle="modal"
+                            data-target="#modal{{$index}}">{{result.logErrors}}</span>
+                    </td>
+                    <td class="smallColumn">
+                        <!-- Show stacktrace if failure -->
+                        <div ng-if="(!result.passed && !result.pending) || result.browserLogs.length > 0">
+                            <span class="label label-white ng-binding pull-right" data-toggle="modal"
+                                data-target="#modal{{$index}}" ng-if="result.trace.length > 0">
+                                <span class="glyphicon glyphicon-warning-sign red"></span>
+                            </span>
+                            <!-- Stacktrace Modal -->
+                            <div class="modal" id="modal{{$index}}" tabindex="-1" role="dialog"
+                                aria-labelledby="modalLabel{{$index}}">
+                                <div class="modal-dialog modal-lg" role="document">
+                                    <div class="modal-content">
+                                        <div class="modal-header">
+                                            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                                                <span aria-hidden="true">&times;</span>
+                                            </button>
+                                            <h6 class="modal-title" id="imageModalLabel{{$index}}">
+                                                {{ctrl.getParent(result.description)}}</h6>
+                                            <h5 class="modal-title" id="imageModalLabel{{$index}}">
+                                                {{ctrl.getShortDescription(result.description)}}</h5>
+                                        </div>
+                                        <div class="modal-body">
+                                            <div ng-if="result.trace.length > 0">
+                                                <div ng-if="ctrl.isValueAnArray(result.trace)">
+                                                    <pre class="logContainer"
+                                                        ng-repeat="trace in result.trace track by $index"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in trace.split('\n') track by $index">{{line}}</div></pre>
+                                                </div>
+                                                <div ng-if="!ctrl.isValueAnArray(result.trace)">
+                                                    <pre
+                                                        class="logContainer"><div ng-class="ctrl.applySmartHighlight(line)" ng-repeat="line in result.trace.split('\n') track by $index">{{line}}</div></pre>
+                                                </div>
+                                            </div>
+                                            <div ng-if="result.browserLogs.length > 0">
+                                                <h5 class="modal-title" id="imageModalLabel{{$index}}">
+                                                    Browser logs:
+                                                </h5>
 
-                                    <pre class="logContainer"><div class="browserLogItem" ng-repeat="logError in result.browserLogs track by $index"><div><span class="label browserLogLabel label-default" ng-class="{'label-danger': logError.level==='SEVERE', 'label-warning': logError.level==='WARNING'}">{{logError.level}}</span><span class="label label-default">{{ctrl.convertTimestamp(logError.timestamp)}}</span><div ng-repeat="messageLine in logError.message.split('\\n') track by $index">{{ messageLine }}</div></div></div></pre>
+                                                <pre
+                                                    class="logContainer"><div class="browserLogItem" ng-repeat="logError in result.browserLogs track by $index"><div><span class="label browserLogLabel label-default" ng-class="{'label-danger': logError.level==='SEVERE', 'label-warning': logError.level==='WARNING'}">{{logError.level}}</span><span class="label label-default">{{ctrl.convertTimestamp(logError.timestamp)}}</span><div ng-repeat="messageLine in logError.message.split('\\n') track by $index">{{ messageLine }}</div></div></div></pre>
+                                            </div>
+                                        </div>
+                                        <div class="modal-footer">
+                                            <button class="btn btn-default"
+                                                ng-class="{active: ctrl.showSmartStackTraceHighlight}"
+                                                ng-click="ctrl.showSmartStackTraceHighlight = !ctrl.showSmartStackTraceHighlight">
+                                                <span class="glyphicon glyphicon-education black"></span> Smart Stack
+                                                Trace
+                                            </button>
+                                            <button type="button" class="btn btn-default"
+                                                data-dismiss="modal">Close</button>
+                                        </div>
+                                    </div>
                                 </div>
                             </div>
-                            <div class="modal-footer">
-                                <button class="btn btn-default"
-                                        ng-class="{active: ctrl.showSmartStackTraceHighlight}"
-                                        ng-click="ctrl.showSmartStackTraceHighlight = !ctrl.showSmartStackTraceHighlight">
-                                    <span class="glyphicon glyphicon-education black"></span> Smart Stack Trace
-                                </button>
-                                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
-                            </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-        </td>
-        <td ng-class="{'mediumColumn': ctrl.inlineScreenshots && result.screenShotFile}">
-            <div ng-if="!result.pending">
-                <span ng-if="!ctrl.inlineScreenshots && result.screenShotFile"
-                      class="label label-white ng-binding pull-right"
-                      data-toggle="modal"
-                      data-target="#imageModal{{$index}}">
-                            <span class="glyphicon glyphicon-picture black"></span>
-                </span>
-                <a href="" ng-if="ctrl.inlineScreenshots && result.screenShotFile" data-toggle="modal" data-target="#imageModal{{$index}}">
-                    <img ng-src="{{result.screenShotFile}}" class="screenshotLink"/></a>
-                <!-- Screenshot Modal -->
-                <div class="modal" id="imageModal{{$index}}" tabindex="-1" role="dialog"
-                     aria-labelledby="imageModalLabel{{$index}}">
-                    <div class="modal-dialog modal-lg" role="document">
-                        <div class="modal-content">
-                            <div class="modal-header">
-                                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
-                                    <span aria-hidden="true">&times;</span>
-                                </button>
-                                <h6 class="modal-title" id="imageModalLabel{{$index}}">
-                                    {{ctrl.getParent(result.description)}}</h6>
-                                <h5 class="modal-title" id="imageModalLabel{{$index}}">
-                                    {{ctrl.getShortDescription(result.description)}}</h5>
-                            </div>
-                            <div class="modal-body">
-                                <img class="screenshotImage" ng-src="{{result.screenShotFile}}">
-                            </div>
-                            <div class="modal-footer">
-                                <div class="pull-left">
-                                    <button ng-disabled="!($index > 0)" class="btn btn-default" data-dismiss="modal"
-                                            data-toggle="modal" data-target="#imageModal{{$index - 1}}">
-                                        Prev
-                                    </button>
-                                    <button ng-disabled="!($index < ctrl.results.length - 1)" class="btn btn-default"
-                                            data-dismiss="modal" data-toggle="modal"
-                                            data-target="#imageModal{{$index + 1}}">
-                                        Next
-                                    </button>
+                    </td>
+                    <td>
+                        <div class="row">
+                            <div class="col" ng-repeat="screenShotFile in result.screenShotFile track by $index"
+                                ng-class="{'mediumColumn': ctrl.inlineScreenshots && screenShotFile}">
+                                <div ng-if="!result.pending">
+                                    <span ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 > $index"
+                                        class="label label-white ng-binding pull-left" data-toggle="modal"
+                                        data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}">
+                                        <span class="glyphicon glyphicon-picture black"></span>
+                                    </span>
+                                    <span
+                                        ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 == $index"
+                                        class="label label-white ng-binding pull-left" data-toggle="modal"
+                                        data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}">
+                                        <span class="glyphicon glyphicon-time black"></span>
+                                    </span>
+                                    <a href="" ng-if="ctrl.inlineScreenshots && screenShotFile" data-toggle="modal"
+                                        data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}">
+                                        <img ng-src="{{screenShotFile}}" class="screenshotLink" /></a>
+                                    <!-- Screenshot Modal -->
+                                    <div class="modal" id="imageModal{{($parent.$parent.$index *100) + $index}}"
+                                        tabindex="-1" role="dialog" aria-labelledby="imageModalLabel{{$index}}">
+                                        <div class="modal-dialog modal-lg" role="document">
+                                            <div class="modal-content">
+                                                <div class="modal-header">
+                                                    <button type="button" class="close" data-dismiss="modal"
+                                                        aria-label="Close">
+                                                        <span aria-hidden="true">&times;</span>
+                                                    </button>
+                                                    <h6 class="modal-title" id="imageModalLabel{{$index}}">
+                                                        {{ctrl.getParent(result.description)}}</h6>
+                                                    <h5 class="modal-title" id="imageModalLabel{{$index}}">
+                                                        {{ctrl.getShortDescription(result.description)}}</h5>
+                                                </div>
+                                                <div class="modal-body">
+                                                    <img class="screenshotImage" ng-src="{{screenShotFile}}">
+                                                </div>
+                                                <div class="modal-footer">
+                                                    <div class="pull-left">
+                                                        <button ng-disabled="!($index > 0)" class="btn btn-default"
+                                                            data-dismiss="modal" data-toggle="modal"
+                                                            data-target="#imageModal{{($parent.$parent.$index *100) + $index - 1}}">
+                                                            Prev
+                                                        </button>
+                                                        <button
+                                                            ng-disabled="!($index < result.screenShotFile.length - 1)"
+                                                            class="btn btn-default" data-dismiss="modal"
+                                                            data-toggle="modal"
+                                                            data-target="#imageModal{{($parent.$parent.$index *100) + $index + 1}}">
+                                                            Next
+                                                        </button>
+                                                    </div>
+                                                    <a class="btn btn-primary" href="{{screenShotFile}}"
+                                                        target="_blank">
+                                                        Open Image in New Tab
+                                                        <span class="glyphicon glyphicon-new-window"
+                                                            aria-hidden="true"></span>
+                                                    </a>
+                                                    <button type="button" class="btn btn-default"
+                                                        data-dismiss="modal">Close</button>
+                                                </div>
+                                            </div>
+                                        </div>
+                                    </div>
                                 </div>
-                                <a class="btn btn-primary" href="{{result.screenShotFile}}" target="_blank">
-                                    Open Image in New Tab
-                                    <span class="glyphicon glyphicon-new-window" aria-hidden="true"></span>
-                                </a>
-                                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                             </div>
                         </div>
-                    </div>
-                </div>
-            </div>
-        </td>
-    </tr>
-    </tbody>
-</table>
-<div class="center">
-    <a class="github-button" href="https://github.com/Evilweed/protractor-beautiful-reporter" data-size="large" data-show-count="true" aria-label="Star Evilweed/protractor-beautiful-reporter on GitHub">Star</a>
-</div>
-{{ctrl.currentParent = "";""}}
-<script src="assets/main.js"></script>
-<script async defer src="assets/buttons.js"></script>
+                    </td>
+                </tr>
+            </tbody>
+        </table>
+    </div>
+    <div class="center">
+        <a class="github-button" href="https://github.com/Evilweed/protractor-beautiful-reporter" data-size="large"
+            data-show-count="true" aria-label="Star Evilweed/protractor-beautiful-reporter on GitHub">Star</a>
+    </div>
+    {{ctrl.currentParent = "";""}}
+    <script src="assets/main.js"></script>
+    <script async defer src="assets/buttons.js"></script>
 </body>
+
 </html>
\ No newline at end of file

From 1fefc4da4a64a52a7785c23a6ca3ee30dac66d32 Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Wed, 12 Jun 2019 16:41:47 +0200
Subject: [PATCH 06/12] changed so it doesn't break everything, kinda breaks
 pathbuilder

---
 app/reporter.js                      |  61 ++++--
 examples/protractor.jasmine2.conf.js | 267 ++++++++++++---------------
 index.js                             |  41 +++-
 lib/index.html                       |   4 +-
 4 files changed, 202 insertions(+), 171 deletions(-)

diff --git a/app/reporter.js b/app/reporter.js
index 7dd4696..52f7b2e 100644
--- a/app/reporter.js
+++ b/app/reporter.js
@@ -55,7 +55,7 @@ function defaultMetaDataBuilder(spec, descriptions, results, capabilities) {
     if (results.items_.length > 0) {
         var result = results.items_[0];
         if (!results.passed()) {
-            var failedItem = _.where(results.items_, {passed_: false})[0];
+            var failedItem = _.where(results.items_, { passed_: false })[0];
             if (failedItem) {
                 metaData.message = failedItem.message || 'Failed';
                 metaData.trace = failedItem.trace ? (failedItem.trace.stack || 'No Stack trace information') : 'No Stack trace information';
@@ -217,14 +217,49 @@ function ScreenshotReporter(options) {
     }
 }
 
+function expectFailed(rep) {
+    var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult;
+    jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) {
+        var self = rep;
+
+        if (!passed) {
+            let baseName = self._screenshotReporter.pathBuilder(
+                null,
+                [expectation.message],
+                null,
+                null
+            );
+            let tst = util.generateGuid();
+            let screenShotFileName = path.basename(tst + '.png');
+            let screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder);
+            let screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName);
+            self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+            try {
+                browser.takeScreenshot().then(png => {
+                    util.storeScreenShot(png, screenShotPath);
+                });
+            }
+            catch (ex) {
+                if (ex['name'] === 'NoSuchWindowError') {
+                    console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed');
+                } else {
+                    console.error(ex);
+                    console.error('Protractor-beautiful-reporter could not take the screenshot');
+                }
+                metaData.screenShotFile = void 0;
+            }
+        }
+        return originalAddExpectationResult.apply(this, arguments);
+    }
+};
 class Jasmine2Reporter {
 
-    constructor({screenshotReporter}) {
+    constructor({ screenshotReporter }) {
 
         /* `_asyncFlow` is a promise.
-         * It is a "flow" that we create in `specDone`.
-         * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow`
-         * function will wait for the flow to finish before running the next spec. */
+        * It is a "flow" that we create in `specDone`.
+        * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow`
+        * function will wait for the flow to finish before running the next spec. */
         this._asyncFlow = null;
 
         this._screenshotReporter = screenshotReporter;
@@ -305,7 +340,7 @@ class Jasmine2Reporter {
         result.browserLogs = await browser.manage().logs().get('browser');
 
     }
-
+    
     async _takeScreenShotAndAddMetaData(result) {
 
         const capabilities = await browser.getCapabilities();
@@ -355,16 +390,16 @@ class Jasmine2Reporter {
         metaData.timestamp = new Date(result.started).getTime();
         metaData.duration = new Date(result.stopped) - new Date(result.started);
 
-        let testWasExecuted = ! (['pending','disabled','excluded'].includes(result.status));
+        let testWasExecuted = !(['pending', 'disabled', 'excluded'].includes(result.status));
         if (testWasExecuted && considerScreenshot) {
             try {
                 const png = await browser.takeScreenshot();
                 util.storeScreenShot(png, screenShotPath);
             }
-            catch(ex) {
-                if(ex['name'] === 'NoSuchWindowError') {
+            catch (ex) {
+                if (ex['name'] === 'NoSuchWindowError') {
                     console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed');
-                }else {
+                } else {
                     console.error(ex);
                     console.error('Protractor-beautiful-reporter could not take the screenshot');
                 }
@@ -402,9 +437,9 @@ class Jasmine2Reporter {
  * http://jasmine.github.io/2.1/custom_reporter.html
  */
 ScreenshotReporter.prototype.getJasmine2Reporter = function () {
-
-    return new Jasmine2Reporter({screenshotReporter: this});
-
+    let reporter = new Jasmine2Reporter({ screenshotReporter: this });
+    expectFailed(reporter);
+    return reporter;
 };
 
 
diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js
index 56b8bfe..2902913 100644
--- a/examples/protractor.jasmine2.conf.js
+++ b/examples/protractor.jasmine2.conf.js
@@ -1,162 +1,127 @@
 var HtmlReporter = require('protractor-beautiful-reporter');
 var util = require('../app/util'),
   _ = require('underscore'),
- path = require('path');
+  path = require('path');
 
 
 // ----- Config example for Jasmine 2 -----
 
 exports.config = {
-    // ----- How to setup Selenium -----
-    //
-    // There are three ways to specify how to use Selenium. Specify one of the
-    // following:
-    //
-    // 1. seleniumServerJar - to start Selenium Standalone locally.
-    // 2. seleniumAddress - to connect to a Selenium server which is already
-    //    running.
-    // 3. sauceUser/sauceKey - to use remote Selenium servers via SauceLabs.
-
-    // The location of the selenium standalone server .jar file.
-    //seleniumServerJar: 'node_modules/protractor/selenium/selenium-server-standalone-2.37.0.jar',
-
-    // Address of selenium server (before running protractor, run "webdriver-manager start" to start the Selenium server)
-    seleniumAddress: process.env.SELENIUMSERVER ? process.env.SELENIUMSERVER : 'http://localhost:4444/wd/hub',
-
-    // The port to start the selenium server on, or null if the server should
-    // find its own unused port.
-    seleniumPort: null,
-
-    // Chromedriver location is used to help the selenium standalone server
-    // find chromedriver. This will be passed to the selenium jar as
-    // the system property webdriver.chrome.driver. If null, selenium will
-    // attempt to find chromedriver using PATH.
-    //chromeDriver: 'node_modules/protractor/selenium/chromedriver',
-
-    // Additional command line options to pass to selenium. For example,
-    // if you need to change the browser timeout, use
-    // seleniumArgs: ['-browserTimeout=60'],
-    seleniumArgs: [],
-
-    // If sauceUser and sauceKey are specified, seleniumServerJar will be ignored.
-    // The tests will be run remotely using SauceLabs.
-    sauceUser: null,
-    sauceKey: null,
-
-    // ----- What tests to run -----
-    //
-    // Spec patterns are relative to the location of this config.
-    specs: [
-        './specs/*.js'
-    ],
-
-    // ----- Capabilities to be passed to the webdriver instance ----
-    //
-    // For a full list of available capabilities, see
-    // https://code.google.com/p/selenium/wiki/DesiredCapabilities
-    // and
-    // https://code.google.com/p/selenium/source/browse/javascript/webdriver/capabilities.js
-    capabilities: {
-        browserName: 'chrome',
-        logName: 'Chrome - English',
-        version: '',
-        platform: 'ANY',
-        shardTestFiles: false,
-        maxInstances: 2,
-
-        chromeOptions: {
-            args: ["--window-size=1680,1000"]
-            // commented out but needed to keep it for local testing
-            //,  binary: process.env.CHROMIUM_BIN
-            //
-            //     args:["--headless","--disable-gpu","--window-size=1680,1680"]
-            //     args:["--headless","--disable-gpu","--force-device-scale-factor=1.75","--high-dpi-support=1.75","--window-size=1400,1680"]
-        }
-    },
-
-    // A base URL for your application under test. Calls to protractor.get()
-    // with relative paths will be prepended with this.
-    baseUrl: 'http://localhost:9999',
-
-    // Set the framework
-    framework: 'jasmine',
-
-    // Selector for the element housing the angular app - this defaults to
-    // body, but is necessary if ng-app is on a descendant of <body>
-    rootElement: 'body',
-
-    onPrepare: function () {
-        // Add a screenshot reporter:
-        var reporter = new HtmlReporter({
-            preserveDirectory: false,
-            takeScreenShotsOnlyForFailedSpecs: true,
-            screenshotsSubfolder: 'images',
-            jsonsSubfolder: 'jsons',
-            baseDirectory: 'reports-tmp',
-
-            pathBuilder: function pathBuilder(spec, descriptions, results, capabilities) {
-                // Return '<30-12-2016>/<browser>/<specname>' as path for screenshots:
-                // Example: '30-12-2016/firefox/list-should work'.
-                var currentDate = new Date(),
-                    day = currentDate.getDate(),
-                    month = currentDate.getMonth() + 1,
-                    year = currentDate.getFullYear();
-
-                var validDescriptions = descriptions.map(function (description) {
-                    return description.replace('/', '@');
-                });
-
-                return path.join(
-                    day + "-" + month + "-" + year,
-                    // capabilities.get('browserName'),
-                    validDescriptions.join('-'));
-            }
-        })
-        jasmine.getEnv().addReporter(
-            reporter.getJasmine2Reporter()
-        );
-        ExpectFailed(reporter);
-        function ExpectFailed(rep) {
-            var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult;
-            jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) {
-              var self = rep;
-      
-              var makeScreenshotsFromEachBrowsers = false;
-      
-              if (!passed) {
-                makeScreenshotsFromEachBrowsers = true;
-              }
-              if (makeScreenshotsFromEachBrowsers) {
-                let tst = util.generateGuid();
-                let screenShotFileName = path.basename(tst + '.png');
-                let screenShotFilePath = path.join(path.dirname(self.baseName + '.png'), self.screenshotsSubfolder);
-                let screenShotPath = path.join(self.baseDirectory, screenShotFilePath, screenShotFileName);
-                self.screenshotArray.push(path.join(self.screenshotsSubfolder, screenShotFileName));                
-                try {
-                  browser.takeScreenshot().then(png => {
-                    util.storeScreenShot(png, screenShotPath);
-                  });
-                }
-                catch (ex) {
-                  if (ex['name'] === 'NoSuchWindowError') {
-                    console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed');
-                  } else {
-                    console.error(ex);
-                    console.error('Protractor-beautiful-reporter could not take the screenshot');
-                  }
-                  metaData.screenShotFile = void 0;
-                }
-              }
-              return originalAddExpectationResult.apply(this, arguments);
-            }
-          }
-    },
-
-    jasmineNodeOpts: {
-        // If true, print colors to the terminal.
-        showColors: true,
-        // Default time to wait in ms before a test fails.
-        defaultTimeoutInterval: 30000,
+  // ----- How to setup Selenium -----
+  //
+  // There are three ways to specify how to use Selenium. Specify one of the
+  // following:
+  //
+  // 1. seleniumServerJar - to start Selenium Standalone locally.
+  // 2. seleniumAddress - to connect to a Selenium server which is already
+  //    running.
+  // 3. sauceUser/sauceKey - to use remote Selenium servers via SauceLabs.
+
+  // The location of the selenium standalone server .jar file.
+  //seleniumServerJar: 'node_modules/protractor/selenium/selenium-server-standalone-2.37.0.jar',
+
+  // Address of selenium server (before running protractor, run "webdriver-manager start" to start the Selenium server)
+  seleniumAddress: process.env.SELENIUMSERVER ? process.env.SELENIUMSERVER : 'http://localhost:4444/wd/hub',
+
+  // The port to start the selenium server on, or null if the server should
+  // find its own unused port.
+  seleniumPort: null,
+
+  // Chromedriver location is used to help the selenium standalone server
+  // find chromedriver. This will be passed to the selenium jar as
+  // the system property webdriver.chrome.driver. If null, selenium will
+  // attempt to find chromedriver using PATH.
+  //chromeDriver: 'node_modules/protractor/selenium/chromedriver',
+
+  // Additional command line options to pass to selenium. For example,
+  // if you need to change the browser timeout, use
+  // seleniumArgs: ['-browserTimeout=60'],
+  seleniumArgs: [],
+
+  // If sauceUser and sauceKey are specified, seleniumServerJar will be ignored.
+  // The tests will be run remotely using SauceLabs.
+  sauceUser: null,
+  sauceKey: null,
+
+  // ----- What tests to run -----
+  //
+  // Spec patterns are relative to the location of this config.
+  specs: [
+    './specs/*.js'
+  ],
+
+  // ----- Capabilities to be passed to the webdriver instance ----
+  //
+  // For a full list of available capabilities, see
+  // https://code.google.com/p/selenium/wiki/DesiredCapabilities
+  // and
+  // https://code.google.com/p/selenium/source/browse/javascript/webdriver/capabilities.js
+  capabilities: {
+    browserName: 'chrome',
+    logName: 'Chrome - English',
+    version: '',
+    platform: 'ANY',
+    shardTestFiles: false,
+    maxInstances: 2,
+
+    chromeOptions: {
+      args: ["--window-size=1680,1000"]
+      // commented out but needed to keep it for local testing
+      //,  binary: process.env.CHROMIUM_BIN
+      //
+      //     args:["--headless","--disable-gpu","--window-size=1680,1680"]
+      //     args:["--headless","--disable-gpu","--force-device-scale-factor=1.75","--high-dpi-support=1.75","--window-size=1400,1680"]
     }
+  },
+
+  // A base URL for your application under test. Calls to protractor.get()
+  // with relative paths will be prepended with this.
+  baseUrl: 'http://localhost:9999',
+
+  // Set the framework
+  framework: 'jasmine',
+
+  // Selector for the element housing the angular app - this defaults to
+  // body, but is necessary if ng-app is on a descendant of <body>
+  rootElement: 'body',
+
+  onPrepare: function () {
+    // Add a screenshot reporter:
+
+    jasmine.getEnv().addReporter(
+      new HtmlReporter({
+        preserveDirectory: false,
+        takeScreenShotsOnlyForFailedSpecs: true,
+        screenshotsSubfolder: 'images',
+        jsonsSubfolder: 'jsons',
+        baseDirectory: 'reports-tmp',
+
+        pathBuilder: function pathBuilder(spec, descriptions, results, capabilities) {
+          // Return '<30-12-2016>/<browser>/<specname>' as path for screenshots:
+          // Example: '30-12-2016/firefox/list-should work'.
+          var currentDate = new Date(),
+            day = currentDate.getDate(),
+            month = currentDate.getMonth() + 1,
+            year = currentDate.getFullYear();
+
+          var validDescriptions = descriptions.map(function (description) {
+            return description.replace('/', '@');
+          });
+
+          return path.join(
+            day + "-" + month + "-" + year,
+            // capabilities.get('browserName'),
+            validDescriptions.join('-'));
+        }
+      }).getJasmine2Reporter()
+    );
+  },
+
+  jasmineNodeOpts: {
+    // If true, print colors to the terminal.
+    showColors: true,
+    // Default time to wait in ms before a test fails.
+    defaultTimeoutInterval: 30000,
+  }
 };
 
diff --git a/index.js b/index.js
index 045bfba..fe642e0 100644
--- a/index.js
+++ b/index.js
@@ -4906,6 +4906,36 @@ function ScreenshotReporter(options) {
     }
 }
 
+function expectFailed(rep) {
+    var originalAddExpectationResult = jasmine.Spec.prototype.addExpectationResult;
+    jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) {
+        var self = rep;
+
+        if (!passed) {
+            var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null);
+            var tst = util.generateGuid();
+            var screenShotFileName = path.basename(tst + '.png');
+            var screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder);
+            var screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName);
+            self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+            try {
+                browser.takeScreenshot().then(function (png) {
+                    util.storeScreenShot(png, screenShotPath);
+                });
+            } catch (ex) {
+                if (ex['name'] === 'NoSuchWindowError') {
+                    console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed');
+                } else {
+                    console.error(ex);
+                    console.error('Protractor-beautiful-reporter could not take the screenshot');
+                }
+                metaData.screenShotFile = void 0;
+            }
+        }
+        return originalAddExpectationResult.apply(this, arguments);
+    };
+};
+
 var Jasmine2Reporter = function () {
     function Jasmine2Reporter(_ref) {
         var screenshotReporter = _ref.screenshotReporter;
@@ -4913,9 +4943,9 @@ var Jasmine2Reporter = function () {
         _classCallCheck(this, Jasmine2Reporter);
 
         /* `_asyncFlow` is a promise.
-         * It is a "flow" that we create in `specDone`.
-         * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow`
-         * function will wait for the flow to finish before running the next spec. */
+        * It is a "flow" that we create in `specDone`.
+        * `suiteDone`, `suiteStarted` and `specStarted` will then add their steps to the flow and the `_awaitAsyncFlow`
+        * function will wait for the flow to finish before running the next spec. */
         this._asyncFlow = null;
 
         this._screenshotReporter = screenshotReporter;
@@ -5278,8 +5308,9 @@ var Jasmine2Reporter = function () {
 
 
 ScreenshotReporter.prototype.getJasmine2Reporter = function () {
-
-    return new Jasmine2Reporter({ screenshotReporter: this });
+    var reporter = new Jasmine2Reporter({ screenshotReporter: this });
+    expectFailed(reporter);
+    return reporter;
 };
 
 /** Function: reportSpecResults
diff --git a/lib/index.html b/lib/index.html
index 0984ada..590b935 100644
--- a/lib/index.html
+++ b/lib/index.html
@@ -3,7 +3,7 @@
 
 <head>
     <meta charset="UTF-8">
-    <title>Buglist</title>
+    <title>Protractor Screenshot Report</title>
     <link rel="shortcut icon" type="image/x-icon" href="../node_modules/protractor-beautiful-reporter/lib/favicon.ico">
     <link rel="stylesheet" href="assets/main.css">
     <!-- Here will be CSS placed -->
@@ -19,7 +19,7 @@
 
     <!-- Header -->
     <h2>
-        <img src="./assets/assets/logo.svg"> <!-- Here goes title -->
+        <!-- Here goes title -->
         <div class="pull-right">
             <button class="btn btn-default" ng-class="{active: !ctrl.displayTime}"
                 ng-click="ctrl.displayTime = !ctrl.displayTime">TIME

From fc301e57632c633de8861aec6e12e689cd90afa7 Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Thu, 13 Jun 2019 09:03:35 +0200
Subject: [PATCH 07/12] removed some unnecessary things

---
 app/reporter.js                      |  4 ++--
 examples/protractor.jasmine2.conf.js | 10 +++-------
 lib/index.html                       |  4 ++--
 3 files changed, 7 insertions(+), 11 deletions(-)

diff --git a/app/reporter.js b/app/reporter.js
index 52f7b2e..97ffd0e 100644
--- a/app/reporter.js
+++ b/app/reporter.js
@@ -229,8 +229,8 @@ function expectFailed(rep) {
                 null,
                 null
             );
-            let tst = util.generateGuid();
-            let screenShotFileName = path.basename(tst + '.png');
+            let gUid = util.generateGuid();
+            let screenShotFileName = path.basename(gUid + '.png');
             let screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder);
             let screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName);
             self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName));
diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js
index 2902913..5f2269e 100644
--- a/examples/protractor.jasmine2.conf.js
+++ b/examples/protractor.jasmine2.conf.js
@@ -1,7 +1,5 @@
 var HtmlReporter = require('protractor-beautiful-reporter');
-var util = require('../app/util'),
-  _ = require('underscore'),
-  path = require('path');
+var path = require('path');
 
 
 // ----- Config example for Jasmine 2 -----
@@ -88,8 +86,7 @@ exports.config = {
   onPrepare: function () {
     // Add a screenshot reporter:
 
-    jasmine.getEnv().addReporter(
-      new HtmlReporter({
+    jasmine.getEnv().addReporter(new HtmlReporter({
         preserveDirectory: false,
         takeScreenShotsOnlyForFailedSpecs: true,
         screenshotsSubfolder: 'images',
@@ -113,8 +110,7 @@ exports.config = {
             // capabilities.get('browserName'),
             validDescriptions.join('-'));
         }
-      }).getJasmine2Reporter()
-    );
+      }).getJasmine2Reporter());
   },
 
   jasmineNodeOpts: {
diff --git a/lib/index.html b/lib/index.html
index 590b935..dfdebb6 100644
--- a/lib/index.html
+++ b/lib/index.html
@@ -4,7 +4,6 @@
 <head>
     <meta charset="UTF-8">
     <title>Protractor Screenshot Report</title>
-    <link rel="shortcut icon" type="image/x-icon" href="../node_modules/protractor-beautiful-reporter/lib/favicon.ico">
     <link rel="stylesheet" href="assets/main.css">
     <!-- Here will be CSS placed -->
     <script src="assets/angular.min.js"></script>
@@ -210,7 +209,8 @@ <h5 class="modal-title" id="imageModalLabel{{$index}}">
                             <div class="col" ng-repeat="screenShotFile in result.screenShotFile track by $index"
                                 ng-class="{'mediumColumn': ctrl.inlineScreenshots && screenShotFile}">
                                 <div ng-if="!result.pending">
-                                    <span ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 > $index"
+                                    <span
+                                        ng-if="!ctrl.inlineScreenshots && screenShotFile && result.screenShotFile.length - 1 > $index"
                                         class="label label-white ng-binding pull-left" data-toggle="modal"
                                         data-target="#imageModal{{($parent.$parent.$parent.$index *100) + $index}}">
                                         <span class="glyphicon glyphicon-picture black"></span>

From 32b68fa3a60e89c9646eec322decc3d6dfe86219 Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Thu, 13 Jun 2019 09:15:14 +0200
Subject: [PATCH 08/12] reverted some style changes

---
 app/reporter.js                      | 12 ++++++------
 examples/protractor.jasmine2.conf.js |  2 --
 lib/index.html                       |  3 ---
 3 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/app/reporter.js b/app/reporter.js
index 97ffd0e..1641a98 100644
--- a/app/reporter.js
+++ b/app/reporter.js
@@ -55,7 +55,7 @@ function defaultMetaDataBuilder(spec, descriptions, results, capabilities) {
     if (results.items_.length > 0) {
         var result = results.items_[0];
         if (!results.passed()) {
-            var failedItem = _.where(results.items_, { passed_: false })[0];
+            var failedItem = _.where(results.items_, {passed_: false})[0];
             if (failedItem) {
                 metaData.message = failedItem.message || 'Failed';
                 metaData.trace = failedItem.trace ? (failedItem.trace.stack || 'No Stack trace information') : 'No Stack trace information';
@@ -254,7 +254,7 @@ function expectFailed(rep) {
 };
 class Jasmine2Reporter {
 
-    constructor({ screenshotReporter }) {
+    constructor({screenshotReporter}) {
 
         /* `_asyncFlow` is a promise.
         * It is a "flow" that we create in `specDone`.
@@ -390,16 +390,16 @@ class Jasmine2Reporter {
         metaData.timestamp = new Date(result.started).getTime();
         metaData.duration = new Date(result.stopped) - new Date(result.started);
 
-        let testWasExecuted = !(['pending', 'disabled', 'excluded'].includes(result.status));
+        let testWasExecuted = ! (['pending', 'disabled', 'excluded'].includes(result.status));
         if (testWasExecuted && considerScreenshot) {
             try {
                 const png = await browser.takeScreenshot();
                 util.storeScreenShot(png, screenShotPath);
             }
-            catch (ex) {
-                if (ex['name'] === 'NoSuchWindowError') {
+            catch(ex) {
+                if(ex['name'] === 'NoSuchWindowError') {
                     console.warn('Protractor-beautiful-reporter could not take the screenshot because target window is already closed');
-                } else {
+                }else {
                     console.error(ex);
                     console.error('Protractor-beautiful-reporter could not take the screenshot');
                 }
diff --git a/examples/protractor.jasmine2.conf.js b/examples/protractor.jasmine2.conf.js
index 5f2269e..e92764f 100644
--- a/examples/protractor.jasmine2.conf.js
+++ b/examples/protractor.jasmine2.conf.js
@@ -1,7 +1,6 @@
 var HtmlReporter = require('protractor-beautiful-reporter');
 var path = require('path');
 
-
 // ----- Config example for Jasmine 2 -----
 
 exports.config = {
@@ -85,7 +84,6 @@ exports.config = {
 
   onPrepare: function () {
     // Add a screenshot reporter:
-
     jasmine.getEnv().addReporter(new HtmlReporter({
         preserveDirectory: false,
         takeScreenShotsOnlyForFailedSpecs: true,
diff --git a/lib/index.html b/lib/index.html
index dfdebb6..148c440 100644
--- a/lib/index.html
+++ b/lib/index.html
@@ -1,6 +1,5 @@
 <!DOCTYPE html>
 <html lang="en" ng-app="reportingApp" ng-csp>
-
 <head>
     <meta charset="UTF-8">
     <title>Protractor Screenshot Report</title>
@@ -13,7 +12,6 @@
     <script src="assets/circular-json.js"></script>
 
 </head>
-
 <body ng-controller="ScreenshotReportController as ctrl" class="ng-cloak">
 
     <!-- Header -->
@@ -285,5 +283,4 @@ <h5 class="modal-title" id="imageModalLabel{{$index}}">
     <script src="assets/main.js"></script>
     <script async defer src="assets/buttons.js"></script>
 </body>
-
 </html>
\ No newline at end of file

From c2c6c6719ebd1e68208634b26eafd52be77efc3f Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Thu, 13 Jun 2019 09:16:44 +0200
Subject: [PATCH 09/12] new compiled index.js

---
 index.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/index.js b/index.js
index fe642e0..fec004d 100644
--- a/index.js
+++ b/index.js
@@ -4913,8 +4913,8 @@ function expectFailed(rep) {
 
         if (!passed) {
             var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null);
-            var tst = util.generateGuid();
-            var screenShotFileName = path.basename(tst + '.png');
+            var gUid = util.generateGuid();
+            var screenShotFileName = path.basename(gUid + '.png');
             var screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder);
             var screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName);
             self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName));

From ac26901a11a1086fe76031b86a449a3bc6c15599 Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Wed, 3 Jul 2019 12:40:12 +0200
Subject: [PATCH 10/12] made inline screenshots bigger and added space between
 them

---
 lib/assets/bootstrap.css | 4 +---
 lib/assets/main.css      | 2 +-
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/lib/assets/bootstrap.css b/lib/assets/bootstrap.css
index 10c262c..a36b148 100644
--- a/lib/assets/bootstrap.css
+++ b/lib/assets/bootstrap.css
@@ -1117,9 +1117,7 @@ a:focus {
 figure {
     margin: 0;
 }
-img {
-    vertical-align: middle;
-}
+
 .img-responsive,
 .thumbnail > img,
 .thumbnail a > img,
diff --git a/lib/assets/main.css b/lib/assets/main.css
index 7a085a7..e97d688 100644
--- a/lib/assets/main.css
+++ b/lib/assets/main.css
@@ -112,7 +112,7 @@ table {
 }
 
 .screenshotLink {
-    max-width: 100%;
+    max-width: 300%;
 }
 
 .screenshotImage {

From 262ba89c31ba1f69ea5534cc84231a405dca97d2 Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Wed, 14 Aug 2019 10:17:00 +0200
Subject: [PATCH 11/12] made the screenshot on failed expect optional

---
 app/reporter.js | 5 +++--
 index.js        | 5 +++--
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/app/reporter.js b/app/reporter.js
index 1641a98..9d18c60 100644
--- a/app/reporter.js
+++ b/app/reporter.js
@@ -175,7 +175,7 @@ function ScreenshotReporter(options) {
     this.pathBuilder = options.pathBuilder || defaultPathBuilder;
     this.docTitle = options.docTitle || 'Test Results';
     this.docName = options.docName || 'report.html';
-    this.screenshotArray = options.screenshotArray || [];
+    this.screenshotOnFailure = typeof options.screenshotOnFailure !== 'undefined' ? options.screenshotOnFailure : false;
     this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder;
     this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder;
     this.sortFunction = options.sortFunction || sortFunction;
@@ -215,6 +215,7 @@ function ScreenshotReporter(options) {
     if (!this.preserveDirectory) {
         util.removeDirectory(this.finalOptions.baseDirectory);
     }
+    this.screenshotArray = [];
 }
 
 function expectFailed(rep) {
@@ -222,7 +223,7 @@ function expectFailed(rep) {
     jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) {
         var self = rep;
 
-        if (!passed) {
+        if (!passed && self._screenshotReporter.screenshotOnFailure) {
             let baseName = self._screenshotReporter.pathBuilder(
                 null,
                 [expectation.message],
diff --git a/index.js b/index.js
index fec004d..94269ae 100644
--- a/index.js
+++ b/index.js
@@ -4866,7 +4866,7 @@ function ScreenshotReporter(options) {
     this.pathBuilder = options.pathBuilder || defaultPathBuilder;
     this.docTitle = options.docTitle || 'Test Results';
     this.docName = options.docName || 'report.html';
-    this.screenshotArray = options.screenshotArray || [];
+    this.screenshotOnFailure = typeof options.screenshotOnFailure !== 'undefined' ? options.screenshotOnFailure : false;
     this.metaDataBuilder = options.metaDataBuilder || defaultMetaDataBuilder;
     this.jasmine2MetaDataBuilder = options.jasmine2MetaDataBuilder || jasmine2MetaDataBuilder;
     this.sortFunction = options.sortFunction || sortFunction;
@@ -4904,6 +4904,7 @@ function ScreenshotReporter(options) {
     if (!this.preserveDirectory) {
         util.removeDirectory(this.finalOptions.baseDirectory);
     }
+    this.screenshotArray = [];
 }
 
 function expectFailed(rep) {
@@ -4911,7 +4912,7 @@ function expectFailed(rep) {
     jasmine.Spec.prototype.addExpectationResult = function (passed, expectation) {
         var self = rep;
 
-        if (!passed) {
+        if (!passed && self._screenshotReporter.screenshotOnFailure) {
             var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null);
             var gUid = util.generateGuid();
             var screenShotFileName = path.basename(gUid + '.png');

From 85d40940fd88ab1a420810c011719838ccb62d55 Mon Sep 17 00:00:00 2001
From: Maurice Matuschek <maurice.matuschek@hec.de>
Date: Thu, 29 Aug 2019 09:50:40 +0200
Subject: [PATCH 12/12] fixed pathbuilding issue

---
 app/reporter.js |   36 +-
 index.js        | 1029 ++++++++++++++++++++++++-----------------------
 2 files changed, 549 insertions(+), 516 deletions(-)

diff --git a/app/reporter.js b/app/reporter.js
index 9d18c60..42daefc 100644
--- a/app/reporter.js
+++ b/app/reporter.js
@@ -1,6 +1,9 @@
 var util = require('./util'),
     _ = require('underscore'),
     path = require('path');
+const os = require('os');
+var fs = require('fs');
+const fse = require('fs-extra');
 
 /** Function: defaultPathBuilder
  * This function builds paths for a screenshot file. It is appended to the
@@ -224,17 +227,12 @@ function expectFailed(rep) {
         var self = rep;
 
         if (!passed && self._screenshotReporter.screenshotOnFailure) {
-            let baseName = self._screenshotReporter.pathBuilder(
-                null,
-                [expectation.message],
-                null,
-                null
-            );
+            let baseName = os.tmpdir();
             let gUid = util.generateGuid();
             let screenShotFileName = path.basename(gUid + '.png');
-            let screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder);
-            let screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName);
-            self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+            let screenShotFilePath = path.join(baseName, self._screenshotReporter.screenshotsSubfolder);
+            let screenShotPath = path.join(screenShotFilePath, screenShotFileName);
+            self._screenshotReporter.screenshotArray.push(screenShotPath);
             try {
                 browser.takeScreenshot().then(png => {
                     util.storeScreenShot(png, screenShotPath);
@@ -379,9 +377,23 @@ class Jasmine2Reporter {
         let considerScreenshot = !(this._screenshotReporter.takeScreenShotsOnlyForFailedSpecs && result.status === 'passed')
 
         if (considerScreenshot) {
-            this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName));
-            metaData.screenShotFile = [...this._screenshotReporter.screenshotArray];
-            this._screenshotReporter.screenshotArray.length = 0;
+            fse.ensureDir(path.join(this._screenshotReporter.baseDirectory, screenShotFilePath)).then(()=>{
+                for(let i = 0; i<this._screenshotReporter.screenshotArray.length;i++){
+                    let tmpFilePath = this._screenshotReporter.screenshotArray.pop();
+                    let fileName = tmpFilePath.replace(/^.*[\\\/]/, '');
+                    let newScreenshotFilePath = path.join(this._screenshotReporter.baseDirectory, screenShotFilePath, fileName);
+                    let newFilePath = path.join(this._screenshotReporter.screenshotsSubfolder, fileName);
+                    fs.rename(tmpFilePath,newScreenshotFilePath, err => {
+                        if(err){throw err};   
+                    });
+                    this._screenshotReporter.screenshotArray.unshift(newFilePath);
+                }
+                this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+                metaData.screenShotFile = [...this._screenshotReporter.screenshotArray];
+                this._screenshotReporter.screenshotArray.length = 0;
+            }).catch(err=>{
+                console.log(err);
+            });            
         }
 
         if (result.browserLogs) {
diff --git a/index.js b/index.js
index 94269ae..222d1c5 100644
--- a/index.js
+++ b/index.js
@@ -243,10 +243,10 @@ module.exports = require("path");
 /* 11 */
 /***/ (function(module, exports, __webpack_require__) {
 
-var fs = __webpack_require__(72)
-var polyfills = __webpack_require__(373)
-var legacy = __webpack_require__(372)
-var clone = __webpack_require__(371)
+var fs = __webpack_require__(57)
+var polyfills = __webpack_require__(374)
+var legacy = __webpack_require__(373)
+var clone = __webpack_require__(372)
 
 var queue = []
 
@@ -267,7 +267,7 @@ else if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || ''))
 if (/\bgfs4\b/i.test(process.env.NODE_DEBUG || '')) {
   process.on('exit', function() {
     debug(queue)
-    __webpack_require__(142).equal(queue.length, 0)
+    __webpack_require__(143).equal(queue.length, 0)
   })
 }
 
@@ -556,7 +556,7 @@ var global = __webpack_require__(2);
 var hide = __webpack_require__(13);
 var has = __webpack_require__(17);
 var SRC = __webpack_require__(46)('src');
-var $toString = __webpack_require__(153);
+var $toString = __webpack_require__(155);
 var TO_STRING = 'toString';
 var TPL = ('' + $toString).split(TO_STRING);
 
@@ -712,8 +712,8 @@ module.exports = function (it) {
 "use strict";
 
 const u = __webpack_require__(16).fromCallback
-const mkdirs = u(__webpack_require__(364))
-const mkdirsSync = __webpack_require__(363)
+const mkdirs = u(__webpack_require__(365))
+const mkdirsSync = __webpack_require__(364)
 
 module.exports = {
   mkdirs: mkdirs,
@@ -962,7 +962,7 @@ if (__webpack_require__(7)) {
   var global = __webpack_require__(2);
   var fails = __webpack_require__(3);
   var $export = __webpack_require__(0);
-  var $typed = __webpack_require__(69);
+  var $typed = __webpack_require__(70);
   var $buffer = __webpack_require__(96);
   var ctx = __webpack_require__(24);
   var anInstance = __webpack_require__(37);
@@ -986,11 +986,11 @@ if (__webpack_require__(7)) {
   var uid = __webpack_require__(46);
   var wks = __webpack_require__(5);
   var createArrayMethod = __webpack_require__(27);
-  var createArrayIncludes = __webpack_require__(57);
+  var createArrayIncludes = __webpack_require__(58);
   var speciesConstructor = __webpack_require__(56);
   var ArrayIterators = __webpack_require__(99);
   var Iterators = __webpack_require__(49);
-  var $iterDetect = __webpack_require__(62);
+  var $iterDetect = __webpack_require__(63);
   var setSpecies = __webpack_require__(44);
   var arrayFill = __webpack_require__(74);
   var arrayCopyWithin = __webpack_require__(102);
@@ -1890,6 +1890,12 @@ module.exports = function (O, D) {
 
 /***/ }),
 /* 57 */
+/***/ (function(module, exports) {
+
+module.exports = require("fs");
+
+/***/ }),
+/* 58 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // false -> Array#indexOf
@@ -1918,7 +1924,7 @@ module.exports = function (IS_INCLUDES) {
 
 
 /***/ }),
-/* 58 */
+/* 59 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -1932,7 +1938,7 @@ var forOf = __webpack_require__(38);
 var anInstance = __webpack_require__(37);
 var isObject = __webpack_require__(4);
 var fails = __webpack_require__(3);
-var $iterDetect = __webpack_require__(62);
+var $iterDetect = __webpack_require__(63);
 var setToStringTag = __webpack_require__(50);
 var inheritIfRequired = __webpack_require__(81);
 
@@ -2010,7 +2016,7 @@ module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
 
 
 /***/ }),
-/* 59 */
+/* 60 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2113,7 +2119,7 @@ module.exports = function (KEY, length, exec) {
 
 
 /***/ }),
-/* 60 */
+/* 61 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 7.2.2 IsArray(argument)
@@ -2124,7 +2130,7 @@ module.exports = Array.isArray || function isArray(arg) {
 
 
 /***/ }),
-/* 61 */
+/* 62 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 7.2.8 IsRegExp(argument)
@@ -2138,7 +2144,7 @@ module.exports = function (it) {
 
 
 /***/ }),
-/* 62 */
+/* 63 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var ITERATOR = __webpack_require__(5)('iterator');
@@ -2166,7 +2172,7 @@ module.exports = function (exec, skipClosing) {
 
 
 /***/ }),
-/* 63 */
+/* 64 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2182,14 +2188,14 @@ module.exports = __webpack_require__(34) || !__webpack_require__(3)(function ()
 
 
 /***/ }),
-/* 64 */
+/* 65 */
 /***/ (function(module, exports) {
 
 exports.f = Object.getOwnPropertySymbols;
 
 
 /***/ }),
-/* 65 */
+/* 66 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2217,7 +2223,7 @@ module.exports = function (R, S) {
 
 
 /***/ }),
-/* 66 */
+/* 67 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2252,7 +2258,7 @@ module.exports = function (COLLECTION) {
 
 
 /***/ }),
-/* 67 */
+/* 68 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -2271,7 +2277,7 @@ module.exports = function (COLLECTION) {
 
 
 /***/ }),
-/* 68 */
+/* 69 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var toInteger = __webpack_require__(26);
@@ -2294,7 +2300,7 @@ module.exports = function (TO_STRING) {
 
 
 /***/ }),
-/* 69 */
+/* 70 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var global = __webpack_require__(2);
@@ -2328,7 +2334,7 @@ module.exports = {
 
 
 /***/ }),
-/* 70 */
+/* 71 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var global = __webpack_require__(2);
@@ -2338,14 +2344,14 @@ module.exports = navigator && navigator.userAgent || '';
 
 
 /***/ }),
-/* 71 */
+/* 72 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const u = __webpack_require__(16).fromCallback
-const rimraf = __webpack_require__(368)
+const rimraf = __webpack_require__(369)
 
 module.exports = {
   remove: u(rimraf),
@@ -2353,19 +2359,13 @@ module.exports = {
 }
 
 
-/***/ }),
-/* 72 */
-/***/ (function(module, exports) {
-
-module.exports = require("fs");
-
 /***/ }),
 /* 73 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
-var at = __webpack_require__(68)(true);
+var at = __webpack_require__(69)(true);
 
  // `AdvanceStringIndex` abstract operation
 // https://tc39.github.io/ecma262/#sec-advancestringindex
@@ -2401,7 +2401,7 @@ module.exports = function fill(value /* , start = 0, end = @length */) {
 /***/ (function(module, exports, __webpack_require__) {
 
 // 9.4.2.3 ArraySpeciesCreate(originalArray, length)
-var speciesConstructor = __webpack_require__(149);
+var speciesConstructor = __webpack_require__(151);
 
 module.exports = function (original, length) {
   return new (speciesConstructor(original))(length);
@@ -2836,7 +2836,7 @@ module.exports = function (key) {
 /***/ (function(module, exports, __webpack_require__) {
 
 // helper for String#{startsWith, endsWith, includes}
-var isRegExp = __webpack_require__(61);
+var isRegExp = __webpack_require__(62);
 var defined = __webpack_require__(28);
 
 module.exports = function (that, searchString, NAME) {
@@ -2971,7 +2971,7 @@ module.exports = {
 var global = __webpack_require__(2);
 var DESCRIPTORS = __webpack_require__(7);
 var LIBRARY = __webpack_require__(34);
-var $typed = __webpack_require__(69);
+var $typed = __webpack_require__(70);
 var hide = __webpack_require__(13);
 var redefineAll = __webpack_require__(43);
 var fails = __webpack_require__(3);
@@ -3323,7 +3323,7 @@ addToUnscopables('entries');
 
 
 const u = __webpack_require__(16).fromCallback
-const jsonFile = __webpack_require__(374)
+const jsonFile = __webpack_require__(375)
 
 module.exports = {
   // jsonfile exports
@@ -3722,7 +3722,7 @@ module.exports = {
 "use strict";
 
 // https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
-var isArray = __webpack_require__(60);
+var isArray = __webpack_require__(61);
 var isObject = __webpack_require__(4);
 var toLength = __webpack_require__(6);
 var ctx = __webpack_require__(24);
@@ -3903,7 +3903,7 @@ module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh)
 // 19.1.2.1 Object.assign(target, source, ...)
 var DESCRIPTORS = __webpack_require__(7);
 var getKeys = __webpack_require__(41);
-var gOPS = __webpack_require__(64);
+var gOPS = __webpack_require__(65);
 var pIE = __webpack_require__(54);
 var toObject = __webpack_require__(9);
 var IObject = __webpack_require__(53);
@@ -3989,7 +3989,7 @@ module.exports.f = function getOwnPropertyNames(it) {
 
 var has = __webpack_require__(17);
 var toIObject = __webpack_require__(20);
-var arrayIndexOf = __webpack_require__(57)(false);
+var arrayIndexOf = __webpack_require__(58)(false);
 var IE_PROTO = __webpack_require__(91)('IE_PROTO');
 
 module.exports = function (object, names) {
@@ -4039,7 +4039,7 @@ module.exports = function (isEntries) {
 
 // all object keys, includes non-enumerable and symbols
 var gOPN = __webpack_require__(40);
-var gOPS = __webpack_require__(64);
+var gOPS = __webpack_require__(65);
 var anObject = __webpack_require__(1);
 var Reflect = __webpack_require__(2).Reflect;
 module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {
@@ -4176,7 +4176,7 @@ var validate = __webpack_require__(47);
 var MAP = 'Map';
 
 // 23.1 Map Objects
-module.exports = __webpack_require__(58)(MAP, function (get) {
+module.exports = __webpack_require__(59)(MAP, function (get) {
   return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
 }, {
   // 23.1.3.6 Map.prototype.get(key)
@@ -4229,7 +4229,7 @@ var validate = __webpack_require__(47);
 var SET = 'Set';
 
 // 23.2 Set Objects
-module.exports = __webpack_require__(58)(SET, function (get) {
+module.exports = __webpack_require__(59)(SET, function (get) {
   return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
 }, {
   // 23.2.3.1 Set.prototype.add(value)
@@ -4283,7 +4283,7 @@ var methods = {
 };
 
 // 23.3 WeakMap Objects
-var $WeakMap = module.exports = __webpack_require__(58)(WEAK_MAP, wrapper, methods, weak, true, true);
+var $WeakMap = module.exports = __webpack_require__(59)(WEAK_MAP, wrapper, methods, weak, true, true);
 
 // IE11 WeakMap frozen keys fix
 if (NATIVE_WEAK_MAP && IS_IE11) {
@@ -4311,7 +4311,7 @@ if (NATIVE_WEAK_MAP && IS_IE11) {
 /***/ (function(module, exports, __webpack_require__) {
 
 module.exports = {
-  copySync: __webpack_require__(349)
+  copySync: __webpack_require__(351)
 }
 
 
@@ -4323,7 +4323,7 @@ module.exports = {
 
 var fs = __webpack_require__(11)
 var path = __webpack_require__(10)
-var utimes = __webpack_require__(370)
+var utimes = __webpack_require__(371)
 
 function ncp (source, dest, options, callback) {
   if (!callback) {
@@ -4629,6 +4629,35 @@ exports.exists = function (filename, callback) {
 "use strict";
 
 
+const assign = __webpack_require__(370)
+
+const fs = {}
+
+// Export graceful-fs:
+assign(fs, __webpack_require__(139))
+// Export extra methods:
+assign(fs, __webpack_require__(353))
+assign(fs, __webpack_require__(137))
+assign(fs, __webpack_require__(21))
+assign(fs, __webpack_require__(72))
+assign(fs, __webpack_require__(361))
+assign(fs, __webpack_require__(367))
+assign(fs, __webpack_require__(366))
+assign(fs, __webpack_require__(354))
+assign(fs, __webpack_require__(356))
+assign(fs, __webpack_require__(368))
+assign(fs, __webpack_require__(36))
+
+module.exports = fs
+
+
+/***/ }),
+/* 141 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
 const path = __webpack_require__(10)
 
 // get drive on windows
@@ -4655,7 +4684,7 @@ module.exports = {
 
 
 /***/ }),
-/* 141 */
+/* 142 */
 /***/ (function(module, exports) {
 
 /* eslint-disable node/no-deprecated-api */
@@ -4672,13 +4701,19 @@ module.exports = function (size) {
 
 
 /***/ }),
-/* 142 */
+/* 143 */
 /***/ (function(module, exports) {
 
 module.exports = require("assert");
 
 /***/ }),
-/* 143 */
+/* 144 */
+/***/ (function(module, exports) {
+
+module.exports = require("os");
+
+/***/ }),
+/* 145 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -4692,9 +4727,12 @@ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, a
 
 function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
 
-var util = __webpack_require__(145),
-    _ = __webpack_require__(375),
+var util = __webpack_require__(147),
+    _ = __webpack_require__(376),
     path = __webpack_require__(10);
+var os = __webpack_require__(144);
+var fs = __webpack_require__(57);
+var fse = __webpack_require__(140);
 
 /** Function: defaultPathBuilder
  * This function builds paths for a screenshot file. It is appended to the
@@ -4913,12 +4951,12 @@ function expectFailed(rep) {
         var self = rep;
 
         if (!passed && self._screenshotReporter.screenshotOnFailure) {
-            var baseName = self._screenshotReporter.pathBuilder(null, [expectation.message], null, null);
+            var baseName = os.tmpdir();
             var gUid = util.generateGuid();
             var screenShotFileName = path.basename(gUid + '.png');
-            var screenShotFilePath = path.join(path.dirname(baseName + '.png'), self._screenshotReporter.screenshotsSubfolder);
-            var screenShotPath = path.join(self._screenshotReporter.baseDirectory, screenShotFilePath, screenShotFileName);
-            self._screenshotReporter.screenshotArray.push(path.join(self._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+            var screenShotFilePath = path.join(baseName, self._screenshotReporter.screenshotsSubfolder);
+            var screenShotPath = path.join(screenShotFilePath, screenShotFileName);
+            self._screenshotReporter.screenshotArray.push(screenShotPath);
             try {
                 browser.takeScreenshot().then(function (png) {
                     util.storeScreenShot(png, screenShotPath);
@@ -5188,6 +5226,8 @@ var Jasmine2Reporter = function () {
         key: '_takeScreenShotAndAddMetaData',
         value: function () {
             var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8(result) {
+                var _this6 = this;
+
                 var capabilities, suite, descriptions, baseName, metaData, screenShotFileName, screenShotFilePath, metaFile, screenShotPath, metaDataPath, jsonPartsPath, considerScreenshot, testWasExecuted, png;
                 return regeneratorRuntime.wrap(function _callee8$(_context8) {
                     while (1) {
@@ -5216,9 +5256,25 @@ var Jasmine2Reporter = function () {
 
 
                                 if (considerScreenshot) {
-                                    this._screenshotReporter.screenshotArray.push(path.join(this._screenshotReporter.screenshotsSubfolder, screenShotFileName));
-                                    metaData.screenShotFile = [].concat(_toConsumableArray(this._screenshotReporter.screenshotArray));
-                                    this._screenshotReporter.screenshotArray.length = 0;
+                                    fse.ensureDir(path.join(this._screenshotReporter.baseDirectory, screenShotFilePath)).then(function () {
+                                        for (var i = 0; i < _this6._screenshotReporter.screenshotArray.length; i++) {
+                                            var tmpFilePath = _this6._screenshotReporter.screenshotArray.pop();
+                                            var fileName = tmpFilePath.replace(/^.*[\\\/]/, '');
+                                            var newScreenshotFilePath = path.join(_this6._screenshotReporter.baseDirectory, screenShotFilePath, fileName);
+                                            var newFilePath = path.join(_this6._screenshotReporter.screenshotsSubfolder, fileName);
+                                            fs.rename(tmpFilePath, newScreenshotFilePath, function (err) {
+                                                if (err) {
+                                                    throw err;
+                                                };
+                                            });
+                                            _this6._screenshotReporter.screenshotArray.unshift(newFilePath);
+                                        }
+                                        _this6._screenshotReporter.screenshotArray.push(path.join(_this6._screenshotReporter.screenshotsSubfolder, screenShotFileName));
+                                        metaData.screenShotFile = [].concat(_toConsumableArray(_this6._screenshotReporter.screenshotArray));
+                                        _this6._screenshotReporter.screenshotArray.length = 0;
+                                    }).catch(function (err) {
+                                        console.log(err);
+                                    });
                                 }
 
                                 if (result.browserLogs) {
@@ -5329,18 +5385,18 @@ function nowString() {
 module.exports = ScreenshotReporter;
 
 /***/ }),
-/* 144 */
+/* 146 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-__webpack_require__(347);
-
-__webpack_require__(146);
+__webpack_require__(349);
 
 __webpack_require__(148);
 
+__webpack_require__(150);
+
 /* eslint max-len: 0 */
 
 if (global._babelPolyfill) {
@@ -5367,14 +5423,14 @@ define(String.prototype, "padRight", "".padEnd);
 });
 
 /***/ }),
-/* 145 */
+/* 147 */
 /***/ (function(module, exports, __webpack_require__) {
 
-const fs = __webpack_require__(72);
+const fs = __webpack_require__(57);
 const path = __webpack_require__(10);
-const crypto = __webpack_require__(377);
-const CircularJSON = __webpack_require__(147);
-const fse = __webpack_require__(359);
+const crypto = __webpack_require__(378);
+const CircularJSON = __webpack_require__(149);
+const fse = __webpack_require__(140);
 
 
 /** Function: storeScreenShot
@@ -5641,7 +5697,7 @@ module.exports = {
 
 
 /***/ }),
-/* 146 */
+/* 148 */
 /***/ (function(module, exports) {
 
 /**
@@ -6316,7 +6372,7 @@ module.exports = {
 
 
 /***/ }),
-/* 147 */
+/* 149 */
 /***/ (function(module, exports) {
 
 /*!
@@ -6506,19 +6562,19 @@ this.stringify = stringifyRecursion;
 this.parse = parseRecursion;
 
 /***/ }),
-/* 148 */
+/* 150 */
 /***/ (function(module, exports, __webpack_require__) {
 
-__webpack_require__(155);
+__webpack_require__(157);
 module.exports = __webpack_require__(23).RegExp.escape;
 
 
 /***/ }),
-/* 149 */
+/* 151 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var isObject = __webpack_require__(4);
-var isArray = __webpack_require__(60);
+var isArray = __webpack_require__(61);
 var SPECIES = __webpack_require__(5)('species');
 
 module.exports = function (original) {
@@ -6536,7 +6592,7 @@ module.exports = function (original) {
 
 
 /***/ }),
-/* 150 */
+/* 152 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6569,7 +6625,7 @@ module.exports = (fails(function () {
 
 
 /***/ }),
-/* 151 */
+/* 153 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6585,12 +6641,12 @@ module.exports = function (hint) {
 
 
 /***/ }),
-/* 152 */
+/* 154 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // all enumerable object keys, includes symbols
 var getKeys = __webpack_require__(41);
-var gOPS = __webpack_require__(64);
+var gOPS = __webpack_require__(65);
 var pIE = __webpack_require__(54);
 module.exports = function (it) {
   var result = getKeys(it);
@@ -6606,14 +6662,14 @@ module.exports = function (it) {
 
 
 /***/ }),
-/* 153 */
+/* 155 */
 /***/ (function(module, exports, __webpack_require__) {
 
 module.exports = __webpack_require__(55)('native-function-to-string', Function.toString);
 
 
 /***/ }),
-/* 154 */
+/* 156 */
 /***/ (function(module, exports) {
 
 module.exports = function (regExp, replace) {
@@ -6627,18 +6683,18 @@ module.exports = function (regExp, replace) {
 
 
 /***/ }),
-/* 155 */
+/* 157 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/benjamingr/RexExp.escape
 var $export = __webpack_require__(0);
-var $re = __webpack_require__(154)(/[\\^$*+?.()|[\]{}]/g, '\\$&');
+var $re = __webpack_require__(156)(/[\\^$*+?.()|[\]{}]/g, '\\$&');
 
 $export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } });
 
 
 /***/ }),
-/* 156 */
+/* 158 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
@@ -6650,7 +6706,7 @@ __webpack_require__(33)('copyWithin');
 
 
 /***/ }),
-/* 157 */
+/* 159 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6667,7 +6723,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].every, true), 'Array
 
 
 /***/ }),
-/* 158 */
+/* 160 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
@@ -6679,7 +6735,7 @@ __webpack_require__(33)('fill');
 
 
 /***/ }),
-/* 159 */
+/* 161 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6696,7 +6752,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].filter, true), 'Arra
 
 
 /***/ }),
-/* 160 */
+/* 162 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6717,7 +6773,7 @@ __webpack_require__(33)(KEY);
 
 
 /***/ }),
-/* 161 */
+/* 163 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6738,7 +6794,7 @@ __webpack_require__(33)(KEY);
 
 
 /***/ }),
-/* 162 */
+/* 164 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6756,7 +6812,7 @@ $export($export.P + $export.F * !STRICT, 'Array', {
 
 
 /***/ }),
-/* 163 */
+/* 165 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6770,7 +6826,7 @@ var toLength = __webpack_require__(6);
 var createProperty = __webpack_require__(76);
 var getIterFn = __webpack_require__(98);
 
-$export($export.S + $export.F * !__webpack_require__(62)(function (iter) { Array.from(iter); }), 'Array', {
+$export($export.S + $export.F * !__webpack_require__(63)(function (iter) { Array.from(iter); }), 'Array', {
   // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
   from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
     var O = toObject(arrayLike);
@@ -6800,13 +6856,13 @@ $export($export.S + $export.F * !__webpack_require__(62)(function (iter) { Array
 
 
 /***/ }),
-/* 164 */
+/* 166 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 var $export = __webpack_require__(0);
-var $indexOf = __webpack_require__(57)(false);
+var $indexOf = __webpack_require__(58)(false);
 var $native = [].indexOf;
 var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;
 
@@ -6822,17 +6878,17 @@ $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(25)($nati
 
 
 /***/ }),
-/* 165 */
+/* 167 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
 var $export = __webpack_require__(0);
 
-$export($export.S, 'Array', { isArray: __webpack_require__(60) });
+$export($export.S, 'Array', { isArray: __webpack_require__(61) });
 
 
 /***/ }),
-/* 166 */
+/* 168 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6851,7 +6907,7 @@ $export($export.P + $export.F * (__webpack_require__(53) != Object || !__webpack
 
 
 /***/ }),
-/* 167 */
+/* 169 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6880,7 +6936,7 @@ $export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(25)($nati
 
 
 /***/ }),
-/* 168 */
+/* 170 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6897,7 +6953,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].map, true), 'Array',
 
 
 /***/ }),
-/* 169 */
+/* 171 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6923,7 +6979,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () {
 
 
 /***/ }),
-/* 170 */
+/* 172 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6940,7 +6996,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].reduceRight, true),
 
 
 /***/ }),
-/* 171 */
+/* 173 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6957,7 +7013,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].reduce, true), 'Arra
 
 
 /***/ }),
-/* 172 */
+/* 174 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -6992,7 +7048,7 @@ $export($export.P + $export.F * __webpack_require__(3)(function () {
 
 
 /***/ }),
-/* 173 */
+/* 175 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7009,7 +7065,7 @@ $export($export.P + $export.F * !__webpack_require__(25)([].some, true), 'Array'
 
 
 /***/ }),
-/* 174 */
+/* 176 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7039,14 +7095,14 @@ $export($export.P + $export.F * (fails(function () {
 
 
 /***/ }),
-/* 175 */
+/* 177 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(44)('Array');
 
 
 /***/ }),
-/* 176 */
+/* 178 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.3.3.1 / 15.9.4.4 Date.now()
@@ -7056,12 +7112,12 @@ $export($export.S, 'Date', { now: function () { return new Date().getTime(); } }
 
 
 /***/ }),
-/* 177 */
+/* 179 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
 var $export = __webpack_require__(0);
-var toISOString = __webpack_require__(150);
+var toISOString = __webpack_require__(152);
 
 // PhantomJS / old WebKit has a broken implementations
 $export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {
@@ -7070,7 +7126,7 @@ $export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'D
 
 
 /***/ }),
-/* 178 */
+/* 180 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7093,17 +7149,17 @@ $export($export.P + $export.F * __webpack_require__(3)(function () {
 
 
 /***/ }),
-/* 179 */
+/* 181 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var TO_PRIMITIVE = __webpack_require__(5)('toPrimitive');
 var proto = Date.prototype;
 
-if (!(TO_PRIMITIVE in proto)) __webpack_require__(13)(proto, TO_PRIMITIVE, __webpack_require__(151));
+if (!(TO_PRIMITIVE in proto)) __webpack_require__(13)(proto, TO_PRIMITIVE, __webpack_require__(153));
 
 
 /***/ }),
-/* 180 */
+/* 182 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var DateProto = Date.prototype;
@@ -7121,7 +7177,7 @@ if (new Date(NaN) + '' != INVALID_DATE) {
 
 
 /***/ }),
-/* 181 */
+/* 183 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
@@ -7131,7 +7187,7 @@ $export($export.P, 'Function', { bind: __webpack_require__(105) });
 
 
 /***/ }),
-/* 182 */
+/* 184 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7151,7 +7207,7 @@ if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(8).f(FunctionProto, HA
 
 
 /***/ }),
-/* 183 */
+/* 185 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var dP = __webpack_require__(8).f;
@@ -7173,7 +7229,7 @@ NAME in FProto || __webpack_require__(7) && dP(FProto, NAME, {
 
 
 /***/ }),
-/* 184 */
+/* 186 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.3 Math.acosh(x)
@@ -7197,7 +7253,7 @@ $export($export.S + $export.F * !($acosh
 
 
 /***/ }),
-/* 185 */
+/* 187 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.5 Math.asinh(x)
@@ -7213,7 +7269,7 @@ $export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh:
 
 
 /***/ }),
-/* 186 */
+/* 188 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.7 Math.atanh(x)
@@ -7229,7 +7285,7 @@ $export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
 
 
 /***/ }),
-/* 187 */
+/* 189 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.9 Math.cbrt(x)
@@ -7244,7 +7300,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 188 */
+/* 190 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.11 Math.clz32(x)
@@ -7258,7 +7314,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 189 */
+/* 191 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.12 Math.cosh(x)
@@ -7273,7 +7329,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 190 */
+/* 192 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.14 Math.expm1(x)
@@ -7284,7 +7340,7 @@ $export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1
 
 
 /***/ }),
-/* 191 */
+/* 193 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.16 Math.fround(x)
@@ -7294,7 +7350,7 @@ $export($export.S, 'Math', { fround: __webpack_require__(115) });
 
 
 /***/ }),
-/* 192 */
+/* 194 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
@@ -7325,7 +7381,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 193 */
+/* 195 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.18 Math.imul(x, y)
@@ -7348,7 +7404,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () {
 
 
 /***/ }),
-/* 194 */
+/* 196 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.21 Math.log10(x)
@@ -7362,7 +7418,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 195 */
+/* 197 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.20 Math.log1p(x)
@@ -7372,7 +7428,7 @@ $export($export.S, 'Math', { log1p: __webpack_require__(116) });
 
 
 /***/ }),
-/* 196 */
+/* 198 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.22 Math.log2(x)
@@ -7386,7 +7442,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 197 */
+/* 199 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.28 Math.sign(x)
@@ -7396,7 +7452,7 @@ $export($export.S, 'Math', { sign: __webpack_require__(86) });
 
 
 /***/ }),
-/* 198 */
+/* 200 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.30 Math.sinh(x)
@@ -7417,7 +7473,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () {
 
 
 /***/ }),
-/* 199 */
+/* 201 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.33 Math.tanh(x)
@@ -7435,7 +7491,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 200 */
+/* 202 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.2.2.34 Math.trunc(x)
@@ -7449,7 +7505,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 201 */
+/* 203 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7525,7 +7581,7 @@ if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {
 
 
 /***/ }),
-/* 202 */
+/* 204 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.1.2.1 Number.EPSILON
@@ -7535,7 +7591,7 @@ $export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });
 
 
 /***/ }),
-/* 203 */
+/* 205 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.1.2.2 Number.isFinite(number)
@@ -7550,7 +7606,7 @@ $export($export.S, 'Number', {
 
 
 /***/ }),
-/* 204 */
+/* 206 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.1.2.3 Number.isInteger(number)
@@ -7560,7 +7616,7 @@ $export($export.S, 'Number', { isInteger: __webpack_require__(112) });
 
 
 /***/ }),
-/* 205 */
+/* 207 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.1.2.4 Number.isNaN(number)
@@ -7575,7 +7631,7 @@ $export($export.S, 'Number', {
 
 
 /***/ }),
-/* 206 */
+/* 208 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.1.2.5 Number.isSafeInteger(number)
@@ -7591,7 +7647,7 @@ $export($export.S, 'Number', {
 
 
 /***/ }),
-/* 207 */
+/* 209 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.1.2.6 Number.MAX_SAFE_INTEGER
@@ -7601,7 +7657,7 @@ $export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });
 
 
 /***/ }),
-/* 208 */
+/* 210 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 20.1.2.10 Number.MIN_SAFE_INTEGER
@@ -7611,7 +7667,7 @@ $export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });
 
 
 /***/ }),
-/* 209 */
+/* 211 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -7621,7 +7677,7 @@ $export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', {
 
 
 /***/ }),
-/* 210 */
+/* 212 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -7631,7 +7687,7 @@ $export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { pars
 
 
 /***/ }),
-/* 211 */
+/* 213 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7752,7 +7808,7 @@ $export($export.P + $export.F * (!!$toFixed && (
 
 
 /***/ }),
-/* 212 */
+/* 214 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7777,7 +7833,7 @@ $export($export.P + $export.F * ($fails(function () {
 
 
 /***/ }),
-/* 213 */
+/* 215 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.3.1 Object.assign(target, source)
@@ -7787,7 +7843,7 @@ $export($export.S + $export.F, 'Object', { assign: __webpack_require__(118) });
 
 
 /***/ }),
-/* 214 */
+/* 216 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -7796,7 +7852,7 @@ $export($export.S, 'Object', { create: __webpack_require__(39) });
 
 
 /***/ }),
-/* 215 */
+/* 217 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -7805,7 +7861,7 @@ $export($export.S + $export.F * !__webpack_require__(7), 'Object', { definePrope
 
 
 /***/ }),
-/* 216 */
+/* 218 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -7814,7 +7870,7 @@ $export($export.S + $export.F * !__webpack_require__(7), 'Object', { definePrope
 
 
 /***/ }),
-/* 217 */
+/* 219 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.5 Object.freeze(O)
@@ -7829,7 +7885,7 @@ __webpack_require__(29)('freeze', function ($freeze) {
 
 
 /***/ }),
-/* 218 */
+/* 220 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
@@ -7844,7 +7900,7 @@ __webpack_require__(29)('getOwnPropertyDescriptor', function () {
 
 
 /***/ }),
-/* 219 */
+/* 221 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.7 Object.getOwnPropertyNames(O)
@@ -7854,7 +7910,7 @@ __webpack_require__(29)('getOwnPropertyNames', function () {
 
 
 /***/ }),
-/* 220 */
+/* 222 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.9 Object.getPrototypeOf(O)
@@ -7869,7 +7925,7 @@ __webpack_require__(29)('getPrototypeOf', function () {
 
 
 /***/ }),
-/* 221 */
+/* 223 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.11 Object.isExtensible(O)
@@ -7883,7 +7939,7 @@ __webpack_require__(29)('isExtensible', function ($isExtensible) {
 
 
 /***/ }),
-/* 222 */
+/* 224 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.12 Object.isFrozen(O)
@@ -7897,7 +7953,7 @@ __webpack_require__(29)('isFrozen', function ($isFrozen) {
 
 
 /***/ }),
-/* 223 */
+/* 225 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.13 Object.isSealed(O)
@@ -7911,7 +7967,7 @@ __webpack_require__(29)('isSealed', function ($isSealed) {
 
 
 /***/ }),
-/* 224 */
+/* 226 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.3.10 Object.is(value1, value2)
@@ -7920,7 +7976,7 @@ $export($export.S, 'Object', { is: __webpack_require__(128) });
 
 
 /***/ }),
-/* 225 */
+/* 227 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.14 Object.keys(O)
@@ -7935,7 +7991,7 @@ __webpack_require__(29)('keys', function () {
 
 
 /***/ }),
-/* 226 */
+/* 228 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.15 Object.preventExtensions(O)
@@ -7950,7 +8006,7 @@ __webpack_require__(29)('preventExtensions', function ($preventExtensions) {
 
 
 /***/ }),
-/* 227 */
+/* 229 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.2.17 Object.seal(O)
@@ -7965,7 +8021,7 @@ __webpack_require__(29)('seal', function ($seal) {
 
 
 /***/ }),
-/* 228 */
+/* 230 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 19.1.3.19 Object.setPrototypeOf(O, proto)
@@ -7974,7 +8030,7 @@ $export($export.S, 'Object', { setPrototypeOf: __webpack_require__(90).set });
 
 
 /***/ }),
-/* 229 */
+/* 231 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -7991,7 +8047,7 @@ if (test + '' != '[object z]') {
 
 
 /***/ }),
-/* 230 */
+/* 232 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -8001,7 +8057,7 @@ $export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $pars
 
 
 /***/ }),
-/* 231 */
+/* 233 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -8011,7 +8067,7 @@ $export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt }
 
 
 /***/ }),
-/* 232 */
+/* 234 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -8030,7 +8086,7 @@ var task = __webpack_require__(95).set;
 var microtask = __webpack_require__(87)();
 var newPromiseCapabilityModule = __webpack_require__(88);
 var perform = __webpack_require__(126);
-var userAgent = __webpack_require__(70);
+var userAgent = __webpack_require__(71);
 var promiseResolve = __webpack_require__(127);
 var PROMISE = 'Promise';
 var TypeError = global.TypeError;
@@ -8257,7 +8313,7 @@ $export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
     return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
   }
 });
-$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(62)(function (iter) {
+$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(63)(function (iter) {
   $Promise.all(iter)['catch'](empty);
 })), PROMISE, {
   // 25.4.4.1 Promise.all(iterable)
@@ -8304,7 +8360,7 @@ $export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(62)(function
 
 
 /***/ }),
-/* 233 */
+/* 235 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
@@ -8326,7 +8382,7 @@ $export($export.S + $export.F * !__webpack_require__(3)(function () {
 
 
 /***/ }),
-/* 234 */
+/* 236 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
@@ -8379,7 +8435,7 @@ $export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
 
 
 /***/ }),
-/* 235 */
+/* 237 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
@@ -8408,7 +8464,7 @@ $export($export.S + $export.F * __webpack_require__(3)(function () {
 
 
 /***/ }),
-/* 236 */
+/* 238 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.4 Reflect.deleteProperty(target, propertyKey)
@@ -8425,7 +8481,7 @@ $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 237 */
+/* 239 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -8458,7 +8514,7 @@ $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 238 */
+/* 240 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
@@ -8474,7 +8530,7 @@ $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 239 */
+/* 241 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.8 Reflect.getPrototypeOf(target)
@@ -8490,7 +8546,7 @@ $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 240 */
+/* 242 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.6 Reflect.get(target, propertyKey [, receiver])
@@ -8517,7 +8573,7 @@ $export($export.S, 'Reflect', { get: get });
 
 
 /***/ }),
-/* 241 */
+/* 243 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.9 Reflect.has(target, propertyKey)
@@ -8531,7 +8587,7 @@ $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 242 */
+/* 244 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.10 Reflect.isExtensible(target)
@@ -8548,7 +8604,7 @@ $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 243 */
+/* 245 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.11 Reflect.ownKeys(target)
@@ -8558,7 +8614,7 @@ $export($export.S, 'Reflect', { ownKeys: __webpack_require__(123) });
 
 
 /***/ }),
-/* 244 */
+/* 246 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.12 Reflect.preventExtensions(target)
@@ -8580,7 +8636,7 @@ $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 245 */
+/* 247 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.14 Reflect.setPrototypeOf(target, proto)
@@ -8601,7 +8657,7 @@ if (setProto) $export($export.S, 'Reflect', {
 
 
 /***/ }),
-/* 246 */
+/* 248 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
@@ -8640,14 +8696,14 @@ $export($export.S, 'Reflect', { set: set });
 
 
 /***/ }),
-/* 247 */
+/* 249 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var global = __webpack_require__(2);
 var inheritIfRequired = __webpack_require__(81);
 var dP = __webpack_require__(8).f;
 var gOPN = __webpack_require__(40).f;
-var isRegExp = __webpack_require__(61);
+var isRegExp = __webpack_require__(62);
 var $flags = __webpack_require__(52);
 var $RegExp = global.RegExp;
 var Base = $RegExp;
@@ -8689,7 +8745,7 @@ __webpack_require__(44)('RegExp');
 
 
 /***/ }),
-/* 248 */
+/* 250 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -8698,10 +8754,10 @@ __webpack_require__(44)('RegExp');
 var anObject = __webpack_require__(1);
 var toLength = __webpack_require__(6);
 var advanceStringIndex = __webpack_require__(73);
-var regExpExec = __webpack_require__(65);
+var regExpExec = __webpack_require__(66);
 
 // @@match logic
-__webpack_require__(59)('match', 1, function (defined, MATCH, $match, maybeCallNative) {
+__webpack_require__(60)('match', 1, function (defined, MATCH, $match, maybeCallNative) {
   return [
     // `String.prototype.match` method
     // https://tc39.github.io/ecma262/#sec-string.prototype.match
@@ -8736,7 +8792,7 @@ __webpack_require__(59)('match', 1, function (defined, MATCH, $match, maybeCallN
 
 
 /***/ }),
-/* 249 */
+/* 251 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -8747,7 +8803,7 @@ var toObject = __webpack_require__(9);
 var toLength = __webpack_require__(6);
 var toInteger = __webpack_require__(26);
 var advanceStringIndex = __webpack_require__(73);
-var regExpExec = __webpack_require__(65);
+var regExpExec = __webpack_require__(66);
 var max = Math.max;
 var min = Math.min;
 var floor = Math.floor;
@@ -8759,7 +8815,7 @@ var maybeToString = function (it) {
 };
 
 // @@replace logic
-__webpack_require__(59)('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {
+__webpack_require__(60)('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {
   return [
     // `String.prototype.replace` method
     // https://tc39.github.io/ecma262/#sec-string.prototype.replace
@@ -8861,7 +8917,7 @@ __webpack_require__(59)('replace', 2, function (defined, REPLACE, $replace, mayb
 
 
 /***/ }),
-/* 250 */
+/* 252 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -8869,10 +8925,10 @@ __webpack_require__(59)('replace', 2, function (defined, REPLACE, $replace, mayb
 
 var anObject = __webpack_require__(1);
 var sameValue = __webpack_require__(128);
-var regExpExec = __webpack_require__(65);
+var regExpExec = __webpack_require__(66);
 
 // @@search logic
-__webpack_require__(59)('search', 1, function (defined, SEARCH, $search, maybeCallNative) {
+__webpack_require__(60)('search', 1, function (defined, SEARCH, $search, maybeCallNative) {
   return [
     // `String.prototype.search` method
     // https://tc39.github.io/ecma262/#sec-string.prototype.search
@@ -8899,18 +8955,18 @@ __webpack_require__(59)('search', 1, function (defined, SEARCH, $search, maybeCa
 
 
 /***/ }),
-/* 251 */
+/* 253 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-var isRegExp = __webpack_require__(61);
+var isRegExp = __webpack_require__(62);
 var anObject = __webpack_require__(1);
 var speciesConstructor = __webpack_require__(56);
 var advanceStringIndex = __webpack_require__(73);
 var toLength = __webpack_require__(6);
-var callRegExpExec = __webpack_require__(65);
+var callRegExpExec = __webpack_require__(66);
 var regexpExec = __webpack_require__(89);
 var fails = __webpack_require__(3);
 var $min = Math.min;
@@ -8924,7 +8980,7 @@ var MAX_UINT32 = 0xffffffff;
 var SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });
 
 // @@split logic
-__webpack_require__(59)('split', 2, function (defined, SPLIT, $split, maybeCallNative) {
+__webpack_require__(60)('split', 2, function (defined, SPLIT, $split, maybeCallNative) {
   var internalSplit;
   if (
     'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||
@@ -9040,7 +9096,7 @@ __webpack_require__(59)('split', 2, function (defined, SPLIT, $split, maybeCallN
 
 
 /***/ }),
-/* 252 */
+/* 254 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9072,7 +9128,7 @@ if (__webpack_require__(3)(function () { return $toString.call({ source: 'a', fl
 
 
 /***/ }),
-/* 253 */
+/* 255 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9086,7 +9142,7 @@ __webpack_require__(15)('anchor', function (createHTML) {
 
 
 /***/ }),
-/* 254 */
+/* 256 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9100,7 +9156,7 @@ __webpack_require__(15)('big', function (createHTML) {
 
 
 /***/ }),
-/* 255 */
+/* 257 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9114,7 +9170,7 @@ __webpack_require__(15)('blink', function (createHTML) {
 
 
 /***/ }),
-/* 256 */
+/* 258 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9128,13 +9184,13 @@ __webpack_require__(15)('bold', function (createHTML) {
 
 
 /***/ }),
-/* 257 */
+/* 259 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 var $export = __webpack_require__(0);
-var $at = __webpack_require__(68)(false);
+var $at = __webpack_require__(69)(false);
 $export($export.P, 'String', {
   // 21.1.3.3 String.prototype.codePointAt(pos)
   codePointAt: function codePointAt(pos) {
@@ -9144,7 +9200,7 @@ $export($export.P, 'String', {
 
 
 /***/ }),
-/* 258 */
+/* 260 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9171,7 +9227,7 @@ $export($export.P + $export.F * __webpack_require__(79)(ENDS_WITH), 'String', {
 
 
 /***/ }),
-/* 259 */
+/* 261 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9185,7 +9241,7 @@ __webpack_require__(15)('fixed', function (createHTML) {
 
 
 /***/ }),
-/* 260 */
+/* 262 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9199,7 +9255,7 @@ __webpack_require__(15)('fontcolor', function (createHTML) {
 
 
 /***/ }),
-/* 261 */
+/* 263 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9213,7 +9269,7 @@ __webpack_require__(15)('fontsize', function (createHTML) {
 
 
 /***/ }),
-/* 262 */
+/* 264 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -9242,7 +9298,7 @@ $export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1)
 
 
 /***/ }),
-/* 263 */
+/* 265 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9261,7 +9317,7 @@ $export($export.P + $export.F * __webpack_require__(79)(INCLUDES), 'String', {
 
 
 /***/ }),
-/* 264 */
+/* 266 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9275,12 +9331,12 @@ __webpack_require__(15)('italics', function (createHTML) {
 
 
 /***/ }),
-/* 265 */
+/* 267 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
-var $at = __webpack_require__(68)(true);
+var $at = __webpack_require__(69)(true);
 
 // 21.1.3.27 String.prototype[@@iterator]()
 __webpack_require__(84)(String, 'String', function (iterated) {
@@ -9299,7 +9355,7 @@ __webpack_require__(84)(String, 'String', function (iterated) {
 
 
 /***/ }),
-/* 266 */
+/* 268 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9313,7 +9369,7 @@ __webpack_require__(15)('link', function (createHTML) {
 
 
 /***/ }),
-/* 267 */
+/* 269 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -9337,7 +9393,7 @@ $export($export.S, 'String', {
 
 
 /***/ }),
-/* 268 */
+/* 270 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -9349,7 +9405,7 @@ $export($export.P, 'String', {
 
 
 /***/ }),
-/* 269 */
+/* 271 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9363,7 +9419,7 @@ __webpack_require__(15)('small', function (createHTML) {
 
 
 /***/ }),
-/* 270 */
+/* 272 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9388,7 +9444,7 @@ $export($export.P + $export.F * __webpack_require__(79)(STARTS_WITH), 'String',
 
 
 /***/ }),
-/* 271 */
+/* 273 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9402,7 +9458,7 @@ __webpack_require__(15)('strike', function (createHTML) {
 
 
 /***/ }),
-/* 272 */
+/* 274 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9416,7 +9472,7 @@ __webpack_require__(15)('sub', function (createHTML) {
 
 
 /***/ }),
-/* 273 */
+/* 275 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9430,7 +9486,7 @@ __webpack_require__(15)('sup', function (createHTML) {
 
 
 /***/ }),
-/* 274 */
+/* 276 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9444,7 +9500,7 @@ __webpack_require__(51)('trim', function ($trim) {
 
 
 /***/ }),
-/* 275 */
+/* 277 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9463,8 +9519,8 @@ var uid = __webpack_require__(46);
 var wks = __webpack_require__(5);
 var wksExt = __webpack_require__(131);
 var wksDefine = __webpack_require__(97);
-var enumKeys = __webpack_require__(152);
-var isArray = __webpack_require__(60);
+var enumKeys = __webpack_require__(154);
+var isArray = __webpack_require__(61);
 var anObject = __webpack_require__(1);
 var isObject = __webpack_require__(4);
 var toObject = __webpack_require__(9);
@@ -9474,7 +9530,7 @@ var createDesc = __webpack_require__(42);
 var _create = __webpack_require__(39);
 var gOPNExt = __webpack_require__(120);
 var $GOPD = __webpack_require__(18);
-var $GOPS = __webpack_require__(64);
+var $GOPS = __webpack_require__(65);
 var $DP = __webpack_require__(8);
 var $keys = __webpack_require__(41);
 var gOPD = $GOPD.f;
@@ -9697,13 +9753,13 @@ setToStringTag(global.JSON, 'JSON', true);
 
 
 /***/ }),
-/* 276 */
+/* 278 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 var $export = __webpack_require__(0);
-var $typed = __webpack_require__(69);
+var $typed = __webpack_require__(70);
 var buffer = __webpack_require__(96);
 var anObject = __webpack_require__(1);
 var toAbsoluteIndex = __webpack_require__(45);
@@ -9750,17 +9806,17 @@ __webpack_require__(44)(ARRAY_BUFFER);
 
 
 /***/ }),
-/* 277 */
+/* 279 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
-$export($export.G + $export.W + $export.F * !__webpack_require__(69).ABV, {
+$export($export.G + $export.W + $export.F * !__webpack_require__(70).ABV, {
   DataView: __webpack_require__(96).DataView
 });
 
 
 /***/ }),
-/* 278 */
+/* 280 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Float32', 4, function (init) {
@@ -9771,7 +9827,7 @@ __webpack_require__(32)('Float32', 4, function (init) {
 
 
 /***/ }),
-/* 279 */
+/* 281 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Float64', 8, function (init) {
@@ -9782,7 +9838,7 @@ __webpack_require__(32)('Float64', 8, function (init) {
 
 
 /***/ }),
-/* 280 */
+/* 282 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Int16', 2, function (init) {
@@ -9793,7 +9849,7 @@ __webpack_require__(32)('Int16', 2, function (init) {
 
 
 /***/ }),
-/* 281 */
+/* 283 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Int32', 4, function (init) {
@@ -9804,7 +9860,7 @@ __webpack_require__(32)('Int32', 4, function (init) {
 
 
 /***/ }),
-/* 282 */
+/* 284 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Int8', 1, function (init) {
@@ -9815,7 +9871,7 @@ __webpack_require__(32)('Int8', 1, function (init) {
 
 
 /***/ }),
-/* 283 */
+/* 285 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Uint16', 2, function (init) {
@@ -9826,7 +9882,7 @@ __webpack_require__(32)('Uint16', 2, function (init) {
 
 
 /***/ }),
-/* 284 */
+/* 286 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Uint32', 4, function (init) {
@@ -9837,7 +9893,7 @@ __webpack_require__(32)('Uint32', 4, function (init) {
 
 
 /***/ }),
-/* 285 */
+/* 287 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Uint8', 1, function (init) {
@@ -9848,7 +9904,7 @@ __webpack_require__(32)('Uint8', 1, function (init) {
 
 
 /***/ }),
-/* 286 */
+/* 288 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(32)('Uint8', 1, function (init) {
@@ -9859,7 +9915,7 @@ __webpack_require__(32)('Uint8', 1, function (init) {
 
 
 /***/ }),
-/* 287 */
+/* 289 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9869,7 +9925,7 @@ var validate = __webpack_require__(47);
 var WEAK_SET = 'WeakSet';
 
 // 23.4 WeakSet Objects
-__webpack_require__(58)(WEAK_SET, function (get) {
+__webpack_require__(59)(WEAK_SET, function (get) {
   return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
 }, {
   // 23.4.3.1 WeakSet.prototype.add(value)
@@ -9880,7 +9936,7 @@ __webpack_require__(58)(WEAK_SET, function (get) {
 
 
 /***/ }),
-/* 288 */
+/* 290 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9909,7 +9965,7 @@ __webpack_require__(33)('flatMap');
 
 
 /***/ }),
-/* 289 */
+/* 291 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -9937,14 +9993,14 @@ __webpack_require__(33)('flatten');
 
 
 /***/ }),
-/* 290 */
+/* 292 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 // https://github.com/tc39/Array.prototype.includes
 var $export = __webpack_require__(0);
-var $includes = __webpack_require__(57)(true);
+var $includes = __webpack_require__(58)(true);
 
 $export($export.P, 'Array', {
   includes: function includes(el /* , fromIndex = 0 */) {
@@ -9956,7 +10012,7 @@ __webpack_require__(33)('includes');
 
 
 /***/ }),
-/* 291 */
+/* 293 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask
@@ -9974,7 +10030,7 @@ $export($export.G, {
 
 
 /***/ }),
-/* 292 */
+/* 294 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/ljharb/proposal-is-error
@@ -9989,7 +10045,7 @@ $export($export.S, 'Error', {
 
 
 /***/ }),
-/* 293 */
+/* 295 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/tc39/proposal-global
@@ -9999,23 +10055,23 @@ $export($export.G, { global: __webpack_require__(2) });
 
 
 /***/ }),
-/* 294 */
+/* 296 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
-__webpack_require__(66)('Map');
+__webpack_require__(67)('Map');
 
 
 /***/ }),
-/* 295 */
+/* 297 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
-__webpack_require__(67)('Map');
+__webpack_require__(68)('Map');
 
 
 /***/ }),
-/* 296 */
+/* 298 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/DavidBruant/Map-Set.prototype.toJSON
@@ -10025,7 +10081,7 @@ $export($export.P + $export.R, 'Map', { toJSON: __webpack_require__(107)('Map')
 
 
 /***/ }),
-/* 297 */
+/* 299 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://rwaldron.github.io/proposal-math-extensions/
@@ -10039,7 +10095,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 298 */
+/* 300 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://rwaldron.github.io/proposal-math-extensions/
@@ -10049,7 +10105,7 @@ $export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 });
 
 
 /***/ }),
-/* 299 */
+/* 301 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://rwaldron.github.io/proposal-math-extensions/
@@ -10064,7 +10120,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 300 */
+/* 302 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://rwaldron.github.io/proposal-math-extensions/
@@ -10080,7 +10136,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 301 */
+/* 303 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
@@ -10097,7 +10153,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 302 */
+/* 304 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
@@ -10119,7 +10175,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 303 */
+/* 305 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
@@ -10136,7 +10192,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 304 */
+/* 306 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://rwaldron.github.io/proposal-math-extensions/
@@ -10146,7 +10202,7 @@ $export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI });
 
 
 /***/ }),
-/* 305 */
+/* 307 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://rwaldron.github.io/proposal-math-extensions/
@@ -10161,7 +10217,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 306 */
+/* 308 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://rwaldron.github.io/proposal-math-extensions/
@@ -10171,7 +10227,7 @@ $export($export.S, 'Math', { scale: __webpack_require__(117) });
 
 
 /***/ }),
-/* 307 */
+/* 309 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // http://jfbastien.github.io/papers/Math.signbit.html
@@ -10184,7 +10240,7 @@ $export($export.S, 'Math', { signbit: function signbit(x) {
 
 
 /***/ }),
-/* 308 */
+/* 310 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://gist.github.com/BrendanEich/4294d5c212a6d2254703
@@ -10206,7 +10262,7 @@ $export($export.S, 'Math', {
 
 
 /***/ }),
-/* 309 */
+/* 311 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10217,7 +10273,7 @@ var aFunction = __webpack_require__(12);
 var $defineProperty = __webpack_require__(8);
 
 // B.2.2.2 Object.prototype.__defineGetter__(P, getter)
-__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', {
+__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', {
   __defineGetter__: function __defineGetter__(P, getter) {
     $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });
   }
@@ -10225,7 +10281,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object',
 
 
 /***/ }),
-/* 310 */
+/* 312 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10236,7 +10292,7 @@ var aFunction = __webpack_require__(12);
 var $defineProperty = __webpack_require__(8);
 
 // B.2.2.3 Object.prototype.__defineSetter__(P, setter)
-__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', {
+__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', {
   __defineSetter__: function __defineSetter__(P, setter) {
     $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });
   }
@@ -10244,7 +10300,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object',
 
 
 /***/ }),
-/* 311 */
+/* 313 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/tc39/proposal-object-values-entries
@@ -10259,7 +10315,7 @@ $export($export.S, 'Object', {
 
 
 /***/ }),
-/* 312 */
+/* 314 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/tc39/proposal-object-getownpropertydescriptors
@@ -10287,7 +10343,7 @@ $export($export.S, 'Object', {
 
 
 /***/ }),
-/* 313 */
+/* 315 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10299,7 +10355,7 @@ var getPrototypeOf = __webpack_require__(19);
 var getOwnPropertyDescriptor = __webpack_require__(18).f;
 
 // B.2.2.4 Object.prototype.__lookupGetter__(P)
-__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', {
+__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', {
   __lookupGetter__: function __lookupGetter__(P) {
     var O = toObject(this);
     var K = toPrimitive(P, true);
@@ -10312,7 +10368,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object',
 
 
 /***/ }),
-/* 314 */
+/* 316 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10324,7 +10380,7 @@ var getPrototypeOf = __webpack_require__(19);
 var getOwnPropertyDescriptor = __webpack_require__(18).f;
 
 // B.2.2.5 Object.prototype.__lookupSetter__(P)
-__webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object', {
+__webpack_require__(7) && $export($export.P + __webpack_require__(64), 'Object', {
   __lookupSetter__: function __lookupSetter__(P) {
     var O = toObject(this);
     var K = toPrimitive(P, true);
@@ -10337,7 +10393,7 @@ __webpack_require__(7) && $export($export.P + __webpack_require__(63), 'Object',
 
 
 /***/ }),
-/* 315 */
+/* 317 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/tc39/proposal-object-values-entries
@@ -10352,7 +10408,7 @@ $export($export.S, 'Object', {
 
 
 /***/ }),
-/* 316 */
+/* 318 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10558,7 +10614,7 @@ __webpack_require__(44)('Observable');
 
 
 /***/ }),
-/* 317 */
+/* 319 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10585,7 +10641,7 @@ $export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {
 
 
 /***/ }),
-/* 318 */
+/* 320 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10604,7 +10660,7 @@ $export($export.S, 'Promise', { 'try': function (callbackfn) {
 
 
 /***/ }),
-/* 319 */
+/* 321 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var metadata = __webpack_require__(31);
@@ -10618,7 +10674,7 @@ metadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValu
 
 
 /***/ }),
-/* 320 */
+/* 322 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var metadata = __webpack_require__(31);
@@ -10639,7 +10695,7 @@ metadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* ,
 
 
 /***/ }),
-/* 321 */
+/* 323 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var Set = __webpack_require__(135);
@@ -10664,7 +10720,7 @@ metadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey *
 
 
 /***/ }),
-/* 322 */
+/* 324 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var metadata = __webpack_require__(31);
@@ -10687,7 +10743,7 @@ metadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , target
 
 
 /***/ }),
-/* 323 */
+/* 325 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var metadata = __webpack_require__(31);
@@ -10701,7 +10757,7 @@ metadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targe
 
 
 /***/ }),
-/* 324 */
+/* 326 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var metadata = __webpack_require__(31);
@@ -10716,7 +10772,7 @@ metadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* ,
 
 
 /***/ }),
-/* 325 */
+/* 327 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var metadata = __webpack_require__(31);
@@ -10738,7 +10794,7 @@ metadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , target
 
 
 /***/ }),
-/* 326 */
+/* 328 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var metadata = __webpack_require__(31);
@@ -10753,7 +10809,7 @@ metadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* ,
 
 
 /***/ }),
-/* 327 */
+/* 329 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $metadata = __webpack_require__(31);
@@ -10774,23 +10830,23 @@ $metadata.exp({ metadata: function metadata(metadataKey, metadataValue) {
 
 
 /***/ }),
-/* 328 */
+/* 330 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
-__webpack_require__(66)('Set');
+__webpack_require__(67)('Set');
 
 
 /***/ }),
-/* 329 */
+/* 331 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
-__webpack_require__(67)('Set');
+__webpack_require__(68)('Set');
 
 
 /***/ }),
-/* 330 */
+/* 332 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/DavidBruant/Map-Set.prototype.toJSON
@@ -10800,14 +10856,14 @@ $export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(107)('Set')
 
 
 /***/ }),
-/* 331 */
+/* 333 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 // https://github.com/mathiasbynens/String.prototype.at
 var $export = __webpack_require__(0);
-var $at = __webpack_require__(68)(true);
+var $at = __webpack_require__(69)(true);
 
 $export($export.P, 'String', {
   at: function at(pos) {
@@ -10817,7 +10873,7 @@ $export($export.P, 'String', {
 
 
 /***/ }),
-/* 332 */
+/* 334 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10826,7 +10882,7 @@ $export($export.P, 'String', {
 var $export = __webpack_require__(0);
 var defined = __webpack_require__(28);
 var toLength = __webpack_require__(6);
-var isRegExp = __webpack_require__(61);
+var isRegExp = __webpack_require__(62);
 var getFlags = __webpack_require__(52);
 var RegExpProto = RegExp.prototype;
 
@@ -10854,7 +10910,7 @@ $export($export.P, 'String', {
 
 
 /***/ }),
-/* 333 */
+/* 335 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10862,7 +10918,7 @@ $export($export.P, 'String', {
 // https://github.com/tc39/proposal-string-pad-start-end
 var $export = __webpack_require__(0);
 var $pad = __webpack_require__(129);
-var userAgent = __webpack_require__(70);
+var userAgent = __webpack_require__(71);
 
 // https://github.com/zloirock/core-js/issues/280
 var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent);
@@ -10875,7 +10931,7 @@ $export($export.P + $export.F * WEBKIT_BUG, 'String', {
 
 
 /***/ }),
-/* 334 */
+/* 336 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10883,7 +10939,7 @@ $export($export.P + $export.F * WEBKIT_BUG, 'String', {
 // https://github.com/tc39/proposal-string-pad-start-end
 var $export = __webpack_require__(0);
 var $pad = __webpack_require__(129);
-var userAgent = __webpack_require__(70);
+var userAgent = __webpack_require__(71);
 
 // https://github.com/zloirock/core-js/issues/280
 var WEBKIT_BUG = /Version\/10\.\d+(\.\d+)?( Mobile\/\w+)? Safari\//.test(userAgent);
@@ -10896,7 +10952,7 @@ $export($export.P + $export.F * WEBKIT_BUG, 'String', {
 
 
 /***/ }),
-/* 335 */
+/* 337 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10910,7 +10966,7 @@ __webpack_require__(51)('trimLeft', function ($trim) {
 
 
 /***/ }),
-/* 336 */
+/* 338 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -10924,21 +10980,21 @@ __webpack_require__(51)('trimRight', function ($trim) {
 
 
 /***/ }),
-/* 337 */
+/* 339 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(97)('asyncIterator');
 
 
 /***/ }),
-/* 338 */
+/* 340 */
 /***/ (function(module, exports, __webpack_require__) {
 
 __webpack_require__(97)('observable');
 
 
 /***/ }),
-/* 339 */
+/* 341 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://github.com/tc39/proposal-global
@@ -10948,39 +11004,39 @@ $export($export.S, 'System', { global: __webpack_require__(2) });
 
 
 /***/ }),
-/* 340 */
+/* 342 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from
-__webpack_require__(66)('WeakMap');
+__webpack_require__(67)('WeakMap');
 
 
 /***/ }),
-/* 341 */
+/* 343 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of
-__webpack_require__(67)('WeakMap');
+__webpack_require__(68)('WeakMap');
 
 
 /***/ }),
-/* 342 */
+/* 344 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from
-__webpack_require__(66)('WeakSet');
+__webpack_require__(67)('WeakSet');
 
 
 /***/ }),
-/* 343 */
+/* 345 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of
-__webpack_require__(67)('WeakSet');
+__webpack_require__(68)('WeakSet');
 
 
 /***/ }),
-/* 344 */
+/* 346 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $iterators = __webpack_require__(99);
@@ -11044,7 +11100,7 @@ for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++
 
 
 /***/ }),
-/* 345 */
+/* 347 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var $export = __webpack_require__(0);
@@ -11056,13 +11112,13 @@ $export($export.G + $export.B, {
 
 
 /***/ }),
-/* 346 */
+/* 348 */
 /***/ (function(module, exports, __webpack_require__) {
 
 // ie9- setTimeout & setInterval additional parameters fix
 var global = __webpack_require__(2);
 var $export = __webpack_require__(0);
-var userAgent = __webpack_require__(70);
+var userAgent = __webpack_require__(71);
 var slice = [].slice;
 var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check
 var wrap = function (set) {
@@ -11082,37 +11138,35 @@ $export($export.G + $export.B + $export.F * MSIE, {
 
 
 /***/ }),
-/* 347 */
+/* 349 */
 /***/ (function(module, exports, __webpack_require__) {
 
-__webpack_require__(275);
-__webpack_require__(214);
+__webpack_require__(277);
 __webpack_require__(216);
-__webpack_require__(215);
 __webpack_require__(218);
-__webpack_require__(220);
-__webpack_require__(225);
-__webpack_require__(219);
 __webpack_require__(217);
-__webpack_require__(227);
-__webpack_require__(226);
+__webpack_require__(220);
 __webpack_require__(222);
-__webpack_require__(223);
+__webpack_require__(227);
 __webpack_require__(221);
-__webpack_require__(213);
-__webpack_require__(224);
-__webpack_require__(228);
+__webpack_require__(219);
 __webpack_require__(229);
-__webpack_require__(181);
-__webpack_require__(183);
-__webpack_require__(182);
-__webpack_require__(231);
-__webpack_require__(230);
-__webpack_require__(201);
-__webpack_require__(211);
-__webpack_require__(212);
-__webpack_require__(202);
+__webpack_require__(228);
+__webpack_require__(224);
+__webpack_require__(225);
+__webpack_require__(223);
+__webpack_require__(215);
+__webpack_require__(226);
+__webpack_require__(230);
+__webpack_require__(231);
+__webpack_require__(183);
+__webpack_require__(185);
+__webpack_require__(184);
+__webpack_require__(233);
+__webpack_require__(232);
 __webpack_require__(203);
+__webpack_require__(213);
+__webpack_require__(214);
 __webpack_require__(204);
 __webpack_require__(205);
 __webpack_require__(206);
@@ -11120,8 +11174,8 @@ __webpack_require__(207);
 __webpack_require__(208);
 __webpack_require__(209);
 __webpack_require__(210);
-__webpack_require__(184);
-__webpack_require__(185);
+__webpack_require__(211);
+__webpack_require__(212);
 __webpack_require__(186);
 __webpack_require__(187);
 __webpack_require__(188);
@@ -11137,156 +11191,158 @@ __webpack_require__(197);
 __webpack_require__(198);
 __webpack_require__(199);
 __webpack_require__(200);
-__webpack_require__(262);
+__webpack_require__(201);
+__webpack_require__(202);
+__webpack_require__(264);
+__webpack_require__(269);
+__webpack_require__(276);
 __webpack_require__(267);
-__webpack_require__(274);
+__webpack_require__(259);
+__webpack_require__(260);
 __webpack_require__(265);
-__webpack_require__(257);
-__webpack_require__(258);
-__webpack_require__(263);
-__webpack_require__(268);
 __webpack_require__(270);
-__webpack_require__(253);
-__webpack_require__(254);
+__webpack_require__(272);
 __webpack_require__(255);
 __webpack_require__(256);
-__webpack_require__(259);
-__webpack_require__(260);
+__webpack_require__(257);
+__webpack_require__(258);
 __webpack_require__(261);
-__webpack_require__(264);
+__webpack_require__(262);
+__webpack_require__(263);
 __webpack_require__(266);
-__webpack_require__(269);
+__webpack_require__(268);
 __webpack_require__(271);
-__webpack_require__(272);
 __webpack_require__(273);
-__webpack_require__(176);
+__webpack_require__(274);
+__webpack_require__(275);
 __webpack_require__(178);
-__webpack_require__(177);
 __webpack_require__(180);
 __webpack_require__(179);
+__webpack_require__(182);
+__webpack_require__(181);
+__webpack_require__(167);
 __webpack_require__(165);
-__webpack_require__(163);
-__webpack_require__(169);
-__webpack_require__(166);
-__webpack_require__(172);
-__webpack_require__(174);
-__webpack_require__(162);
+__webpack_require__(171);
 __webpack_require__(168);
+__webpack_require__(174);
+__webpack_require__(176);
+__webpack_require__(164);
+__webpack_require__(170);
+__webpack_require__(161);
+__webpack_require__(175);
 __webpack_require__(159);
 __webpack_require__(173);
-__webpack_require__(157);
-__webpack_require__(171);
-__webpack_require__(170);
-__webpack_require__(164);
-__webpack_require__(167);
-__webpack_require__(156);
+__webpack_require__(172);
+__webpack_require__(166);
+__webpack_require__(169);
 __webpack_require__(158);
-__webpack_require__(161);
 __webpack_require__(160);
-__webpack_require__(175);
+__webpack_require__(163);
+__webpack_require__(162);
+__webpack_require__(177);
 __webpack_require__(99);
-__webpack_require__(247);
+__webpack_require__(249);
 __webpack_require__(133);
-__webpack_require__(252);
+__webpack_require__(254);
 __webpack_require__(134);
-__webpack_require__(248);
-__webpack_require__(249);
 __webpack_require__(250);
 __webpack_require__(251);
-__webpack_require__(232);
+__webpack_require__(252);
+__webpack_require__(253);
+__webpack_require__(234);
 __webpack_require__(132);
 __webpack_require__(135);
 __webpack_require__(136);
+__webpack_require__(289);
+__webpack_require__(278);
+__webpack_require__(279);
+__webpack_require__(284);
 __webpack_require__(287);
-__webpack_require__(276);
-__webpack_require__(277);
+__webpack_require__(288);
 __webpack_require__(282);
 __webpack_require__(285);
+__webpack_require__(283);
 __webpack_require__(286);
 __webpack_require__(280);
-__webpack_require__(283);
 __webpack_require__(281);
-__webpack_require__(284);
-__webpack_require__(278);
-__webpack_require__(279);
-__webpack_require__(233);
-__webpack_require__(234);
 __webpack_require__(235);
 __webpack_require__(236);
 __webpack_require__(237);
-__webpack_require__(240);
 __webpack_require__(238);
 __webpack_require__(239);
-__webpack_require__(241);
 __webpack_require__(242);
+__webpack_require__(240);
+__webpack_require__(241);
 __webpack_require__(243);
 __webpack_require__(244);
-__webpack_require__(246);
 __webpack_require__(245);
+__webpack_require__(246);
+__webpack_require__(248);
+__webpack_require__(247);
+__webpack_require__(292);
 __webpack_require__(290);
-__webpack_require__(288);
-__webpack_require__(289);
-__webpack_require__(331);
-__webpack_require__(334);
+__webpack_require__(291);
 __webpack_require__(333);
-__webpack_require__(335);
 __webpack_require__(336);
-__webpack_require__(332);
+__webpack_require__(335);
 __webpack_require__(337);
 __webpack_require__(338);
+__webpack_require__(334);
+__webpack_require__(339);
+__webpack_require__(340);
+__webpack_require__(314);
+__webpack_require__(317);
+__webpack_require__(313);
+__webpack_require__(311);
 __webpack_require__(312);
 __webpack_require__(315);
-__webpack_require__(311);
-__webpack_require__(309);
-__webpack_require__(310);
-__webpack_require__(313);
-__webpack_require__(314);
+__webpack_require__(316);
+__webpack_require__(298);
+__webpack_require__(332);
+__webpack_require__(297);
+__webpack_require__(331);
+__webpack_require__(343);
+__webpack_require__(345);
 __webpack_require__(296);
 __webpack_require__(330);
+__webpack_require__(342);
+__webpack_require__(344);
 __webpack_require__(295);
-__webpack_require__(329);
 __webpack_require__(341);
-__webpack_require__(343);
 __webpack_require__(294);
-__webpack_require__(328);
-__webpack_require__(340);
-__webpack_require__(342);
-__webpack_require__(293);
-__webpack_require__(339);
-__webpack_require__(292);
-__webpack_require__(297);
-__webpack_require__(298);
 __webpack_require__(299);
 __webpack_require__(300);
 __webpack_require__(301);
-__webpack_require__(303);
 __webpack_require__(302);
-__webpack_require__(304);
+__webpack_require__(303);
 __webpack_require__(305);
+__webpack_require__(304);
 __webpack_require__(306);
-__webpack_require__(308);
 __webpack_require__(307);
-__webpack_require__(317);
-__webpack_require__(318);
+__webpack_require__(308);
+__webpack_require__(310);
+__webpack_require__(309);
 __webpack_require__(319);
 __webpack_require__(320);
-__webpack_require__(322);
 __webpack_require__(321);
+__webpack_require__(322);
 __webpack_require__(324);
 __webpack_require__(323);
-__webpack_require__(325);
 __webpack_require__(326);
+__webpack_require__(325);
 __webpack_require__(327);
-__webpack_require__(291);
-__webpack_require__(316);
+__webpack_require__(328);
+__webpack_require__(329);
+__webpack_require__(293);
+__webpack_require__(318);
+__webpack_require__(348);
+__webpack_require__(347);
 __webpack_require__(346);
-__webpack_require__(345);
-__webpack_require__(344);
 module.exports = __webpack_require__(23);
 
 
 /***/ }),
-/* 348 */
+/* 350 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11295,7 +11351,7 @@ module.exports = __webpack_require__(23);
 const fs = __webpack_require__(11)
 
 const BUF_LENGTH = 64 * 1024
-const _buff = __webpack_require__(141)(BUF_LENGTH)
+const _buff = __webpack_require__(142)(BUF_LENGTH)
 
 function copyFileSync (srcFile, destFile, options) {
   const overwrite = options.overwrite
@@ -11334,7 +11390,7 @@ module.exports = copyFileSync
 
 
 /***/ }),
-/* 349 */
+/* 351 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11342,7 +11398,7 @@ module.exports = copyFileSync
 
 const fs = __webpack_require__(11)
 const path = __webpack_require__(10)
-const copyFileSync = __webpack_require__(348)
+const copyFileSync = __webpack_require__(350)
 const mkdir = __webpack_require__(21)
 
 function copySync (src, dest, options) {
@@ -11403,7 +11459,7 @@ module.exports = copySync
 
 
 /***/ }),
-/* 350 */
+/* 352 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11464,27 +11520,27 @@ module.exports = copy
 
 
 /***/ }),
-/* 351 */
+/* 353 */
 /***/ (function(module, exports, __webpack_require__) {
 
 const u = __webpack_require__(16).fromCallback
 module.exports = {
-  copy: u(__webpack_require__(350))
+  copy: u(__webpack_require__(352))
 }
 
 
 /***/ }),
-/* 352 */
+/* 354 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const u = __webpack_require__(16).fromCallback
-const fs = __webpack_require__(72)
+const fs = __webpack_require__(57)
 const path = __webpack_require__(10)
 const mkdir = __webpack_require__(21)
-const remove = __webpack_require__(71)
+const remove = __webpack_require__(72)
 
 const emptyDir = u(function emptyDir (dir, callback) {
   callback = callback || function () {}
@@ -11529,7 +11585,7 @@ module.exports = {
 
 
 /***/ }),
-/* 353 */
+/* 355 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11582,15 +11638,15 @@ module.exports = {
 
 
 /***/ }),
-/* 354 */
+/* 356 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
-const file = __webpack_require__(353)
-const link = __webpack_require__(355)
-const symlink = __webpack_require__(358)
+const file = __webpack_require__(355)
+const link = __webpack_require__(357)
+const symlink = __webpack_require__(360)
 
 module.exports = {
   // file
@@ -11612,7 +11668,7 @@ module.exports = {
 
 
 /***/ }),
-/* 355 */
+/* 357 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11680,7 +11736,7 @@ module.exports = {
 
 
 /***/ }),
-/* 356 */
+/* 358 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11786,7 +11842,7 @@ module.exports = {
 
 
 /***/ }),
-/* 357 */
+/* 359 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11824,7 +11880,7 @@ module.exports = {
 
 
 /***/ }),
-/* 358 */
+/* 360 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11837,11 +11893,11 @@ const _mkdirs = __webpack_require__(21)
 const mkdirs = _mkdirs.mkdirs
 const mkdirsSync = _mkdirs.mkdirsSync
 
-const _symlinkPaths = __webpack_require__(356)
+const _symlinkPaths = __webpack_require__(358)
 const symlinkPaths = _symlinkPaths.symlinkPaths
 const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
 
-const _symlinkType = __webpack_require__(357)
+const _symlinkType = __webpack_require__(359)
 const symlinkType = _symlinkType.symlinkType
 const symlinkTypeSync = _symlinkType.symlinkTypeSync
 
@@ -11897,36 +11953,7 @@ module.exports = {
 
 
 /***/ }),
-/* 359 */
-/***/ (function(module, exports, __webpack_require__) {
-
-"use strict";
-
-
-const assign = __webpack_require__(369)
-
-const fs = {}
-
-// Export graceful-fs:
-assign(fs, __webpack_require__(139))
-// Export extra methods:
-assign(fs, __webpack_require__(351))
-assign(fs, __webpack_require__(137))
-assign(fs, __webpack_require__(21))
-assign(fs, __webpack_require__(71))
-assign(fs, __webpack_require__(360))
-assign(fs, __webpack_require__(366))
-assign(fs, __webpack_require__(365))
-assign(fs, __webpack_require__(352))
-assign(fs, __webpack_require__(354))
-assign(fs, __webpack_require__(367))
-assign(fs, __webpack_require__(36))
-
-module.exports = fs
-
-
-/***/ }),
-/* 360 */
+/* 361 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11935,8 +11962,8 @@ module.exports = fs
 const u = __webpack_require__(16).fromCallback
 const jsonFile = __webpack_require__(100)
 
-jsonFile.outputJsonSync = __webpack_require__(361)
-jsonFile.outputJson = u(__webpack_require__(362))
+jsonFile.outputJsonSync = __webpack_require__(362)
+jsonFile.outputJson = u(__webpack_require__(363))
 // aliases
 jsonFile.outputJSONSync = jsonFile.outputJSONSync
 jsonFile.outputJSON = jsonFile.outputJson
@@ -11949,7 +11976,7 @@ module.exports = jsonFile
 
 
 /***/ }),
-/* 361 */
+/* 362 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -11974,7 +12001,7 @@ module.exports = outputJsonSync
 
 
 /***/ }),
-/* 362 */
+/* 363 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12008,7 +12035,7 @@ module.exports = outputJson
 
 
 /***/ }),
-/* 363 */
+/* 364 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12016,7 +12043,7 @@ module.exports = outputJson
 
 const fs = __webpack_require__(11)
 const path = __webpack_require__(10)
-const invalidWin32Path = __webpack_require__(140).invalidWin32Path
+const invalidWin32Path = __webpack_require__(141).invalidWin32Path
 
 const o777 = parseInt('0777', 8)
 
@@ -12074,7 +12101,7 @@ module.exports = mkdirsSync
 
 
 /***/ }),
-/* 364 */
+/* 365 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12082,7 +12109,7 @@ module.exports = mkdirsSync
 
 const fs = __webpack_require__(11)
 const path = __webpack_require__(10)
-const invalidWin32Path = __webpack_require__(140).invalidWin32Path
+const invalidWin32Path = __webpack_require__(141).invalidWin32Path
 
 const o777 = parseInt('0777', 8)
 
@@ -12144,7 +12171,7 @@ module.exports = mkdirs
 
 
 /***/ }),
-/* 365 */
+/* 366 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12153,9 +12180,9 @@ module.exports = mkdirs
 const fs = __webpack_require__(11)
 const path = __webpack_require__(10)
 const copySync = __webpack_require__(137).copySync
-const removeSync = __webpack_require__(71).removeSync
+const removeSync = __webpack_require__(72).removeSync
 const mkdirpSync = __webpack_require__(21).mkdirsSync
-const buffer = __webpack_require__(141)
+const buffer = __webpack_require__(142)
 
 function moveSync (src, dest, options) {
   options = options || {}
@@ -12269,7 +12296,7 @@ module.exports = {
 
 
 /***/ }),
-/* 366 */
+/* 367 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12285,7 +12312,7 @@ const u = __webpack_require__(16).fromCallback
 const fs = __webpack_require__(11)
 const ncp = __webpack_require__(138)
 const path = __webpack_require__(10)
-const remove = __webpack_require__(71).remove
+const remove = __webpack_require__(72).remove
 const mkdirp = __webpack_require__(21).mkdirs
 
 function move (source, dest, options, callback) {
@@ -12438,7 +12465,7 @@ module.exports = {
 
 
 /***/ }),
-/* 367 */
+/* 368 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12485,7 +12512,7 @@ module.exports = {
 
 
 /***/ }),
-/* 368 */
+/* 369 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12493,7 +12520,7 @@ module.exports = {
 
 const fs = __webpack_require__(11)
 const path = __webpack_require__(10)
-const assert = __webpack_require__(142)
+const assert = __webpack_require__(143)
 
 const isWindows = (process.platform === 'win32')
 
@@ -12788,7 +12815,7 @@ rimraf.sync = rimrafSync
 
 
 /***/ }),
-/* 369 */
+/* 370 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12811,14 +12838,14 @@ module.exports = assign
 
 
 /***/ }),
-/* 370 */
+/* 371 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
 
 
 const fs = __webpack_require__(11)
-const os = __webpack_require__(378)
+const os = __webpack_require__(144)
 const path = __webpack_require__(10)
 
 // HFS, ext{2,3}, FAT do not, Node.js v0.10 does not
@@ -12890,7 +12917,7 @@ module.exports = {
 
 
 /***/ }),
-/* 371 */
+/* 372 */
 /***/ (function(module, exports, __webpack_require__) {
 
 "use strict";
@@ -12916,7 +12943,7 @@ function clone (obj) {
 
 
 /***/ }),
-/* 372 */
+/* 373 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var Stream = __webpack_require__(379).Stream
@@ -13040,10 +13067,10 @@ function legacy (fs) {
 
 
 /***/ }),
-/* 373 */
+/* 374 */
 /***/ (function(module, exports, __webpack_require__) {
 
-var constants = __webpack_require__(376)
+var constants = __webpack_require__(377)
 
 var origCwd = process.cwd
 var cwd = null
@@ -13375,14 +13402,14 @@ function patch (fs) {
 
 
 /***/ }),
-/* 374 */
+/* 375 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var _fs
 try {
   _fs = __webpack_require__(11)
 } catch (_) {
-  _fs = __webpack_require__(72)
+  _fs = __webpack_require__(57)
 }
 
 function readFile (file, options, callback) {
@@ -13515,7 +13542,7 @@ module.exports = jsonfile
 
 
 /***/ }),
-/* 375 */
+/* 376 */
 /***/ (function(module, exports, __webpack_require__) {
 
 var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//     Underscore.js 1.6.0
@@ -14864,23 +14891,17 @@ var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//     Underscor
 }).call(this);
 
 
-/***/ }),
-/* 376 */
-/***/ (function(module, exports) {
-
-module.exports = require("constants");
-
 /***/ }),
 /* 377 */
 /***/ (function(module, exports) {
 
-module.exports = require("crypto");
+module.exports = require("constants");
 
 /***/ }),
 /* 378 */
 /***/ (function(module, exports) {
 
-module.exports = require("os");
+module.exports = require("crypto");
 
 /***/ }),
 /* 379 */
@@ -14898,8 +14919,8 @@ module.exports = require("util");
 /* 381 */
 /***/ (function(module, exports, __webpack_require__) {
 
-__webpack_require__(144);
-module.exports = __webpack_require__(143);
+__webpack_require__(146);
+module.exports = __webpack_require__(145);
 
 
 /***/ })