asmimproved-dbgmits
Version:
Provides the ability to control GDB and LLDB programmatically via GDB/MI.
192 lines • 25.6 kB
JavaScript
// Copyright (c) 2015 Vadim Macagon
// MIT License, see LICENSE file for full terms.
"use strict";
require('source-map-support').install();
var chai = require('chai');
var parser = require('../lib/mi_output_parser');
var mi_output_1 = require('../lib/mi_output');
// aliases
var expect = chai.expect;
describe("MI Output Parser", function () {
describe("Result Records", function () {
it("parses 'done'", function () {
var result = parser.parse('^done');
expect(result.recordType).to.equal(mi_output_1.RecordType.Done);
});
it("parses 'done' from 'add breakpoint' command", function () {
var id = '1';
var addr = '0x004009a3';
var func = 'main';
var filename = 'main.cpp';
var fullname = '/home/enlight/build/../hello-world/main.cpp';
var line = '5';
var result = parser.parse(("^done,bkpt={number=\"" + id + "\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"" + addr + "\",") +
("func=\"" + func + "\",file=\"" + filename + "\",fullname=\"" + fullname + "\",") +
("line=\"" + line + "\",times=\"0\",original-location=\"" + func + "\"}"));
expect(result.recordType).to.equal(mi_output_1.RecordType.Done);
expect(result.data).to.have.property('bkpt');
var bkpt = result.data.bkpt;
expect(bkpt).to.have.property('number', id);
expect(bkpt).to.have.property('type', 'breakpoint');
expect(bkpt).to.have.property('disp', 'keep');
expect(bkpt).to.have.property('enabled', 'y');
expect(bkpt).to.have.property('addr', addr);
expect(bkpt).to.have.property('func', func);
expect(bkpt).to.have.property('file', filename);
expect(bkpt).to.have.property('fullname', fullname);
expect(bkpt).to.have.property('line', line);
expect(bkpt).to.have.property('times', '0');
expect(bkpt).to.have.property('original-location', func);
});
it("parses 'done' from 'insert-break' command for a multi-location breakpoint", function () {
var breakpointId = '1';
var addr = '<MULTIPLE>';
var locationIds = ['1.1', '1.2', '1.3'];
var filename = '../test/break_tests_target.cpp';
var fullname = '/media/sf_dbgmits/test/break_tests_target.cpp';
var locationLines = ['15', '20', '25'];
var threadGroupId = 'i1';
var result = parser.parse(("^done,bkpt={number=\"" + breakpointId + "\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",") +
("addr=\"" + addr + "\",times=\"0\",original-location=\"funcC\"},") +
("{number=\"" + locationIds[0] + "\",enabled=\"y\",addr=\"0x0000000000400868\",func=\"funcC()\",") +
("file=\"" + filename + "\",fullname=\"" + fullname + "\",line=\"" + locationLines[0] + "\",") +
("thread-groups=[\"" + threadGroupId + "\"]},") +
("{number=\"" + locationIds[1] + "\",enabled=\"y\",addr=\"0x0000000000400872\",func=\"funcC(int)\",") +
("file=\"" + filename + "\",fullname=\"" + fullname + "\",line=\"" + locationLines[1] + "\",") +
("thread-groups=[\"" + threadGroupId + "\"]},") +
("{number=\"" + locationIds[2] + "\",enabled=\"y\",addr=\"0x0000000000400881\",func=\"funcC(int, bool)\",") +
("file=\"" + filename + "\",fullname=\"" + fullname + "\",line=\"" + locationLines[2] + "\",") +
("thread-groups=[\"" + threadGroupId + "\"]}"));
expect(result.recordType).to.equal(mi_output_1.RecordType.Done);
expect(result.data).to.have.property('bkpt').of.length(4);
var bkpt = result.data.bkpt;
expect(bkpt[0]).to.have.property('number', breakpointId);
expect(bkpt[0]).to.have.property('addr', addr);
for (var i = 1; i < bkpt.length; ++i) {
expect(bkpt[i]).to.have.property('number', locationIds[i - 1]);
expect(bkpt[i]).to.have.property('file', filename);
expect(bkpt[i]).to.have.property('fullname', fullname);
expect(bkpt[i]).to.have.property('line', locationLines[i - 1]);
expect(bkpt[i]).to.have.property('thread-groups').of.length(1);
expect(bkpt[i]['thread-groups']).to.contain(threadGroupId);
}
});
it("parses 'done' from 'get stack depth' command", function () {
var frameLevel = '0';
var frameAddr = '0x000000000040080a';
var frameFunc = 'getNextInt';
var frameFile = '../test_target.cpp';
var frameFullname = '/test/test_target.cpp';
var frameLine = '6';
var result = parser.parse("^done,stack=[" +
("frame={level=\"" + frameLevel + "\",addr=\"" + frameAddr + "\",func=\"" + frameFunc + "\",file=\"" + frameFile + "\",") +
("fullname=\"" + frameFullname + "\",line=\"" + frameLine + "\"},") +
"frame={level=\"1\",addr=\"0x0000000000400828\",func=\"printNextInt\",file=\"../test_target.cpp\"," +
"fullname=\"/media/sf_dbgmits/test/test_target.cpp\",line=\"11\"}," +
"frame={level=\"2\",addr=\"0x0000000000400860\",func=\"main\",file=\"../test_target.cpp\"," +
"fullname=\"/media/sf_dbgmits/test/test_target.cpp\",line=\"19\"}]");
expect(result.recordType).to.equal(mi_output_1.RecordType.Done);
expect(result.data).to.have.property('stack');
expect(result.data.stack).to.have.property('frame');
expect(result.data.stack.frame.length).to.equal(3);
var frame = result.data.stack.frame[0];
expect(frame).to.have.property('level', frameLevel);
expect(frame).to.have.property('addr', frameAddr);
expect(frame).to.have.property('func', frameFunc);
expect(frame).to.have.property('file');
expect(frame).to.have.property('fullname');
expect(frame).to.have.property('line', frameLine);
});
it("parses 'done' from 'get locals' command", function () {
var result = parser.parse('^done,locals=[name="A",name="B",name="C"]');
expect(result.recordType).to.equal(mi_output_1.RecordType.Done);
expect(result.data).to.have.property('locals');
expect(result.data.locals).to.have.property('name');
expect(result.data.locals.name.length).to.equal(3);
expect(result.data.locals.name[0]).to.equal('A');
expect(result.data.locals.name[1]).to.equal('B');
expect(result.data.locals.name[2]).to.equal('C');
});
it("parses 'done' from 'get arguments' command", function () {
var result = parser.parse('^done,stack-args=[frame={level="0",args=[{name="d",value="300"},' +
'{name="e",value="0x0000000000400ef4 \\"Test\\""},{name="f",value="0x00007fffffffed40"}]}]');
expect(result.recordType).to.equal(mi_output_1.RecordType.Done);
expect(result.data).to.have.property('stack-args');
expect(result.data['stack-args']).to.have.property('frame');
});
it("parses 'running'", function () {
var result = parser.parse('^running');
expect(result.recordType).to.equal(mi_output_1.RecordType.Running);
});
it("parses 'connected'", function () {
var result = parser.parse('^connected');
expect(result.recordType).to.equal(mi_output_1.RecordType.Connected);
});
it("parses 'error'", function () {
var msg = "Command 'target-select'. Error connecting to target 'somehost'.";
var result = parser.parse('^error,msg="' + msg + '"');
expect(result.recordType).to.equal(mi_output_1.RecordType.Error);
expect(result.data.msg).to.equal(msg);
});
it("parses 'error' with code", function () {
var msg = "Command 'target-select'. Error connecting to target 'somehost'.";
var code = "undefined-command";
var result = parser.parse('^error,msg="' + msg + '",code="' + code + '"');
expect(result.recordType).to.equal(mi_output_1.RecordType.Error);
expect(result.data.msg).to.equal(msg);
expect(result.data.code).to.equal(code);
});
it("parses 'exit'", function () {
var result = parser.parse('^exit');
expect(result.recordType).to.equal(mi_output_1.RecordType.Exit);
});
});
describe("Stream Records", function () {
it("parses double-quoted text from console output stream", function () {
var testStr = 'console output stream text';
var result = parser.parse('~"' + testStr + '"');
expect(result.recordType).to.equal(mi_output_1.RecordType.DebuggerConsoleOutput);
expect(result.data).to.equal(testStr);
});
it("parses double-quoted text from target output stream", function () {
var testStr = 'target output stream text';
var result = parser.parse('@"' + testStr + '"');
expect(result.recordType).to.equal(mi_output_1.RecordType.TargetOutput);
expect(result.data).to.equal(testStr);
});
it("parses double-quoted text from debugger output stream", function () {
var testStr = 'debugger output stream text';
var result = parser.parse('&"' + testStr + '"');
expect(result.recordType).to.equal(mi_output_1.RecordType.DebuggerLogOutput);
expect(result.data).to.equal(testStr);
});
});
describe("Async Records", function () {
it("parses exec", function () {
var asyncClass = 'stopped';
var testStr = "*" + asyncClass + ",reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\"";
var result = parser.parse(testStr);
expect(result.recordType).to.equal(mi_output_1.RecordType.AsyncExec);
expect(result.data.length).to.equal(2);
expect(result.data[0]).to.equal(asyncClass);
expect(result.data[1]).to.contain.keys(['reason', 'signal-name']);
});
it("parses status", function () {
var asyncClass = 'download';
var testStr = "+" + asyncClass;
var result = parser.parse(testStr);
expect(result.recordType).to.equal(mi_output_1.RecordType.AsyncStatus);
expect(result.data.length).to.equal(2);
});
it("parses notify", function () {
var asyncClass = 'thread-group-started';
var testStr = "=" + asyncClass + ",id=\"i1\",pid=\"6550\"";
var result = parser.parse(testStr);
expect(result.recordType).to.equal(mi_output_1.RecordType.AsyncNotify);
expect(result.data.length).to.equal(2);
expect(result.data[0]).to.equal(asyncClass);
expect(result.data[1]).to.contain.keys(['id', 'pid']);
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlfb3V0cHV0X3BhcnNlcl90ZXN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3Rlc3QvbWlfb3V0cHV0X3BhcnNlcl90ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFDbkMsZ0RBQWdEOztBQUVoRCxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUV4QyxJQUFZLElBQUksV0FBTSxNQUFNLENBQUMsQ0FBQTtBQUM3QixJQUFZLE1BQU0sV0FBTSx5QkFBeUIsQ0FBQyxDQUFBO0FBQ2xELDBCQUEyQixrQkFBa0IsQ0FBQyxDQUFBO0FBRTlDLFVBQVU7QUFDVixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBRXpCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtJQUMzQixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLGVBQWUsRUFBRTtZQUNsQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUNiLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQztZQUN4QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUM7WUFDbEIsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDO1lBQzFCLElBQUksUUFBUSxHQUFHLDZDQUE2QyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNmLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQ3ZCLDJCQUF1QixFQUFFLGtFQUFxRCxJQUFJLFNBQUk7Z0JBQ3RGLGFBQVMsSUFBSSxrQkFBVyxRQUFRLHNCQUFlLFFBQVEsU0FBSTtnQkFDM0QsYUFBUyxJQUFJLDJDQUFrQyxJQUFJLFNBQUksQ0FDeEQsQ0FBQztZQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFN0MsSUFBSSxJQUFJLEdBQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkVBQTJFLEVBQUU7WUFDOUUsSUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLElBQU0sSUFBSSxHQUFHLFlBQVksQ0FBQztZQUMxQixJQUFNLFdBQVcsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUMsSUFBTSxRQUFRLEdBQUcsZ0NBQWdDLENBQUM7WUFDbEQsSUFBTSxRQUFRLEdBQUcsK0NBQStDLENBQUM7WUFDakUsSUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUN6QiwyQkFBdUIsWUFBWSx5REFBOEM7Z0JBQ2pGLGFBQVMsSUFBSSxrREFBeUM7Z0JBQ3RELGdCQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0VBQXlEO2dCQUNuRixhQUFTLFFBQVEsc0JBQWUsUUFBUSxrQkFBVyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQUk7Z0JBQ3ZFLHVCQUFtQixhQUFhLFdBQU07Z0JBQ3RDLGdCQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsdUVBQTREO2dCQUN0RixhQUFTLFFBQVEsc0JBQWUsUUFBUSxrQkFBVyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQUk7Z0JBQ3ZFLHVCQUFtQixhQUFhLFdBQU07Z0JBQ3RDLGdCQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsNkVBQWtFO2dCQUM1RixhQUFTLFFBQVEsc0JBQWUsUUFBUSxrQkFBVyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQUk7Z0JBQ3ZFLHVCQUFtQixhQUFhLFVBQUssQ0FDdEMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUxRCxJQUFNLElBQUksR0FBUSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0QsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9ELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzdELENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRTtZQUNqRCxJQUFJLFVBQVUsR0FBVyxHQUFHLENBQUM7WUFDN0IsSUFBSSxTQUFTLEdBQVcsb0JBQW9CLENBQUM7WUFDN0MsSUFBSSxTQUFTLEdBQVcsWUFBWSxDQUFDO1lBQ3JDLElBQUksU0FBUyxHQUFXLG9CQUFvQixDQUFDO1lBQzdDLElBQUksYUFBYSxHQUFXLHVCQUF1QixDQUFDO1lBQ3BELElBQUksU0FBUyxHQUFXLEdBQUcsQ0FBQztZQUM1QixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUN2QixlQUFlO2dCQUNmLHFCQUFpQixVQUFVLGtCQUFXLFNBQVMsa0JBQVcsU0FBUyxrQkFBVyxTQUFTLFNBQUk7Z0JBQzNGLGlCQUFhLGFBQWEsa0JBQVcsU0FBUyxVQUFLO2dCQUNuRCxtR0FBMkY7Z0JBQzNGLG1FQUErRDtnQkFDL0QsMkZBQW1GO2dCQUNuRixtRUFBK0QsQ0FDaEUsQ0FBQztZQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRW5ELElBQUksS0FBSyxHQUFRLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDbEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBRXZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0s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