Skip to content
Browse files

fix api to with new proto, add ws client

  • Loading branch information...
1 parent 822e9ad commit a7369672d7c01d0a62fe1d859f99d1a264483612 @andreypopp andreypopp committed Mar 11, 2013
View
30 Makefile
@@ -1,24 +1,18 @@
-SRC_COFFEE = $(shell find src -name '*.coffee')
-SRC_JS = $(shell find src -name '*.js')
-LIB = $(SRC_COFFEE:src/%.coffee=lib/%.js) $(SRC_JS:src/%.js=lib/%.js)
+SRC = $(shell find . -name '*.coffee' -type f)
+LIB = $(SRC:%.coffee=%.js)
-all: lib
+all: $(LIB)
-run: all
- @./bin/songlocator
-
-lib: $(LIB)
watch:
- coffee -bc --watch -o lib src
+ watch -n 0.5 $(MAKE) all
-lib/%.js: src/%.js
- @echo `date "+%H:%M:%S"` - compiled $<
- @cp $< $@
+clean:
+ rm -f $(LIB)
-lib/%.js: src/%.coffee
- @echo `date "+%H:%M:%S"` - compiled $<
- @mkdir -p $(@D)
- @coffee -bcp $< > $@
+publish:
+ git push
+ git push --tags
+ npm publish
-clean:
- rm -rf $(LIB)
+%.js: %.coffee
+ coffee --map -bc $<
View
2 bin/songlocator
@@ -1,2 +0,0 @@
-#!/usr/bin/env node
-require('../lib/app').main();
View
2 bin/songlocator-api
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../songlocator-api').main();
View
11 component.json
@@ -0,0 +1,11 @@
+{
+ "name": "songlocator-api",
+ "version": "0.1.0",
+ "description": "SongLocator resolvers exposed as WebSocket API",
+ "keywords": ["songlocator", "api", "music", "streaming", "audio", "resolver", "websocket"],
+ "author": "Andrey Popp <8mayday@gmail.com>",
+ "main": ["./songlocator-api-client.js"],
+ "dependencies": {
+ "songlocator-base": "~0.1.2"
+ }
+}
View
109 npm-debug.log
@@ -0,0 +1,109 @@
+0 info it worked if it ends with ok
+1 verbose cli [ 'node', '/Users/andreypopp/.npm/bin/npm', 'install' ]
+2 info using npm@1.1.48
+3 info using node@v0.8.18
+4 verbose node symlink /usr/local/bin/node
+5 verbose config file /Users/andreypopp/.npmrc
+6 verbose config file /usr/local/etc/npmrc
+7 verbose config file /Users/andreypopp/.npm/lib/node_modules/npm/npmrc
+8 verbose read json /Users/andreypopp/Workspace/songlocator/songlocator-api/package.json
+9 verbose readDependencies using package.json deps
+10 verbose install where, deps [ '/Users/andreypopp/Workspace/songlocator/songlocator-api',
+10 verbose install [ 'ws', 'node-uuid', 'songlocator-base', 'songlocator-cli' ] ]
+11 verbose from cache /Users/andreypopp/Workspace/songlocator/songlocator-api/package.json
+12 info preinstall songlocator-api@0.1.0
+13 verbose from cache /Users/andreypopp/Workspace/songlocator/songlocator-api/package.json
+14 verbose readDependencies using package.json deps
+15 verbose cache add [ 'ws@~0.4.0', null ]
+16 silly cache add name=undefined spec="ws@~0.4.0" args=["ws@~0.4.0",null]
+17 verbose parsed url { pathname: 'ws@~0.4.0', path: 'ws@~0.4.0', href: 'ws@~0.4.0' }
+18 silly cache add name="ws" spec="~0.4.0" args=["ws","~0.4.0"]
+19 verbose parsed url { pathname: '~0.4.0', path: '~0.4.0', href: '~0.4.0' }
+20 verbose addNamed [ 'ws', '~0.4.0' ]
+21 verbose addNamed [ null, '>=0.4.0- <0.5.0-' ]
+22 verbose cache add [ 'node-uuid@~1.4.0', null ]
+23 silly cache add name=undefined spec="node-uuid@~1.4.0" args=["node-uuid@~1.4.0",null]
+24 verbose parsed url { pathname: 'node-uuid@~1.4.0',
+24 verbose parsed url path: 'node-uuid@~1.4.0',
+24 verbose parsed url href: 'node-uuid@~1.4.0' }
+25 silly cache add name="node-uuid" spec="~1.4.0" args=["node-uuid","~1.4.0"]
+26 verbose parsed url { pathname: '~1.4.0', path: '~1.4.0', href: '~1.4.0' }
+27 verbose addNamed [ 'node-uuid', '~1.4.0' ]
+28 verbose addNamed [ null, '>=1.4.0- <1.5.0-' ]
+29 verbose cache add [ 'songlocator-base@~0.1.2', null ]
+30 silly cache add name=undefined spec="songlocator-base@~0.1.2" args=["songlocator-base@~0.1.2",null]
+31 verbose parsed url { pathname: 'songlocator-base@~0.1.2',
+31 verbose parsed url path: 'songlocator-base@~0.1.2',
+31 verbose parsed url href: 'songlocator-base@~0.1.2' }
+32 silly cache add name="songlocator-base" spec="~0.1.2" args=["songlocator-base","~0.1.2"]
+33 verbose parsed url { pathname: '~0.1.2', path: '~0.1.2', href: '~0.1.2' }
+34 verbose addNamed [ 'songlocator-base', '~0.1.2' ]
+35 verbose addNamed [ null, '>=0.1.2- <0.2.0-' ]
+36 silly lockFile e8ee21cc-ws-0-4-0 ws@~0.4.0
+37 verbose lock ws@~0.4.0 /Users/andreypopp/.npm/e8ee21cc-ws-0-4-0.lock
+38 silly lockFile f662725f-node-uuid-1-4-0 node-uuid@~1.4.0
+39 verbose lock node-uuid@~1.4.0 /Users/andreypopp/.npm/f662725f-node-uuid-1-4-0.lock
+40 silly lockFile 1f4680d5-songlocator-base-0-1-2 songlocator-base@~0.1.2
+41 verbose lock songlocator-base@~0.1.2 /Users/andreypopp/.npm/1f4680d5-songlocator-base-0-1-2.lock
+42 silly addNameRange { name: 'ws', range: '>=0.4.0- <0.5.0-', hasData: false }
+43 silly addNameRange { name: 'node-uuid', range: '>=1.4.0- <1.5.0-', hasData: false }
+44 silly addNameRange { name: 'songlocator-base',
+44 silly addNameRange range: '>=0.1.2- <0.2.0-',
+44 silly addNameRange hasData: false }
+45 verbose url raw ws
+46 verbose url resolving [ 'https://registry.npmjs.org/', './ws' ]
+47 verbose url resolved https://registry.npmjs.org/ws
+48 info retry registry request attempt 1 at 23:53:53
+49 verbose etag "1MBB9PJCESVAT5W0WBOV1C1W7"
+50 http GET https://registry.npmjs.org/ws
+51 verbose url raw node-uuid
+52 verbose url resolving [ 'https://registry.npmjs.org/', './node-uuid' ]
+53 verbose url resolved https://registry.npmjs.org/node-uuid
+54 info retry registry request attempt 1 at 23:53:53
+55 verbose etag "51E0TZTQAI520ZOXN9PSYZU94"
+56 http GET https://registry.npmjs.org/node-uuid
+57 verbose url raw songlocator-base
+58 verbose url resolving [ 'https://registry.npmjs.org/', './songlocator-base' ]
+59 verbose url resolved https://registry.npmjs.org/songlocator-base
+60 info retry registry request attempt 1 at 23:53:53
+61 verbose etag "B08V3VUUU5XFKZ8MAJXU8CAPG"
+62 http GET https://registry.npmjs.org/songlocator-base
+63 verbose cache add [ 'songlocator-cli@~0.1.0', null ]
+64 silly cache add name=undefined spec="songlocator-cli@~0.1.0" args=["songlocator-cli@~0.1.0",null]
+65 verbose parsed url { pathname: 'songlocator-cli@~0.1.0',
+65 verbose parsed url path: 'songlocator-cli@~0.1.0',
+65 verbose parsed url href: 'songlocator-cli@~0.1.0' }
+66 silly cache add name="songlocator-cli" spec="~0.1.0" args=["songlocator-cli","~0.1.0"]
+67 verbose parsed url { pathname: '~0.1.0', path: '~0.1.0', href: '~0.1.0' }
+68 verbose addNamed [ 'songlocator-cli', '~0.1.0' ]
+69 verbose addNamed [ null, '>=0.1.0- <0.2.0-' ]
+70 silly lockFile 89d7c65a-songlocator-cli-0-1-0 songlocator-cli@~0.1.0
+71 verbose lock songlocator-cli@~0.1.0 /Users/andreypopp/.npm/89d7c65a-songlocator-cli-0-1-0.lock
+72 silly addNameRange { name: 'songlocator-cli',
+72 silly addNameRange range: '>=0.1.0- <0.2.0-',
+72 silly addNameRange hasData: false }
+73 verbose url raw songlocator-cli
+74 verbose url resolving [ 'https://registry.npmjs.org/', './songlocator-cli' ]
+75 verbose url resolved https://registry.npmjs.org/songlocator-cli
+76 info retry registry request attempt 1 at 23:53:53
+77 http GET https://registry.npmjs.org/songlocator-cli
+78 http 404 https://registry.npmjs.org/songlocator-cli
+79 silly registry.get cb [ 404,
+79 silly registry.get { server: 'CouchDB/1.2.1 (Erlang OTP/R15B03)',
+79 silly registry.get date: 'Sun, 10 Mar 2013 19:53:55 GMT',
+79 silly registry.get 'content-type': 'application/json',
+79 silly registry.get 'content-length': '52',
+79 silly registry.get 'cache-control': 'must-revalidate' } ]
+80 silly lockFile 89d7c65a-songlocator-cli-0-1-0 songlocator-cli@~0.1.0
+81 error 404 'songlocator-cli' is not in the npm registry.
+81 error 404 You should bug the author to publish it
+81 error 404
+81 error 404 Note that you can also install from a
+81 error 404 tarball, folder, or http url, or git url.
+82 error System Darwin 12.2.1
+83 error command "node" "/Users/andreypopp/.npm/bin/npm" "install"
+84 error cwd /Users/andreypopp/Workspace/songlocator/songlocator-api
+85 error node -v v0.8.18
+86 error npm -v 1.1.48
+87 error code E404
+88 verbose exit [ 1, true ]
View
30 package.json
@@ -1,16 +1,32 @@
{
- "name": "songlocator",
- "description": "Songlocator is a way for Tomahawk resolvers to be exposed via WebSocket API",
- "tags": ["api", "music", "streaming", "audio", "playdar", "tomahawk"],
+ "name": "songlocator-api",
"version": "0.1.0",
- "author": "Andrey Popp <8mayday@gmail.com>",
+ "description": "SongLocator resolvers exposed as WebSocket API",
+ "main": "songlocator-api.js",
"engines": {
"node": "~0.8.x",
"npm": "~1.1.x"
},
"dependencies": {
- "xmlhttprequest": "~1.5.0",
"ws": "~0.4.0",
- "node-uuid": "~1.4.0"
- }
+ "node-uuid": "~1.4.0",
+ "songlocator-base": "~0.1.2",
+ "songlocator-cli": "~0.1.0"
+ },
+ "browser": "songlocator-api-client.js",
+ "bin": {
+ "songlocator-api": "bin/songlocator-api"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/songlocator/songlocator-api.git"
+ },
+ "homepage": "https://github.com/songlocator/songlocator-api",
+ "keywords": ["songlocator", "api", "music", "streaming", "audio", "resolver", "websocket"],
+ "author": {
+ "name": "Andrey Popp",
+ "email": "8mayday@gmail.com",
+ "url": "http://andreypopp.com"
+ },
+ "license": "MIT"
}
View
61 songlocator-api-client.coffee
@@ -0,0 +1,61 @@
+###
+
+ songlocator-base
+
+ 2013 (c) Andrey Popp <8mayday@gmail.com>
+
+###
+((root, factory) ->
+ if typeof exports == 'object'
+ SongLocator = require 'songlocator-base'
+ module.exports = factory(SongLocator)
+ else if typeof define == 'function' and define.amd
+ define (require) ->
+ SongLocator = require 'songlocator-base'
+ root.SongLocator.API = factory(SongLocator)
+ else
+ root.SongLocator.API = factory(window.SongLocator)
+
+) this, ({BaseResolver, extend}) ->
+
+ class Client extends BaseResolver
+
+ constructor: (options) ->
+ this.options = options
+ this.queue = []
+ this.initSocket()
+
+ initSocket: ->
+ this.isOpenned = false
+ this.sock = new WebSocket(this.options.uri)
+ this.sock.onopen = =>
+ this.isOpenned = true
+ if this.queue.length > 0
+ for {method, data} in this.queue
+ this.call(method, data)
+ this.queue = []
+ this.sock.onerror = => this.initSocket()
+ this.sock.onmessage = this.onMessage.bind(this)
+
+ onMessage: (e) ->
+ data = try
+ JSON.parse e.data
+ catch e
+ undefined # TODO: logging
+ return unless data?.qid? and data?.results?
+ this.results(data.qid, data.results)
+
+ call: (method, data) ->
+ if this.isOpenned
+ data.method = method
+ this.sock.send JSON.stringify data
+ else
+ this.queue.push {method, data}
+
+ search: (qid, query) ->
+ this.call 'search', {qid, query}
+
+ resolve: (qid, title, artist, album) ->
+ this.call 'resolve', {qid, title, artist, album}
+
+ {Client}
View
110 songlocator-api-client.js
@@ -0,0 +1,110 @@
+//@ sourceMappingURL=songlocator-api-client.map
+// Generated by CoffeeScript 1.6.1
+/*
+
+ songlocator-base
+
+ 2013 (c) Andrey Popp <8mayday@gmail.com>
+*/
+
+var __hasProp = {}.hasOwnProperty,
+ __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
+
+(function(root, factory) {
+ var SongLocator;
+ if (typeof exports === 'object') {
+ SongLocator = require('songlocator-base');
+ return module.exports = factory(SongLocator);
+ } else if (typeof define === 'function' && define.amd) {
+ return define(function(require) {
+ SongLocator = require('songlocator-base');
+ return root.SongLocator.API = factory(SongLocator);
+ });
+ } else {
+ return root.SongLocator.API = factory(window.SongLocator);
+ }
+})(this, function(_arg) {
+ var BaseResolver, Client, extend;
+ BaseResolver = _arg.BaseResolver, extend = _arg.extend;
+ Client = (function(_super) {
+
+ __extends(Client, _super);
+
+ function Client(options) {
+ this.options = options;
+ this.queue = [];
+ this.initSocket();
+ }
+
+ Client.prototype.initSocket = function() {
+ var _this = this;
+ this.isOpenned = false;
+ this.sock = new WebSocket(this.options.uri);
+ this.sock.onopen = function() {
+ var data, method, _i, _len, _ref, _ref1;
+ _this.isOpenned = true;
+ if (_this.queue.length > 0) {
+ _ref = _this.queue;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ _ref1 = _ref[_i], method = _ref1.method, data = _ref1.data;
+ _this.call(method, data);
+ }
+ return _this.queue = [];
+ }
+ };
+ this.sock.onerror = function() {
+ return _this.initSocket();
+ };
+ return this.sock.onmessage = this.onMessage.bind(this);
+ };
+
+ Client.prototype.onMessage = function(e) {
+ var data;
+ data = (function() {
+ try {
+ return JSON.parse(e.data);
+ } catch (e) {
+ return void 0;
+ }
+ })();
+ if (!(((data != null ? data.qid : void 0) != null) && ((data != null ? data.results : void 0) != null))) {
+ return;
+ }
+ return this.results(data.qid, data.results);
+ };
+
+ Client.prototype.call = function(method, data) {
+ if (this.isOpenned) {
+ data.method = method;
+ return this.sock.send(JSON.stringify(data));
+ } else {
+ return this.queue.push({
+ method: method,
+ data: data
+ });
+ }
+ };
+
+ Client.prototype.search = function(qid, query) {
+ return this.call('search', {
+ qid: qid,
+ query: query
+ });
+ };
+
+ Client.prototype.resolve = function(qid, title, artist, album) {
+ return this.call('resolve', {
+ qid: qid,
+ title: title,
+ artist: artist,
+ album: album
+ });
+ };
+
+ return Client;
+
+ })(BaseResolver);
+ return {
+ Client: Client
+ };
+});
View
10 songlocator-api-client.map
@@ -0,0 +1,10 @@
+{
+ "version": 3,
+ "file": "songlocator-api-client.js",
+ "sourceRoot": "",
+ "sources": [
+ "songlocator-api-client.coffee"
+ ],
+ "names": [],
+ "mappings": ";;AAAA;;;;;;CAAA;CAAA,GAAA;kSAAA;CAAA;AAOA,CAPA,CAOQ,CAAP,CAAA,GAAA,EAAC;CACA,KAAA,KAAA;AAAG,CAAH,CAAA,EAAG,CAAkB,CAAlB,CAAA,CAAH;CACE,EAAc,CAAd,GAAc,IAAd,OAAc;CACP,EAAU,GAAX,CAAN,IAAA;AACM,CAAA,EAHR,CAAA,CAGyB,CAHzB,IAGQ;CACC,EAAA,GAAP,CAAO,EAAC,EAAR;CACE,EAAc,GAAd,CAAc,IAAd,OAAc;CACT,EAAL,CAAI,GAAmB,IAAP,EAAhB;CAFF,IAAO;IAJT,EAAA;CAQO,EAAL,CAAI,EAAiC,CAAd,IAAvB;IATH;CAAA,CAWO,CAAA,CAXR;CAaE,KAAA,sBAAA;CAAA,CAFQ,IAER;CAAA,CAAM;CAEL;CAAA;;CAAc,EAAA,CAAA,GAAA,SAAC;CACZ,EAAe,CAAX,EAAJ,CAAA;CAAA,CAAA,CACa,CAAT,CAAJ,CAAA;CADA,GAEI,EAAJ,IAAA;CAHH,IAAc;;CAAd,EAKa,MAAA,CAAZ;CACE,SAAA,EAAA;CAAA,EAAiB,CAAb,CAAJ,CAAA,GAAA;CAAA,EACgB,CAAZ,EAAJ,CAAsC,EAAtB;CADhB,EAEmB,CAAf,EAAJ,GAAmB;CACjB,WAAA,uBAAA;CAAA,EAAiB,CAAjB,CAAI,GAAJ,CAAA;CACA,EAAuB,CAApB,CAAI,CAAJ,EAAH;CACE;CAAA,EAAA,YAAA,4BAAA;CACE,CADG,EACH;CAAA,CAAkB,EAAlB,CAAI,CAAJ,MAAA;CADF,UAAA;CAEK,EAAQ,EAAT,YAAJ;UALe;CAFnB,MAEmB;CAFnB,EAQoB,CAAhB,EAAJ,CAAA,EAAoB;CAAQ,IAAD,KAAJ,KAAA;CARvB,MAQoB;CACf,EAAiB,CAAlB,KAAJ,IAAA;CAfH,IAKa;;CALb,EAiBY,MAAX;CACE,GAAA,MAAA;CAAA,GAAA,EAAA;CAAO;CACA,GAAD,CAAJ,YAAA;CADK,OAED,EAFC;CAAA,gBAGL;;CAHF;AAIA,CAAA,GAAA,EAAA,sCAAc,IAAd;CAAA,aAAA;QAJA;CAKK,CAAkB,CAAvB,CAAI,GAAJ,MAAA;CAvBH,IAiBY;;CAjBZ,CAyBgB,CAAT,CAAN,EAAM,GAAC;CACL,GAAG,EAAH,GAAA;CACE,EAAc,CAAV,EAAJ,EAAA;CACK,GAAD,KAAW,MAAf;MAFF,EAAA;CAIO,GAAD,CAAM,UAAV;CAAgB,CAAC,IAAD,IAAC;CAAD,CAAS,EAAT,MAAS;CAJ3B,SAIE;QALE;CAzBP,IAyBO;;CAzBP,CAgCe,CAAN,EAAA,CAAR,GAAS;CACF,CAAe,EAAhB,IAAJ,KAAA;CAAoB,CAAC,CAAD,KAAC;CAAD,CAAM,GAAN,GAAM;CADpB,OACN;CAjCH,IAgCS;;CAhCT,CAmCgB,CAAN,EAAA,CAAA,CAAT,EAAU;CACH,CAAgB,EAAjB,KAAJ,IAAA;CAAqB,CAAC,CAAD,KAAC;CAAD,CAAM,GAAN,GAAM;CAAN,CAAa,IAAb,EAAa;CAAb,CAAqB,GAArB,GAAqB;CADnC,OACP;CApCH,IAmCU;;CAnCV;;CAFoB;SAwCrB;CAAA,CAAC,EAAA,EAAD;CA1CM;CAAA"
+}
View
10 src/songlocator-api-ws.coffee → songlocator-api.coffee
@@ -23,11 +23,11 @@ exports.main = (port = 3000) ->
sock.send JSON.stringify msg
resolvers = for name, cfg of config
- new require(name).Resolver(cfg)
+ resolverCls = (require("songlocator-#{name}")).Resolver
+ new resolverCls(cfg)
resolver = new ResolverSet(resolvers)
-
- resolver.on 'result', send
+ resolver.on 'results', send
sock.on 'message', (message) ->
req = try
@@ -44,10 +44,10 @@ exports.main = (port = 3000) ->
console.log('request', req)
if req.method == 'search'
- resolver.search(qid, req.searchString)
+ resolver.search(qid, req.query)
else if req.method == 'resolve'
- resolver.search(qid, req.artist, req.album, req.track)
+ resolver.search(qid, req.title, req.artist, req.album)
console.log "start listening on localhost:#{port}"
server
View
14 lib/songlocator-api-ws.js → songlocator-api.js
@@ -1,4 +1,5 @@
-// Generated by CoffeeScript 1.4.0
+//@ sourceMappingURL=songlocator-api.map
+// Generated by CoffeeScript 1.6.1
var ResolverSet, Server, parseArguments, readConfigSync, v4, _ref;
Server = require('ws').Server;
@@ -25,7 +26,7 @@ exports.main = function(port) {
port: port
});
server.on('connection', function(sock) {
- var cfg, name, resolver, resolvers, send;
+ var cfg, name, resolver, resolverCls, resolvers, send;
if (opts.debug) {
console.log('got new connection');
}
@@ -43,12 +44,13 @@ exports.main = function(port) {
_results = [];
for (name in config) {
cfg = config[name];
- _results.push(new require(name).Resolver(cfg));
+ resolverCls = (require("songlocator-" + name)).Resolver;
+ _results.push(new resolverCls(cfg));
}
return _results;
})();
resolver = new ResolverSet(resolvers);
- resolver.on('result', send);
+ resolver.on('results', send);
return sock.on('message', function(message) {
var qid, req;
req = (function() {
@@ -66,9 +68,9 @@ exports.main = function(port) {
console.log('request', req);
}
if (req.method === 'search') {
- return resolver.search(qid, req.searchString);
+ return resolver.search(qid, req.query);
} else if (req.method === 'resolve') {
- return resolver.search(qid, req.artist, req.album, req.track);
+ return resolver.search(qid, req.title, req.artist, req.album);
}
});
});
View
10 songlocator-api.map
@@ -0,0 +1,10 @@
+{
+ "version": 3,
+ "file": "songlocator-api.js",
+ "sourceRoot": "",
+ "sources": [
+ "songlocator-api.coffee"
+ ],
+ "names": [],
+ "mappings": ";;AAAA,IAAA,yDAAA;CAAA;AAAC,CAAD,EAAW,CAAA,EAAX,CAAW;;AACV,CADD,CAAA,CACO,IAAA,IAAA;;AAEN,CAHD,EAGgB,IAAA,IAHhB,OAGgB;;AAChB,CAJA,CAIC,KAAkC,OAAnC,GAAmC;;AAEnC,CANA,EAMe,CAAf,GAAO,EAAS;CACd,KAAA,6CAAA;;GADqB,CAAP;IACd;CAAA,CAAC,CAAQ,CAAT,UAAS;CAAT,CAEA,CAAS,CAAmB,EAA5B,QAAS;CACT;CAAA,MAAA,qCAAA;8BAAA;CACE,CAAA,CAAuB,CAAvB,EAAO,MAAA;CADT,EAHA;CAAA,CAMA,CAAa,CAAA,EAAb;CAAmB,CAAO,EAAN;CANpB,GAMa;CANb,CAQA,CAAwB,CAAA,EAAlB,GAAmB,GAAzB;CACE,OAAA,yCAAA;CAAA,GAAA,CAAA;CACE,EAAA,GAAA,CAAO,aAAP;MADF;CAAA,EAGO,CAAP,KAAQ;CACN,GAAG,CAAH,CAAA;CACE,CAAwB,CAAxB,IAAO,CAAP,EAAA;CAAwB,CAAM,CAAL,OAAA;CAAD,CAAuB,CAAG,GAAX,CAAmB,GAAnB;CAAvC,SAAA;QADF;CAEK,EAAK,CAAN,KAAM,IAAV;CANF,IAGO;CAHP,GAQA,KAAA;;AAAY,CAAA;YAAA,EAAA;4BAAA;CACV,EAAc,CAAC,GAAA,CAAf,GAAA,GAAwB;CAAxB,EACI,CAAA,OAAA;CAFM;;CARZ;CAAA,EAYe,CAAf,IAAA,CAAe,EAAA;CAZf,CAaA,EAAA,IAAQ,CAAR;CAEK,CAAL,CAAmB,CAAf,GAAe,EAAnB,EAAA;CACE,OAAA,EAAA;CAAA,EAAA,GAAA;CAAM;CACC,GAAD,CAAJ,EAAA,UAAA;CADI,OAEA,EAFA;CAAA,gBAGJ;;CAHF;AAKc,CAAd,EAAA,CAAA,EAAA;CAAA,aAAA;QALA;CAAA,CAQiB,CAAjB,CAAiB,EAAjB;CAEA,GAAG,CAAH,CAAA;CACE,CAAuB,CAAvB,IAAO,CAAP,CAAA;QAXF;CAaA,EAAM,CAAH,CAAc,CAAjB,EAAA;CACW,CAAY,CAArB,EAAA,CAAA,EAAQ,OAAR;CAEU,EAAD,CAAH,CAAc,CAHtB,EAAA,CAAA;CAIW,CAAY,CAArB,EAAA,CAAA,EAAQ,OAAR;QAlBe;CAAnB,IAAmB;CAhBrB,EAAwB;CARxB,CA4CA,CAAA,CAAA,GAAO,wBAAM;CA7CA,QA8Cb;CA9Ca"
+}

0 comments on commit a736967

Please sign in to comment.
Something went wrong with that request. Please try again.