UNPKG

asmimproved-dbgmits

Version:

Provides the ability to control GDB and LLDB programmatically via GDB/MI.

355 lines 48 kB
// 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 chaiAsPromised = require('chai-as-promised'); var dbgmits = require('../lib/index'); var test_utils_1 = require('./test_utils'); chai.use(chaiAsPromised); // aliases var expect = chai.expect; // the directory in which Gruntfile.js resides is also Mocha's working directory, // so any relative paths will be relative to that directory var localTargetExe = './build/Debug/stack_tests_target'; test_utils_1.logSuite(describe("Debug Session", function () { describe("Stack Inspection", function () { var debugSession; test_utils_1.beforeEachTestWithLogger(function (logger) { debugSession = test_utils_1.startDebugSession(logger); return debugSession.setExecutableFile(localTargetExe); }); afterEach(function () { return debugSession.end(); }); describe("#getStackFrame", function () { it("gets the current stack frame", function () { return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () { return debugSession.getStackFrame() .then(function (info) { expect(info).to.have.property('func'); expect(info.func).match(/^funcAtFrameLevel0/); }); }); }); // FIXME: re-enable on LLDB when it's fixed to handle --thread and --frame arguments it("gets an outer stack frame @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () { return debugSession.getStackFrame({ threadId: 1, frameLevel: 1 }) .then(function (info) { expect(info).to.have.property('func'); expect(info.func).match(/^funcAtFrameLevel1/); }); }); }); }); // #getStackFrame it("#getStackDepth", function () { var initialStackDepth = -1; // GDB and LLDB report stack depth a bit differently, LLDB adds a couple of frames from // libc to the count, but GDB does not. So instead of checking the absolute stack depth // we check the relative stack depth (starting from main()). var onBreakpointCheckStackDepth = new Promise(function (resolve, reject) { debugSession.on(dbgmits.EVENT_BREAKPOINT_HIT, function (breakNotify) { switch (breakNotify.breakpointId) { case 1: debugSession.getStackDepth() .then(function (stackDepth) { initialStackDepth = stackDepth; }) .then(function () { return debugSession.addBreakpoint('funcAtFrameLevel0'); }) .then(function () { return debugSession.resumeInferior(); }) .catch(reject); break; case 2: debugSession.getStackDepth() .then(function (stackDepth) { // the stack should be 2 levels deep counting from main(): // funcAtFrameLevel1()->funcAtFrameLevel0() expect(stackDepth - initialStackDepth).to.equal(2); }) .then(resolve) .catch(reject); break; } }); }); return debugSession.addBreakpoint('main') .then(function () { return Promise.all([ onBreakpointCheckStackDepth, debugSession.startInferior() ]); }); }); // #getStackDepth describe("#getStackFrames", function () { it("gets a list of stack frames", function () { return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () { var expectedStackDepth = -1; return debugSession.getStackDepth() .then(function (stackDepth) { expectedStackDepth = stackDepth; }) .then(function () { return debugSession.getStackFrames(); }) .then(function (frames) { expect(frames.length).to.equal(expectedStackDepth); for (var i = 0; i < frames.length; ++i) { expect(frames[i].level).to.equal(i); } expect(frames[0].func).match(/^funcAtFrameLevel0/); expect(frames[1].func).match(/^funcAtFrameLevel1/); expect(frames[2].func).match(/^main/); }); }); }); it("gets a list of stack frames within a certain level range", function () { return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () { return debugSession.getStackFrames({ lowFrame: 0, highFrame: 1 }) .then(function (frames) { expect(frames.length).to.equal(2); for (var i = 0; i < frames.length; ++i) { expect(frames[i].level).to.equal(i); } expect(frames[0].func).match(/^funcAtFrameLevel0/); expect(frames[1].func).match(/^funcAtFrameLevel1/); }); }); }); it("gets a stack frame for a specific level", function () { return test_utils_1.runToFunc(debugSession, 'funcAtFrameLevel0', function () { return debugSession.getStackFrames({ highFrame: 1 }) .then(function (frames) { expect(frames.length).to.equal(1); expect(frames[0].level).to.equal(1); expect(frames[0].func).match(/^funcAtFrameLevel1/); }); }); }); }); // #getStackFrames describe("#getStackFrameArgs", function () { it("gets frame arguments for a number of frames", function () { return test_utils_1.runToFunc(debugSession, 'funcWithNoArgs', function () { // FIXME: should switch to simple detail level so we get type information, // but the LLDB MI driver needs to be fixed to support that detail level // first return debugSession.getStackFrameArgs(dbgmits.VariableDetailLevel.All, { lowFrame: 0, highFrame: 3 }) .then(function (frames) { expect(frames).to.have.property('length', 4); expect(frames[0]).to.have.property('level', 0); expect(frames[0]).to.have.property('args').that.has.property('length', 0); expect(frames[1]).to.have.property('level', 1); expect(frames[1]).to.have.property('args').that.has.property('length', 1); expect(frames[1].args[0]).to.have.property('name', 'a'); expect(frames[1].args[0]).to.have.property('value', '5'); expect(frames[2].level).to.equal(2); expect(frames[2].args.length).to.equal(2); expect(frames[2].args[0].name).to.equal('b'); expect(frames[2].args[0].value).to.equal('7'); expect(frames[2].args[1].name).to.equal('c'); expect(frames[2].args[1]).to.have.property('value'); expect(frames[3].level).to.equal(3); expect(frames[3].args.length).to.equal(3); expect(frames[3].args[0].name).to.equal('d'); expect(frames[3].args[0].value).to.equal('300'); expect(frames[3].args[1].name).to.equal('e'); expect(frames[3].args[1]).to.have.property('value'); expect(frames[3].args[2].name).to.equal('f'); expect(frames[3].args[2]).to.have.property('value'); }); }); }); }); // #getStackFrameArgs describe("#getStackFrameVariables", function () { it("gets a single simple local variable (name only) for a frame", function () { return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleLocalVariable_Inner', function () { // get the variables for the previous frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.None, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(1); expect(locals[0]).to.have.property('name', 'a'); expect(locals[0]).to.have.property('value').that.is.undefined; expect(locals[0]).to.have.property('type').that.is.undefined; }); }); }); // FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types) it("gets a single simple local variable (name, value, and type) for a frame @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleLocalVariable_Inner', function () { // get the locals for the previous frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(1); expect(locals[0]).to.have.property('name', 'a'); expect(locals[0]).to.have.property('value', '5'); expect(locals[0]).to.have.property('type', 'int'); }); }); }); it("gets a single simple local variable (name and value) for a frame", function () { return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleLocalVariable_Inner', function () { // get the locals for the previous frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(1); expect(locals[0]).to.have.property('name', 'a'); expect(locals[0]).to.have.property('value', '5'); expect(locals[0]).to.have.property('type').that.is.undefined; }); }); }); // FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types) it("gets a single complex local variable (name and type) for the current frame @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcWithOneComplexLocalVariable_Inner', function () { // get the locals for the current frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(1); expect(locals[0]).to.have.property('name', 'b'); expect(locals[0]).to.have.property('value').that.is.undefined; expect(locals[0]).to.have.property('type', 'int [3]'); }); }); }); // FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types) it("gets two local variables (name, value, and type) for a frame @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcWithTwoLocalVariables_Inner', function () { // get the locals for the current frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(2); expect(locals[0]).to.have.property('name', 'c'); expect(locals[0]).to.have.property('value', 'true'); expect(locals[0]).to.have.property('type', 'bool'); expect(locals[1]).to.have.property('name', 'd'); expect(locals[1]).to.have.property('value').that.is.undefined; expect(locals[1]).to.have.property('type', 'const char *[3]'); }); }); }); it("gets two local variables (name and value) for a frame", function () { return test_utils_1.runToFunc(debugSession, 'funcWithTwoLocalVariables_Inner', function () { // get the locals for the current frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(2); expect(locals[0]).to.have.property('name', 'c'); expect(locals[0]).to.have.property('value', 'true'); expect(locals[0]).to.have.property('type').that.is.undefined; expect(locals[1]).to.have.property('name', 'd'); expect(locals[1]).to.have.property('value'); expect(locals[1]).to.have.property('type').that.is.undefined; }); }); }); // FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types) it("gets three local variables (name, value, and type) for a frame @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcWithThreeLocalVariables_Inner', function () { // get the locals for the current frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(3); expect(locals[0]).to.have.property('name', 'e'); expect(locals[0]).to.have.property('value'); expect(locals[0]).to.have.property('type', 'Point'); expect(locals[1]).to.have.property('name', 'f'); expect(locals[1]).to.have.property('value', '9.5'); expect(locals[1]).to.have.property('type', 'float'); expect(locals[2]).to.have.property('name', 'g'); expect(locals[2]).to.have.property('value', '300'); expect(locals[2]).to.have.property('type', 'long'); }); }); }); it("gets three local variables (name and value) for a frame", function () { return test_utils_1.runToFunc(debugSession, 'funcWithThreeLocalVariables_Inner', function () { // get the locals for the current frame return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All, { threadId: 1, frameLevel: 1 }) .then(function (variables) { var locals = variables.locals; expect(locals.length).to.equal(3); expect(locals[0]).to.have.property('name', 'e'); expect(locals[0]).to.have.property('value'); expect(locals[0]).to.have.property('type').that.is.undefined; expect(locals[1]).to.have.property('name', 'f'); expect(locals[1]).to.have.property('value', '9.5'); expect(locals[1]).to.have.property('type').that.is.undefined; expect(locals[2]).to.have.property('name', 'g'); expect(locals[2]).to.have.property('value', '300'); expect(locals[2]).to.have.property('type').that.is.undefined; }); }); }); it("gets no frame arguments for a function with no arguments", function () { return test_utils_1.runToFunc(debugSession, 'funcWithNoArgs', function () { return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.None) .then(function (variables) { var args = variables.args; expect(args.length).to.equal(0); }); }); }); // FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types) it("gets one simple function argument (name, value, and type) @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleArg', function () { return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple) .then(function (variables) { var args = variables.args; expect(args.length).to.equal(1); expect(args[0]).to.have.property('name', 'a'); expect(args[0]).to.have.property('value', '5'); expect(args[0]).to.have.property('type', 'int'); }); }); }); it("gets one simple function argument (name and value)", function () { return test_utils_1.runToFunc(debugSession, 'funcWithOneSimpleArg', function () { return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.All) .then(function (variables) { var args = variables.args; expect(args.length).to.equal(1); expect(args[0]).to.have.property('name', 'a'); expect(args[0]).to.have.property('value', '5'); expect(args[0]).to.have.property('type').that.is.undefined; }); }); }); // FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types) it("gets two function arguments (name, value, and type) @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcWithTwoArgs', function () { return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple) .then(function (variables) { var args = variables.args; expect(args.length).to.equal(2); expect(args[0]).to.have.property('name', 'b'); expect(args[0]).to.have.property('value', '7'); expect(args[0]).to.have.property('type', 'float'); expect(args[1]).to.have.property('name', 'c'); expect(args[1]).to.have.property('value').that.is.undefined; expect(args[1]).to.have.property('type', 'Point'); }); }); }); // FIXME: re-enable on LLDB when it correctly supports 'simple' mode (as in outputs types) it("gets three function arguments (name, value, and type) @skipOnLLDB", function () { return test_utils_1.runToFunc(debugSession, 'funcWithThreeArgs', function () { return debugSession.getStackFrameVariables(dbgmits.VariableDetailLevel.Simple) .then(function (variables) { var args = variables.args; expect(args.length).to.equal(3); expect(args[0]).to.have.property('name', 'd'); expect(args[0]).to.have.property('value', '300'); expect(args[0]).to.have.property('type', 'long'); expect(args[1]).to.have.property('name', 'e'); expect(args[1]).to.have.property('value'); expect(args[1]).to.have.property('type', 'const char *'); expect(args[2]).to.have.property('name', 'f'); expect(args[2]).to.have.property('type', 'int *'); }); }); }); }); // #getStackFrameVariables }); })); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2tfdGVzdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90ZXN0L3N0YWNrX3Rlc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG1DQUFtQztBQUNuQyxnREFBZ0Q7O0FBRWhELE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0FBRXhDLElBQVksSUFBSSxXQUFNLE1BQU0sQ0FBQyxDQUFBO0FBQzdCLElBQU8sY0FBYyxXQUFXLGtCQUFrQixDQUFDLENBQUM7QUFFcEQsSUFBWSxPQUFPLFdBQU0sY0FBYyxDQUFDLENBQUE7QUFDeEMsMkJBRU8sY0FBYyxDQUFDLENBQUE7QUFFdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUV6QixVQUFVO0FBQ1YsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztBQUd6QixpRkFBaUY7QUFDakYsMkRBQTJEO0FBQzNELElBQUksY0FBYyxHQUFXLGtDQUFrQyxDQUFDO0FBRWhFLHFCQUFHLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUM1QixRQUFRLENBQUMsa0JBQWtCLEVBQUU7UUFDM0IsSUFBSSxZQUEwQixDQUFDO1FBRS9CLHFDQUF3QixDQUFDLFVBQUMsTUFBcUI7WUFDN0MsWUFBWSxHQUFHLDhCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUM7WUFDUixNQUFNLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtnQkFDakMsTUFBTSxDQUFDLHNCQUFTLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFO29CQUNsRCxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTt5QkFDbEMsSUFBSSxDQUFDLFVBQUMsSUFBNkI7d0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDaEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILG9GQUFvRjtZQUNwRixFQUFFLENBQUMsdUNBQXVDLEVBQUU7Z0JBQzFDLE1BQU0sQ0FBQyxzQkFBUyxDQUFDLFlBQVksRUFBRSxtQkFBbUIsRUFBRTtvQkFDbEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQzt5QkFDaEUsSUFBSSxDQUFDLFVBQUMsSUFBNkI7d0JBQ2xDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt3QkFDdEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDaEQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCO1FBRXJCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRTtZQUNuQixJQUFJLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNCLHVGQUF1RjtZQUN2Rix1RkFBdUY7WUFDdkYsNERBQTREO1lBQzVELElBQUksMkJBQTJCLEdBQUcsSUFBSSxPQUFPLENBQU8sVUFBQyxPQUFPLEVBQUUsTUFBTTtnQkFDbEUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQzFDLFVBQUMsV0FBd0M7b0JBQ3ZDLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNqQyxLQUFLLENBQUM7NEJBQ0osWUFBWSxDQUFDLGFBQWEsRUFBRTtpQ0FDM0IsSUFBSSxDQUFDLFVBQUMsVUFBa0IsSUFBTyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQ2pFLElBQUksQ0FBQyxjQUFRLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQ3ZFLElBQUksQ0FBQyxjQUFRLE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7aUNBQ3JELEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDZixLQUFLLENBQUM7d0JBRVIsS0FBSyxDQUFDOzRCQUNKLFlBQVksQ0FBQyxhQUFhLEVBQUU7aUNBQzNCLElBQUksQ0FBQyxVQUFDLFVBQWtCO2dDQUN2QiwwREFBMEQ7Z0NBQzFELDJDQUEyQztnQ0FDM0MsTUFBTSxDQUFDLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7NEJBQ3JELENBQUMsQ0FBQztpQ0FDRCxJQUFJLENBQUMsT0FBTyxDQUFDO2lDQUNiLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQzs0QkFDZixLQUFLLENBQUM7b0JBQ1YsQ0FBQztnQkFDSCxDQUFDLENBQ0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO2lCQUN4QyxJQUFJLENBQUM7Z0JBQ0osTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7b0JBQ2pCLDJCQUEyQjtvQkFDM0IsWUFBWSxDQUFDLGFBQWEsRUFBRTtpQkFDN0IsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLGlCQUFpQjtRQUVyQixRQUFRLENBQUMsaUJBQWlCLEVBQUU7WUFDMUIsRUFBRSxDQUFDLDZCQUE2QixFQUFFO2dCQUNoQyxNQUFNLENBQUMsc0JBQVMsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUU7b0JBQ2xELElBQUksa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLE1BQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFO3lCQUNsQyxJQUFJLENBQUMsVUFBQyxVQUFrQixJQUFPLGtCQUFrQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDbEUsSUFBSSxDQUFDLGNBQVEsTUFBTSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDckQsSUFBSSxDQUFDLFVBQUMsTUFBaUM7d0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO3dCQUNuRCxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQzs0QkFDdkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN0QyxDQUFDO3dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7d0JBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN4QyxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsRUFBRSxDQUFDLDBEQUEwRCxFQUFFO2dCQUM3RCxNQUFNLENBQUMsc0JBQVMsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUU7b0JBQ2xELE1BQU0sQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7eUJBQ2hFLElBQUksQ0FBQyxVQUFDLE1BQWlDO3dCQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ2xDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDOzRCQUN2QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3RDLENBQUM7d0JBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsb0JBQW9CLENBQUMsQ0FBQztvQkFDckQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILEVBQUUsQ0FBQyx5Q0FBeUMsRUFBRTtnQkFDNUMsTUFBTSxDQUFDLHNCQUFTLENBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFFO29CQUNsRCxNQUFNLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzt5QkFDbkQsSUFBSSxDQUFDLFVBQUMsTUFBaUM7d0JBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO29CQUNyRCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7UUFFdEIsUUFBUSxDQUFDLG9CQUFvQixFQUFFO1lBQzdCLEVBQUUsQ0FBQyw2Q0FBNkMsRUFBRTtnQkFDaEQsTUFBTSxDQUFDLHNCQUFTLENBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFO29CQUMvQywwRUFBMEU7b0JBQzFFLCtFQUErRTtvQkFDL0UsZUFBZTtvQkFDZixNQUFNLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxDQUFDLEVBQUUsQ0FBQzt5QkFDcEcsSUFBSSxDQUFDLFVBQUMsTUFBcUM7d0JBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBRTdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBRTFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQy9DLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0JBQzFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFFekQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNwQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUMxQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUM3QyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3dCQUVwRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQzdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ2hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVB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VSxFQUFFLENBQUMsRUFBRSxDQUNoRTt5QkFDQSxJQUFJLENBQUMsVUFBQyxTQUEyQzt3QkFDaEQsSUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQzt3QkFDaEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUVsQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO3dCQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7d0JBQzVDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQzt3QkFFN0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDaEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzt3QkFDbkQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDO3dCQUU3RCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLEdB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