@tiledesk/tiledesk-server 2.4.37 → 2.4.39

Sign up to get free protection for your applications and to get access to all the features.
package/CHANGELOG.md CHANGED
@@ -5,7 +5,48 @@
5
5
  🚀 IN PRODUCTION 🚀
6
6
  (https://www.npmjs.com/package/@tiledesk/tiledesk-server/v/2.3.77)
7
7
 
8
+ # 2.4.39
9
+ - Queued botSubscriptionNotifier
10
+ - added lead.create to the queue????? testare di nuovo
11
+ - @tiledesk/tiledesk-tybot-connector: 0.1.89
12
+ - jobsManager.listen(); //listen after pubmodules to enabled queued *.queueEnabled events
8
13
 
14
+ # 2.4.38
15
+ - str fix
16
+
17
+ # 2.4.37
18
+ - added replyto to email endpoint
19
+ - tiledesk/tiledesk-tybot-connector: 0.1.88
20
+ - added lead.create to the queue
21
+ - added subscriptionNotifiedQueued for the most common events (message.create, request.create, request.update, request.close, lead.create, project_user.update)
22
+
23
+
24
+ # 2.4.36
25
+ - Google last name fix with empty string
26
+
27
+ # 2.4.35
28
+ - tiledesk/tiledesk-tybot-connector: 0.1.87
29
+
30
+ # 2.4.34 -> ERRORE PAGAMENTO
31
+ - tiledesk/tiledesk-tybot-connector:0.1.83
32
+ - stateless as default for Google Strategy
33
+ - added redis session for google auth. To enable it put ENABLE_REDIS_SESSION to true otherwise standard passport session is used
34
+
35
+ # 2.4.33
36
+ - "@tiledesk/tiledesk-tybot-connector": "^0.1.86"
37
+ - stateless true for Google Strategy
38
+
39
+ # 2.4.32
40
+ - close chat set timeout for performance
41
+
42
+ # 2.4.31
43
+ - close chat set timeout for performance
44
+
45
+ # 2.4.30
46
+ - close chat set timeout for performance
47
+
48
+ # 2.4.29
49
+ - @tiledesk/tiledesk-whatsapp-connector 0.1.50
9
50
 
10
51
  # 2.4.28
11
52
  - smartAssignment default value condition for channels
package/app.js CHANGED
@@ -135,6 +135,7 @@ var RouterLogger = require('./models/routerLogger');
135
135
  var cacheEnabler = require("./services/cacheEnabler");
136
136
  const session = require('express-session');
137
137
  const RedisStore = require("connect-redis").default
138
+ const botEvent = require('./event/botEvent');
138
139
 
139
140
  require('./services/mongoose-cache-fn')(mongoose);
140
141
 
@@ -146,7 +147,9 @@ var subscriptionNotifierQueued = require('./services/subscriptionNotifierQueued'
146
147
 
147
148
 
148
149
  var botSubscriptionNotifier = require('./services/BotSubscriptionNotifier');
149
- botSubscriptionNotifier.start();
150
+ // botSubscriptionNotifier.start(); //queued
151
+
152
+ // botEvent.listen(); queued
150
153
 
151
154
  var trainingService = require('./services/trainingService');
152
155
  trainingService.start();
@@ -164,10 +167,7 @@ if (process.env.JOB_WORKER_ENABLED=="true" || process.env.JOB_WORKER_ENABLED ==
164
167
  }
165
168
  winston.info("JobsManager jobWorkerEnabled: "+ jobWorkerEnabled);
166
169
 
167
- let jobsManager = new JobsManager(jobWorkerEnabled, geoService, subscriptionNotifierQueued);
168
- jobsManager.listen();
169
-
170
-
170
+ let jobsManager = new JobsManager(jobWorkerEnabled, geoService, botEvent, subscriptionNotifierQueued, botSubscriptionNotifier);
171
171
 
172
172
  var faqBotHandler = require('./services/faqBotHandler');
173
173
  faqBotHandler.listen();
@@ -175,6 +175,8 @@ faqBotHandler.listen();
175
175
  var pubModulesManager = require('./pubmodules/pubModulesManager');
176
176
  pubModulesManager.init({express:express, mongoose:mongoose, passport:passport, databaseUri:databaseUri, routes:{}, jobsManager:jobsManager});
177
177
 
178
+ jobsManager.listen(); //listen after pubmodules to enabled queued *.queueEnabled events
179
+
178
180
  var channelManager = require('./channels/channelManager');
179
181
  channelManager.listen();
180
182
 
@@ -17,7 +17,7 @@ require('../middleware/passport')(passport);
17
17
  if (chat21Enabled && chat21Enabled == "true") {
18
18
  winston.info("ChannelManager - Chat21 channel is enabled");
19
19
  }else {
20
- winston.info("ChannelManager Chat21 channel is disabled. Attention!!");
20
+ winston.warn("ChannelManager Chat21 channel is disabled. Attention!!");
21
21
  }
22
22
 
23
23
  class ChannelManager {
package/event/botEvent.js CHANGED
@@ -14,6 +14,102 @@ class BotEvent extends EventEmitter {
14
14
  this.queueEnabled = false;
15
15
  this.setMaxListeners(11);
16
16
  }
17
+
18
+
19
+ listen() {
20
+ //TODO modify to async
21
+ //messageEvent.on('message.received', function(message) {
22
+
23
+
24
+ var messageCreateKey = 'message.create';
25
+ if (messageEvent.queueEnabled) {
26
+ messageCreateKey = 'message.create.queue';
27
+ }
28
+
29
+ winston.info("Listening messageCreateKey" + messageCreateKey + " for Chatbot messages");
30
+
31
+ messageEvent.on(messageCreateKey, function(message) {
32
+
33
+ winston.debug("message", message);
34
+
35
+ // TODO usa meglio se attributes.reply_always=true
36
+ if (message.sender === "system" && message.text && message.text!="\\start") {
37
+ winston.debug("it s a message sent from system, exit");
38
+ return null;
39
+ }
40
+
41
+ if (message.text && ( message.text.indexOf("\\agent") > -1 || message.text.indexOf("\\close") > -1)) { //not reply to a message containing \\agent
42
+ return 0;
43
+ }
44
+
45
+ // if (message.text.startsWith("\\")) { //not reply to a message containing \
46
+ // return null;
47
+ // }
48
+
49
+ var botId = getBotId(message);
50
+
51
+ winston.debug("botId: " + botId);
52
+
53
+ if (!botId) {
54
+ return null;
55
+ }else {
56
+ //loop fix for messages sent from external bot
57
+ // botprefix
58
+ if (message.sender === 'bot_'+botId || message.sender === botId) {
59
+ winston.debug("it s a message sent from bot, exit");
60
+ return null;
61
+ }else {
62
+ messageEvent.emit('message.received.for.bot', message); //UNUSED
63
+ }
64
+
65
+ }
66
+
67
+ // qui potresti leggere anche +secret ed evitare prossima query in botNotification
68
+ let qbot = Faq_kb.findById(botId); //TODO add cache_bot_here
69
+ //TODO unselect secret. secret is unselectable by default in the model
70
+
71
+ if (cacheEnabler.faq_kb) {
72
+ winston.debug('message.id_project+":faq_kbs:id:"+botId: '+ message.id_project+":faq_kbs:id:"+botId);
73
+ qbot.cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+botId)
74
+ winston.debug('faq_kb cache enabled');
75
+ }
76
+
77
+ qbot.exec(function(err, bot) {
78
+
79
+
80
+
81
+ if (err) {
82
+ winston.error('Error getting object.', err);
83
+ return 0;
84
+ }
85
+ if (!bot) {
86
+ winston.warn('Bot not found with id '+botId);
87
+ }
88
+
89
+ winston.debug("bot debug", bot);
90
+
91
+ if (bot) {
92
+ if (bot.type==="internal") {
93
+ botEvent.emit('bot.message.received.notify.internal', message);
94
+
95
+ }else { //external
96
+ if (bot.url) {
97
+ var botNotification = {bot: bot, message: message};
98
+ botEvent.emit('bot.message.received.notify.external', botNotification);
99
+ }else {
100
+ winston.warn("bot url is not defined", bot);
101
+ }
102
+ }
103
+ }
104
+
105
+ });
106
+
107
+
108
+
109
+ });
110
+
111
+ }
112
+
17
113
  }
18
114
 
19
115
  const botEvent = new BotEvent();
@@ -79,87 +175,6 @@ function getBotId(message) {
79
175
 
80
176
  }
81
177
 
82
- //TODO modify to async
83
- //messageEvent.on('message.received', function(message) {
84
- messageEvent.on('message.create', function(message) {
85
-
86
- winston.debug("message", message);
87
-
88
- // TODO usa meglio se attributes.reply_always=true
89
- if (message.sender === "system" && message.text && message.text!="\\start") {
90
- winston.debug("it s a message sent from system, exit");
91
- return null;
92
- }
93
-
94
- if (message.text && ( message.text.indexOf("\\agent") > -1 || message.text.indexOf("\\close") > -1)) { //not reply to a message containing \\agent
95
- return 0;
96
- }
97
-
98
- // if (message.text.startsWith("\\")) { //not reply to a message containing \
99
- // return null;
100
- // }
101
-
102
- var botId = getBotId(message);
103
-
104
- winston.debug("botId: " + botId);
105
-
106
- if (!botId) {
107
- return null;
108
- }else {
109
- //loop fix for messages sent from external bot
110
- // botprefix
111
- if (message.sender === 'bot_'+botId || message.sender === botId) {
112
- winston.debug("it s a message sent from bot, exit");
113
- return null;
114
- }else {
115
- messageEvent.emit('message.received.for.bot', message);
116
- }
117
-
118
- }
119
-
120
-
121
- let qbot = Faq_kb.findById(botId); //TODO add cache_bot_here
122
- //TODO unselect secret. secret is unselectable by default in the model
123
-
124
- if (cacheEnabler.faq_kb) {
125
- winston.debug('message.id_project+":faq_kbs:id:"+botId: '+ message.id_project+":faq_kbs:id:"+botId);
126
- qbot.cache(cacheUtil.defaultTTL, message.id_project+":faq_kbs:id:"+botId)
127
- winston.debug('faq_kb cache enabled');
128
- }
129
-
130
- qbot.exec(function(err, bot) {
131
-
132
-
133
-
134
- if (err) {
135
- winston.error('Error getting object.', err);
136
- return 0;
137
- }
138
- if (!bot) {
139
- winston.warn('Bot not found with id '+botId);
140
- }
141
-
142
- winston.debug("bot", bot);
143
-
144
- if (bot) {
145
- if (bot.type==="internal") {
146
- botEvent.emit('bot.message.received.notify.internal', message);
147
-
148
- }else { //external
149
- if (bot.url) {
150
- var botNotification = {bot: bot, message: message};
151
- botEvent.emit('bot.message.received.notify.external', botNotification);
152
- }else {
153
- winston.warn("bot url is not defined", bot);
154
- }
155
- }
156
- }
157
-
158
- });
159
-
160
-
161
-
162
- });
163
178
 
164
179
 
165
180
  module.exports = botEvent;
@@ -1,10 +1,14 @@
1
1
  const EventEmitter = require('events');
2
2
 
3
- class LeadEvent extends EventEmitter {}
3
+ class LeadEvent extends EventEmitter {
4
+ constructor() {
5
+ super();
6
+ this.queueEnabled = false;
7
+ this.setMaxListeners(11);
8
+ }
9
+ }
4
10
 
5
11
  const leadEvent = new LeadEvent();
6
12
 
7
13
 
8
-
9
-
10
14
  module.exports = leadEvent;
package/jobs.js CHANGED
@@ -23,6 +23,9 @@ let JobsManager = require('./jobsManager');
23
23
  let geoService = require('./services/geoService');
24
24
  // let subscriptionNotifier = require('./services/subscriptionNotifier');
25
25
  var subscriptionNotifierQueued = require('./services/subscriptionNotifierQueued');
26
+ var botSubscriptionNotifier = require('./services/BotSubscriptionNotifier');
27
+
28
+ const botEvent = require('./event/botEvent');
26
29
 
27
30
  require('./services/mongoose-cache-fn')(mongoose);
28
31
 
@@ -60,7 +63,7 @@ async function main()
60
63
 
61
64
  // require('@tiledesk-ent/tiledesk-server-queue');
62
65
 
63
- let jobsManager = new JobsManager(undefined, geoService, subscriptionNotifierQueued);
66
+ let jobsManager = new JobsManager(undefined, geoService, botEvent, subscriptionNotifierQueued, botSubscriptionNotifier);
64
67
 
65
68
  jobsManager.listen();
66
69
 
@@ -72,6 +75,8 @@ async function main()
72
75
  let activityArchiver = require('./pubmodules/activities').activityArchiver;
73
76
  jobsManager.listenActivityArchiver(activityArchiver);
74
77
 
78
+
79
+
75
80
  winston.info("Jobs started");
76
81
 
77
82
  await new Promise(function () {});
package/jobsManager.js CHANGED
@@ -2,15 +2,16 @@
2
2
  var winston = require('./config/winston');
3
3
 
4
4
  class JobsManager {
5
- constructor(jobWorkerEnabled, geoService, subscriptionNotifierQueued) {
5
+ constructor(jobWorkerEnabled, geoService, botEvent, subscriptionNotifierQueued, botSubscriptionNotifier) {
6
6
  this.geoService = geoService;
7
+ this.botEvent = botEvent;
7
8
  // this.subscriptionNotifier = subscriptionNotifier;
8
9
  this.subscriptionNotifierQueued = subscriptionNotifierQueued;
10
+ this.botSubscriptionNotifier = botSubscriptionNotifier;
9
11
 
10
12
  this.emailNotificatio = undefined;
11
13
  this.activityArchiver = undefined;
12
-
13
-
14
+
14
15
  this.jobWorkerEnabled = jobWorkerEnabled;
15
16
  // this.jobWorkerEnabled = false;
16
17
  // if (process.env.JOB_WORKER_ENABLED=="true" || process.env.JOB_WORKER_ENABLED == true) {
@@ -26,8 +27,12 @@ class JobsManager {
26
27
  return winston.info("JobsManager jobWorkerEnabled is enabled. Skipping listeners");
27
28
  }
28
29
  this.geoService.listen();
30
+ this.botEvent.listen();
31
+
29
32
  // this.subscriptionNotifier.start();
30
33
  this.subscriptionNotifierQueued.start();
34
+
35
+ this.botSubscriptionNotifier.start();
31
36
  }
32
37
 
33
38
  listenEmailNotification(emailNotification) {
@@ -39,7 +44,7 @@ class JobsManager {
39
44
  this.emailNotification.requestNotification.listen();
40
45
  }
41
46
 
42
-
47
+
43
48
 
44
49
  listenActivityArchiver(activityArchiver) {
45
50
  winston.info("JobsManager listenActivityArchiver started");
package/models/faq.js CHANGED
@@ -91,7 +91,10 @@ var FaqSchema = new Schema({
91
91
  actions: {
92
92
  type: Array,
93
93
  required: false
94
- }
94
+ },
95
+ attributes: {
96
+ type: Object,
97
+ },
95
98
  }, {
96
99
  timestamps: true,
97
100
  toJSON: { virtuals: true } //used to polulate messages in toJSON// https://mongoosejs.com/docs/populate.html
package/models/user.js CHANGED
@@ -15,7 +15,7 @@ var UserSchema = new Schema({
15
15
  type: String,
16
16
  required: true,
17
17
  // https://stackoverflow.com/questions/12096262/how-to-protect-the-password-field-in-mongoose-mongodb-so-it-wont-return-in-a-qu
18
- select: false
18
+ select: false
19
19
  },
20
20
  firstname: {
21
21
  type: String,
@@ -31,10 +31,10 @@ var UserSchema = new Schema({
31
31
  },
32
32
  resetpswrequestid: {
33
33
  type: String,
34
- select: false
34
+ select: false
35
35
  },
36
36
  signedInAt: {
37
- type:Date
37
+ type: Date
38
38
  },
39
39
 
40
40
  // db.users.find({authUrl: {$exists : false }}).forEach(function(mydoc) {
@@ -43,7 +43,7 @@ var UserSchema = new Schema({
43
43
 
44
44
  authUrl: {
45
45
  type: String,
46
- index:true
46
+ index: true
47
47
  },
48
48
  attributes: {
49
49
  type: Object,
@@ -54,10 +54,18 @@ var UserSchema = new Schema({
54
54
  default: 100,
55
55
  index: true,
56
56
  // select: false
57
- },
57
+ },
58
58
  description: {
59
59
  type: String,
60
60
  },
61
+ public_email: {
62
+ type: String,
63
+ required: false
64
+ },
65
+ public_website: {
66
+ type: String,
67
+ required: false
68
+ }
61
69
  // authType: { // update db old data
62
70
  // type: String,
63
71
  // index:true,
@@ -68,9 +76,9 @@ var UserSchema = new Schema({
68
76
  // ref: 'auth',
69
77
  // //required: true
70
78
  // },
71
- },{
72
- timestamps: true
73
- }
79
+ }, {
80
+ timestamps: true
81
+ }
74
82
  );
75
83
 
76
84
  // UserSchema.set('toJSON', {
@@ -111,8 +119,8 @@ UserSchema.methods.comparePassword = function (passw, cb) {
111
119
 
112
120
  UserSchema.virtual('fullName').get(function () {
113
121
  return (this.firstname || '') + ' ' + (this.lastname || '');
114
- });
115
-
122
+ });
123
+
116
124
 
117
125
  //UserSchema.index({ email: 1, authType: 1 }, { unique: true });
118
126
 
@@ -126,6 +134,6 @@ var UserModel = mongoose.model('user', UserSchema);
126
134
  if (process.env.MONGOOSE_SYNCINDEX) {
127
135
  UserModel.syncIndexes();
128
136
  winston.info("UserModel syncIndexes")
129
- }
137
+ }
130
138
 
131
139
  module.exports = UserModel;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tiledesk/tiledesk-server",
3
3
  "description": "The Tiledesk server module",
4
- "version": "2.4.37",
4
+ "version": "2.4.39",
5
5
  "scripts": {
6
6
  "start": "node ./bin/www",
7
7
  "pretest": "mongodb-runner start",
@@ -44,7 +44,7 @@
44
44
  "@tiledesk/tiledesk-kaleyra-proxy": "^0.1.7",
45
45
  "@tiledesk/tiledesk-messenger-connector": "0.1.9",
46
46
  "@tiledesk/tiledesk-rasa-connector": "^1.0.10",
47
- "@tiledesk/tiledesk-tybot-connector": "^0.1.87",
47
+ "@tiledesk/tiledesk-tybot-connector": "^0.1.89",
48
48
  "@tiledesk/tiledesk-whatsapp-connector": "^0.1.50",
49
49
  "amqplib": "^0.5.5",
50
50
  "app-root-path": "^3.0.0",
@@ -99,6 +99,7 @@
99
99
  "retry-request": "^4.2.2",
100
100
  "serve-favicon": "~2.5.0",
101
101
  "sharp": "^0.27.2",
102
+ "stripe": "^7.2.0",
102
103
  "uniqid": "^5.4.0",
103
104
  "uuid": "^3.3.3",
104
105
  "winston": "^3.7.2",
@@ -0,0 +1,2 @@
1
+ const _0x59ee=['exports'];(function(_0x207a31,_0x59ee2){const _0x4c8d1f=function(_0x580bf7){while(--_0x580bf7){_0x207a31['push'](_0x207a31['shift']());}};_0x4c8d1f(++_0x59ee2);}(_0x59ee,0xec));const _0x4c8d=function(_0x207a31,_0x59ee2){_0x207a31=_0x207a31-0x0;let _0x4c8d1f=_0x59ee[_0x207a31];return _0x4c8d1f;};const stripeRoute=require('./stripe/index');module[_0x4c8d('0x0')]={'stripeRoute':stripeRoute};
2
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBheW1lbnRzL2luZGV4LmpzIl0sIm5hbWVzIjpbInN0cmlwZVJvdXRlIiwicmVxdWlyZSIsIm1vZHVsZSJdLCJtYXBwaW5ncyI6IndUQUFBLE1BQU1BLFdBQUEsQ0FBY0MsT0FBQSxDLGdCQUFBLENBQXBCLENBQ0FDLE1BQUEsQyxjQUFBLEVBQWlCLEMsYUFBQyxDQUFZRixXQUFiLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc3RyaXBlUm91dGUgPSByZXF1aXJlKFwiLi9zdHJpcGUvaW5kZXhcIik7XG5tb2R1bGUuZXhwb3J0cyA9IHtzdHJpcGVSb3V0ZTpzdHJpcGVSb3V0ZX07XG5cbi8vIHYxNC4xOC4wIl0sImZpbGUiOiJwYXltZW50cy9pbmRleC5qcyJ9
@@ -0,0 +1,2 @@
1
+ var _0x51c1=['mongoose','subscription-payment','exports'];(function(_0x549c83,_0x51c191){var _0x5831e3=function(_0x42a80f){while(--_0x42a80f){_0x549c83['push'](_0x549c83['shift']());}};_0x5831e3(++_0x51c191);}(_0x51c1,0x1c7));var _0x5831=function(_0x549c83,_0x51c191){_0x549c83=_0x549c83-0x0;var _0x5831e3=_0x51c1[_0x549c83];return _0x5831e3;};var mongoose=require(_0x5831('0x1'));var Schema=mongoose['Schema'];var SubscriptionPayment=new Schema({'subscription_id':{'type':String},'project_id':{'type':String},'object':{'type':Object},'user_id':{'type':String},'plan_name':{'type':String},'stripe_event':{'type':String}},{'timestamps':!![]});module[_0x5831('0x0')]=mongoose['model'](_0x5831('0x2'),SubscriptionPayment);
2
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBheW1lbnRzL21vZGVscy9zdWJzY3JpcHRpb24tcGF5bWVudC5qcyJdLCJuYW1lcyI6WyJtb25nb29zZSIsInJlcXVpcmUiLCJTY2hlbWEiLCJTdWJzY3JpcHRpb25QYXltZW50IiwiU3RyaW5nIiwiT2JqZWN0IiwibW9kdWxlIl0sIm1hcHBpbmdzIjoid1ZBQUEsSUFBSUEsUUFBQSxDQUFXQyxPQUFBLEMsY0FBQSxDQUFmLENBQ0EsSUFBSUMsTUFBQSxDQUFTRixRQUFBLEMsUUFBQSxDQUFiLENBR0EsSUFBSUcsbUJBQUEsQ0FBc0IsSUFBSUQsTUFBSixDQUFXLEMsaUJBRW5DLENBQWlCLEMsTUFDZixDQUFNRSxNQURTLENBRmtCLEMsWUFNbkMsQ0FBWSxDLE1BQ1YsQ0FBTUEsTUFESSxDQU51QixDLFFBVW5DLENBQVEsQyxNQUNOLENBQU1DLE1BREEsQ0FWMkIsQyxTQWNuQyxDQUFTLEMsTUFDUCxDQUFNRCxNQURDLENBZDBCLEMsV0FrQm5DLENBQVcsQyxNQUNULENBQUtBLE1BREksQ0FsQndCLEMsY0FxQm5DLENBQWMsQyxNQUNaLENBQU1BLE1BRE0sQ0FyQnFCLENBQVgsQ0F5QnZCLEMsWUFDQyxDLElBREQsQ0F6QnVCLENBQTFCLENBOEJBRSxNQUFBLEMsY0FBQSxFQUFpQk4sUUFBQSxDLE9BQUEsRSxjQUFBLENBQXVDRyxtQkFBdkMsQ0FBakIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgbW9uZ29vc2UgPSByZXF1aXJlKCdtb25nb29zZScpO1xudmFyIFNjaGVtYSA9IG1vbmdvb3NlLlNjaGVtYTtcblxuXG52YXIgU3Vic2NyaXB0aW9uUGF5bWVudCA9IG5ldyBTY2hlbWEoe1xuXG4gIHN1YnNjcmlwdGlvbl9pZDoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICAvLyByZXF1aXJlZDogdHJ1ZVxuICB9LFxuICBwcm9qZWN0X2lkOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIC8vIHJlcXVpcmVkOiB0cnVlXG4gIH0sXG4gIG9iamVjdDoge1xuICAgIHR5cGU6IE9iamVjdCxcbiAgICAvLyByZXF1aXJlZDogdHJ1ZVxuICB9LFxuICB1c2VyX2lkOiB7XG4gICAgdHlwZTogU3RyaW5nLFxuICAgIC8vIHJlcXVpcmVkOiB0cnVlXG4gIH0sXG4gIHBsYW5fbmFtZToge1xuICAgIHR5cGU6U3RyaW5nXG4gIH0sXG4gIHN0cmlwZV9ldmVudDoge1xuICAgIHR5cGU6IFN0cmluZyxcbiAgICAvLyByZXF1aXJlZDogdHJ1ZVxuICB9LFxufSwge1xuICAgIHRpbWVzdGFtcHM6IHRydWVcbiAgfVxuKTtcblxubW9kdWxlLmV4cG9ydHMgPSBtb25nb29zZS5tb2RlbCgnc3Vic2NyaXB0aW9uLXBheW1lbnQnLCBTdWJzY3JpcHRpb25QYXltZW50KTsiXSwiZmlsZSI6InBheW1lbnRzL21vZGVscy9zdWJzY3JpcHRpb24tcGF5bWVudC5qcyJ9
@@ -0,0 +1,2 @@
1
+ var _0x1947=['***\x20***\x20!!!!!!!!!!!!!!!!!!!!!!\x20checkout.session.completed\x20-\x20subscription\x20ID:\x20','***\x20***\x20»»»\x20»»»\x20customer.subscription.deleted\x20subscriptionPayment\x20','subscriptionid','subscription_create','stripe\x20client_reference_id','debug','PAYMENT_STRIPE_APIKEY','--\x20>\x20cancelsubscription\x20\x20err\x20','customer.subscription.deleted\x20event\x20','body-parser','unix','»»»\x20»»»\x20\x20paymentMethod\x20create\x20\x20error\x20','***\x20***\x20checkout.session.completed\x20-\x20getSubscritionById\x20***\x20start\x20***\x20:\x20','sessionid','***\x20***\x20checkout.session.completed\x20-\x20quantity\x20use\x20case\x20length\x20==\x201\x20:\x20','***\x20***\x20invoice.payment_succeeded\x20-\x20end:\x20','lines','detachPaymentFunct\x20>\x20paymentMethodid\x20','catch','get\x20PaymentMethods\x20list\x20>\x20paymentMethods\x20','del','list','object','end','--\x20>\x20checkoutSession\x20params.sessionid\x20','billing_reason','/cancelsubscription','!!!!!!!!\x20HI\x20!!!!!!!!\x20checkout.session.completed','***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20-\x20userId:\x20','plan_name','customerid','\x20!!!!!!!!\x20HI\x20!!!!!!!!!!!\x20customer.subscription.deleted','params','authenticate','detach','exec','/webhook','get\x20PaymentMethods\x20list\x20req.params','then','current_period_start','start','customers','***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20subsptn_payment\x20not\x20subsptn_payment','--\x20>\x20subscription\x20get\x20by\x20id\x20freq.params.subscriptionid\x20','project_id','/payment_methods/:customerid','info','--\x20>\x20updatesubscription\x20\x20project\x20','expiration_date_month','Error\x20saving\x20object.','checkout','stripe\x20plan_name:\x20','***\x20***\x20checkout.session.completed\x20-\x20quantity\x20use\x20case\x20length\x20>\x201\x20:\x20','previous_attributes','***\x20***\x20invoice.payment_succeeded\x20-\x20index:\x20','find','\x20!!!!!!!!\x20HI\x20!!!!!!!!!!!\x20customer.subscription.updated\x20\x20subscription_id','stripe\x20user_id:','***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20subsptn_payment:\x20','subscriptions','Types','error','put','credit_card_num','\x20!!!!!!!!\x20HI\x20!!!!!!!!!!!\x20customer.subscription.updated','/checkoutSession/:sessionid','subscriptionId','basic','customer.subscription.deleted\x20subscriptionPayment\x20user\x20id:\x20','rawBody','/customer/:projectid','»»»\x20»»»\x20updatesubscription\x20projectid','***\x20***\x20invoice.payment_succeeded\x20-\x20typeOf\x20index\x20:','»»»»\x20stripe\x20endpointSecret:\x20','--\x20>\x20get\x20customer\x20from\x20db\x20>\x20customer\x20+\x20paymentMethods\x20','free','--\x20>\x20get\x20customer\x20from\x20db\x20>\x20customer\x20from\x20stripe\x20API\x20','log','update','asc','»»»\x20»»»\x20\x20paymentMethod\x20attached\x20\x20error\x20','quantity','»»»\x20»»»\x20get\x20customer\x20from\x20db\x20-\x20projectid','»»»\x20»»»\x20get\x20customer\x20from\x20db\x20','mongoose','***\x20***\x20invoice.payment_succeeded\x20-\x20BILLING\x20REASON\x20','***\x20***\x20invoice.payment_succeeded\x20-\x20subscription\x20ID:\x20','create','---\x20>\x20ERROR\x20','customer','profile','current_period_end','***\x20***\x20invoice.payment_succeeded\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20-\x20plan_name:\x20','period','post','--\x20>\x20subscription\x20get\x20by\x20id\x20from\x20stripe\x20\x20err\x20','--\x20>\x20checkoutSession\x20get\x20by\x20id\x20from\x20stripe\x20\x20err\x20','credit_card_cvc','Router','--\x20>\x20GET\x20SUBSCRIPTION\x20PAYMENTS\x20ERRORt\x20','get','stripe\x20apiKey','/stripesubs/:subscriptionid','constructEvent','»»»»\x20stripe\x20apiKey:\x20','paymentMethods','expiration_date_year','***\x20***\x20invoice.payment_succeeded\x20-\x20linesNum:\x20','***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20-\x20projectId:\x20\x20','»»»\x20»»»\x20\x20paymentMethod\x20attached\x20','/updatesubscription','webhooks','type','data','get\x20PaymentMethods\x20list\x20>\x20paymentMethods\x20>\x20paymentMethods.data\x20','»»»\x20»»»\x20\x20update\x20customer\x20-\x20customerid\x20from\x20params\x20','express','ObjectId','moment','***\x20***\x20subscription\x20ID\x20','send','--\x20>\x20updatesubscription\x20Error\x20getting\x20project\x20','»»»\x20»»»\x20\x20update\x20customer\x20-\x20cc\x20from\x20body\x20','»»»\x20»»»\x20cancelsubscription\x20userid','user_id','***\x20***\x20checkout.session.completed\x20-\x20getSubscritionById\x20err\x20','***\x20***\x20checkout.session.completed\x20-\x20getSubscription\x20***\x20end\x20***\x20:\x20','invoice.payment_succeeded','stripe\x20sig:\x20','client_reference_id','split','YYYY-MM-DDTHH:mm:ss.SSS','--\x20>\x20checkoutSession\x20get\x20by\x20id\x20from\x20stripe\x20','total_count','get\x20PaymentMethods\x20list\x20>\x20paymentMethods\x20>\x20default_payment_method_id\x20','--\x20>\x20get\x20customer\x20from\x20db\x20-\x20Error\x20','passport','retrieve','updateProjectProfile\x20Error\x20','invoice_settings','stripe\x20project_id:\x20','get\x20PaymentMethods\x20list\x20req.params\x20>\x20customer_id\x20','PAYMENT_STRIPE_SECRET','»»»»»»»»»\x20updateProjectProfile\x20updatedProject\x20','stripe','/customers/:customerid','detachPaymentFunc\x20result\x20','card','stripe\x20event','json','stripe\x20endpointSecret','jwt','../../../config/winston','Webhook\x20Error:\x20','checkout.session.completed','--\x20>\x20cancelsubscription\x20Error\x20getting\x20project\x20','****\x20Stripe\x20error\x20constructEvent:\x20','--\x20>\x20subscription\x20get\x20by\x20id\x20from\x20stripe\x20','payment','status','format','customer.subscription.deleted\x20subscriptionPayment\x20project\x20id:\x20','subscription','length','***\x20***\x20checkout.session.completed\x20-\x20quantity\x20:\x20','PAYMENT_STRIPE_API_SECRET_KEY','../../../models/project','customer.subscription.deleted','env','stripe\x20checkout.session.completed','save','»»»\x20»»»\x20updatesubscription\x20userid','***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20-\x20err\x20','findOne','body','attach','\x20!!!!!!!!\x20HI\x20!!!!!!!!!!!\x20customer.subscription.updated\x20\x20subscription_qty\x20','\x20!!!!!!!!\x20HI\x20!!!!!!!!!!!\x20customer.subscription.updated\x20\x20subscription_previous_qty','projectid'];(function(_0x4eaf44,_0x194726){var _0x4e96f8=function(_0x23307a){while(--_0x23307a){_0x4eaf44['push'](_0x4eaf44['shift']());}};_0x4e96f8(++_0x194726);}(_0x1947,0x1ae));var _0x4e96=function(_0x4eaf44,_0x194726){_0x4eaf44=_0x4eaf44-0x0;var _0x4e96f8=_0x1947[_0x4eaf44];return _0x4e96f8;};var express=require(_0x4e96('0x2c'));var router=express[_0x4e96('0x1a')]();var winston=require(_0x4e96('0x50'));var Project=require(_0x4e96('0x5e'));var SubscriptionPayment=require('../models/subscription-payment');var moment=require(_0x4e96('0x2e'));var mongoose=require(_0x4e96('0xc'));var passport=require(_0x4e96('0x40'));require('../../../middleware/passport')(passport);var validtoken=require('../../../middleware/valid-token');const apiKey=process['env'][_0x4e96('0x71')];winston[_0x4e96('0x70')](_0x4e96('0x1d')+apiKey);const stripe=require(_0x4e96('0x48'))(apiKey);const endpointSecret=process[_0x4e96('0x60')][_0x4e96('0x46')];winston[_0x4e96('0x70')](_0x4e96('0x4e')+endpointSecret);const apiSecretKey=process['env'][_0x4e96('0x5d')];winston[_0x4e96('0x70')]('stripe\x20apiSecretKey'+apiSecretKey);const bodyParser=require(_0x4e96('0x74'));router[_0x4e96('0x16')](_0x4e96('0x8f'),bodyParser['raw']({'type':'application/json'}),function(_0x1ac966,_0x43ecfb){winston['debug'](_0x4e96('0x1')+endpointSecret);winston[_0x4e96('0x70')](_0x4e96('0x20')+apiKey);winston['debug']('stripe\x20apiSecretKey'+apiSecretKey);const _0x9010b5=_0x1ac966['headers']['stripe-signature'];winston[_0x4e96('0x70')](_0x4e96('0x38'),_0x9010b5);let _0x479b68;try{_0x479b68=stripe[_0x4e96('0x27')][_0x4e96('0x1f')](_0x1ac966[_0x4e96('0xb0')],_0x9010b5,endpointSecret);}catch(_0x3b400a){winston['error'](_0x4e96('0x54'),_0x3b400a['message']);return _0x43ecfb[_0x4e96('0x57')](0x190)['send'](_0x4e96('0x51')+_0x3b400a['message']);}winston[_0x4e96('0x99')](_0x4e96('0x4c'),_0x479b68);if(_0x479b68['type']===_0x4e96('0x52')){winston['debug'](_0x4e96('0x86'));const _0x2bc880=_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')];winston[_0x4e96('0x99')](_0x4e96('0x61'),_0x2bc880);var _0x536548=_0x2bc880[_0x4e96('0x39')];winston['info'](_0x4e96('0x6f'),_0x536548);var _0x2df397=_0x536548[_0x4e96('0x3a')]('_')[0x0];winston[_0x4e96('0x99')](_0x4e96('0xa4')+_0x2df397);var _0x2b9abf=_0x536548[_0x4e96('0x3a')]('_')[0x1];winston[_0x4e96('0x99')](_0x4e96('0x44')+_0x2b9abf);var _0x56cbeb=_0x536548['split']('_')[0x2];winston[_0x4e96('0x99')](_0x4e96('0x9e')+_0x56cbeb);var _0x2716eb=_0x479b68['data'][_0x4e96('0x81')][_0x4e96('0x5a')];winston[_0x4e96('0x99')](_0x4e96('0x6b'),_0x2716eb);getSubscritionById(_0x2716eb)[_0x4e96('0x91')](function(_0x1bbeea){var _0x2c49ac=_0x1bbeea[_0x4e96('0x81')];winston[_0x4e96('0x99')]('***\x20***\x20checkout.session.completed\x20-\x20getSubscritionById\x20subscr\x20object_type:\x20',_0x2c49ac);var _0x40f3e3=moment['unix'](_0x1bbeea[_0x4e96('0x92')])[_0x4e96('0x58')](_0x4e96('0x3b'));winston[_0x4e96('0x99')](_0x4e96('0x77'),_0x40f3e3);var _0x31dc33=moment['unix'](_0x1bbeea['current_period_end'])[_0x4e96('0x58')](_0x4e96('0x3b'));winston[_0x4e96('0x99')](_0x4e96('0x36'),_0x31dc33);var _0x266dcb=_0x1bbeea['quantity'];winston['info'](_0x4e96('0x5c'),_0x266dcb);var _0x4e4404={'profile':{'name':_0x56cbeb,'type':_0x4e96('0x56'),'subscription_creation_date':_0x40f3e3,'subStart':_0x40f3e3,'subEnd':_0x31dc33,'subscriptionId':_0x2716eb,'last_stripe_event':_0x479b68['type'],'agents':_0x266dcb}};updateProjectProfile(_0x2b9abf,_0x4e4404);saveOnDB(_0x2716eb,_0x2b9abf,_0x1bbeea,_0x2df397,_0x479b68[_0x4e96('0x28')],_0x56cbeb);})[_0x4e96('0x7d')](function(_0x355012){winston[_0x4e96('0xa8')](_0x4e96('0x35'),_0x355012);});}if(_0x479b68['type']===_0x4e96('0x37')){winston['info']('\x20!!!!!!!!\x20HI\x20!!!!!!!!\x20invoice.payment_succeeded');winston['info'](_0x4e96('0xd'),_0x479b68[_0x4e96('0x29')]['object'][_0x4e96('0x84')]);var _0x505436=_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')][_0x4e96('0x7b')][_0x4e96('0x3d')];console[_0x4e96('0x5')](_0x4e96('0x23'),_0x505436);var _0x157fce=_0x505436-0x1;console[_0x4e96('0x5')](_0x4e96('0xa1'),_0x157fce);console[_0x4e96('0x5')](_0x4e96('0x0'),typeof _0x157fce);var _0x57efbc=moment[_0x4e96('0x75')](_0x479b68[_0x4e96('0x29')]['object']['lines'][_0x4e96('0x29')][_0x157fce][_0x4e96('0x15')][_0x4e96('0x93')])['format'](_0x4e96('0x3b'));console[_0x4e96('0x5')]('***\x20***\x20invoice.payment_succeeded\x20-\x20start:\x20',_0x57efbc);var _0x2ca72e=moment[_0x4e96('0x75')](_0x479b68['data'][_0x4e96('0x81')]['lines'][_0x4e96('0x29')][_0x157fce][_0x4e96('0x15')][_0x4e96('0x82')])[_0x4e96('0x58')](_0x4e96('0x3b'));console['log'](_0x4e96('0x7a'),_0x2ca72e);var _0x2716eb=_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')]['subscription'];winston['info']('***\x20***\x20invoice.payment_succeeded\x20-\x20subscription\x20ID:\x20',_0x2716eb);if(_0x2716eb==null){_0x2716eb=_0x479b68['data']['object']['lines'][_0x4e96('0x29')][0x0]['subscription'];console[_0x4e96('0x5')](_0x4e96('0xe'),_0x2716eb);}var _0x12ad1a='';if(_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')]['lines'][_0x4e96('0x29')][_0x4e96('0x5b')]>0x1){var _0x12ad1a=_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')]['lines'][_0x4e96('0x29')][_0x479b68['data'][_0x4e96('0x81')][_0x4e96('0x7b')][_0x4e96('0x29')][_0x4e96('0x5b')]-0x1]['quantity'];console[_0x4e96('0x5')](_0x4e96('0x9f'),_0x12ad1a);}else if(_0x479b68['data'][_0x4e96('0x81')][_0x4e96('0x7b')][_0x4e96('0x29')]['length']===0x1){var _0x12ad1a=_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')][_0x4e96('0x7b')][_0x4e96('0x29')][0x0][_0x4e96('0x9')];console[_0x4e96('0x5')](_0x4e96('0x79'),_0x12ad1a);}if(_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')][_0x4e96('0x84')]!==_0x4e96('0x6e')){getSubscrpPaymentBySubscrpIdAndStripeEvent(_0x2716eb)[_0x4e96('0x91')](function(_0x37c018){winston[_0x4e96('0x99')](_0x4e96('0xa5'),_0x37c018);if(!_0x37c018){winston[_0x4e96('0x99')]('***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20subsptn_payment\x20not\x20subsptn_payment');return 0x0;}if(_0x37c018[_0x4e96('0x5b')]===0x0){winston[_0x4e96('0x99')](_0x4e96('0x95'));return 0x0;}var _0x312dcd=_0x37c018[0x0][_0x4e96('0x97')];var _0x5c8260=_0x37c018[0x0][_0x4e96('0x34')];var _0x22f38d=_0x37c018[0x0]['plan_name'];winston['info'](_0x4e96('0x24')+_0x312dcd);winston['info']('***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20-\x20userId:\x20'+_0x5c8260);winston[_0x4e96('0x99')](_0x4e96('0x14')+_0x22f38d);if(_0x312dcd){var _0x148353={'profile':{'name':_0x22f38d,'type':_0x4e96('0x56'),'subStart':_0x57efbc,'subEnd':_0x2ca72e,'subscriptionId':_0x2716eb,'last_stripe_event':_0x479b68[_0x4e96('0x28')],'agents':_0x12ad1a}};updateProjectProfile(_0x312dcd,_0x148353);saveOnDB(_0x2716eb,_0x312dcd,_0x479b68,_0x5c8260,_0x479b68[_0x4e96('0x28')],_0x22f38d);}})[_0x4e96('0x7d')](function(_0x5d0965){winston[_0x4e96('0xa8')](_0x4e96('0x64'),_0x5d0965);});}else{saveOnDB(_0x2716eb,null,_0x479b68,null,_0x479b68[_0x4e96('0x28')],null);}}if(_0x479b68[_0x4e96('0x28')]==='customer.subscription.updated'){winston[_0x4e96('0x99')](_0x4e96('0xab'));var _0x9d15f8=_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')][_0x4e96('0x9')];winston[_0x4e96('0x99')](_0x4e96('0x68'),_0x9d15f8);var _0x1e41b3=_0x479b68['data']['object']['id'];var _0x57efbc=moment[_0x4e96('0x75')](_0x479b68[_0x4e96('0x29')]['object']['current_period_start'])[_0x4e96('0x58')](_0x4e96('0x3b'));var _0x2ca72e=moment[_0x4e96('0x75')](_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')][_0x4e96('0x13')])[_0x4e96('0x58')](_0x4e96('0x3b'));winston[_0x4e96('0x99')](_0x4e96('0xa3'),_0x1e41b3);if(_0x479b68[_0x4e96('0x29')]['previous_attributes']&&_0x479b68[_0x4e96('0x29')]['previous_attributes']['quantity']!==undefined){var _0x592f9a=_0x479b68[_0x4e96('0x29')][_0x4e96('0xa0')]['quantity'];winston[_0x4e96('0x99')](_0x4e96('0x69'),_0x592f9a);if(_0x9d15f8!==_0x592f9a){getSubscrpPaymentBySubscrpIdAndStripeEvent(_0x1e41b3)[_0x4e96('0x91')](function(_0x261afa){winston['info'](_0x4e96('0xa5'),_0x261afa);var _0x200429=_0x261afa[0x0][_0x4e96('0x97')];var _0x45b385=_0x261afa[0x0][_0x4e96('0x34')];var _0xcd5781=_0x261afa[0x0][_0x4e96('0x88')];winston[_0x4e96('0x99')](_0x4e96('0x24'),_0x200429);winston[_0x4e96('0x99')](_0x4e96('0x87'),_0x45b385);winston[_0x4e96('0x99')]('***\x20***\x20customer.subscription.updated\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20-\x20userId:\x20',_0x45b385);if(_0x200429){var _0x216020={'profile':{'name':_0xcd5781,'type':_0x4e96('0x56'),'subStart':_0x57efbc,'subEnd':_0x2ca72e,'subscriptionId':_0x1e41b3,'last_stripe_event':_0x479b68[_0x4e96('0x28')],'agents':_0x9d15f8}};updateProjectProfile(_0x200429,_0x216020);saveOnDB(_0x1e41b3,_0x200429,_0x479b68,_0x45b385,_0x479b68[_0x4e96('0x28')],_0xcd5781);}})['catch'](function(_0x130287){winston[_0x4e96('0xa8')]('***\x20***\x20getSubscrpPaymentBySubscrpIdAndStripeEvent\x20-\x20err\x20',_0x130287);});}}}if(_0x479b68[_0x4e96('0x28')]===_0x4e96('0x5f')){winston['info'](_0x4e96('0x8a'));winston[_0x4e96('0x99')](_0x4e96('0x73'),_0x479b68);var _0x2716eb=_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')]['id'];winston['info'](_0x4e96('0x2f'),_0x2716eb);getSubscrpPaymentBySubscrpIdAndStripeEvent(_0x2716eb)['then'](function(_0x63725c){winston[_0x4e96('0x99')](_0x4e96('0x6c'),_0x63725c);var _0xf0eeeb=_0x63725c[0x0][_0x4e96('0x97')];var _0x2e6eee=_0x63725c[0x0][_0x4e96('0x34')];winston['info'](_0x4e96('0x59'),_0xf0eeeb);winston[_0x4e96('0x99')](_0x4e96('0xaf'),_0x2e6eee);const _0xb953a4=_0x4e96('0x3');var _0x47bab3={'profile':{'subscriptionId':_0x2716eb,'name':_0x4e96('0x3'),'type':_0x4e96('0x3'),'agents':0x3,'last_stripe_event':_0x479b68[_0x4e96('0x28')]}};updateProjectProfile(_0xf0eeeb,_0x47bab3);saveOnDB(_0x2716eb,_0xf0eeeb,_0x479b68[_0x4e96('0x29')][_0x4e96('0x81')],_0x2e6eee,_0x479b68[_0x4e96('0x28')],_0xb953a4);})[_0x4e96('0x7d')](function(_0x4c107d){winston['error']('***\x20***\x20customer.subscription.deleted\x20',_0x4c107d);});}_0x43ecfb[_0x4e96('0x4d')]({'received':!![]});});function getSubscrpPaymentBySubscrpIdAndStripeEvent(_0x530f90){return new Promise(function(_0x1fc08a,_0x221e12){SubscriptionPayment[_0x4e96('0xa2')]({'subscription_id':_0x530f90,'stripe_event':_0x4e96('0x52')},function(_0x288d0c,_0x113554){if(_0x288d0c)_0x221e12(_0x288d0c);var _0x2534a9=_0x113554;_0x1fc08a(_0x2534a9);});});};function getSubscritionById(_0x4dfffb){return new Promise(function(_0x437af6,_0x585136){const _0x42aa90=require(_0x4e96('0x48'))(apiSecretKey);_0x42aa90[_0x4e96('0xa6')][_0x4e96('0x41')](_0x4dfffb,function(_0x50553a,_0x9e2fb3){if(_0x50553a)_0x585136(_0x50553a);var _0x9e2fb3=_0x9e2fb3;_0x437af6(_0x9e2fb3);});});};function updateProjectProfile(_0x46de60,_0x25a96a){Project['findByIdAndUpdate'](_0x46de60,_0x25a96a,{'new':!![],'upsert':!![]},function(_0x454f6e,_0x3374f6){if(_0x454f6e){winston[_0x4e96('0xa8')](_0x4e96('0x42'),_0x454f6e);}winston[_0x4e96('0x99')](_0x4e96('0x47'),_0x3374f6);});}function saveOnDB(_0x1296c3,_0x1c851b,_0x4dbe74,_0x2e4975,_0x2aa1f8,_0x24e4dc){winston[_0x4e96('0x99')]('plan_name\x20',_0x24e4dc);var _0x55a1fc=new SubscriptionPayment({'_id':new mongoose[(_0x4e96('0xa7'))][(_0x4e96('0x2d'))](),'subscription_id':_0x1296c3,'project_id':_0x1c851b,'user_id':_0x2e4975,'stripe_event':_0x2aa1f8,'plan_name':_0x24e4dc,'object':_0x4dbe74});_0x55a1fc[_0x4e96('0x62')](function(_0x272dbc,_0x5c8156){if(_0x272dbc){winston[_0x4e96('0xa8')](_0x4e96('0x10'),_0x272dbc);return res['status'](0x1f4)[_0x4e96('0x30')]({'success':![],'msg':_0x4e96('0x9c')});}winston[_0x4e96('0x99')]('savedSubscriptionPayment\x20',_0x5c8156);});}router['put'](_0x4e96('0x85'),[passport['authenticate']([_0x4e96('0xae'),'jwt'],{'session':![]}),validtoken],function(_0x5d5748,_0x55189d){var _0x1b5fff=_0x5d5748[_0x4e96('0x66')][_0x4e96('0x6a')];var _0x1f7ff0=_0x5d5748[_0x4e96('0x66')]['userid'];winston['info']('»»»\x20»»»\x20cancelsubscription\x20projectid',_0x1b5fff);winston[_0x4e96('0x99')](_0x4e96('0x33'),_0x1f7ff0);Project[_0x4e96('0x65')]({'_id':_0x1b5fff},function(_0x2cb673,_0x63f5c2){if(_0x2cb673){winston[_0x4e96('0xa8')](_0x4e96('0x53'),_0x2cb673);return _0x2cb673;}if(_0x63f5c2){winston[_0x4e96('0x99')]('--\x20>\x20cancelsubscription\x20\x20project\x20',_0x63f5c2);var _0x57c1ff=_0x63f5c2['profile'][_0x4e96('0xad')];const _0x8f5a0b=require(_0x4e96('0x48'))(apiSecretKey);_0x8f5a0b[_0x4e96('0xa6')][_0x4e96('0x7f')](_0x57c1ff,function(_0x3b5304,_0x2160ed){if(_0x3b5304){winston['error'](_0x4e96('0x72'),_0x3b5304);return _0x55189d['status'](0x1f4)[_0x4e96('0x30')]({'success':![],'msg':_0x3b5304});}winston[_0x4e96('0x99')]('--\x20>\x20cancelsubscription\x20confirmation\x20',_0x2160ed);_0x55189d[_0x4e96('0x4d')](_0x2160ed);});}});});router[_0x4e96('0xa9')](_0x4e96('0x26'),[passport['authenticate']([_0x4e96('0xae'),'jwt'],{'session':![]}),validtoken],function(_0x328259,_0x44a28c){var _0x1d8e31=_0x328259[_0x4e96('0x66')]['projectid'];var _0x5bd8fb=_0x328259[_0x4e96('0x66')]['userid'];winston[_0x4e96('0x99')](_0x4e96('0xb2'),_0x1d8e31);winston['info'](_0x4e96('0x63'),_0x5bd8fb);const _0x241cce=require(_0x4e96('0x48'))(apiSecretKey);Project['findOne']({'_id':_0x1d8e31},function(_0x1bfc82,_0x53b831){if(_0x1bfc82){winston[_0x4e96('0xa8')](_0x4e96('0x31'),_0x1bfc82);return _0x1bfc82;}if(_0x53b831){winston[_0x4e96('0x99')](_0x4e96('0x9a'),_0x53b831);var _0x462bc3=_0x53b831[_0x4e96('0x12')][_0x4e96('0xad')];_0x241cce['subscriptions'][_0x4e96('0x6')](_0x462bc3);}});});router['get']('/:subscriptionid',[passport['authenticate']([_0x4e96('0xae'),_0x4e96('0x4f')],{'session':![]}),validtoken],function(_0x49d8b9,_0x4c4bae){SubscriptionPayment[_0x4e96('0xa2')]({'subscription_id':_0x49d8b9[_0x4e96('0x8b')][_0x4e96('0x6d')]})['sort']({'object.created':_0x4e96('0x7')})[_0x4e96('0x8e')](function(_0x409853,_0x2b0133){if(_0x409853){winston[_0x4e96('0xa8')](_0x4e96('0x1b'),project);return _0x4c4bae[_0x4e96('0x57')](0x1f4)[_0x4e96('0x30')]({'success':![],'msg':_0x409853});}_0x4c4bae[_0x4e96('0x4d')](_0x2b0133);});});router['get'](_0x4e96('0x1e'),[passport['authenticate']([_0x4e96('0xae'),_0x4e96('0x4f')],{'session':![]}),validtoken],function(_0x508fa0,_0x51ae3c){winston[_0x4e96('0x99')](_0x4e96('0x96'),_0x508fa0[_0x4e96('0x8b')][_0x4e96('0x6d')]);var _0xe18b5d=require(_0x4e96('0x48'))(apiSecretKey);_0xe18b5d[_0x4e96('0xa6')][_0x4e96('0x41')](_0x508fa0[_0x4e96('0x8b')][_0x4e96('0x6d')],function(_0x505610,_0x182a4a){if(_0x505610){winston[_0x4e96('0xa8')](_0x4e96('0x17'),_0x505610);return _0x51ae3c[_0x4e96('0x57')](0x1f4)[_0x4e96('0x30')]({'success':![],'msg':_0x505610});}winston[_0x4e96('0x99')](_0x4e96('0x55'),_0x182a4a);_0x51ae3c[_0x4e96('0x4d')](_0x182a4a);});});router[_0x4e96('0x1c')](_0x4e96('0xb1'),[passport[_0x4e96('0x8c')](['basic',_0x4e96('0x4f')],{'session':![]}),validtoken],function(_0xc0d11,_0x1b73d2){winston[_0x4e96('0x70')](_0x4e96('0xb'),_0xc0d11[_0x4e96('0x8b')]);var _0x262b53=_0xc0d11[_0x4e96('0x8b')][_0x4e96('0x6a')];winston[_0x4e96('0x70')](_0x4e96('0xa'),_0x262b53);SubscriptionPayment[_0x4e96('0xa2')]({'project_id':_0x262b53,'stripe_event':_0x4e96('0x52')},async function(_0x41d81b,_0x57aa4c){if(_0x41d81b){winston[_0x4e96('0x70')](_0x4e96('0x3f'),_0x41d81b);return _0x41d81b;}if(_0x57aa4c){_0x57aa4c[0x0][_0x4e96('0x81')][_0x4e96('0x11')];winston[_0x4e96('0x70')]('--\x20>\x20get\x20customer\x20from\x20db\x20-\x20subscription\x20>\x20customer\x20id\x20',_0x57aa4c[0x0]['object'][_0x4e96('0x11')]);const _0x1513ee=_0x57aa4c[0x0][_0x4e96('0x81')][_0x4e96('0x11')];const _0xed48af=require(_0x4e96('0x48'))(apiSecretKey);const _0x5280f7=await _0xed48af[_0x4e96('0x94')][_0x4e96('0x41')](_0x1513ee);winston['debug'](_0x4e96('0x4'),_0x5280f7);const _0x385d7b=await _0xed48af['paymentMethods'][_0x4e96('0x80')]({'customer':_0x1513ee,'type':'card'});_0x5280f7[_0x4e96('0x21')]=_0x385d7b;winston[_0x4e96('0x70')](_0x4e96('0x2'),_0x57aa4c);_0x1b73d2['json'](_0x5280f7);}});});router[_0x4e96('0x16')](_0x4e96('0x49'),[passport[_0x4e96('0x8c')]([_0x4e96('0xae'),_0x4e96('0x4f')],{'session':![]}),validtoken],async function(_0x163fa6,_0x439ca4){var _0x192505=_0x163fa6['params'][_0x4e96('0x89')];winston[_0x4e96('0x70')](_0x4e96('0x2b'),_0x192505);winston[_0x4e96('0x70')](_0x4e96('0x32'),_0x163fa6['body']);const _0x3ec4ad=require(_0x4e96('0x48'))(apiSecretKey);let _0x2ec01e;try{_0x2ec01e=await _0x3ec4ad['paymentMethods'][_0x4e96('0xf')]({'type':_0x4e96('0x4b'),'card':{'number':_0x163fa6[_0x4e96('0x66')][_0x4e96('0xaa')],'exp_month':_0x163fa6[_0x4e96('0x66')][_0x4e96('0x9b')],'exp_year':_0x163fa6[_0x4e96('0x66')][_0x4e96('0x22')],'cvc':_0x163fa6[_0x4e96('0x66')][_0x4e96('0x19')]}});}catch(_0x2910c3){winston[_0x4e96('0xa8')](_0x4e96('0x76'),_0x2910c3);return _0x439ca4[_0x4e96('0x57')](0x1f6)[_0x4e96('0x30')]({'success':![],'msg':_0x2910c3});}winston[_0x4e96('0x70')]('»»»\x20»»»\x20\x20paymentMethod',_0x2ec01e);try{const _0x10482b=await _0x3ec4ad[_0x4e96('0x21')][_0x4e96('0x67')](_0x2ec01e['id'],{'customer':_0x192505});winston['debug'](_0x4e96('0x25'),_0x10482b);}catch(_0x3a7c8f){winston[_0x4e96('0xa8')](_0x4e96('0x8'),_0x3a7c8f);return _0x439ca4['status'](0x1f5)[_0x4e96('0x30')]({'success':![],'msg':_0x3a7c8f});}const _0x36d92e=await _0x3ec4ad[_0x4e96('0x94')][_0x4e96('0x6')](_0x192505,{'invoice_settings':{'default_payment_method':_0x2ec01e['id']}});_0x439ca4[_0x4e96('0x4d')](_0x36d92e);});router[_0x4e96('0x1c')](_0x4e96('0x98'),[passport['authenticate'](['basic',_0x4e96('0x4f')],{'session':![]}),validtoken],async function(_0x35275d,_0x372315){console[_0x4e96('0x5')](_0x4e96('0x90'),_0x35275d['params']);var _0x4c99a1=_0x35275d[_0x4e96('0x8b')][_0x4e96('0x89')];winston[_0x4e96('0x70')](_0x4e96('0x45'),_0x4c99a1);const _0x4d89e2=require(_0x4e96('0x48'))(apiSecretKey);const _0x471ee6=await _0x4d89e2[_0x4e96('0x94')][_0x4e96('0x41')](_0x4c99a1);const _0x5cb18d=_0x471ee6[_0x4e96('0x43')]['default_payment_method'];let _0x513d62;try{_0x513d62=await _0x4d89e2['paymentMethods'][_0x4e96('0x80')]({'customer':_0x4c99a1,'type':'card'});winston[_0x4e96('0x70')](_0x4e96('0x7e'),_0x513d62);}catch(_0x37cb25){return _0x372315[_0x4e96('0x57')](0x1f5)[_0x4e96('0x30')]({'success':![],'msg':_0x37cb25});}winston[_0x4e96('0x70')](_0x4e96('0x3e'),_0x5cb18d);_0x513d62[_0x4e96('0x29')]['forEach'](_0x33bb97=>{if(_0x33bb97['id']!==_0x5cb18d){winston[_0x4e96('0x70')](_0x4e96('0x2a'),_0x33bb97['id']);detachPaymentFunc(_0x33bb97['id'],function(_0x23cbee){console['log'](_0x4e96('0x4a'),_0x23cbee);});}});_0x372315[_0x4e96('0x4d')](_0x513d62);});router['get'](_0x4e96('0xac'),[passport[_0x4e96('0x8c')]([_0x4e96('0xae'),_0x4e96('0x4f')],{'session':![]}),validtoken],function(_0x164d01,_0x3d729d){console[_0x4e96('0x5')](_0x4e96('0x83'),_0x164d01['params'][_0x4e96('0x78')]);var _0x3fc2ba=require(_0x4e96('0x48'))(apiSecretKey);_0x3fc2ba[_0x4e96('0x9d')]['sessions'][_0x4e96('0x41')](_0x164d01['params'][_0x4e96('0x78')],function(_0x1de106,_0x4edfae){if(_0x1de106){console[_0x4e96('0x5')](_0x4e96('0x18'),_0x1de106);return _0x3d729d[_0x4e96('0x57')](0x1f4)[_0x4e96('0x30')]({'success':![],'msg':_0x1de106});}console[_0x4e96('0x5')](_0x4e96('0x3c'),_0x4edfae);_0x3d729d[_0x4e96('0x4d')](_0x4edfae);});});async function detachPaymentFunc(_0x1c9e4e,_0xdd36f9){winston[_0x4e96('0x70')](_0x4e96('0x7c'),_0x1c9e4e);const _0x362292=require('stripe')(apiSecretKey);let _0x30aaaa;try{_0x30aaaa=await _0x362292[_0x4e96('0x21')][_0x4e96('0x8d')](_0x1c9e4e);_0xdd36f9(_0x30aaaa);}catch(_0xe0df0b){_0xdd36f9(_0xe0df0b);}}module['exports']=router;
2
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBheW1lbnRzL3N0cmlwZS9pbmRleC5qcyJdLCJuYW1lcyI6WyJleHByZXNzIiwicmVxdWlyZSIsInJvdXRlciIsIndpbnN0b24iLCJQcm9qZWN0IiwiU3Vic2NyaXB0aW9uUGF5bWVudCIsIm1vbWVudCIsIm1vbmdvb3NlIiwicGFzc3BvcnQiLCJ2YWxpZHRva2VuIiwiYXBpS2V5IiwicHJvY2VzcyIsInN0cmlwZSIsImVuZHBvaW50U2VjcmV0IiwiYXBpU2VjcmV0S2V5IiwiYm9keVBhcnNlciIsIl8weDFhYzk2NiIsIl8weDQzZWNmYiIsIl8weDkwMTBiNSIsIl8weDQ3OWI2OCIsIl8weDNiNDAwYSIsIl8weDJiYzg4MCIsIl8weDUzNjU0OCIsIl8weDJkZjM5NyIsIl8weDJiOWFiZiIsIl8weDU2Y2JlYiIsIl8weDI3MTZlYiIsImdldFN1YnNjcml0aW9uQnlJZCIsIl8weDFiYmVlYSIsIl8weDJjNDlhYyIsIl8weDQwZjNlMyIsIl8weDMxZGMzMyIsIl8weDI2NmRjYiIsIl8weDRlNDQwNCIsInVwZGF0ZVByb2plY3RQcm9maWxlIiwic2F2ZU9uREIiLCJfMHgzNTUwMTIiLCJfMHg1MDU0MzYiLCJjb25zb2xlIiwiXzB4MTU3ZmNlIiwiXzB4NTdlZmJjIiwiXzB4MmNhNzJlIiwiXzB4MTJhZDFhIiwiZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50IiwiXzB4MzdjMDE4IiwiXzB4MzEyZGNkIiwiXzB4NWM4MjYwIiwiXzB4MjJmMzhkIiwiXzB4MTQ4MzUzIiwiXzB4NWQwOTY1IiwiXzB4OWQxNWY4IiwiXzB4MWU0MWIzIiwidW5kZWZpbmVkIiwiXzB4NTkyZjlhIiwiXzB4MjYxYWZhIiwiXzB4MjAwNDI5IiwiXzB4NDViMzg1IiwiXzB4Y2Q1NzgxIiwiXzB4MjE2MDIwIiwiXzB4MTMwMjg3IiwiXzB4NjM3MjVjIiwiXzB4ZjBlZWViIiwiXzB4MmU2ZWVlIiwiXzB4Yjk1M2E0IiwiXzB4NDdiYWIzIiwiXzB4NGMxMDdkIiwiXzB4NTMwZjkwIiwiUHJvbWlzZSIsIl8weDFmYzA4YSIsIl8weDIyMWUxMiIsIl8weDI4OGQwYyIsIl8weDExMzU1NCIsIl8weDI1MzRhOSIsIl8weDRkZmZmYiIsIl8weDQzN2FmNiIsIl8weDU4NTEzNiIsIl8weDQyYWE5MCIsIl8weDUwNTUzYSIsIl8weDllMmZiMyIsIl8weDQ2ZGU2MCIsIl8weDI1YTk2YSIsIl8weDQ1NGY2ZSIsIl8weDMzNzRmNiIsIl8weDEyOTZjMyIsIl8weDFjODUxYiIsIl8weDRkYmU3NCIsIl8weDJlNDk3NSIsIl8weDJhYTFmOCIsIl8weDI0ZTRkYyIsIl8weDU1YTFmYyIsIl8weDI3MmRiYyIsIl8weDVjODE1NiIsInJlcyIsIl8weDVkNTc0OCIsIl8weDU1MTg5ZCIsIl8weDFiNWZmZiIsIl8weDFmN2ZmMCIsIl8weDJjYjY3MyIsIl8weDYzZjVjMiIsIl8weDU3YzFmZiIsIl8weDhmNWEwYiIsIl8weDNiNTMwNCIsIl8weDIxNjBlZCIsIl8weDMyODI1OSIsIl8weDQ0YTI4YyIsIl8weDFkOGUzMSIsIl8weDViZDhmYiIsIl8weDI0MWNjZSIsIl8weDFiZmM4MiIsIl8weDUzYjgzMSIsIl8weDQ2MmJjMyIsIl8weDQ5ZDhiOSIsIl8weDRjNGJhZSIsIl8weDQwOTg1MyIsIl8weDJiMDEzMyIsInByb2plY3QiLCJfMHg1MDhmYTAiLCJfMHg1MWFlM2MiLCJfMHhlMThiNWQiLCJfMHg1MDU2MTAiLCJfMHgxODJhNGEiLCJfMHhjMGQxMSIsIl8weDFiNzNkMiIsIl8weDI2MmI1MyIsIl8weDQxZDgxYiIsIl8weDU3YWE0YyIsIl8weDE1MTNlZSIsIl8weGVkNDhhZiIsIl8weDUyODBmNyIsIl8weDM4NWQ3YiIsIl8weDE2M2ZhNiIsIl8weDQzOWNhNCIsIl8weDE5MjUwNSIsIl8weDNlYzRhZCIsIl8weDJlYzAxZSIsIl8weDI5MTBjMyIsIl8weDEwNDgyYiIsIl8weDNhN2M4ZiIsIl8weDM2ZDkyZSIsIl8weDM1Mjc1ZCIsIl8weDM3MjMxNSIsIl8weDRjOTlhMSIsIl8weDRkODllMiIsIl8weDQ3MWVlNiIsIl8weDVjYjE4ZCIsIl8weDUxM2Q2MiIsIl8weDM3Y2IyNSIsIl8weDMzYmI5NyIsImRldGFjaFBheW1lbnRGdW5jIiwiXzB4MjNjYmVlIiwiXzB4MTY0ZDAxIiwiXzB4M2Q3MjlkIiwiXzB4M2ZjMmJhIiwiXzB4MWRlMTA2IiwiXzB4NGVkZmFlIiwiXzB4MWM5ZTRlIiwiXzB4ZGQzNmY5IiwiXzB4MzYyMjkyIiwiXzB4MzBhYWFhIiwiXzB4ZTBkZjBiIiwibW9kdWxlIl0sIm1hcHBpbmdzIjoiZzdNQUFBLElBQUlBLE9BQUEsQ0FBVUMsT0FBQSxDLGVBQUEsQ0FBZCxDQUNBLElBQUlDLE1BQUEsQ0FBU0YsT0FBQSxDLGVBQUEsR0FBYixDQUNBLElBQUlHLE9BQUEsQ0FBVUYsT0FBQSxDLGVBQUEsQ0FBZCxDQUNBLElBQUlHLE9BQUEsQ0FBVUgsT0FBQSxDLGVBQUEsQ0FBZCxDQUNBLElBQUlJLG1CQUFBLENBQXNCSixPQUFBLEMsZ0NBQUEsQ0FBMUIsQ0FDQSxJQUFJSyxNQUFBLENBQVNMLE9BQUEsQyxlQUFBLENBQWIsQ0FDQSxJQUFJTSxRQUFBLENBQVdOLE9BQUEsQyxjQUFBLENBQWYsQ0FDQSxJQUFJTyxRQUFBLENBQVdQLE9BQUEsQyxlQUFBLENBQWYsQ0FDQUEsT0FBQSxDLGlDQUFBLEVBQTJDTyxRQUEzQyxFQUNBLElBQUlDLFVBQUEsQ0FBYVIsT0FBQSxDLG9DQUFBLENBQWpCLENBR0EsTUFBTVMsTUFBQSxDQUFTQyxPQUFBLEMsS0FBQSxFLGVBQUEsQ0FBZixDQUNBUixPQUFBLEMsZUFBQSxFLGVBQWMsQ0FBa0JPLE1BQWhDLEVBRUEsTUFBTUUsTUFBQSxDQUFTWCxPQUFBLEMsZUFBQSxFQUFrQlMsTUFBbEIsQ0FBZixDQUdBLE1BQU1HLGNBQUEsQ0FBaUJGLE9BQUEsQyxlQUFBLEUsZUFBQSxDQUF2QixDQUNBUixPQUFBLEMsZUFBQSxFLGVBQWMsQ0FBMEJVLGNBQXhDLEVBRUEsTUFBTUMsWUFBQSxDQUFlSCxPQUFBLEMsS0FBQSxFLGVBQUEs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NkksU0FBVixDQUFlQyxTQUFmLENBQW9CLENBRXZJakgsT0FBQSxDLGNBQUEsRSxlQUFBLENBQXNEZ0gsU0FBQSxDLFFBQUEsRSxlQUFBLENBQXRELEVBQ0EsSUFBSUUsU0FBQSxDQUFTdkosT0FBQSxDLGVBQUEsRUFBa0JhLFlBQWxCLENBQWIsQ0FFQTBJLFNBQUEsQyxlQUFBLEUsVUFBQSxFLGVBQUEsRUFDRUYsU0FBQSxDLFFBQUEsRSxlQUFBLENBREYsQ0FFRSxTQUFVRyxTQUFWLENBQWVDLFNBQWYsQ0FBd0IsQ0FDdEIsR0FBSUQsU0FBSixDQUFTLENBQ1BuSCxPQUFBLEMsY0FBQSxFLGVBQUEsQ0FBZ0VtSCxTQUFoRSxFQUNBLE9BQU9GLFNBQUEsQyxlQUFBLEUsS0FBQSxFLGVBQUEsRUFBcUIsQyxTQUFFLEMsR0FBRixDLEtBQWtCLENBQUtFLFNBQXZCLENBQXJCLENBQVAsQ0FGTyxDQUlUbkgsT0FBQSxDLGNBQUEsRSxlQUFBLENBQTJEb0gsU0FBM0QsRUFDQUgsU0FBQSxDLGVBQUEsRUFBU0csU0FBVCxFQU5zQixDQUYxQixFQUx1SSxDQUF6SSxFQWtCQSxlQUFlTixpQkFBZixDQUFpQ08sU0FBakMsQ0FBa0RDLFNBQWxELENBQTRELENBQzFEekosT0FBQSxDLGVBQUEsRSxlQUFBLENBQXVEd0osU0FBdkQsRUFDQSxNQUFNRSxTQUFBLENBQVM1SixPQUFBLEMsUUFBQSxFQUFrQmEsWUFBbEIsQ0FBZixDQUNBLElBQUlnSixTQUFKLENBQ0EsR0FBSSxDQUNGQSxTQUFBLENBQWdCLE1BQU1ELFNBQUEsQyxlQUFBLEUsZUFBQSxFQUNwQkYsU0FEb0IsQ0FBdEIsQ0FHQUMsU0FBQSxDQUFTRSxTQUFULEVBSkUsQ0FLRixNQUFPQyxTQUFQLENBQVUsQ0FDVkgsU0FBQSxDQUFTRyxTQUFULEVBRFUsQ0FUOEMsQ0FpRDVEQyxNQUFBLEMsU0FBQSxFQUFpQjlKLE1BQWpCIiwic291cmNlc0NvbnRlbnQiOlsidmFyIGV4cHJlc3MgPSByZXF1aXJlKCdleHByZXNzJyk7XG52YXIgcm91dGVyID0gZXhwcmVzcy5Sb3V0ZXIoKTtcbnZhciB3aW5zdG9uID0gcmVxdWlyZSgnLi4vLi4vLi4vLi4vY29uZmlnL3dpbnN0b24nKTtcbnZhciBQcm9qZWN0ID0gcmVxdWlyZShcIi4uLy4uLy4uLy4uL21vZGVscy9wcm9qZWN0XCIpO1xudmFyIFN1YnNjcmlwdGlvblBheW1lbnQgPSByZXF1aXJlKFwiLi4vbW9kZWxzL3N1YnNjcmlwdGlvbi1wYXltZW50XCIpO1xudmFyIG1vbWVudCA9IHJlcXVpcmUoJ21vbWVudCcpO1xudmFyIG1vbmdvb3NlID0gcmVxdWlyZSgnbW9uZ29vc2UnKTtcbnZhciBwYXNzcG9ydCA9IHJlcXVpcmUoJ3Bhc3Nwb3J0Jyk7XG5yZXF1aXJlKCcuLi8uLi8uLi8uLi9taWRkbGV3YXJlL3Bhc3Nwb3J0JykocGFzc3BvcnQpO1xudmFyIHZhbGlkdG9rZW4gPSByZXF1aXJlKCcuLi8uLi8uLi8uLi9taWRkbGV3YXJlL3ZhbGlkLXRva2VuJylcbi8vIFNldCB5b3VyIHNlY3JldCBrZXk6IHJlbWVtYmVyIHRvIGNoYW5nZSB0aGlzIHRvIHlvdXIgbGl2ZSBzZWNyZXQga2V5IGluIHByb2R1Y3Rpb25cbi8vIFNlZSB5b3VyIGtleXMgaGVyZTogaHR0cHM6Ly9kYXNoYm9hcmQuc3RyaXBlLmNvbS9hY2NvdW50L2FwaWtleXNcbmNvbnN0IGFwaUtleSA9IHByb2Nlc3MuZW52LlBBWU1FTlRfU1RSSVBFX0FQSUtFWTtcbndpbnN0b24uZGVidWcoJ3N0cmlwZSBhcGlLZXknICsgYXBpS2V5KTtcblxuY29uc3Qgc3RyaXBlID0gcmVxdWlyZSgnc3RyaXBlJykoYXBpS2V5KTtcblxuLy8gRmluZCB5b3VyIGVuZHBvaW50J3Mgc2VjcmV0IGluIHlvdXIgRGFzaGJvYXJkJ3Mgd2ViaG9vayBzZXR0aW5nc1xuY29uc3QgZW5kcG9pbnRTZWNyZXQgPSBwcm9jZXNzLmVudi5QQVlNRU5UX1NUUklQRV9TRUNSRVQ7XG53aW5zdG9uLmRlYnVnKCdzdHJpcGUgZW5kcG9pbnRTZWNyZXQnICsgZW5kcG9pbnRTZWNyZXQpO1xuXG5jb25zdCBhcGlTZWNyZXRLZXkgPSBwcm9jZXNzLmVudi5QQVlNRU5UX1NUUklQRV9BUElfU0VDUkVUX0tFWTtcbndpbnN0b24uZGVidWcoJ3N0cmlwZSBhcGlTZWNyZXRLZXknICsgYXBpU2VjcmV0S2V5KTtcblxuXG5jb25zdCBib2R5UGFyc2VyID0gcmVxdWlyZSgnYm9keS1wYXJzZXInKTtcbi8vIGNvbnN0IHJhd1BhcnNlciA9IGJvZHlQYXJzZXIucmF3KHt0eXBlOiBcIiovKlwifSlcblxuLy8gaHR0cHM6Ly9zdHJpcGUuY29tL2RvY3MvcGF5bWVudHMvY2hlY2tvdXQvZnVsZmlsbG1lbnQjd2ViaG9va3Ncbi8vIGN1cmwgLVggUE9TVCAtdSBhbmRyZWEubGVvQGYyMS5pdDoxMjM0NTYgLUggJ0NvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uJyAtZCAne1widHlwZVwiOlwicGF5bWVudF9pbnRlbnQuc3VjY2VlZGVkXCJ9JyAgaHR0cDovL2xvY2FsaG9zdDozMDAwL21vZHVsZXMvcGF5bWVudHMvc3RyaXBlL3dlYmhvb2tcbnJvdXRlci5wb3N0KCcvd2ViaG9vaycsIGJvZHlQYXJzZXIucmF3KHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLCBmdW5jdGlvbiAocmVxdWVzdCwgcmVzcG9uc2UpIHtcbiAgLy8gd2luc3Rvbi5pbmZvKCdzdHJpcGUgd2ViaG9vaycpO1xuICAvLyB3aW5zdG9uLmluZm8oJ8K7wrvCu8K7IHN0cmlwZSByZXF1ZXN0OiAnLCByZXF1ZXN0KSBcbiAgd2luc3Rvbi5kZWJ1ZygnwrvCu8K7wrsgc3RyaXBlIGVuZHBvaW50U2VjcmV0OiAnICsgZW5kcG9pbnRTZWNyZXQpXG4gIHdpbnN0b24uZGVidWcoJ8K7wrvCu8K7IHN0cmlwZSBhcGlLZXk6ICcgKyBhcGlLZXkpO1xuICB3aW5zdG9uLmRlYnVnKCdzdHJpcGUgYXBpU2VjcmV0S2V5JyArIGFwaVNlY3JldEtleSk7XG5cbiAgY29uc3Qgc2lnID0gcmVxdWVzdC5oZWFkZXJzWydzdHJpcGUtc2lnbmF0dXJlJ107XG4gIC8vIHdpbnN0b24uZGVidWcoJ3N0cmlwZSBzaWcnICsgc2lnKTtcblxuICB3aW5zdG9uLmRlYnVnKCdzdHJpcGUgc2lnOiAnLCBzaWcpXG4gIC8vIHdpbnN0b24uaW5mbygnc3RyaXBlIHJlcXVlc3QuYm9keS5hc1RleHQ6JytyZXF1ZXN0LmJvZHkuYXNUZXh0KTsgXG4gIC8vIHdpbnN0b24uaW5mbygnc3RyaXBlIHJlcXVlc3Q6JyArIHJlcXVlc3QpO1xuICAvLyB3aW5zdG9uLmluZm8oJ3N0cmlwZSByZXF1ZXN0OiAnLCByZXF1ZXN0KVxuXG4gIC8vIHdpbnN0b24uaW5mbygnwrvCu8K7wrsgc3RyaXBlIHJlcXVlc3QucmF3Qm9keTogJyArIHJlcXVlc3QucmF3Qm9keSk7XG5cbiAgbGV0IGV2ZW50O1xuXG4gIHRyeSB7XG4gICAgZXZlbnQgPSBzdHJpcGUud2ViaG9va3MuY29uc3RydWN0RXZlbnQocmVxdWVzdC5yYXdCb2R5LCBzaWcsIGVuZHBvaW50U2VjcmV0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gd2luc3Rvbi5lcnJvcignU3RyaXBlIGVycm9yIGNvbnN0cnVjdEV2ZW50ICcsIGVycik7XG4gICAgd2luc3Rvbi5lcnJvcignKioqKiBTdHJpcGUgZXJyb3IgY29uc3RydWN0RXZlbnQ6ICcsIGVyci5tZXNzYWdlKVxuICAgIHJldHVybiByZXNwb25zZS5zdGF0dXMoNDAwKS5zZW5kKGBXZWJob29rIEVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHdpbnN0b24uaW5mbygnc3RyaXBlIGV2ZW50JywgZXZlbnQpO1xuXG4gIC8vIHRoZSBcIk9CSkVDVF9UWVBFXCIgKHN1YnNjcmlwdGlvbilcbiAgXG4gIC8qKlxuICAgKiohICoqKiBIYW5kbGUgdGhlIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIGV2ZW50ICoqKlxuICAgKiBOT1RFOiBUSElTIEVWRU5UIE9DQ1VSIE9OTFkgV0hFTiBJUyBDUkVBVEVEIEEgTkVXIFNVQlNDUklQVElPTlxuICAgKiAxKSBGUk9NIFRIRSBQUk9QRVJUWSBcImNsaWVudF9yZWZlcmVuY2VfaWRcIiBBUkUgT0JUQUlORUQgVEhFOlxuICAgKiAgICBBKSBVU0VSIElEXG4gICAqICAgIEIpIFBST0pFQ1QgSUQgXG4gICAqIDIpIFdJVEggVEhFIHN1YnNjcmlwdGlvbiBJRCAoTk9URSBpcyB0aGUgcHJvcGVydHkgc3Vic2NyaXB0aW9uKSBJUyBSVU5ORUQgQSBDQUxMQkFDSyBUTyBTVFJJUEVcbiAgICogICAgVE8gT0JUQUlOIFRIRSBPQkpFQ1QgXCJTVUJTQ1JJUFRJT05cIiBBTkQgVEhFTiBGUk9NIFRISVMgQVJFIE9CVEFJTkVEIFRIRTpcbiAgICogICAgQSkgc3Vic2NyaXB0aW9uU3RhcnREYXRlXG4gICAqICAgIEIpIHN1YnNjcmlwdGlvbkVuZERhdGVcbiAgICogICAgQykgcXVhbnRpdHkgKHdoaWNoIGluIHRoZSB0aWxlZGVzayBkYXNoYm9hcmQgY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBhZ2VudHMgLyBvcGVyYXRvcnMgc2VhdHMpXG4gICAqIDMpIFdJVEggVEhFIE9CVEFJTkVEIERBVEEgSVMgVVBEQVRFRCBUSEUgUFJPSkVDVCAnUFJPRklMRScgKGlzIGFuIG9iamVjdCBuZXN0ZWQgaW4gdGhlIHByb2plY3Qgb2JqZWN0KSBcbiAgICogNCkgVEhFIE9CVEFJTkVEIE9CSkVDVCBcIlNVQlNDUklQVElPTlwiIEFORCB0aGUgXCJTVUJTQ1JJUFRJT04gSURcIiwgdGhlIFwiUFJPSkVDVCBJRFwiLCB0aGUgXCJVU0VSIElEXCIgQU5EIHN0cmlwZV9ldmVudDogXCJjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZFwiIEFSRSBTQVZFRCBPTiBPVVIgREJcbiAgICogICAgQVMgXCJTVUJTQ1JJUFRJT04tUEFZTUVOVFwiXG4gICAqL1xuXG4gIGlmIChldmVudC50eXBlID09PSAnY2hlY2tvdXQuc2Vzc2lvbi5jb21wbGV0ZWQnKSB7XG4gICAgd2luc3Rvbi5kZWJ1ZygnISEhISEhISEgSEkgISEhISEhISEgY2hlY2tvdXQuc2Vzc2lvbi5jb21wbGV0ZWQnKTtcblxuICAgIGNvbnN0IHNlc3Npb24gPSBldmVudC5kYXRhLm9iamVjdDtcbiAgICB3aW5zdG9uLmluZm8oJ3N0cmlwZSBjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZCcsIHNlc3Npb24pO1xuXG4gICAgdmFyIGNsaWVudF9yZWZlcmVuY2VfaWQgPSBzZXNzaW9uLmNsaWVudF9yZWZlcmVuY2VfaWQ7XG4gICAgd2luc3Rvbi5pbmZvKCdzdHJpcGUgY2xpZW50X3JlZmVyZW5jZV9pZCcsIGNsaWVudF9yZWZlcmVuY2VfaWQpO1xuXG4gICAgLyoqIDFBICovXG4gICAgdmFyIHVzZXJfaWQgPSBjbGllbnRfcmVmZXJlbmNlX2lkLnNwbGl0KFwiX1wiKVswXTtcbiAgICB3aW5zdG9uLmluZm8oJ3N0cmlwZSB1c2VyX2lkOicgKyB1c2VyX2lkKTtcblxuICAgIC8qKiAxQiAqL1xuICAgIHZhciBwcm9qZWN0X2lkID0gY2xpZW50X3JlZmVyZW5jZV9pZC5zcGxpdChcIl9cIilbMV07XG4gICAgd2luc3Rvbi5pbmZvKCdzdHJpcGUgcHJvamVjdF9pZDogJyArIHByb2plY3RfaWQpO1xuXG4gICAgdmFyIHBsYW5fbmFtZSA9IGNsaWVudF9yZWZlcmVuY2VfaWQuc3BsaXQoXCJfXCIpWzJdO1xuICAgIHdpbnN0b24uaW5mbygnc3RyaXBlIHBsYW5fbmFtZTogJyArIHBsYW5fbmFtZSk7XG5cbiAgICAvLyB2YXIgYm9keSA9IHByb2ZpbGU6IHtcbiAgICAvLyAgIFwiYWdlbnRzXCI6IDMsXG4gICAgLy8gICBcInRyaWFsRGF5c1wiOiAzMCxcbiAgICAvLyAgIFwibmFtZVwiOiBcImZyZWVcIixcbiAgICAvLyAgIFwidHlwZVwiOiBcImZyZWVcIixcbiAgICAvLyAgIFwic3ViU3RhcnRcIjogXCIyMDE5LTA2LTI2VDE2OjM3OjU4LjE2NFpcIixcbiAgICAvLyAgIFwic3ViRW5kXCI6IFwiMjAxOS0wNy0yNlQxNjozNzo1OC4xNjRaXCJcbiAgICAvLyB9XG4gICAgdmFyIHN1YnNjcmlwdGlvbklkID0gZXZlbnQuZGF0YS5vYmplY3Quc3Vic2NyaXB0aW9uO1xuICAgIHdpbnN0b24uaW5mbygnKioqICoqKiAhISEhISEhISEhISEhISEhISEhISEhIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIC0gc3Vic2NyaXB0aW9uIElEOiAnLCBzdWJzY3JpcHRpb25JZCk7XG5cblxuICAgIGdldFN1YnNjcml0aW9uQnlJZChzdWJzY3JpcHRpb25JZCkudGhlbihmdW5jdGlvbiAoc3Vic2NyaXB0aW9uX29iaikge1xuICAgICAgLy8gd2luc3Rvbi5pbmZvKCcqKiogKioqIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIC0gZ2V0U3Vic2NyaXRpb25CeUlkIHN1YnNjcjogJywgc3Vic2NyaXB0aW9uKTtcbiAgICAgIHZhciBvYmplY3RfdHlwZSA9IHN1YnNjcmlwdGlvbl9vYmoub2JqZWN0O1xuICAgICAgd2luc3Rvbi5pbmZvKCcqKiogKioqIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIC0gZ2V0U3Vic2NyaXRpb25CeUlkIHN1YnNjciBvYmplY3RfdHlwZTogJywgb2JqZWN0X3R5cGUpO1xuXG4gICAgICAvKiogMkEgKi9cbiAgICAgIHZhciBzdWJzY3JpcHRpb25TdGFydERhdGUgPSBtb21lbnQudW5peChzdWJzY3JpcHRpb25fb2JqLmN1cnJlbnRfcGVyaW9kX3N0YXJ0KS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MuU1NTJylcbiAgICAgIHdpbnN0b24uaW5mbygnKioqICoqKiBjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZCAtIGdldFN1YnNjcml0aW9uQnlJZCAqKiogc3RhcnQgKioqIDogJywgc3Vic2NyaXB0aW9uU3RhcnREYXRlKTtcblxuICAgICAgLyoqIDJCICovXG4gICAgICB2YXIgc3Vic2NyaXB0aW9uRW5kRGF0ZSA9IG1vbWVudC51bml4KHN1YnNjcmlwdGlvbl9vYmouY3VycmVudF9wZXJpb2RfZW5kKS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MuU1NTJylcbiAgICAgIHdpbnN0b24uaW5mbygnKioqICoqKiBjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZCAtIGdldFN1YnNjcmlwdGlvbiAqKiogZW5kICoqKiA6ICcsIHN1YnNjcmlwdGlvbkVuZERhdGUpO1xuICAgICAgLyoqIDJDICovXG4gICAgICB2YXIgcXVhbnRpdHkgPSBzdWJzY3JpcHRpb25fb2JqLnF1YW50aXR5O1xuICAgICAgd2luc3Rvbi5pbmZvKCcqKiogKioqIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIC0gcXVhbnRpdHkgOiAnLCBxdWFudGl0eSk7XG5cbiAgICAgIC8qKlxuICAgICAgICohICoqKiBCT0RZICoqKlxuICAgICAgICovXG4gICAgICB2YXIgYm9keSA9IHtcbiAgICAgICAgcHJvZmlsZToge1xuICAgICAgICAgIG5hbWU6IHBsYW5fbmFtZSxcbiAgICAgICAgICB0eXBlOiAncGF5bWVudCcsXG4gICAgICAgICAgc3Vic2NyaXB0aW9uX2NyZWF0aW9uX2RhdGU6IHN1YnNjcmlwdGlvblN0YXJ0RGF0ZSxcbiAgICAgICAgICBzdWJTdGFydDogc3Vic2NyaXB0aW9uU3RhcnREYXRlLFxuICAgICAgICAgIHN1YkVuZDogc3Vic2NyaXB0aW9uRW5kRGF0ZSxcbiAgICAgICAgICBzdWJzY3JpcHRpb25JZDogc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgbGFzdF9zdHJpcGVfZXZlbnQ6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgYWdlbnRzOiBxdWFudGl0eVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKiAzICovXG4gICAgICB1cGRhdGVQcm9qZWN0UHJvZmlsZShwcm9qZWN0X2lkLCBib2R5KTtcblxuICAgICAgLyoqIDQgKi9cbiAgICAgIHNhdmVPbkRCKHN1YnNjcmlwdGlvbklkLCBwcm9qZWN0X2lkLCBzdWJzY3JpcHRpb25fb2JqLCB1c2VyX2lkLCBldmVudC50eXBlLCBwbGFuX25hbWUpXG5cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB3aW5zdG9uLmVycm9yKCcqKiogKioqIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIC0gZ2V0U3Vic2NyaXRpb25CeUlkIGVyciAnLCBlcnIpO1xuICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIGVycm9yXG4gICAgfSk7XG5cbiAgfVxuICAvLyBvYmplY3RfdHlwZSA9IHN1YnNjcmlwdGlvbi5cbiAgLyoqXG4gICAqKiEgKioqIEhhbmRsZSB0aGUgaW52b2ljZS5wYXltZW50X3N1Y2NlZWRlZCBldmVudCAqKipcbiAgICogTk9URTogVEhJUyBFVkVOVCBPQ0NVUiBXSEVOIElTIENSRUFURUQgQSBORVcgU1VCU0NSSVBUSU9OIEFORCBFVkVSWSBUSU1FIFRIRSBTQU1FIElTIFJFTkVXRURcbiAgICogMSkgRlJPTSBUSEUgT0JKRUNUIE9GIFRIRSBFVkVOVCBBUkUgT0JUQUlORUQgVEhFOlxuICAgKiAgICBBKSBzdWJzY3JpcHRpb25TdGFydERhdGVcbiAgICogICAgQikgc3Vic2NyaXB0aW9uRW5kRGF0ZVxuICAgKiAgICBDKSBzdWJzY3JpdHB0aW9uSWQgIFxuICAgKiAyKSB3aGVuIHJlZmVyIHRvIGEgUkVORVdBTCAoIGJpbGxpbmdfcmVhc29uID09PSBzdWJzY3JpcHRpb25fY3ljbGUpXG4gICAqICAgIElGIFRIRSBWQUxVRSBPRiBUSEUgUFJPUEVSVFkgXCJiaWxsaW5nX3JlYXNvblwiIElTIFVOTElLRSBPRiBcInN1YnNjcmlwdGlvbl9jcmVhdGVcIiAoTUVBTlMgVEhBVCBUSEUgRVZFTlQgUkVGRVIgVE8gQSBSRU5FV0FMIFxuICAgKiAgICBGT1IgV0hJQ0ggYmlsbGluZ19yZWFzb246IHN1YnNjcmlwdGlvbl9jeWNsZSBBTkQgTk9UIFRPIFRIRSBGSVJTVCBTVUJTQ1JJUFRJT04pIFxuICAgKiAgICBBKSBJUyBPQlRBSU5FRCBUSEUgJ1NVQlNDUklQVElPTi1QQVlNRU5UJyAod2l0aCBzdHJpcGVfZXZlbnQ6IFwiY2hlY2tvdXQuc2Vzc2lvbi5jb21wbGV0ZWRcIikgU0FWRUQgQUJPVkUgQU5EIFRIRU4gRlJPTSBUSElTOlxuICAgKiAgICAgICAtIFRIRSBcIlBST0pFQ1QgSURcIiBcbiAgICogICAgICAgLSBUSEUgXCJVU0VSIElEXCJcbiAgICogICAgICAgVE8gT0JUQUlOIFRIRSAnU1VCU0NSSVBUSU9OLVBBWU1FTlQnSU4gT1VSIERCIElTIExPT0tFRCBGT1IgVEhFIFwiU1VCU0NSSVBJT04tUEFZTUVOVFwiIFRIQVQgSEFTIEZPUiBzdWJzY3JpcHRpb24gaWQgVEhFIFZBTFVFIE9GIDFDIEFORCBzdHJpcGVfZXZlbnQ6IFwiY2hlY2tvdXQuc2Vzc2lvbi5jb21wbGV0ZWRcIlxuICAgKiAgICAgICBUSEUgQ09ORElUSU9OIHN0cmlwZV9ldmVudDogXCJjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZFwiIChOTyBNT1JFOiBvYmplY3RfdHlwZSA9IHN1YnNjcmlwdGlvbikgSVQnUyBORUNFU1NBUlkgVE8gRklMVEVSIFRIRSBcIlNVQlNDUklQSU9OLVBBWU1FTlRTXCIgXG4gICAqICAgICAgIFRIQVQgQ09OVEFJTiBUSEUgIFBST1BFUlRJRVMgIFwicHJvamVjdElEXCIgQU5EIFwidXNlcklEXCJcbiAgICogICAgICAgVEhFIEVYSVNURU5DRSBPRiBBIFwiU1VCU0NSSVBUSU9OLVBBWU1FTlRcIiBXSVRIT1VUIFwicHJvamVjdElEXCIgQU5EIFwidXNlcklEXCIgSVMgRFVFIFRPIFRIRSBGQUNUIFRIQVQgQVQgVEhFIE1PTUVOVCBPRiBUSEUgQ1JFQVRJT04gT0YgQSBTVUJTQ1JJUFRJT04gXG4gICAqICAgICAgIElTIFNBVkVEIElOIE9VUiBEQiBBTFNPIEEgXCJTVUJTQ1JJUFRJT04tUEFZTUVOVFwiIENPUlJFU1BPTkRJTkcgVE8gVEhFIE9CSkVDVCBSRVRVUk5FRCBCWSAgVEhFIEVWRU5UIFwiaW52b2ljZS5wYXltZW50X3N1Y2NlZWRlZFwiIFVTRUZVTCBCRUNBVVNFIFxuICAgKiAgICAgICBJVCBDT05UQUlOUyBUSEUgTElOS1MgT0YgVEhFIElOVk9JQ0UgT0YgVEhFIEZJUlNUIFNVQlNDUklQVElPTiAodXNlZCBieSB0aWxlZGVzayBkYXNoYm9hcmQgaW4gdGhlIGNvbXBvbmVudHMgcGF5bWVudHMpXG4gICAqICAgICAgIEJVVCBGUk9NIFdISUNIIElUIElTIE5PVCBQT1NTSUJMRSBQVVNIIEFORCBUSEVOIFRPIFRPIE9CVEFJTiBUSEUgXCJwcm9qZWN0SURcIiBBTkQgXCJ1c2VySURcIlxuICAgKiAgICBCKSBJUyBVUERBVEVEIFRIRSBQUk9KRUNUICdQUk9GSUxFJyBXSVRIOlxuICAgKiAgICAgICAtIERBVEEgT0JUQUlORUQgRlJPTSBUSEUgRVZFTlQnUyBPQkpFQ1Q6XG4gICAqICAgICAgICAgLSBzdWJzY3JpcHRpb25TdGFydERhdGVcbiAgICogICAgICAgICAtIHN1YnNjcmlwdGlvbkVuZERhdGVcbiAgICogICAgICAgICAtIHN1YnNjcmlwdGlvbklkIFxuICAgKiAgICAgICAgIC0gbGFzdF9zdHJpcGVfZXZlbnQgXG4gICAqICAgICAgICAgLSBxdWFudGl0eSAod2hpY2ggaW4gdGhlIGRhc2hib2FyZCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIGFnZW50cyAvIG9wZXJhdG9ycyBzZWF0cylcbiAgICogICAgICAgLSBEQVRBIE9CVEFJTkVEIEZST00gVEhFICdTVUJTQ1JJUFRJT04tUEFZTUVOVCcgd2l0aCBzdHJpcGVfZXZlbnQ6IFwiY2hlY2tvdXQuc2Vzc2lvbi5jb21wbGV0ZWRcIlxuICAgKiAgICAgICAgIC0gXCJQUk9KRUNUIElEXCIgYW5kIFwiVVNFUiBJRFwiXG4gICAqICAgIEMpIFRIRSBPQkpFQ1QgT0YgVEhFIEVWRU5UIGludm9pY2UucGF5bWVudF9zdWNjZWVkZWQgQU5EIHRoZSBcIlNVQlNDUklQVElPTiBJRFwiLCB0aGUgXCJQUk9KRUNUIElEXCIsIHRoZSBcIlVTRVIgSURcIiBBTkQgdGhlIFwiT0JKRUNUX1RZUEVcIiAoZXZlbnQpIFxuICAgKiAgICAgICBBUkUgU0FWRUQgQVMgXCJTVUJTQ1JJUFRJT04tUEFZTUVOVFwiIE9OIE9VUiBEQlxuICAgKiAzKSB3aGVuIHJlZmVyIHRvIGEgQ1JFQVRJT04gKGJpbGxpbmdfcmVhc29uID09PSBzdWJzY3JpcHRpb25fY3JlYXRlKVxuICAgKiAgICBBKSBUSEUgT0JKRUNUIE9GIFRIRSBFVkVOVCBpbnZvaWNlLnBheW1lbnRfc3VjY2VlZGVkIEFORCBUSEUgREFUQSBldmVudC50eXBlID09PSBpbnZvaWNlLnBheW1lbnRfc3VjY2VlZGVkICBBUkUgU0FWRUQgQVMgXCJTVUJTQ1JJUFRJT04tUEFZTUVOVFwiXG4gICAqICAgICAgIE9OIE9VUiBEQiAoTk9URTogXCJQUk9KRUNUIElEXCIgQU5EIFwiVVNFUiBJRFwiIEFSRSBTQVZFRCBBUyBudWxsIFNJTkNFIElTIE5PVCBQT1NTSUJMRSBUTyBSRVRSSUVWRSBUSEUgVkFMVUVTKSBcbiAgICogXG4gICAqL1xuICBpZiAoZXZlbnQudHlwZSA9PT0gJ2ludm9pY2UucGF5bWVudF9zdWNjZWVkZWQnKSB7XG5cbiAgICB3aW5zdG9uLmluZm8oJyAhISEhISEhISBISSAhISEhISEhISBpbnZvaWNlLnBheW1lbnRfc3VjY2VlZGVkJyk7XG4gICAgd2luc3Rvbi5pbmZvKCcqKiogKioqIGludm9pY2UucGF5bWVudF9zdWNjZWVkZWQgLSBCSUxMSU5HIFJFQVNPTiAnLCBldmVudC5kYXRhLm9iamVjdC5iaWxsaW5nX3JlYXNvbik7XG5cbiAgICB2YXIgbGluZXNOdW0gPSBldmVudC5kYXRhLm9iamVjdC5saW5lcy50b3RhbF9jb3VudFxuICAgIGNvbnNvbGUubG9nKCcqKiogKioqIGludm9pY2UucGF5bWVudF9zdWNjZWVkZWQgLSBsaW5lc051bTogJywgbGluZXNOdW0pO1xuXG4gICAgdmFyIGluZGV4ID0gbGluZXNOdW0gLSAxO1xuICAgIGNvbnNvbGUubG9nKCcqKiogKioqIGludm9pY2UucGF5bWVudF9zdWNjZWVkZWQgLSBpbmRleDogJywgaW5kZXgpO1xuICAgIGNvbnNvbGUubG9nKCcqKiogKioqIGludm9pY2UucGF5bWVudF9zdWNjZWVkZWQgLSB0eXBlT2YgaW5kZXggOicsIHR5cGVvZiBpbmRleCk7XG4gICAgLyoqIDFBICovIC8vIFRISVMgV09SS1NcbiAgICB2YXIgc3Vic2NyaXB0aW9uU3RhcnREYXRlID0gbW9tZW50LnVuaXgoZXZlbnQuZGF0YS5vYmplY3QubGluZXMuZGF0YVtpbmRleF0ucGVyaW9kLnN0YXJ0KS5mb3JtYXQoJ1lZWVktTU0tRERUSEg6bW06c3MuU1NTJylcbiAgICBjb25zb2xlLmxvZygnKioqICoqKiBpbnZvaWNlLnBheW1lbnRfc3VjY2VlZGVkIC0gc3RhcnQ6ICcsIHN1YnNjcmlwdGlvblN0YXJ0RGF0ZSk7XG5cbiAgICAvKiogMUEgTkVXICovIC8vIE5PIEdPT0QgTVkgR09EXG4gICAgLy8gdmFyIHN1YnNjcmlwdGlvblN0YXJ0RGF0ZSA9IG1vbWVudC51bml4KGV2ZW50LmRhdGEub2JqZWN0LnBlcmlvZF9zdGFydCkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycpXG4gICAgLy8gY29uc29sZS5sb2coJyoqKiAqKiogaW52b2ljZS5wYXltZW50X3N1Y2NlZWRlZCAtIHN0YXJ0OiAnLCBzdWJzY3JpcHRpb25TdGFydERhdGUpO1xuXG4gICAgLyoqIDFCICovIC8vIFRISVMgV09SS1NcbiAgICB2YXIgc3Vic2NyaXB0aW9uRW5kRGF0ZSA9IG1vbWVudC51bml4KGV2ZW50LmRhdGEub2JqZWN0LmxpbmVzLmRhdGFbaW5kZXhdLnBlcmlvZC5lbmQpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcy5TU1MnKVxuICAgIGNvbnNvbGUubG9nKCcqKiogKioqIGludm9pY2UucGF5bWVudF9zdWNjZWVkZWQgLSBlbmQ6ICcsIHN1YnNjcmlwdGlvbkVuZERhdGUpO1xuXG5cblxuICAgIC8qKiAxQiAqL1xuICAgIHZhciBzdWJzY3JpcHRpb25JZCA9IGV2ZW50LmRhdGEub2JqZWN0LnN1YnNjcmlwdGlvbjtcbiAgICB3aW5zdG9uLmluZm8oJyoqKiAqKiogaW52b2ljZS5wYXltZW50X3N1Y2NlZWRlZCAtIHN1YnNjcmlwdGlvbiBJRDogJywgc3Vic2NyaXB0aW9uSWQpO1xuXG4gICAgaWYgKHN1YnNjcmlwdGlvbklkID09IG51bGwpIHtcbiAgICAgIHN1YnNjcmlwdGlvbklkID0gIGV2ZW50LmRhdGEub2JqZWN0LmxpbmVzLmRhdGFbMF0uc3Vic2NyaXB0aW9uO1xuICAgICAgY29uc29sZS5sb2coJyoqKiAqKiogaW52b2ljZS5wYXltZW50X3N1Y2NlZWRlZCAtIHN1YnNjcmlwdGlvbiBJRDogJywgc3Vic2NyaXB0aW9uSWQpO1xuICAgIH1cblxuICAgIHZhciBxdWFudGl0eSA9ICcnXG4gICAgaWYgKCBldmVudC5kYXRhLm9iamVjdC5saW5lcy5kYXRhLmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhciBxdWFudGl0eSA9IGV2ZW50LmRhdGEub2JqZWN0LmxpbmVzLmRhdGFbZXZlbnQuZGF0YS5vYmplY3QubGluZXMuZGF0YS5sZW5ndGgtMV0ucXVhbnRpdHk7XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCcqKiogKioqIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIC0gcXVhbnRpdHkgdXNlIGNhc2UgbGVuZ3RoID4gMSA6ICcsIHF1YW50aXR5KTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmRhdGEub2JqZWN0LmxpbmVzLmRhdGEubGVuZ3RoID09PSAxKSAge1xuICAgICAgdmFyIHF1YW50aXR5ID0gZXZlbnQuZGF0YS5vYmplY3QubGluZXMuZGF0YVswXS5xdWFudGl0eTtcbiAgICAgIGNvbnNvbGUubG9nKCcqKiogKioqIGNoZWNrb3V0LnNlc3Npb24uY29tcGxldGVkIC0gcXVhbnRpdHkgdXNlIGNhc2UgbGVuZ3RoID09IDEgOiAnLCBxdWFudGl0eSk7XG4gICAgfVxuXG4gICAgLy8gLyoqIDFCICovXG4gICAgLy8gdmFyIHF1YW50aXR5ID0gZXZlbnQuZGF0YS5vYmplY3QubGluZXMuZGF0YVswXS5xdWFudGl0eTtcbiAgICAvLyB3aW5zdG9uLmluZm8oJyoqKiAqKiogY2hlY2tvdXQuc2Vzc2lvbi5jb21wbGV0ZWQgLSBxdWFudGl0eSA6ICcsIHF1YW50aXR5KTtcblxuICAgIGlmIChldmVudC5kYXRhLm9iamVjdC5iaWxsaW5nX3JlYXNvbiAhPT0gJ3N1YnNjcmlwdGlvbl9jcmVhdGUnKSB7XG5cblxuICAgICAgLy8gVE8gVEVTVCBUSEUgUkVORVdBTCBVTkNPTU1FTlQgU0VUIFRJTUVPVVRcbiAgICAgIC8vIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgLyoqIDJBICovXG4gICAgICBnZXRTdWJzY3JwUGF5bWVudEJ5U3Vic2NycElkQW5kU3RyaXBlRXZlbnQoc3Vic2NyaXB0aW9uSWQpLnRoZW4oZnVuY3Rpb24gKHN1YnNwdG5fcGF5bWVudCkge1xuICAgICAgICB3aW5zdG9uLmluZm8oJyoqKiAqKiogZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50IHN1YnNwdG5fcGF5bWVudDogJywgc3Vic3B0bl9wYXltZW50KTtcblxuICAgICAgICBpZiAoIXN1YnNwdG5fcGF5bWVudCkge1xuICAgICAgICAgIHdpbnN0b24uaW5mbygnKioqICoqKiBnZXRTdWJzY3JwUGF5bWVudEJ5U3Vic2NycElkQW5kU3RyaXBlRXZlbnQgc3Vic3B0bl9wYXltZW50IG5vdCBzdWJzcHRuX3BheW1lbnQnKTtcbiAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3Vic3B0bl9wYXltZW50Lmxlbmd0aD09PTApIHtcbiAgICAgICAgICB3aW5zdG9uLmluZm8oJyoqKiAqKiogZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50IHN1YnNwdG5fcGF5bWVudCBub3Qgc3Vic3B0bl9wYXltZW50Jyk7XG4gICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgcHJvamVjdElkID0gc3Vic3B0bl9wYXltZW50WzBdLnByb2plY3RfaWRcbiAgICAgICAgdmFyIHVzZXJJZCA9IHN1YnNwdG5fcGF5bWVudFswXS51c2VyX2lkXG4gICAgICAgIHZhciBwbGFuX25hbWUgPSBzdWJzcHRuX3BheW1lbnRbMF0ucGxhbl9uYW1lXG5cbiAgICAgICAgd2luc3Rvbi5pbmZvKCcqKiogKioqIGdldFN1YnNjcnBQYXltZW50QnlTdWJzY3JwSWRBbmRTdHJpcGVFdmVudCAtIHByb2plY3RJZDogICcrIHByb2plY3RJZCk7XG4gICAgICAgIHdpbnN0b24uaW5mbygnKioqICoqKiBnZXRTdWJzY3JwUGF5bWVudEJ5U3Vic2NycElkQW5kU3RyaXBlRXZlbnQgLSB1c2VySWQ6ICcrIHVzZXJJZCk7XG4gICAgICAgIHdpbnN0b24uaW5mbygnKioqICoqKiBpbnZvaWNlLnBheW1lbnRfc3VjY2VlZGVkIGdldFN1YnNjcnBQYXltZW50QnlTdWJzY3JwSWRBbmRTdHJpcGVFdmVudCAtIHBsYW5fbmFtZTogJysgcGxhbl9uYW1lKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICohICoqKiBCT0RZICoqKlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHByb2plY3RJZCkge1xuICAgICAgICAgIHZhciBib2R5ID0ge1xuICAgICAgICAgICAgcHJvZmlsZToge1xuICAgICAgICAgICAgICBuYW1lOiBwbGFuX25hbWUsXG4gICAgICAgICAgICAgIHR5cGU6ICdwYXltZW50JyxcbiAgICAgICAgICAgICAgc3ViU3RhcnQ6IHN1YnNjcmlwdGlvblN0YXJ0RGF0ZSxcbiAgICAgICAgICAgICAgc3ViRW5kOiBzdWJzY3JpcHRpb25FbmREYXRlLFxuICAgICAgICAgICAgICBzdWJzY3JpcHRpb25JZDogc3Vic2NyaXB0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3Rfc3RyaXBlX2V2ZW50OiBldmVudC50eXBlLFxuICAgICAgICAgICAgICBhZ2VudHM6IHF1YW50aXR5XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyoqIDJCICovXG4gICAgICAgICAgdXBkYXRlUHJvamVjdFByb2ZpbGUocHJvamVjdElkLCBib2R5KTtcbiAgICAgICAgICAvKiogMkMgKi9cblxuICAgICAgICAgIHNhdmVPbkRCKHN1YnNjcmlwdGlvbklkLCBwcm9qZWN0SWQsIGV2ZW50LCB1c2VySWQsIGV2ZW50LnR5cGUsIHBsYW5fbmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICB3aW5zdG9uLmVycm9yKCcqKiogKioqIGdldFN1YnNjcnBQYXltZW50QnlTdWJzY3JwSWRBbmRTdHJpcGVFdmVudCAtIGVyciAnLCBlcnIpO1xuXG4gICAgICB9KTtcbiAgICAgIC8vIH0sIDUwMDApO1xuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vICAgdXBkYXRlU2F2ZWRTdWJzY3JpcHRpb25XaXRoSW52b2ljZShzdWJzY3JpcHRpb25JZCwgZXZlbnQuZGF0YS5vYmplY3QuaG9zdGVkX2ludm9pY2VfdXJsLCBldmVudC5kYXRhLm9iamVjdC5pbnZvaWNlX3BkZilcbiAgICAgIC8qKiAzQSAqL1xuIFxuICAgICAgc2F2ZU9uREIoc3Vic2NyaXB0aW9uSWQsIG51bGwsIGV2ZW50LCBudWxsLCBldmVudC50eXBlLCBudWxsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiohICoqKiBIQU5ETEUgVEhFIEVWRU5UIGN1c3RvbWVyLnN1YnNjcmlwdGlvbi51cGRhdGVkICoqKlxuICAgKi9cbiAgaWYgKGV2ZW50LnR5cGUgPT09ICdjdXN0b21lci5zdWJzY3JpcHRpb24udXBkYXRlZCcpIHtcblxuICAgIHdpbnN0b24uaW5mbygnICEhISEhISEhIEhJICEhISEhISEhISEhIGN1c3RvbWVyLnN1YnNjcmlwdGlvbi51cGRhdGVkJyk7XG4gICAgdmFyIHN1YnNjcmlwdGlvbl9uZXdfcXR5ID0gZXZlbnQuZGF0YS5vYmplY3QucXVhbnRpdHk7XG4gICAgd2luc3Rvbi5pbmZvKCcgISEhISEhISEgSEkgISEhISEhISEhISEgY3VzdG9tZXIuc3Vic2NyaXB0aW9uLnVwZGF0ZWQgIHN1YnNjcmlwdGlvbl9xdHkgJywgc3Vic2NyaXB0aW9uX25ld19xdHkpO1xuICAgIHZhciBzdWJzY3JpcHRpb25faWQgPSBldmVudC5kYXRhLm9iamVjdC5pZDtcbiAgICB2YXIgc3Vic2NyaXB0aW9uU3RhcnREYXRlID0gbW9tZW50LnVuaXgoZXZlbnQuZGF0YS5vYmplY3QuY3VycmVudF9wZXJpb2Rfc3RhcnQpLmZvcm1hdCgnWVlZWS1NTS1ERFRISDptbTpzcy5TU1MnKTtcbiAgICB2YXIgc3Vic2NyaXB0aW9uRW5kRGF0ZSA9IG1vbWVudC51bml4KGV2ZW50LmRhdGEub2JqZWN0LmN1cnJlbnRfcGVyaW9kX2VuZCkuZm9ybWF0KCdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycpO1xuICAgXG4gICAgd2luc3Rvbi5pbmZvKCcgISEhISEhISEgSEkgISEhISEhISEhISEgY3VzdG9tZXIuc3Vic2NyaXB0aW9uLnVwZGF0ZWQgIHN1YnNjcmlwdGlvbl9pZCcsIHN1YnNjcmlwdGlvbl9pZCk7XG4gICAgaWYgKGV2ZW50LmRhdGEucHJldmlvdXNfYXR0cmlidXRlcyAmJiBldmVudC5kYXRhLnByZXZpb3VzX2F0dHJpYnV0ZXMucXVhbnRpdHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgXG4gICAgICB2YXIgc3Vic2NyaXB0aW9uX3ByZXZpb3VzX3F0eSA9IGV2ZW50LmRhdGEucHJldmlvdXNfYXR0cmlidXRlcy5xdWFudGl0eTtcbiAgICAgIHdpbnN0b24uaW5mbygnICEhISEhISEhIEhJICEhISEhISEhISEhIGN1c3RvbWVyLnN1YnNjcmlwdGlvbi51cGRhdGVkICBzdWJzY3JpcHRpb25fcHJldmlvdXNfcXR5Jywgc3Vic2NyaXB0aW9uX3ByZXZpb3VzX3F0eSk7XG4gICAgICBpZiAoc3Vic2NyaXB0aW9uX25ld19xdHkgIT09IHN1YnNjcmlwdGlvbl9wcmV2aW91c19xdHkpIHtcblxuICAgICAgICBnZXRTdWJzY3JwUGF5bWVudEJ5U3Vic2NycElkQW5kU3RyaXBlRXZlbnQoc3Vic2NyaXB0aW9uX2lkKS50aGVuKGZ1bmN0aW9uIChzdWJzcHRuX3BheW1lbnQpIHtcbiAgICAgICAgICB3aW5zdG9uLmluZm8oJyoqKiAqKiogZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50IHN1YnNwdG5fcGF5bWVudDogJywgc3Vic3B0bl9wYXltZW50KTtcblxuICAgICAgICAgIHZhciBwcm9qZWN0SWQgPSBzdWJzcHRuX3BheW1lbnRbMF0ucHJvamVjdF9pZFxuICAgICAgICAgIHZhciB1c2VySWQgPSBzdWJzcHRuX3BheW1lbnRbMF0udXNlcl9pZFxuICAgICAgICAgIHZhciBwbGFuX25hbWUgPSBzdWJzcHRuX3BheW1lbnRbMF0ucGxhbl9uYW1lXG5cbiAgICAgICAgICB3aW5zdG9uLmluZm8oJyoqKiAqKiogZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50IC0gcHJvamVjdElkOiAgJywgcHJvamVjdElkKTtcbiAgICAgICAgICB3aW5zdG9uLmluZm8oJyoqKiAqKiogZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50IC0gdXNlcklkOiAnLCB1c2VySWQpO1xuICAgICAgICAgIHdpbnN0b24uaW5mbygnKioqICoqKiBjdXN0b21lci5zdWJzY3JpcHRpb24udXBkYXRlZCBnZXRTdWJzY3JwUGF5bWVudEJ5U3Vic2NycElkQW5kU3RyaXBlRXZlbnQgLSB1c2VySWQ6ICcsIHVzZXJJZCk7XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgKiEgKioqIEJPRFkgKioqXG4gICAgICAgICAgICovXG4gICAgICAgICAgaWYgKHByb2plY3RJZCkge1xuICAgICAgICAgICAgdmFyIGJvZHkgPSB7XG4gICAgICAgICAgICAgIHByb2ZpbGU6XG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiBwbGFuX25hbWUsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3BheW1lbnQnLFxuICAgICAgICAgICAgICAgIHN1YlN0YXJ0OiBzdWJzY3JpcHRpb25TdGFydERhdGUsXG4gICAgICAgICAgICAgICAgc3ViRW5kOiBzdWJzY3JpcHRpb25FbmREYXRlLFxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbklkOiBzdWJzY3JpcHRpb25faWQsXG4gICAgICAgICAgICAgICAgbGFzdF9zdHJpcGVfZXZlbnQ6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgICAgICAgYWdlbnRzOiBzdWJzY3JpcHRpb25fbmV3X3F0eVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvKiogMkIgKi9cbiAgICAgICAgICAgIHVwZGF0ZVByb2plY3RQcm9maWxlKHByb2plY3RJZCwgYm9keSk7XG4gICAgICAgICAgICAvKiogMkMgKi9cbiAgICAgICAgICAgIHNhdmVPbkRCKHN1YnNjcmlwdGlvbl9pZCwgcHJvamVjdElkLCBldmVudCwgdXNlcklkLCBldmVudC50eXBlLCBwbGFuX25hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICAgIHdpbnN0b24uZXJyb3IoJyoqKiAqKiogZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50IC0gZXJyICcsIGVycik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqKiEgKioqIEhBTkRMRSBUSEUgRVZFTlQgY3VzdG9tZXIuc3Vic2NyaXB0aW9uLmRlbGV0ZWQgKioqXG4gICAqIHRoaXMgZXZlbnQgb2NjdXJzIHdoZW4gYSBzdWJzY3JpcHRpb24gaXMgY2FuY2VsbGVkXG4gICAqIC0gZnJvbSB0aGUgVElMRURFU0snIGRhc2hib2FyZCAoYnkgY2xpY2tpbmcgQ0FOQ0VMIFNVQlNDUklQVElPTiB0aGF0IGNhbGwgY2FuY2Vsc3Vic2NyaXB0aW9uKCkgLSBzZWUgYmVsb3cpXG4gICAqIC0gZnJvbSB0aGUgU1RSSVBFJyBkYXNoYm9hcmRcbiAgICovXG4gIGlmIChldmVudC50eXBlID09PSAnY3VzdG9tZXIuc3Vic2NyaXB0aW9uLmRlbGV0ZWQnKSB7XG4gICAgd2luc3Rvbi5pbmZvKCcgISEhISEhISEgSEkgISEhISEhISEhISEgY3VzdG9tZXIuc3Vic2NyaXB0aW9uLmRlbGV0ZWQnKTtcbiAgICB3aW5zdG9uLmluZm8oJ2N1c3RvbWVyLnN1YnNjcmlwdGlvbi5kZWxldGVkIGV2ZW50ICcsIGV2ZW50KTtcbiAgICB2YXIgc3Vic2NyaXB0aW9uSWQgPSBldmVudC5kYXRhLm9iamVjdC5pZFxuICAgIHdpbnN0b24uaW5mbygnKioqICoqKiBzdWJzY3JpcHRpb24gSUQgJywgc3Vic2NyaXB0aW9uSWQpO1xuXG4gICAgZ2V0U3Vic2NycFBheW1lbnRCeVN1YnNjcnBJZEFuZFN0cmlwZUV2ZW50KHN1YnNjcmlwdGlvbklkKS50aGVuKGZ1bmN0aW9uIChzdWJzY3JpcHRpb25QYXltZW50KSB7XG4gICAgICAvLyBTdWJzY3JpcHRpb25QYXltZW50LmZpbmQoeyBzdWJzY3JpcHRpb25faWQ6IHN1YnNjcmlwdGlvbklkLCBvYmplY3RfdHlwZTogXCJzdWJzY3JpcHRpb25cIiB9LCBmdW5jdGlvbiAoZXJyLCBzdWJzY3JpcHRpb25QYXltZW50KSB7XG5cbiAgICAgIC8vIGlmIChlcnIpIHtcbiAgICAgIC8vICAgd2luc3Rvbi5pbmZvKCdFcnJvciBnZXR0aW5nIHRoZSBzdWJzY3JpcHRpb25QYXltZW50ICcsIGVycik7XG4gICAgICAvLyAgIHJldHVybiBlcnI7XG4gICAgICAvLyB9XG4gICAgICB3aW5zdG9uLmluZm8oJyoqKiAqKiogwrvCu8K7IMK7wrvCuyBjdXN0b21lci5zdWJzY3JpcHRpb24uZGVsZXRlZCBzdWJzY3JpcHRpb25QYXltZW50ICcsIHN1YnNjcmlwdGlvblBheW1lbnQpO1xuXG4gICAgICB2YXIgcHJvamVjdElkID0gc3Vic2NyaXB0aW9uUGF5bWVudFswXS5wcm9qZWN0X2lkO1xuICAgICAgdmFyIHVzZXJJZCA9IHN1YnNjcmlwdGlvblBheW1lbnRbMF0udXNlcl9pZDtcbiAgICAgIC8vIHZhciBzdWJzY3JpcHRpb25fc3RhdHVzID0gZXZlbnQuZGF0YS5vYmplY3Quc3RhdHVzO1xuICAgICAgd2luc3Rvbi5pbmZvKCdjdXN0b21lci5zdWJzY3JpcHRpb24uZGVsZXRlZCBzdWJzY3JpcHRpb25QYXltZW50IHByb2plY3QgaWQ6ICcsIHByb2plY3RJZClcbiAgICAgIHdpbnN0b24uaW5mbygnY3VzdG9tZXIuc3Vic2NyaXB0aW9uLmRlbGV0ZWQgc3Vic2NyaXB0aW9uUGF5bWVudCB1c2VyIGlkOiAnLCB1c2VySWQpXG4gICAgICBjb25zdCBwbGFuX25hbWUgPSAnZnJlZSdcblxuICAgICAgLyoqXG4gICAgICAgKiEgKioqIEJPRFkgKioqXG4gICAgICAgKi9cbiAgICAgIHZhciBib2R5ID0ge1xuICAgICAgICBwcm9maWxlOiB7XG4gICAgICAgICAgc3Vic2NyaXB0aW9uSWQ6IHN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgIG5hbWU6ICdmcmVlJyxcbiAgICAgICAgICB0eXBlOiAnZnJlZScsXG4gICAgICAgICAgYWdlbnRzOiAzLFxuICAgICAgICAgIGxhc3Rfc3RyaXBlX2V2ZW50OiBldmVudC50eXBlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHVwZGF0ZVByb2plY3RQcm9maWxlKHByb2plY3RJZCwgYm9keSk7XG5cbiAgICAgIHNhdmVPbkRCKHN1YnNjcmlwdGlvbklkLCBwcm9qZWN0SWQsIGV2ZW50LmRhdGEub2JqZWN0LCB1c2VySWQsIGV2ZW50LnR5cGUsIHBsYW5fbmFtZSk7XG5cbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7XG4gICAgICB3aW5zdG9uLmVycm9yKCcqKiogKioqIGN1c3RvbWVyLnN1YnNjcmlwdGlvbi5kZWxldGVkICcsIGVycik7XG4gICAgfSk7XG5cbiAgfVxuICAvLyBSZXR1cm4gYSByZXNwb25zZSB0byBhY2tub3dsZWRnZSByZWNlaXB0IG9mIHRoZSBldmVudFxuICByZXNwb25zZS5qc29uKHsgcmVjZWl2ZWQ6IHRydWUgfSk7XG59KTtcblxuXG5mdW5jdGlvbiBnZXRTdWJzY3JwUGF5bWVudEJ5U3Vic2NycElkQW5kU3RyaXBlRXZlbnQoc3Vic2NyaXB0aW9uaWQpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBTdWJzY3JpcHRpb25QYXltZW50LmZpbmQoeyBzdWJzY3JpcHRpb25faWQ6IHN1YnNjcmlwdGlvbmlkLCBzdHJpcGVfZXZlbnQ6IFwiY2hlY2tvdXQuc2Vzc2lvbi5jb21wbGV0ZWRcIiB9LCBmdW5jdGlvbiAoZXJyLCBzdWJzY3JpcHRpb25QYXltZW50KSB7XG4gICAgICBpZiAoZXJyKSByZWplY3QoZXJyKTtcblxuICAgICAgdmFyIHN1YnNjcmlwdGlvbl9wYXltZW50ID0gc3Vic2NyaXB0aW9uUGF5bWVudDtcbiAgICAgIHJlc29sdmUoc3Vic2NyaXB0aW9uX3BheW1lbnQpO1xuICAgIH0pO1xuICB9KVxufTtcblxuZnVuY3Rpb24gZ2V0U3Vic2NyaXRpb25CeUlkKHN1YnNjcmlwdGlvbmlkKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgY29uc3QgX3N0cmlwZSA9IHJlcXVpcmUoXCJzdHJpcGVcIikoYXBpU2VjcmV0S2V5KTtcbiAgICBfc3RyaXBlLnN1YnNjcmlwdGlvbnMucmV0cmlldmUoc3Vic2NyaXB0aW9uaWQsIGZ1bmN0aW9uIChlcnIsIHN1YnNjcmlwdGlvbikge1xuICAgICAgaWYgKGVycikgcmVqZWN0KGVycik7XG5cbiAgICAgIHZhciBzdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247XG4gICAgICByZXNvbHZlKHN1YnNjcmlwdGlvbik7XG4gICAgfSk7XG4gIH0pXG59O1xuXG5mdW5jdGlvbiB1cGRhdGVQcm9qZWN0UHJvZmlsZShwcm9qZWN0X2lkLCBib2R5KSB7XG4gIFByb2plY3QuZmluZEJ5SWRBbmRVcGRhdGUocHJvamVjdF9pZCwgYm9keSwgeyBuZXc6IHRydWUsIHVwc2VydDogdHJ1ZSB9LCBmdW5jdGlvbiAoZXJyLCB1cGRhdGVkUHJvamVjdCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHdpbnN0b24uZXJyb3IoJ3VwZGF0ZVByb2plY3RQcm9maWxlIEVycm9yICcsIGVycik7XG4gICAgfVxuICAgIHdpbnN0b24uaW5mbygnwrvCu8K7wrvCu8K7wrvCu8K7IHVwZGF0ZVByb2plY3RQcm9maWxlIHVwZGF0ZWRQcm9qZWN0ICcsIHVwZGF0ZWRQcm9qZWN0KTtcbiAgICAvLyByZXMuanNvbih1cGRhdGVkUHJvamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzYXZlT25EQihzdWJzY3JpcHRpb25pZCwgcHJvamVjdGlkLCBvYmosIHVzZXJpZCwgc3RyaXBlX2V2ZW50LCBwbGFuX25hbWUpIHtcbiAgICB3aW5zdG9uLmluZm8oJ3BsYW5fbmFtZSAnLCBwbGFuX25hbWUgKSBcblxuICAvLyBTdWJzY3JpcHRpb25QYXltZW50LmZpbmQoeyBcIm9iamVjdC5kYXRhLm9iamVjdC5pZFwiOiBvYmoub2JqZWN0LmRhdGEub2JqZWN0LmlkIH0sIChmdW5jdGlvbiAoZXJyLCBzdWJzY3JpcHRpb25QYXltZW50cykge1xuICAgXG4gIC8vICAgICBpZiAoZXJyKSB7XG4gIC8vICAgICAgIHdpbnN0b24uaW5mbygnLS0gPiBzYXZlT25EQiBHRVQgU1VCU0NSSVBUSU9OIFBBWU1FTlRTIEVSUk9SICcsIHByb2plY3QpO1xuICAvLyAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLnNlbmQoeyBzdWNjZXNzOiBmYWxzZSwgbXNnOiBlcnIgfSlcbiAgLy8gICAgIH1cbiAgLy8gICAgIHdpbnN0b24uaW5mbygnLS0gPiBzYXZlT25EQiBGT0kgJywgcHJvamVjdCk7XG4gIC8vICAgICByZXMuanNvbihzdWJzY3JpcHRpb25QYXltZW50cyk7XG4gICAgXG4gIC8vICAgfSlcbiAgLy8gKVxuXG4gIHZhciBuZXdQYXltZW50U3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvblBheW1lbnQoe1xuICAgIF9pZDogbmV3IG1vbmdvb3NlLlR5cGVzLk9iamVjdElkKCksXG4gICAgc3Vic2NyaXB0aW9uX2lkOiBzdWJzY3JpcHRpb25pZCxcbiAgICBwcm9qZWN0X2lkOiBwcm9qZWN0aWQsXG4gICAgdXNlcl9pZDogdXNlcmlkLFxuICAgIHN0cmlwZV9ldmVudDogc3RyaXBlX2V2ZW50LFxuICAgIHBsYW5fbmFtZTogcGxhbl9uYW1lLFxuICAgIG9iamVjdDogb2JqXG4gIH0pO1xuXG4gIG5ld1BheW1lbnRTdWJzY3JpcHRpb24uc2F2ZShmdW5jdGlvbiAoZXJyLCBzYXZlZFN1YnNjcmlwdGlvblBheW1lbnQpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB3aW5zdG9uLmVycm9yKCctLS0gPiBFUlJPUiAnLCBlcnIpXG4gICAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLnNlbmQoeyBzdWNjZXNzOiBmYWxzZSwgbXNnOiAnRXJyb3Igc2F2aW5nIG9iamVjdC4nIH0pO1xuICAgIH1cbiAgICB3aW5zdG9uLmluZm8oJ3NhdmVkU3Vic2NyaXB0aW9uUGF5bWVudCAnLCBzYXZlZFN1YnNjcmlwdGlvblBheW1lbnQpO1xuICB9KTtcbn1cblxuXG5yb3V0ZXIucHV0KCcvY2FuY2Vsc3Vic2NyaXB0aW9uJywgW3Bhc3Nwb3J0LmF1dGhlbnRpY2F0ZShbJ2Jhc2ljJywgJ2p3dCddLCB7IHNlc3Npb246IGZhbHNlIH0pLCB2YWxpZHRva2VuXSwgZnVuY3Rpb24gKHJlcSwgcmVzKSB7XG4gIHZhciBwcm9qZWN0aWQgPSByZXEuYm9keS5wcm9qZWN0aWRcbiAgdmFyIHVzZXJpZCA9IHJlcS5ib2R5LnVzZXJpZFxuICB3aW5zdG9uLmluZm8oJ8K7wrvCuyDCu8K7wrsgY2FuY2Vsc3Vic2NyaXB0aW9uIHByb2plY3RpZCcsIHByb2plY3RpZCk7XG4gIHdpbnN0b24uaW5mbygnwrvCu8K7IMK7wrvCuyBjYW5jZWxzdWJzY3JpcHRpb24gdXNlcmlkJywgdXNlcmlkKTtcblxuICBQcm9qZWN0LmZpbmRPbmUoeyBfaWQ6IHByb2plY3RpZCB9LCBmdW5jdGlvbiAoZXJyLCBwcm9qZWN0KSB7XG4gICAgaWYgKGVycikge1xuICAgICAgd2luc3Rvbi5lcnJvcignLS0gPiBjYW5jZWxzdWJzY3JpcHRpb24gRXJyb3IgZ2V0dGluZyBwcm9qZWN0ICcsIGVycilcbiAgICAgIHJldHVybiAoZXJyKTtcbiAgICB9XG4gICAgaWYgKHByb2plY3QpIHtcbiAgICAgIHdpbnN0b24uaW5mbygnLS0gPiBjYW5jZWxzdWJzY3JpcHRpb24gIHByb2plY3QgJywgcHJvamVjdCk7XG5cbiAgICAgIHZhciBzdWJzY3JpcHRpb25pZCA9IHByb2plY3QucHJvZmlsZS5zdWJzY3JpcHRpb25JZDtcblxuICAgICAgY29uc3Qgc3RyaXBlID0gcmVxdWlyZShcInN0cmlwZVwiKShhcGlTZWNyZXRLZXkpO1xuXG4gICAgICBzdHJpcGUuc3Vic2NyaXB0aW9ucy5kZWwoc3Vic2NyaXB0aW9uaWQsIGZ1bmN0aW9uIChlcnIsIGNvbmZpcm1hdGlvbikge1xuICAgICAgICAvLyBhc3luY2hyb25vdXNseSBjYWxsZWRcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHdpbnN0b24uZXJyb3IoJy0tID4gY2FuY2Vsc3Vic2NyaXB0aW9uICBlcnIgJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLnNlbmQoeyBzdWNjZXNzOiBmYWxzZSwgbXNnOiBlcnIgfSlcbiAgICAgICAgfVxuICAgICAgICB3aW5zdG9uLmluZm8oJy0tID4gY2FuY2Vsc3Vic2NyaXB0aW9uIGNvbmZpcm1hdGlvbiAnLCBjb25maXJtYXRpb24pXG4gICAgICAgIHJlcy5qc29uKGNvbmZpcm1hdGlvbik7XG4gICAgICAgIC8vIHZhciBib2R5ID0geyBwcm9maWxlOiB7IHN1YnNjcmlwdGlvbklkOiAnY2FuY2VsbGVkJyB9IH1cbiAgICAgICAgLy8gdXBkYXRlUHJvamVjdFByb2ZpbGUocHJvamVjdGlkLCBib2R5KTtcblxuICAgICAgICAvLyBTQVZFIElOIFRIRSBEQiA+IENvbGxlY3Rpb246IHN1YnNjcmlwdGlvbi1wYXltZW50cyBcbiAgICAgICAgLy8gc2F2ZVN1YnNjcmlwdGlvbignY2FuY2VsbGVkJywgcHJvamVjdGlkLCBjb25maXJtYXRpb24sIHVzZXJpZCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0pXG59KTtcblxucm91dGVyLnB1dCgnL3VwZGF0ZXN1YnNjcmlwdGlvbicsIFtwYXNzcG9ydC5hdXRoZW50aWNhdGUoWydiYXNpYycsICdqd3QnXSwgeyBzZXNzaW9uOiBmYWxzZSB9KSwgdmFsaWR0b2tlbl0sIGZ1bmN0aW9uIChyZXEsIHJlcykge1xuXG4gIHZhciBwcm9qZWN0aWQgPSByZXEuYm9keS5wcm9qZWN0aWRcbiAgdmFyIHVzZXJpZCA9IHJlcS5ib2R5LnVzZXJpZFxuICB3aW5zdG9uLmluZm8oJ8K7wrvCuyDCu8K7wrsgdXBkYXRlc3Vic2NyaXB0aW9uIHByb2plY3RpZCcsIHByb2plY3RpZCk7XG4gIHdpbnN0b24uaW5mbygnwrvCu8K7IMK7wrvCuyB1cGRhdGVzdWJzY3JpcHRpb24gdXNlcmlkJywgdXNlcmlkKTtcbiAgXG4gIGNvbnN0IHN0cmlwZSA9IHJlcXVpcmUoXCJzdHJpcGVcIikoYXBpU2VjcmV0S2V5KTtcbiAgXG4gIFByb2plY3QuZmluZE9uZSh7IF9pZDogcHJvamVjdGlkIH0sIGZ1bmN0aW9uIChlcnIsIHByb2plY3QpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB3aW5zdG9uLmVycm9yKCctLSA+IHVwZGF0ZXN1YnNjcmlwdGlvbiBFcnJvciBnZXR0aW5nIHByb2plY3QgJywgZXJyKVxuICAgICAgcmV0dXJuIChlcnIpO1xuICAgIH1cbiAgICBpZiAocHJvamVjdCkge1xuICAgICAgd2luc3Rvbi5pbmZvKCctLSA+IHVwZGF0ZXN1YnNjcmlwdGlvbiAgcHJvamVjdCAnLCBwcm9qZWN0KTtcblxuICAgICAgdmFyIHN1YnNjcmlwdGlvbmlkID0gcHJvamVjdC5wcm9maWxlLnN1YnNjcmlwdGlvbklkO1xuXG5cbiAgICAgIC8vIHN1YnNjcmlwdGlvbmlkXG4gICAgICBzdHJpcGUuc3Vic2NyaXB0aW9ucy51cGRhdGUoXG4gICAgICAgIHN1YnNjcmlwdGlvbmlkLFxuICAgICAgICAvLyB7IHRyaWFsX2VuZDogMTU2ODIxMDY1NSB9LFxuICAgICAgICAvLyBmdW5jdGlvbiAoZXJyLCBzdWJzY3JpcHRpb24pIHtcbiAgICAgICAgLy8gICAvLyBhc3luY2hyb25vdXNseSBjYWxsZWRcbiAgICAgICAgLy8gICBpZiAoZXJyKSB7XG4gICAgICAgIC8vICAgICB3aW5zdG9uLmVycm9yKCd1cGRhdGVzdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uIGVyciAnLCBlcnIpXG4gICAgICAgIC8vICAgICByZXR1cm5cbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vICAgd2luc3Rvbi5pbmZvKCd1cGRhdGVzdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uICcsIHN1YnNjcmlwdGlvbilcbiAgICAgICAgLy8gfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzdHJpcGUuc3Vic2NyaXB0aW9ucy5yZXRyaWV2ZShzdWJzY3JpcHRpb25pZCwgZnVuY3Rpb24gKGVyciwgc3Vic2NyaXB0aW9uKSB7XG4gICAgLy8gICAvLyBhc3luY2hyb25vdXNseSBjYWxsZWRcbiAgICAvLyAgIGlmIChlcnIpIHtcbiAgICAvLyAgICAgd2luc3Rvbi5pbmZvKCdyZXRyaWV2ZSB1cGRhdGVkIHN1YnNjcmlwdGlvbiBlcnIgJywgZXJyKVxuICAgIC8vICAgfSBlbHNlIHtcbiAgICAvLyAgICAgd2luc3Rvbi5pbmZvKCfCu8K7wrvCu8K7wrvCu8K7wrsgZ3JldHJpZXZlIHVwZGF0ZWQgc3Vic2NyaXB0aW9uOiAnLCBzdWJzY3JpcHRpb24pO1xuXG4gICAgLy8gICB9XG4gICAgLy8gfSlcbiAgfSlcblxufSlcbiAgIFxucm91dGVyLmdldCgnLzpzdWJzY3JpcHRpb25pZCcsIFtwYXNzcG9ydC5hdXRoZW50aWNhdGUoWydiYXNpYycsICdqd3QnXSwgeyBzZXNzaW9uOiBmYWxzZSB9KSwgdmFsaWR0b2tlbl0sIGZ1bmN0aW9uIChyZXEsIHJlcykge1xuXG4gIC8vIFN1YnNjcmlwdGlvblBheW1lbnQuZmluZCh7IHN1YnNjcmlwdGlvbl9pZDogcmVxLnBhcmFtcy5zdWJzY3JpcHRpb25pZCB9LCAoZnVuY3Rpb24gKGVyciwgc3Vic2NyaXB0aW9uUGF5bWVudHMpIHtcbiAgICAgICAgICAgIFxuICBTdWJzY3JpcHRpb25QYXltZW50LmZpbmQoeyBzdWJzY3JpcHRpb25faWQ6IHJlcS5wYXJhbXMuc3Vic2NyaXB0aW9uaWQgfSkuc29ydCh7J29iamVjdC5jcmVhdGVkJzogXCJhc2NcIn0pLmV4ZWMoZnVuY3Rpb24gKGVyciwgc3Vic2NyaXB0aW9uUGF5bWVudHMpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICB3aW5zdG9uLmVycm9yKCctLSA+IEdFVCBTVUJTQ1JJUFRJT04gUEFZTUVOVFMgRVJST1J0ICcsIHByb2plY3QpO1xuICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAwKS5zZW5kKHsgc3VjY2VzczogZmFsc2UsIG1zZzogZXJyIH0pXG4gICAgfVxuICAgIHJlcy5qc29uKHN1YnNjcmlwdGlvblBheW1lbnRzKTtcbiAgXG4gIH0pO1xufSk7XG5cblxuXG4vLyAhISEgbm90IHVzZWQgIC0gUkVUUklFVkUgVEhFIENVUlJFTlQgU1VCU0NSSVBUSU9OIEZST00gU1RSSVBFXG5yb3V0ZXIuZ2V0KCcvc3RyaXBlc3Vicy86c3Vic2NyaXB0aW9uaWQnLCBbcGFzc3BvcnQuYXV0aGVudGljYXRlKFsnYmFzaWMnLCAnand0J10sIHsgc2Vzc2lvbjogZmFsc2UgfSksIHZhbGlkdG9rZW5dLCBmdW5jdGlvbiAocmVxLCByZXMpIHtcbiAgXG4gIHdpbnN0b24uaW5mbygnLS0gPiBzdWJzY3JpcHRpb24gZ2V0IGJ5IGlkIGZyZXEucGFyYW1zLnN1YnNjcmlwdGlvbmlkICcsIHJlcS5wYXJhbXMuc3Vic2NyaXB0aW9uaWQpO1xuICB2YXIgc3RyaXBlID0gcmVxdWlyZSgnc3RyaXBlJykoYXBpU2VjcmV0S2V5KTtcblxuICBzdHJpcGUuc3Vic2NyaXB0aW9ucy5yZXRyaWV2ZShcbiAgICByZXEucGFyYW1zLnN1YnNjcmlwdGlvbmlkLFxuICAgIGZ1bmN0aW9uKGVyciwgc3Vic2NyaXB0aW9uKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHdpbnN0b24uZXJyb3IoJy0tID4gc3Vic2NyaXB0aW9uIGdldCBieSBpZCBmcm9tIHN0cmlwZSAgZXJyICcsIGVycik7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDUwMCkuc2VuZCh7IHN1Y2Nlc3M6IGZhbHNlLCBtc2c6IGVyciB9KVxuICAgICAgfVxuICAgICAgd2luc3Rvbi5pbmZvKCctLSA+IHN1YnNjcmlwdGlvbiBnZXQgYnkgaWQgZnJvbSBzdHJpcGUgJywgc3Vic2NyaXB0aW9uKVxuICAgICAgcmVzLmpzb24oc3Vic2NyaXB0aW9uKTtcbiAgICB9XG4gICk7XG59KTtcblxuXG5cblxuLy9uZXcgY29kZVxucm91dGVyLmdldCgnL2N1c3RvbWVyLzpwcm9qZWN0aWQnLCBbcGFzc3BvcnQuYXV0aGVudGljYXRlKFsnYmFzaWMnLCAnand0J10sIHsgc2Vzc2lvbjogZmFsc2UgfSksIHZhbGlkdG9rZW5dLCBmdW5jdGlvbiAocmVxLCByZXMpIHtcbiAgd2luc3Rvbi5kZWJ1ZygnwrvCu8K7IMK7wrvCuyBnZXQgY3VzdG9tZXIgZnJvbSBkYiAnLCByZXEucGFyYW1zKVxuICB2YXIgcHJvamVjdGlkID0gcmVxLnBhcmFtcy5wcm9qZWN0aWRcblxuICB3aW5zdG9uLmRlYnVnKCfCu8K7wrsgwrvCu8K7IGdldCBjdXN0b21lciBmcm9tIGRiIC0gcHJvamVjdGlkJywgcHJvamVjdGlkKTtcblxuICBTdWJzY3JpcHRpb25QYXltZW50LmZpbmQoeyBwcm9qZWN0X2lkOiBwcm9qZWN0aWQsIHN0cmlwZV9ldmVudDogXCJjaGVja291dC5zZXNzaW9uLmNvbXBsZXRlZFwiIH0sIGFzeW5jIGZ1bmN0aW9uIChlcnIsIHN1YnNjcmlwdGlvbikge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHdpbnN0b24uZGVidWcoJy0tID4gZ2V0IGN1c3RvbWVyIGZyb20gZGIgLSBFcnJvciAnLCBlcnIpXG4gICAgICByZXR1cm4gKGVycik7XG4gICAgfVxuICAgIGlmIChzdWJzY3JpcHRpb24pIHtcbiAgICAgIFxuICAgICAgc3Vic2NyaXB0aW9uWzBdLm9iamVjdC5jdXN0b21lclxuICAgICAgd2luc3Rvbi5kZWJ1ZygnLS0gPiBnZXQgY3VzdG9tZXIgZnJvbSBkYiAtIHN1YnNjcmlwdGlvbiA+IGN1c3RvbWVyIGlkICcsIHN1YnNjcmlwdGlvblswXS5vYmplY3QuY3VzdG9tZXIpO1xuICAgICAgY29uc3QgY3VzdG9tZXJpZCA9IHN1YnNjcmlwdGlvblswXS5vYmplY3QuY3VzdG9tZXJcbiAgICAgIGNvbnN0IHN0cmlwZSA9IHJlcXVpcmUoXCJzdHJpcGVcIikoYXBpU2VjcmV0S2V5KTtcblxuICAgICAgY29uc3QgY3VzdG9tZXIgPSBhd2FpdCBzdHJpcGUuY3VzdG9tZXJzLnJldHJpZXZlKFxuICAgICAgICBjdXN0b21lcmlkXG4gICAgICApO1xuICAgICAgd2luc3Rvbi5kZWJ1ZygnLS0gPiBnZXQgY3VzdG9tZXIgZnJvbSBkYiA+IGN1c3RvbWVyIGZyb20gc3RyaXBlIEFQSSAnLCBjdXN0b21lcilcblxuICAgICAgY29uc3QgcGF5bWVudE1ldGhvZHMgPSBhd2FpdCBzdHJpcGUucGF5bWVudE1ldGhvZHMubGlzdCh7XG4gICAgICAgIGN1c3RvbWVyOiBjdXN0b21lcmlkLFxuICAgICAgICB0eXBlOiAnY2FyZCcsXG4gICAgICB9KTtcbiAgICAgIGN1c3RvbWVyWydwYXltZW50TWV0aG9kcyddID0gcGF5bWVudE1ldGhvZHM7XG4gICAgICB3aW5zdG9uLmRlYnVnKCctLSA+IGdldCBjdXN0b21lciBmcm9tIGRiID4gY3VzdG9tZXIgKyBwYXltZW50TWV0aG9kcyAnLCBzdWJzY3JpcHRpb24pXG4gICAgICByZXMuanNvbihjdXN0b21lcilcbiAgICB9XG4gIH0pXG59KTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVXBkYXRlZCBjdXN0b21lclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxucm91dGVyLnBvc3QoJy9jdXN0b21lcnMvOmN1c3RvbWVyaWQnLFtwYXNzcG9ydC5hdXRoZW50aWNhdGUoWydiYXNpYycsICdqd3QnXSwgeyBzZXNzaW9uOiBmYWxzZSB9KSwgdmFsaWR0b2tlbl0sIGFzeW5jIGZ1bmN0aW9uIChyZXEsIHJlcykge1xuICB2YXIgY3VzdG9tZXJpZCA9IHJlcS5wYXJhbXMuY3VzdG9tZXJpZDtcbiAgd2luc3Rvbi5kZWJ1ZygnwrvCu8K7IMK7wrvCuyAgdXBkYXRlIGN1c3RvbWVyIC0gY3VzdG9tZXJpZCBmcm9tIHBhcmFtcyAnLCBjdXN0b21lcmlkKTtcbiAgd2luc3Rvbi5kZWJ1ZygnwrvCu8K7IMK7wrvCuyAgdXBkYXRlIGN1c3RvbWVyIC0gY2MgZnJvbSBib2R5ICcsIHJlcS5ib2R5KTtcblxuICBjb25zdCBzdHJpcGUgPSByZXF1aXJlKFwic3RyaXBlXCIpKGFwaVNlY3JldEtleSk7XG5cbiAgbGV0IHBheW1lbnRNZXRob2Q7XG4gIHRyeSB7XG4gICAgcGF5bWVudE1ldGhvZCA9IGF3YWl0IHN0cmlwZS5wYXltZW50TWV0aG9kcy5jcmVhdGUoe1xuICAgICAgdHlwZTogJ2NhcmQnLFxuICAgICAgY2FyZDoge1xuICAgICAgICBudW1iZXI6IHJlcS5ib2R5LmNyZWRpdF9jYXJkX251bSxcbiAgICAgICAgZXhwX21vbnRoOiByZXEuYm9keS5leHBpcmF0aW9uX2RhdGVfbW9udGgsXG4gICAgICAgIGV4cF95ZWFyOiByZXEuYm9keS5leHBpcmF0aW9uX2RhdGVfeWVhcixcbiAgICAgICAgY3ZjOiByZXEuYm9keS5jcmVkaXRfY2FyZF9jdmMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgd2luc3Rvbi5lcnJvcignwrvCu8K7IMK7wrvCuyAgcGF5bWVudE1ldGhvZCBjcmVhdGUgIGVycm9yICcsIGUpXG4gICAgcmV0dXJuIHJlcy5zdGF0dXMoNTAyKS5zZW5kKHsgc3VjY2VzczogZmFsc2UsIG1zZzogZSB9KVxuXG4gIH1cbiAgd2luc3Rvbi5kZWJ1ZygnwrvCu8K7IMK7wrvCuyAgcGF5bWVudE1ldGhvZCcsIHBheW1lbnRNZXRob2QpXG5cbiAgdHJ5IHtcbiAgICBjb25zdCBfcGF5bWVudE1ldGhvZCA9IGF3YWl0IHN0cmlwZS5wYXltZW50TWV0aG9kcy5hdHRhY2goXG4gICAgICBwYXltZW50TWV0aG9kLmlkLFxuICAgICAgeyBjdXN0b21lcjogY3VzdG9tZXJpZCB9XG4gICAgKTtcblxuICAgIHdpbnN0b24uZGVidWcoJ8K7wrvCuyDCu8K7wrsgIHBheW1lbnRNZXRob2QgYXR0YWNoZWQgJywgX3BheW1lbnRNZXRob2QpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB3aW5zdG9uLmVycm9yKCfCu8K7wrsgwrvCu8K7ICBwYXltZW50TWV0aG9kIGF0dGFjaGVkICBlcnJvciAnLCBlKVxuICAgIHJldHVybiByZXMuc3RhdHVzKDUwMSkuc2VuZCh7IHN1Y2Nlc3M6IGZhbHNlLCBtc2c6IGUgfSlcbiAgfVxuXG4gIGNvbnN0IF9jdXN0b21lciA9IGF3YWl0IHN0cmlwZS5jdXN0b21lcnMudXBkYXRlKFxuICAgIGN1c3RvbWVyaWQsXG4gICAge1xuICAgICAgaW52b2ljZV9zZXR0aW5nczogeyBkZWZhdWx0X3BheW1lbnRfbWV0aG9kOiBwYXltZW50TWV0aG9kLmlkIH1cbiAgICB9KTtcbiAgcmVzLmpzb24oX2N1c3RvbWVyKTtcbn0pO1xuXG5cbnJvdXRlci5nZXQoJy9wYXltZW50X21ldGhvZHMvOmN1c3RvbWVyaWQnICxbcGFzc3BvcnQuYXV0aGVudGljYXRlKFsnYmFzaWMnLCAnand0J10sIHsgc2Vzc2lvbjogZmFsc2UgfSksIHZhbGlkdG9rZW5dLCBhc3luYyBmdW5jdGlvbiAocmVxLCByZXMpIHtcbiAgY29uc29sZS5sb2coJ2dldCBQYXltZW50TWV0aG9kcyBsaXN0IHJlcS5wYXJhbXMnLCByZXEucGFyYW1zKVxuICB2YXIgY3VzdG9tZXJfaWQgPSByZXEucGFyYW1zLmN1c3RvbWVyaWQ7XG4gIHdpbnN0b24uZGVidWcoJ2dldCBQYXltZW50TWV0aG9kcyBsaXN0IHJlcS5wYXJhbXMgPiBjdXN0b21lcl9pZCAnLCBjdXN0b21lcl9pZClcbiAgY29uc3Qgc3RyaXBlID0gcmVxdWlyZShcInN0cmlwZVwiKShhcGlTZWNyZXRLZXkpO1xuXG4gIGNvbnN0IGN1c3RvbWVyID0gYXdhaXQgc3RyaXBlLmN1c3RvbWVycy5yZXRyaWV2ZShcbiAgICBjdXN0b21lcl9pZFxuICApO1xuXG4gIGNvbnN0IGRlZmF1bHRfcGF5bWVudF9tZXRob2RfaWQgPSBjdXN0b21lci5pbnZvaWNlX3NldHRpbmdzLmRlZmF1bHRfcGF5bWVudF9tZXRob2RcbiAgbGV0IHBheW1lbnRNZXRob2RzO1xuICB0cnkge1xuICAgIHBheW1lbnRNZXRob2RzID0gYXdhaXQgc3RyaXBlLnBheW1lbnRNZXRob2RzLmxpc3Qoe1xuICAgICAgY3VzdG9tZXI6IGN1c3RvbWVyX2lkLFxuICAgICAgdHlwZTogJ2NhcmQnLFxuICAgIH0pO1xuICAgIHdpbnN0b24uZGVidWcoJ2dldCBQYXltZW50TWV0aG9kcyBsaXN0ID4gcGF5bWVudE1ldGhvZHMgJywgcGF5bWVudE1ldGhvZHMpXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDEpLnNlbmQoeyBzdWNjZXNzOiBmYWxzZSwgbXNnOiBlIH0pXG4gIH1cblxuICB3aW5zdG9uLmRlYnVnKCdnZXQgUGF5bWVudE1ldGhvZHMgbGlzdCA+IHBheW1lbnRNZXRob2RzID4gZGVmYXVsdF9wYXltZW50X21ldGhvZF9pZCAnLCBkZWZhdWx0X3BheW1lbnRfbWV0aG9kX2lkKVxuICBwYXltZW50TWV0aG9kcy5kYXRhLmZvckVhY2gocGF5bWVudE1ldGhvZCA9PiB7XG4gICAgaWYgKHBheW1lbnRNZXRob2QuaWQgIT09IGRlZmF1bHRfcGF5bWVudF9tZXRob2RfaWQpIHtcbiAgICAgIHdpbnN0b24uZGVidWcoJ2dldCBQYXltZW50TWV0aG9kcyBsaXN0ID4gcGF5bWVudE1ldGhvZHMgPiBwYXltZW50TWV0aG9kcy5kYXRhICcsIHBheW1lbnRNZXRob2QuaWQpXG4gICAgICBkZXRhY2hQYXltZW50RnVuYyhwYXltZW50TWV0aG9kLmlkLCBmdW5jdGlvbiAocmVzdWx0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdkZXRhY2hQYXltZW50RnVuYyByZXN1bHQgJywgcmVzdWx0KVxuICAgICAgfSlcbiAgICB9XG4gIH0pO1xuICByZXMuanNvbihwYXltZW50TWV0aG9kcylcbn0pXG5cblxuXG5yb3V0ZXIuZ2V0KCcvY2hlY2tvdXRTZXNzaW9uLzpzZXNzaW9uaWQnLCBbcGFzc3BvcnQuYXV0aGVudGljYXRlKFsnYmFzaWMnLCAnand0J10sIHsgc2Vzc2lvbjogZmFsc2UgfSksIHZhbGlkdG9rZW5dLCBmdW5jdGlvbiAocmVxLCByZXMpIHtcblxuICBjb25zb2xlLmxvZygnLS0gPiBjaGVja291dFNlc3Npb24gcGFyYW1zLnNlc3Npb25pZCAnLCByZXEucGFyYW1zLnNlc3Npb25pZCk7XG4gIHZhciBzdHJpcGUgPSByZXF1aXJlKCdzdHJpcGUnKShhcGlTZWNyZXRLZXkpO1xuXG4gIHN0cmlwZS5jaGVja291dC5zZXNzaW9ucy5yZXRyaWV2ZShcbiAgICByZXEucGFyYW1zLnNlc3Npb25pZCxcbiAgICBmdW5jdGlvbiAoZXJyLCBzZXNzaW9uKSB7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCctLSA+IGNoZWNrb3V0U2Vzc2lvbiBnZXQgYnkgaWQgZnJvbSBzdHJpcGUgIGVyciAnLCBlcnIpO1xuICAgICAgICByZXR1cm4gcmVzLnN0YXR1cyg1MDApLnNlbmQoeyBzdWNjZXNzOiBmYWxzZSwgbXNnOiBlcnIgfSlcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUubG9nKCctLSA+IGNoZWNrb3V0U2Vzc2lvbiBnZXQgYnkgaWQgZnJvbSBzdHJpcGUgJywgc2Vzc2lvbilcbiAgICAgIHJlcy5qc29uKHNlc3Npb24pO1xuICAgIH1cbiAgKTtcbn0pO1xuXG5hc3luYyBmdW5jdGlvbiBkZXRhY2hQYXltZW50RnVuYyhwYXltZW50TWV0aG9kaWQsIGNhbGxiYWNrKSB7XG4gIHdpbnN0b24uZGVidWcoJ2RldGFjaFBheW1lbnRGdW5jdCA+IHBheW1lbnRNZXRob2RpZCAnLCBwYXltZW50TWV0aG9kaWQpXG4gIGNvbnN0IHN0cmlwZSA9IHJlcXVpcmUoXCJzdHJpcGVcIikoYXBpU2VjcmV0S2V5KTtcbiAgbGV0IHBheW1lbnRNZXRob2Q7XG4gIHRyeSB7XG4gICAgcGF5bWVudE1ldGhvZCA9IGF3YWl0IHN0cmlwZS5wYXltZW50TWV0aG9kcy5kZXRhY2goXG4gICAgICBwYXltZW50TWV0aG9kaWRcbiAgICApO1xuICAgIGNhbGxiYWNrKHBheW1lbnRNZXRob2QpIFxuICB9IGNhdGNoIChlKSB7XG4gICAgY2FsbGJhY2soZSkgXG4gIH1cbn1cblxuXG5cbi8vIGN1cmwgLVggUE9TVCAtdSBhbmRyZWEubGVvQGYyMS5pdDoxMjM0NTYgLUggJ0NvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uJyAtZCAne1widHlwZVwiOlwicGF5bWVudF9pbnRlbnQuc3VjY2VlZGVkXCJ9JyAgaHR0cDovL2xvY2FsaG9zdDozMDAwL21vZHVsZXMvcGF5bWVudHMvc3RyaXBlL3dlYmhvb2tcblxuLy8gcm91dGVyLnBvc3QoJy93ZWJob29rJywgZnVuY3Rpb24ocmVxdWVzdCwgcmVzcG9uc2UpIHtcbi8vICAgd2luc3Rvbi5pbmZvKCdzdHJpcGUgd2ViaG9vaycpO1xuXG4vLyAvLyBNYXRjaCB0aGUgcmF3IGJvZHkgdG8gY29udGVudCB0eXBlIGFwcGxpY2F0aW9uL2pzb25cbi8vIC8vIGFwcC5wb3N0KCcnLCBib2R5UGFyc2VyLnJhdyh7dHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nfSksIChyZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuLy8gICAgIGxldCBldmVudCA9IHJlcXVlc3QuYm9keTtcbi8vICAgICB3aW5zdG9uLmluZm8oJ2V2ZW50JyxldmVudCk7ICBcblxuLy8gICAgIC8vIEhhbmRsZSB0aGUgZXZlbnRcbi8vICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbi8vICAgICAgIGNhc2UgJ3BheW1lbnRfaW50ZW50LnN1Y2NlZWRlZCc6XG4vLyAgICAgICAgIGNvbnN0IHBheW1lbnRJbnRlbnQgPSBldmVudC5kYXRhLm9iamVjdDtcbi8vICAgICAgICAgaGFuZGxlUGF5bWVudEludGVudFN1Y2NlZWRlZChwYXltZW50SW50ZW50KTtcbi8vICAgICAgICAgYnJlYWs7XG4vLyAgICAgICBjYXNlICdwYXltZW50X21ldGhvZC5hdHRhY2hlZCc6XG4vLyAgICAgICAgIGNvbnN0IHBheW1lbnRNZXRob2QgPSBldmVudC5kYXRhLm9iamVjdDtcbi8vICAgICAgICAgaGFuZGxlUGF5bWVudE1ldGhvZEF0dGFjaGVkKHBheW1lbnRNZXRob2QpO1xuLy8gICAgICAgICBicmVhaztcbi8vICAgICAgIC8vIC4uLiBoYW5kbGUgb3RoZXIgZXZlbnQgdHlwZXNcbi8vICAgICAgIGRlZmF1bHQ6XG4vLyAgICAgICAgIC8vIFVuZXhwZWN0ZWQgZXZlbnQgdHlwZVxuLy8gICAgICAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzKDQwMCkuZW5kKCk7XG4vLyAgICAgfVxuXG4vLyAgICAgLy8gUmV0dXJuIGEgcmVzcG9uc2UgdG8gYWNrbm93bGVkZ2UgcmVjZWlwdCBvZiB0aGUgZXZlbnRcbi8vICAgICByZXNwb25zZS5qc29uKHtyZWNlaXZlZDogdHJ1ZX0pO1xuLy8gfSk7XG5cblxuXG5cbm1vZHVsZS5leHBvcnRzID0gcm91dGVyOyJdLCJmaWxlIjoicGF5bWVudHMvc3RyaXBlL2luZGV4LmpzIn0=
package/routes/faq.js CHANGED
@@ -6,8 +6,10 @@ var multer = require('multer')
6
6
  var upload = multer()
7
7
  const faqBotEvent = require('../event/faqBotEvent');
8
8
  var winston = require('../config/winston');
9
+ const faqEvent = require('../event/faqBotEvent')
9
10
 
10
11
  var parsecsv = require("fast-csv");
12
+ const botEvent = require('../event/botEvent');
11
13
  csv = require('csv-express');
12
14
  csv.separator = ';';
13
15
 
@@ -135,6 +137,10 @@ router.post('/', function (req, res) {
135
137
  newFaq.actions = req.body.actions
136
138
  }
137
139
 
140
+ if (req.body.attributes) {
141
+ newFaq.attributes = req.body.attributes
142
+ }
143
+
138
144
  newFaq.save(function (err, savedFaq) {
139
145
  if (err) {
140
146
  if (err.code == 11000) {
@@ -159,6 +165,56 @@ router.post('/', function (req, res) {
159
165
  });
160
166
  });
161
167
 
168
+ router.patch('/:faqid/attributes', function (req, res) {
169
+ let data = req.body;
170
+ console.log("data: ", data);
171
+
172
+ Faq.findById(req.params.faqid, function (err, updatedFaq) {
173
+ if (err) {
174
+ winston.error('Find Faq by id ERROR: ', err);
175
+ return res.status(500).send({ success: false, msg: 'Error updating object.' });
176
+ }
177
+
178
+ if (!updatedFaq) {
179
+ return res.status(404).send({ success: false, msg: 'Object not found.' });
180
+ }
181
+
182
+ if (!updatedFaq.attributes) {
183
+ console.log("empty attributes");
184
+ winston.debug("empty attributes");
185
+ updatedFaq.attributes = {};
186
+ }
187
+
188
+ winston.debug("updatedFaq attributes", updatedFaq.attributes);
189
+
190
+ Object.keys(data).forEach(function(key) {
191
+ var val = data[key];
192
+ winston.debug("data attributes" + key + " " + val);
193
+ updatedFaq.attributes[key] = val;
194
+ })
195
+
196
+ console.log("updatedFaq: ", updatedFaq);
197
+ console.log("updatedFaq attributes: ", updatedFaq.attributes);
198
+
199
+ winston.debug("updatedBot attributes", updatedFaq.attributes)
200
+
201
+ updatedFaq.markModified('attributes');
202
+
203
+ //cache invalidation
204
+ updatedFaq.save(function (err, savedFaq) {
205
+ if (err) {
206
+ winston.error("saving faq attributes ERROR: ", err);
207
+ return res.status(500).send({ success: false, msg: 'Error saving object.' });
208
+ }
209
+
210
+ console.log("saved faq attributes", savedFaq.toObject());
211
+
212
+ winston.verbose("saved faq attributes", savedFaq.toObject());
213
+ faqBotEvent.emit('faq.update', savedFaq);
214
+ res.json(savedFaq);
215
+ })
216
+ })
217
+ })
162
218
 
163
219
  router.put('/:faqid', function (req, res) {
164
220
 
@@ -202,6 +258,9 @@ router.put('/:faqid', function (req, res) {
202
258
  if (req.body.actions != undefined) {
203
259
  update.actions = req.body.actions;
204
260
  }
261
+ if (req.body.attributes != undefined) {
262
+ update.attributes = req.body.attributes;
263
+ }
205
264
 
206
265
  Faq.findByIdAndUpdate(req.params.faqid, update, { new: true, upsert: true }, function (err, updatedFaq) {
207
266
  if (err) {
package/routes/users.js CHANGED
@@ -7,23 +7,36 @@ var winston = require('../config/winston');
7
7
  const authEvent = require('../event/authEvent');
8
8
  const uuidv4 = require('uuid/v4');
9
9
 
10
-
11
-
12
-
13
-
14
10
  router.put('/', function (req, res) {
15
11
 
16
12
  winston.debug('UPDATE USER - REQ BODY ', req.body);
17
13
 
18
14
  var update = {};
19
-
20
- update.firstname = req.body.firstname;
21
- update.lastname = req.body.lastname;
22
- update.attributes = req.body.attributes;
23
- update.description = req.body.description;
24
-
25
-
26
15
 
16
+ // update.firstname = req.body.firstname;
17
+ // update.lastname = req.body.lastname;
18
+ // update.attributes = req.body.attributes;
19
+ // update.description = req.body.description;
20
+
21
+ if (req.body.firstname != undefined) {
22
+ update.firstname = req.body.firstname;
23
+ }
24
+ if (req.body.lastname != undefined) {
25
+ update.lastname = req.body.lastname;
26
+ }
27
+ if (req.body.attributes != undefined) {
28
+ update.attributes = req.body.attributes;
29
+ }
30
+ if (req.body.description != undefined) {
31
+ update.description = req.body.description;
32
+ }
33
+ if (req.body.public_email != undefined) {
34
+ update.public_email = req.body.public_email;
35
+ }
36
+ if (req.body.public_website != undefined) {
37
+ update.public_website = req.body.public_website;
38
+ }
39
+
27
40
  User.findByIdAndUpdate(req.user.id, update, { new: true, upsert: true }, function (err, updatedUser) {
28
41
  if (err) {
29
42
  winston.error("Error putting user",err);
@@ -145,14 +145,15 @@ class ModulesManager {
145
145
 
146
146
 
147
147
  try {
148
- this.stripe = require('@tiledesk-ent/tiledesk-server-payments').stripeRoute;
148
+ this.stripe = require('../pubmodules/s').stripeRoute;
149
+ // this.stripe = require('@tiledesk-ent/tiledesk-server-payments').stripeRoute;
149
150
  winston.info("ModulesManager stripe initialized");
150
151
  } catch(err) {
151
152
  // if (err.code == 'MODULE_NOT_FOUND') {
152
153
  // winston.info("ModulesManager init stripe module not found");
153
154
  // }else {
154
155
  winston.error("ModulesManager error initializing init stripe module", err);
155
- // }
156
+ // }
156
157
  }
157
158
 
158
159
 
@@ -27,11 +27,13 @@ class SubscriptionNotifierQueued {
27
27
  if (messageEvent.queueEnabled) {
28
28
  messageCreateKey = 'message.create.queue';
29
29
  }
30
+ winston.debug('SubscriptionNotifierQueued messageCreateKey: ' + messageCreateKey);
31
+
30
32
  messageEvent.on(messageCreateKey, function(message) { //queued tested
31
33
  setImmediate(() => {
32
- winston.debug('SubscriptionNotifier message.create');
34
+ winston.debug('SubscriptionNotifierQueued message.create');
33
35
  subscriptionNotifier.subscribe('message.create', message);
34
- winston.debug('SubscriptionNotifier message.create sent');
36
+ winston.debug('SubscriptionNotifierQueued message.create sent');
35
37
  });
36
38
  });
37
39
 
package/test/faqRoute.js CHANGED
@@ -53,7 +53,7 @@ describe('FaqKBRoute', () => {
53
53
  chai.request(server)
54
54
  .post('/' + savedProject._id + '/faq')
55
55
  .auth(email, pwd)
56
- .send({ id_faq_kb: id_faq_kb, question: "question1", answer: "answer1" })
56
+ .send({ id_faq_kb: id_faq_kb, question: "question1", answer: "answer1", attributes: { attr1: { one: "one", two: "two"}, attr2: {three: "three"}} })
57
57
  .end((err, res) => {
58
58
  //console.log("res", res);
59
59
  console.log("res.body", res.body);
@@ -141,8 +141,6 @@ describe('FaqKBRoute', () => {
141
141
 
142
142
  }).timeout(20000);
143
143
 
144
-
145
-
146
144
  it('createWithLanguage', (done) => {
147
145
 
148
146
 
@@ -192,11 +190,6 @@ describe('FaqKBRoute', () => {
192
190
 
193
191
  });
194
192
 
195
-
196
-
197
-
198
-
199
-
200
193
  it('createWithIntentDisplayNameAndWebhookEnalbed', (done) => {
201
194
 
202
195
 
@@ -246,10 +239,6 @@ describe('FaqKBRoute', () => {
246
239
 
247
240
  });
248
241
 
249
-
250
-
251
-
252
-
253
242
  it('update', (done) => {
254
243
 
255
244
 
@@ -275,7 +264,7 @@ describe('FaqKBRoute', () => {
275
264
  chai.request(server)
276
265
  .post('/' + savedProject._id + '/faq')
277
266
  .auth(email, pwd)
278
- .send({ id_faq_kb: id_faq_kb, question: "question1", answer: "answer1" })
267
+ .send({ id_faq_kb: id_faq_kb, question: "question1", answer: "answer1", attributes: { attr1: {one: "one", two: "two"}} })
279
268
  .end((err, res) => {
280
269
  //console.log("res", res);
281
270
  console.log("res.body", res.body);
@@ -290,7 +279,7 @@ describe('FaqKBRoute', () => {
290
279
  chai.request(server)
291
280
  .put('/' + savedProject._id + '/faq/' + res.body._id)
292
281
  .auth(email, pwd)
293
- .send({ id_faq_kb: id_faq_kb, question: "question2", answer: "answer2", webhook_enabled: true })
282
+ .send({ id_faq_kb: id_faq_kb, question: "question2", answer: "answer2", webhook_enabled: true, attributes: { two: "twooo" } })
294
283
  .end((err, res) => {
295
284
  //console.log("res", res);
296
285
  console.log("res.body", res.body);
@@ -315,6 +304,74 @@ describe('FaqKBRoute', () => {
315
304
 
316
305
  });
317
306
 
307
+ it('update attributes', (done) => {
308
+
309
+ console.log("update attributes test start... ");
310
+
311
+ var email = "test-signup-" + Date.now() + "@email.com";
312
+ var pwd = "pwd";
313
+
314
+ userService.signup(email, pwd, "Test Firstname", "Test lastname").then(function (savedUser) {
315
+ projectService.create("test-faqkb-create", savedUser._id).then(function (savedProject) {
316
+ chai.request(server)
317
+ .post('/' + savedProject._id + '/faq_kb')
318
+ .auth(email, pwd)
319
+ .send({ "name": "testbot", type: "internal" })
320
+ .end((err, res) => {
321
+ //console.log("res", res);
322
+ console.log("res.body", res.body);
323
+ res.should.have.status(200);
324
+ res.body.should.be.a('object');
325
+ expect(res.body.name).to.equal("testbot");
326
+ var id_faq_kb = res.body._id;
327
+
328
+ chai.request(server)
329
+ .post('/' + savedProject._id + '/faq')
330
+ .auth(email, pwd)
331
+ .send({ id_faq_kb: id_faq_kb, question: "question1", answer: "answer1" })
332
+ .end((err, res) => {
333
+ //console.log("res", res);
334
+ console.log("res.body", res.body);
335
+ res.should.have.status(200);
336
+ res.body.should.be.a('object');
337
+ expect(res.body.id_faq_kb).to.equal(id_faq_kb);
338
+ expect(res.body.question).to.equal("question1");
339
+ expect(res.body.answer).to.equal("answer1");
340
+ expect(res.body.intent_display_name).to.not.equal(undefined);
341
+ expect(res.body.webhook_enabled).to.equal(false);
342
+
343
+ chai.request(server)
344
+ .patch('/' + savedProject._id + '/faq/' + res.body._id + '/attributes')
345
+ .auth(email, pwd)
346
+ .send({
347
+ "first_parameter": {
348
+ "x": "first",
349
+ "y": "second"
350
+ },
351
+ "color": {
352
+ "first": "first",
353
+ }
354
+ })
355
+ .end((err, res) => {
356
+ //console.log("res", res);
357
+ console.log("res.body attributes", res.body);
358
+ console.log("res.body attributes", res.body.attributes);
359
+ res.should.have.status(200);
360
+ res.body.should.be.a('object');
361
+ expect(res.body.attributes).to.not.equal(undefined);
362
+
363
+ done();
364
+ });
365
+
366
+ });
367
+
368
+ });
369
+
370
+
371
+ });
372
+ });
373
+ })
374
+
318
375
 
319
376
  it('uploadcsv', (done) => {
320
377
 
@@ -425,7 +482,7 @@ describe('FaqKBRoute', () => {
425
482
 
426
483
  userService.signup(email, pwd, "Test Firstname", "Test Lastname").then((savedUser) => {
427
484
  projectService.create("test-search-faqs", savedUser._id).then((savedProject) => {
428
-
485
+
429
486
  chai.request(server)
430
487
  .post('/' + savedProject._id + '/faq_kb')
431
488
  .auth(email, pwd)
@@ -467,7 +524,7 @@ describe('FaqKBRoute', () => {
467
524
 
468
525
  userService.signup(email, pwd, "Test Firstname", "Test Lastname").then((savedUser) => {
469
526
  projectService.create("test-search-faqs", savedUser._id).then((savedProject) => {
470
-
527
+
471
528
  chai.request(server)
472
529
  .post('/' + savedProject._id + '/faq_kb')
473
530
  .auth(email, pwd)
@@ -313,7 +313,7 @@ describe('FaqKBRoute', () => {
313
313
  })
314
314
  })
315
315
 
316
- it('create bot and import json qwerty', (done) => {
316
+ it('create bot and import json', (done) => {
317
317
 
318
318
  var email = "test-signup-" + Date.now() + "@email.com";
319
319
  var pwd = "pwd";
@@ -357,7 +357,7 @@ describe('FaqKBRoute', () => {
357
357
 
358
358
  })
359
359
 
360
- it('import json in an existing bot qwerty2', (done) => {
360
+ it('import json in an existing bot', (done) => {
361
361
 
362
362
  var email = "test-signup-" + Date.now() + "@email.com";
363
363
  var pwd = "pwd";
@@ -643,7 +643,7 @@ class WebSocketServer {
643
643
  if (messageEvent.queueEnabled) {
644
644
  messageCreateKey = 'message.create.queue.pubsub';
645
645
  }
646
- winston.debug('messageCreateKey: ' + messageCreateKey);
646
+ winston.debug('WS messageCreateKey: ' + messageCreateKey);
647
647
 
648
648
  messageEvent.on(messageCreateKey, function (message) {
649
649
  setImmediate(async () => {