gersemi
Version:
195 lines • 15 kB
JavaScript
import * as Posterior from 'posterior';
import * as DOM from './DOM';
import * as SOAP from './SOAP';
import * as WSDL from './WSDL';
import * as XML from './XML';
XML.setURIs({
gen: 'http://ns.esha.com/2013/genesisapi',
exlx: 'http://ns.esha.com/2013/exlx',
typ: 'http://ns.esha.com/2013/types',
});
export class Client {
constructor(url, cfg = {}) {
this.url = url;
cfg.url = url;
cfg.json = false;
this.config = cfg;
this.Base = Posterior(cfg, 'Client');
this.WSDL = this.Base.extend({
headers: { 'Content-Type': 'text/xml' },
singleton: true,
responseData: (xml) => new WSDL.Definitions(xml),
Children: {
Query: {
url: 'query.wsdl',
},
Edit: {
url: 'edit.wsdl',
},
},
}, 'WSDL');
this.Query = this.Base.extend({
url: Query.PATH,
method: 'POST',
headers: {
'Content-Type': 'application/soap+xml',
},
responseData: (res) => DOM.Parser.dom(res),
Children: {
Nutrients: {
requestData: adapter(Query, 'listnutrients', url, 'PageSize'),
},
Allergens: {
requestData: adapter(Query, 'listallergens', url, 'PageSize'),
},
Units: {
requestData: adapter(Query, 'listunits', url, 'PageSize'),
},
Foods: {
requestData: adapter(Query, 'listfoods', url, 'PageSize'),
},
ByGroup: {
requestData: adapter(Query, 'searchbygroup', url, 'GroupName'),
},
ByModifiedDateRange: {
requestData: adapter(Query, 'searchbymodifieddaterange', url, undefined, ['typ']),
},
ByName: {
requestData: adapter(Query, 'searchbyname', url, 'FoodName'),
},
ById: {
requestData: adapter(Query, 'getfood', url, 'FoodId'),
},
ByUserCode: {
requestData: adapter(Query, 'getfood', url, 'UserCode'),
},
Analysis: {
requestData: adapter(Query, 'getanalysis', url),
},
UserCodes: {
requestData: adapter(Query, 'listfoodusercodes', url, 'PageSize'),
},
},
}, 'Query');
this.Edit = this.Base.extend({
url: Edit.PATH,
method: 'POST',
headers: {
'Content-Type': 'application/soap+xml',
},
responseData: (res) => DOM.Parser.dom(res),
Children: {
NewFood: {
requestData: adapter(Edit, 'newfood', url, undefined, ['exlx']),
},
UpdateFood: {
requestData: adapter(Edit, 'updatefood', url, undefined, ['exlx']),
},
},
}, 'Edit');
}
}
export function adapter(ReqCtor, action, url, defaultName, namespaces) {
return (data) => {
const request = new ReqCtor(action, url, namespaces);
if (data instanceof Array) {
if (data.length === 1 &&
typeof data[0] === 'string' &&
lookslikeXML(data[0])) {
request.setRequestBody(data[0]);
}
else if (defaultName) {
request.param(defaultName, data.length > 1 ? data : data[0]);
}
data = undefined;
}
return request.params(data).toString();
};
}
function lookslikeXML(s) {
s = s.trim();
return s.charAt(0) === '<' && s.charAt(s.length - 1) === '>';
}
export class Request extends SOAP.Request {
constructor(action, url, namespaces) {
super(action, url, 'gen');
this.action = action;
this.url = url;
if (namespaces) {
namespaces.forEach(ns => {
this.ns(ns, XML.getURI(ns));
});
}
this.request = new SOAP.Element('gen:' + Request.BODIES[action]);
this.body.add(this.request);
}
setRequestBody(xml) {
this.request.add(xml);
}
param(name, value) {
if (value !== null && value !== undefined) {
const paramElement = new SOAP.Element('gen:' + name);
if (value instanceof XML.Element || typeof value === 'string') {
paramElement.add(value);
}
else if (typeof value === 'object') {
XML.fromJSON(value, paramElement, 'gen:');
}
else {
paramElement.add(JSON.stringify(value));
}
this.request.add(paramElement);
}
return this;
}
params(params) {
if (params) {
for (const name in params) {
this.param(name, params[name]);
}
}
return this;
}
}
Request.BODIES = {
listnutrients: 'NutrientListRequest',
listallergens: 'AllergenListRequest',
listunits: 'UnitListRequest',
listfoods: 'FoodsListRequest',
searchbygroup: 'FoodsByGroupRequest',
searchbymodifieddaterange: 'FoodsByModifiedDateRangeRequest',
searchbyname: 'FoodsByNameRequest',
getfood: 'FoodMetadataRequest',
getanalysis: 'FoodAnalysisRequest',
listfoodusercodes: 'FoodUserCodesListRequest',
listgroups: 'GroupListRequest',
getconversions: 'FoodConversionsRequest',
search: 'FoodsRequest',
searchbyproperty: 'FoodsByPropertyRequest',
listrecommendationprofiles: 'RecommendationProfilesListRequest',
listauthorities: 'AuthorityListRequest',
newfood: 'NewFoodRequest',
updatefood: 'UpdateFoodRequest',
};
class Query extends Request {
constructor(action, server, namespaces) {
super(action, server + Query.PATH, namespaces);
this.action = action;
this.server = server;
this.namespaces = namespaces;
}
}
Query.PATH = 'soap/FoodQueryService.svc';
class Edit extends Request {
constructor(action, server, namespaces) {
super(action, server + Edit.PATH, namespaces);
this.action = action;
this.server = server;
this.namespaces = namespaces;
}
}
Edit.PATH = 'soap/FoodEditService.svc';
if (window && document.body.hasAttribute('debug')) {
window.Client = Client;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29hcC1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc29hcC1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLFNBQVMsTUFBTSxXQUFXLENBQUM7QUFDdkMsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFDN0IsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUM7QUFFN0IsR0FBRyxDQUFDLE9BQU8sQ0FBQztJQUNWLEdBQUcsRUFBRSxvQ0FBb0M7SUFDekMsSUFBSSxFQUFFLDhCQUE4QjtJQUNwQyxHQUFHLEVBQUUsK0JBQStCO0NBQ3JDLENBQUMsQ0FBQztBQUVILE1BQU07SUFhSixZQUFtQixHQUFXLEVBQUUsTUFBNkIsRUFBRTtRQUE1QyxRQUFHLEdBQUgsR0FBRyxDQUFRO1FBQzVCLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2QsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQzFCO1lBQ0UsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRTtZQUN2QyxTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxDQUFDLEdBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQztZQUNyRCxRQUFRLEVBQUU7Z0JBQ1IsS0FBSyxFQUFFO29CQUNMLEdBQUcsRUFBRSxZQUFZO2lCQUNsQjtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osR0FBRyxFQUFFLFdBQVc7aUJBQ2pCO2FBQ0Y7U0FDRixFQUNELE1BQU0sQ0FDUCxDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDM0I7WUFDRSxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDZixNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDUCxjQUFjLEVBQUUsc0JBQXNCO2FBQ3ZDO1lBQ0QsWUFBWSxFQUFFLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDbEQsUUFBUSxFQUFFO2dCQUNSLFNBQVMsRUFBRTtvQkFDVCxXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQztpQkFDOUQ7Z0JBQ0QsU0FBUyxFQUFFO29CQUNULFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDO2lCQUM5RDtnQkFDRCxLQUFLLEVBQUU7b0JBQ0wsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUM7aUJBQzFEO2dCQUNELEtBQUssRUFBRTtvQkFDTCxXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQztpQkFDMUQ7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDO2lCQUMvRDtnQkFDRCxtQkFBbUIsRUFBRTtvQkFDbkIsV0FBVyxFQUFFLE9BQU8sQ0FDbEIsS0FBSyxFQUNMLDJCQUEyQixFQUMzQixHQUFHLEVBQ0gsU0FBUyxFQUNULENBQUMsS0FBSyxDQUFDLENBQ1I7aUJBQ0Y7Z0JBQ0QsTUFBTSxFQUFFO29CQUNOLFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDO2lCQUM3RDtnQkFDRCxJQUFJLEVBQUU7b0JBQ0osV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUM7aUJBQ3REO2dCQUNELFVBQVUsRUFBRTtvQkFDVixXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQztpQkFDeEQ7Z0JBQ0QsUUFBUSxFQUFFO29CQUNSLFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRSxHQUFHLENBQUM7aUJBQ2hEO2dCQUNELFNBQVMsRUFBRTtvQkFDVCxXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDO2lCQUNsRTthQUNGO1NBQ0YsRUFDRCxPQUFPLENBQ1IsQ0FBQztRQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQzFCO1lBQ0UsR0FBRyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2QsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsY0FBYyxFQUFFLHNCQUFzQjthQUN2QztZQUNELFlBQVksRUFBRSxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2xELFFBQVEsRUFBRTtnQkFDUixPQUFPLEVBQUU7b0JBQ1AsV0FBVyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDaEU7Z0JBQ0QsVUFBVSxFQUFFO29CQUNWLFdBQVcsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ25FO2FBQ0Y7U0FDRixFQUNELE1BQU0sQ0FDUCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBS0QsTUFBTSxrQkFDSixPQUEyQixFQUMzQixNQUFjLEVBQ2QsR0FBVyxFQUNYLFdBQW9CLEVBQ3BCLFVBQXFCO0lBRXJCLE1BQU0sQ0FBQyxDQUFDLElBQWEsRUFBRSxFQUFFO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDckQsRUFBRSxDQUFDLENBQUMsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDMUIsRUFBRSxDQUFDLENBQ0QsSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUNqQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRO2dCQUMzQixZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUN0QixDQUFDLENBQUMsQ0FBQztnQkFDRCxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7WUFBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0QsQ0FBQztZQUNELElBQUksR0FBRyxTQUFTLENBQUM7UUFDbkIsQ0FBQztRQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3pDLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxzQkFBc0IsQ0FBUztJQUM3QixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2IsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUM7QUFDL0QsQ0FBQztBQVlELE1BQU0sY0FBd0IsU0FBUSxJQUFJLENBQUMsT0FBTztJQXVCaEQsWUFDUyxNQUFjLEVBQ2QsR0FBVyxFQUNsQixVQUFxQjtRQUVyQixLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUpuQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUlsQixFQUFFLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ2YsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDdEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxjQUFjLENBQUMsR0FBVztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ00sS0FBSyxDQUFDLElBQVksRUFBRSxLQUFrQjtRQUMzQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDckQsRUFBRSxDQUFDLENBQUMsS0FBSyxZQUFZLEdBQUcsQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztnQkFDOUQsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixDQUFDO1lBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JDLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM1QyxDQUFDO1lBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ04sWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNNLE1BQU0sQ0FBQyxNQUFlO1FBQzNCLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDWCxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUM7SUFDZCxDQUFDOztBQTdEYSxjQUFNLEdBQWlDO0lBQ25ELGFBQWEsRUFBRSxxQkFBcUI7SUFDcEMsYUFBYSxFQUFFLHFCQUFxQjtJQUNwQyxTQUFTLEVBQUUsaUJBQWlCO0lBQzVCLFNBQVMsRUFBRSxrQkFBa0I7SUFDN0IsYUFBYSxFQUFFLHFCQUFxQjtJQUNwQyx5QkFBeUIsRUFBRSxpQ0FBaUM7SUFDNUQsWUFBWSxFQUFFLG9CQUFvQjtJQUNsQyxPQUFPLEVBQUUscUJBQXFCO0lBQzlCLFdBQVcsRUFBRSxxQkFBcUI7SUFDbEMsaUJBQWlCLEVBQUUsMEJBQTBCO0lBQzdDLFVBQVUsRUFBRSxrQkFBa0I7SUFDOUIsY0FBYyxFQUFFLHdCQUF3QjtJQUN4QyxNQUFNLEVBQUUsY0FBYztJQUN0QixnQkFBZ0IsRUFBRSx3QkFBd0I7SUFDMUMsMEJBQTBCLEVBQUUsbUNBQW1DO0lBQy9ELGVBQWUsRUFBRSxzQkFBc0I7SUFDdkMsT0FBTyxFQUFFLGdCQUFnQjtJQUN6QixVQUFVLEVBQUUsbUJBQW1CO0NBQ2hDLENBQUM7QUE0Q0osV0FBWSxTQUFRLE9BQU87SUFHekIsWUFDUyxNQUFjLEVBQ2QsTUFBYyxFQUNkLFVBQXFCO1FBRTVCLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFKeEMsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxlQUFVLEdBQVYsVUFBVSxDQUFXO0lBRzlCLENBQUM7O0FBUmEsVUFBSSxHQUFHLDJCQUEyQixDQUFDO0FBVW5ELFVBQVcsU0FBUSxPQUFPO0lBR3hCLFlBQ1MsTUFBYyxFQUNkLE1BQWMsRUFDZCxVQUFxQjtRQUU1QixLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBSnZDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBVztJQUc5QixDQUFDOztBQVJhLFNBQUksR0FBRywwQkFBMEIsQ0FBQztBQVlsRCxFQUFFLENBQUMsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELE1BQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ2xDLENBQUMifQ==