diff options
| author | Jules Laplace <jules@okfoc.us> | 2016-10-05 17:49:19 -0400 |
|---|---|---|
| committer | Jules Laplace <jules@okfoc.us> | 2016-10-05 17:49:19 -0400 |
| commit | ae843591da0fea1a57684f26737be0b484718809 (patch) | |
| tree | 547be3ae5d69c3568626a2f9ce9f35e034c82ed6 /examples/lib/okpush | |
| parent | 95df0e83fdb7f564d64b6c916e674e0db46c116d (diff) | |
okpush template stuff
Diffstat (limited to 'examples/lib/okpush')
| -rw-r--r-- | examples/lib/okpush/apn.js | 19 | ||||
| -rw-r--r-- | examples/lib/okpush/db.js | 62 | ||||
| -rw-r--r-- | examples/lib/okpush/index.js | 62 | ||||
| -rw-r--r-- | examples/lib/okpush/package.json | 4 | ||||
| -rw-r--r-- | examples/lib/okpush/templates/index.liquid | 11 | ||||
| l--------- | examples/lib/okpush/templates/partials | 1 | ||||
| -rw-r--r-- | examples/lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest | 16 | ||||
| -rw-r--r-- | examples/lib/okpush/test_certs/Certificates.p12 | bin | 0 -> 3209 bytes | |||
| -rw-r--r-- | examples/lib/okpush/test_certs/aps_development.cer | bin | 0 -> 1421 bytes | |||
| -rw-r--r-- | examples/lib/okpush/test_certs/overlayer_dev_cert.pem | 32 | ||||
| -rw-r--r-- | examples/lib/okpush/test_certs/overlayer_dev_key.pem | 68 |
11 files changed, 242 insertions, 33 deletions
diff --git a/examples/lib/okpush/apn.js b/examples/lib/okpush/apn.js index 11b8711..050a466 100644 --- a/examples/lib/okpush/apn.js +++ b/examples/lib/okpush/apn.js @@ -1,13 +1,14 @@ -var config = require('./Config'); -var apn = require('apn'); +var config = require('./Config') +var apn = require('apn') var db = require('./db') +var apnConnection, apnFeedback function init (config) { - var apnConnection = new apn.Connection(config.apn.connection) + apnConnection = new apn.Connection(config.apn.connection) apnConnection.on('transmissionError', onTransmissionError) - var apnFeedback = new apn.Feedback(config.apn.feedback) + apnFeedback = new apn.Feedback(config.apn.feedback) apnFeedback.on('feedback', onFeedback) return apnConnection @@ -20,7 +21,7 @@ function onTransmissionError (errorCode, notification, recipient) { var token = recipient.token.toString('hex').toUpperCase() console.log('Invalid token: removing device ' + token) - pushAssociations.removeDevice(token) + db.remove(token) } } @@ -28,17 +29,17 @@ function onFeedback (deviceInfos) { console.log('Feedback service, number of devices to remove: ' + deviceInfos.length) if (deviceInfos.length > 0) { - pushAssociations.removeDevices(deviceInfos.map(function (deviceInfo) { + db.removeDevices(deviceInfos.map(function (deviceInfo) { return deviceInfo.device.token.toString('hex') }) } } -var push = function (tokens, payload) { - apnSender().pushNotification(payload, tokens) +function push (tokens, payload) { + apnConnection.pushNotification(payload, tokens) } -var buildPayload = function (options) { +function buildPayload (options) { var notif = new apn.Notification() notif.expiry = options.expiry || 0 diff --git a/examples/lib/okpush/db.js b/examples/lib/okpush/db.js index 5a66b01..67d1ba8 100644 --- a/examples/lib/okpush/db.js +++ b/examples/lib/okpush/db.js @@ -1,29 +1,63 @@ -// db +var mongoose = require('mongoose') +var _ = require('lodash') +var db, PushToken function init (config) { - var db = mongoose.connect(config.mongodbUrl); - mongoose.connection.on('error', errorHandler); + db = mongoose.connect(config.mongodbUrl) + mongoose.connection.on('error', errorHandler) - var pushAssociationSchema = new db.Schema({ - user: { - type: 'String', - required: true - }, + var pushTokenSchema = new db.Schema({ type: { type: 'String', required: true, enum: ['ios', 'android'], - lowercase: true + lowercase: true, }, token: { type: 'String', - required: true + required: true, } - }); + }) - PushAssociation = db.model('PushAssociation', pushAssociationSchema); + PushToken = db.model('PushToken', pushTokenSchema) } function errorHandler (error) { - console.error('ERROR: ' + error); -};
\ No newline at end of file + console.error('ERROR: ' + error) +} +function add (deviceType, token) { + var pushItem = new PushToken({ type: deviceType, token: token }) + pushItem.save() +} +function getAll (cb) { + var wcb = wrap(cb) + PushToken.find(wcb) +} +function removeDevice () { + PushToken.remove({token: token}, function (err) { + if (err) console.log(err) + }) +} +function removeDevices (tokens) { + PushAssociation.remove({token: {$in: tokens}}, function (err) { + if (err) console.log(err) + }) +} +function wrap (cb) { + return function (err, items) { + if (err) return cb(err, null) + + var items = _.map(items, function (item) { + return _.pick(item, ['type', 'token']) + }) + + return callback(null, items) + } +} +module.exports = { + init: init, + add: add, + getAll: getAll, + removeDevice: removeDevice, + removeDevices: removeDevices, +}
\ No newline at end of file diff --git a/examples/lib/okpush/index.js b/examples/lib/okpush/index.js index 8b10918..e8b6549 100644 --- a/examples/lib/okpush/index.js +++ b/examples/lib/okpush/index.js @@ -1,27 +1,71 @@ /** */ -var apn = require('apn'); +var OKTemplate = require('../../../app/node_modules/oktemplate') +var passport = require('passport') +var apn = require('./apn') +var db = require('./db') + +passport.use(new DigestStrategy({qop: 'auth'}, + function authenticate(username, done) { + if (!process.env.OK_USER || !process.env.OK_PASS) { + return done(new Error('No user or pass configured on server')) + } else { + return done(null, process.env.OK_USER, process.env.OK_PASS) + } +})) function OKPush (options) { if (!(this instanceof OKPush)) return new OKPush(options) options = options || {} if (!options.express) - throw new Error('Express not provided to OKPush'); + throw new Error('Express not provided to OKPush') if (!options.config) - throw new Error('Configuration not provided to OKPush'); - + throw new Error('Configuration not provided to OKPush') + if (!options.config.notifications) + throw new Error('Notifications not defined in OKPush') + var express = options.express var router = express.Router() var config = options.config - var db = options.db + var meta = options.meta + var error = options.errorHandler + // var okcms_db = options.db + + var templateProvider = this._templateProvider = new OKTemplate({ + root: path.join(__dirname, './templates'), + debug: meta.debug + }) + + var templates = {} + templates['index'] = templateProvider.getTemplate('index') + + apn.init() + db.init() + + router.use('/admin/', passport.initialize()) + router.all('/admin/(:path*)?', passport.authenticate('digest', { + session: false + })) + + // pass in admin middleware! + router.get('/admin/', function (req, res) { + var data = { + meta: meta, + notifications: config.notifications, + } + templates['index'].render(data).then(function(rendered) { + res.send(rendered); + }).fail(error(req, res, 500)) + }) - router.get('*', function (req, res) { - res.send(config.stuff) + router.post('/send', function (req, res) { + // add a key }) - router.post('*', function (req, res) { - throw new Error('OKPush POST requests not implemented') + // should work without middleware + router.post('/add', function (req, res) { + // add a key }) this._router = router diff --git a/examples/lib/okpush/package.json b/examples/lib/okpush/package.json index 7af03ae..4c2f4a1 100644 --- a/examples/lib/okpush/package.json +++ b/examples/lib/okpush/package.json @@ -9,6 +9,8 @@ "author": "okfocus <frontdesk@okfoc.us>", "license": "LNT", "dependencies": { - "apn": "^2.1.1" + "apn": "^2.1.1", + "lodash": "^4.16.3", + "mongoose": "^4.6.2" } } diff --git a/examples/lib/okpush/templates/index.liquid b/examples/lib/okpush/templates/index.liquid new file mode 100644 index 0000000..388a95b --- /dev/null +++ b/examples/lib/okpush/templates/index.liquid @@ -0,0 +1,11 @@ +{% include 'partials/head' %} + +{% include 'partials/flash' %} + +<nav class="resource-nav"> +</nav> + +<section class="main resource resource-new"> +</section> + +{% include 'partials/tail' %} diff --git a/examples/lib/okpush/templates/partials b/examples/lib/okpush/templates/partials new file mode 120000 index 0000000..490ec14 --- /dev/null +++ b/examples/lib/okpush/templates/partials @@ -0,0 +1 @@ +../../../../themes/okadmin/templates/partials/
\ No newline at end of file diff --git a/examples/lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest b/examples/lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest new file mode 100644 index 0000000..3a4074a --- /dev/null +++ b/examples/lib/okpush/test_certs/CertificateSigningRequest.certSigningRequest @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIICkjCCAXoCAQAwTTEdMBsGCSqGSIb3DQEJARYOanVsZXNAb2tmb2MudXMxHzAd +BgNVBAMMFkp1bGlhbiBMYXBsYWNlIERFViBLRVkxCzAJBgNVBAYTAlVTMIIBIjAN +BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArrpXz8B0q/tJ2+N6gjK2zLNPIIlA +lzrE46TIkY10xo9jW3vBRgZL9V5xKtmCWf3KfR2I7KioyqqnZvz6++TV/M3rZptJ +XN8yMmG4mjTqgC1V2SubYyUZqpqkfyLK1ePimsg09UUNxwNcIyBJun+f8wXqz7HK +Kieiq+d7oTs+WJbWdkIftxe7hjL2n93PI1LLCF15Cx8s7XP7R7QsTGMvHUzYYHiL +4bc+r54jpZ28onVAwdYx+p3WkKzdFGjkrIl++IXmyJr0E7jilfrKwMWi4tvCKgXV +KH6VmWLIKOtfKVMdIK0WQ9ij3kRHfEwgN/djC3M2UWFEGLx1d7FuL5c+nQIDAQAB +oAAwDQYJKoZIhvcNAQELBQADggEBAIGOwvuW7HaOb1h+nkpIDTHNRN6Lw3MTg8nU +68skeSFatC8lC4e//Gsl1z8iyR7amhoMrZ29f4Tgs5w8NFgcVmzdp5CL126WA3qV +Qu+xZxhgwUnLRxtpDUVtTdJGaYNmowpm4mqs5YFg6WCIhWg+kuEJJ8MSOkYHtyAx +HIpbfjeSW69VGelr+vGZ6Jf07UCquwJCJR4WmsIyruJhvf2CQMPsT3bXKrhu/sWg +WyjjCjXVLeDOO/tiRMnPteCcDZPsXKyi9PPkSF4u591YoUL0UxjlzlignBT4FSyq +s8kdmrEHWIW1BAscmNVny2YTuGjbFos/GBSMDeJvoXdvPS2kRiQ= +-----END CERTIFICATE REQUEST----- diff --git a/examples/lib/okpush/test_certs/Certificates.p12 b/examples/lib/okpush/test_certs/Certificates.p12 Binary files differnew file mode 100644 index 0000000..6e61158 --- /dev/null +++ b/examples/lib/okpush/test_certs/Certificates.p12 diff --git a/examples/lib/okpush/test_certs/aps_development.cer b/examples/lib/okpush/test_certs/aps_development.cer Binary files differnew file mode 100644 index 0000000..8d55dd4 --- /dev/null +++ b/examples/lib/okpush/test_certs/aps_development.cer diff --git a/examples/lib/okpush/test_certs/overlayer_dev_cert.pem b/examples/lib/okpush/test_certs/overlayer_dev_cert.pem new file mode 100644 index 0000000..3758dd2 --- /dev/null +++ b/examples/lib/okpush/test_certs/overlayer_dev_cert.pem @@ -0,0 +1,32 @@ +-----BEGIN CERTIFICATE----- +MIIFiTCCBHGgAwIBAgIIaNpEjSUbbWwwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTYxMDA0MjAxMTM3WhcNMTcxMDA0MjAxMTM3WjCBiDEiMCAGCgmSJomT8ixk +AQEMEnVzLm9rZm9jLm92ZXJsYXllcjFAMD4GA1UEAww3QXBwbGUgRGV2ZWxvcG1l +bnQgSU9TIFB1c2ggU2VydmljZXM6IHVzLm9rZm9jLm92ZXJsYXllcjETMBEGA1UE +CwwKNUVIOVc1WDVTSjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCuulfPwHSr+0nb43qCMrbMs08giUCXOsTjpMiRjXTGj2Nbe8FG +Bkv1XnEq2YJZ/cp9HYjsqKjKqqdm/Pr75NX8zetmm0lc3zIyYbiaNOqALVXZK5tj +JRmqmqR/IsrV4+KayDT1RQ3HA1wjIEm6f5/zBerPscoqJ6Kr53uhOz5YltZ2Qh+3 +F7uGMvaf3c8jUssIXXkLHyztc/tHtCxMYy8dTNhgeIvhtz6vniOlnbyidUDB1jH6 +ndaQrN0UaOSsiX74hebImvQTuOKV+srAxaLi28IqBdUofpWZYsgo618pUx0grRZD +2KPeREd8TCA392MLczZRYUQYvHV3sW4vlz6dAgMBAAGjggHlMIIB4TAdBgNVHQ4E +FgQUckSbISzH7PTE7R9gsIb/sxKzHrgwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSI +JxcJqbYYYIvs67r2R1nFUlSjtzCCAQ8GA1UdIASCAQYwggECMIH/BgkqhkiG92Nk +BQEwgfEwgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZp +Y2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ug +c3RhdGVtZW50cy4wKQYIKwYBBQUHAgEWHWh0dHA6Ly93d3cuYXBwbGUuY29tL2Fw +cGxlY2EvME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUu +Y29tL2NlcnRpZmljYXRpb25hdXRob3JpdHkvd3dkcmNhLmNybDALBgNVHQ8EBAMC +B4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwEAYKKoZIhvdjZAYDAQQCBQAwDQYJKoZI +hvcNAQEFBQADggEBAEuQKbpqxQPnazN4A0NVB7YRr2M2Hk5DtV4M/QT8OFDY1IsA +s4U8NmI9AMgoszIdLG3n4x2Y4mm6yTYDEMQpaJRbir9Fx6WcZQ4GB72iZ1M/1fkC +79Yq17yzxM9Awf2igx1EkZhzy6Oq+7cUX9Jbz5IQrPyfXe5hpaOmY4jnWgSlaiwJ +6bBhFHwhJY9ekAFOyRnZS7hQD4mLOBZLti/lH4Z2zadd21DbM/uhUvLJgYpIRplP +hoFxV5bev5vv9A0dbYw6ERa3+aG8HHmP9N4u1/JxHIX2VlYzzLj1l7Tlps6QG6/r +4CsJBIfpGjxwznrYJBN5ox1KlFxNLwD3UNpLhOQ= +-----END CERTIFICATE----- diff --git a/examples/lib/okpush/test_certs/overlayer_dev_key.pem b/examples/lib/okpush/test_certs/overlayer_dev_key.pem new file mode 100644 index 0000000..30cb696 --- /dev/null +++ b/examples/lib/okpush/test_certs/overlayer_dev_key.pem @@ -0,0 +1,68 @@ +Bag Attributes + friendlyName: Apple Development IOS Push Services: us.okfoc.overlayer + localKeyID: 72 44 9B 21 2C C7 EC F4 C4 ED 1F 60 B0 86 FF B3 12 B3 1E B8 +subject=/UID=us.okfoc.overlayer/CN=Apple Development IOS Push Services: us.okfoc.overlayer/OU=5EH9W5X5SJ/C=US +issuer=/C=US/O=Apple Inc./OU=Apple Worldwide Developer Relations/CN=Apple Worldwide Developer Relations Certification Authority +-----BEGIN CERTIFICATE----- +MIIFiTCCBHGgAwIBAgIIaNpEjSUbbWwwDQYJKoZIhvcNAQEFBQAwgZYxCzAJBgNV +BAYTAlVTMRMwEQYDVQQKDApBcHBsZSBJbmMuMSwwKgYDVQQLDCNBcHBsZSBXb3Js +ZHdpZGUgRGV2ZWxvcGVyIFJlbGF0aW9uczFEMEIGA1UEAww7QXBwbGUgV29ybGR3 +aWRlIERldmVsb3BlciBSZWxhdGlvbnMgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw +HhcNMTYxMDA0MjAxMTM3WhcNMTcxMDA0MjAxMTM3WjCBiDEiMCAGCgmSJomT8ixk +AQEMEnVzLm9rZm9jLm92ZXJsYXllcjFAMD4GA1UEAww3QXBwbGUgRGV2ZWxvcG1l +bnQgSU9TIFB1c2ggU2VydmljZXM6IHVzLm9rZm9jLm92ZXJsYXllcjETMBEGA1UE +CwwKNUVIOVc1WDVTSjELMAkGA1UEBhMCVVMwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQCuulfPwHSr+0nb43qCMrbMs08giUCXOsTjpMiRjXTGj2Nbe8FG +Bkv1XnEq2YJZ/cp9HYjsqKjKqqdm/Pr75NX8zetmm0lc3zIyYbiaNOqALVXZK5tj +JRmqmqR/IsrV4+KayDT1RQ3HA1wjIEm6f5/zBerPscoqJ6Kr53uhOz5YltZ2Qh+3 +F7uGMvaf3c8jUssIXXkLHyztc/tHtCxMYy8dTNhgeIvhtz6vniOlnbyidUDB1jH6 +ndaQrN0UaOSsiX74hebImvQTuOKV+srAxaLi28IqBdUofpWZYsgo618pUx0grRZD +2KPeREd8TCA392MLczZRYUQYvHV3sW4vlz6dAgMBAAGjggHlMIIB4TAdBgNVHQ4E +FgQUckSbISzH7PTE7R9gsIb/sxKzHrgwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSI +JxcJqbYYYIvs67r2R1nFUlSjtzCCAQ8GA1UdIASCAQYwggECMIH/BgkqhkiG92Nk +BQEwgfEwgcMGCCsGAQUFBwICMIG2DIGzUmVsaWFuY2Ugb24gdGhpcyBjZXJ0aWZp +Y2F0ZSBieSBhbnkgcGFydHkgYXNzdW1lcyBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu +IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl +LCBjZXJ0aWZpY2F0ZSBwb2xpY3kgYW5kIGNlcnRpZmljYXRpb24gcHJhY3RpY2Ug +c3RhdGVtZW50cy4wKQYIKwYBBQUHAgEWHWh0dHA6Ly93d3cuYXBwbGUuY29tL2Fw +cGxlY2EvME0GA1UdHwRGMEQwQqBAoD6GPGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUu +Y29tL2NlcnRpZmljYXRpb25hdXRob3JpdHkvd3dkcmNhLmNybDALBgNVHQ8EBAMC +B4AwEwYDVR0lBAwwCgYIKwYBBQUHAwIwEAYKKoZIhvdjZAYDAQQCBQAwDQYJKoZI +hvcNAQEFBQADggEBAEuQKbpqxQPnazN4A0NVB7YRr2M2Hk5DtV4M/QT8OFDY1IsA +s4U8NmI9AMgoszIdLG3n4x2Y4mm6yTYDEMQpaJRbir9Fx6WcZQ4GB72iZ1M/1fkC +79Yq17yzxM9Awf2igx1EkZhzy6Oq+7cUX9Jbz5IQrPyfXe5hpaOmY4jnWgSlaiwJ +6bBhFHwhJY9ekAFOyRnZS7hQD4mLOBZLti/lH4Z2zadd21DbM/uhUvLJgYpIRplP +hoFxV5bev5vv9A0dbYw6ERa3+aG8HHmP9N4u1/JxHIX2VlYzzLj1l7Tlps6QG6/r +4CsJBIfpGjxwznrYJBN5ox1KlFxNLwD3UNpLhOQ= +-----END CERTIFICATE----- +Bag Attributes + friendlyName: Julian Laplace DEV KEY + localKeyID: 72 44 9B 21 2C C7 EC F4 C4 ED 1F 60 B0 86 FF B3 12 B3 1E B8 +Key Attributes: <No Attributes> +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEArrpXz8B0q/tJ2+N6gjK2zLNPIIlAlzrE46TIkY10xo9jW3vB +RgZL9V5xKtmCWf3KfR2I7KioyqqnZvz6++TV/M3rZptJXN8yMmG4mjTqgC1V2Sub +YyUZqpqkfyLK1ePimsg09UUNxwNcIyBJun+f8wXqz7HKKieiq+d7oTs+WJbWdkIf +txe7hjL2n93PI1LLCF15Cx8s7XP7R7QsTGMvHUzYYHiL4bc+r54jpZ28onVAwdYx ++p3WkKzdFGjkrIl++IXmyJr0E7jilfrKwMWi4tvCKgXVKH6VmWLIKOtfKVMdIK0W +Q9ij3kRHfEwgN/djC3M2UWFEGLx1d7FuL5c+nQIDAQABAoIBAQCdKIiBGccXRa/a +MxJm9zyKhCGAz1MkczzS0M2Cdax6SFCC4Z4m4NUDfw3lD7z6Opcd0CnvS4h+ud5W +eOc7GEoM2B6KrNPgz/Szckf7k+r0nVJhQqLCG4WpeOzKWb39grq4o6lWjuTkgzYl +dg46zD5O9ZyNcYm4PuxHGK+Phtz+CjkEx5Y6WqoBvgA10A+pHBSMAZ2uRznGHJmQ +xF9HHdLLKwtZemRGEdZaC510fpBDbgapLzZqy495/2I3zlOFSW9thWhJ/PO45AH1 +bqtRRq0z0CU94QynulrcvZlyFVF5msDyzBI6B7oZAumC5y9s/v6/jE2rIr1uNx2W +e3Zbh+21AoGBAOAUhkD932XhDKtatDpBDQ8va9ZiiQCuO8VFP1wck2U18ovy6DQn +A3JJUoC/d4K7brCQ5CgzACI0tgen99u78qN3F3caapwJMbQ3LAdZA6U5tZq/7poA +FrvEs6vAToe+HhLkWxvctO0sEGtZEDUptRRa5cGoMAV2FyLvtSHgPk+jAoGBAMee +GgcunO+XBI8HVgC9GTLxJWUuXpwYslI9uDXTVFsJ4jqEAk0R4qA8wGa6VpXS7yea +3Vd8qG9C8yVIuSoajyH4FYQ6rzfbUDoYHsKkJUabJWTK08VPb2RVae6vDQmXqyw3 +X6QH+no33inyD5bEqaSg7lTcQ03kX3shVj+kTBy/AoGBAL0slqsHqTI5bJi9WqpT +gNLxFflH9qG8dnl0nKkG9ujbQokj6SUeSqqRfDV1b0/PLQOjTvshE1vNZF/STk4T +viSCxiynAJn6qRub+G+7lnhG4CplHuqkaIzc41J8Z8/xkTIh10kOazBPowz9g9Fe +BKHKm22CsAfsSlwUQrb2uaRBAoGAI660UmJXtVBWhUa3bexfi8ale5+9U8PqZF8a +Ba0gICH1KaadTq+Kxj/12KcogSGylG7PcCsdZL4f/qMwTkFvIpBZMEjZN2/huHDF +Vt/GtgdXuNu03UlkzRejlwH9n6BX/dBsLUMr2BsSgIb/mGDRPldyIwM4mLzhAH6m +DzxMSrsCgYB9LP/AsmUY67lajzYO18Xu9YTNzIKwovD/RhRHRz0kOI7QQRSXNtGZ +RwzV9OCeRXGLrC2n6w9KnGx8d6pZKElzDkN7+Ql9y2ALmzaInmugTyoNxBPeU3GB +DxN5IIkt2G1rexC/SaQ9WOokiQSKJIZGRHR/WHKpXC/mBHxq7CENkQ== +-----END RSA PRIVATE KEY----- |
