{"action":"created","comment":{"url":"https://api.github.com/repos/iTowns/itowns2/pulls/comments/86140541","pull_request_review_id":6809449,"id":86140541,"diff_hunk":"@@ -292,95 +302,135 @@ function updateNodeImagery(quadtree, node, layersConfig, force) {\n }\n \n function updateNodeElevation(quadtree, node, layersConfig, force) {\n-    let currentElevation = node.materials[RendererConstant.FINAL].getLevelLayerColor(0, 0);\n-\n+    // Elevation is currently handled differently from color layers.\n+    // This is caused by a LayeredMaterial limitation: only 1 elevation texture\n+    // can be used (where a tile can have N textures x M layers)\n     const elevationLayers = layersConfig.getElevationLayers();\n-    for (var i = 0; i < elevationLayers.length; i++) {\n-        let layer = elevationLayers[i];\n+    let bestLayer = null;\n+    let ancestor = null;\n \n-        if (layersConfig.isLayerFrozen(layer.id) && !force) {\n-            continue;\n+    let currentElevation = node.materials[RendererConstant.FINAL].getLayerLevel(l_ELEVATION, 0);\n+\n+    // Step 0: currentElevevation is -1 BUT material.nbTextures[l_ELEVATION] is > 0\n+    // means that we already tried and failed to download an elevation texture\n+    if (currentElevation == -1 && 0 < node.material.nbTextures[l_ELEVATION]) {\n+        return Promise.resolve(node);\n+    }\n+\n+    // First step: if currentElevation is empty (level is -1), we *must* use the texture from\n+    // one of our parent. This allows for smooth transitions when subdividing\n+    // We don't care about layer status (isLayerFrozen) or limits (tileInsideLimit) because\n+    // we simply want to use ancestor's texture with a different pitch\n+    if (currentElevation == -1) {\n+        for (let i = 0; i < elevationLayers.length; i++) {\n+            let layer = elevationLayers[i];\n+\n+            if (currentElevation === -1) {\n+                let a = findAncestorWithValidTextureForLayer(node, l_ELEVATION, layer);\n+\n+                if (a != null) {\n+                    bestLayer = layer;\n+                    ancestor = a;\n+                    break;\n+                }\n+            }\n         }\n+    }\n \n-        // Decide which texture (level) to download\n-        let ancestor = null;\n-        if (currentElevation < 0) {\n-            // no texture: use elevation texture from parent\n-            let parentElevationLevel = node.parent.materials[RendererConstant.FINAL].getLevelLayerColor(0, 0);\n-            if (parentElevationLevel > 0) {\n-                ancestor = node.getNodeAtLevel(parentElevationLevel);\n+    // We don't have a texture to reuse. This can happen in two cases:\n+    //   * no ancestor texture to use\n+    //   * we already have 1 texture (so currentElevation >= 0)\n+    // Again, LayeredMaterial's 1 elevation texture limitation forces us to `break` as soon\n+    // as one layer can supply a texture for this node. So ordering of elevation layers is important.\n+    if (bestLayer == null) {\n+        for (let i = 0; i < elevationLayers.length; i++) {\n+            let layer = elevationLayers[i];\n+\n+            if (!layer.tileInsideLimit(node, layer)) {\n+                continue;\n             }\n \n-        } else {\n-            var targetLevel = chooseNextLevelToFetch(layer.updateStrategy.type, node.level, currentElevation, layer.updateStrategy.options);\n+            if (layersConfig.isLayerFrozen(layer.id) && !force) {\n+                continue;\n+            }\n \n-            if (targetLevel != currentElevation) {\n-                ancestor = node.getNodeAtLevel(targetLevel);\n-            } else {\n-                // all good\n-                return Promise.resolve(node);\n+            let targetLevel = chooseNextLevelToFetch(layer.updateStrategy.type, node.level, currentElevation, layer.updateStrategy.options);\n+            if (targetLevel <= currentElevation) {\n+                continue;\n             }\n-        }\n \n+            ancestor = node.getNodeAtLevel(targetLevel);\n+            bestLayer = layer;\n+            break;\n+        }\n+    }\n \n-        if (layer.tileInsideLimit(ancestor ? ancestor : node, layer)) {\n-            var args = { layer, ancestor };\n+    // If we found a usable layer, perform a query\n+    if (bestLayer != null) {\n+        let args = { 'layer': bestLayer, ancestor };\n \n-            return quadtree.interCommand.request(args, node, refinementCommandCancellationFn).then(function(terrain) {\n-                if (node.material === null) {\n-                    return;\n-                }\n+        return quadtree.interCommand.request(args, node, refinementCommandCancellationFn).then(function(terrain) {\n+            if (node.material === null) {\n+                return;\n+            }\n \n-                if (terrain && terrain.texture) {\n-                    terrain.texture.level = (ancestor || node).level;\n-                }\n+            if (terrain && terrain.texture) {\n+                terrain.texture.level = (ancestor || node).level;\n+            }\n \n-                if (terrain && terrain.max === undefined) {\n-                    terrain.min = (ancestor || node).bbox.bottom();\n-                    terrain.max = (ancestor || node).bbox.top();\n-                }\n+            if (terrain && terrain.max === undefined) {\n+                terrain.min = (ancestor || node).bbox.bottom();\n+                terrain.max = (ancestor || node).bbox.top();\n+            }\n \n-                node.setTextureElevation(terrain);\n+            node.setTextureElevation(terrain);\n \n-                return node;\n-            });\n-        }\n+            return node;\n+        });\n     }\n \n     // No elevation texture available for this node, no need to wait for one.\n-    node.texturesNeeded -= 1;\n     return Promise.resolve(node);\n }\n \n-/**\n- * @documentation: Compute screen space error of node in function of camera\n- * @param {type} node\n- * @param {type} camera\n- * @returns {Boolean}\n- */\n-NodeProcess.prototype.SSE = function(node, camera, params) {\n-    // update node's sse value\n-    node.sse = camera.computeNodeSSE(node);\n \n-    var sse = this.checkNodeSSE(node);\n-    var hidden = sse && node.childrenLoaded();\n+NodeProcess.prototype.processNode = function(node, camera, params) {\n+    var wasVisible = node.isVisible();\n+    var isVisible = !this.isCulled(node, camera);\n+\n+    node.setDisplayed(false);\n+    node.setSelected(false);\n+\n+    node.setVisibility(isVisible);\n+\n+    if (isVisible) {\n+        // update node's sse value\n+        node.sse = camera.computeNodeSSE(node);\n+\n+        var sse = this.checkNodeSSE(node);","path":"src/Scene/NodeProcess.js","position":261,"original_position":261,"commit_id":"b0839957234cd91fa5169c0fb4ca12de2150c8ba","original_commit_id":"b0839957234cd91fa5169c0fb4ca12de2150c8ba","user":{"login":"gchoqueux","id":11291849,"avatar_url":"https://avatars.githubusercontent.com/u/11291849?v=3","gravatar_id":"","url":"https://api.github.com/users/gchoqueux","html_url":"https://github.com/gchoqueux","followers_url":"https://api.github.com/users/gchoqueux/followers","following_url":"https://api.github.com/users/gchoqueux/following{/other_user}","gists_url":"https://api.github.com/users/gchoqueux/gists{/gist_id}","starred_url":"https://api.github.com/users/gchoqueux/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gchoqueux/subscriptions","organizations_url":"https://api.github.com/users/gchoqueux/orgs","repos_url":"https://api.github.com/users/gchoqueux/repos","events_url":"https://api.github.com/users/gchoqueux/events{/privacy}","received_events_url":"https://api.github.com/users/gchoqueux/received_events","type":"User","site_admin":false},"body":"let or var?","created_at":"2016-11-02T13:31:37Z","updated_at":"2016-11-02T13:31:37Z","html_url":"https://github.com/iTowns/itowns2/pull/141#discussion_r86140541","pull_request_url":"https://api.github.com/repos/iTowns/itowns2/pulls/141","_links":{"self":{"href":"https://api.github.com/repos/iTowns/itowns2/pulls/comments/86140541"},"html":{"href":"https://github.com/iTowns/itowns2/pull/141#discussion_r86140541"},"pull_request":{"href":"https://api.github.com/repos/iTowns/itowns2/pulls/141"}}},"pull_request":{"url":"https://api.github.com/repos/iTowns/itowns2/pulls/141","id":76621373,"html_url":"https://github.com/iTowns/itowns2/pull/141","diff_url":"https://github.com/iTowns/itowns2/pull/141.diff","patch_url":"https://github.com/iTowns/itowns2/pull/141.patch","issue_url":"https://api.github.com/repos/iTowns/itowns2/issues/141","number":141,"state":"open","locked":false,"title":"Use requestAnimationFrame for update loop","user":{"login":"Jeremy-Gaillard","id":1814191,"avatar_url":"https://avatars.githubusercontent.com/u/1814191?v=3","gravatar_id":"","url":"https://api.github.com/users/Jeremy-Gaillard","html_url":"https://github.com/Jeremy-Gaillard","followers_url":"https://api.github.com/users/Jeremy-Gaillard/followers","following_url":"https://api.github.com/users/Jeremy-Gaillard/following{/other_user}","gists_url":"https://api.github.com/users/Jeremy-Gaillard/gists{/gist_id}","starred_url":"https://api.github.com/users/Jeremy-Gaillard/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Jeremy-Gaillard/subscriptions","organizations_url":"https://api.github.com/users/Jeremy-Gaillard/orgs","repos_url":"https://api.github.com/users/Jeremy-Gaillard/repos","events_url":"https://api.github.com/users/Jeremy-Gaillard/events{/privacy}","received_events_url":"https://api.github.com/users/Jeremy-Gaillard/received_events","type":"User","site_admin":false},"body":"Replaced setTimeout by requestAnimationFrame.\n\nRemoved calls to scene update (scene.wait()) from managerCommands and c3Dengine and clarified the update mechanism.\n","created_at":"2016-07-07T15:59:53Z","updated_at":"2016-11-02T13:32:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8e2980c6554f61b152f6589cf2af54387ffc2230","assignee":null,"assignees":[],"milestone":{"url":"https://api.github.com/repos/iTowns/itowns2/milestones/1","html_url":"https://github.com/iTowns/itowns2/milestones/2.0","labels_url":"https://api.github.com/repos/iTowns/itowns2/milestones/1/labels","id":1977044,"number":1,"title":"2.0","description":"First release of major version iTowns 2.0 ","creator":{"login":"vpicavet","id":76112,"avatar_url":"https://avatars.githubusercontent.com/u/76112?v=3","gravatar_id":"","url":"https://api.github.com/users/vpicavet","html_url":"https://github.com/vpicavet","followers_url":"https://api.github.com/users/vpicavet/followers","following_url":"https://api.github.com/users/vpicavet/following{/other_user}","gists_url":"https://api.github.com/users/vpicavet/gists{/gist_id}","starred_url":"https://api.github.com/users/vpicavet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vpicavet/subscriptions","organizations_url":"https://api.github.com/users/vpicavet/orgs","repos_url":"https://api.github.com/users/vpicavet/repos","events_url":"https://api.github.com/users/vpicavet/events{/privacy}","received_events_url":"https://api.github.com/users/vpicavet/received_events","type":"User","site_admin":false},"open_issues":15,"closed_issues":2,"state":"open","created_at":"2016-09-01T08:37:19Z","updated_at":"2016-10-27T09:33:49Z","due_on":"2016-12-25T00:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/iTowns/itowns2/pulls/141/commits","review_comments_url":"https://api.github.com/repos/iTowns/itowns2/pulls/141/comments","review_comment_url":"https://api.github.com/repos/iTowns/itowns2/pulls/comments{/number}","comments_url":"https://api.github.com/repos/iTowns/itowns2/issues/141/comments","statuses_url":"https://api.github.com/repos/iTowns/itowns2/statuses/b0839957234cd91fa5169c0fb4ca12de2150c8ba","head":{"label":"iTowns:updateLoop","ref":"updateLoop","sha":"b0839957234cd91fa5169c0fb4ca12de2150c8ba","user":{"login":"iTowns","id":14266889,"avatar_url":"https://avatars.githubusercontent.com/u/14266889?v=3","gravatar_id":"","url":"https://api.github.com/users/iTowns","html_url":"https://github.com/iTowns","followers_url":"https://api.github.com/users/iTowns/followers","following_url":"https://api.github.com/users/iTowns/following{/other_user}","gists_url":"https://api.github.com/users/iTowns/gists{/gist_id}","starred_url":"https://api.github.com/users/iTowns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iTowns/subscriptions","organizations_url":"https://api.github.com/users/iTowns/orgs","repos_url":"https://api.github.com/users/iTowns/repos","events_url":"https://api.github.com/users/iTowns/events{/privacy}","received_events_url":"https://api.github.com/users/iTowns/received_events","type":"Organization","site_admin":false},"repo":{"id":43068275,"name":"itowns2","full_name":"iTowns/itowns2","owner":{"login":"iTowns","id":14266889,"avatar_url":"https://avatars.githubusercontent.com/u/14266889?v=3","gravatar_id":"","url":"https://api.github.com/users/iTowns","html_url":"https://github.com/iTowns","followers_url":"https://api.github.com/users/iTowns/followers","following_url":"https://api.github.com/users/iTowns/following{/other_user}","gists_url":"https://api.github.com/users/iTowns/gists{/gist_id}","starred_url":"https://api.github.com/users/iTowns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iTowns/subscriptions","organizations_url":"https://api.github.com/users/iTowns/orgs","repos_url":"https://api.github.com/users/iTowns/repos","events_url":"https://api.github.com/users/iTowns/events{/privacy}","received_events_url":"https://api.github.com/users/iTowns/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/iTowns/itowns2","description":"iTowns 2 is the next generation of iTowns, a JS/WebGL framework for 3D geospatial data visualization","fork":false,"url":"https://api.github.com/repos/iTowns/itowns2","forks_url":"https://api.github.com/repos/iTowns/itowns2/forks","keys_url":"https://api.github.com/repos/iTowns/itowns2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/iTowns/itowns2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/iTowns/itowns2/teams","hooks_url":"https://api.github.com/repos/iTowns/itowns2/hooks","issue_events_url":"https://api.github.com/repos/iTowns/itowns2/issues/events{/number}","events_url":"https://api.github.com/repos/iTowns/itowns2/events","assignees_url":"https://api.github.com/repos/iTowns/itowns2/assignees{/user}","branches_url":"https://api.github.com/repos/iTowns/itowns2/branches{/branch}","tags_url":"https://api.github.com/repos/iTowns/itowns2/tags","blobs_url":"https://api.github.com/repos/iTowns/itowns2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/iTowns/itowns2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/iTowns/itowns2/git/refs{/sha}","trees_url":"https://api.github.com/repos/iTowns/itowns2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/iTowns/itowns2/statuses/{sha}","languages_url":"https://api.github.com/repos/iTowns/itowns2/languages","stargazers_url":"https://api.github.com/repos/iTowns/itowns2/stargazers","contributors_url":"https://api.github.com/repos/iTowns/itowns2/contributors","subscribers_url":"https://api.github.com/repos/iTowns/itowns2/subscribers","subscription_url":"https://api.github.com/repos/iTowns/itowns2/subscription","commits_url":"https://api.github.com/repos/iTowns/itowns2/commits{/sha}","git_commits_url":"https://api.github.com/repos/iTowns/itowns2/git/commits{/sha}","comments_url":"https://api.github.com/repos/iTowns/itowns2/comments{/number}","issue_comment_url":"https://api.github.com/repos/iTowns/itowns2/issues/comments{/number}","contents_url":"https://api.github.com/repos/iTowns/itowns2/contents/{+path}","compare_url":"https://api.github.com/repos/iTowns/itowns2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/iTowns/itowns2/merges","archive_url":"https://api.github.com/repos/iTowns/itowns2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/iTowns/itowns2/downloads","issues_url":"https://api.github.com/repos/iTowns/itowns2/issues{/number}","pulls_url":"https://api.github.com/repos/iTowns/itowns2/pulls{/number}","milestones_url":"https://api.github.com/repos/iTowns/itowns2/milestones{/number}","notifications_url":"https://api.github.com/repos/iTowns/itowns2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/iTowns/itowns2/labels{/name}","releases_url":"https://api.github.com/repos/iTowns/itowns2/releases{/id}","deployments_url":"https://api.github.com/repos/iTowns/itowns2/deployments","created_at":"2015-09-24T13:24:26Z","updated_at":"2016-10-25T15:07:13Z","pushed_at":"2016-10-28T15:09:47Z","git_url":"git://github.com/iTowns/itowns2.git","ssh_url":"git@github.com:iTowns/itowns2.git","clone_url":"https://github.com/iTowns/itowns2.git","svn_url":"https://github.com/iTowns/itowns2","homepage":"","size":68569,"stargazers_count":20,"watchers_count":20,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":15,"mirror_url":null,"open_issues_count":87,"forks":15,"open_issues":87,"watchers":20,"default_branch":"master"}},"base":{"label":"iTowns:master","ref":"master","sha":"27ff1717bbd6c00f5b07afdc6783834ace4f803f","user":{"login":"iTowns","id":14266889,"avatar_url":"https://avatars.githubusercontent.com/u/14266889?v=3","gravatar_id":"","url":"https://api.github.com/users/iTowns","html_url":"https://github.com/iTowns","followers_url":"https://api.github.com/users/iTowns/followers","following_url":"https://api.github.com/users/iTowns/following{/other_user}","gists_url":"https://api.github.com/users/iTowns/gists{/gist_id}","starred_url":"https://api.github.com/users/iTowns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iTowns/subscriptions","organizations_url":"https://api.github.com/users/iTowns/orgs","repos_url":"https://api.github.com/users/iTowns/repos","events_url":"https://api.github.com/users/iTowns/events{/privacy}","received_events_url":"https://api.github.com/users/iTowns/received_events","type":"Organization","site_admin":false},"repo":{"id":43068275,"name":"itowns2","full_name":"iTowns/itowns2","owner":{"login":"iTowns","id":14266889,"avatar_url":"https://avatars.githubusercontent.com/u/14266889?v=3","gravatar_id":"","url":"https://api.github.com/users/iTowns","html_url":"https://github.com/iTowns","followers_url":"https://api.github.com/users/iTowns/followers","following_url":"https://api.github.com/users/iTowns/following{/other_user}","gists_url":"https://api.github.com/users/iTowns/gists{/gist_id}","starred_url":"https://api.github.com/users/iTowns/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/iTowns/subscriptions","organizations_url":"https://api.github.com/users/iTowns/orgs","repos_url":"https://api.github.com/users/iTowns/repos","events_url":"https://api.github.com/users/iTowns/events{/privacy}","received_events_url":"https://api.github.com/users/iTowns/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/iTowns/itowns2","description":"iTowns 2 is the next generation of iTowns, a JS/WebGL framework for 3D geospatial data visualization","fork":false,"url":"https://api.github.com/repos/iTowns/itowns2","forks_url":"https://api.github.com/repos/iTowns/itowns2/forks","keys_url":"https://api.github.com/repos/iTowns/itowns2/keys{/key_id}","collaborators_url":"https://api.github.com/repos/iTowns/itowns2/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/iTowns/itowns2/teams","hooks_url":"https://api.github.com/repos/iTowns/itowns2/hooks","issue_events_url":"https://api.github.com/repos/iTowns/itowns2/issues/events{/number}","events_url":"https://api.github.com/repos/iTowns/itowns2/events","assignees_url":"https://api.github.com/repos/iTowns/itowns2/assignees{/user}","branches_url":"https://api.github.com/repos/iTowns/itowns2/branches{/branch}","tags_url":"https://api.github.com/repos/iTowns/itowns2/tags","blobs_url":"https://api.github.com/repos/iTowns/itowns2/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/iTowns/itowns2/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/iTowns/itowns2/git/refs{/sha}","trees_url":"https://api.github.com/repos/iTowns/itowns2/git/trees{/sha}","statuses_url":"https://api.github.com/repos/iTowns/itowns2/statuses/{sha}","languages_url":"https://api.github.com/repos/iTowns/itowns2/languages","stargazers_url":"https://api.github.com/repos/iTowns/itowns2/stargazers","contributors_url":"https://api.github.com/repos/iTowns/itowns2/contributors","subscribers_url":"https://api.github.com/repos/iTowns/itowns2/subscribers","subscription_url":"https://api.github.com/repos/iTowns/itowns2/subscription","commits_url":"https://api.github.com/repos/iTowns/itowns2/commits{/sha}","git_commits_url":"https://api.github.com/repos/iTowns/itowns2/git/commits{/sha}","comments_url":"https://api.github.com/repos/iTowns/itowns2/comments{/number}","issue_comment_url":"https://api.github.com/repos/iTowns/itowns2/issues/comments{/number}","contents_url":"https://api.github.com/repos/iTowns/itowns2/contents/{+path}","compare_url":"https://api.github.com/repos/iTowns/itowns2/compare/{base}...{head}","merges_url":"https://api.github.com/repos/iTowns/itowns2/merges","archive_url":"https://api.github.com/repos/iTowns/itowns2/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/iTowns/itowns2/downloads","issues_url":"https://api.github.com/repos/iTowns/itowns2/issues{/number}","pulls_url":"https://api.github.com/repos/iTowns/itowns2/pulls{/number}","milestones_url":"https://api.github.com/repos/iTowns/itowns2/milestones{/number}","notifications_url":"https://api.github.com/repos/iTowns/itowns2/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/iTowns/itowns2/labels{/name}","releases_url":"https://api.github.com/repos/iTowns/itowns2/releases{/id}","deployments_url":"https://api.github.com/repos/iTowns/itowns2/deployments","created_at":"2015-09-24T13:24:26Z","updated_at":"2016-10-25T15:07:13Z","pushed_at":"2016-10-28T15:09:47Z","git_url":"git://github.com/iTowns/itowns2.git","ssh_url":"git@github.com:iTowns/itowns2.git","clone_url":"https://github.com/iTowns/itowns2.git","svn_url":"https://github.com/iTowns/itowns2","homepage":"","size":68569,"stargazers_count":20,"watchers_count":20,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":15,"mirror_url":null,"open_issues_count":87,"forks":15,"open_issues":87,"watchers":20,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/iTowns/itowns2/pulls/141"},"html":{"href":"https://github.com/iTowns/itowns2/pull/141"},"issue":{"href":"https://api.github.com/repos/iTowns/itowns2/issues/141"},"comments":{"href":"https://api.github.com/repos/iTowns/itowns2/issues/141/comments"},"review_comments":{"href":"https://api.github.com/repos/iTowns/itowns2/pulls/141/comments"},"review_comment":{"href":"https://api.github.com/repos/iTowns/itowns2/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/iTowns/itowns2/pulls/141/commits"},"statuses":{"href":"https://api.github.com/repos/iTowns/itowns2/statuses/b0839957234cd91fa5169c0fb4ca12de2150c8ba"}}}}
{"actor":{"display_login":"gchoqueux"}}