@aztec/sequencer-client 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dest/client/index.js +0 -1
  2. package/dest/client/sequencer-client.js +52 -57
  3. package/dest/config.js +40 -42
  4. package/dest/global_variable_builder/global_builder.js +39 -26
  5. package/dest/global_variable_builder/index.js +0 -1
  6. package/dest/index.js +0 -1
  7. package/dest/publisher/config.js +49 -50
  8. package/dest/publisher/index.js +0 -1
  9. package/dest/publisher/sequencer-publisher-metrics.js +32 -23
  10. package/dest/publisher/sequencer-publisher.js +216 -191
  11. package/dest/sequencer/allowed.js +5 -12
  12. package/dest/sequencer/config.js +1 -2
  13. package/dest/sequencer/index.js +0 -1
  14. package/dest/sequencer/metrics.js +26 -18
  15. package/dest/sequencer/sequencer.js +648 -607
  16. package/dest/sequencer/timetable.js +33 -19
  17. package/dest/sequencer/utils.js +22 -32
  18. package/dest/slasher/factory.js +5 -4
  19. package/dest/slasher/index.js +0 -1
  20. package/dest/slasher/slasher_client.js +107 -110
  21. package/dest/test/index.js +4 -1
  22. package/dest/tx_validator/archive_cache.js +7 -7
  23. package/dest/tx_validator/gas_validator.js +76 -64
  24. package/dest/tx_validator/nullifier_cache.js +8 -8
  25. package/dest/tx_validator/phases_validator.js +27 -19
  26. package/dest/tx_validator/test_utils.js +1 -2
  27. package/dest/tx_validator/tx_validator_factory.js +5 -5
  28. package/package.json +23 -22
  29. package/src/config.ts +1 -1
  30. package/src/publisher/sequencer-publisher.ts +1 -1
  31. package/src/sequencer/sequencer.ts +29 -13
  32. package/dest/client/index.d.ts +0 -2
  33. package/dest/client/index.d.ts.map +0 -1
  34. package/dest/client/sequencer-client.d.ts +0 -68
  35. package/dest/client/sequencer-client.d.ts.map +0 -1
  36. package/dest/config.d.ts +0 -37
  37. package/dest/config.d.ts.map +0 -1
  38. package/dest/global_variable_builder/global_builder.d.ts +0 -29
  39. package/dest/global_variable_builder/global_builder.d.ts.map +0 -1
  40. package/dest/global_variable_builder/index.d.ts +0 -2
  41. package/dest/global_variable_builder/index.d.ts.map +0 -1
  42. package/dest/index.d.ts +0 -8
  43. package/dest/index.d.ts.map +0 -1
  44. package/dest/publisher/config.d.ts +0 -38
  45. package/dest/publisher/config.d.ts.map +0 -1
  46. package/dest/publisher/index.d.ts +0 -2
  47. package/dest/publisher/index.d.ts.map +0 -1
  48. package/dest/publisher/sequencer-publisher-metrics.d.ts +0 -24
  49. package/dest/publisher/sequencer-publisher-metrics.d.ts.map +0 -1
  50. package/dest/publisher/sequencer-publisher.d.ts +0 -163
  51. package/dest/publisher/sequencer-publisher.d.ts.map +0 -1
  52. package/dest/sequencer/allowed.d.ts +0 -3
  53. package/dest/sequencer/allowed.d.ts.map +0 -1
  54. package/dest/sequencer/config.d.ts +0 -2
  55. package/dest/sequencer/config.d.ts.map +0 -1
  56. package/dest/sequencer/index.d.ts +0 -4
  57. package/dest/sequencer/index.d.ts.map +0 -1
  58. package/dest/sequencer/metrics.d.ts +0 -24
  59. package/dest/sequencer/metrics.d.ts.map +0 -1
  60. package/dest/sequencer/sequencer.d.ts +0 -172
  61. package/dest/sequencer/sequencer.d.ts.map +0 -1
  62. package/dest/sequencer/timetable.d.ts +0 -38
  63. package/dest/sequencer/timetable.d.ts.map +0 -1
  64. package/dest/sequencer/utils.d.ts +0 -47
  65. package/dest/sequencer/utils.d.ts.map +0 -1
  66. package/dest/slasher/factory.d.ts +0 -11
  67. package/dest/slasher/factory.d.ts.map +0 -1
  68. package/dest/slasher/index.d.ts +0 -3
  69. package/dest/slasher/index.d.ts.map +0 -1
  70. package/dest/slasher/slasher_client.d.ts +0 -127
  71. package/dest/slasher/slasher_client.d.ts.map +0 -1
  72. package/dest/test/index.d.ts +0 -17
  73. package/dest/test/index.d.ts.map +0 -1
  74. package/dest/tx_validator/archive_cache.d.ts +0 -14
  75. package/dest/tx_validator/archive_cache.d.ts.map +0 -1
  76. package/dest/tx_validator/gas_validator.d.ts +0 -12
  77. package/dest/tx_validator/gas_validator.d.ts.map +0 -1
  78. package/dest/tx_validator/nullifier_cache.d.ts +0 -16
  79. package/dest/tx_validator/nullifier_cache.d.ts.map +0 -1
  80. package/dest/tx_validator/phases_validator.d.ts +0 -11
  81. package/dest/tx_validator/phases_validator.d.ts.map +0 -1
  82. package/dest/tx_validator/test_utils.d.ts +0 -21
  83. package/dest/tx_validator/test_utils.d.ts.map +0 -1
  84. package/dest/tx_validator/tx_validator_factory.d.ts +0 -16
  85. package/dest/tx_validator/tx_validator_factory.d.ts.map +0 -1
@@ -1,20 +1,31 @@
1
1
  import { createLogger } from '@aztec/aztec.js';
2
2
  import { SequencerState } from './utils.js';
3
3
  export class SequencerTimetable {
4
- constructor(ethereumSlotDuration, aztecSlotDuration, maxL1TxInclusionTimeIntoSlot, enforce = true, metrics, log = createLogger('sequencer:timetable')) {
4
+ ethereumSlotDuration;
5
+ aztecSlotDuration;
6
+ maxL1TxInclusionTimeIntoSlot;
7
+ enforce;
8
+ metrics;
9
+ log;
10
+ /** How late into the slot can we be to start working */ initialTime;
11
+ /** How long it takes to get ready to start building */ blockPrepareTime;
12
+ /** How long it takes to for proposals and attestations to travel across the p2p layer (one-way) */ attestationPropagationTime;
13
+ /** How much time we spend validating and processing a block after building it, and assembling the proposal to send to attestors */ blockValidationTime;
14
+ /**
15
+ * How long it takes to get a published block into L1. L1 builders typically accept txs up to 4 seconds into their slot,
16
+ * but we'll timeout sooner to give it more time to propagate (remember we also have blobs!). Still, when working in anvil,
17
+ * we can just post in the very last second of the L1 slot and still expect the tx to be accepted.
18
+ */ l1PublishingTime;
19
+ constructor(ethereumSlotDuration, aztecSlotDuration, maxL1TxInclusionTimeIntoSlot, enforce = true, metrics, log = createLogger('sequencer:timetable')){
5
20
  this.ethereumSlotDuration = ethereumSlotDuration;
6
21
  this.aztecSlotDuration = aztecSlotDuration;
7
22
  this.maxL1TxInclusionTimeIntoSlot = maxL1TxInclusionTimeIntoSlot;
8
23
  this.enforce = enforce;
9
24
  this.metrics = metrics;
10
25
  this.log = log;
11
- /** How late into the slot can we be to start working */
12
26
  this.initialTime = 3;
13
- /** How long it takes to get ready to start building */
14
27
  this.blockPrepareTime = 1;
15
- /** How long it takes to for proposals and attestations to travel across the p2p layer (one-way) */
16
28
  this.attestationPropagationTime = 2;
17
- /** How much time we spend validating and processing a block after building it, and assembling the proposal to send to attestors */
18
29
  this.blockValidationTime = 1;
19
30
  this.l1PublishingTime = this.ethereumSlotDuration - this.maxL1TxInclusionTimeIntoSlot;
20
31
  }
@@ -31,7 +42,7 @@ export class SequencerTimetable {
31
42
  secondsIntoSlot,
32
43
  maxAllowed,
33
44
  available,
34
- executionTimeEnd,
45
+ executionTimeEnd
35
46
  });
36
47
  return executionTimeEnd;
37
48
  }
@@ -43,12 +54,12 @@ export class SequencerTimetable {
43
54
  const validationTimeEnd = this.aztecSlotDuration - this.afterBlockReexecTimeNeeded;
44
55
  this.log.debug(`Validator re-execution time deadline is ${validationTimeEnd}`, {
45
56
  secondsIntoSlot,
46
- validationTimeEnd,
57
+ validationTimeEnd
47
58
  });
48
59
  return validationTimeEnd;
49
60
  }
50
61
  getMaxAllowedTime(state) {
51
- switch (state) {
62
+ switch(state){
52
63
  case SequencerState.STOPPED:
53
64
  case SequencerState.IDLE:
54
65
  case SequencerState.SYNCHRONIZING:
@@ -62,10 +73,11 @@ export class SequencerTimetable {
62
73
  return this.aztecSlotDuration - this.l1PublishingTime - 2 * this.attestationPropagationTime;
63
74
  case SequencerState.PUBLISHING_BLOCK:
64
75
  return this.aztecSlotDuration - this.l1PublishingTime;
65
- default: {
66
- const _exhaustiveCheck = state;
67
- throw new Error(`Unexpected state: ${state}`);
68
- }
76
+ default:
77
+ {
78
+ const _exhaustiveCheck = state;
79
+ throw new Error(`Unexpected state: ${state}`);
80
+ }
69
81
  }
70
82
  }
71
83
  assertTimeLeft(newState, secondsIntoSlot) {
@@ -81,16 +93,18 @@ export class SequencerTimetable {
81
93
  throw new SequencerTooSlowError(newState, maxAllowedTime, secondsIntoSlot);
82
94
  }
83
95
  this.metrics?.recordStateTransitionBufferMs(Math.floor(bufferSeconds * 1000), newState);
84
- this.log.trace(`Enough time to transition to ${newState}`, { maxAllowedTime, secondsIntoSlot });
96
+ this.log.trace(`Enough time to transition to ${newState}`, {
97
+ maxAllowedTime,
98
+ secondsIntoSlot
99
+ });
85
100
  }
86
101
  }
87
102
  export class SequencerTooSlowError extends Error {
88
- constructor(proposedState, maxAllowedTime, currentTime) {
89
- super(`Too far into slot for ${proposedState} (time into slot ${currentTime}s greater than ${maxAllowedTime}s allowance)`);
90
- this.proposedState = proposedState;
91
- this.maxAllowedTime = maxAllowedTime;
92
- this.currentTime = currentTime;
103
+ proposedState;
104
+ maxAllowedTime;
105
+ currentTime;
106
+ constructor(proposedState, maxAllowedTime, currentTime){
107
+ super(`Too far into slot for ${proposedState} (time into slot ${currentTime}s greater than ${maxAllowedTime}s allowance)`), this.proposedState = proposedState, this.maxAllowedTime = maxAllowedTime, this.currentTime = currentTime;
93
108
  this.name = 'SequencerTooSlowError';
94
109
  }
95
110
  }
96
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcXVlbmNlci90aW1ldGFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFFNUMsTUFBTSxPQUFPLGtCQUFrQjtJQW9CN0IsWUFDbUIsb0JBQTRCLEVBQzVCLGlCQUF5QixFQUN6Qiw0QkFBb0MsRUFDcEMsVUFBbUIsSUFBSSxFQUN2QixPQUEwQixFQUMxQixNQUFNLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztRQUx6Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQVE7UUFDNUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFRO1FBQ3pCLGlDQUE0QixHQUE1Qiw0QkFBNEIsQ0FBUTtRQUNwQyxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUN2QixZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUMxQixRQUFHLEdBQUgsR0FBRyxDQUFzQztRQXpCNUQsd0RBQXdEO1FBQ3hDLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRWhDLHVEQUF1RDtRQUN2QyxxQkFBZ0IsR0FBRyxDQUFDLENBQUM7UUFFckMsbUdBQW1HO1FBQ25GLCtCQUEwQixHQUFHLENBQUMsQ0FBQztRQUUvQyxtSUFBbUk7UUFDbkgsd0JBQW1CLEdBQUcsQ0FBQyxDQUFDO1FBaUJ0QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUN4RixDQUFDO0lBRUQsSUFBWSx5Q0FBeUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDaEcsQ0FBQztJQUVNLDJCQUEyQixDQUFDLGVBQXVCO1FBQ3hE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
@@ -1,39 +1,31 @@
1
1
  import { Signature } from '@aztec/foundation/eth-signature';
2
- export var SequencerState;
3
- (function (SequencerState) {
2
+ export var SequencerState = /*#__PURE__*/ function(SequencerState) {
4
3
  /**
5
- * Sequencer is stopped and not processing any txs from the pool.
6
- */
7
- SequencerState["STOPPED"] = "STOPPED";
4
+ * Sequencer is stopped and not processing any txs from the pool.
5
+ */ SequencerState["STOPPED"] = "STOPPED";
8
6
  /**
9
- * Sequencer is awaiting the next call to work().
10
- */
11
- SequencerState["IDLE"] = "IDLE";
7
+ * Sequencer is awaiting the next call to work().
8
+ */ SequencerState["IDLE"] = "IDLE";
12
9
  /**
13
- * Synchronizing with the L2 chain.
14
- */
15
- SequencerState["SYNCHRONIZING"] = "SYNCHRONIZING";
10
+ * Synchronizing with the L2 chain.
11
+ */ SequencerState["SYNCHRONIZING"] = "SYNCHRONIZING";
16
12
  /**
17
- * Checking if we are the proposer for the current slot.
18
- */
19
- SequencerState["PROPOSER_CHECK"] = "PROPOSER_CHECK";
13
+ * Checking if we are the proposer for the current slot.
14
+ */ SequencerState["PROPOSER_CHECK"] = "PROPOSER_CHECK";
20
15
  /**
21
- * Initializing the block proposal. Will move to CREATING_BLOCK if there are valid txs to include, or back to SYNCHRONIZING otherwise.
22
- */
23
- SequencerState["INITIALIZING_PROPOSAL"] = "INITIALIZING_PROPOSAL";
16
+ * Initializing the block proposal. Will move to CREATING_BLOCK if there are valid txs to include, or back to SYNCHRONIZING otherwise.
17
+ */ SequencerState["INITIALIZING_PROPOSAL"] = "INITIALIZING_PROPOSAL";
24
18
  /**
25
- * Creating a new L2 block. Includes processing public function calls and running rollup circuits. Will move to PUBLISHING_CONTRACT_DATA.
26
- */
27
- SequencerState["CREATING_BLOCK"] = "CREATING_BLOCK";
19
+ * Creating a new L2 block. Includes processing public function calls and running rollup circuits. Will move to PUBLISHING_CONTRACT_DATA.
20
+ */ SequencerState["CREATING_BLOCK"] = "CREATING_BLOCK";
28
21
  /**
29
- * Collecting attestations from its peers. Will move to PUBLISHING_BLOCK.
30
- */
31
- SequencerState["COLLECTING_ATTESTATIONS"] = "COLLECTING_ATTESTATIONS";
22
+ * Collecting attestations from its peers. Will move to PUBLISHING_BLOCK.
23
+ */ SequencerState["COLLECTING_ATTESTATIONS"] = "COLLECTING_ATTESTATIONS";
32
24
  /**
33
- * Sending the tx to L1 with the L2 block data and awaiting it to be mined. Will move to SYNCHRONIZING.
34
- */
35
- SequencerState["PUBLISHING_BLOCK"] = "PUBLISHING_BLOCK";
36
- })(SequencerState || (SequencerState = {}));
25
+ * Sending the tx to L1 with the L2 block data and awaiting it to be mined. Will move to SYNCHRONIZING.
26
+ */ SequencerState["PUBLISHING_BLOCK"] = "PUBLISHING_BLOCK";
27
+ return SequencerState;
28
+ }({});
37
29
  export function sequencerStateToNumber(state) {
38
30
  return Object.values(SequencerState).indexOf(state);
39
31
  }
@@ -43,21 +35,19 @@ export function sequencerStateToNumber(state) {
43
35
  * The rollup smart contract expects attestations to appear in the order of the committee
44
36
  *
45
37
  * @todo: perform this logic within the memory attestation store instead?
46
- */
47
- export async function orderAttestations(attestations, orderAddresses) {
38
+ */ export async function orderAttestations(attestations, orderAddresses) {
48
39
  // Create a map of sender addresses to BlockAttestations
49
40
  const attestationMap = new Map();
50
- for (const attestation of attestations) {
41
+ for (const attestation of attestations){
51
42
  const sender = await attestation.getSender();
52
43
  if (sender) {
53
44
  attestationMap.set(sender.toString(), attestation);
54
45
  }
55
46
  }
56
47
  // Create the ordered array based on the orderAddresses, else return an empty signature
57
- const orderedAttestations = orderAddresses.map(address => {
48
+ const orderedAttestations = orderAddresses.map((address)=>{
58
49
  const addressString = address.toString();
59
50
  return attestationMap.get(addressString)?.signature || Signature.empty();
60
51
  });
61
52
  return orderedAttestations;
62
53
  }
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VxdWVuY2VyL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU1RCxNQUFNLENBQU4sSUFBWSxjQWlDWDtBQWpDRCxXQUFZLGNBQWM7SUFDeEI7O09BRUc7SUFDSCxxQ0FBbUIsQ0FBQTtJQUNuQjs7T0FFRztJQUNILCtCQUFhLENBQUE7SUFDYjs7T0FFRztJQUNILGlEQUErQixDQUFBO0lBQy9COztPQUVHO0lBQ0gsbURBQWlDLENBQUE7SUFDakM7O09BRUc7SUFDSCxpRUFBK0MsQ0FBQTtJQUMvQzs7T0FFRztJQUNILG1EQUFpQyxDQUFBO0lBQ2pDOztPQUVHO0lBQ0gscUVBQW1ELENBQUE7SUFDbkQ7O09BRUc7SUFDSCx1REFBcUMsQ0FBQTtBQUN2QyxDQUFDLEVBakNXLGNBQWMsS0FBZCxjQUFjLFFBaUN6QjtBQUlELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFxQjtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQixDQUNyQyxZQUFnQyxFQUNoQyxjQUE0QjtJQUU1Qix3REFBd0Q7SUFDeEQsTUFBTSxjQUFjLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFFM0QsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxNQUFNLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsY0FBYyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRCx1RkFBdUY7SUFDdkYsTUFBTSxtQkFBbUIsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3ZELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QyxPQUFPLGNBQWMsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBUyxJQUFJLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUMzRSxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sbUJBQW1CLENBQUM7QUFDN0IsQ0FBQyJ9
@@ -2,9 +2,10 @@ import { createLogger } from '@aztec/foundation/log';
2
2
  import { createStore } from '@aztec/kv-store/lmdb-v2';
3
3
  import { getTelemetryClient } from '@aztec/telemetry-client';
4
4
  import { SlasherClient } from './slasher_client.js';
5
- export const createSlasherClient = async (_config, l2BlockSource, telemetry = getTelemetryClient(), deps = {}) => {
6
- const config = { ..._config };
7
- const store = deps.store ?? (await createStore('slasher', config, createLogger('slasher:lmdb')));
5
+ export const createSlasherClient = async (_config, l2BlockSource, telemetry = getTelemetryClient(), deps = {})=>{
6
+ const config = {
7
+ ..._config
8
+ };
9
+ const store = deps.store ?? await createStore('slasher', config, createLogger('slasher:lmdb'));
8
10
  return new SlasherClient(config, store, l2BlockSource, telemetry);
9
11
  };
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zbGFzaGVyL2ZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBR3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RCxPQUFPLEVBQXdCLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3BELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEtBQUssRUFDdEMsT0FBNkUsRUFDN0UsYUFBNEIsRUFDNUIsWUFBNkIsa0JBQWtCLEVBQUUsRUFDakQsT0FBc0MsRUFBRSxFQUN4QyxFQUFFO0lBQ0YsTUFBTSxNQUFNLEdBQUcsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakcsT0FBTyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNwRSxDQUFDLENBQUMifQ==
@@ -1,3 +1,2 @@
1
1
  export * from './slasher_client.js';
2
2
  export { createSlasherClient } from './factory.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGNBQWMsQ0FBQyJ9
@@ -1,21 +1,20 @@
1
- import { L2BlockStream, } from '@aztec/circuit-types';
1
+ import { L2BlockStream } from '@aztec/circuit-types';
2
2
  import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js/constants';
3
3
  import { createEthereumChain } from '@aztec/ethereum';
4
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  import { createLogger } from '@aztec/foundation/log';
6
6
  import { SlashFactoryAbi } from '@aztec/l1-artifacts';
7
7
  import { WithTracer, getTelemetryClient } from '@aztec/telemetry-client';
8
- import { createPublicClient, getAddress, getContract, http, } from 'viem';
8
+ import { createPublicClient, getAddress, getContract, http } from 'viem';
9
9
  /**
10
10
  * Enum defining the possible states of the Slasher client.
11
- */
12
- export var SlasherClientState;
13
- (function (SlasherClientState) {
11
+ */ export var SlasherClientState = /*#__PURE__*/ function(SlasherClientState) {
14
12
  SlasherClientState[SlasherClientState["IDLE"] = 0] = "IDLE";
15
13
  SlasherClientState[SlasherClientState["SYNCHING"] = 1] = "SYNCHING";
16
14
  SlasherClientState[SlasherClientState["RUNNING"] = 2] = "RUNNING";
17
15
  SlasherClientState[SlasherClientState["STOPPED"] = 3] = "STOPPED";
18
- })(SlasherClientState || (SlasherClientState = {}));
16
+ return SlasherClientState;
17
+ }({});
19
18
  /**
20
19
  * @notice A Hypomeiones slasher client implementation
21
20
  *
@@ -40,28 +39,31 @@ export var SlasherClientState;
40
39
  * - Decide how to deal with multiple slashing events in the same round.
41
40
  * - This could be that multiple epochs are pruned in the same round, but with the current naive implementation we could end up
42
41
  * slashing only the first, because the "lifetime" of the second would have passed after that vote
43
- */
44
- export class SlasherClient extends WithTracer {
45
- constructor(config, store, l2BlockSource, telemetry = getTelemetryClient(), log = createLogger('slasher')) {
46
- super(telemetry, 'slasher');
47
- this.config = config;
48
- this.store = store;
49
- this.l2BlockSource = l2BlockSource;
50
- this.log = log;
51
- this.currentState = SlasherClientState.IDLE;
52
- this.syncPromise = Promise.resolve();
53
- this.syncResolve = undefined;
54
- this.latestBlockNumberAtStart = -1;
55
- this.provenBlockNumberAtStart = -1;
56
- this.slashEvents = [];
57
- this.slashFactoryContract = undefined;
58
- // The amount to slash for a prune.
59
- // Note that we set it to 0, such that no actual slashing will happen, but the event will be fired,
60
- // showing that the slashing mechanism is working.
61
- this.slashingAmount = 0n;
42
+ */ export class SlasherClient extends WithTracer {
43
+ config;
44
+ store;
45
+ l2BlockSource;
46
+ log;
47
+ currentState;
48
+ syncPromise;
49
+ syncResolve;
50
+ latestBlockNumberAtStart;
51
+ provenBlockNumberAtStart;
52
+ synchedBlockHashes;
53
+ synchedLatestBlockNumber;
54
+ synchedProvenBlockNumber;
55
+ blockStream;
56
+ slashEvents;
57
+ slashFactoryContract;
58
+ // The amount to slash for a prune.
59
+ // Note that we set it to 0, such that no actual slashing will happen, but the event will be fired,
60
+ // showing that the slashing mechanism is working.
61
+ slashingAmount;
62
+ constructor(config, store, l2BlockSource, telemetry = getTelemetryClient(), log = createLogger('slasher')){
63
+ super(telemetry, 'slasher'), this.config = config, this.store = store, this.l2BlockSource = l2BlockSource, this.log = log, this.currentState = 0, this.syncPromise = Promise.resolve(), this.syncResolve = undefined, this.latestBlockNumberAtStart = -1, this.provenBlockNumberAtStart = -1, this.slashEvents = [], this.slashFactoryContract = undefined, this.slashingAmount = 0n;
62
64
  this.blockStream = new L2BlockStream(l2BlockSource, this, this, createLogger('slasher:block_stream'), {
63
65
  batchSize: config.blockRequestBatchSize,
64
- pollIntervalMS: config.blockCheckIntervalMS,
66
+ pollIntervalMS: config.blockCheckIntervalMS
65
67
  });
66
68
  this.synchedBlockHashes = store.openMap('slasher_block_hashes');
67
69
  this.synchedLatestBlockNumber = store.openSingleton('slasher_last_l2_block');
@@ -71,15 +73,14 @@ export class SlasherClient extends WithTracer {
71
73
  const publicClient = createPublicClient({
72
74
  chain: chain.chainInfo,
73
75
  transport: http(chain.rpcUrl),
74
- pollingInterval: config.viemPollingIntervalMS,
76
+ pollingInterval: config.viemPollingIntervalMS
75
77
  });
76
78
  this.slashFactoryContract = getContract({
77
79
  address: getAddress(config.l1Contracts.slashFactoryAddress.toString()),
78
80
  abi: SlashFactoryAbi,
79
- client: publicClient,
81
+ client: publicClient
80
82
  });
81
- }
82
- else {
83
+ } else {
83
84
  this.log.warn('No slash factory address found, slashing will not be enabled');
84
85
  }
85
86
  this.log.info(`Slasher client initialized`);
@@ -91,7 +92,7 @@ export class SlasherClient extends WithTracer {
91
92
  }
92
93
  // As long as the slot is greater than the lifetime, we want to keep deleting the first element
93
94
  // since it will not make sense to include anymore.
94
- while (this.slashEvents.length > 0 && this.slashEvents[0].lifetime < slotNumber) {
95
+ while(this.slashEvents.length > 0 && this.slashEvents[0].lifetime < slotNumber){
95
96
  this.slashEvents.shift();
96
97
  }
97
98
  if (this.slashEvents.length == 0) {
@@ -100,7 +101,7 @@ export class SlasherClient extends WithTracer {
100
101
  const slashEvent = this.slashEvents[0];
101
102
  const [payloadAddress, isDeployed] = await this.slashFactoryContract.read.getAddressAndIsDeployed([
102
103
  slashEvent.epoch,
103
- slashEvent.amount,
104
+ slashEvent.amount
104
105
  ]);
105
106
  if (!isDeployed) {
106
107
  // The proposal cannot be executed until it is deployed
@@ -131,58 +132,67 @@ export class SlasherClient extends WithTracer {
131
132
  }
132
133
  }
133
134
  return Promise.resolve({
134
- latest: { hash: latestBlockHash, number: latestBlockNumber },
135
- proven: { hash: provenBlockHash, number: provenBlockNumber },
136
- finalized: { hash: provenBlockHash, number: provenBlockNumber },
135
+ latest: {
136
+ hash: latestBlockHash,
137
+ number: latestBlockNumber
138
+ },
139
+ proven: {
140
+ hash: provenBlockHash,
141
+ number: provenBlockNumber
142
+ },
143
+ finalized: {
144
+ hash: provenBlockHash,
145
+ number: provenBlockNumber
146
+ }
137
147
  });
138
148
  }
139
149
  async handleBlockStreamEvent(event) {
140
150
  this.log.debug(`Handling block stream event ${event.type}`);
141
- switch (event.type) {
151
+ switch(event.type){
142
152
  case 'blocks-added':
143
153
  await this.handleLatestL2Blocks(event.blocks);
144
154
  break;
145
155
  case 'chain-finalized':
146
- // TODO (alexg): I think we can prune the block hashes map here
147
156
  break;
148
- case 'chain-proven': {
149
- const from = (await this.getSyncedProvenBlockNum()) + 1;
150
- const limit = event.blockNumber - from + 1;
151
- await this.handleProvenL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
152
- break;
153
- }
157
+ case 'chain-proven':
158
+ {
159
+ const from = await this.getSyncedProvenBlockNum() + 1;
160
+ const limit = event.blockNumber - from + 1;
161
+ await this.handleProvenL2Blocks(await this.l2BlockSource.getBlocks(from, limit));
162
+ break;
163
+ }
154
164
  case 'chain-pruned':
155
165
  await this.handlePruneL2Blocks(event.blockNumber);
156
166
  break;
157
- default: {
158
- const _ = event;
159
- break;
160
- }
167
+ default:
168
+ {
169
+ const _ = event;
170
+ break;
171
+ }
161
172
  }
162
173
  }
163
174
  async start() {
164
- if (this.currentState === SlasherClientState.STOPPED) {
175
+ if (this.currentState === 3) {
165
176
  throw new Error('Slasher already stopped');
166
177
  }
167
- if (this.currentState !== SlasherClientState.IDLE) {
178
+ if (this.currentState !== 0) {
168
179
  return this.syncPromise;
169
180
  }
170
181
  // get the current latest block numbers
171
182
  this.latestBlockNumberAtStart = await this.l2BlockSource.getBlockNumber();
172
183
  this.provenBlockNumberAtStart = await this.l2BlockSource.getProvenBlockNumber();
173
- const syncedLatestBlock = (await this.getSyncedLatestBlockNum()) + 1;
174
- const syncedProvenBlock = (await this.getSyncedProvenBlockNum()) + 1;
184
+ const syncedLatestBlock = await this.getSyncedLatestBlockNum() + 1;
185
+ const syncedProvenBlock = await this.getSyncedProvenBlockNum() + 1;
175
186
  // if there are blocks to be retrieved, go to a synching state
176
187
  if (syncedLatestBlock <= this.latestBlockNumberAtStart || syncedProvenBlock <= this.provenBlockNumberAtStart) {
177
- this.setCurrentState(SlasherClientState.SYNCHING);
178
- this.syncPromise = new Promise(resolve => {
188
+ this.setCurrentState(1);
189
+ this.syncPromise = new Promise((resolve)=>{
179
190
  this.syncResolve = resolve;
180
191
  });
181
192
  this.log.verbose(`Starting sync from ${syncedLatestBlock} (last proven ${syncedProvenBlock})`);
182
- }
183
- else {
193
+ } else {
184
194
  // if no blocks to be retrieved, go straight to running
185
- this.setCurrentState(SlasherClientState.RUNNING);
195
+ this.setCurrentState(2);
186
196
  this.syncPromise = Promise.resolve();
187
197
  this.log.verbose(`Block ${syncedLatestBlock} (proven ${syncedProvenBlock}) already beyond current block`);
188
198
  }
@@ -191,67 +201,59 @@ export class SlasherClient extends WithTracer {
191
201
  return this.syncPromise;
192
202
  }
193
203
  /**
194
- * Allows consumers to stop the instance of the slasher client.
195
- * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
196
- */
197
- async stop() {
204
+ * Allows consumers to stop the instance of the slasher client.
205
+ * 'ready' will now return 'false' and the running promise that keeps the client synced is interrupted.
206
+ */ async stop() {
198
207
  this.log.debug('Stopping Slasher client...');
199
208
  await this.blockStream.stop();
200
209
  this.log.debug('Stopped block downloader');
201
210
  await this.store.close();
202
211
  this.log.debug('Stopped slasher store');
203
- this.setCurrentState(SlasherClientState.STOPPED);
212
+ this.setCurrentState(3);
204
213
  this.log.info('Slasher client stopped.');
205
214
  }
206
215
  /**
207
- * Public function to check if the slasher client is fully synced and ready to receive txs.
208
- * @returns True if the slasher client is ready to receive txs.
209
- */
210
- isReady() {
211
- return this.currentState === SlasherClientState.RUNNING;
216
+ * Public function to check if the slasher client is fully synced and ready to receive txs.
217
+ * @returns True if the slasher client is ready to receive txs.
218
+ */ isReady() {
219
+ return this.currentState === 2;
212
220
  }
213
221
  /**
214
- * Public function to check the latest block number that the slasher client is synced to.
215
- * @returns Block number of latest L2 Block we've synced with.
216
- */
217
- async getSyncedLatestBlockNum() {
218
- return (await this.synchedLatestBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
222
+ * Public function to check the latest block number that the slasher client is synced to.
223
+ * @returns Block number of latest L2 Block we've synced with.
224
+ */ async getSyncedLatestBlockNum() {
225
+ return await this.synchedLatestBlockNumber.getAsync() ?? INITIAL_L2_BLOCK_NUM - 1;
219
226
  }
220
227
  /**
221
- * Public function to check the latest proven block number that the slasher client is synced to.
222
- * @returns Block number of latest proven L2 Block we've synced with.
223
- */
224
- async getSyncedProvenBlockNum() {
225
- return (await this.synchedProvenBlockNumber.getAsync()) ?? INITIAL_L2_BLOCK_NUM - 1;
228
+ * Public function to check the latest proven block number that the slasher client is synced to.
229
+ * @returns Block number of latest proven L2 Block we've synced with.
230
+ */ async getSyncedProvenBlockNum() {
231
+ return await this.synchedProvenBlockNumber.getAsync() ?? INITIAL_L2_BLOCK_NUM - 1;
226
232
  }
227
233
  /**
228
- * Method to check the status of the slasher client.
229
- * @returns Information about slasher client status: state & syncedToBlockNum.
230
- */
231
- async getStatus() {
234
+ * Method to check the status of the slasher client.
235
+ * @returns Information about slasher client status: state & syncedToBlockNum.
236
+ */ async getStatus() {
232
237
  const blockNumber = await this.getSyncedLatestBlockNum();
233
- const blockHash = blockNumber == 0
234
- ? ''
235
- : await this.l2BlockSource
236
- .getBlockHeader(blockNumber)
237
- .then(header => header?.hash())
238
- .then(hash => hash?.toString());
238
+ const blockHash = blockNumber == 0 ? '' : await this.l2BlockSource.getBlockHeader(blockNumber).then((header)=>header?.hash()).then((hash)=>hash?.toString());
239
239
  return Promise.resolve({
240
240
  state: this.currentState,
241
- syncedToL2Block: { number: blockNumber, hash: blockHash },
241
+ syncedToL2Block: {
242
+ number: blockNumber,
243
+ hash: blockHash
244
+ }
242
245
  });
243
246
  }
244
247
  /**
245
- * Handles new blocks
246
- * @param blocks - A list of blocks that the slasher client needs to store block hashes for
247
- * @returns Empty promise.
248
- */
249
- async handleLatestL2Blocks(blocks) {
248
+ * Handles new blocks
249
+ * @param blocks - A list of blocks that the slasher client needs to store block hashes for
250
+ * @returns Empty promise.
251
+ */ async handleLatestL2Blocks(blocks) {
250
252
  if (!blocks.length) {
251
253
  return;
252
254
  }
253
- await this.store.transactionAsync(async () => {
254
- for (const block of blocks) {
255
+ await this.store.transactionAsync(async ()=>{
256
+ for (const block of blocks){
255
257
  await this.synchedBlockHashes.set(block.number, (await block.hash()).toString());
256
258
  }
257
259
  const lastBlockNum = blocks[blocks.length - 1].number;
@@ -260,11 +262,10 @@ export class SlasherClient extends WithTracer {
260
262
  await this.startServiceIfSynched();
261
263
  }
262
264
  /**
263
- * Handles new proven blocks by updating the proven block number
264
- * @param blocks - A list of proven L2 blocks.
265
- * @returns Empty promise.
266
- */
267
- async handleProvenL2Blocks(blocks) {
265
+ * Handles new proven blocks by updating the proven block number
266
+ * @param blocks - A list of proven L2 blocks.
267
+ * @returns Empty promise.
268
+ */ async handleProvenL2Blocks(blocks) {
268
269
  if (!blocks.length) {
269
270
  return Promise.resolve();
270
271
  }
@@ -285,32 +286,28 @@ export class SlasherClient extends WithTracer {
285
286
  this.slashEvents.push({
286
287
  epoch: epochNumber,
287
288
  amount: this.slashingAmount,
288
- lifetime,
289
+ lifetime
289
290
  });
290
291
  await this.synchedLatestBlockNumber.set(latestBlock);
291
292
  }
292
293
  async startServiceIfSynched() {
293
294
  const [latestBlock, provenBlock] = await Promise.all([
294
295
  this.getSyncedLatestBlockNum(),
295
- this.getSyncedProvenBlockNum(),
296
+ this.getSyncedProvenBlockNum()
296
297
  ]);
297
- if (this.currentState === SlasherClientState.SYNCHING &&
298
- latestBlock >= this.latestBlockNumberAtStart &&
299
- provenBlock >= this.provenBlockNumberAtStart) {
298
+ if (this.currentState === 1 && latestBlock >= this.latestBlockNumberAtStart && provenBlock >= this.provenBlockNumberAtStart) {
300
299
  this.log.debug(`Synched to blocks at start`);
301
- this.setCurrentState(SlasherClientState.RUNNING);
300
+ this.setCurrentState(2);
302
301
  if (this.syncResolve !== undefined) {
303
302
  this.syncResolve();
304
303
  }
305
304
  }
306
305
  }
307
306
  /**
308
- * Method to set the value of the current state.
309
- * @param newState - New state value.
310
- */
311
- setCurrentState(newState) {
307
+ * Method to set the value of the current state.
308
+ * @param newState - New state value.
309
+ */ setCurrentState(newState) {
312
310
  this.currentState = newState;
313
311
  this.log.debug(`Moved to state ${SlasherClientState[this.currentState]}`);
314
312
  }
315
313
  }
316
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhc2hlcl9jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2xhc2hlci9zbGFzaGVyX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBSUwsYUFBYSxHQUdkLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUErQyxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25HLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBd0IsVUFBVSxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0YsT0FBTyxFQUtMLGtCQUFrQixFQUNsQixVQUFVLEVBQ1YsV0FBVyxFQUNYLElBQUksR0FDTCxNQUFNLE1BQU0sQ0FBQztBQUVkOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBS1g7QUFMRCxXQUFZLGtCQUFrQjtJQUM1QiwyREFBSSxDQUFBO0lBQ0osbUVBQVEsQ0FBQTtJQUNSLGlFQUFPLENBQUE7SUFDUCxpRUFBTyxDQUFBO0FBQ1QsQ0FBQyxFQUxXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFLN0I7QUEyQkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILE1BQU0sT0FBTyxhQUFjLFNBQVEsVUFBVTtJQXVCM0MsWUFDVSxNQUEwRCxFQUMxRCxLQUF3QixFQUN4QixhQUE0QixFQUNwQyxZQUE2QixrQkFBa0IsRUFBRSxFQUN6QyxNQUFNLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFFckMsS0FBSyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU5wQixXQUFNLEdBQU4sTUFBTSxDQUFvRDtRQUMxRCxVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUU1QixRQUFHLEdBQUgsR0FBRyxDQUEwQjtRQTNCL0IsaUJBQVksR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7UUFDdkMsZ0JBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsZ0JBQVcsR0FBZ0IsU0FBUyxDQUFDO1FBQ3JDLDZCQUF3QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlCLDZCQUF3QixHQUFHLENBQUMsQ0FBQyxDQUFDO1FBUTlCLGdCQUFXLEdBQWlCLEVBQUUsQ0FBQztRQUU3Qix5QkFBb0IsR0FDNUIsU0FBUyxDQUFDO1FBRVosbUNBQW1DO1FBQ25DLG1HQUFtRztRQUNuRyxrREFBa0Q7UUFDMUMsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFXbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsc0JBQXNCLENBQUMsRUFBRTtZQUNwRyxTQUFTLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjtZQUN2QyxjQUFjLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtTQUM1QyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2hFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsOEJBQThCLENBQUMsQ0FBQztRQUVwRixJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDekcsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDckUsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7Z0JBQ3RDLEtBQUssRUFBRSxLQUFLLENBQUMsU0FBUztnQkFDdEIsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUM3QixlQUFlLEVBQUUsTUFBTSxDQUFDLHFCQUFxQjthQUM5QyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsV0FBVyxDQUFDO2dCQUN0QyxPQUFPLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ3RFLEdBQUcsRUFBRSxlQUFlO2dCQUNwQixNQUFNLEVBQUUsWUFBWTthQUNyQixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUM7UUFDaEYsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELDZFQUE2RTtJQUN0RSxLQUFLLENBQUMsZUFBZSxDQUFDLFVBQWtCO1FBQzdDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUMvQixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsK0ZBQStGO1FBQy9GLG1EQUFtRDtRQUNuRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXZDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsVUFBVSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDO1lBQ2hHLFVBQVUsQ0FBQyxLQUFLO1lBQ2hCLFVBQVUsQ0FBQyxNQUFNO1NBQ2xCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQix1REFBdUQ7WUFDdkQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRU0sY0FBYyxDQUFDLE1BQWM7UUFDbEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUztRQUNwQixNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDL0QsSUFBSSxlQUFtQyxDQUFDO1FBQ3hDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvRCxJQUFJLGVBQW1DLENBQUM7UUFFeEMsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUUsSUFBSSxPQUFPLGVBQWUsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsK0JBQStCLGlCQUFpQixZQUFZLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQixlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDNUUsSUFBSSxPQUFPLGVBQWUsS0FBSyxXQUFXLEVBQUUsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsK0JBQStCLGlCQUFpQixZQUFZLENBQUMsQ0FBQztnQkFDNUUsTUFBTSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3BCLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3JCLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxlQUFnQixFQUFFLE1BQU0sRUFBRSxpQkFBaUIsRUFBRTtZQUM3RCxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZ0IsRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUU7WUFDN0QsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWdCLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFO1NBQ2pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsc0JBQXNCLENBQUMsS0FBeUI7UUFDM0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsK0JBQStCLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVELFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLEtBQUssY0FBYztnQkFDakIsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM5QyxNQUFNO1lBQ1IsS0FBSyxpQkFBaUI7Z0JBQ3BCLCtEQUErRDtnQkFDL0QsTUFBTTtZQUNSLEtBQUssY0FBYyxDQUFDLENBQUMsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUN4RCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ2pGLE1BQU07WUFDUixDQUFDO1lBQ0QsS0FBSyxjQUFjO2dCQUNqQixNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQ2xELE1BQU07WUFDUixPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUNSLE1BQU0sQ0FBQyxHQUFVLEtBQUssQ0FBQztnQkFDdkIsTUFBTTtZQUNSLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVNLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUVELHVDQUF1QztRQUN2QyxJQUFJLENBQUMsd0JBQXdCLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzFFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUVoRixNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyRSxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVyRSw4REFBOEQ7UUFDOUQsSUFBSSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksaUJBQWlCLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDN0csSUFBSSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztZQUM3QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLHNCQUFzQixpQkFBaUIsaUJBQWlCLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUNqRyxDQUFDO2FBQU0sQ0FBQztZQUNOLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsaUJBQWlCLFlBQVksaUJBQWlCLGdDQUFnQyxDQUFDLENBQUM7UUFDNUcsQ0FBQztRQUVELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLGlCQUFpQixFQUFFLENBQUMsQ0FBQztRQUU3RSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMzQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7T0FHRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsT0FBTyxDQUFDO0lBQzFELENBQUM7SUFFRDs7O09BR0c7SUFDSSxLQUFLLENBQUMsdUJBQXVCO1FBQ2xDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QjtRQUNsQyxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE1BQU0sV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQ2IsV0FBVyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhO2lCQUNyQixjQUFjLENBQUMsV0FBVyxDQUFDO2lCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7aUJBQzlCLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDeEIsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFO1NBQ3RDLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFpQjtRQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQzNDLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1lBQ25GLENBQUM7WUFFRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDdEQsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxNQUFpQjtRQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDdEQsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRTFELE1BQU0sSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVPLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxXQUFtQjtRQUNuRCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvRixNQUFNLFdBQVcsR0FBRyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQywyREFBMkQsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUV4RixpRkFBaUY7UUFDakYsTUFBTSxjQUFjLEdBQUcsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUUsTUFBTSxNQUFNLEdBQUcsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLGNBQWMsQ0FBQztRQUVsRyxNQUFNLFFBQVEsR0FBRyxVQUFVLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFN0UsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFDcEIsS0FBSyxFQUFFLFdBQVc7WUFDbEIsTUFBTSxFQUFFLElBQUksQ0FBQyxjQUFjO1lBQzNCLFFBQVE7U0FDVCxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxxQkFBcUI7UUFDakMsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7WUFDbkQsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzlCLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtTQUMvQixDQUFDLENBQUM7UUFDSCxJQUNFLElBQUksQ0FBQyxZQUFZLEtBQUssa0JBQWtCLENBQUMsUUFBUTtZQUNqRCxXQUFXLElBQUksSUFBSSxDQUFDLHdCQUF3QjtZQUM1QyxXQUFXLElBQUksSUFBSSxDQUFDLHdCQUF3QixFQUM1QyxDQUFDO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLGVBQWUsQ0FBQyxRQUE0QjtRQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztRQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0Isa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBQ0YifQ==
@@ -1,7 +1,10 @@
1
1
  import { SequencerClient } from '../client/sequencer-client.js';
2
2
  import { Sequencer } from '../sequencer/sequencer.js';
3
3
  class TestSequencer_ extends Sequencer {
4
+ publicProcessorFactory;
5
+ timetable;
6
+ publisher;
4
7
  }
5
8
  class TestSequencerClient_ extends SequencerClient {
9
+ sequencer;
6
10
  }
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVzdC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFaEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3RELE1BQU0sY0FBZSxTQUFRLFNBQVM7Q0FJckM7QUFJRCxNQUFNLG9CQUFxQixTQUFRLGVBQWU7Q0FFakQifQ==