botmaster-session-ware
Advanced tools
Comparing version 0.1.0 to 0.1.1
@@ -1,1 +0,1 @@ | ||
{"/Users/jonathanwickens/dev/botmaster-session-ware/dist/index.js":{"path":"/Users/jonathanwickens/dev/botmaster-session-ware/dist/index.js","s":{"1":1,"2":3,"3":3,"4":3,"5":3,"6":3,"7":3,"8":0,"9":0,"10":3,"11":3,"12":3,"13":3,"14":3,"15":0,"16":1,"17":1,"18":1,"19":1},"b":{"1":[3,2],"2":[2,1],"3":[3,0],"4":[0,0],"5":[0,0]},"f":{"1":3,"2":3,"3":3,"4":0,"5":1,"6":1},"fnMap":{"1":{"name":"(anonymous_1)","line":1,"loc":{"start":{"line":1,"column":71},"end":{"line":1,"column":82}}},"2":{"name":"f","line":1,"loc":{"start":{"line":1,"column":430},"end":{"line":1,"column":447}}},"3":{"name":"(anonymous_3)","line":1,"loc":{"start":{"line":1,"column":472},"end":{"line":1,"column":483}}},"4":{"name":"(anonymous_4)","line":1,"loc":{"start":{"line":1,"column":615},"end":{"line":1,"column":626}}},"5":{"name":"g","line":1,"loc":{"start":{"line":1,"column":700},"end":{"line":1,"column":717}}},"6":{"name":"(anonymous_6)","line":1,"loc":{"start":{"line":1,"column":778},"end":{"line":1,"column":788}}}},"statementMap":{"1":{"start":{"line":1,"column":13},"end":{"line":1,"column":887}},"2":{"start":{"line":1,"column":83},"end":{"line":1,"column":202}},"3":{"start":{"line":1,"column":202},"end":{"line":1,"column":217}},"4":{"start":{"line":1,"column":217},"end":{"line":1,"column":223}},"5":{"start":{"line":1,"column":223},"end":{"line":1,"column":414}},"6":{"start":{"line":1,"column":230},"end":{"line":1,"column":270}},"7":{"start":{"line":1,"column":270},"end":{"line":1,"column":277}},"8":{"start":{"line":1,"column":283},"end":{"line":1,"column":414}},"9":{"start":{"line":1,"column":341},"end":{"line":1,"column":414}},"10":{"start":{"line":1,"column":414},"end":{"line":1,"column":885}},"11":{"start":{"line":1,"column":448},"end":{"line":1,"column":689}},"12":{"start":{"line":1,"column":484},"end":{"line":1,"column":552}},"13":{"start":{"line":1,"column":552},"end":{"line":1,"column":582}},"14":{"start":{"line":1,"column":582},"end":{"line":1,"column":606}},"15":{"start":{"line":1,"column":627},"end":{"line":1,"column":687}},"16":{"start":{"line":1,"column":718},"end":{"line":1,"column":752}},"17":{"start":{"line":1,"column":752},"end":{"line":1,"column":883}},"18":{"start":{"line":1,"column":789},"end":{"line":1,"column":881}},"19":{"start":{"line":1,"column":887},"end":{"line":1,"column":914}}},"branchMap":{"1":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":92},"end":{"line":1,"column":93}},{"start":{"line":1,"column":95},"end":{"line":1,"column":97}}]},"2":{"line":1,"type":"cond-expr","locations":[{"start":{"line":1,"column":160},"end":{"line":1,"column":169}},{"start":{"line":1,"column":170},"end":{"line":1,"column":186}}]},"3":{"line":1,"type":"if","locations":[{"start":{"line":1,"column":223},"end":{"line":1,"column":223}},{"start":{"line":1,"column":223},"end":{"line":1,"column":223}}]},"4":{"line":1,"type":"if","locations":[{"start":{"line":1,"column":283},"end":{"line":1,"column":283}},{"start":{"line":1,"column":283},"end":{"line":1,"column":283}}]},"5":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":290},"end":{"line":1,"column":314}},{"start":{"line":1,"column":316},"end":{"line":1,"column":340}}]}}},"/Users/jonathanwickens/dev/botmaster-session-ware/dist/adapters/MemoryStore.js":{"path":"/Users/jonathanwickens/dev/botmaster-session-ware/dist/adapters/MemoryStore.js","s":{"1":1,"2":1,"3":1,"4":2,"5":1,"6":1,"7":1,"8":3,"9":0,"10":1,"11":1,"12":3,"13":1,"14":3,"15":1,"16":1},"b":{"1":[2,2],"2":[2,2],"3":[1,1],"4":[1,0],"5":[0,3],"6":[3,2]},"f":{"1":1,"2":1,"3":1,"4":3,"5":1,"6":3,"7":3,"8":1},"fnMap":{"1":{"name":"(anonymous_1)","line":1,"loc":{"start":{"line":1,"column":30},"end":{"line":1,"column":40}}},"2":{"name":"a","line":1,"loc":{"start":{"line":1,"column":41},"end":{"line":1,"column":56}}},"3":{"name":"(anonymous_3)","line":1,"loc":{"start":{"line":1,"column":210},"end":{"line":1,"column":225}}},"4":{"name":"_classCallCheck","line":1,"loc":{"start":{"line":1,"column":269},"end":{"line":1,"column":298}}},"5":{"name":"(anonymous_5)","line":1,"loc":{"start":{"line":1,"column":393},"end":{"line":1,"column":403}}},"6":{"name":"a","line":1,"loc":{"start":{"line":1,"column":404},"end":{"line":1,"column":416}}},"7":{"name":"get","line":1,"loc":{"start":{"line":1,"column":495},"end":{"line":1,"column":510}}},"8":{"name":"set","line":1,"loc":{"start":{"line":1,"column":572},"end":{"line":1,"column":589}}}},"statementMap":{"1":{"start":{"line":1,"column":13},"end":{"line":1,"column":269}},"2":{"start":{"line":1,"column":41},"end":{"line":1,"column":203}},"3":{"start":{"line":1,"column":57},"end":{"line":1,"column":202}},"4":{"start":{"line":1,"column":86},"end":{"line":1,"column":202}},"5":{"start":{"line":1,"column":203},"end":{"line":1,"column":265}},"6":{"start":{"line":1,"column":226},"end":{"line":1,"column":264}},"7":{"start":{"line":1,"column":269},"end":{"line":1,"column":377}},"8":{"start":{"line":1,"column":299},"end":{"line":1,"column":376}},"9":{"start":{"line":1,"column":320},"end":{"line":1,"column":376}},"10":{"start":{"line":1,"column":377},"end":{"line":1,"column":640}},"11":{"start":{"line":1,"column":404},"end":{"line":1,"column":455}},"12":{"start":{"line":1,"column":417},"end":{"line":1,"column":454}},"13":{"start":{"line":1,"column":455},"end":{"line":1,"column":636}},"14":{"start":{"line":1,"column":511},"end":{"line":1,"column":552}},"15":{"start":{"line":1,"column":590},"end":{"line":1,"column":630}},"16":{"start":{"line":1,"column":640},"end":{"line":1,"column":667}}},"branchMap":{"1":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":106},"end":{"line":1,"column":118}},{"start":{"line":1,"column":120},"end":{"line":1,"column":122}}]},"2":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":141},"end":{"line":1,"column":152}},{"start":{"line":1,"column":155},"end":{"line":1,"column":168}}]},"3":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":233},"end":{"line":1,"column":234}},{"start":{"line":1,"column":236},"end":{"line":1,"column":252}}]},"4":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":253},"end":{"line":1,"column":254}},{"start":{"line":1,"column":256},"end":{"line":1,"column":262}}]},"5":{"line":1,"type":"if","locations":[{"start":{"line":1,"column":299},"end":{"line":1,"column":299}},{"start":{"line":1,"column":299},"end":{"line":1,"column":299}}]},"6":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":534},"end":{"line":1,"column":547}},{"start":{"line":1,"column":549},"end":{"line":1,"column":551}}]}}}} | ||
{"/Users/jonathanwickens/dev/botmaster-session-ware/dist/index.js":{"path":"/Users/jonathanwickens/dev/botmaster-session-ware/dist/index.js","s":{"1":1,"2":8,"3":3,"4":3,"5":3,"6":3,"7":3,"8":3,"9":0,"10":0,"11":3,"12":3,"13":3,"14":3,"15":3,"16":0,"17":1,"18":1,"19":1,"20":1},"b":{"1":[3,2],"2":[2,1],"3":[3,0],"4":[0,0],"5":[0,0]},"f":{"1":8,"2":3,"3":3,"4":3,"5":0,"6":1,"7":1},"fnMap":{"1":{"name":"(anonymous_1)","line":1,"loc":{"start":{"line":1,"column":140},"end":{"line":1,"column":151}}},"2":{"name":"(anonymous_2)","line":1,"loc":{"start":{"line":1,"column":218},"end":{"line":1,"column":229}}},"3":{"name":"f","line":1,"loc":{"start":{"line":1,"column":577},"end":{"line":1,"column":594}}},"4":{"name":"(anonymous_4)","line":1,"loc":{"start":{"line":1,"column":623},"end":{"line":1,"column":634}}},"5":{"name":"(anonymous_5)","line":1,"loc":{"start":{"line":1,"column":770},"end":{"line":1,"column":781}}},"6":{"name":"g","line":1,"loc":{"start":{"line":1,"column":855},"end":{"line":1,"column":874}}},"7":{"name":"(anonymous_7)","line":1,"loc":{"start":{"line":1,"column":939},"end":{"line":1,"column":949}}}},"statementMap":{"1":{"start":{"line":1,"column":13},"end":{"line":1,"column":1035}},"2":{"start":{"line":1,"column":152},"end":{"line":1,"column":204}},"3":{"start":{"line":1,"column":230},"end":{"line":1,"column":349}},"4":{"start":{"line":1,"column":349},"end":{"line":1,"column":364}},"5":{"start":{"line":1,"column":364},"end":{"line":1,"column":370}},"6":{"start":{"line":1,"column":370},"end":{"line":1,"column":561}},"7":{"start":{"line":1,"column":377},"end":{"line":1,"column":417}},"8":{"start":{"line":1,"column":417},"end":{"line":1,"column":424}},"9":{"start":{"line":1,"column":430},"end":{"line":1,"column":561}},"10":{"start":{"line":1,"column":488},"end":{"line":1,"column":561}},"11":{"start":{"line":1,"column":561},"end":{"line":1,"column":1033}},"12":{"start":{"line":1,"column":595},"end":{"line":1,"column":844}},"13":{"start":{"line":1,"column":635},"end":{"line":1,"column":707}},"14":{"start":{"line":1,"column":707},"end":{"line":1,"column":737}},"15":{"start":{"line":1,"column":737},"end":{"line":1,"column":761}},"16":{"start":{"line":1,"column":782},"end":{"line":1,"column":842}},"17":{"start":{"line":1,"column":875},"end":{"line":1,"column":909}},"18":{"start":{"line":1,"column":909},"end":{"line":1,"column":1031}},"19":{"start":{"line":1,"column":950},"end":{"line":1,"column":1029}},"20":{"start":{"line":1,"column":1035},"end":{"line":1,"column":1062}}},"branchMap":{"1":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":239},"end":{"line":1,"column":240}},{"start":{"line":1,"column":242},"end":{"line":1,"column":244}}]},"2":{"line":1,"type":"cond-expr","locations":[{"start":{"line":1,"column":307},"end":{"line":1,"column":316}},{"start":{"line":1,"column":317},"end":{"line":1,"column":333}}]},"3":{"line":1,"type":"if","locations":[{"start":{"line":1,"column":370},"end":{"line":1,"column":370}},{"start":{"line":1,"column":370},"end":{"line":1,"column":370}}]},"4":{"line":1,"type":"if","locations":[{"start":{"line":1,"column":430},"end":{"line":1,"column":430}},{"start":{"line":1,"column":430},"end":{"line":1,"column":430}}]},"5":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":437},"end":{"line":1,"column":461}},{"start":{"line":1,"column":463},"end":{"line":1,"column":487}}]}}},"/Users/jonathanwickens/dev/botmaster-session-ware/dist/adapters/MemoryStore.js":{"path":"/Users/jonathanwickens/dev/botmaster-session-ware/dist/adapters/MemoryStore.js","s":{"1":1,"2":1,"3":1,"4":2,"5":1,"6":1,"7":1,"8":3,"9":0,"10":1,"11":1,"12":3,"13":1,"14":3,"15":1,"16":1},"b":{"1":[2,2],"2":[2,2],"3":[1,1],"4":[1,0],"5":[0,3],"6":[3,2]},"f":{"1":1,"2":1,"3":1,"4":3,"5":1,"6":3,"7":3,"8":1},"fnMap":{"1":{"name":"(anonymous_1)","line":1,"loc":{"start":{"line":1,"column":30},"end":{"line":1,"column":40}}},"2":{"name":"a","line":1,"loc":{"start":{"line":1,"column":41},"end":{"line":1,"column":56}}},"3":{"name":"(anonymous_3)","line":1,"loc":{"start":{"line":1,"column":210},"end":{"line":1,"column":225}}},"4":{"name":"_classCallCheck","line":1,"loc":{"start":{"line":1,"column":269},"end":{"line":1,"column":298}}},"5":{"name":"(anonymous_5)","line":1,"loc":{"start":{"line":1,"column":393},"end":{"line":1,"column":403}}},"6":{"name":"a","line":1,"loc":{"start":{"line":1,"column":404},"end":{"line":1,"column":416}}},"7":{"name":"get","line":1,"loc":{"start":{"line":1,"column":495},"end":{"line":1,"column":510}}},"8":{"name":"set","line":1,"loc":{"start":{"line":1,"column":572},"end":{"line":1,"column":589}}}},"statementMap":{"1":{"start":{"line":1,"column":13},"end":{"line":1,"column":269}},"2":{"start":{"line":1,"column":41},"end":{"line":1,"column":203}},"3":{"start":{"line":1,"column":57},"end":{"line":1,"column":202}},"4":{"start":{"line":1,"column":86},"end":{"line":1,"column":202}},"5":{"start":{"line":1,"column":203},"end":{"line":1,"column":265}},"6":{"start":{"line":1,"column":226},"end":{"line":1,"column":264}},"7":{"start":{"line":1,"column":269},"end":{"line":1,"column":377}},"8":{"start":{"line":1,"column":299},"end":{"line":1,"column":376}},"9":{"start":{"line":1,"column":320},"end":{"line":1,"column":376}},"10":{"start":{"line":1,"column":377},"end":{"line":1,"column":640}},"11":{"start":{"line":1,"column":404},"end":{"line":1,"column":455}},"12":{"start":{"line":1,"column":417},"end":{"line":1,"column":454}},"13":{"start":{"line":1,"column":455},"end":{"line":1,"column":636}},"14":{"start":{"line":1,"column":511},"end":{"line":1,"column":552}},"15":{"start":{"line":1,"column":590},"end":{"line":1,"column":630}},"16":{"start":{"line":1,"column":640},"end":{"line":1,"column":667}}},"branchMap":{"1":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":106},"end":{"line":1,"column":118}},{"start":{"line":1,"column":120},"end":{"line":1,"column":122}}]},"2":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":141},"end":{"line":1,"column":152}},{"start":{"line":1,"column":155},"end":{"line":1,"column":168}}]},"3":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":233},"end":{"line":1,"column":234}},{"start":{"line":1,"column":236},"end":{"line":1,"column":252}}]},"4":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":253},"end":{"line":1,"column":254}},{"start":{"line":1,"column":256},"end":{"line":1,"column":262}}]},"5":{"line":1,"type":"if","locations":[{"start":{"line":1,"column":299},"end":{"line":1,"column":299}},{"start":{"line":1,"column":299},"end":{"line":1,"column":299}}]},"6":{"line":1,"type":"binary-expr","locations":[{"start":{"line":1,"column":534},"end":{"line":1,"column":547}},{"start":{"line":1,"column":549},"end":{"line":1,"column":551}}]}}}} |
@@ -1,1 +0,49 @@ | ||
"use strict";var _createClass=function(){function a(b,c){for(var e,d=0;d<c.length;d++)e=c[d],e.enumerable=e.enumerable||!1,e.configurable=!0,"value"in e&&(e.writable=!0),Object.defineProperty(b,e.key,e)}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}();function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var MemoryStore=function(){function a(){_classCallCheck(this,a),this.store={}}return _createClass(a,[{key:"get",value:function get(b){return Promise.resolve(this.store[b]||{})}},{key:"set",value:function set(b,c){return this.store[b]=c,Promise.resolve()}}]),a}();module.exports=MemoryStore; | ||
"use strict"; | ||
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } | ||
/** | ||
* The most basic adapter ever for SessionWare | ||
* @class | ||
*/ | ||
var MemoryStore = function () { | ||
function MemoryStore() { | ||
_classCallCheck(this, MemoryStore); | ||
this.store = {}; | ||
} | ||
/** | ||
* Get or create a session with the id. | ||
* @param {String} id a unique id for the session | ||
* @returns {Promise} evaluates to an object that is the session | ||
*/ | ||
_createClass(MemoryStore, [{ | ||
key: "get", | ||
value: function get(id) { | ||
return Promise.resolve(this.store[id] || {}); | ||
} | ||
/** | ||
* Update a session in the storage. | ||
* @param {String} id a unique id for the session | ||
* @param {Object} value the new value for the session | ||
* @return {Promise} resolves when the session has been saved | ||
*/ | ||
}, { | ||
key: "set", | ||
value: function set(id, value) { | ||
this.store[id] = value; | ||
return Promise.resolve(); | ||
} | ||
}]); | ||
return MemoryStore; | ||
}(); | ||
module.exports = MemoryStore; |
@@ -1,1 +0,59 @@ | ||
'use strict';var R=require('ramda'),Debug=require('debug'),SessionWare=function(a){var _ref=a||{},_ref$sessionPath=_ref.sessionPath,c=_ref$sessionPath===void 0?'session':_ref$sessionPath,b=_ref.adapter;c=c.split('.');var d;if(!b){var e=require('./adapters/MemoryStore');d=new e}else if(d=b,'function'!=typeof d.get||'function'!=typeof d.set)throw new Error('Adapter does not have required methods get and/or set');return{incoming:function f(h,i,j){d.get(i.sender.id).then(function(k){Debug('botmaster:session:incoming')('got session for '+i.sender.id);var l=R.lensPath(c.splice(1));i[c[0]]=R.set(l,k,i),j()}).catch(function(k){Debug('botmaster:session:incoming')('error '+k.message),j(k)})},outgoing:function g(h,i,j){var k=R.lensPath(c),l=R.view(k,i);d.set(i.sender.id,l).then(function(){Debug('botmaster:session:outgoing')('updated session for '+i.sender.id),delete i.context,j()})}}};module.exports=SessionWare; | ||
'use strict'; | ||
var R = require('ramda'); | ||
var Debug = require('debug'); | ||
var recipient = R.path(['recipient', 'id']); | ||
var sender = R.path(['sender', 'id']); | ||
var idFromUpdate = function idFromUpdate(update) { | ||
return 'recipient:' + recipient(update) + '-sender:' + sender(update); | ||
}; | ||
/** | ||
* Create an object providing incoming and outgoing middleware | ||
* @param {Object} [options] options object for generated sessionWare | ||
* @param {Object} [options.adapter] an object implementing the adapter api. defaults to in memory. | ||
* @param {String} [options.sessionPath] dot denoted path to where to store the context in the update. defaults to 'session' | ||
* @return {Object} an object that contains two functions 'incoming' and 'outgoing'. The incoming should be placed before any middleware that requires it and the outgoing should be placed after all middleware have used it. | ||
*/ | ||
var SessionWare = function SessionWare(options) { | ||
var _ref = options || {}, | ||
_ref$sessionPath = _ref.sessionPath, | ||
sessionPath = _ref$sessionPath === undefined ? 'session' : _ref$sessionPath, | ||
adapter = _ref.adapter; | ||
sessionPath = sessionPath.split('.'); | ||
var store = void 0; | ||
if (adapter) { | ||
store = adapter; | ||
if (typeof store.get !== 'function' || typeof store.set !== 'function') throw new Error('Adapter does not have required methods get and/or set'); | ||
} else { | ||
var MemoryStore = require('./adapters/MemoryStore'); | ||
store = new MemoryStore(); | ||
} | ||
var incoming = function incoming(bot, update, next) { | ||
store.get(idFromUpdate(update)).then(function (session) { | ||
Debug('botmaster:session:incoming')('got session for ' + idFromUpdate(update)); | ||
var sessionPathLens = R.lensPath(sessionPath.splice(1)); | ||
update[sessionPath[0]] = R.set(sessionPathLens, session, update); | ||
next(); | ||
}).catch(function (err) { | ||
Debug('botmaster:session:incoming')('error ' + err.message); | ||
next(err); | ||
}); | ||
}; | ||
var outgoing = function outgoing(bot, update, messsage, next) { | ||
assert(typeof next == 'function', 'please ensure you have the correct version of botmaster'); | ||
var sessionPathLens = R.lensPath(sessionPath); | ||
var session = R.view(sessionPathLens, update); | ||
store.set(idFromUpdate(update), session).then(function () { | ||
Debug('botmaster:session:outgoing')('updated session for ' + idFromUpdate(update)); | ||
next(); | ||
}); | ||
}; | ||
return { incoming: incoming, outgoing: outgoing }; | ||
}; | ||
module.exports = SessionWare; |
{ | ||
"name": "botmaster-session-ware", | ||
"version": "0.1.0", | ||
"version": "0.1.1", | ||
"description": "botmaster session ware for storing context", | ||
@@ -11,3 +11,3 @@ "main": "dist/index.js", | ||
"coveralls": "cat ./coverage/lcov.info | coveralls", | ||
"build": "mkdir -p dist && babel --presets=es2015,babili src --out-dir dist", | ||
"build": "mkdir -p dist && babel --presets=es2015 src --out-dir dist", | ||
"docs": "documentation readme src/index.js --section=\"API Usage\"", | ||
@@ -32,6 +32,8 @@ "prepublish": "npm run build" | ||
}, | ||
"peerDependencies": { | ||
"botmaster": ">3.0.0" | ||
}, | ||
"homepage": "https://github.com/botmasterai/botmaster-mem-session-ware#readme", | ||
"devDependencies": { | ||
"babel-cli": "^6.22.2", | ||
"babel-preset-babili": "0.0.10", | ||
"babel-preset-es2015": "^6.22.0", | ||
@@ -38,0 +40,0 @@ "documentation": "^4.0.0-beta.18", |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
82998
8
537
1
0
3