Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 38 additions & 0 deletions backend.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var crypto = require('crypto');
var mapnik = require('mapnik');
var util = require('util');
var sm = new (require('sphericalmercator'))();
var queue = require('d3-queue');

module.exports = Backend;

Expand Down Expand Up @@ -35,6 +36,9 @@ function Backend(opts, callback) {
backend._fillzoom = 'fillzoom' in info && !isNaN(parseInt(info.fillzoom, 10)) ?
parseInt(info.fillzoom, 10) :
undefined;
backend._lookback = 'lookback' in info && !isNaN(parseInt(info.lookback, 10)) ?
parseInt(info.lookback, 10) :
undefined;
backend._source = source;
if (callback) callback(null, backend);
}
Expand Down Expand Up @@ -72,6 +76,7 @@ Backend.prototype.getTile = function(z, x, y, callback) {

var size = 0;
var headers = {};
var lookbacks = true;

// Overzooming support.
if (bz > backend._maxzoom) {
Expand All @@ -81,6 +86,20 @@ Backend.prototype.getTile = function(z, x, y, callback) {
headers['x-vector-backend-object'] = 'overzoom';
}

function loadAsync(lz, lx, ly, callback) {
source.getTile(lz, lx, ly, function (err, body, head) {
if (err && err.message !== 'Tile does not exist') return callback(err);
return callback(null, {
err: err,
body: body,
head: head,
z: lz,
x: lx,
y: ly
});
});
}

source.getTile(bz, bx, by, function sourceGet(err, body, head) {
if (typeof backend._fillzoom === 'number' &&
err && err.message === 'Tile does not exist' &&
Expand All @@ -90,6 +109,25 @@ Backend.prototype.getTile = function(z, x, y, callback) {
by = Math.floor(y / Math.pow(2, z - bz));
headers['x-vector-backend-object'] = 'fillzoom';
return source.getTile(bz, bx, by, sourceGet);
} else if (typeof backend._lookback === 'number' &&
err && err.message === 'Tile does not exist' &&
lookbacks === true) {
lookbacks = false;
var q = new queue.queue();
for (var lb = 1; lb <= Math.min(backend._lookback, z); lb++) {
q.defer(loadAsync, bz - lb, Math.floor(x / Math.pow(2, lb)), Math.floor(y / Math.pow(2, lb)));
}
return q.awaitAll(function(err, lookbackTiles) {
if (err) return callback(err);
lookbackTiles = lookbackTiles.filter(function(t, i) {
return t === null || i === lookbackTiles.length - 1;
});
headers['x-vector-backend-object'] = 'fillzoom';
bz = lookbackTiles[0].z;
bx = lookbackTiles[0].x;
by = lookbackTiles[0].y;
sourceGet(lookbackTiles[0].err, lookbackTiles[0].body, lookbackTiles[0].head);
});
}
if (err && err.message !== 'Tile does not exist') return callback(err);

Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
],
"dependencies": {
"aws-sdk": "^2.2.30",
"d3-queue": "^2.0.3",
"s3urls": "^1.3.0",
"mapnik": "~3.5.13",
"tilelive": "~5.12.0",
Expand Down
3 changes: 3 additions & 0 deletions test/backend.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ tilelive.protocols['test:'] = Testsource;
c: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1, scale: 2, legacy: true }),
h: new Backend({ source: new Testsource('b'), minzoom:0, maxzoom: 2, fillzoom: 1, scale: 2 }),
i: new Backend({ source: new Testsource('i'), minzoom:0, maxzoom: 1 }),
l: new Backend({ source: new Testsource('i'), minzoom:0, maxzoom: 4, lookback: 3}),
invalid: new Backend({ source: new Testsource('invalid'), minzoom:0, maxzoom: 1 }),
iv: new Backend({ source: new Testsource('i'), minzoom:0, maxzoom: 1, vector_layers: [{id:'custom_layer_name'}] }),
gz: new Backend({ source: new Testsource('gz'), minzoom:0, maxzoom: 0 }),
Expand All @@ -90,6 +91,8 @@ tilelive.protocols['test:'] = Testsource;
h: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.1.1', '2.1.2', '3.2.2', '3.2.3', '3.2.4'],
// wraps image source with vector tiles.
i: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0', '2.0.1'],
// test for multiple lookback
l: ['0.0.0', '1.0.0', '1.0.1', '1.1.0', '1.1.1', '2.0.0'],
// wraps image source with vector tiles, with named vector layer.
iv: ['0.0.0'],
// loads gzip compressed protobuf.
Expand Down
13 changes: 13 additions & 0 deletions test/expected/backend-l.0.0.0.json

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions test/expected/backend-l.1.0.0.json

Large diffs are not rendered by default.

13 changes: 13 additions & 0 deletions test/expected/backend-l.1.0.1.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[
{
"version": 2,
"name": "_image",
"extent": 4096,
"features": [
{
"raster": "ffd8ffe000104a46494600010100000100010000ffdb00430006040506050406060506070706080a100a0a09090a140e0f0c1017141818171416161a1d251f1a1b231c1616202c20232627292a29191f2d302d283025282928ffdb0043010707070a080a130a0a13281a161a2828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828282828ffc00011080100010003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00f9773452ed39a5238ad08100cd14e0074a471834c2e2519a05140c75148a69c45021b9f4a5eb498e696800a28a5028100a5e94b4d34c05cd3e299e17dd1b156c6322a3141a2e161e5c9249aeb3e1fc529b9bebb484490dbc3893d5771c03f9f15c7d6af8735ab9d16f8c96f2308655f2e788310b2a67255bd4700fd4035152f28b484e3747572967763d89e99a61da17ae7fad686b3682071344fe65acea2485c7704035988a5db0bc1fd05797ea6528b8bb32405780323d734994072493ed8c7eb4f82d9a6731a95dc7eef3f7be951c7034a5b6e063aeee3153742b1234c9902255471d08cb1cfd6ad883ce8912e638e48d70a1a4e71d78e79eb51dbd94a2eca36d550a19f904018ae8ade24953722aec54c9c9c0c03e9594eab8dac6b4e939bb1c9bf84ad2ede46b792685413d70c07f2ae5f58d0ef74b726e226f27b4a07ca6bd9b4eb681ad1c79611998a865cf63dfdeb98f8877b05ae9325a3481e597855db82067a91dba574e1b1b52a54e492b9d3530feca29dcf2a270783464d21a415e9988e04d3c73d698b520e95484c630a681cd3cd3738e948689dd7a83c1f7a85b6e31821875f7ab2cc1e405b8f5aa85b7313552d098803834ac771a4a054142804f4a923883b6d2c14fbd463ad38b13804d52b7501ef0947c1a611834bb89ea49a3afbd1a3d843694504502900b4a29296a8421a4a534869318506928a57003d29a3ad3a971819a067a57c3ed56c2fb469746d56f04374ae1ad4ca708cbdd437639e7078393ce700ef788bc2aba7c0ad16f13e70632a7e618cf1e87193cf519c578a93935eedf00efaeb56d2f51b0bf9bcdb5d3da268b7e498d5cb0600e0f19da71f5f535c18aa5c89d58bf546f4946a5a125f33953b0468f6ca4383f78751576d23478da676c3c8416553dfd4d6f78de08b4dd687d9768cef4f9546dc0fe639ae6a08489f38393fc2075af3f994a37472d483a337165e8acd3cd79636cc8e3047600d5b48fcb723ee285da3d7f2fa53a345da84eeddd30a7200a6bb0128dc49e319e9583936cde3a59b0b7bb36e708c7cd2a59548e09e7193edc9af23d66f27bed4669ae58b39623e82bd2354bc5b2b5bdbb2adbb05539ce32303f5af2d95b7393c735eb6029da2e44ce6e4edd884f5a295a92bbc42ad3fb5314f34f06a912c4a61eb4e634da4c689a53f21c1e4f150629f3b6580fc6999a25b82d8052d145218669c067ad36973c5310b8c1a5a40dd8d1400a0d2d3694534c43a8a4a514c4211462968a004c518a28140c314869692930100c57bbfece4eb6ba0f88a568b719a68630dc741b89047e20d78457bcfc21ca782a08226f2ccf3c921656e4b703f0385e2b8b1f2e5a2fcceac22bd55e437c773993c4738118510a88d31d4924926b010bbb2193aafddcff002adcd796292f5ddc11348fba4511ed084003007bf5acb7449a7298033c80be9fe4578e9a51b186253751dcad26a8522754eabf2e467bd606b1e209ed898a354dcc376e20f15bb789122f0638a33f31661c01ea4d79d6a977f6ab967e00e8a07a5776068466f99ad119b6de825e6a17374bb6799dd47404f1544d29a5550475af5edd102d08a8a9081cf151e2958ab8a053c74a68a776a684c6914da79a4c5218c3cb1268029ec29314ac02514a79e4525030a28a2800a33451400f1466980e29c3a53b8ac2e69c2994e14d085a4a534d34c42d14829d40c6d141a29000193815ee1f0ce096cf40050b075c10a1b04b30cff223f5af15b304dd458193b871eb5ef9f0e190e9b746525419885ce0e3b107f4af33329354d23ab07ad431759dc2e5f259987de39e72793fd2a923451c12dcce5d04685d70a4e7033fd2baff0010c11dbb4b2becdaaa5a4dac39503ad790eafe2592f22962b7844313f0496cb62b8b0d4275f65a19e261c92b90f88f5f1a846b141198e01c907ab1ff000ae65df269d3be5b02a2af76308d35c90d8c22809a506928aa287e78a4a40696810e02834abd6835421b412053aa36cd2d865928b82722a172a3a535ce188cd3686c120ef451454941452f5a4c5300a28a290052ad039a5a6214528a414e14d0829a69d4d2686014521a334863851494669dc45ad3f2b72ae064af23eb5eeff0f6157d252d81282490fceb9eb819e3eb5e3fe06b14d47c49616d3413cf0cb3a23c76e332b0279083fbc6bdd7c3f67e4db087704662fbb61da6327ae0fe3d6bcbccdfba91d5835efb679cfc66b9b2fede86d2ce325e1802b4bbf3c6e276e0715e6d336d5e2b57c43676f61acdd5b59de0bd8636c09c0c6e3dfebf5ac9994b74af4a85354e928c4e6a92e79b6caa4f3450c083c8a4a063a8a4cd1400a29d4dc528e94c43c529a68a7678aa421b40e29cc314def4980d2d918c52514549414628a70e94c4262969714628b05c4c50453a97008cd3b0ae460629c2948a050900a28a3b521a620a6d29a4a4c6213494ea6d218a0fad2d36956803aff863a8ae95e2fd36f1f3b21b88dce0e0f0c3bfb75fc2bbff0011789ee17c353cfa7940ccbb7e619c03c31fad78cd9dc35b5c248bd54835dcdbdf58dfdadedd35ec71bc99dd632ab12771e4abf4e324f415cd88a3cee32ec5c2a385d2ea717534b6c52d9663244437014382df954773e5c52b2a49bd41e0e2a02ea7b9aedbdf630b08f83d69bb57d050580ed9a6e4d4b6521c7681c01516de6a50411822a62901b5dcb2b79e1b1e594e36e3a86cfaf6c516b85ec552b8a5ed9a462d9e948a739a9285a51499a514210f03346d1480d3b22a8441453b19a315255c6e39a752e2940a2c2b80a5a0504d5080d19a4269295c62d25252134ae02e7146ea6d140ec2e6806928a000f268c7345140c28a28a005079a9118af4351814e1421314f27269314b4004f414c4252814f09c50aa09ea69d8571bde8c538a95393cd19005003453651c86f5a7e4531cee3ec2863437049a5c528229a4d48c7022949a8f345170b1262940a51467d2a890e290d04d21a00526909a4cd252b8ec29a434a6929301a4e68a28a0a0a28a2800a28a2800a28a55a004a5029714502002940a054d1216230324f007ad34ae26c75b5bc93c816346763d80aeaa4f05ead6ba0a6aba9462cace5844f0a1e649e3e3f78173f746e5e4e3a8c03ce3d87f66df86df6c12788b588964b0923f2a1b6901c4ae1c365973864e17ae41e78e01af25f8bb16a56ff0011f5c875b9fed17b14e54ca06ddc981b381d3e42b57e489f338fb809bd844cc63c9da586091ee327f9d41bb69e0d4925427ad290d0acf9eb4c2c734119a422a2e5242e693268a281851451400514503ad004878e9466839a6d36c917341a4a295c028a28a061451450014528a5c51610da3029fc7a52114ec171b8a4c53c8a4c52b05c6e2940e78a5009ed4eda45160b8dc518a91538e69ea8055728b98646b9fa56b787f526d23548af52de29e48d5c46b283b43152037b95ce47b815d3fc20f07d978e3c55fd8d7b3dedbb3c2d246f6d12ba8dbc9de49f946381807923a57d5517c2df0dc2ba142d6ccd168f2196dc3303bcf70f9fbc0fa7b0fa1a4d458acdea75fe058c43e0ed1d040901fb246e6344081495ce02f60338c57c57f1dee67baf8b5e246bafbc970234c2edf9155427fe3a073dfad7ddd0aa2dbed456080602e3a7e15f007c5849d3e2678a05deef34ea1313b8e4e0b92bfa1159c2dccda2a5b1c73f5a6114f7eb4c354c486d14a692a46211c5253a93140c4a2948a9acad2e2f6e120b48249e67e1638d4b337d00e4d0043834638ae9f41f04788f5d91174ad26e67672bb4602e77062a7e62383b1f07a7c8dfdd38f49f057ecf5e27d4f5c3178921fecad3223fbc98488ef271c08c0ce79ee7a7d78a6d5b70d4f1775c8cd426a77e9c5426aa44a1b452e28a8b0c4a28a2818514b8a704c8a2c2b8d029e16a48e224e0024fa015ee5f06fe0b5af8e7c1f26b573a84905c0b9786281a3fddbec0bf788c360938e3d3d6aad6dc5bec785aad3b60afa0fc55fb3f6a10a25be8fb2e351f2ccc658f31dbbe1be64da725186e5c65b2c3240e1b1e3faef83b5cd12e6e61beb1901b63895939556dbbb6e7bb6d05b1d76fcdf779aa4afb09a673bb456df837c357be2cf11da68da62af9f70dcb3748d47de73ec07358cc3070460fbd777f04b57bfd23c7d6674a36e2e2e8c76b99caa82ad34658066042e54104f5da582fcc453b76123d2af3f665d404b6cb63af5b3c673e734b1152be9b4679fc48fad797788fe1b6bba25e35bb24174e198048a41e6719272870dd0678c8f7afbe531c8c000924107b52fca5437f10e067a8fa562aa5b72f92e7e69cd13c32bc532347221dacac3054fa114431b4b2a471a967760aa07727802bee2f893f07fc3fe328aeae12de2b3d6a6d845ea827a1e72a180248c8c9e8704e40c1f33f871fb3d4b65e29b96f1a470dde9b02235bb4328d9339e4865fbdc7b8c1e7820d5a9a684e0d1e3df0f2e6c740f167d9fc6779ad6936301f3648ad1595da5520aac8a3071d7f4f5cd7dd2cc258bcd8d558300ea4fbe0e7f235ce78f3e1d683e368238f57b45578c1db342aab20ca9017760900120e063951d4641dfd07498345d12c34cb6691a0b2812de33236e62aa00193f8544a49ea54558bb0333c7f36010bce2be1ff00da2ac25b1f8b7ad34b1796973e5dc47e8ca51413ff007d061f857dc6eabe5b02405238ec7f0af88bf692d44dff00c5bd5137ef5b48e1b61ec446091edf331a74f714f63cb5969a56a5a08ad6c45cae4537153b2d4656a5a293194538ad5cd3b4abfd484ed61677372b02ef94c3197d8bea71d054d877343c11e16d43c61e21b7d274b4ccb27ccee47cb1a0eac7dabea6f01fc2597451a2be9925b2e95711b3eacd710b2dd5c2942044b901914f1c0da47be71537ecade113a1f82a5d5aeed6586fb547de0c8307ca5242000f2327737b82a457b68236f20823f2352e5cba0e2afa8c8238e28618e18d2348d42aa2a80aa0740074007b53e5e036deb8cfe348477a07cc724601fcfa54147e68b0c8a8cad4d484574b462995c8a43560a8c537ca24e075352d0d321adef0bf8475df14dca43a16997377b9c219110f9687fda6e82ba0f0a7c34d7f51bdd3e5b8d2ae0db4d32810b02b24eb905801d546dcfcc70071cf35f6df863c2fa5787ad6d92c74fb086e2187c969ada0f2f3d376dc9620315538dc73819248cd4bd16a5ad4f26f097ecebe1db6d2248bc51035ddf92a04f6d76ea00d8bb8e36800efde075e003dc81e96de00f0acda75b59cbe1ed366b781046be6c2acfb40c7dec649e0739aea2d65f301dfb73ca91f8f7f7a791f295071fd2b3e663b238bf0c7c32f0b787ed2682d74cb798b80ad2cf0a1723680412a01c120b11eac40c2e1475d63656d616d1db595bc76f6f18c2c71285551ec054d8c12401920034a33c2e383fa52726dea348518c1c645230c9391c9ee7d29588009a68c6d2cbd5b9fd38a43380f889f0c344f1ac96735e58c62eade4dad32b18cb478e41dbf7bb60123ea2b8bb8f812346d6741d4fc097e9657562c4dc1be667f3724e186d18cf24153f29007b9af745276807ae39a4e2ae3371d89714c8ad93693d7f1efc62a5c9231437b52ad4b771a5614120520ebed4646720d2a904819e0f6a431af919009cfad34b1638ea075eddaa4917048cf4a6a8561c8e7d0f4fa8a68424b1ef099c7cbfad7c43f1bbc01e24f0d789f51d535512dfe9f7b70d2aea489f2b1639dae07dc61d31d3d2bee1273d739f7aa5aa69561abdb7d9f54b2b7bc87921278c3804a952467a1dacc323b134e12b3138dcfcdea2bde3e377c13bad1750fed3f07595cdd697372f6d183235b11e9dcafb9af0ebab49ed4a0b88ca6f1b94f50c3241c1f6208fa8ae84efb1935620a4c0a5a4a041806be9cfd92749d5ecadb58bc96ce11a65dc90c6cf34c55d711b3e563c1ce43c5d76e55f209c60f93fc2ff84fae78f273242a6c74b4203ddcc8707d907f11e3d40afb3bc13e18b5f08f86acb46b29ae2e20b55204970fb9d892493ec324e0761c544e4ad62e09ee6cb1c0daa08ed91da9e5cec200f9bd695b9e7bd34676f3581a898c281c8ff1ef4fedcd266940cd007e73ebde1ad6bc3c621ade997563e6e4219a32a18800900fa8041c7b8ac9afd1ed6344d2f5cb616face9d697f00e425cc2b200718c8c8e0fb8ae1e7f82be009ae6691f4084248a14451c8e8b19c9cb2ed6ce4e40c1240da300739dd545d4cb919f0cd7b17c14f867aa6abade83afee8bec515ca5cb47b77108ad90581e003b4fbf22bd9b50fd9dbc132dc452db2df5bc4a732442e59838cfa9e4771f8d7ac689a3d8e85a55b69da55ba5bd940812345e7007a9ea4fb9a25356d0518bbb4d16d19426dc05cfa53dd48da4138a61cf21867d0d018f4ed589b0d11053f2800673c714febd69dfc34dce0d17017240a690378207cdd33e94bd7a5382823de810841ce68147340ebed4860683d28ef4500001cd2f7a5ed4ceb4011cf2f952c08594798d8e7bf07814f032158755e08aafa843e6451b2cad1bc6e1f8246700e41e3a104d58e7ccdea723d7d69f410f0dbc80dc6290f5e2958e79f5a41d4fa0eb4860681c1a45f5ed4b8a0009e78af08f8eff0007affc61abc3abf87a7816e121292db4bf229e720a903a924e73ed5ef38e94d842b31ce7269a972ea84d5f43f3ced7c11e28bb9a68adbc3faa48f0922402d9be523f0f6af4ef853f0375dbdd6edaff00c576674ed32170fe4cc4096738c8000e83a726bebf91406390377d2a39149db8e839c55fb46c9e4b090c4902058915100000031c53ce71433858cb370314abeac3159961f8e45149c678a5340099c9a70a31c714500275e94840038a69c87229e083f5a6037b734e8f206d2723a8a6923753c52010e41f6a42a01c8e29c323d2948340588ff9519ce40a465c1e6946060a8e6980a99ef4e27f2a43c75a073f8d200340e69718a0f14001a41d69714c90e07502801c48edd69075c814918e9520231c50031d37ab29246e18c8ea2ab5b2cf83149e5e23e8549c9f41cf238fafe956ce31cf029540ddc01b8f14ef615818e40c0c714de991f8d4920da003d6a3ce4d21877a01f4ef4d20e081ff00eaa70edf4a042b1c2fbd362186e7ad19dadb8f4f4a703f3161dff4a062cc70dcf27a53436e3fd29186793c01510765c8c0ebc1f6f5a690ae2cefb464f41ce4f4148926ee01e7af4ed4d961f3d503b9e1b3effe1536d3b460a86da01e33d3f5a7a0841d69e29385f5f4a5c60d2b8c326941e79a00a4ea78a43038ce7bd02a3dd406a0073ae69dbb23d2981a90bf6a043f276d3d09c74c8a84be451e61e9da81dc9580ebd69a17be6981f1eb4bbf8c01400fe79a0f1c53377146ea007f34bdaa32c71406cfd28024ce0d0402083c835097c66951cb37a0c649a005276a9c75e9f4a588ed0693a9ed4f031cd31d87672011484e18519cd046690587cdebf8d3231c5296e307b545e65022438cd15196e334d67c2d0048f8228e838aa33dc3e311a33b1e83381f89ed5750e2df9e4d30219e4c6013d7b53c2ee45f61c9aaadfbcbacff007063f3ab48f8078e69b625b9260818cf34e504e4e73516fe334ab2100e3a548c71018114fedef5087cf4e2937f340225ce68e3151efe33406a07605e40a31d69c1481cd14d12329add6a5c534af2734ec030507ad3c8ed48171458040b9e4d38019a41d694f0334580434734dddcd3b1d295800f5a5c7149d28ce29d806b019a70f6a4e491f9d28fe748648a29e69b1d3f14143338e2941f4a46a6914098a4d34e074a00a5ef4084380b552e5f3b54f009c13e839abb20c28f7ac9d527105a5c5c30cac71962338e993d7e80d090992e54aef5009c71ea7d2ae1ca2aa1c640e7ebdeab6956e915b871b98c9f382dd4038200f6008c55a61eb431d888000d3d4e47b9a6f6cd3e3eb8a2c2060693000f7a918640c7ad31c7cd8a2c3b004c1c8348eb8e7b5394f3cd3ce0f14586881720d38373cd2629a9f7a900e37f122832b6c05777cc31ed8fafb54db95f25483b4e0e3b1f7ae575bbc46bff00b1c5710cb73044d72e8e3b64a82547054302300fa55b8dae6e2e2dd2cc98a3b755698ca4ff0012060ac7ae79157622e7403ef529193597a6ea915e5d35b61848aa0abe30b28c7257e872307f515a5d29d8008a422979a46614ac0348c73de90b640a7120d46e718f4aab00a793ef4f1cf5a8c1f7a900cf434ac0231a677a561cfeb502dbc867121b9942860de5a850318c119ebcf5a0659032052a8e4601229c140501470062a48d70314868231cd3c52edc0ce2a19ee2280c7e6b84dec1173dc9e00fc69586291ce7bd27b538e306928b098702984f39a711da98fd0014ec2b95ee2621c236155ba1e727d79e9f4a6c881b2a4020e4b67bf602966865951e3531f998dc8cca70b82011c739a944610607b0a62162f94e07dd1c0a7e334d5e9c5396958a4c611ce3b53470d5211ce474fe74c61cd1601e0e45230e698ac474a93391400d3d38a5278e7ad28eb48e3a500349c9e9d6853cd1da940a00ffd9",
"properties": {}
}
]
}
]
13 changes: 13 additions & 0 deletions test/expected/backend-l.1.1.0.json

Large diffs are not rendered by default.

Loading