bird-api
Version:
日本の野鳥 Web API
247 lines (239 loc) • 27.6 kB
JavaScript
(function() {
var Distribution, Name, _, util;
Name = require('../models').Name;
Distribution = require('../models').Distribution;
util = require('../utilities');
_ = require('underscore');
module.exports = {
doc: function(req, res) {
return res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*').json({
document: {
title: '日本の野鳥 Web API',
links: [
{
rel: "git-repository",
href: "https://github.com/KamataRyo/bird-api"
}
]
}
});
},
ranks: function(req, res) {
var fields, limit, offset, promise, rank, ranks, ref;
res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*');
ranks = req.params.ranks;
rank = util.singular_for[ranks];
ref = util.parseQuery(req), fields = ref.fields, offset = ref.offset, limit = ref.limit;
promise = Name.find({
rank: rank
}).select(fields).skip(offset).limit(limit).exec();
return promise.then(function(results) {
var obj;
if (results.length < 1) {
return res.status(404).json({
message: 'Unknown Resource'
});
} else {
if (ranks === 'birds') {
ranks = 'species';
}
return res.json((
obj = {},
obj["" + ranks] = results,
obj
));
}
})["catch"](function(err) {
return res.status(400).json({
message: 'bad request.'
});
});
},
identifyName: function(req, res) {
var fields, identifier, promise1, promise2, rank, ranks;
ranks = req.params.ranks;
rank = util.singular_for[ranks];
identifier = req.params.identifier;
fields = util.parseQuery(req).fields;
res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*');
promise1 = Name.find({
rank: rank,
ja: identifier
}).select(fields).exec();
promise2 = Name.find({
rank: rank,
ja: identifier
}).exec();
return Promise.all([promise1, promise2]).then(function(arg) {
var name, reference, references, results;
results = arg[0], references = arg[1];
if (results.length < 1) {
return res.status(404).json({
message: 'Unknown bird name'
});
} else {
name = results[0];
reference = references[0];
if (reference.upper_id != null) {
return util.attachUpperTaxonomies({
name: name,
reference: reference,
fields: fields,
callback: function(body) {
return res.json(body);
}
});
} else {
return res.json({
name: name
});
}
}
})["catch"](function(err) {
console.log(err);
return res.status(500).json({
message: 'Internal Server Error'
});
});
},
askExistence: function(req, res) {
var fields, identifier;
identifier = req.params.identifier;
fields = util.parseQuery(req).fields;
res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*');
return Name.find({
rank: 'species',
ja: identifier
}).select(fields).exec().then(function(results) {
var result;
if (results.length > 0) {
result = results[0];
return res.status(200).json({
existence: true,
name: result
});
} else {
return res.status(200).json({
existence: false
});
}
})["catch"](function(err) {
console.log(err);
return res.status(500).json({
message: 'Internal Server Error'
});
});
},
findInclusion: function(req, res) {
var content;
content = util.parseQuery(req).content;
res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*');
return Name.find({
rank: 'species'
}).exec().then(function(allSpecies) {
var frequency, histogram, i, ja, len, replaced, species;
histogram = [];
allSpecies.sort(function(a, b) {
return b.ja.length - a.ja.length;
});
for (i = 0, len = allSpecies.length; i < len; i++) {
species = allSpecies[i];
ja = species.ja;
replaced = content.replace(new RegExp(ja, 'g'), '');
if (content !== replaced) {
frequency = (content.length - replaced.length) / ja.length;
histogram.push({
species: species,
frequency: frequency
});
content = replaced;
}
}
return res.status(200).json({
histogram: histogram
});
})["catch"](function(err) {
console.log(err);
return res.status(500).json({
message: 'Internal Server Error'
});
});
},
getDistributionsOf: function(req, res) {
var identifier, promise1;
identifier = req.params.identifier;
res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*');
return promise1 = Name.find({
rank: 'species',
ja: identifier
}).select('_id').exec().then(function(results) {
var id;
if (results.length < 1) {
res.status(404);
throw new Error('Unknown bird name');
} else {
id = results[0]._id;
console.log(id);
return Distribution.find({
name_id: id
}).exec().then(function(results) {
return res.status(200).json({
name: identifier,
distributions: results
});
});
}
})["catch"](function(err) {
console.log(err);
return res.status(500).json({
message: 'internal server erroe'
});
});
},
postDistributionsOf: function(req, res) {
var ja, place, ref;
ref = [req.body.ja, req.body.place], ja = ref[0], place = ref[1];
res.header('Content-Type', 'application/json; charset=utf-8').header('Access-Control-Allow-Origin', '*');
if (!((ja != null) || (place != null))) {
return res.status(404).json({
message: 'no `ja` or `place` field in body.'
});
} else {
return Name.find({
rank: 'species',
ja: ja
}).exec().then(function(results) {
var name_id;
if (results.length < 1) {
res.status(404).json({
message: 'no birdname registered.'
});
throw new Error('Unknown bird name');
} else {
name_id = results[0]._id;
return new Distribution({
name_id: name_id,
place: place
}).save(function(err) {
if (err) {
return res.status(500).json({
message: 'iteranal server error.'
});
} else {
return res.status(200).json({
species: results[0],
message: 'post success.',
distribution: {
name_id: name_id,
place: place
}
});
}
});
}
});
}
}
};
}).call(this);
//# sourceMappingURL=data:application/json;base64,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QUFVLE9BQUEsS0FBVjttQkFIWjtpQkFGVixFQUxKOztZQURFLENBRE4sRUFQUjs7UUFERSxDQUhWLEVBTEo7O0lBUGlCLENBNU1yQjs7QUFOSiIsImZpbGUiOiJyb3V0ZXMvaW5kZXguanMiLCJzb3VyY2VSb290IjoiL3NvdXJjZS8iLCJzb3VyY2VzQ29udGVudCI6WyIjIGFwcC9yb3V0ZXNcbk5hbWUgICAgICAgICA9IHJlcXVpcmUoJy4uL21vZGVscycpLk5hbWVcbkRpc3RyaWJ1dGlvbiA9IHJlcXVpcmUoJy4uL21vZGVscycpLkRpc3RyaWJ1dGlvblxudXRpbCAgICA9IHJlcXVpcmUgJy4uL3V0aWxpdGllcydcbl8gICAgICAgPSByZXF1aXJlICd1bmRlcnNjb3JlJ1xuXG5tb2R1bGUuZXhwb3J0cyA9XG4gICAgZG9jOiAocmVxLCByZXMpIC0+XG4gICAgICAgIHJlc1xuICAgICAgICAgICAgLmhlYWRlciAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXG4gICAgICAgICAgICAuaGVhZGVyICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKidcbiAgICAgICAgICAgIC5qc29uIGRvY3VtZW50OlxuICAgICAgICAgICAgICAgIHRpdGxlOifml6XmnKzjga7ph47ps6UgV2ViIEFQSSdcbiAgICAgICAgICAgICAgICBsaW5rczpbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbDpcImdpdC1yZXBvc2l0b3J5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6XCJodHRwczovL2dpdGh1Yi5jb20vS2FtYXRhUnlvL2JpcmQtYXBpXCJcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cblxuXG4gICAgcmFua3M6IChyZXEsIHJlcykgLT5cbiAgICAgICAgcmVzXG4gICAgICAgICAgICAuaGVhZGVyICdDb250ZW50LVR5cGUnLCAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCdcbiAgICAgICAgICAgIC5oZWFkZXIgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJ1xuICAgICAgICAjIGdldCBwbHVyYWwgZm9ybSBvZiByYW5rXG4gICAgICAgIHJhbmtzID0gcmVxLnBhcmFtcy5yYW5rc1xuICAgICAgICByYW5rID0gdXRpbC5zaW5ndWxhcl9mb3JbcmFua3NdXG5cbiAgICAgICAgeyBmaWVsZHMsIG9mZnNldCwgbGltaXQgfSA9IHV0aWwucGFyc2VRdWVyeSByZXFcblxuICAgICAgICBwcm9taXNlID0gTmFtZVxuICAgICAgICAgICAgLmZpbmQge3Jhbmt9XG4gICAgICAgICAgICAuc2VsZWN0IGZpZWxkc1xuICAgICAgICAgICAgLnNraXAgb2Zmc2V0ICMgbWFwIHNraXAgYXMgb2Zmc2V0IGZvciByZXF1ZXN0XG4gICAgICAgICAgICAubGltaXQgbGltaXRcbiAgICAgICAgICAgIC5leGVjKClcblxuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgICAudGhlbiAocmVzdWx0cykgLT5cbiAgICAgICAgICAgICAgICBpZiByZXN1bHRzLmxlbmd0aCA8IDFcbiAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDQwNFxuICAgICAgICAgICAgICAgICAgICAgICAgLmpzb24gbWVzc2FnZTogJ1Vua25vd24gUmVzb3VyY2UnXG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAjIHNldCBBbGlhc1xuICAgICAgICAgICAgICAgICAgICBpZiByYW5rcyBpcyAnYmlyZHMnIHRoZW4gcmFua3MgPSAnc3BlY2llcydcblxuICAgICAgICAgICAgICAgICAgICByZXMuanNvbiB7IFwiI3tyYW5rc31cIjpyZXN1bHRzIH1cblxuICAgICAgICAgICAgLmNhdGNoIChlcnIpIC0+XG4gICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgIC5zdGF0dXMgNDAwXG4gICAgICAgICAgICAgICAgICAgIC5qc29uIG1lc3NhZ2U6J2JhZCByZXF1ZXN0LidcblxuXG4gICAgaWRlbnRpZnlOYW1lOiAocmVxLCByZXMpIC0+XG4gICAgICAgICMgcGFyc2UgcGFyYW1zXG4gICAgICAgIHJhbmtzID0gcmVxLnBhcmFtcy5yYW5rc1xuICAgICAgICByYW5rID0gdXRpbC5zaW5ndWxhcl9mb3JbcmFua3NdXG4gICAgICAgIGlkZW50aWZpZXIgPSByZXEucGFyYW1zLmlkZW50aWZpZXJcblxuICAgICAgICAjIHBhcnNlIHF1ZXJpZXNcbiAgICAgICAgeyBmaWVsZHMgfSA9IHV0aWwucGFyc2VRdWVyeSByZXFcblxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgcHJvbWlzZTEgPSBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuaywgamE6aWRlbnRpZmllcn1cbiAgICAgICAgICAgIC5zZWxlY3QgZmllbGRzXG4gICAgICAgICAgICAuZXhlYygpXG5cbiAgICAgICAgcHJvbWlzZTIgPSBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuaywgamE6aWRlbnRpZmllcn1cbiAgICAgICAgICAgIC5leGVjKClcblxuICAgICAgICBQcm9taXNlLmFsbCBbcHJvbWlzZTEsIHByb21pc2UyXVxuICAgICAgICAgICAgLnRoZW4gKFtyZXN1bHRzLCByZWZlcmVuY2VzXSkgLT5cbiAgICAgICAgICAgICAgICBpZiByZXN1bHRzLmxlbmd0aCA8IDFcbiAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDQwNFxuICAgICAgICAgICAgICAgICAgICAgICAgLmpzb24gIG1lc3NhZ2U6J1Vua25vd24gYmlyZCBuYW1lJ1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlc3VsdHNbMF1cbiAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlID0gcmVmZXJlbmNlc1swXVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIHJlZmVyZW5jZS51cHBlcl9pZD9cbiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IHVwcGVyIHRheG9ub21pZXMgcmVjdXJzaXZlbHkgaW4gdGhpcyBmdW5jdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5hdHRhY2hVcHBlclRheG9ub21pZXMge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICAjIGZpbHRlcmVkIG9iamVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZSAjIG5vbi1maWx0ZXJlZCBvbmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHMgICAgIyBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazogKGJvZHkpIC0+IHJlcy5qc29uIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmpzb24geyBuYW1lIH1cblxuICAgICAgICAgICAgLmNhdGNoIChlcnIpIC0+XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cgZXJyXG4gICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgIC5zdGF0dXMgNTAwXG4gICAgICAgICAgICAgICAgICAgIC5qc29uIG1lc3NhZ2U6J0ludGVybmFsIFNlcnZlciBFcnJvcidcblxuXG4gICAgYXNrRXhpc3RlbmNlOiAocmVxLCByZXMpIC0+XG4gICAgICAgICMgcGFyc2UgcGFyYW1zXG4gICAgICAgIGlkZW50aWZpZXIgPSByZXEucGFyYW1zLmlkZW50aWZpZXJcblxuICAgICAgICAjIHBhcnNlIHF1ZXJpZXNcbiAgICAgICAgeyBmaWVsZHMgfSA9IHV0aWwucGFyc2VRdWVyeSByZXFcblxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgTmFtZVxuICAgICAgICAgICAgLmZpbmQge3Jhbms6J3NwZWNpZXMnLCBqYTppZGVudGlmaWVyfVxuICAgICAgICAgICAgLnNlbGVjdCBmaWVsZHNcbiAgICAgICAgICAgIC5leGVjKClcbiAgICAgICAgICAgIC50aGVuIChyZXN1bHRzKSAtPlxuICAgICAgICAgICAgICAgIGlmIHJlc3VsdHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHRzWzBdXG4gICAgICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qc29uIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGVuY2U6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qc29uIGV4aXN0ZW5jZTogZmFsc2VcbiAgICAgICAgICAgIC5jYXRjaCAoZXJyKSAtPlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIGVyclxuICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDUwMFxuICAgICAgICAgICAgICAgICAgICAuanNvbiBtZXNzYWdlOidJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InXG5cblxuICAgIGZpbmRJbmNsdXNpb246IChyZXEsIHJlcykgLT5cbiAgICAgICAgIyBwYXJzZSBxdWVyaWVzXG4gICAgICAgIHsgY29udGVudCB9ID0gdXRpbC5wYXJzZVF1ZXJ5IHJlcVxuXG4gICAgICAgIHJlc1xuICAgICAgICAgICAgLmhlYWRlciAnQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnXG4gICAgICAgICAgICAuaGVhZGVyICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nLCAnKidcblxuICAgICAgICBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuazonc3BlY2llcyd9XG4gICAgICAgICAgICAuZXhlYygpXG4gICAgICAgICAgICAudGhlbiAoYWxsU3BlY2llcykgLT5cbiAgICAgICAgICAgICAgICBoaXN0b2dyYW0gPSBbXVxuICAgICAgICAgICAgICAgICMgc29ydCBhbGxTcGVjaWVzXG4gICAgICAgICAgICAgICAgYWxsU3BlY2llcy5zb3J0IChhLCBiKS0+XG4gICAgICAgICAgICAgICAgICAgIGIuamEubGVuZ3RoIC0gYS5qYS5sZW5ndGhcblxuICAgICAgICAgICAgICAgICMgZmluZCBzcGVjaWVzIG5hbWVcbiAgICAgICAgICAgICAgICBmb3Igc3BlY2llcyBpbiBhbGxTcGVjaWVzXG4gICAgICAgICAgICAgICAgICAgIGphID0gc3BlY2llcy5qYVxuICAgICAgICAgICAgICAgICAgICByZXBsYWNlZCA9IGNvbnRlbnQucmVwbGFjZSAobmV3IFJlZ0V4cCBqYSwgJ2cnKSwgJydcbiAgICAgICAgICAgICAgICAgICAgaWYgY29udGVudCBpc250IHJlcGxhY2VkICMgc3BlY2llcyBuYW1lIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY3kgPSAoY29udGVudC5sZW5ndGggLSByZXBsYWNlZC5sZW5ndGgpIC8gamEubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW0ucHVzaCB7IHNwZWNpZXMsIGZyZXF1ZW5jeSB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gcmVwbGFjZWRcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgLmpzb24geyBoaXN0b2dyYW0gfVxuXG4gICAgICAgICAgICAuY2F0Y2ggKGVycikgLT5cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyBlcnJcbiAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyA1MDBcbiAgICAgICAgICAgICAgICAgICAgLmpzb24gbWVzc2FnZTonSW50ZXJuYWwgU2VydmVyIEVycm9yJ1xuXG5cbiAgICBnZXREaXN0cmlidXRpb25zT2Y6IChyZXEsIHJlcykgLT5cbiAgICAgICAgIyBwYXJzZSBwYXJhbXNcbiAgICAgICAgaWRlbnRpZmllciA9IHJlcS5wYXJhbXMuaWRlbnRpZmllclxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgcHJvbWlzZTEgPSBOYW1lXG4gICAgICAgICAgICAuZmluZCB7cmFuazonc3BlY2llcycsIGphOmlkZW50aWZpZXJ9XG4gICAgICAgICAgICAuc2VsZWN0ICdfaWQnXG4gICAgICAgICAgICAuZXhlYygpXG4gICAgICAgICAgICAudGhlbiAocmVzdWx0cykgLT5cbiAgICAgICAgICAgICAgICBpZiByZXN1bHRzLmxlbmd0aCA8IDFcbiAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDQwNFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IgJ1Vua25vd24gYmlyZCBuYW1lJ1xuICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgaWQgPSByZXN1bHRzWzBdLl9pZFxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyBpZFxuICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kIHtuYW1lX2lkOiBpZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjKClcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuIChyZXN1bHRzKSAtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDIwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuanNvbiB7bmFtZTppZGVudGlmaWVyLCBkaXN0cmlidXRpb25zOnJlc3VsdHN9XG5cbiAgICAgICAgICAgIC5jYXRjaCAoZXJyKSAtPlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nIGVyclxuICAgICAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDUwMFxuICAgICAgICAgICAgICAgICAgICAuanNvbiB7bWVzc2FnZTonaW50ZXJuYWwgc2VydmVyIGVycm9lJ31cblxuXG4gICAgcG9zdERpc3RyaWJ1dGlvbnNPZjogKHJlcSwgcmVzKSAtPlxuICAgICAgICAjIHBhcnNlIGJvZHlcbiAgICAgICAgW2phLCBwbGFjZV0gPSBbcmVxLmJvZHkuamEsIHJlcS5ib2R5LnBsYWNlXVxuICAgICAgICByZXNcbiAgICAgICAgICAgIC5oZWFkZXIgJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J1xuICAgICAgICAgICAgLmhlYWRlciAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJywgJyonXG5cbiAgICAgICAgdW5sZXNzIGphPyBvciBwbGFjZT9cbiAgICAgICAgICAgIHJlc1xuICAgICAgICAgICAgICAgIC5zdGF0dXMgNDA0XG4gICAgICAgICAgICAgICAgLmpzb24ge21lc3NhZ2U6ICdubyBgamFgIG9yIGBwbGFjZWAgZmllbGQgaW4gYm9keS4nfVxuICAgICAgICBlbHNlXG4gICAgICAgICAgICBOYW1lXG4gICAgICAgICAgICAgICAgLmZpbmQge3Jhbms6J3NwZWNpZXMnLCBqYX1cbiAgICAgICAgICAgICAgICAuZXhlYygpXG4gICAgICAgICAgICAgICAgLnRoZW4gKHJlc3VsdHMpIC0+XG4gICAgICAgICAgICAgICAgICAgIGlmIHJlc3VsdHMubGVuZ3RoIDwgMVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyA0MDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuanNvbiB7bWVzc2FnZTogJ25vIGJpcmRuYW1lIHJlZ2lzdGVyZWQuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAnVW5rbm93biBiaXJkIG5hbWUnXG4gICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfaWQgPSByZXN1bHRzWzBdLl9pZFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IERpc3RyaWJ1dGlvbiB7bmFtZV9pZCwgcGxhY2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNhdmUgKGVycikgLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzIDUwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qc29uIHttZXNzYWdlOidpdGVyYW5hbCBzZXJ2ZXIgZXJyb3IuJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyAyMDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuanNvbiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZXM6IHJlc3VsdHNbMF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ3Bvc3Qgc3VjY2Vzcy4nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjoge25hbWVfaWQsIHBsYWNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiJdfQ==