From 24ae1ecd63b399f10e7c6543d4df35d7c605e455 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 15:39:00 -0500 Subject: [PATCH 01/64] caching and debouncing at the taginfo level --- js/id/services/taginfo.js | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/js/id/services/taginfo.js b/js/id/services/taginfo.js index 850de9efd..461afe708 100644 --- a/js/id/services/taginfo.js +++ b/js/id/services/taginfo.js @@ -14,6 +14,8 @@ iD.taginfo = function() { line: 'ways' }; + var cache = this.cache = {}; + function sets(parameters, n, o) { if (parameters.geometry && o[parameters.geometry]) { parameters[n] = o[parameters.geometry]; @@ -34,9 +36,9 @@ iD.taginfo = function() { } function popularKeys(parameters) { - var pop_field = 'count_all_fraction'; - if (parameters.filter) pop_field = 'count_' + parameters.filter + '_fraction'; - return function(d) { return parseFloat(d[pop_field]) > 0.01; }; + var pop_field = 'count_all'; + if (parameters.filter) pop_field = 'count_' + parameters.filter; + return function(d) { return parseFloat(d[pop_field]) > 10000; }; } function popularValues(parameters) { @@ -52,9 +54,22 @@ iD.taginfo = function() { }; } + var debounced = _.debounce(d3.json, 100, true); + + function request(url, callback) { + if (cache[url]) { + callback(null, cache[url]); + } else { + debounced(url, function(err, data) { + if (!err) cache[url] = data; + callback(err, data); + }); + } + } + taginfo.keys = function(parameters, callback) { parameters = clean(setSort(setFilter(parameters))); - d3.json(endpoint + 'keys/all?' + + request(endpoint + 'keys/all?' + iD.util.qsString(_.extend({ rp: 6, sortname: 'count_all', @@ -68,7 +83,7 @@ iD.taginfo = function() { taginfo.values = function(parameters, callback) { parameters = clean(setSort(setFilter(parameters))); - d3.json(endpoint + 'key/values?' + + request(endpoint + 'key/values?' + iD.util.qsString(_.extend({ rp: 20, sortname: 'count_all', @@ -82,7 +97,7 @@ iD.taginfo = function() { taginfo.docs = function(parameters, callback) { parameters = clean(setSort(parameters)); - d3.json(endpoint + 'tag/wiki_pages?' + + request(endpoint + 'tag/wiki_pages?' + iD.util.qsString(parameters), callback); }; From eb1113f058be44b8bb58c9d7c96d34c96e3b6db8 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 16:16:26 -0500 Subject: [PATCH 02/64] Remove original taginfo debouce and shorten key/value queries to 3 chars to prevent unnecessary requests. Assumption is that 3 chars is specific enough --- js/id/services/taginfo.js | 15 ++++++++++++--- js/id/ui/taglist.js | 8 ++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/js/id/services/taginfo.js b/js/id/services/taginfo.js index 461afe708..1db8b8877 100644 --- a/js/id/services/taginfo.js +++ b/js/id/services/taginfo.js @@ -35,6 +35,15 @@ iD.taginfo = function() { return _.omit(parameters, 'geometry'); } + function shorten(parameters) { + if (!parameters.query) { + delete parameters.query; + } else { + parameters.query = parameters.query.slice(0, 3); + } + return parameters; + } + function popularKeys(parameters) { var pop_field = 'count_all'; if (parameters.filter) pop_field = 'count_' + parameters.filter; @@ -68,10 +77,10 @@ iD.taginfo = function() { } taginfo.keys = function(parameters, callback) { - parameters = clean(setSort(setFilter(parameters))); + parameters = clean(shorten(setSort(setFilter(parameters)))); request(endpoint + 'keys/all?' + iD.util.qsString(_.extend({ - rp: 6, + rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1 @@ -82,7 +91,7 @@ iD.taginfo = function() { }; taginfo.values = function(parameters, callback) { - parameters = clean(setSort(setFilter(parameters))); + parameters = clean(shorten(setSort(setFilter(parameters)))); request(endpoint + 'key/values?' + iD.util.qsString(_.extend({ rp: 20, diff --git a/js/id/ui/taglist.js b/js/id/ui/taglist.js index 9adcab563..58370f3ca 100644 --- a/js/id/ui/taglist.js +++ b/js/id/ui/taglist.js @@ -212,18 +212,18 @@ iD.ui.Taglist = function() { var keyinput = key.select('input'); key.call(d3.combobox() - .fetcher(_.debounce(function(_, __, callback) { + .fetcher(function(_, __, callback) { taginfo.keys({ geometry: geometry, query: keyinput.property('value') }, function(err, data) { if (!err) callback(sort(keyinput.property('value'), data)); }); - }, 500))); + })); var valueinput = value.select('input'); value.call(d3.combobox() - .fetcher(_.debounce(function(_, __, callback) { + .fetcher(function(_, __, callback) { taginfo.values({ key: keyinput.property('value'), geometry: geometry, @@ -231,7 +231,7 @@ iD.ui.Taglist = function() { }, function(err, data) { if (!err) callback(sort(valueinput.property('value'), data)); }); - }, 500))); + })); } function focusNewKey() { From 42a662720d456b10a47d27fdfa6f139332285c40 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 16:47:11 -0500 Subject: [PATCH 03/64] Replace underscores with spaces for select/combo --- js/id/ui/preset.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/js/id/ui/preset.js b/js/id/ui/preset.js index a1553a38c..db5a71436 100644 --- a/js/id/ui/preset.js +++ b/js/id/ui/preset.js @@ -13,7 +13,9 @@ iD.ui.preset = function() { var tags = _.clone(preset.match.tags); sections.selectAll('input,select') .each(function(d) { - tags[d.key] = this.value; + tags[d.key] = d.type === 'combo' || d.type === 'select' ? + this.value.replace(' ', '_') : + this.value; }); return tags; } @@ -23,6 +25,9 @@ iD.ui.preset = function() { sections.selectAll('input,select') .each(function(d) { this.value = tags[d.key] || ''; + if (d.type === 'combo' || d.type === 'select') { + this.value = this.value.replace('_', ' '); + } }); } @@ -75,10 +80,9 @@ iD.ui.preset = function() { wrap = this.append('span').attr('class', 'input-wrap-position'), i = wrap.append('input').attr('type', 'text'); wrap.call(d3.combobox().data(d.options.map(function(d) { - return { - title: d, - value: d - }; + var o = {}; + o.title = o.value = d.replace('_', ' '); + return o; }))); break; case 'combo': @@ -90,7 +94,7 @@ iD.ui.preset = function() { key: d.key }, function(err, data) { if (!err) combobox.data(data.map(function(d) { - d.title = d.value; + d.title = d.value = d.value.replace('_', ' '); return d; })); }); From 516193d8ea2dcfa42156b802e4dcc0bfc153e02d Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 13:51:54 -0800 Subject: [PATCH 04/64] Add a bit about iD.Tree to ARCHITECTURE.md --- ARCHITECTURE.md | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index c0ff6b217..01f8a9448 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -20,9 +20,9 @@ which implements map panning and zooming. ## Core The iD *core* implements the OSM data types, a graph of OSM object's -relationships to each other, and an undo/redo history for changes made during -editing. It aims to be generic enough to be used by other JavaScript-based -tools for OpenStreetMap. +relationships to each other, an undo/redo history for changes made during +editing, and a couple of important auxiliary classes. It aims to be generic +enough to be used by other JavaScript-based tools for OpenStreetMap. Briefly, the OSM data model includes three basic data types: nodes, ways, and relations. A _node_ is a point type, having a single geographic coordinate. A @@ -77,17 +77,23 @@ references to entities that have not changed, keeping memory use to a minimum. If you are familiar with how git works internally, this persistent data structure approach is very similar. -The final component of the core is comprised of `iD.History` and -`iD.Difference`, which track the changes made in an editing session and -provide undo/redo capabilities. Here, the immutable nature of the core types -really pays off: the history is a simple stack of graphs, each representing -the state of the data at a particular point in editing. The graph at the top -of the stack is the current state, off which all rendering is based. To undo -the last change, this graph is popped off the stack, and the map is -re-rendered based on the new top of the stack. Contrast this to a mutable -graph as used in JOSM and Potlatch: every command that changes the graph must -implement an equal and opposite undo command that restores the graph to the -previous state. +The last major component of the core is `iD.History`, which tracks the changes +made in an editing session and provide undo/redo capabilities. Here, the +immutable nature of the core types really pays off: the history is a simple +stack of graphs, each representing the state of the data at a particular point +in editing. The graph at the top of the stack is the current state, off which +all rendering is based. To undo the last change, this graph is popped off the +stack, and the map is re-rendered based on the new top of the stack. Contrast +this to a mutable graph as used in JOSM and Potlatch: every command that +changes the graph must implement an equal and opposite undo command that +restores the graph to the previous state. + +Finally, we have the auxiliary classes `iD.Difference` and `iD.Tree`. The first +encapsulates the difference between two graphs, and knows how to calculate the +set of entities that were created, modified, or deleted, and need to be redrawn. +The second provides a means of calculating which entities, out of all that have +been downloaded, are currently visible. In order to do this very quickly as you +pan or zoom the map, it uses an [R-tree](http://en.wikipedia.org/wiki/R-tree). ## Actions From 7579f5b47313170ddb32e15af084fc8e019e041a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 13:53:18 -0800 Subject: [PATCH 05/64] Fix bad wrapping --- ARCHITECTURE.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 01f8a9448..d46a23cc9 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -102,8 +102,10 @@ modified graph as output. Actions typically need other inputs as well; for example, `iD.actions.DeleteNode` also requires the ID of a node to delete. The additional input is passed to the action's constructor: -``` var action = iD.actions.DeleteNode('n123456'); // construct the action var -newGraph = action(oldGraph); // apply the action ``` +``` +var action = iD.actions.DeleteNode('n123456'); // construct the action var +newGraph = action(oldGraph); // apply the action +``` iD provides actions for all the typical things an editor needs to do: add a new entity, split a way in two, connect the vertices of two ways together, and From 12091c9ae79630ebfa655c839c14199a0a7b5cef Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 16:55:45 -0500 Subject: [PATCH 06/64] indicate number of additional tags --- js/id/ui/taglist.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/id/ui/taglist.js b/js/id/ui/taglist.js index 58370f3ca..3b6a9daa2 100644 --- a/js/id/ui/taglist.js +++ b/js/id/ui/taglist.js @@ -2,12 +2,13 @@ iD.ui.Taglist = function() { var event = d3.dispatch('change'), taginfo = iD.taginfo(), initial = false, + collapsebutton, list, context; function taglist(selection) { - var collapsebutton = selection.append('a') + collapsebutton = selection.append('a') .attr('href','#') .attr('class','hide-toggle') .text('Additional tags') @@ -42,6 +43,8 @@ iD.ui.Taglist = function() { function drawTags(tags) { var entity = list.datum(); + collapsebutton.text('Additional tags (' + Object.keys(tags).length + ')'); + tags = d3.entries(tags); if (!tags.length) { From 5cbeb8992bae08c00d57b44da4e35615793079b1 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 17:16:16 -0500 Subject: [PATCH 07/64] Defocus form elements when reselecting so that keybindings work --- js/id/ui/radial_menu.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/id/ui/radial_menu.js b/js/id/ui/radial_menu.js index b9757d6ac..eb2cf1974 100644 --- a/js/id/ui/radial_menu.js +++ b/js/id/ui/radial_menu.js @@ -6,6 +6,8 @@ iD.ui.RadialMenu = function(operations) { if (!operations.length) return; + selection.node().focus(); + function click(operation) { d3.event.stopPropagation(); operation(); From 70a13bf55b042ab6a1cfefd7acdf3ea0b99ce12b Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Mon, 25 Feb 2013 18:10:24 -0500 Subject: [PATCH 08/64] Localize preset work --- js/id/ui/presetgrid.js | 2 +- js/id/ui/tageditor.js | 8 ++++---- js/id/ui/taglist.js | 4 ++-- locale/en.js | 6 +++++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index 3c577df53..6087c5fb0 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -9,7 +9,7 @@ iD.ui.PresetGrid = function() { selection.html(''); var viable = presetData.match(entity); - event.message('What kind of ' + entity.geometry(context.graph()) + ' are you adding?'); + event.message(t('inspector.choose')); var searchwrap = selection.append('div') .attr('class', 'preset-grid-search-wrap inspector-inner'); diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 3b5dba71c..7bb7dee96 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -74,15 +74,15 @@ iD.ui.TagEditor = function() { typelabel.append('span') .attr('class','label') - .text(presetMatch ? presetMatch.name : 'Other'); + .text(presetMatch.name); - namewrap.append('h4').text('Name'); + namewrap.append('h4').text(t('inspector.name')); name = namewrap.append('input') .attr('placeholder', 'unknown') .attr('class', 'major') .attr('type', 'text') - .property('value', entity.tags.name || 'this') + .property('value', entity.tags.name) .on('blur', function() { event.change(); }); @@ -108,7 +108,7 @@ iD.ui.TagEditor = function() { .preset(presetMatch)); } - event.message('Edit ' + (presetMatch && presetMatch.name || '')); + event.message(t('inspector.editing', { type: presetMatch.name })); var taglistwrap = editorwrap.append('div') .attr('class','inspector-inner col12 fillL2').call(tagList); diff --git a/js/id/ui/taglist.js b/js/id/ui/taglist.js index 3b6a9daa2..946866254 100644 --- a/js/id/ui/taglist.js +++ b/js/id/ui/taglist.js @@ -11,7 +11,7 @@ iD.ui.Taglist = function() { collapsebutton = selection.append('a') .attr('href','#') .attr('class','hide-toggle') - .text('Additional tags') + .text(t('inspector.additional')) .on('click', function() { collapsebutton.classed('expanded', wrap.classed('hide')); wrap.call(iD.ui.Toggle(wrap.classed('hide'))); @@ -43,7 +43,7 @@ iD.ui.Taglist = function() { function drawTags(tags) { var entity = list.datum(); - collapsebutton.text('Additional tags (' + Object.keys(tags).length + ')'); + collapsebutton.text(t('inspector.additional') + ' (' + Object.keys(tags).length + ')'); tags = d3.entries(tags); diff --git a/locale/en.js b/locale/en.js index 17b58275e..672665743 100644 --- a/locale/en.js +++ b/locale/en.js @@ -172,7 +172,11 @@ locale.en = { new_tag: "New Tag", edit_tags: "Edit tags", okay: "Okay", - view_on_osm: "View on OSM" + view_on_osm: "View on OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { From 64ae756d0d89dad4f838d45d356d89f4205ba00b Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 15:22:54 -0800 Subject: [PATCH 09/64] Add map rendering and other UI sections --- ARCHITECTURE.md | 99 ++++++++++++++++++++++++++++++++++++++++++++++- img/geocoder.png | Bin 0 -> 98180 bytes 2 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 img/geocoder.png diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index d46a23cc9..b07566f1e 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -208,4 +208,101 @@ the history, and then enter the appropriate mode. For example, `iD.operations.Split` performs `iD.actions.Split`, then enters `iD.modes.Select` with the resulting ways selected. -## Rendering and other UI +## Map Rendering + +Finally, we get to the parts of iD that actually draw and manipulate the map +entities on screen. The rendering is coordinated by `iD.Map`, which takes care +of setting up a [Spherical Mercator](http://bl.ocks.org/mbostock/3757132) +projection and the [zoom +behavior](https://github.com/mbostock/d3/wiki/Zoom-Behavior), and provides +accessors for such things as the current zoom level and map center. + +For rendering entities on screen, we found it convenient to adopt a geometric +vocabulary that provides a slightly higher-level representation than the basic +entity types of the OSM data model: + +* A _point_ is a node that is not a member of any way. +* A _vertex_ is a node that is a member of one or more ways. +* A _line_ is a way that is not an area. +* An _area_ is a way that is circular and has certain tags, or a series of one + or more ways grouped in a multipolygon relation. + +For each of these geometric types, `iD.svg` has a corresponding module: +`iD.svg.Points`, `iD.svg.Vertices`, `iD.svg.Lines`, and `iD.svg.Areas`. To +render entities on screen, `iD.Map` delegates to these modules. Internally, +they make heavy use of [d3 joins](http://bost.ocks.org/mike/join/) to +manipulate the SVG elements that visually represent the map entities. When an +entity is rendered for the first time, it is part of the _enter_ selection, +and the SVG elements needed to represent it are created. When an entity is +modified, it is part of the _update_ selection, and the appropriate attributes +of the SVG element (for example, those that specify the location on screen) +are updated. And when an entity is deleted (or simply moves offscreen), the +corresponding SVG element is in the _exit_ selection, and will be removed. + +The `iD.svg` modules apply classes to the SVG elements based on the entity +tags, via `iD.svg.TagClasses`. For example, an entity tagged with +`highway=residential` gets two classes: `tag-highway` and +`tag-highway-residential`. This allows distinct visual styles to be applied +via CSS at either the key or key-value levels. SVG elements also receive a +class corresponding to their entity type (`node`, `way`, or `relation`) and +one corresponding to their geometry type (`point`, `line`, or `area`). + +The `iD.svg` namespace has a few other modules that don't have a one-to-one +correspondence with entities: + +* `iD.svg.Midpoints` renders the small "virtual node" at the midpoint between + two vertices. +* `iD.svg.Labels` renders the textual + [labels](http://mapbox.com/osmdev/2013/02/12/labeling-id/). +* `iD.svg.Surface` sets up a number of layers that ensure that map elements + appear in an appropriate z-order. + +## Other UI + +iD provides a lot of user interface elements other than the core map component: +the page footer, the interface for saving changes, the splash screen you see +the first time you use iD, the geocoding and background layer controls, and the +tag/preset editor, for example. + +![Geocoder UI](img/geocoder.png) + +The implementations for all non-map UI components live in the `iD.ui` namespace. +Many of the modules in this namespace follow a pattern for reusable d3 +components [originally suggested](http://bost.ocks.org/mike/chart/) by Mike +Bostock in the context of charts. The entry point to a UI element is a +constructor function, e.g. `iD.ui.Geocoder()`. The constructor function may +require a set of mandatory arguments; for most UI components exactly one +argument is required, a `context` object produced by the top-level `iD()` +function. + +A component needs some way to be rendered on screen by creating new DOM +elements or manipulating existing elements. This is done by calling the +component as a function, and passing a d3 selection where the component should +render itself: + +``` +var container = d3.select('body').append('div') + .attr('class', 'map-control geocode-control'); + +var geocoder = iD.ui.Geocoder(context)(container); +``` + +Alternatively, and more commonly, the same result is accomplished with +[d3.selection#call](https://github.com/mbostock/d3/wiki/Selections#wiki-call): + +``` +d3.select('body').append('div') + .attr('class', 'map-control geocode-control') + .call(iD.ui.Geocoder(context)); +``` + +Some components are reconfigurable, and some provide functionality beyond +basic rendering. Both reconfiguration and extended functionality are exposed +via module functions: + +``` +var inspector = iD.ui.Inspector(); +inspector(container); // render the inspector +inspector.tags(); // retrieve the current tags +inspector.on('change', callback); // get notified when a tag change is made +``` diff --git a/img/geocoder.png b/img/geocoder.png new file mode 100644 index 0000000000000000000000000000000000000000..9284ee67faa3e818f2ab681deb3f2eeaa3d57216 GIT binary patch literal 98180 zcmZU)1CS;`vo1WgZQHiz9ox2T+ctJ=+qP%Nw!O1s`|fw{{m(fOe@9ewRc1b^>gcYh z?21y9mw<=CfdK*nf|rs6C<6fj!~JV|P$2&(UVJ0zKtNbHR-&ScQlg?nip~z^R<>q9 zK$_6CT3&o=dM|rt@f~#+S!Z6dr`!*GrUWDhU1c`zGcK9G6G?~x#7TfkIO0O+NhBOI zNn~`n$X9&+C%&5xuf3Q4y*Jeeai4~2ofwHD46(yb)3sP zLPz(5@jeiweQ>VV5c1?9QMcM!`hlOGK7|3>SDcjHl_x=~pWdK_Dc&3~AX9iwAMdb~ zU_)PgAX8fER1{z!Z;gCMSHL-g0JMoYj4e@YwMXNPL5CZr&vzJPfYV>QC!<+5Ak`KC z$tWh!Ckx$K0?FHu_qiqT028=RQpkb*C(|m)8*(qu{$n7wPjIk^yAwj}DF2UG!cD&+ z$-;v}E}-aU@3p>jfd3!}e&V1oXk^_$@LSM9I4G&1-(RoiHkX5MU>5J&JnRcYlmusU zFav+A(|@-NqyL1x5ZSw}{{;USO2r3@bvTF8KZydN|4zg-FoYqt)96iIDDsVg@EJ9j ze|>2YW=xg|gCgv5xNi?1wh-^k;^r~i%RTE(=)-iEsRIm`S0Yth$0j5{Kvxt+yhFCBWA)?R1 z+oc~X;eN4%0*i&CbF0T@L6(j)2Ld8cMy#LGOM~}eXI>;ofdTDa;n(~H#T+X7REXao zeU}4-Ua2(FR|;G6&Qte2P zkiI`mrk7@zX6@gPKNe$HqOrhZU?!nSLIk25q&K8DM1&-~iS&VlUbq|4cmVh7!#(#e z>@X-9_ui(<14lyyp9NgN_dEKhMNhzk^6_5m9?m)0MQR}ZHZ2y|fZcJwgyW|f`|FAC~7t2AMO`xEan7al}hs0NiUTH50qT{olS{|q@$PuLkU+5tW)a6NeeAqtKR@yEN^?d8zMq7P!f6_eEsfxnj)H+Vy~j|Vr9 zZ{t^*3i0ar&qOc|up;^JT=|wDivkyAo6InG%{O7DC2`KpComQgg_v^D_hQ86mk211 z5TYPDo})e{$YF!TaS+Qq5YGTo1~9E5VonflPxzM*lC2Y)B#?vLfBFJv|nm=Q4_AdrhlKoTrD_?TEt5|$;Dj!0($ z`##XO(2xp6I#9XLmWq%jXjas1UabPY3zR=pyue}}t_8|3+@B~BN*jzd7?LYhbHYsg_cEa70KAyNdX=(x<4MI%luDIktGOGYjkxUhf20AT-MtG&jzUW=i zqyl>x#u_(H!lk%${*R@~BXA2N4^D0n17NMdq2Oj{?t$-}7b3)HG}1_Qf8{#%ZhXYV znaP4VF2jBr${gVVK4#R}u(Tmdla>w{H)v)cZ%}`1cP!rctnpHni$;LPi-wd2v&ygv ztxBXyMpaL>SoNlYqY}G9tYW3IwxYMfq*6gqL#16suq>~9x5TIfxp<+ZvHY%_TSP_H zCG3=8Mkb4q3r`-YJiK`@$tl8Vw1Z+BbQ{h-Bt1$!Sv`L>jU$=k*E5M7=N0QFqbHv} zT78Jepv1n*o!hJaCz^k5yiohE+0@w>hRnLuYl{lZtiG(3teR}EtP2>K zaAbi35wbG$N@#bempNQBRx@?8pbLi!=mXLN3@mC4NernBoD8)LU!t8+j{Rt^E&Rv_(p)^tqYbjnB%cii(}6rz)9M9 z(^1?d-DUSg_tf}wai7G=%t`Oadp2%A{kZKU{;ckh;P`uNc*6lh3G~C2VXOeh zNuHFIww2xm)rI#(W^auT{d3u0yNwSeam_I?3Wd|Y>9(3=+XCCxzp&gC+^n5wo$j4; z_sREUZ_00!FrMI~VWwf~VQOO3Vh*Fuqvg_IrC-t#Y2K;+G}Tlpsr6KhRZ!KQ6{(f7 zRV>xo)u$B#ilWsQmE_fK6?PT0)e;p3DnBK}wa5idQYJ?E>jF1^D<7w9;OtRZXYA#z zudRG7vsQ98u$HK;w5=9yp{_ly)~>r3(&z7&`m0|Rl+_Xo-G%LC^>z6bdv<|rOdJy| zSS+S2u1s{yIV>n__v}@i+RW-K@toHj!r2+w$Ca!e!&wcoV zvpd(xJ03p#AE?iacq8~E_}+LI_Af0-d2fe;f`C4*D?+(H)r$ zDd(vhm?LQ>NGs?wsJVzb7(+S9C``#zY1l|zd1U$jx~{{F<|v~ggb~6x#2JPgI75<- zk}i>26txsd7q1rM7iXJbnFO0an2?*Wn(U2YkLpEAjHVp=pn##olTDNTp~zDRPUcJT zP7X_6NTKnd^>qAX zE_XBFk2!FFu=?QI(sel@1`UQf+5(ywh8(62T6-R{fXn@~dX&MWXQjTC3ATrp`NpPJ zeRJ^%&xr<&CruNre-3HBkN58D=Zy5i?;#plHPw|Z>+wGyn5vA+D~_wCYo9$>zD`}M zZEf}PrFGXRFQuqYk?#}lqf>RiB5>hwwCg1exc4SDGj_nTNV0bgo;rA(W2fK%EV~xF-0jDA zzE|-#dws`WW_1&M=3;h1dllYo-@~u7_WT^@&h>Bnc0Sq(Ed|a!E4~|Q4O;unguM1o z3l{g|B%~AU;iwUJd~5DI+%)Yv{7m;G*D9XRbD2XLeH3K#;bL{-6J)t$`Ep%zbNv52 zxgKckH?N#2&2bvw`A7L@K1Cm>9iY9ap4ddK#V!3_%4LOM4QY07W;~U2k#QK>vz;mL z9qp(8=UJV-uz#V+f~C{z*Wk;8OrcEn6gDB2V5%S5kLOp)Z24dsDD6Xa>Pqe$w*gn5 z?q}6&>sj_wd*zMr9_L!qD)*`lrz+?5kK_BDJ*zitx7w%5p~Xkr+w)XzL2j-hN!aV9 z9uV{%vVZ`PZy!`YB^Rg=7DQn9b$#;!BgAJH>>wT%uZT|}`G{5tt~A&a!A>0YSh(_r zGVUVPk*Vd&Vd=T*#SAtd7HOtD>Sl(8rqzb)1~ndhj?6X+-*=Ck? zx;I%dnUA`a&aR_f+FWN=txqpWg<9N8S525+!_OscS+BK|BV3vt{1+U-JM{dCi_Vyt%ht3(2Zd3q_%^q};R z{ygMG>mm2+A|FrjVb}PfS%hz^NT}~tL&~!8JDMO z_*jic+>|Wsy1u?Pe|(=1$CP@pCbder?w!YUy$A~nS&h3Z-W^!}3Vjj6Gre!0N$WXt0P%Qww+)M2Oiy9CtU6fuRbJZix$uiY<_ z>(ZgA6AgHkgZdXalQId5-{yX&$EO^7+u4ksmtXRJK~@J}#%murfOf@6M* zI)k;b^&GwoKh9s5n;!YCXSh6qFdXFpG`5(3|9(dIBQ1wIin92pVqr|v+On!4 zxDmyH&IYOjGYV6RFwPPUSB#hf98D3-rA%s#FHH;%O^+83DIQX95$>;`DqzH+^pO1- zX~<70^=TW)$a^D5{7i1bYudJv-#((b$YD=((~#MNyIRGs`~2x++uGz)?Q3^oL30Yb zlFFURqsa~t?`zc?e#;&t>2eA`R0=X_8DC|w zXohHZIL+bpr~Bo6I4>2$cja5E;sZOP0E^*_*@(`XS4b_KW}D_uufxNuC!odbZ2$V{ zd2(4*`sWGfSgcDsp65WO>FI+3mt9lO$^Owkx+}}2wypE#eK~Fgqav+Pu0Zb~U1@x9 zcD^olt8~ZB1IN3{N8wp)yS1M(Aph?BPY9)>eHE4@A)KcvYstH&Ar@zk01M~4<=@Se zqPr33#gaFbQ47Agg}Gk_d|qCcYAefkYtT!Dtia8}F31ijXRN!Yy|j8A4eO76ew7|? z3lW%vYZ}Yy)&1vw!+t+qeYYmA)y`XQ9-p0sM^H{9KrB$BVK_qNhAm8&>+)5_%d>1S zTs+$#SE9bGdfZ=5;i_X?WmF<`E_5;^HV|9T&&_yoIexkdor3p=Z=r8bV0>UIVO60w z(R9%ZQBzV}l4CMze=kz>Q;ky9l3bD!G^jLsYS~JAYJZoOmDyJd@BS*uELSV_Q!5vJ zsnhTOE*K0v@GIULo1sW6(=s1CJ;nIMFnHN(rfVY6sopTOqp)RM58Jxrn&*+_QRfXK zn0FlGLhMe(dvxEqeE(AXr4!y=3OQ(!tO;@kEwI?K#_fPeD3HI_clOCQ;d@N|(+oTt z6gp5?Fl{)DM0Kog3CPe~SNYxOn0D)d9F_!;lwUk6rX%h!wmix+Mtq2Kgh)|NWiU}ahO|`CH{*ee>YRfk!?T2odLcT3gdpJL4T)e-~Q8u%(+ z$H@l$qbBo^H*{kY5tX}@%QXV_IfK2P$#s&=uKJm>ofmcG@rzj*J^c0?kC#2Kb(i)R zd4sc^RiBv`TmoHR&4mDSq5!5dr7^`nM~??RNt+81Ce=rLsAVZi3bgs~{Cl3%pTF(@ zj9gw|-{XB`JKW62NKN%tm#>C-9Q|m-*?K4pP=P9ft~ui&f*OLhFK+@7DFgk|*#v4B z12wFNKmxu18tecoV7cpmL4+y*V%POK2%O7i5keKPAPk*5l_DZs4%9IOqZ>LClb1wp z3I-`Co(HeM%n~C)5`hwZE%_B^3E&g{44iYJm|!x6ZbE#6)(;u0kW@vthKmEx4pBCt zJR(6vDGi4jTQfIn+W!T%1$Ix3PWm1G2W^Fm9kP|z4gN_2M=eV=%LtE=0c%ZeO7>F0 z2XZbfVJu;ZdMUSXtMH|i&}`n!(md6)#t6m4n#>XjB6BCRzX{JG%@p4d*381><^<{p z?Ko$jXVz{gihZste0K%qgJN{36HOmbOfT5nr!NOVz$#!{ii^>o)c(|tp# z^W~lpeV0l=>5p1prL)*mvUct}d0d%aZI++5$>swOuJ_|R3WRugpZLa@hMaze(aZ^b z&a(=gO0B%+udSB#zJ_x5dFR;hm+m=+Xh;*?n~sAWJ^nwDQ)C2;b`F&JM0+OwYZHVZ zsvxW(`VmwSd2k<4Hx6q>nnk3>??>y0J1Ewu9?4$_b0tVB2IagKv4k$O+rRZEW@dPG z2DB{I@wAn7SG5IP?aS^zz`J5l+)kgE;jiR+)@U3gTT|PwTsz!%x`y|%-8_zh41U&0 zN5?lvT@;=b;P@Xr8=2MEig{k%?KX!_llSkR$N!)otVA>78PN9I)b?&s?JjR+ZI*rh zCPdP882|>^2SyPBuVdmKY)uDCgk%V2U;-8pW^;@aLUfKuE^w}Z%?dYRjAjxIC4oWK zi)@#KDB)Se&4kp56Da6V`Zz#+S6jwqgWN>PjlT|6*lWrV;<|QdB+(?arFV~#4yQ@3 zO2HAelk-b|=a1u&|OZuXhpf2af1YM)@U{0W{ha=p_J##>sKzl@IK}|6ehywyBShEwjzu_5rsSvnjPb5mpmtr+i|?G093yuV_n(Pq=38h4^w3 z4NdB4OqkSKl5$ap9sdeTH(7P%7;Bq!zk0Tb|1Hl9$)h(9S*u5j;OEZyP(krcwlU!K zr?)=XfW(U^kdle+TpvooQgvOk!x*4+tlr`ytAXd^>p0X)R(M=9d`bOXS-)7z>YY$& z%3%t7ntI%nTQQ+B_oFzkt*M%$jG}(3Z|^SOm|UNAJv2Ky=jL#k&%tN;w_|hF_iXGa zUBgbMo#WpU_|0ee17SPHPjPckfQ#?Z`1Rs^KP5hDN?}f5&d1A@#*4?D<6Ulg>oqLn zB_dr*aM{;bhqzwdkKm{2Iqs@^DC^1lbu5!Gp{+sCuB|#?oDlRj5Z?d&B#=PY;2t!p z0H}_52eR1^@-XOGIAVW2KjM1OAyXF04Gh`|Zy`EE0wuA_@uUofJE$o9(jlp0s=|wn z@SUg&iyv4+H;0KlgSrN3m2fL|r;MeTrc67KmSVi}Y(E2YzGlD1QLY7SQ*%?RhrBOE zKK&YmpU@8*lu?vjxBcA2nUZMVlef`O%f3;(VX~>V!Qf2tnC-;)O#Afuh%B zNf9*_4F%~G6&WcFNd<#5&GA=k8qMYs13&FBnGMA+;=Srf^(G~IMe+*r>iTO^8wN|r zKfY^IO#2+RobH^XnQoei^b6`690MF9*J&Z8CWt+htputrSMJTO`NU(1=e>=&n>^Geekp#W!wNEzS7pM?Lz;dP}o4;%H%p`1bXV_JH)cGjau#(>SU zzsvXU@R>pxEq672zJZ_Cch{ZW^~Z4Q=ab*11Lq~t9IStJ zgj_3CO;=4hSsoJyI|d_D2V*k^Pdmqd(m+6bo;?4$c4n?dM4ooG_AWf0{3QP+!Sk>G zA2K5e(SM1!+VGQT$|(|wIyjpVu`@6;u#gDA5D^jaIh&gECeFzm^fQGx>`Bd z6a7c8k+FlDD?bUze+>Qi^?&^|^R)UOOZG1RFRXt7GX96d$jrdR_}{w!LHYhe5{0{CA6{oic; z7xiDd1Yr0W|2y>pFi8#{MnFJ9KvDoPU);u{K4)T5POJtX?K;56eAX#hE=(ld?spq%xp8@Q=HX zeLFrMeK$YV^0_Y8y}gE#6pZdqS1wiG?=MyTRkNLE%dImLlQ7nj!gv>i5;>x*u>(R; zG)NbcQY(&=Wmd22b_m@&r!8Aodb$qn#8%oG8U?gSBa~2%iHdga`^xl5Nsf4muH5)u zq7h@1W4w6sgTPSJT23>=VFhlnT{C5BU| zBkiI8%|fvRUu>38P)pT#|LilwybB%l?@A}*j@qGNUYvatiXl?1M%;lJ8>NZE-2_*LJtih5{3-c<8pU* zU0zltpGrf?N4g5)48F~s3d^%{;lWS5e0d{^#2F|P zCddE{dTcCY_q%OMi8H^M%CUv!Y5exya+KnlJfsO4TQ{wf7RGH9dTA5(a)+rDriUaf zzz-JYg;}26rn5AD&V~mZmlo7cA^dtZ;=~ill4NwDmmh!p}4 znt}p?0b7vDa{ zZSCDTdeZN5je2i1cPX$7<{*UXd1qY{>It`S!P_{H8^TD(eRgwzEBa#JNc>^yx*oHHxJ=}OxQ1bd@z z7m7e)k}|-JR2)dSc%dzx+23&4gBe+lS(pj{Mg?m~=nKl1q?QMLK#HY^gIM_eG4J%# zhf1Q4_m0)1`}ZS=ZlDcS}9Al1@%Y_N#bpbEUON!7r)J0m$2B#cqe8#IPo9zi!c*Y*L6LyLLj!fihPV{S>x!GD;nK*9Fk(9!CnO)8unU$wN3tV?`~rcI z$`mh=z!SjR5DYBP@WLA-bO?`=881Zb!^jhh*@VQwLa>czVR=KjW2teJ@Sv3vS#d6? zoaP&uB1O!&t(P*^u;G9N3pRYQK!VR387kz6?S>s0=q~>}dZ?+djR7P&`Se32d?X}f zWMpJ*>Ab7(m5|{`D7tKc1rJbP-rvK^#>691!kGig>w9~5234e8W#P;bBB5UW{*uj{ zI7^I+lOi%OV8XY!-xU^yzhi_;;TV6OOUWyv)?JDqKALEf+eF3J5HTjR*|>m+a-|K0 zRt3R24~0o|q@NoB#bdR2ZJV)Ks}D>#gi;L25`&=nB}+bq;*sFHgq~7XR1gu7ItngW z0tJ%;tVxTze4)s)^o=N?%}AUnNXlr>?>$RCq|lXv9HC&hkti|<=JUCTzLsTek&G5~ z<4`FV17nL9V4}=Xi~~VQ71=JusumB5vXsamBE^z6qEUc`_!v+mj0g0>i&R-G$|}$* z(2k}fyL%MlyRgfYHG#|L9f2r>U4{E?Nyj2OUCRdl700J5>|~{~OqHb~&U*o9%`dsve1z?d=ZgU%e?@#xt9{2T1RYDge^{*K|o7bI&rnx zt*D@KwFHYQdm{oVwh0`M9vd55U0r>De;*t3j?JqGX3DsF^4?*Fpxu?x-;J@)3=fzMDg4+pA6;+Z(|$-h07qJ5k)P3MaE_*Q#P0+5=*Ni zD=r{rB&+^~88QKSc!vR!rANaZ5YY`J5W}kUOm^rL6k@q!B4;WVhBH1Oa}Ch0EkK^c zVPlJ9VS_5z1NYWUg~BnZS_YHHiU?kxpAR7C38Odz ze7p1_k+m&}CFehj0wUula){vR7LFt3FyjXRAdpmYvFmYckrNY0_`y67-6^f7pcSzo zE7X)Ac*;_d>R_yuNtAMr$%hD$zc16&-CV7tCGdsL)jO9*cYgH!W*!PFVJ2R;XG-& z5^1XQ9CnwxL~!K zl0T}ou!D6v2USbKSh`$X^+(2Kk%cK4T**gRi#hTfXEfVeF)o@tuz(NQO4f_@BI|+MQBB3c)8#d1m+1W203%+ zV@MDf5YQyrQDIeL#Fy*=o;b1<1(@jyJQ6zKOI?i7-4ZJ#Q9i}_B;g>812v?b=|J(J zy=B?IxcrMmLyGuZ8KjY*RJU_6$OuveDqF}3j-_~r z!X6NwLh;~Yn8ZP*$>_ppVO&9`M2RdsoXEsLinyQ^G+4qS8FCp=LBejya4nAP@eozB z@rOcWbr2BA#|-#kBtWqddTfO+Xl`RQPgY5aqjHNO;@K^*i1 zz06IKdus3(oMasNolI;7CWe%rnS^J?E-e>*os!{EgyF%JUB%1Q+zPQ5K8rdRele4~ zy1RPw*}Iw*6d{s=UNvfp5MW<#&BvQE(WhH3-$-#IfJalR1A$^duo@2y2Cd)>xEjR# z1crk1qIi-xTum%O4xHhEGo88ZQEg1PrU(t-W3Ch!hq=lU$7GQyD`zDF%2-ihmof@F z(YfVIutX@wQTdxxmn$U+UQ;YTlfnlE@LhN@nmR^HQ=mme)S-2SB1e$)T#C$zCmQgS zwl)`x5)wRoikKG{Xs{IvkXdk)``tlqvnrP|3V!BOAd|hT{?>o|OoQfMzlDP4+p~KW z@j>5#GQBJ2D9SGMb7|IWcDYrTZX2Ax4D8iGn$Kj7F0ssLXG}Zov2e4eU3;#dV=x6r zoHE9z_UjQo>a5-b?eYccbQw1daQ4OJ=0ac1Xigp0kzU&esnWHNIM;H@e?5H>yy89u zb_~Y{4x}pSsf5%sT~wz960$-w&>{<+E)&w5J3OBCvk~maCxBAK{i{JmMC4Y_Tf076Diejrb7PkY#g>DL?y^IhH~@@MYRXMgGx*cVndX+StJ zH76F5$f+4$4*Hz<|AU@8A*nj3p;S) zFi1Iq{Je|+2Z8v{jA*TOqfs%fE`HA`Y@ywC$>D_7J`b7}JwdMMG zK{vpt`>Hblu^rU-w)1s-Tg%Dx`^=Os<>S81>920WgAZk3seN_&BYtY}1-{OUh7v}U zJfUM~dUA!SYZd)z0?Xg>LwH^L%HJ=&KgwRK^*nrd!v+=iy#cM=kD3we_sMyFOV?1Z ztG`9if4`jjemhC?NRSb1H#?aN=q(eG$?-7R4SMRnWUu|&4tla_cTjqx*GUCAkbPe> z{LTH9DOe1-%nr%lE9cO%U}JaRc6%~DIcPB5PXCsmH$KI0_10|Pb2(n!tvzR}U1GJT z$3lxm_p^d3sNZ`i=-+ebIj_RB@w`zt!)U<%k@ri(K_CX3oVdgI`)BCw?mi;4vEh>#qa9?3uSZP5m@Wtv8}c}TYSzbjg8526 zi{0@L(CoHYg5cc|WnH)TYQm4r!ZlI4_CFVTue)X81Ujjo-#@!Sg2++kF>2O&0)6-| z;FwQ<&BPiMVU3g>*S z>&M9zKKCIR`}uy|3HY8-t|h#4))e$;7hy)c@5JE8zdej6 z0-4tt5L!y~<_Q%hb0elIQcV4Nk%+uk3pky-0FDOkNszp8Ul4))@O07*?H5|@M(Os* zg@=IM<+)#YxzTB{Tp+z6@ZtkL3h?==+8GalUi<#&7F?oP%zs@QcgS=*0)n#YcHI{m zCGG#TlnR1Gap5LIb-w9xxYm>e0i0SX7gE7nBpWPrOMhW~5p<9c6gU8G<%*U<;_UI< zf4R$vkG;k|20ykmT2-#6iu;+*=4@2=?AbF8GZ4_=f1is{V1I1xT7$lxHp3cxN}^X! zWhDweZKm8fk9oYZ%i&hv!v^@QpYir2c7(EAsAc+x{(Cs734|gP6l97Oc<^s}j-Kmx z{a*YGJ~kIWZd!>YnNnkNA!e6XsF~MfbGz)eIMn_Mu$mtX1&4-)ht${d+lu3`S{xWU zd~CMjk|9}!h&jy;g`wNjPMC|h2&6`J)(P(21kqjqgH2ARP@;`%v04}-3^waL-mZqm z!gWQT$yv=V>lu@E!E^ZkZry5k&|v$@{O6OMkKtJCze!1;!tM9D;zH#3Zrhgby#CMwwTE+`rD-+vJZ^FvM3Ihd!q$Z z>27^I$z5yAo*D)R1^bX8rRGZT$!FhT2lT$Ls;>Y=fot)B>M@Ws*Rph_fBjwO2IA}a zX%MtS=u8YVT>}m0Qw@5C3<^=zu>?!^-2!D8^Q)6F2(n^0h86(^0s!jg6{!{4r+G|& zPVIX>m--$uavb~pcdrkU4nGeh+yVswb`v(k9AiM1Ik+b5)L~ET3&VedKM;YjtGDBN zz=MP>W!?d90Wd@?!ce3=Wa9Az3Ef@zb8B`7H}sJIX_C!U;+Jdn!%Ck)LEPC~^QJTBFqsUYVNFSw?`TO6uB zj!3K_UU5(a4VL_VF6Tl%iIGD6Ca{3REDBSvR1|}sG=T}aD_6cpA$T9DmadQTV71wb znZd$DqFf93K66)T`nK?#JKsD z;4d$E(uh_(POJ}2PltX~l|KK*OjVmmv~>^52=b~4f`0_=;KfZHGd}_2bOWSe$AxAj zSN$QyD~SesbEE-Q;(`H2N~3(MDqsOigJv2Pj__M>A^Se)5m|v9hdL;ZrXiIq*|ikf zutX_9+~kW(WV6QFL+C)L;vRVL?s^l}qxfFgZY6o3;?Sq^U8tsu^`}?IVBhf)1OU%7o zkMMwaXt+{@sH%d++>Fkv0fP`2KFL)0s~OFEtpT&KrqPMXMCC;Uh0-*H<8#$Rd~sls z^ueU4$a1q_uXZe<_1=V9wTL=`&3V&~y0Nh%9Mj0e5(zDK35fqBct3ot+ksNvddB(42yhR7U<+_KGp?ACXaPT=TVqWc15 zirTshkSO9wS3nm`H4<7S@rB8CP6^Hfx=kf1-}SFd^aUlLZy}JVC?G5(YArd)k|H4l zrGHp_#JfJVR~0X0u?yi^ME8P*s-WQK4?jQ7L(REI`k~@?qK(0UMnJzGT^yHl1AiahHIuj6+12I>eA{`Q8VfXNOb6OO zkY%fp!RaA8L7?7i*GIvbz|eZtyTTND5ciruna>CENfsJ;uyJ%-UshDq5P`dqr#<%H z$DZ?uNZBK@B*dg5mtD{oc=Od@sELa^kWqkx?jS}BGLyTj5}Q`|53(8D8lsTniZrZz zq%Y@|rWmfuXdnPpB1o-0bl^zgav2^c4m!QUYvfrgMkN+!0!AYR=iT}mrMAH_PLW_; zlAET9$}9qfQIO@Ucs%(&nW*-lQ7WKogbkjuHU-^b!ifCVwuVud3{i@^Fq6s&UV2Ez0ySA-KhQf?)zW&Otbr$oIUF5nQdI zlai?vF<_PO%V6jlCO0#(P?AuJUINWOb`+sd-fhx%XzXLm%3)HWL6Y1%7?p`M%DF_z zdbxUJ^ICi>D!z&SA`*sFqhN%qBQ^11{82(IYaWouw^O`0zHWX}Sn!gj$Sa5W(T@^Q z!rL+v2$}QHPLqXi1vIT(BoUW|i5PK~-xE^mzARO4FGw`chFs34)5l7r6Lg-GVc{Y=Wtb7yXd33!?ah2*l}i^Ey+hHZ zqD~w>17N4NP^e*5sYs8>vPLo1z~J+`sTBv5VzRTS;Ez~I=w_Y!AeGQ-$u}tljtd%S zMSs)ohVV1HfKjMpnkJf6VNj6asFaTzX1bIBBq-d$C`MAU7wUgT03%EBBk63RmRxZ` z!C^t>&n3XErzONFSmK4La3?chw#-|kxa@3u7vr{r-FA&%u5utjzWEwh3a)tNOv;-z z`8D2I($Z3C$i{M1a0Q@JMr@#Ku@v`Bv)+rB1O&5a>EkwuMolF-1j8 z4cMV1oUrgDkHE0^@#n^&z(jwrB<_%~mp|FbN+GD@)IWLM(}3R1QF#i)SFCi8e!s&=(d5 zE-jRhVM2!nU`;R-U?B;M{9a5M^j40eA0kV};jw;|rw^HsHJvdOLtia~HarK%8Md4RoQ2g9ZzPK0>FSn>iUM$aQyp!_ZWGbJ zEog-0y7mhY!GSL3XcmQQ$P6)1+@r?|Wnkx9f^9UV!8ohM9!a!2W_3q1Fidw!D-OCR zLT5C}A?A>LM-iO?=+suyve@#bEu;r9x#+OL4K&g6X0ka+W^+ii+dIkvO--xNkscX|XFNGm`9nJ;+=jNOr&U*{rJIR{W?|2}q4_KE5mV80NDO@WC=J~h3^;`4IjKy?pb7RO15Gq}yCg}f z?%!b}_~a63bhQ&RbIZYjD72-{b7B#@5%|&!X|%#};?)sAp>jC(kbEDrFpBrJB1&!& zi@o=4Vd=}Xm*eSOoM63crQPkAS8# zo1e$*dV#NJjeP3KDS8swAex-ovrGb_C+uAH4hniFHc?f5m$*%@k0st6Suv1Ey%)k8 znV7t~+4vP?i2BaAi$7b0T9{(8&psrmH2;1XYI3Cxdpwbzd0RieS!Mj%bJ%_g+4H?J zc;0?_jB<@MBz{loLT$#R8xV&gE#Ou{c4LW?XVgu}F+G*C(lv5f`6ff!sJeUQ)ne|2l6f+7VY+99TnslZ594k!*7QSV_9H-PPNLK;fL!3O%hl z^w$<>m^GINo^=_PLIju-*mTwDDKFdnSpCM^@1&nj_vx^jTrO&j&MSxjmb^AHfe&C9 zRkb`Q7B=kc0yQ;pq{IY~=r+`WR4Ni3JN*`M#Q6|vu} z92^;6Bv~YBLA>aGvs|8spSjU@hA8+o{L|&~bnj7hVfz)g(lx-E!7n$Mr^M z5SGmW#T*6X@?BQn6SA(70d9A@aypmhepeLlaw*&|j9g9rep1heQr9MGPAL+UwtC-? zS6SI*36nyh5JcBsUmElo3K=fHwp~5H-dTeW-k{re*c)uWAbqM8QCVv&7eeDXHLe}c zbX?|lyPVFVW6!socl2jg z3&r9#_%73#nX^_mbi2+@qSD}tn=tFLG!vz*UvUxoIxXg}Tr6d^T6~|?%Dctk(%!by zc%y;AU988?8?((BaO{jl)D9}E^<3cgT3%-ta?d<^9)26^qH-B4t2pyRwGZ6NJz$O) z)W~5aX9Eqf-UvQzlrs{iFnKLKb`}@Zq_ndF(cL(w(LS)_*sz{alQk(f-wN&})&@`Dxz3?|{Po z{{3-WRAnw~p^}W}O|t zQwt0(y-Zk{f2T2(`a=?h(OcC1@DTP_#WQU^`a53QFLMNGp|w%~kVAJV>5Ku4l9y3J z>gUKrIZ&(HfyT=ssLk8+^BM$-i7!f-$T+WBxyF!{RG&tu*?$_+H6m=q zxni&V;uMz7^VU^)?LrvPa8ZE4>A9L}E1`Niz=jipkD#Est@c(qqq7(Avo0p_T{B5^ zrk(ZLY`(+CvefJGwUzCWR&p$to44g}dn5e!V#ob@;^2@cGExp-!0T}Ub{uiFd?t^b z;%KN&?xwdL{jf}4hM8$@nWu;qqAbYBLaaAk04Fy*b}B#dtfKaoJhsp88mrcHEgVs> zE(VA1tW5;-n3vy}nVN6jtFc6Msm`y%ZovZ~KBJYd@B7)VKTCbhXsKzHuEQ+W-Ftle z#@04+CiA;iE>DS3PbX2k)8grrb5+d-dTpEOb-B&&aoB@gLLP6!?l|F^Xgn&l)%&|> zLHjN~Va*;zRu{znNx)Ewm6N{9rDfIMlwJagD1KcyYI2zuUp|48!$MMfn9`w^PpuGM zt08pNu=8e*$)iQR$>b9EQoA{#blkhxL?tLzKM-h!^YCgtz`EN0zVVlhb?bCyj2@B|F2Cg|lZT&Hv*y7qa!q0f=Y!Jmhj%D-s!$~h zfChFVxRL5&S`59Isc3|pLbWUe8sHQv2`uTmBMOXi&?Lj6MyazJ>Xh~KxWVDNbd;-o zpTS4>W_LjxJQFytALz?7hGHRscmSOw6yf{yxWZfS9WN_wk#@_M_)l z&&O&3ZMhuna?5XioBVoOf2%#-a<-fE)Ob?L=bG)-gDp35UL0#SdadfMClxTMr}DY< z{I~IYy*VZSAJ!8Kb*b58DRfq?HV1m*IPTOF#0uJttD^#<5)MvwDgg!RPZrJ2Fmg z?~~Eo@J#aTXRFzT4J*svxLXgG)cKIzJN1E!>bHklOv z7RM-kA|<7b8F5_lV7h`ZY$@MTCQJ#IqBq`-6+)BLSVvU5A$fRI0viZQBOO&k^^-Q< z0j00xkdOvtT(&qQp#ASQeU?EFYyn!}2Du#-u#Q_7FuL1q->%y|Nn-7>bc-NzXKlS2 z!L;y(MhJ~owG*UV2^!5=@K2kmUNU9(X&@6iQn3RgBcyMG$z7zS+QQ%auS-uF5>{s8 z)u7O%L_YI!GJSPZ%g!uCGSXYF3CJ!Ir>xL+_18Z;FM?wA(E+x{8U)?ufP>e@2bqiU z;3e~bx%0bBr})(xo&Njdon#%}bx%on3!3f)87~bSHxz~kY*}TCpO7f2-5pE>rG<;< z4nBfkTSu``BC`JqApujH3gi6ms^9#KIX??nblQL=M<(DeRXf;5x4RVt`mr3#UtdfK zNY+zC5L&-cGZSy_3^hQ5UGDiX|T5HMHsE?DShNe}6)4%#;v$;(Fl9pnYd9_w8mA5JK3!;hjbec$iNs+D` zB_fMGED#w2ge^!4Yk=aB;_y9x?NY=1$%p8}PluYfCIs{iHuGrZ4BwYJZ@|AwB zQgRAU_v6u^c#AbIk(w?pDH%X}Jmq5srgX*% zAYnS=BrqW=9wBXy)#3+2*2W7*8>bXJFmYH`$JsUZfywbg*kAk@AxNM@NEb)@2D*G5 z?Hz4xhzfBD0u=ddTDO5>GG^$6p<2_CPm9Yd&!4|oUUhEI{yNP$Zd`Un@j1;ia?YeI zyXMX-T99sZ%rF%cH}YrqNw3YCdh?=tZ_13-E|r(oVHwxi%5kVgrKZzhr6-IYH0rfB zH8gj|W{jRbB3cWe?^B9O&A|NuyvvUyw5d6AFc6nFGShkR;CTQmPL*g$1=B~Qf@IL7 z>!(kh9H*tsxNXshR5Y|q)dxy6SHW%H_#k26LRaj=dG~y8AUc`9vF6YzEpg(+Y0udF zsTp$~oj7ea7LrX|isOJo}5+V9w8;^V6aE-?O_5qx1hTwJ=%h_`JGFyHtEe(}s+h z`EPdjEg3g{57#jl4*$N3B4$YLRrlKCemHve5Zq-6VHi^Mq|SG{X^?2%_i=|OD|>); zX5W*9<9=fF*LDpWRD^7>%h%S@+|=CC*5U6<41 z#mt_Ot0xydbZgN=fR}vu{ON`Xd3O}feQYI)brtO~>BGj3A6a>!eb6T1UF5d5mV6LT3$h`etjl!q-PI`F$O?0ks%y$LL@RG z@Jm;jnV`oPsQ8?{B!212Oxd?Q1)9U<4*EJ^wFow`IuwHWNC0FY4bpoINF|e&jacov zU0RoqLWsglRfcD9)fwm{4IFNFSEpR`g`h=d5p+1+_CRMRx=2I;q=&7*9Xr^u$LCa~BD`t==+GFN*wIG)IkQ}pJUJs~Zlak!t`9r_@GuwyX z-15mQ{4k&-hl)jU5LrbO`vJ*zOmo_f&0^c-?!&?%(>|52VU@g@;~?NUUt5& zJtZqQ&K0OWcfJX0!`wk$T`vpkNV3=pzex)5HYp&C(1a@z(y|7)wbuHY%EtEOED==n zqzS!-Y&8Ku+}8l{jH~l-M+1AT(MK}-lTS9>QkUHlV$CrSqQ&J)3UunPx%5Ko(*pzD zy*sIq;WjL6aCO5T>o$N7bv7UJ+iVmelyn;dn|-*rF@o!;uLUz6rM^Z8P?-rjrP~{& zxu-g-_w72cDmimVXGdEw5OBC~^&X9_34qwvQt#`Kw<6q8Q6TYkL|*wg{Jx}|=?kB( zx_D8`%=8ATcJ4n};qv-gTH*%}j_+u!DX$~F6H?wtig5@1?bVeP%{~Ae15?vugH5G% zZx6~&cG&{WH5FB;z)0ZJf-N8U9j-QmHWReImb!~|ZFan^gz?EcASX4tw)6t-6SQ9_ z2~6L2=glK93$A(V=_)^QPE4HctlV?t*xO>&(B<=WIb8!Y)1rJft);HyQVZYP!9p2) z5}dYRdsFSjTADzk;#1QGMh8e%rqlv1cjtxT%r$6p)eLIM6x^`pOw%HJ)H#u$w4COmXJNT{-H}CGK`Zv^GW1!jQ9b% z87}FKlQ$-YR>OghYtFpe-qwt%!y6Ot_D183hjImNM@u8%_|8I*Ve1)lkcf4H*40_x z)YjGXPVu3RnoCZ9S8c_y_YbcB=B1W)pEEHtB}Qwnxlr4Ynvppm%2r)n zf+^`)iQZsKhs|woYij9=ON-06&w{#|^Wu?Tr z8|v%OzmpQZEsZU4X;}juquM*lcfR(GV7x2A8*J^cMY(s?oO&Cx6TV2Zb+*&Gjw5_>|1_0nr_GHMM?soYru@rX?voD<#3(SX155<&Cqq*0U8EDRJ?M zQ9?>`l&iD3T<9;QMCmIqc12rr!=?I$`esCkGa)h2*4|v-;Y!O$PxJ)pF4a4t<6ZtH z!4}SOIVnbRk_O`2B;2CLKhGp0O7xM@Xtc}AMWPp-#>58zOw;nVvk4w43x;&<#Me(W zymP=sLKHA&-F@|C)(FknCYH-NB`A~`V+)eds>>)-gy_lP^5Bx)9fdFAEeY4|2pa`5 zlPI9fK;@QSRULe(F*@2y4Ue)nJ2k;=3pQS&x#&_&75b{z<-m1wY;5X4Uww7O1wf+W z>8nU247u&i?V2ko)`Qo)W0PIA4O+0R*+Sdi;iu;jG;fT@1ti>$Ywh$WdFb}B3r`0( z|I5WaxbaY5M-mOrAn`GKtz@RQE1&<6y(x3F=l$4Q^;IRh-?d4?^<#nxBC1L?zS9y_UKOM!y zRtKpwPb}uaTGd>3#@a_rC6yIZ1C5AKsrN*5@*k9nOBf+l;S-sss8iLd7{(-X+yp*gJtW|$PZ%05ITQ?e1c@rDjIXmD-><8pnM46aCN^RYv#oZOtWcnudiba6(>=8cWge6>yOet$=EjSqM5 zC2bPZx-cDh<%*rGr;7)fu<~ka@4y4Y-Ea=JU#cj-c)qR`VSq0*X?2A6SFlEFZ1n~F z?X>W7W5RZ8fjUSJ_*yREshk*ne(0+diPzEDfz;a8N-HIY)>2#9)aJ>|&PpFBCuE(U z^-L{A>55&GfIWH-`-l!457eV{w<+&+*PE^Sg_htxorCCwdI@0ljC3fGrQCDpwV=uZ ztYIlQTt0CmhL;0#x;!n7mWy&hjhUo}z_3U##WumI3rerK;*yhE%gfJ~0_=!QNye6h z@o^33t4jIqS=7LEj~(~^2-y{rlz=5q#d+d@gdv@2D|Ff@8zrP}aU2Rz>w)p@Q^~;Z}fU1`0te09gfi2soV9;1Vg<9cT0w^ak;yi?6AotX9j; z#gj>-hQX%K!n&1W@KQP8hS;R4C^J1@-raIJ#5IYf_KFrn4>xsjj-e|m0?b6`GkMh# zLSI}Ow5Q3$#F(;je(8=alra%>hZPZyOK=q=4u=aD<#+=S9Y`VLyG2~Jt0FSyt9CQI zFZu935)Ki3!r|eNo+WmRPY;7hf7$GA+`yxP4v{>&B@UI@XGE6K$7aICeyE%;Qtr85 zkmlTt=|GD0(#yg%h-3|5%rqRk&k(`34_qS12UP?piS7p67pXI86M4)e|>pp%)s2x`xO5@T4KLyLoojUuTi{`Idk8`h)f?kT(*cF zD0-;6Y%viDB1SU-&Bhs&m#xnzSHfMcnAwU0f~3=Q7akYrA=mDFL1F|+M{6sVTZ$Z+ z&UX0~iW%5b-ccCoak`!;z6^D^&NrKBOyy>1r2Ks|e%x{AQhIv^$uVlrH-6f2!;FVT zF>1=eum9vy7T*gbh-I9WJ&Ga(x9SQ$`}%VSdBtG#H21he-}vbXW55(lyE{s{v02xx z&l)(^h&#a5r#sp(xMS3AXwDDM%ewUYFMa(-2P|tEs*zG%V?Mk4Uk-6U9hElqt+WLB zL{=DMGhp6?$1A6dxyuYnp0oFsCpRs8`1ytZu=2JiPhOQHLS@WfPlG29F zpXqMOxv)=vz^N}pgk#nQw;$?d$z685^f!P$KB)ad%pTdW16+pL9?fM-v3=)a{v#bCnROY zBqY)9KX_IG0&N9X&z)WFC^!$E{#2{0tC70Gb><{>u&97~}lD3hkEM6uh15UpOS++gjHiom&8JHfZ+_ z$OzMTzC%12UdA^?>NlcsZca?d0 ziO3y)^B;Hae$f$^mXXKL^^V$e=T{O+suM?u+CP4O*Cz-a~BohE3~H46Ac4$ z>sD_`xo2JmD(-y!<{_`X`}#wPQ+Ca{tpMwJ$ldpc$B!L-%{gk>V)^Xsp2Koh0CwYS-Iui??#W^IAfuF1$XZ& zlPVjugsC4F77c^tEfrN5S?CUwXgU1kK`c#07Y}~B1D&~L^WHa8y*CeX#s6f+-z`Z& z#e&~C53Txi=c=q5UdkVujJdum&{VwnK+5bH>`Pv7K(bfwb?-Ev>oupr$2e=VIi&bBIgZx9Xi% zEj>F2-;U1B!Ykkh);bD)KYLR8g>A3D^U6CFTH>_D|Cn_TMaZ5NzudItWXkXv(aUp!WD-t%pspSK-B>$30lYg)7$oAtwZnS9^0v9zBO+l zy@I=gU%@T>=0;E6`_~r@(=P1awsLhtVyb1T!fS?=Wq8c3;DO4br61=_`*m!?J=c`sBkC zcqui5#(!hf1OA5RxOM~8Vw0P!>3A37#M{f}RUEr(-HY2ueQj6imLK5(=!#E%SbFlc ztQkP4c;{zR&whH>)*rtJ$rI*0FZ%q(=SG}6_|P6^m7#yTDgq)xSTO65!$;5MpFQ|3 z!GU(%@rgC%O1z7U@4WcE+*SM@FJ8fY0q^nd=T~rtPMUymW8?A#HD|uP`{&CsVOUbt zJ@5YVr4z+f-mGB-vlq|(Zsm<%d&^~8RleKc*;S7>fmiK#?;B-@H&^4kv_${;kA94Y zw5#_$Q(n9(ZE7K&VK+-0;2~GXc(lrGKis%>_3<-DRM$zHd<~E{zI4O+!w>9z@g?|e z)Qs6e|2lfFc$J}B5VJgxPn~bjI*#q=)DrT?+{w#wptNs$aeDc&dyW^w1E;pVc~8w} z3-;qh8?Pta{8YYZJF%i@=bN{+=(iTqCPU}a4X<1epX~qb%CZYpUCs2i^X?7bzI0B! z?VKu~hcOhg=FDvtIgkW2biA{2iBwV)GC%|$!o*saFABUF-lAcd zgZ;&?2edwzKvT)q zmu(n*(c>$c=!6Gokn~qVD9=f+Wz}%?;&f^L6MN+KPBq?_7fHMpn??nv*I&F{d~vG< zHq`kZ9vVlBY7)d>s=9Sn$`xEo2ZprU{Bj;)7nv`uLOJM!prbbc@m?-NK!R6rSL(G| zQXIWH+aWw2SXZMhAzM*odG^#NRpV*&~t1cHRScQs)Mwj`heEETM+AXs% zAe?;db?8vN_k{MqteL4=`KC`$%v|zpL2ku{=btJqeKmb)!%d?#PlosCe@@w6KR9XZ zcP8I4qv(O3uULC|x(m&nL&l0523krku1rjcf(}*Ays@}{!jI|?$NS)T_{W43mIYJY z7oB)eR?E-In^Ssp1KI}{eV!=l1ZeuO=r#D5nucOC{1seB#{A^mVc3d>T3s6roqd9u z~es9bU21m2#VvuK%nz)y<4G1H6|m2*dwcWlK$T9_5xvE1#wcj*1k*^GTxue`oYDK!*7;AK$;KXlKSc;%ZCpCj^><`GX21Hd0I#Dp*FLl%p!UA zQvmTUZul#>9mh^#myp7Fzpy*z<=picdY<`)Uft1B)Xus4t=NQlu9$CKb^9X&(S!XI z8%TmD{U}EFZvux)%(`yL^$)L1OVb*P*ENu<+m)+ppo}(b%FVxadG5-&{i#e%JG@-HB3c z^)hAlGn)Obt8QPCiOrBOyhXAxR0x=uKdRacL>?*Rs1O8+Dn`r*9EC|4!owXz-2yX4 z5BW=5&-)hTHR*SI{l7U?^w6yZ#h{HY%SoJhHlW(h{o~hV9iKn_zOPN!I+_6SHebSGpt7R0 zecF^e77x(=@SjUI4q0>k#5=w=@ebgZY<_Y7nM3XZ!HkZEAX{4cz(hw};xVK0XPaJ} zJm;Z>GrsxU3dVx-xbLofaL>p!lZ*6Ma6f$h;(^tB zhOU`>&E2eU2)}Xh=BfYudhEIfH+=G% zs-+Bm;(ow)uqk7pX?t5U0^USHc~V>$2z~HoBE6i*##orpE4X-%cOC88fCL(XXug)s z7Br)P7kx+DosAt02#<&f2sy+ME4t|UT`gf~N}`~KM9+Lzu-(^TmPq| ztL+pdkdJPQNB_U*Q^3@Nq(8*fA*)L;0_*n3djl#+Al6(ZO{6b^2rR3JNzU8%Jv`T` zwO3r!((xMV#chB1#k}xH=#z`Q&(Hko@Lj)~r{3<>H9+u!fwd)2rvsq|X+pmcXs7+$ zTrPas7mBZIfC$$OVD>@=V3MISjtQ(XF?LBm32uUyiBuO7dKQwz6EjL6Aqlxwbk!6L z7U(7n3%ym_ZWx+~^=yb-VP=>p9h=WWdkG=}))O>>*n%7C5{o#q0X>TpJVW>s$$}}9 z5FswS;O=z%)ddOkqc{=DbI+t~>|;YF&K;2IX(`@*V*k^kviBox2`lX9xYG$32np6o zy=N@>5Xe+TY8fRH z3S||omAQe>9K@(&km?+*M53O$WlxDEN(Mb(G8*ye0VkpuK?o|9v9M5l&8*Ep!L(PY z;Upp2*cMEgNTVTb1i`MROc3&dE5ND32=|j+k^f;e;UQRYrw^gkYMA7Cwv*BiN41yl^-1{Bvi~ zWLOaLmJ8Ce)PTZRI7Nm98zDU)8>TzO2uuGb9LYhU<0=SwOBd5|m<%x_uaqd9{QiIg zt1k!b6(Csv%V;f9k<}!b23VjHzeq_CM5+Ny5QU+H@(!mK3P_nmAHqXvBUlOaa5fUs zyF5a)x-p!YkQvU)0x@fX3ZiazX?Q>QdF%|gO6c?U=^8BXzY>; z$T;=NwJsFwBy&0$!dVWh9iobfP{)@b5F6Z>RYX#$uxVzK3Yes`Dms{L;ewDr;#8fK z-RG0wL%VW;3DRF6NcyasLS#2$ETRovFj9*bN;TD01uTTF8D1BH?i%m6+%ll-CO++0?VCXyK-C zO^7eHMAJ}JNT4q587SpPjmvEiAJoAa?T>-#R)^G%He-)GpOhpt}R}0WY zDuqc(#^R=mWKM{CiM#3_z*l(-Pg&@(QW0R=QG^J#T?hJKCP;MuC>6|^h)NTX`yM%# z1~&^9*D??0Or2M{KBUdfa`ZfPe4T;hDq2MHP(cC$4wE1rVU-Om@SzO-1p<;>a+WHH zlBGcE(I4aEU{tDHNLPr|(xPiC3X-GqGBM^XOJGc8jX_5_`OibOP?(R5O%CckMMlzj z3woi8;w2rg%GQh$YFGd@rPHjaW)JE$iW~rQUa!YlXUyji-4vCC<7Tg;%id+f)#qO* zNKA_MF$*(ETYZeCqR>9Xeu^JvsX9Zi0z~Xt&`i_15+u2Xtvy&VG+r=>Sx%`**rW(C z*Sn8dRkQNuK(@klE+hjrG%^q~frK-JlB#+y5O8S^7j#UWM3sq{xKjl_%$du^A%b66 zkco$Z+*3}EcWx3hH3??%f?6n~dbGsk6CHGYBU70akc1|P$_jB(sL;#seh3};gcA#- z1q`MV9K}2CG;&CV756KX(YXroeAGdPv!n@-$lBq|*T>wbj4e8yI0{Y*Q?@zLu*R~Q z^OtoHozhUwASRY!Y^A47kqHzXOPnzT>HwXY8DJ4*M%42n8kmU=LPJpkI~?g<2i)7h zU3~ew@{A==8AX>bBmvhXlF)RnN;^O}!c_$bL|#F3T)12GDd`9*a}y9Ix)rqtiKA*o zEC7N9<58Ap3X^7{8b`xfCKd!&7=6eHWJRJfk+`tKB?f-`#_7b)ICSd>-;DJ^(w`Yc z>4l8+7J-D9(Hr1%0hWlQ4gdmMWduwVLllk(48hThCK)||s45gwmGxCsw_;gyg|3SU zJ6rn(Vgnax{1ZCBq*xINjiLL5UZ=knt)b66RAltb663M zDOr^xZx}0L<|Yw{N~es-j)6LcNr0jv81zL_SfXo~09@VcLDB1&3Ly9!0>B#1lqqDx z?BQd^==A;Peh+-PJ%9+pfWfn(WhOa!`0y8W40wSlB3uq^#D-ur3Fz^P0-!VoTAtlv zs6H?Wa;8BXyYY)OE^!N(8On79<#`w}4>0D@MVBZLBOK+(!Av4l_YD-n#9UPQzHy3- zC9Kfxk~qwne26b<@KsF!8QcRT*HVMh*oXB2wJzfTLW?mXk}3g=Ti5h*y#BKThOUH7 zJn)IE(HDgF+8n*|g^nRi*exM2$p%ovrruZ!79scy%uYu?#r%jmOOW)&@e9;Pw!_Sb z9RQmROb#1z3$;5Z#xWBiFAP&uzzuW~pfIop9awj9%s?s!4sKdAA&Ts108zyp zXgx=plmfz4OhO0z3lz?T9Yj5$gjEqhRd4RG_0Ft!3?Z;@$6mPsL3)!JhTx0Z zo<#|g5T_}U5QY+tKJCYEsUS`$3kgh~pMAn4lnUe)e6wJIW)n>Xr**;32PDtr}4H=udxO3PFHVXY-6 z1fUZP2mZ2C?=h%lAgYu9!tO!GtNYq4Z%05dn%SL`q0e z&;qFN0f~qsFeMrd81Ud_Z7CE{%_{Q%P;lnanU1Ft@qLdKE zP_mlxms@73VZJf}`h>^o5vGnE*$xxiKRFvwf)F3EDqJ9tBVy_{NMnE_ z&=fqJRX7ABatTH6u}~~fqL|^Yl8{52%JC(HTEqhrU|OO8Bgy;)l&I42iJN30*y|PY zd|3*U2&Rk3DunZ2xM(({clEAZkeKC0HW?V|`aCj52()+gsTul!6~edMqT<%GF+J3Z zDzi%A$bbk09K&n7RZdbFt1spwJ2f%n?k#x=zCw&8bSMgpJBbnj#55}Ls*E}Hpv2`@ zDSKHA(Hmkpe_2jY@)g_5A`d|}Yoa*I4EdAmuUwFXiuhB@ay{6S6<=5cwsRk?`KzpN zp9}YeI5AvAuLx$6%R)92_K;T|Q5hgZkSKO15hjnqZ`_+q2EGZo+htl0n)I1h(z zN7DaBG}2oBUrvxXa=-G88})4vN&V)s!y7)_)!5_v=AtQF+1K4O&-uphHq!PdMsgP} zS?b>M>gH1H;A13OHlU=hD5#*jH)Y6h?ZU}w>_DA1b-_&g2XE|d`wv(9^1%2s~vl)vH@F-7GglcGxX`EX(9_H z{Vyj-u;-%YKeln**;d*x$(@)tea4u1Q_Eie_KSv(*=U{-)C6&+XQJsk6cs4c)Nqemi%awx_e$Mm~qPkvHWdxKJq^ zfgLvPI{p4DWi5DwE+KRB{DQ^LW~QZX-~4O@RKsvfrLX1)_G!nDs#~Duu|!so6HO+s z)Djl+4)!lp|7dh`tzaTht*i`-B;02~wu-%slDR3tS+ubbp^ANHXW}NQ`@%$s6HH`d5xGl%F7Ro8#y7GwtbDsoieXzOsrGuY&y4f&4(A;5+>ce zU}Prk@>^ZJZ}aA(ol$Y=8PN{yY?n*_B}C^=RUEdh`LJ@p z)Wx&n%j@HY48p!`o#%FaaOgtJv_(b9KrXy(`pK<3%VLsKymqY&_cAjJt{Xo*6>$;h ztUa=2^941t*;A(9T6k&4dq*o}G=*;G{zj^I;UN0yDB2f&lWAM{iIokbvTt5xYeyylp#`tFjc)0Pa__N;I0 zCS&9G)lU_lTxB1=$=I8H?dg$It^2fVwl2rRW0!tk-${PQu9b^T^Q!Cty2%f9U=t?n zV6U5Ok4a6=p{-)O9N3QD#AL-{+Pst!y2t#yrOOJ^8n^!O6eB-4{vV%p?R;kUt`|`4 z8M|Z79Bs?b3bpZJnh)DFZ-KVq7e$C<`;gTO?isfGr()zh7t0X0FO5ucK90*BlH9Uy+t%VL$Kc5Yp01`dhmK=|xAqGsPM6i&y(tMvv~01b zO_?}6wd%mG?OU+Vd{V)LJY7}z*8x7}Ef+1@xliTo+?P$K{+hYkvPt_lH+e?BBsV;N z<9*uj{D#4&x9yYL$RF8lHPgvpK=Z1#?g zRc)b6uDMHC z;b3_icAphY)33f-)6TuKZck-Z$>!JAiY?}{OdNJ>A`bKuCtAnu_qJcGs5pvEK^^Hy zuC|IZN3dseZSleKS}>Gfhjq1j(5{gv_nH z``s6p$?e>W7SH{M${X)}%Z1)Ht&lfqf4;7Gnb;OSr9WppV|A%Qy zdD;_MB%O(|w|rWRa4H|k&!#5AAjJ^!6n?#8JbYNSaaqy%gG=_lu#7i;e@-;Xi50VV zzPY%C&6RnvPdm8srv1E={8Mr#c@l+x@nP1=y8_m^P1$1~fPrA^i~KeTl3i$e3CST=QKE!6DJCDM|;!4APe zeB{ZhKcjYY;9GKXxCe@0tH?#sL@H_sphQZ+jAY5v!*7I054cfh1TE_Ol5kD3XU*$$ zO%e#i=FONlZSa_E_gUJgdeDL;UsoLBPH#9JT{QCgTSj6D)Ks$Vy;8NsC$1L)#V7U4 z_o@m%u5*wChi@nj*#jWzd<|Afj-ZqK5vgpW4dL)`Fs2jf8R*^As1?jwG)})5ZpUjD zOh6{l*KBmlR9J}T_tKu??c9HO6w3hG&izrboqI_T8ev;_eS=N>!bF_CHS1REhUZw_ zVG^Kq7B;0cXXM>={*d6Qf5pL$MtBINaI$+SsO=8k_+3!a#_tdD#_uSX zo<4*71S08qW&+yE)yqnjJ~VUzeP}276*{6kQ!lZnJsH=w^5_cQ!9G?udF=cH`fZKM z)i0GS#a{F}la(5eTnV{Z#3e3io>r-Ljtpw0%geNhSB-h3Or=;*t${6`DlkI?o6A3%BnsUC0C#!}m>!2S zu1R!}J&Opm)i$^Du+Va3%h}0GbMjJ49d51Wz>3v-0||Cc<3M!}2)2VEY zpOlwz9!!~X!?29{J?lTJXlhToW>Mi_U4N!Cyvjv=JNF_`cQwCI{DzkO)YA?vp7%xH zxAw&a0k7N_-8S-;3ACyE_scJ?O1`~xX1>l=Yg9Rn@~jbof|AKE7X&<#N!7PzG_9h|Gj23j7dY z&!R(^U~Hx5;4q8O1974wD#pEXf=dh>3KoZ>;^a9kd0gR$R4w2bH2M1J(o{@7VBTn3TMGMktLkf*JBNAvS(r7D6S9 zFhuWyX>*od|L`i)PVyaHZmYzgCQZI)b!@_XSM-Bd-To-mD?cSUr$=dO4kD^#3G+(&Pv}OG=UR)0wG4ers!cQhI97c02)P`;k z!yEH3*r^t=WTb_B0zQ&Ba@KUvq2fydb1|Vdtniw zy7R*Mj-i7FJ2q|IdMt6)^jq$o4kZ8SEpP9?n3(*P>u+*2;Fg^67CbC(1qO)J%kD8$gbR##>VeEmK`lQ;=*bbNi>hJK;*%K;iYR==ROd!ll-G8LLyTIsv1b3?YHPk2cP&>9}x{>ilKuU$O&LMhz=6w+IsKT)%|AolS2O45n8 ztPj&%)1E&u=uqaC0uTYze8UVzy_zs zZ42Vn2gsqBi^YpxkJss3Zq3(8^My=gy8|2oot@AJ1eoVM9=Frs1R?E&s_&PQ*Mt2fn z3wE$?5IfkbwlJ7lm>A$lxre4c{iFZK-ggJqQC#cqRl8TVjD(9MH_2UYl8i0)26FEh z+hB+RQv-R_1m}?eAqkMY5YiwC36MZygN^Anrr6*j+zTLgxl5L9$yIWbtag9jch1c2 zUfCw)<^A^?>F&;)Ip;fNX13j(xxrOGUB2{ruQt+h#Sb(b9bJ8}`odPrW^LOvSE8ql zXe(_yxD8?}BKC@`B({U}0K>r!=Iikha+fZALrad#$&QJVg@B{6VD^7(kkDuCwrUal z;ajC7V+5EH3I@!Ki}1~G3!~)0Ls5(}S@~WL9m)i!2p5^CQ_wF_70GFg(4DFPp2pb- z%T6d7Ko`JjsNV{HHiK{N!S(*H`cLh&anAS}6u=1i!P_VranWVN}i$q`jX zjcF=YU8c@0XE+#~qpL*QqUDw&qePn5_Aq8YDUl{AOWzhknZmGB{XniyNOYEb0!lr!=W>_J`C$EeZ@q>c|qXZv|C3_ngOEd~d_A6IK zmdRAPF8Vobozje)zyVr@2vAUIt#vUqW5nuFAt4p@%upoqnh+o-M!A+rSux25#VokG zQFQZeE%|&rS~Ob#`_PnVF-0hX`!-j28>jBaK55SsQWHML`zsSt@U&I zRU1ep`A%Lm!%bvspM3W%80!Y6rt-zyPH9eQ!gQuJiMq5T8BTKzhq7I1mtE`ik=Z(&c|oG@F6HZS&&n@kZ6%@dJ8~E ze%vGm38xX2ng|w`SFOirFv_{pFo8v>kx|ela=8tVh!}rGk({ut4a(#*z?X#*bVAGN zRWRq3P#}x_&@$wu`F!DEwFnW@(3$ngK_mi|5=If}bl%q~u%?-;u2hFc|K>p=stvR; zgEktn7$KTyi)Ut}DIS-wasyW3(LDtXq~&lC1k~l%YU_*Ep;Fpb^xH0MalE}+L0n%T zylTy9l_-zs<+M{xGA$(RjJbOjC5sP^gU66Ap)Z2jFD4iyfJ2k5r81+!BYA9=ou_rv z?Jb+Fx_EC`t#4%T3DE?vs3oslFXuZ;S_^zm3bQBSbpSXZ;kk$*(pVW49-cZF8CO5L zmzRU0xZ%>=jNRH+jXFV&98+$c;u-)~1veYrPn0H5lEI z{1UZ`QB>T5TiYP&hTAHzoT9~qob8}ZS6XT1u?2o%dBNdM z)Td6h5OjDL1mTo}1c6vG2V;DfNG%#Bdr)Cnt%#sZ#of4DrQV2 zC$hG|S&T@u&6r2JRcZIi>oI`YSLMs9ab`;?*H7b_*n^0*aTeR3Z`XPc-;@!3KaFjq(DfX& z`c%xPmC}9$FhugIM8p=sl(N;u0@_)ch&2STAXqFGe|QjzZ!yf}mI&K=%4%{cHWTwm z-}|5F-ZG@sHKz}J`kRcBGtyH;m9!$k;{Z3X2d-K1KxMNx?yx><|w(f6tZ7Wy^3*xgEkGx?>6MS)fvS8`& zdz9dPvw+iN(Ap6bvnhTkf5l(=9OKKef#hrQbH`-FW9sse&8z-0@PzMmWHk~@QC-&D zIHObE|1>S82+7IcIzGH(;rt)>#KFN@#~Rv;Hpu+)hUuZVf7rFs$!tF4*}&%SA1U8T zpKYUBPKkpc1f22xe)4AA2Y0Xd@^w>-w?4*g&mEXOb3|WHybcP zpt#L!G341WYvp(cEWdpyB7w{O2*G2KUgs5^tn?Y53_%m`duz@sGlkb~VtzO3r*}3x zlmF(=`&U^30wY;`Ic_P5Tg&B97!hHQ&Hj4&jiI+5?QCBsH$3%3WDpr8Dyw{=5Sxg` zP+8jDWuaDJc2;mG5+>Ek|&kku-ecJqKIpXm}`wsy`7yLYaOZ-2|c+a`{C zvf%AUGRoPW?4wk#+G34V)zQt{*E$#Y#Qlck^3~xTWu%FCUqedh*Ko(`F2*+PmV@HRauIm^kJKYv=s1uamuQ z(!}heTR;6`Tj;7AhK~Qi=6OHNs>)b5ZcN6}uRhyQ80a#7*rwu)oE+cKKW<>AD`%Z|ZyJOQ(L^`Lts(zb+s`{nV<1 zYBaU9*7L_4?xiItD7C(7pX+K_i`Lzej;?%h`SKsShN;2^{YG+*L8I(WoqFxsZwDmn zjAzQ`SI;i22ScfIU1#ak)`AV;FqTtSF}t<)sEI@tbO{}UhfZknkgyR&*6<6_Ff>iU zT-Ul7^Apu%kio!V<3WHbNjpBW;rL#&y2LxHex0)OFl(x|E&S;D1=rq{ozN&;ekQBk z4Id8f&AC!FI6}X2^FH$uo)evroYF279sJ#hC+=(xvE2J7Gzu8%9md<^6L+P3ZQ(OuV185i1CnAop(Qr`T6-eZ!AjwNQaOM=kOcW13$^Fnl^l+^ZoU9mQh z)%N;@esu-=me3};s}4JjySH%)7kv88H28F^reMYmebX9+PYjxt>>POG**+DHQ@l0r zV9t>9(czSdBV(Kc^IsfU8E}e^F23WtL({GdSM|q5Oa6ziO$6ql^XqTFExSchxT0US zb7uY0_oiYE#c=22Lpvu1qoOdcQQJ>j8+m?NiJ0P>C{AgU_zHn9EO)}Z*2Kfd6Wg`n zq>FtYJ@)mNe-2!cn%pKB+u%1t9-hgbbnWZ8ZRf67_&|Kt(jgNwF;S-KY|(~SdzF?u zi33&-%r#7vgREt)#`UlEEIso;*6rW#m`dc6dsnTQ zJ4u{Hi7BDyvO(i$9-y|q``DfXIYYiHx(3}lyixq}g|kdsAOL~fu2-j3?)?04t6^D# z9^QBGE`}##*%&tzHRbtBx26mk2vu-)%^!On=Y;BILnayb*Z;NWvD9TFb9Dl9;`(m?6-p zQKQ(XKx_=x%fxHt7_A&|+;F&D;$QFr&3a%`MZrE9Ax1;dg!i9FJ9Ng0?lI?@-l>Q3 z<}Y~lgAylc;1qMNK$xN$r8h}V3|B7Rz68^2oils$^S@s2v|loHYIgk5{AF)0D5^;6 zH}hqTh3ME&qvVW!y;F;~t}m|(Vft=H^YRsM%-(j`>3rRtxWb8U)TT*t60D5Q7Ik0D zU-;SrQ8x?rAOI0DK>Ql9BjV_SA6!R@OK=ifBstYd!=Jiv$8-39rInLcQGr}5KBYMe=tz_Lyfe?KV{N=R#$TE70hxqC{Sc4KD-@m*B{C&vb=HrZLhTXt<< z?X-M<%*0G*@2XV`J}*y58+g~UVEd1U<#u$6H|D+ZUU^aqd#=@ref7~IxR8DO@!Z?i zv>))2Ow%23>Wqh3uzhuOx0m~7rjK+o3IOwirEvImVc+-P> z-Y6=eEf8q)!KiVWq2pWDFOXTg*Z;nCgQbdgu5e4i_D!DeIA)|i*e>K0ESbJzeQ9)u zVU5xIqVPVfgre!uHSc|n3DVgk2gVhCp7+s4Cn2rxq!$9MJ{U7e++Vnq#@xL;6dP*T zv{QC=N=d<{v%xe*3@B|Dj2e|0b!bc8-1mwr6MNqJO4F=Y`u0dEUH9Iy`J8v%bL@j+ zE_nHq65c=GyU=8bqzF;ia3+l9KYslqPUl{*2~9&vYx*~C&$Bad{gozPdvbGr-rql4 zFyq+Xyc0)pVI>D2?RM3A-S}bA@@G!s;J4=SqJr5i2lqv{d;i%!`!-&`?B_2)B4^|a zik1Iz?@wPFq01C4|4p~TE%&TnQs6il%^Nv^8ifkfmgR5$V)o|?Zh^X!RF{GwRL}mC z`%0X~Lnq8!(6ayH2~*nuym9h`S|G$GB^+L{=;ir4jym0^{~m^71l1H4*ttO=8Bk8( z>>o~-edYuvX53jmq`g!4!7oo4U!5zjx-L7rBiLeNu3-3}SVsu*Zm^h_BPl2@(Pq}X z*sFN^1Dn6tjko5TH4NLyvGdHV;7v~-**i}r1DCE}fEmRv>5SqIy>l>8@$=Wl9N%~M z+TXr*&e}r-K*luP7ceuqG-Rgf9vwB~{a9z-k=4J%tKG-GeEP_~d39x53)anDyX5Xu zg{#b*WUuzki!^3l8RSUh^xzebf4<TPKy1;I&nE= za4*N%U3}WPux)jflbDe;-P&H6_ric9+o$i?i0cF;gC? z;0;V>zV@6>V0N68J_8YxC9mZoCYxTKd$9Ou-Pw9RCgU}IlVFVgvy4L`kBTOGVy9uV zJB%STEo$V(-SB#?DQu|Kjwb*HB?wb-#4;)LtE;~|tz^!fI}hhOlb*QaxmygqB3x@b zt&w8|*XD?hO=UJFRI@ja@8#o0re^Vp>iau3;$;=4zi%tx1*;r;3yz-0$PNeP!qWvL z*P+eMgvW3HrM>&djCWF1rLp8yzi}C0m^l zv#xs#Cj?2AnBVzL8XIh1R+w;&H?wzcI9v|H;S`=Wxbuy1`RmTw^`lwu!;g2utTm_O zxW|sE+7<(DjrwYy7Jd{W5VjM@kEFzzW22DjZ=%xEN(gT!|e2uCC@)zR5UwvX8E}8TF)_H zb9OHTD358M#qq|`kkKF(7nHaoK)S%7NsfCaE9l#|y!Gj<^pekBc!KI~EgNgq3AWJ~ z*KT%$!r6bB&r7C2yY;u6nt9 zdt}$=67aCx$}`@aTVr{dV_x^j*^E<$oK6N_@cYrVaoy_zx#|_DyNY^xW$+U`=sW+_w#Gm&(1!NnaQm=GZ`10I!CA+jLFwOk@33^=Fzpm%sMAGZ9uOx%^}2WKSB{|HkLu`^_leqft2U z(!0lCH5L?|4l>`kQez;Y;8%+3Qf$`PW;g?U^jc|UFsi0Jw*BP3y>il%onqrJ?6++! z&alT?_ZR+tOl`2c8gu$&$5y>$);0uHR$>?3vI7Mm8+^9^ZMnzKq-C_EkB8yo)PqAi zvyw@eO)Ft1Nr0eTJDO@X%zO7Eex02RDJ#Tz12>a8FO-So{kQUOw7rf zGAY%m$S*t^lIqOAOAX+pQfL%N5sa9W&nK>8vX?A0#?FX6M4&ckn*9Sq&v;nt_q z5yUTkuT>lsK2{q)0Z=H;tb)4o@}nhCH(1q$emV39CEYT{D+spHErtx7I;&f^`6Cntk1;uX%IvuK`#Rq+5{IjOyJnYcT<17#u9^6P6LVkR8ACBK@z^P+ z<>UzoPTBJLzpriiNR#%@G)}wOaTe_Ux-z=`gif9BjcWKn*39W~PUYdEWlm6M%#Nk0 zYVNtMxUg(@{Yz=>zU@TkUfFw1pLD0Ha4Sv%I_B$-d>bM)KGgEMV6gk~{M}AcPR@X* zotot4BOlBem|Ka7vN4&1#=a00JtpnOS?GBNnA3E1 zggBv=lYxm<&Ya5AXO16jknw)Roa9!MgQ4zr4)Zgj@d0RTnLBg%13EqUqcWU)YrGkC zI%~K8gqPxi)6=Fs(ZX@|uYbw7FZPHpur4!gNJr=F#%*8DI==mZqr09swD@Bj1G)@( zUY)fe(~{Tl>V7ZdK8r#8&!Hy@ikwhpziXayqHkz>{md4)Q9)N19~*XhKc_S2 zUB}oVfjupRc{ZT{qP&%k{x90G)!~F`yCC2+BR?!ElAd|i_)F}6zx-zz&ck;vOV@>X29ZRpged4@T9sIpPZ&N*$4$T|s#tOo>69MxLdNiVH9|Sq<(oJI>=eUy(W)H!VKZN*LQor zPwqXFbMFE3fyKW&^7Z@cI=AwhXFVH*t{KkxDHwBje(O;Ka0Blfa22YgFKYDSky8=e*h)^Fx?g zg)OR$G+3Oz{)qN#eH-r>AD6nHPuziDUK8#-Q$tJHCTH8>M!R>Ak|ma#3tSy8**yT zuDWo}*CSXXdL+IsFhGXl_VNS9jm^g%S>Wd8pm4S@~Q$l0y^kB7^$6=$5#(>#po>s8l z)o6Gxy92Xlsu<(4dd5UBdC^jKVXHnXzK~*l#PPqu=$f;OjEgue;Qqrkp63v@FZw9x za0;S)69wFXz{s9iSb>qhY#SH%Zw(UH2V^u{K#oYX)c$F}xUD}(tcYv236=~Je2;@u z9i5OL(lorP4p8+phF%!@txl_78R_0{kl!*}J+#2kU2)}ci?|xrL4x1Ou|Y(}MdBdg z1Nu0LwTK0u?LE1}*K@DMdCv4I!;PJb>jHST2s;?G%UzPe0MZc`$qFctYV?B=j$oJV zqZGlv23@&b<*2J4S!185&{{zk5#@E8&lX)cBV=@mH=eNHXfLmRl8d2HIu-EvW0Ilz zVj}e(k1~j{XhZJBUrscX!9X0bm7_!&SHhrY7peik@Tv6d}mVVJ7;XF#03swcOJ_Ww#cDn}gb@(d;x9YmMBQ0&2#XpK#V~y5J@Por@ zwams7#K(0O88&ca@==ISBxS*JWpD-u9YK`CCwdMKq6PqP_Lt(+GE}gZ^`;LAuaxP9 z^j%lnnqdK5Gi`~@lIjntCYqMml?qT-A2m=WUEtN#dt@7lys*^!X?@_9DcqDe5wEV!h3~vaFSu;s{d9 z<4H|4Zv7+ewLVU2O7-niD?t2%a$hmzIpA%J>36B(*;FKPY?l{6iS_4AYOH z)EX%rNjr_(vJo8_xKv`2h@sblSDu-YteTYxdGre==(2gmlY3Bskt*RQpO6FwSz=LI z%22Geq);i(4RW21RdcME>ywyaC2cL-vmgR)n6NW)0!d)eDAlOaJwX^6IBSDo7(g&A zhG5F%qp|)SDjawL(6GBNCU1&AMG^nRbbNJ#O4`i7HU%3?BWyKR6iIBQufn2+lTY3;hkfHtP zIRF)}8A-+$Nn$INB&i0FVZ0j%bpzh~U*40bMKr;+8*bF|o92P!I;!T%R+%lo+1sLs zcmX;(l29RdkO z!^ZARb@<2#AipTYM%A;D^(-?c9kAlEJ|<18$R2bahsM+}-^4hT3_1p=|L zcqa&RWBH~HB=IzM{J&6AaVW*NYp{V2h~#;TfdGjn z{;Sue*58Ydx{3x!>rs7MttfPwW1yv|C71Wt^4XyJ!fwLsqo`V?yMlgVq+Kq6l3j@i z6V+n34y>lyy>5vFwI#PTDT9vCJ7`pOXOe^j2n{EaMB-ae!D5eT{=Q$}ypmk`R z#21Qrd*Z&xu2TQ;EsYejkdaQNr|U>Pt`C+hOze{4BL*9P{)hhoj1@kjkX{9fNV;xE z;6!+Afz95Ps7IF=i_VA&=rt150NoLaEUTx`*v$$br;KU0Of3eDeD2+6q^!lHO4lwG z(<;Sts|bZ8%tn>)nY^i#9X75Qs@>ZW$T>xM$E~d=O}fSeIsEg0jE|m4*xNjYdXoRCqAF1b z86$o!gMBd_Hv@Qz0}=57Zw2E*T)Bjxd7l`mZY(3T*l>ecnY>!Lkq|sGfdN6WJVN$Z zS?ePqYjMfL1AJsHi9YFzi#`fu+4`cv2>J8mWH~~iRVRk1A}h+hOIEA2O7hIgM`%12 z7=mYTgfCJr7U(Uz%dHh+xT{Ukj7S70YFLT>$Bbkn0_w`B!76L>uICa5>$)Hs)c~~2 zs)%^h;-^bdHv~dLk1<>*$N#6kqX z0aJJy@?J5*`9vSHNQY4jzrE7YNY+?MmA6rTLG=q6vcv~;1ctSOplm)c&5DGV1(&+$ zvs;Z9MyYm{SldAGqgzfNpO4cpt4gcI&#F+QxMq1IVYEfJUN~98hn4tvbrf++T0ZH)=WnuuGnq3RJR>NR`eV8emm7jWwr+MB1#W{Vm!}dHn7&K2y}4a zU(9l&j%N)q_|#n_>p#jc zQi5RX#XtcE#qGT|w1!I&v>@UJ!&-p7NYfI*SAu6MbEJX6$e5jFVLvp=)Of%Mi!oRE z>Io^QCn!oZ8sy|hFuAedCTl$vvMr!a5{UKGDkvdc6EtH2?L#*hzV`A7i5a%a3IT~4 zu|+S|5K)9dx9w>48*trGf*8KO&oWGp!iy7ppef&z5Rq`o9^qI7+`m~6cq^-}Xi04b z<+2HNDnKvj46$&H7{eFxaCd@RYXQ+}3nShrxFyNn&!w;=ONaAUDUmf1RME_K(2rZE z=Q~T6C<+H*#Qgdhm4pF4HsR3<-&V6KZ?~jTRs&;3h3k#f2&;iH-uaPC@A6n}kVQ_w z{V`z_{JhF#w+7h9pzLCp1Q1nz?J6itBwt)*k!A0zMo*U>dMOdAS5~`Kt#%+qVAd;G z73f+KrpkAY5{Sr0z!YaUWK{Tvy$(uN{98#zu^|3a;;xktp&>8@BvNUVx`V-uRTA{M z87{l<#g$eth$10|TXjC&jDbJ-i&Wv(X$agRGvpP1Hv@uVvmqo{9sngSlP+cw@yl>u zf-F|hSVi)0L4uDigAqnM*C$z6Rjm+~=8J>Xq2ewBGWA62Gq4)LaSyi<^{UjOnJNKP z)Cgu#MT$$c4yplL_#!vubru;22%+2-4UbC22{?uBBlD= zzHhyxZEkYAm!Lp&8MMPxx; z@=4Vfxm@|55OGIHeT+-Wf+z=aG1BE=1F=SJuaC&fDnGb%HAB!E*@DY$c|ZH5^Dd&k z@WIP1UCRVm=mzz}E~fnp@E0kKly$YcZm9bxYLz*enraA3vJoQL2E{<3DBoxB)I#IE zATc;X(IFz9X{}_jghy;rrc+Z|b>=fDF&f!Scxa|dj0(|e`jTOjdIRp0bwQA^b|UKs z_p@9s4}N1ig+*Fg+VV@iPp#sswJK{lxi^ifOem92;C$}+Or(gb-UOz;cI6OGcO$HV z&00^w)oVHH+oN7Qx?vNQ+LNa>u9yTZ{eKgIks?UZblm`pBA9lhkD=w&m5+N5{PN%98UDe8B;? z+!~iRXGI~_uN6*uL_wG&_e^rE^THlz)~=&-c=xdjPE1Pwu|uLio&Uv!XuO3Z!j$7D zrg^_{1EUwcz1mxZgi4J!%|?DTs9&0$iC4bqwLA8iwPGdGdd85zQpioTp?k`}XPm8% zm6mU1e!w%%wjY+1ZH?=;cG6VmgP-)%>GgEOGnn?6qzxH-W$dHZVf|b;o!Gf(#r&J) z%|6n6n!BY8{JFFB2c_j)M8ZdRMUBBMYgTldY6+uHJ;`btw@ATPCO&%Im(Mjmcuvbs zvl|Xy-J$6HXZkta)?Pa`wBX0twcXcEp6a~+lfF*3b=OXH-urQ1%;Q%}42X#OwFE+c z82ji=m1|#I`l(r3#cBA;gh#GBwxOhT@2Ukq>49~Xv?&Y%cbO>ze@0KswgO7=jZJ1J z$97vkc^d5R1N$}A>+izIjhm8FlJVoz z_&VJDu&8Q?U~zdPGjUGM_Rl}wf1XR*#U-^LG&pl~|AX^a7DsYjqEubJZ%2L%10+dx z@dX<8R-;+RDm~=DmhbEN;wU1o8g0E&$l_Yc}G+nE#%w`b3n8PQ^;#Cg}{%;v+KpqL_gAG%0{?YhK=S{HE-j;lU+O)Cfz1o&!TpWii%G##}#4 zGbbA=jK#tto}O!Se9I0$lAAYfJ)#yN82 z>mFTuHQ?Gr4b%IN9+sI9<5Zp5zvBJHhbxkLk00B$1=ox}ws*s_W!tJljZ&J&M>~5V zdS#cPBl>5=$KWSE4q~~qQc>A3z2C@d3_{-fi%&M~J9@|!C1nY1T3(4|x(=-UbaQdT z0h4l@LfN1xgLW-nUDU8?a(t9igf{|PUX^=QCs{?j>iE{>pC6Kzq%%>;gC-9;wQAwE z5_1HJZph^{4{!eV1sp!lE#2@|a%e(YT*x`cHO!X|j#$FId#efadU*@5uWvPVL^B9a z{QK2ych`35X!7ZESM3E=Qy>E5wO*xV5_pZiZ56PV=Fd9CH=DyJc0JMI@du-0u+Cy; zq&mCa`^4E-r_Wu!@TG{_xp(g`?w)nqtPb9K@7G=kcWX8AP0!%DcNYd9=L+^G65FK% zUstey$ykb=bPC`4&UgTVm9Lnh8m2T&mnAK=p+S<9G7d9==m+ZS6%pTNYw_yc*%Ldq zP7UlY1v$5EpA_f#s?w;GF2oGf0b!=k@^^Rl(Y5p^&Az$~JmtFgelM^lyy?EOJGO1s zDLvNia(47N)}6m{@sHYW?p?*k5sL&FZ4|NFm-Whcvr&($e6tE&R7E+oeGM6r7g^av zCnUwk#>ZnxqLfa9dNgt>&YX7=yH6dJ=^R+Spyyb*_y&; z?fVaG7a!fAdE;bWsYNCCo;WzeIr8=54;G(HY#p!2iQTUok?9n!`FzPrAPk=}I202X zYS_9><8vGHmhU|p-KKX|uVTY1DM!CrmA7o| zai?i^uMVEE;iyn_Tr8OA8dG(tEWLi)vD}%fx%7J3^t>1QW#dme1)R2CM@ zi!$oo)wR&C8tz-~ecNhVYgS6XYRm&E*Rh}Fzx(Gkt9CbTKd@KN=~3NYjxc!417-#L zl=AiOxGUJJv8GqRl2$|1l6h%;=C#FdGs$3xmR0UOzwnsAc8rVl`q)hN!nUPYzO8N6 z<19Cv-ZsHGyndd+3_B^4BQ5V1;{}$U*7u?weuLEMu}RZ|Nq0Bxv$RWsQ;GF`>V^HT zrNMe_H|D{5AeSy;7$7j*nt$FU<6^$vTfmnV_ED>xm_Ac(?&DEP7p*zcVkp)NJ-A{e zd+^H7Q>KpU)Fh50HzDZk+M2iU?7rxu72zffKWs?t(gn*AF8pKzezc(UjYX6190ziX z?4Ceaxq4?=IK1lfW>ZFWN{-%-6Ue%c@=9s~hieMk=eBARv-;4UEvZ*^joR~d$%(p{ z=2QW|x^soQzS_TI*AW~5%gbt0nl$yTB3`m&9u|3K3rj19og>#T_}w#^<0hwf=$PHA zqmw)N+<}#!|9w)E{sVD*U;n}H&N$Ad1!ifD^o1YLjEj

From 89ee4244ffe9d2a17aedfd46e301932540d795eb Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 26 Feb 2013 17:21:25 -0800 Subject: [PATCH 41/64] Pass context directly --- js/id/modes/select.js | 3 +-- js/id/ui/inspector.js | 16 ++++------------ js/id/ui/preset.js | 12 ++---------- js/id/ui/preset/address.js | 9 +-------- js/id/ui/presetgrid.js | 11 +---------- js/id/ui/tageditor.js | 16 ++++------------ js/id/ui/taglist.js | 10 ++-------- test/spec/ui/inspector.js | 2 +- 8 files changed, 16 insertions(+), 63 deletions(-) diff --git a/js/id/modes/select.js b/js/id/modes/select.js index 93bb991c1..ee218c743 100644 --- a/js/id/modes/select.js +++ b/js/id/modes/select.js @@ -4,7 +4,7 @@ iD.modes.Select = function(context, selection, initial) { button: 'browse' }; - var inspector = iD.ui.Inspector().initial(!!initial), + var inspector = iD.ui.Inspector(context).initial(!!initial), keybinding = d3.keybinding('select'), timeout = null, behaviors = [ @@ -84,7 +84,6 @@ iD.modes.Select = function(context, selection, initial) { if (entity) { inspector - .context(context) .presetData(context.connection().presetData()); context.container() diff --git a/js/id/ui/inspector.js b/js/id/ui/inspector.js index b07f49814..8453de560 100644 --- a/js/id/ui/inspector.js +++ b/js/id/ui/inspector.js @@ -1,12 +1,11 @@ -iD.ui.Inspector = function() { +iD.ui.Inspector = function(context) { var event = d3.dispatch('changeTags', 'close', 'change'), presetData = iD.presetData(), initial = false, inspectorbody, entity, presetGrid, - tagEditor, - context; + tagEditor; function inspector(selection) { @@ -19,19 +18,17 @@ iD.ui.Inspector = function() { inspectorbody = selection.append('div') .attr('class', 'fillL'), - presetGrid = iD.ui.PresetGrid() + presetGrid = iD.ui.PresetGrid(context) .presetData(presetData) .entity(entity) - .context(context) .on('message', changeMessage) .on('choose', function(preset) { inspectorbody.call(tagEditor, preset); }); - tagEditor = iD.ui.TagEditor() + tagEditor = iD.ui.TagEditor(context) .presetData(presetData) .tags(entity.tags) - .context(context) .on('message', changeMessage) .on('changeTags', function() { event.changeTags(entity, inspector.tags()); @@ -74,10 +71,5 @@ iD.ui.Inspector = function() { return inspector; }; - inspector.context = function(_) { - context = _; - return inspector; - }; - return d3.rebind(inspector, event, 'on'); }; diff --git a/js/id/ui/preset.js b/js/id/ui/preset.js index 97b6ee9a3..eab66462b 100644 --- a/js/id/ui/preset.js +++ b/js/id/ui/preset.js @@ -1,7 +1,6 @@ -iD.ui.preset = function() { +iD.ui.preset = function(context) { var event = d3.dispatch('change', 'setTags'), taginfo = iD.taginfo(), - context, entity, type, hidden, @@ -151,8 +150,7 @@ iD.ui.preset = function() { if (d.type === 'address') { wrap.append('div') .attr('class', 'col9 preset-input', d) - .call(iD.ui.preset.address() - .context(context) + .call(iD.ui.preset.address(context) .on('change', key) .entity(entity)); } @@ -178,12 +176,6 @@ iD.ui.preset = function() { return clean(getTags()); }; - presets.context = function(_) { - if (!arguments.length) return context; - context = _; - return presets; - }; - presets.entity = function(_) { if (!arguments.length) return entity; entity = _; diff --git a/js/id/ui/preset/address.js b/js/id/ui/preset/address.js index 054d9647d..237694e38 100644 --- a/js/id/ui/preset/address.js +++ b/js/id/ui/preset/address.js @@ -1,7 +1,6 @@ -iD.ui.preset.address = function() { +iD.ui.preset.address = function(context) { var event = d3.dispatch('change'), - context, entity; function getStreets() { @@ -74,11 +73,5 @@ iD.ui.preset.address = function() { return address; }; - address.context = function(_) { - if (!arguments.length) return context; - context = _; - return address; - }; - return d3.rebind(address, event, 'on'); }; diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index a8d1e953f..77a836513 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -1,7 +1,6 @@ -iD.ui.PresetGrid = function() { +iD.ui.PresetGrid = function(context) { var event = d3.dispatch('choose', 'message'), entity, - context, presetData; function presetgrid(selection, preset) { @@ -171,19 +170,11 @@ iD.ui.PresetGrid = function() { return presetgrid; }; - presetgrid.context = function(_) { - if (!arguments.length) return context; - context = _; - return presetgrid; - }; - presetgrid.entity = function(_) { if (!arguments.length) return entity; entity = _; return presetgrid; }; - - return d3.rebind(presetgrid, event, 'on'); }; diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 6394efb9e..cfd64bd4a 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -1,4 +1,4 @@ -iD.ui.TagEditor = function() { +iD.ui.TagEditor = function(context) { var event = d3.dispatch('changeTags', 'choose', 'close', 'message'), presetData = iD.presetData(), entity, @@ -7,8 +7,7 @@ iD.ui.TagEditor = function() { presetMatch, selection_, presetUI, - tagList, - context; + tagList; function tageditor(selection, preset) { @@ -88,15 +87,13 @@ iD.ui.TagEditor = function() { event.changeTags(); }); - presetUI = iD.ui.preset() - .context(context) + presetUI = iD.ui.preset(context) .entity(entity) .on('change', function(tags) { event.changeTags(); }); - tagList = iD.ui.Taglist() - .context(context) + tagList = iD.ui.Taglist(context) .on('change', function(tags) { event.changeTags(); }); @@ -175,10 +172,5 @@ iD.ui.TagEditor = function() { return tageditor; }; - tageditor.context = function(_) { - context = _; - return tageditor; - }; - return d3.rebind(tageditor, event, 'on'); }; diff --git a/js/id/ui/taglist.js b/js/id/ui/taglist.js index 88f60f7e1..2ac6dc9af 100644 --- a/js/id/ui/taglist.js +++ b/js/id/ui/taglist.js @@ -1,10 +1,9 @@ -iD.ui.Taglist = function() { +iD.ui.Taglist = function(context) { var event = d3.dispatch('change'), taginfo = iD.taginfo(), initial = false, collapsebutton, - list, - context; + list; function taglist(selection, expanded) { @@ -271,10 +270,5 @@ iD.ui.Taglist = function() { } }; - taglist.context = function(_) { - context = _; - return taglist; - }; - return d3.rebind(taglist, event, 'on'); }; diff --git a/test/spec/ui/inspector.js b/test/spec/ui/inspector.js index f572d77e0..2b075cd07 100644 --- a/test/spec/ui/inspector.js +++ b/test/spec/ui/inspector.js @@ -4,7 +4,7 @@ describe("iD.ui.Inspector", function () { entity, graph, context; function render() { - inspector = iD.ui.Inspector().context(context); + inspector = iD.ui.Inspector(context); element = d3.select('body') .append('div') .attr('id', 'inspector-wrap') From 96c60311ad04996ef822d601cf91156dfb471298 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 12:04:05 -0500 Subject: [PATCH 42/64] Add preset descriptions via taginfo --- css/app.css | 7 +++++++ js/id/services/taginfo.js | 2 +- js/id/ui/presetgrid.js | 30 +++++++++++++++++++++++++----- 3 files changed, 33 insertions(+), 6 deletions(-) diff --git a/css/app.css b/css/app.css index dd151ef46..b039bfa03 100644 --- a/css/app.css +++ b/css/app.css @@ -785,6 +785,13 @@ div.combobox { position: absolute; bottom: 0px; right: 0px; + width: 20px; + height: 20px; + background: black; +} + +.grid-entry .preset-help:hover { + background: grey; } .preset-inspect { diff --git a/js/id/services/taginfo.js b/js/id/services/taginfo.js index 74e5dc311..feb3c650e 100644 --- a/js/id/services/taginfo.js +++ b/js/id/services/taginfo.js @@ -113,7 +113,7 @@ iD.taginfo = function() { taginfo.docs = function(parameters, callback) { var debounce = parameters.debounce; parameters = clean(setSort(parameters)); - request(endpoint + 'tag/wiki_pages?' + + request(endpoint + (parameters.value ? 'tag/wiki_pages?' : 'key/wiki_pages?') + iD.util.qsString(parameters), debounce, callback); }; diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index 77a836513..bc8f3dfd6 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -1,7 +1,8 @@ iD.ui.PresetGrid = function(context) { var event = d3.dispatch('choose', 'message'), entity, - presetData; + presetData, + taginfo = iD.taginfo(); function presetgrid(selection, preset) { @@ -109,9 +110,11 @@ iD.ui.PresetGrid = function(context) { var presetinspect; - entered.append('button') + entered.append('span').attr('class','label').text(name); + + entered.append('div') .attr('tabindex', -1) - .attr('class', 'preset-help minor') + .attr('class', 'preset-help') .on('click', function(d) { // Display description box inline @@ -138,12 +141,29 @@ iD.ui.PresetGrid = function(context) { .datum(d); presetinspect.append('h2').text(d.title || d.name); + + var description = presetinspect.append('p'); + var link = presetinspect.append('a'); + + var params = {}, + locale = iD.detect().locale.split('-')[0] || 'en'; + + params.key = Object.keys(d.match.tags)[0]; + if (d.match.tags[params.key] !== '*') { + params.value = d.match.tags[params.key]; + } + + taginfo.docs(params, function(err, data) { + var doc = _.find(data, function(d) { return d.lang === locale; }) || + _.find(data, function(d) { return d.lang === 'en'; }); + description.text(doc.description); + link.attr('href', 'http://wiki.openstreetmap.org/wiki/' + encodeURIComponent(doc.title)); + link.text(doc.title); + }); }) .append('span') .attr('class', 'icon inspect'); - entered.append('span').attr('class','label').text(name); - entries.exit().remove(); entries.order(); } From 5829438391b3af6e277d8cf1a8670f9eccb783ec Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 27 Feb 2013 12:13:59 -0500 Subject: [PATCH 43/64] Enable advanced uglify compression, remove unused variables --- Makefile | 2 +- js/id/oauth.js | 2 -- js/id/svg/labels.js | 6 +++--- js/id/svg/lines.js | 2 +- js/id/svg/member_classes.js | 2 +- js/id/ui/key_reference.js | 2 +- js/id/ui/lasso.js | 3 +-- js/id/ui/success.js | 4 ++-- js/id/ui/tageditor.js | 6 +++--- 9 files changed, 13 insertions(+), 16 deletions(-) diff --git a/Makefile b/Makefile index c88d095c1..5d0077846 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ iD.js: Makefile %.min.js: %.js Makefile @rm -f $@ - $(JS_COMPILER) $< -o $@ + $(JS_COMPILER) $< -c -m -o $@ clean: rm -f iD*.js diff --git a/js/id/oauth.js b/js/id/oauth.js index 9ed8eaa31..632dc60cd 100644 --- a/js/id/oauth.js +++ b/js/id/oauth.js @@ -4,8 +4,6 @@ iD.OAuth = function(context) { keys, oauth = {}; - function keyclean(x) { return x.replace(/\W/g, ''); } - function timenonce(o) { o.oauth_timestamp = ohauth.timestamp(); o.oauth_nonce = ohauth.nonce(); diff --git a/js/id/svg/labels.js b/js/id/svg/labels.js index 507f4cbdd..0636c49d6 100644 --- a/js/id/svg/labels.js +++ b/js/id/svg/labels.js @@ -80,9 +80,9 @@ iD.svg.Labels = function(projection) { .data(entities, iD.Entity.key) .attr({ 'startOffset': '50%', - 'xlink:href': function(d, i) { return '#halo-' + d.id; } + 'xlink:href': function(d) { return '#halo-' + d.id; } }) - .text(function(d, i) { return name(d); }); + .text(function(d) { return name(d); }); texts.exit().remove(); @@ -97,7 +97,7 @@ iD.svg.Labels = function(projection) { halos.enter() .append('path') .style('stroke-width', get(labels, 'font-size')) - .attr('id', function(d, i) { return 'halo-' + d.id; }) + .attr('id', function(d) { return 'halo-' + d.id; }) .attr('class', classes); halos.attr('d', get(labels, 'lineString')); diff --git a/js/id/svg/lines.js b/js/id/svg/lines.js index 59fec46e1..a94ad3a25 100644 --- a/js/id/svg/lines.js +++ b/js/id/svg/lines.js @@ -127,7 +127,7 @@ iD.svg.Lines = function(projection) { text.selectAll('.textpath') .filter(filter) - .attr('xlink:href', function(d, i) { return '#shadow-' + d.id; }) + .attr('xlink:href', function(d) { return '#shadow-' + d.id; }) .text(function(d) { // adding longer text than necessary, since overflow is hidden return (new Array(Math.floor(lengths[d.id] * 1.1))).join(arrowtext); diff --git a/js/id/svg/member_classes.js b/js/id/svg/member_classes.js index 713cc898e..1b4adf673 100644 --- a/js/id/svg/member_classes.js +++ b/js/id/svg/member_classes.js @@ -2,7 +2,7 @@ iD.svg.MemberClasses = function(graph) { var tagClassRe = /^member-?/; return function memberClassesSelection(selection) { - selection.each(function memberClassesEach(d, i) { + selection.each(function memberClassesEach(d) { var classes, value = this.className; if (value.baseVal !== undefined) value = value.baseVal; diff --git a/js/id/ui/key_reference.js b/js/id/ui/key_reference.js index 1c1515150..c5e2b206f 100644 --- a/js/id/ui/key_reference.js +++ b/js/id/ui/key_reference.js @@ -27,7 +27,7 @@ iD.ui.keyReference = function(selection) { .append('tr'); var cols = rows.selectAll('td') - .data(function(d, i) { + .data(function(d) { return [d.value, d.description || "", d.count]; }) .enter() diff --git a/js/id/ui/lasso.js b/js/id/ui/lasso.js index 3cfe02ac1..cbf6fe412 100644 --- a/js/id/ui/lasso.js +++ b/js/id/ui/lasso.js @@ -1,7 +1,6 @@ iD.ui.Lasso = function() { - var center, box, - group, + var box, group, a = [0, 0], b = [0, 0]; diff --git a/js/id/ui/success.js b/js/id/ui/success.js index 17a577fb3..4d4799ffd 100644 --- a/js/id/ui/success.js +++ b/js/id/ui/success.js @@ -19,7 +19,7 @@ iD.ui.Success = function(connection) { connection.changesetUrl(changeset.id); header.append('a') - .attr('href', function(d) { + .attr('href', function() { return connection.changesetUrl(changeset.id); }) .attr('target', '_blank') @@ -28,7 +28,7 @@ iD.ui.Success = function(connection) { header.append('a') .attr('target', '_blank') - .attr('href', function(d) { + .attr('href', function() { return 'https://twitter.com/intent/tweet?source=webclient&text=' + encodeURIComponent(message); }) diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index cfd64bd4a..6e88cf6b5 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -89,12 +89,12 @@ iD.ui.TagEditor = function(context) { presetUI = iD.ui.preset(context) .entity(entity) - .on('change', function(tags) { + .on('change', function() { event.changeTags(); }); tagList = iD.ui.Taglist(context) - .on('change', function(tags) { + .on('change', function() { event.changeTags(); }); @@ -120,7 +120,7 @@ iD.ui.TagEditor = function(context) { event.changeTags(); } - function apply(entity) { + function apply() { event.changeTags(); event.close(); } From 13b61cf75c385b6e502b0b1d9715024a0992a369 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 12:44:56 -0500 Subject: [PATCH 44/64] user icon to the left of name --- js/id/ui/commit.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/js/id/ui/commit.js b/js/id/ui/commit.js index da6fe5c02..f47575c58 100644 --- a/js/id/ui/commit.js +++ b/js/id/ui/commit.js @@ -46,18 +46,18 @@ iD.ui.Commit = function(context) { var userLink = d3.select(document.createElement('div')); - userLink.append('a') - .attr('class','user-info') - .text(user.display_name) - .attr('href', connection.url() + '/user/' + user.display_name) - .attr('target', '_blank'); - if (user.image_url) { userLink.append('img') .attr('src', user.image_url) .attr('class', 'icon icon-pre-text user-icon'); } + userLink.append('a') + .attr('class','user-info') + .text(user.display_name) + .attr('href', connection.url() + '/user/' + user.display_name) + .attr('target', '_blank'); + commentSection.append('p') .attr('class', 'commit-info') .html(t('commit.upload_explanation', {user: userLink.html()})); From c97ba3905d13a5792bacf16421a18631a28aeb7d Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 13:12:11 -0500 Subject: [PATCH 45/64] Only show tail after mousemove --- js/lib/d3.tail.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/js/lib/d3.tail.js b/js/lib/d3.tail.js index 08381c3f9..fce07b457 100644 --- a/js/lib/d3.tail.js +++ b/js/lib/d3.tail.js @@ -15,7 +15,9 @@ d3.tail = function() { function setup() { container = d3.select(document.body) - .append('div').attr('class', 'tail tooltip-inner'); + .append('div') + .style('display', 'none') + .attr('class', 'tail tooltip-inner'); selection .on('mousemove.tail', mousemove) @@ -31,6 +33,9 @@ d3.tail = function() { function mousemove() { if (text === false) return; + if (container.style('display') == 'none') { + container.style('display', 'block'); + } var xoffset = ((d3.event.clientX + tooltip_size[0] + xmargin) > selection_size[0]) ? -tooltip_size[0] - xmargin : xmargin; container.classed('left', xoffset > 0); @@ -59,8 +64,6 @@ d3.tail = function() { text = _; container.style('display', 'none'); return tail; - } else if (container.style('display') == 'none') { - container.style('display', 'block'); } text = _; container.text(text); From b22fd84421a22682ff6860d6fd87b102a2a30e52 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 13:21:59 -0500 Subject: [PATCH 46/64] Hide tooltip after clicking on geocoder, layers --- js/id/ui/geocoder.js | 6 +++--- js/id/ui/layerswitcher.js | 7 ++++--- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/js/id/ui/geocoder.js b/js/id/ui/geocoder.js index cc0ce205c..c8774fc6e 100644 --- a/js/id/ui/geocoder.js +++ b/js/id/ui/geocoder.js @@ -59,7 +59,7 @@ iD.ui.Geocoder = function(context) { } function hide() { setVisible(false); } - function toggle() { setVisible(gcForm.classed('hide')); } + function toggle() { tooltip.hide(button); setVisible(gcForm.classed('hide')); } function setVisible(show) { if (show !== shown) { @@ -71,13 +71,13 @@ iD.ui.Geocoder = function(context) { shown = show; } } + var tooltip = bootstrap.tooltip().placement('right'); var button = selection.append('button') .attr('tabindex', -1) .attr('title', t('geocoder.title')) .on('click', toggle) - .call(bootstrap.tooltip() - .placement('right')); + .call(tooltip); button.append('span') .attr('class', 'icon geocode'); diff --git a/js/id/ui/layerswitcher.js b/js/id/ui/layerswitcher.js index e0c66d9fb..5c6c57ff4 100644 --- a/js/id/ui/layerswitcher.js +++ b/js/id/ui/layerswitcher.js @@ -18,20 +18,21 @@ iD.ui.LayerSwitcher = function(context) { .append('div').attr('class', 'content fillD map-overlay hide'), shown = false; + var tooltip = bootstrap.tooltip().placement('right'); + var button = selection .append('button') .attr('tabindex', -1) .attr('class', 'fillD') .attr('title', t('layerswitcher.description')) .on('click.layerswitcher-toggle', toggle) - .call(bootstrap.tooltip() - .placement('right')); + .call(tooltip); button.append('span') .attr('class', 'layers icon'); function hide() { setVisible(false); } - function toggle() { setVisible(content.classed('hide')); } + function toggle() { tooltip.hide(button); setVisible(content.classed('hide')); } function setVisible(show) { if (show !== shown) { From cb58ab546d2381bb6df5dccb57413f670bcdfb8a Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 13:37:10 -0500 Subject: [PATCH 47/64] Handling checkbox with select inputs for now A plain checkbox won't properly handle indeterminate state. --- js/id/ui/preset.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/js/id/ui/preset.js b/js/id/ui/preset.js index eab66462b..50205f1fe 100644 --- a/js/id/ui/preset.js +++ b/js/id/ui/preset.js @@ -76,11 +76,6 @@ iD.ui.preset = function(context) { .attr('id', 'input-' + d.key) .attr('placeholder', 'http://example.com/'); break; - case 'check': - i = this.append('input') - .attr('type', 'checkbox') - .attr('id', 'input-' + d.key); - break; case 'select': wrap = this.append('span').attr('class', 'input-wrap-position'), i = wrap.append('input').attr('type', 'text'); From 252cddafe21b4491dfadf9299eb3494821ca67dd Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 13:59:05 -0500 Subject: [PATCH 48/64] user-select: none for map elements --- css/app.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/css/app.css b/css/app.css index b039bfa03..5948a52c5 100644 --- a/css/app.css +++ b/css/app.css @@ -1128,6 +1128,10 @@ img.tile { -webkit-transform-origin:0 0; -moz-transform-origin:0 0; -o-transform-origin:0 0; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } #surface { From 358b31389c1b29993d8a067ee3870f4797e63dba Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 14:47:54 -0500 Subject: [PATCH 49/64] Fix tail flipping --- js/lib/d3.tail.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/js/lib/d3.tail.js b/js/lib/d3.tail.js index fce07b457..225892e30 100644 --- a/js/lib/d3.tail.js +++ b/js/lib/d3.tail.js @@ -31,11 +31,14 @@ d3.tail = function() { } + function show() { + container.style('display', 'block'); + tooltip_size = container.size(); + } + function mousemove() { if (text === false) return; - if (container.style('display') == 'none') { - container.style('display', 'block'); - } + if (container.style('display') === 'none') show(); var xoffset = ((d3.event.clientX + tooltip_size[0] + xmargin) > selection_size[0]) ? -tooltip_size[0] - xmargin : xmargin; container.classed('left', xoffset > 0); @@ -51,7 +54,7 @@ d3.tail = function() { function mouseover() { if (d3.event.relatedTarget !== container.node() && - text !== false) container.style('display', 'block'); + text !== false) show(); } if (!container) setup(); From 0558741472e0816031b0b78534f75d2ea653ca84 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 14:50:21 -0500 Subject: [PATCH 50/64] Fix adding name to entities --- js/id/ui/tageditor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 6e88cf6b5..639e4434e 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -82,7 +82,7 @@ iD.ui.TagEditor = function(context) { .attr('placeholder', 'unknown') .attr('class', 'major') .attr('type', 'text') - .property('value', entity.tags.name) + .property('value', entity.tags.name || '') .on('blur', function() { event.changeTags(); }); From d351f74a94aeee85dfe25be70ea8ea3e76f25db7 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 14:57:07 -0500 Subject: [PATCH 51/64] Undos during drag now redoable --- js/id/behavior/drag_node.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/id/behavior/drag_node.js b/js/id/behavior/drag_node.js index c16ede85f..e8749927f 100644 --- a/js/id/behavior/drag_node.js +++ b/js/id/behavior/drag_node.js @@ -98,7 +98,8 @@ iD.behavior.DragNode = function(context) { } } - context.replace(iD.actions.MoveNode(entity.id, loc)); + context.replace(iD.actions.MoveNode(entity.id, loc), + t('operations.move.annotation.' + entity.geometry(context.graph()))); } function end(entity) { From ce0122921b8238a62785f197ae2bef324671e331 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 15:44:35 -0500 Subject: [PATCH 52/64] merge d3.geo.tile changes from upstream --- js/lib/d3.geo.tile.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/js/lib/d3.geo.tile.js b/js/lib/d3.geo.tile.js index 7e47134a6..2761deb61 100644 --- a/js/lib/d3.geo.tile.js +++ b/js/lib/d3.geo.tile.js @@ -2,7 +2,8 @@ d3.geo.tile = function() { var size = [960, 500], scale = 256, scaleExtent = [0, 20], - translate = [size[0] / 2, size[1] / 2]; + translate = [size[0] / 2, size[1] / 2], + zoomDelta = 0; function bound(_) { return Math.min(scaleExtent[1], Math.max(scaleExtent[0], _)); @@ -10,7 +11,7 @@ d3.geo.tile = function() { function tile() { var z = Math.max(Math.log(scale) / Math.LN2 - 8, 0), - z0 = bound(z | 0), + z0 = bound(Math.round(z + zoomDelta)), k = Math.pow(2, z - z0 + 8), origin = [(translate[0] - scale / 2) / k, (translate[1] - scale / 2) / k], tiles = [], @@ -53,5 +54,11 @@ d3.geo.tile = function() { return tile; }; + tile.zoomDelta = function(_) { + if (!arguments.length) return zoomDelta; + zoomDelta = +_; + return tile; + }; + return tile; }; From 6d01e3e30e154429e63adfad9d29a3502a626421 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 27 Feb 2013 17:24:43 -0500 Subject: [PATCH 53/64] Update d3, use custom d3 with stripped layout and dsv modules --- js/lib/d3.v3.js | 1560 +++-------------------------------------------- 1 file changed, 76 insertions(+), 1484 deletions(-) diff --git a/js/lib/d3.v3.js b/js/lib/d3.v3.js index 818bab9dc..77d662c10 100644 --- a/js/lib/d3.v3.js +++ b/js/lib/d3.v3.js @@ -1,26 +1,25 @@ -(function() { - var d3_format_decimalPoint = ".", d3_format_thousandsSeparator = ",", d3_format_grouping = [ 3, 3 ]; - if (!Date.now) Date.now = function() { - return +new Date(); - }; - try { - document.createElement("div").style.setProperty("opacity", 0, ""); - } catch (error) { - var d3_style_prototype = CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; - d3_style_prototype.setProperty = function(name, value, priority) { - d3_style_setProperty.call(this, name, value + "", priority); - }; - } - d3 = { - version: "3.0.5" - }; - var π = Math.PI, ε = 1e-6, d3_radians = π / 180, d3_degrees = 180 / π; +d3 = function() { + var π = Math.PI, ε = 1e-6, d3 = { + version: "3.0.6" + }, d3_radians = π / 180, d3_degrees = 180 / π, d3_document = document, d3_window = window; function d3_target(d) { return d.target; } function d3_source(d) { return d.source; } + var d3_format_decimalPoint = ".", d3_format_thousandsSeparator = ",", d3_format_grouping = [ 3, 3 ]; + if (!Date.now) Date.now = function() { + return +new Date(); + }; + try { + d3_document.createElement("div").style.setProperty("opacity", 0, ""); + } catch (error) { + var d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty; + d3_style_prototype.setProperty = function(name, value, priority) { + d3_style_setProperty.call(this, name, value + "", priority); + }; + } function d3_class(ctor, properties) { try { for (var key in properties) { @@ -43,7 +42,7 @@ return Array.prototype.slice.call(pseudoarray); } try { - d3_array(document.documentElement.childNodes)[0].nodeType; + d3_array(d3_document.documentElement.childNodes)[0].nodeType; } catch (e) { d3_array = d3_arrayCopy; } @@ -202,13 +201,10 @@ return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r); }; }, - logNormal: function(µ, σ) { - var n = arguments.length; - if (n < 2) σ = 1; - if (n < 1) µ = 0; - var random = d3.random.normal(); + logNormal: function() { + var random = d3.random.normal.apply(d3, arguments); return function() { - return Math.exp(µ + σ * random()); + return Math.exp(random()); }; }, irwinHall: function(m) { @@ -395,7 +391,7 @@ return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x); }; d3.xhr = function(url, mimeType, callback) { - var xhr = {}, dispatch = d3.dispatch("progress", "load", "error"), headers = {}, response = d3_identity, request = new (window.XDomainRequest && /^(http(s)?:)?\/\//.test(url) ? XDomainRequest : XMLHttpRequest)(); + var xhr = {}, dispatch = d3.dispatch("progress", "load", "error"), headers = {}, response = d3_identity, request = new (d3_window.XDomainRequest && /^(http(s)?:)?\/\//.test(url) ? XDomainRequest : XMLHttpRequest)(); "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() { request.readyState > 3 && respond(); }; @@ -474,8 +470,8 @@ return d3.xhr(url, "text/html", callback).response(d3_html); }; function d3_html(request) { - var range = document.createRange(); - range.selectNode(document.body); + var range = d3_document.createRange(); + range.selectNode(d3_document.body); return range.createContextualFragment(request.responseText); } d3.xml = function() { @@ -634,11 +630,11 @@ return x.toFixed(p); }, r: function(x, p) { - return d3.round(x, p = d3_format_precision(x, p)).toFixed(Math.max(0, Math.min(20, p))); + return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p)))); } }); function d3_format_precision(x, p) { - return p - (x ? 1 + Math.floor(Math.log(x + Math.pow(10, 1 + Math.floor(Math.log(x) / Math.LN10) - p)) / Math.LN10) : 1); + return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1); } function d3_format_typeDefault(x) { return x + ""; @@ -656,7 +652,7 @@ return t.reverse().join(d3_format_thousandsSeparator || "") + f; }; } - var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "μ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); + var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix); d3.formatPrefix = function(value, precision) { var i = 0; if (value) { @@ -805,7 +801,7 @@ return dispatch; } d3.transform = function(string) { - var g = document.createElementNS(d3.ns.prefix.svg, "g"); + var g = d3_document.createElementNS(d3.ns.prefix.svg, "g"); return (d3.transform = function(string) { g.setAttribute("transform", string); var t = g.transform.baseVal.consolidate(); @@ -1440,7 +1436,7 @@ return n.querySelector(s); }, d3_selectAll = function(s, n) { return n.querySelectorAll(s); - }, d3_selectRoot = document.documentElement, d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector, d3_selectMatches = function(n, s) { + }, d3_selectRoot = d3_document.documentElement, d3_selectMatcher = d3_selectRoot.matchesSelector || d3_selectRoot.webkitMatchesSelector || d3_selectRoot.mozMatchesSelector || d3_selectRoot.msMatchesSelector || d3_selectRoot.oMatchesSelector, d3_selectMatches = function(n, s) { return d3_selectMatcher.call(n, s); }; if (typeof Sizzle === "function") { @@ -1592,7 +1588,7 @@ for (priority in name) this.each(d3_selection_style(priority, name[priority], value)); return this; } - if (n < 2) return getComputedStyle(this.node(), null).getPropertyValue(name); + if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name); priority = ""; } return this.each(d3_selection_style(name, value, priority)); @@ -1654,20 +1650,20 @@ d3_selectionPrototype.append = function(name) { name = d3.ns.qualify(name); function append() { - return this.appendChild(document.createElementNS(this.namespaceURI, name)); + return this.appendChild(d3_document.createElementNS(this.namespaceURI, name)); } function appendNS() { - return this.appendChild(document.createElementNS(name.space, name.local)); + return this.appendChild(d3_document.createElementNS(name.space, name.local)); } return this.select(name.local ? appendNS : append); }; d3_selectionPrototype.insert = function(name, before) { name = d3.ns.qualify(name); function insert() { - return this.insertBefore(document.createElementNS(this.namespaceURI, name), d3_select(before, this)); + return this.insertBefore(d3_document.createElementNS(this.namespaceURI, name), d3_select(before, this)); } function insertNS() { - return this.insertBefore(document.createElementNS(name.space, name.local), d3_select(before, this)); + return this.insertBefore(d3_document.createElementNS(name.space, name.local), d3_select(before, this)); } return this.select(name.local ? insertNS : insert); }; @@ -1805,7 +1801,7 @@ function d3_selection_sortComparator(comparator) { if (!arguments.length) comparator = d3.ascending; return function(a, b) { - return comparator(a && a.__data__, b && b.__data__); + return !a - !b || comparator(a.__data__, b.__data__); }; } d3_selectionPrototype.on = function(type, listener, capture) { @@ -1891,7 +1887,7 @@ } return d3_transition(subgroups, id); }; - var d3_selectionRoot = d3_selection([ [ document ] ]); + var d3_selectionRoot = d3_selection([ [ d3_document ] ]); d3_selectionRoot[0].parentNode = d3_selectRoot; d3.select = function(selector) { return typeof selector === "string" ? d3_selectionRoot.select(selector) : d3_selection([ [ selector ] ]); @@ -2103,7 +2099,7 @@ } return d3_transition_tween(this, "style." + name, value, function(b) { function styleString() { - var a = getComputedStyle(this, null).getPropertyValue(name), i; + var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i; return a !== b && (i = interpolate(a, b), function(t) { this.style.setProperty(name, i(t), priority); }); @@ -2114,7 +2110,7 @@ d3_transitionPrototype.styleTween = function(name, tween, priority) { if (arguments.length < 3) priority = ""; return this.tween("style." + name, function(d, i) { - var f = tween.call(this, d, i, getComputedStyle(this, null).getPropertyValue(name)); + var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name)); return f && function(t) { this.style.setProperty(name, f(t), priority); }; @@ -2272,19 +2268,19 @@ } return then; } - var d3_timer_frame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { + var d3_timer_frame = d3_window.requestAnimationFrame || d3_window.webkitRequestAnimationFrame || d3_window.mozRequestAnimationFrame || d3_window.oRequestAnimationFrame || d3_window.msRequestAnimationFrame || function(callback) { setTimeout(callback, 17); }; d3.mouse = function(container) { return d3_mousePoint(container, d3_eventSource()); }; - var d3_mouse_bug44083 = /WebKit/.test(navigator.userAgent) ? -1 : 0; + var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0; function d3_mousePoint(container, e) { var svg = container.ownerSVGElement || container; if (svg.createSVGPoint) { var point = svg.createSVGPoint(); - if (d3_mouse_bug44083 < 0 && (window.scrollX || window.scrollY)) { - svg = d3.select(document.body).append("svg").style("position", "absolute").style("top", 0).style("left", 0); + if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) { + svg = d3.select(d3_document.body).append("svg").style("position", "absolute").style("top", 0).style("left", 0); var ctm = svg[0][0].getScreenCTM(); d3_mouse_bug44083 = !(ctm.f || ctm.e); svg.remove(); @@ -3317,18 +3313,18 @@ d3.svg.symbolTypes = d3_svg_symbols.keys(); var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians); d3.svg.axis = function() { - var scale = d3.scale.linear(), orient = "bottom", tickMajorSize = 6, tickMinorSize = 6, tickEndSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_, tickSubdivide = 0; + var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, tickMajorSize = 6, tickMinorSize = 6, tickEndSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_, tickSubdivide = 0; function axis(g) { g.each(function() { var g = d3.select(this); var ticks = tickValues == null ? scale.ticks ? scale.ticks.apply(scale, tickArguments_) : scale.domain() : tickValues, tickFormat = tickFormat_ == null ? scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments_) : String : tickFormat_; - var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), subtick = g.selectAll(".minor").data(subticks, String), subtickEnter = subtick.enter().insert("line", "g").attr("class", "tick minor").style("opacity", 1e-6), subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(), subtickUpdate = d3.transition(subtick).style("opacity", 1); - var tick = g.selectAll("g").data(ticks, String), tickEnter = tick.enter().insert("g", "path").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform; - var range = d3_scaleRange(scale), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = d3.transition(path); + var subticks = d3_svg_axisSubdivide(scale, ticks, tickSubdivide), subtick = g.selectAll(".tick.minor").data(subticks, String), subtickEnter = subtick.enter().insert("line", ".tick").attr("class", "tick minor").style("opacity", 1e-6), subtickExit = d3.transition(subtick.exit()).style("opacity", 1e-6).remove(), subtickUpdate = d3.transition(subtick).style("opacity", 1); + var tick = g.selectAll(".tick.major").data(ticks, String), tickEnter = tick.enter().insert("g", "path").attr("class", "tick major").style("opacity", 1e-6), tickExit = d3.transition(tick.exit()).style("opacity", 1e-6).remove(), tickUpdate = d3.transition(tick).style("opacity", 1), tickTransform; + var range = d3_scaleRange(scale), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"), + d3.transition(path)); var scale1 = scale.copy(), scale0 = this.__chart__ || scale1; this.__chart__ = scale1; - path.enter().append("path").attr("class", "domain"); - tickEnter.append("line").attr("class", "tick"); + tickEnter.append("line"); tickEnter.append("text"); var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"); switch (orient) { @@ -3411,7 +3407,7 @@ }; axis.orient = function(x) { if (!arguments.length) return orient; - orient = x; + orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient; return axis; }; axis.ticks = function() { @@ -3449,6 +3445,12 @@ }; return axis; }; + var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = { + top: 1, + right: 1, + bottom: 1, + left: 1 + }; function d3_svg_axisX(selection, x) { selection.attr("transform", function(d) { return "translate(" + x(d) + ",0)"; @@ -3523,7 +3525,7 @@ } function brushstart() { var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), center, origin = mouse(), offset; - var w = d3.select(window).on("mousemove.brush", brushmove).on("mouseup.brush", brushend).on("touchmove.brush", brushmove).on("touchend.brush", brushend).on("keydown.brush", keydown).on("keyup.brush", keyup); + var w = d3.select(d3_window).on("mousemove.brush", brushmove).on("mouseup.brush", brushend).on("touchmove.brush", brushmove).on("touchend.brush", brushend).on("keydown.brush", keydown).on("keyup.brush", keyup); if (dragging) { origin[0] = extent[0][0] - origin[0]; origin[1] = extent[0][1] - origin[1]; @@ -3710,7 +3712,7 @@ } function mousedown() { var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null, offset, origin_ = point(), moved = 0; - var w = d3.select(window).on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", dragmove).on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", dragend, true); + var w = d3.select(d3_window).on(touchId != null ? "touchmove.drag-" + touchId : "mousemove.drag", dragmove).on(touchId != null ? "touchend.drag-" + touchId : "mouseup.drag", dragend, true); if (origin) { offset = origin.apply(target, arguments); offset = [ offset.x - origin_[0], offset.y - origin_[1] ]; @@ -3833,8 +3835,8 @@ }); } function mousedown() { - var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, moved = 0, w = d3.select(window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup), l = location(d3.mouse(target)); - window.focus(); + var target = this, event_ = event.of(target, arguments), eventTarget = d3.event.target, moved = 0, w = d3.select(d3_window).on("mousemove.zoom", mousemove).on("mouseup.zoom", mouseup), l = location(d3.mouse(target)); + d3_window.focus(); d3_eventCancel(); function mousemove() { moved = 1; @@ -3906,1416 +3908,6 @@ }, "mousewheel") : (d3_behavior_zoomDelta = function() { return -d3.event.detail; }, "MozMousePixelScroll"); - d3.layout = {}; - d3.layout.bundle = function() { - return function(links) { - var paths = [], i = -1, n = links.length; - while (++i < n) paths.push(d3_layout_bundlePath(links[i])); - return paths; - }; - }; - function d3_layout_bundlePath(link) { - var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ]; - while (start !== lca) { - start = start.parent; - points.push(start); - } - var k = points.length; - while (end !== lca) { - points.splice(k, 0, end); - end = end.parent; - } - return points; - } - function d3_layout_bundleAncestors(node) { - var ancestors = [], parent = node.parent; - while (parent != null) { - ancestors.push(node); - node = parent; - parent = parent.parent; - } - ancestors.push(node); - return ancestors; - } - function d3_layout_bundleLeastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null; - while (aNode === bNode) { - sharedNode = aNode; - aNode = aNodes.pop(); - bNode = bNodes.pop(); - } - return sharedNode; - } - d3.layout.chord = function() { - var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords; - function relayout() { - var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j; - chords = []; - groups = []; - k = 0, i = -1; - while (++i < n) { - x = 0, j = -1; - while (++j < n) { - x += matrix[i][j]; - } - groupSums.push(x); - subgroupIndex.push(d3.range(n)); - k += x; - } - if (sortGroups) { - groupIndex.sort(function(a, b) { - return sortGroups(groupSums[a], groupSums[b]); - }); - } - if (sortSubgroups) { - subgroupIndex.forEach(function(d, i) { - d.sort(function(a, b) { - return sortSubgroups(matrix[i][a], matrix[i][b]); - }); - }); - } - k = (2 * π - padding * n) / k; - x = 0, i = -1; - while (++i < n) { - x0 = x, j = -1; - while (++j < n) { - var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k; - subgroups[di + "-" + dj] = { - index: di, - subindex: dj, - startAngle: a0, - endAngle: a1, - value: v - }; - } - groups[di] = { - index: di, - startAngle: x0, - endAngle: x, - value: (x - x0) / k - }; - x += padding; - } - i = -1; - while (++i < n) { - j = i - 1; - while (++j < n) { - var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i]; - if (source.value || target.value) { - chords.push(source.value < target.value ? { - source: target, - target: source - } : { - source: source, - target: target - }); - } - } - } - if (sortChords) resort(); - } - function resort() { - chords.sort(function(a, b) { - return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2); - }); - } - chord.matrix = function(x) { - if (!arguments.length) return matrix; - n = (matrix = x) && matrix.length; - chords = groups = null; - return chord; - }; - chord.padding = function(x) { - if (!arguments.length) return padding; - padding = x; - chords = groups = null; - return chord; - }; - chord.sortGroups = function(x) { - if (!arguments.length) return sortGroups; - sortGroups = x; - chords = groups = null; - return chord; - }; - chord.sortSubgroups = function(x) { - if (!arguments.length) return sortSubgroups; - sortSubgroups = x; - chords = null; - return chord; - }; - chord.sortChords = function(x) { - if (!arguments.length) return sortChords; - sortChords = x; - if (chords) resort(); - return chord; - }; - chord.chords = function() { - if (!chords) relayout(); - return chords; - }; - chord.groups = function() { - if (!groups) relayout(); - return groups; - }; - return chord; - }; - d3.layout.force = function() { - var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, gravity = .1, theta = .8, nodes = [], links = [], distances, strengths, charges; - function repulse(node) { - return function(quad, x1, _, x2) { - if (quad.point !== node) { - var dx = quad.cx - node.x, dy = quad.cy - node.y, dn = 1 / Math.sqrt(dx * dx + dy * dy); - if ((x2 - x1) * dn < theta) { - var k = quad.charge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - return true; - } - if (quad.point && isFinite(dn)) { - var k = quad.pointCharge * dn * dn; - node.px -= dx * k; - node.py -= dy * k; - } - } - return !quad.charge; - }; - } - force.tick = function() { - if ((alpha *= .99) < .005) { - event.end({ - type: "end", - alpha: alpha = 0 - }); - return true; - } - var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y; - for (i = 0; i < m; ++i) { - o = links[i]; - s = o.source; - t = o.target; - x = t.x - s.x; - y = t.y - s.y; - if (l = x * x + y * y) { - l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l; - x *= l; - y *= l; - t.x -= x * (k = s.weight / (t.weight + s.weight)); - t.y -= y * k; - s.x += x * (k = 1 - k); - s.y += y * k; - } - } - if (k = alpha * gravity) { - x = size[0] / 2; - y = size[1] / 2; - i = -1; - if (k) while (++i < n) { - o = nodes[i]; - o.x += (x - o.x) * k; - o.y += (y - o.y) * k; - } - } - if (charge) { - d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges); - i = -1; - while (++i < n) { - if (!(o = nodes[i]).fixed) { - q.visit(repulse(o)); - } - } - } - i = -1; - while (++i < n) { - o = nodes[i]; - if (o.fixed) { - o.x = o.px; - o.y = o.py; - } else { - o.x -= (o.px - (o.px = o.x)) * friction; - o.y -= (o.py - (o.py = o.y)) * friction; - } - } - event.tick({ - type: "tick", - alpha: alpha - }); - }; - force.nodes = function(x) { - if (!arguments.length) return nodes; - nodes = x; - return force; - }; - force.links = function(x) { - if (!arguments.length) return links; - links = x; - return force; - }; - force.size = function(x) { - if (!arguments.length) return size; - size = x; - return force; - }; - force.linkDistance = function(x) { - if (!arguments.length) return linkDistance; - linkDistance = d3_functor(x); - return force; - }; - force.distance = force.linkDistance; - force.linkStrength = function(x) { - if (!arguments.length) return linkStrength; - linkStrength = d3_functor(x); - return force; - }; - force.friction = function(x) { - if (!arguments.length) return friction; - friction = x; - return force; - }; - force.charge = function(x) { - if (!arguments.length) return charge; - charge = typeof x === "function" ? x : +x; - return force; - }; - force.gravity = function(x) { - if (!arguments.length) return gravity; - gravity = x; - return force; - }; - force.theta = function(x) { - if (!arguments.length) return theta; - theta = x; - return force; - }; - force.alpha = function(x) { - if (!arguments.length) return alpha; - if (alpha) { - if (x > 0) alpha = x; else alpha = 0; - } else if (x > 0) { - event.start({ - type: "start", - alpha: alpha = x - }); - d3.timer(force.tick); - } - return force; - }; - force.start = function() { - var i, j, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o; - for (i = 0; i < n; ++i) { - (o = nodes[i]).index = i; - o.weight = 0; - } - distances = []; - strengths = []; - for (i = 0; i < m; ++i) { - o = links[i]; - if (typeof o.source == "number") o.source = nodes[o.source]; - if (typeof o.target == "number") o.target = nodes[o.target]; - distances[i] = linkDistance.call(this, o, i); - strengths[i] = linkStrength.call(this, o, i); - ++o.source.weight; - ++o.target.weight; - } - for (i = 0; i < n; ++i) { - o = nodes[i]; - if (isNaN(o.x)) o.x = position("x", w); - if (isNaN(o.y)) o.y = position("y", h); - if (isNaN(o.px)) o.px = o.x; - if (isNaN(o.py)) o.py = o.y; - } - charges = []; - if (typeof charge === "function") { - for (i = 0; i < n; ++i) { - charges[i] = +charge.call(this, nodes[i], i); - } - } else { - for (i = 0; i < n; ++i) { - charges[i] = charge; - } - } - function position(dimension, size) { - var neighbors = neighbor(i), j = -1, m = neighbors.length, x; - while (++j < m) if (!isNaN(x = neighbors[j][dimension])) return x; - return Math.random() * size; - } - function neighbor() { - if (!neighbors) { - neighbors = []; - for (j = 0; j < n; ++j) { - neighbors[j] = []; - } - for (j = 0; j < m; ++j) { - var o = links[j]; - neighbors[o.source.index].push(o.target); - neighbors[o.target.index].push(o.source); - } - } - return neighbors[i]; - } - return force.resume(); - }; - force.resume = function() { - return force.alpha(.1); - }; - force.stop = function() { - return force.alpha(0); - }; - force.drag = function() { - if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart", d3_layout_forceDragstart).on("drag", dragmove).on("dragend", d3_layout_forceDragend); - this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag); - }; - function dragmove(d) { - d.px = d3.event.x, d.py = d3.event.y; - force.resume(); - } - return d3.rebind(force, event, "on"); - }; - function d3_layout_forceDragstart(d) { - d.fixed |= 2; - } - function d3_layout_forceDragend(d) { - d.fixed &= 1; - } - function d3_layout_forceMouseover(d) { - d.fixed |= 4; - d.px = d.x, d.py = d.y; - } - function d3_layout_forceMouseout(d) { - d.fixed &= 3; - } - function d3_layout_forceAccumulate(quad, alpha, charges) { - var cx = 0, cy = 0; - quad.charge = 0; - if (!quad.leaf) { - var nodes = quad.nodes, n = nodes.length, i = -1, c; - while (++i < n) { - c = nodes[i]; - if (c == null) continue; - d3_layout_forceAccumulate(c, alpha, charges); - quad.charge += c.charge; - cx += c.charge * c.cx; - cy += c.charge * c.cy; - } - } - if (quad.point) { - if (!quad.leaf) { - quad.point.x += Math.random() - .5; - quad.point.y += Math.random() - .5; - } - var k = alpha * charges[quad.point.index]; - quad.charge += quad.pointCharge = k; - cx += k * quad.point.x; - cy += k * quad.point.y; - } - quad.cx = cx / quad.charge; - quad.cy = cy / quad.charge; - } - function d3_layout_forceLinkDistance() { - return 20; - } - function d3_layout_forceLinkStrength() { - return 1; - } - d3.layout.partition = function() { - var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ]; - function position(node, x, dx, dy) { - var children = node.children; - node.x = x; - node.y = node.depth * dy; - node.dx = dx; - node.dy = dy; - if (children && (n = children.length)) { - var i = -1, n, c, d; - dx = node.value ? dx / node.value : 0; - while (++i < n) { - position(c = children[i], x, d = c.value * dx, dy); - x += d; - } - } - } - function depth(node) { - var children = node.children, d = 0; - if (children && (n = children.length)) { - var i = -1, n; - while (++i < n) d = Math.max(d, depth(children[i])); - } - return 1 + d; - } - function partition(d, i) { - var nodes = hierarchy.call(this, d, i); - position(nodes[0], 0, size[0], size[1] / depth(nodes[0])); - return nodes; - } - partition.size = function(x) { - if (!arguments.length) return size; - size = x; - return partition; - }; - return d3_layout_hierarchyRebind(partition, hierarchy); - }; - d3.layout.pie = function() { - var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = 2 * π; - function pie(data) { - var values = data.map(function(d, i) { - return +value.call(pie, d, i); - }); - var a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle); - var k = ((typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - startAngle) / d3.sum(values); - var index = d3.range(data.length); - if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) { - return values[j] - values[i]; - } : function(i, j) { - return sort(data[i], data[j]); - }); - var arcs = []; - index.forEach(function(i) { - var d; - arcs[i] = { - data: data[i], - value: d = values[i], - startAngle: a, - endAngle: a += d * k - }; - }); - return arcs; - } - pie.value = function(x) { - if (!arguments.length) return value; - value = x; - return pie; - }; - pie.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return pie; - }; - pie.startAngle = function(x) { - if (!arguments.length) return startAngle; - startAngle = x; - return pie; - }; - pie.endAngle = function(x) { - if (!arguments.length) return endAngle; - endAngle = x; - return pie; - }; - return pie; - }; - var d3_layout_pieSortByValue = {}; - d3.layout.stack = function() { - var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY; - function stack(data, index) { - var series = data.map(function(d, i) { - return values.call(stack, d, i); - }); - var points = series.map(function(d) { - return d.map(function(v, i) { - return [ x.call(stack, v, i), y.call(stack, v, i) ]; - }); - }); - var orders = order.call(stack, points, index); - series = d3.permute(series, orders); - points = d3.permute(points, orders); - var offsets = offset.call(stack, points, index); - var n = series.length, m = series[0].length, i, j, o; - for (j = 0; j < m; ++j) { - out.call(stack, series[0][j], o = offsets[j], points[0][j][1]); - for (i = 1; i < n; ++i) { - out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]); - } - } - return data; - } - stack.values = function(x) { - if (!arguments.length) return values; - values = x; - return stack; - }; - stack.order = function(x) { - if (!arguments.length) return order; - order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault; - return stack; - }; - stack.offset = function(x) { - if (!arguments.length) return offset; - offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero; - return stack; - }; - stack.x = function(z) { - if (!arguments.length) return x; - x = z; - return stack; - }; - stack.y = function(z) { - if (!arguments.length) return y; - y = z; - return stack; - }; - stack.out = function(z) { - if (!arguments.length) return out; - out = z; - return stack; - }; - return stack; - }; - function d3_layout_stackX(d) { - return d.x; - } - function d3_layout_stackY(d) { - return d.y; - } - function d3_layout_stackOut(d, y0, y) { - d.y0 = y0; - d.y = y; - } - var d3_layout_stackOrders = d3.map({ - "inside-out": function(data) { - var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) { - return max[a] - max[b]; - }), top = 0, bottom = 0, tops = [], bottoms = []; - for (i = 0; i < n; ++i) { - j = index[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); - } - } - return bottoms.reverse().concat(tops); - }, - reverse: function(data) { - return d3.range(data.length).reverse(); - }, - "default": d3_layout_stackOrderDefault - }); - var d3_layout_stackOffsets = d3.map({ - silhouette: function(data) { - var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o > max) max = o; - sums.push(o); - } - for (j = 0; j < m; ++j) { - y0[j] = (max - sums[j]) / 2; - } - return y0; - }, - wiggle: function(data) { - var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = []; - y0[0] = o = o0 = 0; - for (j = 1; j < m; ++j) { - for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1]; - for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) { - for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) { - s3 += (data[k][j][1] - data[k][j - 1][1]) / dx; - } - s2 += s3 * data[i][j][1]; - } - y0[j] = o -= s1 ? s2 / s1 * dx : 0; - if (o < o0) o0 = o; - } - for (j = 0; j < m; ++j) y0[j] -= o0; - return y0; - }, - expand: function(data) { - var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = []; - for (j = 0; j < m; ++j) { - for (i = 0, o = 0; i < n; i++) o += data[i][j][1]; - if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k; - } - for (j = 0; j < m; ++j) y0[j] = 0; - return y0; - }, - zero: d3_layout_stackOffsetZero - }); - function d3_layout_stackOrderDefault(data) { - return d3.range(data.length); - } - function d3_layout_stackOffsetZero(data) { - var j = -1, m = data[0].length, y0 = []; - while (++j < m) y0[j] = 0; - return y0; - } - function d3_layout_stackMaxIndex(array) { - var i = 1, j = 0, v = array[0][1], k, n = array.length; - for (;i < n; ++i) { - if ((k = array[i][1]) > v) { - j = i; - v = k; - } - } - return j; - } - function d3_layout_stackReduceSum(d) { - return d.reduce(d3_layout_stackSum, 0); - } - function d3_layout_stackSum(p, d) { - return p + d[1]; - } - d3.layout.histogram = function() { - var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges; - function histogram(data, i) { - var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x; - while (++i < m) { - bin = bins[i] = []; - bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]); - bin.y = 0; - } - if (m > 0) { - i = -1; - while (++i < n) { - x = values[i]; - if (x >= range[0] && x <= range[1]) { - bin = bins[d3.bisect(thresholds, x, 1, m) - 1]; - bin.y += k; - bin.push(data[i]); - } - } - } - return bins; - } - histogram.value = function(x) { - if (!arguments.length) return valuer; - valuer = x; - return histogram; - }; - histogram.range = function(x) { - if (!arguments.length) return ranger; - ranger = d3_functor(x); - return histogram; - }; - histogram.bins = function(x) { - if (!arguments.length) return binner; - binner = typeof x === "number" ? function(range) { - return d3_layout_histogramBinFixed(range, x); - } : d3_functor(x); - return histogram; - }; - histogram.frequency = function(x) { - if (!arguments.length) return frequency; - frequency = !!x; - return histogram; - }; - return histogram; - }; - function d3_layout_histogramBinSturges(range, values) { - return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1)); - } - function d3_layout_histogramBinFixed(range, n) { - var x = -1, b = +range[0], m = (range[1] - b) / n, f = []; - while (++x <= n) f[x] = m * x + b; - return f; - } - function d3_layout_histogramRange(values) { - return [ d3.min(values), d3.max(values) ]; - } - d3.layout.hierarchy = function() { - var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue; - function recurse(node, depth, nodes) { - var childs = children.call(hierarchy, node, depth); - node.depth = depth; - nodes.push(node); - if (childs && (n = childs.length)) { - var i = -1, n, c = node.children = [], v = 0, j = depth + 1, d; - while (++i < n) { - d = recurse(childs[i], j, nodes); - d.parent = node; - c.push(d); - v += d.value; - } - if (sort) c.sort(sort); - if (value) node.value = v; - } else if (value) { - node.value = +value.call(hierarchy, node, depth) || 0; - } - return node; - } - function revalue(node, depth) { - var children = node.children, v = 0; - if (children && (n = children.length)) { - var i = -1, n, j = depth + 1; - while (++i < n) v += revalue(children[i], j); - } else if (value) { - v = +value.call(hierarchy, node, depth) || 0; - } - if (value) node.value = v; - return v; - } - function hierarchy(d) { - var nodes = []; - recurse(d, 0, nodes); - return nodes; - } - hierarchy.sort = function(x) { - if (!arguments.length) return sort; - sort = x; - return hierarchy; - }; - hierarchy.children = function(x) { - if (!arguments.length) return children; - children = x; - return hierarchy; - }; - hierarchy.value = function(x) { - if (!arguments.length) return value; - value = x; - return hierarchy; - }; - hierarchy.revalue = function(root) { - revalue(root, 0); - return root; - }; - return hierarchy; - }; - function d3_layout_hierarchyRebind(object, hierarchy) { - d3.rebind(object, hierarchy, "sort", "children", "value"); - object.nodes = object; - object.links = d3_layout_hierarchyLinks; - return object; - } - function d3_layout_hierarchyChildren(d) { - return d.children; - } - function d3_layout_hierarchyValue(d) { - return d.value; - } - function d3_layout_hierarchySort(a, b) { - return b.value - a.value; - } - function d3_layout_hierarchyLinks(nodes) { - return d3.merge(nodes.map(function(parent) { - return (parent.children || []).map(function(child) { - return { - source: parent, - target: child - }; - }); - })); - } - d3.layout.pack = function() { - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ]; - function pack(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0]; - root.x = 0; - root.y = 0; - d3_layout_treeVisitAfter(root, function(d) { - d.r = Math.sqrt(d.value); - }); - d3_layout_treeVisitAfter(root, d3_layout_packSiblings); - var w = size[0], h = size[1], k = Math.max(2 * root.r / w, 2 * root.r / h); - if (padding > 0) { - var dr = padding * k / 2; - d3_layout_treeVisitAfter(root, function(d) { - d.r += dr; - }); - d3_layout_treeVisitAfter(root, d3_layout_packSiblings); - d3_layout_treeVisitAfter(root, function(d) { - d.r -= dr; - }); - k = Math.max(2 * root.r / w, 2 * root.r / h); - } - d3_layout_packTransform(root, w / 2, h / 2, 1 / k); - return nodes; - } - pack.size = function(x) { - if (!arguments.length) return size; - size = x; - return pack; - }; - pack.padding = function(_) { - if (!arguments.length) return padding; - padding = +_; - return pack; - }; - return d3_layout_hierarchyRebind(pack, hierarchy); - }; - function d3_layout_packSort(a, b) { - return a.value - b.value; - } - function d3_layout_packInsert(a, b) { - var c = a._pack_next; - a._pack_next = b; - b._pack_prev = a; - b._pack_next = c; - c._pack_prev = b; - } - function d3_layout_packSplice(a, b) { - a._pack_next = b; - b._pack_prev = a; - } - function d3_layout_packIntersects(a, b) { - var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; - return dr * dr - dx * dx - dy * dy > .001; - } - function d3_layout_packSiblings(node) { - if (!(nodes = node.children) || !(n = nodes.length)) return; - var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; - function bound(node) { - xMin = Math.min(node.x - node.r, xMin); - xMax = Math.max(node.x + node.r, xMax); - yMin = Math.min(node.y - node.r, yMin); - yMax = Math.max(node.y + node.r, yMax); - } - nodes.forEach(d3_layout_packLink); - a = nodes[0]; - a.x = -a.r; - a.y = 0; - bound(a); - if (n > 1) { - b = nodes[1]; - b.x = b.r; - b.y = 0; - bound(b); - if (n > 2) { - c = nodes[2]; - d3_layout_packPlace(a, b, c); - bound(c); - d3_layout_packInsert(a, c); - a._pack_prev = c; - d3_layout_packInsert(c, b); - b = a._pack_next; - for (i = 3; i < n; i++) { - d3_layout_packPlace(a, b, c = nodes[i]); - var isect = 0, s1 = 1, s2 = 1; - for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { - if (d3_layout_packIntersects(j, c)) { - isect = 1; - break; - } - } - if (isect == 1) { - for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) { - if (d3_layout_packIntersects(k, c)) { - break; - } - } - } - if (isect) { - if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b); - i--; - } else { - d3_layout_packInsert(a, c); - b = c; - bound(c); - } - } - } - } - var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; - for (i = 0; i < n; i++) { - c = nodes[i]; - c.x -= cx; - c.y -= cy; - cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); - } - node.r = cr; - nodes.forEach(d3_layout_packUnlink); - } - function d3_layout_packLink(node) { - node._pack_next = node._pack_prev = node; - } - function d3_layout_packUnlink(node) { - delete node._pack_next; - delete node._pack_prev; - } - function d3_layout_packTransform(node, x, y, k) { - var children = node.children; - node.x = x += k * node.x; - node.y = y += k * node.y; - node.r *= k; - if (children) { - var i = -1, n = children.length; - while (++i < n) d3_layout_packTransform(children[i], x, y, k); - } - } - function d3_layout_packPlace(a, b, c) { - var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y; - if (db && (dx || dy)) { - var da = b.r + c.r, dc = dx * dx + dy * dy; - da *= da; - db *= db; - var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc); - c.x = a.x + x * dx + y * dy; - c.y = a.y + x * dy - y * dx; - } else { - c.x = a.x + db; - c.y = a.y; - } - } - d3.layout.cluster = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ]; - function cluster(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0; - d3_layout_treeVisitAfter(root, function(node) { - var children = node.children; - if (children && children.length) { - node.x = d3_layout_clusterX(children); - node.y = d3_layout_clusterY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; - } - }); - var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2; - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1]; - }); - return nodes; - } - cluster.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return cluster; - }; - cluster.size = function(x) { - if (!arguments.length) return size; - size = x; - return cluster; - }; - return d3_layout_hierarchyRebind(cluster, hierarchy); - }; - function d3_layout_clusterY(children) { - return 1 + d3.max(children, function(child) { - return child.y; - }); - } - function d3_layout_clusterX(children) { - return children.reduce(function(x, child) { - return x + child.x; - }, 0) / children.length; - } - function d3_layout_clusterLeft(node) { - var children = node.children; - return children && children.length ? d3_layout_clusterLeft(children[0]) : node; - } - function d3_layout_clusterRight(node) { - var children = node.children, n; - return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node; - } - d3.layout.tree = function() { - var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ]; - function tree(d, i) { - var nodes = hierarchy.call(this, d, i), root = nodes[0]; - function firstWalk(node, previousSibling) { - var children = node.children, layout = node._tree; - if (children && (n = children.length)) { - var n, firstChild = children[0], previousChild, ancestor = firstChild, child, i = -1; - while (++i < n) { - child = children[i]; - firstWalk(child, previousChild); - ancestor = apportion(child, previousChild, ancestor); - previousChild = child; - } - d3_layout_treeShift(node); - var midpoint = .5 * (firstChild._tree.prelim + child._tree.prelim); - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - layout.mod = layout.prelim - midpoint; - } else { - layout.prelim = midpoint; - } - } else { - if (previousSibling) { - layout.prelim = previousSibling._tree.prelim + separation(node, previousSibling); - } - } - } - function secondWalk(node, x) { - node.x = node._tree.prelim + x; - var children = node.children; - if (children && (n = children.length)) { - var i = -1, n; - x += node._tree.mod; - while (++i < n) { - secondWalk(children[i], x); - } - } - } - function apportion(node, previousSibling, ancestor) { - if (previousSibling) { - var vip = node, vop = node, vim = previousSibling, vom = node.parent.children[0], sip = vip._tree.mod, sop = vop._tree.mod, sim = vim._tree.mod, som = vom._tree.mod, shift; - while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) { - vom = d3_layout_treeLeft(vom); - vop = d3_layout_treeRight(vop); - vop._tree.ancestor = node; - shift = vim._tree.prelim + sim - vip._tree.prelim - sip + separation(vim, vip); - if (shift > 0) { - d3_layout_treeMove(d3_layout_treeAncestor(vim, node, ancestor), node, shift); - sip += shift; - sop += shift; - } - sim += vim._tree.mod; - sip += vip._tree.mod; - som += vom._tree.mod; - sop += vop._tree.mod; - } - if (vim && !d3_layout_treeRight(vop)) { - vop._tree.thread = vim; - vop._tree.mod += sim - sop; - } - if (vip && !d3_layout_treeLeft(vom)) { - vom._tree.thread = vip; - vom._tree.mod += sip - som; - ancestor = node; - } - } - return ancestor; - } - d3_layout_treeVisitAfter(root, function(node, previousSibling) { - node._tree = { - ancestor: node, - prelim: 0, - mod: 0, - change: 0, - shift: 0, - number: previousSibling ? previousSibling._tree.number + 1 : 0 - }; - }); - firstWalk(root); - secondWalk(root, -root._tree.prelim); - var left = d3_layout_treeSearch(root, d3_layout_treeLeftmost), right = d3_layout_treeSearch(root, d3_layout_treeRightmost), deep = d3_layout_treeSearch(root, d3_layout_treeDeepest), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2, y1 = deep.depth || 1; - d3_layout_treeVisitAfter(root, function(node) { - node.x = (node.x - x0) / (x1 - x0) * size[0]; - node.y = node.depth / y1 * size[1]; - delete node._tree; - }); - return nodes; - } - tree.separation = function(x) { - if (!arguments.length) return separation; - separation = x; - return tree; - }; - tree.size = function(x) { - if (!arguments.length) return size; - size = x; - return tree; - }; - return d3_layout_hierarchyRebind(tree, hierarchy); - }; - function d3_layout_treeSeparation(a, b) { - return a.parent == b.parent ? 1 : 2; - } - function d3_layout_treeLeft(node) { - var children = node.children; - return children && children.length ? children[0] : node._tree.thread; - } - function d3_layout_treeRight(node) { - var children = node.children, n; - return children && (n = children.length) ? children[n - 1] : node._tree.thread; - } - function d3_layout_treeSearch(node, compare) { - var children = node.children; - if (children && (n = children.length)) { - var child, n, i = -1; - while (++i < n) { - if (compare(child = d3_layout_treeSearch(children[i], compare), node) > 0) { - node = child; - } - } - } - return node; - } - function d3_layout_treeRightmost(a, b) { - return a.x - b.x; - } - function d3_layout_treeLeftmost(a, b) { - return b.x - a.x; - } - function d3_layout_treeDeepest(a, b) { - return a.depth - b.depth; - } - function d3_layout_treeVisitAfter(node, callback) { - function visit(node, previousSibling) { - var children = node.children; - if (children && (n = children.length)) { - var child, previousChild = null, i = -1, n; - while (++i < n) { - child = children[i]; - visit(child, previousChild); - previousChild = child; - } - } - callback(node, previousSibling); - } - visit(node, null); - } - function d3_layout_treeShift(node) { - var shift = 0, change = 0, children = node.children, i = children.length, child; - while (--i >= 0) { - child = children[i]._tree; - child.prelim += shift; - child.mod += shift; - shift += child.shift + (change += child.change); - } - } - function d3_layout_treeMove(ancestor, node, shift) { - ancestor = ancestor._tree; - node = node._tree; - var change = shift / (node.number - ancestor.number); - ancestor.change += change; - node.change -= change; - node.shift += shift; - node.prelim += shift; - node.mod += shift; - } - function d3_layout_treeAncestor(vim, node, ancestor) { - return vim._tree.ancestor.parent == node.parent ? vim._tree.ancestor : ancestor; - } - d3.layout.treemap = function() { - var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5)); - function scale(children, k) { - var i = -1, n = children.length, child, area; - while (++i < n) { - area = (child = children[i]).value * (k < 0 ? 0 : k); - child.area = isNaN(area) || area <= 0 ? 0 : area; - } - } - function squarify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while ((n = remaining.length) > 0) { - row.push(child = remaining[n - 1]); - row.area += child.area; - if (mode !== "squarify" || (score = worst(row, u)) <= best) { - remaining.pop(); - best = score; - } else { - row.area -= row.pop().area; - position(row, u, rect, false); - u = Math.min(rect.dx, rect.dy); - row.length = row.area = 0; - best = Infinity; - } - } - if (row.length) { - position(row, u, rect, true); - row.length = row.area = 0; - } - children.forEach(squarify); - } - } - function stickify(node) { - var children = node.children; - if (children && children.length) { - var rect = pad(node), remaining = children.slice(), child, row = []; - scale(remaining, rect.dx * rect.dy / node.value); - row.area = 0; - while (child = remaining.pop()) { - row.push(child); - row.area += child.area; - if (child.z != null) { - position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length); - row.length = row.area = 0; - } - } - children.forEach(stickify); - } - } - function worst(row, u) { - var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length; - while (++i < n) { - if (!(r = row[i].area)) continue; - if (r < rmin) rmin = r; - if (r > rmax) rmax = r; - } - s *= s; - u *= u; - return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity; - } - function position(row, u, rect, flush) { - var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o; - if (u == rect.dx) { - if (flush || v > rect.dy) v = rect.dy; - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dy = v; - x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0); - } - o.z = true; - o.dx += rect.x + rect.dx - x; - rect.y += v; - rect.dy -= v; - } else { - if (flush || v > rect.dx) v = rect.dx; - while (++i < n) { - o = row[i]; - o.x = x; - o.y = y; - o.dx = v; - y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0); - } - o.z = false; - o.dy += rect.y + rect.dy - y; - rect.x += v; - rect.dx -= v; - } - } - function treemap(d) { - var nodes = stickies || hierarchy(d), root = nodes[0]; - root.x = 0; - root.y = 0; - root.dx = size[0]; - root.dy = size[1]; - if (stickies) hierarchy.revalue(root); - scale([ root ], root.dx * root.dy / root.value); - (stickies ? stickify : squarify)(root); - if (sticky) stickies = nodes; - return nodes; - } - treemap.size = function(x) { - if (!arguments.length) return size; - size = x; - return treemap; - }; - treemap.padding = function(x) { - if (!arguments.length) return padding; - function padFunction(node) { - var p = x.call(treemap, node, node.depth); - return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p); - } - function padConstant(node) { - return d3_layout_treemapPad(node, x); - } - var type; - pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ], - padConstant) : padConstant; - return treemap; - }; - treemap.round = function(x) { - if (!arguments.length) return round != Number; - round = x ? Math.round : Number; - return treemap; - }; - treemap.sticky = function(x) { - if (!arguments.length) return sticky; - sticky = x; - stickies = null; - return treemap; - }; - treemap.ratio = function(x) { - if (!arguments.length) return ratio; - ratio = x; - return treemap; - }; - treemap.mode = function(x) { - if (!arguments.length) return mode; - mode = x + ""; - return treemap; - }; - return d3_layout_hierarchyRebind(treemap, hierarchy); - }; - function d3_layout_treemapPadNull(node) { - return { - x: node.x, - y: node.y, - dx: node.dx, - dy: node.dy - }; - } - function d3_layout_treemapPad(node, padding) { - var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2]; - if (dx < 0) { - x += dx / 2; - dx = 0; - } - if (dy < 0) { - y += dy / 2; - dy = 0; - } - return { - x: x, - y: y, - dx: dx, - dy: dy - }; - } - function d3_dsv(delimiter, mimeType) { - var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0); - function dsv(url, callback) { - return d3.xhr(url, mimeType, callback).response(response); - } - function response(request) { - return dsv.parse(request.responseText); - } - dsv.parse = function(text) { - var o; - return dsv.parseRows(text, function(row) { - if (o) return o(row); - o = new Function("d", "return {" + row.map(function(name, i) { - return JSON.stringify(name) + ": d[" + i + "]"; - }).join(",") + "}"); - }); - }; - dsv.parseRows = function(text, f) { - var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol; - function token() { - if (I >= N) return EOF; - if (eol) return eol = false, EOL; - var j = I; - if (text.charCodeAt(j) === 34) { - var i = j; - while (i++ < N) { - if (text.charCodeAt(i) === 34) { - if (text.charCodeAt(i + 1) !== 34) break; - ++i; - } - } - I = i + 2; - var c = text.charCodeAt(i + 1); - if (c === 13) { - eol = true; - if (text.charCodeAt(i + 2) === 10) ++I; - } else if (c === 10) { - eol = true; - } - return text.substring(j + 1, i).replace(/""/g, '"'); - } - while (I < N) { - var c = text.charCodeAt(I++), k = 1; - if (c === 10) eol = true; else if (c === 13) { - eol = true; - if (text.charCodeAt(I) === 10) ++I, ++k; - } else if (c !== delimiterCode) continue; - return text.substring(j, I - k); - } - return text.substring(j); - } - while ((t = token()) !== EOF) { - var a = []; - while (t !== EOL && t !== EOF) { - a.push(t); - t = token(); - } - if (f && !(a = f(a, n++))) continue; - rows.push(a); - } - return rows; - }; - dsv.format = function(rows) { - return rows.map(formatRow).join("\n"); - }; - function formatRow(row) { - return row.map(formatValue).join(delimiter); - } - function formatValue(text) { - return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text; - } - return dsv; - } - d3.csv = d3_dsv(",", "text/csv"); - d3.tsv = d3_dsv(" ", "text/tab-separated-values"); d3.geo = {}; d3.geo.stream = function(object, listener) { if (d3_geo_streamObjectType.hasOwnProperty(object.type)) { @@ -6446,7 +5038,7 @@ d3.geo.stream(object, d3_geo_area); return d3_geo_areaSum; }; - var d3_geo_areaSum, d3_geo_areaRing; + var d3_geo_areaSum, d3_geo_areaRingU, d3_geo_areaRingV; var d3_geo_area = { sphere: function() { d3_geo_areaSum += 4 * π; @@ -6455,30 +5047,29 @@ lineStart: d3_noop, lineEnd: d3_noop, polygonStart: function() { - d3_geo_areaRing = 0; + d3_geo_areaRingU = 1, d3_geo_areaRingV = 0; d3_geo_area.lineStart = d3_geo_areaRingStart; }, polygonEnd: function() { - d3_geo_areaSum += d3_geo_areaRing < 0 ? 4 * π + d3_geo_areaRing : d3_geo_areaRing; + var area = 2 * Math.atan2(d3_geo_areaRingV, d3_geo_areaRingU); + d3_geo_areaSum += area < 0 ? 4 * π + area : area; d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop; } }; function d3_geo_areaRingStart() { - var λ00, φ00, λ1, λ0, φ0, cosφ0, sinφ0; + var λ00, φ00, λ0, cosφ0, sinφ0; d3_geo_area.point = function(λ, φ) { d3_geo_area.point = nextPoint; - λ1 = λ0 = (λ00 = λ) * d3_radians, φ0 = (φ00 = φ) * d3_radians, cosφ0 = Math.cos(φ0), - sinφ0 = Math.sin(φ0); + λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), + sinφ0 = Math.sin(φ); }; function nextPoint(λ, φ) { - λ *= d3_radians, φ *= d3_radians; - if (Math.abs(Math.abs(φ0) - π / 2) < ε && Math.abs(Math.abs(φ) - π / 2) < ε) return; - var cosφ = Math.cos(φ), sinφ = Math.sin(φ); - if (Math.abs(φ0 - π / 2) < ε) d3_geo_areaRing += (λ - λ1) * 2; else { - var dλ = λ - λ0, cosdλ = Math.cos(dλ), d = Math.atan2(Math.sqrt((d = cosφ * Math.sin(dλ)) * d + (d = cosφ0 * sinφ - sinφ0 * cosφ * cosdλ) * d), sinφ0 * sinφ + cosφ0 * cosφ * cosdλ), s = (d + π + φ0 + φ) / 4; - d3_geo_areaRing += (dλ < 0 && dλ > -π || dλ > π ? -4 : 4) * Math.atan(Math.sqrt(Math.abs(Math.tan(s) * Math.tan(s - d / 2) * Math.tan(s - π / 4 - φ0 / 2) * Math.tan(s - π / 4 - φ / 2)))); - } - λ1 = λ0, λ0 = λ, φ0 = φ, cosφ0 = cosφ, sinφ0 = sinφ; + λ *= d3_radians; + φ = φ * d3_radians / 2 + π / 4; + var dλ = λ - λ0, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u0 = d3_geo_areaRingU, v0 = d3_geo_areaRingV, u = cosφ0 * cosφ + k * Math.cos(dλ), v = k * Math.sin(dλ); + d3_geo_areaRingU = u0 * u - v0 * v; + d3_geo_areaRingV = v0 * u + u0 * v; + λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ; } d3_geo_area.lineEnd = function() { nextPoint(λ00, φ00); @@ -6782,10 +5373,10 @@ polygons = polygons.map(function(polygon, i) { var cx = vertices[i][0], cy = vertices[i][1], angle = polygon.map(function(v) { return Math.atan2(v[0] - cx, v[1] - cy); - }); - return d3.range(polygon.length).sort(function(a, b) { + }), order = d3.range(polygon.length).sort(function(a, b) { return angle[a] - angle[b]; - }).filter(function(d, i, order) { + }); + return order.filter(function(d, i) { return !i || angle[d] - angle[order[i - 1]] > ε; }).map(function(d) { return polygon[d]; @@ -7796,4 +6387,5 @@ d3.time.scale.utc = function() { return d3_time_scale(d3.scale.linear(), d3_time_scaleUTCMethods, d3_time_scaleUTCFormat); }; -})(); \ No newline at end of file + return d3; +}(); \ No newline at end of file From ba45582e3ce83bdd12216173153a655aa46e0b62 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 27 Feb 2013 17:30:05 -0500 Subject: [PATCH 54/64] Removing unused arguments --- js/id/core/history.js | 2 +- js/id/services/taginfo.js | 2 +- js/id/ui/inspector.js | 2 +- js/id/ui/lasso.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/js/id/core/history.js b/js/id/core/history.js index 3ae02b42d..cce3f3330 100644 --- a/js/id/core/history.js +++ b/js/id/core/history.js @@ -240,7 +240,7 @@ iD.History = function(context) { context.storage(getKey('nextIDs', null)); context.storage(getKey('index', null)); - stack = JSON.parse(json).map(function(d, i) { + stack = JSON.parse(json).map(function(d) { d.graph = iD.Graph(stack[0].graph).load(d.entities); return d; }); diff --git a/js/id/services/taginfo.js b/js/id/services/taginfo.js index feb3c650e..b950952eb 100644 --- a/js/id/services/taginfo.js +++ b/js/id/services/taginfo.js @@ -50,7 +50,7 @@ iD.taginfo = function() { return function(d) { return parseFloat(d[pop_field]) > 10000; }; } - function popularValues(parameters) { + function popularValues() { return function(d) { return parseFloat(d.fraction) > 0.01; }; } diff --git a/js/id/ui/inspector.js b/js/id/ui/inspector.js index 8453de560..e89e7bd02 100644 --- a/js/id/ui/inspector.js +++ b/js/id/ui/inspector.js @@ -52,7 +52,7 @@ iD.ui.Inspector = function(context) { selection.call(iD.ui.Toggle(true)); } - inspector.tags = function(tags) { + inspector.tags = function() { if (!arguments.length) { return tagEditor.tags(); } else { diff --git a/js/id/ui/lasso.js b/js/id/ui/lasso.js index cbf6fe412..1af0e31f8 100644 --- a/js/id/ui/lasso.js +++ b/js/id/ui/lasso.js @@ -49,7 +49,7 @@ iD.ui.Lasso = function() { return lasso; }; - lasso.close = function(selection) { + lasso.close = function() { if (group) { group.call(iD.ui.Toggle(false, function() { d3.select(this).remove(); From bf1aaf217250e1ffa17432ceb84d5dd86369fa71 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 17:50:42 -0500 Subject: [PATCH 55/64] don't include just created parents in modified --- js/id/core/tree.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/js/id/core/tree.js b/js/id/core/tree.js index 94b174230..10ea4e1f2 100644 --- a/js/id/core/tree.js +++ b/js/id/core/tree.js @@ -1,5 +1,3 @@ - - iD.Tree = function(graph) { var rtree = new RTree(), @@ -58,7 +56,10 @@ iD.Tree = function(graph) { }); var created = diff.created().concat(queuedCreated); - modified = d3.values(diff.addParents(modified)).concat(queuedModified); + modified = d3.values(diff.addParents(modified)) + // some parents might be created, not modified + .filter(function(d) { return !!graph.entity(d.id); }) + .concat(queuedModified); queuedCreated = []; queuedModified = []; From 5eabd1e4d50811ce70079caaca6af65be6f87132 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Wed, 27 Feb 2013 17:51:51 -0500 Subject: [PATCH 56/64] Add validation warning for many deletions. Fixes #862 --- js/id/ui/commit.js | 4 +++- js/id/validate.js | 6 ++++++ locale/en.js | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/js/id/ui/commit.js b/js/id/ui/commit.js index f47575c58..efdc1c190 100644 --- a/js/id/ui/commit.js +++ b/js/id/ui/commit.js @@ -108,7 +108,9 @@ iD.ui.Commit = function(context) { .enter() .append('li'); - warningLi.append('button') + // only show the fix icon when an entity is given + warningLi.filter(function(d) { return d.entity; }) + .append('button') .attr('class', 'minor') .on('click', event.fix) .append('span') diff --git a/js/id/validate.js b/js/id/validate.js index dacff7889..ff2e42fb3 100644 --- a/js/id/validate.js +++ b/js/id/validate.js @@ -15,6 +15,12 @@ iD.validate = function(changes, graph) { if (tags.building && tags.building === 'yes') return 'building=yes'; } + if (changes.deleted.length > 100) { + warnings.push({ + message: t('validations.many_deletions') + }); + } + for (var i = 0; i < changes.created.length; i++) { change = changes.created[i]; diff --git a/locale/en.js b/locale/en.js index 2890187e2..7d82a4944 100644 --- a/locale/en.js +++ b/locale/en.js @@ -221,6 +221,7 @@ locale.en = { untagged_point: "Untagged point which is not part of a line or area", untagged_line: "Untagged line", untagged_area: "Untagged area", + many_deletions: "You're deleting more than 200 objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "The tag {tag} suggests line should be area, but it is not an area", deprecated_tags: "Deprecated tags: {tags}" }, From a35154b19bf6ff27fb251057bc35d1dae9b7d5f1 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Wed, 27 Feb 2013 18:12:40 -0500 Subject: [PATCH 57/64] Fix localization number --- js/id/validate.js | 2 +- locale/en.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/id/validate.js b/js/id/validate.js index ff2e42fb3..30568f652 100644 --- a/js/id/validate.js +++ b/js/id/validate.js @@ -17,7 +17,7 @@ iD.validate = function(changes, graph) { if (changes.deleted.length > 100) { warnings.push({ - message: t('validations.many_deletions') + message: t('validations.many_deletions', { n: changes.deleted.length }) }); } diff --git a/locale/en.js b/locale/en.js index 7d82a4944..0ba305dc0 100644 --- a/locale/en.js +++ b/locale/en.js @@ -221,7 +221,7 @@ locale.en = { untagged_point: "Untagged point which is not part of a line or area", untagged_line: "Untagged line", untagged_area: "Untagged area", - many_deletions: "You're deleting more than 200 objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "The tag {tag} suggests line should be area, but it is not an area", deprecated_tags: "Deprecated tags: {tags}" }, From b751c1ece99205f927751a9bac4aeef5c72bc15e Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 27 Feb 2013 16:01:51 -0800 Subject: [PATCH 58/64] Simplify, fix spec --- js/id/actions/delete_way.js | 22 ++++++++++------------ test/spec/actions/delete_way.js | 2 +- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/js/id/actions/delete_way.js b/js/id/actions/delete_way.js index 95888470e..9d98a697b 100644 --- a/js/id/actions/delete_way.js +++ b/js/id/actions/delete_way.js @@ -1,5 +1,11 @@ // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as iD.actions.DeleteWay = function(wayId) { + function deleteNode(node, graph) { + return !graph.parentWays(node).length && + !graph.parentRelations(node).length && + !node.hasInterestingTags(); + } + return function(graph) { var way = graph.entity(wayId); @@ -8,20 +14,12 @@ iD.actions.DeleteWay = function(wayId) { graph = graph.replace(parent.removeMember(wayId)); }); - way.nodes.forEach(function(nodeId) { - var node = graph.entity(nodeId); - - // Circular ways include nodes more than once, so they - // can be deleted on earlier iterations of this loop. - if (!node) return; - + _.uniq(way.nodes).forEach(function(nodeId) { graph = graph.replace(way.removeNode(nodeId)); - if (!graph.parentWays(node).length && - !graph.parentRelations(node).length) { - if (!node.hasInterestingTags()) { - graph = graph.remove(node); - } + var node = graph.entity(nodeId); + if (deleteNode(node, graph)) { + graph = graph.remove(node); } }); diff --git a/test/spec/actions/delete_way.js b/test/spec/actions/delete_way.js index 130f5f759..a42ca3e38 100644 --- a/test/spec/actions/delete_way.js +++ b/test/spec/actions/delete_way.js @@ -47,7 +47,7 @@ describe("iD.actions.DeleteWay", function() { c = iD.Node(), way = iD.Way({nodes: [a.id, b.id, c.id, a.id]}), action = iD.actions.DeleteWay(way.id), - graph = iD.Graph([a, b, way]).update(action); + graph = iD.Graph([a, b, c, way]).update(action); expect(graph.entity(a.id)).to.be.undefined; expect(graph.entity(b.id)).to.be.undefined; expect(graph.entity(c.id)).to.be.undefined; From 7a1800fd6866f7aac7ac27c9785f96bf1740a490 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 27 Feb 2013 16:32:52 -0800 Subject: [PATCH 59/64] Delete orphaned relation members --- js/id/actions/delete_relation.js | 15 +++++++ test/spec/actions/delete_relation.js | 59 ++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/js/id/actions/delete_relation.js b/js/id/actions/delete_relation.js index 48c62f1e1..783f1533c 100644 --- a/js/id/actions/delete_relation.js +++ b/js/id/actions/delete_relation.js @@ -1,5 +1,11 @@ // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as iD.actions.DeleteRelation = function(relationId) { + function deleteEntity(entity, graph) { + return !graph.parentWays(entity).length && + !graph.parentRelations(entity).length && + !entity.hasInterestingTags(); + } + return function(graph) { var relation = graph.entity(relationId); @@ -8,6 +14,15 @@ iD.actions.DeleteRelation = function(relationId) { graph = graph.replace(parent.removeMember(relationId)); }); + _.uniq(_.pluck(relation.members, 'id')).forEach(function(memberId) { + graph = graph.replace(relation.removeMember(memberId)); + + var entity = graph.entity(memberId); + if (deleteEntity(entity, graph)) { + graph = iD.actions.DeleteMultiple([memberId])(graph); + } + }); + return graph.remove(relation); }; }; diff --git a/test/spec/actions/delete_relation.js b/test/spec/actions/delete_relation.js index c96909f3f..28219601a 100644 --- a/test/spec/actions/delete_relation.js +++ b/test/spec/actions/delete_relation.js @@ -14,4 +14,63 @@ describe("iD.actions.DeleteRelation", function () { graph = action(iD.Graph([a, b, parent])); expect(graph.entity(parent.id).members).to.eql([{ id: b.id }]); }); + + it("deletes member nodes not referenced by another parent", function() { + var node = iD.Node(), + relation = iD.Relation({members: [{id: node.id}]}), + action = iD.actions.DeleteRelation(relation.id), + graph = action(iD.Graph([node, relation])); + expect(graph.entity(node.id)).to.be.undefined; + }); + + it("does not delete member nodes referenced by another parent", function() { + var node = iD.Node(), + way = iD.Way({nodes: [node.id]}), + relation = iD.Relation({members: [{id: node.id}]}), + action = iD.actions.DeleteRelation(relation.id), + graph = action(iD.Graph([node, way, relation])); + expect(graph.entity(node.id)).not.to.be.undefined; + }); + + it("does not delete member nodes with interesting tags", function() { + var node = iD.Node({tags: {highway: 'traffic_signals'}}), + relation = iD.Relation({members: [{id: node.id}]}), + action = iD.actions.DeleteRelation(relation.id), + graph = action(iD.Graph([node, relation])); + expect(graph.entity(node.id)).not.to.be.undefined; + }); + + it("deletes member ways not referenced by another parent", function() { + var way = iD.Way(), + relation = iD.Relation({members: [{id: way.id}]}), + action = iD.actions.DeleteRelation(relation.id), + graph = action(iD.Graph([way, relation])); + expect(graph.entity(way.id)).to.be.undefined; + }); + + it("does not delete member ways referenced by another parent", function() { + var way = iD.Way(), + relation1 = iD.Relation({members: [{id: way.id}]}), + relation2 = iD.Relation({members: [{id: way.id}]}), + action = iD.actions.DeleteRelation(relation1.id), + graph = action(iD.Graph([way, relation1, relation2])); + expect(graph.entity(way.id)).not.to.be.undefined; + }); + + it("does not delete member ways with interesting tags", function() { + var way = iD.Node({tags: {highway: 'residential'}}), + relation = iD.Relation({members: [{id: way.id}]}), + action = iD.actions.DeleteRelation(relation.id), + graph = action(iD.Graph([way, relation])); + expect(graph.entity(way.id)).not.to.be.undefined; + }); + + it("deletes nodes of deleted member ways", function() { + var node = iD.Node(), + way = iD.Way({nodes: [node.id]}), + relation = iD.Relation({members: [{id: way.id}]}), + action = iD.actions.DeleteRelation(relation.id), + graph = action(iD.Graph([node, way, relation])); + expect(graph.entity(node.id)).to.be.undefined; + }); }); From 78f6a0002908b7b54e64d412a4120cf89608e41a Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 27 Feb 2013 17:12:39 -0800 Subject: [PATCH 60/64] Fix moving multiple entities which share nodes While here, implement moving multipolygons too. --- combobox.html | 4 +-- index.html | 2 +- js/id/actions/move.js | 31 +++++++++++++++++++++ js/id/actions/move_way.js | 14 ---------- js/id/modes/move.js | 23 +++++----------- js/id/operations/move.js | 2 +- test/index.html | 4 +-- test/index_packaged.html | 2 +- test/spec/actions/move.js | 51 +++++++++++++++++++++++++++++++++++ test/spec/actions/move_way.js | 27 ------------------- 10 files changed, 95 insertions(+), 65 deletions(-) create mode 100644 js/id/actions/move.js delete mode 100644 js/id/actions/move_way.js create mode 100644 test/spec/actions/move.js delete mode 100644 test/spec/actions/move_way.js diff --git a/combobox.html b/combobox.html index 6eaa944a9..34deb2d21 100644 --- a/combobox.html +++ b/combobox.html @@ -81,7 +81,7 @@ - + @@ -103,7 +103,7 @@ - + diff --git a/index.html b/index.html index f62adccdc..7d76a8712 100644 --- a/index.html +++ b/index.html @@ -108,7 +108,7 @@ - + diff --git a/js/id/actions/move.js b/js/id/actions/move.js new file mode 100644 index 000000000..09a69f09c --- /dev/null +++ b/js/id/actions/move.js @@ -0,0 +1,31 @@ +// https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java +// https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as +iD.actions.Move = function(ids, delta, projection) { + function addNodes(ids, nodes, graph) { + ids.forEach(function(id) { + var entity = graph.entity(id); + if (entity.type === 'node') { + nodes.push(id); + } else if (entity.type === 'way') { + nodes.push.apply(nodes, entity.nodes); + } else { + addNodes(_.pluck(entity.members, 'id'), nodes, graph); + } + }); + } + + return function(graph) { + var nodes = []; + + addNodes(ids, nodes, graph); + + _.uniq(nodes).forEach(function(id) { + var node = graph.entity(id), + start = projection(node.loc), + end = projection.invert([start[0] + delta[0], start[1] + delta[1]]); + graph = graph.replace(node.move(end)); + }); + + return graph; + }; +}; diff --git a/js/id/actions/move_way.js b/js/id/actions/move_way.js deleted file mode 100644 index 376e31d6e..000000000 --- a/js/id/actions/move_way.js +++ /dev/null @@ -1,14 +0,0 @@ -iD.actions.MoveWay = function(wayId, delta, projection) { - return function(graph) { - return graph.update(function(graph) { - var way = graph.entity(wayId); - - _.uniq(way.nodes).forEach(function(id) { - var node = graph.entity(id), - start = projection(node.loc), - end = projection.invert([start[0] + delta[0], start[1] + delta[1]]); - graph = graph.replace(node.move(end)); - }); - }); - }; -}; diff --git a/js/id/modes/move.js b/js/id/modes/move.js index 766ee8453..d2089a2ad 100644 --- a/js/id/modes/move.js +++ b/js/id/modes/move.js @@ -4,14 +4,13 @@ iD.modes.Move = function(context, entityIDs) { button: 'browse' }; - var keybinding = d3.keybinding('move'), - entities = entityIDs.map(context.entity); + var keybinding = d3.keybinding('move'); mode.enter = function() { var origin, nudgeInterval, - annotation = entities.length === 1 ? - t('operations.move.annotation.' + context.geometry(entities[0].id)) : + annotation = entityIDs.length === 1 ? + t('operations.move.annotation.' + context.geometry(entityIDs[0])) : t('operations.move.annotation.multiple'); context.perform( @@ -57,19 +56,9 @@ iD.modes.Move = function(context, entityIDs) { origin = context.map().mouseCoordinates(); - entities.forEach(function(entity) { - if (entity.type === 'way') { - context.replace( - iD.actions.MoveWay(entity.id, delta, context.projection)); - } else if (entity.type === 'node') { - var start = context.projection(context.entity(entity.id).loc), - end = [start[0] + delta[0], start[1] + delta[1]], - loc = context.projection.invert(end); - context.replace(iD.actions.MoveNode(entity.id, loc)); - } - }); - - context.replace(iD.actions.Noop(), annotation); + context.replace( + iD.actions.Move(entityIDs, delta, context.projection), + annotation); } function finish() { diff --git a/js/id/operations/move.js b/js/id/operations/move.js index dd001be8d..22d913ce0 100644 --- a/js/id/operations/move.js +++ b/js/id/operations/move.js @@ -6,7 +6,7 @@ iD.operations.Move = function(selection, context) { operation.available = function() { return selection.length > 1 || - context.entity(selection[0]).type === 'way'; + context.entity(selection[0]).type !== 'node'; }; operation.enabled = function() { diff --git a/test/index.html b/test/index.html index 603f29a08..948a4bc57 100644 --- a/test/index.html +++ b/test/index.html @@ -96,7 +96,7 @@ - + @@ -177,7 +177,7 @@ - + diff --git a/test/index_packaged.html b/test/index_packaged.html index c7d8ad7de..c8b6984fe 100644 --- a/test/index_packaged.html +++ b/test/index_packaged.html @@ -38,7 +38,7 @@ - + diff --git a/test/spec/actions/move.js b/test/spec/actions/move.js new file mode 100644 index 000000000..2017409c7 --- /dev/null +++ b/test/spec/actions/move.js @@ -0,0 +1,51 @@ +describe("iD.actions.Move", function() { + it("moves all nodes in a way by the given amount", function() { + var node1 = iD.Node({loc: [0, 0]}), + node2 = iD.Node({loc: [5, 10]}), + way = iD.Way({nodes: [node1.id, node2.id]}), + delta = [2, 3], + projection = d3.geo.mercator(), + graph = iD.actions.Move([way.id], delta, projection)(iD.Graph([node1, node2, way])), + loc1 = graph.entity(node1.id).loc, + loc2 = graph.entity(node2.id).loc; + expect(loc1[0]).to.be.closeTo( 1.440, 0.001); + expect(loc1[1]).to.be.closeTo(-2.159, 0.001); + expect(loc2[0]).to.be.closeTo( 6.440, 0.001); + expect(loc2[1]).to.be.closeTo( 7.866, 0.001); + }); + + it("moves repeated nodes only once", function() { + var node = iD.Node({loc: [0, 0]}), + way = iD.Way({nodes: [node.id, node.id]}), + delta = [2, 3], + projection = d3.geo.mercator(), + graph = iD.actions.Move([way.id], delta, projection)(iD.Graph([node, way])), + loc = graph.entity(node.id).loc; + expect(loc[0]).to.be.closeTo( 1.440, 0.001); + expect(loc[1]).to.be.closeTo(-2.159, 0.001); + }); + + it("moves multiple ways", function() { + var node = iD.Node({loc: [0, 0]}), + way1 = iD.Way({nodes: [node.id]}), + way2 = iD.Way({nodes: [node.id]}), + delta = [2, 3], + projection = d3.geo.mercator(), + graph = iD.actions.Move([way1.id, way2.id], delta, projection)(iD.Graph([node, way1, way2])), + loc = graph.entity(node.id).loc; + expect(loc[0]).to.be.closeTo( 1.440, 0.001); + expect(loc[1]).to.be.closeTo(-2.159, 0.001); + }); + + it("moves leaf nodes of a relation", function() { + var node = iD.Node({loc: [0, 0]}), + way = iD.Way({nodes: [node.id]}), + relation = iD.Relation({members: [{id: way.id}]}), + delta = [2, 3], + projection = d3.geo.mercator(), + graph = iD.actions.Move([relation.id], delta, projection)(iD.Graph([node, way, relation])), + loc = graph.entity(node.id).loc; + expect(loc[0]).to.be.closeTo( 1.440, 0.001); + expect(loc[1]).to.be.closeTo(-2.159, 0.001); + }); +}); diff --git a/test/spec/actions/move_way.js b/test/spec/actions/move_way.js deleted file mode 100644 index 24bc81593..000000000 --- a/test/spec/actions/move_way.js +++ /dev/null @@ -1,27 +0,0 @@ -describe("iD.actions.MoveWay", function() { - it("moves all nodes in a way by the given amount", function() { - var node1 = iD.Node({loc: [0, 0]}), - node2 = iD.Node({loc: [5, 10]}), - way = iD.Way({nodes: [node1.id, node2.id]}), - delta = [2, 3], - projection = d3.geo.mercator(), - graph = iD.actions.MoveWay(way.id, delta, projection)(iD.Graph([node1, node2, way])), - loc1 = graph.entity(node1.id).loc, - loc2 = graph.entity(node2.id).loc; - expect(loc1[0]).to.be.closeTo( 1.440, 0.001); - expect(loc1[1]).to.be.closeTo(-2.159, 0.001); - expect(loc2[0]).to.be.closeTo( 6.440, 0.001); - expect(loc2[1]).to.be.closeTo( 7.866, 0.001); - }); - - it("moves repeated nodes only once", function() { - var node = iD.Node({loc: [0, 0]}), - way = iD.Way({nodes: [node.id, node.id]}), - delta = [2, 3], - projection = d3.geo.mercator(), - graph = iD.actions.MoveWay(way.id, delta, projection)(iD.Graph([node, way])), - loc = graph.entity(node.id).loc; - expect(loc[0]).to.be.closeTo( 1.440, 0.001); - expect(loc[1]).to.be.closeTo(-2.159, 0.001); - }); -}); From 05de42b116e816050f9eeb88367f233ac429af29 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 27 Feb 2013 17:30:47 -0800 Subject: [PATCH 61/64] Go to browse mode after deleting (fixes #868) --- js/id/operations/delete.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/js/id/operations/delete.js b/js/id/operations/delete.js index 2c9765b62..45d349c07 100644 --- a/js/id/operations/delete.js +++ b/js/id/operations/delete.js @@ -11,6 +11,8 @@ iD.operations.Delete = function(selection, context) { context.perform( iD.actions.DeleteMultiple(selection), annotation); + + context.enter(iD.modes.Browse(context)); }; operation.available = function() { From cdd761290637775d0da5a10fd1d4fac9dd692a93 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 27 Feb 2013 17:41:39 -0800 Subject: [PATCH 62/64] Fix translation test --- locale/da.js | 1 + locale/de.js | 1 + locale/es.js | 1 + locale/fr.js | 1 + locale/it.js | 1 + locale/ja.js | 1 + locale/lv.js | 1 + locale/nl.js | 1 + locale/pl.js | 1 + locale/ru.js | 1 + locale/tr.js | 1 + locale/uk.js | 1 + locale/vi.js | 1 + 13 files changed, 13 insertions(+) diff --git a/locale/da.js b/locale/da.js index 73d4e7b06..dfcb28daf 100644 --- a/locale/da.js +++ b/locale/da.js @@ -225,6 +225,7 @@ locale.da = { untagged_point: "Mangler et tag på punkt som ikke er del af en linje eller område", untagged_line: "Mangler tag på linje", untagged_area: "Mangler tag på område", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Dette tag {tag} mener denne linje skule være et område, men dette er ikke et område", deprecated_tags: "Uønskede tags: {tags}" } diff --git a/locale/de.js b/locale/de.js index c8450eda5..7667de056 100644 --- a/locale/de.js +++ b/locale/de.js @@ -220,6 +220,7 @@ locale.de = { untagged_point: "Punkt ohne Attribute, der kein Teil einer Linie oder Fläche ist", untagged_line: "Linie ohne Attribute", untagged_area: "Fläche ohne Attribute", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Das Attribut {tag} suggeriert eine Fläche, ist aber keine Fläche", deprecated_tags: "Veraltete Attribute: {tags}" }, diff --git a/locale/es.js b/locale/es.js index b253fdf7d..b3b3f2c65 100644 --- a/locale/es.js +++ b/locale/es.js @@ -220,6 +220,7 @@ locale.es = { untagged_point: "Punto sin etiquetar que no es parte de una línea ni de un área.", //"Untagged point which is not part of a line or area", untagged_line: "Línea sin etiquetar", //"Untagged line", untagged_area: "Área sin etiquetar", //"Untagged area", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "La etiqueta {tag} sugiere que esta línea debería ser una área, pero no lo es.", //"The tag {tag} suggests line should be area, but it is not an area", deprecated_tags: "Etiquetas obsoletas: {tags}" //"Deprecated tags: {tags}" }, diff --git a/locale/fr.js b/locale/fr.js index e498a1a2a..f4fcdc446 100644 --- a/locale/fr.js +++ b/locale/fr.js @@ -220,6 +220,7 @@ locale.fr = { untagged_point: "Point sans aucun tag ne faisant partie ni d'une ligne, ni d'un polygone", untagged_line: "Ligne sans aucun tag", untagged_area: "Polygone sans aucun tag", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Ce tag {tag} suppose que cette ligne devrait être un polygone, or ce n'est pas le cas", deprecated_tags: "Tags obsolètes : {tags}" }, diff --git a/locale/it.js b/locale/it.js index 623de7813..dd7960a9a 100644 --- a/locale/it.js +++ b/locale/it.js @@ -220,6 +220,7 @@ locale.it = { untagged_point: "Punto senza tag che non è parte di una linea o di un'area", untagged_line: "Linea senza tag", untagged_area: "Area senza tag", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Il tag {tag} fa pensare che la linea sia un'area, ma non rappresenta un'area", deprecated_tags: "Tag deprecati: {tags}" }, diff --git a/locale/ja.js b/locale/ja.js index 6871d7543..13261ecb3 100644 --- a/locale/ja.js +++ b/locale/ja.js @@ -220,6 +220,7 @@ locale.ja = { untagged_point: "ポイントにタグが付与されておらず、ラインやエリアの一部でもありません", untagged_line: "ラインにタグが付与されていません", untagged_area: "エリアにタグが付与されていません", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "ラインに {tag} タグが付与されています。エリアで描かれるべきです", deprecated_tags: "タグの重複: {tags}" }, diff --git a/locale/lv.js b/locale/lv.js index 1915379ba..e4e635079 100644 --- a/locale/lv.js +++ b/locale/lv.js @@ -220,6 +220,7 @@ locale.lv = { untagged_point: "Neapzīmēts punkts", untagged_line: "Neapzīmēta līnija", untagged_area: "Neapzīmēts apgabals", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Apzīmējums {tag} parasti tiek lietots apgabaliem, bet objekts nav apgabals", deprecated_tags: "Novecojuši apzīmējumi: {tags}" }, diff --git a/locale/nl.js b/locale/nl.js index 167b4df49..c7c888895 100644 --- a/locale/nl.js +++ b/locale/nl.js @@ -220,6 +220,7 @@ locale.nl = { untagged_point: "Punt zonder tags, dat geen onderdeel is van een lijn of vlak", untagged_line: "Lijn zonder tags", untagged_area: "Vlak zonder tags", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "De tag {tag} suggereert dat de lijn een vlak is, maar het is geen vlak", deprecated_tags: "Afgeschafte tags: {tags}" }, diff --git a/locale/pl.js b/locale/pl.js index 84c82f829..9b1c55268 100644 --- a/locale/pl.js +++ b/locale/pl.js @@ -220,6 +220,7 @@ locale.pl = { untagged_point: "Nieopisany punkt, który nie jest częścią linii lub obszaru.", untagged_line: "Nieopisana linia.", untagged_area: "Nieopisany obszar.", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Tag {tag} sugeruje, że linia powinna być obszarem, ale nim nie jest.", deprecated_tags: "Przestarzałe tagi: {tags}" }, diff --git a/locale/ru.js b/locale/ru.js index 40c43076c..f4c0b7fd2 100644 --- a/locale/ru.js +++ b/locale/ru.js @@ -220,6 +220,7 @@ locale.ru = { untagged_point: "Точка без тегов и не в составе линии или контура", untagged_line: "Линия без тегов", untagged_area: "Контур без тегов", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Тег {tag} обычно ставится на замкнутые контуры, но это не контур", deprecated_tags: "Теги устарели: {tags}" }, diff --git a/locale/tr.js b/locale/tr.js index 8ab536a46..7e2ff3bcb 100644 --- a/locale/tr.js +++ b/locale/tr.js @@ -220,6 +220,7 @@ locale.tr = { untagged_point: "Herhangi bir çizgi ya da alana bağlantısı olmayan ve etiketlenmemiş bir nokta.", untagged_line: "Etiketlenmemiş çizgi", untagged_area: "Etiketlenmemiş alan", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "{tag} etiketi buranın alan olmasını tavsiye ediyor ama alan değil.", deprecated_tags: "Kullanımdan kaldırılmış etiket : {tags}" }, diff --git a/locale/uk.js b/locale/uk.js index a4af77b77..dabf4d808 100644 --- a/locale/uk.js +++ b/locale/uk.js @@ -220,6 +220,7 @@ locale.uk = { untagged_point: "Точка без теґів, що не є частиною лінію чи полігону", untagged_line: "Лінія без теґів", untagged_area: "Полігон без теґів", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Теґ {tag} зазвичай ставться на полігони, але об’єкт ним не є", deprecated_tags: "Застарілі теґи: {tags}" }, diff --git a/locale/vi.js b/locale/vi.js index eb6532f77..fa22e4230 100644 --- a/locale/vi.js +++ b/locale/vi.js @@ -221,6 +221,7 @@ locale.vi = { untagged_point: "Địa điểm không có thẻ mà không trực thuộc đường kẻ hoặc vùng", untagged_line: "Đường kẻ không có thẻ", untagged_area: "Vùng không có thẻ", + many_deletions: "You're deleting {n} objects. Are you sure you want to do this? This will delete them from the map that everyone else sees on openstreetmap.org.", tag_suggests_area: "Thẻ {tag} có lẽ dành cho vùng nhưng được gắn vào đường kẻ", deprecated_tags: "Thẻ bị phản đối: {tags}" }, From 95b23b0760d3c52a17821fdc33fdb30a07cc10cc Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 27 Feb 2013 17:52:06 -0800 Subject: [PATCH 63/64] Add another div to the tail (#829) --- js/lib/d3.tail.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/js/lib/d3.tail.js b/js/lib/d3.tail.js index 225892e30..497bde4e1 100644 --- a/js/lib/d3.tail.js +++ b/js/lib/d3.tail.js @@ -1,6 +1,7 @@ d3.tail = function() { var text = false, container, + inner, xmargin = 25, tooltip_size = [0, 0], selection_size = [0, 0], @@ -13,11 +14,12 @@ d3.tail = function() { }); function setup() { - container = d3.select(document.body) .append('div') - .style('display', 'none') - .attr('class', 'tail tooltip-inner'); + .style('display', 'none') + .attr('class', 'tail tooltip-inner'); + + inner = container.append('div'); selection .on('mousemove.tail', mousemove) @@ -28,7 +30,6 @@ d3.tail = function() { .on('mousemove.tail', mousemove); selection_size = selection.size(); - } function show() { @@ -69,7 +70,7 @@ d3.tail = function() { return tail; } text = _; - container.text(text); + inner.text(text); tooltip_size = container.size(); return tail; }; From 571edc707d669fbcc0554ee28b829b67cb6ce3a6 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Wed, 27 Feb 2013 17:55:23 -0800 Subject: [PATCH 64/64] d3.tail -> iD.ui.Tail --- Makefile | 1 - combobox.html | 2 +- index.html | 2 +- js/id/renderer/map.js | 2 +- js/{lib/d3.tail.js => id/ui/tail.js} | 8 +++----- test/index.html | 2 +- 6 files changed, 7 insertions(+), 10 deletions(-) rename js/{lib/d3.tail.js => id/ui/tail.js} (96%) diff --git a/Makefile b/Makefile index 5d0077846..85de984aa 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,6 @@ all: \ js/lib/d3.keybinding.js \ js/lib/d3.one.js \ js/lib/d3.size.js \ - js/lib/d3.tail.js \ js/lib/d3.trigger.js \ js/lib/d3.typeahead.js \ js/lib/jxon.js \ diff --git a/combobox.html b/combobox.html index 34deb2d21..663355663 100644 --- a/combobox.html +++ b/combobox.html @@ -23,7 +23,6 @@ - @@ -70,6 +69,7 @@ + diff --git a/index.html b/index.html index 7d76a8712..80868f252 100644 --- a/index.html +++ b/index.html @@ -25,7 +25,6 @@ - @@ -92,6 +91,7 @@ + diff --git a/js/id/renderer/map.js b/js/id/renderer/map.js index be4366355..f672c55ed 100644 --- a/js/id/renderer/map.js +++ b/js/id/renderer/map.js @@ -21,7 +21,7 @@ iD.Map = function(context) { areas = iD.svg.Areas(roundedProjection), midpoints = iD.svg.Midpoints(roundedProjection), labels = iD.svg.Labels(roundedProjection), - tail = d3.tail(), + tail = iD.ui.Tail(), surface, tilegroup; function map(selection) { diff --git a/js/lib/d3.tail.js b/js/id/ui/tail.js similarity index 96% rename from js/lib/d3.tail.js rename to js/id/ui/tail.js index 497bde4e1..6ea83ed87 100644 --- a/js/lib/d3.tail.js +++ b/js/id/ui/tail.js @@ -1,4 +1,4 @@ -d3.tail = function() { +iD.ui.Tail = function() { var text = false, container, inner, @@ -7,8 +7,7 @@ d3.tail = function() { selection_size = [0, 0], transformProp = iD.util.prefixCSSProperty('Transform'); - var tail = function(selection) { - + function tail(selection) { d3.select(window).on('resize.tail-size', function() { selection_size = selection.size(); }); @@ -59,8 +58,7 @@ d3.tail = function() { } if (!container) setup(); - - }; + } tail.text = function(_) { if (!arguments.length) return text; diff --git a/test/index.html b/test/index.html index 948a4bc57..d7c22b43e 100644 --- a/test/index.html +++ b/test/index.html @@ -26,7 +26,6 @@ - @@ -78,6 +77,7 @@ +

&d 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 t<0@?V!g=@$O%*F^T?q|OieS Date: Mon, 25 Feb 2013 17:14:28 -0800 Subject: [PATCH 10/64] Fix build --- Makefile | 1 + js/id/ui/{ => preset}/address.js | 0 2 files changed, 1 insertion(+) rename js/id/ui/{ => preset}/address.js (100%) diff --git a/Makefile b/Makefile index 69eebd1e4..c88d095c1 100644 --- a/Makefile +++ b/Makefile @@ -51,6 +51,7 @@ all: \ js/id/svg/*.js \ js/id/ui.js \ js/id/ui/*.js \ + js/id/ui/preset/*.js \ js/id/presetdata.js \ js/id/validate.js \ js/id/end.js \ diff --git a/js/id/ui/address.js b/js/id/ui/preset/address.js similarity index 100% rename from js/id/ui/address.js rename to js/id/ui/preset/address.js From 9bfb8bb063aa9c82370fa1d5c455c7fe323b1ef0 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 17:14:35 -0800 Subject: [PATCH 11/64] Fix indentation --- js/id/ui/tageditor.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 7bb7dee96..65d656752 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -70,11 +70,11 @@ iD.ui.TagEditor = function() { .attr('class', 'icon icon-pre-text' + (presetMatch ? ' preset-' + presetMatch.icon : '')); var namewrap = headerwrap.append('div') - .attr('class', 'name col9 inspector-inner'); + .attr('class', 'name col9 inspector-inner'); typelabel.append('span') - .attr('class','label') - .text(presetMatch.name); + .attr('class','label') + .text(presetMatch.name); namewrap.append('h4').text(t('inspector.name')); @@ -105,7 +105,7 @@ iD.ui.TagEditor = function() { if (presetMatch) { tageditorpreset.call(presetUI - .preset(presetMatch)); + .preset(presetMatch)); } event.message(t('inspector.editing', { type: presetMatch.name })); From 1f1cd38cb5097455fb3911305ba14c4801100844 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 17:15:31 -0800 Subject: [PATCH 12/64] Remove unused --- js/id/ui/tageditor.js | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 65d656752..227d5d353 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -1,14 +1,11 @@ iD.ui.TagEditor = function() { var event = d3.dispatch('changeTags', 'choose', 'close', 'change', 'message'), - taginfo = iD.taginfo(), presetData = iD.presetData(), - inspectorbody, entity, tags, name, presetMatch, presetUI, - presetGrid, tagList, context; @@ -110,23 +107,13 @@ iD.ui.TagEditor = function() { event.message(t('inspector.editing', { type: presetMatch.name })); - var taglistwrap = editorwrap.append('div') + editorwrap.append('div') .attr('class','inspector-inner col12 fillL2').call(tagList); tageditor.tags(tags); event.change(tags); } - function drawHead(selection) { - var h2 = selection.append('h2'); - - h2.append('span') - .attr('class', 'icon big icon-pre-text big-' + entity.geometry(context.graph())); - - h2.append('span') - .text(entity.friendlyName()); - } - tageditor.tags = function(newtags) { if (!arguments.length) { tags = _.extend(presetUI.tags(), tagList.tags()); From 726f34d57251dca632c5e0bbb790092916e9fd38 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 17:28:04 -0800 Subject: [PATCH 13/64] Fix include --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index 9c633bc18..f8c88e85e 100644 --- a/index.html +++ b/index.html @@ -91,7 +91,7 @@ - + From fd7914e25a3345f66f8e21b7f60582f6d4c54b76 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 17:39:07 -0800 Subject: [PATCH 14/64] Always use period here h/t @1ec5 --- locale/en.js | 2 +- locale/vi.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/en.js b/locale/en.js index 672665743..2890187e2 100644 --- a/locale/en.js +++ b/locale/en.js @@ -112,7 +112,7 @@ locale.en = { vertex: "Moved a node in a way.", line: "Moved a line.", area: "Moved an area.", - multiple: "Moved multiple objects" + multiple: "Moved multiple objects." } }, reverse: { diff --git a/locale/vi.js b/locale/vi.js index 947cc687f..e1a8103a3 100644 --- a/locale/vi.js +++ b/locale/vi.js @@ -112,7 +112,7 @@ locale.vi = { vertex: "Di chuyển nốt trong lối.", line: "Di chuyển đường kẻ.", area: "Di chuyển vùng.", - multiple: "Di chuyển hơn một đối tượng" + multiple: "Di chuyển hơn một đối tượng." } }, reverse: { From 59f38d61e6b81688196d98e38b0e46b1ae734168 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 17:45:49 -0800 Subject: [PATCH 15/64] Obsolete --- docs/coding_standards.txt | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/docs/coding_standards.txt b/docs/coding_standards.txt index 5c5e8d6d1..2c509d515 100644 --- a/docs/coding_standards.txt +++ b/docs/coding_standards.txt @@ -15,16 +15,6 @@ In order to unify the construction interface for these two styles, classical cla [instanceof trick](http://ejohn.org/blog/simple-class-instantiation/). This allows instantiation of both module pattern classes and classical classes to be done without using `new`. -Function names --------------- -Anything that creates and calls an Action should be prefixed with do: - doSetLatLon(lat,lon) - -Anything that is called by an Action, to do the actual work, should be prefixed with an underscore: - _setLatLon(lat,lon) - -and commented as such. Underscores are also used to prefix private methods. - File naming ----------- The filename should be the name of the base class. You can add subclasses within From 93289a9dc66e360cbcc65cacc4bd56357ec802b9 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 17:47:15 -0800 Subject: [PATCH 16/64] Remove unused screenshot --- screenshot.jpg | Bin 165705 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 screenshot.jpg diff --git a/screenshot.jpg b/screenshot.jpg deleted file mode 100644 index 03d04ea17ca8d7f6dbc48fa609fcc6f8192bedc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165705 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 D0`=)c From 4f357daea173a522d7b56612a55d118174b19168 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Mon, 25 Feb 2013 17:54:08 -0800 Subject: [PATCH 17/64] Remove unused --- js/id/ui/inspector.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/js/id/ui/inspector.js b/js/id/ui/inspector.js index ddd7211b8..1b665ab2e 100644 --- a/js/id/ui/inspector.js +++ b/js/id/ui/inspector.js @@ -1,13 +1,10 @@ iD.ui.Inspector = function() { var event = d3.dispatch('changeTags', 'close', 'change'), - taginfo = iD.taginfo(), presetData = iD.presetData(), initial = false, inspectorbody, entity, - presetUI, presetGrid, - tagList, tagEditor, context; From b247191f620abac210f1e40299c79e99a6ec238d Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 10:38:41 -0500 Subject: [PATCH 18/64] stop leaving combobox divs lying around --- js/lib/d3.combobox.js | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/js/lib/d3.combobox.js b/js/lib/d3.combobox.js index 815256045..c390392c4 100644 --- a/js/lib/d3.combobox.js +++ b/js/lib/d3.combobox.js @@ -15,15 +15,6 @@ d3.combobox = function() { var idx = -1; input = selection.select('input'); - container = d3.select(document.body) - .insert('div', ':first-child') - .attr('class', 'combobox') - .style({ - position: 'absolute', - display: 'none', - left: '0px' - }); - selection.append('a', selection.select('input')) .attr('class', 'combobox-carat') .on('mousedown', stop) @@ -64,14 +55,26 @@ d3.combobox = function() { } function show() { - container.style('display', 'block'); - shown = true; + if (!shown) { + container = d3.select(document.body) + .insert('div', ':first-child') + .attr('class', 'combobox') + .style({ + position: 'absolute', + display: 'block', + left: '0px' + }); + + shown = true; + } } function hide() { - idx = -1; - container.style('display', 'none'); - shown = false; + if (shown) { + idx = -1; + container.remove(); + shown = false; + } } function slowHide() { From 051e05dcf73364c11604fd5f6928988a8e741411 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 11:37:34 -0500 Subject: [PATCH 19/64] return after hiding combobox --- js/lib/d3.combobox.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/lib/d3.combobox.js b/js/lib/d3.combobox.js index c390392c4..7cdda51cd 100644 --- a/js/lib/d3.combobox.js +++ b/js/lib/d3.combobox.js @@ -192,7 +192,7 @@ d3.combobox = function() { if (data.length && document.activeElement === input.node()) show(); - else hide(); + else return hide(); autocomplete(e, data); From 1548742c4060717168b650ae43f4121f8c4330ee Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 11:52:56 -0500 Subject: [PATCH 20/64] Focus type button when displaying inspector One tab away from name Not a text input, so operation shortcuts still work --- js/id/ui/tageditor.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 227d5d353..0c3216597 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -57,19 +57,21 @@ iD.ui.TagEditor = function() { typewrap.append('h4').text('Type'); - var typelabel = typewrap.append('button') + var typebutton = typewrap.append('button') .attr('class','col12') .on('click', function() { event.choose(); }); - typelabel.append('div') + typebutton.append('div') .attr('class', 'icon icon-pre-text' + (presetMatch ? ' preset-' + presetMatch.icon : '')); + typebutton.node().focus(); + var namewrap = headerwrap.append('div') .attr('class', 'name col9 inspector-inner'); - typelabel.append('span') + typebutton.append('span') .attr('class','label') .text(presetMatch.name); From 9681ebd2522a955c0e58b7407aa70d925b4658a3 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 12:02:15 -0500 Subject: [PATCH 21/64] Add rough description box for presets --- css/app.css | 10 ++++++++++ js/id/ui/presetgrid.js | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/css/app.css b/css/app.css index 380ee0cdd..16ad86d8f 100644 --- a/css/app.css +++ b/css/app.css @@ -769,6 +769,16 @@ div.combobox { position: absolute; } +.grid-entry .preset-help { + position: absolute; + bottom: 0px; + right: 0px; +} + +.preset-inspect { + position: relative; +} + .grid-entry .preset-icon-fill.area { position: absolute; opacity: 0.4; diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index 6087c5fb0..2ee182855 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -100,6 +100,41 @@ iD.ui.PresetGrid = function() { entered.append('div') .attr('class', function(d) { return 'preset-' + d.icon + ' icon'; }); + var presetinspect; + + entered.append('button') + .attr('tabindex', -1) + .attr('class', 'preset-help minor') + .on('click', function(d) { + + // Display description box inline + + d3.event.stopPropagation(); + + var entry = this.parentNode, + index, + entries = selection.selectAll('button.grid-entry'); + + if (presetinspect && presetinspect.remove().datum() === d) { + presetinspect = null; + return; + } + + entries.each(function(d, i) { + if (this === entry) index = i; + }); + + var selector = '.grid-entry:nth-child(' + (Math.floor(index/4) * 4 + 5 ) + ')'; + + presetinspect = selection.insert('div', selector) + .attr('class', 'preset-inspect col12') + .datum(d); + + presetinspect.append('h2').text(d.title || d.name); + }) + .append('span') + .attr('class', 'icon inspect'); + entered.append('span').attr('class','label').text(name); entries.exit().remove(); From a32858caa59ea298d1f8fba390634293a51e3ca3 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 12:39:35 -0500 Subject: [PATCH 22/64] Only debounce taginfo for taglist autocompletion --- js/id/services/taginfo.js | 25 ++++++++++++++++--------- js/id/ui/taglist.js | 2 ++ js/lib/d3.combobox.js | 2 ++ 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/js/id/services/taginfo.js b/js/id/services/taginfo.js index 1db8b8877..74e5dc311 100644 --- a/js/id/services/taginfo.js +++ b/js/id/services/taginfo.js @@ -32,7 +32,7 @@ iD.taginfo = function() { } function clean(parameters) { - return _.omit(parameters, 'geometry'); + return _.omit(parameters, 'geometry', 'debounce'); } function shorten(parameters) { @@ -65,18 +65,23 @@ iD.taginfo = function() { var debounced = _.debounce(d3.json, 100, true); - function request(url, callback) { + function request(url, debounce, callback) { if (cache[url]) { callback(null, cache[url]); + } else if (debounce) { + debounced(url, done); } else { - debounced(url, function(err, data) { - if (!err) cache[url] = data; - callback(err, data); - }); + d3.json(url, done); + } + + function done(err, data) { + if (!err) cache[url] = data; + callback(err, data); } } taginfo.keys = function(parameters, callback) { + var debounce = parameters.debounce; parameters = clean(shorten(setSort(setFilter(parameters)))); request(endpoint + 'keys/all?' + iD.util.qsString(_.extend({ @@ -84,13 +89,14 @@ iD.taginfo = function() { sortname: 'count_all', sortorder: 'desc', page: 1 - }, parameters)), function(err, d) { + }, parameters)), debounce, function(err, d) { if (err) return callback(err); callback(null, d.data.filter(popularKeys(parameters)).map(valKey)); }); }; taginfo.values = function(parameters, callback) { + var debounce = parameters.debounce; parameters = clean(shorten(setSort(setFilter(parameters)))); request(endpoint + 'key/values?' + iD.util.qsString(_.extend({ @@ -98,16 +104,17 @@ iD.taginfo = function() { sortname: 'count_all', sortorder: 'desc', page: 1 - }, parameters)), function(err, d) { + }, parameters)), debounce, function(err, d) { if (err) return callback(err); callback(null, d.data.filter(popularValues()).map(valKeyDescription), parameters); }); }; taginfo.docs = function(parameters, callback) { + var debounce = parameters.debounce; parameters = clean(setSort(parameters)); request(endpoint + 'tag/wiki_pages?' + - iD.util.qsString(parameters), callback); + iD.util.qsString(parameters), debounce, callback); }; taginfo.endpoint = function(_) { diff --git a/js/id/ui/taglist.js b/js/id/ui/taglist.js index 946866254..00ef1e596 100644 --- a/js/id/ui/taglist.js +++ b/js/id/ui/taglist.js @@ -217,6 +217,7 @@ iD.ui.Taglist = function() { key.call(d3.combobox() .fetcher(function(_, __, callback) { taginfo.keys({ + debounce: true, geometry: geometry, query: keyinput.property('value') }, function(err, data) { @@ -228,6 +229,7 @@ iD.ui.Taglist = function() { value.call(d3.combobox() .fetcher(function(_, __, callback) { taginfo.values({ + debounce: true, key: keyinput.property('value'), geometry: geometry, query: valueinput.property('value') diff --git a/js/lib/d3.combobox.js b/js/lib/d3.combobox.js index 7cdda51cd..1e2ae0a28 100644 --- a/js/lib/d3.combobox.js +++ b/js/lib/d3.combobox.js @@ -233,6 +233,8 @@ d3.combobox = function() { input.node().focus(); update(''); + if (!container) return; + var entries = container.selectAll('a'), height = container.node().scrollHeight / entries[0].length, w = d3.select(window); From 5073c3b8c3258d4a7f6546fac1f8b8b83d1e1c66 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 12:41:41 -0500 Subject: [PATCH 23/64] hover style also on focus, for buttons --- css/app.css | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/css/app.css b/css/app.css index 16ad86d8f..1d287901b 100644 --- a/css/app.css +++ b/css/app.css @@ -278,6 +278,7 @@ button { transition: background 100ms; } +button:focus, button:hover { background-color: #ececec; } @@ -756,19 +757,10 @@ div.combobox { margin-bottom: 20px; } -.preset-grid.filtered .grid-entry:first-child, -.preset-grid .grid-entry .grid-inner:hover { +.preset-grid.filtered .grid-entry:first-child { background: #ececec; } -.preset-grid .grid-entry .grid-inner:hover { - background: inherit; -} - -.grid-entry .grid-inner { - position: absolute; -} - .grid-entry .preset-help { position: absolute; bottom: 0px; From d964d7fe289a65c5b89225e4264753e7f5f64d10 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 13:04:24 -0500 Subject: [PATCH 24/64] remove highway=residential as default tag --- css/map.css | 5 +++++ js/id/modes/add_line.js | 9 ++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/css/map.css b/css/map.css index 910050010..d4cb0eb21 100644 --- a/css/map.css +++ b/css/map.css @@ -229,6 +229,11 @@ path.area.fill { fill-rule: evenodd; } +path.line.stroke { + stroke: white; + stroke-width: 2; +} + path.stroke.tag-natural { stroke: #b6e199; stroke-width:1; diff --git a/js/id/modes/add_line.js b/js/id/modes/add_line.js index ae1d03cef..ef5a43c0d 100644 --- a/js/id/modes/add_line.js +++ b/js/id/modes/add_line.js @@ -10,13 +10,12 @@ iD.modes.AddLine = function(context) { var behavior = iD.behavior.AddWay(context) .on('start', start) .on('startFromWay', startFromWay) - .on('startFromNode', startFromNode), - defaultTags = {highway: 'residential'}; + .on('startFromNode', startFromNode); function start(loc) { var graph = context.graph(), node = iD.Node({loc: loc}), - way = iD.Way({tags: defaultTags}); + way = iD.Way(); context.perform( iD.actions.AddEntity(node), @@ -29,7 +28,7 @@ iD.modes.AddLine = function(context) { function startFromWay(other, loc, index) { var graph = context.graph(), node = iD.Node({loc: loc}), - way = iD.Way({tags: defaultTags}); + way = iD.Way(); context.perform( iD.actions.AddEntity(node), @@ -52,7 +51,7 @@ iD.modes.AddLine = function(context) { context.enter(iD.modes.DrawLine(context, parent.id, 'forward', graph)); } else { - var way = iD.Way({tags: defaultTags}); + var way = iD.Way(); context.perform( iD.actions.AddEntity(way), From 0ac770de3bc354bae1bf902c5291c60b7ddde8e0 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 26 Feb 2013 10:47:45 -0800 Subject: [PATCH 25/64] Bring in changes from blog post --- ARCHITECTURE.md | 133 +++++++++++++++++++++++++++++++----------------- 1 file changed, 87 insertions(+), 46 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index b07566f1e..6a31b0161 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -19,35 +19,41 @@ which implements map panning and zooming. ## Core -The iD *core* implements the OSM data types, a graph of OSM object's -relationships to each other, an undo/redo history for changes made during -editing, and a couple of important auxiliary classes. It aims to be generic -enough to be used by other JavaScript-based tools for OpenStreetMap. +The iD *core* implements OSM data types, a graph of OSM objects' +relationships to one another, an undo/redo history for changes made during +editing, and a couple of important auxiliary classes. It eventually aims +to be a reusable, modular library to kickstart other JavaScript-based +tools for OpenStreetMap. -Briefly, the OSM data model includes three basic data types: nodes, ways, and -relations. A _node_ is a point type, having a single geographic coordinate. A -_way_ is an ordered list of nodes. And a _relation_ groups together nodes, -ways, and other relations to provide free-form higher-level structures. Each -of these three types has _tags_: an associative array of key-value pairs which +The OSM data model includes three basic data types: nodes, ways, and +relations. + +* A _node_ is a point type, having a single geographic coordinate. +* A _way_ is an ordered list of nodes. +* A _relation_ groups together nodes, ways, and other relations to provide + free-form higher-level structures. + +Each of these three types has _tags_: an associative array of key-value pairs which describe the object. In iD, these three types are implemented by `iD.Node`, `iD.Way` and -`iD.Relation`. These three classes inherit from a common base, `iD.Entity` -(the only use of classical inheritance in iD). Generically, we refer to a +`iD.Relation`. These three classes inherit from a common base, `iD.Entity`. +This is the only use of classical inheritance in iD, but it's justified +by the common functionality of the types. Generically, we refer to a node, way or relation as an _entity_. -Every entity has an _ID_ either assigned by the OSM database, or, for an -entity that is newly created, constructed as a proxy consisting of a negative -numeral. IDs from the OSM database as treated as opaque strings; no +Every entity has an _ID_ either assigned by the OSM database or +a negative, local identifier assigned by iD for newly-created objects. +IDs from the OSM database as treated as opaque strings; no [assumptions](http://lists.openstreetmap.org/pipermail/dev/2013-February/026495.html) are made of them other than that they can be compared for identity and do not -begin with a minus sign (and thus will not conflict with proxy IDs). In fact, -in the OSM database the three types of entities have separate ID spaces; a -node can have the same ID as a way, for instance. Because it is useful to -store heterogeneous entities in the same datastructure, iD ensures that every -entity has a fully-unique ID by prefixing each OSM ID with the first letter of -the entity type. For example, a way with OSM ID 123456 is represented as -'w123456' within iD. +begin with a minus sign (and thus will not conflict with proxy IDs). The three +types of entities have separate ID spaces: a +node can have the same numeric ID as a way or a relation. Instead of segregating +ways, nodes, and other entities into different datastructures, +iD internally uses fully-unique IDs generated by prefixing +each OSM ID with the first letter of the entity type. For example, a way +with OSM ID 123456 is represented as 'w123456' within iD. iD entities are *immutable*: once constructed, an `Entity` object cannot change. Tags cannot be updated; nodes cannot be added or removed from ways, @@ -56,8 +62,9 @@ entity: if your code has a reference to one, it is safe to store it and use it later, knowing that it cannot have been changed outside of your control. It also makes it possible to implement the entity graph (described below) as an efficient [persistent data -structure](http://en.wikipedia.org/wiki/Persistent_data_structure). But -obviously, iD is an editor, and must allow entities to change somehow. The +structure](http://en.wikipedia.org/wiki/Persistent_data_structure). + +Since iD is an editor, it must allow for new versions of entities. The solution is that all edits produce new copies of anything that changes. At the entity level, this takes the form of methods such as `iD.Node#move`, which returns a new node object that has the same ID and tags as the original, but a @@ -65,46 +72,81 @@ different coordinate. More generically, `iD.Entity#update` returns a new entity of the same type and ID as the original but with specified properties such as `nodes`, `tags`, or `members` replaced. +![](http://farm9.staticflickr.com/8087/8508309757_ccf5b6f09b_o.png) + Entities are related to one another: ways have many nodes and relations have -many members. In order to render a map of a certain area, iD needs a +many members. To render a map of a certain area, iD needs a datastructure to hold all the entities in that area and traverse these relationships. `iD.Graph` provides this functionality. The core of a graph is a map between IDs and the associated entities; given an ID, the graph can give you the entity. Like entities, a graph is immutable: adding, replacing, or removing an entity produces a new graph, and the original is unchanged. -Because entities are immutable, the original and new graphs can share -references to entities that have not changed, keeping memory use to a minimum. -If you are familiar with how git works internally, this persistent data -structure approach is very similar. +Because entities are immutable, the original and new graphs can minimize +memory use by sharing references to entities that have not changed instead of +copying the entire graph. +This persistent data structure approach is similar to the internals of +the [git](http://git-scm.com/) revision control system. -The last major component of the core is `iD.History`, which tracks the changes -made in an editing session and provide undo/redo capabilities. Here, the +The final major component of the core is `iD.History`, which tracks the changes +made in an editing session and provides undo/redo capabilities. Here, the immutable nature of the core types really pays off: the history is a simple stack of graphs, each representing the state of the data at a particular point in editing. The graph at the top of the stack is the current state, off which all rendering is based. To undo the last change, this graph is popped off the -stack, and the map is re-rendered based on the new top of the stack. Contrast -this to a mutable graph as used in JOSM and Potlatch: every command that -changes the graph must implement an equal and opposite undo command that -restores the graph to the previous state. +stack, and the map is re-rendered based on the new top of the stack. -Finally, we have the auxiliary classes `iD.Difference` and `iD.Tree`. The first -encapsulates the difference between two graphs, and knows how to calculate the +This approach constitutes one of the main differences between iD's approach +to data and that of [JOSM](http://josm.openstreetmap.de/) and +[Potlatch 2](http://wiki.openstreetmap.org/wiki/Potlatch_2). +Instead of changing a single copy of local data and having to implement +an 'undo' for each specific action, actions in iD do not need to be aware +of history and the undo system. + +Finally, we have the auxiliary classes `iD.Difference` and `iD.Tree`. + +`iD.Difference` encapsulates the difference between two graphs, and knows how to calculate the set of entities that were created, modified, or deleted, and need to be redrawn. -The second provides a means of calculating which entities, out of all that have -been downloaded, are currently visible. In order to do this very quickly as you -pan or zoom the map, it uses an [R-tree](http://en.wikipedia.org/wiki/R-tree). + +```js +var a = iD.Graph(), b = iD.Graph(); +// (fill a & b with data) +var difference = iD.Difference(a, b); + +// returns entities created between and b +difference.created(); +``` + +`iD.Tree` calculates the set of downloaded entities that are visible in the +current map view. To calculate this quickly during map +interaction, it uses an [R-tree](http://en.wikipedia.org/wiki/R-tree). + +```js +var graph = iD.Graph(); +// (load OSM data into graph) + +// this tree indexes the contents of the graph +var tree = iD.Tree(graph); + +// quickly pull all features that intersect with an extent +var features = tree.intersects( + iD.geo.Extent([0, 0], [2, 2]), tree.graph()); +``` ## Actions In iD, an _action_ is a function that accepts a graph as input and returns a -modified graph as output. Actions typically need other inputs as well; for +new, modified graph as output. Actions typically need other inputs as well; for example, `iD.actions.DeleteNode` also requires the ID of a node to delete. The additional input is passed to the action's constructor: -``` -var action = iD.actions.DeleteNode('n123456'); // construct the action var -newGraph = action(oldGraph); // apply the action +```js +// construct the action: this returns a function that remembers the +// value `n123456` in a closure so that when it's called, it runs +// the specified action on the graph +var action = iD.actions.DeleteNode('n123456'); + +// apply the action, yielding a new graph. oldGraph is untouched. +newGraph = action(oldGraph); ``` iD provides actions for all the typical things an editor needs to do: add a @@ -120,9 +162,8 @@ is a member. As you can imagine, implementing all these details requires an expert knowledge of the OpenStreetMap data model. It is our hope that JavaScript -based tools for OpenStreetMap can reuse the implementations provided by iD in -other contexts, significantly reducing the work necessary to create a robust -tool. +based tools for OpenStreetMap can reuse the iD's core implementation, +significantly reducing the work necessary to create a robust tool. ## Modes From f057bfebc72b16155da79e6f3c359edf865d1182 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 14:01:26 -0500 Subject: [PATCH 26/64] Expand additional tags for other preset --- js/id/ui/tageditor.js | 2 +- js/id/ui/taglist.js | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 0c3216597..5173409b8 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -110,7 +110,7 @@ iD.ui.TagEditor = function() { event.message(t('inspector.editing', { type: presetMatch.name })); editorwrap.append('div') - .attr('class','inspector-inner col12 fillL2').call(tagList); + .attr('class','inspector-inner col12 fillL2').call(tagList, presetMatch.name === 'other'); tageditor.tags(tags); event.change(tags); diff --git a/js/id/ui/taglist.js b/js/id/ui/taglist.js index 00ef1e596..88f60f7e1 100644 --- a/js/id/ui/taglist.js +++ b/js/id/ui/taglist.js @@ -6,7 +6,7 @@ iD.ui.Taglist = function() { list, context; - function taglist(selection) { + function taglist(selection, expanded) { collapsebutton = selection.append('a') .attr('href','#') @@ -16,10 +16,11 @@ iD.ui.Taglist = function() { collapsebutton.classed('expanded', wrap.classed('hide')); wrap.call(iD.ui.Toggle(wrap.classed('hide'))); selection.node().parentNode.scrollTop += 200; - }); + }) + .classed('expanded', expanded); var wrap = selection.append('div') - .attr('class', 'hide'); + .classed('hide', !expanded); list = wrap.append('ul') .attr('class', 'tag-list'); From 763c9dad599d79af685fb2779d6a521183997853 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 15:01:59 -0500 Subject: [PATCH 27/64] special case for 'other' preset --- js/id/presetdata.js | 18 +++++++++++++++--- js/id/ui/presetgrid.js | 3 ++- presets/presets.json | 23 ++--------------------- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/js/id/presetdata.js b/js/id/presetdata.js index aec3e6b4d..8ccee1176 100644 --- a/js/id/presetdata.js +++ b/js/id/presetdata.js @@ -1,7 +1,19 @@ iD.presetData = function() { + + var other = { + name: 'other', + title: 'Other', + icon: 'marker-stroked', + match: { + tags: {}, + type: ['node', 'line', 'area'] + }, + form: [] + }; + var presets = {}, - data = [], - categories = {}, + data = [other], + categories = [], defaults = { node: [], area: [], @@ -16,7 +28,7 @@ iD.presetData = function() { presets.data = function(_) { if (!arguments.length) return data; - data = _.presets; + data = _.presets.concat([other]); categories = _.categories; defaults = _.defaults; return presets; diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index 2ee182855..67a117223 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -56,7 +56,8 @@ iD.ui.PresetGrid = function() { return iD.util.editDistance(value, a.name) - iD.util.editDistance(value, b.name); }).filter(function(d) { - return iD.util.editDistance(value, d.name) - d.name.length + value.length < 3; + return iD.util.editDistance(value, d.name) - d.name.length + value.length < 3 || + d.name === 'other'; }); } diff --git a/presets/presets.json b/presets/presets.json index 4b1063f31..b3e301f41 100644 --- a/presets/presets.json +++ b/presets/presets.json @@ -13,7 +13,8 @@ "form": [ { "key": "cuisine", - "type": "combo" + "type": "combo", + "indexed": true }, { "key": "internet_access", @@ -645,26 +646,6 @@ "title": "Address" } ] - }, - { - "title": "Other", - "name": "other", - "match": { - "type": ["line", "area"], - "tags": {} - }, - "icon": "square-stroked", - "form": [] - }, - { - "title": "Other", - "name": "other", - "match": { - "type": ["node"], - "tags": {} - }, - "icon": "marker-stroked", - "form": [] } ], From 87564bc0e29224a46e87f4e70cf88629f4544bb2 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 15:03:20 -0500 Subject: [PATCH 28/64] Fix taginfo tests --- test/spec/taginfo.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/spec/taginfo.js b/test/spec/taginfo.js index 61f7bcea0..0582401af 100644 --- a/test/spec/taginfo.js +++ b/test/spec/taginfo.js @@ -25,7 +25,7 @@ describe("iD.taginfo", function() { server.respond(); expect(query(server.requests[0].url)).to.eql( - {query: "amen", page: "1", rp: "6", sortname: "count_all", sortorder: "desc"}); + {query: "ame", page: "1", rp: "10", sortname: "count_all", sortorder: "desc"}); expect(callback).to.have.been.calledWith(null, [{"value":"amenity"}]); }); @@ -49,11 +49,11 @@ describe("iD.taginfo", function() { server.respondWith("GET", new RegExp("http://taginfo.openstreetmap.org/api/4/keys/all"), [200, { "Content-Type": "application/json" }, - '{"data":[{"count_all":5190337,"key":"amenity","count_all_fraction":1.0, "count_nodes_fraction":1.0},\ - {"count_all":1,"key":"amenityother","count_all_fraction":0.0, "count_nodes_fraction":1.0}]}']); + '{"data":[{"count_all":5190337,"count_nodes":500000,"key":"amenity","count_all_fraction":1.0, "count_nodes_fraction":1.0},\ + {"count_all":1,"key":"amenityother","count_all_fraction":0.0, "count_nodes":100}]}']); server.respond(); - expect(callback).to.have.been.calledWith(null, [{"value":"amenity"},{"value":"amenityother"}]); + expect(callback).to.have.been.calledWith(null, [{"value":"amenity"}]); }); }); From e9db73d7d3759bd7fbf66fd4a99b8084cd2d5ad6 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 15:14:15 -0500 Subject: [PATCH 29/64] Update translations --- locale/da.js | 6 +++++- locale/de.js | 6 +++++- locale/es.js | 6 +++++- locale/fr.js | 6 +++++- locale/it.js | 6 +++++- locale/ja.js | 6 +++++- locale/lv.js | 6 +++++- locale/nl.js | 6 +++++- locale/pl.js | 6 +++++- locale/ru.js | 6 +++++- locale/tr.js | 6 +++++- locale/uk.js | 6 +++++- locale/vi.js | 6 +++++- 13 files changed, 65 insertions(+), 13 deletions(-) diff --git a/locale/da.js b/locale/da.js index 6d68e36d7..73d4e7b06 100644 --- a/locale/da.js +++ b/locale/da.js @@ -179,7 +179,11 @@ locale.da = { new_tag: "Nyt tag", edit_tags: "Ret tags", okay: "Ok", - view_on_osm: "Vis på OSM" + view_on_osm: "Vis på OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, restore: { diff --git a/locale/de.js b/locale/de.js index 1c56f5ce7..c8450eda5 100644 --- a/locale/de.js +++ b/locale/de.js @@ -171,7 +171,11 @@ locale.de = { new_tag: "Neues Attribut", edit_tags: "Attribute bearbeiten", okay: "OK", - view_on_osm: "auf OpenStreetMap ansehen" + view_on_osm: "auf OpenStreetMap ansehen", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/es.js b/locale/es.js index d7078d512..b253fdf7d 100644 --- a/locale/es.js +++ b/locale/es.js @@ -171,7 +171,11 @@ locale.es = { new_tag: "Nueva etiqueta", //"New Tag" edit_tags: "Editar etiquetas", //"Edit tags", okay: "OK", - view_on_osm: "Ver en OSM" //"View on OSM" + view_on_osm: "Ver en OSM", //"View on OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/fr.js b/locale/fr.js index 66dba3304..e498a1a2a 100644 --- a/locale/fr.js +++ b/locale/fr.js @@ -171,7 +171,11 @@ locale.fr = { new_tag: "Nouveau tag", edit_tags: "Editer les tags", okay: "Okay", - view_on_osm: "Visualiser sur OSM" + view_on_osm: "Visualiser sur OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/it.js b/locale/it.js index eb6fdff43..623de7813 100644 --- a/locale/it.js +++ b/locale/it.js @@ -171,7 +171,11 @@ locale.it = { new_tag: "Nuovo Tag", edit_tags: "Modifica i tag", okay: "Ok", - view_on_osm: "Mostra su OSM" + view_on_osm: "Mostra su OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/ja.js b/locale/ja.js index 025b7f992..6871d7543 100644 --- a/locale/ja.js +++ b/locale/ja.js @@ -171,7 +171,11 @@ locale.ja = { new_tag: "新規タグ", edit_tags: "タグ編集", okay: "OK", - view_on_osm: "詳細情報確認" + view_on_osm: "詳細情報確認", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/lv.js b/locale/lv.js index 70c966f43..1915379ba 100644 --- a/locale/lv.js +++ b/locale/lv.js @@ -171,7 +171,11 @@ locale.lv = { new_tag: "Jauns apzīmējums", edit_tags: "Labot apzīmējumus", okay: "Labi", - view_on_osm: "Apskatīt OSM" + view_on_osm: "Apskatīt OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/nl.js b/locale/nl.js index fb183ced8..167b4df49 100644 --- a/locale/nl.js +++ b/locale/nl.js @@ -171,7 +171,11 @@ locale.nl = { new_tag: "Nieuwe tag", edit_tags: "Tags aanpassen", okay: "OK", - view_on_osm: "Bekijk op OSM" + view_on_osm: "Bekijk op OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/pl.js b/locale/pl.js index 9021fac2f..84c82f829 100644 --- a/locale/pl.js +++ b/locale/pl.js @@ -171,7 +171,11 @@ locale.pl = { new_tag: "Nowy tag", edit_tags: "Edytuj tagi", okay: "Okej", - view_on_osm: "Zobacz w OSM" + view_on_osm: "Zobacz w OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/ru.js b/locale/ru.js index 11b10fb61..40c43076c 100644 --- a/locale/ru.js +++ b/locale/ru.js @@ -171,7 +171,11 @@ locale.ru = { new_tag: "Новый тег", edit_tags: "Править теги", okay: "Готово", - view_on_osm: "Посмотреть в OSM" + view_on_osm: "Посмотреть в OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/tr.js b/locale/tr.js index aaa3e3ea7..8ab536a46 100644 --- a/locale/tr.js +++ b/locale/tr.js @@ -171,7 +171,11 @@ locale.tr = { new_tag: "Yeni Etiket", edit_tags: "Etiketleri güncelle", okay: "Tamam", - view_on_osm: "View on OSM" + view_on_osm: "View on OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/uk.js b/locale/uk.js index ffa5eaeda..a4af77b77 100644 --- a/locale/uk.js +++ b/locale/uk.js @@ -171,7 +171,11 @@ locale.uk = { new_tag: "Новий теґ", edit_tags: "Редагувати теґи", okay: "Готово", - view_on_osm: "Подивтись в ОСМ" + view_on_osm: "Подивтись в ОСМ", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { diff --git a/locale/vi.js b/locale/vi.js index e1a8103a3..eb6532f77 100644 --- a/locale/vi.js +++ b/locale/vi.js @@ -172,7 +172,11 @@ locale.vi = { new_tag: "Thẻ Mới", edit_tags: "Sửa đổi các thẻ", okay: "OK", - view_on_osm: "Xem tại OSM" + view_on_osm: "Xem tại OSM", + name: "Name", + editing: "Editing {type}", + additional: "Additional tags", + choose: "What are you adding?" }, layerswitcher: { From dd11c4128a20e2ae241149865d9159c0cc4fcd02 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 16:19:27 -0500 Subject: [PATCH 30/64] Add cancel button to preset grid --- js/id/ui/inspector.js | 35 +++++------------------------------ js/id/ui/presetgrid.js | 22 +++++++++++++++++++++- js/id/ui/tageditor.js | 39 ++++++++++++++++++++++++++++++++++----- 3 files changed, 60 insertions(+), 36 deletions(-) diff --git a/js/id/ui/inspector.js b/js/id/ui/inspector.js index 1b665ab2e..b07f49814 100644 --- a/js/id/ui/inspector.js +++ b/js/id/ui/inspector.js @@ -18,9 +18,6 @@ iD.ui.Inspector = function() { inspectorbody = selection.append('div') .attr('class', 'fillL'), - selection.append('div') - .attr('class', 'inspector-actions pad1 fillD col12') - .call(drawButtons); presetGrid = iD.ui.PresetGrid() .presetData(presetData) @@ -36,11 +33,14 @@ iD.ui.Inspector = function() { .tags(entity.tags) .context(context) .on('message', changeMessage) - .on('change', function() { + .on('changeTags', function() { event.changeTags(entity, inspector.tags()); }) + .on('close', function() { + event.close(entity); + }) .on('choose', function() { - inspectorbody.call(presetGrid); + inspectorbody.call(presetGrid, true); }); function changeMessage(msg) { message.text(msg);} @@ -55,31 +55,6 @@ iD.ui.Inspector = function() { selection.call(iD.ui.Toggle(true)); } - function drawButtons(selection) { - var entity = selection.datum(); - - var inspectorButton = selection.append('button') - .attr('class', 'apply action') - .on('click', apply); - - inspectorButton.append('span') - .attr('class','label') - .text(t('inspector.okay')); - - var minorButtons = selection.append('div') - .attr('class','minor-buttons fl'); - - minorButtons.append('a') - .attr('href', 'http://www.openstreetmap.org/browse/' + entity.type + '/' + entity.osmId()) - .attr('target', '_blank') - .text(t('inspector.view_on_osm')); - } - - function apply(entity) { - event.changeTags(entity, inspector.tags()); - event.close(entity); - } - inspector.tags = function(tags) { if (!arguments.length) { return tagEditor.tags(); diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index 67a117223..ce36245bf 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -4,7 +4,7 @@ iD.ui.PresetGrid = function() { context, presetData; - function presetgrid(selection) { + function presetgrid(selection, preset) { selection.html(''); @@ -36,6 +36,11 @@ iD.ui.PresetGrid = function() { }); search.node().focus(); + if (preset) { + selection.append('div') + .attr('class', 'inspector-actions pad1 fillD col12') + .call(drawButtons); + } function filter(value) { if (!value) return presetData.defaults(entity); @@ -142,6 +147,21 @@ iD.ui.PresetGrid = function() { entries.order(); } + function cancel() { + event.choose(); + } + + function drawButtons(selection) { + + var inspectorButton = selection.append('button') + .attr('class', 'apply action') + .on('click', cancel); + + inspectorButton.append('span') + .attr('class','label') + .text(t('commit.cancel')); + } + presetgrid.presetData = function(_) { if (!arguments.length) return presetData; presetData = _; diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 5173409b8..94a47fe2f 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -1,5 +1,5 @@ iD.ui.TagEditor = function() { - var event = d3.dispatch('changeTags', 'choose', 'close', 'change', 'message'), + var event = d3.dispatch('changeTags', 'choose', 'close', 'message'), presetData = iD.presetData(), entity, tags, @@ -83,20 +83,20 @@ iD.ui.TagEditor = function() { .attr('type', 'text') .property('value', entity.tags.name) .on('blur', function() { - event.change(); + event.changeTags(); }); presetUI = iD.ui.preset() .context(context) .entity(entity) .on('change', function(tags) { - event.change(tags); + event.changeTags(); }); tagList = iD.ui.Taglist() .context(context) .on('change', function(tags) { - event.change(tags); + event.changeTags(); }); var tageditorpreset = editorwrap.append('div') @@ -112,8 +112,37 @@ iD.ui.TagEditor = function() { editorwrap.append('div') .attr('class','inspector-inner col12 fillL2').call(tagList, presetMatch.name === 'other'); + selection.append('div') + .attr('class', 'inspector-actions pad1 fillD col12') + .call(drawButtons); + tageditor.tags(tags); - event.change(tags); + + event.changeTags(); + } + + function apply(entity) { + event.changeTags(); + event.close(); + } + + function drawButtons(selection) { + + var inspectorButton = selection.append('button') + .attr('class', 'apply action') + .on('click', apply); + + inspectorButton.append('span') + .attr('class','label') + .text(t('inspector.okay')); + + var minorButtons = selection.append('div') + .attr('class','minor-buttons fl'); + + minorButtons.append('a') + .attr('href', 'http://www.openstreetmap.org/browse/' + entity.type + '/' + entity.osmId()) + .attr('target', '_blank') + .text(t('inspector.view_on_osm')); } tageditor.tags = function(newtags) { From 144c8735e45722f067215b705df7ddd0c00944c5 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 16:44:24 -0500 Subject: [PATCH 31/64] change preset ui when undone/redone if necessary --- js/id/ui/tageditor.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/js/id/ui/tageditor.js b/js/id/ui/tageditor.js index 94a47fe2f..6394efb9e 100644 --- a/js/id/ui/tageditor.js +++ b/js/id/ui/tageditor.js @@ -5,6 +5,7 @@ iD.ui.TagEditor = function() { tags, name, presetMatch, + selection_, presetUI, tagList, context; @@ -12,6 +13,7 @@ iD.ui.TagEditor = function() { function tageditor(selection, preset) { entity = selection.datum(); + selection_ = selection; var type = entity.type === 'node' ? entity.type : entity.geometry(); // preset was explicitly chosen @@ -153,6 +155,13 @@ iD.ui.TagEditor = function() { } else { tags = _.clone(newtags); if (presetUI && tagList) { + + // change preset if necessary (undos/redos) + var newmatch = presetData.matchTags(entity.update({ tags: tags })); + if (newmatch !== presetMatch) { + return tageditor(selection_, newmatch); + } + name.property('value', tags.name || ''); presetUI.change(tags); tagList.tags(_.omit(tags, _.keys(presetUI.tags() || {}).concat(['name']))); From ac275c801110d44a99daa2bd09a39a37e33d9354 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 16:56:05 -0500 Subject: [PATCH 32/64] Don't show presetgrid after moving --- js/id/modes/move.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/id/modes/move.js b/js/id/modes/move.js index d6bdde104..766ee8453 100644 --- a/js/id/modes/move.js +++ b/js/id/modes/move.js @@ -74,12 +74,12 @@ iD.modes.Move = function(context, entityIDs) { function finish() { d3.event.stopPropagation(); - context.enter(iD.modes.Select(context, entityIDs, true)); + context.enter(iD.modes.Select(context, entityIDs)); } function cancel() { context.pop(); - context.enter(iD.modes.Select(context, entityIDs, true)); + context.enter(iD.modes.Select(context, entityIDs)); } function undone() { From 7b3d707571866457030259254e6af2c879f35048 Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 18:04:00 -0500 Subject: [PATCH 33/64] fix categories --- js/id/ui/presetgrid.js | 139 +++++++++++++++++++++-------------------- 1 file changed, 71 insertions(+), 68 deletions(-) diff --git a/js/id/ui/presetgrid.js b/js/id/ui/presetgrid.js index ce36245bf..a8d1e953f 100644 --- a/js/id/ui/presetgrid.js +++ b/js/id/ui/presetgrid.js @@ -24,8 +24,7 @@ iD.ui.PresetGrid = function() { .on('keyup', function() { // enter if (d3.event.keyCode === 13) { - var chosen = grid.selectAll('.grid-entry:first-child').datum(); - if (chosen) event.choose(chosen); + choose(grid.selectAll('.grid-entry:first-child').datum()); } else { var value = search.property('value'), presets = filter(value); @@ -66,85 +65,89 @@ iD.ui.PresetGrid = function() { }); } - } - function name(d) { return d.name; } + function choose(d) { + // Category + if (d.members) { + search.property('value', ''); + viable = presetData.categories(d.name); + drawGrid(selection, viable); - function drawGrid(selection, presets) { + // Preset + } else { + event.choose(d); + } + } - var entries = selection - .selectAll('button.grid-entry') - .data(presets.slice(0, 12), name); + function name(d) { return d.name; } - var entered = entries.enter() - .append('button') - .attr('class', 'grid-entry col3') - .on('click', function(d) { - // Category - if (d.members) { - drawGrid(selection, presetData.categories(d.name)); + function drawGrid(selection, presets) { - // Preset - } else { - event.choose(d); - } - }); + var entries = selection + .selectAll('button.grid-entry') + .data(presets.slice(0, 12), name); - entered.append('div') - .attr('class', function(d) { - var s = 'preset-icon-fill ' + entity.geometry(context.graph()); - if (d.members) { - s += 'category'; - } else { - for (var i in d.match.tags) { - s += ' tag-' + i + ' tag-' + i + '-' + d.match.tags[i]; + var entered = entries.enter() + .append('button') + .attr('class', 'grid-entry col3') + .on('click', choose); + + entered.append('div') + .attr('class', function(d) { + var s = 'preset-icon-fill ' + entity.geometry(context.graph()); + if (d.members) { + s += 'category'; + } else { + for (var i in d.match.tags) { + s += ' tag-' + i + ' tag-' + i + '-' + d.match.tags[i]; + } } - } - return s; - }); - - entered.append('div') - .attr('class', function(d) { return 'preset-' + d.icon + ' icon'; }); - - var presetinspect; - - entered.append('button') - .attr('tabindex', -1) - .attr('class', 'preset-help minor') - .on('click', function(d) { - - // Display description box inline - - d3.event.stopPropagation(); - - var entry = this.parentNode, - index, - entries = selection.selectAll('button.grid-entry'); - - if (presetinspect && presetinspect.remove().datum() === d) { - presetinspect = null; - return; - } - - entries.each(function(d, i) { - if (this === entry) index = i; + return s; }); - var selector = '.grid-entry:nth-child(' + (Math.floor(index/4) * 4 + 5 ) + ')'; + entered.append('div') + .attr('class', function(d) { return 'preset-' + d.icon + ' icon'; }); - presetinspect = selection.insert('div', selector) - .attr('class', 'preset-inspect col12') - .datum(d); + var presetinspect; - presetinspect.append('h2').text(d.title || d.name); - }) - .append('span') - .attr('class', 'icon inspect'); + entered.append('button') + .attr('tabindex', -1) + .attr('class', 'preset-help minor') + .on('click', function(d) { - entered.append('span').attr('class','label').text(name); + // Display description box inline - entries.exit().remove(); - entries.order(); + d3.event.stopPropagation(); + + var entry = this.parentNode, + index, + entries = selection.selectAll('button.grid-entry'); + + if (presetinspect && presetinspect.remove().datum() === d) { + presetinspect = null; + return; + } + + entries.each(function(d, i) { + if (this === entry) index = i; + }); + + var selector = '.grid-entry:nth-child(' + (Math.floor(index/4) * 4 + 5 ) + ')'; + + presetinspect = selection.insert('div', selector) + .attr('class', 'preset-inspect col12') + .datum(d); + + presetinspect.append('h2').text(d.title || d.name); + }) + .append('span') + .attr('class', 'icon inspect'); + + entered.append('span').attr('class','label').text(name); + + entries.exit().remove(); + entries.order(); + } } function cancel() { From 9bbe4152e93940dc394ac4a7d00b05023185bc22 Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Tue, 26 Feb 2013 19:46:24 -0500 Subject: [PATCH 34/64] Safely access entity.user, fixes bug via GA --- js/id/ui/contributors.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/id/ui/contributors.js b/js/id/ui/contributors.js index bd9e43503..2cf291886 100644 --- a/js/id/ui/contributors.js +++ b/js/id/ui/contributors.js @@ -4,9 +4,9 @@ iD.ui.Contributors = function(context) { limit = 4, entities = context.intersects(context.map().extent()); - for (var i in entities) { - if (entities[i].user) users[entities[i].user] = true; - } + entities.forEach(function(entity) { + if (entity && entity.user) users[entity.user] = true; + }); var u = Object.keys(users), subset = u.slice(0, u.length > limit ? limit - 1 : limit); From fa9c8a8484e5c889d8c6f0c31622e904479b44c4 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 26 Feb 2013 16:47:44 -0800 Subject: [PATCH 35/64] Don't stroke railway=platform areas --- css/map.css | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/css/map.css b/css/map.css index d4cb0eb21..3733327c4 100644 --- a/css/map.css +++ b/css/map.css @@ -512,28 +512,28 @@ svg[data-zoom="16"] path.casing.tag-highway-construction { /* railways */ -path.stroke.tag-railway { +.line.stroke.tag-railway { stroke: #eee; stroke-width: 2; stroke-linecap: butt; stroke-dasharray: 12,12; } -path.casing.tag-railway { +.line.casing.tag-railway { stroke: #555; stroke-width: 4; } -path.stroke.tag-railway-abandoned { +.line.stroke.tag-railway-abandoned { stroke: #eee; } -path.casing.tag-railway-abandoned { +.line.casing.tag-railway-abandoned { stroke: #999; } -path.stroke.tag-railway-subway { +.line.stroke.tag-railway-subway { stroke: #666; } -path.casing.tag-railway-subway { +.line.casing.tag-railway-subway { stroke: #222; } From f7b316304a9edae4936c0e6432f3734e74670829 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 26 Feb 2013 16:52:51 -0800 Subject: [PATCH 36/64] Fix address component on relations (fixes #860) --- js/id/ui/preset/address.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/id/ui/preset/address.js b/js/id/ui/preset/address.js index 4164330e9..945b634bd 100644 --- a/js/id/ui/preset/address.js +++ b/js/id/ui/preset/address.js @@ -6,9 +6,9 @@ iD.ui.preset.address = function() { function getStreets() { - var l = entity.loc || context.entity(entity.nodes[0]).loc, + var extent = entity.extent(context.graph()), + l = extent.center(), dist = iD.geo.metresToCoordinates(l, [200, 200]), - extent = entity.extent(context.graph()), box = iD.geo.Extent( [extent[0][0] - dist[0], extent[0][1] - dist[1]], [extent[1][0] + dist[0], extent[1][1] + dist[1]]); From 3f7d78edfb671a83c72821dea149b5373c07858a Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Tue, 26 Feb 2013 20:01:41 -0500 Subject: [PATCH 37/64] jshint fixes --- js/id/id.js | 5 +++-- js/id/ui/attribution.js | 2 +- js/id/ui/splash.js | 2 +- js/id/ui/zoom.js | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/js/id/id.js b/js/id/id.js index 5dc8fb127..74d0b6d82 100644 --- a/js/id/id.js +++ b/js/id/id.js @@ -4,7 +4,7 @@ window.iD = function () { // https://github.com/systemed/iD/issues/772 // http://mathiasbynens.be/notes/localstorage-pattern#comment-9 - try { storage = localStorage } catch (e) {} + try { storage = localStorage; } catch (e) {} storage = storage || {}; context.storage = function(k, v) { @@ -106,7 +106,8 @@ window.iD = function () { context.background() .source(_.find(iD.layers, function(l) { if (l.data.sourcetag === q.layer) { - return (detected = true); + detected = true; + return true; } })); } diff --git a/js/id/ui/attribution.js b/js/id/ui/attribution.js index 282833e7e..73a769b06 100644 --- a/js/id/ui/attribution.js +++ b/js/id/ui/attribution.js @@ -6,5 +6,5 @@ iD.ui.Attribution = function(context) { selection .append('span') .attr('class', 'provided-by'); - } + }; }; diff --git a/js/id/ui/splash.js b/js/id/ui/splash.js index c0e79261c..271278940 100644 --- a/js/id/ui/splash.js +++ b/js/id/ui/splash.js @@ -28,5 +28,5 @@ iD.ui.Splash = function(context) { website: 'ideditor.com', github: 'github.com' })); - } + }; }; diff --git a/js/id/ui/zoom.js b/js/id/ui/zoom.js index 823bc120f..5412a76ce 100644 --- a/js/id/ui/zoom.js +++ b/js/id/ui/zoom.js @@ -36,5 +36,5 @@ iD.ui.Zoom = function(context) { d3.select(document) .call(keybinding); - } + }; }; From 9efa81b100822f6d51cfc6a734c06eccca3dcfda Mon Sep 17 00:00:00 2001 From: Ansis Brammanis Date: Tue, 26 Feb 2013 20:02:30 -0500 Subject: [PATCH 38/64] add row select input --- css/app.css | 20 ++++++++++++++ index.html | 1 + js/id/ui/preset.js | 41 +++++++++++++++++++-------- js/lib/d3.rowselect.js | 63 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 113 insertions(+), 12 deletions(-) create mode 100644 js/lib/d3.rowselect.js diff --git a/css/app.css b/css/app.css index 1d287901b..85315f609 100644 --- a/css/app.css +++ b/css/app.css @@ -642,6 +642,26 @@ div.combobox { border-right: 5px solid transparent; } +.rowselect .item { + cursor: pointer; +} + +.rowselect .item label:hover{ + background-color: #ececec; +} + +.rowselect .item label { + padding: 5px; + width: 100%; + cursor: pointer; + display: block; + text-align: center; +} + +.rowselect .item div { + text-align: center; +} + /* Address input */ .preset-input .addr-housename { diff --git a/index.html b/index.html index f8c88e85e..f62adccdc 100644 --- a/index.html +++ b/index.html @@ -20,6 +20,7 @@ + diff --git a/js/id/ui/preset.js b/js/id/ui/preset.js index db5a71436..97b6ee9a3 100644 --- a/js/id/ui/preset.js +++ b/js/id/ui/preset.js @@ -1,5 +1,5 @@ iD.ui.preset = function() { - var event = d3.dispatch('change'), + var event = d3.dispatch('change', 'setTags'), taginfo = iD.taginfo(), context, entity, @@ -13,9 +13,11 @@ iD.ui.preset = function() { var tags = _.clone(preset.match.tags); sections.selectAll('input,select') .each(function(d) { - tags[d.key] = d.type === 'combo' || d.type === 'select' ? - this.value.replace(' ', '_') : - this.value; + if (d && d.key) { + tags[d.key] = d.type === 'combo' || d.type === 'select' ? + this.value.replace(' ', '_') : + this.value; + } }); return tags; } @@ -24,11 +26,15 @@ iD.ui.preset = function() { if (!sections) return; sections.selectAll('input,select') .each(function(d) { - this.value = tags[d.key] || ''; - if (d.type === 'combo' || d.type === 'select') { - this.value = this.value.replace('_', ' '); + if (d && d.key) { + this.value = tags[d.key] || ''; + if (d.type === 'combo' || d.type === 'select') { + this.value = this.value.replace('_', ' '); + } } }); + + event.setTags(); } function clean(o) { @@ -79,11 +85,22 @@ iD.ui.preset = function() { case 'select': wrap = this.append('span').attr('class', 'input-wrap-position'), i = wrap.append('input').attr('type', 'text'); - wrap.call(d3.combobox().data(d.options.map(function(d) { - var o = {}; - o.title = o.value = d.replace('_', ' '); - return o; - }))); + + if (d.options.length <= 5) { + var select = d3.rowselect() + .data(d.options) + .on('change', key); + i.datum(d); + wrap.call(select); + event.on('setTags.' + d.key, select.update); + + } else { + wrap.call(d3.combobox().data(d.options.map(function(d) { + var o = {}; + o.title = o.value = d.replace('_', ' '); + return o; + }))); + } break; case 'combo': var combobox = d3.combobox(); diff --git a/js/lib/d3.rowselect.js b/js/lib/d3.rowselect.js new file mode 100644 index 000000000..478e104fa --- /dev/null +++ b/js/lib/d3.rowselect.js @@ -0,0 +1,63 @@ +d3.rowselect = function() { + + var input, data, wrap, + event = d3.dispatch('change'); + + var select = function(selection) { + + input = selection.select('input') + .style('display', 'none'); + + wrap = selection.append('div') + .attr('class', 'rowselect'); + + var labels = wrap.selectAll('div') + .data(data) + .enter() + .append('div') + .style('display', 'inline-block') + .style('width', ~~(100 / data.length) + '%') + .attr('class', 'item') + .append('label') + .on('click', function() { + var checkbox = d3.select(this).select('input'), + val = !!checkbox.property('checked'); + wrap.selectAll('input').property('checked', false); + checkbox.property('checked', val); + input.property('value', val ? checkbox.datum() : ''); + + event.change(); + d3.event.stopPropagation(); + }); + + var value = input.property('value'); + + labels.append('div') + .append('input') + .attr('type', 'checkbox'); + + labels.append('span').text(function(d) { return d; }); + + input.on('change.select', update); + + }; + + function update() { + var value = input.property('value'); + + wrap.selectAll('input') + .property('checked', function(d) { + return d === value; + }); + } + + select.data = function(_) { + if (!arguments.length) return data; + data = _; + return select; + }; + + select.update = update; + + return d3.rebind(select, event, 'on'); +}; From 85e8db192dd06c1f18693d807bfc69f48b2490d8 Mon Sep 17 00:00:00 2001 From: John Firebaugh Date: Tue, 26 Feb 2013 17:01:10 -0800 Subject: [PATCH 39/64] Fix address street input --- css/app.css | 2 +- js/id/ui/preset/address.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/css/app.css b/css/app.css index 85315f609..dd151ef46 100644 --- a/css/app.css +++ b/css/app.css @@ -674,7 +674,7 @@ div.combobox { border-right: none; } -.preset-input .addr-streetname { +.preset-input .addr-street { width: 80%; } diff --git a/js/id/ui/preset/address.js b/js/id/ui/preset/address.js index 945b634bd..054d9647d 100644 --- a/js/id/ui/preset/address.js +++ b/js/id/ui/preset/address.js @@ -56,12 +56,12 @@ iD.ui.preset.address = function() { var streetwrap = selection.append('span') .attr('class', 'input-wrap-position') - .datum({ 'key': 'addr:streetname' }); + .datum({ 'key': 'addr:street' }); streetwrap.append('input') .property('type', 'text') .attr('placeholder', 'Oak Street') - .attr('class', 'addr-streetname') + .attr('class', 'addr-street') .on('blur', change) .on('change', change); From 583ee967a9a44452febe5fe8ceae886908edaf4b Mon Sep 17 00:00:00 2001 From: Tom MacWright Date: Tue, 26 Feb 2013 20:17:38 -0500 Subject: [PATCH 40/64] Use window.opener in popup rather than polling. Fixes #789 --- js/id/oauth.js | 18 +++++++----------- land.html | 20 +++----------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/js/id/oauth.js b/js/id/oauth.js index ec6a12668..9ed8eaa31 100644 --- a/js/id/oauth.js +++ b/js/id/oauth.js @@ -73,17 +73,13 @@ iD.OAuth = function(context) { ['top', screen.height / 2 - h / 2]].map(function(x) { return x.join('='); }).join(','), - popup = window.open("about:blank", 'oauth_window', settings), - locationCheck = window.setInterval(function() { - if (popup.closed) return window.clearInterval(locationCheck); - if (popup.location.search) { - var search = popup.location.search, - oauth_token = ohauth.stringQs(search.slice(1)); - popup.close(); - get_access_token(oauth_token); - window.clearInterval(locationCheck); - } - }, 100); + popup = window.open("about:blank", 'oauth_window', settings); + + window.authComplete = function(token) { + var oauth_token = ohauth.stringQs(token); + get_access_token(oauth_token); + delete window.authComplete; + }; function reqTokenDone(err, xhr) { if (err) callback(err); diff --git a/land.html b/land.html index 48fa3c09a..e03f34ee3 100644 --- a/land.html +++ b/land.html @@ -1,23 +1,9 @@ - - - - iD - - + -