New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

redibox-hook-job

Package Overview
Dependencies
Maintainers
2
Versions
23
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

redibox-hook-job - npm Package Compare versions

Comparing version 1.2.17 to 1.2.18

benchmark/benchmark-chart.png

40

docs/advanced-usage.md
## Advanced Usage
### Inline vs globally accessible functions
### Generic queue handler vs globally accessible functions
For simplicity reasons, previous examples have mostly shown the functions jobs execute as inline, e.g:
For simplicity reasons, previous examples have mostly shown the functions jobs executing using the default queue handler, e.g:
```javascript
RediBox.hooks.job.create('queue', {
runs: function(job) {
console.log('Job running');
}
// specify a 'handler' function on the 'myqueue' config options
// all jobs without a `runs` will fallback to using this handler
// to process jobs
RediBox.hooks.job.create('myqueue', {
data: {
foo: 'bar',
},
});

@@ -18,3 +22,3 @@ ```

functions to be broken down into file based logic and callable globally. If the job detects a string as a run function,
it'll attempt to execute it, assuming it's a global function.
it'll attempt to deep get the dot notated path and execute the function, assuming it's a global path.

@@ -26,3 +30,3 @@ This allows for much cleaner code, e.g:

RediBox.hooks.job.create('queue', {
runs: 'sails.hooks.api.request',
runs: 'tasks.request',
});

@@ -33,9 +37,10 @@ ```

// request.js
export default function() {
console.log(this.data);
global.tasks = {
request() {
console.log(this.data);
}
}
```
It's also worth noting that with inline functions, the job is bound as the first argument to the function, whilst with
a global function it's bound to it's scope, whereby the job can be accessed with `this`.
It's also worth noting by default the task function is bound to the job instance, the first argument also becomes the job instance. To disable the `bind` you can set the `noBind` option on an individial job (on it's options) or on the queue options to turn it off entirely.

@@ -52,3 +57,3 @@ ### Error handling

export default function() {
return Person.find();
return Person.update(1234, { hasKittens: true });
}

@@ -92,4 +97,4 @@ ```

runs: [
'global.generic.findPerson',
'global.person.updatePerson',
'generic.findPerson',
'person.updatePerson',
],

@@ -194,5 +199,8 @@ data: {

}
// in reality you'd probably want to Promise.map these with a concurrency limit
// but you can just Job.create() without calling the promise - the job hook will queue these for creating at
// the start of the next event loop - with concurrency batching.
return Promise.all(promises);
}
```

102

docs/best-practices.md

@@ -6,19 +6,20 @@ ## Best Practices

With a clustered server environment with high queue concurrency, the speed in which the overall "task" will complete
will be much quicker if task is broken down into many smaller jobs, rather than one large job. Memory/CPU usage will be kept lower
will be much quicker if the task is broken down into many smaller jobs, rather than one large job. Memory/CPU usage will be kept lower
and error trapping will be much more specific to a single job for easier debugging.
**Example**: We've got a very large set of data which needs to be processed. The data needs to be looped over,
manipulated, internal database calls need to be made using the data and finally data needs to be saved.
**Example**: We've got a very large set of data which a user has uploaded which needs to be processed. The data needs to be iterrated over,
manipulated, internal database calls need to be made and finally the data needs to be saved.
A single job could handle this very easily. However we'd need to make use of Node.JS's async compatibility and
the code would become very messy - lots of nested loops, variables etc.
We could handle this very easily in a express request to our api. However this could take a very long time and potentially delay other user requests coming into our api. Consider the below example:
```javascript
// Massive job which finds and updates users
// your api
import each from 'async/each';
export default function() {
const data = require('../my-massive-dataset.json');
// some request controller
export default function(req, res) {
// wherever the users file has been uploaded to
const arrayData = require('../users-massive-dataset.json');
return each(data, function(item, done) {
each(arrayData, function(item, done) {
return User

@@ -32,6 +33,6 @@ .find({ name: item.name })

if (error) {
return Promise.reject(error);
return res.status(500).send(error);
}
return Promise.resolve();
return res.json({ msg: 'Sorry i took a long time, but all done!' });
});

@@ -42,30 +43,64 @@ }

There's two problems here:
There's several problems here:
1. The job would consume lots of memory/cpu on the server performing async requests, storing variables in memory etc.
2. The server running the job is potentially out of action until the job has completed (which might take quite a while).
3. If our job has to update thousands of database records, it's very hard to internally throttle this due to the async nature of Node.
1. The request could consume lots of memory/cpu on the server performing the request.
2. The server running the request is potentially out of action until the processing has completed (which might take several seconds).
3. If our user wants to update thousands of database records, it's very hard to internally throttle this due to the async nature of Node.
Breaking this job down into multiple jobs would be a much better solution:
Instead, let's send this request to our internal node.js worker farm and break it down into multiple jobs as this would be a much better solution:
#### Your API
Your API where the redibox job `enabled` option is set to `false` - which means we're in provider only mode and will not consume jobs on the API. Queues do not need to be specified on your config in this case - only consumers of jobs need the queues specified.
```javascript
// Smaller jobs to update users
export default function() {
const data = require('../my-massive-dataset.json');
for (let i = 0, len = data.length; i < len; i++) {
const item = data[i];
Job.create('my-queue', {
runs: 'updateUser',
// some request controller
export default function(req, res) {
// ...
// lets move the upload into redis - assumes 'uploadData' is the upload.
RediBox.client.set('users:upload:id', uploadData).then(() => {
Job.create('user-uploads', {
runs: 'getDataAndProcessIt',
data: {
name: item.name,
settings: item.settings,
uploadKey: 'users:upload:id',
}
});
}
return res.json({ msg: 'Upload complete - we will notify you when your upload has been processed.'});
});
}
```
#### A server in your worker farm
Your server in your internal worker farm where the redibox job `enabled` option is set to `true`, meaning these servers will be able to consume and also provide new jobs. You'll need to add the config for your queues on these servers, consumers need to know what queues to consume jobs from.
```javascript
// get the upload data and break it into smaller update jobs for load distribution
export function getDataAndProcessIt() {
// 'this' is the current job
// 'this.data' is the current jobs data.
const { dataKey } = this.data;
return Promise.resolve();
return RediBox.client.get(dataKey).then((uploadData) => {
if (!uploadData) return Promise.reject(`Upload not found for key '${dataKey}'`);
// we could just do all the updates in this one job but we have a farm
// so lets distribute the load and spread the updates across all our servers
// by creating individual jobs for each update
for (let i = 0, len = uploadData.length; i < len; i++) {
const item = uploadData[i];
Job.create('user-upload-items', {
runs: 'updateUser',
data: {
name: item.name,
settings: item.settings,
}
});
}
});
}
// your global updateUser job function
// this handles a single item in the users upload
export function updateUser() {

@@ -83,2 +118,7 @@ return User

// TODO
// notify the user that this part of their upload has been processed
// for example they're importing users into their org, show the user as imported
// ...
return Promise.resolve();

@@ -91,3 +131,3 @@ });

1. The first job is fully synchronous and very performant. This will consume little memory and usage.
1. The first job is short, sweet and very performant. This will consume little memory and cpu usage while enabling us to distribute the load for effecient processing.
2. The second job is user specific; we're querying an individual user per job. This can be throttled by using a different

@@ -99,2 +139,4 @@ queue. If a user query fails we can also trap the errors for the specific user.

As you can see this now become distributed and the load is spread across all your workers, each handling jobs of their own concurrently, resulting in faster processing overall.
### Queues

@@ -101,0 +143,0 @@

@@ -67,3 +67,3 @@ ## Queues

There are no limits to how many queues can be created, however from a technical point of view, each queue creates its own
internal Redis connection to perform blocking requests. Therefore bare in mind more queues equals more connections which
internal Redis connection to perform blocking requests. Therefore keep in mind more queues equals more connections which
might need some consideration depending on your Redis environment setup.

@@ -14,4 +14,7 @@ 'use strict';

startupDelay: 750,
stallInterval: 5000
stallInterval: 15000,
autoSave: {
maxJobs: 1000
}
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWZhdWx0cy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBOzs7a0JBR2U7QUFDYixVQUFRLEVBREs7QUFFYixXQUFTLElBRkk7QUFHYixhQUFXLEtBSEU7QUFJYixnQkFBYyxHQUpEO0FBS2IsaUJBQWU7QUFMRixDIiwiZmlsZSI6ImRlZmF1bHRzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiBEZWZhdWx0IENvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGRlZmF1bHQge1xuICBxdWV1ZXM6IFtdLFxuICBlbmFibGVkOiB0cnVlLFxuICBrZXlQcmVmaXg6ICdqb2InLFxuICBzdGFydHVwRGVsYXk6IDc1MCxcbiAgc3RhbGxJbnRlcnZhbDogNTAwMCxcbn07XG5cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWZhdWx0cy5qcyJdLCJuYW1lcyI6WyJxdWV1ZXMiLCJlbmFibGVkIiwia2V5UHJlZml4Iiwic3RhcnR1cERlbGF5Iiwic3RhbGxJbnRlcnZhbCIsImF1dG9TYXZlIiwibWF4Sm9icyJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7O2tCQUdlO0FBQ2JBLFVBQVEsRUFESztBQUViQyxXQUFTLElBRkk7QUFHYkMsYUFBVyxLQUhFO0FBSWJDLGdCQUFjLEdBSkQ7QUFLYkMsaUJBQWUsS0FMRjtBQU1iQyxZQUFVO0FBQ1JDLGFBQVM7QUFERDtBQU5HLEMiLCJmaWxlIjoiZGVmYXVsdHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuIERlZmF1bHQgQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZGVmYXVsdCB7XG4gIHF1ZXVlczogW10sXG4gIGVuYWJsZWQ6IHRydWUsXG4gIGtleVByZWZpeDogJ2pvYicsXG4gIHN0YXJ0dXBEZWxheTogNzUwLFxuICBzdGFsbEludGVydmFsOiAxNTAwMCxcbiAgYXV0b1NhdmU6IHtcbiAgICBtYXhKb2JzOiAxMDAwLFxuICB9LFxufTtcblxuIl19

@@ -9,2 +9,8 @@ 'use strict';

var _redibox = require('redibox');
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _cuid = require('cuid');

@@ -22,6 +28,2 @@

var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _defaults = require('./defaults');

@@ -35,4 +37,2 @@

var _redibox = require('redibox');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

@@ -91,2 +91,6 @@

/**
* PUBLIC API
*/
/**
* Creates a new job for the specified queue

@@ -105,5 +109,5 @@ * @param queue

if (!this.autoSaveImmediate) {
this.autoSaveImmediate = setImmediate(this.autoSave.bind(this));
} else if (!Object.keys(this.autoCreateQueue).length > 200) {
this.autoSave();
this.autoSaveImmediate = setImmediate(this._autoSave.bind(this));
} else if (!Object.keys(this.autoCreateQueue).length >= this.options.autoSave.maxJobs) {
this._autoSave();
}

@@ -115,5 +119,19 @@

/**
*
* @param queue
* @param jobId
* @returns {Promise.<TResult>}
*/
getJobById(queue, jobId) {
return this.client.hget(this._toQueueKey(queue, 'jobs'), jobId).then(data => _job2.default.fromData(queue, jobId, data));
}
/**
* PRIVATE API
*/
/**
* Auto save any jobs in the queue
*/
autoSave() {
_autoSave() {
clearImmediate(this.autoSaveImmediate);

@@ -136,3 +154,3 @@ this.autoSaveImmediate = null;

if (!jobsToSave.length) return void 0;
if (!jobsToSave.length) return undefined;

@@ -142,7 +160,7 @@ this.log.verbose(`Auto-saving ${ jobsToSave.length } jobs.`);

if (jobsToSave.length === 1) {
return this.autoCreateQueue[jobsToSave[0]].withoutProxy().save(true).then(() => this.cleanupAutoSave.call(this, jobsToSave)).catch(err => this.cleanupAutoSave.call(this, jobsToSave, err));
return this.autoCreateQueue[jobsToSave[0]].withoutProxy().save(true).then(() => this._cleanupAutoSave.call(this, jobsToSave)).catch(err => this._cleanupAutoSave.call(this, jobsToSave, err));
}
/* eslint no-confusing-arrow: 0 */
return _bluebird2.default.map(jobsToSave, ref => this.autoCreateQueue && this.autoCreateQueue[ref] ? this.autoCreateQueue[ref].withoutProxy().save(true) : _bluebird2.default.resolve(), { concurrency: 25 }).then(() => this.cleanupAutoSave.call(this, jobsToSave)).catch(err => this.cleanupAutoSave.call(this, jobsToSave, err));
return _bluebird2.default.map(jobsToSave, ref => this.autoCreateQueue && this.autoCreateQueue[ref] ? this.autoCreateQueue[ref].withoutProxy().save(true) : _bluebird2.default.resolve()).then(() => this._cleanupAutoSave.call(this, jobsToSave)).catch(err => this._cleanupAutoSave.call(this, jobsToSave, err));
}

@@ -155,3 +173,3 @@

*/
cleanupAutoSave(jobsToRemove, possibleError) {
_cleanupAutoSave(jobsToRemove, possibleError) {
if (possibleError) this.log.error(possibleError);

@@ -173,3 +191,3 @@ this.log.verbose(`Removing ${ jobsToRemove.length } saved jobs from the auto-save queue.`);

return void 0;
return undefined;
}

@@ -196,2 +214,16 @@

/**
* Generates a queue prefixed key based on the provided string.
* @param queue
* @param str
* @returns {string}
* @private
*/
_toQueueKey(queue, str) {
if (this.core.cluster.isCluster()) {
return `${ this.options.keyPrefix }:{${ queue }}:${ str }`;
}
return `${ this.options.keyPrefix }:${ queue }:${ str }`;
}
/**
* To enable bypassing of cache for wrap functions

@@ -206,2 +238,2 @@ * Toggles by default or pass in true/false

exports.default = JobHook;
//# sourceMappingURL=data:application/json;base64,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QVEsQ0FBQyxLQUFLLE9BQUwsQ0FBYSxPQUE3QztBQUNEO0FBeEsyQztrQkFBekIsTyIsImZpbGUiOiJob29rLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGN1aWQgZnJvbSAnY3VpZCc7XG5pbXBvcnQgSm9iIGZyb20gJy4vam9iJztcbmltcG9ydCBRdWV1ZSBmcm9tICcuL3F1ZXVlJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRzJztcbmltcG9ydCBzY3JpcHRzIGZyb20gJy4vc2NyaXB0cyc7XG5pbXBvcnQgeyBCYXNlSG9vayB9IGZyb20gJ3JlZGlib3gnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb2JIb29rIGV4dGVuZHMgQmFzZUhvb2sge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignam9iJyk7XG4gICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICB0aGlzLmF1dG9DcmVhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5hdXRvU2F2ZUltbWVkaWF0ZSA9IG51bGw7XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzLEpTTWV0aG9kQ2FuQmVTdGF0aWNcbiAgLyoqXG4gICAqIERlZmF1bHQgY29uZmlnIGZvciBzY2hlZHVsZXJcbiAgICogQHJldHVybnMge3tzb21lRGVmYXVsdFRoaW5nOiBzdHJpbmd9fVxuICAgKi9cbiAgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHt7YWRkSm9iLCBjaGVja1N0YWxsZWRKb2JzLCByZW1vdmVKb2J9fVxuICAgKi9cbiAgc2NyaXB0cygpIHtcbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5xdWV1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5vcHRpb25zLnF1ZXVlc1tpXTtcbiAgICAgIHRoaXMucXVldWVDcmVhdGUocXVldWUpO1xuICAgIH1cblxuICAgIHRoaXMub24oJ2NvcmU6cmVhZHknLCAoKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5xdWV1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMub3B0aW9ucy5xdWV1ZXNbaV07XG4gICAgICAgICAgdGhpcy5xdWV1ZXNbcXVldWUubmFtZV0uYmVnaW5Xb3JraW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMub3B0aW9ucy5zdGFydHVwRGVsYXkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgam9iIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7KnxKb2J9XG4gICAqL1xuICBjcmVhdGUoLi4uYXJncykge1xuICAgIGNvbnN0IHJlZiA9IGN1aWQoKTtcbiAgICBpZiAoIXRoaXMuYXV0b0NyZWF0ZVF1ZXVlKSB0aGlzLmF1dG9DcmVhdGVRdWV1ZSA9IHt9O1xuICAgIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW3JlZl0gPSBuZXcgSm9iKHRoaXMuY29yZSwgbnVsbCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1swXSwgdHJ1ZSk7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgQ3JlYXRpbmcgam9iIGZvciBxdWV1ZSAke2FyZ3NbMF19IHdpdGggcmVmICR7cmVmfWApO1xuXG4gICAgaWYgKCF0aGlzLmF1dG9TYXZlSW1tZWRpYXRlKSB7XG4gICAgICB0aGlzLmF1dG9TYXZlSW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlKHRoaXMuYXV0b1NhdmUuYmluZCh0aGlzKSk7XG4gICAgfSBlbHNlIGlmICghT2JqZWN0LmtleXModGhpcy5hdXRvQ3JlYXRlUXVldWUpLmxlbmd0aCA+IDIwMCkge1xuICAgICAgdGhpcy5hdXRvU2F2ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmF1dG9DcmVhdGVRdWV1ZVtyZWZdO1xuICB9XG5cbiAgLyoqXG4gICAqIEF1dG8gc2F2ZSBhbnkgam9icyBpbiB0aGUgcXVldWVcbiAgICovXG4gIGF1dG9TYXZlKCkge1xuICAgIGNsZWFySW1tZWRpYXRlKHRoaXMuYXV0b1NhdmVJbW1lZGlhdGUpO1xuICAgIHRoaXMuYXV0b1NhdmVJbW1lZGlhdGUgPSBudWxsO1xuXG4gICAgY29uc3Qgam9ic1RvU2F2ZSA9IFtdO1xuICAgIGNvbnN0IHJlZnMgPSBPYmplY3Qua2V5cyh0aGlzLmF1dG9DcmVhdGVRdWV1ZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgaUxlbiA9IHJlZnMubGVuZ3RoOyBpIDwgaUxlbjsgaSsrKSB7XG4gICAgICBjb25zdCByZWYgPSByZWZzW2ldO1xuICAgICAgaWYgKCF0aGlzLmF1dG9DcmVhdGVRdWV1ZVtyZWZdLl9zYXZlZCkge1xuICAgICAgICBqb2JzVG9TYXZlLnB1c2gocmVmKTtcbiAgICAgICAgdGhpcy5hdXRvQ3JlYXRlUXVldWVbcmVmXS5fc2F2ZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hdXRvQ3JlYXRlUXVldWVbcmVmXSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmF1dG9DcmVhdGVRdWV1ZVtyZWZdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgham9ic1RvU2F2ZS5sZW5ndGgpIHJldHVybiB2b2lkIDA7XG5cbiAgICB0aGlzLmxvZy52ZXJib3NlKGBBdXRvLXNhdmluZyAke2pvYnNUb1NhdmUubGVuZ3RofSBqb2JzLmApO1xuXG4gICAgaWYgKGpvYnNUb1NhdmUubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gdGhpcy5hdXRvQ3JlYXRlUXVldWVbam9ic1RvU2F2ZVswXV1cbiAgICAgIC53aXRob3V0UHJveHkoKVxuICAgICAgLnNhdmUodHJ1ZSlcbiAgICAgIC50aGVuKCgpID0+IHRoaXMuY2xlYW51cEF1dG9TYXZlLmNhbGwodGhpcywgam9ic1RvU2F2ZSkpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuY2xlYW51cEF1dG9TYXZlLmNhbGwodGhpcywgam9ic1RvU2F2ZSwgZXJyKSk7XG4gICAgfVxuXG4gICAgLyogZXNsaW50IG5vLWNvbmZ1c2luZy1hcnJvdzogMCAqL1xuICAgIHJldHVybiBQcm9taXNlXG4gICAgLm1hcChcbiAgICAgIGpvYnNUb1NhdmUsXG4gICAgICByZWYgPT4gdGhpcy5hdXRvQ3JlYXRlUXVldWUgJiYgdGhpcy5hdXRvQ3JlYXRlUXVldWVbcmVmXSA/XG4gICAgICAgIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW3JlZl0ud2l0aG91dFByb3h5KCkuc2F2ZSh0cnVlKSA6XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLFxuICAgICAgeyBjb25jdXJyZW5jeTogMjUgfVxuICAgIClcbiAgICAudGhlbigoKSA9PiB0aGlzLmNsZWFudXBBdXRvU2F2ZS5jYWxsKHRoaXMsIGpvYnNUb1NhdmUpKVxuICAgIC5jYXRjaChlcnIgPT4gdGhpcy5jbGVhbnVwQXV0b1NhdmUuY2FsbCh0aGlzLCBqb2JzVG9TYXZlLCBlcnIpKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gam9ic1RvUmVtb3ZlXG4gICAqIEBwYXJhbSBwb3NzaWJsZUVycm9yXG4gICAqL1xuICBjbGVhbnVwQXV0b1NhdmUoam9ic1RvUmVtb3ZlLCBwb3NzaWJsZUVycm9yKSB7XG4gICAgaWYgKHBvc3NpYmxlRXJyb3IpIHRoaXMubG9nLmVycm9yKHBvc3NpYmxlRXJyb3IpO1xuICAgIHRoaXMubG9nLnZlcmJvc2UoYFJlbW92aW5nICR7am9ic1RvUmVtb3ZlLmxlbmd0aH0gc2F2ZWQgam9icyBmcm9tIHRoZSBhdXRvLXNhdmUgcXVldWUuYCk7XG4gICAgaWYgKHRoaXMuYXV0b0NyZWF0ZVF1ZXVlKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaUxlbiA9IGpvYnNUb1JlbW92ZS5sZW5ndGg7IGkgPCBpTGVuOyBpKyspIHtcbiAgICAgICAgLy8gdHJ5aW5nIHRvIGZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBoZXJlXG4gICAgICAgIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW2pvYnNUb1JlbW92ZVtpXV0gPSBudWxsO1xuICAgICAgICBkZWxldGUgdGhpcy5hdXRvQ3JlYXRlUXVldWVbam9ic1RvUmVtb3ZlW2ldXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmF1dG9DcmVhdGVRdWV1ZSkubGVuZ3RoKSB7XG4gICAgICAgIC8vIHRyeWluZyB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24gaGVyZVxuICAgICAgICB0aGlzLmF1dG9DcmVhdGVRdWV1ZSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmF1dG9DcmVhdGVRdWV1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKi9cbiAgcXVldWVDcmVhdGUocXVldWUpIHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKGBRdWV1ZSAnJHtxdWV1ZS5uYW1lfScgY3JlYXRlZCFgKTtcbiAgICB0aGlzLnF1ZXVlc1txdWV1ZS5uYW1lXSA9IG5ldyBRdWV1ZSh7IC4uLnRoaXMub3B0aW9ucywgLi4ucXVldWUgfSwgdGhpcy5jb3JlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgdXNlcnMga2V5IHRvIHRoZSBmdWxsIHJlZGlzIGtleSB3aXRoIG1vZHVsZSBwcmVmaXguXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRvS2V5KGtleSA9ICcnKSB7XG4gICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucy5rZXlQcmVmaXh9OiR7a2V5fWA7XG4gIH1cblxuICAvKipcbiAgICogVG8gZW5hYmxlIGJ5cGFzc2luZyBvZiBjYWNoZSBmb3Igd3JhcCBmdW5jdGlvbnNcbiAgICogVG9nZ2xlcyBieSBkZWZhdWx0IG9yIHBhc3MgaW4gdHJ1ZS9mYWxzZVxuICAgKiBAcGFyYW0gYm9vbFxuICAgKi9cbiAgZW5hYmxlZChib29sKSB7XG4gICAgdGhpcy5vcHRpb25zLmVuYWJsZWQgPSBib29sIHx8ICF0aGlzLm9wdGlvbnMuZW5hYmxlZDtcbiAgfVxufVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9ob29rLmpzIl0sIm5hbWVzIjpbIkpvYkhvb2siLCJjb25zdHJ1Y3RvciIsInF1ZXVlcyIsImF1dG9DcmVhdGVRdWV1ZSIsImF1dG9TYXZlSW1tZWRpYXRlIiwiZGVmYXVsdHMiLCJzY3JpcHRzIiwiaW5pdGlhbGl6ZSIsIm9wdGlvbnMiLCJlbmFibGVkIiwicmVzb2x2ZSIsImkiLCJsZW4iLCJsZW5ndGgiLCJxdWV1ZSIsInF1ZXVlQ3JlYXRlIiwib24iLCJzZXRUaW1lb3V0IiwibmFtZSIsImJlZ2luV29ya2luZyIsInN0YXJ0dXBEZWxheSIsImNyZWF0ZSIsImFyZ3MiLCJyZWYiLCJjb3JlIiwibG9nIiwidmVyYm9zZSIsInNldEltbWVkaWF0ZSIsIl9hdXRvU2F2ZSIsImJpbmQiLCJPYmplY3QiLCJrZXlzIiwiYXV0b1NhdmUiLCJtYXhKb2JzIiwiZ2V0Sm9iQnlJZCIsImpvYklkIiwiY2xpZW50IiwiaGdldCIsIl90b1F1ZXVlS2V5IiwidGhlbiIsImRhdGEiLCJmcm9tRGF0YSIsImNsZWFySW1tZWRpYXRlIiwiam9ic1RvU2F2ZSIsInJlZnMiLCJpTGVuIiwiX3NhdmVkIiwicHVzaCIsInVuZGVmaW5lZCIsIndpdGhvdXRQcm94eSIsInNhdmUiLCJfY2xlYW51cEF1dG9TYXZlIiwiY2FsbCIsImNhdGNoIiwiZXJyIiwibWFwIiwiam9ic1RvUmVtb3ZlIiwicG9zc2libGVFcnJvciIsImVycm9yIiwidG9LZXkiLCJrZXkiLCJrZXlQcmVmaXgiLCJzdHIiLCJjbHVzdGVyIiwiaXNDbHVzdGVyIiwiYm9vbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVlLE1BQU1BLE9BQU4sMkJBQStCO0FBQzVDQyxnQkFBYztBQUNaLFVBQU0sS0FBTjtBQUNBLFNBQUtDLE1BQUwsR0FBYyxFQUFkO0FBQ0EsU0FBS0MsZUFBTCxHQUF1QixJQUF2QjtBQUNB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SUFBSyxhQUF0QztBQUNBLFNBQUtoQixNQUFMLENBQVlZLE1BQU1JLElBQWxCLElBQTBCLGlDQUFlLEtBQUtWLE9BQXBCLEVBQWdDTSxLQUFoQyxHQUF5QyxLQUFLVSxJQUE5QyxDQUExQjtBQUNEOztBQUVEOzs7OztBQUtBbUMsUUFBTUMsTUFBTSxFQUFaLEVBQWdCO0FBQ2QsV0FBUSxJQUFFLEtBQUtwRCxPQUFMLENBQWFxRCxTQUFVLE1BQUdELEdBQUksR0FBeEM7QUFDRDs7QUFFRDs7Ozs7OztBQU9BdEIsY0FBWXhCLEtBQVosRUFBbUJnRCxHQUFuQixFQUF3QjtBQUN0QixRQUFJLEtBQUt0QyxJQUFMLENBQVV1QyxPQUFWLENBQWtCQyxTQUFsQixFQUFKLEVBQW1DO0FBQ2pDLGFBQVEsSUFBRSxLQUFLeEQsT0FBTCxDQUFhcUQsU0FBVSxPQUFJL0MsS0FBTSxPQUFJZ0QsR0FBSSxHQUFuRDtBQUNEO0FBQ0QsV0FBUSxJQUFFLEtBQUt0RCxPQUFMLENBQWFxRCxTQUFVLE1BQUcvQyxLQUFNLE1BQUdnRCxHQUFJLEdBQWpEO0FBQ0Q7O0FBRUQ7Ozs7O0FBS0FyRCxVQUFRd0QsSUFBUixFQUFjO0FBQ1osU0FBS3pELE9BQUwsQ0FBYUMsT0FBYixHQUF1QndELFFBQVEsQ0FBQyxLQUFLekQsT0FBTCxDQUFhQyxPQUE3QztBQUNEO0FBek0yQztrQkFBekJULE8iLCJmaWxlIjoiaG9vay5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VIb29rIH0gZnJvbSAncmVkaWJveCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5cbmltcG9ydCBjdWlkIGZyb20gJ2N1aWQnO1xuaW1wb3J0IEpvYiBmcm9tICcuL2pvYic7XG5pbXBvcnQgUXVldWUgZnJvbSAnLi9xdWV1ZSc7XG5pbXBvcnQgZGVmYXVsdHMgZnJvbSAnLi9kZWZhdWx0cyc7XG5pbXBvcnQgc2NyaXB0cyBmcm9tICcuL3NjcmlwdHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBKb2JIb29rIGV4dGVuZHMgQmFzZUhvb2sge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcignam9iJyk7XG4gICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICB0aGlzLmF1dG9DcmVhdGVRdWV1ZSA9IG51bGw7XG4gICAgdGhpcy5hdXRvU2F2ZUltbWVkaWF0ZSA9IG51bGw7XG4gIH1cblxuICAvLyBub2luc3BlY3Rpb24gSlNVbnVzZWRHbG9iYWxTeW1ib2xzLEpTTWV0aG9kQ2FuQmVTdGF0aWNcbiAgLyoqXG4gICAqIERlZmF1bHQgY29uZmlnIGZvciBzY2hlZHVsZXJcbiAgICogQHJldHVybnMge3tzb21lRGVmYXVsdFRoaW5nOiBzdHJpbmd9fVxuICAgKi9cbiAgZGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHt7YWRkSm9iLCBjaGVja1N0YWxsZWRKb2JzLCByZW1vdmVKb2J9fVxuICAgKi9cbiAgc2NyaXB0cygpIHtcbiAgICByZXR1cm4gc2NyaXB0cztcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgaW5pdGlhbGl6ZSgpIHtcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5xdWV1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHF1ZXVlID0gdGhpcy5vcHRpb25zLnF1ZXVlc1tpXTtcbiAgICAgIHRoaXMucXVldWVDcmVhdGUocXVldWUpO1xuICAgIH1cblxuICAgIHRoaXMub24oJ2NvcmU6cmVhZHknLCAoKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMub3B0aW9ucy5xdWV1ZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBxdWV1ZSA9IHRoaXMub3B0aW9ucy5xdWV1ZXNbaV07XG4gICAgICAgICAgdGhpcy5xdWV1ZXNbcXVldWUubmFtZV0uYmVnaW5Xb3JraW5nKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIHRoaXMub3B0aW9ucy5zdGFydHVwRGVsYXkpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBVQkxJQyBBUElcbiAgICovXG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgam9iIGZvciB0aGUgc3BlY2lmaWVkIHF1ZXVlXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcmV0dXJucyB7KnxKb2J9XG4gICAqL1xuICBjcmVhdGUoLi4uYXJncykge1xuICAgIGNvbnN0IHJlZiA9IGN1aWQoKTtcbiAgICBpZiAoIXRoaXMuYXV0b0NyZWF0ZVF1ZXVlKSB0aGlzLmF1dG9DcmVhdGVRdWV1ZSA9IHt9O1xuICAgIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW3JlZl0gPSBuZXcgSm9iKHRoaXMuY29yZSwgbnVsbCwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1swXSwgdHJ1ZSk7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgQ3JlYXRpbmcgam9iIGZvciBxdWV1ZSAke2FyZ3NbMF19IHdpdGggcmVmICR7cmVmfWApO1xuXG4gICAgaWYgKCF0aGlzLmF1dG9TYXZlSW1tZWRpYXRlKSB7XG4gICAgICB0aGlzLmF1dG9TYXZlSW1tZWRpYXRlID0gc2V0SW1tZWRpYXRlKHRoaXMuX2F1dG9TYXZlLmJpbmQodGhpcykpO1xuICAgIH0gZWxzZSBpZiAoIU9iamVjdC5rZXlzKHRoaXMuYXV0b0NyZWF0ZVF1ZXVlKS5sZW5ndGggPj0gdGhpcy5vcHRpb25zLmF1dG9TYXZlLm1heEpvYnMpIHtcbiAgICAgIHRoaXMuX2F1dG9TYXZlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW3JlZl07XG4gIH1cblxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gcXVldWVcbiAgICogQHBhcmFtIGpvYklkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlLjxUUmVzdWx0Pn1cbiAgICovXG4gIGdldEpvYkJ5SWQocXVldWUsIGpvYklkKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmhnZXQodGhpcy5fdG9RdWV1ZUtleShxdWV1ZSwgJ2pvYnMnKSwgam9iSWQpLnRoZW4oZGF0YSA9PlxuICAgICAgSm9iLmZyb21EYXRhKHF1ZXVlLCBqb2JJZCwgZGF0YSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFBSSVZBVEUgQVBJXG4gICAqL1xuXG4gIC8qKlxuICAgKiBBdXRvIHNhdmUgYW55IGpvYnMgaW4gdGhlIHF1ZXVlXG4gICAqL1xuICBfYXV0b1NhdmUoKSB7XG4gICAgY2xlYXJJbW1lZGlhdGUodGhpcy5hdXRvU2F2ZUltbWVkaWF0ZSk7XG4gICAgdGhpcy5hdXRvU2F2ZUltbWVkaWF0ZSA9IG51bGw7XG5cbiAgICBjb25zdCBqb2JzVG9TYXZlID0gW107XG4gICAgY29uc3QgcmVmcyA9IE9iamVjdC5rZXlzKHRoaXMuYXV0b0NyZWF0ZVF1ZXVlKTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBpTGVuID0gcmVmcy5sZW5ndGg7IGkgPCBpTGVuOyBpKyspIHtcbiAgICAgIGNvbnN0IHJlZiA9IHJlZnNbaV07XG4gICAgICBpZiAoIXRoaXMuYXV0b0NyZWF0ZVF1ZXVlW3JlZl0uX3NhdmVkKSB7XG4gICAgICAgIGpvYnNUb1NhdmUucHVzaChyZWYpO1xuICAgICAgICB0aGlzLmF1dG9DcmVhdGVRdWV1ZVtyZWZdLl9zYXZlZCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF1dG9DcmVhdGVRdWV1ZVtyZWZdID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW3JlZl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFqb2JzVG9TYXZlLmxlbmd0aCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIHRoaXMubG9nLnZlcmJvc2UoYEF1dG8tc2F2aW5nICR7am9ic1RvU2F2ZS5sZW5ndGh9IGpvYnMuYCk7XG5cbiAgICBpZiAoam9ic1RvU2F2ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLmF1dG9DcmVhdGVRdWV1ZVtqb2JzVG9TYXZlWzBdXVxuICAgICAgICAud2l0aG91dFByb3h5KClcbiAgICAgICAgLnNhdmUodHJ1ZSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fY2xlYW51cEF1dG9TYXZlLmNhbGwodGhpcywgam9ic1RvU2F2ZSkpXG4gICAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5fY2xlYW51cEF1dG9TYXZlLmNhbGwodGhpcywgam9ic1RvU2F2ZSwgZXJyKSk7XG4gICAgfVxuXG4gICAgLyogZXNsaW50IG5vLWNvbmZ1c2luZy1hcnJvdzogMCAqL1xuICAgIHJldHVybiBQcm9taXNlLm1hcChcbiAgICAgIGpvYnNUb1NhdmUsXG4gICAgICByZWYgPT4gdGhpcy5hdXRvQ3JlYXRlUXVldWUgJiYgdGhpcy5hdXRvQ3JlYXRlUXVldWVbcmVmXSA/XG4gICAgICAgIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW3JlZl0ud2l0aG91dFByb3h5KCkuc2F2ZSh0cnVlKSA6XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgKVxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5fY2xlYW51cEF1dG9TYXZlLmNhbGwodGhpcywgam9ic1RvU2F2ZSkpXG4gICAgICAuY2F0Y2goZXJyID0+IHRoaXMuX2NsZWFudXBBdXRvU2F2ZS5jYWxsKHRoaXMsIGpvYnNUb1NhdmUsIGVycikpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBqb2JzVG9SZW1vdmVcbiAgICogQHBhcmFtIHBvc3NpYmxlRXJyb3JcbiAgICovXG4gIF9jbGVhbnVwQXV0b1NhdmUoam9ic1RvUmVtb3ZlLCBwb3NzaWJsZUVycm9yKSB7XG4gICAgaWYgKHBvc3NpYmxlRXJyb3IpIHRoaXMubG9nLmVycm9yKHBvc3NpYmxlRXJyb3IpO1xuICAgIHRoaXMubG9nLnZlcmJvc2UoYFJlbW92aW5nICR7am9ic1RvUmVtb3ZlLmxlbmd0aH0gc2F2ZWQgam9icyBmcm9tIHRoZSBhdXRvLXNhdmUgcXVldWUuYCk7XG4gICAgaWYgKHRoaXMuYXV0b0NyZWF0ZVF1ZXVlKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgaUxlbiA9IGpvYnNUb1JlbW92ZS5sZW5ndGg7IGkgPCBpTGVuOyBpKyspIHtcbiAgICAgICAgLy8gdHJ5aW5nIHRvIGZvcmNlIGdhcmJhZ2UgY29sbGVjdGlvbiBoZXJlXG4gICAgICAgIHRoaXMuYXV0b0NyZWF0ZVF1ZXVlW2pvYnNUb1JlbW92ZVtpXV0gPSBudWxsO1xuICAgICAgICBkZWxldGUgdGhpcy5hdXRvQ3JlYXRlUXVldWVbam9ic1RvUmVtb3ZlW2ldXTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFPYmplY3Qua2V5cyh0aGlzLmF1dG9DcmVhdGVRdWV1ZSkubGVuZ3RoKSB7XG4gICAgICAgIC8vIHRyeWluZyB0byBmb3JjZSBnYXJiYWdlIGNvbGxlY3Rpb24gaGVyZVxuICAgICAgICB0aGlzLmF1dG9DcmVhdGVRdWV1ZSA9IG51bGw7XG4gICAgICAgIGRlbGV0ZSB0aGlzLmF1dG9DcmVhdGVRdWV1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKi9cbiAgcXVldWVDcmVhdGUocXVldWUpIHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKGBRdWV1ZSAnJHtxdWV1ZS5uYW1lfScgY3JlYXRlZCFgKTtcbiAgICB0aGlzLnF1ZXVlc1txdWV1ZS5uYW1lXSA9IG5ldyBRdWV1ZSh7IC4uLnRoaXMub3B0aW9ucywgLi4ucXVldWUgfSwgdGhpcy5jb3JlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgdXNlcnMga2V5IHRvIHRoZSBmdWxsIHJlZGlzIGtleSB3aXRoIG1vZHVsZSBwcmVmaXguXG4gICAqIEBwYXJhbSBrZXlcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRvS2V5KGtleSA9ICcnKSB7XG4gICAgcmV0dXJuIGAke3RoaXMub3B0aW9ucy5rZXlQcmVmaXh9OiR7a2V5fWA7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcXVldWUgcHJlZml4ZWQga2V5IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzdHJpbmcuXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKiBAcGFyYW0gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdG9RdWV1ZUtleShxdWV1ZSwgc3RyKSB7XG4gICAgaWYgKHRoaXMuY29yZS5jbHVzdGVyLmlzQ2x1c3RlcigpKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLmtleVByZWZpeH06eyR7cXVldWV9fToke3N0cn1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLmtleVByZWZpeH06JHtxdWV1ZX06JHtzdHJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBlbmFibGUgYnlwYXNzaW5nIG9mIGNhY2hlIGZvciB3cmFwIGZ1bmN0aW9uc1xuICAgKiBUb2dnbGVzIGJ5IGRlZmF1bHQgb3IgcGFzcyBpbiB0cnVlL2ZhbHNlXG4gICAqIEBwYXJhbSBib29sXG4gICAqL1xuICBlbmFibGVkKGJvb2wpIHtcbiAgICB0aGlzLm9wdGlvbnMuZW5hYmxlZCA9IGJvb2wgfHwgIXRoaXMub3B0aW9ucy5lbmFibGVkO1xuICB9XG59XG4iXX0=

@@ -14,2 +14,2 @@ 'use strict';

exports.default = _hook2.default;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIb29rIGZyb20gJy4vaG9vayc7XG5leHBvcnQgZGVmYXVsdCBIb29rO1xuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIb29rIGZyb20gJy4vaG9vayc7XG5cbmV4cG9ydCBkZWZhdWx0IEhvb2s7XG4iXX0=

@@ -36,4 +36,3 @@ 'use strict';

unique: false,
timeout: 60000 }, // 1 minute default timeout
queueName, isNew) {
timeout: 60000 }, queueName, isNew) {
this.id = id;

@@ -100,6 +99,4 @@ this.core = core;

* @static
* @param queue
* @param id
* @param data
* @returns {Job | null}
* @param args
*/

@@ -151,2 +148,3 @@ static fromData(...args) {

// TODO allow hooking into this event rather than us doing this poop here
if (process.env.KUBERNETES_PORT || process.env.KUBERNETES_SERVICE_HOST) {

@@ -183,3 +181,3 @@ /* eslint no-console: 0 */

// lock it so autoSave doesn't pick it up but only deletes it from queue
// lock it so _autoSave doesn't pick it up but only deletes it from queue
this._saved = true;

@@ -216,3 +214,4 @@

return this.onFailureCallback(message.data);
}, this.options.timeout + 1000).then(() => // subscribed callback
}, this.options.timeout + 1000).then(() =>
// now subscribed so save the job
this._save()).catch(error => this.onFailureCallback({

@@ -296,2 +295,23 @@ type: 'job',

remove() {
return this.core.client.removejob(this._toQueueKey('succeeded'), this._toQueueKey('failed'), this._toQueueKey('waiting'), this._toQueueKey('active'), this._toQueueKey('stalling'), this._toQueueKey('jobs'), this.id);
}
/**
* Re-save this job for the purpose of retrying it.
* @param cb
*/
retry() {
return this.core.client.multi().srem(this._toQueueKey('failed'), this.id).lpush(this._toQueueKey('waiting'), this.id);
}
/**
*
* @param set
* @returns {Promise.<boolean>}
*/
inSet(set) {
return this.core.client.sismember(this._toQueueKey(set), this.id).then(result => result === 1);
}
} /**

@@ -324,74 +344,2 @@ *

exports.default = Job;
// Experimental code below is TODO
// /**
// *
// * @returns {Job.initialJob|*}
// */
// initialJob() {
// return this._internalData.initialJob;
// }
//
// /**
// *
// * @returns {Job.initialQueue|*}
// */
// initialQueue() {
// return this._internalData.initialQueue;
// }
/**
*
* @param jobId
* @returns {Promise}
*/
// getJob(jobId) {
// return new Promise((resolve, reject) => {
// if (jobId in this.jobs) {
// // we have the job locally
// return resolve(this.jobs[jobId]);
// }
// // not local so gather from redis
// Job.fromId(this, jobId)
// .then(job => {
// this.jobs[jobId] = job;
// return resolve(job);
// }).catch(reject);
// });
// }
//
// /**
// * Remove this job from all sets.
// * @param cb
// */
// remove(cb = noop) {
// this.core.client.removejob(
// this._toQueueKey('succeeded'), this._toQueueKey('failed'), this._toQueueKey('waiting'),
// this._toQueueKey('active'), this._toQueueKey('stalling'), this._toQueueKey('jobs'),
// this.id, cb);
// }
//
// /**
// * Re-save this job for the purpose of retrying it.
// * @param cb
// */
// retry(cb = noop) {
// this.core.client.multi()
// .srem(this._toQueueKey('failed'), this.id)
// .lpush(this._toQueueKey('waiting'), this.id)
// .exec(cb);
// }
//
// /**
// * Callbacks true of false if this job exists in the specified set.
// * @param set
// * @param cb
// */
// isInSet(set, cb = noop) {
// this.core.client.sismember(this._toQueueKey(set), this.id, (err, result) => {
// if (err) return cb(err);
// return cb(null, result === 1);
// });
// }
//# sourceMappingURL=data:application/json;base64,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Z0IsR0FBaEIsQ0FBb0IsT0FBcEIsQ0FBNEIsU0FBVSxNQUFHLEtBQUssU0FBVSxNQUFHLEdBQUksR0FBekU7QUFDRDs7QUE3Uk8sQyxDQWpDVjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBa1VlLEc7O0FBRWY7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOzs7OztBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJqb2IuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUgU2FsYWthclxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKlxuICovXG5cbmltcG9ydCBjdWlkIGZyb20gJ2N1aWQnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgbm9vcCwgc2hhMXN1bSwgdHJ5SlNPTlN0cmluZ2lmeSwgdHJ5SlNPTlBhcnNlIH0gZnJvbSAncmVkaWJveCc7XG5cbi8qKlxuICogQGNsYXNzIEpvYlxuICovXG5jbGFzcyBKb2Ige1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gY29yZVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHF1ZXVlTmFtZVxuICAgKiBAcGFyYW0gaXNOZXdcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb3JlLCBpZCwgZGF0YSA9IHt9LCBvcHRpb25zID0ge1xuICAgIHVuaXF1ZTogZmFsc2UsXG4gICAgdGltZW91dDogNjAwMDAsIC8vIDEgbWludXRlIGRlZmF1bHQgdGltZW91dFxuICB9LCBxdWV1ZU5hbWUsIGlzTmV3KSB7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuY29yZSA9IGNvcmU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLl9zYXZlZCA9IGZhbHNlO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5zdGF0dXMgPSAnY3JlYXRlZCc7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gW107XG4gICAgdGhpcy5pZ25vcmVQcm94eSA9IGZhbHNlO1xuICAgIHRoaXMucXVldWVOYW1lID0gcXVldWVOYW1lO1xuICAgIHRoaXMudHlwZSA9IGRhdGEucnVucyAmJiBBcnJheS5pc0FycmF5KGRhdGEucnVucykgPyAncmVsYXknIDogJ3NpbmdsZSc7XG5cbiAgICAvLyBwYXJlbnQgcmVsYXkgam9iIHRpbWVvdXQgc2hvdWxkIGNvdmVyIGFsbCBjaGlsZCBqb2IgdGltZW91dHNcbiAgICBpZiAodGhpcy50eXBlID09PSAncmVsYXknKSB0aGlzLm9wdGlvbnMudGltZW91dCA9IHRoaXMub3B0aW9ucy50aW1lb3V0ICogZGF0YS5ydW5zLmxlbmd0aDtcblxuICAgIGlmIChpc05ldykge1xuICAgICAgLy8gdGhpcyBQcm94eSBhbGxvd3MgY2hhaW5pbmcgbWV0aG9kcyB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoZVxuICAgICAgLy8gc2F2ZSgpIHByb21pc2UgdmFsaWRcbiAgICAgIHRoaXMucHJveHkgPSBuZXcgUHJveHkodGhpcywge1xuICAgICAgICBnZXQodGFyZ2V0LCBuYW1lKSB7XG4gICAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0W25hbWVdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGhheHhvcnNcbiAgICAgICAgICBpZiAoIXRhcmdldC5pZ25vcmVQcm94eSAmJiBuYW1lID09PSAndGhlbicpIHtcbiAgICAgICAgICAgIHRhcmdldC5wcm9taXNlID0gdGFyZ2V0LnNhdmUoKTtcbiAgICAgICAgICAgIHJldHVybiB0YXJnZXQucHJvbWlzZS50aGVuLmJpbmQodGFyZ2V0LnByb21pc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHRoaXMucHJveHk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBqb2IgaW5zdGFuY2Ugd2l0aCBubyBwcm94eVxuICAgKiBAcmV0dXJucyB7Sm9ifVxuICAgKi9cbiAgd2l0aG91dFByb3h5KCkge1xuICAgIHRoaXMuaWdub3JlUHJveHkgPSB0cnVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJ5IHJlZGlzIGZvciB0aGUgc3BlY2lmaWVkIGpvYiBpZCBhbmQgY29udmVydHMgaXQgdG8gYSBuZXcgaW5zdGFuY2Ugb2YgSm9iLlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKiBAcGFyYW0gaWRcbiAgICovXG4gIHN0YXRpYyBmcm9tSWQocXVldWUsIGlkKSB7XG4gICAgcmV0dXJuIHF1ZXVlLmNsaWVudC5oZ2V0KHF1ZXVlLnRvS2V5KCdqb2JzJyksIGlkKS50aGVuKChkYXRhKSA9PlxuICAgICAgSm9iLmZyb21EYXRhKHF1ZXVlLCBpZCwgZGF0YSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgSlNPTiBzdHJpbmcgb2YgYSBqb2IncyBkYXRhIHRvIGEgbmV3IGluc3RhbmNlIG9mIEpvYlxuICAgKiBAc3RhdGljXG4gICAqIEBwYXJhbSBxdWV1ZVxuICAgKiBAcGFyYW0gaWRcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHJldHVybnMge0pvYiB8IG51bGx9XG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGEoLi4uYXJncykge1xuICAgIGNvbnN0IG9iaiA9IHRyeUpTT05QYXJzZShhcmdzWzJdKTtcbiAgICBpZiAoIW9iaikgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgam9iID0gbmV3IEpvYihhcmdzWzBdLmNvcmUsIGFyZ3NbMV0sIG9iai5kYXRhLCBvYmoub3B0aW9ucywgYXJnc1swXS5uYW1lKTtcbiAgICBqb2Iuc3RhdHVzID0gb2JqLmRhdGEuc3RhdHVzO1xuICAgIHJldHVybiBqb2I7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGlzIEpvYiBpbnN0YW5jZSB0byBhIGpzb24gc3RyaW5nLlxuICAgKi9cbiAgdG9EYXRhKCkge1xuICAgIHJldHVybiB0cnlKU09OU3RyaW5naWZ5KHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHRvT2JqZWN0KGV4Y2x1ZGVEYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogZXhjbHVkZURhdGEgPyAnaGlkZGVuJyA6IHRoaXMuZGF0YSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBzYXZlIHRoYXQgcHVzaGVzIHRvIHJlZGlzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NhdmUoKSB7XG4gICAgdGhpcy5jb3JlLmxvZy52ZXJib3NlKGBTYXZpbmcgbmV3IGpvYiAke3RoaXMuaWR9IGZvciAke3RoaXMucXVldWVOYW1lfWApO1xuICAgIHJldHVybiB0aGlzLmNvcmUuY2xpZW50LmFkZGpvYihcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ2pvYnMnKSxcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ2lkJyksXG4gICAgICB0aGlzLnRvRGF0YSgpLFxuICAgICAgISF0aGlzLm9wdGlvbnMudW5pcXVlLFxuICAgICAgdGhpcy5pZCkudGhlbigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bmlxdWUgJiYgaWQgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdkdXBsaWNhdGUnO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVSUl9EVVBMSUNBVEU6IEpvYiAke3RoaXMuaWR9IGFscmVhZHkgZXhpc3RzLCBzYXZlIGhhcyBiZWVuIGFib3J0ZWQuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LktVQkVSTkVURVNfUE9SVCB8fCBwcm9jZXNzLmVudi5LVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVCkge1xuICAgICAgICAgIC8qIGVzbGludCBuby1jb25zb2xlOiAwICovXG4gICAgICAgICAgY29uc3Qgam9iRGF0YSA9IEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YS5kYXRhIHx8IHt9KTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBsZXZlbDogJ3ZlcmJvc2UnLFxuICAgICAgICAgICAgdHlwZTogJ3JlZGlib3hfam9iX2NyZWF0ZWQnLFxuICAgICAgICAgICAgam9iOiB7XG4gICAgICAgICAgICAgIGlkOiB0aGlzLmlkLnRvU3RyaW5nID8gdGhpcy5pZC50b1N0cmluZygpIDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgcnVuczogdGhpcy5kYXRhLnJ1bnMsXG4gICAgICAgICAgICAgIHF1ZXVlOiB0aGlzLnF1ZXVlTmFtZSxcbiAgICAgICAgICAgICAgc3RhdHVzOiAncGVuZGluZycsXG4gICAgICAgICAgICAgIGRhdGE6IGpvYkRhdGEubGVuZ3RoID4gNDAwMCA/ICc8ISBqb2IgZGF0YSB0b28gbGFyZ2UgdG8gZGlzcGxheSAhPicgOiB0aGlzLmRhdGEuZGF0YSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb3JlLmxvZy52ZXJib3NlKGBTYXZlZCBqb2IgZm9yICR7dGhpcy5xdWV1ZU5hbWV9YCk7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnc2F2ZWQnO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMudG9PYmplY3QodHJ1ZSkpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0aGlzIGluc3RhbmNlIG9mIEpvYiB0byByZWRpcy4gQW55IGFjdGl2ZSBxdWV1ZXMgd2lsbCBwaWNrIGl0IHVwXG4gICAqIGltbWVkaWF0ZWx5IGZvciBwcm9jZXNzaW5nLlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHNhdmUoYXV0bykge1xuICAgIGlmICghYXV0byAmJiB0aGlzLl9zYXZlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgLy8gbG9jayBpdCBzbyBhdXRvU2F2ZSBkb2Vzbid0IHBpY2sgaXQgdXAgYnV0IG9ubHkgZGVsZXRlcyBpdCBmcm9tIHF1ZXVlXG4gICAgdGhpcy5fc2F2ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5pZCA9IGAke3RoaXMucXVldWVOYW1lfS0keyh0aGlzLm9wdGlvbnMudW5pcXVlID8gc2hhMXN1bSh0aGlzLmRhdGEpIDogY3VpZCgpKX1gO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlTdWNjZXNzKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm90aWZ5U3VjY2VzcyA9IGBqb2I6JHt0aGlzLmlkfTpzdWNjZXNzYDtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGBqb2I6JHt0aGlzLmlkfTpzdWNjZXNzYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm90aWZ5RmFpbHVyZSA9IGBqb2I6JHt0aGlzLmlkfTpmYWlsdXJlYDtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGBqb2I6JHt0aGlzLmlkfTpmYWlsdXJlYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlTdWNjZXNzIHx8IHRoaXMub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICBpZiAoIXRoaXMuY29yZS5wdWJzdWIub3B0aW9ucy5zdWJzY3JpYmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoJ0Nhbm5vdCBzdWJzY3JpYmUgdG8gam9iIGV2ZW50cyB3aGVuIFJlZGlCb3gucHVic3ViIFxcJ3N1YnNjcmliZXJcXCcgY29uZmlnIGlzIHNldCB0byBkaXNhYmxlZC4nKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb3JlLnB1YnN1Yi5zdWJzY3JpYmVPbmNlT2YoXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyxcbiAgICAgICAgKG1lc3NhZ2UpID0+IHsgLy8gb24gbWVzc2FnZSByZWNlaXZlZFxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcHVic3ViIGRhdGFcbiAgICAgICAgICBpZiAoIW1lc3NhZ2UuZGF0YSkgbWVzc2FnZS5kYXRhID0ge307XG5cbiAgICAgICAgICAvLyBpZiB0aGVyZSdzIGFuIGVycm9yIHRoZW4gYXNzdW1lIGZhaWxlZC5cbiAgICAgICAgICBpZiAobWVzc2FnZS5kYXRhLmVycm9yKSByZXR1cm4gdGhpcy5vbkZhaWx1cmVDYWxsYmFjayhtZXNzYWdlLmRhdGEpO1xuXG4gICAgICAgICAgLy8gaXMgaXQgZnJvbSB0aGUgc3VjY2VzcyBjaGFubmVsLlxuICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnNbMF0gPT09IG1lc3NhZ2UuY2hhbm5lbCkgcmV0dXJuIHRoaXMub25TdWNjZXNzQ2FsbGJhY2sobWVzc2FnZS5kYXRhKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrKG1lc3NhZ2UuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ICsgMTAwMFxuICAgICAgKS50aGVuKCgpID0+ICAvLyBzdWJzY3JpYmVkIGNhbGxiYWNrXG4gICAgICAgIHRoaXMuX3NhdmUoKVxuICAgICAgKS5jYXRjaChlcnJvciA9PlxuICAgICAgICB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrKHtcbiAgICAgICAgICB0eXBlOiAnam9iJyxcbiAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKCdFcnJvciB3aGlsZSBzdWJzY3JpYmluZyB0byBqb2IgZXZlbnRzLCBob3dldmVyIHRoaXMgam9iIHdpbGwgc3RpbGwgYmUgcXVldWVkIC0gJyArXG4gICAgICAgICAgICAneW91IG1heSBiZSB1bmFibGUgdG8gcmVjZWl2ZSBvblN1Y2Nlc3MgLyBvbkZhaWx1cmUgZXZlbnRzIGZvciB0aGlzIGpvYi4nKSxcbiAgICAgICAgICBlcnJvcl9hY3R1YWw6IGVycm9yLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgam9iIHdpbGwgcmV0cnkgb24gZmFpbHVyZVxuICAgKiBAcGFyYW0gblxuICAgKiBAcmV0dXJucyB7Sm9ifVxuICAgKi9cbiAgcmV0cmllcyhuKSB7XG4gICAgaWYgKG4gPCAwKSB0aHJvdyBFcnJvcignUmV0cmllcyBjYW5ub3QgYmUgbmVnYXRpdmUnKTtcbiAgICB0aGlzLm9wdGlvbnMucmV0cmllcyA9IG4gLSAxO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25TdWNjZXNzIGNhbGxiYWNrIGFuZCBub3RpZnkgb3B0aW9uXG4gICAqIEBwYXJhbSBub3RpZnlcbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIG9uU3VjY2Vzcyhub3RpZnkpIHtcbiAgICB0aGlzLm9wdGlvbnMubm90aWZ5U3VjY2VzcyA9IHRydWU7XG4gICAgdGhpcy5vblN1Y2Nlc3NDYWxsYmFjayA9IG5vdGlmeTtcbiAgICBpZiAoIXRoaXMub25GYWlsdXJlQ2FsbGJhY2spIHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgPSBub29wO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgb25GYWlsdXJlIGNhbGxiYWNrIGFuZCBub3RpZnkgb3B0aW9uXG4gICAqIEBwYXJhbSBub3RpZnlcbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIG9uRmFpbHVyZShub3RpZnkpIHtcbiAgICB0aGlzLm9wdGlvbnMubm90aWZ5RmFpbHVyZSA9IHRydWU7XG4gICAgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayA9IG5vdGlmeTtcbiAgICBpZiAoIXRoaXMub25TdWNjZXNzQ2FsbGJhY2spIHRoaXMub25TdWNjZXNzQ2FsbGJhY2sgPSBub29wO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBib29sXG4gICAqIEByZXR1cm5zIHtKb2J9XG4gICAqL1xuICB1bmlxdWUoYm9vbCkge1xuICAgIHRoaXMub3B0aW9ucy51bmlxdWUgPSBib29sO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBob3cgbG9uZyB0aGlzIGpvYiBjYW4gcmVtYWluIHJ1bm5pbmcgZm9yIGJlZm9yZSBpdCB0aW1lcyBvdXQuXG4gICAqIEBwYXJhbSBtc1xuICAgKiBAcmV0dXJucyB7Sm9ifVxuICAgKi9cbiAgdGltZW91dChtcykge1xuICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ID0gbXM7XG4gICAgcmV0dXJuIHRoaXMucHJveHk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgcXVldWUgcHJlZml4ZWQga2V5IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzdHJpbmcuXG4gICAqIEBwYXJhbSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90b1F1ZXVlS2V5KHN0cikge1xuICAgIGlmICh0aGlzLmNvcmUuY2x1c3Rlci5pc0NsdXN0ZXIoKSkge1xuICAgICAgcmV0dXJuIGAke3RoaXMuY29yZS5ob29rcy5qb2Iub3B0aW9ucy5rZXlQcmVmaXh9Onske3RoaXMucXVldWVOYW1lfX06JHtzdHJ9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMuY29yZS5ob29rcy5qb2Iub3B0aW9ucy5rZXlQcmVmaXh9OiR7dGhpcy5xdWV1ZU5hbWV9OiR7c3RyfWA7XG4gIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBKb2I7XG5cbi8vIEV4cGVyaW1lbnRhbCBjb2RlIGJlbG93IGlzIFRPRE9cblxuLy8gLyoqXG4vLyAgKlxuLy8gICogQHJldHVybnMge0pvYi5pbml0aWFsSm9ifCp9XG4vLyAgKi9cbi8vIGluaXRpYWxKb2IoKSB7XG4vLyAgIHJldHVybiB0aGlzLl9pbnRlcm5hbERhdGEuaW5pdGlhbEpvYjtcbi8vIH1cbi8vXG4vLyAvKipcbi8vICAqXG4vLyAgKiBAcmV0dXJucyB7Sm9iLmluaXRpYWxRdWV1ZXwqfVxuLy8gICovXG4vLyBpbml0aWFsUXVldWUoKSB7XG4vLyAgIHJldHVybiB0aGlzLl9pbnRlcm5hbERhdGEuaW5pdGlhbFF1ZXVlO1xuLy8gfVxuXG4vKipcbiAqXG4gKiBAcGFyYW0gam9iSWRcbiAqIEByZXR1cm5zIHtQcm9taXNlfVxuICovXG4vLyBnZXRKb2Ioam9iSWQpIHtcbi8vICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbi8vICAgICBpZiAoam9iSWQgaW4gdGhpcy5qb2JzKSB7XG4vLyAgICAgICAvLyB3ZSBoYXZlIHRoZSBqb2IgbG9jYWxseVxuLy8gICAgICAgcmV0dXJuIHJlc29sdmUodGhpcy5qb2JzW2pvYklkXSk7XG4vLyAgICAgfVxuLy8gICAgIC8vIG5vdCBsb2NhbCBzbyBnYXRoZXIgZnJvbSByZWRpc1xuLy8gICAgIEpvYi5mcm9tSWQodGhpcywgam9iSWQpXG4vLyAgICAgICAgLnRoZW4oam9iID0+IHtcbi8vICAgICAgICAgIHRoaXMuam9ic1tqb2JJZF0gPSBqb2I7XG4vLyAgICAgICAgICByZXR1cm4gcmVzb2x2ZShqb2IpO1xuLy8gICAgICAgIH0pLmNhdGNoKHJlamVjdCk7XG4vLyAgIH0pO1xuLy8gfVxuLy9cbi8vIC8qKlxuLy8gICogUmVtb3ZlIHRoaXMgam9iIGZyb20gYWxsIHNldHMuXG4vLyAgKiBAcGFyYW0gY2Jcbi8vICAqL1xuLy8gcmVtb3ZlKGNiID0gbm9vcCkge1xuLy8gICB0aGlzLmNvcmUuY2xpZW50LnJlbW92ZWpvYihcbi8vICAgICB0aGlzLl90b1F1ZXVlS2V5KCdzdWNjZWVkZWQnKSwgdGhpcy5fdG9RdWV1ZUtleSgnZmFpbGVkJyksIHRoaXMuX3RvUXVldWVLZXkoJ3dhaXRpbmcnKSxcbi8vICAgICB0aGlzLl90b1F1ZXVlS2V5KCdhY3RpdmUnKSwgdGhpcy5fdG9RdWV1ZUtleSgnc3RhbGxpbmcnKSwgdGhpcy5fdG9RdWV1ZUtleSgnam9icycpLFxuLy8gICAgIHRoaXMuaWQsIGNiKTtcbi8vIH1cbi8vXG4vLyAvKipcbi8vICAqIFJlLXNhdmUgdGhpcyBqb2IgZm9yIHRoZSBwdXJwb3NlIG9mIHJldHJ5aW5nIGl0LlxuLy8gICogQHBhcmFtIGNiXG4vLyAgKi9cbi8vIHJldHJ5KGNiID0gbm9vcCkge1xuLy8gICB0aGlzLmNvcmUuY2xpZW50Lm11bHRpKClcbi8vICAgICAgIC5zcmVtKHRoaXMuX3RvUXVldWVLZXkoJ2ZhaWxlZCcpLCB0aGlzLmlkKVxuLy8gICAgICAgLmxwdXNoKHRoaXMuX3RvUXVldWVLZXkoJ3dhaXRpbmcnKSwgdGhpcy5pZClcbi8vICAgICAgIC5leGVjKGNiKTtcbi8vIH1cbi8vXG4vLyAvKipcbi8vICAqIENhbGxiYWNrcyB0cnVlIG9mIGZhbHNlIGlmIHRoaXMgam9iIGV4aXN0cyBpbiB0aGUgc3BlY2lmaWVkIHNldC5cbi8vICAqIEBwYXJhbSBzZXRcbi8vICAqIEBwYXJhbSBjYlxuLy8gICovXG4vLyBpc0luU2V0KHNldCwgY2IgPSBub29wKSB7XG4vLyAgIHRoaXMuY29yZS5jbGllbnQuc2lzbWVtYmVyKHRoaXMuX3RvUXVldWVLZXkoc2V0KSwgdGhpcy5pZCwgKGVyciwgcmVzdWx0KSA9PiB7XG4vLyAgICAgaWYgKGVycikgcmV0dXJuIGNiKGVycik7XG4vLyAgICAgcmV0dXJuIGNiKG51bGwsIHJlc3VsdCA9PT0gMSk7XG4vLyAgIH0pO1xuLy8gfVxuIl19
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9qb2IuanMiXSwibmFtZXMiOlsiSm9iIiwiY29uc3RydWN0b3IiLCJjb3JlIiwiaWQiLCJkYXRhIiwib3B0aW9ucyIsInVuaXF1ZSIsInRpbWVvdXQiLCJxdWV1ZU5hbWUiLCJpc05ldyIsIl9zYXZlZCIsInN0YXR1cyIsInN1YnNjcmlwdGlvbnMiLCJpZ25vcmVQcm94eSIsInR5cGUiLCJydW5zIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwicHJveHkiLCJQcm94eSIsImdldCIsInRhcmdldCIsIm5hbWUiLCJwcm9taXNlIiwic2F2ZSIsInRoZW4iLCJiaW5kIiwidW5kZWZpbmVkIiwid2l0aG91dFByb3h5IiwiZnJvbUlkIiwicXVldWUiLCJjbGllbnQiLCJoZ2V0IiwidG9LZXkiLCJmcm9tRGF0YSIsImFyZ3MiLCJvYmoiLCJqb2IiLCJ0b0RhdGEiLCJ0b09iamVjdCIsImV4Y2x1ZGVEYXRhIiwiX3NhdmUiLCJsb2ciLCJ2ZXJib3NlIiwiYWRkam9iIiwiX3RvUXVldWVLZXkiLCJyZWplY3QiLCJFcnJvciIsInByb2Nlc3MiLCJlbnYiLCJLVUJFUk5FVEVTX1BPUlQiLCJLVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVCIsImpvYkRhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiY29uc29sZSIsImxldmVsIiwidG9TdHJpbmciLCJyZXNvbHZlIiwiYXV0byIsIm5vdGlmeVN1Y2Nlc3MiLCJwdXNoIiwibm90aWZ5RmFpbHVyZSIsInB1YnN1YiIsInN1YnNjcmliZXIiLCJzdWJzY3JpYmVPbmNlT2YiLCJtZXNzYWdlIiwiZXJyb3IiLCJvbkZhaWx1cmVDYWxsYmFjayIsImNoYW5uZWwiLCJvblN1Y2Nlc3NDYWxsYmFjayIsImNhdGNoIiwiZXJyb3JfYWN0dWFsIiwicmV0cmllcyIsIm4iLCJvblN1Y2Nlc3MiLCJub3RpZnkiLCJvbkZhaWx1cmUiLCJib29sIiwibXMiLCJzdHIiLCJjbHVzdGVyIiwiaXNDbHVzdGVyIiwiaG9va3MiLCJrZXlQcmVmaXgiLCJyZW1vdmUiLCJyZW1vdmVqb2IiLCJyZXRyeSIsIm11bHRpIiwic3JlbSIsImxwdXNoIiwiaW5TZXQiLCJzZXQiLCJzaXNtZW1iZXIiLCJyZXN1bHQiXSwibWFwcGluZ3MiOiI7Ozs7OztBQTBCQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7O0FBR0EsTUFBTUEsR0FBTixDQUFVOztBQUVSOzs7Ozs7Ozs7O0FBVUFDLGNBQVlDLElBQVosRUFBa0JDLEVBQWxCLEVBQXNCQyxPQUFPLEVBQTdCLEVBQWlDQyxVQUFVO0FBQ3pDQyxZQUFRLEtBRGlDO0FBRXpDQyxhQUFTLEtBRmdDLEVBQTNDLEVBR0dDLFNBSEgsRUFHY0MsS0FIZCxFQUdxQjtBQUNuQixTQUFLTixFQUFMLEdBQVVBLEVBQVY7QUFDQSxTQUFLRCxJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLRSxJQUFMLEdBQVlBLElBQVo7QUFDQSxTQUFLTSxNQUFMLEdBQWMsS0FBZDtBQUNBLFNBQUtMLE9BQUwsR0FBZUEsT0FBZjtBQUNBLFNBQUtNLE1BQUwsR0FBYyxTQUFkO0FBQ0EsU0FBS0MsYUFBTCxHQUFxQixFQUFyQjtBQUNBLFNBQUtDLFdBQUwsR0FBbUIsS0FBbkI7QUFDQSxTQUFLTCxTQUFMLEdBQWlCQSxTQUFqQjtBQUNBLFNBQUtNLElBQUwsR0FBWVYsS0FBS1csSUFBTCxJQUFhQyxNQUFNQyxPQUFOLENBQWNiLEtBQUtXLElBQW5CLENBQWIsR0FBd0MsT0FBeEMsR0FBa0QsUUFBOUQ7O0FBRUE7QUFDQSxRQUFJLEtBQUtELElBQUwsS0FBYyxPQUFsQixFQUEyQixLQUFLVCxPQUFMLENBQWFFLE9BQWIsR0FBdUIsS0FBS0YsT0FBTCxDQUFhRSxPQUFiLEdBQXVCSCxLQUFLVyxJQUFMLENBQVVHLE1BQXhEOztBQUUzQixRQUFJVCxLQUFKLEVBQVc7QUFDVDtBQUNBO0FBQ0EsV0FBS1UsS0FBTCxHQUFhLElBQUlDLEtBQUosQ0FBVSxJQUFWLEVBQWdCO0FBQzNCQyxZQUFJQyxNQUFKLEVBQVlDLElBQVosRUFBa0I7QUFDaEIsY0FBSUEsUUFBUUQsTUFBWixFQUFvQjtBQUNsQixtQkFBT0EsT0FBT0MsSUFBUCxDQUFQO0FBQ0Q7O0FBRUQ7QUFDQSxjQUFJLENBQUNELE9BQU9ULFdBQVIsSUFBdUJVLFNBQVMsTUFBcEMsRUFBNEM7QUFDMUNELG1CQUFPRSxPQUFQLEdBQWlCRixPQUFPRyxJQUFQLEVBQWpCO0FBQ0EsbUJBQU9ILE9BQU9FLE9BQVAsQ0FBZUUsSUFBZixDQUFvQkMsSUFBcEIsQ0FBeUJMLE9BQU9FLE9BQWhDLENBQVA7QUFDRDs7QUFFRCxpQkFBT0ksU0FBUDtBQUNEO0FBYjBCLE9BQWhCLENBQWI7O0FBZ0JBLGFBQU8sS0FBS1QsS0FBWjtBQUNEOztBQUVELFdBQU8sSUFBUDtBQUNEOztBQUVEOzs7O0FBSUFVLGlCQUFlO0FBQ2IsU0FBS2hCLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxXQUFPLElBQVA7QUFDRDs7QUFFRDs7Ozs7O0FBTUEsU0FBT2lCLE1BQVAsQ0FBY0MsS0FBZCxFQUFxQjVCLEVBQXJCLEVBQXlCO0FBQ3ZCLFdBQU80QixNQUFNQyxNQUFOLENBQWFDLElBQWIsQ0FBa0JGLE1BQU1HLEtBQU4sQ0FBWSxNQUFaLENBQWxCLEVBQXVDL0IsRUFBdkMsRUFBMkN1QixJQUEzQyxDQUFnRHRCLFFBQ3JESixJQUFJbUMsUUFBSixDQUFhSixLQUFiLEVBQW9CNUIsRUFBcEIsRUFBd0JDLElBQXhCLENBREssQ0FBUDtBQUdEOztBQUVEOzs7Ozs7QUFNQSxTQUFPK0IsUUFBUCxDQUFnQixHQUFHQyxJQUFuQixFQUF5QjtBQUN2QixVQUFNQyxNQUFNLDJCQUFhRCxLQUFLLENBQUwsQ0FBYixDQUFaO0FBQ0EsUUFBSSxDQUFDQyxHQUFMLEVBQVUsT0FBTyxJQUFQO0FBQ1YsVUFBTUMsTUFBTSxJQUFJdEMsR0FBSixDQUFRb0MsS0FBSyxDQUFMLEVBQVFsQyxJQUFoQixFQUFzQmtDLEtBQUssQ0FBTCxDQUF0QixFQUErQkMsSUFBSWpDLElBQW5DLEVBQXlDaUMsSUFBSWhDLE9BQTdDLEVBQXNEK0IsS0FBSyxDQUFMLEVBQVFiLElBQTlELENBQVo7QUFDQWUsUUFBSTNCLE1BQUosR0FBYTBCLElBQUlqQyxJQUFKLENBQVNPLE1BQXRCO0FBQ0EsV0FBTzJCLEdBQVA7QUFDRDs7QUFFRDs7O0FBR0FDLFdBQVM7QUFDUCxXQUFPLCtCQUFpQjtBQUN0QnBDLFVBQUksS0FBS0EsRUFEYTtBQUV0QkMsWUFBTSxLQUFLQSxJQUZXO0FBR3RCTyxjQUFRLEtBQUtBLE1BSFM7QUFJdEJOLGVBQVMsS0FBS0E7QUFKUSxLQUFqQixDQUFQO0FBTUQ7O0FBRUQ7Ozs7QUFJQW1DLFdBQVNDLFdBQVQsRUFBc0I7QUFDcEIsV0FBTztBQUNMdEMsVUFBSSxLQUFLQSxFQURKO0FBRUxDLFlBQU1xQyxjQUFjLFFBQWQsR0FBeUIsS0FBS3JDLElBRi9CO0FBR0xPLGNBQVEsS0FBS0EsTUFIUjtBQUlMTixlQUFTLEtBQUtBO0FBSlQsS0FBUDtBQU1EOztBQUVEOzs7O0FBSUFxQyxVQUFRO0FBQ04sU0FBS3hDLElBQUwsQ0FBVXlDLEdBQVYsQ0FBY0MsT0FBZCxDQUF1QixtQkFBaUIsS0FBS3pDLEVBQUcsVUFBTyxLQUFLSyxTQUFVLEdBQXRFO0FBQ0EsV0FBTyxLQUFLTixJQUFMLENBQVU4QixNQUFWLENBQWlCYSxNQUFqQixDQUNMLEtBQUtDLFdBQUwsQ0FBaUIsTUFBakIsQ0FESyxFQUVMLEtBQUtBLFdBQUwsQ0FBaUIsU0FBakIsQ0FGSyxFQUdMLEtBQUtBLFdBQUwsQ0FBaUIsSUFBakIsQ0FISyxFQUlMLEtBQUtQLE1BQUwsRUFKSyxFQUtMLENBQUMsQ0FBQyxLQUFLbEMsT0FBTCxDQUFhQyxNQUxWLEVBTUwsS0FBS0gsRUFOQSxFQU1JdUIsSUFOSixDQU1VdkIsRUFBRCxJQUFRO0FBQ3BCLFVBQUksS0FBS0UsT0FBTCxDQUFhQyxNQUFiLElBQXVCSCxPQUFPLENBQWxDLEVBQXFDO0FBQ25DLGFBQUtRLE1BQUwsR0FBYyxXQUFkO0FBQ0EsZUFBTyxtQkFBUW9DLE1BQVIsQ0FBZSxJQUFJQyxLQUFKLENBQVcsdUJBQXFCLEtBQUs3QyxFQUFHLDBDQUF4QyxDQUFmLENBQVA7QUFDRDs7QUFFRDtBQUNBLFVBQUk4QyxRQUFRQyxHQUFSLENBQVlDLGVBQVosSUFBK0JGLFFBQVFDLEdBQVIsQ0FBWUUsdUJBQS9DLEVBQXdFO0FBQ3RFO0FBQ0EsY0FBTUMsVUFBVUMsS0FBS0MsU0FBTCxDQUFlLEtBQUtuRCxJQUFMLENBQVVBLElBQVYsSUFBa0IsRUFBakMsQ0FBaEI7QUFDQW9ELGdCQUFRYixHQUFSLENBQVlXLEtBQUtDLFNBQUwsQ0FBZTtBQUN6QkUsaUJBQU8sU0FEa0I7QUFFekIzQyxnQkFBTSxxQkFGbUI7QUFHekJ3QixlQUFLO0FBQ0huQyxnQkFBSSxLQUFLQSxFQUFMLENBQVF1RCxRQUFSLEdBQW1CLEtBQUt2RCxFQUFMLENBQVF1RCxRQUFSLEVBQW5CLEdBQXdDLEtBQUt2RCxFQUQ5QztBQUVIWSxrQkFBTSxLQUFLWCxJQUFMLENBQVVXLElBRmI7QUFHSGdCLG1CQUFPLEtBQUt2QixTQUhUO0FBSUhHLG9CQUFRLFNBSkw7QUFLSFAsa0JBQU1pRCxRQUFRbkMsTUFBUixHQUFpQixJQUFqQixHQUF3QixxQ0FBeEIsR0FBZ0UsS0FBS2QsSUFBTCxDQUFVQTtBQUw3RTtBQUhvQixTQUFmLENBQVo7QUFXRDs7QUFFRCxXQUFLRixJQUFMLENBQVV5QyxHQUFWLENBQWNDLE9BQWQsQ0FBdUIsa0JBQWdCLEtBQUtwQyxTQUFVLEdBQXREO0FBQ0EsV0FBS0wsRUFBTCxHQUFVQSxFQUFWO0FBQ0EsV0FBS1EsTUFBTCxHQUFjLE9BQWQ7QUFDQSxhQUFPLG1CQUFRZ0QsT0FBUixDQUFnQixLQUFLbkIsUUFBTCxDQUFjLElBQWQsQ0FBaEIsQ0FBUDtBQUNELEtBakNJLENBQVA7QUFtQ0Q7O0FBRUQ7Ozs7O0FBS0FmLE9BQUttQyxJQUFMLEVBQVc7QUFDVCxRQUFJLENBQUNBLElBQUQsSUFBUyxLQUFLbEQsTUFBbEIsRUFBMEIsT0FBTyxtQkFBUWlELE9BQVIsRUFBUDs7QUFFMUI7QUFDQSxTQUFLakQsTUFBTCxHQUFjLElBQWQ7O0FBRUEsU0FBS1AsRUFBTCxHQUFXLElBQUUsS0FBS0ssU0FBVSxNQUFJLEtBQUtILE9BQUwsQ0FBYUMsTUFBYixHQUFzQixzQkFBUSxLQUFLRixJQUFiLENBQXRCLEdBQTJDLHFCQUFRLEdBQW5GOztBQUVBLFFBQUksS0FBS0MsT0FBTCxDQUFhd0QsYUFBakIsRUFBZ0M7QUFDOUIsV0FBS3hELE9BQUwsQ0FBYXdELGFBQWIsR0FBOEIsUUFBTSxLQUFLMUQsRUFBRyxXQUE1QztBQUNBLFdBQUtTLGFBQUwsQ0FBbUJrRCxJQUFuQixDQUF5QixRQUFNLEtBQUszRCxFQUFHLFdBQXZDO0FBQ0Q7O0FBRUQsUUFBSSxLQUFLRSxPQUFMLENBQWEwRCxhQUFqQixFQUFnQztBQUM5QixXQUFLMUQsT0FBTCxDQUFhMEQsYUFBYixHQUE4QixRQUFNLEtBQUs1RCxFQUFHLFdBQTVDO0FBQ0EsV0FBS1MsYUFBTCxDQUFtQmtELElBQW5CLENBQXlCLFFBQU0sS0FBSzNELEVBQUcsV0FBdkM7QUFDRDs7QUFFRCxRQUFJLEtBQUtFLE9BQUwsQ0FBYXdELGFBQWIsSUFBOEIsS0FBS3hELE9BQUwsQ0FBYTBELGFBQS9DLEVBQThEO0FBQzVELFVBQUksQ0FBQyxLQUFLN0QsSUFBTCxDQUFVOEQsTUFBVixDQUFpQjNELE9BQWpCLENBQXlCNEQsVUFBOUIsRUFBMEM7QUFDeEMsZUFBTyxtQkFBUWxCLE1BQVIsQ0FDTCxJQUFJQyxLQUFKLENBQVUsOEZBQVYsQ0FESyxDQUFQO0FBR0Q7O0FBRUQsYUFBTyxLQUFLOUMsSUFBTCxDQUFVOEQsTUFBVixDQUFpQkUsZUFBakIsQ0FDTCxLQUFLdEQsYUFEQSxFQUVKdUQsT0FBRCxJQUFhO0FBQUU7QUFDYjtBQUNBLFlBQUksQ0FBQ0EsUUFBUS9ELElBQWIsRUFBbUIrRCxRQUFRL0QsSUFBUixHQUFlLEVBQWY7O0FBRW5CO0FBQ0EsWUFBSStELFFBQVEvRCxJQUFSLENBQWFnRSxLQUFqQixFQUF3QixPQUFPLEtBQUtDLGlCQUFMLENBQXVCRixRQUFRL0QsSUFBL0IsQ0FBUDs7QUFFeEI7QUFDQSxZQUFJLEtBQUtRLGFBQUwsQ0FBbUIsQ0FBbkIsTUFBMEJ1RCxRQUFRRyxPQUF0QyxFQUErQyxPQUFPLEtBQUtDLGlCQUFMLENBQXVCSixRQUFRL0QsSUFBL0IsQ0FBUDs7QUFFL0MsZUFBTyxLQUFLaUUsaUJBQUwsQ0FBdUJGLFFBQVEvRCxJQUEvQixDQUFQO0FBQ0QsT0FiSSxFQWNMLEtBQUtDLE9BQUwsQ0FBYUUsT0FBYixHQUF1QixJQWRsQixFQWVMbUIsSUFmSyxDQWVBO0FBQ0w7QUFDQSxXQUFLZ0IsS0FBTCxFQWpCSyxFQWtCTDhCLEtBbEJLLENBa0JDSixTQUNOLEtBQUtDLGlCQUFMLENBQXVCO0FBQ3JCdkQsY0FBTSxLQURlO0FBRXJCc0QsZUFBTyxJQUFJcEIsS0FBSixDQUFVLG9GQUNmLHlFQURLLENBRmM7QUFJckJ5QixzQkFBY0w7QUFKTyxPQUF2QixDQW5CSyxDQUFQO0FBMEJEOztBQUVELFdBQU8sS0FBSzFCLEtBQUwsRUFBUDtBQUNEOztBQUVEOzs7OztBQUtBZ0MsVUFBUUMsQ0FBUixFQUFXO0FBQ1QsUUFBSUEsSUFBSSxDQUFSLEVBQVcsTUFBTTNCLE1BQU0sNEJBQU4sQ0FBTjtBQUNYLFNBQUszQyxPQUFMLENBQWFxRSxPQUFiLEdBQXVCQyxJQUFJLENBQTNCO0FBQ0EsV0FBTyxLQUFLeEQsS0FBWjtBQUNEOztBQUVEOzs7OztBQUtBeUQsWUFBVUMsTUFBVixFQUFrQjtBQUNoQixTQUFLeEUsT0FBTCxDQUFhd0QsYUFBYixHQUE2QixJQUE3QjtBQUNBLFNBQUtVLGlCQUFMLEdBQXlCTSxNQUF6QjtBQUNBLFFBQUksQ0FBQyxLQUFLUixpQkFBVixFQUE2QixLQUFLQSxpQkFBTDtBQUM3QixXQUFPLEtBQUtsRCxLQUFaO0FBQ0Q7O0FBRUQ7Ozs7O0FBS0EyRCxZQUFVRCxNQUFWLEVBQWtCO0FBQ2hCLFNBQUt4RSxPQUFMLENBQWEwRCxhQUFiLEdBQTZCLElBQTdCO0FBQ0EsU0FBS00saUJBQUwsR0FBeUJRLE1BQXpCO0FBQ0EsUUFBSSxDQUFDLEtBQUtOLGlCQUFWLEVBQTZCLEtBQUtBLGlCQUFMO0FBQzdCLFdBQU8sS0FBS3BELEtBQVo7QUFDRDs7QUFFRDs7Ozs7QUFLQWIsU0FBT3lFLElBQVAsRUFBYTtBQUNYLFNBQUsxRSxPQUFMLENBQWFDLE1BQWIsR0FBc0J5RSxJQUF0QjtBQUNBLFdBQU8sS0FBSzVELEtBQVo7QUFDRDs7QUFFRDs7Ozs7QUFLQVosVUFBUXlFLEVBQVIsRUFBWTtBQUNWLFNBQUszRSxPQUFMLENBQWFFLE9BQWIsR0FBdUJ5RSxFQUF2QjtBQUNBLFdBQU8sS0FBSzdELEtBQVo7QUFDRDs7QUFFRDs7Ozs7O0FBTUEyQixjQUFZbUMsR0FBWixFQUFpQjtBQUNmLFFBQUksS0FBSy9FLElBQUwsQ0FBVWdGLE9BQVYsQ0FBa0JDLFNBQWxCLEVBQUosRUFBbUM7QUFDakMsYUFBUSxJQUFFLEtBQUtqRixJQUFMLENBQVVrRixLQUFWLENBQWdCOUMsR0FBaEIsQ0FBb0JqQyxPQUFwQixDQUE0QmdGLFNBQVUsT0FBSSxLQUFLN0UsU0FBVSxPQUFJeUUsR0FBSSxHQUEzRTtBQUNEO0FBQ0QsV0FBUSxJQUFFLEtBQUsvRSxJQUFMLENBQVVrRixLQUFWLENBQWdCOUMsR0FBaEIsQ0FBb0JqQyxPQUFwQixDQUE0QmdGLFNBQVUsTUFBRyxLQUFLN0UsU0FBVSxNQUFHeUUsR0FBSSxHQUF6RTtBQUNEOztBQUVESyxXQUFTO0FBQ1AsV0FBTyxLQUFLcEYsSUFBTCxDQUFVOEIsTUFBVixDQUFpQnVELFNBQWpCLENBQ0wsS0FBS3pDLFdBQUwsQ0FBaUIsV0FBakIsQ0FESyxFQUMwQixLQUFLQSxXQUFMLENBQWlCLFFBQWpCLENBRDFCLEVBQ3NELEtBQUtBLFdBQUwsQ0FBaUIsU0FBakIsQ0FEdEQsRUFFTCxLQUFLQSxXQUFMLENBQWlCLFFBQWpCLENBRkssRUFFdUIsS0FBS0EsV0FBTCxDQUFpQixVQUFqQixDQUZ2QixFQUVxRCxLQUFLQSxXQUFMLENBQWlCLE1BQWpCLENBRnJELEVBR0wsS0FBSzNDLEVBSEEsQ0FBUDtBQUlEOztBQUVEOzs7O0FBSUFxRixVQUFRO0FBQ04sV0FBTyxLQUFLdEYsSUFBTCxDQUFVOEIsTUFBVixDQUFpQnlELEtBQWpCLEdBQ0pDLElBREksQ0FDQyxLQUFLNUMsV0FBTCxDQUFpQixRQUFqQixDQURELEVBQzZCLEtBQUszQyxFQURsQyxFQUVKd0YsS0FGSSxDQUVFLEtBQUs3QyxXQUFMLENBQWlCLFNBQWpCLENBRkYsRUFFK0IsS0FBSzNDLEVBRnBDLENBQVA7QUFHRDs7QUFFRDs7Ozs7QUFLQXlGLFFBQU1DLEdBQU4sRUFBVztBQUNULFdBQU8sS0FBSzNGLElBQUwsQ0FBVThCLE1BQVYsQ0FBaUI4RCxTQUFqQixDQUEyQixLQUFLaEQsV0FBTCxDQUFpQitDLEdBQWpCLENBQTNCLEVBQWtELEtBQUsxRixFQUF2RCxFQUEyRHVCLElBQTNELENBQWdFcUUsVUFBVUEsV0FBVyxDQUFyRixDQUFQO0FBQ0Q7O0FBdlRPLEMsQ0FqQ1Y7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQTRWZS9GLEciLCJmaWxlIjoiam9iLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IChjKSAyMDE1IFNhbGFrYXJcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICpcbiAqL1xuXG5pbXBvcnQgY3VpZCBmcm9tICdjdWlkJztcbmltcG9ydCBQcm9taXNlIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IG5vb3AsIHNoYTFzdW0sIHRyeUpTT05TdHJpbmdpZnksIHRyeUpTT05QYXJzZSB9IGZyb20gJ3JlZGlib3gnO1xuXG4vKipcbiAqIEBjbGFzcyBKb2JcbiAqL1xuY2xhc3MgSm9iIHtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGNvcmVcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSBxdWV1ZU5hbWVcbiAgICogQHBhcmFtIGlzTmV3XG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgY29uc3RydWN0b3IoY29yZSwgaWQsIGRhdGEgPSB7fSwgb3B0aW9ucyA9IHtcbiAgICB1bmlxdWU6IGZhbHNlLFxuICAgIHRpbWVvdXQ6IDYwMDAwLCAvLyAxIG1pbnV0ZSBkZWZhdWx0IHRpbWVvdXRcbiAgfSwgcXVldWVOYW1lLCBpc05ldykge1xuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLmNvcmUgPSBjb3JlO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5fc2F2ZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuc3RhdHVzID0gJ2NyZWF0ZWQnO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IFtdO1xuICAgIHRoaXMuaWdub3JlUHJveHkgPSBmYWxzZTtcbiAgICB0aGlzLnF1ZXVlTmFtZSA9IHF1ZXVlTmFtZTtcbiAgICB0aGlzLnR5cGUgPSBkYXRhLnJ1bnMgJiYgQXJyYXkuaXNBcnJheShkYXRhLnJ1bnMpID8gJ3JlbGF5JyA6ICdzaW5nbGUnO1xuXG4gICAgLy8gcGFyZW50IHJlbGF5IGpvYiB0aW1lb3V0IHNob3VsZCBjb3ZlciBhbGwgY2hpbGQgam9iIHRpbWVvdXRzXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3JlbGF5JykgdGhpcy5vcHRpb25zLnRpbWVvdXQgPSB0aGlzLm9wdGlvbnMudGltZW91dCAqIGRhdGEucnVucy5sZW5ndGg7XG5cbiAgICBpZiAoaXNOZXcpIHtcbiAgICAgIC8vIHRoaXMgUHJveHkgYWxsb3dzIGNoYWluaW5nIG1ldGhvZHMgd2hpbGUgc3RpbGwga2VlcGluZyB0aGVcbiAgICAgIC8vIHNhdmUoKSBwcm9taXNlIHZhbGlkXG4gICAgICB0aGlzLnByb3h5ID0gbmV3IFByb3h5KHRoaXMsIHtcbiAgICAgICAgZ2V0KHRhcmdldCwgbmFtZSkge1xuICAgICAgICAgIGlmIChuYW1lIGluIHRhcmdldCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBoYXh4b3JzXG4gICAgICAgICAgaWYgKCF0YXJnZXQuaWdub3JlUHJveHkgJiYgbmFtZSA9PT0gJ3RoZW4nKSB7XG4gICAgICAgICAgICB0YXJnZXQucHJvbWlzZSA9IHRhcmdldC5zYXZlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnByb21pc2UudGhlbi5iaW5kKHRhcmdldC5wcm9taXNlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0aGlzLnByb3h5O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgam9iIGluc3RhbmNlIHdpdGggbm8gcHJveHlcbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIHdpdGhvdXRQcm94eSgpIHtcbiAgICB0aGlzLmlnbm9yZVByb3h5ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBRdWVyeSByZWRpcyBmb3IgdGhlIHNwZWNpZmllZCBqb2IgaWQgYW5kIGNvbnZlcnRzIGl0IHRvIGEgbmV3IGluc3RhbmNlIG9mIEpvYi5cbiAgICogQHN0YXRpY1xuICAgKiBAcGFyYW0gcXVldWVcbiAgICogQHBhcmFtIGlkXG4gICAqL1xuICBzdGF0aWMgZnJvbUlkKHF1ZXVlLCBpZCkge1xuICAgIHJldHVybiBxdWV1ZS5jbGllbnQuaGdldChxdWV1ZS50b0tleSgnam9icycpLCBpZCkudGhlbihkYXRhID0+XG4gICAgICBKb2IuZnJvbURhdGEocXVldWUsIGlkLCBkYXRhKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBKU09OIHN0cmluZyBvZiBhIGpvYidzIGRhdGEgdG8gYSBuZXcgaW5zdGFuY2Ugb2YgSm9iXG4gICAqIEBzdGF0aWNcbiAgICogQHJldHVybnMge0pvYiB8IG51bGx9XG4gICAqIEBwYXJhbSBhcmdzXG4gICAqL1xuICBzdGF0aWMgZnJvbURhdGEoLi4uYXJncykge1xuICAgIGNvbnN0IG9iaiA9IHRyeUpTT05QYXJzZShhcmdzWzJdKTtcbiAgICBpZiAoIW9iaikgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qgam9iID0gbmV3IEpvYihhcmdzWzBdLmNvcmUsIGFyZ3NbMV0sIG9iai5kYXRhLCBvYmoub3B0aW9ucywgYXJnc1swXS5uYW1lKTtcbiAgICBqb2Iuc3RhdHVzID0gb2JqLmRhdGEuc3RhdHVzO1xuICAgIHJldHVybiBqb2I7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCB0aGlzIEpvYiBpbnN0YW5jZSB0byBhIGpzb24gc3RyaW5nLlxuICAgKi9cbiAgdG9EYXRhKCkge1xuICAgIHJldHVybiB0cnlKU09OU3RyaW5naWZ5KHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogdGhpcy5kYXRhLFxuICAgICAgc3RhdHVzOiB0aGlzLnN0YXR1cyxcbiAgICAgIG9wdGlvbnM6IHRoaXMub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIHRvT2JqZWN0KGV4Y2x1ZGVEYXRhKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgZGF0YTogZXhjbHVkZURhdGEgPyAnaGlkZGVuJyA6IHRoaXMuZGF0YSxcbiAgICAgIHN0YXR1czogdGhpcy5zdGF0dXMsXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBzYXZlIHRoYXQgcHVzaGVzIHRvIHJlZGlzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NhdmUoKSB7XG4gICAgdGhpcy5jb3JlLmxvZy52ZXJib3NlKGBTYXZpbmcgbmV3IGpvYiAke3RoaXMuaWR9IGZvciAke3RoaXMucXVldWVOYW1lfWApO1xuICAgIHJldHVybiB0aGlzLmNvcmUuY2xpZW50LmFkZGpvYihcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ2pvYnMnKSxcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ2lkJyksXG4gICAgICB0aGlzLnRvRGF0YSgpLFxuICAgICAgISF0aGlzLm9wdGlvbnMudW5pcXVlLFxuICAgICAgdGhpcy5pZCkudGhlbigoaWQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51bmlxdWUgJiYgaWQgPT09IDApIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdkdXBsaWNhdGUnO1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYEVSUl9EVVBMSUNBVEU6IEpvYiAke3RoaXMuaWR9IGFscmVhZHkgZXhpc3RzLCBzYXZlIGhhcyBiZWVuIGFib3J0ZWQuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETyBhbGxvdyBob29raW5nIGludG8gdGhpcyBldmVudCByYXRoZXIgdGhhbiB1cyBkb2luZyB0aGlzIHBvb3AgaGVyZVxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuS1VCRVJORVRFU19QT1JUIHx8IHByb2Nlc3MuZW52LktVQkVSTkVURVNfU0VSVklDRV9IT1NUKSB7XG4gICAgICAgICAgLyogZXNsaW50IG5vLWNvbnNvbGU6IDAgKi9cbiAgICAgICAgICBjb25zdCBqb2JEYXRhID0gSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLmRhdGEgfHwge30pO1xuICAgICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGxldmVsOiAndmVyYm9zZScsXG4gICAgICAgICAgICB0eXBlOiAncmVkaWJveF9qb2JfY3JlYXRlZCcsXG4gICAgICAgICAgICBqb2I6IHtcbiAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQudG9TdHJpbmcgPyB0aGlzLmlkLnRvU3RyaW5nKCkgOiB0aGlzLmlkLFxuICAgICAgICAgICAgICBydW5zOiB0aGlzLmRhdGEucnVucyxcbiAgICAgICAgICAgICAgcXVldWU6IHRoaXMucXVldWVOYW1lLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgICAgICAgICAgZGF0YTogam9iRGF0YS5sZW5ndGggPiA0MDAwID8gJzwhIGpvYiBkYXRhIHRvbyBsYXJnZSB0byBkaXNwbGF5ICE+JyA6IHRoaXMuZGF0YS5kYXRhLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvcmUubG9nLnZlcmJvc2UoYFNhdmVkIGpvYiBmb3IgJHt0aGlzLnF1ZXVlTmFtZX1gKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnN0YXR1cyA9ICdzYXZlZCc7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy50b09iamVjdCh0cnVlKSk7XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoaXMgaW5zdGFuY2Ugb2YgSm9iIHRvIHJlZGlzLiBBbnkgYWN0aXZlIHF1ZXVlcyB3aWxsIHBpY2sgaXQgdXBcbiAgICogaW1tZWRpYXRlbHkgZm9yIHByb2Nlc3NpbmcuXG4gICAqIEByZXR1cm5zIHsqfVxuICAgKi9cbiAgc2F2ZShhdXRvKSB7XG4gICAgaWYgKCFhdXRvICYmIHRoaXMuX3NhdmVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAvLyBsb2NrIGl0IHNvIF9hdXRvU2F2ZSBkb2Vzbid0IHBpY2sgaXQgdXAgYnV0IG9ubHkgZGVsZXRlcyBpdCBmcm9tIHF1ZXVlXG4gICAgdGhpcy5fc2F2ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5pZCA9IGAke3RoaXMucXVldWVOYW1lfS0keyh0aGlzLm9wdGlvbnMudW5pcXVlID8gc2hhMXN1bSh0aGlzLmRhdGEpIDogY3VpZCgpKX1gO1xuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlTdWNjZXNzKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm90aWZ5U3VjY2VzcyA9IGBqb2I6JHt0aGlzLmlkfTpzdWNjZXNzYDtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGBqb2I6JHt0aGlzLmlkfTpzdWNjZXNzYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICB0aGlzLm9wdGlvbnMubm90aWZ5RmFpbHVyZSA9IGBqb2I6JHt0aGlzLmlkfTpmYWlsdXJlYDtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKGBqb2I6JHt0aGlzLmlkfTpmYWlsdXJlYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9ucy5ub3RpZnlTdWNjZXNzIHx8IHRoaXMub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICBpZiAoIXRoaXMuY29yZS5wdWJzdWIub3B0aW9ucy5zdWJzY3JpYmVyKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoJ0Nhbm5vdCBzdWJzY3JpYmUgdG8gam9iIGV2ZW50cyB3aGVuIFJlZGlCb3gucHVic3ViIFxcJ3N1YnNjcmliZXJcXCcgY29uZmlnIGlzIHNldCB0byBkaXNhYmxlZC4nKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5jb3JlLnB1YnN1Yi5zdWJzY3JpYmVPbmNlT2YoXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyxcbiAgICAgICAgKG1lc3NhZ2UpID0+IHsgLy8gb24gbWVzc2FnZSByZWNlaXZlZFxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgcHVic3ViIGRhdGFcbiAgICAgICAgICBpZiAoIW1lc3NhZ2UuZGF0YSkgbWVzc2FnZS5kYXRhID0ge307XG5cbiAgICAgICAgICAvLyBpZiB0aGVyZSdzIGFuIGVycm9yIHRoZW4gYXNzdW1lIGZhaWxlZC5cbiAgICAgICAgICBpZiAobWVzc2FnZS5kYXRhLmVycm9yKSByZXR1cm4gdGhpcy5vbkZhaWx1cmVDYWxsYmFjayhtZXNzYWdlLmRhdGEpO1xuXG4gICAgICAgICAgLy8gaXMgaXQgZnJvbSB0aGUgc3VjY2VzcyBjaGFubmVsLlxuICAgICAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnNbMF0gPT09IG1lc3NhZ2UuY2hhbm5lbCkgcmV0dXJuIHRoaXMub25TdWNjZXNzQ2FsbGJhY2sobWVzc2FnZS5kYXRhKTtcblxuICAgICAgICAgIHJldHVybiB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrKG1lc3NhZ2UuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMub3B0aW9ucy50aW1lb3V0ICsgMTAwMFxuICAgICAgKS50aGVuKCgpID0+XG4gICAgICAgIC8vIG5vdyBzdWJzY3JpYmVkIHNvIHNhdmUgdGhlIGpvYlxuICAgICAgICB0aGlzLl9zYXZlKClcbiAgICAgICkuY2F0Y2goZXJyb3IgPT5cbiAgICAgICAgdGhpcy5vbkZhaWx1cmVDYWxsYmFjayh7XG4gICAgICAgICAgdHlwZTogJ2pvYicsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcignRXJyb3Igd2hpbGUgc3Vic2NyaWJpbmcgdG8gam9iIGV2ZW50cywgaG93ZXZlciB0aGlzIGpvYiB3aWxsIHN0aWxsIGJlIHF1ZXVlZCAtICcgK1xuICAgICAgICAgICAgJ3lvdSBtYXkgYmUgdW5hYmxlIHRvIHJlY2VpdmUgb25TdWNjZXNzIC8gb25GYWlsdXJlIGV2ZW50cyBmb3IgdGhpcyBqb2IuJyksXG4gICAgICAgICAgZXJyb3JfYWN0dWFsOiBlcnJvcixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3NhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGpvYiB3aWxsIHJldHJ5IG9uIGZhaWx1cmVcbiAgICogQHBhcmFtIG5cbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIHJldHJpZXMobikge1xuICAgIGlmIChuIDwgMCkgdGhyb3cgRXJyb3IoJ1JldHJpZXMgY2Fubm90IGJlIG5lZ2F0aXZlJyk7XG4gICAgdGhpcy5vcHRpb25zLnJldHJpZXMgPSBuIC0gMTtcbiAgICByZXR1cm4gdGhpcy5wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG9uU3VjY2VzcyBjYWxsYmFjayBhbmQgbm90aWZ5IG9wdGlvblxuICAgKiBAcGFyYW0gbm90aWZ5XG4gICAqIEByZXR1cm5zIHtKb2J9XG4gICAqL1xuICBvblN1Y2Nlc3Mobm90aWZ5KSB7XG4gICAgdGhpcy5vcHRpb25zLm5vdGlmeVN1Y2Nlc3MgPSB0cnVlO1xuICAgIHRoaXMub25TdWNjZXNzQ2FsbGJhY2sgPSBub3RpZnk7XG4gICAgaWYgKCF0aGlzLm9uRmFpbHVyZUNhbGxiYWNrKSB0aGlzLm9uRmFpbHVyZUNhbGxiYWNrID0gbm9vcDtcbiAgICByZXR1cm4gdGhpcy5wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIG9uRmFpbHVyZSBjYWxsYmFjayBhbmQgbm90aWZ5IG9wdGlvblxuICAgKiBAcGFyYW0gbm90aWZ5XG4gICAqIEByZXR1cm5zIHtKb2J9XG4gICAqL1xuICBvbkZhaWx1cmUobm90aWZ5KSB7XG4gICAgdGhpcy5vcHRpb25zLm5vdGlmeUZhaWx1cmUgPSB0cnVlO1xuICAgIHRoaXMub25GYWlsdXJlQ2FsbGJhY2sgPSBub3RpZnk7XG4gICAgaWYgKCF0aGlzLm9uU3VjY2Vzc0NhbGxiYWNrKSB0aGlzLm9uU3VjY2Vzc0NhbGxiYWNrID0gbm9vcDtcbiAgICByZXR1cm4gdGhpcy5wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gYm9vbFxuICAgKiBAcmV0dXJucyB7Sm9ifVxuICAgKi9cbiAgdW5pcXVlKGJvb2wpIHtcbiAgICB0aGlzLm9wdGlvbnMudW5pcXVlID0gYm9vbDtcbiAgICByZXR1cm4gdGhpcy5wcm94eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgaG93IGxvbmcgdGhpcyBqb2IgY2FuIHJlbWFpbiBydW5uaW5nIGZvciBiZWZvcmUgaXQgdGltZXMgb3V0LlxuICAgKiBAcGFyYW0gbXNcbiAgICogQHJldHVybnMge0pvYn1cbiAgICovXG4gIHRpbWVvdXQobXMpIHtcbiAgICB0aGlzLm9wdGlvbnMudGltZW91dCA9IG1zO1xuICAgIHJldHVybiB0aGlzLnByb3h5O1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHF1ZXVlIHByZWZpeGVkIGtleSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgc3RyaW5nLlxuICAgKiBAcGFyYW0gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdG9RdWV1ZUtleShzdHIpIHtcbiAgICBpZiAodGhpcy5jb3JlLmNsdXN0ZXIuaXNDbHVzdGVyKCkpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmNvcmUuaG9va3Muam9iLm9wdGlvbnMua2V5UHJlZml4fTp7JHt0aGlzLnF1ZXVlTmFtZX19OiR7c3RyfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLmNvcmUuaG9va3Muam9iLm9wdGlvbnMua2V5UHJlZml4fToke3RoaXMucXVldWVOYW1lfToke3N0cn1gO1xuICB9XG5cbiAgcmVtb3ZlKCkge1xuICAgIHJldHVybiB0aGlzLmNvcmUuY2xpZW50LnJlbW92ZWpvYihcbiAgICAgIHRoaXMuX3RvUXVldWVLZXkoJ3N1Y2NlZWRlZCcpLCB0aGlzLl90b1F1ZXVlS2V5KCdmYWlsZWQnKSwgdGhpcy5fdG9RdWV1ZUtleSgnd2FpdGluZycpLFxuICAgICAgdGhpcy5fdG9RdWV1ZUtleSgnYWN0aXZlJyksIHRoaXMuX3RvUXVldWVLZXkoJ3N0YWxsaW5nJyksIHRoaXMuX3RvUXVldWVLZXkoJ2pvYnMnKSxcbiAgICAgIHRoaXMuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlLXNhdmUgdGhpcyBqb2IgZm9yIHRoZSBwdXJwb3NlIG9mIHJldHJ5aW5nIGl0LlxuICAgKiBAcGFyYW0gY2JcbiAgICovXG4gIHJldHJ5KCkge1xuICAgIHJldHVybiB0aGlzLmNvcmUuY2xpZW50Lm11bHRpKClcbiAgICAgIC5zcmVtKHRoaXMuX3RvUXVldWVLZXkoJ2ZhaWxlZCcpLCB0aGlzLmlkKVxuICAgICAgLmxwdXNoKHRoaXMuX3RvUXVldWVLZXkoJ3dhaXRpbmcnKSwgdGhpcy5pZCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHNldFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZS48Ym9vbGVhbj59XG4gICAqL1xuICBpblNldChzZXQpIHtcbiAgICByZXR1cm4gdGhpcy5jb3JlLmNsaWVudC5zaXNtZW1iZXIodGhpcy5fdG9RdWV1ZUtleShzZXQpLCB0aGlzLmlkKS50aGVuKHJlc3VsdCA9PiByZXN1bHQgPT09IDEpO1xuICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgSm9iO1xuIl19

@@ -9,6 +9,4 @@ 'use strict';

var _job = require('./job');
var _redibox = require('redibox');
var _job2 = _interopRequireDefault(_job);
var _bluebird = require('bluebird');

@@ -18,6 +16,2 @@

var _defaults = require('./defaults');
var _defaults2 = _interopRequireDefault(_defaults);
var _eventemitter = require('eventemitter3');

@@ -27,4 +21,10 @@

var _redibox = require('redibox');
var _job = require('./job');
var _job2 = _interopRequireDefault(_job);
var _defaults = require('./defaults');
var _defaults2 = _interopRequireDefault(_defaults);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

@@ -82,4 +82,5 @@

this._onLocalTickComplete = () => {
this.running--;
this.queued--;
this.running -= 1;
this.queued -= 1;
if (!this.options.throttle) return setImmediate(this._queueTick);

@@ -89,2 +90,3 @@

const shouldThrottle = throttle[0] === 1;
if (!shouldThrottle) {

@@ -103,3 +105,3 @@ this.throttled = false;

this._onLocalTickError = error => {
this.queued--;
this.queued -= 1;
this.log.error(error);

@@ -111,7 +113,11 @@ setImmediate(this._queueTick);

if (this.paused || !this.options.enabled) {
return void 0;
return undefined;
}
this.queued++;
return this._getNextJob().then(job => {
this.running++;
this.queued += 1;
return this._getNextJob((err, job) => {
if (err) return this._onLocalTickError(err);
this.running += 1;
// queue more jobs if within limit

@@ -124,3 +130,3 @@ if (this.running + this.queued < this.options.concurrency) {

return this._runJob(job).then(this._onLocalTickComplete).catch(this._onLocalTickComplete);
}).catch(this._onLocalTickError);
});
};

@@ -135,3 +141,2 @@

this.core = core;
this.client = core.client;
this.paused = false;

@@ -142,7 +147,6 @@ this.started = false;

this.name = options.name;
this.client = core.client;
this.handler = options.handler || null;
this.options = Object.assign({}, _defaults2.default.queue, options || {});
this.core.createClient('block', this).then(() => {
this.log.verbose(`Blocking client for queue '${ this.name }' is ready. Starting queue processor.`);
});
this.core.createClient('block', this);
}

@@ -163,3 +167,3 @@

*/
checkHealth() {
getStatus() {
return this.client.multi().llen(this.toKey('waiting')).llen(this.toKey('active')).scard(this.toKey('succeeded')).scard(this.toKey('failed')).then(results => {

@@ -180,7 +184,5 @@ /* eslint arrow-body-style: 0 */

*/
_getNextJob() {
_getNextJob(cb) {
this.log.verbose(`Getting next job for queue '${ this.name }'.`);
return this.clients.block.brpoplpush(this.toKey('waiting'), this.toKey('active'), 0).then(jobId => _job2.default.fromId(this, jobId).then(job => {
return job;
}));
this.clients.block.brpoplpush(this.toKey('waiting'), this.toKey('active'), 0, (pushError, jobId) => pushError ? cb(pushError) : _job2.default.fromId(this, jobId).then(job => cb(null, job)).catch(err => cb(err)));
}

@@ -198,2 +200,3 @@

// TODO allow hooking into this event rather than us doing this poop here
if (process.env.KUBERNETES_PORT || process.env.KUBERNETES_SERVICE_HOST) {

@@ -241,3 +244,3 @@ /* eslint no-console: 0 */

// silently ignore any multiple calls
if (handled) return void 0;
if (handled) return undefined;

@@ -263,3 +266,3 @@ clearTimeout(preventStallingTimeout);

if (handled) {
return void 0;
return undefined;
}

@@ -283,3 +286,3 @@

if (!handled) {
preventStallingTimeout = setTimeout(preventStalling, this.options.stallInterval / 2);
preventStallingTimeout = setTimeout(preventStalling, this.options.stallInterval / 3);
}

@@ -296,5 +299,7 @@ });

preventStalling(); // start stalling monitor
// start stalling monitoring
preventStalling();
job._internalData = job.data;
job.data = job.data.data || job.data;

@@ -359,3 +364,3 @@

if (job.options.retries > 0) {
job.options.retries = job.options.retries - 1;
job.options.retries -= 1;
job.status = 'retrying';

@@ -367,2 +372,3 @@ multi.hset(this.toKey('jobs'), job.id, job.toData());

multi.hdel(this.toKey('jobs'), job.id);
// TODO track failures and their data somewhere else for reviewing

@@ -373,23 +379,26 @@ // multi.hset(this.toKey('jobs'), job.id, job.toData());

} else {
job.status = 'succeeded';
multi.hdel(this.toKey('jobs'), job.id);
// TODO track successes and their data somewhere else for reviewing
// multi.hset(this.toKey('jobs'), job.id, job.toData());
// multi.sadd(this.toKey('succeeded'), job.id);
if (process.env.KUBERNETES_PORT || process.env.KUBERNETES_SERVICE_HOST) {
/* eslint no-console: 0 */
const jobData = JSON.stringify(job.data.data || {});
console.log(JSON.stringify({
level: 'verbose',
type: 'redibox_job_completed',
job: {
id: job.id.toString ? job.id.toString() : job.id,
runs: job.data.runs,
queue: this.name,
status: job.status,
data: jobData.length > 4000 ? '<! job data too large to display !>' : job.data.data
}
}));
}
job.status = 'succeeded';
multi.hdel(this.toKey('jobs'), job.id);
// TODO track successes and their data somewhere else for reviewing
// multi.hset(this.toKey('jobs'), job.id, job.toData());
// multi.sadd(this.toKey('succeeded'), job.id);
// TODO allow hooking into this event rather than us doing this poop here
if (process.env.KUBERNETES_PORT || process.env.KUBERNETES_SERVICE_HOST) {
/* eslint no-console: 0 */
const jobData = JSON.stringify(job.data.data || {});
console.log(JSON.stringify({
level: 'verbose',
type: 'redibox_job_completed',
job: {
id: job.id.toString ? job.id.toString() : job.id,
runs: job.data.runs,
queue: this.name,
status: job.status,
data: jobData.length > 4000 ? '<! job data too large to display !>' : job.data.data
}
}));
}
}
}

@@ -526,3 +535,3 @@

this.log.info(`Queue ${ this.name } is currently disabled.`);
return void 0;
return;
}

@@ -539,7 +548,4 @@

this.checkStalledJobs().then(() => {
this.log.verbose('checkStalledJobs completed');
}).catch(() => {});
return this._queueTick();
this.checkStalledJobs();
this._queueTick();
}

@@ -553,5 +559,5 @@

this.log.verbose(`${ this.name }: checkStalledJobs`);
return this.client.checkstalledjobs(this.toKey('stallTime'), this.toKey('stalling'), this.toKey('waiting'), this.toKey('active'), (0, _redibox.getTimeStamp)(), this.options.stallInterval).then(() => {
if (!this.options.enabled || this.paused) return _bluebird2.default.resolve();
return _bluebird2.default.delay(this.options.stallInterval).then(this.checkStalledJobs.bind(this));
this.client.checkstalledjobs(this.toKey('stallTime'), this.toKey('stalling'), this.toKey('waiting'), this.toKey('active'), (0, _redibox.getTimeStamp)(), this.options.stallInterval, () => {
if (!this.options.enabled || this.paused) return;
setTimeout(this.checkStalledJobs.bind(this), this.options.stallInterval);
});

@@ -579,2 +585,2 @@ }

exports.default = Queue;
//# sourceMappingURL=data:application/json;base64,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RkgsQ0FFUyxNQUFNLENBQ2QsQ0FIRDs7QUFLQSxXQUFPLEtBQUssVUFBTCxFQUFQO0FBQ0Q7O0FBRUQ7Ozs7QUFJQSxxQkFBbUI7QUFDakIsU0FBSyxHQUFMLENBQVMsT0FBVCxDQUFrQixJQUFFLEtBQUssSUFBSyxxQkFBOUI7QUFDQSxXQUFPLEtBQUssTUFBTCxDQUFZLGdCQUFaLENBQ0wsS0FBSyxLQUFMLENBQVcsV0FBWCxDQURLLEVBRUwsS0FBSyxLQUFMLENBQVcsVUFBWCxDQUZLLEVBR0wsS0FBSyxLQUFMLENBQVcsU0FBWCxDQUhLLEVBSUwsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUpLLEVBS0wsNEJBTEssRUFNTCxLQUFLLE9BQUwsQ0FBYSxhQU5SLEVBT0wsSUFQSyxDQU9BLE1BQU07QUFDWCxVQUFJLENBQUMsS0FBSyxPQUFMLENBQWEsT0FBZCxJQUF5QixLQUFLLE1BQWxDLEVBQTBDLE9BQU8sbUJBQVEsT0FBUixFQUFQO0FBQzFDLGFBQU8sbUJBQVEsS0FBUixDQUFjLEtBQUssT0FBTCxDQUFhLGFBQTNCLEVBQTBDLElBQTFDLENBQWlELEtBQUssZ0JBQXRELE1BQWlELElBQWpELEVBQVA7QUFDRCxLQVZNLENBQVA7QUFXRDs7QUFFRDs7Ozs7QUFLQSxRQUFNLEdBQU4sRUFBVztBQUNULFFBQUksS0FBSyxJQUFMLENBQVUsT0FBVixDQUFrQixTQUFsQixFQUFKLEVBQW1DO0FBQ2pDLGFBQVEsSUFBRSxLQUFLLE9BQUwsQ0FBYSxTQUFVLE9BQUksS0FBSyxJQUFLLE9BQUksR0FBSSxHQUF2RDtBQUNEO0FBQ0QsV0FBUSxJQUFFLEtBQUssT0FBTCxDQUFhLFNBQVUsTUFBRyxLQUFLLElBQUssTUFBRyxHQUFJLEdBQXJEO0FBQ0Q7O0FBRUQ7Ozs7O0FBdmY4QztrQkFBM0IsSyIsImZpbGUiOiJxdWV1ZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBKb2IgZnJvbSAnLi9qb2InO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IGRlZmF1bHRzIGZyb20gJy4vZGVmYXVsdHMnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IGRlZXBHZXQsIGlzT2JqZWN0LCBnZXRUaW1lU3RhbXAsIHRyeUpTT05QYXJzZSB9IGZyb20gJ3JlZGlib3gnO1xuXG4vKipcbiAqIFRPRE8gbW92ZSB0byBoZWxwZXJzXG4gKiBAcGFyYW0gZXJyb3JTdGFja1xuICogQHJldHVybnMge0FycmF5fVxuICovXG5mdW5jdGlvbiB0cmltU3RhY2soZXJyb3JTdGFjaykge1xuICBjb25zdCBvbGRTdGFjayA9IGVycm9yU3RhY2suc3BsaXQoJ1xcbicpO1xuICBjb25zdCBzdGFjayA9IFtdO1xuICBmb3IgKGxldCBpID0gMCwgaUxlbiA9IG9sZFN0YWNrLmxlbmd0aCB8fCBzdGFjay5sZW5ndGggPiAxOTsgaSA8IGlMZW47IGkrKykge1xuICAgIGNvbnN0IHJvdyA9IG9sZFN0YWNrW2ldO1xuXG4gICAgLy8gaW5jbHVkZSBwcml2YXRlIG1vZHVsZXNcbiAgICBpZiAocm93LmluY2x1ZGVzKCdAJykpIHtcbiAgICAgIHN0YWNrLnB1c2gocm93KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIGV4Y2x1ZGUgam9iIG1vZHVsZVxuICAgIGlmIChyb3cuaW5jbHVkZXMoJ3JlZGlib3gtaG9vay1qb2InKSB8fCByb3cuaW5jbHVkZXMoJ3JlZGlib3gvam9iL2xpYicpKSBjb250aW51ZTtcblxuICAgIC8vIGV4Y2x1ZGUgYmx1ZWJpcmRcbiAgICBpZiAocm93LmluY2x1ZGVzKCdibHVlYmlyZCcpKSBjb250aW51ZTtcblxuICAgIC8vIGV4Y2x1ZGUgd2F0ZXJsaW5lXG4gICAgaWYgKHJvdy5pbmNsdWRlcygnd2F0ZXJsaW5lL2xpYicpKSBjb250aW51ZTtcblxuICAgIC8vIGV4Y2x1ZGUgd2F0ZXJsaW5lXG4gICAgaWYgKHJvdy5pbmNsdWRlcygnYXN5bmMvbGliJykpIGNvbnRpbnVlO1xuXG4gICAgLy8gZXhjbHVkZSB0aW1lcnMuanNcbiAgICBpZiAocm93LmluY2x1ZGVzKCd0aW1lcnMuanM6JykpIGNvbnRpbnVlO1xuXG4gICAgc3RhY2sucHVzaChyb3cpO1xuICB9XG5cbiAgcmV0dXJuIHN0YWNrO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBRdWV1ZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSBjb3JlXG4gICAqIEByZXR1cm5zIHtRdWV1ZX1cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvcmUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY29yZSA9IGNvcmU7XG4gICAgdGhpcy5jbGllbnQgPSBjb3JlLmNsaWVudDtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuc3RhcnRlZCA9IGZhbHNlO1xuICAgIHRoaXMudGhyb3R0bGVkID0gZmFsc2U7XG4gICAgdGhpcy5sb2cgPSB0aGlzLmNvcmUubG9nO1xuICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTtcbiAgICB0aGlzLmhhbmRsZXIgPSBvcHRpb25zLmhhbmRsZXIgfHwgbnVsbDtcbiAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cy5xdWV1ZSwgb3B0aW9ucyB8fCB7fSk7XG4gICAgdGhpcy5jb3JlLmNyZWF0ZUNsaWVudCgnYmxvY2snLCB0aGlzKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYEJsb2NraW5nIGNsaWVudCBmb3IgcXVldWUgJyR7dGhpcy5uYW1lfScgaXMgcmVhZHkuIFN0YXJ0aW5nIHF1ZXVlIHByb2Nlc3Nvci5gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgY29uc3Qga2V5cyA9IFtcbiAgICAgICdpZCcsICdqb2JzJywgJ3N0YWxsVGltZScsICdzdGFsbGluZycsICd3YWl0aW5nJywgJ2FjdGl2ZScsICdzdWNjZWVkZWQnLCAnZmFpbGVkJyxcbiAgICBdLm1hcChrZXkgPT4gdGhpcy50b0tleShrZXkpKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQuZGVsKC4uLmtleXMpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgY2hlY2tIZWFsdGgoKSB7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAuY2xpZW50Lm11bHRpKClcbiAgICAubGxlbih0aGlzLnRvS2V5KCd3YWl0aW5nJykpXG4gICAgLmxsZW4odGhpcy50b0tleSgnYWN0aXZlJykpXG4gICAgLnNjYXJkKHRoaXMudG9LZXkoJ3N1Y2NlZWRlZCcpKVxuICAgIC5zY2FyZCh0aGlzLnRvS2V5KCdmYWlsZWQnKSlcbiAgICAudGhlbihyZXN1bHRzID0+IHsgLyogZXNsaW50IGFycm93LWJvZHktc3R5bGU6IDAgKi9cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdhaXRpbmc6IHJlc3VsdHNbMF1bMV0sXG4gICAgICAgIGFjdGl2ZTogcmVzdWx0c1sxXVsxXSxcbiAgICAgICAgc3VjY2VlZGVkOiByZXN1bHRzWzJdWzFdLFxuICAgICAgICBmYWlsZWQ6IHJlc3VsdHNbM11bMV0sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgX2dldE5leHRKb2IoKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgR2V0dGluZyBuZXh0IGpvYiBmb3IgcXVldWUgJyR7dGhpcy5uYW1lfScuYCk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50cy5ibG9jay5icnBvcGxwdXNoKFxuICAgICAgdGhpcy50b0tleSgnd2FpdGluZycpLFxuICAgICAgdGhpcy50b0tleSgnYWN0aXZlJyksIDBcbiAgICApLnRoZW4oam9iSWQgPT5cbiAgICAgIEpvYi5mcm9tSWQodGhpcywgam9iSWQpLnRoZW4oam9iID0+IHtcbiAgICAgICAgcmV0dXJuIGpvYjtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gam9iXG4gICAqIEBwYXJhbSBqb2JFcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2xvZ0pvYkZhaWx1cmUoam9iLCBqb2JFcnJvcikge1xuICAgIGNvbnN0IGVycm9yID0gdHlwZW9mIGpvYkVycm9yID09PSAnc3RyaW5nJyA/IG5ldyBFcnJvcihqb2JFcnJvcikgOiBqb2JFcnJvcjtcbiAgICBjb25zdCBzdGFjayA9IHRyaW1TdGFjayhlcnJvci5zdGFjayk7XG5cbiAgICBpZiAocHJvY2Vzcy5lbnYuS1VCRVJORVRFU19QT1JUIHx8IHByb2Nlc3MuZW52LktVQkVSTkVURVNfU0VSVklDRV9IT1NUKSB7XG4gICAgICAvKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xuICAgICAgY29uc3Qgam9iRGF0YSA9IEpTT04uc3RyaW5naWZ5KGpvYi5kYXRhLmRhdGEgfHwge30pO1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgdHlwZTogJ3JlZGlib3hfam9iX2ZhaWx1cmUnLFxuICAgICAgICBqb2I6IHtcbiAgICAgICAgICBpZDogam9iLmlkLnRvU3RyaW5nID8gam9iLmlkLnRvU3RyaW5nKCkgOiBqb2IuaWQsXG4gICAgICAgICAgcnVuczogam9iLmRhdGEucnVucyxcbiAgICAgICAgICBxdWV1ZTogdGhpcy5uYW1lLFxuICAgICAgICAgIGRhdGE6IGpvYkRhdGEubGVuZ3RoID4gNDAwMCA/ICc8ISBqb2IgZGF0YSB0b28gbGFyZ2UgdG8gZGlzcGxheSAhPicgOiBqb2IuZGF0YS5kYXRhLFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcignJyk7XG4gICAgICB0aGlzLmxvZy5lcnJvcignLS0tLS0tLS0tLS0tLS0tIFJEQiBKT0IgRVJST1IvRkFJTFVSRSAtLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBKb2I6ICR7am9iLmRhdGEucnVuc31gIHx8IHRoaXMubmFtZSk7XG4gICAgICBlcnJvci5zdGFjayA9IHN0YWNrLmpvaW4oJ1xcbicpO1xuICAgICAgdGhpcy5sb2cuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5sb2cuZXJyb3IoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgdGhpcy5sb2cuZXJyb3IoJycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gam9iXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgX3J1bkpvYihqb2IpIHtcbiAgICBpZiAoIWpvYiB8fCAham9iLmRhdGEpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCBydW5zID0gam9iLmRhdGEgJiYgam9iLmRhdGEucnVucyAmJiBBcnJheS5pc0FycmF5KGpvYi5kYXRhLnJ1bnMpID8gam9iLmRhdGEucnVuc1swXSA6IGpvYi5kYXRhLnJ1bnM7XG4gICAgY29uc3QgaGFuZGxlciA9ICh0eXBlb2YgdGhpcy5oYW5kbGVyID09PSAnc3RyaW5nJyA/XG4gICAgICAgIGRlZXBHZXQoZ2xvYmFsLCB0aGlzLmhhbmRsZXIpIDogdGhpcy5oYW5kbGVyKSB8fCBkZWVwR2V0KGdsb2JhbCwgcnVucyk7XG5cbiAgICBsZXQgcHJldmVudFN0YWxsaW5nVGltZW91dDtcbiAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgIGxldCBwcm9taXNlT3JSZXM7XG5cbiAgICAvLyBIYW5kbGUgYW4gXCJPS1wiIHJlc3BvbnNlIGZyb20gdGhlIHByb21pc2VcbiAgICBjb25zdCBoYW5kbGVPSyA9IGRhdGEgPT4ge1xuICAgICAgLy8gc2lsZW50bHkgaWdub3JlIGFueSBtdWx0aXBsZSBjYWxsc1xuICAgICAgaWYgKGhhbmRsZWQpIHJldHVybiB2b2lkIDA7XG5cbiAgICAgIGNsZWFyVGltZW91dChwcmV2ZW50U3RhbGxpbmdUaW1lb3V0KTtcbiAgICAgIGhhbmRsZWQgPSB0cnVlO1xuXG4gICAgICAvLyBzZXQgdGhlIGRhdGEgYmFjayB0byBpbnRlcm5hbCBkYXRhXG4gICAgICBpZiAoam9iLl9pbnRlcm5hbERhdGEpIHtcbiAgICAgICAgam9iLmRhdGEgPSBqb2IuX2ludGVybmFsRGF0YTtcbiAgICAgIH1cblxuICAgICAgLy8gb25seSByZWxheSB0byBuZXh0IGpvYiBpZiB1c2VyIGRpZCBub3QgcmVzb2x2ZSAnZmFsc2UnIG9uIGN1cnJlbnQgam9iXG4gICAgICBpZiAoam9iLnR5cGUgPT09ICdyZWxheScgJiYgZGF0YSAhPT0gZmFsc2UpIHJldHVybiB0aGlzLl9maW5pc2hSZWxheUpvYihudWxsLCBkYXRhLCBqb2IpO1xuICAgICAgcmV0dXJuIHRoaXMuX2ZpbmlzaFNpbmdsZUpvYihudWxsLCBkYXRhLCBqb2IpO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgYW55IGVycm9ycyByZXR1cm5lZFxuICAgIGNvbnN0IGhhbmRsZUVycm9yID0gam9iRXJyb3IgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHByZXZlbnRTdGFsbGluZ1RpbWVvdXQpO1xuXG4gICAgICAvLyBzaWxlbnRseSBpZ25vcmUgYW55IG11bHRpcGxlIGNhbGxzXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICByZXR1cm4gdm9pZCAwO1xuICAgICAgfVxuXG4gICAgICBoYW5kbGVkID0gdHJ1ZTtcblxuICAgICAgLy8gc2V0IHRoZSBkYXRhIGJhY2sgdG8gaW50ZXJuYWwgam9iIGRhdGFcbiAgICAgIGlmIChqb2IuX2ludGVybmFsRGF0YSkge1xuICAgICAgICBqb2IuZGF0YSA9IGpvYi5faW50ZXJuYWxEYXRhO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9sb2dKb2JGYWlsdXJlKGpvYiwgam9iRXJyb3IpO1xuXG4gICAgICBpZiAoam9iLnR5cGUgPT09ICdyZWxheScpIHJldHVybiB0aGlzLl9maW5pc2hSZWxheUpvYihqb2JFcnJvciwgbnVsbCwgam9iKTtcbiAgICAgIHJldHVybiB0aGlzLl9maW5pc2hTaW5nbGVKb2Ioam9iRXJyb3IsIG51bGwsIGpvYik7XG4gICAgfTtcblxuICAgIGNvbnN0IHByZXZlbnRTdGFsbGluZyA9ICgpID0+IHtcbiAgICAgIHRoaXMuY2xpZW50LnNyZW0odGhpcy50b0tleSgnc3RhbGxpbmcnKSwgam9iLmlkLCAoKSA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlZCkge1xuICAgICAgICAgIHByZXZlbnRTdGFsbGluZ1RpbWVvdXQgPSBzZXRUaW1lb3V0KHByZXZlbnRTdGFsbGluZywgdGhpcy5vcHRpb25zLnN0YWxsSW50ZXJ2YWwgLyAyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIGlmICghaGFuZGxlcikge1xuICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKFxuICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgYFwiJHtqb2IuZGF0YS5ydW5zIHx8ICdObyBKb2IgSGFuZGxlciBTcGVjaWZpZWQnfVwiIHdhcyBub3QgZm91bmQuIFNraXBwaW5nIGpvYi4gVG8gZml4IHRoaXNcbiAgICAgICAgICAgICB5b3UgbXVzdCBlaXRoZXIgc3BlY2lmeSBhIGhhbmRsZXIgZnVuY3Rpb24gdmlhIHF1ZXVlLnByb2Nlc3MoKSBvciBwcm92aWRlIGEgdmFsaWQgaGFuZGxlclxuICAgICAgICAgICAgIG5vZGUgZ2xvYmFsIHBhdGggaW4geW91ciBqb2Igb3B0aW9ucyAnaGFuZGxlcicsIGUuZy4gaWYgeW91IGhhZCBhIGdsb2JhbCBmdW5jdGlvbiBpblxuICAgICAgICAgICAgJ2dsb2JhbC5zYWlscy5zZXJ2aWNlcy5teXNlcnZpY2UnIHlvdSdkIHNwZWNpZnkgdGhlIGhhbmRsZXIgYXMgJ3NhaWxzLnNlcnZpY2VzLm15c2VydmljZS5teUhhbmRsZXInLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBwcmV2ZW50U3RhbGxpbmcoKTsgLy8gc3RhcnQgc3RhbGxpbmcgbW9uaXRvclxuXG4gICAgam9iLl9pbnRlcm5hbERhdGEgPSBqb2IuZGF0YTtcbiAgICBqb2IuZGF0YSA9IGpvYi5kYXRhLmRhdGEgfHwgam9iLmRhdGE7XG5cbiAgICBpZiAoam9iLm9wdGlvbnMudGltZW91dCkge1xuICAgICAgc2V0VGltZW91dChoYW5kbGVFcnJvci5iaW5kKG51bGwsIEVycm9yKGBKb2IgJHtqb2IuaWR9IHRpbWVkIG91dCAoJHtqb2Iub3B0aW9ucy50aW1lb3V0fW1zKWApKSwgam9iLm9wdGlvbnMudGltZW91dCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChqb2Iub3B0aW9ucy5ub0JpbmQgfHwgdGhpcy5vcHRpb25zLm5vQmluZCkge1xuICAgICAgICBwcm9taXNlT3JSZXMgPSBoYW5kbGVyKGpvYik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlT3JSZXMgPSBoYW5kbGVyLmJpbmQoam9iLCBqb2IpKGpvYik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGhhbmRsZUVycm9yKGUpO1xuICAgIH1cblxuICAgIGlmIChwcm9taXNlT3JSZXMgJiYgcHJvbWlzZU9yUmVzLnRoZW4gJiYgdHlwZW9mIHByb21pc2VPclJlcy50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gcHJvbWlzZU9yUmVzLnRoZW4oaGFuZGxlT0ssIGhhbmRsZUVycm9yKS5jYXRjaChoYW5kbGVFcnJvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZU9LKHByb21pc2VPclJlcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBqb2JcbiAgICogQHJldHVybnMge3tqb2I6IHtpZDogKiwgd29ya2VyX2lkOiAoKnxTdHJpbmd8c3RyaW5nKSwgc3RhdHVzOiBzdHJpbmd9LCBlcnJvcjogKiwgb3V0cHV0OiAqfX1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jcmVhdGVKb2JFdmVudChlcnJvciwgZGF0YSwgam9iKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGpvYjoge1xuICAgICAgICBpZDogam9iLmlkLFxuICAgICAgICB3b3JrZXJfaWQ6IHRoaXMuY29yZS5pZCxcbiAgICAgICAgc3RhdHVzOiBlcnJvciA/ICdmYWlsZWQnIDogJ3N1Y2NlZWRlZCcsXG4gICAgICAgIC4uLmpvYi5kYXRhLFxuICAgICAgfSxcbiAgICAgIGVycm9yLFxuICAgICAgb3V0cHV0OiBkYXRhLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBqb2JcbiAgICogQHBhcmFtIG11bHRpXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlSm9iU3RhdHVzKGVycm9yLCBkYXRhLCBqb2IsIG11bHRpKSB7XG4gICAgY29uc3Qgc3RhdHVzID0gZXJyb3IgPyAnZmFpbGVkJyA6ICdzdWNjZWVkZWQnO1xuXG4gICAgbXVsdGkubHJlbSh0aGlzLnRvS2V5KCdhY3RpdmUnKSwgMCwgam9iLmlkKTtcbiAgICBtdWx0aS5zcmVtKHRoaXMudG9LZXkoJ3N0YWxsaW5nJyksIGpvYi5pZCk7XG5cbiAgICBpZiAoc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgICAgaWYgKGpvYi5vcHRpb25zLnJldHJpZXMgPiAwKSB7XG4gICAgICAgIGpvYi5vcHRpb25zLnJldHJpZXMgPSBqb2Iub3B0aW9ucy5yZXRyaWVzIC0gMTtcbiAgICAgICAgam9iLnN0YXR1cyA9ICdyZXRyeWluZyc7XG4gICAgICAgIG11bHRpLmhzZXQodGhpcy50b0tleSgnam9icycpLCBqb2IuaWQsIGpvYi50b0RhdGEoKSk7XG4gICAgICAgIG11bHRpLmxwdXNoKHRoaXMudG9LZXkoJ3dhaXRpbmcnKSwgam9iLmlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpvYi5zdGF0dXMgPSAnZmFpbGVkJztcbiAgICAgICAgbXVsdGkuaGRlbCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCk7XG4gICAgICAgIC8vIFRPRE8gdHJhY2sgZmFpbHVyZXMgYW5kIHRoZWlyIGRhdGEgc29tZXdoZXJlIGVsc2UgZm9yIHJldmlld2luZ1xuICAgICAgICAvLyBtdWx0aS5oc2V0KHRoaXMudG9LZXkoJ2pvYnMnKSwgam9iLmlkLCBqb2IudG9EYXRhKCkpO1xuICAgICAgICAvLyBtdWx0aS5zYWRkKHRoaXMudG9LZXkoJ2ZhaWxlZCcpLCBqb2IuaWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBqb2Iuc3RhdHVzID0gJ3N1Y2NlZWRlZCc7XG4gICAgICBtdWx0aS5oZGVsKHRoaXMudG9LZXkoJ2pvYnMnKSwgam9iLmlkKTtcbiAgICAgIC8vIFRPRE8gdHJhY2sgc3VjY2Vzc2VzIGFuZCB0aGVpciBkYXRhIHNvbWV3aGVyZSBlbHNlIGZvciByZXZpZXdpbmdcbiAgICAgIC8vIG11bHRpLmhzZXQodGhpcy50b0tleSgnam9icycpLCBqb2IuaWQsIGpvYi50b0RhdGEoKSk7XG4gICAgICAvLyBtdWx0aS5zYWRkKHRoaXMudG9LZXkoJ3N1Y2NlZWRlZCcpLCBqb2IuaWQpO1xuICAgICAgaWYgKHByb2Nlc3MuZW52LktVQkVSTkVURVNfUE9SVCB8fCBwcm9jZXNzLmVudi5LVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVCkge1xuICAgICAgICAvKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xuICAgICAgICBjb25zdCBqb2JEYXRhID0gSlNPTi5zdHJpbmdpZnkoam9iLmRhdGEuZGF0YSB8fCB7fSk7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICBsZXZlbDogJ3ZlcmJvc2UnLFxuICAgICAgICAgIHR5cGU6ICdyZWRpYm94X2pvYl9jb21wbGV0ZWQnLFxuICAgICAgICAgIGpvYjoge1xuICAgICAgICAgICAgaWQ6IGpvYi5pZC50b1N0cmluZyA/IGpvYi5pZC50b1N0cmluZygpIDogam9iLmlkLFxuICAgICAgICAgICAgcnVuczogam9iLmRhdGEucnVucyxcbiAgICAgICAgICAgIHF1ZXVlOiB0aGlzLm5hbWUsXG4gICAgICAgICAgICBzdGF0dXM6IGpvYi5zdGF0dXMsXG4gICAgICAgICAgICBkYXRhOiBqb2JEYXRhLmxlbmd0aCA+IDQwMDAgPyAnPCEgam9iIGRhdGEgdG9vIGxhcmdlIHRvIGRpc3BsYXkgIT4nIDogam9iLmRhdGEuZGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gam9iXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgX2ZpbmlzaFNpbmdsZUpvYihlcnJvciwgZGF0YSwgam9iKSB7XG4gICAgY29uc3QgbXVsdGkgPSB0aGlzLmNsaWVudC5tdWx0aSgpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yID8gJ2ZhaWxlZCcgOiAnc3VjY2VlZGVkJztcbiAgICB0aGlzLl91cGRhdGVKb2JTdGF0dXMoZXJyb3IsIGRhdGEsIGpvYiwgbXVsdGkpO1xuXG4gICAgLy8gZW1pdCBzdWNjZXNzIG9yIGZhaWx1cmUgZXZlbnQgaWYgd2UgaGF2ZSBsaXN0ZW5lcnNcbiAgICBpZiAoZXJyb3IgJiYgam9iLm9wdGlvbnMubm90aWZ5RmFpbHVyZSkge1xuICAgICAgdGhpcy5jb3JlLnB1YnN1Yi5wdWJsaXNoKGpvYi5vcHRpb25zLm5vdGlmeUZhaWx1cmUsIHRoaXMuX2NyZWF0ZUpvYkV2ZW50KGVycm9yLCBkYXRhLCBqb2IpKTtcbiAgICB9IGVsc2UgaWYgKGpvYi5vcHRpb25zLm5vdGlmeVN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMuY29yZS5wdWJzdWIucHVibGlzaChqb2Iub3B0aW9ucy5ub3RpZnlTdWNjZXNzLCB0aGlzLl9jcmVhdGVKb2JFdmVudChlcnJvciwgZGF0YSwgam9iKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG11bHRpLmV4ZWMoZXJyTXVsdGkgPT4ge1xuICAgICAgICBpZiAoZXJyTXVsdGkpIHJldHVybiByZWplY3QoZXJyTXVsdGkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHN0YXR1cywgcmVzdWx0OiBlcnJvciB8fCBkYXRhIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGxldGVzIGEgbXVsdGkgam9iIG9yIGNvbnRpbnVlcyB0byB0aGUgbmV4dCBzdGFnZS5cbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBqb2JcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZmluaXNoUmVsYXlKb2IoZXJyb3IsIGRhdGEsIGpvYikge1xuICAgIGxldCBuZXh0UXVldWUgPSB0aGlzLm5hbWU7XG4gICAgY29uc3QgbmV4dEpvYiA9IGpvYi5kYXRhLnJ1bnNbMF07XG4gICAgY29uc3QgbXVsdGkgPSB0aGlzLmNsaWVudC5tdWx0aSgpO1xuICAgIGNvbnN0IGN1cnJlbnRKb2IgPSBqb2IuZGF0YS5ydW5zLnNoaWZ0KCk7XG4gICAgY29uc3Qgc3RhdHVzID0gZXJyb3IgPyAnZmFpbGVkJyA6ICdzdWNjZWVkZWQnO1xuXG4gICAgLy8ga2VlcCBhIHJlY29yZCBvZiB0aGUgZmlyc3Qgam9iIGluIHRoaXMgcmVsYXkgaW5zdGFuY2VcbiAgICBpZiAoIWpvYi5kYXRhLmluaXRpYWxKb2IpIHtcbiAgICAgIGpvYi5kYXRhLmluaXRpYWxKb2IgPSB0cnlKU09OUGFyc2Uoam9iLnRvRGF0YSgpKTtcbiAgICB9XG5cbiAgICAvLyBrZWVwIGEgcmVjb3JkIG9mIHRoZSBmaXJzdCBxdWV1ZSBpbiB0aGlzIHJlbGF5IGluc3RhbmNlXG4gICAgaWYgKCFqb2IuZGF0YS5pbml0aWFsUXVldWUpIHtcbiAgICAgIGpvYi5kYXRhLmluaXRpYWxRdWV1ZSA9IHRoaXMubmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLl91cGRhdGVKb2JTdGF0dXMoZXJyb3IsIGRhdGEsIGpvYiwgbXVsdGkpO1xuXG4gICAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byByZWxheSB0byBhbm90aGVyIGpvYlxuICAgIGlmICghKGpvYi5kYXRhLnJ1bnMubGVuZ3RoID09PSAwIHx8ICEhZXJyb3IpKSB7XG4gICAgICBpZiAoaXNPYmplY3QobmV4dEpvYikpIHtcbiAgICAgICAgbmV4dFF1ZXVlID0gbmV4dEpvYi5xdWV1ZTtcbiAgICAgICAgam9iLmRhdGEucnVuc1swXSA9IG5leHRKb2IucnVucztcbiAgICAgIH0gZWxzZSBpZiAoam9iLmRhdGEuaW5pdGlhbFF1ZXVlKSB7XG4gICAgICAgIG5leHRRdWV1ZSA9IGpvYi5kYXRhLmluaXRpYWxRdWV1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gYWRkIHNvbWUgZGVidWcgZGF0YSBmb3IgdGhlIG5leHQgam9iXG4gICAgICAvLyBzbyBpdCBjYW4gdGVsbCB3aGVyZSB0aGUgcmVsYXkgb3JpZ2luYXRlZCBmcm9tXG4gICAgICBqb2IuZGF0YS5mcm9tX2pvYiA9IGN1cnJlbnRKb2I7XG4gICAgICBqb2IuZGF0YS5mcm9tX3F1ZXVlID0gdGhpcy5uYW1lO1xuICAgICAgam9iLmRhdGEuZnJvbV90aW1lc3RhbXAgPSBnZXRUaW1lU3RhbXAoKTtcbiAgICAgIC8vIHJlbGF5IHJlc29sdmVkIGRhdGFcbiAgICAgIGpvYi5kYXRhLmRhdGEgPSBkYXRhO1xuXG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb3JlLmhvb2tzLmpvYi5jcmVhdGUobmV4dFF1ZXVlLCBqb2IuZGF0YSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgbXVsdGkuZXhlYyhlcnJNdWx0aSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyTXVsdGkpIHJldHVybiByZWplY3QoZXJyTXVsdGkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBzdGF0dXMsIHJlc3VsdDogZXJyb3IgfHwgZGF0YSB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB3ZSd2ZSBqdXN0IGZpbmlzaGVkIHRoZSBsYXN0IGpvYiBpbiB0aGUgcmVsYXlcbiAgICAvLyBlbWl0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBldmVudCBpZiB3ZSBoYXZlIGxpc3RlbmVyc1xuICAgIGlmIChlcnJvciAmJiBqb2IuZGF0YS5pbml0aWFsSm9iLm9wdGlvbnMubm90aWZ5RmFpbHVyZSkge1xuICAgICAgdGhpcy5jb3JlLnB1YnN1Yi5wdWJsaXNoKGpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlLCB0aGlzLl9jcmVhdGVKb2JFdmVudChlcnJvciwgZGF0YSwgam9iKSk7XG4gICAgfSBlbHNlIGlmIChqb2IuZGF0YS5pbml0aWFsSm9iLm9wdGlvbnMubm90aWZ5U3VjY2Vzcykge1xuICAgICAgdGhpcy5jb3JlLnB1YnN1Yi5wdWJsaXNoKGpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlTdWNjZXNzLCB0aGlzLl9jcmVhdGVKb2JFdmVudChlcnJvciwgZGF0YSwgam9iKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiBtdWx0aS5leGVjKGVyck11bHRpID0+IHtcbiAgICAgICAgaWYgKGVyck11bHRpKSByZXR1cm4gcmVqZWN0KGVyck11bHRpKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBzdGF0dXMsIHJlc3VsdDogZXJyb3IgfHwgZGF0YSB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Mb2NhbFRpY2tDb21wbGV0ZSA9ICgpID0+IHtcbiAgICB0aGlzLnJ1bm5pbmctLTtcbiAgICB0aGlzLnF1ZXVlZC0tO1xuICAgIGlmICghdGhpcy5vcHRpb25zLnRocm90dGxlKSByZXR1cm4gc2V0SW1tZWRpYXRlKHRoaXMuX3F1ZXVlVGljayk7XG5cbiAgICByZXR1cm4gdGhpcy5jbGllbnQudGhyb3R0bGUoXG4gICAgICB0aGlzLnRvS2V5KCd0aHJvdHRsZScpLFxuICAgICAgdGhpcy5vcHRpb25zLnRocm90dGxlLmxpbWl0LFxuICAgICAgdGhpcy5vcHRpb25zLnRocm90dGxlLnNlY29uZHNcbiAgICApLnRoZW4odGhyb3R0bGUgPT4ge1xuICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0aHJvdHRsZVswXSA9PT0gMTtcbiAgICAgIGlmICghc2hvdWxkVGhyb3R0bGUpIHtcbiAgICAgICAgdGhpcy50aHJvdHRsZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHNldEltbWVkaWF0ZSh0aGlzLl9xdWV1ZVRpY2spO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnRocm90dGxlZCA9IHRydWU7XG4gICAgICBjb25zdCB0aW1lUmVtYWluaW5nID0gKHRocm90dGxlWzJdID09PSAwID8gMSA6IHRocm90dGxlWzJdKTtcbiAgICAgIHRoaXMubG9nLnZlcmJvc2UoYCcke3RoaXMubmFtZX0nIHF1ZXVlICByZWFjaGVkIGl0J3MgdGhyb3R0bGUgbGltaXQsIHJlc3VtaW5nIGluICR7dGltZVJlbWFpbmluZ30gc2Vjb25kcy5gKTtcbiAgICAgIHJldHVybiBzZXRUaW1lb3V0KHRoaXMuX3F1ZXVlVGljaywgdGltZVJlbWFpbmluZyAqIDEwMDApO1xuICAgIH0pLmNhdGNoKHRoaXMuX3F1ZXVlVGljayk7XG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uTG9jYWxUaWNrRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICB0aGlzLnF1ZXVlZC0tO1xuICAgIHRoaXMubG9nLmVycm9yKGVycm9yKTtcbiAgICBzZXRJbW1lZGlhdGUodGhpcy5fcXVldWVUaWNrKTtcbiAgfTtcblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcXVldWVUaWNrID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnBhdXNlZCB8fCAhdGhpcy5vcHRpb25zLmVuYWJsZWQpIHtcbiAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgfVxuICAgIHRoaXMucXVldWVkKys7XG4gICAgcmV0dXJuIHRoaXNcbiAgICAuX2dldE5leHRKb2IoKVxuICAgIC50aGVuKGpvYiA9PiB7XG4gICAgICB0aGlzLnJ1bm5pbmcrKztcbiAgICAgIC8vIHF1ZXVlIG1vcmUgam9icyBpZiB3aXRoaW4gbGltaXRcbiAgICAgIGlmICgodGhpcy5ydW5uaW5nICsgdGhpcy5xdWV1ZWQpIDwgdGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgIC8vIGNvbmN1cnJlbmN5IGlzIGEgbGl0dGxlIHBvaW50bGVzcyByaWdodCBub3cgaWYgd2UncmUgdGhyb3R0bGluZyBqb2JzXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRocm90dGxlKSBzZXRJbW1lZGlhdGUodGhpcy5fcXVldWVUaWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3J1bkpvYihqb2IpLnRoZW4odGhpcy5fb25Mb2NhbFRpY2tDb21wbGV0ZSkuY2F0Y2godGhpcy5fb25Mb2NhbFRpY2tDb21wbGV0ZSk7XG4gICAgfSkuY2F0Y2godGhpcy5fb25Mb2NhbFRpY2tFcnJvcik7XG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVzdGFydFByb2Nlc3NpbmcgPSAoKSA9PiB7XG4gICAgdGhpcy5jbGllbnRzLmJsb2NrLm9uY2UoJ3JlYWR5JywgdGhpcy5fcXVldWVUaWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgdGhlIHF1ZXVlLlxuICAgKi9cbiAgYmVnaW5Xb3JraW5nKCkge1xuICAgIGlmICh0aGlzLnN0YXJ0ZWQgfHwgIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBRdWV1ZSAke3RoaXMubmFtZX0gaXMgY3VycmVudGx5IGRpc2FibGVkLmApO1xuICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXVlZCA9IDA7XG4gICAgdGhpcy5ydW5uaW5nID0gMDtcbiAgICB0aGlzLnN0YXJ0ZWQgPSB0cnVlO1xuXG4gICAgdGhpcy5sb2cudmVyYm9zZShgUXVldWUgJyR7dGhpcy5uYW1lfScgLSBzdGFydGVkIHdpdGggYSBjb25jdXJyZW5jeSBvZiAke3RoaXMub3B0aW9ucy5jb25jdXJyZW5jeX0uYCk7XG5cbiAgICB0aGlzLmNsaWVudHMuYmxvY2sub25jZSgnZXJyb3InLCB0aGlzLl9yZXN0YXJ0UHJvY2Vzc2luZyk7XG4gICAgdGhpcy5jbGllbnRzLmJsb2NrLm9uY2UoJ2Nsb3NlJywgdGhpcy5fcmVzdGFydFByb2Nlc3NpbmcpO1xuXG4gICAgdGhpcy5jaGVja1N0YWxsZWRKb2JzKCkudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmxvZy52ZXJib3NlKCdjaGVja1N0YWxsZWRKb2JzIGNvbXBsZXRlZCcpO1xuICAgIH0pLmNhdGNoKCgpID0+IHtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLl9xdWV1ZVRpY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGNoZWNrU3RhbGxlZEpvYnMoKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgJHt0aGlzLm5hbWV9OiBjaGVja1N0YWxsZWRKb2JzYCk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmNoZWNrc3RhbGxlZGpvYnMoXG4gICAgICB0aGlzLnRvS2V5KCdzdGFsbFRpbWUnKSxcbiAgICAgIHRoaXMudG9LZXkoJ3N0YWxsaW5nJyksXG4gICAgICB0aGlzLnRvS2V5KCd3YWl0aW5nJyksXG4gICAgICB0aGlzLnRvS2V5KCdhY3RpdmUnKSxcbiAgICAgIGdldFRpbWVTdGFtcCgpLFxuICAgICAgdGhpcy5vcHRpb25zLnN0YWxsSW50ZXJ2YWxcbiAgICApLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZW5hYmxlZCB8fCB0aGlzLnBhdXNlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgcmV0dXJuIFByb21pc2UuZGVsYXkodGhpcy5vcHRpb25zLnN0YWxsSW50ZXJ2YWwpLnRoZW4oOjp0aGlzLmNoZWNrU3RhbGxlZEpvYnMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBzdHJcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICB0b0tleShzdHIpIHtcbiAgICBpZiAodGhpcy5jb3JlLmNsdXN0ZXIuaXNDbHVzdGVyKCkpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMua2V5UHJlZml4fTp7JHt0aGlzLm5hbWV9fToke3N0cn1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLmtleVByZWZpeH06JHt0aGlzLm5hbWV9OiR7c3RyfWA7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBldmVudFByZWZpeCB0byBhbiBldmVudCBuYW1lXG4gICAqIEBwYXJhbSBldmVudE5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRvRXZlbnROYW1lID0gZXZlbnROYW1lID0+IGBxdWV1ZToke3RoaXMubmFtZX06JHtldmVudE5hbWV9YDtcbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9xdWV1ZS5qcyJdLCJuYW1lcyI6WyJ0cmltU3RhY2siLCJlcnJvclN0YWNrIiwib2xkU3RhY2siLCJzcGxpdCIsInN0YWNrIiwiaSIsImlMZW4iLCJsZW5ndGgiLCJyb3ciLCJpbmNsdWRlcyIsInB1c2giLCJRdWV1ZSIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsImNvcmUiLCJfb25Mb2NhbFRpY2tDb21wbGV0ZSIsInJ1bm5pbmciLCJxdWV1ZWQiLCJ0aHJvdHRsZSIsInNldEltbWVkaWF0ZSIsIl9xdWV1ZVRpY2siLCJjbGllbnQiLCJ0b0tleSIsImxpbWl0Iiwic2Vjb25kcyIsInRoZW4iLCJzaG91bGRUaHJvdHRsZSIsInRocm90dGxlZCIsInRpbWVSZW1haW5pbmciLCJsb2ciLCJ2ZXJib3NlIiwibmFtZSIsInNldFRpbWVvdXQiLCJjYXRjaCIsIl9vbkxvY2FsVGlja0Vycm9yIiwiZXJyb3IiLCJwYXVzZWQiLCJlbmFibGVkIiwidW5kZWZpbmVkIiwiX2dldE5leHRKb2IiLCJlcnIiLCJqb2IiLCJjb25jdXJyZW5jeSIsIl9ydW5Kb2IiLCJfcmVzdGFydFByb2Nlc3NpbmciLCJjbGllbnRzIiwiYmxvY2siLCJvbmNlIiwidG9FdmVudE5hbWUiLCJldmVudE5hbWUiLCJzdGFydGVkIiwiaGFuZGxlciIsIk9iamVjdCIsImFzc2lnbiIsInF1ZXVlIiwiY3JlYXRlQ2xpZW50IiwiZGVzdHJveSIsImtleXMiLCJtYXAiLCJrZXkiLCJkZWwiLCJnZXRTdGF0dXMiLCJtdWx0aSIsImxsZW4iLCJzY2FyZCIsInJlc3VsdHMiLCJ3YWl0aW5nIiwiYWN0aXZlIiwic3VjY2VlZGVkIiwiZmFpbGVkIiwiY2IiLCJicnBvcGxwdXNoIiwicHVzaEVycm9yIiwiam9iSWQiLCJmcm9tSWQiLCJfbG9nSm9iRmFpbHVyZSIsImpvYkVycm9yIiwiRXJyb3IiLCJwcm9jZXNzIiwiZW52IiwiS1VCRVJORVRFU19QT1JUIiwiS1VCRVJORVRFU19TRVJWSUNFX0hPU1QiLCJqb2JEYXRhIiwiSlNPTiIsInN0cmluZ2lmeSIsImRhdGEiLCJjb25zb2xlIiwibGV2ZWwiLCJ0eXBlIiwiaWQiLCJ0b1N0cmluZyIsInJ1bnMiLCJqb2luIiwicmVzb2x2ZSIsIkFycmF5IiwiaXNBcnJheSIsImdsb2JhbCIsInByZXZlbnRTdGFsbGluZ1RpbWVvdXQiLCJoYW5kbGVkIiwicHJvbWlzZU9yUmVzIiwiaGFuZGxlT0siLCJjbGVhclRpbWVvdXQiLCJfaW50ZXJuYWxEYXRhIiwiX2ZpbmlzaFJlbGF5Sm9iIiwiX2ZpbmlzaFNpbmdsZUpvYiIsImhhbmRsZUVycm9yIiwicHJldmVudFN0YWxsaW5nIiwic3JlbSIsInN0YWxsSW50ZXJ2YWwiLCJ0aW1lb3V0IiwiYmluZCIsIm5vQmluZCIsImUiLCJfY3JlYXRlSm9iRXZlbnQiLCJ3b3JrZXJfaWQiLCJzdGF0dXMiLCJvdXRwdXQiLCJfdXBkYXRlSm9iU3RhdHVzIiwibHJlbSIsInJldHJpZXMiLCJoc2V0IiwidG9EYXRhIiwibHB1c2giLCJoZGVsIiwibm90aWZ5RmFpbHVyZSIsInB1YnN1YiIsInB1Ymxpc2giLCJub3RpZnlTdWNjZXNzIiwicmVqZWN0IiwiZXhlYyIsImVyck11bHRpIiwicmVzdWx0IiwibmV4dFF1ZXVlIiwibmV4dEpvYiIsImN1cnJlbnRKb2IiLCJzaGlmdCIsImluaXRpYWxKb2IiLCJpbml0aWFsUXVldWUiLCJmcm9tX2pvYiIsImZyb21fcXVldWUiLCJmcm9tX3RpbWVzdGFtcCIsImhvb2tzIiwiY3JlYXRlIiwiYmVnaW5Xb3JraW5nIiwiaW5mbyIsImNoZWNrU3RhbGxlZEpvYnMiLCJjaGVja3N0YWxsZWRqb2JzIiwic3RyIiwiY2x1c3RlciIsImlzQ2x1c3RlciIsImtleVByZWZpeCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7QUFDQTs7OztBQUNBOzs7O0FBRUE7Ozs7QUFDQTs7Ozs7O0FBRUE7Ozs7O0FBS0EsU0FBU0EsU0FBVCxDQUFtQkMsVUFBbkIsRUFBK0I7QUFDN0IsUUFBTUMsV0FBV0Qs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Iiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVlcEdldCwgaXNPYmplY3QsIGdldFRpbWVTdGFtcCwgdHJ5SlNPTlBhcnNlIH0gZnJvbSAncmVkaWJveCc7XG5pbXBvcnQgUHJvbWlzZSBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuXG5pbXBvcnQgSm9iIGZyb20gJy4vam9iJztcbmltcG9ydCBkZWZhdWx0cyBmcm9tICcuL2RlZmF1bHRzJztcblxuLyoqXG4gKiBUT0RPIG1vdmUgdG8gaGVscGVyc1xuICogQHBhcmFtIGVycm9yU3RhY2tcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gdHJpbVN0YWNrKGVycm9yU3RhY2spIHtcbiAgY29uc3Qgb2xkU3RhY2sgPSBlcnJvclN0YWNrLnNwbGl0KCdcXG4nKTtcbiAgY29uc3Qgc3RhY2sgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDAsIGlMZW4gPSBvbGRTdGFjay5sZW5ndGggfHwgc3RhY2subGVuZ3RoID4gMTk7IGkgPCBpTGVuOyBpKyspIHtcbiAgICBjb25zdCByb3cgPSBvbGRTdGFja1tpXTtcblxuICAgIC8vIGluY2x1ZGUgcHJpdmF0ZSBtb2R1bGVzXG4gICAgaWYgKHJvdy5pbmNsdWRlcygnQCcpKSB7XG4gICAgICBzdGFjay5wdXNoKHJvdyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBleGNsdWRlIGpvYiBtb2R1bGVcbiAgICBpZiAocm93LmluY2x1ZGVzKCdyZWRpYm94LWhvb2stam9iJykgfHwgcm93LmluY2x1ZGVzKCdyZWRpYm94L2pvYi9saWInKSkgY29udGludWU7XG5cbiAgICAvLyBleGNsdWRlIGJsdWViaXJkXG4gICAgaWYgKHJvdy5pbmNsdWRlcygnYmx1ZWJpcmQnKSkgY29udGludWU7XG5cbiAgICAvLyBleGNsdWRlIHdhdGVybGluZVxuICAgIGlmIChyb3cuaW5jbHVkZXMoJ3dhdGVybGluZS9saWInKSkgY29udGludWU7XG5cbiAgICAvLyBleGNsdWRlIHdhdGVybGluZVxuICAgIGlmIChyb3cuaW5jbHVkZXMoJ2FzeW5jL2xpYicpKSBjb250aW51ZTtcblxuICAgIC8vIGV4Y2x1ZGUgdGltZXJzLmpzXG4gICAgaWYgKHJvdy5pbmNsdWRlcygndGltZXJzLmpzOicpKSBjb250aW51ZTtcblxuICAgIHN0YWNrLnB1c2gocm93KTtcbiAgfVxuXG4gIHJldHVybiBzdGFjaztcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUXVldWUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0gY29yZVxuICAgKiBAcmV0dXJucyB7UXVldWV9XG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb3JlKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvcmUgPSBjb3JlO1xuICAgIHRoaXMucGF1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5zdGFydGVkID0gZmFsc2U7XG4gICAgdGhpcy50aHJvdHRsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmxvZyA9IHRoaXMuY29yZS5sb2c7XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgIHRoaXMuY2xpZW50ID0gY29yZS5jbGllbnQ7XG4gICAgdGhpcy5oYW5kbGVyID0gb3B0aW9ucy5oYW5kbGVyIHx8IG51bGw7XG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMucXVldWUsIG9wdGlvbnMgfHwge30pO1xuICAgIHRoaXMuY29yZS5jcmVhdGVDbGllbnQoJ2Jsb2NrJywgdGhpcyk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIGNvbnN0IGtleXMgPSBbXG4gICAgICAnaWQnLCAnam9icycsICdzdGFsbFRpbWUnLCAnc3RhbGxpbmcnLCAnd2FpdGluZycsICdhY3RpdmUnLCAnc3VjY2VlZGVkJywgJ2ZhaWxlZCcsXG4gICAgXS5tYXAoa2V5ID0+IHRoaXMudG9LZXkoa2V5KSk7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LmRlbCguLi5rZXlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAgICovXG4gIGdldFN0YXR1cygpIHtcbiAgICByZXR1cm4gdGhpc1xuICAgICAgLmNsaWVudC5tdWx0aSgpXG4gICAgICAubGxlbih0aGlzLnRvS2V5KCd3YWl0aW5nJykpXG4gICAgICAubGxlbih0aGlzLnRvS2V5KCdhY3RpdmUnKSlcbiAgICAgIC5zY2FyZCh0aGlzLnRvS2V5KCdzdWNjZWVkZWQnKSlcbiAgICAgIC5zY2FyZCh0aGlzLnRvS2V5KCdmYWlsZWQnKSlcbiAgICAgIC50aGVuKChyZXN1bHRzKSA9PiB7IC8qIGVzbGludCBhcnJvdy1ib2R5LXN0eWxlOiAwICovXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgd2FpdGluZzogcmVzdWx0c1swXVsxXSxcbiAgICAgICAgICBhY3RpdmU6IHJlc3VsdHNbMV1bMV0sXG4gICAgICAgICAgc3VjY2VlZGVkOiByZXN1bHRzWzJdWzFdLFxuICAgICAgICAgIGZhaWxlZDogcmVzdWx0c1szXVsxXSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgX2dldE5leHRKb2IoY2IpIHtcbiAgICB0aGlzLmxvZy52ZXJib3NlKGBHZXR0aW5nIG5leHQgam9iIGZvciBxdWV1ZSAnJHt0aGlzLm5hbWV9Jy5gKTtcbiAgICB0aGlzLmNsaWVudHMuYmxvY2suYnJwb3BscHVzaChcbiAgICAgIHRoaXMudG9LZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMudG9LZXkoJ2FjdGl2ZScpLCAwLFxuICAgICAgKHB1c2hFcnJvciwgam9iSWQpID0+IHB1c2hFcnJvciA/IGNiKHB1c2hFcnJvcikgOiBKb2IuZnJvbUlkKHRoaXMsIGpvYklkKS50aGVuKGpvYiA9PiBjYihudWxsLCBqb2IpKS5jYXRjaChlcnIgPT4gY2IoZXJyKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBqb2JcbiAgICogQHBhcmFtIGpvYkVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfbG9nSm9iRmFpbHVyZShqb2IsIGpvYkVycm9yKSB7XG4gICAgY29uc3QgZXJyb3IgPSB0eXBlb2Ygam9iRXJyb3IgPT09ICdzdHJpbmcnID8gbmV3IEVycm9yKGpvYkVycm9yKSA6IGpvYkVycm9yO1xuICAgIGNvbnN0IHN0YWNrID0gdHJpbVN0YWNrKGVycm9yLnN0YWNrKTtcblxuICAgIC8vIFRPRE8gYWxsb3cgaG9va2luZyBpbnRvIHRoaXMgZXZlbnQgcmF0aGVyIHRoYW4gdXMgZG9pbmcgdGhpcyBwb29wIGhlcmVcbiAgICBpZiAocHJvY2Vzcy5lbnYuS1VCRVJORVRFU19QT1JUIHx8IHByb2Nlc3MuZW52LktVQkVSTkVURVNfU0VSVklDRV9IT1NUKSB7XG4gICAgICAvKiBlc2xpbnQgbm8tY29uc29sZTogMCAqL1xuICAgICAgY29uc3Qgam9iRGF0YSA9IEpTT04uc3RyaW5naWZ5KGpvYi5kYXRhLmRhdGEgfHwge30pO1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgICAgdHlwZTogJ3JlZGlib3hfam9iX2ZhaWx1cmUnLFxuICAgICAgICBqb2I6IHtcbiAgICAgICAgICBpZDogam9iLmlkLnRvU3RyaW5nID8gam9iLmlkLnRvU3RyaW5nKCkgOiBqb2IuaWQsXG4gICAgICAgICAgcnVuczogam9iLmRhdGEucnVucyxcbiAgICAgICAgICBxdWV1ZTogdGhpcy5uYW1lLFxuICAgICAgICAgIGRhdGE6IGpvYkRhdGEubGVuZ3RoID4gNDAwMCA/ICc8ISBqb2IgZGF0YSB0b28gbGFyZ2UgdG8gZGlzcGxheSAhPicgOiBqb2IuZGF0YS5kYXRhLFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICB9LFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcignJyk7XG4gICAgICB0aGlzLmxvZy5lcnJvcignLS0tLS0tLS0tLS0tLS0tIFJEQiBKT0IgRVJST1IvRkFJTFVSRSAtLS0tLS0tLS0tLS0tLS0nKTtcbiAgICAgIHRoaXMubG9nLmVycm9yKGBKb2I6ICR7am9iLmRhdGEucnVuc31gIHx8IHRoaXMubmFtZSk7XG4gICAgICBlcnJvci5zdGFjayA9IHN0YWNrLmpvaW4oJ1xcbicpO1xuICAgICAgdGhpcy5sb2cuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5sb2cuZXJyb3IoJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgdGhpcy5sb2cuZXJyb3IoJycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gam9iXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKi9cbiAgX3J1bkpvYihqb2IpIHtcbiAgICBpZiAoIWpvYiB8fCAham9iLmRhdGEpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICBjb25zdCBydW5zID0gam9iLmRhdGEgJiYgam9iLmRhdGEucnVucyAmJiBBcnJheS5pc0FycmF5KGpvYi5kYXRhLnJ1bnMpID8gam9iLmRhdGEucnVuc1swXSA6IGpvYi5kYXRhLnJ1bnM7XG4gICAgY29uc3QgaGFuZGxlciA9ICh0eXBlb2YgdGhpcy5oYW5kbGVyID09PSAnc3RyaW5nJyA/IGRlZXBHZXQoZ2xvYmFsLCB0aGlzLmhhbmRsZXIpIDogdGhpcy5oYW5kbGVyKSB8fCBkZWVwR2V0KGdsb2JhbCwgcnVucyk7XG5cbiAgICBsZXQgcHJldmVudFN0YWxsaW5nVGltZW91dDtcbiAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuICAgIGxldCBwcm9taXNlT3JSZXM7XG5cbiAgICAvLyBIYW5kbGUgYW4gXCJPS1wiIHJlc3BvbnNlIGZyb20gdGhlIHByb21pc2VcbiAgICBjb25zdCBoYW5kbGVPSyA9IChkYXRhKSA9PiB7XG4gICAgICAvLyBzaWxlbnRseSBpZ25vcmUgYW55IG11bHRpcGxlIGNhbGxzXG4gICAgICBpZiAoaGFuZGxlZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgY2xlYXJUaW1lb3V0KHByZXZlbnRTdGFsbGluZ1RpbWVvdXQpO1xuICAgICAgaGFuZGxlZCA9IHRydWU7XG5cbiAgICAgIC8vIHNldCB0aGUgZGF0YSBiYWNrIHRvIGludGVybmFsIGRhdGFcbiAgICAgIGlmIChqb2IuX2ludGVybmFsRGF0YSkge1xuICAgICAgICBqb2IuZGF0YSA9IGpvYi5faW50ZXJuYWxEYXRhO1xuICAgICAgfVxuXG4gICAgICAvLyBvbmx5IHJlbGF5IHRvIG5leHQgam9iIGlmIHVzZXIgZGlkIG5vdCByZXNvbHZlICdmYWxzZScgb24gY3VycmVudCBqb2JcbiAgICAgIGlmIChqb2IudHlwZSA9PT0gJ3JlbGF5JyAmJiBkYXRhICE9PSBmYWxzZSkgcmV0dXJuIHRoaXMuX2ZpbmlzaFJlbGF5Sm9iKG51bGwsIGRhdGEsIGpvYik7XG4gICAgICByZXR1cm4gdGhpcy5fZmluaXNoU2luZ2xlSm9iKG51bGwsIGRhdGEsIGpvYik7XG4gICAgfTtcblxuICAgIC8vIEhhbmRsZSBhbnkgZXJyb3JzIHJldHVybmVkXG4gICAgY29uc3QgaGFuZGxlRXJyb3IgPSAoam9iRXJyb3IpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChwcmV2ZW50U3RhbGxpbmdUaW1lb3V0KTtcblxuICAgICAgLy8gc2lsZW50bHkgaWdub3JlIGFueSBtdWx0aXBsZSBjYWxsc1xuICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgaGFuZGxlZCA9IHRydWU7XG5cbiAgICAgIC8vIHNldCB0aGUgZGF0YSBiYWNrIHRvIGludGVybmFsIGpvYiBkYXRhXG4gICAgICBpZiAoam9iLl9pbnRlcm5hbERhdGEpIHtcbiAgICAgICAgam9iLmRhdGEgPSBqb2IuX2ludGVybmFsRGF0YTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbG9nSm9iRmFpbHVyZShqb2IsIGpvYkVycm9yKTtcblxuICAgICAgaWYgKGpvYi50eXBlID09PSAncmVsYXknKSByZXR1cm4gdGhpcy5fZmluaXNoUmVsYXlKb2Ioam9iRXJyb3IsIG51bGwsIGpvYik7XG4gICAgICByZXR1cm4gdGhpcy5fZmluaXNoU2luZ2xlSm9iKGpvYkVycm9yLCBudWxsLCBqb2IpO1xuICAgIH07XG5cbiAgICBjb25zdCBwcmV2ZW50U3RhbGxpbmcgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNsaWVudC5zcmVtKHRoaXMudG9LZXkoJ3N0YWxsaW5nJyksIGpvYi5pZCwgKCkgPT4ge1xuICAgICAgICBpZiAoIWhhbmRsZWQpIHtcbiAgICAgICAgICBwcmV2ZW50U3RhbGxpbmdUaW1lb3V0ID0gc2V0VGltZW91dChwcmV2ZW50U3RhbGxpbmcsIHRoaXMub3B0aW9ucy5zdGFsbEludGVydmFsIC8gMyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHJldHVybiBoYW5kbGVFcnJvcihcbiAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgIGBcIiR7am9iLmRhdGEucnVucyB8fCAnTm8gSm9iIEhhbmRsZXIgU3BlY2lmaWVkJ31cIiB3YXMgbm90IGZvdW5kLiBTa2lwcGluZyBqb2IuIFRvIGZpeCB0aGlzXG4gICAgICAgICAgICAgeW91IG11c3QgZWl0aGVyIHNwZWNpZnkgYSBoYW5kbGVyIGZ1bmN0aW9uIHZpYSBxdWV1ZS5wcm9jZXNzKCkgb3IgcHJvdmlkZSBhIHZhbGlkIGhhbmRsZXJcbiAgICAgICAgICAgICBub2RlIGdsb2JhbCBwYXRoIGluIHlvdXIgam9iIG9wdGlvbnMgJ2hhbmRsZXInLCBlLmcuIGlmIHlvdSBoYWQgYSBnbG9iYWwgZnVuY3Rpb24gaW5cbiAgICAgICAgICAgICdnbG9iYWwuc2FpbHMuc2VydmljZXMubXlzZXJ2aWNlJyB5b3UnZCBzcGVjaWZ5IHRoZSBoYW5kbGVyIGFzICdzYWlscy5zZXJ2aWNlcy5teXNlcnZpY2UubXlIYW5kbGVyJy5gXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gc3RhcnQgc3RhbGxpbmcgbW9uaXRvcmluZ1xuICAgIHByZXZlbnRTdGFsbGluZygpO1xuXG4gICAgam9iLl9pbnRlcm5hbERhdGEgPSBqb2IuZGF0YTtcblxuICAgIGpvYi5kYXRhID0gam9iLmRhdGEuZGF0YSB8fCBqb2IuZGF0YTtcblxuICAgIGlmIChqb2Iub3B0aW9ucy50aW1lb3V0KSB7XG4gICAgICBzZXRUaW1lb3V0KGhhbmRsZUVycm9yLmJpbmQobnVsbCwgRXJyb3IoYEpvYiAke2pvYi5pZH0gdGltZWQgb3V0ICgke2pvYi5vcHRpb25zLnRpbWVvdXR9bXMpYCkpLCBqb2Iub3B0aW9ucy50aW1lb3V0KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgaWYgKGpvYi5vcHRpb25zLm5vQmluZCB8fCB0aGlzLm9wdGlvbnMubm9CaW5kKSB7XG4gICAgICAgIHByb21pc2VPclJlcyA9IGhhbmRsZXIoam9iKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb21pc2VPclJlcyA9IGhhbmRsZXIuYmluZChqb2IsIGpvYikoam9iKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gaGFuZGxlRXJyb3IoZSk7XG4gICAgfVxuXG4gICAgaWYgKHByb21pc2VPclJlcyAmJiBwcm9taXNlT3JSZXMudGhlbiAmJiB0eXBlb2YgcHJvbWlzZU9yUmVzLnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBwcm9taXNlT3JSZXMudGhlbihoYW5kbGVPSywgaGFuZGxlRXJyb3IpLmNhdGNoKGhhbmRsZUVycm9yKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlT0socHJvbWlzZU9yUmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIGpvYlxuICAgKiBAcmV0dXJucyB7e2pvYjoge2lkOiAqLCB3b3JrZXJfaWQ6ICgqfFN0cmluZ3xzdHJpbmcpLCBzdGF0dXM6IHN0cmluZ30sIGVycm9yOiAqLCBvdXRwdXQ6ICp9fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NyZWF0ZUpvYkV2ZW50KGVycm9yLCBkYXRhLCBqb2IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgam9iOiB7XG4gICAgICAgIGlkOiBqb2IuaWQsXG4gICAgICAgIHdvcmtlcl9pZDogdGhpcy5jb3JlLmlkLFxuICAgICAgICBzdGF0dXM6IGVycm9yID8gJ2ZhaWxlZCcgOiAnc3VjY2VlZGVkJyxcbiAgICAgICAgLi4uam9iLmRhdGEsXG4gICAgICB9LFxuICAgICAgZXJyb3IsXG4gICAgICBvdXRwdXQ6IGRhdGEsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gZXJyb3JcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIGpvYlxuICAgKiBAcGFyYW0gbXVsdGlcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF91cGRhdGVKb2JTdGF0dXMoZXJyb3IsIGRhdGEsIGpvYiwgbXVsdGkpIHtcbiAgICBjb25zdCBzdGF0dXMgPSBlcnJvciA/ICdmYWlsZWQnIDogJ3N1Y2NlZWRlZCc7XG5cbiAgICBtdWx0aS5scmVtKHRoaXMudG9LZXkoJ2FjdGl2ZScpLCAwLCBqb2IuaWQpO1xuICAgIG11bHRpLnNyZW0odGhpcy50b0tleSgnc3RhbGxpbmcnKSwgam9iLmlkKTtcblxuICAgIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgICBpZiAoam9iLm9wdGlvbnMucmV0cmllcyA+IDApIHtcbiAgICAgICAgam9iLm9wdGlvbnMucmV0cmllcyAtPSAxO1xuICAgICAgICBqb2Iuc3RhdHVzID0gJ3JldHJ5aW5nJztcbiAgICAgICAgbXVsdGkuaHNldCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCwgam9iLnRvRGF0YSgpKTtcbiAgICAgICAgbXVsdGkubHB1c2godGhpcy50b0tleSgnd2FpdGluZycpLCBqb2IuaWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgam9iLnN0YXR1cyA9ICdmYWlsZWQnO1xuICAgICAgICBtdWx0aS5oZGVsKHRoaXMudG9LZXkoJ2pvYnMnKSwgam9iLmlkKTtcblxuICAgICAgICAvLyBUT0RPIHRyYWNrIGZhaWx1cmVzIGFuZCB0aGVpciBkYXRhIHNvbWV3aGVyZSBlbHNlIGZvciByZXZpZXdpbmdcbiAgICAgICAgLy8gbXVsdGkuaHNldCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCwgam9iLnRvRGF0YSgpKTtcbiAgICAgICAgLy8gbXVsdGkuc2FkZCh0aGlzLnRvS2V5KCdmYWlsZWQnKSwgam9iLmlkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgam9iLnN0YXR1cyA9ICdzdWNjZWVkZWQnO1xuICAgICAgbXVsdGkuaGRlbCh0aGlzLnRvS2V5KCdqb2JzJyksIGpvYi5pZCk7XG5cbiAgICAgIC8vIFRPRE8gdHJhY2sgc3VjY2Vzc2VzIGFuZCB0aGVpciBkYXRhIHNvbWV3aGVyZSBlbHNlIGZvciByZXZpZXdpbmdcbiAgICAgIC8vIG11bHRpLmhzZXQodGhpcy50b0tleSgnam9icycpLCBqb2IuaWQsIGpvYi50b0RhdGEoKSk7XG4gICAgICAvLyBtdWx0aS5zYWRkKHRoaXMudG9LZXkoJ3N1Y2NlZWRlZCcpLCBqb2IuaWQpO1xuXG4gICAgICAvLyBUT0RPIGFsbG93IGhvb2tpbmcgaW50byB0aGlzIGV2ZW50IHJhdGhlciB0aGFuIHVzIGRvaW5nIHRoaXMgcG9vcCBoZXJlXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuS1VCRVJORVRFU19QT1JUIHx8IHByb2Nlc3MuZW52LktVQkVSTkVURVNfU0VSVklDRV9IT1NUKSB7XG4gICAgICAgIC8qIGVzbGludCBuby1jb25zb2xlOiAwICovXG4gICAgICAgIGNvbnN0IGpvYkRhdGEgPSBKU09OLnN0cmluZ2lmeShqb2IuZGF0YS5kYXRhIHx8IHt9KTtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIGxldmVsOiAndmVyYm9zZScsXG4gICAgICAgICAgdHlwZTogJ3JlZGlib3hfam9iX2NvbXBsZXRlZCcsXG4gICAgICAgICAgam9iOiB7XG4gICAgICAgICAgICBpZDogam9iLmlkLnRvU3RyaW5nID8gam9iLmlkLnRvU3RyaW5nKCkgOiBqb2IuaWQsXG4gICAgICAgICAgICBydW5zOiBqb2IuZGF0YS5ydW5zLFxuICAgICAgICAgICAgcXVldWU6IHRoaXMubmFtZSxcbiAgICAgICAgICAgIHN0YXR1czogam9iLnN0YXR1cyxcbiAgICAgICAgICAgIGRhdGE6IGpvYkRhdGEubGVuZ3RoID4gNDAwMCA/ICc8ISBqb2IgZGF0YSB0b28gbGFyZ2UgdG8gZGlzcGxheSAhPicgOiBqb2IuZGF0YS5kYXRhLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSBqb2JcbiAgICogQHJldHVybnMge1Byb21pc2V9XG4gICAqL1xuICBfZmluaXNoU2luZ2xlSm9iKGVycm9yLCBkYXRhLCBqb2IpIHtcbiAgICBjb25zdCBtdWx0aSA9IHRoaXMuY2xpZW50Lm11bHRpKCk7XG4gICAgY29uc3Qgc3RhdHVzID0gZXJyb3IgPyAnZmFpbGVkJyA6ICdzdWNjZWVkZWQnO1xuICAgIHRoaXMuX3VwZGF0ZUpvYlN0YXR1cyhlcnJvciwgZGF0YSwgam9iLCBtdWx0aSk7XG5cbiAgICAvLyBlbWl0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBldmVudCBpZiB3ZSBoYXZlIGxpc3RlbmVyc1xuICAgIGlmIChlcnJvciAmJiBqb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlKSB7XG4gICAgICB0aGlzLmNvcmUucHVic3ViLnB1Ymxpc2goam9iLm9wdGlvbnMubm90aWZ5RmFpbHVyZSwgdGhpcy5fY3JlYXRlSm9iRXZlbnQoZXJyb3IsIGRhdGEsIGpvYikpO1xuICAgIH0gZWxzZSBpZiAoam9iLm9wdGlvbnMubm90aWZ5U3VjY2Vzcykge1xuICAgICAgdGhpcy5jb3JlLnB1YnN1Yi5wdWJsaXNoKGpvYi5vcHRpb25zLm5vdGlmeVN1Y2Nlc3MsIHRoaXMuX2NyZWF0ZUpvYkV2ZW50KGVycm9yLCBkYXRhLCBqb2IpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbXVsdGkuZXhlYygoZXJyTXVsdGkpID0+IHtcbiAgICAgICAgaWYgKGVyck11bHRpKSByZXR1cm4gcmVqZWN0KGVyck11bHRpKTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBzdGF0dXMsIHJlc3VsdDogZXJyb3IgfHwgZGF0YSB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBsZXRlcyBhIG11bHRpIGpvYiBvciBjb250aW51ZXMgdG8gdGhlIG5leHQgc3RhZ2UuXG4gICAqIEBwYXJhbSBlcnJvclxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gam9iXG4gICAqIEByZXR1cm5zIHtQcm9taXNlfVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZpbmlzaFJlbGF5Sm9iKGVycm9yLCBkYXRhLCBqb2IpIHtcbiAgICBsZXQgbmV4dFF1ZXVlID0gdGhpcy5uYW1lO1xuICAgIGNvbnN0IG5leHRKb2IgPSBqb2IuZGF0YS5ydW5zWzBdO1xuICAgIGNvbnN0IG11bHRpID0gdGhpcy5jbGllbnQubXVsdGkoKTtcbiAgICBjb25zdCBjdXJyZW50Sm9iID0gam9iLmRhdGEucnVucy5zaGlmdCgpO1xuICAgIGNvbnN0IHN0YXR1cyA9IGVycm9yID8gJ2ZhaWxlZCcgOiAnc3VjY2VlZGVkJztcblxuICAgIC8vIGtlZXAgYSByZWNvcmQgb2YgdGhlIGZpcnN0IGpvYiBpbiB0aGlzIHJlbGF5IGluc3RhbmNlXG4gICAgaWYgKCFqb2IuZGF0YS5pbml0aWFsSm9iKSB7XG4gICAgICBqb2IuZGF0YS5pbml0aWFsSm9iID0gdHJ5SlNPTlBhcnNlKGpvYi50b0RhdGEoKSk7XG4gICAgfVxuXG4gICAgLy8ga2VlcCBhIHJlY29yZCBvZiB0aGUgZmlyc3QgcXVldWUgaW4gdGhpcyByZWxheSBpbnN0YW5jZVxuICAgIGlmICgham9iLmRhdGEuaW5pdGlhbFF1ZXVlKSB7XG4gICAgICBqb2IuZGF0YS5pbml0aWFsUXVldWUgPSB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlSm9iU3RhdHVzKGVycm9yLCBkYXRhLCBqb2IsIG11bHRpKTtcblxuICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVsYXkgdG8gYW5vdGhlciBqb2JcbiAgICBpZiAoIShqb2IuZGF0YS5ydW5zLmxlbmd0aCA9PT0gMCB8fCAhIWVycm9yKSkge1xuICAgICAgaWYgKGlzT2JqZWN0KG5leHRKb2IpKSB7XG4gICAgICAgIG5leHRRdWV1ZSA9IG5leHRKb2IucXVldWU7XG4gICAgICAgIGpvYi5kYXRhLnJ1bnNbMF0gPSBuZXh0Sm9iLnJ1bnM7XG4gICAgICB9IGVsc2UgaWYgKGpvYi5kYXRhLmluaXRpYWxRdWV1ZSkge1xuICAgICAgICBuZXh0UXVldWUgPSBqb2IuZGF0YS5pbml0aWFsUXVldWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGFkZCBzb21lIGRlYnVnIGRhdGEgZm9yIHRoZSBuZXh0IGpvYlxuICAgICAgLy8gc28gaXQgY2FuIHRlbGwgd2hlcmUgdGhlIHJlbGF5IG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgam9iLmRhdGEuZnJvbV9qb2IgPSBjdXJyZW50Sm9iO1xuICAgICAgam9iLmRhdGEuZnJvbV9xdWV1ZSA9IHRoaXMubmFtZTtcbiAgICAgIGpvYi5kYXRhLmZyb21fdGltZXN0YW1wID0gZ2V0VGltZVN0YW1wKCk7XG4gICAgICAvLyByZWxheSByZXNvbHZlZCBkYXRhXG4gICAgICBqb2IuZGF0YS5kYXRhID0gZGF0YTtcblxuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29yZS5ob29rcy5qb2IuY3JlYXRlKG5leHRRdWV1ZSwgam9iLmRhdGEpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIG11bHRpLmV4ZWMoKGVyck11bHRpKSA9PiB7XG4gICAgICAgICAgICBpZiAoZXJyTXVsdGkpIHJldHVybiByZWplY3QoZXJyTXVsdGkpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoeyBzdGF0dXMsIHJlc3VsdDogZXJyb3IgfHwgZGF0YSB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyB3ZSd2ZSBqdXN0IGZpbmlzaGVkIHRoZSBsYXN0IGpvYiBpbiB0aGUgcmVsYXlcbiAgICAvLyBlbWl0IHN1Y2Nlc3Mgb3IgZmFpbHVyZSBldmVudCBpZiB3ZSBoYXZlIGxpc3RlbmVyc1xuICAgIGlmIChlcnJvciAmJiBqb2IuZGF0YS5pbml0aWFsSm9iLm9wdGlvbnMubm90aWZ5RmFpbHVyZSkge1xuICAgICAgdGhpcy5jb3JlLnB1YnN1Yi5wdWJsaXNoKGpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlGYWlsdXJlLCB0aGlzLl9jcmVhdGVKb2JFdmVudChlcnJvciwgZGF0YSwgam9iKSk7XG4gICAgfSBlbHNlIGlmIChqb2IuZGF0YS5pbml0aWFsSm9iLm9wdGlvbnMubm90aWZ5U3VjY2Vzcykge1xuICAgICAgdGhpcy5jb3JlLnB1YnN1Yi5wdWJsaXNoKGpvYi5kYXRhLmluaXRpYWxKb2Iub3B0aW9ucy5ub3RpZnlTdWNjZXNzLCB0aGlzLl9jcmVhdGVKb2JFdmVudChlcnJvciwgZGF0YSwgam9iKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHJldHVybiBtdWx0aS5leGVjKChlcnJNdWx0aSkgPT4ge1xuICAgICAgICBpZiAoZXJyTXVsdGkpIHJldHVybiByZWplY3QoZXJyTXVsdGkpO1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7IHN0YXR1cywgcmVzdWx0OiBlcnJvciB8fCBkYXRhIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkxvY2FsVGlja0NvbXBsZXRlID0gKCkgPT4ge1xuICAgIHRoaXMucnVubmluZyAtPSAxO1xuICAgIHRoaXMucXVldWVkIC09IDE7XG5cbiAgICBpZiAoIXRoaXMub3B0aW9ucy50aHJvdHRsZSkgcmV0dXJuIHNldEltbWVkaWF0ZSh0aGlzLl9xdWV1ZVRpY2spO1xuXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnRocm90dGxlKFxuICAgICAgdGhpcy50b0tleSgndGhyb3R0bGUnKSxcbiAgICAgIHRoaXMub3B0aW9ucy50aHJvdHRsZS5saW1pdCxcbiAgICAgIHRoaXMub3B0aW9ucy50aHJvdHRsZS5zZWNvbmRzXG4gICAgKS50aGVuKCh0aHJvdHRsZSkgPT4ge1xuICAgICAgY29uc3Qgc2hvdWxkVGhyb3R0bGUgPSB0aHJvdHRsZVswXSA9PT0gMTtcblxuICAgICAgaWYgKCFzaG91bGRUaHJvdHRsZSkge1xuICAgICAgICB0aGlzLnRocm90dGxlZCA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gc2V0SW1tZWRpYXRlKHRoaXMuX3F1ZXVlVGljayk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudGhyb3R0bGVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHRpbWVSZW1haW5pbmcgPSAodGhyb3R0bGVbMl0gPT09IDAgPyAxIDogdGhyb3R0bGVbMl0pO1xuICAgICAgdGhpcy5sb2cudmVyYm9zZShgJyR7dGhpcy5uYW1lfScgcXVldWUgIHJlYWNoZWQgaXQncyB0aHJvdHRsZSBsaW1pdCwgcmVzdW1pbmcgaW4gJHt0aW1lUmVtYWluaW5nfSBzZWNvbmRzLmApO1xuICAgICAgcmV0dXJuIHNldFRpbWVvdXQodGhpcy5fcXVldWVUaWNrLCB0aW1lUmVtYWluaW5nICogMTAwMCk7XG4gICAgfSkuY2F0Y2godGhpcy5fcXVldWVUaWNrKTtcbiAgfTtcblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIGVycm9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Mb2NhbFRpY2tFcnJvciA9IChlcnJvcikgPT4ge1xuICAgIHRoaXMucXVldWVkIC09IDE7XG4gICAgdGhpcy5sb2cuZXJyb3IoZXJyb3IpO1xuICAgIHNldEltbWVkaWF0ZSh0aGlzLl9xdWV1ZVRpY2spO1xuICB9O1xuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9xdWV1ZVRpY2sgPSAoKSA9PiB7XG4gICAgaWYgKHRoaXMucGF1c2VkIHx8ICF0aGlzLm9wdGlvbnMuZW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnF1ZXVlZCArPSAxO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dldE5leHRKb2IoKGVyciwgam9iKSA9PiB7XG4gICAgICBpZiAoZXJyKSByZXR1cm4gdGhpcy5fb25Mb2NhbFRpY2tFcnJvcihlcnIpO1xuICAgICAgdGhpcy5ydW5uaW5nICs9IDE7XG5cbiAgICAgIC8vIHF1ZXVlIG1vcmUgam9icyBpZiB3aXRoaW4gbGltaXRcbiAgICAgIGlmICgodGhpcy5ydW5uaW5nICsgdGhpcy5xdWV1ZWQpIDwgdGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5KSB7XG4gICAgICAgIC8vIGNvbmN1cnJlbmN5IGlzIGEgbGl0dGxlIHBvaW50bGVzcyByaWdodCBub3cgaWYgd2UncmUgdGhyb3R0bGluZyBqb2JzXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLnRocm90dGxlKSBzZXRJbW1lZGlhdGUodGhpcy5fcXVldWVUaWNrKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3J1bkpvYihqb2IpLnRoZW4odGhpcy5fb25Mb2NhbFRpY2tDb21wbGV0ZSkuY2F0Y2godGhpcy5fb25Mb2NhbFRpY2tDb21wbGV0ZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVzdGFydFByb2Nlc3NpbmcgPSAoKSA9PiB7XG4gICAgdGhpcy5jbGllbnRzLmJsb2NrLm9uY2UoJ3JlYWR5JywgdGhpcy5fcXVldWVUaWNrKTtcbiAgfTtcblxuICAvKipcbiAgICogU3RhcnQgdGhlIHF1ZXVlLlxuICAgKi9cbiAgYmVnaW5Xb3JraW5nKCkge1xuICAgIGlmICh0aGlzLnN0YXJ0ZWQgfHwgIXRoaXMub3B0aW9ucy5lbmFibGVkKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBRdWV1ZSAke3RoaXMubmFtZX0gaXMgY3VycmVudGx5IGRpc2FibGVkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucXVldWVkID0gMDtcbiAgICB0aGlzLnJ1bm5pbmcgPSAwO1xuICAgIHRoaXMuc3RhcnRlZCA9IHRydWU7XG5cbiAgICB0aGlzLmxvZy52ZXJib3NlKGBRdWV1ZSAnJHt0aGlzLm5hbWV9JyAtIHN0YXJ0ZWQgd2l0aCBhIGNvbmN1cnJlbmN5IG9mICR7dGhpcy5vcHRpb25zLmNvbmN1cnJlbmN5fS5gKTtcblxuICAgIHRoaXMuY2xpZW50cy5ibG9jay5vbmNlKCdlcnJvcicsIHRoaXMuX3Jlc3RhcnRQcm9jZXNzaW5nKTtcbiAgICB0aGlzLmNsaWVudHMuYmxvY2sub25jZSgnY2xvc2UnLCB0aGlzLl9yZXN0YXJ0UHJvY2Vzc2luZyk7XG5cbiAgICB0aGlzLmNoZWNrU3RhbGxlZEpvYnMoKTtcbiAgICB0aGlzLl9xdWV1ZVRpY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGNoZWNrU3RhbGxlZEpvYnMoKSB7XG4gICAgdGhpcy5sb2cudmVyYm9zZShgJHt0aGlzLm5hbWV9OiBjaGVja1N0YWxsZWRKb2JzYCk7XG4gICAgdGhpcy5jbGllbnQuY2hlY2tzdGFsbGVkam9icyhcbiAgICAgIHRoaXMudG9LZXkoJ3N0YWxsVGltZScpLFxuICAgICAgdGhpcy50b0tleSgnc3RhbGxpbmcnKSxcbiAgICAgIHRoaXMudG9LZXkoJ3dhaXRpbmcnKSxcbiAgICAgIHRoaXMudG9LZXkoJ2FjdGl2ZScpLFxuICAgICAgZ2V0VGltZVN0YW1wKCksXG4gICAgICB0aGlzLm9wdGlvbnMuc3RhbGxJbnRlcnZhbCwgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5lbmFibGVkIHx8IHRoaXMucGF1c2VkKSByZXR1cm47XG4gICAgICAgIHNldFRpbWVvdXQoOjp0aGlzLmNoZWNrU3RhbGxlZEpvYnMsIHRoaXMub3B0aW9ucy5zdGFsbEludGVydmFsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBzdHJcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICB0b0tleShzdHIpIHtcbiAgICBpZiAodGhpcy5jb3JlLmNsdXN0ZXIuaXNDbHVzdGVyKCkpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMua2V5UHJlZml4fTp7JHt0aGlzLm5hbWV9fToke3N0cn1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5vcHRpb25zLmtleVByZWZpeH06JHt0aGlzLm5hbWV9OiR7c3RyfWA7XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRoZSBldmVudFByZWZpeCB0byBhbiBldmVudCBuYW1lXG4gICAqIEBwYXJhbSBldmVudE5hbWVcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRvRXZlbnROYW1lID0gZXZlbnROYW1lID0+IGBxdWV1ZToke3RoaXMubmFtZX06JHtldmVudE5hbWV9YDtcbn1cbiJdfQ==

@@ -38,5 +38,5 @@ "use strict";

--[[
key 1 -> rab:job:name:jobs
key 2 -> rab:job:name:waiting
key 3 -> rab:job:name:id (job ID counter)
key 1 -> rdb:job:name:jobs
key 2 -> rdb:job:name:waiting
key 3 -> rdb:job:name:id (job ID counter)
arg 1 -> job data

@@ -74,6 +74,6 @@ arg 2 -> should be unique?

--[[
key 1 -> rab:job:name:stallTime
key 2 -> rab:job:name:stalling
key 3 -> rab:job:name:waiting
key 4 -> rab:job:name:active
key 1 -> rdb:job:queue:stallTime
key 2 -> rdb:job:queue:stalling
key 3 -> rdb:job:queue:waiting
key 4 -> rdb:job:queue:active
arg 1 -> ms timestamp ("now")

@@ -84,5 +84,5 @@ arg 2 -> ms stallInterval

workers are responsible for removing their jobId from the stalling set every stallInterval ms
if a jobId is not removed from the stalling set within a stallInterval window,
we assume the job has stalled and should be reset (moved from active back to waiting)
workers remove the jobs from the stalling set every 'stallInterval' ms
if a job isn't removed from the stall set within the stallInterval time period then
we assume that the job has stalled and we'll reset it (moved from active back to waiting)
--]]

@@ -94,7 +94,6 @@

if now < stallTime then
-- hasn't been long enough (stallInterval) since last check
return 0
end
-- reset any stalling jobs by moving from active to waiting
-- move stalled jobs from active to waiting set
local stalling = redis.call("smembers", KEYS[2])

@@ -109,3 +108,3 @@ if #stalling > 0 then

-- copy currently active jobs into stalling set
-- copy active jobs into stalling set
local actives = redis.call("lrange", KEYS[4], 0, -1)

@@ -126,8 +125,8 @@ if #actives > 0 then

--[[
key 1 -> rab:job:test:succeeded
key 2 -> rab:job:test:failed
key 3 -> rab:job:test:waiting
key 4 -> rab:job:test:active
key 5 -> rab:job:test:stalling
key 6 -> rab:job:test:jobs
key 1 -> rdb:job:queue:succeeded
key 2 -> rdb:job:queue:failed
key 3 -> rdb:job:queue:waiting
key 4 -> rdb:job:queue:active
key 5 -> rdb:job:queue:stalling
key 6 -> rdb:job:queue:jobs
arg 1 -> jobId

@@ -264,2 +263,2 @@ ]]

};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zY3JpcHRzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQTBCZTs7QUFFYixVQUFRO0FBQ04sVUFBTSxDQURBO0FBRU4sU0FBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZBLEdBRks7O0FBcUNiLG9CQUFrQjtBQUNoQixVQUFNLENBRFU7QUFFaEIsU0FBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFGVSxHQXJDTDs7QUFxRmIsYUFBVztBQUNULFVBQU0sQ0FERztBQUVULFNBQU07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRkcsR0FyRkU7O0FBZ0hiLFlBQVU7QUFDUixVQUFNLENBREU7QUFFUixTQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRkUsR0FoSEc7O0FBc0piLGFBQVc7QUFDVCxVQUFNLENBREc7QUFFVCxTQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRkcsR0F0SkU7O0FBeUxiLGtCQUFnQjtBQUNkLFVBQU0sQ0FEUTtBQUVkLFNBQU07Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRlEsR0F6TEg7O0FBaU5iLGdCQUFjO0FBQ1osVUFBTSxDQURNO0FBRVosU0FBTTs7Ozs7Ozs7Ozs7OztBQUZNO0FBak5ELEMiLCJmaWxlIjoic2NyaXB0cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICpcbiAqIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICpcbiAqIENvcHlyaWdodCAoYykgMjAxNiBTYWxha2FyXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqXG4gKi9cblxuZXhwb3J0IGRlZmF1bHQge1xuXG4gIGFkZEpvYjoge1xuICAgIGtleXM6IDMsXG4gICAgbHVhOiBgXG4gICAgICAgIC0tW1tcbiAgICAgICAga2V5IDEgLT4gcmFiOmpvYjpuYW1lOmpvYnNcbiAgICAgICAga2V5IDIgLT4gcmFiOmpvYjpuYW1lOndhaXRpbmdcbiAgICAgICAga2V5IDMgLT4gcmFiOmpvYjpuYW1lOmlkIChqb2IgSUQgY291bnRlcilcbiAgICAgICAgYXJnIDEgLT4gam9iIGRhdGFcbiAgICAgICAgYXJnIDIgLT4gc2hvdWxkIGJlIHVuaXF1ZT9cbiAgICAgICAgYXJnIDMgLT4gY3VzdG9tSWRcbiAgICAgICAgXV1cblxuICAgICAgICBsb2NhbCBqb2JJZCA9IEFSR1ZbM11cblxuICAgICAgICBpZiBqb2JJZCA9PSBcIlwiIHRoZW5cbiAgICAgICAgICBqb2JJZCA9IHJlZGlzLmNhbGwoXCJpbmNyXCIsIEtFWVNbM10pXG4gICAgICAgIGVuZFxuXG4gICAgICAgIC0tIGlmIHVuaXF1ZSBlbmFibGVkXG4gICAgICAgIGlmIEFSR1ZbMl0gPT0gXCJ0cnVlXCIgdGhlblxuICAgICAgICAgIGxvY2FsIGV4aXN0cyA9IHJlZGlzLmNhbGwoXCJoc2V0bnhcIiwgS0VZU1sxXSwgam9iSWQsIEFSR1ZbMV0pXG4gICAgICAgICAgaWYgZXhpc3RzID09IDEgdGhlblxuICAgICAgICAgICAgcmVkaXMuY2FsbChcImxwdXNoXCIsIEtFWVNbMl0sIGpvYklkKVxuICAgICAgICAgICAgcmV0dXJuIGpvYklkXG4gICAgICAgICAgZW5kXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgZWxzZVxuICAgICAgICAgIC0tIGlmIG5vdCB1bmlxdWUgZW5hYmxlZFxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJoc2V0XCIsIEtFWVNbMV0sIGpvYklkLCBBUkdWWzFdKVxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscHVzaFwiLCBLRVlTWzJdLCBqb2JJZClcbiAgICAgICAgICByZXR1cm4gam9iSWRcbiAgICAgICAgZW5kXG4gICAgYCxcbiAgfSxcblxuICBjaGVja1N0YWxsZWRKb2JzOiB7XG4gICAga2V5czogNCxcbiAgICBsdWE6IGBcbiAgICAgICAgLS1bW1xuICAgICAgICBrZXkgMSAtPiByYWI6am9iOm5hbWU6c3RhbGxUaW1lXG4gICAgICAgIGtleSAyIC0+IHJhYjpqb2I6bmFtZTpzdGFsbGluZ1xuICAgICAgICBrZXkgMyAtPiByYWI6am9iOm5hbWU6d2FpdGluZ1xuICAgICAgICBrZXkgNCAtPiByYWI6am9iOm5hbWU6YWN0aXZlXG4gICAgICAgIGFyZyAxIC0+IG1zIHRpbWVzdGFtcCAoXCJub3dcIilcbiAgICAgICAgYXJnIDIgLT4gbXMgc3RhbGxJbnRlcnZhbFxuXG4gICAgICAgIHJldHVybnMge3Jlc2V0Sm9iSWQxLCByZXNldEpvYklkMiwgLi4ufVxuXG4gICAgICAgIHdvcmtlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGVpciBqb2JJZCBmcm9tIHRoZSBzdGFsbGluZyBzZXQgZXZlcnkgc3RhbGxJbnRlcnZhbCBtc1xuICAgICAgICBpZiBhIGpvYklkIGlzIG5vdCByZW1vdmVkIGZyb20gdGhlIHN0YWxsaW5nIHNldCB3aXRoaW4gYSBzdGFsbEludGVydmFsIHdpbmRvdyxcbiAgICAgICAgd2UgYXNzdW1lIHRoZSBqb2IgaGFzIHN0YWxsZWQgYW5kIHNob3VsZCBiZSByZXNldCAobW92ZWQgZnJvbSBhY3RpdmUgYmFjayB0byB3YWl0aW5nKVxuICAgICAgICAtLV1dXG5cbiAgICAgICAgbG9jYWwgbm93ID0gdG9udW1iZXIoQVJHVlsxXSlcbiAgICAgICAgbG9jYWwgc3RhbGxUaW1lID0gdG9udW1iZXIocmVkaXMuY2FsbChcImdldFwiLCBLRVlTWzFdKSBvciAwKVxuXG4gICAgICAgIGlmIG5vdyA8IHN0YWxsVGltZSB0aGVuXG4gICAgICAgICAgLS0gaGFzbid0IGJlZW4gbG9uZyBlbm91Z2ggKHN0YWxsSW50ZXJ2YWwpIHNpbmNlIGxhc3QgY2hlY2tcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICBlbmRcblxuICAgICAgICAtLSByZXNldCBhbnkgc3RhbGxpbmcgam9icyBieSBtb3ZpbmcgZnJvbSBhY3RpdmUgdG8gd2FpdGluZ1xuICAgICAgICBsb2NhbCBzdGFsbGluZyA9IHJlZGlzLmNhbGwoXCJzbWVtYmVyc1wiLCBLRVlTWzJdKVxuICAgICAgICBpZiAjc3RhbGxpbmcgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKFwicnB1c2hcIiwgS0VZU1szXSwgdW5wYWNrKHN0YWxsaW5nKSlcbiAgICAgICAgICBmb3IgaSA9IDEsICNzdGFsbGluZyBkb1xuICAgICAgICAgICAgcmVkaXMuY2FsbChcImxyZW1cIiwgS0VZU1s0XSwgMCwgc3RhbGxpbmdbaV0pXG4gICAgICAgICAgZW5kXG4gICAgICAgICAgcmVkaXMuY2FsbChcImRlbFwiLCBLRVlTWzJdKVxuICAgICAgICBlbmRcblxuICAgICAgICAtLSBjb3B5IGN1cnJlbnRseSBhY3RpdmUgam9icyBpbnRvIHN0YWxsaW5nIHNldFxuICAgICAgICBsb2NhbCBhY3RpdmVzID0gcmVkaXMuY2FsbChcImxyYW5nZVwiLCBLRVlTWzRdLCAwLCAtMSlcbiAgICAgICAgaWYgI2FjdGl2ZXMgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKFwic2FkZFwiLCBLRVlTWzJdLCB1bnBhY2soYWN0aXZlcykpXG4gICAgICAgIGVuZFxuXG4gICAgICAgIHJlZGlzLmNhbGwoXCJzZXRcIiwgS0VZU1sxXSwgbm93ICsgQVJHVlsyXSlcblxuICAgICAgICByZXR1cm4gc3RhbGxpbmdcbiAgICBgLFxuICB9LFxuXG4gIHJlbW92ZUpvYjoge1xuICAgIGtleXM6IDYsXG4gICAgbHVhOiBgXG4gICAgICAgIC0tW1tcbiAgICAgICAga2V5IDEgLT4gcmFiOmpvYjp0ZXN0OnN1Y2NlZWRlZFxuICAgICAgICBrZXkgMiAtPiByYWI6am9iOnRlc3Q6ZmFpbGVkXG4gICAgICAgIGtleSAzIC0+IHJhYjpqb2I6dGVzdDp3YWl0aW5nXG4gICAgICAgIGtleSA0IC0+IHJhYjpqb2I6dGVzdDphY3RpdmVcbiAgICAgICAga2V5IDUgLT4gcmFiOmpvYjp0ZXN0OnN0YWxsaW5nXG4gICAgICAgIGtleSA2IC0+IHJhYjpqb2I6dGVzdDpqb2JzXG4gICAgICAgIGFyZyAxIC0+IGpvYklkXG4gICAgICAgIF1dXG5cbiAgICAgICAgbG9jYWwgam9iSWQgPSBBUkdWWzFdXG5cbiAgICAgICAgaWYgKHJlZGlzLmNhbGwoXCJzaXNtZW1iZXJcIiwgS0VZU1sxXSwgam9iSWQpICsgcmVkaXMuY2FsbChcInNpc21lbWJlclwiLCBLRVlTWzJdLCBqb2JJZCkpID09IDAgdGhlblxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbM10sIDAsIGpvYklkKVxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbNF0sIDAsIGpvYklkKVxuICAgICAgICBlbmRcblxuICAgICAgICByZWRpcy5jYWxsKFwic3JlbVwiLCBLRVlTWzFdLCBqb2JJZClcbiAgICAgICAgcmVkaXMuY2FsbChcInNyZW1cIiwgS0VZU1syXSwgam9iSWQpXG4gICAgICAgIHJlZGlzLmNhbGwoXCJzcmVtXCIsIEtFWVNbNV0sIGpvYklkKVxuICAgICAgICByZWRpcy5jYWxsKFwiaGRlbFwiLCBLRVlTWzZdLCBqb2JJZClcbiAgICBgLFxuICB9LFxuXG4gIHRocm90dGxlOiB7XG4gICAga2V5czogMSxcbiAgICBsdWE6IGBcbiAgICAgICAgLS1bW1xuICAgICAgICAgIGtleSAxIC0+IGtleSBuYW1lIC0gaXAsIHVzZXIgaWQgb3Igc29tZSB1bmlxdWUga2V5IHRvIHRocm90dGxlIFggYnlcbiAgICAgICAgICBhcmcgMSAtPiBsaW1pdFxuICAgICAgICAgIGFyZyAyIC0+IHNlY29uZHNcbiAgICAgICAgICByZXR1cm5zIHtcbiAgICAgICAgICAgIHRocm90dGxlZDogLT4gIDEgaWYgc2hvdWxkIHRocm90dGxlLCAwIGlmIHN0aWxsIHdpdGhpbiBsaW1pdFxuICAgICAgICAgICAgcmVtYWluaW5nOiAtPiAgaG93IG1hbnkgcmVxcyBsZWZ0IHVudGlsIHRocm90dGxlZCxcbiAgICAgICAgICAgIHR0bDogICAgICAgLT4gIHNlY29uZHMgcmVtYWluaW5nIHVudGlsIGxpbWl0IHJlc2V0c1xuICAgICAgICAgIH1cbiAgICAgICAgXV1cbiAgICAgICAgXG4gICAgICAgIGxvY2FsIGNvdW50ID0gcmVkaXMuY2FsbCgnSU5DUicsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHR0bCA9IHJlZGlzLmNhbGwoJ3R0bCcsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHJlbWFpbmluZyA9IHRvbnVtYmVyKEFSR1ZbMV0pIC0gY291bnRcbiAgICAgICAgXG4gICAgICAgIGlmIGNvdW50ID09IDEgb3IgdHRsID09IC0xIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdFWFBJUkUnLCBLRVlTWzFdLCBBUkdWWzJdKVxuICAgICAgICBlbmRcbiAgICAgICAgXG4gICAgICAgIGlmIHR0bCA9PSAtMSB0aGVuXG4gICAgICAgICAgdHRsID0gdG9udW1iZXIoQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBjb3VudCA+IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsIDAsIHR0bH1cbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiByZW1haW5pbmcgPT0gMCB0aGVuXG4gICAgICAgICAgcmV0dXJuIHsxLCAwLCB0dGx9XG4gICAgICAgIGVuZFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHswLCByZW1haW5pbmcsIHR0bH1cbiAgYCxcbiAgfSxcblxuICBwVGhyb3R0bGU6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIGFyZyAxIC0+IGxpbWl0XG4gICAgICAgICAgYXJnIDIgLT4gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgcmV0dXJucyAwIGlmIHJlcXVlc3QgaXMgb2tcbiAgICAgICAgICByZXR1cm5zIDEgaWYgcmVxdWVzdCBkZW5pZWRcbiAgICAgICAgXV1cbiAgICAgICAgXG4gICAgICAgIGxvY2FsIGNvdW50ID0gcmVkaXMuY2FsbCgnSU5DUicsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHB0dGwgPSByZWRpcy5jYWxsKCdwdHRsJyxLRVlTWzFdKVxuICAgICAgICBsb2NhbCByZW1haW5pbmcgPSB0b251bWJlcihBUkdWWzFdKSAtIGNvdW50XG5cbiAgICAgICAgaWYgY291bnQgPT0gMSBvciBwdHRsID09IC0xIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdQRVhQSVJFJywgS0VZU1sxXSwgQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBwdHRsID09IC0xIHRoZW5cbiAgICAgICAgICBwdHRsID0gdG9udW1iZXIoQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBjb3VudCA+IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsMCxwdHRsfVxuICAgICAgICBlbmRcbiAgICAgICAgXG4gICAgICAgIGlmIHJlbWFpbmluZyA9PSAwIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsIDAsIHB0dGx9XG4gICAgICAgIGVuZFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHswLCByZW1haW5pbmcsIHB0dGx9XG4gIGAsXG4gIH0sXG5cbiAgdGhyb3R0bGVOb0luY3I6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIGFyZyAxIC0+IGxpbWl0XG4gICAgICAgICAgYXJnIDIgLT4gc2Vjb25kc1xuICAgICAgICAgIHJldHVybnMgMC8xXG4gICAgICAgIF1dXG4gICAgICAgIGlmIHJlZGlzLmNhbGwoJ2V4aXN0cycsS0VZU1sxXSkgPiAwIHRoZW5cbiAgICAgICAgICBsb2NhbCBjdXJyZW50VmFsID0gdG9udW1iZXIocmVkaXMuY2FsbCgnZ2V0JyxLRVlTWzFdKSlcbiAgICAgICAgICBpZiBjdXJyZW50VmFsID49IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICByZWRpcy5jYWxsKCdpbmNyJyxLRVlTWzFdKVxuICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgZW5kXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZWRpcy5jYWxsKCdzZXRleCcsS0VZU1sxXSwgdG9udW1iZXIoQVJHVlsyXSksIDEpXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgZW5kXG4gICAgYCxcbiAgfSxcblxuICB0aHJvdHRsZURlY3I6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIHJldHVybnMgMC8xXG4gICAgICAgIF1dXG4gICAgXG4gICAgICAgIGlmIHJlZGlzLmNhbGwoJ2V4aXN0cycsS0VZU1sxXSkgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdkZWNyJyxLRVlTWzFdKVxuICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgICBlbmRcbiAgICBgLFxuICB9LFxufTtcbiJdfQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zY3JpcHRzLmpzIl0sIm5hbWVzIjpbImFkZEpvYiIsImtleXMiLCJsdWEiLCJjaGVja1N0YWxsZWRKb2JzIiwicmVtb3ZlSm9iIiwidGhyb3R0bGUiLCJwVGhyb3R0bGUiLCJ0aHJvdHRsZU5vSW5jciIsInRocm90dGxlRGVjciJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBMEJlOztBQUViQSxVQUFRO0FBQ05DLFVBQU0sQ0FEQTtBQUVOQyxTQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRkEsR0FGSzs7QUFxQ2JDLG9CQUFrQjtBQUNoQkYsVUFBTSxDQURVO0FBRWhCQyxTQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRlUsR0FyQ0w7O0FBb0ZiRSxhQUFXO0FBQ1RILFVBQU0sQ0FERztBQUVUQyxTQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZHLEdBcEZFOztBQStHYkcsWUFBVTtBQUNSSixVQUFNLENBREU7QUFFUkMsU0FBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZFLEdBL0dHOztBQXFKYkksYUFBVztBQUNUTCxVQUFNLENBREc7QUFFVEMsU0FBTTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZHLEdBckpFOztBQXdMYkssa0JBQWdCO0FBQ2ROLFVBQU0sQ0FEUTtBQUVkQyxTQUFNOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUZRLEdBeExIOztBQWdOYk0sZ0JBQWM7QUFDWlAsVUFBTSxDQURNO0FBRVpDLFNBQU07Ozs7Ozs7Ozs7Ozs7QUFGTTtBQWhORCxDIiwiZmlsZSI6InNjcmlwdHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKiBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgU2FsYWthclxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKlxuICovXG5cbmV4cG9ydCBkZWZhdWx0IHtcblxuICBhZGRKb2I6IHtcbiAgICBrZXlzOiAzLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgIGtleSAxIC0+IHJkYjpqb2I6bmFtZTpqb2JzXG4gICAgICAgIGtleSAyIC0+IHJkYjpqb2I6bmFtZTp3YWl0aW5nXG4gICAgICAgIGtleSAzIC0+IHJkYjpqb2I6bmFtZTppZCAoam9iIElEIGNvdW50ZXIpXG4gICAgICAgIGFyZyAxIC0+IGpvYiBkYXRhXG4gICAgICAgIGFyZyAyIC0+IHNob3VsZCBiZSB1bmlxdWU/XG4gICAgICAgIGFyZyAzIC0+IGN1c3RvbUlkXG4gICAgICAgIF1dXG5cbiAgICAgICAgbG9jYWwgam9iSWQgPSBBUkdWWzNdXG5cbiAgICAgICAgaWYgam9iSWQgPT0gXCJcIiB0aGVuXG4gICAgICAgICAgam9iSWQgPSByZWRpcy5jYWxsKFwiaW5jclwiLCBLRVlTWzNdKVxuICAgICAgICBlbmRcblxuICAgICAgICAtLSBpZiB1bmlxdWUgZW5hYmxlZFxuICAgICAgICBpZiBBUkdWWzJdID09IFwidHJ1ZVwiIHRoZW5cbiAgICAgICAgICBsb2NhbCBleGlzdHMgPSByZWRpcy5jYWxsKFwiaHNldG54XCIsIEtFWVNbMV0sIGpvYklkLCBBUkdWWzFdKVxuICAgICAgICAgIGlmIGV4aXN0cyA9PSAxIHRoZW5cbiAgICAgICAgICAgIHJlZGlzLmNhbGwoXCJscHVzaFwiLCBLRVlTWzJdLCBqb2JJZClcbiAgICAgICAgICAgIHJldHVybiBqb2JJZFxuICAgICAgICAgIGVuZFxuICAgICAgICAgIHJldHVybiAwXG4gICAgICAgIGVsc2VcbiAgICAgICAgICAtLSBpZiBub3QgdW5pcXVlIGVuYWJsZWRcbiAgICAgICAgICByZWRpcy5jYWxsKFwiaHNldFwiLCBLRVlTWzFdLCBqb2JJZCwgQVJHVlsxXSlcbiAgICAgICAgICByZWRpcy5jYWxsKFwibHB1c2hcIiwgS0VZU1syXSwgam9iSWQpXG4gICAgICAgICAgcmV0dXJuIGpvYklkXG4gICAgICAgIGVuZFxuICAgIGAsXG4gIH0sXG5cbiAgY2hlY2tTdGFsbGVkSm9iczoge1xuICAgIGtleXM6IDQsXG4gICAgbHVhOiBgXG4gICAgICAgIC0tW1tcbiAgICAgICAga2V5IDEgLT4gcmRiOmpvYjpxdWV1ZTpzdGFsbFRpbWVcbiAgICAgICAga2V5IDIgLT4gcmRiOmpvYjpxdWV1ZTpzdGFsbGluZ1xuICAgICAgICBrZXkgMyAtPiByZGI6am9iOnF1ZXVlOndhaXRpbmdcbiAgICAgICAga2V5IDQgLT4gcmRiOmpvYjpxdWV1ZTphY3RpdmVcbiAgICAgICAgYXJnIDEgLT4gbXMgdGltZXN0YW1wIChcIm5vd1wiKVxuICAgICAgICBhcmcgMiAtPiBtcyBzdGFsbEludGVydmFsXG5cbiAgICAgICAgcmV0dXJucyB7cmVzZXRKb2JJZDEsIHJlc2V0Sm9iSWQyLCAuLi59XG5cbiAgICAgICAgd29ya2VycyByZW1vdmUgdGhlIGpvYnMgZnJvbSB0aGUgc3RhbGxpbmcgc2V0IGV2ZXJ5ICdzdGFsbEludGVydmFsJyBtc1xuICAgICAgICBpZiBhIGpvYiBpc24ndCByZW1vdmVkIGZyb20gdGhlIHN0YWxsIHNldCB3aXRoaW4gdGhlIHN0YWxsSW50ZXJ2YWwgdGltZSBwZXJpb2QgdGhlblxuICAgICAgICB3ZSBhc3N1bWUgdGhhdCB0aGUgam9iIGhhcyBzdGFsbGVkIGFuZCB3ZSdsbCByZXNldCBpdCAobW92ZWQgZnJvbSBhY3RpdmUgYmFjayB0byB3YWl0aW5nKVxuICAgICAgICAtLV1dXG5cbiAgICAgICAgbG9jYWwgbm93ID0gdG9udW1iZXIoQVJHVlsxXSlcbiAgICAgICAgbG9jYWwgc3RhbGxUaW1lID0gdG9udW1iZXIocmVkaXMuY2FsbChcImdldFwiLCBLRVlTWzFdKSBvciAwKVxuXG4gICAgICAgIGlmIG5vdyA8IHN0YWxsVGltZSB0aGVuXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgZW5kXG5cbiAgICAgICAgLS0gbW92ZSBzdGFsbGVkIGpvYnMgZnJvbSBhY3RpdmUgdG8gd2FpdGluZyBzZXRcbiAgICAgICAgbG9jYWwgc3RhbGxpbmcgPSByZWRpcy5jYWxsKFwic21lbWJlcnNcIiwgS0VZU1syXSlcbiAgICAgICAgaWYgI3N0YWxsaW5nID4gMCB0aGVuXG4gICAgICAgICAgcmVkaXMuY2FsbChcInJwdXNoXCIsIEtFWVNbM10sIHVucGFjayhzdGFsbGluZykpXG4gICAgICAgICAgZm9yIGkgPSAxLCAjc3RhbGxpbmcgZG9cbiAgICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbNF0sIDAsIHN0YWxsaW5nW2ldKVxuICAgICAgICAgIGVuZFxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJkZWxcIiwgS0VZU1syXSlcbiAgICAgICAgZW5kXG5cbiAgICAgICAgLS0gY29weSBhY3RpdmUgam9icyBpbnRvIHN0YWxsaW5nIHNldFxuICAgICAgICBsb2NhbCBhY3RpdmVzID0gcmVkaXMuY2FsbChcImxyYW5nZVwiLCBLRVlTWzRdLCAwLCAtMSlcbiAgICAgICAgaWYgI2FjdGl2ZXMgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKFwic2FkZFwiLCBLRVlTWzJdLCB1bnBhY2soYWN0aXZlcykpXG4gICAgICAgIGVuZFxuXG4gICAgICAgIHJlZGlzLmNhbGwoXCJzZXRcIiwgS0VZU1sxXSwgbm93ICsgQVJHVlsyXSlcblxuICAgICAgICByZXR1cm4gc3RhbGxpbmdcbiAgICBgLFxuICB9LFxuXG4gIHJlbW92ZUpvYjoge1xuICAgIGtleXM6IDYsXG4gICAgbHVhOiBgXG4gICAgICAgIC0tW1tcbiAgICAgICAga2V5IDEgLT4gcmRiOmpvYjpxdWV1ZTpzdWNjZWVkZWRcbiAgICAgICAga2V5IDIgLT4gcmRiOmpvYjpxdWV1ZTpmYWlsZWRcbiAgICAgICAga2V5IDMgLT4gcmRiOmpvYjpxdWV1ZTp3YWl0aW5nXG4gICAgICAgIGtleSA0IC0+IHJkYjpqb2I6cXVldWU6YWN0aXZlXG4gICAgICAgIGtleSA1IC0+IHJkYjpqb2I6cXVldWU6c3RhbGxpbmdcbiAgICAgICAga2V5IDYgLT4gcmRiOmpvYjpxdWV1ZTpqb2JzXG4gICAgICAgIGFyZyAxIC0+IGpvYklkXG4gICAgICAgIF1dXG5cbiAgICAgICAgbG9jYWwgam9iSWQgPSBBUkdWWzFdXG5cbiAgICAgICAgaWYgKHJlZGlzLmNhbGwoXCJzaXNtZW1iZXJcIiwgS0VZU1sxXSwgam9iSWQpICsgcmVkaXMuY2FsbChcInNpc21lbWJlclwiLCBLRVlTWzJdLCBqb2JJZCkpID09IDAgdGhlblxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbM10sIDAsIGpvYklkKVxuICAgICAgICAgIHJlZGlzLmNhbGwoXCJscmVtXCIsIEtFWVNbNF0sIDAsIGpvYklkKVxuICAgICAgICBlbmRcblxuICAgICAgICByZWRpcy5jYWxsKFwic3JlbVwiLCBLRVlTWzFdLCBqb2JJZClcbiAgICAgICAgcmVkaXMuY2FsbChcInNyZW1cIiwgS0VZU1syXSwgam9iSWQpXG4gICAgICAgIHJlZGlzLmNhbGwoXCJzcmVtXCIsIEtFWVNbNV0sIGpvYklkKVxuICAgICAgICByZWRpcy5jYWxsKFwiaGRlbFwiLCBLRVlTWzZdLCBqb2JJZClcbiAgICBgLFxuICB9LFxuXG4gIHRocm90dGxlOiB7XG4gICAga2V5czogMSxcbiAgICBsdWE6IGBcbiAgICAgICAgLS1bW1xuICAgICAgICAgIGtleSAxIC0+IGtleSBuYW1lIC0gaXAsIHVzZXIgaWQgb3Igc29tZSB1bmlxdWUga2V5IHRvIHRocm90dGxlIFggYnlcbiAgICAgICAgICBhcmcgMSAtPiBsaW1pdFxuICAgICAgICAgIGFyZyAyIC0+IHNlY29uZHNcbiAgICAgICAgICByZXR1cm5zIHtcbiAgICAgICAgICAgIHRocm90dGxlZDogLT4gIDEgaWYgc2hvdWxkIHRocm90dGxlLCAwIGlmIHN0aWxsIHdpdGhpbiBsaW1pdFxuICAgICAgICAgICAgcmVtYWluaW5nOiAtPiAgaG93IG1hbnkgcmVxcyBsZWZ0IHVudGlsIHRocm90dGxlZCxcbiAgICAgICAgICAgIHR0bDogICAgICAgLT4gIHNlY29uZHMgcmVtYWluaW5nIHVudGlsIGxpbWl0IHJlc2V0c1xuICAgICAgICAgIH1cbiAgICAgICAgXV1cbiAgICAgICAgXG4gICAgICAgIGxvY2FsIGNvdW50ID0gcmVkaXMuY2FsbCgnSU5DUicsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHR0bCA9IHJlZGlzLmNhbGwoJ3R0bCcsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHJlbWFpbmluZyA9IHRvbnVtYmVyKEFSR1ZbMV0pIC0gY291bnRcbiAgICAgICAgXG4gICAgICAgIGlmIGNvdW50ID09IDEgb3IgdHRsID09IC0xIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdFWFBJUkUnLCBLRVlTWzFdLCBBUkdWWzJdKVxuICAgICAgICBlbmRcbiAgICAgICAgXG4gICAgICAgIGlmIHR0bCA9PSAtMSB0aGVuXG4gICAgICAgICAgdHRsID0gdG9udW1iZXIoQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBjb3VudCA+IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsIDAsIHR0bH1cbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiByZW1haW5pbmcgPT0gMCB0aGVuXG4gICAgICAgICAgcmV0dXJuIHsxLCAwLCB0dGx9XG4gICAgICAgIGVuZFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHswLCByZW1haW5pbmcsIHR0bH1cbiAgYCxcbiAgfSxcblxuICBwVGhyb3R0bGU6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIGFyZyAxIC0+IGxpbWl0XG4gICAgICAgICAgYXJnIDIgLT4gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgcmV0dXJucyAwIGlmIHJlcXVlc3QgaXMgb2tcbiAgICAgICAgICByZXR1cm5zIDEgaWYgcmVxdWVzdCBkZW5pZWRcbiAgICAgICAgXV1cbiAgICAgICAgXG4gICAgICAgIGxvY2FsIGNvdW50ID0gcmVkaXMuY2FsbCgnSU5DUicsIEtFWVNbMV0pXG4gICAgICAgIGxvY2FsIHB0dGwgPSByZWRpcy5jYWxsKCdwdHRsJyxLRVlTWzFdKVxuICAgICAgICBsb2NhbCByZW1haW5pbmcgPSB0b251bWJlcihBUkdWWzFdKSAtIGNvdW50XG5cbiAgICAgICAgaWYgY291bnQgPT0gMSBvciBwdHRsID09IC0xIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdQRVhQSVJFJywgS0VZU1sxXSwgQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBwdHRsID09IC0xIHRoZW5cbiAgICAgICAgICBwdHRsID0gdG9udW1iZXIoQVJHVlsyXSlcbiAgICAgICAgZW5kXG4gICAgICAgIFxuICAgICAgICBpZiBjb3VudCA+IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsMCxwdHRsfVxuICAgICAgICBlbmRcbiAgICAgICAgXG4gICAgICAgIGlmIHJlbWFpbmluZyA9PSAwIHRoZW5cbiAgICAgICAgICByZXR1cm4gezEsIDAsIHB0dGx9XG4gICAgICAgIGVuZFxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHswLCByZW1haW5pbmcsIHB0dGx9XG4gIGAsXG4gIH0sXG5cbiAgdGhyb3R0bGVOb0luY3I6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIGFyZyAxIC0+IGxpbWl0XG4gICAgICAgICAgYXJnIDIgLT4gc2Vjb25kc1xuICAgICAgICAgIHJldHVybnMgMC8xXG4gICAgICAgIF1dXG4gICAgICAgIGlmIHJlZGlzLmNhbGwoJ2V4aXN0cycsS0VZU1sxXSkgPiAwIHRoZW5cbiAgICAgICAgICBsb2NhbCBjdXJyZW50VmFsID0gdG9udW1iZXIocmVkaXMuY2FsbCgnZ2V0JyxLRVlTWzFdKSlcbiAgICAgICAgICBpZiBjdXJyZW50VmFsID49IHRvbnVtYmVyKEFSR1ZbMV0pIHRoZW5cbiAgICAgICAgICAgICByZXR1cm4gMVxuICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICByZWRpcy5jYWxsKCdpbmNyJyxLRVlTWzFdKVxuICAgICAgICAgICAgIHJldHVybiAwXG4gICAgICAgICAgZW5kXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZWRpcy5jYWxsKCdzZXRleCcsS0VZU1sxXSwgdG9udW1iZXIoQVJHVlsyXSksIDEpXG4gICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgZW5kXG4gICAgYCxcbiAgfSxcblxuICB0aHJvdHRsZURlY3I6IHtcbiAgICBrZXlzOiAxLFxuICAgIGx1YTogYFxuICAgICAgICAtLVtbXG4gICAgICAgICAga2V5IDEgLT4ga2V5IG5hbWUgLSBpcCwgdXNlciBpZCBvciBzb21lIHVuaXF1ZSBrZXkgdG8gdGhyb3R0bGUgWCBieVxuICAgICAgICAgIHJldHVybnMgMC8xXG4gICAgICAgIF1dXG4gICAgXG4gICAgICAgIGlmIHJlZGlzLmNhbGwoJ2V4aXN0cycsS0VZU1sxXSkgPiAwIHRoZW5cbiAgICAgICAgICByZWRpcy5jYWxsKCdkZWNyJyxLRVlTWzFdKVxuICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gMVxuICAgICAgICBlbmRcbiAgICBgLFxuICB9LFxufTtcbiJdfQ==
{
"name": "redibox-hook-job",
"description": "Advanced redibox powered jobs and queues",
"version": "1.2.17",
"description": "High performance, robust and flexible queue/worker system powered by redis.",
"version": "1.2.18",
"main": "lib/index.js",

@@ -17,2 +17,8 @@ "author": "Mike Diarmid",

"scheduler",
"job",
"jobs",
"queue",
"queues",
"worker",
"workers",
"scheduling",

@@ -44,3 +50,3 @@ "waterline",

"devDependencies": {
"babel-cli": "^6.11.4",
"babel-cli": "^6.14.0",
"babel-eslint": "^6.1.2",

@@ -50,27 +56,30 @@ "babel-istanbul": "^0.11.0",

"babel-plugin-transform-class-properties": "^6.11.5",
"babel-preset-es2015": "^6.6.0",
"babel-preset-es2015": "^6.14.0",
"babel-preset-es2015-node-auto": "0.0.5",
"babel-preset-es2015-node4": "^2.1.0",
"babel-preset-es2015-node5": "^1.2.0",
"babel-preset-es2015-node6": "^0.2.0",
"babel-preset-es2015-node6": "^0.3.0",
"babel-preset-stage-0": "^6.5.0",
"bee-queue": "^0.3.0",
"benchmark": "^2.1.1",
"bull": "^1.0.0",
"chai": "^3.5.0",
"coveralls": "^2.11.11",
"eslint": "^3.1.1",
"eslint-config-airbnb": "^9.0.1",
"eslint-plugin-import": "^1.11.1",
"eslint-plugin-jsx-a11y": "^2.0.1",
"eslint-plugin-react": "^5.2.2",
"coveralls": "^2.11.14",
"eslint": "^3.6.0",
"eslint-config-airbnb": "^11.2.0",
"eslint-plugin-import": "^1.16.0",
"eslint-plugin-jsx-a11y": "^2.2.2",
"eslint-plugin-react": "^6.3.0",
"isparta": "^4.0.0",
"istanbul": "^1.1.0-alpha.1",
"mocha": "^2.4.5",
"redibox": "^2.1.0",
"sinon": "^1.17.4"
"kue": "^0.11.1",
"mocha": "^3.0.2",
"redibox": "^2.3.0",
"sinon": "^1.17.6"
},
"dependencies": {
"bluebird": "^3.4.1",
"bluebird": "^3.4.6",
"cuid": "^1.3.8",
"eventemitter3": "^1.2.0"
"eventemitter3": "^2.0.0"
}
}

@@ -15,7 +15,5 @@ ## RediBox Job

```
```javascript
RediBox.hooks.job.create('my-queue', {
runs: function(job) {
console.log('The value of foo is ' + job.data.foo);
},
runs: 'sails.hooks.myhook.runJobFoo', // dot notated path to a globally accessible function
data: {

@@ -28,5 +26,3 @@ foo: 'bar',

Job.create('my-queue', {
runs: function(job) {
console.log('The value of foo is ' + job.data.foo);
},
runs: 'sails.hooks.myhook.runJobBar', // dot notated path to a globally accessible function
data: {

@@ -33,0 +29,0 @@ foo: 'bar',

global.HOOK_NAME = 'job';
var Redibox = require('redibox').default;
var UserHook = require('./lib/hook').default;
const Redibox = require('redibox').default;
const UserHook = require('./lib/hook').default;
console.dir(UserHook)
const config = {

@@ -75,3 +73,2 @@ hooks: {},

console.log('FOO BAR');
console.log(foborh);
return Promise.resolve({ hello: 123 });

@@ -82,87 +79,19 @@ };

console.log('FOO BAR END');
// assert.equal(this.data.hello, 123);
return Promise.resolve();
};
const tester = new Promise((resolve) => {
return resolve();
});
global.RediBox = new Redibox(config, () => {
global.Hook = RediBox.hooks[global.HOOK_NAME];
global.RediBoxCluster = new Redibox(clusterConfig, () => {
global.HookCluster = global.RediBoxCluster.hooks[global.HOOK_NAME];
tester.then(() => {
Hook
.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'bar',
},
})
.onSuccess((result) => {
console.log('s'.repeat(80));
console.dir(result);
console.log('s'.repeat(80));
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
})
.onFailure((result) => {
console.log('e'.repeat(80));
console.error(result.error);
console.log('e'.repeat(80));
});
console.log('HOOK READY');
Hook
.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'bar',
},
})
.onSuccess((result) => {
console.log('s'.repeat(80));
console.dir(result);
console.log('s'.repeat(80));
Hook.create('test2', {

@@ -174,586 +103,10 @@ runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],

});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
Hook.create('test2', {
runs: ['fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBar', 'fooBarEnd'],
data: {
foo: 'barz',
},
});
})
.onFailure((result) => {
console.log('e'.repeat(80));
console.error(result.error);
console.log('e'.repeat(80));
});
});
});
clusterConfig.hooks[global.HOOK_NAME] = UserHook;

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc