"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var src_1 = __importDefault(require("../src")); var assert = require("assert"); var fs = require("fs"); var sinon_1 = require("sinon"); var sb = sinon_1.sandbox.create(); describe("testCSVConverter3", function () { afterEach(function () { sb.restore(); }); it("should parse large csv file with UTF-8 without spliting characters", function (done) { var testData = __dirname + "/data/large-utf8.csv"; var rs = fs.createReadStream(testData); var csvConverter = src_1.default({}); var count = 0; csvConverter.preRawData(function (csvRawData) { assert(csvRawData.charCodeAt(0) < 2000); return csvRawData; }); csvConverter.on("data", function () { count++; }); csvConverter.then(function () { assert(count === 5290); done(); }); rs.pipe(csvConverter); }); it("should setup customise type convert function", function (done) { src_1.default({ checkType: true, colParser: { "column1": "string", "column5": function (item, head, resultRow, row, i) { assert.equal(item, '{"hello":"world"}'); assert.equal(head, "column5"), assert(resultRow); assert(row); assert.equal(i, 5); return "hello world"; } } }) .fromFile(__dirname + "/data/dataWithType") .subscribe(function (json) { assert.equal(typeof json.column1, "string"); assert.equal(json.column5, "hello world"); assert.strictEqual(json["name#!"], false); assert.strictEqual(json["column9"], true); }) .on('done', function () { done(); }); }); it("should accept pipe as quote", function (done) { src_1.default({ quote: "|", output: "csv" }) .fromFile(__dirname + "/data/pipeAsQuote") .subscribe(function (csv) { assert.equal(csv[2], "blahhh, blah"); }) .on('done', function () { done(); }); }); it("emit file not exists error when try to open a non-exists file", function () { var called = false; var cb = sb.spy(function (err) { assert(err.toString().indexOf("File does not exist") > -1); }); return src_1.default() .fromFile("somefile") .subscribe(function (csv) { }) .on("error", cb) .then(function () { assert(false); }, function (err) { assert.equal(cb.callCount, 1); }); }); it("should include column that is both included and excluded", function () { return src_1.default({ includeColumns: /b/, ignoreColumns: /a|b/ }) .fromString("a,b,c\n1,2,3\n4,5,6") .subscribe(function (d) { assert(d.b); assert(!d.a); }); }); it("should allow async preLine hook", function () { return src_1.default() .preFileLine(function (line) { return new Promise(function (resolve, reject) { setTimeout(function () { resolve(line + "changed"); }, 20); }); }) .fromString("a,b\n1,2") .subscribe(function (d) { assert(d.bchanged); assert.equal(d.bchanged, "2changed"); }); }); it("should allow async subscribe function", function () { return src_1.default({ trim: true }) .fromString("a,b,c\n 1,2,3\n 4,5,6") .subscribe(function (d) { return new Promise(function (resolve, reject) { setTimeout(function () { d.a = 10; resolve(); }, 20); }); }) .then(function (d) { assert.equal(d[0].a, 10); assert.equal(d[1].a, 10); }); }); it("should propagate value to next then", function () { return src_1.default({ trim: true }) .fromString("a,b,c\n 1,2,3\n 4,5,6") .then(undefined, undefined) .then(function (d) { assert.equal(d.length, 2); assert.equal(d[0].a, "1"); }); }); it("should propagate error to next then", function () { return src_1.default({ trim: true }) .fromFile(__dirname + "/data/dataWithUnclosedQuotes") .then(undefined, undefined) .then(function () { assert(false); }, function (err) { assert(err); assert.equal(err.err, "unclosed_quote"); }); }); it("should fallback to text is number can not be parsed", function () { return src_1.default({ colParser: { "a": "number" } }) .fromString("a,b,c\n 1,2,3\n fefe,5,6") .then(function (d) { assert.strictEqual(d[0].a, 1); assert.equal(d[1].a, "fefe"); }); }); it("should omit a column", function () { return src_1.default({ colParser: { "a": "omit" } }) .fromString("a,b,c\n 1,2,3\n fefe,5,6") .then(function (d) { assert.strictEqual(d[0].a, undefined); assert.equal(d[1].a, undefined); }); }); it("could turn off quote and should trim even quote is turned off", function () { return src_1.default({ quote: "off", trim: true }) .fromString("a,b,c\n \"1\",\"2\",\"3\"\n \"fefe,5\",6") .then(function (d) { assert.equal(d[0].a, '"1"'); assert.equal(d[0].b, '"2"'); assert.equal(d[1].a, '"fefe'); assert.equal(d[1].b, '5"'); }); }); it("should allow ignoreEmpty with checkColumn", function () { return src_1.default({ checkColumn: true, ignoreEmpty: true }) .fromString("date,altitude,airtime\n 2016-07-08,2000,23\n \n 2016-07-09,3000,43") .then(function (data) { }, function (err) { console.log(err); assert(!err); }); }); it("should allow quotes without content", function () { var data = "a|^^|^b^"; return src_1.default({ delimiter: '|', quote: '^', noheader: true, }) .fromString(data) .then(function (jsonObj) { assert.equal(jsonObj[0].field2, ""); }); }); it("should parse header with quotes correctly", function () { var testData = __dirname + "/data/csvWithUnclosedHeader"; return src_1.default({ headers: ["exam_date", "sample_no", "status", "sample_type", "patient_id", "last_name", "first_name", "gender_of_patient", "patient_birth_date", "patient_note", "patient_department", "accession_number", "sample_site", "physician", "operator", "department", "note", "test_order_code", "draw_time", "approval_status", "approval_time", "report_layout", "patient_account_number", "none_1", "errors_detected_during_measurement", "age", "error_code_01", "weight", "error_code_02", "height", "error_code_03", "hcg_beta_p", "error_code_04", "troponin_i_p", "error_code_05", "ck_mb_p", "error_code_06", "d_dimer_p", "error_code_07", "hscrp_p", "error_code_08", "myoglobin_p", "error_code_09", "nt_probnp", "error_code_10", "crp", "error_code_11", "bnp", "error_code_12", "tnt", "error_code_13", "demo_p", "error_code_14", "pct", "error_code_15"] }) .fromFile(testData) .then(function (d) { assert.equal(d.length, 2); assert.equal(d[0].sample_no, "12669"); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiL1VzZXJzL2t4aWFuZy93b3JrL3Byb2plY3RzL2NzdjJqc29uL3Rlc3QvdGVzdENTVkNvbnZlcnRlcjMudHMiLCJzb3VyY2VzIjpbIi9Vc2Vycy9reGlhbmcvd29yay9wcm9qZWN0cy9jc3YyanNvbi90ZXN0L3Rlc3RDU1ZDb252ZXJ0ZXIzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsK0NBQXlCO0FBQ3pCLElBQUksTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQixJQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsK0JBQWdDO0FBRWhDLElBQU0sRUFBRSxHQUFHLGVBQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUM1QixRQUFRLENBQUMsbUJBQW1CLEVBQUU7SUFDNUIsU0FBUyxDQUFDO1FBQ1IsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsb0VBQW9FLEVBQUUsVUFBVSxJQUFJO1FBQ3JGLElBQUksUUFBUSxHQUFHLFNBQVMsR0FBRyxzQkFBc0IsQ0FBQztRQUNsRCxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsSUFBSSxZQUFZLEdBQUcsYUFBRyxDQUFDLEVBQ3RCLENBQUMsQ0FBQztRQUNILElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxVQUFVO1lBQzFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsWUFBWSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsS0FBSyxFQUFFLENBQUM7UUFDVixDQUFDLENBQUMsQ0FBQztRQUNILFlBQVksQ0FBQyxJQUFJ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O2FBQ2xCLElBQUksQ0FBQyxVQUFDLENBQUM7WUFDTixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFBO0lBRUosQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjc3YgZnJvbSBcIi4uL3NyY1wiO1xudmFyIGFzc2VydCA9IHJlcXVpcmUoXCJhc3NlcnRcIik7XG52YXIgZnMgPSByZXF1aXJlKFwiZnNcIik7XG5pbXBvcnQgeyBzYW5kYm94IH0gZnJvbSBcInNpbm9uXCI7XG5pbXBvcnQgQ1NWRXJyb3IgZnJvbSBcIi4uL3NyYy9DU1ZFcnJvclwiO1xuY29uc3Qgc2IgPSBzYW5kYm94LmNyZWF0ZSgpO1xuZGVzY3JpYmUoXCJ0ZXN0Q1NWQ29udmVydGVyM1wiLCBmdW5jdGlvbiAoKSB7XG4gIGFmdGVyRWFjaChmdW5jdGlvbiAoKSB7XG4gICAgc2IucmVzdG9yZSgpO1xuICB9KTtcbiAgaXQoXCJzaG91bGQgcGFyc2UgbGFyZ2UgY3N2IGZpbGUgd2l0aCBVVEYtOCB3aXRob3V0IHNwbGl0aW5nIGNoYXJhY3RlcnNcIiwgZnVuY3Rpb24gKGRvbmUpIHtcbiAgICB2YXIgdGVzdERhdGEgPSBfX2Rpcm5hbWUgKyBcIi9kYXRhL2xhcmdlLXV0ZjguY3N2XCI7XG4gICAgdmFyIHJzID0gZnMuY3JlYXRlUmVhZFN0cmVhbSh0ZXN0RGF0YSk7XG4gICAgdmFyIGNzdkNvbnZlcnRlciA9IGNzdih7XG4gICAgfSk7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICBjc3ZDb252ZXJ0ZXIucHJlUmF3RGF0YShmdW5jdGlvbiAoY3N2UmF3RGF0YSkge1xuICAgICAgYXNzZXJ0KGNzdlJhd0RhdGEuY2hhckNvZGVBdCgwKSA8IDIwMDApO1xuICAgICAgcmV0dXJuIGNzdlJhd0RhdGE7XG4gICAgfSlcbiAgICBjc3ZDb252ZXJ0ZXIub24oXCJkYXRhXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvdW50Kys7XG4gICAgfSk7XG4gICAgY3N2Q29udmVydGVyLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgYXNzZXJ0KGNvdW50ID09PSA1MjkwKTtcbiAgICAgIGRvbmUoKTtcbiAgICB9KTtcbiAgICBycy5waXBlKGNzdkNvbnZlcnRlcik7XG4gIH0pO1xuICBpdChcInNob3VsZCBzZXR1cCBjdXN0b21pc2UgdHlwZSBjb252ZXJ0IGZ1bmN0aW9uXCIsIGZ1bmN0aW9uIChkb25lKSB7XG4gICAgY3N2KHtcbiAgICAgIGNoZWNrVHlwZTogdHJ1ZSxcbiAgICAgIGNvbFBhcnNlcjoge1xuICAgICAgICBcImNvbHVtbjFcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCJjb2x1bW41XCI6IGZ1bmN0aW9uIChpdGVtLCBoZWFkLCByZXN1bHRSb3csIHJvdywgaSkge1xuICAgICAgICAgIGFzc2VydC5lcXVhbChpdGVtLCAne1wiaGVsbG9cIjpcIndvcmxkXCJ9Jyk7XG4gICAgICAgICAgYXNzZXJ0LmVxdWFsKGhlYWQsIFwiY29sdW1uNVwiKSxcbiAgICAgICAgICAgIGFzc2VydChyZXN1bHRSb3cpO1xuICAgICAgICAgIGFzc2VydChyb3cpO1xuICAgICAgICAgIGFzc2VydC5lcXVhbChpLCA1KTtcbiAgICAgICAgICByZXR1cm4gXCJoZWxsbyB3b3JsZFwiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgICAgIC5mcm9tRmlsZShfX2Rpcm5hbWUgKyBcIi9kYXRhL2RhdGFXaXRoVHlwZVwiKVxuICAgICAgLnN1YnNjcmliZShmdW5jdGlvbiAoanNvbikge1xuICAgICAgICBhc3NlcnQuZXF1YWwodHlwZW9mIGpzb24uY29sdW1uMSwgXCJzdHJpbmdcIik7XG4gICAgICAgIGFzc2VydC5lcXVhbChqc29uLmNvbHVtbjUsIFwiaGVsbG8gd29ybGRcIik7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChqc29uW1wibmFtZSMhXCJdLCBmYWxzZSk7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChqc29uW1wiY29sdW1uOVwiXSwgdHJ1ZSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdkb25lJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBkb25lKClcbiAgICAgIH0pO1xuICB9KVxuICBpdChcInNob3VsZCBhY2NlcHQgcGlwZSBhcyBxdW90ZVwiLCBmdW5jdGlvbiAoZG9uZSkge1xuICAgIGNzdih7XG4gICAgICBxdW90ZTogXCJ8XCIsXG4gICAgICBvdXRwdXQ6IFwiY3N2XCJcbiAgICB9KVxuICAgICAgLmZyb21GaWxlKF9fZGlybmFtZSArIFwiL2RhdGEvcGlwZUFzUXVvdGVcIilcbiAgICAgIC5zdWJzY3JpYmUoZnVuY3Rpb24gKGNzdikge1xuICAgICAgICBhc3NlcnQuZXF1YWwoY3N2WzJdLCBcImJsYWhoaCwgYmxhaFwiKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2RvbmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGRvbmUoKVxuICAgICAgfSk7XG4gIH0pXG4gIGl0KFwiZW1pdCBmaWxlIG5vdCBleGlzdHMgZXJyb3Igd2hlbiB0cnkgdG8gb3BlbiBhIG5vbi1leGlzdHMgZmlsZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IGNhbGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IGNiID0gc2Iuc3B5KChlcnIpID0+IHtcbiAgICAgIGFzc2VydChlcnIudG9TdHJpbmcoKS5pbmRleE9mKFwiRmlsZSBkb2VzIG5vdCBleGlzdFwiKSA+IC0xKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY3N2KClcbiAgICAgIC5mcm9tRmlsZShcInNvbWVmaWxlXCIpXG4gICAgICAuc3Vic2NyaWJlKGZ1bmN0aW9uIChjc3YpIHtcblxuICAgICAgfSlcbiAgICAgIC5vbihcImVycm9yXCIsIGNiKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBhc3NlcnQoZmFsc2UpO1xuICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoY2IuY2FsbENvdW50LCAxKTtcbiAgICAgIH0pXG5cbiAgfSlcbiAgaXQoXCJzaG91bGQgaW5jbHVkZSBjb2x1bW4gdGhhdCBpcyBib3RoIGluY2x1ZGVkIGFuZCBleGNsdWRlZFwiLCAoKSA9PiB7XG4gICAgcmV0dXJuIGNzdih7XG4gICAgICBpbmNsdWRlQ29sdW1uczogL2IvLFxuICAgICAgaWdub3JlQ29sdW1uczogL2F8Yi9cbiAgICB9KVxuICAgICAgLmZyb21TdHJpbmcoYGEsYixjXG4xLDIsM1xuNCw1LDZgKVxuICAgICAgLnN1YnNjcmliZSgoZCkgPT4ge1xuICAgICAgICBhc3NlcnQoZC5iKTtcbiAgICAgICAgYXNzZXJ0KCFkLmEpO1xuICAgICAgfSlcbiAgfSlcbiAgaXQoXCJzaG91bGQgYWxsb3cgYXN5bmMgcHJlTGluZSBob29rXCIsICgpID0+IHtcbiAgICByZXR1cm4gY3N2KClcbiAgICAgIC5wcmVGaWxlTGluZSgobGluZSkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShsaW5lICsgXCJjaGFuZ2VkXCIpXG4gICAgICAgICAgfSwgMjApO1xuXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgICAgLmZyb21TdHJpbmcoYGEsYlxuMSwyYClcbiAgICAgIC5zdWJzY3JpYmUoKGQpID0+IHtcbiAgICAgICAgYXNzZXJ0KGQuYmNoYW5nZWQpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZC5iY2hhbmdlZCwgXCIyY2hhbmdlZFwiKTtcbiAgICAgIH0pXG5cbiAgfSlcblxuICBpdChcInNob3VsZCBhbGxvdyBhc3luYyBzdWJzY3JpYmUgZnVuY3Rpb25cIiwgKCkgPT4ge1xuICAgIHJldHVybiBjc3YoeyB0cmltOiB0cnVlIH0pXG4gICAgICAuZnJvbVN0cmluZyhgYSxiLGNcbiAgICAxLDIsM1xuICAgIDQsNSw2YClcbiAgICAgIC5zdWJzY3JpYmUoKGQpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGQuYSA9IDEwO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH0sIDIwKTtcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAudGhlbigoZCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFswXS5hLCAxMCk7XG4gICAgICAgIGFzc2VydC5lcXVhbChkWzFdLmEsIDEwKTtcbiAgICAgIH0pXG4gIH0pXG4gIGl0KFwic2hvdWxkIHByb3BhZ2F0ZSB2YWx1ZSB0byBuZXh0IHRoZW5cIiwgKCkgPT4ge1xuICAgIHJldHVybiBjc3YoeyB0cmltOiB0cnVlIH0pXG4gICAgICAuZnJvbVN0cmluZyhgYSxiLGNcbiAgMSwyLDNcbiAgNCw1LDZgKVxuICAgICAgLnRoZW4odW5kZWZpbmVkLCB1bmRlZmluZWQpXG4gICAgICAudGhlbigoZCkgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoZC5sZW5ndGgsIDIpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFswXS5hLCBcIjFcIik7XG4gICAgICB9KVxuXG4gIH0pXG4gIGl0KFwic2hvdWxkIHByb3BhZ2F0ZSBlcnJvciB0byBuZXh0IHRoZW5cIiwgKCkgPT4ge1xuICAgIHJldHVybiBjc3YoeyB0cmltOiB0cnVlIH0pXG4gICAgICAuZnJvbUZpbGUoX19kaXJuYW1lICsgXCIvZGF0YS9kYXRhV2l0aFVuY2xvc2VkUXVvdGVzXCIpXG4gICAgICAudGhlbih1bmRlZmluZWQsIHVuZGVmaW5lZClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgYXNzZXJ0KGZhbHNlKVxuICAgICAgfSwgKGVycjogQ1NWRXJyb3IpID0+IHtcbiAgICAgICAgYXNzZXJ0KGVycik7XG4gICAgICAgIGFzc2VydC5lcXVhbChlcnIuZXJyLCBcInVuY2xvc2VkX3F1b3RlXCIpO1xuICAgICAgfSlcbiAgfSlcbiAgaXQoXCJzaG91bGQgZmFsbGJhY2sgdG8gdGV4dCBpcyBudW1iZXIgY2FuIG5vdCBiZSBwYXJzZWRcIiwgKCkgPT4ge1xuICAgIHJldHVybiBjc3Yoe1xuICAgICAgY29sUGFyc2VyOiB7XG4gICAgICAgIFwiYVwiOiBcIm51bWJlclwiXG4gICAgICB9XG4gICAgfSlcbiAgICAgIC5mcm9tU3RyaW5nKGBhLGIsY1xuICAxLDIsM1xuICBmZWZlLDUsNmApXG4gICAgICAudGhlbigoZCkgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZFswXS5hLCAxKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMV0uYSwgXCJmZWZlXCIpO1xuICAgICAgfSlcbiAgfSlcbiAgaXQoXCJzaG91bGQgb21pdCBhIGNvbHVtblwiLCAoKSA9PiB7XG4gICAgcmV0dXJuIGNzdih7XG4gICAgICBjb2xQYXJzZXI6IHtcbiAgICAgICAgXCJhXCI6IFwib21pdFwiXG4gICAgICB9XG4gICAgfSlcbiAgICAgIC5mcm9tU3RyaW5nKGBhLGIsY1xuICAxLDIsM1xuICBmZWZlLDUsNmApXG4gICAgICAudGhlbigoZCkgPT4ge1xuICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZFswXS5hLCB1bmRlZmluZWQpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFsxXS5hLCB1bmRlZmluZWQpO1xuICAgICAgfSlcbiAgfSlcbiAgaXQoXCJjb3VsZCB0dXJuIG9mZiBxdW90ZSBhbmQgc2hvdWxkIHRyaW0gZXZlbiBxdW90ZSBpcyB0dXJuZWQgb2ZmXCIsICgpID0+IHtcbiAgICByZXR1cm4gY3N2KHtcbiAgICAgIHF1b3RlOiBcIm9mZlwiLFxuICAgICAgdHJpbTogdHJ1ZVxuICAgIH0pXG4gICAgICAuZnJvbVN0cmluZyhgYSxiLGNcbiAgXCIxXCIsXCIyXCIsXCIzXCJcbiAgXCJmZWZlLDVcIiw2YClcbiAgICAgIC50aGVuKChkKSA9PiB7XG4gICAgICAgIGFzc2VydC5lcXVhbChkWzBdLmEsICdcIjFcIicpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFswXS5iLCAnXCIyXCInKTtcbiAgICAgICAgYXNzZXJ0LmVxdWFsKGRbMV0uYSwgJ1wiZmVmZScpO1xuICAgICAgICBhc3NlcnQuZXF1YWwoZFsxXS5iLCAnNVwiJyk7XG4gICAgICB9KVxuICB9KVxuICBpdChcInNob3VsZCBhbGxvdyBpZ25vcmVFbXB0eSB3aXRoIGNoZWNrQ29sdW1uXCIsICgpID0+IHtcbiAgICByZXR1cm4gY3N2KHtcbiAgICAgIGNoZWNrQ29sdW1uOiB0cnVlLFxuICAgICAgaWdub3JlRW1wdHk6IHRydWVcbiAgICB9KVxuICAgICAgLmZyb21TdHJpbmcoYGRhdGUsYWx0aXR1ZGUsYWlydGltZVxuICAgIDIwMTYtMDctMDgsMjAwMCwyM1xuICAgIFxuICAgIDIwMTYtMDctMDksMzAwMCw0M2ApXG4gICAgICAudGhlbigoZGF0YSkgPT4ge1xuXG4gICAgICB9LCAoZXJyKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgIGFzc2VydCghZXJyKTtcbiAgICAgIH0pXG4gIH0pO1xuICBpdChcInNob3VsZCBhbGxvdyBxdW90ZXMgd2l0aG91dCBjb250ZW50XCIsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gXCJhfF5efF5iXlwiO1xuICAgIHJldHVybiBjc3Yoe1xuICAgICAgZGVsaW1pdGVyOiAnfCcsXG4gICAgICBxdW90ZTogJ14nLFxuICAgICAgbm9oZWFkZXI6IHRydWUsXG4gICAgfSlcbiAgICAgIC5mcm9tU3RyaW5nKGRhdGEpXG4gICAgICAudGhlbigoanNvbk9iaikgPT4ge1xuICAgICAgICBhc3NlcnQuZXF1YWwoanNvbk9ialswXS5maWVsZDIsIFwiXCIpO1xuICAgICAgfSk7XG4gIH0pXG4gIGl0KFwic2hvdWxkIHBhcnNlIGhlYWRlciB3aXRoIHF1b3RlcyBjb3JyZWN0bHlcIiwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB0ZXN0RGF0YSA9IF9fZGlybmFtZSArIFwiL2RhdGEvY3N2V2l0aFVuY2xvc2VkSGVhZGVyXCI7XG4gICAgcmV0dXJuIGNzdih7XG4gICAgICBoZWFkZXJzOltcImV4YW1fZGF0ZVwiLFwic2FtcGxlX25vXCIsXCJzdGF0dXNcIixcInNhbXBsZV90eXBlXCIsXCJwYXRpZW50X2lkXCIsXCJsYXN0X25hbWVcIixcImZpcnN0X25hbWVcIixcImdlbmRlcl9vZl9wYXRpZW50XCIsXCJwYXRpZW50X2JpcnRoX2RhdGVcIixcInBhdGllbnRfbm90ZVwiLFwicGF0aWVudF9kZXBhcnRtZW50XCIsXCJhY2Nlc3Npb25fbnVtYmVyXCIsXCJzYW1wbGVfc2l0ZVwiLFwicGh5c2ljaWFuXCIsXCJvcGVyYXRvclwiLFwiZGVwYXJ0bWVudFwiLFwibm90ZVwiLFwidGVzdF9vcmRlcl9jb2RlXCIsXCJkcmF3X3RpbWVcIixcImFwcHJvdmFsX3N0YXR1c1wiLFwiYXBwcm92YWxfdGltZVwiLFwicmVwb3J0X2xheW91dFwiLFwicGF0aWVudF9hY2NvdW50X251bWJlclwiLFwibm9uZV8xXCIsXCJlcnJvcnNfZGV0ZWN0ZWRfZHVyaW5nX21lYXN1cmVtZW50XCIsXCJhZ2VcIixcImVycm9yX2NvZGVfMDFcIixcIndlaWdodFwiLFwiZXJyb3JfY29kZV8wMlwiLFwiaGVpZ2h0XCIsXCJlcnJvcl9jb2RlXzAzXCIsXCJoY2dfYmV0YV9wXCIsXCJlcnJvcl9jb2RlXzA0XCIsXCJ0cm9wb25pbl9pX3BcIixcImVycm9yX2NvZGVfMDVcIixcImNrX21iX3BcIixcImVycm9yX2NvZGVfMDZcIixcImRfZGltZXJfcFwiLFwiZXJyb3JfY29kZV8wN1wiLFwiaHNjcnBfcFwiLFwiZXJyb3JfY29kZV8wOFwiLFwibXlvZ2xvYmluX3BcIixcImVycm9yX2NvZGVfMDlcIixcIm50X3Byb2JucFwiLFwiZXJyb3JfY29kZV8xMFwiLFwiY3JwXCIsXCJlcnJvcl9jb2RlXzExXCIsXCJibnBcIixcImVycm9yX2NvZGVfMTJcIixcInRudFwiLFwiZXJyb3JfY29kZV8xM1wiLFwiZGVtb19wXCIsXCJlcnJvcl9jb2RlXzE0XCIsXCJwY3RcIixcImVycm9yX2NvZGVfMTVcIl1cbiAgICB9KVxuICAgIC5mcm9tRmlsZSh0ZXN0RGF0YSlcbiAgICAudGhlbigoZCk9PntcbiAgICAgIGFzc2VydC5lcXVhbChkLmxlbmd0aCwyKTtcbiAgICAgIGFzc2VydC5lcXVhbChkWzBdLnNhbXBsZV9ubyxcIjEyNjY5XCIpO1xuICAgIH0pXG4gICAgXG4gIH0pO1xufSk7XG4iXX0=