UNPKG

astx

Version:

super powerful structural search and replace for JavaScript and TypeScript to automate your refactoring

172 lines (150 loc) 14.2 kB
import RingBuffer from './RingBuffer.mjs' export default class PushPullIterable { queue pushQueue = [] pullQueue = [] producing = true consuming = true iterating = false consumeError produceError constructor(capacity) { if ( (capacity !== Infinity && !Number.isFinite(capacity)) || capacity < 0 || capacity % 1 ) { throw new Error(`invalid capacity: ${capacity}`) } this.queue = new RingBuffer(capacity) } [Symbol.asyncIterator]() { if (this.iterating) { throw new Error( `this iterable doesn't support creating more than one iterator` ) } this.iterating = true // eslint-disable-next-line @typescript-eslint/no-this-alias const self = this return { async next() { return self.pull() }, async return() { self.iteratorReturn() return { value: undefined, done: true, } }, async throw(error) { self.iteratorThrow({ error, }) return { value: undefined, done: true, } }, } } async push(value) { if (!this.producing) { throw new Error(`can't push after returning or throwing`) } if (!this.consuming) return false if (this.consumeError) throw this.consumeError const waitingPull = this.pullQueue.shift() if (waitingPull) { waitingPull.resolve({ value, done: false, }) return this.consuming } if (!this.queue.isFull) { this.queue.push(value) return this.consuming } return new Promise((resolve, reject) => { this.pushQueue.push({ resolve: (keepGoing) => { if (keepGoing && this.producing) this.queue.push(value) resolve(keepGoing) }, reject, }) }) } async pull() { if (!this.consuming) { throw new Error(`can't call next after returning or throwing`) } if (this.produceError) throw this.produceError if (this.queue.size) { var _this$pushQueue$shift const pulled = this.queue.pull() ;(_this$pushQueue$shift = this.pushQueue.shift()) === null || _this$pushQueue$shift === void 0 ? void 0 : _this$pushQueue$shift.resolve(true) return { value: pulled, done: false, } } if (!this.producing) { return { value: undefined, done: true, } } return new Promise((resolve, reject) => { this.pullQueue.push({ resolve, reject, }) }) } return() { if (!this.producing) return this.producing = false const { pullQueue } = this this.pullQueue = [] for (const pull of pullQueue) { pull.resolve({ value: undefined, done: true, }) } } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types throw(error) { if (!this.producing) return this.producing = false this.produceError = error const { pullQueue } = this this.pullQueue = [] for (const pull of pullQueue) { pull.reject(error) } } iteratorReturn() { if (!this.consuming) return this.consuming = false const { pushQueue } = this this.pushQueue = [] for (const push of pushQueue) { push.resolve(false) } } iteratorThrow(error) { if (!this.consuming) return this.consuming = false this.consumeError = error const { pushQueue } = this this.pushQueue = [] for (const push of pushQueue) { push.reject(error) } } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSaW5nQnVmZmVyIiwiUHVzaFB1bGxJdGVyYWJsZSIsInF1ZXVlIiwicHVzaFF1ZXVlIiwicHVsbFF1ZXVlIiwicHJvZHVjaW5nIiwiY29uc3VtaW5nIiwiaXRlcmF0aW5nIiwiY29uc3VtZUVycm9yIiwicHJvZHVjZUVycm9yIiwiY29uc3RydWN0b3IiLCJjYXBhY2l0eSIsIkluZmluaXR5IiwiTnVtYmVyIiwiaXNGaW5pdGUiLCJFcnJvciIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJzZWxmIiwibmV4dCIsInB1bGwiLCJyZXR1cm4iLCJpdGVyYXRvclJldHVybiIsInZhbHVlIiwidW5kZWZpbmVkIiwiZG9uZSIsInRocm93IiwiZXJyb3IiLCJpdGVyYXRvclRocm93IiwicHVzaCIsIndhaXRpbmdQdWxsIiwic2hpZnQiLCJyZXNvbHZlIiwiaXNGdWxsIiwiUHJvbWlzZSIsInJlamVjdCIsImtlZXBHb2luZyIsInNpemUiLCJwdWxsZWQiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC9QdXNoUHVsbEl0ZXJhYmxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSaW5nQnVmZmVyIGZyb20gJy4vUmluZ0J1ZmZlcidcblxudHlwZSBSZXNvbHZlUmVqZWN0PFQ+ID0ge1xuICByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWRcbiAgcmVqZWN0OiAoZXJyb3I/OiBhbnkpID0+IHZvaWRcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHVzaFB1bGxJdGVyYWJsZTxUPiBpbXBsZW1lbnRzIEFzeW5jSXRlcmFibGU8VD4ge1xuICBwcml2YXRlIHF1ZXVlOiBSaW5nQnVmZmVyPFQ+XG4gIHByaXZhdGUgcHVzaFF1ZXVlOiBSZXNvbHZlUmVqZWN0PGJvb2xlYW4+W10gPSBbXVxuICBwcml2YXRlIHB1bGxRdWV1ZTogUmVzb2x2ZVJlamVjdDxJdGVyYXRvclJlc3VsdDxUPj5bXSA9IFtdXG4gIHByaXZhdGUgcHJvZHVjaW5nID0gdHJ1ZVxuICBwcml2YXRlIGNvbnN1bWluZyA9IHRydWVcbiAgcHJpdmF0ZSBpdGVyYXRpbmcgPSBmYWxzZVxuICBwcml2YXRlIGNvbnN1bWVFcnJvcjogYW55XG4gIHByaXZhdGUgcHJvZHVjZUVycm9yOiBhbnlcblxuICBjb25zdHJ1Y3RvcihjYXBhY2l0eTogbnVtYmVyKSB7XG4gICAgaWYgKFxuICAgICAgKGNhcGFjaXR5ICE9PSBJbmZpbml0eSAmJiAhTnVtYmVyLmlzRmluaXRlKGNhcGFjaXR5KSkgfHxcbiAgICAgIGNhcGFjaXR5IDwgMCB8fFxuICAgICAgY2FwYWNpdHkgJSAxXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgY2FwYWNpdHk6ICR7Y2FwYWNpdHl9YClcbiAgICB9XG4gICAgdGhpcy5xdWV1ZSA9IG5ldyBSaW5nQnVmZmVyKGNhcGFjaXR5KVxuICB9XG5cbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhdG9yPFQ+IHtcbiAgICBpZiAodGhpcy5pdGVyYXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRoaXMgaXRlcmFibGUgZG9lc24ndCBzdXBwb3J0IGNyZWF0aW5nIG1vcmUgdGhhbiBvbmUgaXRlcmF0b3JgXG4gICAgICApXG4gICAgfVxuICAgIHRoaXMuaXRlcmF0aW5nID0gdHJ1ZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzXG4gICAgcmV0dXJuIHtcbiAgICAgIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICByZXR1cm4gc2VsZi5wdWxsKClcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgICAgICBzZWxmLml0ZXJhdG9yUmV0dXJuKClcbiAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3coZXJyb3I/OiBhbnkpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgICAgIHNlbGYuaXRlcmF0b3JUaHJvdyh7IGVycm9yIH0pXG4gICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfVxuICAgICAgfSxcbiAgICB9XG4gIH1cblxuICBhc3luYyBwdXNoKHZhbHVlOiBUKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKCF0aGlzLnByb2R1Y2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBjYW4ndCBwdXNoIGFmdGVyIHJldHVybmluZyBvciB0aHJvd2luZ2ApXG4gICAgfVxuICAgIGlmICghdGhpcy5jb25zdW1pbmcpIHJldHVybiBmYWxzZVxuICAgIGlmICh0aGlzLmNvbnN1bWVFcnJvcikgdGhyb3cgdGhpcy5jb25zdW1lRXJyb3JcbiAgICBjb25zdCB3YWl0aW5nUHVsbCA9IHRoaXMucHVsbFF1ZXVlLnNoaWZ0KClcbiAgICBpZiAod2FpdGluZ1B1bGwpIHtcbiAgICAgIHdhaXRpbmdQdWxsLnJlc29sdmUoeyB2YWx1ZSwgZG9uZTogZmFsc2UgfSlcbiAgICAgIHJldHVybiB0aGlzLmNvbnN1bWluZ1xuICAgIH1cbiAgICBpZiAoIXRoaXMucXVldWUuaXNGdWxsKSB7XG4gICAgICB0aGlzLnF1ZXVlLnB1c2godmFsdWUpXG4gICAgICByZXR1cm4gdGhpcy5jb25zdW1pbmdcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucHVzaFF1ZXVlLnB1c2goe1xuICAgICAgICByZXNvbHZlOiAoa2VlcEdvaW5nOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKGtlZXBHb2luZyAmJiB0aGlzLnByb2R1Y2luZykgdGhpcy5xdWV1ZS5wdXNoKHZhbHVlKVxuICAgICAgICAgIHJlc29sdmUoa2VlcEdvaW5nKVxuICAgICAgICB9LFxuICAgICAgICByZWplY3QsXG4gICAgICB9KVxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHB1bGwoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIGlmICghdGhpcy5jb25zdW1pbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2FuJ3QgY2FsbCBuZXh0IGFmdGVyIHJldHVybmluZyBvciB0aHJvd2luZ2ApXG4gICAgfVxuICAgIGlmICh0aGlzLnByb2R1Y2VFcnJvcikgdGhyb3cgdGhpcy5wcm9kdWNlRXJyb3JcbiAgICBpZiAodGhpcy5xdWV1ZS5zaXplKSB7XG4gICAgICBjb25zdCBwdWxsZWQ6IFQgPSB0aGlzLnF1ZXVlLnB1bGwoKSBhcyBhbnlcbiAgICAgIHRoaXMucHVzaFF1ZXVlLnNoaWZ0KCk/LnJlc29sdmUodHJ1ZSlcbiAgICAgIHJldHVybiB7IHZhbHVlOiBwdWxsZWQsIGRvbmU6IGZhbHNlIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLnByb2R1Y2luZykge1xuICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5wdWxsUXVldWUucHVzaCh7IHJlc29sdmUsIHJlamVjdCB9KVxuICAgIH0pXG4gIH1cblxuICByZXR1cm4oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2R1Y2luZykgcmV0dXJuXG4gICAgdGhpcy5wcm9kdWNpbmcgPSBmYWxzZVxuICAgIGNvbnN0IHsgcHVsbFF1ZXVlIH0gPSB0aGlzXG4gICAgdGhpcy5wdWxsUXVldWUgPSBbXVxuICAgIGZvciAoY29uc3QgcHVsbCBvZiBwdWxsUXVldWUpIHtcbiAgICAgIHB1bGwucmVzb2x2ZSh7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSlcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2V4cGxpY2l0LW1vZHVsZS1ib3VuZGFyeS10eXBlc1xuICB0aHJvdyhlcnJvcj86IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcm9kdWNpbmcpIHJldHVyblxuICAgIHRoaXMucHJvZHVjaW5nID0gZmFsc2VcbiAgICB0aGlzLnByb2R1Y2VFcnJvciA9IGVycm9yXG4gICAgY29uc3QgeyBwdWxsUXVldWUgfSA9IHRoaXNcbiAgICB0aGlzLnB1bGxRdWV1ZSA9IFtdXG4gICAgZm9yIChjb25zdCBwdWxsIG9mIHB1bGxRdWV1ZSkge1xuICAgICAgcHVsbC5yZWplY3QoZXJyb3IpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpdGVyYXRvclJldHVybigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29uc3VtaW5nKSByZXR1cm5cbiAgICB0aGlzLmNvbnN1bWluZyA9IGZhbHNlXG4gICAgY29uc3QgeyBwdXNoUXVldWUgfSA9IHRoaXNcbiAgICB0aGlzLnB1c2hRdWV1ZSA9IFtdXG4gICAgZm9yIChjb25zdCBwdXNoIG9mIHB1c2hRdWV1ZSkge1xuICAgICAgcHVzaC5yZXNvbHZlKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXRlcmF0b3JUaHJvdyhlcnJvcj86IGFueSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb25zdW1pbmcpIHJldHVyblxuICAgIHRoaXMuY29uc3VtaW5nID0gZmFsc2VcbiAgICB0aGlzLmNvbnN1bWVFcnJvciA9IGVycm9yXG4gICAgY29uc3QgeyBwdXNoUXVldWUgfSA9IHRoaXNcbiAgICB0aGlzLnB1c2hRdWV1ZSA9IFtdXG4gICAgZm9yIChjb25zdCBwdXNoIG9mIHB1c2hRdWV1ZSkge1xuICAgICAgcHVzaC5yZWplY3QoZXJyb3IpXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFVBQVAsTUFBdUIsY0FBdkI7Ozs7Ozs7QUFPQSxlQUFlLE1BQU1DLGdCQUFOLENBQXNEO0VBQzNEQyxLQUFLO0VBQ0xDLFNBQVMsR0FBNkIsRUFBN0I7RUFDVEMsU0FBUyxHQUF1QyxFQUF2QztFQUNUQyxTQUFTLEdBQUcsSUFBSDtFQUNUQyxTQUFTLEdBQUcsSUFBSDtFQUNUQyxTQUFTLEdBQUcsS0FBSDtFQUNUQyxZQUFZO0VBQ1pDLFlBQVk7O0VBRXBCQyxXQUFXLENBQUNDLFFBQUQsRUFBbUI7SUFDNUI7SUFDR0EsUUFBUSxLQUFLQyxRQUFiLElBQXlCLENBQUNDLE1BQU0sQ0FBQ0MsUUFBUCxDQUFnQkgsUUFBaEIsQ0FBM0I7SUFDQUEsUUFBUSxHQUFHLENBRFg7SUFFQUEsUUFBUSxHQUFHLENBSGI7SUFJRTtNQUNBLE1BQU0sSUFBSUksS0FBSixDQUFXLHFCQUFvQkosUUFBUyxFQUF4QyxDQUFOO0lBQ0Q7SUFDRCxLQUFLVCxLQUFMLEdBQWEsSUFBSUYsVUFBSixDQUFlVyxRQUFmLENBQWI7RUFDRDs7RUFFb0IsQ0FBcEJLLE1BQU0sQ0FBQ0MsYUFBYSxJQUFzQjtJQUN6QyxJQUFJLEtBQUtWLFNBQVQsRUFBb0I7TUFDbEIsTUFBTSxJQUFJUSxLQUFKO01BQ0gsK0RBREcsQ0FBTjs7SUFHRDtJQUNELEtBQUtSLFNBQUwsR0FBaUIsSUFBakI7SUFDQTtJQUNBLE1BQU1XLElBQUksR0FBRyxJQUFiO0lBQ0EsT0FBTztNQUNMLE1BQU1DLElBQU4sR0FBeUM7UUFDdkMsT0FBT0QsSUFBSSxDQUFDRSxJQUFMLEVBQVA7TUFDRCxDQUhJO01BSUwsTUFBTUMsTUFBTixHQUEyQztRQUN6Q0gsSUFBSSxDQUFDSSxjQUFMO1FBQ0EsT0FBTyxFQUFFQyxLQUFLLEVBQUVDLFNBQVQsRUFBb0JDLElBQUksRUFBRSxJQUExQixFQUFQO01BQ0QsQ0FQSTtNQVFMLE1BQU1DLEtBQU4sQ0FBWUMsS0FBWixFQUFxRDtRQUNuRFQsSUFBSSxDQUFDVSxhQUFMLENBQW1CLEVBQUVELEtBQUYsRUFBbkI7UUFDQSxPQUFPLEVBQUVKLEtBQUssRUFBRUMsU0FBVCxFQUFvQkMsSUFBSSxFQUFFLElBQTFCLEVBQVA7TUFDRCxDQVhJLEVBQVA7O0VBYUQ7O0VBRVMsTUFBSkksSUFBSSxDQUFDTixLQUFELEVBQTZCO0lBQ3JDLElBQUksQ0FBQyxLQUFLbEIsU0FBVixFQUFxQjtNQUNuQixNQUFNLElBQUlVLEtBQUosQ0FBVyx3Q0FBWCxDQUFOO0lBQ0Q7SUFDRCxJQUFJLENBQUMsS0FBS1QsU0FBVixFQUFxQixPQUFPLEtBQVA7SUFDckIsSUFBSSxLQUFLRSxZQUFULEVBQXVCLE1BQU0sS0FBS0EsWUFBWDtJQUN2QixNQUFNc0IsV0FBVyxHQUFHLEtBQUsxQixTQUFMLENBQWUyQixLQUFmLEVBQXBCO0lBQ0EsSUFBSUQsV0FBSixFQUFpQjtNQUNmQSxXQUFXLENBQUNFLE9BQVosQ0FBb0IsRUFBRVQsS0FBRixFQUFTRSxJQUFJLEVBQUUsS0FBZixFQUFwQjtNQUNBLE9BQU8sS0FBS25CLFNBQVo7SUFDRDtJQUNELElBQUksQ0FBQyxLQUFLSixLQUFMLENBQVcrQixNQUFoQixFQUF3QjtNQUN0QixLQUFLL0IsS0FBTCxDQUFXMkIsSUFBWCxDQUFnQk4sS0FBaEI7TUFDQSxPQUFPLEtBQUtqQixTQUFaO0lBQ0Q7SUFDRCxPQUFPLElBQUk0QixPQUFKLENBQXFCLENBQUNGLE9BQUQsRUFBVUcsTUFBVixLQUFxQjtNQUMvQyxLQUFLaEMsU0FBTCxDQUFlMEIsSUFBZixDQUFvQjtRQUNsQkcsT0FBTyxFQUFFLENBQUNJLFNBQUQsS0FBd0I7VUFDL0IsSUFBSUEsU0FBUyxJQUFJLEtBQUsvQixTQUF0QixFQUFpQyxLQUFLSCxLQUFMLENBQVcyQixJQUFYLENBQWdCTixLQUFoQjtVQUNqQ1MsT0FBTyxDQUFDSSxTQUFELENBQVA7UUFDRCxDQUppQjtRQUtsQkQsTUFMa0IsRUFBcEI7O0lBT0QsQ0FSTSxDQUFQO0VBU0Q7O0VBRWlCLE1BQUpmLElBQUksR0FBK0I7SUFDL0MsSUFBSSxDQUFDLEtBQUtkLFNBQVYsRUFBcUI7TUFDbkIsTUFBTSxJQUFJUyxLQUFKLENBQVcsNkNBQVgsQ0FBTjtJQUNEO0lBQ0QsSUFBSSxLQUFLTixZQUFULEVBQXVCLE1BQU0sS0FBS0EsWUFBWDtJQUN2QixJQUFJLEtBQUtQLEtBQUwsQ0FBV21DLElBQWYsRUFBcUI7TUFDbkIsTUFBTUMsTUFBUyxHQUFHLEtBQUtwQyxLQUFMLENBQVdrQixJQUFYLEVBQWxCO01BQ0EsOEJBQUtqQixTQUFMLENBQWU0QixLQUFmLGtGQUF3QkMsT0FBeEIsQ0FBZ0MsSUFBaEM7TUFDQSxPQUFPLEVBQUVULEtBQUssRUFBRWUsTUFBVCxFQUFpQmIsSUFBSSxFQUFFLEtBQXZCLEVBQVA7SUFDRDtJQUNELElBQUksQ0FBQyxLQUFLcEIsU0FBVixFQUFxQjtNQUNuQixPQUFPLEVBQUVrQixLQUFLLEVBQUVDLFNBQVQsRUFBb0JDLElBQUksRUFBRSxJQUExQixFQUFQO0lBQ0Q7SUFDRCxPQUFPLElBQUlTLE9BQUosQ0FBK0IsQ0FBQ0YsT0FBRCxFQUFVRyxNQUFWLEtBQXFCO01BQ3pELEtBQUsvQixTQUFMLENBQWV5QixJQUFmLENBQW9CLEVBQUVHLE9BQUYsRUFBV0csTUFBWCxFQUFwQjtJQUNELENBRk0sQ0FBUDtFQUdEOztFQUVEZCxNQUFNLEdBQVM7SUFDYixJQUFJLENBQUMsS0FBS2hCLFNBQVYsRUFBcUI7SUFDckIsS0FBS0EsU0FBTCxHQUFpQixLQUFqQjtJQUNBLE1BQU0sRUFBRUQsU0FBRixLQUFnQixJQUF0QjtJQUNBLEtBQUtBLFNBQUwsR0FBaUIsRUFBakI7SUFDQSxLQUFLLE1BQU1nQixJQUFYLElBQW1CaEIsU0FBbkIsRUFBOEI7TUFDNUJnQixJQUFJLENBQUNZLE9BQUwsQ0FBYSxFQUFFVCxLQUFLLEVBQUVDLFNBQVQsRUFBb0JDLElBQUksRUFBRSxJQUExQixFQUFiO0lBQ0Q7RUFDRjs7RUFFRDtFQUNBQyxLQUFLLENBQUNDLEtBQUQsRUFBb0I7SUFDdkIsSUFBSSxDQUFDLEtBQUt0QixTQUFWLEVBQXFCO0lBQ3JCLEtBQUtBLFNBQUwsR0FBaUIsS0FBakI7SUFDQSxLQUFLSSxZQUFMLEdBQW9Ca0IsS0FBcEI7SUFDQSxNQUFNLEVBQUV2QixTQUFGLEtBQWdCLElBQXRCO0lBQ0EsS0FBS0EsU0FBTCxHQUFpQixFQUFqQjtJQUNBLEtBQUssTUFBTWdCLElBQVgsSUFBbUJoQixTQUFuQixFQUE4QjtNQUM1QmdCLElBQUksQ0FBQ2UsTUFBTCxDQUFZUixLQUFaO0lBQ0Q7RUFDRjs7RUFFT0wsY0FBYyxHQUFTO0lBQzdCLElBQUksQ0FBQyxLQUFLaEIsU0FBVixFQUFxQjtJQUNyQixLQUFLQSxTQUFMLEdBQWlCLEtBQWpCO0lBQ0EsTUFBTSxFQUFFSCxTQUFGLEtBQWdCLElBQXRCO0lBQ0EsS0FBS0EsU0FBTCxHQUFpQixFQUFqQjtJQUNBLEtBQUssTUFBTTBCLElBQVgsSUFBbUIxQixTQUFuQixFQUE4QjtNQUM1QjBCLElBQUksQ0FBQ0csT0FBTCxDQUFhLEtBQWI7SUFDRDtFQUNGOztFQUVPSixhQUFhLENBQUNELEtBQUQsRUFBb0I7SUFDdkMsSUFBSSxDQUFDLEtBQUtyQixTQUFWLEVBQXFCO0lBQ3JCLEtBQUtBLFNBQUwsR0FBaUIsS0FBakI7SUFDQSxLQUFLRSxZQUFMLEdBQW9CbUIsS0FBcEI7SUFDQSxNQUFNLEVBQUV4QixTQUFGLEtBQWdCLElBQXRCO0lBQ0EsS0FBS0EsU0FBTCxHQUFpQixFQUFqQjtJQUNBLEtBQUssTUFBTTBCLElBQVgsSUFBbUIxQixTQUFuQixFQUE4QjtNQUM1QjBCLElBQUksQ0FBQ00sTUFBTCxDQUFZUixLQUFaO0lBQ0Q7RUFDRixDQWxJa0UifQ==