UNPKG

vk-chat-bot

Version:

Package for easy creation of chat bots for VK communities (uses Callback API).

3 lines (2 loc) 21.3 kB
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,s,r){return new(s||(s=Promise))((function(o,i){function n(e){try{a(r.next(e))}catch(e){i(e)}}function u(e){try{a(r.throw(e))}catch(e){i(e)}}function a(e){var t;e.done?o(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(n,u)}a((r=r.apply(e,t||[])).next())}))},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const crypto_1=__importDefault(require("crypto")),request_promise_1=__importDefault(require("request-promise")),log_1=require("../extra/log"),API_VERSION="5.95",API_QUOTA=20;class API{constructor(e,t){this.queue=[],this.isQueueProcessing=!1,this.vkToken=e,this.stats=t,this.checkPermissions().then(e=>{log_1.log().i(e).from("api").now()}).catch(e=>{log_1.log().w(e).from("api").now()}),setInterval(()=>{this.isQueueProcessing||(this.isQueueProcessing=!0,this.processQueue().then(()=>{this.isQueueProcessing=!1}).catch(e=>{log_1.log().w(e).from("api").now(),this.isQueueProcessing=!1}))},1e3)}scheduleCall(e,t){return __awaiter(this,void 0,void 0,(function*(){return new Promise((s,r)=>{this.queue.push({method:e,params:t,resolve:s,reject:r})})}))}call(e,t){return __awaiter(this,void 0,void 0,(function*(){const s={uri:`https://api.vk.com/method/${encodeURIComponent(e)}`,json:!0,qs:Object.assign({access_token:this.vkToken,v:API_VERSION},t)},r=request_promise_1.default(s);return r.catch(t=>{log_1.log().w(`Error occured while calling API method '${e}': ${t}`).from("api").now()}),r}))}send(e,t,s,r){return __awaiter(this,void 0,void 0,(function*(){const o={peer_id:e.toString(),random_id:BigInt.asIntN(32,BigInt(`0x${crypto_1.default.randomBytes(6).toString("hex")}`)).toString()};return t&&(o.message=t),s&&(o.attachment=s),r&&(o.keyboard=r),new Promise(e=>{this.scheduleCall("messages.send",o).then(()=>{this.stats.sent(),e()}).catch(t=>{log_1.log().w(t).from("api").now(),e()})})}))}checkPermissions(){return __awaiter(this,void 0,void 0,(function*(){const e=yield this.scheduleCall("groups.getTokenPermissions",{}),{permissions:t}=e;let s=!1;return t.forEach(e=>{"messages"===e.name&&(s=!0)}),s?Promise.resolve("Token permission `messages` is present"):Promise.reject(new Error("Token permission `messages` is missing. Bot will be unable to send any messages"))}))}processQueue(){return __awaiter(this,void 0,void 0,(function*(){if(this.queue){for(let e=1;e<=API_QUOTA&&0!==this.queue.length;e+=1){const e=this.queue.shift(),t=yield this.call(e.method,e.params);if(void 0!==t.response&&null!==t.response)e.resolve(t.response);else if(t.error){const s=t.error.error_code,r=t.error.error_msg;e.reject(`An API call to method '${e.method}' failed due to an API error #${s}: ${r}`)}else e.reject(`An API call to method '${e.method}' failed due to an unknown API error. The API responded with: ${JSON.stringify(t)}`)}return Promise.resolve()}return Promise.reject(new Error("No queue for API calls found"))}))}}exports.default=API; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwaS9hcGkuanMiLCJhcGkvYXBpLnRzIl0sIm5hbWVzIjpbIl9fYXdhaXRlciIsInRoaXMiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJlIiwicmVqZWN0ZWQiLCJyZXN1bHQiLCJkb25lIiwidGhlbiIsImFwcGx5IiwiX19pbXBvcnREZWZhdWx0IiwibW9kIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImV4cG9ydHMiLCJjcnlwdG9fMSIsInJlcXVpcmUiLCJyZXF1ZXN0X3Byb21pc2VfMSIsImxvZ18xIiwiQVBJX1ZFUlNJT04iLCJBUElfUVVPVEEiLCJBUEkiLCJbb2JqZWN0IE9iamVjdF0iLCJ2a1Rva2VuIiwic3RhdHMiLCJxdWV1ZSIsImlzUXVldWVQcm9jZXNzaW5nIiwiY2hlY2tQZXJtaXNzaW9ucyIsImxvZyIsImkiLCJmcm9tIiwibm93IiwiY2F0Y2giLCJ3Iiwic2V0SW50ZXJ2YWwiLCJwcm9jZXNzUXVldWUiLCJtZXRob2QiLCJwYXJhbXMiLCJwdXNoIiwib3B0aW9ucyIsInVyaSIsImVuY29kZVVSSUNvbXBvbmVudCIsImpzb24iLCJxcyIsImFzc2lnbiIsImFjY2Vzc190b2tlbiIsInYiLCJwcm9taXNlIiwiZXJyIiwicGlkIiwibWVzc2FnZSIsImF0dGFjaG1lbnQiLCJrZXlib2FyZCIsInBlZXJfaWQiLCJ0b1N0cmluZyIsInJhbmRvbV9pZCIsIkJpZ0ludCIsImFzSW50TiIsInJhbmRvbUJ5dGVzIiwic2NoZWR1bGVDYWxsIiwic2VudCIsInJlc3BvbnNlIiwicGVybWlzc2lvbnMiLCJvayIsImZvckVhY2giLCJwZXJtaXNzaW9uIiwibmFtZSIsIkVycm9yIiwibGVuZ3RoIiwic2hpZnQiLCJjYWxsIiwidW5kZWZpbmVkIiwiZXJyb3IiLCJlcnJvckNvZGUiLCJlcnJvcl9jb2RlIiwiZXJyb3JNc2ciLCJlcnJvcl9tc2ciLCJKU09OIiwic3RyaW5naWZ5Il0sIm1hcHBpbmdzIjoiQUFBQSxhQUNBLElBQUlBLFVBQWFDLE1BQVFBLEtBQUtELFdBQWMsU0FBVUUsRUFBU0MsRUFBWUMsRUFBR0MsR0FFMUUsT0FBTyxJQUFLRCxJQUFNQSxFQUFJRSxXQUFVLFNBQVVDLEVBQVNDLEdBQy9DLFNBQVNDLEVBQVVDLEdBQVMsSUFBTUMsRUFBS04sRUFBVU8sS0FBS0YsSUFBVyxNQUFPRyxHQUFLTCxFQUFPSyxJQUNwRixTQUFTQyxFQUFTSixHQUFTLElBQU1DLEVBQUtOLEVBQWlCLE1BQUVLLElBQVcsTUFBT0csR0FBS0wsRUFBT0ssSUFDdkYsU0FBU0YsRUFBS0ksR0FKbEIsSUFBZUwsRUFJYUssRUFBT0MsS0FBT1QsRUFBUVEsRUFBT0wsUUFKMUNBLEVBSXlESyxFQUFPTCxNQUpoREEsYUFBaUJOLEVBQUlNLEVBQVEsSUFBSU4sR0FBRSxTQUFVRyxHQUFXQSxFQUFRRyxPQUlUTyxLQUFLUixFQUFXSyxHQUNsR0gsR0FBTU4sRUFBWUEsRUFBVWEsTUFBTWhCLEVBQVNDLEdBQWMsS0FBS1MsWUFHbEVPLGdCQUFtQmxCLE1BQVFBLEtBQUtrQixpQkFBb0IsU0FBVUMsR0FDOUQsT0FBUUEsR0FBT0EsRUFBSUMsV0FBY0QsRUFBTSxDQUFFRSxRQUFXRixJQUV4REcsT0FBT0MsZUFBZUMsUUFBUyxhQUFjLENBQUVmLE9BQU8sSUNidEQsTUFBQWdCLFNBQUFQLGdCQUFBUSxRQUFBLFdBQ0FDLGtCQUFBVCxnQkFBQVEsUUFBQSxvQkFDQUUsTUFBQUYsUUFBQSxnQkFNTUcsWUFBYyxPQUlkQyxVQUFZLEdBZ0JsQixNQUFxQkMsSUErQmpCQyxZQUFtQkMsRUFBaUJDLEdBakI1QmxDLEtBQUFtQyxNQUtGLEdBS0VuQyxLQUFBb0MsbUJBQW9CLEVBUXhCcEMsS0FBS2lDLFFBQVVBLEVBQ2ZqQyxLQUFLa0MsTUFBUUEsRUFHYmxDLEtBQUtxQyxtQkFDQXJCLEtBQU1KLElBQ0hnQixNQUFBVSxNQUNLQyxFQUFFM0IsR0FDRjRCLEtBQUssT0FDTEMsUUFFUkMsTUFBTzlCLElBQ0pnQixNQUFBVSxNQUNLSyxFQUFFL0IsR0FDRjRCLEtBQUssT0FDTEMsUUFJYkcsWUFBWSxLQUNINUMsS0FBS29DLG9CQUNOcEMsS0FBS29DLG1CQUFvQixFQUN6QnBDLEtBQUs2QyxlQUNBN0IsS0FBSyxLQUNGaEIsS0FBS29DLG1CQUFvQixJQUU1Qk0sTUFBTzlCLElBQ0pnQixNQUFBVSxNQUNLSyxFQUFFL0IsR0FDRjRCLEtBQUssT0FDTEMsTUFDTHpDLEtBQUtvQyxtQkFBb0IsTUFHdEMsS0ErQk1KLGFBQWFjLEVBQWdCQyxHRHJFdEMsT0FBT2hELFVBQVVDLFVBQU0sT0FBUSxHQUFRLFlDc0V2QyxPQUFPLElBQUlLLFFBQVEsQ0FBQ0MsRUFBU0MsS0FDekJQLEtBQUttQyxNQUFNYSxLQUFLLENBQ1pGLE9BQUFBLEVBQ0FDLE9BQUFBLEVBQ0F6QyxRQUFBQSxFQUNBQyxPQUFBQSxTQThCQ3lCLEtBQ1RjLEVBQ0FDLEdEL0ZBLE9BQU9oRCxVQUFVQyxVQUFNLE9BQVEsR0FBUSxZQ2lHdkMsTUFFTWlELEVBQVUsQ0FDWkMsSUFIUSw2QkFBNkJDLG1CQUFtQkwsS0FJeERNLE1BQU0sRUFDTkMsR0FBRS9CLE9BQUFnQyxPQUFBLENBQ0VDLGFBQWN2RCxLQUFLaUMsUUFDbkJ1QixFQUFHM0IsYUFDQWtCLElBSUxVLEVBQVU5QixrQkFBQU4sUUFBUTRCLEdBU3hCLE9BUEFRLEVBQVFmLE1BQU9nQixJQUNYOUIsTUFBQVUsTUFDS0ssRUFBRSwyQ0FBMkNHLE9BQVlZLEtBQ3pEbEIsS0FBSyxPQUNMQyxRQUdGZ0IsS0FxQkV6QixLQUNUMkIsRUFDQUMsRUFDQUMsRUFDQUMsR0Q3SEEsT0FBTy9ELFVBQVVDLFVBQU0sT0FBUSxHQUFRLFlDaUl2QyxNQUFNK0MsRUFNRixDQUNBZ0IsUUFBU0osRUFBSUssV0FDYkMsVUFBV0MsT0FBT0MsT0FDZCxHQUNBRCxPQUFPLEtBQUt6QyxTQUFBSixRQUFPK0MsWUFBWSxHQUFHSixTQUFTLFdBQzdDQSxZQWFOLE9BVklKLElBQ0FiLEVBQU9hLFFBQVVBLEdBRWpCQyxJQUNBZCxFQUFPYyxXQUFhQSxHQUVwQkMsSUFDQWYsRUFBT2UsU0FBV0EsR0FHZixJQUFJekQsUUFBU0MsSUFDaEJOLEtBQUtxRSxhQUFhLGdCQUFpQnRCLEdBQzlCL0IsS0FBSyxLQUNGaEIsS0FBS2tDLE1BQU1vQyxPQUNYaEUsTUFFSG9DLE1BQU85QixJQUNKZ0IsTUFBQVUsTUFDS0ssRUFBRS9CLEdBQ0Y0QixLQUFLLE9BQ0xDLE1BQ0xuQyxXQVNGMEIsbUJEOUlWLE9BQU9qQyxVQUFVQyxVQUFNLE9BQVEsR0FBUSxZQ2dKdkMsTUFBTXVFLFFBQWlCdkUsS0FBS3FFLGFBQWEsNkJBQThCLEtBRWpFRyxZQUFFQSxHQUFnQkQsRUFFeEIsSUFBSUUsR0FBSyxFQU9ULE9BTkFELEVBQVlFLFFBQVNDLElBQ08sYUFBcEJBLEVBQVdDLE9BQ1hILEdBQUssS0FJUkEsRUFPRXBFLFFBQVFDLFFBQVEsMENBTlpELFFBQVFFLE9BQ1gsSUFBSXNFLE1BQ0EsdUZBVUY3QyxlRHhKVixPQUFPakMsVUFBVUMsVUFBTSxPQUFRLEdBQVEsWUN5SnZDLEdBQUlBLEtBQUttQyxNQUFPLENBQ1osSUFBSyxJQUFJSSxFQUFJLEVBQUdBLEdBQUtULFdBQ1MsSUFBdEI5QixLQUFLbUMsTUFBTTJDLE9BRGF2QyxHQUFLLEVBQUcsQ0FLcEMsTUFBTTNCLEVBQUlaLEtBQUttQyxNQUFNNEMsUUFHZjNCLFFBQWFwRCxLQUFLZ0YsS0FBS3BFLEVBQUVrQyxPQUFRbEMsRUFBRW1DLFFBRXpDLFFBQXNCa0MsSUFBbEI3QixFQUFLbUIsVUFBNEMsT0FBbEJuQixFQUFLbUIsU0FDcEMzRCxFQUFFTixRQUFROEMsRUFBS21CLGVBQ1osR0FBSW5CLEVBQUs4QixNQUFPLENBQ25CLE1BQU1DLEVBQVkvQixFQUFLOEIsTUFBTUUsV0FDdkJDLEVBQVdqQyxFQUFLOEIsTUFBTUksVUFFNUIxRSxFQUFFTCxPQUNFLDBCQUEwQkssRUFBRWtDLHVDQUF1Q3FDLE1BQWNFLFVBR3JGekUsRUFBRUwsT0FDRSwwQkFBMEJLLEVBQUVrQyx1RUFBdUV5QyxLQUFLQyxVQUFVcEMsTUFLOUgsT0FBTy9DLFFBQVFDLFVBR25CLE9BQU9ELFFBQVFFLE9BQU8sSUFBSXNFLE1BQU0scUNBaFN4Q3JELFFBQUFILFFBQUFVIiwiZmlsZSI6ImFwaS9hcGkuanMiLCJzb3VyY2VzQ29udGVudCI6W251bGwsImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCByZXF1ZXN0IGZyb20gJ3JlcXVlc3QtcHJvbWlzZSc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuLi9leHRyYS9sb2cnO1xuaW1wb3J0IFN0YXRzIGZyb20gJy4uL2V4dHJhL3N0YXRzJztcblxuLyoqXG4gKiBWSyBBUEkgdmVyc2lvbiB1c2VkIGJ5IEFQSS5cbiAqL1xuY29uc3QgQVBJX1ZFUlNJT04gPSAnNS45NSc7XG4vKipcbiAqIEFQSSBxdW90YSwgaW4gcmVxdWVzdHMgcGVyIHNlY29uZFxuICovXG5jb25zdCBBUElfUVVPVEEgPSAyMDtcblxuLyoqXG4gKiBVc2VkIHRvIGNhbGwgQVBJIG1ldGhvZHMuXG4gKlxuICogWW91IGNhbiBnZXQgdGhlIFtbQVBJXV0gb2JqZWN0IGZyb20gYSBbW0NvbnRleHRdXSBvYmplY3Q6XG4gKiBgYGBqc1xuICogLy8gQXNzdW1pbmcgeW91ciBDb250ZXh0IG9iamVjdCBpcyAkXG4gKiB2YXIgYXBpID0gJC5hcGlcbiAqIGBgYFxuICpcbiAqIE9yIGZyb20gW1tDb3JlXV0gKGFmdGVyIGluaXRpYWxpemF0aW9uIHdpdGggW1tib3RdXTpcbiAqIGBgYGpzXG4gKiB2YXIgYXBpID0gY29yZS5hcGlcbiAqIGBgYFxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBUEkge1xuICAgIC8qKlxuICAgICAqIFZLIEFQSSB0b2tlbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHZrVG9rZW46IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFN0YXRzIG9iamVjdC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRzOiBTdGF0cztcblxuICAgIC8qKlxuICAgICAqIFF1ZXVlIG9mIHNjaGVkdWxlZCBBUEkgY2FsbHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBxdWV1ZToge1xuICAgICAgICBtZXRob2Q6IHN0cmluZztcbiAgICAgICAgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgICAgICByZXNvbHZlOiBGdW5jdGlvbjtcbiAgICAgICAgcmVqZWN0OiBGdW5jdGlvbjtcbiAgICB9W10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIElzIHRoZSBxdWV1ZSBiZWluZyBwcm9jZXNzZWQgbm93P1xuICAgICAqL1xuICAgIHByaXZhdGUgaXNRdWV1ZVByb2Nlc3NpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgW1tBUEldXS5cbiAgICAgKiBAcGFyYW0gdmtUb2tlbiBWSyBBUEkgdG9rZW5cbiAgICAgKiBAcGFyYW0gc3RhdHMgW1tTdGF0c11dIG9iamVjdFxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcih2a1Rva2VuOiBzdHJpbmcsIHN0YXRzOiBTdGF0cykge1xuICAgICAgICB0aGlzLnZrVG9rZW4gPSB2a1Rva2VuO1xuICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7XG5cbiAgICAgICAgLy8gQ2hlY2sgcGVybWlzc2lvbnNcbiAgICAgICAgdGhpcy5jaGVja1Blcm1pc3Npb25zKClcbiAgICAgICAgICAgIC50aGVuKChlKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgbG9nKClcbiAgICAgICAgICAgICAgICAgICAgLmkoZSlcbiAgICAgICAgICAgICAgICAgICAgLmZyb20oJ2FwaScpXG4gICAgICAgICAgICAgICAgICAgIC5ub3coKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGUpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICBsb2coKVxuICAgICAgICAgICAgICAgICAgICAudyhlKVxuICAgICAgICAgICAgICAgICAgICAuZnJvbSgnYXBpJylcbiAgICAgICAgICAgICAgICAgICAgLm5vdygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RhcnQgdGhlIHF1ZXVlIHByb2Nlc3NpbmdcbiAgICAgICAgc2V0SW50ZXJ2YWwoKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzUXVldWVQcm9jZXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1F1ZXVlUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUXVldWUoKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUXVldWVQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAudyhlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mcm9tKCdhcGknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNRdWV1ZVByb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlcyBhIGNhbGwgdG8gYSBWSyBBUEkgTWV0aG9kLlxuICAgICAqXG4gICAgICogQWZ0ZXIgdGhlIGNhbGwgY29tcGxldGVzLCBhIGNoZWNrIHdpbGwgYmUgcGVyZm9ybWVkIHRvIHNlZSBpZiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bCBvciBub3QsXG4gICAgICogYW5kIGluIHRoZSBsYXR0ZXIgY2FzZSBhIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbWV0aG9kIFZLIEFQSSBtZXRob2QgbmFtZVxuICAgICAqIEBwYXJhbSBwYXJhbXMgcGFyYW1ldGVycyBmb3IgdGhlIG1ldGhvZCwgYGFjY2Vzc190b2tlbmAgYW5kIGB2YCB3aWxsIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKlxuICAgICAqIEByZXR1cm4gcHJvbWlzZSwgd2hpY2ggcmVzb2x2ZXMgd2l0aCBganNvbi5yZXNwb25zZWAgd2hlbiB0aGUgcmVxdWVzdCBpcyBjb21wbGV0ZWRcbiAgICAgKiBhbmQgYSByZXNwb25zZSBpcyBnaXZlbiwgYW5kIHJlamVjdHMgaWYgYW4gZXJyb3IgaGFwcGVuZWRcbiAgICAgKlxuICAgICAqIEBleGFtcGxlXG4gICAgICogYGBgXG4gICAgICogY29yZS5jbWQoJ2luZm8nLCBhc3luYyAkID0+IHtcbiAgICAgKiAgICB2YXIgdWlkID0gJC5vYmouZnJvbV9pZDtcbiAgICAgKlxuICAgICAqICAgIC8vIENhbGwgVksgQVBJIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlclxuICAgICAqICAgIHZhciByZXNwb25zZSA9IGF3YWl0ICQuYXBpLnNjaGVkdWxlQ2FsbCgndXNlcnMuZ2V0JywgeyB1c2VyX2lkczogdWlkIH0pO1xuICAgICAqICAgIHZhciB1c2VySW5mbyA9IHJlc3BvbnNlWzBdO1xuICAgICAqXG4gICAgICogICAgdmFyIG5hbWUgPSB1c2VySW5mby5maXJzdF9uYW1lO1xuICAgICAqICAgIHZhciBzdXJuYW1lID0gdXNlckluZm8ubGFzdF9uYW1lO1xuICAgICAqXG4gICAgICogICQudGV4dChgVXNlciBJRDogJHt1aWR9XFxuTmFtZTogJHtuYW1lfSAke3N1cm5hbWV9YCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIHNjaGVkdWxlQ2FsbChtZXRob2Q6IHN0cmluZywgcGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogUHJvbWlzZTxhbnk+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KTogdm9pZCA9PiB7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCBhIFZLIEFQSSBNZXRob2QuXG4gICAgICpcbiAgICAgKiAqKkl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byB1c2UgW1tzY2hlZHVsZUNhbGxdXVxuICAgICAqIGluc3RlYWQgdG8gbm90IGV4Y2VlZCB0aGUgQVBJIHF1b3RhIGFuZCB0byBjaGVjayB3aGV0aGVyIHRoZSBjYWxsIHdhcyBzdWNjZXNzZnVsIG9yIG5vdCEqKlxuICAgICAqXG4gICAgICogQHBhcmFtIG1ldGhvZCBWSyBBUEkgbWV0aG9kIG5hbWVcbiAgICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnMgZm9yIHRoZSBtZXRob2QsIGBhY2Nlc3NfdG9rZW5gIGFuZCBgdmAgd2lsbCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYFxuICAgICAqIGNvcmUuY21kKCdpbmZvJywgYXN5bmMgJCA9PiB7XG4gICAgICogICAgdmFyIHVpZCA9ICQub2JqLmZyb21faWQ7XG4gICAgICpcbiAgICAgKiAgICAvLyBDYWxsIFZLIEFQSSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXJcbiAgICAgKiAgICB2YXIganNvbiA9IGF3YWl0ICQuYXBpLmNhbGwoJ3VzZXJzLmdldCcsIHsgdXNlcl9pZHM6IHVpZCB9KTtcbiAgICAgKiAgICB2YXIgdXNlckluZm8gPSBqc29uLnJlc3BvbnNlWzBdO1xuICAgICAqXG4gICAgICogICAgdmFyIG5hbWUgPSB1c2VySW5mby5maXJzdF9uYW1lO1xuICAgICAqICAgIHZhciBzdXJuYW1lID0gdXNlckluZm8ubGFzdF9uYW1lO1xuICAgICAqXG4gICAgICogICQudGV4dChgVXNlciBJRDogJHt1aWR9XFxuTmFtZTogJHtuYW1lfSAke3N1cm5hbWV9YCk7XG4gICAgICogfSk7XG4gICAgICogYGBgXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGNhbGwoXG4gICAgICAgIG1ldGhvZDogc3RyaW5nLFxuICAgICAgICBwYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0sXG4gICAgKTogUHJvbWlzZTxhbnk+IHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2FwaS52ay5jb20vbWV0aG9kLyR7ZW5jb2RlVVJJQ29tcG9uZW50KG1ldGhvZCl9YDtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICAgICAgdXJpOiB1cmwsXG4gICAgICAgICAgICBqc29uOiB0cnVlLFxuICAgICAgICAgICAgcXM6IHtcbiAgICAgICAgICAgICAgICBhY2Nlc3NfdG9rZW46IHRoaXMudmtUb2tlbiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY2FtZWxjYXNlXG4gICAgICAgICAgICAgICAgdjogQVBJX1ZFUlNJT04sXG4gICAgICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwcm9taXNlID0gcmVxdWVzdChvcHRpb25zKTtcblxuICAgICAgICBwcm9taXNlLmNhdGNoKChlcnI6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBsb2coKVxuICAgICAgICAgICAgICAgIC53KGBFcnJvciBvY2N1cmVkIHdoaWxlIGNhbGxpbmcgQVBJIG1ldGhvZCAnJHttZXRob2R9JzogJHtlcnJ9YClcbiAgICAgICAgICAgICAgICAuZnJvbSgnYXBpJylcbiAgICAgICAgICAgICAgICAubm93KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNlbmRzIGEgbWVzc2FnZSB0byBhIHVzZXIgdmlhIFBlZXIgSUQuXG4gICAgICpcbiAgICAgKiAqKk5vdGUgdGhhdCBpdCBpcyBtdWNoIGVhc2llciB0byB1c2UgdGhlIFtbQ29udGV4dF1dIG9iamVjdCBwYXNzZWQgdG8gaGFuZGxlcnNcbiAgICAgKiB0byBjb21wb3NlIGFuZCBzZW5kIG1lc3NhZ2VzLCBrZXlib2FyZHMgYW5kIGF0dGFjaG1lbnRzISoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGlkIHBlZXIgSURcbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRleHQgKioocmVxdWlyZWQsIGlmIGF0dGFjaG1lbnQgaXMgZW1wdHkpKipcbiAgICAgKiBAcGFyYW0gYXR0YWNobWVudCBsaXN0IG9mIGF0dGFjaG1lbnRzLCBjb21tYS1zZXBhcmF0ZWRcbiAgICAgKiAoc2VlIFtWSyBBUEkgRG9jc10oaHR0cHM6Ly92ay5jb20vZGV2L21lc3NhZ2VzLnNlbmQpIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uKVxuICAgICAqICoqKHJlcXVpcmVkIGlmIG1lc3NhZ2UgaXMgZW1wdHkpKipcbiAgICAgKiBAcGFyYW0ga2V5Ym9hcmQganNvbiBvZiBrZXlib2FyZFxuICAgICAqXG4gICAgICogQGV4YW1wbGVcbiAgICAgKiBgYGBcbiAgICAgKiBhd2FpdCBhcGkuc2VuZCgxLCAnSGVsbG8hJywgJ3Bob3RvNjQ5Ml80NTYyNDA3NzgnKVxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzZW5kKFxuICAgICAgICBwaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICAgICAgbWVzc2FnZTogc3RyaW5nLFxuICAgICAgICBhdHRhY2htZW50OiBzdHJpbmcsXG4gICAgICAgIGtleWJvYXJkOiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8qIGdsb2JhbCBCaWdJbnQgKi9cblxuICAgICAgICBjb25zdCBwYXJhbXM6IHtcbiAgICAgICAgICAgIHBlZXJfaWQ6IHN0cmluZztcbiAgICAgICAgICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgICAgICAgICBhdHRhY2htZW50Pzogc3RyaW5nO1xuICAgICAgICAgICAga2V5Ym9hcmQ/OiBzdHJpbmc7XG4gICAgICAgICAgICByYW5kb21faWQ6IHN0cmluZztcbiAgICAgICAgfSA9IHtcbiAgICAgICAgICAgIHBlZXJfaWQ6IHBpZC50b1N0cmluZygpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9jYW1lbGNhc2VcbiAgICAgICAgICAgIHJhbmRvbV9pZDogQmlnSW50LmFzSW50TiggLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvY2FtZWxjYXNlXG4gICAgICAgICAgICAgICAgMzIsXG4gICAgICAgICAgICAgICAgQmlnSW50KGAweCR7Y3J5cHRvLnJhbmRvbUJ5dGVzKDYpLnRvU3RyaW5nKCdoZXgnKX1gKSxcbiAgICAgICAgICAgICkudG9TdHJpbmcoKSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgcGFyYW1zLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhdHRhY2htZW50KSB7XG4gICAgICAgICAgICBwYXJhbXMuYXR0YWNobWVudCA9IGF0dGFjaG1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleWJvYXJkKSB7XG4gICAgICAgICAgICBwYXJhbXMua2V5Ym9hcmQgPSBrZXlib2FyZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUNhbGwoJ21lc3NhZ2VzLnNlbmQnLCBwYXJhbXMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRzLnNlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAudyhlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZyb20oJ2FwaScpXG4gICAgICAgICAgICAgICAgICAgICAgICAubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSByZXF1aXJlZCBwZXJtaXNzaW9ucyBmb3IgYm90IHRvIHdvcmsgcHJvcGVybHkgYXJlIHByZXNlbnQsXG4gICAgICogYW5kIGVtaXRzIGEgd2FybmluZyBpZiB0aGF0IGlzIG5vdCB0aGUgY2FzZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGNoZWNrUGVybWlzc2lvbnMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHRva2VuIGhhcyB0aGUgcmVxdWlyZWQgcGVybWlzc2lvbnNcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNjaGVkdWxlQ2FsbCgnZ3JvdXBzLmdldFRva2VuUGVybWlzc2lvbnMnLCB7fSk7XG5cbiAgICAgICAgY29uc3QgeyBwZXJtaXNzaW9ucyB9ID0gcmVzcG9uc2U7XG5cbiAgICAgICAgbGV0IG9rID0gZmFsc2U7XG4gICAgICAgIHBlcm1pc3Npb25zLmZvckVhY2goKHBlcm1pc3Npb246IGFueSk6IHZvaWQgPT4geyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIGlmIChwZXJtaXNzaW9uLm5hbWUgPT09ICdtZXNzYWdlcycpIHtcbiAgICAgICAgICAgICAgICBvayA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICdUb2tlbiBwZXJtaXNzaW9uIGBtZXNzYWdlc2AgaXMgbWlzc2luZy4gQm90IHdpbGwgYmUgdW5hYmxlIHRvIHNlbmQgYW55IG1lc3NhZ2VzJyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCdUb2tlbiBwZXJtaXNzaW9uIGBtZXNzYWdlc2AgaXMgcHJlc2VudCcpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmUgZm9yd2FyZCB0aHJvdWdoIHRoZSBxdWV1ZSwgcHJvY2Vzc2luZyBhdCBtb3N0IFtbQVBJX1FVT1RBXV0gaXRlbXNcbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHByb2Nlc3NRdWV1ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgaWYgKHRoaXMucXVldWUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IEFQSV9RVU9UQTsgaSArPSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGUgPSB0aGlzLnF1ZXVlLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcCAqL1xuICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCB0aGlzLmNhbGwoZS5tZXRob2QsIGUucGFyYW1zKTtcblxuICAgICAgICAgICAgICAgIGlmIChqc29uLnJlc3BvbnNlICE9PSB1bmRlZmluZWQgJiYganNvbi5yZXNwb25zZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBlLnJlc29sdmUoanNvbi5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqc29uLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGpzb24uZXJyb3IuZXJyb3JfY29kZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBqc29uLmVycm9yLmVycm9yX21zZztcblxuICAgICAgICAgICAgICAgICAgICBlLnJlamVjdChcbiAgICAgICAgICAgICAgICAgICAgICAgIGBBbiBBUEkgY2FsbCB0byBtZXRob2QgJyR7ZS5tZXRob2R9JyBmYWlsZWQgZHVlIHRvIGFuIEFQSSBlcnJvciAjJHtlcnJvckNvZGV9OiAke2Vycm9yTXNnfWAsXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgICAgICAgICBgQW4gQVBJIGNhbGwgdG8gbWV0aG9kICcke2UubWV0aG9kfScgZmFpbGVkIGR1ZSB0byBhbiB1bmtub3duIEFQSSBlcnJvci4gVGhlIEFQSSByZXNwb25kZWQgd2l0aDogJHtKU09OLnN0cmluZ2lmeShqc29uKX1gLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gcXVldWUgZm9yIEFQSSBjYWxscyBmb3VuZCcpKTtcbiAgICB9XG59XG4iXX0=