@resolveio/server-lib 1.0.0-rc4 → 1.0.0-rc5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/collections/active-subscription.collection.d.ts +8 -0
  2. package/collections/active-subscription.collection.js +68 -2
  3. package/collections/app-status.collection.d.ts +8 -0
  4. package/collections/app-status.collection.js +43 -2
  5. package/collections/app-version.collection.d.ts +8 -0
  6. package/collections/app-version.collection.js +56 -2
  7. package/collections/counter.collection.d.ts +10 -0
  8. package/collections/counter.collection.js +73 -2
  9. package/collections/cron-job-history.collection.d.ts +8 -0
  10. package/collections/cron-job-history.collection.js +86 -2
  11. package/collections/cron-job.collection.d.ts +8 -0
  12. package/collections/cron-job.collection.js +89 -2
  13. package/collections/file.collection.d.ts +10 -0
  14. package/collections/file.collection.js +73 -2
  15. package/collections/flag.collection.d.ts +8 -0
  16. package/collections/flag.collection.js +47 -2
  17. package/collections/log.collection.d.ts +8 -0
  18. package/collections/log.collection.js +64 -2
  19. package/collections/logged-in-users.collection.d.ts +8 -0
  20. package/collections/logged-in-users.collection.js +70 -2
  21. package/collections/method-call.collection.d.ts +7 -0
  22. package/collections/method-call.collection.js +44 -2
  23. package/collections/method-response.collection.d.ts +7 -0
  24. package/collections/method-response.collection.js +48 -2
  25. package/collections/queue-flag.collection.d.ts +8 -0
  26. package/collections/queue-flag.collection.js +41 -2
  27. package/collections/queue-method.collection.d.ts +8 -0
  28. package/collections/queue-method.collection.js +116 -2
  29. package/collections/queue-response.collection.d.ts +8 -0
  30. package/collections/queue-response.collection.js +78 -2
  31. package/collections/support-ticket.collection.d.ts +8 -0
  32. package/collections/support-ticket.collection.js +146 -2
  33. package/collections/user.collection.d.ts +9 -0
  34. package/collections/user.collection.js +108 -2
  35. package/cron/cron.d.ts +6 -0
  36. package/cron/cron.js +160 -2
  37. package/fixtures/cron-jobs.d.ts +2 -0
  38. package/fixtures/cron-jobs.js +72 -2
  39. package/fixtures/init.d.ts +2 -0
  40. package/fixtures/init.js +73 -2
  41. package/http/auth.d.ts +3 -0
  42. package/http/auth.js +472 -2
  43. package/http/health.d.ts +2 -0
  44. package/http/health.js +8 -2
  45. package/index.d.ts +53 -0
  46. package/index.js +123 -2
  47. package/managers/cron.manager.d.ts +17 -0
  48. package/managers/cron.manager.js +193 -2
  49. package/managers/method.manager.d.ts +27 -0
  50. package/managers/method.manager.js +513 -2
  51. package/managers/queue-method.manager.d.ts +14 -0
  52. package/managers/queue-method.manager.js +239 -2
  53. package/managers/subscription.manager.d.ts +27 -0
  54. package/managers/subscription.manager.js +700 -2
  55. package/managers/support.manager.d.ts +18 -0
  56. package/managers/support.manager.js +208 -2
  57. package/methods/accounts.d.ts +3 -0
  58. package/methods/accounts.js +253 -2
  59. package/methods/aws.d.ts +3 -0
  60. package/methods/aws.js +323 -2
  61. package/methods/cloudconvert.d.ts +3 -0
  62. package/methods/cloudconvert.js +37 -2
  63. package/methods/collections.d.ts +3 -0
  64. package/methods/collections.js +738 -2
  65. package/methods/counters.d.ts +3 -0
  66. package/methods/counters.js +404 -2
  67. package/methods/cron-jobs.d.ts +3 -0
  68. package/methods/cron-jobs.js +63 -2
  69. package/methods/flags.d.ts +3 -0
  70. package/methods/flags.js +6 -2
  71. package/methods/logs.d.ts +3 -0
  72. package/methods/logs.js +29 -2
  73. package/methods/pdf.d.ts +3 -0
  74. package/methods/pdf.js +303 -2
  75. package/models/active-subscription.model.d.ts +14 -0
  76. package/models/active-subscription.model.js +2 -2
  77. package/models/app-status.model.d.ts +5 -0
  78. package/models/app-status.model.js +2 -2
  79. package/models/app-version.model.d.ts +5 -0
  80. package/models/app-version.model.js +2 -2
  81. package/models/collection-document.model.d.ts +7 -0
  82. package/models/collection-document.model.js +2 -2
  83. package/models/counter.model.d.ts +6 -0
  84. package/models/counter.model.js +2 -2
  85. package/models/cron-job-history.model.d.ts +13 -0
  86. package/models/cron-job-history.model.js +2 -2
  87. package/models/cron-job.model.d.ts +14 -0
  88. package/models/cron-job.model.js +2 -2
  89. package/models/dialog.model.d.ts +24 -0
  90. package/models/dialog.model.js +2 -2
  91. package/models/file.model.d.ts +10 -0
  92. package/models/file.model.js +2 -2
  93. package/models/flag.model.d.ts +6 -0
  94. package/models/flag.model.js +2 -2
  95. package/models/log.model.d.ts +12 -0
  96. package/models/log.model.js +2 -2
  97. package/models/logged-in-users.model.d.ts +10 -0
  98. package/models/logged-in-users.model.js +2 -2
  99. package/models/method-call.model.d.ts +8 -0
  100. package/models/method-call.model.js +2 -2
  101. package/models/method-response.model.d.ts +9 -0
  102. package/models/method-response.model.js +2 -2
  103. package/models/method.model.d.ts +11 -0
  104. package/models/method.model.js +2 -2
  105. package/models/pagination.model.d.ts +12 -0
  106. package/models/pagination.model.js +20 -2
  107. package/models/permission.model.d.ts +13 -0
  108. package/models/permission.model.js +2 -2
  109. package/models/queue-method.model.d.ts +10 -0
  110. package/models/queue-method.model.js +2 -2
  111. package/models/queue-response.model.d.ts +11 -0
  112. package/models/queue-response.model.js +2 -2
  113. package/models/select-data-label.model.d.ts +10 -0
  114. package/models/select-data-label.model.js +2 -2
  115. package/models/server-response.model.d.ts +6 -0
  116. package/models/server-response.model.js +2 -2
  117. package/models/subscription.model.d.ts +31 -0
  118. package/models/subscription.model.js +2 -2
  119. package/models/support-method.model.d.ts +10 -0
  120. package/models/support-method.model.js +2 -2
  121. package/models/support-ticket.model.d.ts +40 -0
  122. package/models/support-ticket.model.js +2 -2
  123. package/models/user.model.d.ts +15 -0
  124. package/models/user.model.js +2 -2
  125. package/package.json +3 -1
  126. package/publications/app-status.d.ts +3 -0
  127. package/publications/app-status.js +14 -2
  128. package/publications/app-version.d.ts +3 -0
  129. package/publications/app-version.js +14 -2
  130. package/publications/cron-jobs.d.ts +3 -0
  131. package/publications/cron-jobs.js +14 -2
  132. package/publications/files.d.ts +3 -0
  133. package/publications/files.js +71 -2
  134. package/publications/flags.d.ts +3 -0
  135. package/publications/flags.js +23 -2
  136. package/publications/logs.d.ts +3 -0
  137. package/publications/logs.js +26 -2
  138. package/publications/method-calls.d.ts +3 -0
  139. package/publications/method-calls.js +14 -2
  140. package/publications/method-responses.d.ts +3 -0
  141. package/publications/method-responses.js +14 -2
  142. package/publications/super-admin.d.ts +3 -0
  143. package/publications/super-admin.js +21 -2
  144. package/publications/support-tickets.d.ts +2 -0
  145. package/publications/support-tickets.js +118 -2
  146. package/server-app.d.ts +33 -0
  147. package/server-app.js +598 -2
  148. package/support-methods/aws.d.ts +3 -0
  149. package/support-methods/aws.js +276 -2
  150. package/support-methods/collections.d.ts +3 -0
  151. package/support-methods/collections.js +471 -2
  152. package/support-methods/counters.d.ts +3 -0
  153. package/support-methods/counters.js +189 -2
  154. package/support-methods/support.d.ts +3 -0
  155. package/support-methods/support.js +19 -2
  156. package/util/common.d.ts +15 -0
  157. package/util/common.js +334 -2
@@ -1,2 +1,738 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var mongoose_1=require("mongoose"),common_1=require("../util/common"),simpl_schema_1=require("simpl-schema"),pagination_model_1=require("../models/pagination.model"),log_collection_1=require("../collections/log.collection"),index_1=require("../index");function loadCollectionMethods(e){e.methods({findOne:{skipQueue:!0,check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0}}),function:function(e,o){return index_1.default.getMainDB().model(e).findOne(o).exec()}},find:{skipQueue:!0,check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0},sort:{type:Object,blackbox:!0,optional:!0}}),function:function(e,o,t){return void 0===t&&(t={}),index_1.default.getMainDB().model(e).find(o).sort(t).exec()}},findWithOptions:{skipQueue:!0,check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0},options:{type:pagination_model_1.PaginationOptionsSchema}}),function:function(e,o,t){return index_1.default.getMainDB().model(e).find(o).sort(t.sort).limit(t.limit).skip(t.skip).select(t.fields).exec()}},insertDocument:{check:new simpl_schema_1.default({collection:{type:String},document:{type:Object,blackbox:!0}}),function:function(i,d){var l=this;return new Promise(function(e,o){var t=null;try{index_1.default.getMainDB().model(i).simplschema.validate(d)}catch(e){t=e,l.callMethodInternal.call(l,"insertErrorLog","Schema Failed on insert - "+i,[t,d])}if(t)console.log(t),o("Schema Errors");else{common_1.getBinarySize(JSON.stringify(d))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Insert Document",message:"User: "+l.user+", Collection Type: "+i,payload:d,method:"insertDocument",user:l.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Insert Document",message:"User: "+l.user+", Collection Type: "+i,payload:"Too Big",method:"insertDocument",user:l.user,messageId:""});var n=mongoose_1.Types.ObjectId().toHexString();d._id=n,d.__v=0,index_1.default.getMainDB().model(i).create(d).then(function(){return e(n)},function(e){return o(e)})}})}},updateDocument:{check:new simpl_schema_1.default({collection:{type:String},f_document:{type:Object,blackbox:!0}}),function:function(c,_){var i=this;return new Promise(function(l,a){index_1.default.getMainDB().model(c).findOne({_id:_._id}).lean().exec(function(e,d){if(d)if(d.__v===_.__v){var o=common_1.deepCopy(d);o._id={_id:d._id,__v:d.__v};var t=null;try{index_1.default.getMainDB().model(c).simplschema.validate(_)}catch(e){t=e,i.callMethodInternal.call(i,"insertErrorLog","Schema Failed on updateDocument - "+c,[t,_])}if(t)console.log(t),a("Schema Errors");else{index_1.default.getMainDB().model(index_1.default.getMainDB().model(c).versionCollection).create(o).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(c).versionCollection).deleteMany({$and:[{"_id._id":d._id},{"_id.__v":{$lte:d.__v-4}}]}).exec()},function(e){console.log(e)});var n=common_1.getMongoUpdates(d,_,!0);n?index_1.default.getMainDB().model(c).updateOne({_id:_._id},n,{strict:!1}).exec().then(function(e){l(e.nModified)},function(e){return a(e)}):l(1),common_1.getBinarySize(JSON.stringify(_))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document",message:"User: "+i.user+", Collection Type: "+c,payload:_,method:"updateDocument",user:i.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document",message:"User: "+i.user+", Collection Type: "+c,payload:"Too Big",method:"updateDocument",user:i.user,messageId:""})}}else console.log("invalid version - "+c,d.__v,_.__v),index_1.default.getMainDB().model(index_1.default.getMainDB().model(c).versionCollection).findOne({$and:[{"_id._id":d._id},{"_id.__v":_.__v}]}).lean().exec(function(e,o){var t=d._id;if(o){var n=common_1.deepCopy(d);n._id={_id:d._id,__v:d.__v};var i=common_1.getMongoMergeUpdatedDoc(_,d,o);i._id=t,i.__v++,index_1.default.getMainDB().model(c).replaceOne({_id:t},i).exec().then(function(o){index_1.default.getMainDB().model(index_1.default.getMainDB().model(c).versionCollection).create(n).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(c).versionCollection).deleteMany({$and:[{"_id._id":n._id._id},{"_id.__v":{$lte:n._id.__v-4}}]}).exec(),l(o.nModified)})},function(e){return a(e)})}else a("Invalid Version And Could Not Find History - DB: "+d.__v+", Trying to update with :"+_.__v)});else a(e)})})}},updateDocumentProps:{check:new simpl_schema_1.default({collection:{type:String},doc_id:{type:String},updateParams:{type:Array},"updateParams.$":{type:Object,blackbox:!0},doc__v:{type:Number}}),function:function(_,i,r,s){var u=this;return new Promise(function(a,c){index_1.default.getMainDB().model(_).findOne({_id:i}).lean().exec(function(e,d){if(d){var l=common_1.deepCopy(d);if(r.forEach(function(e){l[e.prop]=e.data}),l.__v===s){var o=common_1.deepCopy(d);o._id={_id:d._id,__v:d.__v};var t=null;try{index_1.default.getMainDB().model(_).simplschema.validate(l)}catch(e){t=e,u.callMethodInternal.call(u,"insertErrorLog","Schema Failed on updateDocumentProps - "+_,[t,l])}if(t)console.log(t),c("Schema Errors");else{index_1.default.getMainDB().model(index_1.default.getMainDB().model(_).versionCollection).create(o).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(_).versionCollection).deleteMany({$and:[{"_id._id":d._id},{"_id.__v":{$lte:d.__v-4}}]}).exec()},function(e){console.log(e)});var n=common_1.getMongoUpdates(d,l,!0);n?index_1.default.getMainDB().model(_).updateOne({_id:l._id},n,{strict:!1}).exec().then(function(e){a(e.ok)},function(e){return c(e)}):a(1),common_1.getBinarySize(JSON.stringify(r))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document Props",message:"User: "+u.user+", Collection Type: "+_+", Id: "+i+", Version: "+s,payload:r,method:"updateDocumentProps",user:u.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document Props",message:"User: "+u.user+", Collection Type: "+_+", Id: "+i+", Version: "+s,payload:"Too Big",method:"updateDocumentProps",user:u.user,messageId:""})}}else console.log("invalid version - "+_,d.__v,s),index_1.default.getMainDB().model(index_1.default.getMainDB().model(_).versionCollection).findOne({$and:[{"_id._id":d._id},{"_id.__v":s}]}).lean().exec(function(e,o){var t=d._id;if(o){var n=common_1.deepCopy(d);n._id={_id:d._id,__v:d.__v};var i=common_1.getMongoMergeUpdatedDoc(l,d,o);i._id=t,i.__v++,index_1.default.getMainDB().model(_).replaceOne({_id:t},i).exec().then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(_).versionCollection).create(n).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(_).versionCollection).deleteMany({$and:[{"_id._id":n._id._id},{"_id.__v":{$lte:n._id.__v-4}}]}).exec()},function(e){console.log(e)}),a(e.nModified)},function(e){return c(e)})}else c("Invalid Version And Could Not Find History Props - DB: "+d.__v+", Trying to update with :"+l.__v)})}else c(e)})})}},updateDocumentOffline:{check:new simpl_schema_1.default({collection:{type:String},f_document:{type:Object,blackbox:!0},f_oldDocument:{type:Object,blackbox:!0}}),function:function(r,s,u){var m=this;return new Promise(function(c,_){index_1.default.getMainDB().model(r).findOne({_id:s._id}).lean().exec(function(e,o){if(o)if(o.__v===s.__v){var t=common_1.deepCopy(o);t._id={_id:o._id,__v:o.__v};var n=null;try{index_1.default.getMainDB().model(r).simplschema.validate(s)}catch(e){n=e,m.callMethodInternal.call(m,"insertErrorLog","Schema Failed on updateDocument - "+r,[n,s])}if(n)console.log(n),_("Schema Errors");else{index_1.default.getMainDB().model(index_1.default.getMainDB().model(r).versionCollection).create(t).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(r).versionCollection).deleteMany({$and:[{"_id._id":o._id},{"_id.__v":{$lte:o.__v-4}}]}).exec()},function(e){console.log(e)});var i=common_1.getMongoUpdates(o,s,!0);i?index_1.default.getMainDB().model(r).updateOne({_id:s._id},i,{strict:!1}).exec().then(function(e){c(e.nModified)},function(e){return _(e)}):c(1),common_1.getBinarySize(JSON.stringify(s))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document",message:"User: "+m.user+", Collection Type: "+r,payload:s,method:"updateDocumentOffline",user:m.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document",message:"User: "+m.user+", Collection Type: "+r,payload:"Too Big",method:"updateDocumentOffline",user:m.user,messageId:""})}}else{console.log("invalid version - "+r,o.__v,s.__v);var d=o._id;if(u){var l=common_1.deepCopy(o);l._id={_id:o._id,__v:o.__v};var a=common_1.getMongoMergeUpdatedDoc(s,o,u);a._id=d,a.__v++,index_1.default.getMainDB().model(r).replaceOne({_id:d},a).exec().then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(r).versionCollection).create(l).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(r).versionCollection).deleteMany({$and:[{"_id._id":l._id._id},{"_id.__v":{$lte:l._id.__v-4}}]}).exec()},function(e){console.log(e)}),c(e.nModified)},function(e){return _(e)})}else _("OFFLINE - Invalid Version And Could Not Find History - DB: "+o.__v+", Trying to update with :"+s.__v)}else _(e)})})}},updateDocumentPropsOffline:{check:new simpl_schema_1.default({collection:{type:String},doc_id:{type:String},updateParams:{type:Array},"updateParams.$":{type:Object,blackbox:!0},doc__v:{type:Number},f_oldDocument:{type:Object,blackbox:!0}}),function:function(s,u,m,g,f){var p=this;return new Promise(function(_,r){index_1.default.getMainDB().model(s).findOne({_id:u}).lean().exec(function(e,o){if(o){var t=common_1.deepCopy(o);if(m.forEach(function(e){t[e.prop]=e.data}),t.__v===g){var n=common_1.deepCopy(o);n._id={_id:o._id,__v:o.__v};var i=null;try{index_1.default.getMainDB().model(s).simplschema.validate(t)}catch(e){i=e,p.callMethodInternal.call(p,"insertErrorLog","Schema Failed on updateDocumentProps - "+s,[i,t])}if(i)console.log(i),r("Schema Errors");else{index_1.default.getMainDB().model(index_1.default.getMainDB().model(s).versionCollection).create(n).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(s).versionCollection).deleteMany({$and:[{"_id._id":o._id},{"_id.__v":{$lte:o.__v-4}}]}).exec()},function(e){console.log(e)});var d=common_1.getMongoUpdates(o,t,!0);d?index_1.default.getMainDB().model(s).updateOne({_id:t._id},d,{strict:!1}).exec().then(function(e){_(e.ok)},function(e){return r(e)}):_(1),common_1.getBinarySize(JSON.stringify(m))<2e5?log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document Props",message:"User: "+p.user+", Collection Type: "+s+", Id: "+u+", Version: "+g,payload:m,method:"updateDocumentPropsOffline",user:p.user,messageId:""}):log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Update Document Props",message:"User: "+p.user+", Collection Type: "+s+", Id: "+u+", Version: "+g,payload:"Too Big",method:"updateDocumentPropsOffline",user:p.user,messageId:""})}}else{console.log("invalid version - "+s,o.__v,g);var l=o._id;if(f){var a=common_1.deepCopy(o);a._id={_id:o._id,__v:o.__v};var c=common_1.getMongoMergeUpdatedDoc(t,o,f);c._id=l,c.__v++,index_1.default.getMainDB().model(s).replaceOne({_id:l},c).exec().then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(s).versionCollection).create(a).then(function(e){index_1.default.getMainDB().model(index_1.default.getMainDB().model(s).versionCollection).deleteMany({$and:[{"_id._id":a._id._id},{"_id.__v":{$lte:a._id.__v-4}}]}).exec()},function(e){console.log(e)}),_(e.nModified)},function(e){return r(e)})}else r("OFFLINE - Invalid Version And Could Not Find History Props - DB: "+o.__v+", Trying to update with :"+t.__v)}}else r(e)})})}},removeDocument:{check:new simpl_schema_1.default({collection:{type:String},doc_id:{type:String}}),function:function(e,o){var i=this;return new Promise(function(t,n){log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Remove Document",message:"User: "+i.user+", Collection Type: "+e,payload:{_id:o},method:"removeDocument",user:i.user,messageId:""}),index_1.default.getMainDB().model(e).deleteOne({_id:o}).exec(function(e,o){e?n(e):t(o.ok)})})}},removeDocumentWithQuery:{check:new simpl_schema_1.default({collection:{type:String},query:{type:Object,blackbox:!0}}),function:function(e,o){var i=this;return new Promise(function(t,n){log_collection_1.Logs.create({_id:mongoose_1.Types.ObjectId().toHexString(),date:new Date,type:"info",title:"Remove Document (Query)",message:"User: "+i.user+", Collection Type: "+e,payload:{_id:o},method:"removeDocumentWithQuery",user:i.user,messageId:""}),index_1.default.getMainDB().model(e).deleteOne(o).exec(function(e,o){e?n(e):t(o.ok)})})}}})}exports.loadCollectionMethods=loadCollectionMethods;
2
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXRob2RzL2NvbGxlY3Rpb25zLnRzIl0sIm5hbWVzIjpbIm1vbmdvb3NlXzEiLCJyZXF1aXJlIiwiY29tbW9uXzEiLCJzaW1wbF9zY2hlbWFfMSIsInBhZ2luYXRpb25fbW9kZWxfMSIsImxvZ19jb2xsZWN0aW9uXzEiLCJpbmRleF8xIiwibG9hZENvbGxlY3Rpb25NZXRob2RzIiwibWV0aG9kTWFuYWdlciIsIm1ldGhvZHMiLCJmaW5kT25lIiwic2tpcFF1ZXVlIiwiY2hlY2siLCJkZWZhdWx0IiwiY29sbGVjdGlvbiIsInR5cGUiLCJTdHJpbmciLCJxdWVyeSIsIk9iamVjdCIsImJsYWNrYm94IiwiZnVuY3Rpb24iLCJnZXRNYWluREIiLCJtb2RlbCIsImV4ZWMiLCJmaW5kIiwic29ydCIsIm9wdGlvbmFsIiwic29ydFF1ZXJ5IiwiZmluZFdpdGhPcHRpb25zIiwib3B0aW9ucyIsIlBhZ2luYXRpb25PcHRpb25zU2NoZW1hIiwibGltaXQiLCJza2lwIiwic2VsZWN0IiwiZmllbGRzIiwiaW5zZXJ0RG9jdW1lbnQiLCJkb2N1bWVudCIsIl90aGlzIiwidGhpcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwic2NoZW1hRXJyb3JzIiwidmFsaWRhdGUiLCJlcnJvcnMiLCJjYWxsTWV0aG9kSW50ZXJuYWwiLCJjYWxsIiwiY29uc29sZSIsImxvZyIsImdldEJpbmFyeVNpemUiLCJKU09OIiwic3RyaW5naWZ5IiwiTG9ncyIsImNyZWF0ZSIsIl9pZCIsIlR5cGVzIiwiT2JqZWN0SWQiLCJ0b0hleFN0cmluZyIsImRhdGUiLCJEYXRlIiwidGl0bGUiLCJtZXNzYWdlIiwidXNlciIsInBheWxvYWQiLCJtZXRob2QiLCJtZXNzYWdlSWQiLCJpZF8xIiwidGhlbiIsImVyciIsInVwZGF0ZURvY3VtZW50IiwiZl9kb2N1bWVudCIsImxlYW4iLCJlcnJEb2MiLCJjdXJyRG9jIiwiX192IiwidmVyc2lvbkRvYyIsImRlZXBDb3B5IiwiZG9jIiwiZGVsZXRlTWFueSIsIiRhbmQiLCJfaWQuX2lkIiwiX2lkLl9fdiIsIiRsdGUiLCJ1cGRhdGVzIiwiZ2V0TW9uZ29VcGRhdGVzIiwidXBkYXRlT25lIiwic3RyaWN0IiwicmVzIiwibk1vZGlmaWVkIiwiZXJyT2xkRG9jIiwib2xkRG9jIiwibmV3Q3VyckRvY0lkIiwidmVyc2lvbkRvY18xIiwidXBkYXRlZERvYyIsImdldE1vbmdvTWVyZ2VVcGRhdGVkRG9jIiwicmVwbGFjZU9uZSIsInVwZGF0ZURvY3VtZW50UHJvcHMiLCJkb2NfaWQiLCJ1cGRhdGVQYXJhbXMiLCJBcnJheSIsInVwZGF0ZVBhcmFtcy4kIiwiZG9jX192IiwiTnVtYmVyIiwibW9kaWZpZWREb2NfMSIsImZvckVhY2giLCJkYXRhIiwicHJvcCIsIm9rIiwidmVyc2lvbkRvY18yIiwidXBkYXRlRG9jdW1lbnRPZmZsaW5lIiwiZl9vbGREb2N1bWVudCIsInZlcnNpb25Eb2NfMyIsInVwZGF0ZURvY3VtZW50UHJvcHNPZmZsaW5lIiwibW9kaWZpZWREb2NfMiIsInZlcnNpb25Eb2NfNCIsInJlbW92ZURvY3VtZW50IiwiZGVsZXRlT25lIiwicmVtb3ZlRG9jdW1lbnRXaXRoUXVlcnkiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoib0VBQUEsSUFBQUEsV0FBQUMsUUFBQSxZQUVBQyxTQUFBRCxRQUFBLGtCQUNBRSxlQUFBRixRQUFBLGdCQUNBRyxtQkFBQUgsUUFBQSw4QkFDQUksaUJBQUFKLFFBQUEsaUNBQ0FLLFFBQUFMLFFBQUEsWUFFQSxTQUFnQk0sc0JBQXNCQyxHQUNyQ0EsRUFBY0MsUUFBUSxDQUVyQkMsUUFBUyxDQUNSQyxXQUFXLEVBQ1hDLE1BQU8sSUFBSVQsZUFBQVUsUUFBYSxDQUN2QkMsV0FBWSxDQUNYQyxLQUFNQyxRQUVQQyxNQUFPLENBQ05GLEtBQU1HLE9BQ05DLFVBQVUsS0FHWkMsU0FBVSxTQUFTTixFQUFvQkcsR0FDdEMsT0FBT1gsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQVlKLFFBQVFPLEdBQU9NLFNBR3RFQyxLQUFNLENBQ0xiLFdBQVcsRUFDWEMsTUFBTyxJQUFJVCxlQUFBVSxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBDLE1BQU8sQ0FDTkYsS0FBTUcsT0FDTkMsVUFBVSxHQUVYTSxLQUFNLENBQ0xWLEtBQU1HLE9BQ05DLFVBQVUsRUFDVk8sVUFBVSxLQUdaTixTQUFVLFNBQVNOLEVBQW9CRyxFQUFlVSxHQUNyRCxZQURxRCxJQUFBQSxJQUFBQSxFQUFBLElBQzlDckIsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQVlVLEtBQUtQLEdBQU9RLEtBQUtFLEdBQVdKLFNBR25GSyxnQkFBaUIsQ0FDaEJqQixXQUFXLEVBQ1hDLE1BQU8sSUFBSVQsZUFBQVUsUUFBYSxDQUN2QkMsV0FBWSxDQUNYQyxLQUFNQyxRQUVQQyxNQUFPLENBQ05GLEtBQU1HLE9BQ05DLFVBQVUsR0FFWFUsUUFBUyxDQUNSZCxLQUFNWCxtQkFBQTBCLDJCQUdSVixTQUFVLFNBQVNOLEVBQW9CRyxFQUFlWSxHQUNyRCxPQUFPdkIsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQVlVLEtBQUtQLEdBQU9RLEtBQUtJLEVBQVFKLE1BQU1NLE1BQU1GLEVBQVFFLE9BQU9DLEtBQUtILEVBQVFHLE1BQU1DLE9BQU9KLEVBQVFLLFFBQVFYLFNBTXJKWSxlQUFnQixDQUNmdkIsTUFBTyxJQUFJVCxlQUFBVSxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBvQixTQUFVLENBQ1RyQixLQUFNRyxPQUNOQyxVQUFVLEtBR1pDLFNBQVUsU0FBU04sRUFBb0JzQixHQUE3QixJQUFBQyxFQUFBQyxLQUNULE9BQU8sSUFBSUMsUUFBUSxTQUFDQyxFQUFTQyxHQUU1QixJQUFJQyxFQUFlLEtBRW5CLElBQ0NwQyxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBeUIsWUFBRTZCLFNBQVNQLEdBRXZFLE1BQU9RLEdBQ05GLEVBQWVFLEVBQ2ZQLEVBQUtRLG1CQUFtQkMsS0FBS1QsRUFBTSxpQkFBa0IsNkJBQStCdkIsRUFBWSxDQUFDNEIsRUFBY04sSUFHaEgsR0FBSU0sRUFDSEssUUFBUUMsSUFBSU4sR0FDWkQsRUFBTyxxQkFFSCxDQUNBdkMsU0FBQStDLGNBQWNDLEtBQUtDLFVBQVVmLElBQWEsSUFDN0MvQixpQkFBQStDLEtBQUtDLE9BQU8sQ0FDWEMsSUFBS3RELFdBQUF1RCxNQUFNQyxXQUFXQyxjQUN0QkMsS0FBTSxJQUFJQyxLQUNWNUMsS0FBTSxPQUNONkMsTUFBTyxrQkFDUEMsUUFBUyxTQUFXeEIsRUFBS3lCLEtBQU8sc0JBQXdCaEQsRUFDeERpRCxRQUFTM0IsRUFDVDRCLE9BQVEsaUJBQ1JGLEtBQU16QixFQUFLeUIsS0FDWEcsVUFBVyxLQUlaNUQsaUJBQUErQyxLQUFLQyxPQUFPLENBQ1hDLElBQUt0RCxXQUFBdUQsTUFBTUMsV0FBV0MsY0FDdEJDLEtBQU0sSUFBSUMsS0FDVjVDLEtBQU0sT0FDTjZDLE1BQU8sa0JBQ1BDLFFBQVMsU0FBV3hCLEVBQUt5QixLQUFPLHNCQUF3QmhELEVBQ3hEaUQsUUFBUyxVQUNUQyxPQUFRLGlCQUNSRixLQUFNekIsRUFBS3lCLEtBQ1hHLFVBQVcsS0FJYixJQUFJQyxFQUFLbEUsV0FBQXVELE1BQU1DLFdBQVdDLGNBQzFCckIsRUFBYyxJQUFJOEIsRUFDbEI5QixFQUFjLElBQUksRUFDbEI5QixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBWXVDLE9BQU9qQixHQUFVK0IsS0FBSyxXQUFNLE9BQUEzQixFQUFRMEIsSUFBSyxTQUFBRSxHQUFPLE9BQUEzQixFQUFPMkIsVUFTekdDLGVBQWdCLENBQ2Z6RCxNQUFPLElBQUlULGVBQUFVLFFBQWEsQ0FDdkJDLFdBQVksQ0FDWEMsS0FBTUMsUUFFUHNELFdBQVksQ0FDWHZELEtBQU1HLE9BQ05DLFVBQVUsS0FHWkMsU0FBVSxTQUFTTixFQUFvQndELEdBQTdCLElBQUFqQyxFQUFBQyxLQUNULE9BQU8sSUFBSUMsUUFBUSxTQUFDQyxFQUFTQyxHQUM1Qm5DLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUFZSixRQUFRLENBQUM0QyxJQUFLZ0IsRUFBZ0IsTUFBSUMsT0FBT2hELEtBQUssU0FBQ2lELEVBQVFDLEdBQ3BHLEdBQUlBLEVBQ0gsR0FBSUEsRUFBUUMsTUFBUUosRUFBZ0IsSUFBRyxDQUN0QyxJQUFJSyxFQUFhekUsU0FBQTBFLFNBQVNILEdBRTFCRSxFQUFXckIsSUFBTSxDQUNoQkEsSUFBS21CLEVBQVFuQixJQUNib0IsSUFBS0QsRUFBUUMsS0FHZCxJQUFJaEMsRUFBZSxLQUVuQixJQUNDcEMsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQXlCLFlBQUU2QixTQUFTMkIsR0FFdkUsTUFBTzFCLEdBQ05GLEVBQWVFLEVBQ2ZQLEVBQUtRLG1CQUFtQkMsS0FBS1QsRUFBTSxpQkFBa0IscUNBQXVDdkIsRUFBWSxDQUFDNEIsRUFBYzRCLElBR3hILEdBQUk1QixFQUNISyxRQUFRQyxJQUFJTixHQUNaRCxFQUFPLHFCQUVILENBQ0puQyxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR3VDLE9BQU9zQixHQUFZUixLQUFLLFNBQUFVLEdBQzdIdkUsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1oQixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBK0IsbUJBQUdnRSxXQUFXLENBQ2hIQyxLQUFNLENBQ0wsQ0FBQ0MsVUFBV1AsRUFBUW5CLEtBQ3BCLENBQUMyQixVQUFXLENBQUNDLEtBQU1ULEVBQVFDLElBQU0sT0FFaENuRCxRQUNELFNBQUE2QyxHQUNGckIsUUFBUUMsSUFBSW9CLEtBR2IsSUFBSWUsRUFBVWpGLFNBQUFrRixnQkFBZ0JYLEVBQVNILEdBQVksR0FFL0NhLEVBQ0g3RSxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBWXVFLFVBQVUsQ0FBQy9CLElBQUtnQixFQUFnQixLQUFJYSxFQUFTLENBQUNHLFFBQVEsSUFBUS9ELE9BQU80QyxLQUFLLFNBQUFvQixHQUN2SC9DLEVBQVErQyxFQUFJQyxZQUNWLFNBQUFwQixHQUFPLE9BQUEzQixFQUFPMkIsS0FHakI1QixFQUFRLEdBR0x0QyxTQUFBK0MsY0FBY0MsS0FBS0MsVUFBVW1CLElBQWUsSUFDL0NqRSxpQkFBQStDLEtBQUtDLE9BQU8sQ0FDWEMsSUFBS3RELFdBQUF1RCxNQUFNQyxXQUFXQyxjQUN0QkMsS0FBTSxJQUFJQyxLQUNWNUMsS0FBTSxPQUNONkMsTUFBTyxrQkFDUEMsUUFBUyxTQUFXeEIsRUFBS3lCLEtBQU8sc0JBQXdCaEQsRUFDeERpRCxRQUFTTyxFQUNUTixPQUFRLGlCQUNSRixLQUFNekIsRUFBS3lCLEtBQ1hHLFVBQVcsS0FJWjVELGlCQUFBK0MsS0FBS0MsT0FBTyxDQUNYQyxJQUFLdEQsV0FBQXVELE1BQU1DLFdBQVdDLGNBQ3RCQyxLQUFNLElBQUlDLEtBQ1Y1QyxLQUFNLE9BQ042QyxNQUFPLGtCQUNQQyxRQUFTLFNBQVd4QixFQUFLeUIsS0FBTyxzQkFBd0JoRCxFQUN4RGlELFFBQVMsVUFDVEMsT0FBUSxpQkFDUkYsS0FBTXpCLEVBQUt5QixLQUNYRyxVQUFXLFdBTWRsQixRQUFRQyxJQUFJLHFCQUF1QmxDLEVBQVkyRCxFQUFRQyxJQUFLSixFQUFnQixLQUU1RWhFLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNaEIsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQStCLG1CQUFHSixRQUFRLENBQzdHcUUsS0FBTSxDQUNMLENBQUNDLFVBQVdQLEVBQVFuQixLQUNwQixDQUFDMkIsVUFBV1gsRUFBZ0IsUUFFM0JDLE9BQU9oRCxLQUFLLFNBQUNrRSxFQUFXQyxHQUMxQixJQUFJQyxFQUFlbEIsRUFBUW5CLElBRTNCLEdBQUlvQyxFQUFRLENBQ1gsSUFBSUUsRUFBYTFGLFNBQUEwRSxTQUFTSCxHQUUxQm1CLEVBQVd0QyxJQUFNLENBQ2hCQSxJQUFLbUIsRUFBUW5CLElBQ2JvQixJQUFLRCxFQUFRQyxLQUdkLElBQUltQixFQUFhM0YsU0FBQTRGLHdCQUF3QnhCLEVBQVlHLEVBQVNpQixHQUM5REcsRUFBV3ZDLElBQU1xQyxFQUNqQkUsRUFBV25CLE1BR1hwRSxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBWWlGLFdBQVcsQ0FBQ3pDLElBQUtxQyxHQUFlRSxHQUFZdEUsT0FBTzRDLEtBQUssU0FBQW9CLEdBQ3JHakYsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1oQixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBK0IsbUJBQUd1QyxPQUFPdUMsR0FBWXpCLEtBQUssU0FBQVUsR0FDN0h2RSxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR2dFLFdBQVcsQ0FDaEhDLEtBQU0sQ0FDTCxDQUFDQyxVQUFXWSxFQUFXdEMsSUFBSUEsS0FDM0IsQ0FBQzJCLFVBQVcsQ0FBQ0MsS0FBTVUsRUFBV3RDLElBQUlvQixJQUFNLE9BRXZDbkQsT0FFSGlCLEVBQVErQyxFQUFJQyxjQUVYLFNBQUFwQixHQUFPLE9BQUEzQixFQUFPMkIsVUFHakIzQixFQUFPLG9EQUFzRGdDLEVBQVFDLElBQU0sNEJBQThCSixFQUFnQixZQU01SDdCLEVBQU8rQixTQVVad0Isb0JBQXFCLENBQ3BCcEYsTUFBTyxJQUFJVCxlQUFBVSxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBpRixPQUFRLENBQ1BsRixLQUFNQyxRQUVQa0YsYUFBYyxDQUNibkYsS0FBTW9GLE9BRVBDLGlCQUFrQixDQUNqQnJGLEtBQU1HLE9BQ05DLFVBQVUsR0FFWGtGLE9BQVEsQ0FDUHRGLEtBQU11RixVQUdSbEYsU0FBVSxTQUFTTixFQUFvQm1GLEVBQWdCQyxFQUFxQkcsR0FBbEUsSUFBQWhFLEVBQUFDLEtBQ1QsT0FBTyxJQUFJQyxRQUFRLFNBQUNDLEVBQVNDLEdBQzVCbkMsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQVlKLFFBQVEsQ0FBQzRDLElBQUsyQyxJQUFTMUIsT0FBT2hELEtBQUssU0FBQ2lELEVBQVFDLEdBQ3pGLEdBQUlBLEVBQVMsQ0FDWixJQUFJOEIsRUFBY3JHLFNBQUEwRSxTQUFTSCxHQU0zQixHQUpBeUIsRUFBYU0sUUFBUSxTQUFBQyxHQUNwQkYsRUFBWUUsRUFBS0MsTUFBUUQsRUFBS0EsT0FHM0JGLEVBQVk3QixNQUFRMkIsRUFBUSxDQUMvQixJQUFJMUIsRUFBYXpFLFNBQUEwRSxTQUFTSCxHQUUxQkUsRUFBV3JCLElBQU0sQ0FDaEJBLElBQUttQixFQUFRbkIsSUFDYm9CLElBQUtELEVBQVFDLEtBR2QsSUFBSWhDLEVBQWUsS0FFbkIsSUFDQ3BDLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUF5QixZQUFFNkIsU0FBUzRELEdBRXZFLE1BQU8zRCxHQUNORixFQUFlRSxFQUNmUCxFQUFLUSxtQkFBbUJDLEtBQUtULEVBQU0saUJBQWtCLDBDQUE0Q3ZCLEVBQVksQ0FBQzRCLEVBQWM2RCxJQUc3SCxHQUFJN0QsRUFDSEssUUFBUUMsSUFBSU4sR0FDWkQsRUFBTyxxQkFFSCxDQUNKbkMsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1oQixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBK0IsbUJBQUd1QyxPQUFPc0IsR0FBWVIsS0FBSyxTQUFBVSxHQUM3SHZFLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNaEIsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQStCLG1CQUFHZ0UsV0FBVyxDQUNoSEMsS0FBTSxDQUNMLENBQUNDLFVBQVdQLEVBQVFuQixLQUNwQixDQUFDMkIsVUFBVyxDQUFDQyxLQUFNVCxFQUFRQyxJQUFNLE9BRWhDbkQsUUFDRCxTQUFBNkMsR0FDRnJCLFFBQVFDLElBQUlvQixLQUdiLElBQUllLEVBQVVqRixTQUFBa0YsZ0JBQWdCWCxFQUFTOEIsR0FBYSxHQUVoRHBCLEVBQ0g3RSxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBWXVFLFVBQVUsQ0FBQy9CLElBQUtpRCxFQUFZakQsS0FBTTZCLEVBQVMsQ0FBQ0csUUFBUSxJQUFRL0QsT0FBTzRDLEtBQUssU0FBQW9CLEdBQ3JIL0MsRUFBUStDLEVBQUlvQixLQUNWLFNBQUF2QyxHQUFPLE9BQUEzQixFQUFPMkIsS0FHakI1QixFQUFRLEdBR0x0QyxTQUFBK0MsY0FBY0MsS0FBS0MsVUFBVStDLElBQWlCLElBQ2pEN0YsaUJBQUErQyxLQUFLQyxPQUFPLENBQ1hDLElBQUt0RCxXQUFBdUQsTUFBTUMsV0FBV0MsY0FDdEJDLEtBQU0sSUFBSUMsS0FDVjVDLEtBQU0sT0FDTjZDLE1BQU8sd0JBQ1BDLFFBQVMsU0FBV3hCLEVBQUt5QixLQUFPLHNCQUF3QmhELEVBQWEsU0FBV21GLEVBQVMsY0FBcUJJLEVBQzlHdEMsUUFBU21DLEVBQ1RsQyxPQUFRLHNCQUNSRixLQUFNekIsRUFBS3lCLEtBQ1hHLFVBQVcsS0FJWjVELGlCQUFBK0MsS0FBS0MsT0FBTyxDQUNYQyxJQUFLdEQsV0FBQXVELE1BQU1DLFdBQVdDLGNBQ3RCQyxLQUFNLElBQUlDLEtBQ1Y1QyxLQUFNLE9BQ042QyxNQUFPLHdCQUNQQyxRQUFTLFNBQVd4QixFQUFLeUIsS0FBTyxzQkFBd0JoRCxFQUFhLFNBQVdtRixFQUFTLGNBQXFCSSxFQUM5R3RDLFFBQVMsVUFDVEMsT0FBUSxzQkFDUkYsS0FBTXpCLEVBQUt5QixLQUNYRyxVQUFXLFdBTWRsQixRQUFRQyxJQUFJLHFCQUF1QmxDLEVBQVkyRCxFQUFRQyxJQUFLMkIsR0FFNUQvRixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR0osUUFBUSxDQUM3R3FFLEtBQU0sQ0FDTCxDQUFDQyxVQUFXUCxFQUFRbkIsS0FDcEIsQ0FBQzJCLFVBQVdvQixNQUVYOUIsT0FBT2hELEtBQUssU0FBQ2tFLEVBQVdDLEdBQzFCLElBQUlDLEVBQWVsQixFQUFRbkIsSUFFM0IsR0FBSW9DLEVBQVEsQ0FDWCxJQUFJa0IsRUFBYTFHLFNBQUEwRSxTQUFTSCxHQUUxQm1DLEVBQVd0RCxJQUFNLENBQ2hCQSxJQUFLbUIsRUFBUW5CLElBQ2JvQixJQUFLRCxFQUFRQyxLQUdkLElBQUltQixFQUFhM0YsU0FBQTRGLHdCQUF3QlMsRUFBYTlCLEVBQVNpQixHQUMvREcsRUFBV3ZDLElBQU1xQyxFQUNqQkUsRUFBV25CLE1BRVhwRSxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBWWlGLFdBQVcsQ0FBQ3pDLElBQUtxQyxHQUFlRSxHQUFZdEUsT0FBTzRDLEtBQUssU0FBQW9CLEdBQ3JHakYsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1oQixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBK0IsbUJBQUd1QyxPQUFPdUQsR0FBWXpDLEtBQUssU0FBQVUsR0FDN0h2RSxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR2dFLFdBQVcsQ0FDaEhDLEtBQU0sQ0FDTCxDQUFDQyxVQUFXNEIsRUFBV3RELElBQUlBLEtBQzNCLENBQUMyQixVQUFXLENBQUNDLEtBQU0wQixFQUFXdEQsSUFBSW9CLElBQU0sT0FFdkNuRCxRQUNELFNBQUE2QyxHQUNGckIsUUFBUUMsSUFBSW9CLEtBR2I1QixFQUFRK0MsRUFBSUMsWUFDVixTQUFBcEIsR0FBTyxPQUFBM0IsRUFBTzJCLFVBR2pCM0IsRUFBTywwREFBNERnQyxFQUFRQyxJQUFNLDRCQUE4QjZCLEVBQVk3QixZQU05SGpDLEVBQU8rQixTQU1acUMsc0JBQXVCLENBQ3RCakcsTUFBTyxJQUFJVCxlQUFBVSxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBzRCxXQUFZLENBQ1h2RCxLQUFNRyxPQUNOQyxVQUFVLEdBRVgyRixjQUFlLENBQ2QvRixLQUFNRyxPQUNOQyxVQUFVLEtBR1pDLFNBQVUsU0FBU04sRUFBb0J3RCxFQUFvQndDLEdBQWpELElBQUF6RSxFQUFBQyxLQUNULE9BQU8sSUFBSUMsUUFBUSxTQUFDQyxFQUFTQyxHQUM1Qm5DLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUFZSixRQUFRLENBQUM0QyxJQUFLZ0IsRUFBZ0IsTUFBSUMsT0FBT2hELEtBQUssU0FBQ2lELEVBQVFDLEdBQ3BHLEdBQUlBLEVBQ0gsR0FBSUEsRUFBUUMsTUFBUUosRUFBZ0IsSUFBRyxDQUV0QyxJQUFJSyxFQUFhekUsU0FBQTBFLFNBQVNILEdBRTFCRSxFQUFXckIsSUFBTSxDQUNoQkEsSUFBS21CLEVBQVFuQixJQUNib0IsSUFBS0QsRUFBUUMsS0FHZCxJQUFJaEMsRUFBZSxLQUVuQixJQUNDcEMsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQXlCLFlBQUU2QixTQUFTMkIsR0FFdkUsTUFBTzFCLEdBQ05GLEVBQWVFLEVBQ2ZQLEVBQUtRLG1CQUFtQkMsS0FBS1QsRUFBTSxpQkFBa0IscUNBQXVDdkIsRUFBWSxDQUFDNEIsRUFBYzRCLElBR3hILEdBQUk1QixFQUNISyxRQUFRQyxJQUFJTixHQUNaRCxFQUFPLHFCQUVILENBQ0puQyxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR3VDLE9BQU9zQixHQUFZUixLQUFLLFNBQUFVLEdBQzdIdkUsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1oQixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBK0IsbUJBQUdnRSxXQUFXLENBQ2hIQyxLQUFNLENBQ0wsQ0FBQ0MsVUFBV1AsRUFBUW5CLEtBQ3BCLENBQUMyQixVQUFXLENBQUNDLEtBQU1ULEVBQVFDLElBQU0sT0FFaENuRCxRQUNELFNBQUE2QyxHQUNGckIsUUFBUUMsSUFBSW9CLEtBR2IsSUFBSWUsRUFBVWpGLFNBQUFrRixnQkFBZ0JYLEVBQVNILEdBQVksR0FFL0NhLEVBQ0g3RSxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBWXVFLFVBQVUsQ0FBQy9CLElBQUtnQixFQUFnQixLQUFJYSxFQUFTLENBQUNHLFFBQVEsSUFBUS9ELE9BQU80QyxLQUFLLFNBQUFvQixHQUN2SC9DLEVBQVErQyxFQUFJQyxZQUNWLFNBQUFwQixHQUFPLE9BQUEzQixFQUFPMkIsS0FHakI1QixFQUFRLEdBR0x0QyxTQUFBK0MsY0FBY0MsS0FBS0MsVUFBVW1CLElBQWUsSUFDL0NqRSxpQkFBQStDLEtBQUtDLE9BQU8sQ0FDWEMsSUFBS3RELFdBQUF1RCxNQUFNQyxXQUFXQyxjQUN0QkMsS0FBTSxJQUFJQyxLQUNWNUMsS0FBTSxPQUNONkMsTUFBTyxrQkFDUEMsUUFBUyxTQUFXeEIsRUFBS3lCLEtBQU8sc0JBQXdCaEQsRUFDeERpRCxRQUFTTyxFQUNUTixPQUFRLHdCQUNSRixLQUFNekIsRUFBS3lCLEtBQ1hHLFVBQVcsS0FJWjVELGlCQUFBK0MsS0FBS0MsT0FBTyxDQUNYQyxJQUFLdEQsV0FBQXVELE1BQU1DLFdBQVdDLGNBQ3RCQyxLQUFNLElBQUlDLEtBQ1Y1QyxLQUFNLE9BQ042QyxNQUFPLGtCQUNQQyxRQUFTLFNBQVd4QixFQUFLeUIsS0FBTyxzQkFBd0JoRCxFQUN4RGlELFFBQVMsVUFDVEMsT0FBUSx3QkFDUkYsS0FBTXpCLEVBQUt5QixLQUNYRyxVQUFXLFVBS1YsQ0FDSmxCLFFBQVFDLElBQUkscUJBQXVCbEMsRUFBWTJELEVBQVFDLElBQUtKLEVBQWdCLEtBRTVFLElBQUlxQixFQUFlbEIsRUFBUW5CLElBRTNCLEdBQUl3RCxFQUFlLENBQ2xCLElBQUlDLEVBQWE3RyxTQUFBMEUsU0FBU0gsR0FFMUJzQyxFQUFXekQsSUFBTSxDQUNoQkEsSUFBS21CLEVBQVFuQixJQUNib0IsSUFBS0QsRUFBUUMsS0FHZCxJQUFJbUIsRUFBYTNGLFNBQUE0Rix3QkFBd0J4QixFQUFZRyxFQUFTcUMsR0FDOURqQixFQUFXdkMsSUFBTXFDLEVBQ2pCRSxFQUFXbkIsTUFFWHBFLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUFZaUYsV0FBVyxDQUFDekMsSUFBS3FDLEdBQWVFLEdBQVl0RSxPQUFPNEMsS0FBSyxTQUFBb0IsR0FDckdqRixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR3VDLE9BQU8wRCxHQUFZNUMsS0FBSyxTQUFBVSxHQUM3SHZFLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNaEIsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQStCLG1CQUFHZ0UsV0FBVyxDQUNoSEMsS0FBTSxDQUNMLENBQUNDLFVBQVcrQixFQUFXekQsSUFBSUEsS0FDM0IsQ0FBQzJCLFVBQVcsQ0FBQ0MsS0FBTTZCLEVBQVd6RCxJQUFJb0IsSUFBTSxPQUV2Q25ELFFBQ0QsU0FBQTZDLEdBQ0ZyQixRQUFRQyxJQUFJb0IsS0FFYjVCLEVBQVErQyxFQUFJQyxZQUNWLFNBQUFwQixHQUFPLE9BQUEzQixFQUFPMkIsVUFHakIzQixFQUFPLDhEQUFnRWdDLEVBQVFDLElBQU0sNEJBQThCSixFQUFnQixVQUtySTdCLEVBQU8rQixTQVVad0MsMkJBQTRCLENBQzNCcEcsTUFBTyxJQUFJVCxlQUFBVSxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBpRixPQUFRLENBQ1BsRixLQUFNQyxRQUVQa0YsYUFBYyxDQUNibkYsS0FBTW9GLE9BRVBDLGlCQUFrQixDQUNqQnJGLEtBQU1HLE9BQ05DLFVBQVUsR0FFWGtGLE9BQVEsQ0FDUHRGLEtBQU11RixRQUVQUSxjQUFlLENBQ2QvRixLQUFNRyxPQUNOQyxVQUFVLEtBR1pDLFNBQVUsU0FBU04sRUFBb0JtRixFQUFnQkMsRUFBcUJHLEVBQWdCUyxHQUFsRixJQUFBekUsRUFBQUMsS0FDVCxPQUFPLElBQUlDLFFBQVEsU0FBQ0MsRUFBU0MsR0FDNUJuQyxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBWUosUUFBUSxDQUFDNEMsSUFBSzJDLElBQVMxQixPQUFPaEQsS0FBSyxTQUFDaUQsRUFBUUMsR0FDekYsR0FBSUEsRUFBUyxDQUNaLElBQUl3QyxFQUFjL0csU0FBQTBFLFNBQVNILEdBTTNCLEdBSkF5QixFQUFhTSxRQUFRLFNBQUFDLEdBQ3BCUSxFQUFZUixFQUFLQyxNQUFRRCxFQUFLQSxPQUczQlEsRUFBWXZDLE1BQVEyQixFQUFRLENBQy9CLElBQUkxQixFQUFhekUsU0FBQTBFLFNBQVNILEdBRTFCRSxFQUFXckIsSUFBTSxDQUNoQkEsSUFBS21CLEVBQVFuQixJQUNib0IsSUFBS0QsRUFBUUMsS0FHZCxJQUFJaEMsRUFBZSxLQUVuQixJQUNDcEMsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQXlCLFlBQUU2QixTQUFTc0UsR0FFdkUsTUFBT3JFLEdBQ05GLEVBQWVFLEVBQ2ZQLEVBQUtRLG1CQUFtQkMsS0FBS1QsRUFBTSxpQkFBa0IsMENBQTRDdkIsRUFBWSxDQUFDNEIsRUFBY3VFLElBRzdILEdBQUl2RSxFQUNISyxRQUFRQyxJQUFJTixHQUNaRCxFQUFPLHFCQUVILENBQ0puQyxRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR3VDLE9BQU9zQixHQUFZUixLQUFLLFNBQUFVLEdBQzdIdkUsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1oQixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTVIsR0FBK0IsbUJBQUdnRSxXQUFXLENBQ2hIQyxLQUFNLENBQ0wsQ0FBQ0MsVUFBV1AsRUFBUW5CLEtBQ3BCLENBQUMyQixVQUFXLENBQUNDLEtBQU1ULEVBQVFDLElBQU0sT0FFaENuRCxRQUNELFNBQUE2QyxHQUNGckIsUUFBUUMsSUFBSW9CLEtBR2IsSUFBSWUsRUFBVWpGLFNBQUFrRixnQkFBZ0JYLEVBQVN3QyxHQUFhLEdBRWhEOUIsRUFDSDdFLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUFZdUUsVUFBVSxDQUFDL0IsSUFBSzJELEVBQVkzRCxLQUFNNkIsRUFBUyxDQUFDRyxRQUFRLElBQVEvRCxPQUFPNEMsS0FBSyxTQUFBb0IsR0FDckgvQyxFQUFRK0MsRUFBSW9CLEtBQ1YsU0FBQXZDLEdBQU8sT0FBQTNCLEVBQU8yQixLQUdqQjVCLEVBQVEsR0FHTHRDLFNBQUErQyxjQUFjQyxLQUFLQyxVQUFVK0MsSUFBaUIsSUFDakQ3RixpQkFBQStDLEtBQUtDLE9BQU8sQ0FDWEMsSUFBS3RELFdBQUF1RCxNQUFNQyxXQUFXQyxjQUN0QkMsS0FBTSxJQUFJQyxLQUNWNUMsS0FBTSxPQUNONkMsTUFBTyx3QkFDUEMsUUFBUyxTQUFXeEIsRUFBS3lCLEtBQU8sc0JBQXdCaEQsRUFBYSxTQUFXbUYsRUFBUyxjQUFxQkksRUFDOUd0QyxRQUFTbUMsRUFDVGxDLE9BQVEsNkJBQ1JGLEtBQU16QixFQUFLeUIsS0FDWEcsVUFBVyxLQUlaNUQsaUJBQUErQyxLQUFLQyxPQUFPLENBQ1hDLElBQUt0RCxXQUFBdUQsTUFBTUMsV0FBV0MsY0FDdEJDLEtBQU0sSUFBSUMsS0FDVjVDLEtBQU0sT0FDTjZDLE1BQU8sd0JBQ1BDLFFBQVMsU0FBV3hCLEVBQUt5QixLQUFPLHNCQUF3QmhELEVBQWEsU0FBV21GLEVBQVMsY0FBcUJJLEVBQzlHdEMsUUFBUyxVQUNUQyxPQUFRLDZCQUNSRixLQUFNekIsRUFBS3lCLEtBQ1hHLFVBQVcsVUFLVixDQUNKbEIsUUFBUUMsSUFBSSxxQkFBdUJsQyxFQUFZMkQsRUFBUUMsSUFBSzJCLEdBRTVELElBQUlWLEVBQWVsQixFQUFRbkIsSUFFM0IsR0FBSXdELEVBQWUsQ0FDbEIsSUFBSUksRUFBYWhILFNBQUEwRSxTQUFTSCxHQUUxQnlDLEVBQVc1RCxJQUFNLENBQ2hCQSxJQUFLbUIsRUFBUW5CLElBQ2JvQixJQUFLRCxFQUFRQyxLQUdkLElBQUltQixFQUFhM0YsU0FBQTRGLHdCQUF3Qm1CLEVBQWF4QyxFQUFTcUMsR0FDL0RqQixFQUFXdkMsSUFBTXFDLEVBQ2pCRSxFQUFXbkIsTUFFWHBFLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUFZaUYsV0FBVyxDQUFDekMsSUFBS3FDLEdBQWVFLEdBQVl0RSxPQUFPNEMsS0FBSyxTQUFBb0IsR0FDckdqRixRQUFBTyxRQUFnQlEsWUFBWUMsTUFBTWhCLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNUixHQUErQixtQkFBR3VDLE9BQU82RCxHQUFZL0MsS0FBSyxTQUFBVSxHQUM3SHZFLFFBQUFPLFFBQWdCUSxZQUFZQyxNQUFNaEIsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQStCLG1CQUFHZ0UsV0FBVyxDQUNoSEMsS0FBTSxDQUNMLENBQUNDLFVBQVdrQyxFQUFXNUQsSUFBSUEsS0FDM0IsQ0FBQzJCLFVBQVcsQ0FBQ0MsS0FBTWdDLEVBQVc1RCxJQUFJb0IsSUFBTSxPQUV2Q25ELFFBQ0QsU0FBQTZDLEdBQ0ZyQixRQUFRQyxJQUFJb0IsS0FFYjVCLEVBQVErQyxFQUFJQyxZQUNWLFNBQUFwQixHQUFPLE9BQUEzQixFQUFPMkIsVUFHakIzQixFQUFPLG9FQUFzRWdDLEVBQVFDLElBQU0sNEJBQThCdUMsRUFBWXZDLFdBS3ZJakMsRUFBTytCLFNBVVoyQyxlQUFnQixDQUNmdkcsTUFBTyxJQUFJVCxlQUFBVSxRQUFhLENBQ3ZCQyxXQUFZLENBQ1hDLEtBQU1DLFFBRVBpRixPQUFRLENBQ1BsRixLQUFNQyxVQUdSSSxTQUFVLFNBQVNOLEVBQW9CbUYsR0FBN0IsSUFBQTVELEVBQUFDLEtBQ1QsT0FBTyxJQUFJQyxRQUFRLFNBQUNDLEVBQVNDLEdBRTVCcEMsaUJBQUErQyxLQUFLQyxPQUFPLENBQ1hDLElBQUt0RCxXQUFBdUQsTUFBTUMsV0FBV0MsY0FDdEJDLEtBQU0sSUFBSUMsS0FDVjVDLEtBQU0sT0FDTjZDLE1BQU8sa0JBQ1BDLFFBQVMsU0FBV3hCLEVBQUt5QixLQUFPLHNCQUF3QmhELEVBQ3hEaUQsUUFBUyxDQUFDVCxJQUFLMkMsR0FDZmpDLE9BQVEsaUJBQ1JGLEtBQU16QixFQUFLeUIsS0FDWEcsVUFBVyxLQUdaM0QsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQVlzRyxVQUFVLENBQUM5RCxJQUFLMkMsSUFBUzFFLEtBQUssU0FBQzZDLEVBQUttQixHQUM3RW5CLEVBQ0gzQixFQUFPMkIsR0FHUDVCLEVBQVErQyxFQUFJb0IsVUFNakJVLHdCQUF5QixDQUN4QnpHLE1BQU8sSUFBSVQsZUFBQVUsUUFBYSxDQUN2QkMsV0FBWSxDQUNYQyxLQUFNQyxRQUVQQyxNQUFPLENBQ05GLEtBQU1HLE9BQ05DLFVBQVUsS0FHWkMsU0FBVSxTQUFTTixFQUFvQkcsR0FBN0IsSUFBQW9CLEVBQUFDLEtBQ1QsT0FBTyxJQUFJQyxRQUFRLFNBQUNDLEVBQVNDLEdBRTVCcEMsaUJBQUErQyxLQUFLQyxPQUFPLENBQ1hDLElBQUt0RCxXQUFBdUQsTUFBTUMsV0FBV0MsY0FDdEJDLEtBQU0sSUFBSUMsS0FDVjVDLEtBQU0sT0FDTjZDLE1BQU8sMEJBQ1BDLFFBQVMsU0FBV3hCLEVBQUt5QixLQUFPLHNCQUF3QmhELEVBQ3hEaUQsUUFBUyxDQUFDVCxJQUFLckMsR0FDZitDLE9BQVEsMEJBQ1JGLEtBQU16QixFQUFLeUIsS0FDWEcsVUFBVyxLQUdaM0QsUUFBQU8sUUFBZ0JRLFlBQVlDLE1BQU1SLEdBQVlzRyxVQUFVbkcsR0FBT00sS0FBSyxTQUFDNkMsRUFBS21CLEdBQ3JFbkIsRUFDSDNCLEVBQU8yQixHQUdQNUIsRUFBUStDLEVBQUlvQixZQXp3Qm5CVyxRQUFBL0csc0JBQUFBIiwiZmlsZSI6Im1ldGhvZHMvY29sbGVjdGlvbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEb2N1bWVudCwgVHlwZXN9IGZyb20gJ21vbmdvb3NlJztcbmltcG9ydCB7IE1ldGhvZE1hbmFnZXIgfSBmcm9tICcuLi9tYW5hZ2Vycy9tZXRob2QubWFuYWdlcic7XG5pbXBvcnQgeyBnZXRNb25nb1VwZGF0ZXMsIGRlZXBDb3B5LCBnZXRNb25nb01lcmdlVXBkYXRlZERvYywgZ2V0QmluYXJ5U2l6ZSB9IGZyb20gJy4uL3V0aWwvY29tbW9uJztcbmltcG9ydCBTaW1wbGVTY2hlbWEgZnJvbSAnc2ltcGwtc2NoZW1hJztcbmltcG9ydCB7IFBhZ2luYXRpb25PcHRpb25zU2NoZW1hLCBQYWdpbmF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscy9wYWdpbmF0aW9uLm1vZGVsJztcbmltcG9ydCB7IExvZ3MgfSBmcm9tICcuLi9jb2xsZWN0aW9ucy9sb2cuY29sbGVjdGlvbic7XG5pbXBvcnQgUmVzb2x2ZUlPU2VydmVyIGZyb20gJy4uL2luZGV4JztcblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRDb2xsZWN0aW9uTWV0aG9kcyhtZXRob2RNYW5hZ2VyOiBNZXRob2RNYW5hZ2VyKSB7XG5cdG1ldGhvZE1hbmFnZXIubWV0aG9kcyh7XG5cdFx0Ly8gUXVlcnkgZGF0YWJhc2UgZm9yIGFueSBjb2xsZWN0aW9uIGFuZCBxdWVyeVxuXHRcdGZpbmRPbmU6IHtcblx0XHRcdHNraXBRdWV1ZTogdHJ1ZSxcblx0XHRcdGNoZWNrOiBuZXcgU2ltcGxlU2NoZW1hKHtcblx0XHRcdFx0Y29sbGVjdGlvbjoge1xuXHRcdFx0XHRcdHR5cGU6IFN0cmluZ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRxdWVyeToge1xuXHRcdFx0XHRcdHR5cGU6IE9iamVjdCxcblx0XHRcdFx0XHRibGFja2JveDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGZ1bmN0aW9uOiBmdW5jdGlvbihjb2xsZWN0aW9uOiBzdHJpbmcsIHF1ZXJ5OiBPYmplY3QpIHtcblx0XHRcdFx0cmV0dXJuIFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5maW5kT25lKHF1ZXJ5KS5leGVjKCk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRmaW5kOiB7XG5cdFx0XHRza2lwUXVldWU6IHRydWUsXG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0c29ydDoge1xuXHRcdFx0XHRcdHR5cGU6IE9iamVjdCxcblx0XHRcdFx0XHRibGFja2JveDogdHJ1ZSxcblx0XHRcdFx0XHRvcHRpb25hbDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGZ1bmN0aW9uOiBmdW5jdGlvbihjb2xsZWN0aW9uOiBzdHJpbmcsIHF1ZXJ5OiBPYmplY3QsIHNvcnRRdWVyeTogT2JqZWN0ID0ge30pIHtcblx0XHRcdFx0cmV0dXJuIFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5maW5kKHF1ZXJ5KS5zb3J0KHNvcnRRdWVyeSkuZXhlYygpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0ZmluZFdpdGhPcHRpb25zOiB7XG5cdFx0XHRza2lwUXVldWU6IHRydWUsXG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRcdHR5cGU6IFBhZ2luYXRpb25PcHRpb25zU2NoZW1hXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgcXVlcnk6IE9iamVjdCwgb3B0aW9uczogUGFnaW5hdGlvbk9wdGlvbnMpIHtcblx0XHRcdFx0cmV0dXJuIFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5maW5kKHF1ZXJ5KS5zb3J0KG9wdGlvbnMuc29ydCkubGltaXQob3B0aW9ucy5saW1pdCkuc2tpcChvcHRpb25zLnNraXApLnNlbGVjdChvcHRpb25zLmZpZWxkcykuZXhlYygpO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0Ly8gSW5zZXJ0IDEgZG9jdW1lbnRcblx0XHQvLyBASW5wdXRzOiBjb2xsZWN0aW9uLCBkb2N1bWVudFxuXHRcdC8vIEBPdXRwdXRzOiByZXMgPSBfaWQgb2YgbmV3IGRvY3VtZW50LCBlcnIgPSBub3QgaW5zZXJ0ZWRcblx0XHRpbnNlcnREb2N1bWVudDoge1xuXHRcdFx0Y2hlY2s6IG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRjb2xsZWN0aW9uOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRvY3VtZW50OiB7XG5cdFx0XHRcdFx0dHlwZTogT2JqZWN0LFxuXHRcdFx0XHRcdGJsYWNrYm94OiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgZG9jdW1lbnQ6IE9iamVjdCkge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXG5cdFx0XHRcdFx0bGV0IHNjaGVtYUVycm9ycyA9IG51bGw7XG5cblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWydzaW1wbHNjaGVtYSddLnZhbGlkYXRlKGRvY3VtZW50KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Y2F0Y2ggKGVycm9ycykge1xuXHRcdFx0XHRcdFx0c2NoZW1hRXJyb3JzID0gZXJyb3JzO1xuXHRcdFx0XHRcdFx0dGhpcy5jYWxsTWV0aG9kSW50ZXJuYWwuY2FsbCh0aGlzLCAnaW5zZXJ0RXJyb3JMb2cnLCAnU2NoZW1hIEZhaWxlZCBvbiBpbnNlcnQgLSAnICsgY29sbGVjdGlvbiwgW3NjaGVtYUVycm9ycywgZG9jdW1lbnRdKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XG5cdFx0XHRcdFx0aWYgKHNjaGVtYUVycm9ycykge1xuXHRcdFx0XHRcdFx0Y29uc29sZS5sb2coc2NoZW1hRXJyb3JzKTtcblx0XHRcdFx0XHRcdHJlamVjdCgnU2NoZW1hIEVycm9ycycpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdGlmIChnZXRCaW5hcnlTaXplKEpTT04uc3RyaW5naWZ5KGRvY3VtZW50KSkgPCAyMDAwMDApIHtcblx0XHRcdFx0XHRcdFx0TG9ncy5jcmVhdGUoe1xuXHRcdFx0XHRcdFx0XHRcdF9pZDogVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpLFxuXHRcdFx0XHRcdFx0XHRcdGRhdGU6IG5ldyBEYXRlKCksXG5cdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2luZm8nLFxuXHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAnSW5zZXJ0IERvY3VtZW50Jyxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiAnVXNlcjogJyArIHRoaXMudXNlciArICcsIENvbGxlY3Rpb24gVHlwZTogJyArIGNvbGxlY3Rpb24sXG5cdFx0XHRcdFx0XHRcdFx0cGF5bG9hZDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAnaW5zZXJ0RG9jdW1lbnQnLFxuXHRcdFx0XHRcdFx0XHRcdHVzZXI6IHRoaXMudXNlcixcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSWQ6ICcnXG5cdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdpbmZvJyxcblx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ0luc2VydCBEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogJ1VzZXI6ICcgKyB0aGlzLnVzZXIgKyAnLCBDb2xsZWN0aW9uIFR5cGU6ICcgKyBjb2xsZWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6ICdUb28gQmlnJyxcblx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICdpbnNlcnREb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0dXNlcjogdGhpcy51c2VyLFxuXHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogJydcblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxldCBpZCA9IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKTtcblx0XHRcdFx0XHRcdGRvY3VtZW50WydfaWQnXSA9IGlkO1xuXHRcdFx0XHRcdFx0ZG9jdW1lbnRbJ19fdiddID0gMDtcblx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5jcmVhdGUoZG9jdW1lbnQpLnRoZW4oKCkgPT4gcmVzb2x2ZShpZCksIGVyciA9PiByZWplY3QoZXJyKSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIFJlcGxhY2VzIDEgZG9jdW1lbnQgd2l0aCBuZXcgZG9jdW1lbnQgKGZyb20gX2lkKVxuXHRcdC8vIEBJbnB1dHM6IGNvbGxlY3Rpb24sIGRvY3VtZW50IGlkXG5cdFx0Ly8gQE91dHB1dHM6IHJlcyA9IDEgKHVwZGF0ZWQgMSksIHJlcyA9IDAgKG5vdCB1cGRhdGVkKSwgZXJyID0gbm90IHVwZGF0ZWQvd3JvbmcgdmVyc2lvblxuXHRcdC8vIFNlYXJjaCBmb3IgZG9jLCBjaGVjayB2ZXJzaW9uLCBpZiBmb3VuZCB0aGVuIHRyeSBhbmQgdXBkYXRlXG5cdFx0dXBkYXRlRG9jdW1lbnQ6IHtcblx0XHRcdGNoZWNrOiBuZXcgU2ltcGxlU2NoZW1hKHtcblx0XHRcdFx0Y29sbGVjdGlvbjoge1xuXHRcdFx0XHRcdHR5cGU6IFN0cmluZ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRmX2RvY3VtZW50OiB7XG5cdFx0XHRcdFx0dHlwZTogT2JqZWN0LFxuXHRcdFx0XHRcdGJsYWNrYm94OiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgZl9kb2N1bWVudDogT2JqZWN0KSB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pLmZpbmRPbmUoe19pZDogZl9kb2N1bWVudFsnX2lkJ119KS5sZWFuKCkuZXhlYygoZXJyRG9jLCBjdXJyRG9jKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoY3VyckRvYykge1xuXHRcdFx0XHRcdFx0XHRpZiAoY3VyckRvYy5fX3YgPT09IGZfZG9jdW1lbnRbJ19fdiddKSB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHZlcnNpb25Eb2MgPSBkZWVwQ29weShjdXJyRG9jKTtcblxuXHRcdFx0XHRcdFx0XHRcdHZlcnNpb25Eb2MuX2lkID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBjdXJyRG9jLl9pZCxcblx0XHRcdFx0XHRcdFx0XHRcdF9fdjogY3VyckRvYy5fX3Zcblx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNjaGVtYUVycm9ycyA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWydzaW1wbHNjaGVtYSddLnZhbGlkYXRlKGZfZG9jdW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjYXRjaCAoZXJyb3JzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzY2hlbWFFcnJvcnMgPSBlcnJvcnM7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmNhbGxNZXRob2RJbnRlcm5hbC5jYWxsKHRoaXMsICdpbnNlcnRFcnJvckxvZycsICdTY2hlbWEgRmFpbGVkIG9uIHVwZGF0ZURvY3VtZW50IC0gJyArIGNvbGxlY3Rpb24sIFtzY2hlbWFFcnJvcnMsIGZfZG9jdW1lbnRdKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNjaGVtYUVycm9ycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coc2NoZW1hRXJyb3JzKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdCgnU2NoZW1hIEVycm9ycycpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmNyZWF0ZSh2ZXJzaW9uRG9jKS50aGVuKGRvYyA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmRlbGV0ZU1hbnkoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRhbmQ6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9pZCc6IGN1cnJEb2MuX2lkfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IHskbHRlOiBjdXJyRG9jLl9fdiAtIDR9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZXhlYygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSwgZXJyID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coZXJyKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdXBkYXRlcyA9IGdldE1vbmdvVXBkYXRlcyhjdXJyRG9jLCBmX2RvY3VtZW50LCB0cnVlKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKHVwZGF0ZXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pLnVwZGF0ZU9uZSh7X2lkOiBmX2RvY3VtZW50WydfaWQnXX0sIHVwZGF0ZXMsIHtzdHJpY3Q6IGZhbHNlfSkuZXhlYygpLnRoZW4ocmVzID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHJlcy5uTW9kaWZpZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LCBlcnIgPT4gcmVqZWN0KGVycikpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChnZXRCaW5hcnlTaXplKEpTT04uc3RyaW5naWZ5KGZfZG9jdW1lbnQpKSA8IDIwMDAwMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdVcGRhdGUgRG9jdW1lbnQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkOiBmX2RvY3VtZW50LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogJ3VwZGF0ZURvY3VtZW50Jyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdVcGRhdGUgRG9jdW1lbnQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkOiAnVG9vIEJpZycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAndXBkYXRlRG9jdW1lbnQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXI6IHRoaXMudXNlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSWQ6ICcnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZygnaW52YWxpZCB2ZXJzaW9uIC0gJyArIGNvbGxlY3Rpb24sIGN1cnJEb2MuX192LCBmX2RvY3VtZW50WydfX3YnXSk7XG5cblx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoUmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWyd2ZXJzaW9uQ29sbGVjdGlvbiddKS5maW5kT25lKHtcblx0XHRcdFx0XHRcdFx0XHRcdCRhbmQ6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0eydfaWQuX2lkJzogY3VyckRvYy5faWR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5fX3YnOiBmX2RvY3VtZW50WydfX3YnXX1cblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9KS5sZWFuKCkuZXhlYygoZXJyT2xkRG9jLCBvbGREb2MpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBuZXdDdXJyRG9jSWQgPSBjdXJyRG9jLl9pZDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9sZERvYykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdmVyc2lvbkRvYyA9IGRlZXBDb3B5KGN1cnJEb2MpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZlcnNpb25Eb2MuX2lkID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdF9pZDogY3VyckRvYy5faWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X192OiBjdXJyRG9jLl9fdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCB1cGRhdGVkRG9jID0gZ2V0TW9uZ29NZXJnZVVwZGF0ZWREb2MoZl9kb2N1bWVudCwgY3VyckRvYywgb2xkRG9jKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlZERvYy5faWQgPSBuZXdDdXJyRG9jSWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHVwZGF0ZWREb2MuX192Kys7XG5cdFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5yZXBsYWNlT25lKHtfaWQ6IG5ld0N1cnJEb2NJZH0sIHVwZGF0ZWREb2MpLmV4ZWMoKS50aGVuKHJlcyA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuY3JlYXRlKHZlcnNpb25Eb2MpLnRoZW4oZG9jID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmRlbGV0ZU1hbnkoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkYW5kOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0eydfaWQuX2lkJzogdmVyc2lvbkRvYy5faWQuX2lkfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5fX3YnOiB7JGx0ZTogdmVyc2lvbkRvYy5faWQuX192IC0gNH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pLmV4ZWMoKTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZShyZXMubk1vZGlmaWVkKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSwgZXJyID0+IHJlamVjdChlcnIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZWplY3QoJ0ludmFsaWQgVmVyc2lvbiBBbmQgQ291bGQgTm90IEZpbmQgSGlzdG9yeSAtIERCOiAnICsgY3VyckRvYy5fX3YgKyAnLCBUcnlpbmcgdG8gdXBkYXRlIHdpdGggOicgKyBmX2RvY3VtZW50WydfX3YnXSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZWplY3QoZXJyRG9jKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHQvLyBVcGRhdGVzIDEgZG9jdW1lbnQncyBwcm9wcyAoZnJvbSBfaWQpXG5cdFx0Ly8gQElucHV0czogY29sbGVjdGlvbiwgZG9jdW1lbnQgaWQsIGRvY3VtZW50IHZlcnNpb24sIHVwZGF0ZSBwYXJhbXRlcnMgKHtwcm9wOiAneHh4JywgZGF0YTogJ3l5eX0pXG5cdFx0Ly8gQE91dHB1dHM6IHJlcyA9IDEgKHVwZGF0ZWQgMSksIHJlcyA9IDAgKG5vdCB1cGRhdGVkKSwgZXJyID0gbm90IHVwZGF0ZWQvd3JvbmcgdmVyc2lvblxuXHRcdC8vIFNlYXJjaCBmb3IgZG9jLCBjaGVjayB2ZXJzaW9uLCBpZiBmb3VuZCB0aGVuIHRyeSBhbmQgdXBkYXRlIHByb3BzXG5cdFx0dXBkYXRlRG9jdW1lbnRQcm9wczoge1xuXHRcdFx0Y2hlY2s6IG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRjb2xsZWN0aW9uOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRvY19pZDoge1xuXHRcdFx0XHRcdHR5cGU6IFN0cmluZ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR1cGRhdGVQYXJhbXM6IHtcblx0XHRcdFx0XHR0eXBlOiBBcnJheVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQndXBkYXRlUGFyYW1zLiQnOiB7XG5cdFx0XHRcdFx0dHlwZTogT2JqZWN0LFxuXHRcdFx0XHRcdGJsYWNrYm94OiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRvY19fdjoge1xuXHRcdFx0XHRcdHR5cGU6IE51bWJlclxuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGZ1bmN0aW9uOiBmdW5jdGlvbihjb2xsZWN0aW9uOiBzdHJpbmcsIGRvY19pZDogc3RyaW5nLCB1cGRhdGVQYXJhbXM6IGFueVtdLCBkb2NfX3Y6IG51bWJlcikge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5maW5kT25lKHtfaWQ6IGRvY19pZH0pLmxlYW4oKS5leGVjKChlcnJEb2MsIGN1cnJEb2M6IERvY3VtZW50KSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoY3VyckRvYykge1xuXHRcdFx0XHRcdFx0XHRsZXQgbW9kaWZpZWREb2MgPSBkZWVwQ29weShjdXJyRG9jKTtcblxuXHRcdFx0XHRcdFx0XHR1cGRhdGVQYXJhbXMuZm9yRWFjaChkYXRhID0+IHtcblx0XHRcdFx0XHRcdFx0XHRtb2RpZmllZERvY1tkYXRhLnByb3BdID0gZGF0YS5kYXRhO1xuXHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAobW9kaWZpZWREb2MuX192ID09PSBkb2NfX3YpIHtcblx0XHRcdFx0XHRcdFx0XHRsZXQgdmVyc2lvbkRvYyA9IGRlZXBDb3B5KGN1cnJEb2MpO1xuXHRcblx0XHRcdFx0XHRcdFx0XHR2ZXJzaW9uRG9jLl9pZCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdF9pZDogY3VyckRvYy5faWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRfX3Y6IGN1cnJEb2MuX192XG5cdFx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHNjaGVtYUVycm9ycyA9IG51bGw7XG5cdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3NpbXBsc2NoZW1hJ10udmFsaWRhdGUobW9kaWZpZWREb2MpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRjYXRjaCAoZXJyb3JzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzY2hlbWFFcnJvcnMgPSBlcnJvcnM7XG5cdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmNhbGxNZXRob2RJbnRlcm5hbC5jYWxsKHRoaXMsICdpbnNlcnRFcnJvckxvZycsICdTY2hlbWEgRmFpbGVkIG9uIHVwZGF0ZURvY3VtZW50UHJvcHMgLSAnICsgY29sbGVjdGlvbiwgW3NjaGVtYUVycm9ycywgbW9kaWZpZWREb2NdKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XG5cdFx0XHRcdFx0XHRcdFx0aWYgKHNjaGVtYUVycm9ycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coc2NoZW1hRXJyb3JzKTtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdCgnU2NoZW1hIEVycm9ycycpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmNyZWF0ZSh2ZXJzaW9uRG9jKS50aGVuKGRvYyA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmRlbGV0ZU1hbnkoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRhbmQ6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9pZCc6IGN1cnJEb2MuX2lkfSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IHskbHRlOiBjdXJyRG9jLl9fdiAtIDR9fVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZXhlYygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSwgZXJyID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coZXJyKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdXBkYXRlcyA9IGdldE1vbmdvVXBkYXRlcyhjdXJyRG9jLCBtb2RpZmllZERvYywgdHJ1ZSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICh1cGRhdGVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS51cGRhdGVPbmUoe19pZDogbW9kaWZpZWREb2MuX2lkfSwgdXBkYXRlcywge3N0cmljdDogZmFsc2V9KS5leGVjKCkudGhlbihyZXMgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzLm9rKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSwgZXJyID0+IHJlamVjdChlcnIpKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKDEpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoZ2V0QmluYXJ5U2l6ZShKU09OLnN0cmluZ2lmeSh1cGRhdGVQYXJhbXMpKSA8IDIwMDAwMCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdVcGRhdGUgRG9jdW1lbnQgUHJvcHMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbiArICcsIElkOiAnICsgZG9jX2lkICsgJywgJyArICdWZXJzaW9uOiAnICsgZG9jX192LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6IHVwZGF0ZVBhcmFtcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICd1cGRhdGVEb2N1bWVudFByb3BzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdVcGRhdGUgRG9jdW1lbnQgUHJvcHMnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbiArICcsIElkOiAnICsgZG9jX2lkICsgJywgJyArICdWZXJzaW9uOiAnICsgZG9jX192LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6ICdUb28gQmlnJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXRob2Q6ICd1cGRhdGVEb2N1bWVudFByb3BzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ2ludmFsaWQgdmVyc2lvbiAtICcgKyBjb2xsZWN0aW9uLCBjdXJyRG9jLl9fdiwgZG9jX192KTtcblxuXHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmZpbmRPbmUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0JGFuZDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiBjdXJyRG9jLl9pZH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IGRvY19fdn1cblx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHR9KS5sZWFuKCkuZXhlYygoZXJyT2xkRG9jLCBvbGREb2MpID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCBuZXdDdXJyRG9jSWQgPSBjdXJyRG9jLl9pZDtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKG9sZERvYykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRsZXQgdmVyc2lvbkRvYyA9IGRlZXBDb3B5KGN1cnJEb2MpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHZlcnNpb25Eb2MuX2lkID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdF9pZDogY3VyckRvYy5faWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X192OiBjdXJyRG9jLl9fdlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGxldCB1cGRhdGVkRG9jID0gZ2V0TW9uZ29NZXJnZVVwZGF0ZWREb2MobW9kaWZpZWREb2MsIGN1cnJEb2MsIG9sZERvYyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHVwZGF0ZWREb2MuX2lkID0gbmV3Q3VyckRvY0lkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVkRG9jLl9fdisrO1xuXHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pLnJlcGxhY2VPbmUoe19pZDogbmV3Q3VyckRvY0lkfSwgdXBkYXRlZERvYykuZXhlYygpLnRoZW4ocmVzID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoUmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWyd2ZXJzaW9uQ29sbGVjdGlvbiddKS5jcmVhdGUodmVyc2lvbkRvYykudGhlbihkb2MgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuZGVsZXRlTWFueSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCRhbmQ6IFtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiB2ZXJzaW9uRG9jLl9pZC5faWR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IHskbHRlOiB2ZXJzaW9uRG9jLl9pZC5fX3YgLSA0fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZXhlYygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhlcnIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzLm5Nb2RpZmllZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiByZWplY3QoZXJyKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KCdJbnZhbGlkIFZlcnNpb24gQW5kIENvdWxkIE5vdCBGaW5kIEhpc3RvcnkgUHJvcHMgLSBEQjogJyArIGN1cnJEb2MuX192ICsgJywgVHJ5aW5nIHRvIHVwZGF0ZSB3aXRoIDonICsgbW9kaWZpZWREb2MuX192KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnJEb2MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHVwZGF0ZURvY3VtZW50T2ZmbGluZToge1xuXHRcdFx0Y2hlY2s6IG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRjb2xsZWN0aW9uOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGZfZG9jdW1lbnQ6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fSxcblx0XHRcdFx0Zl9vbGREb2N1bWVudDoge1xuXHRcdFx0XHRcdHR5cGU6IE9iamVjdCxcblx0XHRcdFx0XHRibGFja2JveDogdHJ1ZVxuXHRcdFx0XHR9XG5cdFx0XHR9KSxcblx0XHRcdGZ1bmN0aW9uOiBmdW5jdGlvbihjb2xsZWN0aW9uOiBzdHJpbmcsIGZfZG9jdW1lbnQ6IE9iamVjdCwgZl9vbGREb2N1bWVudDogT2JqZWN0KSB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pLmZpbmRPbmUoe19pZDogZl9kb2N1bWVudFsnX2lkJ119KS5sZWFuKCkuZXhlYygoZXJyRG9jLCBjdXJyRG9jKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoY3VyckRvYykge1xuXHRcdFx0XHRcdFx0XHRpZiAoY3VyckRvYy5fX3YgPT09IGZfZG9jdW1lbnRbJ19fdiddKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgdmVyc2lvbkRvYyA9IGRlZXBDb3B5KGN1cnJEb2MpO1xuXG5cdFx0XHRcdFx0XHRcdFx0dmVyc2lvbkRvYy5faWQgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IGN1cnJEb2MuX2lkLFxuXHRcdFx0XHRcdFx0XHRcdFx0X192OiBjdXJyRG9jLl9fdlxuXHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0XHRsZXQgc2NoZW1hRXJyb3JzID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3NpbXBsc2NoZW1hJ10udmFsaWRhdGUoZl9kb2N1bWVudCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGNhdGNoIChlcnJvcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdHNjaGVtYUVycm9ycyA9IGVycm9ycztcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuY2FsbE1ldGhvZEludGVybmFsLmNhbGwodGhpcywgJ2luc2VydEVycm9yTG9nJywgJ1NjaGVtYSBGYWlsZWQgb24gdXBkYXRlRG9jdW1lbnQgLSAnICsgY29sbGVjdGlvbiwgW3NjaGVtYUVycm9ycywgZl9kb2N1bWVudF0pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHRpZiAoc2NoZW1hRXJyb3JzKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhzY2hlbWFFcnJvcnMpO1xuXHRcdFx0XHRcdFx0XHRcdFx0cmVqZWN0KCdTY2hlbWEgRXJyb3JzJyk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuY3JlYXRlKHZlcnNpb25Eb2MpLnRoZW4oZG9jID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuZGVsZXRlTWFueSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGFuZDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0eydfaWQuX2lkJzogY3VyckRvYy5faWR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0eydfaWQuX192JzogeyRsdGU6IGN1cnJEb2MuX192IC0gNH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XVxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KS5leGVjKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LCBlcnIgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLmxvZyhlcnIpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGxldCB1cGRhdGVzID0gZ2V0TW9uZ29VcGRhdGVzKGN1cnJEb2MsIGZfZG9jdW1lbnQsIHRydWUpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodXBkYXRlcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbikudXBkYXRlT25lKHtfaWQ6IGZfZG9jdW1lbnRbJ19pZCddfSwgdXBkYXRlcywge3N0cmljdDogZmFsc2V9KS5leGVjKCkudGhlbihyZXMgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzLm5Nb2RpZmllZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiByZWplY3QoZXJyKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgxKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkoZl9kb2N1bWVudCkpIDwgMjAwMDAwKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdpbmZvJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ1VwZGF0ZSBEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogJ1VzZXI6ICcgKyB0aGlzLnVzZXIgKyAnLCBDb2xsZWN0aW9uIFR5cGU6ICcgKyBjb2xsZWN0aW9uLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBheWxvYWQ6IGZfZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAndXBkYXRlRG9jdW1lbnRPZmZsaW5lJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBUeXBlcy5PYmplY3RJZCgpLnRvSGV4U3RyaW5nKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGl0bGU6ICdVcGRhdGUgRG9jdW1lbnQnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkOiAnVG9vIEJpZycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAndXBkYXRlRG9jdW1lbnRPZmZsaW5lJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ2ludmFsaWQgdmVyc2lvbiAtICcgKyBjb2xsZWN0aW9uLCBjdXJyRG9jLl9fdiwgZl9kb2N1bWVudFsnX192J10pO1xuXG5cdFx0XHRcdFx0XHRcdFx0bGV0IG5ld0N1cnJEb2NJZCA9IGN1cnJEb2MuX2lkO1xuXG5cdFx0XHRcdFx0XHRcdFx0aWYgKGZfb2xkRG9jdW1lbnQpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxldCB2ZXJzaW9uRG9jID0gZGVlcENvcHkoY3VyckRvYyk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdHZlcnNpb25Eb2MuX2lkID0ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IGN1cnJEb2MuX2lkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRfX3Y6IGN1cnJEb2MuX192XG5cdFx0XHRcdFx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdXBkYXRlZERvYyA9IGdldE1vbmdvTWVyZ2VVcGRhdGVkRG9jKGZfZG9jdW1lbnQsIGN1cnJEb2MsIGZfb2xkRG9jdW1lbnQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0dXBkYXRlZERvYy5faWQgPSBuZXdDdXJyRG9jSWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVkRG9jLl9fdisrO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbikucmVwbGFjZU9uZSh7X2lkOiBuZXdDdXJyRG9jSWR9LCB1cGRhdGVkRG9jKS5leGVjKCkudGhlbihyZXMgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoUmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWyd2ZXJzaW9uQ29sbGVjdGlvbiddKS5jcmVhdGUodmVyc2lvbkRvYykudGhlbihkb2MgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmRlbGV0ZU1hbnkoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0JGFuZDogW1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiB2ZXJzaW9uRG9jLl9pZC5faWR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5fX3YnOiB7JGx0ZTogdmVyc2lvbkRvYy5faWQuX192IC0gNH19XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fSkuZXhlYygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LCBlcnIgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGVycik7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHJlcy5uTW9kaWZpZWQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSwgZXJyID0+IHJlamVjdChlcnIpKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWplY3QoJ09GRkxJTkUgLSBJbnZhbGlkIFZlcnNpb24gQW5kIENvdWxkIE5vdCBGaW5kIEhpc3RvcnkgLSBEQjogJyArIGN1cnJEb2MuX192ICsgJywgVHJ5aW5nIHRvIHVwZGF0ZSB3aXRoIDonICsgZl9kb2N1bWVudFsnX192J10pO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnJEb2MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIFVwZGF0ZXMgMSBkb2N1bWVudCdzIHByb3BzIChmcm9tIF9pZClcblx0XHQvLyBASW5wdXRzOiBjb2xsZWN0aW9uLCBkb2N1bWVudCBpZCwgZG9jdW1lbnQgdmVyc2lvbiwgdXBkYXRlIHBhcmFtdGVycyAoe3Byb3A6ICd4eHgnLCBkYXRhOiAneXl5fSlcblx0XHQvLyBAT3V0cHV0czogcmVzID0gMSAodXBkYXRlZCAxKSwgcmVzID0gMCAobm90IHVwZGF0ZWQpLCBlcnIgPSBub3QgdXBkYXRlZC93cm9uZyB2ZXJzaW9uXG5cdFx0Ly8gU2VhcmNoIGZvciBkb2MsIGNoZWNrIHZlcnNpb24sIGlmIGZvdW5kIHRoZW4gdHJ5IGFuZCB1cGRhdGUgcHJvcHNcblx0XHR1cGRhdGVEb2N1bWVudFByb3BzT2ZmbGluZToge1xuXHRcdFx0Y2hlY2s6IG5ldyBTaW1wbGVTY2hlbWEoe1xuXHRcdFx0XHRjb2xsZWN0aW9uOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRvY19pZDoge1xuXHRcdFx0XHRcdHR5cGU6IFN0cmluZ1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR1cGRhdGVQYXJhbXM6IHtcblx0XHRcdFx0XHR0eXBlOiBBcnJheVxuXHRcdFx0XHR9LFxuXHRcdFx0XHQndXBkYXRlUGFyYW1zLiQnOiB7XG5cdFx0XHRcdFx0dHlwZTogT2JqZWN0LFxuXHRcdFx0XHRcdGJsYWNrYm94OiB0cnVlXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGRvY19fdjoge1xuXHRcdFx0XHRcdHR5cGU6IE51bWJlclxuXHRcdFx0XHR9LFxuXHRcdFx0XHRmX29sZERvY3VtZW50OiB7XG5cdFx0XHRcdFx0dHlwZTogT2JqZWN0LFxuXHRcdFx0XHRcdGJsYWNrYm94OiB0cnVlXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgZG9jX2lkOiBzdHJpbmcsIHVwZGF0ZVBhcmFtczogYW55W10sIGRvY19fdjogbnVtYmVyLCBmX29sZERvY3VtZW50OiBPYmplY3QpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbikuZmluZE9uZSh7X2lkOiBkb2NfaWR9KS5sZWFuKCkuZXhlYygoZXJyRG9jLCBjdXJyRG9jOiBEb2N1bWVudCkgPT4ge1xuXHRcdFx0XHRcdFx0aWYgKGN1cnJEb2MpIHtcblx0XHRcdFx0XHRcdFx0bGV0IG1vZGlmaWVkRG9jID0gZGVlcENvcHkoY3VyckRvYyk7XG5cblx0XHRcdFx0XHRcdFx0dXBkYXRlUGFyYW1zLmZvckVhY2goZGF0YSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0bW9kaWZpZWREb2NbZGF0YS5wcm9wXSA9IGRhdGEuZGF0YTtcblx0XHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG1vZGlmaWVkRG9jLl9fdiA9PT0gZG9jX192KSB7XG5cdFx0XHRcdFx0XHRcdFx0bGV0IHZlcnNpb25Eb2MgPSBkZWVwQ29weShjdXJyRG9jKTtcblx0XG5cdFx0XHRcdFx0XHRcdFx0dmVyc2lvbkRvYy5faWQgPSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IGN1cnJEb2MuX2lkLFxuXHRcdFx0XHRcdFx0XHRcdFx0X192OiBjdXJyRG9jLl9fdlxuXHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdGxldCBzY2hlbWFFcnJvcnMgPSBudWxsO1xuXHRcdFx0XHRcblx0XHRcdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWydzaW1wbHNjaGVtYSddLnZhbGlkYXRlKG1vZGlmaWVkRG9jKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Y2F0Y2ggKGVycm9ycykge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2NoZW1hRXJyb3JzID0gZXJyb3JzO1xuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5jYWxsTWV0aG9kSW50ZXJuYWwuY2FsbCh0aGlzLCAnaW5zZXJ0RXJyb3JMb2cnLCAnU2NoZW1hIEZhaWxlZCBvbiB1cGRhdGVEb2N1bWVudFByb3BzIC0gJyArIGNvbGxlY3Rpb24sIFtzY2hlbWFFcnJvcnMsIG1vZGlmaWVkRG9jXSk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFxuXHRcdFx0XHRcdFx0XHRcdGlmIChzY2hlbWFFcnJvcnMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKHNjaGVtYUVycm9ycyk7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZWplY3QoJ1NjaGVtYSBFcnJvcnMnKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoUmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWyd2ZXJzaW9uQ29sbGVjdGlvbiddKS5jcmVhdGUodmVyc2lvbkRvYykudGhlbihkb2MgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoUmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKGNvbGxlY3Rpb24pWyd2ZXJzaW9uQ29sbGVjdGlvbiddKS5kZWxldGVNYW55KHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkYW5kOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5faWQnOiBjdXJyRG9jLl9pZH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR7J19pZC5fX3YnOiB7JGx0ZTogY3VyckRvYy5fX3YgLSA0fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRdXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pLmV4ZWMoKTtcblx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKGVycik7XG5cdFx0XHRcdFx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHVwZGF0ZXMgPSBnZXRNb25nb1VwZGF0ZXMoY3VyckRvYywgbW9kaWZpZWREb2MsIHRydWUpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodXBkYXRlcykge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbikudXBkYXRlT25lKHtfaWQ6IG1vZGlmaWVkRG9jLl9pZH0sIHVwZGF0ZXMsIHtzdHJpY3Q6IGZhbHNlfSkuZXhlYygpLnRoZW4ocmVzID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKHJlcy5vayk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiByZWplY3QoZXJyKSk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSgxKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKGdldEJpbmFyeVNpemUoSlNPTi5zdHJpbmdpZnkodXBkYXRlUGFyYW1zKSkgPCAyMDAwMDApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0TG9ncy5jcmVhdGUoe1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdF9pZDogVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRhdGU6IG5ldyBEYXRlKCksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZTogJ2luZm8nLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRpdGxlOiAnVXBkYXRlIERvY3VtZW50IFByb3BzJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiAnVXNlcjogJyArIHRoaXMudXNlciArICcsIENvbGxlY3Rpb24gVHlwZTogJyArIGNvbGxlY3Rpb24gKyAnLCBJZDogJyArIGRvY19pZCArICcsICcgKyAnVmVyc2lvbjogJyArIGRvY19fdixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwYXlsb2FkOiB1cGRhdGVQYXJhbXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWV0aG9kOiAndXBkYXRlRG9jdW1lbnRQcm9wc09mZmxpbmUnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVzZXI6IHRoaXMudXNlcixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlSWQ6ICcnXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkYXRlOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGU6ICdpbmZvJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aXRsZTogJ1VwZGF0ZSBEb2N1bWVudCBQcm9wcycsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogJ1VzZXI6ICcgKyB0aGlzLnVzZXIgKyAnLCBDb2xsZWN0aW9uIFR5cGU6ICcgKyBjb2xsZWN0aW9uICsgJywgSWQ6ICcgKyBkb2NfaWQgKyAnLCAnICsgJ1ZlcnNpb246ICcgKyBkb2NfX3YsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0cGF5bG9hZDogJ1RvbyBCaWcnLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZDogJ3VwZGF0ZURvY3VtZW50UHJvcHNPZmZsaW5lJyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWVzc2FnZUlkOiAnJ1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coJ2ludmFsaWQgdmVyc2lvbiAtICcgKyBjb2xsZWN0aW9uLCBjdXJyRG9jLl9fdiwgZG9jX192KTtcblxuXHRcdFx0XHRcdFx0XHRcdGxldCBuZXdDdXJyRG9jSWQgPSBjdXJyRG9jLl9pZDtcblxuXHRcdFx0XHRcdFx0XHRcdGlmIChmX29sZERvY3VtZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRsZXQgdmVyc2lvbkRvYyA9IGRlZXBDb3B5KGN1cnJEb2MpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHR2ZXJzaW9uRG9jLl9pZCA9IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0X2lkOiBjdXJyRG9jLl9pZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0X192OiBjdXJyRG9jLl9fdlxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0bGV0IHVwZGF0ZWREb2MgPSBnZXRNb25nb01lcmdlVXBkYXRlZERvYyhtb2RpZmllZERvYywgY3VyckRvYywgZl9vbGREb2N1bWVudCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR1cGRhdGVkRG9jLl9pZCA9IG5ld0N1cnJEb2NJZDtcblx0XHRcdFx0XHRcdFx0XHRcdHVwZGF0ZWREb2MuX192Kys7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5yZXBsYWNlT25lKHtfaWQ6IG5ld0N1cnJEb2NJZH0sIHVwZGF0ZWREb2MpLmV4ZWMoKS50aGVuKHJlcyA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbilbJ3ZlcnNpb25Db2xsZWN0aW9uJ10pLmNyZWF0ZSh2ZXJzaW9uRG9jKS50aGVuKGRvYyA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0UmVzb2x2ZUlPU2VydmVyLmdldE1haW5EQigpLm1vZGVsKFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKVsndmVyc2lvbkNvbGxlY3Rpb24nXSkuZGVsZXRlTWFueSh7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQkYW5kOiBbXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9pZCc6IHZlcnNpb25Eb2MuX2lkLl9pZH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHsnX2lkLl9fdic6IHskbHRlOiB2ZXJzaW9uRG9jLl9pZC5fX3YgLSA0fX1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdF1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9KS5leGVjKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sIGVyciA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Y29uc29sZS5sb2coZXJyKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUocmVzLm5Nb2RpZmllZCk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9LCBlcnIgPT4gcmVqZWN0KGVycikpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdHJlamVjdCgnT0ZGTElORSAtIEludmFsaWQgVmVyc2lvbiBBbmQgQ291bGQgTm90IEZpbmQgSGlzdG9yeSBQcm9wcyAtIERCOiAnICsgY3VyckRvYy5fX3YgKyAnLCBUcnlpbmcgdG8gdXBkYXRlIHdpdGggOicgKyBtb2RpZmllZERvYy5fX3YpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnJEb2MpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdC8vIFJlbW92ZXMgMSBkb2N1bWVudCAoZnJvbSBfaWQpXG5cdFx0Ly8gQElucHV0czogY29sbGVjdGlvbiwgZG9jdW1lbnQgaWRcblx0XHQvLyBAT3V0cHV0czogcmVzID0gMSAoZGVsZXRlZCksIHJlcyA9IDAgKG5vdCBkZWxldGVkKSwgZXJyID0gbm90IGRlbGV0ZWRcblx0XHQvLyBTZWFyY2ggZm9yIGRvYywgaWYgZm91bmQgdGhlbiB0cnkgYW5kIHJlbW92ZVxuXHRcdHJlbW92ZURvY3VtZW50OiB7XG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0ZG9jX2lkOiB7XG5cdFx0XHRcdFx0dHlwZTogU3RyaW5nXG5cdFx0XHRcdH1cblx0XHRcdH0pLFxuXHRcdFx0ZnVuY3Rpb246IGZ1bmN0aW9uKGNvbGxlY3Rpb246IHN0cmluZywgZG9jX2lkOiBzdHJpbmcpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcblxuXHRcdFx0XHRcdExvZ3MuY3JlYXRlKHtcblx0XHRcdFx0XHRcdF9pZDogVHlwZXMuT2JqZWN0SWQoKS50b0hleFN0cmluZygpLFxuXHRcdFx0XHRcdFx0ZGF0ZTogbmV3IERhdGUoKSxcblx0XHRcdFx0XHRcdHR5cGU6ICdpbmZvJyxcblx0XHRcdFx0XHRcdHRpdGxlOiAnUmVtb3ZlIERvY3VtZW50Jyxcblx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdHBheWxvYWQ6IHtfaWQ6IGRvY19pZH0sXG5cdFx0XHRcdFx0XHRtZXRob2Q6ICdyZW1vdmVEb2N1bWVudCcsXG5cdFx0XHRcdFx0XHR1c2VyOiB0aGlzLnVzZXIsXG5cdFx0XHRcdFx0XHRtZXNzYWdlSWQ6ICcnXG5cdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHRSZXNvbHZlSU9TZXJ2ZXIuZ2V0TWFpbkRCKCkubW9kZWwoY29sbGVjdGlvbikuZGVsZXRlT25lKHtfaWQ6IGRvY19pZH0pLmV4ZWMoKGVyciwgcmVzKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZXJyKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnIpO1x0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShyZXMub2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9LFxuXHRcdHJlbW92ZURvY3VtZW50V2l0aFF1ZXJ5OiB7XG5cdFx0XHRjaGVjazogbmV3IFNpbXBsZVNjaGVtYSh7XG5cdFx0XHRcdGNvbGxlY3Rpb246IHtcblx0XHRcdFx0XHR0eXBlOiBTdHJpbmdcblx0XHRcdFx0fSxcblx0XHRcdFx0cXVlcnk6IHtcblx0XHRcdFx0XHR0eXBlOiBPYmplY3QsXG5cdFx0XHRcdFx0YmxhY2tib3g6IHRydWVcblx0XHRcdFx0fVxuXHRcdFx0fSksXG5cdFx0XHRmdW5jdGlvbjogZnVuY3Rpb24oY29sbGVjdGlvbjogc3RyaW5nLCBxdWVyeTogT2JqZWN0KSB7XG5cdFx0XHRcdHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cblx0XHRcdFx0XHRMb2dzLmNyZWF0ZSh7XG5cdFx0XHRcdFx0XHRfaWQ6IFR5cGVzLk9iamVjdElkKCkudG9IZXhTdHJpbmcoKSxcblx0XHRcdFx0XHRcdGRhdGU6IG5ldyBEYXRlKCksXG5cdFx0XHRcdFx0XHR0eXBlOiAnaW5mbycsXG5cdFx0XHRcdFx0XHR0aXRsZTogJ1JlbW92ZSBEb2N1bWVudCAoUXVlcnkpJyxcblx0XHRcdFx0XHRcdG1lc3NhZ2U6ICdVc2VyOiAnICsgdGhpcy51c2VyICsgJywgQ29sbGVjdGlvbiBUeXBlOiAnICsgY29sbGVjdGlvbixcblx0XHRcdFx0XHRcdHBheWxvYWQ6IHtfaWQ6IHF1ZXJ5fSxcblx0XHRcdFx0XHRcdG1ldGhvZDogJ3JlbW92ZURvY3VtZW50V2l0aFF1ZXJ5Jyxcblx0XHRcdFx0XHRcdHVzZXI6IHRoaXMudXNlcixcblx0XHRcdFx0XHRcdG1lc3NhZ2VJZDogJydcblx0XHRcdFx0XHR9KTtcblxuXHRcdFx0XHRcdFJlc29sdmVJT1NlcnZlci5nZXRNYWluREIoKS5tb2RlbChjb2xsZWN0aW9uKS5kZWxldGVPbmUocXVlcnkpLmV4ZWMoKGVyciwgcmVzKSA9PiB7XG5cdFx0XHRcdFx0XHRpZiAoZXJyKSB7XG5cdFx0XHRcdFx0XHRcdHJlamVjdChlcnIpO1x0XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShyZXMub2spO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufSJdfQ==
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var mongoose_1 = require("mongoose");
4
+ var common_1 = require("../util/common");
5
+ var simpl_schema_1 = require("simpl-schema");
6
+ var pagination_model_1 = require("../models/pagination.model");
7
+ var log_collection_1 = require("../collections/log.collection");
8
+ var index_1 = require("../index");
9
+ function loadCollectionMethods(methodManager) {
10
+ methodManager.methods({
11
+ // Query database for any collection and query
12
+ findOne: {
13
+ skipQueue: true,
14
+ check: new simpl_schema_1.default({
15
+ collection: {
16
+ type: String
17
+ },
18
+ query: {
19
+ type: Object,
20
+ blackbox: true
21
+ }
22
+ }),
23
+ function: function (collection, query) {
24
+ return index_1.default.getMainDB().model(collection).findOne(query).exec();
25
+ }
26
+ },
27
+ find: {
28
+ skipQueue: true,
29
+ check: new simpl_schema_1.default({
30
+ collection: {
31
+ type: String
32
+ },
33
+ query: {
34
+ type: Object,
35
+ blackbox: true
36
+ },
37
+ sort: {
38
+ type: Object,
39
+ blackbox: true,
40
+ optional: true
41
+ }
42
+ }),
43
+ function: function (collection, query, sortQuery) {
44
+ if (sortQuery === void 0) { sortQuery = {}; }
45
+ return index_1.default.getMainDB().model(collection).find(query).sort(sortQuery).exec();
46
+ }
47
+ },
48
+ findWithOptions: {
49
+ skipQueue: true,
50
+ check: new simpl_schema_1.default({
51
+ collection: {
52
+ type: String
53
+ },
54
+ query: {
55
+ type: Object,
56
+ blackbox: true
57
+ },
58
+ options: {
59
+ type: pagination_model_1.PaginationOptionsSchema
60
+ }
61
+ }),
62
+ function: function (collection, query, options) {
63
+ return index_1.default.getMainDB().model(collection).find(query).sort(options.sort).limit(options.limit).skip(options.skip).select(options.fields).exec();
64
+ }
65
+ },
66
+ // Insert 1 document
67
+ // @Inputs: collection, document
68
+ // @Outputs: res = _id of new document, err = not inserted
69
+ insertDocument: {
70
+ check: new simpl_schema_1.default({
71
+ collection: {
72
+ type: String
73
+ },
74
+ document: {
75
+ type: Object,
76
+ blackbox: true
77
+ }
78
+ }),
79
+ function: function (collection, document) {
80
+ var _this = this;
81
+ return new Promise(function (resolve, reject) {
82
+ var schemaErrors = null;
83
+ try {
84
+ index_1.default.getMainDB().model(collection)['simplschema'].validate(document);
85
+ }
86
+ catch (errors) {
87
+ schemaErrors = errors;
88
+ _this.callMethodInternal.call(_this, 'insertErrorLog', 'Schema Failed on insert - ' + collection, [schemaErrors, document]);
89
+ }
90
+ if (schemaErrors) {
91
+ console.log(schemaErrors);
92
+ reject('Schema Errors');
93
+ }
94
+ else {
95
+ if (common_1.getBinarySize(JSON.stringify(document)) < 200000) {
96
+ log_collection_1.Logs.create({
97
+ _id: mongoose_1.Types.ObjectId().toHexString(),
98
+ date: new Date(),
99
+ type: 'info',
100
+ title: 'Insert Document',
101
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
102
+ payload: document,
103
+ method: 'insertDocument',
104
+ user: _this.user,
105
+ messageId: ''
106
+ });
107
+ }
108
+ else {
109
+ log_collection_1.Logs.create({
110
+ _id: mongoose_1.Types.ObjectId().toHexString(),
111
+ date: new Date(),
112
+ type: 'info',
113
+ title: 'Insert Document',
114
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
115
+ payload: 'Too Big',
116
+ method: 'insertDocument',
117
+ user: _this.user,
118
+ messageId: ''
119
+ });
120
+ }
121
+ var id_1 = mongoose_1.Types.ObjectId().toHexString();
122
+ document['_id'] = id_1;
123
+ document['__v'] = 0;
124
+ index_1.default.getMainDB().model(collection).create(document).then(function () { return resolve(id_1); }, function (err) { return reject(err); });
125
+ }
126
+ });
127
+ }
128
+ },
129
+ // Replaces 1 document with new document (from _id)
130
+ // @Inputs: collection, document id
131
+ // @Outputs: res = 1 (updated 1), res = 0 (not updated), err = not updated/wrong version
132
+ // Search for doc, check version, if found then try and update
133
+ updateDocument: {
134
+ check: new simpl_schema_1.default({
135
+ collection: {
136
+ type: String
137
+ },
138
+ f_document: {
139
+ type: Object,
140
+ blackbox: true
141
+ }
142
+ }),
143
+ function: function (collection, f_document) {
144
+ var _this = this;
145
+ return new Promise(function (resolve, reject) {
146
+ index_1.default.getMainDB().model(collection).findOne({ _id: f_document['_id'] }).lean().exec(function (errDoc, currDoc) {
147
+ if (currDoc) {
148
+ if (currDoc.__v === f_document['__v']) {
149
+ var versionDoc = common_1.deepCopy(currDoc);
150
+ versionDoc._id = {
151
+ _id: currDoc._id,
152
+ __v: currDoc.__v
153
+ };
154
+ var schemaErrors = null;
155
+ try {
156
+ index_1.default.getMainDB().model(collection)['simplschema'].validate(f_document);
157
+ }
158
+ catch (errors) {
159
+ schemaErrors = errors;
160
+ _this.callMethodInternal.call(_this, 'insertErrorLog', 'Schema Failed on updateDocument - ' + collection, [schemaErrors, f_document]);
161
+ }
162
+ if (schemaErrors) {
163
+ console.log(schemaErrors);
164
+ reject('Schema Errors');
165
+ }
166
+ else {
167
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc).then(function (doc) {
168
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
169
+ $and: [
170
+ { '_id._id': currDoc._id },
171
+ { '_id.__v': { $lte: currDoc.__v - 4 } }
172
+ ]
173
+ }).exec();
174
+ }, function (err) {
175
+ console.log(err);
176
+ });
177
+ var updates = common_1.getMongoUpdates(currDoc, f_document, true);
178
+ if (updates) {
179
+ index_1.default.getMainDB().model(collection).updateOne({ _id: f_document['_id'] }, updates, { strict: false }).exec().then(function (res) {
180
+ resolve(res.nModified);
181
+ }, function (err) { return reject(err); });
182
+ }
183
+ else {
184
+ resolve(1);
185
+ }
186
+ if (common_1.getBinarySize(JSON.stringify(f_document)) < 200000) {
187
+ log_collection_1.Logs.create({
188
+ _id: mongoose_1.Types.ObjectId().toHexString(),
189
+ date: new Date(),
190
+ type: 'info',
191
+ title: 'Update Document',
192
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
193
+ payload: f_document,
194
+ method: 'updateDocument',
195
+ user: _this.user,
196
+ messageId: ''
197
+ });
198
+ }
199
+ else {
200
+ log_collection_1.Logs.create({
201
+ _id: mongoose_1.Types.ObjectId().toHexString(),
202
+ date: new Date(),
203
+ type: 'info',
204
+ title: 'Update Document',
205
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
206
+ payload: 'Too Big',
207
+ method: 'updateDocument',
208
+ user: _this.user,
209
+ messageId: ''
210
+ });
211
+ }
212
+ }
213
+ }
214
+ else {
215
+ console.log('invalid version - ' + collection, currDoc.__v, f_document['__v']);
216
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).findOne({
217
+ $and: [
218
+ { '_id._id': currDoc._id },
219
+ { '_id.__v': f_document['__v'] }
220
+ ]
221
+ }).lean().exec(function (errOldDoc, oldDoc) {
222
+ var newCurrDocId = currDoc._id;
223
+ if (oldDoc) {
224
+ var versionDoc_1 = common_1.deepCopy(currDoc);
225
+ versionDoc_1._id = {
226
+ _id: currDoc._id,
227
+ __v: currDoc.__v
228
+ };
229
+ var updatedDoc = common_1.getMongoMergeUpdatedDoc(f_document, currDoc, oldDoc);
230
+ updatedDoc._id = newCurrDocId;
231
+ updatedDoc.__v++;
232
+ index_1.default.getMainDB().model(collection).replaceOne({ _id: newCurrDocId }, updatedDoc).exec().then(function (res) {
233
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc_1).then(function (doc) {
234
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
235
+ $and: [
236
+ { '_id._id': versionDoc_1._id._id },
237
+ { '_id.__v': { $lte: versionDoc_1._id.__v - 4 } }
238
+ ]
239
+ }).exec();
240
+ resolve(res.nModified);
241
+ });
242
+ }, function (err) { return reject(err); });
243
+ }
244
+ else {
245
+ reject('Invalid Version And Could Not Find History - DB: ' + currDoc.__v + ', Trying to update with :' + f_document['__v']);
246
+ }
247
+ });
248
+ }
249
+ }
250
+ else {
251
+ reject(errDoc);
252
+ }
253
+ });
254
+ });
255
+ }
256
+ },
257
+ // Updates 1 document's props (from _id)
258
+ // @Inputs: collection, document id, document version, update paramters ({prop: 'xxx', data: 'yyy})
259
+ // @Outputs: res = 1 (updated 1), res = 0 (not updated), err = not updated/wrong version
260
+ // Search for doc, check version, if found then try and update props
261
+ updateDocumentProps: {
262
+ check: new simpl_schema_1.default({
263
+ collection: {
264
+ type: String
265
+ },
266
+ doc_id: {
267
+ type: String
268
+ },
269
+ updateParams: {
270
+ type: Array
271
+ },
272
+ 'updateParams.$': {
273
+ type: Object,
274
+ blackbox: true
275
+ },
276
+ doc__v: {
277
+ type: Number
278
+ }
279
+ }),
280
+ function: function (collection, doc_id, updateParams, doc__v) {
281
+ var _this = this;
282
+ return new Promise(function (resolve, reject) {
283
+ index_1.default.getMainDB().model(collection).findOne({ _id: doc_id }).lean().exec(function (errDoc, currDoc) {
284
+ if (currDoc) {
285
+ var modifiedDoc_1 = common_1.deepCopy(currDoc);
286
+ updateParams.forEach(function (data) {
287
+ modifiedDoc_1[data.prop] = data.data;
288
+ });
289
+ if (modifiedDoc_1.__v === doc__v) {
290
+ var versionDoc = common_1.deepCopy(currDoc);
291
+ versionDoc._id = {
292
+ _id: currDoc._id,
293
+ __v: currDoc.__v
294
+ };
295
+ var schemaErrors = null;
296
+ try {
297
+ index_1.default.getMainDB().model(collection)['simplschema'].validate(modifiedDoc_1);
298
+ }
299
+ catch (errors) {
300
+ schemaErrors = errors;
301
+ _this.callMethodInternal.call(_this, 'insertErrorLog', 'Schema Failed on updateDocumentProps - ' + collection, [schemaErrors, modifiedDoc_1]);
302
+ }
303
+ if (schemaErrors) {
304
+ console.log(schemaErrors);
305
+ reject('Schema Errors');
306
+ }
307
+ else {
308
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc).then(function (doc) {
309
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
310
+ $and: [
311
+ { '_id._id': currDoc._id },
312
+ { '_id.__v': { $lte: currDoc.__v - 4 } }
313
+ ]
314
+ }).exec();
315
+ }, function (err) {
316
+ console.log(err);
317
+ });
318
+ var updates = common_1.getMongoUpdates(currDoc, modifiedDoc_1, true);
319
+ if (updates) {
320
+ index_1.default.getMainDB().model(collection).updateOne({ _id: modifiedDoc_1._id }, updates, { strict: false }).exec().then(function (res) {
321
+ resolve(res.ok);
322
+ }, function (err) { return reject(err); });
323
+ }
324
+ else {
325
+ resolve(1);
326
+ }
327
+ if (common_1.getBinarySize(JSON.stringify(updateParams)) < 200000) {
328
+ log_collection_1.Logs.create({
329
+ _id: mongoose_1.Types.ObjectId().toHexString(),
330
+ date: new Date(),
331
+ type: 'info',
332
+ title: 'Update Document Props',
333
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection + ', Id: ' + doc_id + ', ' + 'Version: ' + doc__v,
334
+ payload: updateParams,
335
+ method: 'updateDocumentProps',
336
+ user: _this.user,
337
+ messageId: ''
338
+ });
339
+ }
340
+ else {
341
+ log_collection_1.Logs.create({
342
+ _id: mongoose_1.Types.ObjectId().toHexString(),
343
+ date: new Date(),
344
+ type: 'info',
345
+ title: 'Update Document Props',
346
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection + ', Id: ' + doc_id + ', ' + 'Version: ' + doc__v,
347
+ payload: 'Too Big',
348
+ method: 'updateDocumentProps',
349
+ user: _this.user,
350
+ messageId: ''
351
+ });
352
+ }
353
+ }
354
+ }
355
+ else {
356
+ console.log('invalid version - ' + collection, currDoc.__v, doc__v);
357
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).findOne({
358
+ $and: [
359
+ { '_id._id': currDoc._id },
360
+ { '_id.__v': doc__v }
361
+ ]
362
+ }).lean().exec(function (errOldDoc, oldDoc) {
363
+ var newCurrDocId = currDoc._id;
364
+ if (oldDoc) {
365
+ var versionDoc_2 = common_1.deepCopy(currDoc);
366
+ versionDoc_2._id = {
367
+ _id: currDoc._id,
368
+ __v: currDoc.__v
369
+ };
370
+ var updatedDoc = common_1.getMongoMergeUpdatedDoc(modifiedDoc_1, currDoc, oldDoc);
371
+ updatedDoc._id = newCurrDocId;
372
+ updatedDoc.__v++;
373
+ index_1.default.getMainDB().model(collection).replaceOne({ _id: newCurrDocId }, updatedDoc).exec().then(function (res) {
374
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc_2).then(function (doc) {
375
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
376
+ $and: [
377
+ { '_id._id': versionDoc_2._id._id },
378
+ { '_id.__v': { $lte: versionDoc_2._id.__v - 4 } }
379
+ ]
380
+ }).exec();
381
+ }, function (err) {
382
+ console.log(err);
383
+ });
384
+ resolve(res.nModified);
385
+ }, function (err) { return reject(err); });
386
+ }
387
+ else {
388
+ reject('Invalid Version And Could Not Find History Props - DB: ' + currDoc.__v + ', Trying to update with :' + modifiedDoc_1.__v);
389
+ }
390
+ });
391
+ }
392
+ }
393
+ else {
394
+ reject(errDoc);
395
+ }
396
+ });
397
+ });
398
+ }
399
+ },
400
+ updateDocumentOffline: {
401
+ check: new simpl_schema_1.default({
402
+ collection: {
403
+ type: String
404
+ },
405
+ f_document: {
406
+ type: Object,
407
+ blackbox: true
408
+ },
409
+ f_oldDocument: {
410
+ type: Object,
411
+ blackbox: true
412
+ }
413
+ }),
414
+ function: function (collection, f_document, f_oldDocument) {
415
+ var _this = this;
416
+ return new Promise(function (resolve, reject) {
417
+ index_1.default.getMainDB().model(collection).findOne({ _id: f_document['_id'] }).lean().exec(function (errDoc, currDoc) {
418
+ if (currDoc) {
419
+ if (currDoc.__v === f_document['__v']) {
420
+ var versionDoc = common_1.deepCopy(currDoc);
421
+ versionDoc._id = {
422
+ _id: currDoc._id,
423
+ __v: currDoc.__v
424
+ };
425
+ var schemaErrors = null;
426
+ try {
427
+ index_1.default.getMainDB().model(collection)['simplschema'].validate(f_document);
428
+ }
429
+ catch (errors) {
430
+ schemaErrors = errors;
431
+ _this.callMethodInternal.call(_this, 'insertErrorLog', 'Schema Failed on updateDocument - ' + collection, [schemaErrors, f_document]);
432
+ }
433
+ if (schemaErrors) {
434
+ console.log(schemaErrors);
435
+ reject('Schema Errors');
436
+ }
437
+ else {
438
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc).then(function (doc) {
439
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
440
+ $and: [
441
+ { '_id._id': currDoc._id },
442
+ { '_id.__v': { $lte: currDoc.__v - 4 } }
443
+ ]
444
+ }).exec();
445
+ }, function (err) {
446
+ console.log(err);
447
+ });
448
+ var updates = common_1.getMongoUpdates(currDoc, f_document, true);
449
+ if (updates) {
450
+ index_1.default.getMainDB().model(collection).updateOne({ _id: f_document['_id'] }, updates, { strict: false }).exec().then(function (res) {
451
+ resolve(res.nModified);
452
+ }, function (err) { return reject(err); });
453
+ }
454
+ else {
455
+ resolve(1);
456
+ }
457
+ if (common_1.getBinarySize(JSON.stringify(f_document)) < 200000) {
458
+ log_collection_1.Logs.create({
459
+ _id: mongoose_1.Types.ObjectId().toHexString(),
460
+ date: new Date(),
461
+ type: 'info',
462
+ title: 'Update Document',
463
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
464
+ payload: f_document,
465
+ method: 'updateDocumentOffline',
466
+ user: _this.user,
467
+ messageId: ''
468
+ });
469
+ }
470
+ else {
471
+ log_collection_1.Logs.create({
472
+ _id: mongoose_1.Types.ObjectId().toHexString(),
473
+ date: new Date(),
474
+ type: 'info',
475
+ title: 'Update Document',
476
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
477
+ payload: 'Too Big',
478
+ method: 'updateDocumentOffline',
479
+ user: _this.user,
480
+ messageId: ''
481
+ });
482
+ }
483
+ }
484
+ }
485
+ else {
486
+ console.log('invalid version - ' + collection, currDoc.__v, f_document['__v']);
487
+ var newCurrDocId = currDoc._id;
488
+ if (f_oldDocument) {
489
+ var versionDoc_3 = common_1.deepCopy(currDoc);
490
+ versionDoc_3._id = {
491
+ _id: currDoc._id,
492
+ __v: currDoc.__v
493
+ };
494
+ var updatedDoc = common_1.getMongoMergeUpdatedDoc(f_document, currDoc, f_oldDocument);
495
+ updatedDoc._id = newCurrDocId;
496
+ updatedDoc.__v++;
497
+ index_1.default.getMainDB().model(collection).replaceOne({ _id: newCurrDocId }, updatedDoc).exec().then(function (res) {
498
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc_3).then(function (doc) {
499
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
500
+ $and: [
501
+ { '_id._id': versionDoc_3._id._id },
502
+ { '_id.__v': { $lte: versionDoc_3._id.__v - 4 } }
503
+ ]
504
+ }).exec();
505
+ }, function (err) {
506
+ console.log(err);
507
+ });
508
+ resolve(res.nModified);
509
+ }, function (err) { return reject(err); });
510
+ }
511
+ else {
512
+ reject('OFFLINE - Invalid Version And Could Not Find History - DB: ' + currDoc.__v + ', Trying to update with :' + f_document['__v']);
513
+ }
514
+ }
515
+ }
516
+ else {
517
+ reject(errDoc);
518
+ }
519
+ });
520
+ });
521
+ }
522
+ },
523
+ // Updates 1 document's props (from _id)
524
+ // @Inputs: collection, document id, document version, update paramters ({prop: 'xxx', data: 'yyy})
525
+ // @Outputs: res = 1 (updated 1), res = 0 (not updated), err = not updated/wrong version
526
+ // Search for doc, check version, if found then try and update props
527
+ updateDocumentPropsOffline: {
528
+ check: new simpl_schema_1.default({
529
+ collection: {
530
+ type: String
531
+ },
532
+ doc_id: {
533
+ type: String
534
+ },
535
+ updateParams: {
536
+ type: Array
537
+ },
538
+ 'updateParams.$': {
539
+ type: Object,
540
+ blackbox: true
541
+ },
542
+ doc__v: {
543
+ type: Number
544
+ },
545
+ f_oldDocument: {
546
+ type: Object,
547
+ blackbox: true
548
+ }
549
+ }),
550
+ function: function (collection, doc_id, updateParams, doc__v, f_oldDocument) {
551
+ var _this = this;
552
+ return new Promise(function (resolve, reject) {
553
+ index_1.default.getMainDB().model(collection).findOne({ _id: doc_id }).lean().exec(function (errDoc, currDoc) {
554
+ if (currDoc) {
555
+ var modifiedDoc_2 = common_1.deepCopy(currDoc);
556
+ updateParams.forEach(function (data) {
557
+ modifiedDoc_2[data.prop] = data.data;
558
+ });
559
+ if (modifiedDoc_2.__v === doc__v) {
560
+ var versionDoc = common_1.deepCopy(currDoc);
561
+ versionDoc._id = {
562
+ _id: currDoc._id,
563
+ __v: currDoc.__v
564
+ };
565
+ var schemaErrors = null;
566
+ try {
567
+ index_1.default.getMainDB().model(collection)['simplschema'].validate(modifiedDoc_2);
568
+ }
569
+ catch (errors) {
570
+ schemaErrors = errors;
571
+ _this.callMethodInternal.call(_this, 'insertErrorLog', 'Schema Failed on updateDocumentProps - ' + collection, [schemaErrors, modifiedDoc_2]);
572
+ }
573
+ if (schemaErrors) {
574
+ console.log(schemaErrors);
575
+ reject('Schema Errors');
576
+ }
577
+ else {
578
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc).then(function (doc) {
579
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
580
+ $and: [
581
+ { '_id._id': currDoc._id },
582
+ { '_id.__v': { $lte: currDoc.__v - 4 } }
583
+ ]
584
+ }).exec();
585
+ }, function (err) {
586
+ console.log(err);
587
+ });
588
+ var updates = common_1.getMongoUpdates(currDoc, modifiedDoc_2, true);
589
+ if (updates) {
590
+ index_1.default.getMainDB().model(collection).updateOne({ _id: modifiedDoc_2._id }, updates, { strict: false }).exec().then(function (res) {
591
+ resolve(res.ok);
592
+ }, function (err) { return reject(err); });
593
+ }
594
+ else {
595
+ resolve(1);
596
+ }
597
+ if (common_1.getBinarySize(JSON.stringify(updateParams)) < 200000) {
598
+ log_collection_1.Logs.create({
599
+ _id: mongoose_1.Types.ObjectId().toHexString(),
600
+ date: new Date(),
601
+ type: 'info',
602
+ title: 'Update Document Props',
603
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection + ', Id: ' + doc_id + ', ' + 'Version: ' + doc__v,
604
+ payload: updateParams,
605
+ method: 'updateDocumentPropsOffline',
606
+ user: _this.user,
607
+ messageId: ''
608
+ });
609
+ }
610
+ else {
611
+ log_collection_1.Logs.create({
612
+ _id: mongoose_1.Types.ObjectId().toHexString(),
613
+ date: new Date(),
614
+ type: 'info',
615
+ title: 'Update Document Props',
616
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection + ', Id: ' + doc_id + ', ' + 'Version: ' + doc__v,
617
+ payload: 'Too Big',
618
+ method: 'updateDocumentPropsOffline',
619
+ user: _this.user,
620
+ messageId: ''
621
+ });
622
+ }
623
+ }
624
+ }
625
+ else {
626
+ console.log('invalid version - ' + collection, currDoc.__v, doc__v);
627
+ var newCurrDocId = currDoc._id;
628
+ if (f_oldDocument) {
629
+ var versionDoc_4 = common_1.deepCopy(currDoc);
630
+ versionDoc_4._id = {
631
+ _id: currDoc._id,
632
+ __v: currDoc.__v
633
+ };
634
+ var updatedDoc = common_1.getMongoMergeUpdatedDoc(modifiedDoc_2, currDoc, f_oldDocument);
635
+ updatedDoc._id = newCurrDocId;
636
+ updatedDoc.__v++;
637
+ index_1.default.getMainDB().model(collection).replaceOne({ _id: newCurrDocId }, updatedDoc).exec().then(function (res) {
638
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).create(versionDoc_4).then(function (doc) {
639
+ index_1.default.getMainDB().model(index_1.default.getMainDB().model(collection)['versionCollection']).deleteMany({
640
+ $and: [
641
+ { '_id._id': versionDoc_4._id._id },
642
+ { '_id.__v': { $lte: versionDoc_4._id.__v - 4 } }
643
+ ]
644
+ }).exec();
645
+ }, function (err) {
646
+ console.log(err);
647
+ });
648
+ resolve(res.nModified);
649
+ }, function (err) { return reject(err); });
650
+ }
651
+ else {
652
+ reject('OFFLINE - Invalid Version And Could Not Find History Props - DB: ' + currDoc.__v + ', Trying to update with :' + modifiedDoc_2.__v);
653
+ }
654
+ }
655
+ }
656
+ else {
657
+ reject(errDoc);
658
+ }
659
+ });
660
+ });
661
+ }
662
+ },
663
+ // Removes 1 document (from _id)
664
+ // @Inputs: collection, document id
665
+ // @Outputs: res = 1 (deleted), res = 0 (not deleted), err = not deleted
666
+ // Search for doc, if found then try and remove
667
+ removeDocument: {
668
+ check: new simpl_schema_1.default({
669
+ collection: {
670
+ type: String
671
+ },
672
+ doc_id: {
673
+ type: String
674
+ }
675
+ }),
676
+ function: function (collection, doc_id) {
677
+ var _this = this;
678
+ return new Promise(function (resolve, reject) {
679
+ log_collection_1.Logs.create({
680
+ _id: mongoose_1.Types.ObjectId().toHexString(),
681
+ date: new Date(),
682
+ type: 'info',
683
+ title: 'Remove Document',
684
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
685
+ payload: { _id: doc_id },
686
+ method: 'removeDocument',
687
+ user: _this.user,
688
+ messageId: ''
689
+ });
690
+ index_1.default.getMainDB().model(collection).deleteOne({ _id: doc_id }).exec(function (err, res) {
691
+ if (err) {
692
+ reject(err);
693
+ }
694
+ else {
695
+ resolve(res.ok);
696
+ }
697
+ });
698
+ });
699
+ }
700
+ },
701
+ removeDocumentWithQuery: {
702
+ check: new simpl_schema_1.default({
703
+ collection: {
704
+ type: String
705
+ },
706
+ query: {
707
+ type: Object,
708
+ blackbox: true
709
+ }
710
+ }),
711
+ function: function (collection, query) {
712
+ var _this = this;
713
+ return new Promise(function (resolve, reject) {
714
+ log_collection_1.Logs.create({
715
+ _id: mongoose_1.Types.ObjectId().toHexString(),
716
+ date: new Date(),
717
+ type: 'info',
718
+ title: 'Remove Document (Query)',
719
+ message: 'User: ' + _this.user + ', Collection Type: ' + collection,
720
+ payload: { _id: query },
721
+ method: 'removeDocumentWithQuery',
722
+ user: _this.user,
723
+ messageId: ''
724
+ });
725
+ index_1.default.getMainDB().model(collection).deleteOne(query).exec(function (err, res) {
726
+ if (err) {
727
+ reject(err);
728
+ }
729
+ else {
730
+ resolve(res.ok);
731
+ }
732
+ });
733
+ });
734
+ }
735
+ }
736
+ });
737
+ }
738
+ exports.loadCollectionMethods = loadCollectionMethods;