diff --git a/main.js b/main.js index 08677f73..6965412a 100644 --- a/main.js +++ b/main.js @@ -20160,164 +20160,52 @@ async function waitForResolvedLinks(app, delay = 1000, max = 50) { } } -const MATRIX_VIEW = "BC-matrix"; -const STATS_VIEW = "BC-stats"; -const DUCK_VIEW = "BC-ducks"; -const DOWN_VIEW = "BC-down"; -const TRAIL_ICON = "BC-trail-icon"; -const TRAIL_ICON_SVG = ''; -const DUCK_ICON = "BC-duck-icon"; -const DUCK_ICON_SVG = ''; -const splitLinksRegex = new RegExp(/\[\[(.+?)\]\]/g); -const dropHeaderOrAlias = new RegExp(/\[\[([^#|]+)\]\]/); -const VISTYPES = [ - "Force Directed Graph", - "Tidy Tree", - "Circle Packing", - "Edge Bundling", - "Arc Diagram", - "Sunburst", - "Tree Map", - "Icicle", - "Radial Tree", -]; -const DIRECTIONS$1 = ["up", "same", "down", "next", "prev"]; -const ARROW_DIRECTIONS = { - up: "↑", - same: "↔", - down: "↓", - next: "→", - prev: "←", -}; -const RELATIONS = ["Parent", "Sibling", "Child"]; -const REAlCLOSED = ["Real", "Closed"]; -const ALLUNLINKED = ["All", "No Unlinked"]; -const blankUserHier = () => { - return { up: [], same: [], down: [], next: [], prev: [] }; -}; -const blankRealNImplied = () => { - return { - up: { reals: [], implieds: [] }, - down: { reals: [], implieds: [] }, - same: { reals: [], implieds: [] }, - next: { reals: [], implieds: [] }, - prev: { reals: [], implieds: [] }, - }; -}; -const [BC_FOLDER_NOTE, BC_TAG_NOTE, BC_TAG_NOTE_FIELD, BC_LINK_NOTE, BC_TRAVERSE_NOTE, BC_HIDE_TRAIL, BC_ORDER,] = [ - "BC-folder-note", - "BC-tag-note", - "BC-tag-note-field", - "BC-link-note", - "BC-traverse-note", - "BC-hide-trail", - "BC-order", -]; -const BC_FIELDS_INFO = [ - { - field: BC_FOLDER_NOTE, - desc: "Set this note as a Breadcrumbs folder-note. All other notes in this folder will be added to the graph with the field name specified in this key's value", - after: ": ", - alt: true, - }, - { - field: BC_TAG_NOTE, - desc: "Set this note as a Breadcrumbs tag-note. All other notes with this tag will be added to the graph in the direction you specify with `BC-tag-note-field: fieldName`", - after: ": '#", - alt: true, - }, - { - field: BC_TAG_NOTE_FIELD, - desc: "Manually choose the field for this tag-note to use", - after: ": ", - alt: false, - }, - { - field: BC_LINK_NOTE, - desc: "Set this note as a Breadcrumbs link-note. All links leaving this note will be added to the graph with the field name specified in this key's value.", - after: ": ", - alt: true, - }, - { - field: BC_TRAVERSE_NOTE, - desc: "Set this note as a Breadcrumbs traverse-note. Starting from this note, the Obsidian graph will be traversed in depth-first order, and all notes along the way will be added to the BC graph using the fieldName you specify", - after: ": ", - alt: true, - }, - { - field: BC_HIDE_TRAIL, - desc: "Don't show the trail in this note", - after: ": true", - alt: false, - }, - { - field: BC_ORDER, - desc: "Set the order of this note in the List/Matrix view. A lower value places this note higher in the order.", - after: ": ", - alt: false, - }, -]; -const BC_ALTS = BC_FIELDS_INFO.filter((f) => f.alt).map((f) => f.field); -const DEFAULT_SETTINGS = { - aliasesInIndex: false, - alphaSortAsc: true, - altLinkFields: [], - CSVPaths: "", - debugMode: "WARN", - defaultView: true, - downViewWrap: false, - dotsColour: "#000000", - dvWaitTime: 5000, - enableAlphaSort: true, - fieldSuggestor: true, - filterImpliedSiblingsOfDifferentTypes: false, - limitWriteBCCheckboxStates: {}, - gridDots: false, - gridHeatmap: false, - heatmapColour: getComputedStyle(document.body).getPropertyValue("--text-accent"), - hierarchyNotes: [""], - HNUpField: "", - indexNotes: [""], - refreshOnNoteChange: false, - useAllMetadata: true, - openMatrixOnLoad: true, - openStatsOnLoad: true, - openDuckOnLoad: false, - openDownOnLoad: true, - parseJugglLinksWithoutJuggl: false, - showNameOrType: true, - showRelationType: true, - rlLeaf: true, - showAllPathsIfNoneToIndexNote: false, - showBCs: true, - showBCsInEditLPMode: false, - showRefreshNotice: true, - showTrail: true, - showGrid: true, - showPrevNext: true, - limitTrailCheckboxStates: {}, - showAll: false, - noPathMessage: `This note has no real or implied parents`, - trailSeperator: "→", - treatCurrNodeAsImpliedSibling: false, - respectReadableLineLength: true, - userHiers: [ - { - up: ["up"], - same: ["same"], - down: ["down"], - next: ["next"], - prev: ["prev"], - }, - ], - writeBCsInline: false, - showWriteAllBCsCmd: false, - visGraph: "Force Directed Graph", - visRelation: "Parent", - visClosed: "Real", - visAll: "All", - wikilinkIndex: true, -}; +class Debugger { + constructor(plugin) { + this.debugLessThan = (level) => loglevel.levels[this.plugin.settings.debugMode] < level; + this.plugin = plugin; + } + start2G(group) { + if (this.debugLessThan(3)) + console.groupCollapsed(group); + } + end2G(...msgs) { + if (this.debugLessThan(3)) { + if (msgs.length) + loglevel.info(...msgs); + console.groupEnd(); + } + } + start1G(group) { + if (this.debugLessThan(2)) + console.groupCollapsed(group); + } + end1G(...msgs) { + if (this.debugLessThan(2)) { + if (msgs.length) + loglevel.debug(...msgs); + console.groupEnd(); + } + } + startGs(...groups) { + this.start2G(groups[0]); + if (groups[1]) + this.start1G(groups[1]); + } + /** + * End a debug and info group, logging `msgs` in `endDebugGroup` + * @param {1|2} count The number of groups to end. `1` ends Trace, 2 ends both + * @param {any[]} ...msgs + */ + endGs(count, ...msgs) { + if (count === 1) + this.end2G(...msgs); + else { + this.end1G(); + this.end2G(...msgs); + } + } +} function noop() { } function assign(tar, src) { @@ -20736,58 +20624,238 @@ class SvelteComponent { } } -class Debugger { - constructor(plugin) { - this.debugLessThan = (level) => loglevel.levels[this.plugin.settings.debugMode] < level; - this.plugin = plugin; - } - start2G(group) { - if (this.debugLessThan(3)) - console.groupCollapsed(group); - } - end2G(...msgs) { - if (this.debugLessThan(3)) { - if (msgs.length) - loglevel.info(...msgs); - console.groupEnd(); - } - } - start1G(group) { - if (this.debugLessThan(2)) - console.groupCollapsed(group); - } - end1G(...msgs) { - if (this.debugLessThan(2)) { - if (msgs.length) - loglevel.debug(...msgs); - console.groupEnd(); - } - } - startGs(...groups) { - this.start2G(groups[0]); - if (groups[1]) - this.start1G(groups[1]); - } - /** - * End a debug and info group, logging `msgs` in `endDebugGroup` - * @param {1|2} count The number of groups to end. `1` ends Trace, 2 ends both - * @param {any[]} ...msgs - */ - endGs(count, ...msgs) { - if (count === 1) - this.end2G(...msgs); - else { - this.end1G(); - this.end2G(...msgs); - } - } -} +/* src\Components\KoFi.svelte generated by Svelte v3.35.0 */ -// TODO - this is a hack to get the graph to work with the approvals -// I shouldn't need -const DIRECTIONS = ["up", "same", "down", "next", "prev"]; -// This function takes the real & implied graphs for a given relation, and returns a new graphs with both. -// It makes implied relations real +function create_fragment$i(ctx) { + let script; + let script_src_value; + let t; + let div; + let mounted; + let dispose; + + return { + c() { + script = element("script"); + t = space(); + div = element("div"); + attr(script, "type", "text/javascript"); + if (script.src !== (script_src_value = "https://ko-fi.com/widgets/widget_2.js")) attr(script, "src", script_src_value); + }, + m(target, anchor) { + append(document.head, script); + insert(target, t, anchor); + insert(target, div, anchor); + /*div_binding*/ ctx[2](div); + + if (!mounted) { + dispose = listen(script, "load", /*initializeKofi*/ ctx[1]); + mounted = true; + } + }, + p: noop, + i: noop, + o: noop, + d(detaching) { + detach(script); + if (detaching) detach(t); + if (detaching) detach(div); + /*div_binding*/ ctx[2](null); + mounted = false; + dispose(); + } + }; +} + +function instance$i($$self, $$props, $$invalidate) { + let button; + + var initializeKofi = () => { + kofiwidget2.init("Support Breadcrumbs development!", "#29abe0", "G2G454TZF"); + $$invalidate(0, button.innerHTML = kofiwidget2.getHTML(), button); + }; + + function div_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + button = $$value; + $$invalidate(0, button); + }); + } + + return [button, initializeKofi, div_binding]; +} + +class KoFi extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$i, create_fragment$i, safe_not_equal, {}); + } +} + +const MATRIX_VIEW = "BC-matrix"; +const STATS_VIEW = "BC-stats"; +const DUCK_VIEW = "BC-ducks"; +const DOWN_VIEW = "BC-down"; +const TRAIL_ICON = "BC-trail-icon"; +const TRAIL_ICON_SVG = ''; +const DUCK_ICON = "BC-duck-icon"; +const DUCK_ICON_SVG = ''; +const splitLinksRegex = new RegExp(/\[\[(.+?)\]\]/g); +const dropHeaderOrAlias = new RegExp(/\[\[([^#|]+)\]\]/); +const VISTYPES = [ + "Force Directed Graph", + "Tidy Tree", + "Circle Packing", + "Edge Bundling", + "Arc Diagram", + "Sunburst", + "Tree Map", + "Icicle", + "Radial Tree", +]; +const DIRECTIONS$1 = ["up", "same", "down", "next", "prev"]; +const ARROW_DIRECTIONS = { + up: "↑", + same: "↔", + down: "↓", + next: "→", + prev: "←", +}; +const RELATIONS = ["Parent", "Sibling", "Child"]; +const REAlCLOSED = ["Real", "Closed"]; +const ALLUNLINKED = ["All", "No Unlinked"]; +const blankUserHier = () => { + return { up: [], same: [], down: [], next: [], prev: [] }; +}; +const blankRealNImplied = () => { + return { + up: { reals: [], implieds: [] }, + down: { reals: [], implieds: [] }, + same: { reals: [], implieds: [] }, + next: { reals: [], implieds: [] }, + prev: { reals: [], implieds: [] }, + }; +}; +const [BC_FOLDER_NOTE, BC_TAG_NOTE, BC_TAG_NOTE_FIELD, BC_LINK_NOTE, BC_TRAVERSE_NOTE, BC_HIDE_TRAIL, BC_ORDER,] = [ + "BC-folder-note", + "BC-tag-note", + "BC-tag-note-field", + "BC-link-note", + "BC-traverse-note", + "BC-hide-trail", + "BC-order", +]; +const BC_FIELDS_INFO = [ + { + field: BC_FOLDER_NOTE, + desc: "Set this note as a Breadcrumbs folder-note. All other notes in this folder will be added to the graph with the field name specified in this key's value", + after: ": ", + alt: true, + }, + { + field: BC_TAG_NOTE, + desc: "Set this note as a Breadcrumbs tag-note. All other notes with this tag will be added to the graph in the direction you specify with `BC-tag-note-field: fieldName`", + after: ": '#", + alt: true, + }, + { + field: BC_TAG_NOTE_FIELD, + desc: "Manually choose the field for this tag-note to use", + after: ": ", + alt: false, + }, + { + field: BC_LINK_NOTE, + desc: "Set this note as a Breadcrumbs link-note. All links leaving this note will be added to the graph with the field name specified in this key's value.", + after: ": ", + alt: true, + }, + { + field: BC_TRAVERSE_NOTE, + desc: "Set this note as a Breadcrumbs traverse-note. Starting from this note, the Obsidian graph will be traversed in depth-first order, and all notes along the way will be added to the BC graph using the fieldName you specify", + after: ": ", + alt: true, + }, + { + field: BC_HIDE_TRAIL, + desc: "Don't show the trail in this note", + after: ": true", + alt: false, + }, + { + field: BC_ORDER, + desc: "Set the order of this note in the List/Matrix view. A lower value places this note higher in the order.", + after: ": ", + alt: false, + }, +]; +const BC_ALTS = BC_FIELDS_INFO.filter((f) => f.alt).map((f) => f.field); +const DEFAULT_SETTINGS = { + aliasesInIndex: false, + alphaSortAsc: true, + altLinkFields: [], + CSVPaths: "", + debugMode: "WARN", + defaultView: true, + downViewWrap: false, + dotsColour: "#000000", + dvWaitTime: 5000, + enableAlphaSort: true, + fieldSuggestor: true, + filterImpliedSiblingsOfDifferentTypes: false, + limitWriteBCCheckboxStates: {}, + gridDots: false, + gridHeatmap: false, + heatmapColour: getComputedStyle(document.body).getPropertyValue("--text-accent"), + hierarchyNotes: [""], + HNUpField: "", + indexNotes: [""], + refreshOnNoteChange: false, + useAllMetadata: true, + openMatrixOnLoad: true, + openStatsOnLoad: true, + openDuckOnLoad: false, + openDownOnLoad: true, + parseJugglLinksWithoutJuggl: false, + showNameOrType: true, + showRelationType: true, + rlLeaf: true, + showAllPathsIfNoneToIndexNote: false, + showBCs: true, + showBCsInEditLPMode: false, + showRefreshNotice: true, + showTrail: true, + showGrid: true, + showPrevNext: true, + limitTrailCheckboxStates: {}, + showAll: false, + noPathMessage: `This note has no real or implied parents`, + trailSeperator: "→", + treatCurrNodeAsImpliedSibling: false, + respectReadableLineLength: true, + userHiers: [ + { + up: ["up"], + same: ["same"], + down: ["down"], + next: ["next"], + prev: ["prev"], + }, + ], + writeBCsInline: false, + showWriteAllBCsCmd: false, + visGraph: "Force Directed Graph", + visRelation: "Parent", + visClosed: "Real", + visAll: "All", + wikilinkIndex: true, +}; + +// TODO - this is a hack to get the graph to work with the approvals +// I shouldn't need +const DIRECTIONS = ["up", "same", "down", "next", "prev"]; +// This function takes the real & implied graphs for a given relation, and returns a new graphs with both. +// It makes implied relations real // TODO use reflexiveClosure instead function closeImpliedLinks(real, implied) { const closedG = real.copy(); @@ -21132,712 +21200,626 @@ function iterateHiers(userHiers, fn) { }); } -/* src\Components\Stats.svelte generated by Svelte v3.35.0 */ +/* node_modules\svelte-icons\components\IconBase.svelte generated by Svelte v3.35.0 */ function add_css$a() { var style = element("style"); - style.id = "svelte-rb5mhu-style"; - style.textContent = "table.svelte-rb5mhu{border-collapse:collapse}td.svelte-rb5mhu:first-child{text-align:right}td.svelte-rb5mhu,th.svelte-rb5mhu{padding:3px;border:1px solid var(--background-modifier-border);white-space:pre-line}"; + style.id = "svelte-c8tyih-style"; + style.textContent = "svg.svelte-c8tyih{stroke:currentColor;fill:currentColor;stroke-width:0;width:100%;height:auto;max-height:100%}"; append(document.head, style); } -function get_each_context$9(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[28] = list[i]; - return child_ctx; -} - -function get_each_context_1$7(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[28] = list[i]; - return child_ctx; -} - -function get_each_context_2$3(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[28] = list[i]; - return child_ctx; -} - -function get_each_context_3$2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[35] = list[i]; - child_ctx[37] = i; - return child_ctx; -} - -function get_each_context_4(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[28] = list[i]; - return child_ctx; -} - -function get_each_context_5(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[28] = list[i]; - return child_ctx; -} - -function get_each_context_6(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[28] = list[i]; - return child_ctx; -} - -function get_each_context_7(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[28] = list[i]; - return child_ctx; -} - -// (94:4) {#each DIRECTIONS as dir} -function create_each_block_7(ctx) { - let td; - let t_value = ARROW_DIRECTIONS[/*dir*/ ctx[28]] + ""; - let t; +// (18:2) {#if title} +function create_if_block$6(ctx) { + let title_1; + let t; return { c() { - td = element("td"); - t = text(t_value); - attr(td, "class", "svelte-rb5mhu"); + title_1 = svg_element("title"); + t = text(/*title*/ ctx[0]); }, m(target, anchor) { - insert(target, td, anchor); - append(td, t); + insert(target, title_1, anchor); + append(title_1, t); + }, + p(ctx, dirty) { + if (dirty & /*title*/ 1) set_data(t, /*title*/ ctx[0]); }, - p: noop, d(detaching) { - if (detaching) detach(td); + if (detaching) detach(title_1); } }; } -// (106:6) {#each DIRECTIONS as dir} -function create_each_block_6(ctx) { - let td; - let t0_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.nodes.length + ""; - let t0; - let t1; - let td_aria_label_value; - let mounted; - let dispose; - - function click_handler_1() { - return /*click_handler_1*/ ctx[6](/*i*/ ctx[37], /*dir*/ ctx[28]); - } +function create_fragment$h(ctx) { + let svg; + let if_block_anchor; + let current; + let if_block = /*title*/ ctx[0] && create_if_block$6(ctx); + const default_slot_template = /*#slots*/ ctx[3].default; + const default_slot = create_slot(default_slot_template, ctx, /*$$scope*/ ctx[2], null); return { c() { - td = element("td"); - t0 = text(t0_value); - t1 = space(); - attr(td, "aria-label-position", "left"); - attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.nodesStr); - attr(td, "class", "svelte-rb5mhu"); + svg = svg_element("svg"); + if (if_block) if_block.c(); + if_block_anchor = empty(); + if (default_slot) default_slot.c(); + attr(svg, "xmlns", "http://www.w3.org/2000/svg"); + attr(svg, "viewBox", /*viewBox*/ ctx[1]); + attr(svg, "class", "svelte-c8tyih"); }, m(target, anchor) { - insert(target, td, anchor); - append(td, t0); - append(td, t1); + insert(target, svg, anchor); + if (if_block) if_block.m(svg, null); + append(svg, if_block_anchor); - if (!mounted) { - dispose = listen(td, "click", click_handler_1); - mounted = true; + if (default_slot) { + default_slot.m(svg, null); } + + current = true; }, - p(new_ctx, dirty) { - ctx = new_ctx; + p(ctx, [dirty]) { + if (/*title*/ ctx[0]) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$6(ctx); + if_block.c(); + if_block.m(svg, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + + if (default_slot) { + if (default_slot.p && dirty & /*$$scope*/ 4) { + update_slot(default_slot, default_slot_template, ctx, /*$$scope*/ ctx[2], dirty, null, null); + } + } + + if (!current || dirty & /*viewBox*/ 2) { + attr(svg, "viewBox", /*viewBox*/ ctx[1]); + } + }, + i(local) { + if (current) return; + transition_in(default_slot, local); + current = true; + }, + o(local) { + transition_out(default_slot, local); + current = false; }, d(detaching) { - if (detaching) detach(td); - mounted = false; - dispose(); + if (detaching) detach(svg); + if (if_block) if_block.d(); + if (default_slot) default_slot.d(detaching); } }; } -// (127:6) {#each DIRECTIONS as dir} -function create_each_block_5(ctx) { - let td; - let t0_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.edges.length + ""; - let t0; - let t1; - let td_aria_label_value; - let mounted; - let dispose; +function instance$h($$self, $$props, $$invalidate) { + let { $$slots: slots = {}, $$scope } = $$props; + let { title = null } = $$props; + let { viewBox } = $$props; - function click_handler_3() { - return /*click_handler_3*/ ctx[9](/*i*/ ctx[37], /*dir*/ ctx[28]); + $$self.$$set = $$props => { + if ("title" in $$props) $$invalidate(0, title = $$props.title); + if ("viewBox" in $$props) $$invalidate(1, viewBox = $$props.viewBox); + if ("$$scope" in $$props) $$invalidate(2, $$scope = $$props.$$scope); + }; + + return [title, viewBox, $$scope, slots]; +} + +class IconBase extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-c8tyih-style")) add_css$a(); + init(this, options, instance$h, create_fragment$h, safe_not_equal, { title: 0, viewBox: 1 }); } +} + +/* node_modules\svelte-icons\fa\FaListUl.svelte generated by Svelte v3.35.0 */ + +function create_default_slot$5(ctx) { + let path; return { c() { - td = element("td"); - t0 = text(t0_value); - t1 = space(); - attr(td, "aria-label-position", "left"); - attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.edgesStr); - attr(td, "class", "svelte-rb5mhu"); + path = svg_element("path"); + attr(path, "d", "M48 48a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm448 16H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"); }, m(target, anchor) { - insert(target, td, anchor); - append(td, t0); - append(td, t1); - - if (!mounted) { - dispose = listen(td, "click", click_handler_3); - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; + insert(target, path, anchor); }, d(detaching) { - if (detaching) detach(td); - mounted = false; - dispose(); + if (detaching) detach(path); } }; } -// (148:6) {#each DIRECTIONS as dir} -function create_each_block_4(ctx) { - let td; - let t0_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Implied.edges.length + ""; - let t0; - let t1; - let td_aria_label_value; - let mounted; - let dispose; +function create_fragment$g(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 512 512" }, /*$$props*/ ctx[0]]; - function click_handler_5() { - return /*click_handler_5*/ ctx[12](/*i*/ ctx[37], /*dir*/ ctx[28]); + let iconbase_props = { + $$slots: { default: [create_default_slot$5] }, + $$scope: { ctx } + }; + + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); } + iconbase = new IconBase({ props: iconbase_props }); + return { c() { - td = element("td"); - t0 = text(t0_value); - t1 = space(); - attr(td, "aria-label-position", "left"); - attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Implied.edgesStr); - attr(td, "class", "svelte-rb5mhu"); + create_component(iconbase.$$.fragment); }, m(target, anchor) { - insert(target, td, anchor); - append(td, t0); - append(td, t1); + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + const iconbase_changes = (dirty & /*$$props*/ 1) + ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) + : {}; - if (!mounted) { - dispose = listen(td, "click", click_handler_5); - mounted = true; + if (dirty & /*$$scope*/ 2) { + iconbase_changes.$$scope = { dirty, ctx }; } + + iconbase.$set(iconbase_changes); }, - p(new_ctx, dirty) { - ctx = new_ctx; + i(local) { + if (current) return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; }, d(detaching) { - if (detaching) detach(td); - mounted = false; - dispose(); + destroy_component(iconbase, detaching); } }; } -// (100:2) {#each userHiers as hier, i} -function create_each_block_3$2(ctx) { - let tr0; - let td0; - let t0_value = /*hierStrs*/ ctx[4][/*i*/ ctx[37]] + ""; - let t0; - let t1; - let td1; - let t3; - let t4; - let td2; - let t5_value = lodash.sum(DIRECTIONS$1.map(func)) + ""; - let t5; - let td2_aria_label_value; - let t6; - let tr1; - let td3; - let t8; - let t9; - let td4; - let t10_value = lodash.sum(DIRECTIONS$1.map(func_1)) + ""; - let t10; - let td4_aria_label_value; - let t11; - let tr2; - let td5; - let t13; - let t14; - let td6; - let t15_value = lodash.sum(DIRECTIONS$1.map(func_2)) + ""; - let t15; - let td6_aria_label_value; - let mounted; - let dispose; - let each_value_6 = DIRECTIONS$1; - let each_blocks_2 = []; - - for (let i = 0; i < each_value_6.length; i += 1) { - each_blocks_2[i] = create_each_block_6(get_each_context_6(ctx, each_value_6, i)); - } +function instance$g($$self, $$props, $$invalidate) { + $$self.$$set = $$new_props => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; - function func(...args) { - return /*func*/ ctx[7](/*i*/ ctx[37], ...args); - } + $$props = exclude_internal_props($$props); + return [$$props]; +} - function click_handler_2() { - return /*click_handler_2*/ ctx[8](/*i*/ ctx[37]); +class FaListUl extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$g, create_fragment$g, safe_not_equal, {}); } +} - let each_value_5 = DIRECTIONS$1; - let each_blocks_1 = []; - - for (let i = 0; i < each_value_5.length; i += 1) { - each_blocks_1[i] = create_each_block_5(get_each_context_5(ctx, each_value_5, i)); - } +/* node_modules\svelte-icons\fa\FaPlus.svelte generated by Svelte v3.35.0 */ - function func_1(...args) { - return /*func_1*/ ctx[10](/*i*/ ctx[37], ...args); - } +function create_default_slot$4(ctx) { + let path; - function click_handler_4() { - return /*click_handler_4*/ ctx[11](/*i*/ ctx[37]); - } + return { + c() { + path = svg_element("path"); + attr(path, "d", "M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"); + }, + m(target, anchor) { + insert(target, path, anchor); + }, + d(detaching) { + if (detaching) detach(path); + } + }; +} - let each_value_4 = DIRECTIONS$1; - let each_blocks = []; +function create_fragment$f(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, /*$$props*/ ctx[0]]; - for (let i = 0; i < each_value_4.length; i += 1) { - each_blocks[i] = create_each_block_4(get_each_context_4(ctx, each_value_4, i)); - } + let iconbase_props = { + $$slots: { default: [create_default_slot$4] }, + $$scope: { ctx } + }; - function func_2(...args) { - return /*func_2*/ ctx[13](/*i*/ ctx[37], ...args); + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); } - function click_handler_6() { - return /*click_handler_6*/ ctx[14](/*i*/ ctx[37]); - } + iconbase = new IconBase({ props: iconbase_props }); return { c() { - tr0 = element("tr"); - td0 = element("td"); - t0 = text(t0_value); - t1 = space(); - td1 = element("td"); - td1.textContent = "Nodes"; - t3 = space(); + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + const iconbase_changes = (dirty & /*$$props*/ 1) + ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) + : {}; - for (let i = 0; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].c(); + if (dirty & /*$$scope*/ 2) { + iconbase_changes.$$scope = { dirty, ctx }; } - t4 = space(); - td2 = element("td"); - t5 = text(t5_value); - t6 = space(); - tr1 = element("tr"); - td3 = element("td"); - td3.textContent = "Real Edges"; - t8 = space(); + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].c(); - } +function instance$f($$self, $$props, $$invalidate) { + $$self.$$set = $$new_props => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; - t9 = space(); - td4 = element("td"); - t10 = text(t10_value); - t11 = space(); - tr2 = element("tr"); - td5 = element("td"); - td5.textContent = "Implied Edges"; - t13 = space(); + $$props = exclude_internal_props($$props); + return [$$props]; +} - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } +class FaPlus extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$f, create_fragment$f, safe_not_equal, {}); + } +} - t14 = space(); - td6 = element("td"); - t15 = text(t15_value); - attr(td0, "rowspan", "3"); - attr(td0, "class", "svelte-rb5mhu"); - attr(td1, "class", "svelte-rb5mhu"); - attr(td2, "aria-label-position", "left"); - attr(td2, "aria-label", td2_aria_label_value = /*cellStr*/ ctx[3](/*i*/ ctx[37], "Merged", "nodesStr")); - attr(td2, "class", "svelte-rb5mhu"); - attr(td3, "class", "svelte-rb5mhu"); - attr(td4, "aria-label-position", "left"); - attr(td4, "aria-label", td4_aria_label_value = /*cellStr*/ ctx[3](/*i*/ ctx[37], "Merged", "edgesStr")); - attr(td4, "class", "svelte-rb5mhu"); - attr(td5, "class", "svelte-rb5mhu"); - attr(td6, "aria-label-position", "left"); - attr(td6, "aria-label", td6_aria_label_value = /*cellStr*/ ctx[3](/*i*/ ctx[37], "Implied", "edgesStr")); - attr(td6, "class", "svelte-rb5mhu"); +/* node_modules\svelte-icons\fa\FaRegTrashAlt.svelte generated by Svelte v3.35.0 */ + +function create_default_slot$3(ctx) { + let path; + + return { + c() { + path = svg_element("path"); + attr(path, "d", "M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z"); }, m(target, anchor) { - insert(target, tr0, anchor); - append(tr0, td0); - append(td0, t0); - append(tr0, t1); - append(tr0, td1); - append(tr0, t3); - - for (let i = 0; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].m(tr0, null); - } + insert(target, path, anchor); + }, + d(detaching) { + if (detaching) detach(path); + } + }; +} - append(tr0, t4); - append(tr0, td2); - append(td2, t5); - insert(target, t6, anchor); - insert(target, tr1, anchor); - append(tr1, td3); - append(tr1, t8); +function create_fragment$e(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, /*$$props*/ ctx[0]]; - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].m(tr1, null); - } + let iconbase_props = { + $$slots: { default: [create_default_slot$3] }, + $$scope: { ctx } + }; - append(tr1, t9); - append(tr1, td4); - append(td4, t10); - insert(target, t11, anchor); - insert(target, tr2, anchor); - append(tr2, td5); - append(tr2, t13); + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(tr2, null); - } + iconbase = new IconBase({ props: iconbase_props }); - append(tr2, t14); - append(tr2, td6); - append(td6, t15); - - if (!mounted) { - dispose = [ - listen(td2, "click", click_handler_2), - listen(td4, "click", click_handler_4), - listen(td6, "click", click_handler_6) - ]; - - mounted = true; - } + return { + c() { + create_component(iconbase.$$.fragment); }, - p(new_ctx, dirty) { - ctx = new_ctx; - - if (dirty[0] & /*data*/ 4) { - each_value_6 = DIRECTIONS$1; - let i; - - for (i = 0; i < each_value_6.length; i += 1) { - const child_ctx = get_each_context_6(ctx, each_value_6, i); - - if (each_blocks_2[i]) { - each_blocks_2[i].p(child_ctx, dirty); - } else { - each_blocks_2[i] = create_each_block_6(child_ctx); - each_blocks_2[i].c(); - each_blocks_2[i].m(tr0, t4); - } - } - - for (; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].d(1); - } + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + const iconbase_changes = (dirty & /*$$props*/ 1) + ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) + : {}; - each_blocks_2.length = each_value_6.length; + if (dirty & /*$$scope*/ 2) { + iconbase_changes.$$scope = { dirty, ctx }; } - if (dirty[0] & /*data*/ 4) { - each_value_5 = DIRECTIONS$1; - let i; - - for (i = 0; i < each_value_5.length; i += 1) { - const child_ctx = get_each_context_5(ctx, each_value_5, i); - - if (each_blocks_1[i]) { - each_blocks_1[i].p(child_ctx, dirty); - } else { - each_blocks_1[i] = create_each_block_5(child_ctx); - each_blocks_1[i].c(); - each_blocks_1[i].m(tr1, t9); - } - } + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; +} - for (; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].d(1); - } +function instance$e($$self, $$props, $$invalidate) { + $$self.$$set = $$new_props => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; - each_blocks_1.length = each_value_5.length; - } + $$props = exclude_internal_props($$props); + return [$$props]; +} - if (dirty[0] & /*data*/ 4) { - each_value_4 = DIRECTIONS$1; - let i; +class FaRegTrashAlt extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$e, create_fragment$e, safe_not_equal, {}); + } +} - for (i = 0; i < each_value_4.length; i += 1) { - const child_ctx = get_each_context_4(ctx, each_value_4, i); +/* src\Components\UserHierarchies.svelte generated by Svelte v3.35.0 */ - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_4(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(tr2, t14); - } - } +function add_css$9() { + var style = element("style"); + style.id = "svelte-5y4abu-style"; + style.textContent = "label.BC-Arrow-Label.svelte-5y4abu.svelte-5y4abu{display:inline-block;width:20px !important}div.GA-Buttons.svelte-5y4abu.svelte-5y4abu{padding-bottom:5px}details.BC-Hier-Details.svelte-5y4abu.svelte-5y4abu{border:1px solid var(--background-modifier-border);border-radius:10px;padding:10px 5px 10px 10px;margin-bottom:15px}.BC-Hier-Details.svelte-5y4abu summary.svelte-5y4abu::marker{font-size:10px}.BC-Hier-Details.svelte-5y4abu summary button.svelte-5y4abu{float:right}.icon.svelte-5y4abu.svelte-5y4abu{color:var(--text-normal);display:inline-block;padding-top:3px;width:17px;height:17px}"; + append(document.head, style); +} - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } +function get_each_context$9(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[12] = list[i]; + child_ctx[14] = i; + return child_ctx; +} - each_blocks.length = each_value_4.length; - } - }, - d(detaching) { - if (detaching) detach(tr0); - destroy_each(each_blocks_2, detaching); - if (detaching) detach(t6); - if (detaching) detach(tr1); - destroy_each(each_blocks_1, detaching); - if (detaching) detach(t11); - if (detaching) detach(tr2); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; +function get_each_context_1$7(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[15] = list[i]; + return child_ctx; } -// (171:4) {#each DIRECTIONS as dir} -function create_each_block_2$3(ctx) { - let td; - let t0_value = lodash.sum(/*data*/ ctx[2].map(func_3)) + ""; +// (93:6) {#each DIRECTIONS as dir} +function create_each_block_1$7(ctx) { + let div; + let label; + let t0_value = ARROW_DIRECTIONS[/*dir*/ ctx[15]] + ""; let t0; + let label_for_value; let t1; - let td_aria_label_value; + let input; + let input_name_value; + let input_value_value; let mounted; let dispose; - function func_3(...args) { - return /*func_3*/ ctx[15](/*dir*/ ctx[28], ...args); - } - - function func_4(...args) { - return /*func_4*/ ctx[16](/*dir*/ ctx[28], ...args); - } - - function click_handler_7() { - return /*click_handler_7*/ ctx[17](/*dir*/ ctx[28]); + function change_handler(...args) { + return /*change_handler*/ ctx[10](/*i*/ ctx[14], /*dir*/ ctx[15], ...args); } return { c() { - td = element("td"); + div = element("div"); + label = element("label"); t0 = text(t0_value); t1 = space(); - attr(td, "aria-label-position", "left"); - attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2].map(func_4).join("\n")); - attr(td, "class", "svelte-rb5mhu"); + input = element("input"); + attr(label, "class", "BC-Arrow-Label svelte-5y4abu"); + attr(label, "for", label_for_value = /*dir*/ ctx[15]); + attr(input, "type", "text"); + attr(input, "size", "20"); + attr(input, "name", input_name_value = /*dir*/ ctx[15]); + input.value = input_value_value = /*hier*/ ctx[12][/*dir*/ ctx[15]]?.join(", ") ?? ""; }, m(target, anchor) { - insert(target, td, anchor); - append(td, t0); - append(td, t1); + insert(target, div, anchor); + append(div, label); + append(label, t0); + append(div, t1); + append(div, input); if (!mounted) { - dispose = listen(td, "click", click_handler_7); + dispose = listen(input, "change", change_handler); mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; + + if (dirty & /*currHiers*/ 1 && input_value_value !== (input_value_value = /*hier*/ ctx[12][/*dir*/ ctx[15]]?.join(", ") ?? "") && input.value !== input_value_value) { + input.value = input_value_value; + } }, d(detaching) { - if (detaching) detach(td); + if (detaching) detach(div); mounted = false; dispose(); } }; } -// (213:4) {#each DIRECTIONS as dir} -function create_each_block_1$7(ctx) { - let td; - let t0_value = lodash.sum(/*data*/ ctx[2].map(func_5)) + ""; +// (61:2) {#each currHiers as hier, i} +function create_each_block$9(ctx) { + let details; + let summary; + let t0_value = DIRECTIONS$1.map(func).map(func_1).join(" ") + ""; let t0; let t1; - let td_aria_label_value; + let span; + let button0; + let t3; + let button1; + let t5; + let button2; + let t7; + let t8; let mounted; let dispose; - function func_5(...args) { - return /*func_5*/ ctx[18](/*dir*/ ctx[28], ...args); + function func(...args) { + return /*func*/ ctx[6](/*hier*/ ctx[12], ...args); } - function func_6(...args) { - return /*func_6*/ ctx[19](/*dir*/ ctx[28], ...args); + function click_handler_3() { + return /*click_handler_3*/ ctx[7](/*i*/ ctx[14]); } - function click_handler_8() { - return /*click_handler_8*/ ctx[20](/*dir*/ ctx[28]); + function click_handler_4() { + return /*click_handler_4*/ ctx[8](/*i*/ ctx[14]); + } + + function click_handler_5() { + return /*click_handler_5*/ ctx[9](/*i*/ ctx[14]); + } + + let each_value_1 = DIRECTIONS$1; + let each_blocks = []; + + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_1$7(get_each_context_1$7(ctx, each_value_1, i)); } return { c() { - td = element("td"); + details = element("details"); + summary = element("summary"); t0 = text(t0_value); t1 = space(); - attr(td, "aria-label-position", "left"); - attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2].map(func_6).join("\n")); - attr(td, "class", "svelte-rb5mhu"); - }, - m(target, anchor) { - insert(target, td, anchor); - append(td, t0); - append(td, t1); - - if (!mounted) { - dispose = listen(td, "click", click_handler_8); - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - }, - d(detaching) { - if (detaching) detach(td); - mounted = false; - dispose(); - } - }; -} - -// (251:4) {#each DIRECTIONS as dir} -function create_each_block$9(ctx) { - let td; - let t0_value = lodash.sum(/*data*/ ctx[2].map(func_7)) + ""; - let t0; - let t1; - let td_aria_label_value; - let mounted; - let dispose; - - function func_7(...args) { - return /*func_7*/ ctx[21](/*dir*/ ctx[28], ...args); - } - - function func_8(...args) { - return /*func_8*/ ctx[22](/*dir*/ ctx[28], ...args); - } + span = element("span"); + button0 = element("button"); + button0.textContent = "↑"; + t3 = space(); + button1 = element("button"); + button1.textContent = "↓"; + t5 = space(); + button2 = element("button"); + button2.textContent = "X"; + t7 = space(); - function click_handler_9() { - return /*click_handler_9*/ ctx[23](/*dir*/ ctx[28]); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - return { - c() { - td = element("td"); - t0 = text(t0_value); - t1 = space(); - attr(td, "aria-label-position", "left"); - attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2].map(func_8).join("\n")); - attr(td, "class", "svelte-rb5mhu"); + t8 = space(); + attr(button0, "aria-label", "Swap with Hierarchy Above"); + attr(button0, "class", "svelte-5y4abu"); + attr(button1, "aria-label", "Swap with Hierarchy Below"); + attr(button1, "class", "svelte-5y4abu"); + attr(button2, "aria-label", "Remove Hierarchy"); + attr(button2, "class", "svelte-5y4abu"); + attr(span, "class", "GA-Buttons"); + attr(summary, "class", "svelte-5y4abu"); + attr(details, "class", "BC-Hier-Details svelte-5y4abu"); }, m(target, anchor) { - insert(target, td, anchor); - append(td, t0); - append(td, t1); + insert(target, details, anchor); + append(details, summary); + append(summary, t0); + append(summary, t1); + append(summary, span); + append(span, button0); + append(span, t3); + append(span, button1); + append(span, t5); + append(span, button2); + append(details, t7); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(details, null); + } + + append(details, t8); if (!mounted) { - dispose = listen(td, "click", click_handler_9); + dispose = [ + listen(button0, "click", click_handler_3), + listen(button1, "click", click_handler_4), + listen(button2, "click", click_handler_5) + ]; + mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; + if (dirty & /*currHiers*/ 1 && t0_value !== (t0_value = DIRECTIONS$1.map(func).map(func_1).join(" ") + "")) set_data(t0, t0_value); + + if (dirty & /*DIRECTIONS, currHiers, splitAndTrim, update, ARROW_DIRECTIONS*/ 3) { + each_value_1 = DIRECTIONS$1; + let i; + + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_1$7(ctx, each_value_1, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_1$7(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(details, t8); + } + } + + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value_1.length; + } }, d(detaching) { - if (detaching) detach(td); + if (detaching) detach(details); + destroy_each(each_blocks, detaching); mounted = false; - dispose(); + run_all(dispose); } }; } -function create_fragment$i(ctx) { - let table; - let thead; - let tr0; - let th0; +function create_fragment$d(ctx) { + let div4; + let div3; + let button0; + let div0; + let faplus; + let t0; + let button1; + let div1; + let faregtrashalt; let t1; - let th1; + let button2; + let div2; + let falistul; let t2; - let t3; - let tr1; - let td0; - let button; - let t5; - let td1; - let t7; - let t8; - let td2; - let t10; - let t11; - let tr2; - let td3; - let t13; - let td4; - let t15; - let t16; - let tr3; - let td5; - let t18; - let t19; - let tr4; - let td6; - let t21; + let current; let mounted; let dispose; - let each_value_7 = DIRECTIONS$1; - let each_blocks_4 = []; - - for (let i = 0; i < each_value_7.length; i += 1) { - each_blocks_4[i] = create_each_block_7(get_each_context_7(ctx, each_value_7, i)); - } - - let each_value_3 = /*userHiers*/ ctx[1]; - let each_blocks_3 = []; - - for (let i = 0; i < each_value_3.length; i += 1) { - each_blocks_3[i] = create_each_block_3$2(get_each_context_3$2(ctx, each_value_3, i)); - } - - let each_value_2 = DIRECTIONS$1; - let each_blocks_2 = []; - - for (let i = 0; i < each_value_2.length; i += 1) { - each_blocks_2[i] = create_each_block_2$3(get_each_context_2$3(ctx, each_value_2, i)); - } - - let each_value_1 = DIRECTIONS$1; - let each_blocks_1 = []; - - for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks_1[i] = create_each_block_1$7(get_each_context_1$7(ctx, each_value_1, i)); - } - - let each_value = DIRECTIONS$1; + faplus = new FaPlus({}); + faregtrashalt = new FaRegTrashAlt({}); + falistul = new FaListUl({}); + let each_value = /*currHiers*/ ctx[0]; let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { @@ -21846,244 +21828,68 @@ function create_fragment$i(ctx) { return { c() { - table = element("table"); - thead = element("thead"); - tr0 = element("tr"); - th0 = element("th"); - th0.textContent = "Hierarchy"; + div4 = element("div"); + div3 = element("div"); + button0 = element("button"); + div0 = element("div"); + create_component(faplus.$$.fragment); + t0 = space(); + button1 = element("button"); + div1 = element("div"); + create_component(faregtrashalt.$$.fragment); t1 = space(); - th1 = element("th"); - t2 = text("Count"); - t3 = space(); - tr1 = element("tr"); - td0 = element("td"); - button = element("button"); - button.textContent = "↻"; - t5 = space(); - td1 = element("td"); - td1.textContent = "Measure"; - t7 = space(); + button2 = element("button"); + div2 = element("div"); + create_component(falistul.$$.fragment); + t2 = space(); - for (let i = 0; i < each_blocks_4.length; i += 1) { - each_blocks_4[i].c(); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); } - t8 = space(); - td2 = element("td"); - td2.textContent = "Total"; - t10 = space(); + attr(div0, "class", "icon svelte-5y4abu"); + attr(button0, "aria-label", "Add New Hierarchy"); + attr(div1, "class", "icon svelte-5y4abu"); + attr(button1, "aria-label", "Reset All Hierarchies"); + attr(div2, "class", "icon svelte-5y4abu"); + attr(button2, "aria-label", "Show Hierarchies"); + attr(div3, "class", "GA-Buttons svelte-5y4abu"); + }, + m(target, anchor) { + insert(target, div4, anchor); + append(div4, div3); + append(div3, button0); + append(button0, div0); + mount_component(faplus, div0, null); + append(div3, t0); + append(div3, button1); + append(button1, div1); + mount_component(faregtrashalt, div1, null); + append(div3, t1); + append(div3, button2); + append(button2, div2); + mount_component(falistul, div2, null); + append(div4, t2); - for (let i = 0; i < each_blocks_3.length; i += 1) { - each_blocks_3[i].c(); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div4, null); } - t11 = space(); - tr2 = element("tr"); - td3 = element("td"); - td3.textContent = "Totals"; - t13 = space(); - td4 = element("td"); - td4.textContent = "Nodes"; - t15 = space(); - - for (let i = 0; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].c(); - } - - t16 = space(); - tr3 = element("tr"); - td5 = element("td"); - td5.textContent = "Real Edges"; - t18 = space(); - - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].c(); - } - - t19 = space(); - tr4 = element("tr"); - td6 = element("td"); - td6.textContent = "Implied Edges"; - t21 = space(); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(th0, "scope", "col"); - attr(th0, "class", "svelte-rb5mhu"); - attr(th1, "scope", "col"); - attr(th1, "colspan", DIRECTIONS$1.length + 2); - attr(th1, "class", "svelte-rb5mhu"); - attr(button, "class", "icon"); - attr(button, "aria-label", "Refresh Stats View (also refreshes Breadcrumbs Index)"); - attr(td0, "class", "svelte-rb5mhu"); - attr(td1, "class", "svelte-rb5mhu"); - attr(td2, "class", "svelte-rb5mhu"); - attr(td3, "rowspan", "3"); - attr(td3, "class", "svelte-rb5mhu"); - attr(td4, "class", "svelte-rb5mhu"); - attr(td5, "class", "svelte-rb5mhu"); - attr(td6, "class", "svelte-rb5mhu"); - attr(table, "class", "svelte-rb5mhu"); - }, - m(target, anchor) { - insert(target, table, anchor); - append(table, thead); - append(thead, tr0); - append(tr0, th0); - append(tr0, t1); - append(tr0, th1); - append(th1, t2); - append(table, t3); - append(table, tr1); - append(tr1, td0); - append(td0, button); - append(tr1, t5); - append(tr1, td1); - append(tr1, t7); - - for (let i = 0; i < each_blocks_4.length; i += 1) { - each_blocks_4[i].m(tr1, null); - } - - append(tr1, t8); - append(tr1, td2); - append(table, t10); - - for (let i = 0; i < each_blocks_3.length; i += 1) { - each_blocks_3[i].m(table, null); - } - - append(table, t11); - append(table, tr2); - append(tr2, td3); - append(tr2, t13); - append(tr2, td4); - append(tr2, t15); - - for (let i = 0; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].m(tr2, null); - } - - append(table, t16); - append(table, tr3); - append(tr3, td5); - append(tr3, t18); - - for (let i = 0; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].m(tr3, null); - } - - append(table, t19); - append(table, tr4); - append(tr4, td6); - append(tr4, t21); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(tr4, null); - } + current = true; if (!mounted) { - dispose = listen(button, "click", /*click_handler*/ ctx[5]); + dispose = [ + listen(button0, "click", /*click_handler*/ ctx[3]), + listen(button1, "click", /*click_handler_1*/ ctx[4]), + listen(button2, "click", /*click_handler_2*/ ctx[5]) + ]; + mounted = true; } }, - p(ctx, dirty) { - if (dirty & /*ARROW_DIRECTIONS, DIRECTIONS*/ 0) { - each_value_7 = DIRECTIONS$1; - let i; - - for (i = 0; i < each_value_7.length; i += 1) { - const child_ctx = get_each_context_7(ctx, each_value_7, i); - - if (each_blocks_4[i]) { - each_blocks_4[i].p(child_ctx, dirty); - } else { - each_blocks_4[i] = create_each_block_7(child_ctx); - each_blocks_4[i].c(); - each_blocks_4[i].m(tr1, t8); - } - } - - for (; i < each_blocks_4.length; i += 1) { - each_blocks_4[i].d(1); - } - - each_blocks_4.length = each_value_7.length; - } - - if (dirty[0] & /*cellStr, data, hierStrs*/ 28) { - each_value_3 = /*userHiers*/ ctx[1]; - let i; - - for (i = 0; i < each_value_3.length; i += 1) { - const child_ctx = get_each_context_3$2(ctx, each_value_3, i); - - if (each_blocks_3[i]) { - each_blocks_3[i].p(child_ctx, dirty); - } else { - each_blocks_3[i] = create_each_block_3$2(child_ctx); - each_blocks_3[i].c(); - each_blocks_3[i].m(table, t11); - } - } - - for (; i < each_blocks_3.length; i += 1) { - each_blocks_3[i].d(1); - } - - each_blocks_3.length = each_value_3.length; - } - - if (dirty[0] & /*data*/ 4) { - each_value_2 = DIRECTIONS$1; - let i; - - for (i = 0; i < each_value_2.length; i += 1) { - const child_ctx = get_each_context_2$3(ctx, each_value_2, i); - - if (each_blocks_2[i]) { - each_blocks_2[i].p(child_ctx, dirty); - } else { - each_blocks_2[i] = create_each_block_2$3(child_ctx); - each_blocks_2[i].c(); - each_blocks_2[i].m(tr2, null); - } - } - - for (; i < each_blocks_2.length; i += 1) { - each_blocks_2[i].d(1); - } - - each_blocks_2.length = each_value_2.length; - } - - if (dirty[0] & /*data*/ 4) { - each_value_1 = DIRECTIONS$1; - let i; - - for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1$7(ctx, each_value_1, i); - - if (each_blocks_1[i]) { - each_blocks_1[i].p(child_ctx, dirty); - } else { - each_blocks_1[i] = create_each_block_1$7(child_ctx); - each_blocks_1[i].c(); - each_blocks_1[i].m(tr3, null); - } - } - - for (; i < each_blocks_1.length; i += 1) { - each_blocks_1[i].d(1); - } - - each_blocks_1.length = each_value_1.length; - } - - if (dirty[0] & /*data*/ 4) { - each_value = DIRECTIONS$1; + p(ctx, [dirty]) { + if (dirty & /*DIRECTIONS, currHiers, splitAndTrim, update, ARROW_DIRECTIONS, swapItems*/ 3) { + each_value = /*currHiers*/ ctx[0]; let i; for (i = 0; i < each_value.length; i += 1) { @@ -22094,7 +21900,7 @@ function create_fragment$i(ctx) { } else { each_blocks[i] = create_each_block$9(child_ctx); each_blocks[i].c(); - each_blocks[i].m(tr4, null); + each_blocks[i].m(div4, null); } } @@ -22105,649 +21911,565 @@ function create_fragment$i(ctx) { each_blocks.length = each_value.length; } }, - i: noop, - o: noop, + i(local) { + if (current) return; + transition_in(faplus.$$.fragment, local); + transition_in(faregtrashalt.$$.fragment, local); + transition_in(falistul.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(faplus.$$.fragment, local); + transition_out(faregtrashalt.$$.fragment, local); + transition_out(falistul.$$.fragment, local); + current = false; + }, d(detaching) { - if (detaching) detach(table); - destroy_each(each_blocks_4, detaching); - destroy_each(each_blocks_3, detaching); - destroy_each(each_blocks_2, detaching); - destroy_each(each_blocks_1, detaching); + if (detaching) detach(div4); + destroy_component(faplus); + destroy_component(faregtrashalt); + destroy_component(falistul); destroy_each(each_blocks, detaching); mounted = false; - dispose(); + run_all(dispose); } }; } -function instance$i($$self, $$props, $$invalidate) { - - - let { plugin } = $$props; - const { settings, mainG } = plugin; - const { userHiers } = settings; - const db = new Debugger(plugin); - db.start2G("StatsView"); - - function fillInInfo(dir, gType, hierData, nodesToo = true) { - const gInfo = hierData[dir][gType]; - const { wikilinkIndex } = settings; - - if (nodesToo) { - gInfo.nodes = gInfo.graph.nodes(); - gInfo.nodesStr = gInfo.nodes.map(n => makeWiki(n, wikilinkIndex)).join("\n"); - } +const func_1 = dirFields => `(${dirFields})`; - gInfo.edges = gInfo.graph.edges(); - const edgeStrArr = gInfo.graph.mapEdges((k, a, s, t) => `${makeWiki(nodesToo ? s : t, wikilinkIndex)} ${ARROW_DIRECTIONS[dir]} ${makeWiki(nodesToo ? t : s, wikilinkIndex)}`); - gInfo.edgesStr = edgeStrArr.join("\n"); - } - - const data = settings.userHiers.map(hier => { - const hierData = { - //@ts-ignore - up: { Merged: {}, Closed: {}, Implied: {} }, - //@ts-ignore - same: { Merged: {}, Closed: {}, Implied: {} }, - //@ts-ignore - down: { Merged: {}, Closed: {}, Implied: {} }, - //@ts-ignore - next: { Merged: {}, Closed: {}, Implied: {} }, - //@ts-ignore - prev: { Merged: {}, Closed: {}, Implied: {} } - }; +function instance$d($$self, $$props, $$invalidate) { + var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { + function adopt(value) { + return value instanceof P + ? value + : new P(function (resolve) { + resolve(value); + }); + } - DIRECTIONS$1.forEach(dir => { - // Merged Graphs - /// Smoosh all fieldGs from one dir into a merged graph for that direction as a whole - const mergedInDir = getSubForFields(mainG, hier[dir]); + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch(e) { + reject(e); + } + } - const mergedInOppDir = getSubForFields(mainG, hier[getOppDir(dir)]); - hierData[dir].Merged.graph = mergedInDir; - fillInInfo(dir, "Merged", hierData); + function rejected(value) { + try { + step(generator["throw"](value)); + } catch(e) { + reject(e); + } + } - // Closed graphs - if (dir !== "same") { - hierData[dir].Closed.graph = closeImpliedLinks(mergedInDir, mergedInOppDir); - } else { - hierData[dir].Closed.graph = closeImpliedLinks(mergedInDir, mergedInDir); - } + function step(result) { + result.done + ? resolve(result.value) + : adopt(result.value).then(fulfilled, rejected); + } - fillInInfo(dir, "Closed", hierData); + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); + }; - if (dir !== "same") { - hierData[dir].Implied.graph = mergedInOppDir; - } else { - hierData[dir].Implied.graph = closeImpliedLinks(mergedInDir, mergedInDir); - } + + + let { plugin } = $$props; + let currHiers = [...plugin.settings.userHiers]; - fillInInfo(dir, "Implied", hierData, false); + function update(currHiers) { + return __awaiter(this, void 0, void 0, function* () { + $$invalidate(2, plugin.settings.userHiers = currHiers, plugin); + yield plugin.saveSettings(); }); + } - return hierData; - }); + const click_handler = async () => $$invalidate(0, currHiers = [...currHiers, blankUserHier()]); - loglevel.debug({ data }); - const cellStr = (i, type, info) => DIRECTIONS$1.map(dir => data[i][dir][type][info]).join("\n"); - let hierStrs = userHiers.map(hierToStr); - db.end2G(); + const click_handler_1 = async () => { + if (window.confirm("Are you sure you want to reset all hierarchies?")) { + $$invalidate(0, currHiers = []); + await update(currHiers); + } + }; - const click_handler = async () => { - await plugin.refreshIndex(); - await plugin.getActiveTYPEView(STATS_VIEW)?.draw(); + const click_handler_2 = () => new require$$0.Notice(currHiers.map(hierToStr).join("\n\n")); + const func = (hier, dir) => hier[dir]?.join(", ") ?? ""; + + const click_handler_3 = async i => { + $$invalidate(0, currHiers = swapItems(i, i - 1, currHiers)); + await update(currHiers); }; - const click_handler_1 = async (i, dir) => await copy(data[i][dir].Merged.nodesStr); - const func = (i, dir) => data[i][dir].Merged.nodes.length; - const click_handler_2 = async i => await copy(cellStr(i, "Merged", "nodesStr")); - const click_handler_3 = async (i, dir) => await copy(data[i][dir].Merged.edgesStr); - const func_1 = (i, dir) => data[i][dir].Merged.edges.length; - const click_handler_4 = async i => await copy(cellStr(i, "Merged", "edgesStr")); - const click_handler_5 = async (i, dir) => await copy(data[i][dir].Implied.edgesStr); - const func_2 = (i, dir) => data[i][dir].Implied.edges.length; - const click_handler_6 = async i => await copy(cellStr(i, "Implied", "edgesStr")); - const func_3 = (dir, datum) => datum[dir].Merged.nodes.length; - const func_4 = (dir, datum) => datum[dir].Merged.nodesStr; - const click_handler_7 = async dir => await copy(data.map(datum => datum[dir].Merged.nodesStr).join("\n")); - const func_5 = (dir, datum) => datum[dir].Merged.edges.length; - const func_6 = (dir, datum) => datum[dir].Merged.edgesStr; - const click_handler_8 = async dir => await copy(data.map(datum => datum[dir].Merged.edgesStr).join("\n")); - const func_7 = (dir, datum) => datum[dir].Implied.edges.length; - const func_8 = (dir, datum) => datum[dir].Implied.edgesStr; - const click_handler_9 = async dir => await copy(data.map(datum => datum[dir].Implied.edgesStr).join("\n")); + const click_handler_4 = async i => { + $$invalidate(0, currHiers = swapItems(i, i + 1, currHiers)); + await update(currHiers); + }; + + const click_handler_5 = async i => { + currHiers.splice(i, 1); + $$invalidate(0, currHiers); + await update(currHiers); + }; + + const change_handler = async (i, dir, e) => { + const { value } = e.target; + $$invalidate(0, currHiers[i][dir] = splitAndTrim(value), currHiers); + await update(currHiers); + }; $$self.$$set = $$props => { - if ("plugin" in $$props) $$invalidate(0, plugin = $$props.plugin); + if ("plugin" in $$props) $$invalidate(2, plugin = $$props.plugin); }; return [ + currHiers, + update, plugin, - userHiers, - data, - cellStr, - hierStrs, click_handler, click_handler_1, - func, click_handler_2, + func, click_handler_3, - func_1, click_handler_4, click_handler_5, - func_2, - click_handler_6, - func_3, - func_4, - click_handler_7, - func_5, - func_6, - click_handler_8, - func_7, - func_8, - click_handler_9 + change_handler ]; } -class Stats extends SvelteComponent { +class UserHierarchies extends SvelteComponent { constructor(options) { super(); - if (!document.getElementById("svelte-rb5mhu-style")) add_css$a(); - init(this, options, instance$i, create_fragment$i, safe_not_equal, { plugin: 0 }, [-1, -1]); + if (!document.getElementById("svelte-5y4abu-style")) add_css$9(); + init(this, options, instance$d, create_fragment$d, safe_not_equal, { plugin: 2 }); } } -class StatsView extends require$$0.ItemView { - constructor(leaf, plugin) { - super(leaf); - this.icon = "info"; - this.plugin = plugin; - } - async onload() { - super.onload(); - this.app.workspace.onLayoutReady(() => { - setTimeout(async () => await this.draw(), this.plugin.settings.dvWaitTime); - }); - } - getViewType() { - return STATS_VIEW; - } - getDisplayText() { - return "Breadcrumbs Stats"; - } - async onOpen() { - await this.plugin.saveSettings(); - } - onClose() { - var _a; - (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); - return Promise.resolve(); - } - async draw() { - const { contentEl, plugin } = this; - contentEl.empty(); - this.view = new Stats({ - target: contentEl, - props: { plugin }, - }); - } -} - -/* node_modules\svelte-icons\components\IconBase.svelte generated by Svelte v3.35.0 */ +/* src\Components\Lists.svelte generated by Svelte v3.35.0 */ -function add_css$9() { +function add_css$8() { var style = element("style"); - style.id = "svelte-c8tyih-style"; - style.textContent = "svg.svelte-c8tyih{stroke:currentColor;fill:currentColor;stroke-width:0;width:100%;height:auto;max-height:100%}"; + style.id = "svelte-1dlhare-style"; + style.textContent = "summary.hier-summary.svelte-1dlhare{color:var(--text-title-h2);font-size:larger}summary.svelte-1dlhare{color:var(--text-title-h3)}h5.BC-header.svelte-1dlhare{color:var(--text-title-h5)}.markdown-preview-view.svelte-1dlhare{padding-left:10px}.internal-link.is-unresolved.svelte-1dlhare{color:var(--text-muted)}"; append(document.head, style); } -// (18:2) {#if title} -function create_if_block$6(ctx) { - let title_1; - let t; +function get_each_context$8(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[9] = list[i]; + return child_ctx; +} + +function get_each_context_1$6(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[12] = list[i]; + return child_ctx; +} + +function get_each_context_2$3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[15] = list[i]; + return child_ctx; +} + +function get_each_context_3$2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[18] = list[i]; + return child_ctx; +} + +// (24:8) {#if square.realItems.length > 0 || square.impliedItems.length > 0} +function create_if_block$5(ctx) { + let details; + let summary; + let t0_value = /*square*/ ctx[12].field + ""; + let t0; + let t1; + let t2; + let if_block0 = /*square*/ ctx[12].realItems.length && create_if_block_3$2(ctx); + let if_block1 = /*square*/ ctx[12].impliedItems.length && create_if_block_1$4(ctx); return { c() { - title_1 = svg_element("title"); - t = text(/*title*/ ctx[0]); + details = element("details"); + summary = element("summary"); + t0 = text(t0_value); + t1 = space(); + if (if_block0) if_block0.c(); + t2 = space(); + if (if_block1) if_block1.c(); + attr(summary, "class", "svelte-1dlhare"); + details.open = true; + attr(details, "class", "BC-details"); }, m(target, anchor) { - insert(target, title_1, anchor); - append(title_1, t); - }, - p(ctx, dirty) { - if (dirty & /*title*/ 1) set_data(t, /*title*/ ctx[0]); + insert(target, details, anchor); + append(details, summary); + append(summary, t0); + append(details, t1); + if (if_block0) if_block0.m(details, null); + append(details, t2); + if (if_block1) if_block1.m(details, null); + }, + p(ctx, dirty) { + if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = /*square*/ ctx[12].field + "")) set_data(t0, t0_value); + + if (/*square*/ ctx[12].realItems.length) { + if (if_block0) { + if_block0.p(ctx, dirty); + } else { + if_block0 = create_if_block_3$2(ctx); + if_block0.c(); + if_block0.m(details, t2); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + + if (/*square*/ ctx[12].impliedItems.length) { + if (if_block1) { + if_block1.p(ctx, dirty); + } else { + if_block1 = create_if_block_1$4(ctx); + if_block1.c(); + if_block1.m(details, null); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } }, d(detaching) { - if (detaching) detach(title_1); + if (detaching) detach(details); + if (if_block0) if_block0.d(); + if (if_block1) if_block1.d(); } }; } -function create_fragment$h(ctx) { - let svg; - let if_block_anchor; - let current; - let if_block = /*title*/ ctx[0] && create_if_block$6(ctx); - const default_slot_template = /*#slots*/ ctx[3].default; - const default_slot = create_slot(default_slot_template, ctx, /*$$scope*/ ctx[2], null); +// (27:12) {#if square.realItems.length} +function create_if_block_3$2(ctx) { + let t; + let ol; + let if_block = /*settings*/ ctx[1].showRelationType && create_if_block_4$1(); + let each_value_3 = /*square*/ ctx[12].realItems; + let each_blocks = []; + + for (let i = 0; i < each_value_3.length; i += 1) { + each_blocks[i] = create_each_block_3$2(get_each_context_3$2(ctx, each_value_3, i)); + } return { c() { - svg = svg_element("svg"); if (if_block) if_block.c(); - if_block_anchor = empty(); - if (default_slot) default_slot.c(); - attr(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr(svg, "viewBox", /*viewBox*/ ctx[1]); - attr(svg, "class", "svelte-c8tyih"); + t = space(); + ol = element("ol"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } }, m(target, anchor) { - insert(target, svg, anchor); - if (if_block) if_block.m(svg, null); - append(svg, if_block_anchor); + if (if_block) if_block.m(target, anchor); + insert(target, t, anchor); + insert(target, ol, anchor); - if (default_slot) { - default_slot.m(svg, null); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(ol, null); } - - current = true; }, - p(ctx, [dirty]) { - if (/*title*/ ctx[0]) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block$6(ctx); + p(ctx, dirty) { + if (/*settings*/ ctx[1].showRelationType) { + if (if_block) ; else { + if_block = create_if_block_4$1(); if_block.c(); - if_block.m(svg, if_block_anchor); + if_block.m(t.parentNode, t); } } else if (if_block) { if_block.d(1); if_block = null; } - if (default_slot) { - if (default_slot.p && dirty & /*$$scope*/ 4) { - update_slot(default_slot, default_slot_template, ctx, /*$$scope*/ ctx[2], dirty, null, null); + if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { + each_value_3 = /*square*/ ctx[12].realItems; + let i; + + for (i = 0; i < each_value_3.length; i += 1) { + const child_ctx = get_each_context_3$2(ctx, each_value_3, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_3$2(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(ol, null); + } } - } - if (!current || dirty & /*viewBox*/ 2) { - attr(svg, "viewBox", /*viewBox*/ ctx[1]); + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value_3.length; } }, - i(local) { - if (current) return; - transition_in(default_slot, local); - current = true; - }, - o(local) { - transition_out(default_slot, local); - current = false; - }, d(detaching) { - if (detaching) detach(svg); - if (if_block) if_block.d(); - if (default_slot) default_slot.d(detaching); + if (if_block) if_block.d(detaching); + if (detaching) detach(t); + if (detaching) detach(ol); + destroy_each(each_blocks, detaching); } }; } -function instance$h($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - let { title = null } = $$props; - let { viewBox } = $$props; - - $$self.$$set = $$props => { - if ("title" in $$props) $$invalidate(0, title = $$props.title); - if ("viewBox" in $$props) $$invalidate(1, viewBox = $$props.viewBox); - if ("$$scope" in $$props) $$invalidate(2, $$scope = $$props.$$scope); - }; - - return [title, viewBox, $$scope, slots]; -} - -class IconBase extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-c8tyih-style")) add_css$9(); - init(this, options, instance$h, create_fragment$h, safe_not_equal, { title: 0, viewBox: 1 }); - } -} - -/* node_modules\svelte-icons\fa\FaFire.svelte generated by Svelte v3.35.0 */ - -function create_default_slot$5(ctx) { - let path; +// (28:14) {#if settings.showRelationType} +function create_if_block_4$1(ctx) { + let h5; return { c() { - path = svg_element("path"); - attr(path, "d", "M216 23.86c0-23.8-30.65-32.77-44.15-13.04C48 191.85 224 200 224 288c0 35.63-29.11 64.46-64.85 63.99-35.17-.45-63.15-29.77-63.15-64.94v-85.51c0-21.7-26.47-32.23-41.43-16.5C27.8 213.16 0 261.33 0 320c0 105.87 86.13 192 192 192s192-86.13 192-192c0-170.29-168-193-168-296.14z"); + h5 = element("h5"); + h5.textContent = "Real"; + attr(h5, "class", "BC-header svelte-1dlhare"); }, m(target, anchor) { - insert(target, path, anchor); + insert(target, h5, anchor); }, d(detaching) { - if (detaching) detach(path); + if (detaching) detach(h5); } }; } -function create_fragment$g(ctx) { - let iconbase; - let current; - const iconbase_spread_levels = [{ viewBox: "0 0 384 512" }, /*$$props*/ ctx[0]]; - - let iconbase_props = { - $$slots: { default: [create_default_slot$5] }, - $$scope: { ctx } - }; +// (33:16) {#each square.realItems as realItem} +function create_each_block_3$2(ctx) { + let li; + let div; + let t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + ""; + let t0; + let div_class_value; + let t1; + let mounted; + let dispose; - for (let i = 0; i < iconbase_spread_levels.length; i += 1) { - iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + function click_handler(...args) { + return /*click_handler*/ ctx[5](/*realItem*/ ctx[18], ...args); } - iconbase = new IconBase({ props: iconbase_props }); + function mouseover_handler(...args) { + return /*mouseover_handler*/ ctx[6](/*realItem*/ ctx[18], ...args); + } return { c() { - create_component(iconbase.$$.fragment); + li = element("li"); + div = element("div"); + t0 = text(t0_value); + t1 = space(); + attr(div, "class", div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-1dlhare")); }, m(target, anchor) { - mount_component(iconbase, target, anchor); - current = true; - }, - p(ctx, [dirty]) { - const iconbase_changes = (dirty & /*$$props*/ 1) - ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) - : {}; + insert(target, li, anchor); + append(li, div); + append(div, t0); + append(li, t1); - if (dirty & /*$$scope*/ 2) { - iconbase_changes.$$scope = { dirty, ctx }; - } + if (!mounted) { + dispose = [ + listen(div, "click", click_handler), + listen(div, "mouseover", mouseover_handler) + ]; - iconbase.$set(iconbase_changes); - }, - i(local) { - if (current) return; - transition_in(iconbase.$$.fragment, local); - current = true; + mounted = true; + } }, - o(local) { - transition_out(iconbase.$$.fragment, local); - current = false; + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + "")) set_data(t0, t0_value); + + if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-1dlhare"))) { + attr(div, "class", div_class_value); + } }, d(detaching) { - destroy_component(iconbase, detaching); + if (detaching) detach(li); + mounted = false; + run_all(dispose); } }; } -function instance$g($$self, $$props, $$invalidate) { - $$self.$$set = $$new_props => { - $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); - }; +// (48:12) {#if square.impliedItems.length} +function create_if_block_1$4(ctx) { + let t; + let ol; + let ol_start_value; + let if_block = /*settings*/ ctx[1].showRelationType && create_if_block_2$3(); + let each_value_2 = /*square*/ ctx[12].impliedItems; + let each_blocks = []; - $$props = exclude_internal_props($$props); - return [$$props]; -} - -class FaFire extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$g, create_fragment$g, safe_not_equal, {}); + for (let i = 0; i < each_value_2.length; i += 1) { + each_blocks[i] = create_each_block_2$3(get_each_context_2$3(ctx, each_value_2, i)); } -} - -/* node_modules\svelte-icons\fa\FaRegSnowflake.svelte generated by Svelte v3.35.0 */ - -function create_default_slot$4(ctx) { - let path; return { c() { - path = svg_element("path"); - attr(path, "d", "M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z"); - }, - m(target, anchor) { - insert(target, path, anchor); - }, - d(detaching) { - if (detaching) detach(path); - } - }; -} - -function create_fragment$f(ctx) { - let iconbase; - let current; - const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, /*$$props*/ ctx[0]]; - - let iconbase_props = { - $$slots: { default: [create_default_slot$4] }, - $$scope: { ctx } - }; - - for (let i = 0; i < iconbase_spread_levels.length; i += 1) { - iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); - } + if (if_block) if_block.c(); + t = space(); + ol = element("ol"); - iconbase = new IconBase({ props: iconbase_props }); + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - return { - c() { - create_component(iconbase.$$.fragment); + attr(ol, "start", ol_start_value = /*square*/ ctx[12].realItems.length + 1); }, m(target, anchor) { - mount_component(iconbase, target, anchor); - current = true; - }, - p(ctx, [dirty]) { - const iconbase_changes = (dirty & /*$$props*/ 1) - ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) - : {}; + if (if_block) if_block.m(target, anchor); + insert(target, t, anchor); + insert(target, ol, anchor); - if (dirty & /*$$scope*/ 2) { - iconbase_changes.$$scope = { dirty, ctx }; + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(ol, null); } - - iconbase.$set(iconbase_changes); - }, - i(local) { - if (current) return; - transition_in(iconbase.$$.fragment, local); - current = true; }, - o(local) { - transition_out(iconbase.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(iconbase, detaching); - } - }; -} - -function instance$f($$self, $$props, $$invalidate) { - $$self.$$set = $$new_props => { - $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); - }; - - $$props = exclude_internal_props($$props); - return [$$props]; -} + p(ctx, dirty) { + if (/*settings*/ ctx[1].showRelationType) { + if (if_block) ; else { + if_block = create_if_block_2$3(); + if_block.c(); + if_block.m(t.parentNode, t); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } -class FaRegSnowflake extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$f, create_fragment$f, safe_not_equal, {}); - } -} + if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { + each_value_2 = /*square*/ ctx[12].impliedItems; + let i; -/* src\Components\Down.svelte generated by Svelte v3.35.0 */ + for (i = 0; i < each_value_2.length; i += 1) { + const child_ctx = get_each_context_2$3(ctx, each_value_2, i); -function add_css$8() { - var style = element("style"); - style.id = "svelte-1mg8nz0-style"; - style.textContent = ".BC-downs.svelte-1mg8nz0{padding-left:5px}pre.svelte-1mg8nz0{display:inline}.is-unresolved.svelte-1mg8nz0{color:var(--text-muted)}.icon.svelte-1mg8nz0{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}"; - append(document.head, style); -} + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_2$3(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(ol, null); + } + } -function get_each_context$8(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[11] = list[i]; - return child_ctx; -} + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } -// (51:4) {:else} -function create_else_block$2(ctx) { - let fafire; - let current; - fafire = new FaFire({}); + each_blocks.length = each_value_2.length; + } - return { - c() { - create_component(fafire.$$.fragment); - }, - m(target, anchor) { - mount_component(fafire, target, anchor); - current = true; - }, - i(local) { - if (current) return; - transition_in(fafire.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(fafire.$$.fragment, local); - current = false; + if (dirty & /*filteredSquaresArr*/ 1 && ol_start_value !== (ol_start_value = /*square*/ ctx[12].realItems.length + 1)) { + attr(ol, "start", ol_start_value); + } }, d(detaching) { - destroy_component(fafire, detaching); + if (if_block) if_block.d(detaching); + if (detaching) detach(t); + if (detaching) detach(ol); + destroy_each(each_blocks, detaching); } }; } -// (49:4) {#if frozen} -function create_if_block_1$4(ctx) { - let faregsnowflake; - let current; - faregsnowflake = new FaRegSnowflake({}); +// (49:14) {#if settings.showRelationType} +function create_if_block_2$3(ctx) { + let h5; return { c() { - create_component(faregsnowflake.$$.fragment); + h5 = element("h5"); + h5.textContent = "Implied"; + attr(h5, "class", "BC-header svelte-1dlhare"); }, m(target, anchor) { - mount_component(faregsnowflake, target, anchor); - current = true; - }, - i(local) { - if (current) return; - transition_in(faregsnowflake.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(faregsnowflake.$$.fragment, local); - current = false; + insert(target, h5, anchor); }, d(detaching) { - destroy_component(faregsnowflake, detaching); + if (detaching) detach(h5); } }; } -// (67:4) {#if line.length > 1} -function create_if_block$5(ctx) { +// (54:16) {#each square.impliedItems as impliedItem} +function create_each_block_2$3(ctx) { + let li; let div; - let pre; - let t0_value = /*line*/ ctx[11][0] + "-" + ""; - let t0; - let t1; - let span; - let a; - let t2_value = /*line*/ ctx[11][1] + ""; - let t2; - let a_class_value; - let t3; - let div_style_value; + let t_value = (/*impliedItem*/ ctx[15].alt ?? /*impliedItem*/ ctx[15].to.split("/").last()) + ""; + let t; + let div_class_value; + let div_aria_label_value; let mounted; let dispose; - function click_handler_2(...args) { - return /*click_handler_2*/ ctx[8](/*line*/ ctx[11], ...args); + function click_handler_1(...args) { + return /*click_handler_1*/ ctx[7](/*impliedItem*/ ctx[15], ...args); } - function mouseover_handler(...args) { - return /*mouseover_handler*/ ctx[9](/*line*/ ctx[11], ...args); + function mouseover_handler_1(...args) { + return /*mouseover_handler_1*/ ctx[8](/*impliedItem*/ ctx[15], ...args); } return { c() { + li = element("li"); div = element("div"); - pre = element("pre"); - t0 = text(t0_value); - t1 = space(); - span = element("span"); - a = element("a"); - t2 = text(t2_value); - t3 = space(); - attr(pre, "class", "svelte-1mg8nz0"); - - attr(a, "class", a_class_value = "internal-link " + (isInVault(/*plugin*/ ctx[0].app, /*line*/ ctx[11][1]) - ? "" - : "is-unresolved") + " svelte-1mg8nz0"); - - attr(span, "class", "internal-link"); - - attr(div, "style", div_style_value = /*settings*/ ctx[5].downViewWrap - ? "" - : "white-space: nowrap;"); + t = text(t_value); + attr(div, "class", div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-1dlhare")); + attr(div, "aria-label", div_aria_label_value = /*impliedItem*/ ctx[15].parent ?? ""); + attr(li, "class", "BC-Implied"); }, m(target, anchor) { - insert(target, div, anchor); - append(div, pre); - append(pre, t0); - append(div, t1); - append(div, span); - append(span, a); - append(a, t2); - append(div, t3); + insert(target, li, anchor); + append(li, div); + append(div, t); if (!mounted) { dispose = [ - listen(span, "click", click_handler_2), - listen(span, "mouseover", mouseover_handler) - ]; + listen(div, "click", click_handler_1), + listen(div, "mouseover", mouseover_handler_1) + ]; mounted = true; } }, p(new_ctx, dirty) { ctx = new_ctx; - if (dirty & /*lines*/ 16 && t0_value !== (t0_value = /*line*/ ctx[11][0] + "-" + "")) set_data(t0, t0_value); - if (dirty & /*lines*/ 16 && t2_value !== (t2_value = /*line*/ ctx[11][1] + "")) set_data(t2, t2_value); + if (dirty & /*filteredSquaresArr*/ 1 && t_value !== (t_value = (/*impliedItem*/ ctx[15].alt ?? /*impliedItem*/ ctx[15].to.split("/").last()) + "")) set_data(t, t_value); - if (dirty & /*plugin, lines*/ 17 && a_class_value !== (a_class_value = "internal-link " + (isInVault(/*plugin*/ ctx[0].app, /*line*/ ctx[11][1]) - ? "" - : "is-unresolved") + " svelte-1mg8nz0")) { - attr(a, "class", a_class_value); + if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-1dlhare"))) { + attr(div, "class", div_class_value); + } + + if (dirty & /*filteredSquaresArr*/ 1 && div_aria_label_value !== (div_aria_label_value = /*impliedItem*/ ctx[15].parent ?? "")) { + attr(div, "aria-label", div_aria_label_value); } }, d(detaching) { - if (detaching) detach(div); + if (detaching) detach(li); mounted = false; run_all(dispose); } }; } -// (66:2) {#each lines as line} -function create_each_block$8(ctx) { +// (23:6) {#each squares as square} +function create_each_block_1$6(ctx) { let if_block_anchor; - let if_block = /*line*/ ctx[11].length > 1 && create_if_block$5(ctx); + let if_block = (/*square*/ ctx[12].realItems.length > 0 || /*square*/ ctx[12].impliedItems.length > 0) && create_if_block$5(ctx); return { c() { @@ -22759,7 +22481,7 @@ function create_each_block$8(ctx) { insert(target, if_block_anchor, anchor); }, p(ctx, dirty) { - if (/*line*/ ctx[11].length > 1) { + if (/*square*/ ctx[12].realItems.length > 0 || /*square*/ ctx[12].impliedItems.length > 0) { if (if_block) { if_block.p(ctx, dirty); } else { @@ -22779,116 +22501,113 @@ function create_each_block$8(ctx) { }; } -function create_fragment$e(ctx) { - let div0; - let span; - let current_block_type_index; - let if_block; - let span_aria_label_value; +// (17:2) {#each filteredSquaresArr as squares} +function create_each_block$8(ctx) { + let details; + let summary; + let t0_value = /*squares*/ ctx[9].map(func).join(", ") + ""; let t0; - let button; + let t1; let t2; - let div1; - let current; - let mounted; - let dispose; - const if_block_creators = [create_if_block_1$4, create_else_block$2]; - const if_blocks = []; - - function select_block_type(ctx, dirty) { - if (/*frozen*/ ctx[3]) return 0; - return 1; - } - - current_block_type_index = select_block_type(ctx); - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - let each_value = /*lines*/ ctx[4]; + let each_value_1 = /*squares*/ ctx[9]; let each_blocks = []; - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$8(get_each_context$8(ctx, each_value, i)); + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_1$6(get_each_context_1$6(ctx, each_value_1, i)); } return { c() { - div0 = element("div"); - span = element("span"); - if_block.c(); - t0 = space(); - button = element("button"); - button.textContent = "↻"; - t2 = space(); - div1 = element("div"); + details = element("details"); + summary = element("summary"); + t0 = text(t0_value); + t1 = space(); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(span, "class", "icon svelte-1mg8nz0"); - - attr(span, "aria-label", span_aria_label_value = /*frozen*/ ctx[3] - ? `Frozen on: ${/*basename*/ ctx[2]}` - : "Unfrozen"); - - attr(span, "aria-label-position", "left"); - attr(button, "aria-label", "Refresh Stats View (also refreshes Breadcrumbs Index)"); - attr(div1, "class", "BC-downs svelte-1mg8nz0"); + t2 = space(); + attr(summary, "class", "hier-summary svelte-1dlhare"); + details.open = true; }, m(target, anchor) { - insert(target, div0, anchor); - append(div0, span); - if_blocks[current_block_type_index].m(span, null); - append(div0, t0); - append(div0, button); - insert(target, t2, anchor); - insert(target, div1, anchor); + insert(target, details, anchor); + append(details, summary); + append(summary, t0); + append(details, t1); for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div1, null); + each_blocks[i].m(details, null); } - current = true; - - if (!mounted) { - dispose = [ - listen(span, "click", /*click_handler*/ ctx[6]), - listen(button, "click", /*click_handler_1*/ ctx[7]) - ]; - - mounted = true; - } + append(details, t2); }, - p(ctx, [dirty]) { - let previous_block_index = current_block_type_index; - current_block_type_index = select_block_type(ctx); + p(ctx, dirty) { + if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = /*squares*/ ctx[9].map(func).join(", ") + "")) set_data(t0, t0_value); - if (current_block_type_index !== previous_block_index) { - group_outros(); + if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView, settings*/ 15) { + each_value_1 = /*squares*/ ctx[9]; + let i; - transition_out(if_blocks[previous_block_index], 1, 1, () => { - if_blocks[previous_block_index] = null; - }); + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_1$6(ctx, each_value_1, i); - check_outros(); - if_block = if_blocks[current_block_type_index]; + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_1$6(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(details, t2); + } + } - if (!if_block) { - if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); - if_block.c(); + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); } - transition_in(if_block, 1); - if_block.m(span, null); + each_blocks.length = each_value_1.length; } + }, + d(detaching) { + if (detaching) detach(details); + destroy_each(each_blocks, detaching); + } + }; +} - if (!current || dirty & /*frozen, basename*/ 12 && span_aria_label_value !== (span_aria_label_value = /*frozen*/ ctx[3] - ? `Frozen on: ${/*basename*/ ctx[2]}` - : "Unfrozen")) { - attr(span, "aria-label", span_aria_label_value); +function create_fragment$c(ctx) { + let div; + let div_class_value; + let each_value = /*filteredSquaresArr*/ ctx[0]; + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$8(get_each_context$8(ctx, each_value, i)); + } + + return { + c() { + div = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); } - if (dirty & /*settings, openOrSwitch, plugin, lines, hoverPreview, view, isInVault*/ 51) { - each_value = /*lines*/ ctx[4]; + attr(div, "class", div_class_value = "BC-list markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length + ? "" + : "BC-empty-view") + " svelte-1dlhare"); + }, + m(target, anchor) { + insert(target, div, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div, null); + } + }, + p(ctx, [dirty]) { + if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView, settings*/ 15) { + each_value = /*filteredSquaresArr*/ ctx[0]; let i; for (i = 0; i < each_value.length; i += 1) { @@ -22899,7 +22618,7 @@ function create_fragment$e(ctx) { } else { each_blocks[i] = create_each_block$8(child_ctx); each_blocks[i].c(); - each_blocks[i].m(div1, null); + each_blocks[i].m(div, null); } } @@ -22909,269 +22628,315 @@ function create_fragment$e(ctx) { each_blocks.length = each_value.length; } + + if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "BC-list markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length + ? "" + : "BC-empty-view") + " svelte-1dlhare")) { + attr(div, "class", div_class_value); + } }, - i(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o(local) { - transition_out(if_block); - current = false; - }, + i: noop, + o: noop, d(detaching) { - if (detaching) detach(div0); - if_blocks[current_block_type_index].d(); - if (detaching) detach(t2); - if (detaching) detach(div1); + if (detaching) detach(div); destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); } }; } -function instance$e($$self, $$props, $$invalidate) { +const func = square => square.field; + +function instance$c($$self, $$props, $$invalidate) { - let { plugin } = $$props; - let { view } = $$props; - const { settings } = plugin; - const { userHiers } = settings; - let frozen = false; - let { basename } = plugin.app.workspace.getActiveFile(); - - plugin.app.workspace.on("active-leaf-change", () => { - if (frozen) return; - $$invalidate(2, basename = plugin.app.workspace.getActiveFile().basename); - }); - - let lines; - - const click_handler = () => { - $$invalidate(3, frozen = !frozen); - if (!frozen) $$invalidate(2, basename = plugin.app.workspace.getActiveFile().basename); - }; - - const click_handler_1 = async () => { - await plugin.refreshIndex(); - await view.draw(); - }; - - const click_handler_2 = async (line, e) => await openOrSwitch(plugin.app, line[1], e); - const mouseover_handler = (line, e) => hoverPreview(e, view, line[1]); + + let { filteredSquaresArr } = $$props; + let { currFile } = $$props; + let { settings } = $$props; + let { matrixView } = $$props; + let { app } = $$props; + const click_handler = async (realItem, e) => openOrSwitch(app, realItem.to, e); + const mouseover_handler = (realItem, e) => hoverPreview(e, matrixView, realItem.to); + const click_handler_1 = async (impliedItem, e) => openOrSwitch(app, impliedItem.to, e); + const mouseover_handler_1 = (impliedItem, e) => hoverPreview(e, matrixView, impliedItem.to); $$self.$$set = $$props => { - if ("plugin" in $$props) $$invalidate(0, plugin = $$props.plugin); - if ("view" in $$props) $$invalidate(1, view = $$props.view); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*plugin, basename*/ 5) { - { - const { mainG } = plugin; - const upnDown = getSubInDirs(mainG, "up", "down"); - const closed = getReflexiveClosure(upnDown, userHiers); - const down = getSubInDirs(closed, "down"); - const allPaths = dfsAllPaths(down, basename); - const index = plugin.createIndex(allPaths, false); - loglevel.info({ allPaths, index }); - - $$invalidate(4, lines = index.split("\n").map(line => { - const pair = line.split("- "); - return [pair[0], pair.slice(1).join("- ")]; - }).filter(pair => pair[1] !== "")); - } - } + if ("filteredSquaresArr" in $$props) $$invalidate(0, filteredSquaresArr = $$props.filteredSquaresArr); + if ("currFile" in $$props) $$invalidate(4, currFile = $$props.currFile); + if ("settings" in $$props) $$invalidate(1, settings = $$props.settings); + if ("matrixView" in $$props) $$invalidate(2, matrixView = $$props.matrixView); + if ("app" in $$props) $$invalidate(3, app = $$props.app); }; return [ - plugin, - view, - basename, - frozen, - lines, + filteredSquaresArr, settings, + matrixView, + app, + currFile, click_handler, + mouseover_handler, click_handler_1, - click_handler_2, - mouseover_handler + mouseover_handler_1 ]; } -class Down extends SvelteComponent { +class Lists extends SvelteComponent { constructor(options) { super(); - if (!document.getElementById("svelte-1mg8nz0-style")) add_css$8(); - init(this, options, instance$e, create_fragment$e, safe_not_equal, { plugin: 0, view: 1 }); + if (!document.getElementById("svelte-1dlhare-style")) add_css$8(); + + init(this, options, instance$c, create_fragment$c, safe_not_equal, { + filteredSquaresArr: 0, + currFile: 4, + settings: 1, + matrixView: 2, + app: 3 + }); } } -class DownView extends require$$0.ItemView { - constructor(leaf, plugin) { - super(leaf); - this.icon = addFeatherIcon("corner-right-down"); - this.plugin = plugin; - } - async onload() { - // trace("DownView.onload"); - super.onload(); - this.app.workspace.onLayoutReady(async () => { - await this.draw(); - }); - } - getViewType() { - return DOWN_VIEW; - } - getDisplayText() { - return "Breadcrumbs Down"; - } - async onOpen() { } - onClose() { - var _a; - (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); - return Promise.resolve(); - } - async draw() { - this.contentEl.empty(); - this.view = new Down({ - target: this.contentEl, - props: { plugin: this.plugin, view: this }, - }); - } +/* src\Components\Matrix.svelte generated by Svelte v3.35.0 */ + +function add_css$7() { + var style = element("style"); + style.id = "svelte-sp0k97-style"; + style.textContent = "div.BC-Matrix.svelte-sp0k97.svelte-sp0k97{padding:5px}div.BC-Matrix.svelte-sp0k97>div.svelte-sp0k97{border:3px solid var(--background-modifier-border);border-radius:3px;text-align:center;margin:3px;position:relative;height:fit-content}div.BC-Matrix-square.svelte-sp0k97.svelte-sp0k97{border:1px solid var(--background-modifier-border)}div.BC-Matrix-headers.svelte-sp0k97.svelte-sp0k97{display:flex;justify-content:space-between;align-items:center}.BC-Matrix-header.svelte-sp0k97.svelte-sp0k97{margin:2px;padding:0px 10px}ol.svelte-sp0k97.svelte-sp0k97{margin:3px;padding-left:30px}"; + append(document.head, style); } -/* node_modules\svelte-icons\fa\FaInfo.svelte generated by Svelte v3.35.0 */ +function get_each_context$7(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[9] = list[i]; + return child_ctx; +} -function create_default_slot$3(ctx) { - let path; +function get_each_context_1$5(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[12] = list[i]; + return child_ctx; +} + +function get_each_context_2$2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[15] = list[i]; + return child_ctx; +} + +function get_each_context_3$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[18] = list[i]; + return child_ctx; +} + +// (20:8) {#if square.realItems.length > 0 || square.impliedItems.length > 0} +function create_if_block$4(ctx) { + let div1; + let div0; + let h4; + let t0_value = /*square*/ ctx[12].field + ""; + let t0; + let t1; + let t2; + let t3; + let if_block0 = /*settings*/ ctx[1].showRelationType && create_if_block_5(ctx); + let if_block1 = /*square*/ ctx[12].realItems.length && create_if_block_4(ctx); + let if_block2 = /*square*/ ctx[12].impliedItems.length && create_if_block_1$3(ctx); return { c() { - path = svg_element("path"); - attr(path, "d", "M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z"); + div1 = element("div"); + div0 = element("div"); + h4 = element("h4"); + t0 = text(t0_value); + t1 = space(); + if (if_block0) if_block0.c(); + t2 = space(); + if (if_block1) if_block1.c(); + t3 = space(); + if (if_block2) if_block2.c(); + attr(h4, "class", "BC-Matrix-header svelte-sp0k97"); + attr(div0, "class", "BC-Matrix-headers svelte-sp0k97"); + attr(div1, "class", "BC-Matrix-square svelte-sp0k97"); }, m(target, anchor) { - insert(target, path, anchor); + insert(target, div1, anchor); + append(div1, div0); + append(div0, h4); + append(h4, t0); + append(div0, t1); + if (if_block0) if_block0.m(div0, null); + append(div1, t2); + if (if_block1) if_block1.m(div1, null); + append(div1, t3); + if (if_block2) if_block2.m(div1, null); + }, + p(ctx, dirty) { + if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = /*square*/ ctx[12].field + "")) set_data(t0, t0_value); + + if (/*settings*/ ctx[1].showRelationType) { + if (if_block0) { + if_block0.p(ctx, dirty); + } else { + if_block0 = create_if_block_5(ctx); + if_block0.c(); + if_block0.m(div0, null); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } + + if (/*square*/ ctx[12].realItems.length) { + if (if_block1) { + if_block1.p(ctx, dirty); + } else { + if_block1 = create_if_block_4(ctx); + if_block1.c(); + if_block1.m(div1, t3); + } + } else if (if_block1) { + if_block1.d(1); + if_block1 = null; + } + + if (/*square*/ ctx[12].impliedItems.length) { + if (if_block2) { + if_block2.p(ctx, dirty); + } else { + if_block2 = create_if_block_1$3(ctx); + if_block2.c(); + if_block2.m(div1, null); + } + } else if (if_block2) { + if_block2.d(1); + if_block2 = null; + } }, d(detaching) { - if (detaching) detach(path); + if (detaching) detach(div1); + if (if_block0) if_block0.d(); + if (if_block1) if_block1.d(); + if (if_block2) if_block2.d(); } }; } -function create_fragment$d(ctx) { - let iconbase; - let current; - const iconbase_spread_levels = [{ viewBox: "0 0 192 512" }, /*$$props*/ ctx[0]]; - - let iconbase_props = { - $$slots: { default: [create_default_slot$3] }, - $$scope: { ctx } - }; - - for (let i = 0; i < iconbase_spread_levels.length; i += 1) { - iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); - } - - iconbase = new IconBase({ props: iconbase_props }); +// (25:14) {#if settings.showRelationType} +function create_if_block_5(ctx) { + let h6; + let t_value = (/*square*/ ctx[12].realItems.length ? "Real" : "Implied") + ""; + let t; return { c() { - create_component(iconbase.$$.fragment); + h6 = element("h6"); + t = text(t_value); + attr(h6, "class", "BC-Matrix-header svelte-sp0k97"); }, m(target, anchor) { - mount_component(iconbase, target, anchor); - current = true; - }, - p(ctx, [dirty]) { - const iconbase_changes = (dirty & /*$$props*/ 1) - ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) - : {}; - - if (dirty & /*$$scope*/ 2) { - iconbase_changes.$$scope = { dirty, ctx }; - } - - iconbase.$set(iconbase_changes); - }, - i(local) { - if (current) return; - transition_in(iconbase.$$.fragment, local); - current = true; + insert(target, h6, anchor); + append(h6, t); }, - o(local) { - transition_out(iconbase.$$.fragment, local); - current = false; + p(ctx, dirty) { + if (dirty & /*filteredSquaresArr*/ 1 && t_value !== (t_value = (/*square*/ ctx[12].realItems.length ? "Real" : "Implied") + "")) set_data(t, t_value); }, d(detaching) { - destroy_component(iconbase, detaching); + if (detaching) detach(h6); } }; } -function instance$d($$self, $$props, $$invalidate) { - $$self.$$set = $$new_props => { - $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); - }; - - $$props = exclude_internal_props($$props); - return [$$props]; -} +// (31:12) {#if square.realItems.length} +function create_if_block_4(ctx) { + let ol; + let each_value_3 = /*square*/ ctx[12].realItems; + let each_blocks = []; -class FaInfo extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$d, create_fragment$d, safe_not_equal, {}); + for (let i = 0; i < each_value_3.length; i += 1) { + each_blocks[i] = create_each_block_3$1(get_each_context_3$1(ctx, each_value_3, i)); } -} -/* src\Components\Ducks.svelte generated by Svelte v3.35.0 */ + return { + c() { + ol = element("ol"); -function add_css$7() { - var style = element("style"); - style.id = "svelte-gmdm3a-style"; - style.textContent = ".icon.svelte-gmdm3a{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}"; - append(document.head, style); -} + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } -function get_each_context$7(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[13] = list[i]; - return child_ctx; + attr(ol, "class", "svelte-sp0k97"); + }, + m(target, anchor) { + insert(target, ol, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(ol, null); + } + }, + p(ctx, dirty) { + if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { + each_value_3 = /*square*/ ctx[12].realItems; + let i; + + for (i = 0; i < each_value_3.length; i += 1) { + const child_ctx = get_each_context_3$1(ctx, each_value_3, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_3$1(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(ol, null); + } + } + + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value_3.length; + } + }, + d(detaching) { + if (detaching) detach(ol); + destroy_each(each_blocks, detaching); + } + }; } -// (48:2) {#each ducks as duck} -function create_each_block$7(ctx) { +// (33:16) {#each square.realItems as realItem} +function create_each_block_3$1(ctx) { + let li; let div; - let a; - let t0_value = /*duck*/ ctx[13] + ""; + let t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + ""; let t0; + let div_class_value; let t1; let mounted; let dispose; function click_handler(...args) { - return /*click_handler*/ ctx[9](/*duck*/ ctx[13], ...args); + return /*click_handler*/ ctx[5](/*realItem*/ ctx[18], ...args); } function mouseover_handler(...args) { - return /*mouseover_handler*/ ctx[10](/*duck*/ ctx[13], ...args); + return /*mouseover_handler*/ ctx[6](/*realItem*/ ctx[18], ...args); } return { c() { + li = element("li"); div = element("div"); - a = element("a"); t0 = text(t0_value); t1 = space(); - attr(a, "class", "internal-link"); + attr(div, "class", div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-sp0k97")); }, m(target, anchor) { - insert(target, div, anchor); - append(div, a); - append(a, t0); - append(div, t1); + insert(target, li, anchor); + append(li, div); + append(div, t0); + append(li, t1); if (!mounted) { dispose = [ @@ -23184,124 +22949,93 @@ function create_each_block$7(ctx) { }, p(new_ctx, dirty) { ctx = new_ctx; - if (dirty & /*ducks*/ 16 && t0_value !== (t0_value = /*duck*/ ctx[13] + "")) set_data(t0, t0_value); + if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + "")) set_data(t0, t0_value); + + if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-sp0k97"))) { + attr(div, "class", div_class_value); + } }, d(detaching) { - if (detaching) detach(div); + if (detaching) detach(li); mounted = false; run_all(dispose); } }; } -function create_fragment$c(ctx) { +// (48:12) {#if square.impliedItems.length} +function create_if_block_1$3(ctx) { let div; - let h6; + let h4; + let t0; let t1; - let span; - let fainfo; - let t2; - let label; - let t4; - let input0; - let t5; - let input1; - let t6; - let current; - let mounted; - let dispose; - fainfo = new FaInfo({}); - let each_value = /*ducks*/ ctx[4]; + let ol; + let ol_start_value; + let if_block = /*square*/ ctx[12].impliedItems.length && create_if_block_2$2(ctx); + let each_value_2 = /*square*/ ctx[12].impliedItems; let each_blocks = []; - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$7(get_each_context$7(ctx, each_value, i)); + for (let i = 0; i < each_value_2.length; i += 1) { + each_blocks[i] = create_each_block_2$2(get_each_context_2$2(ctx, each_value_2, i)); } return { c() { div = element("div"); - h6 = element("h6"); - h6.textContent = "Notes without Breadcrumbs"; + h4 = element("h4"); + t0 = space(); + if (if_block) if_block.c(); t1 = space(); - span = element("span"); - create_component(fainfo.$$.fragment); - t2 = space(); - label = element("label"); - label.textContent = "Filter:"; - t4 = space(); - input0 = element("input"); - t5 = space(); - input1 = element("input"); - t6 = space(); + ol = element("ol"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - attr(span, "class", "icon svelte-gmdm3a"); - attr(span, "aria-label", `A Regex used to filter the results.\nIf 'Include' is checked, it will only show notes that match the regex.\nIf 'Include' is not checked, this regex will filter out notes that match it.`); - attr(label, "for", "regex"); - attr(input0, "type", "text"); - attr(input0, "name", "regex"); - attr(input0, "placeholder", "Regex"); - input0.value = /*query*/ ctx[2]; - attr(input1, "aria-label", "Include"); - attr(input1, "type", "checkbox"); - input1.checked = /*include*/ ctx[3]; - attr(div, "class", "BC-Ducks markdown-preview-view"); + attr(h4, "class", "BC-Matrix-header svelte-sp0k97"); + attr(div, "class", "BC-Matrix-headers svelte-sp0k97"); + attr(ol, "start", ol_start_value = /*square*/ ctx[12].realItems.length + 1); + attr(ol, "class", "svelte-sp0k97"); }, m(target, anchor) { insert(target, div, anchor); - append(div, h6); - append(div, t1); - append(div, span); - mount_component(fainfo, span, null); - append(div, t2); - append(div, label); - append(div, t4); - append(div, input0); - append(div, t5); - append(div, input1); - append(div, t6); + append(div, h4); + append(div, t0); + if (if_block) if_block.m(div, null); + insert(target, t1, anchor); + insert(target, ol, anchor); for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div, null); - } - - current = true; - - if (!mounted) { - dispose = [ - listen(input0, "change", /*change_handler*/ ctx[7]), - listen(input1, "change", /*change_handler_1*/ ctx[8]) - ]; - - mounted = true; + each_blocks[i].m(ol, null); } }, - p(ctx, [dirty]) { - if (!current || dirty & /*query*/ 4 && input0.value !== /*query*/ ctx[2]) { - input0.value = /*query*/ ctx[2]; - } - - if (!current || dirty & /*include*/ 8) { - input1.checked = /*include*/ ctx[3]; + p(ctx, dirty) { + if (/*square*/ ctx[12].impliedItems.length) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block_2$2(ctx); + if_block.c(); + if_block.m(div, null); + } + } else if (if_block) { + if_block.d(1); + if_block = null; } - if (dirty & /*openOrSwitch, app, ducks, hoverPreview, ducksView*/ 19) { - each_value = /*ducks*/ ctx[4]; + if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { + each_value_2 = /*square*/ ctx[12].impliedItems; let i; - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$7(ctx, each_value, i); + for (i = 0; i < each_value_2.length; i += 1) { + const child_ctx = get_each_context_2$2(ctx, each_value_2, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block$7(child_ctx); + each_blocks[i] = create_each_block_2$2(child_ctx); each_blocks[i].c(); - each_blocks[i].m(div, null); + each_blocks[i].m(ol, null); } } @@ -23309,485 +23043,77 @@ function create_fragment$c(ctx) { each_blocks[i].d(1); } - each_blocks.length = each_value.length; + each_blocks.length = each_value_2.length; + } + + if (dirty & /*filteredSquaresArr*/ 1 && ol_start_value !== (ol_start_value = /*square*/ ctx[12].realItems.length + 1)) { + attr(ol, "start", ol_start_value); } - }, - i(local) { - if (current) return; - transition_in(fainfo.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(fainfo.$$.fragment, local); - current = false; }, d(detaching) { if (detaching) detach(div); - destroy_component(fainfo); + if (if_block) if_block.d(); + if (detaching) detach(t1); + if (detaching) detach(ol); destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); } }; } -function instance$c($$self, $$props, $$invalidate) { - - - - let { plugin } = $$props; - let { app } = $$props; - let { ducksView } = $$props; - const { mainG } = plugin; - const files = app.vault.getMarkdownFiles(); - let query = ""; - let include = true; - let regex = new RegExp(query, "g"); - let ducks = files.map(file => file.basename).filter(name => !mainG.neighbors(name).length && include === regex.test(name)); - const change_handler = e => $$invalidate(2, query = e.target.value); - const change_handler_1 = e => $$invalidate(3, include = e.target.checked); - const click_handler = async (duck, e) => await openOrSwitch(app, duck, e); - const mouseover_handler = (duck, e) => hoverPreview(e, ducksView, duck); - - $$self.$$set = $$props => { - if ("plugin" in $$props) $$invalidate(5, plugin = $$props.plugin); - if ("app" in $$props) $$invalidate(0, app = $$props.app); - if ("ducksView" in $$props) $$invalidate(1, ducksView = $$props.ducksView); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*query*/ 4) { - $$invalidate(6, regex = new RegExp(query, "g")); - } - - if ($$self.$$.dirty & /*include, regex*/ 72) { - { - $$invalidate(4, ducks = files.map(file => file.basename).filter(name => !mainG.neighbors(name).length && include === regex.test(name))); - } - } - - if ($$self.$$.dirty & /*ducks, query, include, regex*/ 92) { - console.log({ ducks, query, include, regex }); - } - }; - - return [ - app, - ducksView, - query, - include, - ducks, - plugin, - regex, - change_handler, - change_handler_1, - click_handler, - mouseover_handler - ]; -} - -class Ducks extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-gmdm3a-style")) add_css$7(); - init(this, options, instance$c, create_fragment$c, safe_not_equal, { plugin: 5, app: 0, ducksView: 1 }); - } -} - -class DucksView extends require$$0.ItemView { - constructor(leaf, plugin) { - super(leaf); - // TODO Duck icon - this.icon = DUCK_ICON; - this.plugin = plugin; - } - async onload() { - // trace("DuckView.onload"); - super.onload(); - await this.plugin.saveSettings(); - this.app.workspace.onLayoutReady(async () => { - await this.draw(); - }); - } - getViewType() { - return DUCK_VIEW; - } - getDisplayText() { - return "Breadcrumbs Ducks"; - } - async onOpen() { } - onClose() { - var _a; - (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); - return Promise.resolve(); - } - async draw() { - this.contentEl.empty(); - this.view = new Ducks({ - target: this.contentEl, - props: { plugin: this.plugin, app: this.app, ducksView: this }, - }); - } -} - -/* src\Components\Lists.svelte generated by Svelte v3.35.0 */ - -function add_css$6() { - var style = element("style"); - style.id = "svelte-1dlhare-style"; - style.textContent = "summary.hier-summary.svelte-1dlhare{color:var(--text-title-h2);font-size:larger}summary.svelte-1dlhare{color:var(--text-title-h3)}h5.BC-header.svelte-1dlhare{color:var(--text-title-h5)}.markdown-preview-view.svelte-1dlhare{padding-left:10px}.internal-link.is-unresolved.svelte-1dlhare{color:var(--text-muted)}"; - append(document.head, style); -} - -function get_each_context$6(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[9] = list[i]; - return child_ctx; -} - -function get_each_context_1$6(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[12] = list[i]; - return child_ctx; -} - -function get_each_context_2$2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[15] = list[i]; - return child_ctx; -} - -function get_each_context_3$1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[18] = list[i]; - return child_ctx; -} - -// (24:8) {#if square.realItems.length > 0 || square.impliedItems.length > 0} -function create_if_block$4(ctx) { - let details; - let summary; - let t0_value = /*square*/ ctx[12].field + ""; - let t0; - let t1; - let t2; - let if_block0 = /*square*/ ctx[12].realItems.length && create_if_block_3$2(ctx); - let if_block1 = /*square*/ ctx[12].impliedItems.length && create_if_block_1$3(ctx); - - return { - c() { - details = element("details"); - summary = element("summary"); - t0 = text(t0_value); - t1 = space(); - if (if_block0) if_block0.c(); - t2 = space(); - if (if_block1) if_block1.c(); - attr(summary, "class", "svelte-1dlhare"); - details.open = true; - attr(details, "class", "BC-details"); - }, - m(target, anchor) { - insert(target, details, anchor); - append(details, summary); - append(summary, t0); - append(details, t1); - if (if_block0) if_block0.m(details, null); - append(details, t2); - if (if_block1) if_block1.m(details, null); - }, - p(ctx, dirty) { - if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = /*square*/ ctx[12].field + "")) set_data(t0, t0_value); - - if (/*square*/ ctx[12].realItems.length) { - if (if_block0) { - if_block0.p(ctx, dirty); - } else { - if_block0 = create_if_block_3$2(ctx); - if_block0.c(); - if_block0.m(details, t2); - } - } else if (if_block0) { - if_block0.d(1); - if_block0 = null; - } - - if (/*square*/ ctx[12].impliedItems.length) { - if (if_block1) { - if_block1.p(ctx, dirty); - } else { - if_block1 = create_if_block_1$3(ctx); - if_block1.c(); - if_block1.m(details, null); - } - } else if (if_block1) { - if_block1.d(1); - if_block1 = null; - } - }, - d(detaching) { - if (detaching) detach(details); - if (if_block0) if_block0.d(); - if (if_block1) if_block1.d(); - } - }; -} - -// (27:12) {#if square.realItems.length} -function create_if_block_3$2(ctx) { - let t; - let ol; - let if_block = /*settings*/ ctx[1].showRelationType && create_if_block_4$1(); - let each_value_3 = /*square*/ ctx[12].realItems; - let each_blocks = []; - - for (let i = 0; i < each_value_3.length; i += 1) { - each_blocks[i] = create_each_block_3$1(get_each_context_3$1(ctx, each_value_3, i)); - } +// (51:16) {#if square.impliedItems.length} +function create_if_block_2$2(ctx) { + let if_block_anchor; + let if_block = /*settings*/ ctx[1].showRelationType && /*square*/ ctx[12].realItems.length && create_if_block_3$1(); return { c() { if (if_block) if_block.c(); - t = space(); - ol = element("ol"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } + if_block_anchor = empty(); }, m(target, anchor) { if (if_block) if_block.m(target, anchor); - insert(target, t, anchor); - insert(target, ol, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(ol, null); - } + insert(target, if_block_anchor, anchor); }, p(ctx, dirty) { - if (/*settings*/ ctx[1].showRelationType) { + if (/*settings*/ ctx[1].showRelationType && /*square*/ ctx[12].realItems.length) { if (if_block) ; else { - if_block = create_if_block_4$1(); + if_block = create_if_block_3$1(); if_block.c(); - if_block.m(t.parentNode, t); + if_block.m(if_block_anchor.parentNode, if_block_anchor); } } else if (if_block) { if_block.d(1); if_block = null; } - - if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { - each_value_3 = /*square*/ ctx[12].realItems; - let i; - - for (i = 0; i < each_value_3.length; i += 1) { - const child_ctx = get_each_context_3$1(ctx, each_value_3, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_3$1(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(ol, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value_3.length; - } }, d(detaching) { if (if_block) if_block.d(detaching); - if (detaching) detach(t); - if (detaching) detach(ol); - destroy_each(each_blocks, detaching); + if (detaching) detach(if_block_anchor); } }; } -// (28:14) {#if settings.showRelationType} -function create_if_block_4$1(ctx) { - let h5; +// (52:18) {#if settings.showRelationType && square.realItems.length} +function create_if_block_3$1(ctx) { + let h6; return { c() { - h5 = element("h5"); - h5.textContent = "Real"; - attr(h5, "class", "BC-header svelte-1dlhare"); + h6 = element("h6"); + h6.textContent = "Implied"; + attr(h6, "class", "BC-Matrix-header svelte-sp0k97"); }, m(target, anchor) { - insert(target, h5, anchor); + insert(target, h6, anchor); }, d(detaching) { - if (detaching) detach(h5); + if (detaching) detach(h6); } }; } -// (33:16) {#each square.realItems as realItem} -function create_each_block_3$1(ctx) { - let li; - let div; - let t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + ""; - let t0; - let div_class_value; - let t1; - let mounted; - let dispose; - - function click_handler(...args) { - return /*click_handler*/ ctx[5](/*realItem*/ ctx[18], ...args); - } - - function mouseover_handler(...args) { - return /*mouseover_handler*/ ctx[6](/*realItem*/ ctx[18], ...args); - } - - return { - c() { - li = element("li"); - div = element("div"); - t0 = text(t0_value); - t1 = space(); - attr(div, "class", div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-1dlhare")); - }, - m(target, anchor) { - insert(target, li, anchor); - append(li, div); - append(div, t0); - append(li, t1); - - if (!mounted) { - dispose = [ - listen(div, "click", click_handler), - listen(div, "mouseover", mouseover_handler) - ]; - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + "")) set_data(t0, t0_value); - - if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-1dlhare"))) { - attr(div, "class", div_class_value); - } - }, - d(detaching) { - if (detaching) detach(li); - mounted = false; - run_all(dispose); - } - }; -} - -// (48:12) {#if square.impliedItems.length} -function create_if_block_1$3(ctx) { - let t; - let ol; - let ol_start_value; - let if_block = /*settings*/ ctx[1].showRelationType && create_if_block_2$3(); - let each_value_2 = /*square*/ ctx[12].impliedItems; - let each_blocks = []; - - for (let i = 0; i < each_value_2.length; i += 1) { - each_blocks[i] = create_each_block_2$2(get_each_context_2$2(ctx, each_value_2, i)); - } - - return { - c() { - if (if_block) if_block.c(); - t = space(); - ol = element("ol"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(ol, "start", ol_start_value = /*square*/ ctx[12].realItems.length + 1); - }, - m(target, anchor) { - if (if_block) if_block.m(target, anchor); - insert(target, t, anchor); - insert(target, ol, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(ol, null); - } - }, - p(ctx, dirty) { - if (/*settings*/ ctx[1].showRelationType) { - if (if_block) ; else { - if_block = create_if_block_2$3(); - if_block.c(); - if_block.m(t.parentNode, t); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - - if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { - each_value_2 = /*square*/ ctx[12].impliedItems; - let i; - - for (i = 0; i < each_value_2.length; i += 1) { - const child_ctx = get_each_context_2$2(ctx, each_value_2, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_2$2(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(ol, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value_2.length; - } - - if (dirty & /*filteredSquaresArr*/ 1 && ol_start_value !== (ol_start_value = /*square*/ ctx[12].realItems.length + 1)) { - attr(ol, "start", ol_start_value); - } - }, - d(detaching) { - if (if_block) if_block.d(detaching); - if (detaching) detach(t); - if (detaching) detach(ol); - destroy_each(each_blocks, detaching); - } - }; -} - -// (49:14) {#if settings.showRelationType} -function create_if_block_2$3(ctx) { - let h5; - - return { - c() { - h5 = element("h5"); - h5.textContent = "Implied"; - attr(h5, "class", "BC-header svelte-1dlhare"); - }, - m(target, anchor) { - insert(target, h5, anchor); - }, - d(detaching) { - if (detaching) detach(h5); - } - }; -} - -// (54:16) {#each square.impliedItems as impliedItem} -function create_each_block_2$2(ctx) { +// (58:16) {#each square.impliedItems as impliedItem} +function create_each_block_2$2(ctx) { let li; let div; let t_value = (/*impliedItem*/ ctx[15].alt ?? /*impliedItem*/ ctx[15].to.split("/").last()) + ""; @@ -23810,8 +23136,13 @@ function create_each_block_2$2(ctx) { li = element("li"); div = element("div"); t = text(t_value); - attr(div, "class", div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-1dlhare")); - attr(div, "aria-label", div_aria_label_value = /*impliedItem*/ ctx[15].parent ?? ""); + attr(div, "class", div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-sp0k97")); + + attr(div, "aria-label", div_aria_label_value = /*impliedItem*/ ctx[15].parent + ? "↑ " + /*impliedItem*/ ctx[15].parent + : ""); + + attr(div, "aria-label-position", "left"); attr(li, "class", "BC-Implied"); }, m(target, anchor) { @@ -23832,11 +23163,13 @@ function create_each_block_2$2(ctx) { ctx = new_ctx; if (dirty & /*filteredSquaresArr*/ 1 && t_value !== (t_value = (/*impliedItem*/ ctx[15].alt ?? /*impliedItem*/ ctx[15].to.split("/").last()) + "")) set_data(t, t_value); - if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-1dlhare"))) { + if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-sp0k97"))) { attr(div, "class", div_class_value); } - if (dirty & /*filteredSquaresArr*/ 1 && div_aria_label_value !== (div_aria_label_value = /*impliedItem*/ ctx[15].parent ?? "")) { + if (dirty & /*filteredSquaresArr*/ 1 && div_aria_label_value !== (div_aria_label_value = /*impliedItem*/ ctx[15].parent + ? "↑ " + /*impliedItem*/ ctx[15].parent + : "")) { attr(div, "aria-label", div_aria_label_value); } }, @@ -23848,8 +23181,8 @@ function create_each_block_2$2(ctx) { }; } -// (23:6) {#each squares as square} -function create_each_block_1$6(ctx) { +// (19:6) {#each squares as square} +function create_each_block_1$5(ctx) { let if_block_anchor; let if_block = (/*square*/ ctx[12].realItems.length > 0 || /*square*/ ctx[12].impliedItems.length > 0) && create_if_block$4(ctx); @@ -23884,63 +23217,50 @@ function create_each_block_1$6(ctx) { } // (17:2) {#each filteredSquaresArr as squares} -function create_each_block$6(ctx) { - let details; - let summary; - let t0_value = /*squares*/ ctx[9].map(func).join(", ") + ""; - let t0; - let t1; - let t2; +function create_each_block$7(ctx) { + let div; + let t; let each_value_1 = /*squares*/ ctx[9]; let each_blocks = []; for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks[i] = create_each_block_1$6(get_each_context_1$6(ctx, each_value_1, i)); + each_blocks[i] = create_each_block_1$5(get_each_context_1$5(ctx, each_value_1, i)); } return { c() { - details = element("details"); - summary = element("summary"); - t0 = text(t0_value); - t1 = space(); + div = element("div"); for (let i = 0; i < each_blocks.length; i += 1) { each_blocks[i].c(); } - t2 = space(); - attr(summary, "class", "hier-summary svelte-1dlhare"); - details.open = true; + t = space(); + attr(div, "class", "svelte-sp0k97"); }, m(target, anchor) { - insert(target, details, anchor); - append(details, summary); - append(summary, t0); - append(details, t1); + insert(target, div, anchor); for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(details, null); + each_blocks[i].m(div, null); } - append(details, t2); + append(div, t); }, p(ctx, dirty) { - if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = /*squares*/ ctx[9].map(func).join(", ") + "")) set_data(t0, t0_value); - if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView, settings*/ 15) { each_value_1 = /*squares*/ ctx[9]; let i; for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1$6(ctx, each_value_1, i); + const child_ctx = get_each_context_1$5(ctx, each_value_1, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block_1$6(child_ctx); + each_blocks[i] = create_each_block_1$5(child_ctx); each_blocks[i].c(); - each_blocks[i].m(details, t2); + each_blocks[i].m(div, t); } } @@ -23952,7 +23272,7 @@ function create_each_block$6(ctx) { } }, d(detaching) { - if (detaching) detach(details); + if (detaching) detach(div); destroy_each(each_blocks, detaching); } }; @@ -23965,7 +23285,7 @@ function create_fragment$b(ctx) { let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$6(get_each_context$6(ctx, each_value, i)); + each_blocks[i] = create_each_block$7(get_each_context$7(ctx, each_value, i)); } return { @@ -23976,9 +23296,9 @@ function create_fragment$b(ctx) { each_blocks[i].c(); } - attr(div, "class", div_class_value = "BC-list markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length + attr(div, "class", div_class_value = "BC-Matrix markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length ? "" - : "BC-empty-view") + " svelte-1dlhare"); + : "BC-empty-view") + " svelte-sp0k97"); }, m(target, anchor) { insert(target, div, anchor); @@ -23993,12 +23313,12 @@ function create_fragment$b(ctx) { let i; for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$6(ctx, each_value, i); + const child_ctx = get_each_context$7(ctx, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block$6(child_ctx); + each_blocks[i] = create_each_block$7(child_ctx); each_blocks[i].c(); each_blocks[i].m(div, null); } @@ -24011,9 +23331,9 @@ function create_fragment$b(ctx) { each_blocks.length = each_value.length; } - if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "BC-list markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length + if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "BC-Matrix markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length ? "" - : "BC-empty-view") + " svelte-1dlhare")) { + : "BC-empty-view") + " svelte-sp0k97")) { attr(div, "class", div_class_value); } }, @@ -24026,8 +23346,6 @@ function create_fragment$b(ctx) { }; } -const func = square => square.field; - function instance$b($$self, $$props, $$invalidate) { @@ -24038,7 +23356,7 @@ function instance$b($$self, $$props, $$invalidate) { let { matrixView } = $$props; let { app } = $$props; const click_handler = async (realItem, e) => openOrSwitch(app, realItem.to, e); - const mouseover_handler = (realItem, e) => hoverPreview(e, matrixView, realItem.to); + const mouseover_handler = (realItem, event) => hoverPreview(event, matrixView, realItem.to); const click_handler_1 = async (impliedItem, e) => openOrSwitch(app, impliedItem.to, e); const mouseover_handler_1 = (impliedItem, e) => hoverPreview(e, matrixView, impliedItem.to); @@ -24063,10 +23381,10 @@ function instance$b($$self, $$props, $$invalidate) { ]; } -class Lists extends SvelteComponent { +class Matrix extends SvelteComponent { constructor(options) { super(); - if (!document.getElementById("svelte-1dlhare-style")) add_css$6(); + if (!document.getElementById("svelte-sp0k97-style")) add_css$7(); init(this, options, instance$b, create_fragment$b, safe_not_equal, { filteredSquaresArr: 0, @@ -24078,1687 +23396,195 @@ class Lists extends SvelteComponent { } } -/* src\Components\Matrix.svelte generated by Svelte v3.35.0 */ - -function add_css$5() { - var style = element("style"); - style.id = "svelte-sp0k97-style"; - style.textContent = "div.BC-Matrix.svelte-sp0k97.svelte-sp0k97{padding:5px}div.BC-Matrix.svelte-sp0k97>div.svelte-sp0k97{border:3px solid var(--background-modifier-border);border-radius:3px;text-align:center;margin:3px;position:relative;height:fit-content}div.BC-Matrix-square.svelte-sp0k97.svelte-sp0k97{border:1px solid var(--background-modifier-border)}div.BC-Matrix-headers.svelte-sp0k97.svelte-sp0k97{display:flex;justify-content:space-between;align-items:center}.BC-Matrix-header.svelte-sp0k97.svelte-sp0k97{margin:2px;padding:0px 10px}ol.svelte-sp0k97.svelte-sp0k97{margin:3px;padding-left:30px}"; - append(document.head, style); -} - -function get_each_context$5(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[9] = list[i]; - return child_ctx; -} - -function get_each_context_1$5(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[12] = list[i]; - return child_ctx; -} - -function get_each_context_2$1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[15] = list[i]; - return child_ctx; -} - -function get_each_context_3(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[18] = list[i]; - return child_ctx; -} - -// (20:8) {#if square.realItems.length > 0 || square.impliedItems.length > 0} -function create_if_block$3(ctx) { - let div1; - let div0; - let h4; - let t0_value = /*square*/ ctx[12].field + ""; - let t0; - let t1; - let t2; - let t3; - let if_block0 = /*settings*/ ctx[1].showRelationType && create_if_block_5(ctx); - let if_block1 = /*square*/ ctx[12].realItems.length && create_if_block_4(ctx); - let if_block2 = /*square*/ ctx[12].impliedItems.length && create_if_block_1$2(ctx); - - return { - c() { - div1 = element("div"); - div0 = element("div"); - h4 = element("h4"); - t0 = text(t0_value); - t1 = space(); - if (if_block0) if_block0.c(); - t2 = space(); - if (if_block1) if_block1.c(); - t3 = space(); - if (if_block2) if_block2.c(); - attr(h4, "class", "BC-Matrix-header svelte-sp0k97"); - attr(div0, "class", "BC-Matrix-headers svelte-sp0k97"); - attr(div1, "class", "BC-Matrix-square svelte-sp0k97"); - }, - m(target, anchor) { - insert(target, div1, anchor); - append(div1, div0); - append(div0, h4); - append(h4, t0); - append(div0, t1); - if (if_block0) if_block0.m(div0, null); - append(div1, t2); - if (if_block1) if_block1.m(div1, null); - append(div1, t3); - if (if_block2) if_block2.m(div1, null); - }, - p(ctx, dirty) { - if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = /*square*/ ctx[12].field + "")) set_data(t0, t0_value); - - if (/*settings*/ ctx[1].showRelationType) { - if (if_block0) { - if_block0.p(ctx, dirty); - } else { - if_block0 = create_if_block_5(ctx); - if_block0.c(); - if_block0.m(div0, null); - } - } else if (if_block0) { - if_block0.d(1); - if_block0 = null; - } - - if (/*square*/ ctx[12].realItems.length) { - if (if_block1) { - if_block1.p(ctx, dirty); - } else { - if_block1 = create_if_block_4(ctx); - if_block1.c(); - if_block1.m(div1, t3); - } - } else if (if_block1) { - if_block1.d(1); - if_block1 = null; - } - - if (/*square*/ ctx[12].impliedItems.length) { - if (if_block2) { - if_block2.p(ctx, dirty); - } else { - if_block2 = create_if_block_1$2(ctx); - if_block2.c(); - if_block2.m(div1, null); - } - } else if (if_block2) { - if_block2.d(1); - if_block2 = null; - } - }, - d(detaching) { - if (detaching) detach(div1); - if (if_block0) if_block0.d(); - if (if_block1) if_block1.d(); - if (if_block2) if_block2.d(); - } - }; -} - -// (25:14) {#if settings.showRelationType} -function create_if_block_5(ctx) { - let h6; - let t_value = (/*square*/ ctx[12].realItems.length ? "Real" : "Implied") + ""; - let t; - - return { - c() { - h6 = element("h6"); - t = text(t_value); - attr(h6, "class", "BC-Matrix-header svelte-sp0k97"); - }, - m(target, anchor) { - insert(target, h6, anchor); - append(h6, t); - }, - p(ctx, dirty) { - if (dirty & /*filteredSquaresArr*/ 1 && t_value !== (t_value = (/*square*/ ctx[12].realItems.length ? "Real" : "Implied") + "")) set_data(t, t_value); - }, - d(detaching) { - if (detaching) detach(h6); - } - }; -} - -// (31:12) {#if square.realItems.length} -function create_if_block_4(ctx) { - let ol; - let each_value_3 = /*square*/ ctx[12].realItems; - let each_blocks = []; - - for (let i = 0; i < each_value_3.length; i += 1) { - each_blocks[i] = create_each_block_3(get_each_context_3(ctx, each_value_3, i)); - } - - return { - c() { - ol = element("ol"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(ol, "class", "svelte-sp0k97"); - }, - m(target, anchor) { - insert(target, ol, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(ol, null); - } - }, - p(ctx, dirty) { - if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { - each_value_3 = /*square*/ ctx[12].realItems; - let i; - - for (i = 0; i < each_value_3.length; i += 1) { - const child_ctx = get_each_context_3(ctx, each_value_3, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_3(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(ol, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value_3.length; - } - }, - d(detaching) { - if (detaching) detach(ol); - destroy_each(each_blocks, detaching); - } - }; -} - -// (33:16) {#each square.realItems as realItem} -function create_each_block_3(ctx) { - let li; - let div; - let t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + ""; - let t0; - let div_class_value; - let t1; - let mounted; - let dispose; - - function click_handler(...args) { - return /*click_handler*/ ctx[5](/*realItem*/ ctx[18], ...args); - } - - function mouseover_handler(...args) { - return /*mouseover_handler*/ ctx[6](/*realItem*/ ctx[18], ...args); - } - - return { - c() { - li = element("li"); - div = element("div"); - t0 = text(t0_value); - t1 = space(); - attr(div, "class", div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-sp0k97")); - }, - m(target, anchor) { - insert(target, li, anchor); - append(li, div); - append(div, t0); - append(li, t1); - - if (!mounted) { - dispose = [ - listen(div, "click", click_handler), - listen(div, "mouseover", mouseover_handler) - ]; - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - if (dirty & /*filteredSquaresArr*/ 1 && t0_value !== (t0_value = (/*realItem*/ ctx[18].alt ?? /*realItem*/ ctx[18].to.split("/").last()) + "")) set_data(t0, t0_value); - - if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*realItem*/ ctx[18].cls) + " svelte-sp0k97"))) { - attr(div, "class", div_class_value); - } - }, - d(detaching) { - if (detaching) detach(li); - mounted = false; - run_all(dispose); - } - }; -} - -// (48:12) {#if square.impliedItems.length} -function create_if_block_1$2(ctx) { - let div; - let h4; - let t0; - let t1; - let ol; - let ol_start_value; - let if_block = /*square*/ ctx[12].impliedItems.length && create_if_block_2$2(ctx); - let each_value_2 = /*square*/ ctx[12].impliedItems; - let each_blocks = []; - - for (let i = 0; i < each_value_2.length; i += 1) { - each_blocks[i] = create_each_block_2$1(get_each_context_2$1(ctx, each_value_2, i)); - } - - return { - c() { - div = element("div"); - h4 = element("h4"); - t0 = space(); - if (if_block) if_block.c(); - t1 = space(); - ol = element("ol"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(h4, "class", "BC-Matrix-header svelte-sp0k97"); - attr(div, "class", "BC-Matrix-headers svelte-sp0k97"); - attr(ol, "start", ol_start_value = /*square*/ ctx[12].realItems.length + 1); - attr(ol, "class", "svelte-sp0k97"); - }, - m(target, anchor) { - insert(target, div, anchor); - append(div, h4); - append(div, t0); - if (if_block) if_block.m(div, null); - insert(target, t1, anchor); - insert(target, ol, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(ol, null); - } - }, - p(ctx, dirty) { - if (/*square*/ ctx[12].impliedItems.length) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block_2$2(ctx); - if_block.c(); - if_block.m(div, null); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - - if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView*/ 13) { - each_value_2 = /*square*/ ctx[12].impliedItems; - let i; - - for (i = 0; i < each_value_2.length; i += 1) { - const child_ctx = get_each_context_2$1(ctx, each_value_2, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_2$1(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(ol, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value_2.length; - } - - if (dirty & /*filteredSquaresArr*/ 1 && ol_start_value !== (ol_start_value = /*square*/ ctx[12].realItems.length + 1)) { - attr(ol, "start", ol_start_value); - } - }, - d(detaching) { - if (detaching) detach(div); - if (if_block) if_block.d(); - if (detaching) detach(t1); - if (detaching) detach(ol); - destroy_each(each_blocks, detaching); - } - }; -} - -// (51:16) {#if square.impliedItems.length} -function create_if_block_2$2(ctx) { - let if_block_anchor; - let if_block = /*settings*/ ctx[1].showRelationType && /*square*/ ctx[12].realItems.length && create_if_block_3$1(); - - return { - c() { - if (if_block) if_block.c(); - if_block_anchor = empty(); - }, - m(target, anchor) { - if (if_block) if_block.m(target, anchor); - insert(target, if_block_anchor, anchor); - }, - p(ctx, dirty) { - if (/*settings*/ ctx[1].showRelationType && /*square*/ ctx[12].realItems.length) { - if (if_block) ; else { - if_block = create_if_block_3$1(); - if_block.c(); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - }, - d(detaching) { - if (if_block) if_block.d(detaching); - if (detaching) detach(if_block_anchor); - } - }; -} - -// (52:18) {#if settings.showRelationType && square.realItems.length} -function create_if_block_3$1(ctx) { - let h6; - - return { - c() { - h6 = element("h6"); - h6.textContent = "Implied"; - attr(h6, "class", "BC-Matrix-header svelte-sp0k97"); - }, - m(target, anchor) { - insert(target, h6, anchor); - }, - d(detaching) { - if (detaching) detach(h6); - } - }; -} - -// (58:16) {#each square.impliedItems as impliedItem} -function create_each_block_2$1(ctx) { - let li; - let div; - let t_value = (/*impliedItem*/ ctx[15].alt ?? /*impliedItem*/ ctx[15].to.split("/").last()) + ""; - let t; - let div_class_value; - let div_aria_label_value; - let mounted; - let dispose; - - function click_handler_1(...args) { - return /*click_handler_1*/ ctx[7](/*impliedItem*/ ctx[15], ...args); - } - - function mouseover_handler_1(...args) { - return /*mouseover_handler_1*/ ctx[8](/*impliedItem*/ ctx[15], ...args); - } - - return { - c() { - li = element("li"); - div = element("div"); - t = text(t_value); - attr(div, "class", div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-sp0k97")); - - attr(div, "aria-label", div_aria_label_value = /*impliedItem*/ ctx[15].parent - ? "↑ " + /*impliedItem*/ ctx[15].parent - : ""); - - attr(div, "aria-label-position", "left"); - attr(li, "class", "BC-Implied"); - }, - m(target, anchor) { - insert(target, li, anchor); - append(li, div); - append(div, t); - - if (!mounted) { - dispose = [ - listen(div, "click", click_handler_1), - listen(div, "mouseover", mouseover_handler_1) - ]; - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - if (dirty & /*filteredSquaresArr*/ 1 && t_value !== (t_value = (/*impliedItem*/ ctx[15].alt ?? /*impliedItem*/ ctx[15].to.split("/").last()) + "")) set_data(t, t_value); - - if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "" + (null_to_empty(/*impliedItem*/ ctx[15].cls) + " svelte-sp0k97"))) { - attr(div, "class", div_class_value); - } - - if (dirty & /*filteredSquaresArr*/ 1 && div_aria_label_value !== (div_aria_label_value = /*impliedItem*/ ctx[15].parent - ? "↑ " + /*impliedItem*/ ctx[15].parent - : "")) { - attr(div, "aria-label", div_aria_label_value); - } - }, - d(detaching) { - if (detaching) detach(li); - mounted = false; - run_all(dispose); - } - }; -} - -// (19:6) {#each squares as square} -function create_each_block_1$5(ctx) { - let if_block_anchor; - let if_block = (/*square*/ ctx[12].realItems.length > 0 || /*square*/ ctx[12].impliedItems.length > 0) && create_if_block$3(ctx); - - return { - c() { - if (if_block) if_block.c(); - if_block_anchor = empty(); - }, - m(target, anchor) { - if (if_block) if_block.m(target, anchor); - insert(target, if_block_anchor, anchor); - }, - p(ctx, dirty) { - if (/*square*/ ctx[12].realItems.length > 0 || /*square*/ ctx[12].impliedItems.length > 0) { - if (if_block) { - if_block.p(ctx, dirty); - } else { - if_block = create_if_block$3(ctx); - if_block.c(); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - }, - d(detaching) { - if (if_block) if_block.d(detaching); - if (detaching) detach(if_block_anchor); - } - }; -} - -// (17:2) {#each filteredSquaresArr as squares} -function create_each_block$5(ctx) { - let div; - let t; - let each_value_1 = /*squares*/ ctx[9]; - let each_blocks = []; - - for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks[i] = create_each_block_1$5(get_each_context_1$5(ctx, each_value_1, i)); - } - - return { - c() { - div = element("div"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - t = space(); - attr(div, "class", "svelte-sp0k97"); - }, - m(target, anchor) { - insert(target, div, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div, null); - } - - append(div, t); - }, - p(ctx, dirty) { - if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView, settings*/ 15) { - each_value_1 = /*squares*/ ctx[9]; - let i; - - for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1$5(ctx, each_value_1, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_1$5(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(div, t); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value_1.length; - } - }, - d(detaching) { - if (detaching) detach(div); - destroy_each(each_blocks, detaching); - } - }; -} - -function create_fragment$a(ctx) { - let div; - let div_class_value; - let each_value = /*filteredSquaresArr*/ ctx[0]; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$5(get_each_context$5(ctx, each_value, i)); - } - - return { - c() { - div = element("div"); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(div, "class", div_class_value = "BC-Matrix markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length - ? "" - : "BC-empty-view") + " svelte-sp0k97"); - }, - m(target, anchor) { - insert(target, div, anchor); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div, null); - } - }, - p(ctx, [dirty]) { - if (dirty & /*filteredSquaresArr, openOrSwitch, app, hoverPreview, matrixView, settings*/ 15) { - each_value = /*filteredSquaresArr*/ ctx[0]; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$5(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$5(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(div, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value.length; - } - - if (dirty & /*filteredSquaresArr*/ 1 && div_class_value !== (div_class_value = "BC-Matrix markdown-preview-view " + (/*filteredSquaresArr*/ ctx[0].length - ? "" - : "BC-empty-view") + " svelte-sp0k97")) { - attr(div, "class", div_class_value); - } - }, - i: noop, - o: noop, - d(detaching) { - if (detaching) detach(div); - destroy_each(each_blocks, detaching); - } - }; -} - -function instance$a($$self, $$props, $$invalidate) { - - - - let { filteredSquaresArr } = $$props; - let { currFile } = $$props; - let { settings } = $$props; - let { matrixView } = $$props; - let { app } = $$props; - const click_handler = async (realItem, e) => openOrSwitch(app, realItem.to, e); - const mouseover_handler = (realItem, event) => hoverPreview(event, matrixView, realItem.to); - const click_handler_1 = async (impliedItem, e) => openOrSwitch(app, impliedItem.to, e); - const mouseover_handler_1 = (impliedItem, e) => hoverPreview(e, matrixView, impliedItem.to); - - $$self.$$set = $$props => { - if ("filteredSquaresArr" in $$props) $$invalidate(0, filteredSquaresArr = $$props.filteredSquaresArr); - if ("currFile" in $$props) $$invalidate(4, currFile = $$props.currFile); - if ("settings" in $$props) $$invalidate(1, settings = $$props.settings); - if ("matrixView" in $$props) $$invalidate(2, matrixView = $$props.matrixView); - if ("app" in $$props) $$invalidate(3, app = $$props.app); - }; - - return [ - filteredSquaresArr, - settings, - matrixView, - app, - currFile, - click_handler, - mouseover_handler, - click_handler_1, - mouseover_handler_1 - ]; -} - -class Matrix extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-sp0k97-style")) add_css$5(); - - init(this, options, instance$a, create_fragment$a, safe_not_equal, { - filteredSquaresArr: 0, - currFile: 4, - settings: 1, - matrixView: 2, - app: 3 - }); - } -} - -class MatrixView extends require$$0.ItemView { - constructor(leaf, plugin) { - super(leaf); - this.icon = TRAIL_ICON; - this.toInternalLinkObj = (to, realQ = true, parent) => { - return { - to, - cls: linkClass(this.app, to, realQ), - alt: this.getAlt(to, this.plugin.settings), - order: this.getOrder(to), - parent, - }; - }; - this.getOrder = (node) => Number.parseInt(this.plugin.mainG.getNodeAttribute(node, "order")); - this.plugin = plugin; - this.db = new Debugger(plugin); - } - async onload() { - super.onload(); - this.matrixQ = this.plugin.settings.defaultView; - this.app.workspace.onLayoutReady(() => { - setTimeout(async () => await this.draw(), this.app.plugins.plugins.dataview - ? this.app.plugins.plugins.dataview.api - ? 1 - : this.plugin.settings.dvWaitTime - : 3000); - }); - } - getViewType() { - return MATRIX_VIEW; - } - getDisplayText() { - return "Breadcrumbs Matrix"; - } - async onOpen() { } - onClose() { - var _a; - (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); - return Promise.resolve(); - } - getAlt(node, settings) { - let alt = null; - if (settings.altLinkFields.length) { - const file = this.app.metadataCache.getFirstLinkpathDest(node, ""); - if (file) { - const metadata = this.app.metadataCache.getFileCache(file); - settings.altLinkFields.forEach((altLinkField) => { - var _a; - alt = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.frontmatter) === null || _a === void 0 ? void 0 : _a[altLinkField]; - }); - } - } - return alt; - } - // ANCHOR Remove duplicate implied links - removeDuplicateImplied(reals, implieds) { - const realTos = reals.map((real) => real.to); - return implieds.filter((implied) => !realTos.includes(implied.to)); - } - getHierSquares(userHiers, currFile, settings) { - const { plugin } = this; - const { mainG } = plugin; - if (!mainG) - return []; - const { basename } = currFile; - const realsnImplieds = getRealnImplied(plugin, basename); - return userHiers.map((hier) => { - const filteredRealNImplied = blankRealNImplied(); - for (const dir in realsnImplieds) { - const { reals, implieds } = realsnImplieds[dir]; - filteredRealNImplied[dir].reals = reals - .filter((real) => hier[dir].includes(real.field)) - .map((item) => this.toInternalLinkObj(item.to, true)); - filteredRealNImplied[dir].implieds = implieds - .filter((implied) => hier[dir].includes(implied.field)) - .map((item) => this.toInternalLinkObj(item.to, false)); - } - let { up: { reals: ru, implieds: iu }, same: { reals: rs, implieds: is }, down: { reals: rd, implieds: id }, next: { reals: rn, implieds: iN }, prev: { reals: rp, implieds: ip }, } = filteredRealNImplied; - // SECTION Implied Siblings - /// Notes with the same parents - const g = getSubInDirs(mainG, "up", "down"); - const closed = getReflexiveClosure(g, userHiers); - const closedUp = getSubInDirs(closed, "up"); - const iSamesII = []; - if (closedUp.hasNode(basename)) { - closedUp.forEachOutEdge(basename, (k, a, s, par) => { - if (hier.up.includes(a.field)) { - closedUp.forEachInEdge(par, (k, a, s, t) => { - if (s === basename && !settings.treatCurrNodeAsImpliedSibling) - return; - iSamesII.push(this.toInternalLinkObj(s, false, t)); - }); - } - }); - } - is.push(...iSamesII); - // !SECTION - iu = this.removeDuplicateImplied(ru, iu); - is = this.removeDuplicateImplied(rs, is); - id = this.removeDuplicateImplied(rd, id); - iN = this.removeDuplicateImplied(rn, iN); - ip = this.removeDuplicateImplied(rp, ip); - const iSameNoDup = []; - is.forEach((impSib) => { - if (iSameNoDup.every((noDup) => noDup.to !== impSib.to)) { - iSameNoDup.push(impSib); - } - }); - is = iSameNoDup; - const getFieldInHier = (dir) => hier[dir][0] - ? hier[dir].join(", ") - : `${hier[getOppDir(dir)].join(",")}${ARROW_DIRECTIONS[dir]}`; - const { alphaSortAsc } = settings; - const squares = [ru, rs, rd, rn, rp, iu, is, id, iN, ip]; - if (settings.enableAlphaSort) { - squares.forEach((sq) => sq.sort((a, b) => a.to < b.to ? (alphaSortAsc ? -1 : 1) : alphaSortAsc ? 1 : -1)); - } - squares.forEach((sq) => sq.sort((a, b) => a.order - b.order)); - loglevel.debug({ ru }, { rs }, { rd }, { rn }, { rp }, { iu }, { is }, { id }, { iN }, { ip }); - return [ - { - realItems: ru, - impliedItems: iu, - field: getFieldInHier("up"), - }, - { - realItems: rs, - impliedItems: is, - field: getFieldInHier("same"), - }, - { - realItems: rd, - impliedItems: id, - field: getFieldInHier("down"), - }, - { - realItems: rn, - impliedItems: iN, - field: getFieldInHier("next"), - }, - { - realItems: rp, - impliedItems: ip, - field: getFieldInHier("prev"), - }, - ]; - }); - } - async draw() { - try { - const { contentEl, db } = this; - db.start2G("Draw Matrix/List View"); - contentEl.empty(); - const { settings } = this.plugin; - const { userHiers } = settings; - const currFile = this.app.workspace.getActiveFile(); - contentEl.createEl("button", { - text: this.matrixQ ? "List" : "Matrix", - }, (el) => { - el.onclick = async () => { - this.matrixQ = !this.matrixQ; - el.innerText = this.matrixQ ? "List" : "Matrix"; - await this.draw(); - }; - }); - contentEl.createEl("button", { text: "↻" }, (el) => { - el.onclick = async () => await this.plugin.refreshIndex(); - }); - const hierSquares = this.getHierSquares(userHiers, currFile, settings).filter((squareArr) => squareArr.some((square) => square.realItems.length + square.impliedItems.length > 0)); - const compInput = { - target: contentEl, - props: { - filteredSquaresArr: hierSquares, - currFile, - settings, - matrixView: this, - app: this.app, - }, - }; - this.matrixQ - ? (this.view = new Matrix(compInput)) - : (this.view = new Lists(compInput)); - db.end2G(); - } - catch (err) { - loglevel.error(err); - this.db.end2G(); - } - } -} - -/* src\Components\KoFi.svelte generated by Svelte v3.35.0 */ - -function create_fragment$9(ctx) { - let script; - let script_src_value; - let t; - let div; - let mounted; - let dispose; - - return { - c() { - script = element("script"); - t = space(); - div = element("div"); - attr(script, "type", "text/javascript"); - if (script.src !== (script_src_value = "https://ko-fi.com/widgets/widget_2.js")) attr(script, "src", script_src_value); - }, - m(target, anchor) { - append(document.head, script); - insert(target, t, anchor); - insert(target, div, anchor); - /*div_binding*/ ctx[2](div); - - if (!mounted) { - dispose = listen(script, "load", /*initializeKofi*/ ctx[1]); - mounted = true; - } - }, - p: noop, - i: noop, - o: noop, - d(detaching) { - detach(script); - if (detaching) detach(t); - if (detaching) detach(div); - /*div_binding*/ ctx[2](null); - mounted = false; - dispose(); - } - }; -} - -function instance$9($$self, $$props, $$invalidate) { - let button; - - var initializeKofi = () => { - kofiwidget2.init("Support Breadcrumbs development!", "#29abe0", "G2G454TZF"); - $$invalidate(0, button.innerHTML = kofiwidget2.getHTML(), button); - }; - - function div_binding($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - button = $$value; - $$invalidate(0, button); - }); - } - - return [button, initializeKofi, div_binding]; -} - -class KoFi extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$9, create_fragment$9, safe_not_equal, {}); - } -} - -/* node_modules\svelte-icons\fa\FaListUl.svelte generated by Svelte v3.35.0 */ - -function create_default_slot$2(ctx) { - let path; - - return { - c() { - path = svg_element("path"); - attr(path, "d", "M48 48a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm0 160a48 48 0 1 0 48 48 48 48 0 0 0-48-48zm448 16H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16zm0-320H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16V80a16 16 0 0 0-16-16zm0 160H176a16 16 0 0 0-16 16v32a16 16 0 0 0 16 16h320a16 16 0 0 0 16-16v-32a16 16 0 0 0-16-16z"); - }, - m(target, anchor) { - insert(target, path, anchor); - }, - d(detaching) { - if (detaching) detach(path); - } - }; -} - -function create_fragment$8(ctx) { - let iconbase; - let current; - const iconbase_spread_levels = [{ viewBox: "0 0 512 512" }, /*$$props*/ ctx[0]]; - - let iconbase_props = { - $$slots: { default: [create_default_slot$2] }, - $$scope: { ctx } - }; - - for (let i = 0; i < iconbase_spread_levels.length; i += 1) { - iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); - } - - iconbase = new IconBase({ props: iconbase_props }); - - return { - c() { - create_component(iconbase.$$.fragment); - }, - m(target, anchor) { - mount_component(iconbase, target, anchor); - current = true; - }, - p(ctx, [dirty]) { - const iconbase_changes = (dirty & /*$$props*/ 1) - ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) - : {}; - - if (dirty & /*$$scope*/ 2) { - iconbase_changes.$$scope = { dirty, ctx }; - } - - iconbase.$set(iconbase_changes); - }, - i(local) { - if (current) return; - transition_in(iconbase.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(iconbase.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(iconbase, detaching); - } - }; -} - -function instance$8($$self, $$props, $$invalidate) { - $$self.$$set = $$new_props => { - $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); - }; - - $$props = exclude_internal_props($$props); - return [$$props]; -} - -class FaListUl extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$8, create_fragment$8, safe_not_equal, {}); - } -} - -/* node_modules\svelte-icons\fa\FaPlus.svelte generated by Svelte v3.35.0 */ - -function create_default_slot$1(ctx) { - let path; - - return { - c() { - path = svg_element("path"); - attr(path, "d", "M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z"); - }, - m(target, anchor) { - insert(target, path, anchor); - }, - d(detaching) { - if (detaching) detach(path); - } - }; -} - -function create_fragment$7(ctx) { - let iconbase; - let current; - const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, /*$$props*/ ctx[0]]; - - let iconbase_props = { - $$slots: { default: [create_default_slot$1] }, - $$scope: { ctx } - }; - - for (let i = 0; i < iconbase_spread_levels.length; i += 1) { - iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); - } - - iconbase = new IconBase({ props: iconbase_props }); - - return { - c() { - create_component(iconbase.$$.fragment); - }, - m(target, anchor) { - mount_component(iconbase, target, anchor); - current = true; - }, - p(ctx, [dirty]) { - const iconbase_changes = (dirty & /*$$props*/ 1) - ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) - : {}; - - if (dirty & /*$$scope*/ 2) { - iconbase_changes.$$scope = { dirty, ctx }; - } - - iconbase.$set(iconbase_changes); - }, - i(local) { - if (current) return; - transition_in(iconbase.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(iconbase.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(iconbase, detaching); - } - }; -} - -function instance$7($$self, $$props, $$invalidate) { - $$self.$$set = $$new_props => { - $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); - }; - - $$props = exclude_internal_props($$props); - return [$$props]; -} - -class FaPlus extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$7, create_fragment$7, safe_not_equal, {}); - } -} - -/* node_modules\svelte-icons\fa\FaRegTrashAlt.svelte generated by Svelte v3.35.0 */ - -function create_default_slot(ctx) { - let path; - - return { - c() { - path = svg_element("path"); - attr(path, "d", "M268 416h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12zM432 80h-82.41l-34-56.7A48 48 0 0 0 274.41 0H173.59a48 48 0 0 0-41.16 23.3L98.41 80H16A16 16 0 0 0 0 96v16a16 16 0 0 0 16 16h16v336a48 48 0 0 0 48 48h288a48 48 0 0 0 48-48V128h16a16 16 0 0 0 16-16V96a16 16 0 0 0-16-16zM171.84 50.91A6 6 0 0 1 177 48h94a6 6 0 0 1 5.15 2.91L293.61 80H154.39zM368 464H80V128h288zm-212-48h24a12 12 0 0 0 12-12V188a12 12 0 0 0-12-12h-24a12 12 0 0 0-12 12v216a12 12 0 0 0 12 12z"); - }, - m(target, anchor) { - insert(target, path, anchor); - }, - d(detaching) { - if (detaching) detach(path); - } - }; -} - -function create_fragment$6(ctx) { - let iconbase; - let current; - const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, /*$$props*/ ctx[0]]; - - let iconbase_props = { - $$slots: { default: [create_default_slot] }, - $$scope: { ctx } - }; - - for (let i = 0; i < iconbase_spread_levels.length; i += 1) { - iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); - } - - iconbase = new IconBase({ props: iconbase_props }); - - return { - c() { - create_component(iconbase.$$.fragment); - }, - m(target, anchor) { - mount_component(iconbase, target, anchor); - current = true; - }, - p(ctx, [dirty]) { - const iconbase_changes = (dirty & /*$$props*/ 1) - ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) - : {}; - - if (dirty & /*$$scope*/ 2) { - iconbase_changes.$$scope = { dirty, ctx }; - } - - iconbase.$set(iconbase_changes); - }, - i(local) { - if (current) return; - transition_in(iconbase.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(iconbase.$$.fragment, local); - current = false; - }, - d(detaching) { - destroy_component(iconbase, detaching); - } - }; -} - -function instance$6($$self, $$props, $$invalidate) { - $$self.$$set = $$new_props => { - $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); - }; - - $$props = exclude_internal_props($$props); - return [$$props]; -} - -class FaRegTrashAlt extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$6, create_fragment$6, safe_not_equal, {}); - } -} - -/* src\Components\UserHierarchies.svelte generated by Svelte v3.35.0 */ - -function add_css$4() { - var style = element("style"); - style.id = "svelte-5y4abu-style"; - style.textContent = "label.BC-Arrow-Label.svelte-5y4abu.svelte-5y4abu{display:inline-block;width:20px !important}div.GA-Buttons.svelte-5y4abu.svelte-5y4abu{padding-bottom:5px}details.BC-Hier-Details.svelte-5y4abu.svelte-5y4abu{border:1px solid var(--background-modifier-border);border-radius:10px;padding:10px 5px 10px 10px;margin-bottom:15px}.BC-Hier-Details.svelte-5y4abu summary.svelte-5y4abu::marker{font-size:10px}.BC-Hier-Details.svelte-5y4abu summary button.svelte-5y4abu{float:right}.icon.svelte-5y4abu.svelte-5y4abu{color:var(--text-normal);display:inline-block;padding-top:3px;width:17px;height:17px}"; - append(document.head, style); -} - -function get_each_context$4(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[12] = list[i]; - child_ctx[14] = i; - return child_ctx; -} - -function get_each_context_1$4(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[15] = list[i]; - return child_ctx; -} - -// (93:6) {#each DIRECTIONS as dir} -function create_each_block_1$4(ctx) { - let div; - let label; - let t0_value = ARROW_DIRECTIONS[/*dir*/ ctx[15]] + ""; - let t0; - let label_for_value; - let t1; - let input; - let input_name_value; - let input_value_value; - let mounted; - let dispose; - - function change_handler(...args) { - return /*change_handler*/ ctx[10](/*i*/ ctx[14], /*dir*/ ctx[15], ...args); - } - - return { - c() { - div = element("div"); - label = element("label"); - t0 = text(t0_value); - t1 = space(); - input = element("input"); - attr(label, "class", "BC-Arrow-Label svelte-5y4abu"); - attr(label, "for", label_for_value = /*dir*/ ctx[15]); - attr(input, "type", "text"); - attr(input, "size", "20"); - attr(input, "name", input_name_value = /*dir*/ ctx[15]); - input.value = input_value_value = /*hier*/ ctx[12][/*dir*/ ctx[15]]?.join(", ") ?? ""; - }, - m(target, anchor) { - insert(target, div, anchor); - append(div, label); - append(label, t0); - append(div, t1); - append(div, input); - - if (!mounted) { - dispose = listen(input, "change", change_handler); - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - - if (dirty & /*currHiers*/ 1 && input_value_value !== (input_value_value = /*hier*/ ctx[12][/*dir*/ ctx[15]]?.join(", ") ?? "") && input.value !== input_value_value) { - input.value = input_value_value; - } - }, - d(detaching) { - if (detaching) detach(div); - mounted = false; - dispose(); - } - }; -} - -// (61:2) {#each currHiers as hier, i} -function create_each_block$4(ctx) { - let details; - let summary; - let t0_value = DIRECTIONS$1.map(func).map(func_1).join(" ") + ""; - let t0; - let t1; - let span; - let button0; - let t3; - let button1; - let t5; - let button2; - let t7; - let t8; - let mounted; - let dispose; - - function func(...args) { - return /*func*/ ctx[6](/*hier*/ ctx[12], ...args); - } - - function click_handler_3() { - return /*click_handler_3*/ ctx[7](/*i*/ ctx[14]); - } - - function click_handler_4() { - return /*click_handler_4*/ ctx[8](/*i*/ ctx[14]); - } - - function click_handler_5() { - return /*click_handler_5*/ ctx[9](/*i*/ ctx[14]); - } - - let each_value_1 = DIRECTIONS$1; - let each_blocks = []; - - for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks[i] = create_each_block_1$4(get_each_context_1$4(ctx, each_value_1, i)); - } - - return { - c() { - details = element("details"); - summary = element("summary"); - t0 = text(t0_value); - t1 = space(); - span = element("span"); - button0 = element("button"); - button0.textContent = "↑"; - t3 = space(); - button1 = element("button"); - button1.textContent = "↓"; - t5 = space(); - button2 = element("button"); - button2.textContent = "X"; - t7 = space(); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - t8 = space(); - attr(button0, "aria-label", "Swap with Hierarchy Above"); - attr(button0, "class", "svelte-5y4abu"); - attr(button1, "aria-label", "Swap with Hierarchy Below"); - attr(button1, "class", "svelte-5y4abu"); - attr(button2, "aria-label", "Remove Hierarchy"); - attr(button2, "class", "svelte-5y4abu"); - attr(span, "class", "GA-Buttons"); - attr(summary, "class", "svelte-5y4abu"); - attr(details, "class", "BC-Hier-Details svelte-5y4abu"); - }, - m(target, anchor) { - insert(target, details, anchor); - append(details, summary); - append(summary, t0); - append(summary, t1); - append(summary, span); - append(span, button0); - append(span, t3); - append(span, button1); - append(span, t5); - append(span, button2); - append(details, t7); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(details, null); - } - - append(details, t8); - - if (!mounted) { - dispose = [ - listen(button0, "click", click_handler_3), - listen(button1, "click", click_handler_4), - listen(button2, "click", click_handler_5) - ]; - - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - if (dirty & /*currHiers*/ 1 && t0_value !== (t0_value = DIRECTIONS$1.map(func).map(func_1).join(" ") + "")) set_data(t0, t0_value); - - if (dirty & /*DIRECTIONS, currHiers, splitAndTrim, update, ARROW_DIRECTIONS*/ 3) { - each_value_1 = DIRECTIONS$1; - let i; - - for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1$4(ctx, each_value_1, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_1$4(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(details, t8); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value_1.length; - } - }, - d(detaching) { - if (detaching) detach(details); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; -} - -function create_fragment$5(ctx) { - let div4; - let div3; - let button0; - let div0; - let faplus; - let t0; - let button1; - let div1; - let faregtrashalt; - let t1; - let button2; - let div2; - let falistul; - let t2; - let current; - let mounted; - let dispose; - faplus = new FaPlus({}); - faregtrashalt = new FaRegTrashAlt({}); - falistul = new FaListUl({}); - let each_value = /*currHiers*/ ctx[0]; - let each_blocks = []; - - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$4(get_each_context$4(ctx, each_value, i)); - } - - return { - c() { - div4 = element("div"); - div3 = element("div"); - button0 = element("button"); - div0 = element("div"); - create_component(faplus.$$.fragment); - t0 = space(); - button1 = element("button"); - div1 = element("div"); - create_component(faregtrashalt.$$.fragment); - t1 = space(); - button2 = element("button"); - div2 = element("div"); - create_component(falistul.$$.fragment); - t2 = space(); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - - attr(div0, "class", "icon svelte-5y4abu"); - attr(button0, "aria-label", "Add New Hierarchy"); - attr(div1, "class", "icon svelte-5y4abu"); - attr(button1, "aria-label", "Reset All Hierarchies"); - attr(div2, "class", "icon svelte-5y4abu"); - attr(button2, "aria-label", "Show Hierarchies"); - attr(div3, "class", "GA-Buttons svelte-5y4abu"); - }, - m(target, anchor) { - insert(target, div4, anchor); - append(div4, div3); - append(div3, button0); - append(button0, div0); - mount_component(faplus, div0, null); - append(div3, t0); - append(div3, button1); - append(button1, div1); - mount_component(faregtrashalt, div1, null); - append(div3, t1); - append(div3, button2); - append(button2, div2); - mount_component(falistul, div2, null); - append(div4, t2); - - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div4, null); - } - - current = true; - - if (!mounted) { - dispose = [ - listen(button0, "click", /*click_handler*/ ctx[3]), - listen(button1, "click", /*click_handler_1*/ ctx[4]), - listen(button2, "click", /*click_handler_2*/ ctx[5]) - ]; - - mounted = true; - } - }, - p(ctx, [dirty]) { - if (dirty & /*DIRECTIONS, currHiers, splitAndTrim, update, ARROW_DIRECTIONS, swapItems*/ 3) { - each_value = /*currHiers*/ ctx[0]; - let i; - - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$4(ctx, each_value, i); - - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$4(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(div4, null); - } - } - - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - - each_blocks.length = each_value.length; - } - }, - i(local) { - if (current) return; - transition_in(faplus.$$.fragment, local); - transition_in(faregtrashalt.$$.fragment, local); - transition_in(falistul.$$.fragment, local); - current = true; - }, - o(local) { - transition_out(faplus.$$.fragment, local); - transition_out(faregtrashalt.$$.fragment, local); - transition_out(falistul.$$.fragment, local); - current = false; - }, - d(detaching) { - if (detaching) detach(div4); - destroy_component(faplus); - destroy_component(faregtrashalt); - destroy_component(falistul); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; -} - -const func_1 = dirFields => `(${dirFields})`; - -function instance$5($$self, $$props, $$invalidate) { - var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) { - function adopt(value) { - return value instanceof P - ? value - : new P(function (resolve) { - resolve(value); - }); - } - - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { - try { - step(generator.next(value)); - } catch(e) { - reject(e); - } - } - - function rejected(value) { - try { - step(generator["throw"](value)); - } catch(e) { - reject(e); - } - } - - function step(result) { - result.done - ? resolve(result.value) - : adopt(result.value).then(fulfilled, rejected); - } - - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - }; - - - - let { plugin } = $$props; - let currHiers = [...plugin.settings.userHiers]; - - function update(currHiers) { - return __awaiter(this, void 0, void 0, function* () { - $$invalidate(2, plugin.settings.userHiers = currHiers, plugin); - yield plugin.saveSettings(); - }); - } - - const click_handler = async () => $$invalidate(0, currHiers = [...currHiers, blankUserHier()]); - - const click_handler_1 = async () => { - if (window.confirm("Are you sure you want to reset all hierarchies?")) { - $$invalidate(0, currHiers = []); - await update(currHiers); - } - }; - - const click_handler_2 = () => new require$$0.Notice(currHiers.map(hierToStr).join("\n\n")); - const func = (hier, dir) => hier[dir]?.join(", ") ?? ""; - - const click_handler_3 = async i => { - $$invalidate(0, currHiers = swapItems(i, i - 1, currHiers)); - await update(currHiers); - }; - - const click_handler_4 = async i => { - $$invalidate(0, currHiers = swapItems(i, i + 1, currHiers)); - await update(currHiers); - }; - - const click_handler_5 = async i => { - currHiers.splice(i, 1); - $$invalidate(0, currHiers); - await update(currHiers); - }; - - const change_handler = async (i, dir, e) => { - const { value } = e.target; - $$invalidate(0, currHiers[i][dir] = splitAndTrim(value), currHiers); - await update(currHiers); - }; - - $$self.$$set = $$props => { - if ("plugin" in $$props) $$invalidate(2, plugin = $$props.plugin); - }; - - return [ - currHiers, - update, - plugin, - click_handler, - click_handler_1, - click_handler_2, - func, - click_handler_3, - click_handler_4, - click_handler_5, - change_handler - ]; -} - -class UserHierarchies extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-5y4abu-style")) add_css$4(); - init(this, options, instance$5, create_fragment$5, safe_not_equal, { plugin: 2 }); - } +class MatrixView extends require$$0.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.icon = TRAIL_ICON; + this.toInternalLinkObj = (to, realQ = true, parent) => { + return { + to, + cls: linkClass(this.app, to, realQ), + alt: this.getAlt(to, this.plugin.settings), + order: this.getOrder(to), + parent, + }; + }; + this.getOrder = (node) => Number.parseInt(this.plugin.mainG.getNodeAttribute(node, "order")); + this.plugin = plugin; + this.db = new Debugger(plugin); + } + async onload() { + super.onload(); + this.matrixQ = this.plugin.settings.defaultView; + this.app.workspace.onLayoutReady(() => { + setTimeout(async () => await this.draw(), this.app.plugins.plugins.dataview + ? this.app.plugins.plugins.dataview.api + ? 1 + : this.plugin.settings.dvWaitTime + : 3000); + }); + } + getViewType() { + return MATRIX_VIEW; + } + getDisplayText() { + return "Breadcrumbs Matrix"; + } + async onOpen() { } + onClose() { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); + return Promise.resolve(); + } + getAlt(node, settings) { + let alt = null; + if (settings.altLinkFields.length) { + const file = this.app.metadataCache.getFirstLinkpathDest(node, ""); + if (file) { + const metadata = this.app.metadataCache.getFileCache(file); + settings.altLinkFields.forEach((altLinkField) => { + var _a; + alt = (_a = metadata === null || metadata === void 0 ? void 0 : metadata.frontmatter) === null || _a === void 0 ? void 0 : _a[altLinkField]; + }); + } + } + return alt; + } + // ANCHOR Remove duplicate implied links + removeDuplicateImplied(reals, implieds) { + const realTos = reals.map((real) => real.to); + return implieds.filter((implied) => !realTos.includes(implied.to)); + } + getHierSquares(userHiers, currFile, settings) { + const { plugin } = this; + const { mainG } = plugin; + if (!mainG) + return []; + const { basename } = currFile; + const realsnImplieds = getRealnImplied(plugin, basename); + return userHiers.map((hier) => { + const filteredRealNImplied = blankRealNImplied(); + for (const dir in realsnImplieds) { + const { reals, implieds } = realsnImplieds[dir]; + filteredRealNImplied[dir].reals = reals + .filter((real) => hier[dir].includes(real.field)) + .map((item) => this.toInternalLinkObj(item.to, true)); + filteredRealNImplied[dir].implieds = implieds + .filter((implied) => hier[dir].includes(implied.field)) + .map((item) => this.toInternalLinkObj(item.to, false)); + } + let { up: { reals: ru, implieds: iu }, same: { reals: rs, implieds: is }, down: { reals: rd, implieds: id }, next: { reals: rn, implieds: iN }, prev: { reals: rp, implieds: ip }, } = filteredRealNImplied; + // SECTION Implied Siblings + /// Notes with the same parents + const g = getSubInDirs(mainG, "up", "down"); + const closed = getReflexiveClosure(g, userHiers); + const closedUp = getSubInDirs(closed, "up"); + const iSamesII = []; + if (closedUp.hasNode(basename)) { + closedUp.forEachOutEdge(basename, (k, a, s, par) => { + if (hier.up.includes(a.field)) { + closedUp.forEachInEdge(par, (k, a, s, t) => { + if (s === basename && !settings.treatCurrNodeAsImpliedSibling) + return; + iSamesII.push(this.toInternalLinkObj(s, false, t)); + }); + } + }); + } + is.push(...iSamesII); + // !SECTION + iu = this.removeDuplicateImplied(ru, iu); + is = this.removeDuplicateImplied(rs, is); + id = this.removeDuplicateImplied(rd, id); + iN = this.removeDuplicateImplied(rn, iN); + ip = this.removeDuplicateImplied(rp, ip); + const iSameNoDup = []; + is.forEach((impSib) => { + if (iSameNoDup.every((noDup) => noDup.to !== impSib.to)) { + iSameNoDup.push(impSib); + } + }); + is = iSameNoDup; + const getFieldInHier = (dir) => hier[dir][0] + ? hier[dir].join(", ") + : `${hier[getOppDir(dir)].join(",")}${ARROW_DIRECTIONS[dir]}`; + const { alphaSortAsc } = settings; + const squares = [ru, rs, rd, rn, rp, iu, is, id, iN, ip]; + if (settings.enableAlphaSort) { + squares.forEach((sq) => sq.sort((a, b) => a.to < b.to ? (alphaSortAsc ? -1 : 1) : alphaSortAsc ? 1 : -1)); + } + squares.forEach((sq) => sq.sort((a, b) => a.order - b.order)); + loglevel.debug({ ru }, { rs }, { rd }, { rn }, { rp }, { iu }, { is }, { id }, { iN }, { ip }); + return [ + { + realItems: ru, + impliedItems: iu, + field: getFieldInHier("up"), + }, + { + realItems: rs, + impliedItems: is, + field: getFieldInHier("same"), + }, + { + realItems: rd, + impliedItems: id, + field: getFieldInHier("down"), + }, + { + realItems: rn, + impliedItems: iN, + field: getFieldInHier("next"), + }, + { + realItems: rp, + impliedItems: ip, + field: getFieldInHier("prev"), + }, + ]; + }); + } + async draw() { + try { + const { contentEl, db } = this; + db.start2G("Draw Matrix/List View"); + contentEl.empty(); + const { settings } = this.plugin; + const { userHiers } = settings; + const currFile = this.app.workspace.getActiveFile(); + contentEl.createEl("button", { + text: this.matrixQ ? "List" : "Matrix", + }, (el) => { + el.onclick = async () => { + this.matrixQ = !this.matrixQ; + el.innerText = this.matrixQ ? "List" : "Matrix"; + await this.draw(); + }; + }); + contentEl.createEl("button", { text: "↻" }, (el) => { + el.onclick = async () => await this.plugin.refreshIndex(); + }); + const hierSquares = this.getHierSquares(userHiers, currFile, settings).filter((squareArr) => squareArr.some((square) => square.realItems.length + square.impliedItems.length > 0)); + const compInput = { + target: contentEl, + props: { + filteredSquaresArr: hierSquares, + currFile, + settings, + matrixView: this, + app: this.app, + }, + }; + this.matrixQ + ? (this.view = new Matrix(compInput)) + : (this.view = new Lists(compInput)); + db.end2G(); + } + catch (err) { + loglevel.error(err); + this.db.end2G(); + } + } } class BCSettingTab extends require$$0.PluginSettingTab { @@ -26440,27 +24266,27 @@ class BCSettingTab extends require$$0.PluginSettingTab { /* src\Components\NextPrev.svelte generated by Svelte v3.35.0 */ -function add_css$3() { +function add_css$6() { var style = element("style"); style.id = "svelte-1cqb0v5-style"; style.textContent = ".BC-nexts.svelte-1cqb0v5 div.svelte-1cqb0v5{text-align:right}.BC-right-arrow.svelte-1cqb0v5.svelte-1cqb0v5{padding-left:5px;float:right}.BC-left-arrow.svelte-1cqb0v5.svelte-1cqb0v5{padding-right:5px;float:left}.BC-nexts.svelte-1cqb0v5.svelte-1cqb0v5{border-left:1px solid var(--background-modifier-border)}.BC-prevs.svelte-1cqb0v5.svelte-1cqb0v5{border-right:1px solid var(--background-modifier-border)}.BC-NextPrev-Container.svelte-1cqb0v5.svelte-1cqb0v5{display:grid;grid-template-columns:1fr 1fr}"; append(document.head, style); } -function get_each_context$3(ctx, list, i) { +function get_each_context$6(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[6] = list[i]; return child_ctx; } -function get_each_context_1$3(ctx, list, i) { +function get_each_context_1$4(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[9] = list[i]; return child_ctx; } // (15:6) {#each prev as p} -function create_each_block_1$3(ctx) { +function create_each_block_1$4(ctx) { let div; let strong; let t0_value = /*p*/ ctx[9].field + ""; @@ -26518,7 +24344,7 @@ function create_each_block_1$3(ctx) { } // (28:6) {#each next as n} -function create_each_block$3(ctx) { +function create_each_block$6(ctx) { let div; let t0_value = /*n*/ ctx[6].to + ""; let t0; @@ -26575,7 +24401,7 @@ function create_each_block$3(ctx) { }; } -function create_fragment$4(ctx) { +function create_fragment$a(ctx) { let div2; let div0; let span0; @@ -26586,14 +24412,14 @@ function create_fragment$4(ctx) { let each_blocks_1 = []; for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks_1[i] = create_each_block_1$3(get_each_context_1$3(ctx, each_value_1, i)); + each_blocks_1[i] = create_each_block_1$4(get_each_context_1$4(ctx, each_value_1, i)); } let each_value = /*next*/ ctx[1]; let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i)); + each_blocks[i] = create_each_block$6(get_each_context$6(ctx, each_value, i)); } return { @@ -26641,12 +24467,12 @@ function create_fragment$4(ctx) { let i; for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1$3(ctx, each_value_1, i); + const child_ctx = get_each_context_1$4(ctx, each_value_1, i); if (each_blocks_1[i]) { each_blocks_1[i].p(child_ctx, dirty); } else { - each_blocks_1[i] = create_each_block_1$3(child_ctx); + each_blocks_1[i] = create_each_block_1$4(child_ctx); each_blocks_1[i].c(); each_blocks_1[i].m(span0, null); } @@ -26664,12 +24490,12 @@ function create_fragment$4(ctx) { let i; for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$3(ctx, each_value, i); + const child_ctx = get_each_context$6(ctx, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block$3(child_ctx); + each_blocks[i] = create_each_block$6(child_ctx); each_blocks[i].c(); each_blocks[i].m(span1, null); } @@ -26692,7 +24518,7 @@ function create_fragment$4(ctx) { }; } -function instance$4($$self, $$props, $$invalidate) { +function instance$a($$self, $$props, $$invalidate) { @@ -26716,47 +24542,47 @@ function instance$4($$self, $$props, $$invalidate) { class NextPrev extends SvelteComponent { constructor(options) { super(); - if (!document.getElementById("svelte-1cqb0v5-style")) add_css$3(); - init(this, options, instance$4, create_fragment$4, safe_not_equal, { app: 0, plugin: 3, next: 1, prev: 2 }); + if (!document.getElementById("svelte-1cqb0v5-style")) add_css$6(); + init(this, options, instance$a, create_fragment$a, safe_not_equal, { app: 0, plugin: 3, next: 1, prev: 2 }); } } /* src\Components\TrailGrid.svelte generated by Svelte v3.35.0 */ -function add_css$2() { +function add_css$5() { var style = element("style"); style.id = "svelte-ybyqyo-style"; style.textContent = "div.BC-trail-grid.svelte-ybyqyo{border:2px solid var(--background-modifier-border);display:grid;align-items:stretch;width:auto;height:auto}div.BC-trail-grid-item.svelte-ybyqyo{display:flex;flex-direction:column;border:1px solid var(--background-modifier-border);align-items:center;justify-content:center;padding:2px;font-size:smaller}div.BC-trail-grid-item.BC-filler.svelte-ybyqyo{opacity:0.7}.dot.svelte-ybyqyo{height:5px;width:5px;border-radius:50%;display:inline-block}"; append(document.head, style); } -function get_each_context$2(ctx, list, i) { +function get_each_context$5(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[21] = list[i]; child_ctx[23] = i; return child_ctx; } -function get_each_context_1$2(ctx, list, i) { +function get_each_context_1$3(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[24] = list[i]; return child_ctx; } -function get_each_context_2(ctx, list, i) { +function get_each_context_2$1(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[23] = list[i]; return child_ctx; } // (82:8) {#if step.value && settings.gridDots} -function create_if_block$2(ctx) { +function create_if_block$3(ctx) { let div; let each_value_2 = lodash.range(Math.floor(/*wordCounts*/ ctx[2][/*step*/ ctx[24].value] / 1000)); let each_blocks = []; for (let i = 0; i < each_value_2.length; i += 1) { - each_blocks[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i)); + each_blocks[i] = create_each_block_2$1(get_each_context_2$1(ctx, each_value_2, i)); } return { @@ -26782,12 +24608,12 @@ function create_if_block$2(ctx) { let i; for (i = 0; i < each_value_2.length; i += 1) { - const child_ctx = get_each_context_2(ctx, each_value_2, i); + const child_ctx = get_each_context_2$1(ctx, each_value_2, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block_2(child_ctx); + each_blocks[i] = create_each_block_2$1(child_ctx); each_blocks[i].c(); each_blocks[i].m(div, null); } @@ -26808,7 +24634,7 @@ function create_if_block$2(ctx) { } // (84:12) {#each range(Math.floor(wordCounts[step.value] / 1000)) as i} -function create_each_block_2(ctx) { +function create_each_block_2$1(ctx) { let span; return { @@ -26828,7 +24654,7 @@ function create_each_block_2(ctx) { } // (65:4) {#each allRuns[i] as step} -function create_each_block_1$2(ctx) { +function create_each_block_1$3(ctx) { let div1; let div0; let t0_value = /*step*/ ctx[24].value + ""; @@ -26840,7 +24666,7 @@ function create_each_block_1$2(ctx) { let div1_style_value; let mounted; let dispose; - let if_block = /*step*/ ctx[24].value && /*settings*/ ctx[4].gridDots && create_if_block$2(ctx); + let if_block = /*step*/ ctx[24].value && /*settings*/ ctx[4].gridDots && create_if_block$3(ctx); function click_handler(...args) { return /*click_handler*/ ctx[9](/*step*/ ctx[24], ...args); @@ -26907,13 +24733,13 @@ function create_each_block_1$2(ctx) { } // (64:2) {#each transposedTrails as col, i} -function create_each_block$2(ctx) { +function create_each_block$5(ctx) { let each_1_anchor; let each_value_1 = /*allRuns*/ ctx[7][/*i*/ ctx[23]]; let each_blocks = []; for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks[i] = create_each_block_1$2(get_each_context_1$2(ctx, each_value_1, i)); + each_blocks[i] = create_each_block_1$3(get_each_context_1$3(ctx, each_value_1, i)); } return { @@ -26937,12 +24763,12 @@ function create_each_block$2(ctx) { let i; for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1$2(ctx, each_value_1, i); + const child_ctx = get_each_context_1$3(ctx, each_value_1, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block_1$2(child_ctx); + each_blocks[i] = create_each_block_1$3(child_ctx); each_blocks[i].c(); each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); } @@ -26962,13 +24788,13 @@ function create_each_block$2(ctx) { }; } -function create_fragment$3(ctx) { +function create_fragment$9(ctx) { let div; let each_value = /*transposedTrails*/ ctx[6]; let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); + each_blocks[i] = create_each_block$5(get_each_context$5(ctx, each_value, i)); } return { @@ -26996,12 +24822,12 @@ function create_fragment$3(ctx) { let i; for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$2(ctx, each_value, i); + const child_ctx = get_each_context$5(ctx, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block$2(child_ctx); + each_blocks[i] = create_each_block$5(child_ctx); each_blocks[i].c(); each_blocks[i].m(div, null); } @@ -27027,7 +24853,7 @@ function create_fragment$3(ctx) { }; } -function instance$3($$self, $$props, $$invalidate) { +function instance$9($$self, $$props, $$invalidate) { let { sortedTrails } = $$props; @@ -27117,27 +24943,27 @@ function instance$3($$self, $$props, $$invalidate) { class TrailGrid extends SvelteComponent { constructor(options) { super(); - if (!document.getElementById("svelte-ybyqyo-style")) add_css$2(); - init(this, options, instance$3, create_fragment$3, safe_not_equal, { sortedTrails: 0, app: 1, plugin: 8 }); + if (!document.getElementById("svelte-ybyqyo-style")) add_css$5(); + init(this, options, instance$9, create_fragment$9, safe_not_equal, { sortedTrails: 0, app: 1, plugin: 8 }); } } /* src\Components\TrailPath.svelte generated by Svelte v3.35.0 */ -function add_css$1() { +function add_css$4() { var style = element("style"); style.id = "svelte-3c1frp-style"; style.textContent = "span.BC-trail-path-container.svelte-3c1frp{display:flex;justify-content:space-between}"; append(document.head, style); } -function get_each_context$1(ctx, list, i) { +function get_each_context$4(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[10] = list[i]; return child_ctx; } -function get_each_context_1$1(ctx, list, i) { +function get_each_context_1$2(ctx, list, i) { const child_ctx = ctx.slice(); child_ctx[13] = list[i]; child_ctx[15] = i; @@ -27145,13 +24971,13 @@ function get_each_context_1$1(ctx, list, i) { } // (19:8) {:else} -function create_else_block$1(ctx) { +function create_else_block$2(ctx) { let each_1_anchor; let each_value_1 = /*trail*/ ctx[10]; let each_blocks = []; for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks[i] = create_each_block_1$1(get_each_context_1$1(ctx, each_value_1, i)); + each_blocks[i] = create_each_block_1$2(get_each_context_1$2(ctx, each_value_1, i)); } return { @@ -27175,12 +25001,12 @@ function create_else_block$1(ctx) { let i; for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1$1(ctx, each_value_1, i); + const child_ctx = get_each_context_1$2(ctx, each_value_1, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block_1$1(child_ctx); + each_blocks[i] = create_each_block_1$2(child_ctx); each_blocks[i].c(); each_blocks[i].m(each_1_anchor.parentNode, each_1_anchor); } @@ -27201,7 +25027,7 @@ function create_else_block$1(ctx) { } // (17:8) {#if trail.length === 0} -function create_if_block_1$1(ctx) { +function create_if_block_1$2(ctx) { let span; return { @@ -27239,7 +25065,7 @@ function create_if_block_2$1(ctx) { } // (20:10) {#each trail as crumb, i} -function create_each_block_1$1(ctx) { +function create_each_block_1$2(ctx) { let span; let t0_value = /*crumb*/ ctx[13] + ""; let t0; @@ -27312,13 +25138,13 @@ function create_each_block_1$1(ctx) { } // (15:4) {#each trailsToShow as trail} -function create_each_block$1(ctx) { +function create_each_block$4(ctx) { let div; let t; function select_block_type(ctx, dirty) { - if (/*trail*/ ctx[10].length === 0) return create_if_block_1$1; - return create_else_block$1; + if (/*trail*/ ctx[10].length === 0) return create_if_block_1$2; + return create_else_block$2; } let current_block_type = select_block_type(ctx); @@ -27356,7 +25182,7 @@ function create_each_block$1(ctx) { } // (37:2) {#if sortedTrails.length > 1} -function create_if_block$1(ctx) { +function create_if_block$2(ctx) { let div; let button; let t_value = (/*showAll*/ ctx[2] ? "Shortest" : "All") + ""; @@ -27392,7 +25218,7 @@ function create_if_block$1(ctx) { }; } -function create_fragment$2(ctx) { +function create_fragment$8(ctx) { let span; let div; let t; @@ -27400,10 +25226,10 @@ function create_fragment$2(ctx) { let each_blocks = []; for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); + each_blocks[i] = create_each_block$4(get_each_context$4(ctx, each_value, i)); } - let if_block = /*sortedTrails*/ ctx[0].length > 1 && create_if_block$1(ctx); + let if_block = /*sortedTrails*/ ctx[0].length > 1 && create_if_block$2(ctx); return { c() { @@ -27436,12 +25262,12 @@ function create_fragment$2(ctx) { let i; for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$1(ctx, each_value, i); + const child_ctx = get_each_context$4(ctx, each_value, i); if (each_blocks[i]) { each_blocks[i].p(child_ctx, dirty); } else { - each_blocks[i] = create_each_block$1(child_ctx); + each_blocks[i] = create_each_block$4(child_ctx); each_blocks[i].c(); each_blocks[i].m(div, null); } @@ -27458,7 +25284,7 @@ function create_fragment$2(ctx) { if (if_block) { if_block.p(ctx, dirty); } else { - if_block = create_if_block$1(ctx); + if_block = create_if_block$2(ctx); if_block.c(); if_block.m(span, null); } @@ -27477,7 +25303,7 @@ function create_fragment$2(ctx) { }; } -function instance$2($$self, $$props, $$invalidate) { +function instance$8($$self, $$props, $$invalidate) { let trailsToShow; @@ -27520,19260 +25346,20600 @@ function instance$2($$self, $$props, $$invalidate) { class TrailPath extends SvelteComponent { constructor(options) { super(); - if (!document.getElementById("svelte-3c1frp-style")) add_css$1(); - init(this, options, instance$2, create_fragment$2, safe_not_equal, { sortedTrails: 0, app: 1, plugin: 6 }); + if (!document.getElementById("svelte-3c1frp-style")) add_css$4(); + init(this, options, instance$8, create_fragment$8, safe_not_equal, { sortedTrails: 0, app: 1, plugin: 6 }); } } -class FieldSuggestor extends require$$0.EditorSuggest { - constructor(plugin) { - super(plugin.app); - this.getSuggestions = (context) => { - const { query } = context; - return BC_FIELDS_INFO.map((sug) => sug.field).filter((sug) => sug.includes(query)); - }; - this.plugin = plugin; - } - onTrigger(cursor, editor, _) { - var _a; - if (this.plugin.settings.fieldSuggestor) { - const sub = editor.getLine(cursor.line).substring(0, cursor.ch); - const match = (_a = sub.match(/^BC-(.*)$/)) === null || _a === void 0 ? void 0 : _a[1]; - if (match !== undefined) { - return { - end: cursor, - start: { - ch: sub.lastIndexOf(match), - line: cursor.line, - }, - query: match, - }; - } - } - return null; - } - renderSuggestion(suggestion, el) { - var _a; - el.createDiv({ - text: suggestion.replace("BC-", ""), - cls: "BC-suggester-container", - attr: { - "aria-label": (_a = BC_FIELDS_INFO.find((f) => f.field === suggestion)) === null || _a === void 0 ? void 0 : _a.desc, - "aria-label-position": "right", - }, - }); - } - selectSuggestion(suggestion) { - var _a; - const { context } = this; - if (context) { - const replacement = `${suggestion}${(_a = BC_FIELDS_INFO.find((f) => f.field === suggestion)) === null || _a === void 0 ? void 0 : _a.after}`; - context.editor.replaceRange(replacement, { ch: 0, line: context.start.line }, context.end); - } - } -} - -var d3Array = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-array/ v2.12.1 Copyright 2021 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, (function (exports) { -function ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -} - -function bisector(f) { - let delta = f; - let compare = f; - - if (f.length === 1) { - delta = (d, x) => f(d) - x; - compare = ascendingComparator(f); - } - - function left(a, x, lo, hi) { - if (lo == null) lo = 0; - if (hi == null) hi = a.length; - while (lo < hi) { - const mid = (lo + hi) >>> 1; - if (compare(a[mid], x) < 0) lo = mid + 1; - else hi = mid; - } - return lo; - } - - function right(a, x, lo, hi) { - if (lo == null) lo = 0; - if (hi == null) hi = a.length; - while (lo < hi) { - const mid = (lo + hi) >>> 1; - if (compare(a[mid], x) > 0) hi = mid; - else lo = mid + 1; - } - return lo; - } - - function center(a, x, lo, hi) { - if (lo == null) lo = 0; - if (hi == null) hi = a.length; - const i = left(a, x, lo, hi - 1); - return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; - } - - return {left, center, right}; -} - -function ascendingComparator(f) { - return (d, x) => ascending(f(d), x); -} - -function number(x) { - return x === null ? NaN : +x; -} - -function* numbers(values, valueof) { - if (valueof === undefined) { - for (let value of values) { - if (value != null && (value = +value) >= value) { - yield value; - } - } - } else { - let index = -1; - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { - yield value; - } - } - } -} - -const ascendingBisect = bisector(ascending); -const bisectRight = ascendingBisect.right; -const bisectLeft = ascendingBisect.left; -const bisectCenter = bisector(number).center; +/* node_modules\svelte-icons\fa\FaFire.svelte generated by Svelte v3.35.0 */ -function count(values, valueof) { - let count = 0; - if (valueof === undefined) { - for (let value of values) { - if (value != null && (value = +value) >= value) { - ++count; - } - } - } else { - let index = -1; - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { - ++count; - } - } - } - return count; -} +function create_default_slot$2(ctx) { + let path; -function length$1(array) { - return array.length | 0; + return { + c() { + path = svg_element("path"); + attr(path, "d", "M216 23.86c0-23.8-30.65-32.77-44.15-13.04C48 191.85 224 200 224 288c0 35.63-29.11 64.46-64.85 63.99-35.17-.45-63.15-29.77-63.15-64.94v-85.51c0-21.7-26.47-32.23-41.43-16.5C27.8 213.16 0 261.33 0 320c0 105.87 86.13 192 192 192s192-86.13 192-192c0-170.29-168-193-168-296.14z"); + }, + m(target, anchor) { + insert(target, path, anchor); + }, + d(detaching) { + if (detaching) detach(path); + } + }; } -function empty(length) { - return !(length > 0); -} +function create_fragment$7(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 384 512" }, /*$$props*/ ctx[0]]; -function arrayify(values) { - return typeof values !== "object" || "length" in values ? values : Array.from(values); -} + let iconbase_props = { + $$slots: { default: [create_default_slot$2] }, + $$scope: { ctx } + }; -function reducer(reduce) { - return values => reduce(...values); -} + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } -function cross(...values) { - const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop()); - values = values.map(arrayify); - const lengths = values.map(length$1); - const j = values.length - 1; - const index = new Array(j + 1).fill(0); - const product = []; - if (j < 0 || lengths.some(empty)) return product; - while (true) { - product.push(index.map((j, i) => values[i][j])); - let i = j; - while (++index[i] === lengths[i]) { - if (i === 0) return reduce ? product.map(reduce) : product; - index[i--] = 0; - } - } -} + iconbase = new IconBase({ props: iconbase_props }); -function cumsum(values, valueof) { - var sum = 0, index = 0; - return Float64Array.from(values, valueof === undefined - ? v => (sum += +v || 0) - : v => (sum += +valueof(v, index++, values) || 0)); -} + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + const iconbase_changes = (dirty & /*$$props*/ 1) + ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) + : {}; -function descending(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; -} + if (dirty & /*$$scope*/ 2) { + iconbase_changes.$$scope = { dirty, ctx }; + } -function variance(values, valueof) { - let count = 0; - let delta; - let mean = 0; - let sum = 0; - if (valueof === undefined) { - for (let value of values) { - if (value != null && (value = +value) >= value) { - delta = value - mean; - mean += delta / ++count; - sum += delta * (value - mean); - } - } - } else { - let index = -1; - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { - delta = value - mean; - mean += delta / ++count; - sum += delta * (value - mean); - } - } - } - if (count > 1) return sum / (count - 1); + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; } -function deviation(values, valueof) { - const v = variance(values, valueof); - return v ? Math.sqrt(v) : v; -} +function instance$7($$self, $$props, $$invalidate) { + $$self.$$set = $$new_props => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; -function extent(values, valueof) { - let min; - let max; - if (valueof === undefined) { - for (const value of values) { - if (value != null) { - if (min === undefined) { - if (value >= value) min = max = value; - } else { - if (min > value) min = value; - if (max < value) max = value; - } - } - } - } else { - let index = -1; - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null) { - if (min === undefined) { - if (value >= value) min = max = value; - } else { - if (min > value) min = value; - if (max < value) max = value; - } - } - } - } - return [min, max]; + $$props = exclude_internal_props($$props); + return [$$props]; } -// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 -class Adder { - constructor() { - this._partials = new Float64Array(32); - this._n = 0; - } - add(x) { - const p = this._partials; - let i = 0; - for (let j = 0; j < this._n && j < 32; j++) { - const y = p[j], - hi = x + y, - lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); - if (lo) p[i++] = lo; - x = hi; - } - p[i] = x; - this._n = i + 1; - return this; - } - valueOf() { - const p = this._partials; - let n = this._n, x, y, lo, hi = 0; - if (n > 0) { - hi = p[--n]; - while (n > 0) { - x = hi; - y = p[--n]; - hi = x + y; - lo = y - (hi - x); - if (lo) break; - } - if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) { - y = lo * 2; - x = hi + y; - if (y == x - hi) hi = x; - } - } - return hi; - } +class FaFire extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$7, create_fragment$7, safe_not_equal, {}); + } } -function fsum(values, valueof) { - const adder = new Adder(); - if (valueof === undefined) { - for (let value of values) { - if (value = +value) { - adder.add(value); - } - } - } else { - let index = -1; - for (let value of values) { - if (value = +valueof(value, ++index, values)) { - adder.add(value); - } - } - } - return +adder; -} +/* node_modules\svelte-icons\fa\FaRegSnowflake.svelte generated by Svelte v3.35.0 */ -function fcumsum(values, valueof) { - const adder = new Adder(); - let index = -1; - return Float64Array.from(values, valueof === undefined - ? v => adder.add(+v || 0) - : v => adder.add(+valueof(v, ++index, values) || 0) - ); -} +function create_default_slot$1(ctx) { + let path; -class InternMap extends Map { - constructor(entries, key = keyof) { - super(); - Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); - if (entries != null) for (const [key, value] of entries) this.set(key, value); - } - get(key) { - return super.get(intern_get(this, key)); - } - has(key) { - return super.has(intern_get(this, key)); - } - set(key, value) { - return super.set(intern_set(this, key), value); - } - delete(key) { - return super.delete(intern_delete(this, key)); - } + return { + c() { + path = svg_element("path"); + attr(path, "d", "M440.1 355.2l-39.2-23 34.1-9.3c8.4-2.3 13.4-11.1 11.1-19.6l-4.1-15.5c-2.2-8.5-10.9-13.6-19.3-11.3L343 298.2 271.2 256l71.9-42.2 79.7 21.7c8.4 2.3 17-2.8 19.3-11.3l4.1-15.5c2.2-8.5-2.7-17.3-11.1-19.6l-34.1-9.3 39.2-23c7.5-4.4 10.1-14.2 5.8-21.9l-7.9-13.9c-4.3-7.7-14-10.3-21.5-5.9l-39.2 23 9.1-34.7c2.2-8.5-2.7-17.3-11.1-19.6l-15.2-4.1c-8.4-2.3-17 2.8-19.3 11.3l-21.3 81-71.9 42.2v-84.5L306 70.4c6.1-6.2 6.1-16.4 0-22.6l-11.1-11.3c-6.1-6.2-16.1-6.2-22.2 0l-24.9 25.4V16c0-8.8-7-16-15.7-16h-15.7c-8.7 0-15.7 7.2-15.7 16v46.1l-24.9-25.4c-6.1-6.2-16.1-6.2-22.2 0L142.1 48c-6.1 6.2-6.1 16.4 0 22.6l58.3 59.3v84.5l-71.9-42.2-21.3-81c-2.2-8.5-10.9-13.6-19.3-11.3L72.7 84c-8.4 2.3-13.4 11.1-11.1 19.6l9.1 34.7-39.2-23c-7.5-4.4-17.1-1.8-21.5 5.9l-7.9 13.9c-4.3 7.7-1.8 17.4 5.8 21.9l39.2 23-34.1 9.1c-8.4 2.3-13.4 11.1-11.1 19.6L6 224.2c2.2 8.5 10.9 13.6 19.3 11.3l79.7-21.7 71.9 42.2-71.9 42.2-79.7-21.7c-8.4-2.3-17 2.8-19.3 11.3l-4.1 15.5c-2.2 8.5 2.7 17.3 11.1 19.6l34.1 9.3-39.2 23c-7.5 4.4-10.1 14.2-5.8 21.9L10 391c4.3 7.7 14 10.3 21.5 5.9l39.2-23-9.1 34.7c-2.2 8.5 2.7 17.3 11.1 19.6l15.2 4.1c8.4 2.3 17-2.8 19.3-11.3l21.3-81 71.9-42.2v84.5l-58.3 59.3c-6.1 6.2-6.1 16.4 0 22.6l11.1 11.3c6.1 6.2 16.1 6.2 22.2 0l24.9-25.4V496c0 8.8 7 16 15.7 16h15.7c8.7 0 15.7-7.2 15.7-16v-46.1l24.9 25.4c6.1 6.2 16.1 6.2 22.2 0l11.1-11.3c6.1-6.2 6.1-16.4 0-22.6l-58.3-59.3v-84.5l71.9 42.2 21.3 81c2.2 8.5 10.9 13.6 19.3 11.3L375 428c8.4-2.3 13.4-11.1 11.1-19.6l-9.1-34.7 39.2 23c7.5 4.4 17.1 1.8 21.5-5.9l7.9-13.9c4.6-7.5 2.1-17.3-5.5-21.7z"); + }, + m(target, anchor) { + insert(target, path, anchor); + }, + d(detaching) { + if (detaching) detach(path); + } + }; } -class InternSet extends Set { - constructor(values, key = keyof) { - super(); - Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); - if (values != null) for (const value of values) this.add(value); - } - has(value) { - return super.has(intern_get(this, value)); - } - add(value) { - return super.add(intern_set(this, value)); - } - delete(value) { - return super.delete(intern_delete(this, value)); - } -} +function create_fragment$6(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 448 512" }, /*$$props*/ ctx[0]]; -function intern_get({_intern, _key}, value) { - const key = _key(value); - return _intern.has(key) ? _intern.get(key) : value; -} + let iconbase_props = { + $$slots: { default: [create_default_slot$1] }, + $$scope: { ctx } + }; -function intern_set({_intern, _key}, value) { - const key = _key(value); - if (_intern.has(key)) return _intern.get(key); - _intern.set(key, value); - return value; -} + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } -function intern_delete({_intern, _key}, value) { - const key = _key(value); - if (_intern.has(key)) { - value = _intern.get(value); - _intern.delete(key); - } - return value; -} + iconbase = new IconBase({ props: iconbase_props }); -function keyof(value) { - return value !== null && typeof value === "object" ? value.valueOf() : value; -} + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + const iconbase_changes = (dirty & /*$$props*/ 1) + ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) + : {}; -function identity(x) { - return x; -} + if (dirty & /*$$scope*/ 2) { + iconbase_changes.$$scope = { dirty, ctx }; + } -function group(values, ...keys) { - return nest(values, identity, identity, keys); + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; } -function groups(values, ...keys) { - return nest(values, Array.from, identity, keys); -} +function instance$6($$self, $$props, $$invalidate) { + $$self.$$set = $$new_props => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; -function rollup(values, reduce, ...keys) { - return nest(values, identity, reduce, keys); + $$props = exclude_internal_props($$props); + return [$$props]; } -function rollups(values, reduce, ...keys) { - return nest(values, Array.from, reduce, keys); +class FaRegSnowflake extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$6, create_fragment$6, safe_not_equal, {}); + } } -function index(values, ...keys) { - return nest(values, identity, unique, keys); -} +/* src\Components\Down.svelte generated by Svelte v3.35.0 */ -function indexes(values, ...keys) { - return nest(values, Array.from, unique, keys); +function add_css$3() { + var style = element("style"); + style.id = "svelte-1mg8nz0-style"; + style.textContent = ".BC-downs.svelte-1mg8nz0{padding-left:5px}pre.svelte-1mg8nz0{display:inline}.is-unresolved.svelte-1mg8nz0{color:var(--text-muted)}.icon.svelte-1mg8nz0{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}"; + append(document.head, style); } -function unique(values) { - if (values.length !== 1) throw new Error("duplicate key"); - return values[0]; +function get_each_context$3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[11] = list[i]; + return child_ctx; } -function nest(values, map, reduce, keys) { - return (function regroup(values, i) { - if (i >= keys.length) return reduce(values); - const groups = new InternMap(); - const keyof = keys[i++]; - let index = -1; - for (const value of values) { - const key = keyof(value, ++index, values); - const group = groups.get(key); - if (group) group.push(value); - else groups.set(key, [value]); - } - for (const [key, values] of groups) { - groups.set(key, regroup(values, i)); - } - return map(groups); - })(values, 0); -} +// (51:4) {:else} +function create_else_block$1(ctx) { + let fafire; + let current; + fafire = new FaFire({}); -function permute(source, keys) { - return Array.from(keys, key => source[key]); + return { + c() { + create_component(fafire.$$.fragment); + }, + m(target, anchor) { + mount_component(fafire, target, anchor); + current = true; + }, + i(local) { + if (current) return; + transition_in(fafire.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(fafire.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(fafire, detaching); + } + }; } -function sort(values, ...F) { - if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); - values = Array.from(values); - let [f = ascending] = F; - if (f.length === 1 || F.length > 1) { - const index = Uint32Array.from(values, (d, i) => i); - if (F.length > 1) { - F = F.map(f => values.map(f)); - index.sort((i, j) => { - for (const f of F) { - const c = ascending(f[i], f[j]); - if (c) return c; - } - }); - } else { - f = values.map(f); - index.sort((i, j) => ascending(f[i], f[j])); - } - return permute(values, index); - } - return values.sort(f); -} +// (49:4) {#if frozen} +function create_if_block_1$1(ctx) { + let faregsnowflake; + let current; + faregsnowflake = new FaRegSnowflake({}); -function groupSort(values, reduce, key) { - return (reduce.length === 1 - ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk))) - : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk)))) - .map(([key]) => key); + return { + c() { + create_component(faregsnowflake.$$.fragment); + }, + m(target, anchor) { + mount_component(faregsnowflake, target, anchor); + current = true; + }, + i(local) { + if (current) return; + transition_in(faregsnowflake.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(faregsnowflake.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(faregsnowflake, detaching); + } + }; } -var array = Array.prototype; - -var slice = array.slice; - -function constant(x) { - return function() { - return x; - }; -} +// (67:4) {#if line.length > 1} +function create_if_block$1(ctx) { + let div; + let pre; + let t0_value = /*line*/ ctx[11][0] + "-" + ""; + let t0; + let t1; + let span; + let a; + let t2_value = /*line*/ ctx[11][1] + ""; + let t2; + let a_class_value; + let t3; + let div_style_value; + let mounted; + let dispose; -var e10 = Math.sqrt(50), - e5 = Math.sqrt(10), - e2 = Math.sqrt(2); + function click_handler_2(...args) { + return /*click_handler_2*/ ctx[8](/*line*/ ctx[11], ...args); + } -function ticks(start, stop, count) { - var reverse, - i = -1, - n, - ticks, - step; + function mouseover_handler(...args) { + return /*mouseover_handler*/ ctx[9](/*line*/ ctx[11], ...args); + } - stop = +stop, start = +start, count = +count; - if (start === stop && count > 0) return [start]; - if (reverse = stop < start) n = start, start = stop, stop = n; - if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; + return { + c() { + div = element("div"); + pre = element("pre"); + t0 = text(t0_value); + t1 = space(); + span = element("span"); + a = element("a"); + t2 = text(t2_value); + t3 = space(); + attr(pre, "class", "svelte-1mg8nz0"); - if (step > 0) { - let r0 = Math.round(start / step), r1 = Math.round(stop / step); - if (r0 * step < start) ++r0; - if (r1 * step > stop) --r1; - ticks = new Array(n = r1 - r0 + 1); - while (++i < n) ticks[i] = (r0 + i) * step; - } else { - step = -step; - let r0 = Math.round(start * step), r1 = Math.round(stop * step); - if (r0 / step < start) ++r0; - if (r1 / step > stop) --r1; - ticks = new Array(n = r1 - r0 + 1); - while (++i < n) ticks[i] = (r0 + i) / step; - } + attr(a, "class", a_class_value = "internal-link " + (isInVault(/*plugin*/ ctx[0].app, /*line*/ ctx[11][1]) + ? "" + : "is-unresolved") + " svelte-1mg8nz0"); - if (reverse) ticks.reverse(); + attr(span, "class", "internal-link"); - return ticks; -} + attr(div, "style", div_style_value = /*settings*/ ctx[5].downViewWrap + ? "" + : "white-space: nowrap;"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t0); + append(div, t1); + append(div, span); + append(span, a); + append(a, t2); + append(div, t3); -function tickIncrement(start, stop, count) { - var step = (stop - start) / Math.max(0, count), - power = Math.floor(Math.log(step) / Math.LN10), - error = step / Math.pow(10, power); - return power >= 0 - ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) - : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); -} + if (!mounted) { + dispose = [ + listen(span, "click", click_handler_2), + listen(span, "mouseover", mouseover_handler) + ]; -function tickStep(start, stop, count) { - var step0 = Math.abs(stop - start) / Math.max(0, count), - step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), - error = step0 / step1; - if (error >= e10) step1 *= 10; - else if (error >= e5) step1 *= 5; - else if (error >= e2) step1 *= 2; - return stop < start ? -step1 : step1; -} + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & /*lines*/ 16 && t0_value !== (t0_value = /*line*/ ctx[11][0] + "-" + "")) set_data(t0, t0_value); + if (dirty & /*lines*/ 16 && t2_value !== (t2_value = /*line*/ ctx[11][1] + "")) set_data(t2, t2_value); -function nice(start, stop, count) { - let prestep; - while (true) { - const step = tickIncrement(start, stop, count); - if (step === prestep || step === 0 || !isFinite(step)) { - return [start, stop]; - } else if (step > 0) { - start = Math.floor(start / step) * step; - stop = Math.ceil(stop / step) * step; - } else if (step < 0) { - start = Math.ceil(start * step) / step; - stop = Math.floor(stop * step) / step; - } - prestep = step; - } + if (dirty & /*plugin, lines*/ 17 && a_class_value !== (a_class_value = "internal-link " + (isInVault(/*plugin*/ ctx[0].app, /*line*/ ctx[11][1]) + ? "" + : "is-unresolved") + " svelte-1mg8nz0")) { + attr(a, "class", a_class_value); + } + }, + d(detaching) { + if (detaching) detach(div); + mounted = false; + run_all(dispose); + } + }; } -function sturges(values) { - return Math.ceil(Math.log(count(values)) / Math.LN2) + 1; -} +// (66:2) {#each lines as line} +function create_each_block$3(ctx) { + let if_block_anchor; + let if_block = /*line*/ ctx[11].length > 1 && create_if_block$1(ctx); -function bin() { - var value = identity, - domain = extent, - threshold = sturges; + return { + c() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx, dirty) { + if (/*line*/ ctx[11].length > 1) { + if (if_block) { + if_block.p(ctx, dirty); + } else { + if_block = create_if_block$1(ctx); + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + d(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach(if_block_anchor); + } + }; +} - function histogram(data) { - if (!Array.isArray(data)) data = Array.from(data); +function create_fragment$5(ctx) { + let div0; + let span; + let current_block_type_index; + let if_block; + let span_aria_label_value; + let t0; + let button; + let t2; + let div1; + let current; + let mounted; + let dispose; + const if_block_creators = [create_if_block_1$1, create_else_block$1]; + const if_blocks = []; - var i, - n = data.length, - x, - values = new Array(n); + function select_block_type(ctx, dirty) { + if (/*frozen*/ ctx[3]) return 0; + return 1; + } - for (i = 0; i < n; ++i) { - values[i] = value(data[i], i, data); - } + current_block_type_index = select_block_type(ctx); + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + let each_value = /*lines*/ ctx[4]; + let each_blocks = []; - var xz = domain(values), - x0 = xz[0], - x1 = xz[1], - tz = threshold(values, x0, x1); + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i)); + } - // Convert number of thresholds into uniform thresholds, and nice the - // default domain accordingly. - if (!Array.isArray(tz)) { - const max = x1, tn = +tz; - if (domain === extent) [x0, x1] = nice(x0, x1, tn); - tz = ticks(x0, x1, tn); + return { + c() { + div0 = element("div"); + span = element("span"); + if_block.c(); + t0 = space(); + button = element("button"); + button.textContent = "↻"; + t2 = space(); + div1 = element("div"); - // If the last threshold is coincident with the domain’s upper bound, the - // last bin will be zero-width. If the default domain is used, and this - // last threshold is coincident with the maximum input value, we can - // extend the niced upper bound by one tick to ensure uniform bin widths; - // otherwise, we simply remove the last threshold. Note that we don’t - // coerce values or the domain to numbers, and thus must be careful to - // compare order (>=) rather than strict equality (===)! - if (tz[tz.length - 1] >= x1) { - if (max >= x1 && domain === extent) { - const step = tickIncrement(x0, x1, tn); - if (isFinite(step)) { - if (step > 0) { - x1 = (Math.floor(x1 / step) + 1) * step; - } else if (step < 0) { - x1 = (Math.ceil(x1 * -step) + 1) / -step; - } - } - } else { - tz.pop(); - } - } - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - // Remove any thresholds outside the domain. - var m = tz.length; - while (tz[0] <= x0) tz.shift(), --m; - while (tz[m - 1] > x1) tz.pop(), --m; + attr(span, "class", "icon svelte-1mg8nz0"); - var bins = new Array(m + 1), - bin; + attr(span, "aria-label", span_aria_label_value = /*frozen*/ ctx[3] + ? `Frozen on: ${/*basename*/ ctx[2]}` + : "Unfrozen"); - // Initialize bins. - for (i = 0; i <= m; ++i) { - bin = bins[i] = []; - bin.x0 = i > 0 ? tz[i - 1] : x0; - bin.x1 = i < m ? tz[i] : x1; - } + attr(span, "aria-label-position", "left"); + attr(button, "aria-label", "Refresh Stats View (also refreshes Breadcrumbs Index)"); + attr(div1, "class", "BC-downs svelte-1mg8nz0"); + }, + m(target, anchor) { + insert(target, div0, anchor); + append(div0, span); + if_blocks[current_block_type_index].m(span, null); + append(div0, t0); + append(div0, button); + insert(target, t2, anchor); + insert(target, div1, anchor); - // Assign data to bins by value, ignoring any outside the domain. - for (i = 0; i < n; ++i) { - x = values[i]; - if (x0 <= x && x <= x1) { - bins[bisectRight(tz, x, 0, m)].push(data[i]); - } - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div1, null); + } - return bins; - } + current = true; - histogram.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; - }; + if (!mounted) { + dispose = [ + listen(span, "click", /*click_handler*/ ctx[6]), + listen(button, "click", /*click_handler_1*/ ctx[7]) + ]; - histogram.domain = function(_) { - return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; - }; + mounted = true; + } + }, + p(ctx, [dirty]) { + let previous_block_index = current_block_type_index; + current_block_type_index = select_block_type(ctx); - histogram.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; - }; + if (current_block_type_index !== previous_block_index) { + group_outros(); - return histogram; -} + transition_out(if_blocks[previous_block_index], 1, 1, () => { + if_blocks[previous_block_index] = null; + }); -function max(values, valueof) { - let max; - if (valueof === undefined) { - for (const value of values) { - if (value != null - && (max < value || (max === undefined && value >= value))) { - max = value; - } - } - } else { - let index = -1; - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null - && (max < value || (max === undefined && value >= value))) { - max = value; - } - } - } - return max; -} + check_outros(); + if_block = if_blocks[current_block_type_index]; -function min(values, valueof) { - let min; - if (valueof === undefined) { - for (const value of values) { - if (value != null - && (min > value || (min === undefined && value >= value))) { - min = value; - } - } - } else { - let index = -1; - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null - && (min > value || (min === undefined && value >= value))) { - min = value; - } - } - } - return min; -} + if (!if_block) { + if_block = if_blocks[current_block_type_index] = if_block_creators[current_block_type_index](ctx); + if_block.c(); + } -// Based on https://github.com/mourner/quickselect -// ISC license, Copyright 2018 Vladimir Agafonkin. -function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) { - while (right > left) { - if (right - left > 600) { - const n = right - left + 1; - const m = k - left + 1; - const z = Math.log(n); - const s = 0.5 * Math.exp(2 * z / 3); - const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); - const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); - const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); - quickselect(array, k, newLeft, newRight, compare); - } + transition_in(if_block, 1); + if_block.m(span, null); + } - const t = array[k]; - let i = left; - let j = right; + if (!current || dirty & /*frozen, basename*/ 12 && span_aria_label_value !== (span_aria_label_value = /*frozen*/ ctx[3] + ? `Frozen on: ${/*basename*/ ctx[2]}` + : "Unfrozen")) { + attr(span, "aria-label", span_aria_label_value); + } - swap(array, left, k); - if (compare(array[right], t) > 0) swap(array, left, right); + if (dirty & /*settings, openOrSwitch, plugin, lines, hoverPreview, view, isInVault*/ 51) { + each_value = /*lines*/ ctx[4]; + let i; - while (i < j) { - swap(array, i, j), ++i, --j; - while (compare(array[i], t) < 0) ++i; - while (compare(array[j], t) > 0) --j; - } + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$3(ctx, each_value, i); - if (compare(array[left], t) === 0) swap(array, left, j); - else ++j, swap(array, j, right); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$3(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div1, null); + } + } - if (j <= k) left = j + 1; - if (k <= j) right = j - 1; - } - return array; -} + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } -function swap(array, i, j) { - const t = array[i]; - array[i] = array[j]; - array[j] = t; + each_blocks.length = each_value.length; + } + }, + i(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o(local) { + transition_out(if_block); + current = false; + }, + d(detaching) { + if (detaching) detach(div0); + if_blocks[current_block_type_index].d(); + if (detaching) detach(t2); + if (detaching) detach(div1); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; } -function quantile(values, p, valueof) { - values = Float64Array.from(numbers(values, valueof)); - if (!(n = values.length)) return; - if ((p = +p) <= 0 || n < 2) return min(values); - if (p >= 1) return max(values); - var n, - i = (n - 1) * p, - i0 = Math.floor(i), - value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), - value1 = min(values.subarray(i0 + 1)); - return value0 + (value1 - value0) * (i - i0); -} +function instance$5($$self, $$props, $$invalidate) { + + + let { plugin } = $$props; + let { view } = $$props; + const { settings } = plugin; + const { userHiers } = settings; + let frozen = false; + let { basename } = plugin.app.workspace.getActiveFile(); -function quantileSorted(values, p, valueof = number) { - if (!(n = values.length)) return; - if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); - if (p >= 1) return +valueof(values[n - 1], n - 1, values); - var n, - i = (n - 1) * p, - i0 = Math.floor(i), - value0 = +valueof(values[i0], i0, values), - value1 = +valueof(values[i0 + 1], i0 + 1, values); - return value0 + (value1 - value0) * (i - i0); -} + plugin.app.workspace.on("active-leaf-change", () => { + if (frozen) return; + $$invalidate(2, basename = plugin.app.workspace.getActiveFile().basename); + }); -function freedmanDiaconis(values, min, max) { - return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(count(values), -1 / 3))); -} + let lines; -function scott(values, min, max) { - return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count(values), -1 / 3))); -} + const click_handler = () => { + $$invalidate(3, frozen = !frozen); + if (!frozen) $$invalidate(2, basename = plugin.app.workspace.getActiveFile().basename); + }; -function maxIndex(values, valueof) { - let max; - let maxIndex = -1; - let index = -1; - if (valueof === undefined) { - for (const value of values) { - ++index; - if (value != null - && (max < value || (max === undefined && value >= value))) { - max = value, maxIndex = index; - } - } - } else { - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null - && (max < value || (max === undefined && value >= value))) { - max = value, maxIndex = index; - } - } - } - return maxIndex; -} + const click_handler_1 = async () => { + await plugin.refreshIndex(); + await view.draw(); + }; -function mean(values, valueof) { - let count = 0; - let sum = 0; - if (valueof === undefined) { - for (let value of values) { - if (value != null && (value = +value) >= value) { - ++count, sum += value; - } - } - } else { - let index = -1; - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { - ++count, sum += value; - } - } - } - if (count) return sum / count; -} + const click_handler_2 = async (line, e) => await openOrSwitch(plugin.app, line[1], e); + const mouseover_handler = (line, e) => hoverPreview(e, view, line[1]); -function median(values, valueof) { - return quantile(values, 0.5, valueof); -} + $$self.$$set = $$props => { + if ("plugin" in $$props) $$invalidate(0, plugin = $$props.plugin); + if ("view" in $$props) $$invalidate(1, view = $$props.view); + }; -function* flatten(arrays) { - for (const array of arrays) { - yield* array; - } -} + $$self.$$.update = () => { + if ($$self.$$.dirty & /*plugin, basename*/ 5) { + { + const { mainG } = plugin; + const upnDown = getSubInDirs(mainG, "up", "down"); + const closed = getReflexiveClosure(upnDown, userHiers); + const down = getSubInDirs(closed, "down"); + const allPaths = dfsAllPaths(down, basename); + const index = plugin.createIndex(allPaths, false); + loglevel.info({ allPaths, index }); -function merge(arrays) { - return Array.from(flatten(arrays)); -} + $$invalidate(4, lines = index.split("\n").map(line => { + const pair = line.split("- "); + return [pair[0], pair.slice(1).join("- ")]; + }).filter(pair => pair[1] !== "")); + } + } + }; -function minIndex(values, valueof) { - let min; - let minIndex = -1; - let index = -1; - if (valueof === undefined) { - for (const value of values) { - ++index; - if (value != null - && (min > value || (min === undefined && value >= value))) { - min = value, minIndex = index; - } - } - } else { - for (let value of values) { - if ((value = valueof(value, ++index, values)) != null - && (min > value || (min === undefined && value >= value))) { - min = value, minIndex = index; - } - } - } - return minIndex; + return [ + plugin, + view, + basename, + frozen, + lines, + settings, + click_handler, + click_handler_1, + click_handler_2, + mouseover_handler + ]; } -function pairs(values, pairof = pair) { - const pairs = []; - let previous; - let first = false; - for (const value of values) { - if (first) pairs.push(pairof(previous, value)); - previous = value; - first = true; - } - return pairs; +class Down extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-1mg8nz0-style")) add_css$3(); + init(this, options, instance$5, create_fragment$5, safe_not_equal, { plugin: 0, view: 1 }); + } } -function pair(a, b) { - return [a, b]; +class DownView extends require$$0.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.icon = addFeatherIcon("corner-right-down"); + this.plugin = plugin; + } + async onload() { + // trace("DownView.onload"); + super.onload(); + this.app.workspace.onLayoutReady(async () => { + await this.draw(); + }); + } + getViewType() { + return DOWN_VIEW; + } + getDisplayText() { + return "Breadcrumbs Down"; + } + async onOpen() { } + onClose() { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); + return Promise.resolve(); + } + async draw() { + this.contentEl.empty(); + this.view = new Down({ + target: this.contentEl, + props: { plugin: this.plugin, view: this }, + }); + } } -function range(start, stop, step) { - start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; - - var i = -1, - n = Math.max(0, Math.ceil((stop - start) / step)) | 0, - range = new Array(n); +/* node_modules\svelte-icons\fa\FaInfo.svelte generated by Svelte v3.35.0 */ - while (++i < n) { - range[i] = start + i * step; - } +function create_default_slot(ctx) { + let path; - return range; + return { + c() { + path = svg_element("path"); + attr(path, "d", "M20 424.229h20V279.771H20c-11.046 0-20-8.954-20-20V212c0-11.046 8.954-20 20-20h112c11.046 0 20 8.954 20 20v212.229h20c11.046 0 20 8.954 20 20V492c0 11.046-8.954 20-20 20H20c-11.046 0-20-8.954-20-20v-47.771c0-11.046 8.954-20 20-20zM96 0C56.235 0 24 32.235 24 72s32.235 72 72 72 72-32.235 72-72S135.764 0 96 0z"); + }, + m(target, anchor) { + insert(target, path, anchor); + }, + d(detaching) { + if (detaching) detach(path); + } + }; } -function least(values, compare = ascending) { - let min; - let defined = false; - if (compare.length === 1) { - let minValue; - for (const element of values) { - const value = compare(element); - if (defined - ? ascending(value, minValue) < 0 - : ascending(value, value) === 0) { - min = element; - minValue = value; - defined = true; - } - } - } else { - for (const value of values) { - if (defined - ? compare(value, min) < 0 - : compare(value, value) === 0) { - min = value; - defined = true; - } - } - } - return min; -} +function create_fragment$4(ctx) { + let iconbase; + let current; + const iconbase_spread_levels = [{ viewBox: "0 0 192 512" }, /*$$props*/ ctx[0]]; -function leastIndex(values, compare = ascending) { - if (compare.length === 1) return minIndex(values, compare); - let minValue; - let min = -1; - let index = -1; - for (const value of values) { - ++index; - if (min < 0 - ? compare(value, value) === 0 - : compare(value, minValue) < 0) { - minValue = value; - min = index; - } - } - return min; -} + let iconbase_props = { + $$slots: { default: [create_default_slot] }, + $$scope: { ctx } + }; -function greatest(values, compare = ascending) { - let max; - let defined = false; - if (compare.length === 1) { - let maxValue; - for (const element of values) { - const value = compare(element); - if (defined - ? ascending(value, maxValue) > 0 - : ascending(value, value) === 0) { - max = element; - maxValue = value; - defined = true; - } - } - } else { - for (const value of values) { - if (defined - ? compare(value, max) > 0 - : compare(value, value) === 0) { - max = value; - defined = true; - } - } - } - return max; -} + for (let i = 0; i < iconbase_spread_levels.length; i += 1) { + iconbase_props = assign(iconbase_props, iconbase_spread_levels[i]); + } -function greatestIndex(values, compare = ascending) { - if (compare.length === 1) return maxIndex(values, compare); - let maxValue; - let max = -1; - let index = -1; - for (const value of values) { - ++index; - if (max < 0 - ? compare(value, value) === 0 - : compare(value, maxValue) > 0) { - maxValue = value; - max = index; - } - } - return max; -} + iconbase = new IconBase({ props: iconbase_props }); -function scan(values, compare) { - const index = leastIndex(values, compare); - return index < 0 ? undefined : index; -} + return { + c() { + create_component(iconbase.$$.fragment); + }, + m(target, anchor) { + mount_component(iconbase, target, anchor); + current = true; + }, + p(ctx, [dirty]) { + const iconbase_changes = (dirty & /*$$props*/ 1) + ? get_spread_update(iconbase_spread_levels, [iconbase_spread_levels[0], get_spread_object(/*$$props*/ ctx[0])]) + : {}; -var shuffle = shuffler(Math.random); + if (dirty & /*$$scope*/ 2) { + iconbase_changes.$$scope = { dirty, ctx }; + } -function shuffler(random) { - return function shuffle(array, i0 = 0, i1 = array.length) { - let m = i1 - (i0 = +i0); - while (m) { - const i = random() * m-- | 0, t = array[m + i0]; - array[m + i0] = array[i + i0]; - array[i + i0] = t; - } - return array; - }; + iconbase.$set(iconbase_changes); + }, + i(local) { + if (current) return; + transition_in(iconbase.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(iconbase.$$.fragment, local); + current = false; + }, + d(detaching) { + destroy_component(iconbase, detaching); + } + }; } -function sum(values, valueof) { - let sum = 0; - if (valueof === undefined) { - for (let value of values) { - if (value = +value) { - sum += value; - } - } - } else { - let index = -1; - for (let value of values) { - if (value = +valueof(value, ++index, values)) { - sum += value; - } - } - } - return sum; -} +function instance$4($$self, $$props, $$invalidate) { + $$self.$$set = $$new_props => { + $$invalidate(0, $$props = assign(assign({}, $$props), exclude_internal_props($$new_props))); + }; -function transpose(matrix) { - if (!(n = matrix.length)) return []; - for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { - for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { - row[j] = matrix[j][i]; - } - } - return transpose; + $$props = exclude_internal_props($$props); + return [$$props]; } -function length(d) { - return d.length; +class FaInfo extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance$4, create_fragment$4, safe_not_equal, {}); + } } -function zip() { - return transpose(arguments); -} +/* src\Components\Ducks.svelte generated by Svelte v3.35.0 */ -function every(values, test) { - if (typeof test !== "function") throw new TypeError("test is not a function"); - let index = -1; - for (const value of values) { - if (!test(value, ++index, values)) { - return false; - } - } - return true; +function add_css$2() { + var style = element("style"); + style.id = "svelte-gmdm3a-style"; + style.textContent = ".icon.svelte-gmdm3a{color:var(--text-normal);display:inline-block;padding-top:5px !important;width:20px;height:20px}"; + append(document.head, style); } -function some(values, test) { - if (typeof test !== "function") throw new TypeError("test is not a function"); - let index = -1; - for (const value of values) { - if (test(value, ++index, values)) { - return true; - } - } - return false; +function get_each_context$2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[13] = list[i]; + return child_ctx; } -function filter(values, test) { - if (typeof test !== "function") throw new TypeError("test is not a function"); - const array = []; - let index = -1; - for (const value of values) { - if (test(value, ++index, values)) { - array.push(value); - } - } - return array; -} +// (48:2) {#each ducks as duck} +function create_each_block$2(ctx) { + let div; + let a; + let t0_value = /*duck*/ ctx[13] + ""; + let t0; + let t1; + let mounted; + let dispose; -function map(values, mapper) { - if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); - if (typeof mapper !== "function") throw new TypeError("mapper is not a function"); - return Array.from(values, (value, index) => mapper(value, index, values)); -} + function click_handler(...args) { + return /*click_handler*/ ctx[9](/*duck*/ ctx[13], ...args); + } -function reduce(values, reducer, value) { - if (typeof reducer !== "function") throw new TypeError("reducer is not a function"); - const iterator = values[Symbol.iterator](); - let done, next, index = -1; - if (arguments.length < 3) { - ({done, value} = iterator.next()); - if (done) return; - ++index; - } - while (({done, value: next} = iterator.next()), !done) { - value = reducer(value, next, ++index, values); - } - return value; -} + function mouseover_handler(...args) { + return /*mouseover_handler*/ ctx[10](/*duck*/ ctx[13], ...args); + } -function reverse(values) { - if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); - return Array.from(values).reverse(); -} + return { + c() { + div = element("div"); + a = element("a"); + t0 = text(t0_value); + t1 = space(); + attr(a, "class", "internal-link"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, a); + append(a, t0); + append(div, t1); -function difference(values, ...others) { - values = new Set(values); - for (const other of others) { - for (const value of other) { - values.delete(value); - } - } - return values; -} + if (!mounted) { + dispose = [ + listen(div, "click", click_handler), + listen(div, "mouseover", mouseover_handler) + ]; -function disjoint(values, other) { - const iterator = other[Symbol.iterator](), set = new Set(); - for (const v of values) { - if (set.has(v)) return false; - let value, done; - while (({value, done} = iterator.next())) { - if (done) break; - if (Object.is(v, value)) return false; - set.add(value); - } - } - return true; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & /*ducks*/ 16 && t0_value !== (t0_value = /*duck*/ ctx[13] + "")) set_data(t0, t0_value); + }, + d(detaching) { + if (detaching) detach(div); + mounted = false; + run_all(dispose); + } + }; } -function set(values) { - return values instanceof Set ? values : new Set(values); -} +function create_fragment$3(ctx) { + let div; + let h6; + let t1; + let span; + let fainfo; + let t2; + let label; + let t4; + let input0; + let t5; + let input1; + let t6; + let current; + let mounted; + let dispose; + fainfo = new FaInfo({}); + let each_value = /*ducks*/ ctx[4]; + let each_blocks = []; -function intersection(values, ...others) { - values = new Set(values); - others = others.map(set); - out: for (const value of values) { - for (const other of others) { - if (!other.has(value)) { - values.delete(value); - continue out; - } - } - } - return values; -} + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$2(get_each_context$2(ctx, each_value, i)); + } + + return { + c() { + div = element("div"); + h6 = element("h6"); + h6.textContent = "Notes without Breadcrumbs"; + t1 = space(); + span = element("span"); + create_component(fainfo.$$.fragment); + t2 = space(); + label = element("label"); + label.textContent = "Filter:"; + t4 = space(); + input0 = element("input"); + t5 = space(); + input1 = element("input"); + t6 = space(); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + attr(span, "class", "icon svelte-gmdm3a"); + attr(span, "aria-label", `A Regex used to filter the results.\nIf 'Include' is checked, it will only show notes that match the regex.\nIf 'Include' is not checked, this regex will filter out notes that match it.`); + attr(label, "for", "regex"); + attr(input0, "type", "text"); + attr(input0, "name", "regex"); + attr(input0, "placeholder", "Regex"); + input0.value = /*query*/ ctx[2]; + attr(input1, "aria-label", "Include"); + attr(input1, "type", "checkbox"); + input1.checked = /*include*/ ctx[3]; + attr(div, "class", "BC-Ducks markdown-preview-view"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, h6); + append(div, t1); + append(div, span); + mount_component(fainfo, span, null); + append(div, t2); + append(div, label); + append(div, t4); + append(div, input0); + append(div, t5); + append(div, input1); + append(div, t6); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div, null); + } + + current = true; + + if (!mounted) { + dispose = [ + listen(input0, "change", /*change_handler*/ ctx[7]), + listen(input1, "change", /*change_handler_1*/ ctx[8]) + ]; + + mounted = true; + } + }, + p(ctx, [dirty]) { + if (!current || dirty & /*query*/ 4 && input0.value !== /*query*/ ctx[2]) { + input0.value = /*query*/ ctx[2]; + } + + if (!current || dirty & /*include*/ 8) { + input1.checked = /*include*/ ctx[3]; + } + + if (dirty & /*openOrSwitch, app, ducks, hoverPreview, ducksView*/ 19) { + each_value = /*ducks*/ ctx[4]; + let i; + + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$2(ctx, each_value, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$2(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div, null); + } + } -function superset(values, other) { - const iterator = values[Symbol.iterator](), set = new Set(); - for (const o of other) { - if (set.has(o)) continue; - let value, done; - while (({value, done} = iterator.next())) { - if (done) return false; - set.add(value); - if (Object.is(o, value)) break; - } - } - return true; -} + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } -function subset(values, other) { - return superset(other, values); + each_blocks.length = each_value.length; + } + }, + i(local) { + if (current) return; + transition_in(fainfo.$$.fragment, local); + current = true; + }, + o(local) { + transition_out(fainfo.$$.fragment, local); + current = false; + }, + d(detaching) { + if (detaching) detach(div); + destroy_component(fainfo); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; } -function union(...others) { - const set = new Set(); - for (const other of others) { - for (const o of other) { - set.add(o); - } - } - return set; -} +function instance$3($$self, $$props, $$invalidate) { + + + + let { plugin } = $$props; + let { app } = $$props; + let { ducksView } = $$props; + const { mainG } = plugin; + const files = app.vault.getMarkdownFiles(); + let query = ""; + let include = true; + let regex = new RegExp(query, "g"); + let ducks = files.map(file => file.basename).filter(name => !mainG.neighbors(name).length && include === regex.test(name)); + const change_handler = e => $$invalidate(2, query = e.target.value); + const change_handler_1 = e => $$invalidate(3, include = e.target.checked); + const click_handler = async (duck, e) => await openOrSwitch(app, duck, e); + const mouseover_handler = (duck, e) => hoverPreview(e, ducksView, duck); -exports.Adder = Adder; -exports.InternMap = InternMap; -exports.InternSet = InternSet; -exports.ascending = ascending; -exports.bin = bin; -exports.bisect = bisectRight; -exports.bisectCenter = bisectCenter; -exports.bisectLeft = bisectLeft; -exports.bisectRight = bisectRight; -exports.bisector = bisector; -exports.count = count; -exports.cross = cross; -exports.cumsum = cumsum; -exports.descending = descending; -exports.deviation = deviation; -exports.difference = difference; -exports.disjoint = disjoint; -exports.every = every; -exports.extent = extent; -exports.fcumsum = fcumsum; -exports.filter = filter; -exports.fsum = fsum; -exports.greatest = greatest; -exports.greatestIndex = greatestIndex; -exports.group = group; -exports.groupSort = groupSort; -exports.groups = groups; -exports.histogram = bin; -exports.index = index; -exports.indexes = indexes; -exports.intersection = intersection; -exports.least = least; -exports.leastIndex = leastIndex; -exports.map = map; -exports.max = max; -exports.maxIndex = maxIndex; -exports.mean = mean; -exports.median = median; -exports.merge = merge; -exports.min = min; -exports.minIndex = minIndex; -exports.nice = nice; -exports.pairs = pairs; -exports.permute = permute; -exports.quantile = quantile; -exports.quantileSorted = quantileSorted; -exports.quickselect = quickselect; -exports.range = range; -exports.reduce = reduce; -exports.reverse = reverse; -exports.rollup = rollup; -exports.rollups = rollups; -exports.scan = scan; -exports.shuffle = shuffle; -exports.shuffler = shuffler; -exports.some = some; -exports.sort = sort; -exports.subset = subset; -exports.sum = sum; -exports.superset = superset; -exports.thresholdFreedmanDiaconis = freedmanDiaconis; -exports.thresholdScott = scott; -exports.thresholdSturges = sturges; -exports.tickIncrement = tickIncrement; -exports.tickStep = tickStep; -exports.ticks = ticks; -exports.transpose = transpose; -exports.union = union; -exports.variance = variance; -exports.zip = zip; + $$self.$$set = $$props => { + if ("plugin" in $$props) $$invalidate(5, plugin = $$props.plugin); + if ("app" in $$props) $$invalidate(0, app = $$props.app); + if ("ducksView" in $$props) $$invalidate(1, ducksView = $$props.ducksView); + }; -Object.defineProperty(exports, '__esModule', { value: true }); + $$self.$$.update = () => { + if ($$self.$$.dirty & /*query*/ 4) { + $$invalidate(6, regex = new RegExp(query, "g")); + } -}))); -}); + if ($$self.$$.dirty & /*include, regex*/ 72) { + { + $$invalidate(4, ducks = files.map(file => file.basename).filter(name => !mainG.neighbors(name).length && include === regex.test(name))); + } + } -var d3Axis = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-axis/ v2.1.0 Copyright 2021 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, (function (exports) { -var slice = Array.prototype.slice; + if ($$self.$$.dirty & /*ducks, query, include, regex*/ 92) { + console.log({ ducks, query, include, regex }); + } + }; -function identity(x) { - return x; + return [ + app, + ducksView, + query, + include, + ducks, + plugin, + regex, + change_handler, + change_handler_1, + click_handler, + mouseover_handler + ]; } -var top = 1, - right = 2, - bottom = 3, - left = 4, - epsilon = 1e-6; - -function translateX(x) { - return "translate(" + x + ",0)"; +class Ducks extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-gmdm3a-style")) add_css$2(); + init(this, options, instance$3, create_fragment$3, safe_not_equal, { plugin: 5, app: 0, ducksView: 1 }); + } } -function translateY(y) { - return "translate(0," + y + ")"; +class DucksView extends require$$0.ItemView { + constructor(leaf, plugin) { + super(leaf); + // TODO Duck icon + this.icon = DUCK_ICON; + this.plugin = plugin; + } + async onload() { + // trace("DuckView.onload"); + super.onload(); + await this.plugin.saveSettings(); + this.app.workspace.onLayoutReady(async () => { + await this.draw(); + }); + } + getViewType() { + return DUCK_VIEW; + } + getDisplayText() { + return "Breadcrumbs Ducks"; + } + async onOpen() { } + onClose() { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); + return Promise.resolve(); + } + async draw() { + this.contentEl.empty(); + this.view = new Ducks({ + target: this.contentEl, + props: { plugin: this.plugin, app: this.app, ducksView: this }, + }); + } } -function number(scale) { - return d => +scale(d); +class FieldSuggestor extends require$$0.EditorSuggest { + constructor(plugin) { + super(plugin.app); + this.getSuggestions = (context) => { + const { query } = context; + return BC_FIELDS_INFO.map((sug) => sug.field).filter((sug) => sug.includes(query)); + }; + this.plugin = plugin; + } + onTrigger(cursor, editor, _) { + var _a; + if (this.plugin.settings.fieldSuggestor) { + const sub = editor.getLine(cursor.line).substring(0, cursor.ch); + const match = (_a = sub.match(/^BC-(.*)$/)) === null || _a === void 0 ? void 0 : _a[1]; + if (match !== undefined) { + return { + end: cursor, + start: { + ch: sub.lastIndexOf(match), + line: cursor.line, + }, + query: match, + }; + } + } + return null; + } + renderSuggestion(suggestion, el) { + var _a; + el.createDiv({ + text: suggestion.replace("BC-", ""), + cls: "BC-suggester-container", + attr: { + "aria-label": (_a = BC_FIELDS_INFO.find((f) => f.field === suggestion)) === null || _a === void 0 ? void 0 : _a.desc, + "aria-label-position": "right", + }, + }); + } + selectSuggestion(suggestion) { + var _a; + const { context } = this; + if (context) { + const replacement = `${suggestion}${(_a = BC_FIELDS_INFO.find((f) => f.field === suggestion)) === null || _a === void 0 ? void 0 : _a.after}`; + context.editor.replaceRange(replacement, { ch: 0, line: context.start.line }, context.end); + } + } } -function center(scale, offset) { - offset = Math.max(0, scale.bandwidth() - offset * 2) / 2; - if (scale.round()) offset = Math.round(offset); - return d => +scale(d) + offset; -} +/* src\Components\ModifyHNItemComp.svelte generated by Svelte v3.35.0 */ -function entering() { - return !this.__axis; +function add_css$1() { + var style = element("style"); + style.id = "svelte-13g4k7i-style"; + style.textContent = "pre.svelte-13g4k7i{display:inline}"; + append(document.head, style); } -function axis(orient, scale) { - var tickArguments = [], - tickValues = null, - tickFormat = null, - tickSizeInner = 6, - tickSizeOuter = 6, - tickPadding = 3, - offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5, - k = orient === top || orient === left ? -1 : 1, - x = orient === left || orient === right ? "x" : "y", - transform = orient === top || orient === bottom ? translateX : translateY; - - function axis(context) { - var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, - format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, - spacing = Math.max(tickSizeInner, 0) + tickPadding, - range = scale.range(), - range0 = +range[0] + offset, - range1 = +range[range.length - 1] + offset, - position = (scale.bandwidth ? center : number)(scale.copy(), offset), - selection = context.selection ? context.selection() : context, - path = selection.selectAll(".domain").data([null]), - tick = selection.selectAll(".tick").data(values, scale).order(), - tickExit = tick.exit(), - tickEnter = tick.enter().append("g").attr("class", "tick"), - line = tick.select("line"), - text = tick.select("text"); - - path = path.merge(path.enter().insert("path", ".tick") - .attr("class", "domain") - .attr("stroke", "currentColor")); +// (21:2) {#if rel === "up"} +function create_if_block_2(ctx) { + let if_block_anchor; - tick = tick.merge(tickEnter); + function select_block_type(ctx, dirty) { + if (/*hnItem*/ ctx[2].depth === 0) return create_if_block_3; + return create_else_block; + } - line = line.merge(tickEnter.append("line") - .attr("stroke", "currentColor") - .attr(x + "2", k * tickSizeInner)); + let current_block_type = select_block_type(ctx); + let if_block = current_block_type(ctx); - text = text.merge(tickEnter.append("text") - .attr("fill", "currentColor") - .attr(x, k * spacing) - .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); + return { + c() { + if_block.c(); + if_block_anchor = empty(); + }, + m(target, anchor) { + if_block.m(target, anchor); + insert(target, if_block_anchor, anchor); + }, + p(ctx, dirty) { + if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { + if_block.p(ctx, dirty); + } else { + if_block.d(1); + if_block = current_block_type(ctx); - if (context !== selection) { - path = path.transition(context); - tick = tick.transition(context); - line = line.transition(context); - text = text.transition(context); + if (if_block) { + if_block.c(); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } + }, + d(detaching) { + if_block.d(detaching); + if (detaching) detach(if_block_anchor); + } + }; +} - tickExit = tickExit.transition(context) - .attr("opacity", epsilon) - .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); }); +// (24:4) {:else} +function create_else_block(ctx) { + let div; + let pre; + let t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth - 4, true) + ""; + let t; - tickEnter - .attr("opacity", epsilon) - .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); }); - } + return { + c() { + div = element("div"); + pre = element("pre"); + t = text(t_value); + attr(pre, "class", "svelte-13g4k7i"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t); + }, + p(ctx, dirty) { + if (dirty & /*newItem, hnItem*/ 36 && t_value !== (t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth - 4, true) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(div); + } + }; +} - tickExit.remove(); +// (22:4) {#if hnItem.depth === 0} +function create_if_block_3(ctx) { + let div; - path - .attr("d", orient === left || orient === right - ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1) - : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1)); + return { + c() { + div = element("div"); + div.textContent = "Can't add parent to top level item, choose another direction"; + }, + m(target, anchor) { + insert(target, div, anchor); + }, + p: noop, + d(detaching) { + if (detaching) detach(div); + } + }; +} - tick - .attr("opacity", 1) - .attr("transform", function(d) { return transform(position(d) + offset); }); +// (43:27) +function create_if_block_1(ctx) { + let div; + let pre; + let t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth + 4, true) + ""; + let t; - line - .attr(x + "2", k * tickSizeInner); + return { + c() { + div = element("div"); + pre = element("pre"); + t = text(t_value); + attr(pre, "class", "svelte-13g4k7i"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t); + }, + p(ctx, dirty) { + if (dirty & /*newItem, hnItem*/ 36 && t_value !== (t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth + 4, true) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(div); + } + }; +} - text - .attr(x, k * spacing) - .text(format); +// (37:2) {#if rel === "same"} +function create_if_block(ctx) { + let div; + let pre; + let t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth, true) + ""; + let t; - selection.filter(entering) - .attr("fill", "none") - .attr("font-size", 10) - .attr("font-family", "sans-serif") - .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); + return { + c() { + div = element("div"); + pre = element("pre"); + t = text(t_value); + attr(pre, "class", "svelte-13g4k7i"); + }, + m(target, anchor) { + insert(target, div, anchor); + append(div, pre); + append(pre, t); + }, + p(ctx, dirty) { + if (dirty & /*newItem, hnItem*/ 36 && t_value !== (t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth, true) + "")) set_data(t, t_value); + }, + d(detaching) { + if (detaching) detach(div); + } + }; +} - selection - .each(function() { this.__axis = position; }); - } +function create_fragment$2(ctx) { + let h5; + let t0; + let t1_value = ARROW_DIRECTIONS[/*rel*/ ctx[0]] + ""; + let t1; + let t2; + let t3_value = dropWikilinks(/*hnItem*/ ctx[2].line) + ""; + let t3; + let t4; + let div1; + let t5; + let div0; + let pre; + let strong; + let t6_value = /*buildNewItem*/ ctx[6](dropWikilinks(/*hnItem*/ ctx[2].line), /*hnItem*/ ctx[2].depth, true) + ""; + let t6; + let t7; + let t8; + let select; + let option0; + let option1; + let option2; + let t12; + let input; + let t13; + let button; + let mounted; + let dispose; + let if_block0 = /*rel*/ ctx[0] === "up" && create_if_block_2(ctx); - axis.scale = function(_) { - return arguments.length ? (scale = _, axis) : scale; - }; + function select_block_type_1(ctx, dirty) { + if (/*rel*/ ctx[0] === "same") return create_if_block; + if (/*rel*/ ctx[0] === "down") return create_if_block_1; + } - axis.ticks = function() { - return tickArguments = slice.call(arguments), axis; - }; + let current_block_type = select_block_type_1(ctx); + let if_block1 = current_block_type && current_block_type(ctx); - axis.tickArguments = function(_) { - return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); - }; + return { + c() { + h5 = element("h5"); + t0 = text("Add an "); + t1 = text(t1_value); + t2 = text(" to "); + t3 = text(t3_value); + t4 = space(); + div1 = element("div"); + if (if_block0) if_block0.c(); + t5 = space(); + div0 = element("div"); + pre = element("pre"); + strong = element("strong"); + t6 = text(t6_value); + t7 = space(); + if (if_block1) if_block1.c(); + t8 = space(); + select = element("select"); + option0 = element("option"); + option0.textContent = "up"; + option1 = element("option"); + option1.textContent = "same"; + option2 = element("option"); + option2.textContent = "down"; + t12 = space(); + input = element("input"); + t13 = space(); + button = element("button"); + button.textContent = "Add"; + attr(pre, "class", "svelte-13g4k7i"); + option0.__value = "up"; + option0.value = option0.__value; + option1.__value = "same"; + option1.value = option1.__value; + option2.__value = "down"; + option2.value = option2.__value; + attr(select, "class", "dropdown"); + attr(select, "width", "1"); + if (/*rel*/ ctx[0] === void 0) add_render_callback(() => /*select_change_handler*/ ctx[8].call(select)); + attr(input, "type", "text"); + attr(input, "placeholder", "New item"); + }, + m(target, anchor) { + insert(target, h5, anchor); + append(h5, t0); + append(h5, t1); + append(h5, t2); + append(h5, t3); + insert(target, t4, anchor); + insert(target, div1, anchor); + if (if_block0) if_block0.m(div1, null); + append(div1, t5); + append(div1, div0); + append(div0, pre); + append(pre, strong); + append(strong, t6); + append(div1, t7); + if (if_block1) if_block1.m(div1, null); + append(div1, t8); + append(div1, select); + append(select, option0); + append(select, option1); + append(select, option2); + select_option(select, /*rel*/ ctx[0]); + append(div1, t12); + append(div1, input); + /*input_binding*/ ctx[9](input); + set_input_value(input, /*newItem*/ ctx[5]); + append(div1, t13); + append(div1, button); - axis.tickValues = function(_) { - return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); - }; + if (!mounted) { + dispose = [ + listen(select, "change", /*select_change_handler*/ ctx[8]), + listen(input, "input", /*input_input_handler*/ ctx[10]), + listen(button, "click", /*click_handler*/ ctx[11]) + ]; - axis.tickFormat = function(_) { - return arguments.length ? (tickFormat = _, axis) : tickFormat; - }; + mounted = true; + } + }, + p(ctx, [dirty]) { + if (dirty & /*rel*/ 1 && t1_value !== (t1_value = ARROW_DIRECTIONS[/*rel*/ ctx[0]] + "")) set_data(t1, t1_value); + if (dirty & /*hnItem*/ 4 && t3_value !== (t3_value = dropWikilinks(/*hnItem*/ ctx[2].line) + "")) set_data(t3, t3_value); - axis.tickSize = function(_) { - return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; - }; + if (/*rel*/ ctx[0] === "up") { + if (if_block0) { + if_block0.p(ctx, dirty); + } else { + if_block0 = create_if_block_2(ctx); + if_block0.c(); + if_block0.m(div1, t5); + } + } else if (if_block0) { + if_block0.d(1); + if_block0 = null; + } - axis.tickSizeInner = function(_) { - return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; - }; + if (dirty & /*hnItem*/ 4 && t6_value !== (t6_value = /*buildNewItem*/ ctx[6](dropWikilinks(/*hnItem*/ ctx[2].line), /*hnItem*/ ctx[2].depth, true) + "")) set_data(t6, t6_value); - axis.tickSizeOuter = function(_) { - return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; - }; + if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block1) { + if_block1.p(ctx, dirty); + } else { + if (if_block1) if_block1.d(1); + if_block1 = current_block_type && current_block_type(ctx); - axis.tickPadding = function(_) { - return arguments.length ? (tickPadding = +_, axis) : tickPadding; - }; + if (if_block1) { + if_block1.c(); + if_block1.m(div1, t8); + } + } - axis.offset = function(_) { - return arguments.length ? (offset = +_, axis) : offset; - }; + if (dirty & /*rel*/ 1) { + select_option(select, /*rel*/ ctx[0]); + } - return axis; -} + if (dirty & /*newItem*/ 32 && input.value !== /*newItem*/ ctx[5]) { + set_input_value(input, /*newItem*/ ctx[5]); + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(h5); + if (detaching) detach(t4); + if (detaching) detach(div1); + if (if_block0) if_block0.d(); -function axisTop(scale) { - return axis(top, scale); -} + if (if_block1) { + if_block1.d(); + } -function axisRight(scale) { - return axis(right, scale); + /*input_binding*/ ctx[9](null); + mounted = false; + run_all(dispose); + } + }; } -function axisBottom(scale) { - return axis(bottom, scale); -} +function instance$2($$self, $$props, $$invalidate) { + + + let { modal } = $$props; + let { settings } = $$props; + let { hnItem } = $$props; + let { file } = $$props; + let { rel } = $$props; + let inputEl; + let newItem = ""; + const buildNewItem = (newItem, depth = hnItem.depth, preview = false) => `${(" ").repeat(Math.round(depth / (preview ? 2 : 1)))}- ${preview ? newItem || "" : makeWiki(newItem)}`; + onMount(() => inputEl.focus()); -function axisLeft(scale) { - return axis(left, scale); -} + function select_change_handler() { + rel = select_value(this); + $$invalidate(0, rel); + } -exports.axisBottom = axisBottom; -exports.axisLeft = axisLeft; -exports.axisRight = axisRight; -exports.axisTop = axisTop; + function input_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + inputEl = $$value; + $$invalidate(4, inputEl); + }); + } -Object.defineProperty(exports, '__esModule', { value: true }); + function input_input_handler() { + newItem = this.value; + $$invalidate(5, newItem); + } -}))); -}); + const click_handler = async e => { + if (rel === "up" && hnItem.depth === 0) { + new require$$0.Notice("Can't add parent to top level item, choose another direction"); + return; + } else { + try { + const content = await modal.app.vault.read(file); + const lines = content.split("\n"); + const lineNo = rel === "up" ? hnItem.lineNo : hnItem.lineNo + 1; -var d3Dispatch = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-dispatch/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -var noop = {value: () => {}}; + const depth = rel === "up" + ? hnItem.depth - 4 + : rel === "down" ? hnItem.depth + 4 : hnItem.depth; -function dispatch() { - for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { - if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); - _[t] = []; - } - return new Dispatch(_); -} + lines.splice(lineNo, 0, buildNewItem(newItem, depth)); + await modal.app.vault.modify(file, lines.join("\n")); + modal.close(); + } catch(err) { + console$1.error(err); + new require$$0.Notice("An error occured, please check the console"); + } + } + }; -function Dispatch(_) { - this._ = _; -} + $$self.$$set = $$props => { + if ("modal" in $$props) $$invalidate(1, modal = $$props.modal); + if ("settings" in $$props) $$invalidate(7, settings = $$props.settings); + if ("hnItem" in $$props) $$invalidate(2, hnItem = $$props.hnItem); + if ("file" in $$props) $$invalidate(3, file = $$props.file); + if ("rel" in $$props) $$invalidate(0, rel = $$props.rel); + }; -function parseTypenames(typenames, types) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i = t.indexOf("."); - if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); - if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); - return {type: t, name: name}; - }); + return [ + rel, + modal, + hnItem, + file, + inputEl, + newItem, + buildNewItem, + settings, + select_change_handler, + input_binding, + input_input_handler, + click_handler + ]; } -Dispatch.prototype = dispatch.prototype = { - constructor: Dispatch, - on: function(typename, callback) { - var _ = this._, - T = parseTypenames(typename + "", _), - t, - i = -1, - n = T.length; - - // If no callback was specified, return the callback of the given type and name. - if (arguments.length < 2) { - while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; - return; - } +class ModifyHNItemComp extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-13g4k7i-style")) add_css$1(); - // If a type was specified, set the callback for the given type and name. - // Otherwise, if a null callback was specified, remove callbacks of the given name. - if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); - while (++i < n) { - if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); - else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); - } + init(this, options, instance$2, create_fragment$2, safe_not_equal, { + modal: 1, + settings: 7, + hnItem: 2, + file: 3, + rel: 0 + }); + } +} - return this; - }, - copy: function() { - var copy = {}, _ = this._; - for (var t in _) copy[t] = _[t].slice(); - return new Dispatch(copy); - }, - call: function(type, that) { - if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; - if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); - for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); - }, - apply: function(type, that, args) { - if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); - for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); - } -}; +class ModifyHierItemModal extends require$$0.Modal { + constructor(app, plugin, hnItem, file, rel) { + super(app); + this.plugin = plugin; + this.modal = this; + this.hnItem = hnItem; + this.file = file; + this.rel = rel; + } + onOpen() { + const { contentEl } = this; + contentEl.empty(); + new ModifyHNItemComp({ + target: contentEl, + props: { + modal: this, + settings: this.plugin.settings, + hnItem: this.hnItem, + file: this.file, + rel: this.rel, + }, + }); + } + onClose() { + this.contentEl.empty(); + } +} -function get(type, name) { - for (var i = 0, n = type.length, c; i < n; ++i) { - if ((c = type[i]).name === name) { - return c.value; - } - } +class HierarchyNoteManipulator extends require$$0.FuzzySuggestModal { + constructor(app, plugin, hierNoteName) { + super(app); + this.app = app; + this.plugin = plugin; + this.settings = this.plugin.settings; + this.hierNoteName = hierNoteName; + const chooseOverride = (evt) => { + // @ts-ignore + this.chooser.useSelectedItem(evt); + return false; + }; + this.scope.register([], "Delete", chooseOverride); + this.scope.register(["Shift"], "ArrowUp", chooseOverride); + this.scope.register(["Shift"], "ArrowRight", chooseOverride); + this.scope.register(["Shift"], "ArrowDown", chooseOverride); + } + async onOpen() { + this.setPlaceholder("HN Manipulator"); + this.setInstructions([ + { command: "Enter/Click", purpose: "Jump to item" }, + { command: "Shift + ↑", purpose: "Add parent" }, + { command: "Shift + →", purpose: "Add sibling" }, + { command: "Shift + ↓", purpose: "Add child" }, + { command: "Delete", purpose: "Delete item" }, + ]); + this.file = this.app.metadataCache.getFirstLinkpathDest(this.hierNoteName, ""); + if (!this.file) + this.lines = []; + const content = await this.app.vault.cachedRead(this.file); + this.lines = content.split("\n"); + this.listItems = this.app.metadataCache.getFileCache(this.file).listItems; + super.onOpen(); + } + getItems() { + const items = this.listItems + .map((item) => { + const i = item.position.start.line; + return { i, line: this.lines[i] }; + }) + .map((item) => { + const splits = item.line.split("- "); + const depth = splits[0].length; + const line = splits.slice(1).join("- "); + return { depth, line, lineNo: item.i }; + }); + return items; + } + getItemText(item) { + return `${" ".repeat(item.depth)}- ${dropWikilinks(item.line)}`; + } + renderSuggestion(item, el) { + super.renderSuggestion(item, el); + el.innerText = `${" ".repeat(item.item.depth)}- ${dropWikilinks(item.item.line)}`; + } + async deleteItem(item) { + try { + this.lines.splice(item.lineNo, 1); + this.listItems.splice(item.lineNo, 1); + await this.app.vault.modify(this.file, this.lines.join("\n")); + new require$$0.Notice("Item deleted Succesfully"); + } + catch (err) { + loglevel.error(err); + new require$$0.Notice("An error occured. Please check the console"); + } + } + onChooseItem(item, evt) { + if (evt instanceof KeyboardEvent && evt.key === "Delete") { + this.deleteItem(item); + } + else if (evt instanceof KeyboardEvent && evt.shiftKey) { + const rel = evt.key === "ArrowUp" + ? "up" + : evt.key === "ArrowDown" + ? "down" + : "same"; + new ModifyHierItemModal(this.app, this.plugin, item, this.file, rel).open(); + this.close(); + } + else { + const view = this.app.workspace.getActiveViewOfType(require$$0.MarkdownView); + const { editor } = view !== null && view !== void 0 ? view : {}; + if (!editor) + return; + //@ts-ignore + view.leaf.openFile(this.file, { active: true, mode: "source" }); + editor.setCursor({ line: item.lineNo, ch: item.depth + 2 }); + } + } } -function set(type, name, callback) { - for (var i = 0, n = type.length; i < n; ++i) { - if (type[i].name === name) { - type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); - break; - } - } - if (callback != null) type.push({name: name, value: callback}); - return type; +class HierarchyNoteSelectorModal extends require$$0.FuzzySuggestModal { + constructor(app, plugin) { + super(app); + this.app = app; + this.plugin = plugin; + this.settings = this.plugin.settings; + } + onOpen() { + this.setPlaceholder("HN Chooser"); + const { hierarchyNotes } = this.settings; + if (hierarchyNotes.length === 0) { + this.close(); + new require$$0.Notice("No hierarchy notes found"); + } + else if (hierarchyNotes.length === 1) { + this.close(); + new HierarchyNoteManipulator(this.app, this.plugin, hierarchyNotes[0]).open(); + } + else { + super.onOpen(); + } + } + getItems() { + return this.settings.hierarchyNotes; + } + getItemText(item) { + return `${item}`; + } + renderSuggestion(item, el) { + super.renderSuggestion(item, el); + } + onChooseItem(item, evt) { + new HierarchyNoteManipulator(this.app, this.plugin, item).open(); + this.close(); + } } -exports.dispatch = dispatch; +/* src\Components\Stats.svelte generated by Svelte v3.35.0 */ + +function add_css() { + var style = element("style"); + style.id = "svelte-rb5mhu-style"; + style.textContent = "table.svelte-rb5mhu{border-collapse:collapse}td.svelte-rb5mhu:first-child{text-align:right}td.svelte-rb5mhu,th.svelte-rb5mhu{padding:3px;border:1px solid var(--background-modifier-border);white-space:pre-line}"; + append(document.head, style); +} -Object.defineProperty(exports, '__esModule', { value: true }); +function get_each_context$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; +} -})); -}); +function get_each_context_1$1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; +} -var d3Selection = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-selection/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -var xhtml = "http://www.w3.org/1999/xhtml"; +function get_each_context_2(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; +} -var namespaces = { - svg: "http://www.w3.org/2000/svg", - xhtml: xhtml, - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" -}; +function get_each_context_3(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[35] = list[i]; + child_ctx[37] = i; + return child_ctx; +} -function namespace(name) { - var prefix = name += "", i = prefix.indexOf(":"); - if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); - return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins +function get_each_context_4(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; } -function creatorInherit(name) { - return function() { - var document = this.ownerDocument, - uri = this.namespaceURI; - return uri === xhtml && document.documentElement.namespaceURI === xhtml - ? document.createElement(name) - : document.createElementNS(uri, name); - }; +function get_each_context_5(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; } -function creatorFixed(fullname) { - return function() { - return this.ownerDocument.createElementNS(fullname.space, fullname.local); - }; +function get_each_context_6(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; } -function creator(name) { - var fullname = namespace(name); - return (fullname.local - ? creatorFixed - : creatorInherit)(fullname); +function get_each_context_7(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[28] = list[i]; + return child_ctx; } -function none() {} +// (94:4) {#each DIRECTIONS as dir} +function create_each_block_7(ctx) { + let td; + let t_value = ARROW_DIRECTIONS[/*dir*/ ctx[28]] + ""; + let t; -function selector(selector) { - return selector == null ? none : function() { - return this.querySelector(selector); - }; + return { + c() { + td = element("td"); + t = text(t_value); + attr(td, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, td, anchor); + append(td, t); + }, + p: noop, + d(detaching) { + if (detaching) detach(td); + } + }; } -function selection_select(select) { - if (typeof select !== "function") select = selector(select); +// (106:6) {#each DIRECTIONS as dir} +function create_each_block_6(ctx) { + let td; + let t0_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.nodes.length + ""; + let t0; + let t1; + let td_aria_label_value; + let mounted; + let dispose; - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { - if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { - if ("__data__" in node) subnode.__data__ = node.__data__; - subgroup[i] = subnode; - } - } - } + function click_handler_1() { + return /*click_handler_1*/ ctx[6](/*i*/ ctx[37], /*dir*/ ctx[28]); + } - return new Selection(subgroups, this._parents); -} + return { + c() { + td = element("td"); + t0 = text(t0_value); + t1 = space(); + attr(td, "aria-label-position", "left"); + attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.nodesStr); + attr(td, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, td, anchor); + append(td, t0); + append(td, t1); -function array(x) { - return typeof x === "object" && "length" in x - ? x // Array, TypedArray, NodeList, array-like - : Array.from(x); // Map, Set, iterable, string, or anything else + if (!mounted) { + dispose = listen(td, "click", click_handler_1); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + }, + d(detaching) { + if (detaching) detach(td); + mounted = false; + dispose(); + } + }; } -function empty() { - return []; -} +// (127:6) {#each DIRECTIONS as dir} +function create_each_block_5(ctx) { + let td; + let t0_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.edges.length + ""; + let t0; + let t1; + let td_aria_label_value; + let mounted; + let dispose; -function selectorAll(selector) { - return selector == null ? empty : function() { - return this.querySelectorAll(selector); - }; -} + function click_handler_3() { + return /*click_handler_3*/ ctx[9](/*i*/ ctx[37], /*dir*/ ctx[28]); + } -function arrayAll(select) { - return function() { - var group = select.apply(this, arguments); - return group == null ? [] : array(group); - }; + return { + c() { + td = element("td"); + t0 = text(t0_value); + t1 = space(); + attr(td, "aria-label-position", "left"); + attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Merged.edgesStr); + attr(td, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, td, anchor); + append(td, t0); + append(td, t1); + + if (!mounted) { + dispose = listen(td, "click", click_handler_3); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + }, + d(detaching) { + if (detaching) detach(td); + mounted = false; + dispose(); + } + }; } -function selection_selectAll(select) { - if (typeof select === "function") select = arrayAll(select); - else select = selectorAll(select); +// (148:6) {#each DIRECTIONS as dir} +function create_each_block_4(ctx) { + let td; + let t0_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Implied.edges.length + ""; + let t0; + let t1; + let td_aria_label_value; + let mounted; + let dispose; - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - subgroups.push(select.call(node, node.__data__, i, group)); - parents.push(node); - } - } - } + function click_handler_5() { + return /*click_handler_5*/ ctx[12](/*i*/ ctx[37], /*dir*/ ctx[28]); + } - return new Selection(subgroups, parents); -} + return { + c() { + td = element("td"); + t0 = text(t0_value); + t1 = space(); + attr(td, "aria-label-position", "left"); + attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2][/*i*/ ctx[37]][/*dir*/ ctx[28]].Implied.edgesStr); + attr(td, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, td, anchor); + append(td, t0); + append(td, t1); -function matcher(selector) { - return function() { - return this.matches(selector); - }; + if (!mounted) { + dispose = listen(td, "click", click_handler_5); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + }, + d(detaching) { + if (detaching) detach(td); + mounted = false; + dispose(); + } + }; } -function childMatcher(selector) { - return function(node) { - return node.matches(selector); - }; -} +// (100:2) {#each userHiers as hier, i} +function create_each_block_3(ctx) { + let tr0; + let td0; + let t0_value = /*hierStrs*/ ctx[4][/*i*/ ctx[37]] + ""; + let t0; + let t1; + let td1; + let t3; + let t4; + let td2; + let t5_value = lodash.sum(DIRECTIONS$1.map(func)) + ""; + let t5; + let td2_aria_label_value; + let t6; + let tr1; + let td3; + let t8; + let t9; + let td4; + let t10_value = lodash.sum(DIRECTIONS$1.map(func_1)) + ""; + let t10; + let td4_aria_label_value; + let t11; + let tr2; + let td5; + let t13; + let t14; + let td6; + let t15_value = lodash.sum(DIRECTIONS$1.map(func_2)) + ""; + let t15; + let td6_aria_label_value; + let mounted; + let dispose; + let each_value_6 = DIRECTIONS$1; + let each_blocks_2 = []; -var find = Array.prototype.find; + for (let i = 0; i < each_value_6.length; i += 1) { + each_blocks_2[i] = create_each_block_6(get_each_context_6(ctx, each_value_6, i)); + } -function childFind(match) { - return function() { - return find.call(this.children, match); - }; -} + function func(...args) { + return /*func*/ ctx[7](/*i*/ ctx[37], ...args); + } -function childFirst() { - return this.firstElementChild; -} + function click_handler_2() { + return /*click_handler_2*/ ctx[8](/*i*/ ctx[37]); + } -function selection_selectChild(match) { - return this.select(match == null ? childFirst - : childFind(typeof match === "function" ? match : childMatcher(match))); -} + let each_value_5 = DIRECTIONS$1; + let each_blocks_1 = []; -var filter = Array.prototype.filter; + for (let i = 0; i < each_value_5.length; i += 1) { + each_blocks_1[i] = create_each_block_5(get_each_context_5(ctx, each_value_5, i)); + } -function children() { - return this.children; -} + function func_1(...args) { + return /*func_1*/ ctx[10](/*i*/ ctx[37], ...args); + } -function childrenFilter(match) { - return function() { - return filter.call(this.children, match); - }; -} + function click_handler_4() { + return /*click_handler_4*/ ctx[11](/*i*/ ctx[37]); + } -function selection_selectChildren(match) { - return this.selectAll(match == null ? children - : childrenFilter(typeof match === "function" ? match : childMatcher(match))); -} + let each_value_4 = DIRECTIONS$1; + let each_blocks = []; -function selection_filter(match) { - if (typeof match !== "function") match = matcher(match); + for (let i = 0; i < each_value_4.length; i += 1) { + each_blocks[i] = create_each_block_4(get_each_context_4(ctx, each_value_4, i)); + } - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { - if ((node = group[i]) && match.call(node, node.__data__, i, group)) { - subgroup.push(node); - } - } - } + function func_2(...args) { + return /*func_2*/ ctx[13](/*i*/ ctx[37], ...args); + } - return new Selection(subgroups, this._parents); -} + function click_handler_6() { + return /*click_handler_6*/ ctx[14](/*i*/ ctx[37]); + } -function sparse(update) { - return new Array(update.length); -} + return { + c() { + tr0 = element("tr"); + td0 = element("td"); + t0 = text(t0_value); + t1 = space(); + td1 = element("td"); + td1.textContent = "Nodes"; + t3 = space(); -function selection_enter() { - return new Selection(this._enter || this._groups.map(sparse), this._parents); -} + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } -function EnterNode(parent, datum) { - this.ownerDocument = parent.ownerDocument; - this.namespaceURI = parent.namespaceURI; - this._next = null; - this._parent = parent; - this.__data__ = datum; -} + t4 = space(); + td2 = element("td"); + t5 = text(t5_value); + t6 = space(); + tr1 = element("tr"); + td3 = element("td"); + td3.textContent = "Real Edges"; + t8 = space(); -EnterNode.prototype = { - constructor: EnterNode, - appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, - insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, - querySelector: function(selector) { return this._parent.querySelector(selector); }, - querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } -}; + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } -function constant(x) { - return function() { - return x; - }; -} + t9 = space(); + td4 = element("td"); + t10 = text(t10_value); + t11 = space(); + tr2 = element("tr"); + td5 = element("td"); + td5.textContent = "Implied Edges"; + t13 = space(); -function bindIndex(parent, group, enter, update, exit, data) { - var i = 0, - node, - groupLength = group.length, - dataLength = data.length; + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - // Put any non-null nodes that fit into update. - // Put any null nodes into enter. - // Put any remaining data into enter. - for (; i < dataLength; ++i) { - if (node = group[i]) { - node.__data__ = data[i]; - update[i] = node; - } else { - enter[i] = new EnterNode(parent, data[i]); - } - } + t14 = space(); + td6 = element("td"); + t15 = text(t15_value); + attr(td0, "rowspan", "3"); + attr(td0, "class", "svelte-rb5mhu"); + attr(td1, "class", "svelte-rb5mhu"); + attr(td2, "aria-label-position", "left"); + attr(td2, "aria-label", td2_aria_label_value = /*cellStr*/ ctx[3](/*i*/ ctx[37], "Merged", "nodesStr")); + attr(td2, "class", "svelte-rb5mhu"); + attr(td3, "class", "svelte-rb5mhu"); + attr(td4, "aria-label-position", "left"); + attr(td4, "aria-label", td4_aria_label_value = /*cellStr*/ ctx[3](/*i*/ ctx[37], "Merged", "edgesStr")); + attr(td4, "class", "svelte-rb5mhu"); + attr(td5, "class", "svelte-rb5mhu"); + attr(td6, "aria-label-position", "left"); + attr(td6, "aria-label", td6_aria_label_value = /*cellStr*/ ctx[3](/*i*/ ctx[37], "Implied", "edgesStr")); + attr(td6, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, tr0, anchor); + append(tr0, td0); + append(td0, t0); + append(tr0, t1); + append(tr0, td1); + append(tr0, t3); - // Put any non-null nodes that don’t fit into exit. - for (; i < groupLength; ++i) { - if (node = group[i]) { - exit[i] = node; - } - } -} + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(tr0, null); + } -function bindKey(parent, group, enter, update, exit, data, key) { - var i, - node, - nodeByKeyValue = new Map, - groupLength = group.length, - dataLength = data.length, - keyValues = new Array(groupLength), - keyValue; + append(tr0, t4); + append(tr0, td2); + append(td2, t5); + insert(target, t6, anchor); + insert(target, tr1, anchor); + append(tr1, td3); + append(tr1, t8); - // Compute the key for each node. - // If multiple nodes have the same key, the duplicates are added to exit. - for (i = 0; i < groupLength; ++i) { - if (node = group[i]) { - keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; - if (nodeByKeyValue.has(keyValue)) { - exit[i] = node; - } else { - nodeByKeyValue.set(keyValue, node); - } - } - } + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(tr1, null); + } - // Compute the key for each datum. - // If there a node associated with this key, join and add it to update. - // If there is not (or the key is a duplicate), add it to enter. - for (i = 0; i < dataLength; ++i) { - keyValue = key.call(parent, data[i], i, data) + ""; - if (node = nodeByKeyValue.get(keyValue)) { - update[i] = node; - node.__data__ = data[i]; - nodeByKeyValue.delete(keyValue); - } else { - enter[i] = new EnterNode(parent, data[i]); - } - } + append(tr1, t9); + append(tr1, td4); + append(td4, t10); + insert(target, t11, anchor); + insert(target, tr2, anchor); + append(tr2, td5); + append(tr2, t13); - // Add any remaining nodes that were not bound to data to exit. - for (i = 0; i < groupLength; ++i) { - if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) { - exit[i] = node; - } - } -} + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(tr2, null); + } -function datum(node) { - return node.__data__; -} + append(tr2, t14); + append(tr2, td6); + append(td6, t15); -function selection_data(value, key) { - if (!arguments.length) return Array.from(this, datum); + if (!mounted) { + dispose = [ + listen(td2, "click", click_handler_2), + listen(td4, "click", click_handler_4), + listen(td6, "click", click_handler_6) + ]; - var bind = key ? bindKey : bindIndex, - parents = this._parents, - groups = this._groups; + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; - if (typeof value !== "function") value = constant(value); + if (dirty[0] & /*data*/ 4) { + each_value_6 = DIRECTIONS$1; + let i; - for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { - var parent = parents[j], - group = groups[j], - groupLength = group.length, - data = array(value.call(parent, parent && parent.__data__, j, parents)), - dataLength = data.length, - enterGroup = enter[j] = new Array(dataLength), - updateGroup = update[j] = new Array(dataLength), - exitGroup = exit[j] = new Array(groupLength); + for (i = 0; i < each_value_6.length; i += 1) { + const child_ctx = get_each_context_6(ctx, each_value_6, i); - bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); + if (each_blocks_2[i]) { + each_blocks_2[i].p(child_ctx, dirty); + } else { + each_blocks_2[i] = create_each_block_6(child_ctx); + each_blocks_2[i].c(); + each_blocks_2[i].m(tr0, t4); + } + } - // Now connect the enter nodes to their following update node, such that - // appendChild can insert the materialized enter node before this node, - // rather than at the end of the parent node. - for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { - if (previous = enterGroup[i0]) { - if (i0 >= i1) i1 = i0 + 1; - while (!(next = updateGroup[i1]) && ++i1 < dataLength); - previous._next = next || null; - } - } - } + for (; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(1); + } - update = new Selection(update, parents); - update._enter = enter; - update._exit = exit; - return update; -} + each_blocks_2.length = each_value_6.length; + } -function selection_exit() { - return new Selection(this._exit || this._groups.map(sparse), this._parents); -} + if (dirty[0] & /*data*/ 4) { + each_value_5 = DIRECTIONS$1; + let i; -function selection_join(onenter, onupdate, onexit) { - var enter = this.enter(), update = this, exit = this.exit(); - enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); - if (onupdate != null) update = onupdate(update); - if (onexit == null) exit.remove(); else onexit(exit); - return enter && update ? enter.merge(update).order() : update; -} + for (i = 0; i < each_value_5.length; i += 1) { + const child_ctx = get_each_context_5(ctx, each_value_5, i); -function selection_merge(selection) { - if (!(selection instanceof Selection)) throw new Error("invalid merge"); + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_5(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(tr1, t9); + } + } - for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { - for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group0[i] || group1[i]) { - merge[i] = node; - } - } - } + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } - for (; j < m0; ++j) { - merges[j] = groups0[j]; - } + each_blocks_1.length = each_value_5.length; + } - return new Selection(merges, this._parents); -} + if (dirty[0] & /*data*/ 4) { + each_value_4 = DIRECTIONS$1; + let i; -function selection_order() { + for (i = 0; i < each_value_4.length; i += 1) { + const child_ctx = get_each_context_4(ctx, each_value_4, i); - for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { - for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { - if (node = group[i]) { - if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); - next = node; - } - } - } + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_4(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(tr2, t14); + } + } - return this; + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value_4.length; + } + }, + d(detaching) { + if (detaching) detach(tr0); + destroy_each(each_blocks_2, detaching); + if (detaching) detach(t6); + if (detaching) detach(tr1); + destroy_each(each_blocks_1, detaching); + if (detaching) detach(t11); + if (detaching) detach(tr2); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + } + }; } -function selection_sort(compare) { - if (!compare) compare = ascending; +// (171:4) {#each DIRECTIONS as dir} +function create_each_block_2(ctx) { + let td; + let t0_value = lodash.sum(/*data*/ ctx[2].map(func_3)) + ""; + let t0; + let t1; + let td_aria_label_value; + let mounted; + let dispose; - function compareNode(a, b) { - return a && b ? compare(a.__data__, b.__data__) : !a - !b; - } + function func_3(...args) { + return /*func_3*/ ctx[15](/*dir*/ ctx[28], ...args); + } - for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group[i]) { - sortgroup[i] = node; - } - } - sortgroup.sort(compareNode); - } + function func_4(...args) { + return /*func_4*/ ctx[16](/*dir*/ ctx[28], ...args); + } - return new Selection(sortgroups, this._parents).order(); -} + function click_handler_7() { + return /*click_handler_7*/ ctx[17](/*dir*/ ctx[28]); + } -function ascending(a, b) { - return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; -} + return { + c() { + td = element("td"); + t0 = text(t0_value); + t1 = space(); + attr(td, "aria-label-position", "left"); + attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2].map(func_4).join("\n")); + attr(td, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, td, anchor); + append(td, t0); + append(td, t1); -function selection_call() { - var callback = arguments[0]; - arguments[0] = this; - callback.apply(null, arguments); - return this; + if (!mounted) { + dispose = listen(td, "click", click_handler_7); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + }, + d(detaching) { + if (detaching) detach(td); + mounted = false; + dispose(); + } + }; } -function selection_nodes() { - return Array.from(this); -} +// (213:4) {#each DIRECTIONS as dir} +function create_each_block_1$1(ctx) { + let td; + let t0_value = lodash.sum(/*data*/ ctx[2].map(func_5)) + ""; + let t0; + let t1; + let td_aria_label_value; + let mounted; + let dispose; + + function func_5(...args) { + return /*func_5*/ ctx[18](/*dir*/ ctx[28], ...args); + } -function selection_node() { + function func_6(...args) { + return /*func_6*/ ctx[19](/*dir*/ ctx[28], ...args); + } - for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { - for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { - var node = group[i]; - if (node) return node; - } - } + function click_handler_8() { + return /*click_handler_8*/ ctx[20](/*dir*/ ctx[28]); + } - return null; -} + return { + c() { + td = element("td"); + t0 = text(t0_value); + t1 = space(); + attr(td, "aria-label-position", "left"); + attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2].map(func_6).join("\n")); + attr(td, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, td, anchor); + append(td, t0); + append(td, t1); -function selection_size() { - let size = 0; - for (const node of this) ++size; // eslint-disable-line no-unused-vars - return size; + if (!mounted) { + dispose = listen(td, "click", click_handler_8); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + }, + d(detaching) { + if (detaching) detach(td); + mounted = false; + dispose(); + } + }; } -function selection_empty() { - return !this.node(); -} +// (251:4) {#each DIRECTIONS as dir} +function create_each_block$1(ctx) { + let td; + let t0_value = lodash.sum(/*data*/ ctx[2].map(func_7)) + ""; + let t0; + let t1; + let td_aria_label_value; + let mounted; + let dispose; -function selection_each(callback) { + function func_7(...args) { + return /*func_7*/ ctx[21](/*dir*/ ctx[28], ...args); + } - for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { - for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { - if (node = group[i]) callback.call(node, node.__data__, i, group); - } - } + function func_8(...args) { + return /*func_8*/ ctx[22](/*dir*/ ctx[28], ...args); + } - return this; -} + function click_handler_9() { + return /*click_handler_9*/ ctx[23](/*dir*/ ctx[28]); + } -function attrRemove(name) { - return function() { - this.removeAttribute(name); - }; -} + return { + c() { + td = element("td"); + t0 = text(t0_value); + t1 = space(); + attr(td, "aria-label-position", "left"); + attr(td, "aria-label", td_aria_label_value = /*data*/ ctx[2].map(func_8).join("\n")); + attr(td, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, td, anchor); + append(td, t0); + append(td, t1); -function attrRemoveNS(fullname) { - return function() { - this.removeAttributeNS(fullname.space, fullname.local); - }; + if (!mounted) { + dispose = listen(td, "click", click_handler_9); + mounted = true; + } + }, + p(new_ctx, dirty) { + ctx = new_ctx; + }, + d(detaching) { + if (detaching) detach(td); + mounted = false; + dispose(); + } + }; } -function attrConstant(name, value) { - return function() { - this.setAttribute(name, value); - }; -} +function create_fragment$1(ctx) { + let table; + let thead; + let tr0; + let th0; + let t1; + let th1; + let t2; + let t3; + let tr1; + let td0; + let button; + let t5; + let td1; + let t7; + let t8; + let td2; + let t10; + let t11; + let tr2; + let td3; + let t13; + let td4; + let t15; + let t16; + let tr3; + let td5; + let t18; + let t19; + let tr4; + let td6; + let t21; + let mounted; + let dispose; + let each_value_7 = DIRECTIONS$1; + let each_blocks_4 = []; -function attrConstantNS(fullname, value) { - return function() { - this.setAttributeNS(fullname.space, fullname.local, value); - }; -} + for (let i = 0; i < each_value_7.length; i += 1) { + each_blocks_4[i] = create_each_block_7(get_each_context_7(ctx, each_value_7, i)); + } -function attrFunction(name, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) this.removeAttribute(name); - else this.setAttribute(name, v); - }; -} + let each_value_3 = /*userHiers*/ ctx[1]; + let each_blocks_3 = []; -function attrFunctionNS(fullname, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) this.removeAttributeNS(fullname.space, fullname.local); - else this.setAttributeNS(fullname.space, fullname.local, v); - }; -} + for (let i = 0; i < each_value_3.length; i += 1) { + each_blocks_3[i] = create_each_block_3(get_each_context_3(ctx, each_value_3, i)); + } -function selection_attr(name, value) { - var fullname = namespace(name); + let each_value_2 = DIRECTIONS$1; + let each_blocks_2 = []; - if (arguments.length < 2) { - var node = this.node(); - return fullname.local - ? node.getAttributeNS(fullname.space, fullname.local) - : node.getAttribute(fullname); - } + for (let i = 0; i < each_value_2.length; i += 1) { + each_blocks_2[i] = create_each_block_2(get_each_context_2(ctx, each_value_2, i)); + } - return this.each((value == null - ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" - ? (fullname.local ? attrFunctionNS : attrFunction) - : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); -} + let each_value_1 = DIRECTIONS$1; + let each_blocks_1 = []; -function defaultView(node) { - return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node - || (node.document && node) // node is a Window - || node.defaultView; // node is a Document -} + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks_1[i] = create_each_block_1$1(get_each_context_1$1(ctx, each_value_1, i)); + } -function styleRemove(name) { - return function() { - this.style.removeProperty(name); - }; -} + let each_value = DIRECTIONS$1; + let each_blocks = []; -function styleConstant(name, value, priority) { - return function() { - this.style.setProperty(name, value, priority); - }; -} + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); + } -function styleFunction(name, value, priority) { - return function() { - var v = value.apply(this, arguments); - if (v == null) this.style.removeProperty(name); - else this.style.setProperty(name, v, priority); - }; -} + return { + c() { + table = element("table"); + thead = element("thead"); + tr0 = element("tr"); + th0 = element("th"); + th0.textContent = "Hierarchy"; + t1 = space(); + th1 = element("th"); + t2 = text("Count"); + t3 = space(); + tr1 = element("tr"); + td0 = element("td"); + button = element("button"); + button.textContent = "↻"; + t5 = space(); + td1 = element("td"); + td1.textContent = "Measure"; + t7 = space(); + + for (let i = 0; i < each_blocks_4.length; i += 1) { + each_blocks_4[i].c(); + } -function selection_style(name, value, priority) { - return arguments.length > 1 - ? this.each((value == null - ? styleRemove : typeof value === "function" - ? styleFunction - : styleConstant)(name, value, priority == null ? "" : priority)) - : styleValue(this.node(), name); -} + t8 = space(); + td2 = element("td"); + td2.textContent = "Total"; + t10 = space(); -function styleValue(node, name) { - return node.style.getPropertyValue(name) - || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); -} + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].c(); + } -function propertyRemove(name) { - return function() { - delete this[name]; - }; -} + t11 = space(); + tr2 = element("tr"); + td3 = element("td"); + td3.textContent = "Totals"; + t13 = space(); + td4 = element("td"); + td4.textContent = "Nodes"; + t15 = space(); -function propertyConstant(name, value) { - return function() { - this[name] = value; - }; -} + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].c(); + } -function propertyFunction(name, value) { - return function() { - var v = value.apply(this, arguments); - if (v == null) delete this[name]; - else this[name] = v; - }; -} + t16 = space(); + tr3 = element("tr"); + td5 = element("td"); + td5.textContent = "Real Edges"; + t18 = space(); -function selection_property(name, value) { - return arguments.length > 1 - ? this.each((value == null - ? propertyRemove : typeof value === "function" - ? propertyFunction - : propertyConstant)(name, value)) - : this.node()[name]; -} + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].c(); + } -function classArray(string) { - return string.trim().split(/^|\s+/); -} + t19 = space(); + tr4 = element("tr"); + td6 = element("td"); + td6.textContent = "Implied Edges"; + t21 = space(); -function classList(node) { - return node.classList || new ClassList(node); -} + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } -function ClassList(node) { - this._node = node; - this._names = classArray(node.getAttribute("class") || ""); -} + attr(th0, "scope", "col"); + attr(th0, "class", "svelte-rb5mhu"); + attr(th1, "scope", "col"); + attr(th1, "colspan", DIRECTIONS$1.length + 2); + attr(th1, "class", "svelte-rb5mhu"); + attr(button, "class", "icon"); + attr(button, "aria-label", "Refresh Stats View (also refreshes Breadcrumbs Index)"); + attr(td0, "class", "svelte-rb5mhu"); + attr(td1, "class", "svelte-rb5mhu"); + attr(td2, "class", "svelte-rb5mhu"); + attr(td3, "rowspan", "3"); + attr(td3, "class", "svelte-rb5mhu"); + attr(td4, "class", "svelte-rb5mhu"); + attr(td5, "class", "svelte-rb5mhu"); + attr(td6, "class", "svelte-rb5mhu"); + attr(table, "class", "svelte-rb5mhu"); + }, + m(target, anchor) { + insert(target, table, anchor); + append(table, thead); + append(thead, tr0); + append(tr0, th0); + append(tr0, t1); + append(tr0, th1); + append(th1, t2); + append(table, t3); + append(table, tr1); + append(tr1, td0); + append(td0, button); + append(tr1, t5); + append(tr1, td1); + append(tr1, t7); -ClassList.prototype = { - add: function(name) { - var i = this._names.indexOf(name); - if (i < 0) { - this._names.push(name); - this._node.setAttribute("class", this._names.join(" ")); - } - }, - remove: function(name) { - var i = this._names.indexOf(name); - if (i >= 0) { - this._names.splice(i, 1); - this._node.setAttribute("class", this._names.join(" ")); - } - }, - contains: function(name) { - return this._names.indexOf(name) >= 0; - } -}; + for (let i = 0; i < each_blocks_4.length; i += 1) { + each_blocks_4[i].m(tr1, null); + } -function classedAdd(node, names) { - var list = classList(node), i = -1, n = names.length; - while (++i < n) list.add(names[i]); -} + append(tr1, t8); + append(tr1, td2); + append(table, t10); -function classedRemove(node, names) { - var list = classList(node), i = -1, n = names.length; - while (++i < n) list.remove(names[i]); -} + for (let i = 0; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].m(table, null); + } -function classedTrue(names) { - return function() { - classedAdd(this, names); - }; -} + append(table, t11); + append(table, tr2); + append(tr2, td3); + append(tr2, t13); + append(tr2, td4); + append(tr2, t15); -function classedFalse(names) { - return function() { - classedRemove(this, names); - }; -} + for (let i = 0; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].m(tr2, null); + } -function classedFunction(names, value) { - return function() { - (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); - }; -} + append(table, t16); + append(table, tr3); + append(tr3, td5); + append(tr3, t18); -function selection_classed(name, value) { - var names = classArray(name + ""); + for (let i = 0; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].m(tr3, null); + } - if (arguments.length < 2) { - var list = classList(this.node()), i = -1, n = names.length; - while (++i < n) if (!list.contains(names[i])) return false; - return true; - } + append(table, t19); + append(table, tr4); + append(tr4, td6); + append(tr4, t21); - return this.each((typeof value === "function" - ? classedFunction : value - ? classedTrue - : classedFalse)(names, value)); -} + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(tr4, null); + } -function textRemove() { - this.textContent = ""; -} + if (!mounted) { + dispose = listen(button, "click", /*click_handler*/ ctx[5]); + mounted = true; + } + }, + p(ctx, dirty) { + if (dirty & /*ARROW_DIRECTIONS, DIRECTIONS*/ 0) { + each_value_7 = DIRECTIONS$1; + let i; -function textConstant(value) { - return function() { - this.textContent = value; - }; -} + for (i = 0; i < each_value_7.length; i += 1) { + const child_ctx = get_each_context_7(ctx, each_value_7, i); -function textFunction(value) { - return function() { - var v = value.apply(this, arguments); - this.textContent = v == null ? "" : v; - }; -} + if (each_blocks_4[i]) { + each_blocks_4[i].p(child_ctx, dirty); + } else { + each_blocks_4[i] = create_each_block_7(child_ctx); + each_blocks_4[i].c(); + each_blocks_4[i].m(tr1, t8); + } + } -function selection_text(value) { - return arguments.length - ? this.each(value == null - ? textRemove : (typeof value === "function" - ? textFunction - : textConstant)(value)) - : this.node().textContent; -} + for (; i < each_blocks_4.length; i += 1) { + each_blocks_4[i].d(1); + } -function htmlRemove() { - this.innerHTML = ""; -} + each_blocks_4.length = each_value_7.length; + } -function htmlConstant(value) { - return function() { - this.innerHTML = value; - }; -} + if (dirty[0] & /*cellStr, data, hierStrs*/ 28) { + each_value_3 = /*userHiers*/ ctx[1]; + let i; -function htmlFunction(value) { - return function() { - var v = value.apply(this, arguments); - this.innerHTML = v == null ? "" : v; - }; -} + for (i = 0; i < each_value_3.length; i += 1) { + const child_ctx = get_each_context_3(ctx, each_value_3, i); -function selection_html(value) { - return arguments.length - ? this.each(value == null - ? htmlRemove : (typeof value === "function" - ? htmlFunction - : htmlConstant)(value)) - : this.node().innerHTML; -} + if (each_blocks_3[i]) { + each_blocks_3[i].p(child_ctx, dirty); + } else { + each_blocks_3[i] = create_each_block_3(child_ctx); + each_blocks_3[i].c(); + each_blocks_3[i].m(table, t11); + } + } -function raise() { - if (this.nextSibling) this.parentNode.appendChild(this); -} + for (; i < each_blocks_3.length; i += 1) { + each_blocks_3[i].d(1); + } -function selection_raise() { - return this.each(raise); -} + each_blocks_3.length = each_value_3.length; + } -function lower() { - if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); -} + if (dirty[0] & /*data*/ 4) { + each_value_2 = DIRECTIONS$1; + let i; -function selection_lower() { - return this.each(lower); -} + for (i = 0; i < each_value_2.length; i += 1) { + const child_ctx = get_each_context_2(ctx, each_value_2, i); -function selection_append(name) { - var create = typeof name === "function" ? name : creator(name); - return this.select(function() { - return this.appendChild(create.apply(this, arguments)); - }); -} + if (each_blocks_2[i]) { + each_blocks_2[i].p(child_ctx, dirty); + } else { + each_blocks_2[i] = create_each_block_2(child_ctx); + each_blocks_2[i].c(); + each_blocks_2[i].m(tr2, null); + } + } -function constantNull() { - return null; -} + for (; i < each_blocks_2.length; i += 1) { + each_blocks_2[i].d(1); + } -function selection_insert(name, before) { - var create = typeof name === "function" ? name : creator(name), - select = before == null ? constantNull : typeof before === "function" ? before : selector(before); - return this.select(function() { - return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); - }); -} + each_blocks_2.length = each_value_2.length; + } -function remove() { - var parent = this.parentNode; - if (parent) parent.removeChild(this); -} + if (dirty[0] & /*data*/ 4) { + each_value_1 = DIRECTIONS$1; + let i; -function selection_remove() { - return this.each(remove); -} + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_1$1(ctx, each_value_1, i); -function selection_cloneShallow() { - var clone = this.cloneNode(false), parent = this.parentNode; - return parent ? parent.insertBefore(clone, this.nextSibling) : clone; -} + if (each_blocks_1[i]) { + each_blocks_1[i].p(child_ctx, dirty); + } else { + each_blocks_1[i] = create_each_block_1$1(child_ctx); + each_blocks_1[i].c(); + each_blocks_1[i].m(tr3, null); + } + } -function selection_cloneDeep() { - var clone = this.cloneNode(true), parent = this.parentNode; - return parent ? parent.insertBefore(clone, this.nextSibling) : clone; -} + for (; i < each_blocks_1.length; i += 1) { + each_blocks_1[i].d(1); + } -function selection_clone(deep) { - return this.select(deep ? selection_cloneDeep : selection_cloneShallow); -} + each_blocks_1.length = each_value_1.length; + } -function selection_datum(value) { - return arguments.length - ? this.property("__data__", value) - : this.node().__data__; -} + if (dirty[0] & /*data*/ 4) { + each_value = DIRECTIONS$1; + let i; -function contextListener(listener) { - return function(event) { - listener.call(this, event, this.__data__); - }; -} + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$1(ctx, each_value, i); -function parseTypenames(typenames) { - return typenames.trim().split(/^|\s+/).map(function(t) { - var name = "", i = t.indexOf("."); - if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); - return {type: t, name: name}; - }); -} + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$1(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(tr4, null); + } + } -function onRemove(typename) { - return function() { - var on = this.__on; - if (!on) return; - for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { - if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.options); - } else { - on[++i] = o; - } - } - if (++i) on.length = i; - else delete this.__on; - }; -} + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } -function onAdd(typename, value, options) { - return function() { - var on = this.__on, o, listener = contextListener(value); - if (on) for (var j = 0, m = on.length; j < m; ++j) { - if ((o = on[j]).type === typename.type && o.name === typename.name) { - this.removeEventListener(o.type, o.listener, o.options); - this.addEventListener(o.type, o.listener = listener, o.options = options); - o.value = value; - return; - } - } - this.addEventListener(typename.type, listener, options); - o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options}; - if (!on) this.__on = [o]; - else on.push(o); - }; + each_blocks.length = each_value.length; + } + }, + i: noop, + o: noop, + d(detaching) { + if (detaching) detach(table); + destroy_each(each_blocks_4, detaching); + destroy_each(each_blocks_3, detaching); + destroy_each(each_blocks_2, detaching); + destroy_each(each_blocks_1, detaching); + destroy_each(each_blocks, detaching); + mounted = false; + dispose(); + } + }; } -function selection_on(typename, value, options) { - var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; +function instance$1($$self, $$props, $$invalidate) { + + + let { plugin } = $$props; + const { settings, mainG } = plugin; + const { userHiers } = settings; + const db = new Debugger(plugin); + db.start2G("StatsView"); - if (arguments.length < 2) { - var on = this.node().__on; - if (on) for (var j = 0, m = on.length, o; j < m; ++j) { - for (i = 0, o = on[j]; i < n; ++i) { - if ((t = typenames[i]).type === o.type && t.name === o.name) { - return o.value; - } - } - } - return; - } + function fillInInfo(dir, gType, hierData, nodesToo = true) { + const gInfo = hierData[dir][gType]; + const { wikilinkIndex } = settings; - on = value ? onAdd : onRemove; - for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); - return this; -} + if (nodesToo) { + gInfo.nodes = gInfo.graph.nodes(); + gInfo.nodesStr = gInfo.nodes.map(n => makeWiki(n, wikilinkIndex)).join("\n"); + } -function dispatchEvent(node, type, params) { - var window = defaultView(node), - event = window.CustomEvent; + gInfo.edges = gInfo.graph.edges(); + const edgeStrArr = gInfo.graph.mapEdges((k, a, s, t) => `${makeWiki(nodesToo ? s : t, wikilinkIndex)} ${ARROW_DIRECTIONS[dir]} ${makeWiki(nodesToo ? t : s, wikilinkIndex)}`); + gInfo.edgesStr = edgeStrArr.join("\n"); + } - if (typeof event === "function") { - event = new event(type, params); - } else { - event = window.document.createEvent("Event"); - if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; - else event.initEvent(type, false, false); - } + const data = settings.userHiers.map(hier => { + const hierData = { + //@ts-ignore + up: { Merged: {}, Closed: {}, Implied: {} }, + //@ts-ignore + same: { Merged: {}, Closed: {}, Implied: {} }, + //@ts-ignore + down: { Merged: {}, Closed: {}, Implied: {} }, + //@ts-ignore + next: { Merged: {}, Closed: {}, Implied: {} }, + //@ts-ignore + prev: { Merged: {}, Closed: {}, Implied: {} } + }; - node.dispatchEvent(event); -} + DIRECTIONS$1.forEach(dir => { + // Merged Graphs + /// Smoosh all fieldGs from one dir into a merged graph for that direction as a whole + const mergedInDir = getSubForFields(mainG, hier[dir]); -function dispatchConstant(type, params) { - return function() { - return dispatchEvent(this, type, params); - }; -} + const mergedInOppDir = getSubForFields(mainG, hier[getOppDir(dir)]); + hierData[dir].Merged.graph = mergedInDir; + fillInInfo(dir, "Merged", hierData); -function dispatchFunction(type, params) { - return function() { - return dispatchEvent(this, type, params.apply(this, arguments)); - }; -} + // Closed graphs + if (dir !== "same") { + hierData[dir].Closed.graph = closeImpliedLinks(mergedInDir, mergedInOppDir); + } else { + hierData[dir].Closed.graph = closeImpliedLinks(mergedInDir, mergedInDir); + } -function selection_dispatch(type, params) { - return this.each((typeof params === "function" - ? dispatchFunction - : dispatchConstant)(type, params)); -} + fillInInfo(dir, "Closed", hierData); -function* selection_iterator() { - for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { - for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { - if (node = group[i]) yield node; - } - } -} + if (dir !== "same") { + hierData[dir].Implied.graph = mergedInOppDir; + } else { + hierData[dir].Implied.graph = closeImpliedLinks(mergedInDir, mergedInDir); + } -var root = [null]; + fillInInfo(dir, "Implied", hierData, false); + }); -function Selection(groups, parents) { - this._groups = groups; - this._parents = parents; -} + return hierData; + }); -function selection() { - return new Selection([[document.documentElement]], root); -} + loglevel.debug({ data }); + const cellStr = (i, type, info) => DIRECTIONS$1.map(dir => data[i][dir][type][info]).join("\n"); + let hierStrs = userHiers.map(hierToStr); + db.end2G(); -function selection_selection() { - return this; -} + const click_handler = async () => { + await plugin.refreshIndex(); + await plugin.getActiveTYPEView(STATS_VIEW)?.draw(); + }; -Selection.prototype = selection.prototype = { - constructor: Selection, - select: selection_select, - selectAll: selection_selectAll, - selectChild: selection_selectChild, - selectChildren: selection_selectChildren, - filter: selection_filter, - data: selection_data, - enter: selection_enter, - exit: selection_exit, - join: selection_join, - merge: selection_merge, - selection: selection_selection, - order: selection_order, - sort: selection_sort, - call: selection_call, - nodes: selection_nodes, - node: selection_node, - size: selection_size, - empty: selection_empty, - each: selection_each, - attr: selection_attr, - style: selection_style, - property: selection_property, - classed: selection_classed, - text: selection_text, - html: selection_html, - raise: selection_raise, - lower: selection_lower, - append: selection_append, - insert: selection_insert, - remove: selection_remove, - clone: selection_clone, - datum: selection_datum, - on: selection_on, - dispatch: selection_dispatch, - [Symbol.iterator]: selection_iterator -}; + const click_handler_1 = async (i, dir) => await copy(data[i][dir].Merged.nodesStr); + const func = (i, dir) => data[i][dir].Merged.nodes.length; + const click_handler_2 = async i => await copy(cellStr(i, "Merged", "nodesStr")); + const click_handler_3 = async (i, dir) => await copy(data[i][dir].Merged.edgesStr); + const func_1 = (i, dir) => data[i][dir].Merged.edges.length; + const click_handler_4 = async i => await copy(cellStr(i, "Merged", "edgesStr")); + const click_handler_5 = async (i, dir) => await copy(data[i][dir].Implied.edgesStr); + const func_2 = (i, dir) => data[i][dir].Implied.edges.length; + const click_handler_6 = async i => await copy(cellStr(i, "Implied", "edgesStr")); + const func_3 = (dir, datum) => datum[dir].Merged.nodes.length; + const func_4 = (dir, datum) => datum[dir].Merged.nodesStr; + const click_handler_7 = async dir => await copy(data.map(datum => datum[dir].Merged.nodesStr).join("\n")); + const func_5 = (dir, datum) => datum[dir].Merged.edges.length; + const func_6 = (dir, datum) => datum[dir].Merged.edgesStr; + const click_handler_8 = async dir => await copy(data.map(datum => datum[dir].Merged.edgesStr).join("\n")); + const func_7 = (dir, datum) => datum[dir].Implied.edges.length; + const func_8 = (dir, datum) => datum[dir].Implied.edgesStr; + const click_handler_9 = async dir => await copy(data.map(datum => datum[dir].Implied.edgesStr).join("\n")); -function select(selector) { - return typeof selector === "string" - ? new Selection([[document.querySelector(selector)]], [document.documentElement]) - : new Selection([[selector]], root); -} + $$self.$$set = $$props => { + if ("plugin" in $$props) $$invalidate(0, plugin = $$props.plugin); + }; -function create(name) { - return select(creator(name).call(document.documentElement)); + return [ + plugin, + userHiers, + data, + cellStr, + hierStrs, + click_handler, + click_handler_1, + func, + click_handler_2, + click_handler_3, + func_1, + click_handler_4, + click_handler_5, + func_2, + click_handler_6, + func_3, + func_4, + click_handler_7, + func_5, + func_6, + click_handler_8, + func_7, + func_8, + click_handler_9 + ]; } -var nextId = 0; +class Stats extends SvelteComponent { + constructor(options) { + super(); + if (!document.getElementById("svelte-rb5mhu-style")) add_css(); + init(this, options, instance$1, create_fragment$1, safe_not_equal, { plugin: 0 }, [-1, -1]); + } +} -function local() { - return new Local; +class StatsView extends require$$0.ItemView { + constructor(leaf, plugin) { + super(leaf); + this.icon = "info"; + this.plugin = plugin; + } + async onload() { + super.onload(); + this.app.workspace.onLayoutReady(() => { + setTimeout(async () => await this.draw(), this.plugin.settings.dvWaitTime); + }); + } + getViewType() { + return STATS_VIEW; + } + getDisplayText() { + return "Breadcrumbs Stats"; + } + async onOpen() { + await this.plugin.saveSettings(); + } + onClose() { + var _a; + (_a = this.view) === null || _a === void 0 ? void 0 : _a.$destroy(); + return Promise.resolve(); + } + async draw() { + const { contentEl, plugin } = this; + contentEl.empty(); + this.view = new Stats({ + target: contentEl, + props: { plugin }, + }); + } } -function Local() { - this._ = "@" + (++nextId).toString(36); +var d3Array = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-array/ v2.12.1 Copyright 2021 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, (function (exports) { +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; } -Local.prototype = local.prototype = { - constructor: Local, - get: function(node) { - var id = this._; - while (!(id in node)) if (!(node = node.parentNode)) return; - return node[id]; - }, - set: function(node, value) { - return node[this._] = value; - }, - remove: function(node) { - return this._ in node && delete node[this._]; - }, - toString: function() { - return this._; - } -}; +function bisector(f) { + let delta = f; + let compare = f; -function sourceEvent(event) { - let sourceEvent; - while (sourceEvent = event.sourceEvent) event = sourceEvent; - return event; -} + if (f.length === 1) { + delta = (d, x) => f(d) - x; + compare = ascendingComparator(f); + } -function pointer(event, node) { - event = sourceEvent(event); - if (node === undefined) node = event.currentTarget; - if (node) { - var svg = node.ownerSVGElement || node; - if (svg.createSVGPoint) { - var point = svg.createSVGPoint(); - point.x = event.clientX, point.y = event.clientY; - point = point.matrixTransform(node.getScreenCTM().inverse()); - return [point.x, point.y]; + function left(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) < 0) lo = mid + 1; + else hi = mid; } - if (node.getBoundingClientRect) { - var rect = node.getBoundingClientRect(); - return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + return lo; + } + + function right(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + while (lo < hi) { + const mid = (lo + hi) >>> 1; + if (compare(a[mid], x) > 0) hi = mid; + else lo = mid + 1; } + return lo; } - return [event.pageX, event.pageY]; -} -function pointers(events, node) { - if (events.target) { // i.e., instanceof Event, not TouchList or iterable - events = sourceEvent(events); - if (node === undefined) node = events.currentTarget; - events = events.touches || [events]; + function center(a, x, lo, hi) { + if (lo == null) lo = 0; + if (hi == null) hi = a.length; + const i = left(a, x, lo, hi - 1); + return i > lo && delta(a[i - 1], x) > -delta(a[i], x) ? i - 1 : i; } - return Array.from(events, event => pointer(event, node)); -} -function selectAll(selector) { - return typeof selector === "string" - ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) - : new Selection([selector == null ? [] : array(selector)], root); + return {left, center, right}; } -exports.create = create; -exports.creator = creator; -exports.local = local; -exports.matcher = matcher; -exports.namespace = namespace; -exports.namespaces = namespaces; -exports.pointer = pointer; -exports.pointers = pointers; -exports.select = select; -exports.selectAll = selectAll; -exports.selection = selection; -exports.selector = selector; -exports.selectorAll = selectorAll; -exports.style = styleValue; -exports.window = defaultView; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); -}); - -var d3Drag = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-drag/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Dispatch, d3Selection) ; -}(commonjsGlobal, function (exports, d3Dispatch, d3Selection) { -function nopropagation(event) { - event.stopImmediatePropagation(); +function ascendingComparator(f) { + return (d, x) => ascending(f(d), x); } -function noevent(event) { - event.preventDefault(); - event.stopImmediatePropagation(); +function number(x) { + return x === null ? NaN : +x; } -function nodrag(view) { - var root = view.document.documentElement, - selection = d3Selection.select(view).on("dragstart.drag", noevent, true); - if ("onselectstart" in root) { - selection.on("selectstart.drag", noevent, true); +function* numbers(values, valueof) { + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + yield value; + } + } } else { - root.__noselect = root.style.MozUserSelect; - root.style.MozUserSelect = "none"; + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + yield value; + } + } } } -function yesdrag(view, noclick) { - var root = view.document.documentElement, - selection = d3Selection.select(view).on("dragstart.drag", null); - if (noclick) { - selection.on("click.drag", noevent, true); - setTimeout(function() { selection.on("click.drag", null); }, 0); - } - if ("onselectstart" in root) { - selection.on("selectstart.drag", null); +const ascendingBisect = bisector(ascending); +const bisectRight = ascendingBisect.right; +const bisectLeft = ascendingBisect.left; +const bisectCenter = bisector(number).center; + +function count(values, valueof) { + let count = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count; + } + } } else { - root.style.MozUserSelect = root.__noselect; - delete root.__noselect; + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count; + } + } } + return count; } -var constant = x => () => x; - -function DragEvent(type, { - sourceEvent, - subject, - target, - identifier, - active, - x, y, dx, dy, - dispatch -}) { - Object.defineProperties(this, { - type: {value: type, enumerable: true, configurable: true}, - sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, - subject: {value: subject, enumerable: true, configurable: true}, - target: {value: target, enumerable: true, configurable: true}, - identifier: {value: identifier, enumerable: true, configurable: true}, - active: {value: active, enumerable: true, configurable: true}, - x: {value: x, enumerable: true, configurable: true}, - y: {value: y, enumerable: true, configurable: true}, - dx: {value: dx, enumerable: true, configurable: true}, - dy: {value: dy, enumerable: true, configurable: true}, - _: {value: dispatch} - }); -} - -DragEvent.prototype.on = function() { - var value = this._.on.apply(this._, arguments); - return value === this._ ? this : value; -}; - -// Ignore right-click, since that should open the context menu. -function defaultFilter(event) { - return !event.ctrlKey && !event.button; +function length$1(array) { + return array.length | 0; } -function defaultContainer() { - return this.parentNode; +function empty(length) { + return !(length > 0); } -function defaultSubject(event, d) { - return d == null ? {x: event.x, y: event.y} : d; +function arrayify(values) { + return typeof values !== "object" || "length" in values ? values : Array.from(values); } -function defaultTouchable() { - return navigator.maxTouchPoints || ("ontouchstart" in this); +function reducer(reduce) { + return values => reduce(...values); } -function drag() { - var filter = defaultFilter, - container = defaultContainer, - subject = defaultSubject, - touchable = defaultTouchable, - gestures = {}, - listeners = d3Dispatch.dispatch("start", "drag", "end"), - active = 0, - mousedownx, - mousedowny, - mousemoving, - touchending, - clickDistance2 = 0; - - function drag(selection) { - selection - .on("mousedown.drag", mousedowned) - .filter(touchable) - .on("touchstart.drag", touchstarted) - .on("touchmove.drag", touchmoved) - .on("touchend.drag touchcancel.drag", touchended) - .style("touch-action", "none") - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); - } - - function mousedowned(event, d) { - if (touchending || !filter.call(this, event, d)) return; - var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); - if (!gesture) return; - d3Selection.select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); - nodrag(event.view); - nopropagation(event); - mousemoving = false; - mousedownx = event.clientX; - mousedowny = event.clientY; - gesture("start", event); - } - - function mousemoved(event) { - noevent(event); - if (!mousemoving) { - var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; - mousemoving = dx * dx + dy * dy > clickDistance2; +function cross(...values) { + const reduce = typeof values[values.length - 1] === "function" && reducer(values.pop()); + values = values.map(arrayify); + const lengths = values.map(length$1); + const j = values.length - 1; + const index = new Array(j + 1).fill(0); + const product = []; + if (j < 0 || lengths.some(empty)) return product; + while (true) { + product.push(index.map((j, i) => values[i][j])); + let i = j; + while (++index[i] === lengths[i]) { + if (i === 0) return reduce ? product.map(reduce) : product; + index[i--] = 0; } - gestures.mouse("drag", event); } +} - function mouseupped(event) { - d3Selection.select(event.view).on("mousemove.drag mouseup.drag", null); - yesdrag(event.view, mousemoving); - noevent(event); - gestures.mouse("end", event); - } +function cumsum(values, valueof) { + var sum = 0, index = 0; + return Float64Array.from(values, valueof === undefined + ? v => (sum += +v || 0) + : v => (sum += +valueof(v, index++, values) || 0)); +} - function touchstarted(event, d) { - if (!filter.call(this, event, d)) return; - var touches = event.changedTouches, - c = container.call(this, event, d), - n = touches.length, i, gesture; +function descending(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +} - for (i = 0; i < n; ++i) { - if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { - nopropagation(event); - gesture("start", event, touches[i]); +function variance(values, valueof) { + let count = 0; + let delta; + let mean = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + delta = value - mean; + mean += delta / ++count; + sum += delta * (value - mean); } } } + if (count > 1) return sum / (count - 1); +} - function touchmoved(event) { - var touches = event.changedTouches, - n = touches.length, i, gesture; +function deviation(values, valueof) { + const v = variance(values, valueof); + return v ? Math.sqrt(v) : v; +} - for (i = 0; i < n; ++i) { - if (gesture = gestures[touches[i].identifier]) { - noevent(event); - gesture("drag", event, touches[i]); +function extent(values, valueof) { + let min; + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null) { + if (min === undefined) { + if (value >= value) min = max = value; + } else { + if (min > value) min = value; + if (max < value) max = value; + } } } } + return [min, max]; +} - function touchended(event) { - var touches = event.changedTouches, - n = touches.length, i, gesture; - - if (touchending) clearTimeout(touchending); - touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! - for (i = 0; i < n; ++i) { - if (gesture = gestures[touches[i].identifier]) { - nopropagation(event); - gesture("end", event, touches[i]); +// https://github.com/python/cpython/blob/a74eea238f5baba15797e2e8b570d153bc8690a7/Modules/mathmodule.c#L1423 +class Adder { + constructor() { + this._partials = new Float64Array(32); + this._n = 0; + } + add(x) { + const p = this._partials; + let i = 0; + for (let j = 0; j < this._n && j < 32; j++) { + const y = p[j], + hi = x + y, + lo = Math.abs(x) < Math.abs(y) ? x - (hi - y) : y - (hi - x); + if (lo) p[i++] = lo; + x = hi; + } + p[i] = x; + this._n = i + 1; + return this; + } + valueOf() { + const p = this._partials; + let n = this._n, x, y, lo, hi = 0; + if (n > 0) { + hi = p[--n]; + while (n > 0) { + x = hi; + y = p[--n]; + hi = x + y; + lo = y - (hi - x); + if (lo) break; + } + if (n > 0 && ((lo < 0 && p[n - 1] < 0) || (lo > 0 && p[n - 1] > 0))) { + y = lo * 2; + x = hi + y; + if (y == x - hi) hi = x; } } + return hi; } +} - function beforestart(that, container, event, d, identifier, touch) { - var dispatch = listeners.copy(), - p = d3Selection.pointer(touch || event, container), dx, dy, - s; - - if ((s = subject.call(that, new DragEvent("beforestart", { - sourceEvent: event, - target: drag, - identifier, - active, - x: p[0], - y: p[1], - dx: 0, - dy: 0, - dispatch - }), d)) == null) return; - - dx = s.x - p[0] || 0; - dy = s.y - p[1] || 0; - - return function gesture(type, event, touch) { - var p0 = p, n; - switch (type) { - case "start": gestures[identifier] = gesture, n = active++; break; - case "end": delete gestures[identifier], --active; // nobreak - case "drag": p = d3Selection.pointer(touch || event, container), n = active; break; +function fsum(values, valueof) { + const adder = new Adder(); + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + adder.add(value); } - dispatch.call( - type, - that, - new DragEvent(type, { - sourceEvent: event, - subject: s, - target: drag, - identifier, - active: n, - x: p[0] + dx, - y: p[1] + dy, - dx: p[0] - p0[0], - dy: p[1] - p0[1], - dispatch - }), - d - ); - }; + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + adder.add(value); + } + } } + return +adder; +} - drag.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; - }; - - drag.container = function(_) { - return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; - }; - - drag.subject = function(_) { - return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; - }; - - drag.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; - }; +function fcumsum(values, valueof) { + const adder = new Adder(); + let index = -1; + return Float64Array.from(values, valueof === undefined + ? v => adder.add(+v || 0) + : v => adder.add(+valueof(v, ++index, values) || 0) + ); +} - drag.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? drag : value; - }; +class InternMap extends Map { + constructor(entries, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (entries != null) for (const [key, value] of entries) this.set(key, value); + } + get(key) { + return super.get(intern_get(this, key)); + } + has(key) { + return super.has(intern_get(this, key)); + } + set(key, value) { + return super.set(intern_set(this, key), value); + } + delete(key) { + return super.delete(intern_delete(this, key)); + } +} - drag.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); - }; +class InternSet extends Set { + constructor(values, key = keyof) { + super(); + Object.defineProperties(this, {_intern: {value: new Map()}, _key: {value: key}}); + if (values != null) for (const value of values) this.add(value); + } + has(value) { + return super.has(intern_get(this, value)); + } + add(value) { + return super.add(intern_set(this, value)); + } + delete(value) { + return super.delete(intern_delete(this, value)); + } +} - return drag; +function intern_get({_intern, _key}, value) { + const key = _key(value); + return _intern.has(key) ? _intern.get(key) : value; } -exports.drag = drag; -exports.dragDisable = nodrag; -exports.dragEnable = yesdrag; +function intern_set({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) return _intern.get(key); + _intern.set(key, value); + return value; +} -Object.defineProperty(exports, '__esModule', { value: true }); +function intern_delete({_intern, _key}, value) { + const key = _key(value); + if (_intern.has(key)) { + value = _intern.get(value); + _intern.delete(key); + } + return value; +} -})); -}); +function keyof(value) { + return value !== null && typeof value === "object" ? value.valueOf() : value; +} -var d3Color = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-color/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -function define(constructor, factory, prototype) { - constructor.prototype = factory.prototype = prototype; - prototype.constructor = constructor; +function identity(x) { + return x; } -function extend(parent, definition) { - var prototype = Object.create(parent.prototype); - for (var key in definition) prototype[key] = definition[key]; - return prototype; +function group(values, ...keys) { + return nest(values, identity, identity, keys); } -function Color() {} +function groups(values, ...keys) { + return nest(values, Array.from, identity, keys); +} -var darker = 0.7; -var brighter = 1 / darker; +function rollup(values, reduce, ...keys) { + return nest(values, identity, reduce, keys); +} -var reI = "\\s*([+-]?\\d+)\\s*", - reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", - reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", - reHex = /^#([0-9a-f]{3,8})$/, - reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), - reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), - reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), - reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), - reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), - reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); +function rollups(values, reduce, ...keys) { + return nest(values, Array.from, reduce, keys); +} -var named = { - aliceblue: 0xf0f8ff, - antiquewhite: 0xfaebd7, - aqua: 0x00ffff, - aquamarine: 0x7fffd4, - azure: 0xf0ffff, - beige: 0xf5f5dc, - bisque: 0xffe4c4, - black: 0x000000, - blanchedalmond: 0xffebcd, - blue: 0x0000ff, - blueviolet: 0x8a2be2, - brown: 0xa52a2a, - burlywood: 0xdeb887, - cadetblue: 0x5f9ea0, - chartreuse: 0x7fff00, - chocolate: 0xd2691e, - coral: 0xff7f50, - cornflowerblue: 0x6495ed, - cornsilk: 0xfff8dc, - crimson: 0xdc143c, - cyan: 0x00ffff, - darkblue: 0x00008b, - darkcyan: 0x008b8b, - darkgoldenrod: 0xb8860b, - darkgray: 0xa9a9a9, - darkgreen: 0x006400, - darkgrey: 0xa9a9a9, - darkkhaki: 0xbdb76b, - darkmagenta: 0x8b008b, - darkolivegreen: 0x556b2f, - darkorange: 0xff8c00, - darkorchid: 0x9932cc, - darkred: 0x8b0000, - darksalmon: 0xe9967a, - darkseagreen: 0x8fbc8f, - darkslateblue: 0x483d8b, - darkslategray: 0x2f4f4f, - darkslategrey: 0x2f4f4f, - darkturquoise: 0x00ced1, - darkviolet: 0x9400d3, - deeppink: 0xff1493, - deepskyblue: 0x00bfff, - dimgray: 0x696969, - dimgrey: 0x696969, - dodgerblue: 0x1e90ff, - firebrick: 0xb22222, - floralwhite: 0xfffaf0, - forestgreen: 0x228b22, - fuchsia: 0xff00ff, - gainsboro: 0xdcdcdc, - ghostwhite: 0xf8f8ff, - gold: 0xffd700, - goldenrod: 0xdaa520, - gray: 0x808080, - green: 0x008000, - greenyellow: 0xadff2f, - grey: 0x808080, - honeydew: 0xf0fff0, - hotpink: 0xff69b4, - indianred: 0xcd5c5c, - indigo: 0x4b0082, - ivory: 0xfffff0, - khaki: 0xf0e68c, - lavender: 0xe6e6fa, - lavenderblush: 0xfff0f5, - lawngreen: 0x7cfc00, - lemonchiffon: 0xfffacd, - lightblue: 0xadd8e6, - lightcoral: 0xf08080, - lightcyan: 0xe0ffff, - lightgoldenrodyellow: 0xfafad2, - lightgray: 0xd3d3d3, - lightgreen: 0x90ee90, - lightgrey: 0xd3d3d3, - lightpink: 0xffb6c1, - lightsalmon: 0xffa07a, - lightseagreen: 0x20b2aa, - lightskyblue: 0x87cefa, - lightslategray: 0x778899, - lightslategrey: 0x778899, - lightsteelblue: 0xb0c4de, - lightyellow: 0xffffe0, - lime: 0x00ff00, - limegreen: 0x32cd32, - linen: 0xfaf0e6, - magenta: 0xff00ff, - maroon: 0x800000, - mediumaquamarine: 0x66cdaa, - mediumblue: 0x0000cd, - mediumorchid: 0xba55d3, - mediumpurple: 0x9370db, - mediumseagreen: 0x3cb371, - mediumslateblue: 0x7b68ee, - mediumspringgreen: 0x00fa9a, - mediumturquoise: 0x48d1cc, - mediumvioletred: 0xc71585, - midnightblue: 0x191970, - mintcream: 0xf5fffa, - mistyrose: 0xffe4e1, - moccasin: 0xffe4b5, - navajowhite: 0xffdead, - navy: 0x000080, - oldlace: 0xfdf5e6, - olive: 0x808000, - olivedrab: 0x6b8e23, - orange: 0xffa500, - orangered: 0xff4500, - orchid: 0xda70d6, - palegoldenrod: 0xeee8aa, - palegreen: 0x98fb98, - paleturquoise: 0xafeeee, - palevioletred: 0xdb7093, - papayawhip: 0xffefd5, - peachpuff: 0xffdab9, - peru: 0xcd853f, - pink: 0xffc0cb, - plum: 0xdda0dd, - powderblue: 0xb0e0e6, - purple: 0x800080, - rebeccapurple: 0x663399, - red: 0xff0000, - rosybrown: 0xbc8f8f, - royalblue: 0x4169e1, - saddlebrown: 0x8b4513, - salmon: 0xfa8072, - sandybrown: 0xf4a460, - seagreen: 0x2e8b57, - seashell: 0xfff5ee, - sienna: 0xa0522d, - silver: 0xc0c0c0, - skyblue: 0x87ceeb, - slateblue: 0x6a5acd, - slategray: 0x708090, - slategrey: 0x708090, - snow: 0xfffafa, - springgreen: 0x00ff7f, - steelblue: 0x4682b4, - tan: 0xd2b48c, - teal: 0x008080, - thistle: 0xd8bfd8, - tomato: 0xff6347, - turquoise: 0x40e0d0, - violet: 0xee82ee, - wheat: 0xf5deb3, - white: 0xffffff, - whitesmoke: 0xf5f5f5, - yellow: 0xffff00, - yellowgreen: 0x9acd32 -}; +function index(values, ...keys) { + return nest(values, identity, unique, keys); +} -define(Color, color, { - copy: function(channels) { - return Object.assign(new this.constructor, this, channels); - }, - displayable: function() { - return this.rgb().displayable(); - }, - hex: color_formatHex, // Deprecated! Use color.formatHex. - formatHex: color_formatHex, - formatHsl: color_formatHsl, - formatRgb: color_formatRgb, - toString: color_formatRgb -}); +function indexes(values, ...keys) { + return nest(values, Array.from, unique, keys); +} -function color_formatHex() { - return this.rgb().formatHex(); +function unique(values) { + if (values.length !== 1) throw new Error("duplicate key"); + return values[0]; } -function color_formatHsl() { - return hslConvert(this).formatHsl(); +function nest(values, map, reduce, keys) { + return (function regroup(values, i) { + if (i >= keys.length) return reduce(values); + const groups = new InternMap(); + const keyof = keys[i++]; + let index = -1; + for (const value of values) { + const key = keyof(value, ++index, values); + const group = groups.get(key); + if (group) group.push(value); + else groups.set(key, [value]); + } + for (const [key, values] of groups) { + groups.set(key, regroup(values, i)); + } + return map(groups); + })(values, 0); } -function color_formatRgb() { - return this.rgb().formatRgb(); +function permute(source, keys) { + return Array.from(keys, key => source[key]); } -function color(format) { - var m, l; - format = (format + "").trim().toLowerCase(); - return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 - : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 - : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 - : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 - : null) // invalid hex - : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) - : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) - : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) - : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) - : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) - : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) - : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins - : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) - : null; +function sort(values, ...F) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + values = Array.from(values); + let [f = ascending] = F; + if (f.length === 1 || F.length > 1) { + const index = Uint32Array.from(values, (d, i) => i); + if (F.length > 1) { + F = F.map(f => values.map(f)); + index.sort((i, j) => { + for (const f of F) { + const c = ascending(f[i], f[j]); + if (c) return c; + } + }); + } else { + f = values.map(f); + index.sort((i, j) => ascending(f[i], f[j])); + } + return permute(values, index); + } + return values.sort(f); } -function rgbn(n) { - return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); +function groupSort(values, reduce, key) { + return (reduce.length === 1 + ? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk))) + : sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk)))) + .map(([key]) => key); } -function rgba(r, g, b, a) { - if (a <= 0) r = g = b = NaN; - return new Rgb(r, g, b, a); -} +var array = Array.prototype; -function rgbConvert(o) { - if (!(o instanceof Color)) o = color(o); - if (!o) return new Rgb; - o = o.rgb(); - return new Rgb(o.r, o.g, o.b, o.opacity); -} +var slice = array.slice; -function rgb(r, g, b, opacity) { - return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); +function constant(x) { + return function() { + return x; + }; } -function Rgb(r, g, b, opacity) { - this.r = +r; - this.g = +g; - this.b = +b; - this.opacity = +opacity; -} +var e10 = Math.sqrt(50), + e5 = Math.sqrt(10), + e2 = Math.sqrt(2); -define(Rgb, rgb, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); - }, - rgb: function() { - return this; - }, - displayable: function() { - return (-0.5 <= this.r && this.r < 255.5) - && (-0.5 <= this.g && this.g < 255.5) - && (-0.5 <= this.b && this.b < 255.5) - && (0 <= this.opacity && this.opacity <= 1); - }, - hex: rgb_formatHex, // Deprecated! Use color.formatHex. - formatHex: rgb_formatHex, - formatRgb: rgb_formatRgb, - toString: rgb_formatRgb -})); +function ticks(start, stop, count) { + var reverse, + i = -1, + n, + ticks, + step; -function rgb_formatHex() { - return "#" + hex(this.r) + hex(this.g) + hex(this.b); -} + stop = +stop, start = +start, count = +count; + if (start === stop && count > 0) return [start]; + if (reverse = stop < start) n = start, start = stop, stop = n; + if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return []; -function rgb_formatRgb() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "rgb(" : "rgba(") - + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " - + Math.max(0, Math.min(255, Math.round(this.b) || 0)) - + (a === 1 ? ")" : ", " + a + ")"); + if (step > 0) { + let r0 = Math.round(start / step), r1 = Math.round(stop / step); + if (r0 * step < start) ++r0; + if (r1 * step > stop) --r1; + ticks = new Array(n = r1 - r0 + 1); + while (++i < n) ticks[i] = (r0 + i) * step; + } else { + step = -step; + let r0 = Math.round(start * step), r1 = Math.round(stop * step); + if (r0 / step < start) ++r0; + if (r1 / step > stop) --r1; + ticks = new Array(n = r1 - r0 + 1); + while (++i < n) ticks[i] = (r0 + i) / step; + } + + if (reverse) ticks.reverse(); + + return ticks; } -function hex(value) { - value = Math.max(0, Math.min(255, Math.round(value) || 0)); - return (value < 16 ? "0" : "") + value.toString(16); +function tickIncrement(start, stop, count) { + var step = (stop - start) / Math.max(0, count), + power = Math.floor(Math.log(step) / Math.LN10), + error = step / Math.pow(10, power); + return power >= 0 + ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power) + : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1); } -function hsla(h, s, l, a) { - if (a <= 0) h = s = l = NaN; - else if (l <= 0 || l >= 1) h = s = NaN; - else if (s <= 0) h = NaN; - return new Hsl(h, s, l, a); +function tickStep(start, stop, count) { + var step0 = Math.abs(stop - start) / Math.max(0, count), + step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)), + error = step0 / step1; + if (error >= e10) step1 *= 10; + else if (error >= e5) step1 *= 5; + else if (error >= e2) step1 *= 2; + return stop < start ? -step1 : step1; } -function hslConvert(o) { - if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); - if (!(o instanceof Color)) o = color(o); - if (!o) return new Hsl; - if (o instanceof Hsl) return o; - o = o.rgb(); - var r = o.r / 255, - g = o.g / 255, - b = o.b / 255, - min = Math.min(r, g, b), - max = Math.max(r, g, b), - h = NaN, - s = max - min, - l = (max + min) / 2; - if (s) { - if (r === max) h = (g - b) / s + (g < b) * 6; - else if (g === max) h = (b - r) / s + 2; - else h = (r - g) / s + 4; - s /= l < 0.5 ? max + min : 2 - max - min; - h *= 60; - } else { - s = l > 0 && l < 1 ? 0 : h; +function nice(start, stop, count) { + let prestep; + while (true) { + const step = tickIncrement(start, stop, count); + if (step === prestep || step === 0 || !isFinite(step)) { + return [start, stop]; + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } + prestep = step; } - return new Hsl(h, s, l, o.opacity); } -function hsl(h, s, l, opacity) { - return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +function sturges(values) { + return Math.ceil(Math.log(count(values)) / Math.LN2) + 1; } -function Hsl(h, s, l, opacity) { - this.h = +h; - this.s = +s; - this.l = +l; - this.opacity = +opacity; -} +function bin() { + var value = identity, + domain = extent, + threshold = sturges; -define(Hsl, hsl, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Hsl(this.h, this.s, this.l * k, this.opacity); - }, - rgb: function() { - var h = this.h % 360 + (this.h < 0) * 360, - s = isNaN(h) || isNaN(this.s) ? 0 : this.s, - l = this.l, - m2 = l + (l < 0.5 ? l : 1 - l) * s, - m1 = 2 * l - m2; - return new Rgb( - hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), - hsl2rgb(h, m1, m2), - hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), - this.opacity - ); - }, - displayable: function() { - return (0 <= this.s && this.s <= 1 || isNaN(this.s)) - && (0 <= this.l && this.l <= 1) - && (0 <= this.opacity && this.opacity <= 1); - }, - formatHsl: function() { - var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); - return (a === 1 ? "hsl(" : "hsla(") - + (this.h || 0) + ", " - + (this.s || 0) * 100 + "%, " - + (this.l || 0) * 100 + "%" - + (a === 1 ? ")" : ", " + a + ")"); - } -})); + function histogram(data) { + if (!Array.isArray(data)) data = Array.from(data); + + var i, + n = data.length, + x, + values = new Array(n); + + for (i = 0; i < n; ++i) { + values[i] = value(data[i], i, data); + } + + var xz = domain(values), + x0 = xz[0], + x1 = xz[1], + tz = threshold(values, x0, x1); + + // Convert number of thresholds into uniform thresholds, and nice the + // default domain accordingly. + if (!Array.isArray(tz)) { + const max = x1, tn = +tz; + if (domain === extent) [x0, x1] = nice(x0, x1, tn); + tz = ticks(x0, x1, tn); + + // If the last threshold is coincident with the domain’s upper bound, the + // last bin will be zero-width. If the default domain is used, and this + // last threshold is coincident with the maximum input value, we can + // extend the niced upper bound by one tick to ensure uniform bin widths; + // otherwise, we simply remove the last threshold. Note that we don’t + // coerce values or the domain to numbers, and thus must be careful to + // compare order (>=) rather than strict equality (===)! + if (tz[tz.length - 1] >= x1) { + if (max >= x1 && domain === extent) { + const step = tickIncrement(x0, x1, tn); + if (isFinite(step)) { + if (step > 0) { + x1 = (Math.floor(x1 / step) + 1) * step; + } else if (step < 0) { + x1 = (Math.ceil(x1 * -step) + 1) / -step; + } + } + } else { + tz.pop(); + } + } + } -/* From FvD 13.37, CSS Color Module Level 3 */ -function hsl2rgb(h, m1, m2) { - return (h < 60 ? m1 + (m2 - m1) * h / 60 - : h < 180 ? m2 - : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 - : m1) * 255; -} + // Remove any thresholds outside the domain. + var m = tz.length; + while (tz[0] <= x0) tz.shift(), --m; + while (tz[m - 1] > x1) tz.pop(), --m; -const radians = Math.PI / 180; -const degrees = 180 / Math.PI; + var bins = new Array(m + 1), + bin; -// https://observablehq.com/@mbostock/lab-and-rgb -const K = 18, - Xn = 0.96422, - Yn = 1, - Zn = 0.82521, - t0 = 4 / 29, - t1 = 6 / 29, - t2 = 3 * t1 * t1, - t3 = t1 * t1 * t1; + // Initialize bins. + for (i = 0; i <= m; ++i) { + bin = bins[i] = []; + bin.x0 = i > 0 ? tz[i - 1] : x0; + bin.x1 = i < m ? tz[i] : x1; + } -function labConvert(o) { - if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); - if (o instanceof Hcl) return hcl2lab(o); - if (!(o instanceof Rgb)) o = rgbConvert(o); - var r = rgb2lrgb(o.r), - g = rgb2lrgb(o.g), - b = rgb2lrgb(o.b), - y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; - if (r === g && g === b) x = z = y; else { - x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); - z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + // Assign data to bins by value, ignoring any outside the domain. + for (i = 0; i < n; ++i) { + x = values[i]; + if (x0 <= x && x <= x1) { + bins[bisectRight(tz, x, 0, m)].push(data[i]); + } + } + + return bins; } - return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); -} -function gray(l, opacity) { - return new Lab(l, 0, 0, opacity == null ? 1 : opacity); -} + histogram.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value; + }; -function lab(l, a, b, opacity) { - return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); -} + histogram.domain = function(_) { + return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain; + }; -function Lab(l, a, b, opacity) { - this.l = +l; - this.a = +a; - this.b = +b; - this.opacity = +opacity; + histogram.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold; + }; + + return histogram; } -define(Lab, lab, extend(Color, { - brighter: function(k) { - return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); - }, - darker: function(k) { - return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); - }, - rgb: function() { - var y = (this.l + 16) / 116, - x = isNaN(this.a) ? y : y + this.a / 500, - z = isNaN(this.b) ? y : y - this.b / 200; - x = Xn * lab2xyz(x); - y = Yn * lab2xyz(y); - z = Zn * lab2xyz(z); - return new Rgb( - lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), - lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), - lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), - this.opacity - ); +function max(values, valueof) { + let max; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value; + } + } } -})); - -function xyz2lab(t) { - return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; + return max; } -function lab2xyz(t) { - return t > t1 ? t * t * t : t2 * (t - t0); +function min(values, valueof) { + let min; + if (valueof === undefined) { + for (const value of values) { + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value; + } + } + } + return min; } -function lrgb2rgb(x) { - return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); -} +// Based on https://github.com/mourner/quickselect +// ISC license, Copyright 2018 Vladimir Agafonkin. +function quickselect(array, k, left = 0, right = array.length - 1, compare = ascending) { + while (right > left) { + if (right - left > 600) { + const n = right - left + 1; + const m = k - left + 1; + const z = Math.log(n); + const s = 0.5 * Math.exp(2 * z / 3); + const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1); + const newLeft = Math.max(left, Math.floor(k - m * s / n + sd)); + const newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd)); + quickselect(array, k, newLeft, newRight, compare); + } -function rgb2lrgb(x) { - return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); -} + const t = array[k]; + let i = left; + let j = right; -function hclConvert(o) { - if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); - if (!(o instanceof Lab)) o = labConvert(o); - if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); - var h = Math.atan2(o.b, o.a) * degrees; - return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); -} + swap(array, left, k); + if (compare(array[right], t) > 0) swap(array, left, right); -function lch(l, c, h, opacity) { - return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); -} + while (i < j) { + swap(array, i, j), ++i, --j; + while (compare(array[i], t) < 0) ++i; + while (compare(array[j], t) > 0) --j; + } -function hcl(h, c, l, opacity) { - return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); -} + if (compare(array[left], t) === 0) swap(array, left, j); + else ++j, swap(array, j, right); -function Hcl(h, c, l, opacity) { - this.h = +h; - this.c = +c; - this.l = +l; - this.opacity = +opacity; + if (j <= k) left = j + 1; + if (k <= j) right = j - 1; + } + return array; } -function hcl2lab(o) { - if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); - var h = o.h * radians; - return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +function swap(array, i, j) { + const t = array[i]; + array[i] = array[j]; + array[j] = t; } -define(Hcl, hcl, extend(Color, { - brighter: function(k) { - return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); - }, - darker: function(k) { - return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); - }, - rgb: function() { - return hcl2lab(this).rgb(); - } -})); - -var A = -0.14861, - B = +1.78277, - C = -0.29227, - D = -0.90649, - E = +1.97294, - ED = E * D, - EB = E * B, - BC_DA = B * C - D * A; +function quantile(values, p, valueof) { + values = Float64Array.from(numbers(values, valueof)); + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return min(values); + if (p >= 1) return max(values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = max(quickselect(values, i0).subarray(0, i0 + 1)), + value1 = min(values.subarray(i0 + 1)); + return value0 + (value1 - value0) * (i - i0); +} -function cubehelixConvert(o) { - if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); - if (!(o instanceof Rgb)) o = rgbConvert(o); - var r = o.r / 255, - g = o.g / 255, - b = o.b / 255, - l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), - bl = b - l, - k = (E * (g - l) - C * bl) / D, - s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 - h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; - return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +function quantileSorted(values, p, valueof = number) { + if (!(n = values.length)) return; + if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values); + if (p >= 1) return +valueof(values[n - 1], n - 1, values); + var n, + i = (n - 1) * p, + i0 = Math.floor(i), + value0 = +valueof(values[i0], i0, values), + value1 = +valueof(values[i0 + 1], i0 + 1, values); + return value0 + (value1 - value0) * (i - i0); +} + +function freedmanDiaconis(values, min, max) { + return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(count(values), -1 / 3))); } -function cubehelix(h, s, l, opacity) { - return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +function scott(values, min, max) { + return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(count(values), -1 / 3))); } -function Cubehelix(h, s, l, opacity) { - this.h = +h; - this.s = +s; - this.l = +l; - this.opacity = +opacity; +function maxIndex(values, valueof) { + let max; + let maxIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (max < value || (max === undefined && value >= value))) { + max = value, maxIndex = index; + } + } + } + return maxIndex; } -define(Cubehelix, cubehelix, extend(Color, { - brighter: function(k) { - k = k == null ? brighter : Math.pow(brighter, k); - return new Cubehelix(this.h, this.s, this.l * k, this.opacity); - }, - darker: function(k) { - k = k == null ? darker : Math.pow(darker, k); - return new Cubehelix(this.h, this.s, this.l * k, this.opacity); - }, - rgb: function() { - var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, - l = +this.l, - a = isNaN(this.s) ? 0 : this.s * l * (1 - l), - cosh = Math.cos(h), - sinh = Math.sin(h); - return new Rgb( - 255 * (l + a * (A * cosh + B * sinh)), - 255 * (l + a * (C * cosh + D * sinh)), - 255 * (l + a * (E * cosh)), - this.opacity - ); +function mean(values, valueof) { + let count = 0; + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value != null && (value = +value) >= value) { + ++count, sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null && (value = +value) >= value) { + ++count, sum += value; + } + } } -})); + if (count) return sum / count; +} -exports.color = color; -exports.cubehelix = cubehelix; -exports.gray = gray; -exports.hcl = hcl; -exports.hsl = hsl; -exports.lab = lab; -exports.lch = lch; -exports.rgb = rgb; +function median(values, valueof) { + return quantile(values, 0.5, valueof); +} -Object.defineProperty(exports, '__esModule', { value: true }); +function* flatten(arrays) { + for (const array of arrays) { + yield* array; + } +} -})); -}); +function merge(arrays) { + return Array.from(flatten(arrays)); +} -var d3Interpolate = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-interpolate/ v2.0.1 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Color) ; -}(commonjsGlobal, function (exports, d3Color) { -function basis(t1, v0, v1, v2, v3) { - var t2 = t1 * t1, t3 = t2 * t1; - return ((1 - 3 * t1 + 3 * t2 - t3) * v0 - + (4 - 6 * t2 + 3 * t3) * v1 - + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 - + t3 * v3) / 6; +function minIndex(values, valueof) { + let min; + let minIndex = -1; + let index = -1; + if (valueof === undefined) { + for (const value of values) { + ++index; + if (value != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } else { + for (let value of values) { + if ((value = valueof(value, ++index, values)) != null + && (min > value || (min === undefined && value >= value))) { + min = value, minIndex = index; + } + } + } + return minIndex; } -function basis$1(values) { - var n = values.length - 1; - return function(t) { - var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), - v1 = values[i], - v2 = values[i + 1], - v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, - v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; - return basis((t - i / n) * n, v0, v1, v2, v3); - }; +function pairs(values, pairof = pair) { + const pairs = []; + let previous; + let first = false; + for (const value of values) { + if (first) pairs.push(pairof(previous, value)); + previous = value; + first = true; + } + return pairs; } -function basisClosed(values) { - var n = values.length; - return function(t) { - var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), - v0 = values[(i + n - 1) % n], - v1 = values[i % n], - v2 = values[(i + 1) % n], - v3 = values[(i + 2) % n]; - return basis((t - i / n) * n, v0, v1, v2, v3); - }; +function pair(a, b) { + return [a, b]; } -var constant = x => () => x; +function range(start, stop, step) { + start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step; -function linear(a, d) { - return function(t) { - return a + t * d; - }; -} + var i = -1, + n = Math.max(0, Math.ceil((stop - start) / step)) | 0, + range = new Array(n); -function exponential(a, b, y) { - return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { - return Math.pow(a + t * b, y); - }; + while (++i < n) { + range[i] = start + i * step; + } + + return range; } -function hue(a, b) { - var d = b - a; - return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); +function least(values, compare = ascending) { + let min; + let defined = false; + if (compare.length === 1) { + let minValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending(value, minValue) < 0 + : ascending(value, value) === 0) { + min = element; + minValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, min) < 0 + : compare(value, value) === 0) { + min = value; + defined = true; + } + } + } + return min; } -function gamma(y) { - return (y = +y) === 1 ? nogamma : function(a, b) { - return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); - }; +function leastIndex(values, compare = ascending) { + if (compare.length === 1) return minIndex(values, compare); + let minValue; + let min = -1; + let index = -1; + for (const value of values) { + ++index; + if (min < 0 + ? compare(value, value) === 0 + : compare(value, minValue) < 0) { + minValue = value; + min = index; + } + } + return min; } -function nogamma(a, b) { - var d = b - a; - return d ? linear(a, d) : constant(isNaN(a) ? b : a); +function greatest(values, compare = ascending) { + let max; + let defined = false; + if (compare.length === 1) { + let maxValue; + for (const element of values) { + const value = compare(element); + if (defined + ? ascending(value, maxValue) > 0 + : ascending(value, value) === 0) { + max = element; + maxValue = value; + defined = true; + } + } + } else { + for (const value of values) { + if (defined + ? compare(value, max) > 0 + : compare(value, value) === 0) { + max = value; + defined = true; + } + } + } + return max; } -var rgb = (function rgbGamma(y) { - var color = gamma(y); - - function rgb(start, end) { - var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), - g = color(start.g, end.g), - b = color(start.b, end.b), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.r = r(t); - start.g = g(t); - start.b = b(t); - start.opacity = opacity(t); - return start + ""; - }; +function greatestIndex(values, compare = ascending) { + if (compare.length === 1) return maxIndex(values, compare); + let maxValue; + let max = -1; + let index = -1; + for (const value of values) { + ++index; + if (max < 0 + ? compare(value, value) === 0 + : compare(value, maxValue) > 0) { + maxValue = value; + max = index; + } } + return max; +} - rgb.gamma = rgbGamma; +function scan(values, compare) { + const index = leastIndex(values, compare); + return index < 0 ? undefined : index; +} - return rgb; -})(1); +var shuffle = shuffler(Math.random); -function rgbSpline(spline) { - return function(colors) { - var n = colors.length, - r = new Array(n), - g = new Array(n), - b = new Array(n), - i, color; - for (i = 0; i < n; ++i) { - color = d3Color.rgb(colors[i]); - r[i] = color.r || 0; - g[i] = color.g || 0; - b[i] = color.b || 0; +function shuffler(random) { + return function shuffle(array, i0 = 0, i1 = array.length) { + let m = i1 - (i0 = +i0); + while (m) { + const i = random() * m-- | 0, t = array[m + i0]; + array[m + i0] = array[i + i0]; + array[i + i0] = t; } - r = spline(r); - g = spline(g); - b = spline(b); - color.opacity = 1; - return function(t) { - color.r = r(t); - color.g = g(t); - color.b = b(t); - return color + ""; - }; + return array; }; } -var rgbBasis = rgbSpline(basis$1); -var rgbBasisClosed = rgbSpline(basisClosed); - -function numberArray(a, b) { - if (!b) b = []; - var n = a ? Math.min(b.length, a.length) : 0, - c = b.slice(), - i; - return function(t) { - for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; - return c; - }; +function sum(values, valueof) { + let sum = 0; + if (valueof === undefined) { + for (let value of values) { + if (value = +value) { + sum += value; + } + } + } else { + let index = -1; + for (let value of values) { + if (value = +valueof(value, ++index, values)) { + sum += value; + } + } + } + return sum; } -function isNumberArray(x) { - return ArrayBuffer.isView(x) && !(x instanceof DataView); +function transpose(matrix) { + if (!(n = matrix.length)) return []; + for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) { + for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) { + row[j] = matrix[j][i]; + } + } + return transpose; } -function array(a, b) { - return (isNumberArray(b) ? numberArray : genericArray)(a, b); +function length(d) { + return d.length; } -function genericArray(a, b) { - var nb = b ? b.length : 0, - na = a ? Math.min(nb, a.length) : 0, - x = new Array(na), - c = new Array(nb), - i; - - for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); - for (; i < nb; ++i) c[i] = b[i]; - - return function(t) { - for (i = 0; i < na; ++i) c[i] = x[i](t); - return c; - }; +function zip() { + return transpose(arguments); } -function date(a, b) { - var d = new Date; - return a = +a, b = +b, function(t) { - return d.setTime(a * (1 - t) + b * t), d; - }; +function every(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (!test(value, ++index, values)) { + return false; + } + } + return true; } -function number(a, b) { - return a = +a, b = +b, function(t) { - return a * (1 - t) + b * t; - }; +function some(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + return true; + } + } + return false; } -function object(a, b) { - var i = {}, - c = {}, - k; - - if (a === null || typeof a !== "object") a = {}; - if (b === null || typeof b !== "object") b = {}; - - for (k in b) { - if (k in a) { - i[k] = value(a[k], b[k]); - } else { - c[k] = b[k]; +function filter(values, test) { + if (typeof test !== "function") throw new TypeError("test is not a function"); + const array = []; + let index = -1; + for (const value of values) { + if (test(value, ++index, values)) { + array.push(value); } } - - return function(t) { - for (k in i) c[k] = i[k](t); - return c; - }; + return array; } -var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, - reB = new RegExp(reA.source, "g"); - -function zero(b) { - return function() { - return b; - }; +function map(values, mapper) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + if (typeof mapper !== "function") throw new TypeError("mapper is not a function"); + return Array.from(values, (value, index) => mapper(value, index, values)); } -function one(b) { - return function(t) { - return b(t) + ""; - }; +function reduce(values, reducer, value) { + if (typeof reducer !== "function") throw new TypeError("reducer is not a function"); + const iterator = values[Symbol.iterator](); + let done, next, index = -1; + if (arguments.length < 3) { + ({done, value} = iterator.next()); + if (done) return; + ++index; + } + while (({done, value: next} = iterator.next()), !done) { + value = reducer(value, next, ++index, values); + } + return value; } -function string(a, b) { - var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b - am, // current match in a - bm, // current match in b - bs, // string preceding current number in b, if any - i = -1, // index in s - s = [], // string constants and placeholders - q = []; // number interpolators - - // Coerce inputs to strings. - a = a + "", b = b + ""; +function reverse(values) { + if (typeof values[Symbol.iterator] !== "function") throw new TypeError("values is not iterable"); + return Array.from(values).reverse(); +} - // Interpolate pairs of numbers in a & b. - while ((am = reA.exec(a)) - && (bm = reB.exec(b))) { - if ((bs = bm.index) > bi) { // a string precedes the next number in b - bs = b.slice(bi, bs); - if (s[i]) s[i] += bs; // coalesce with previous string - else s[++i] = bs; - } - if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match - if (s[i]) s[i] += bm; // coalesce with previous string - else s[++i] = bm; - } else { // interpolate non-matching numbers - s[++i] = null; - q.push({i: i, x: number(am, bm)}); +function difference(values, ...others) { + values = new Set(values); + for (const other of others) { + for (const value of other) { + values.delete(value); } - bi = reB.lastIndex; } + return values; +} - // Add remains of b. - if (bi < b.length) { - bs = b.slice(bi); - if (s[i]) s[i] += bs; // coalesce with previous string - else s[++i] = bs; +function disjoint(values, other) { + const iterator = other[Symbol.iterator](), set = new Set(); + for (const v of values) { + if (set.has(v)) return false; + let value, done; + while (({value, done} = iterator.next())) { + if (done) break; + if (Object.is(v, value)) return false; + set.add(value); + } } + return true; +} - // Special optimization for only a single match. - // Otherwise, interpolate each of the numbers and rejoin the string. - return s.length < 2 ? (q[0] - ? one(q[0].x) - : zero(b)) - : (b = q.length, function(t) { - for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }); +function set(values) { + return values instanceof Set ? values : new Set(values); } -function value(a, b) { - var t = typeof b, c; - return b == null || t === "boolean" ? constant(b) - : (t === "number" ? number - : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string) - : b instanceof d3Color.color ? rgb - : b instanceof Date ? date - : isNumberArray(b) ? numberArray - : Array.isArray(b) ? genericArray - : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object - : number)(a, b); +function intersection(values, ...others) { + values = new Set(values); + others = others.map(set); + out: for (const value of values) { + for (const other of others) { + if (!other.has(value)) { + values.delete(value); + continue out; + } + } + } + return values; } -function discrete(range) { - var n = range.length; - return function(t) { - return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; - }; +function superset(values, other) { + const iterator = values[Symbol.iterator](), set = new Set(); + for (const o of other) { + if (set.has(o)) continue; + let value, done; + while (({value, done} = iterator.next())) { + if (done) return false; + set.add(value); + if (Object.is(o, value)) break; + } + } + return true; } -function hue$1(a, b) { - var i = hue(+a, +b); - return function(t) { - var x = i(t); - return x - 360 * Math.floor(x / 360); - }; +function subset(values, other) { + return superset(other, values); } -function round(a, b) { - return a = +a, b = +b, function(t) { - return Math.round(a * (1 - t) + b * t); - }; +function union(...others) { + const set = new Set(); + for (const other of others) { + for (const o of other) { + set.add(o); + } + } + return set; } -var degrees = 180 / Math.PI; +exports.Adder = Adder; +exports.InternMap = InternMap; +exports.InternSet = InternSet; +exports.ascending = ascending; +exports.bin = bin; +exports.bisect = bisectRight; +exports.bisectCenter = bisectCenter; +exports.bisectLeft = bisectLeft; +exports.bisectRight = bisectRight; +exports.bisector = bisector; +exports.count = count; +exports.cross = cross; +exports.cumsum = cumsum; +exports.descending = descending; +exports.deviation = deviation; +exports.difference = difference; +exports.disjoint = disjoint; +exports.every = every; +exports.extent = extent; +exports.fcumsum = fcumsum; +exports.filter = filter; +exports.fsum = fsum; +exports.greatest = greatest; +exports.greatestIndex = greatestIndex; +exports.group = group; +exports.groupSort = groupSort; +exports.groups = groups; +exports.histogram = bin; +exports.index = index; +exports.indexes = indexes; +exports.intersection = intersection; +exports.least = least; +exports.leastIndex = leastIndex; +exports.map = map; +exports.max = max; +exports.maxIndex = maxIndex; +exports.mean = mean; +exports.median = median; +exports.merge = merge; +exports.min = min; +exports.minIndex = minIndex; +exports.nice = nice; +exports.pairs = pairs; +exports.permute = permute; +exports.quantile = quantile; +exports.quantileSorted = quantileSorted; +exports.quickselect = quickselect; +exports.range = range; +exports.reduce = reduce; +exports.reverse = reverse; +exports.rollup = rollup; +exports.rollups = rollups; +exports.scan = scan; +exports.shuffle = shuffle; +exports.shuffler = shuffler; +exports.some = some; +exports.sort = sort; +exports.subset = subset; +exports.sum = sum; +exports.superset = superset; +exports.thresholdFreedmanDiaconis = freedmanDiaconis; +exports.thresholdScott = scott; +exports.thresholdSturges = sturges; +exports.tickIncrement = tickIncrement; +exports.tickStep = tickStep; +exports.ticks = ticks; +exports.transpose = transpose; +exports.union = union; +exports.variance = variance; +exports.zip = zip; -var identity = { - translateX: 0, - translateY: 0, - rotate: 0, - skewX: 0, - scaleX: 1, - scaleY: 1 -}; +Object.defineProperty(exports, '__esModule', { value: true }); -function decompose(a, b, c, d, e, f) { - var scaleX, scaleY, skewX; - if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; - if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; - if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; - if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; - return { - translateX: e, - translateY: f, - rotate: Math.atan2(b, a) * degrees, - skewX: Math.atan(skewX) * degrees, - scaleX: scaleX, - scaleY: scaleY - }; +}))); +}); + +var d3Axis = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-axis/ v2.1.0 Copyright 2021 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, (function (exports) { +var slice = Array.prototype.slice; + +function identity(x) { + return x; } -var svgNode; +var top = 1, + right = 2, + bottom = 3, + left = 4, + epsilon = 1e-6; -/* eslint-disable no-undef */ -function parseCss(value) { - const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); - return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f); +function translateX(x) { + return "translate(" + x + ",0)"; } -function parseSvg(value) { - if (value == null) return identity; - if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); - svgNode.setAttribute("transform", value); - if (!(value = svgNode.transform.baseVal.consolidate())) return identity; - value = value.matrix; - return decompose(value.a, value.b, value.c, value.d, value.e, value.f); +function translateY(y) { + return "translate(0," + y + ")"; } -function interpolateTransform(parse, pxComma, pxParen, degParen) { +function number(scale) { + return d => +scale(d); +} - function pop(s) { - return s.length ? s.pop() + " " : ""; - } +function center(scale, offset) { + offset = Math.max(0, scale.bandwidth() - offset * 2) / 2; + if (scale.round()) offset = Math.round(offset); + return d => +scale(d) + offset; +} - function translate(xa, ya, xb, yb, s, q) { - if (xa !== xb || ya !== yb) { - var i = s.push("translate(", null, pxComma, null, pxParen); - q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); - } else if (xb || yb) { - s.push("translate(" + xb + pxComma + yb + pxParen); - } - } +function entering() { + return !this.__axis; +} - function rotate(a, b, s, q) { - if (a !== b) { - if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path - q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); - } else if (b) { - s.push(pop(s) + "rotate(" + b + degParen); - } - } +function axis(orient, scale) { + var tickArguments = [], + tickValues = null, + tickFormat = null, + tickSizeInner = 6, + tickSizeOuter = 6, + tickPadding = 3, + offset = typeof window !== "undefined" && window.devicePixelRatio > 1 ? 0 : 0.5, + k = orient === top || orient === left ? -1 : 1, + x = orient === left || orient === right ? "x" : "y", + transform = orient === top || orient === bottom ? translateX : translateY; + + function axis(context) { + var values = tickValues == null ? (scale.ticks ? scale.ticks.apply(scale, tickArguments) : scale.domain()) : tickValues, + format = tickFormat == null ? (scale.tickFormat ? scale.tickFormat.apply(scale, tickArguments) : identity) : tickFormat, + spacing = Math.max(tickSizeInner, 0) + tickPadding, + range = scale.range(), + range0 = +range[0] + offset, + range1 = +range[range.length - 1] + offset, + position = (scale.bandwidth ? center : number)(scale.copy(), offset), + selection = context.selection ? context.selection() : context, + path = selection.selectAll(".domain").data([null]), + tick = selection.selectAll(".tick").data(values, scale).order(), + tickExit = tick.exit(), + tickEnter = tick.enter().append("g").attr("class", "tick"), + line = tick.select("line"), + text = tick.select("text"); - function skewX(a, b, s, q) { - if (a !== b) { - q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); - } else if (b) { - s.push(pop(s) + "skewX(" + b + degParen); - } - } + path = path.merge(path.enter().insert("path", ".tick") + .attr("class", "domain") + .attr("stroke", "currentColor")); - function scale(xa, ya, xb, yb, s, q) { - if (xa !== xb || ya !== yb) { - var i = s.push(pop(s) + "scale(", null, ",", null, ")"); - q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); - } else if (xb !== 1 || yb !== 1) { - s.push(pop(s) + "scale(" + xb + "," + yb + ")"); - } - } + tick = tick.merge(tickEnter); - return function(a, b) { - var s = [], // string constants and placeholders - q = []; // number interpolators - a = parse(a), b = parse(b); - translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); - rotate(a.rotate, b.rotate, s, q); - skewX(a.skewX, b.skewX, s, q); - scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); - a = b = null; // gc - return function(t) { - var i = -1, n = q.length, o; - while (++i < n) s[(o = q[i]).i] = o.x(t); - return s.join(""); - }; - }; -} + line = line.merge(tickEnter.append("line") + .attr("stroke", "currentColor") + .attr(x + "2", k * tickSizeInner)); -var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); -var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); + text = text.merge(tickEnter.append("text") + .attr("fill", "currentColor") + .attr(x, k * spacing) + .attr("dy", orient === top ? "0em" : orient === bottom ? "0.71em" : "0.32em")); -var epsilon2 = 1e-12; + if (context !== selection) { + path = path.transition(context); + tick = tick.transition(context); + line = line.transition(context); + text = text.transition(context); -function cosh(x) { - return ((x = Math.exp(x)) + 1 / x) / 2; -} + tickExit = tickExit.transition(context) + .attr("opacity", epsilon) + .attr("transform", function(d) { return isFinite(d = position(d)) ? transform(d + offset) : this.getAttribute("transform"); }); -function sinh(x) { - return ((x = Math.exp(x)) - 1 / x) / 2; -} + tickEnter + .attr("opacity", epsilon) + .attr("transform", function(d) { var p = this.parentNode.__axis; return transform((p && isFinite(p = p(d)) ? p : position(d)) + offset); }); + } -function tanh(x) { - return ((x = Math.exp(2 * x)) - 1) / (x + 1); -} + tickExit.remove(); -var zoom = (function zoomRho(rho, rho2, rho4) { + path + .attr("d", orient === left || orient === right + ? (tickSizeOuter ? "M" + k * tickSizeOuter + "," + range0 + "H" + offset + "V" + range1 + "H" + k * tickSizeOuter : "M" + offset + "," + range0 + "V" + range1) + : (tickSizeOuter ? "M" + range0 + "," + k * tickSizeOuter + "V" + offset + "H" + range1 + "V" + k * tickSizeOuter : "M" + range0 + "," + offset + "H" + range1)); - // p0 = [ux0, uy0, w0] - // p1 = [ux1, uy1, w1] - function zoom(p0, p1) { - var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], - ux1 = p1[0], uy1 = p1[1], w1 = p1[2], - dx = ux1 - ux0, - dy = uy1 - uy0, - d2 = dx * dx + dy * dy, - i, - S; + tick + .attr("opacity", 1) + .attr("transform", function(d) { return transform(position(d) + offset); }); - // Special case for u0 ≅ u1. - if (d2 < epsilon2) { - S = Math.log(w1 / w0) / rho; - i = function(t) { - return [ - ux0 + t * dx, - uy0 + t * dy, - w0 * Math.exp(rho * t * S) - ]; - }; - } + line + .attr(x + "2", k * tickSizeInner); - // General case. - else { - var d1 = Math.sqrt(d2), - b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), - b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), - r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), - r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); - S = (r1 - r0) / rho; - i = function(t) { - var s = t * S, - coshr0 = cosh(r0), - u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); - return [ - ux0 + u * dx, - uy0 + u * dy, - w0 * coshr0 / cosh(rho * s + r0) - ]; - }; - } + text + .attr(x, k * spacing) + .text(format); - i.duration = S * 1000 * rho / Math.SQRT2; + selection.filter(entering) + .attr("fill", "none") + .attr("font-size", 10) + .attr("font-family", "sans-serif") + .attr("text-anchor", orient === right ? "start" : orient === left ? "end" : "middle"); - return i; + selection + .each(function() { this.__axis = position; }); } - zoom.rho = function(_) { - var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; - return zoomRho(_1, _2, _4); + axis.scale = function(_) { + return arguments.length ? (scale = _, axis) : scale; }; - return zoom; -})(Math.SQRT2, 2, 4); + axis.ticks = function() { + return tickArguments = slice.call(arguments), axis; + }; -function hsl(hue) { - return function(start, end) { - var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), - s = nogamma(start.s, end.s), - l = nogamma(start.l, end.l), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.h = h(t); - start.s = s(t); - start.l = l(t); - start.opacity = opacity(t); - return start + ""; - }; - } -} + axis.tickArguments = function(_) { + return arguments.length ? (tickArguments = _ == null ? [] : slice.call(_), axis) : tickArguments.slice(); + }; -var hsl$1 = hsl(hue); -var hslLong = hsl(nogamma); + axis.tickValues = function(_) { + return arguments.length ? (tickValues = _ == null ? null : slice.call(_), axis) : tickValues && tickValues.slice(); + }; -function lab(start, end) { - var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), - a = nogamma(start.a, end.a), - b = nogamma(start.b, end.b), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.l = l(t); - start.a = a(t); - start.b = b(t); - start.opacity = opacity(t); - return start + ""; + axis.tickFormat = function(_) { + return arguments.length ? (tickFormat = _, axis) : tickFormat; }; -} -function hcl(hue) { - return function(start, end) { - var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), - c = nogamma(start.c, end.c), - l = nogamma(start.l, end.l), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.h = h(t); - start.c = c(t); - start.l = l(t); - start.opacity = opacity(t); - return start + ""; - }; - } -} + axis.tickSize = function(_) { + return arguments.length ? (tickSizeInner = tickSizeOuter = +_, axis) : tickSizeInner; + }; -var hcl$1 = hcl(hue); -var hclLong = hcl(nogamma); + axis.tickSizeInner = function(_) { + return arguments.length ? (tickSizeInner = +_, axis) : tickSizeInner; + }; -function cubehelix(hue) { - return (function cubehelixGamma(y) { - y = +y; + axis.tickSizeOuter = function(_) { + return arguments.length ? (tickSizeOuter = +_, axis) : tickSizeOuter; + }; - function cubehelix(start, end) { - var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), - s = nogamma(start.s, end.s), - l = nogamma(start.l, end.l), - opacity = nogamma(start.opacity, end.opacity); - return function(t) { - start.h = h(t); - start.s = s(t); - start.l = l(Math.pow(t, y)); - start.opacity = opacity(t); - return start + ""; - }; - } + axis.tickPadding = function(_) { + return arguments.length ? (tickPadding = +_, axis) : tickPadding; + }; - cubehelix.gamma = cubehelixGamma; + axis.offset = function(_) { + return arguments.length ? (offset = +_, axis) : offset; + }; - return cubehelix; - })(1); + return axis; } -var cubehelix$1 = cubehelix(hue); -var cubehelixLong = cubehelix(nogamma); +function axisTop(scale) { + return axis(top, scale); +} -function piecewise(interpolate, values) { - if (values === undefined) values = interpolate, interpolate = value; - var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); - while (i < n) I[i] = interpolate(v, v = values[++i]); - return function(t) { - var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); - return I[i](t - i); - }; +function axisRight(scale) { + return axis(right, scale); } -function quantize(interpolator, n) { - var samples = new Array(n); - for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); - return samples; +function axisBottom(scale) { + return axis(bottom, scale); +} + +function axisLeft(scale) { + return axis(left, scale); } -exports.interpolate = value; -exports.interpolateArray = array; -exports.interpolateBasis = basis$1; -exports.interpolateBasisClosed = basisClosed; -exports.interpolateCubehelix = cubehelix$1; -exports.interpolateCubehelixLong = cubehelixLong; -exports.interpolateDate = date; -exports.interpolateDiscrete = discrete; -exports.interpolateHcl = hcl$1; -exports.interpolateHclLong = hclLong; -exports.interpolateHsl = hsl$1; -exports.interpolateHslLong = hslLong; -exports.interpolateHue = hue$1; -exports.interpolateLab = lab; -exports.interpolateNumber = number; -exports.interpolateNumberArray = numberArray; -exports.interpolateObject = object; -exports.interpolateRgb = rgb; -exports.interpolateRgbBasis = rgbBasis; -exports.interpolateRgbBasisClosed = rgbBasisClosed; -exports.interpolateRound = round; -exports.interpolateString = string; -exports.interpolateTransformCss = interpolateTransformCss; -exports.interpolateTransformSvg = interpolateTransformSvg; -exports.interpolateZoom = zoom; -exports.piecewise = piecewise; -exports.quantize = quantize; +exports.axisBottom = axisBottom; +exports.axisLeft = axisLeft; +exports.axisRight = axisRight; +exports.axisTop = axisTop; Object.defineProperty(exports, '__esModule', { value: true }); -})); +}))); }); -var d3Timer = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-timer/ v2.0.0 Copyright 2020 Mike Bostock +var d3Dispatch = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-dispatch/ v2.0.0 Copyright 2020 Mike Bostock (function (global, factory) { factory(exports) ; }(commonjsGlobal, function (exports) { -var frame = 0, // is an animation frame pending? - timeout = 0, // is a timeout pending? - interval = 0, // are any timers active? - pokeDelay = 1000, // how frequently we check for clock skew - taskHead, - taskTail, - clockLast = 0, - clockNow = 0, - clockSkew = 0, - clock = typeof performance === "object" && performance.now ? performance : Date, - setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; +var noop = {value: () => {}}; -function now() { - return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +function dispatch() { + for (var i = 0, n = arguments.length, _ = {}, t; i < n; ++i) { + if (!(t = arguments[i] + "") || (t in _) || /[\s.]/.test(t)) throw new Error("illegal type: " + t); + _[t] = []; + } + return new Dispatch(_); } -function clearNow() { - clockNow = 0; +function Dispatch(_) { + this._ = _; } -function Timer() { - this._call = - this._time = - this._next = null; +function parseTypenames(typenames, types) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + if (t && !types.hasOwnProperty(t)) throw new Error("unknown type: " + t); + return {type: t, name: name}; + }); } -Timer.prototype = timer.prototype = { - constructor: Timer, - restart: function(callback, delay, time) { - if (typeof callback !== "function") throw new TypeError("callback is not a function"); - time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); - if (!this._next && taskTail !== this) { - if (taskTail) taskTail._next = this; - else taskHead = this; - taskTail = this; - } - this._call = callback; - this._time = time; - sleep(); - }, - stop: function() { - if (this._call) { - this._call = null; - this._time = Infinity; - sleep(); - } - } -}; +Dispatch.prototype = dispatch.prototype = { + constructor: Dispatch, + on: function(typename, callback) { + var _ = this._, + T = parseTypenames(typename + "", _), + t, + i = -1, + n = T.length; -function timer(callback, delay, time) { - var t = new Timer; - t.restart(callback, delay, time); - return t; -} + // If no callback was specified, return the callback of the given type and name. + if (arguments.length < 2) { + while (++i < n) if ((t = (typename = T[i]).type) && (t = get(_[t], typename.name))) return t; + return; + } -function timerFlush() { - now(); // Get the current time, if not already set. - ++frame; // Pretend we’ve set an alarm, if we haven’t already. - var t = taskHead, e; - while (t) { - if ((e = clockNow - t._time) >= 0) t._call.call(null, e); - t = t._next; - } - --frame; -} + // If a type was specified, set the callback for the given type and name. + // Otherwise, if a null callback was specified, remove callbacks of the given name. + if (callback != null && typeof callback !== "function") throw new Error("invalid callback: " + callback); + while (++i < n) { + if (t = (typename = T[i]).type) _[t] = set(_[t], typename.name, callback); + else if (callback == null) for (t in _) _[t] = set(_[t], typename.name, null); + } -function wake() { - clockNow = (clockLast = clock.now()) + clockSkew; - frame = timeout = 0; - try { - timerFlush(); - } finally { - frame = 0; - nap(); - clockNow = 0; + return this; + }, + copy: function() { + var copy = {}, _ = this._; + for (var t in _) copy[t] = _[t].slice(); + return new Dispatch(copy); + }, + call: function(type, that) { + if ((n = arguments.length - 2) > 0) for (var args = new Array(n), i = 0, n, t; i < n; ++i) args[i] = arguments[i + 2]; + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); + }, + apply: function(type, that, args) { + if (!this._.hasOwnProperty(type)) throw new Error("unknown type: " + type); + for (var t = this._[type], i = 0, n = t.length; i < n; ++i) t[i].value.apply(that, args); } -} - -function poke() { - var now = clock.now(), delay = now - clockLast; - if (delay > pokeDelay) clockSkew -= delay, clockLast = now; -} +}; -function nap() { - var t0, t1 = taskHead, t2, time = Infinity; - while (t1) { - if (t1._call) { - if (time > t1._time) time = t1._time; - t0 = t1, t1 = t1._next; - } else { - t2 = t1._next, t1._next = null; - t1 = t0 ? t0._next = t2 : taskHead = t2; +function get(type, name) { + for (var i = 0, n = type.length, c; i < n; ++i) { + if ((c = type[i]).name === name) { + return c.value; } } - taskTail = t0; - sleep(time); } -function sleep(time) { - if (frame) return; // Soonest alarm already set, or will be. - if (timeout) timeout = clearTimeout(timeout); - var delay = time - clockNow; // Strictly less than if we recomputed clockNow. - if (delay > 24) { - if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); - if (interval) interval = clearInterval(interval); - } else { - if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); - frame = 1, setFrame(wake); +function set(type, name, callback) { + for (var i = 0, n = type.length; i < n; ++i) { + if (type[i].name === name) { + type[i] = noop, type = type.slice(0, i).concat(type.slice(i + 1)); + break; + } } + if (callback != null) type.push({name: name, value: callback}); + return type; } -function timeout$1(callback, delay, time) { - var t = new Timer; - delay = delay == null ? 0 : +delay; - t.restart(elapsed => { - t.stop(); - callback(elapsed + delay); - }, delay, time); - return t; -} - -function interval$1(callback, delay, time) { - var t = new Timer, total = delay; - if (delay == null) return t.restart(callback, delay, time), t; - t._restart = t.restart; - t.restart = function(callback, delay, time) { - delay = +delay, time = time == null ? now() : +time; - t._restart(function tick(elapsed) { - elapsed += total; - t._restart(tick, total += delay, time); - callback(elapsed); - }, delay, time); - }; - t.restart(callback, delay, time); - return t; -} - -exports.interval = interval$1; -exports.now = now; -exports.timeout = timeout$1; -exports.timer = timer; -exports.timerFlush = timerFlush; +exports.dispatch = dispatch; Object.defineProperty(exports, '__esModule', { value: true }); })); }); -var d3Ease = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-ease/ v2.0.0 Copyright 2020 Mike Bostock +var d3Selection = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-selection/ v2.0.0 Copyright 2020 Mike Bostock (function (global, factory) { factory(exports) ; }(commonjsGlobal, function (exports) { -const linear = t => +t; +var xhtml = "http://www.w3.org/1999/xhtml"; -function quadIn(t) { - return t * t; +var namespaces = { + svg: "http://www.w3.org/2000/svg", + xhtml: xhtml, + xlink: "http://www.w3.org/1999/xlink", + xml: "http://www.w3.org/XML/1998/namespace", + xmlns: "http://www.w3.org/2000/xmlns/" +}; + +function namespace(name) { + var prefix = name += "", i = prefix.indexOf(":"); + if (i >= 0 && (prefix = name.slice(0, i)) !== "xmlns") name = name.slice(i + 1); + return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins } -function quadOut(t) { - return t * (2 - t); +function creatorInherit(name) { + return function() { + var document = this.ownerDocument, + uri = this.namespaceURI; + return uri === xhtml && document.documentElement.namespaceURI === xhtml + ? document.createElement(name) + : document.createElementNS(uri, name); + }; } -function quadInOut(t) { - return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; +function creatorFixed(fullname) { + return function() { + return this.ownerDocument.createElementNS(fullname.space, fullname.local); + }; } -function cubicIn(t) { - return t * t * t; +function creator(name) { + var fullname = namespace(name); + return (fullname.local + ? creatorFixed + : creatorInherit)(fullname); } -function cubicOut(t) { - return --t * t * t + 1; -} +function none() {} -function cubicInOut(t) { - return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; +function selector(selector) { + return selector == null ? none : function() { + return this.querySelector(selector); + }; } -var exponent = 3; - -var polyIn = (function custom(e) { - e = +e; +function selection_select(select) { + if (typeof select !== "function") select = selector(select); - function polyIn(t) { - return Math.pow(t, e); + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + } + } } - polyIn.exponent = custom; - - return polyIn; -})(exponent); + return new Selection(subgroups, this._parents); +} -var polyOut = (function custom(e) { - e = +e; +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} - function polyOut(t) { - return 1 - Math.pow(1 - t, e); - } +function empty() { + return []; +} - polyOut.exponent = custom; +function selectorAll(selector) { + return selector == null ? empty : function() { + return this.querySelectorAll(selector); + }; +} - return polyOut; -})(exponent); +function arrayAll(select) { + return function() { + var group = select.apply(this, arguments); + return group == null ? [] : array(group); + }; +} -var polyInOut = (function custom(e) { - e = +e; +function selection_selectAll(select) { + if (typeof select === "function") select = arrayAll(select); + else select = selectorAll(select); - function polyInOut(t) { - return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + subgroups.push(select.call(node, node.__data__, i, group)); + parents.push(node); + } + } } - polyInOut.exponent = custom; + return new Selection(subgroups, parents); +} - return polyInOut; -})(exponent); +function matcher(selector) { + return function() { + return this.matches(selector); + }; +} -var pi = Math.PI, - halfPi = pi / 2; +function childMatcher(selector) { + return function(node) { + return node.matches(selector); + }; +} -function sinIn(t) { - return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi); +var find = Array.prototype.find; + +function childFind(match) { + return function() { + return find.call(this.children, match); + }; } -function sinOut(t) { - return Math.sin(t * halfPi); +function childFirst() { + return this.firstElementChild; } -function sinInOut(t) { - return (1 - Math.cos(pi * t)) / 2; +function selection_selectChild(match) { + return this.select(match == null ? childFirst + : childFind(typeof match === "function" ? match : childMatcher(match))); } -// tpmt is two power minus ten times t scaled to [0,1] -function tpmt(x) { - return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494; +var filter = Array.prototype.filter; + +function children() { + return this.children; } -function expIn(t) { - return tpmt(1 - +t); +function childrenFilter(match) { + return function() { + return filter.call(this.children, match); + }; } -function expOut(t) { - return 1 - tpmt(t); +function selection_selectChildren(match) { + return this.selectAll(match == null ? children + : childrenFilter(typeof match === "function" ? match : childMatcher(match))); } -function expInOut(t) { - return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2; +function selection_filter(match) { + if (typeof match !== "function") match = matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } + } + } + + return new Selection(subgroups, this._parents); } -function circleIn(t) { - return 1 - Math.sqrt(1 - t * t); +function sparse(update) { + return new Array(update.length); } -function circleOut(t) { - return Math.sqrt(1 - --t * t); +function selection_enter() { + return new Selection(this._enter || this._groups.map(sparse), this._parents); } -function circleInOut(t) { - return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +function EnterNode(parent, datum) { + this.ownerDocument = parent.ownerDocument; + this.namespaceURI = parent.namespaceURI; + this._next = null; + this._parent = parent; + this.__data__ = datum; } -var b1 = 4 / 11, - b2 = 6 / 11, - b3 = 8 / 11, - b4 = 3 / 4, - b5 = 9 / 11, - b6 = 10 / 11, - b7 = 15 / 16, - b8 = 21 / 22, - b9 = 63 / 64, - b0 = 1 / b1 / b1; +EnterNode.prototype = { + constructor: EnterNode, + appendChild: function(child) { return this._parent.insertBefore(child, this._next); }, + insertBefore: function(child, next) { return this._parent.insertBefore(child, next); }, + querySelector: function(selector) { return this._parent.querySelector(selector); }, + querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); } +}; -function bounceIn(t) { - return 1 - bounceOut(1 - t); +function constant(x) { + return function() { + return x; + }; } -function bounceOut(t) { - return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; -} +function bindIndex(parent, group, enter, update, exit, data) { + var i = 0, + node, + groupLength = group.length, + dataLength = data.length; -function bounceInOut(t) { - return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; + // Put any non-null nodes that fit into update. + // Put any null nodes into enter. + // Put any remaining data into enter. + for (; i < dataLength; ++i) { + if (node = group[i]) { + node.__data__ = data[i]; + update[i] = node; + } else { + enter[i] = new EnterNode(parent, data[i]); + } + } + + // Put any non-null nodes that don’t fit into exit. + for (; i < groupLength; ++i) { + if (node = group[i]) { + exit[i] = node; + } + } } -var overshoot = 1.70158; +function bindKey(parent, group, enter, update, exit, data, key) { + var i, + node, + nodeByKeyValue = new Map, + groupLength = group.length, + dataLength = data.length, + keyValues = new Array(groupLength), + keyValue; -var backIn = (function custom(s) { - s = +s; + // Compute the key for each node. + // If multiple nodes have the same key, the duplicates are added to exit. + for (i = 0; i < groupLength; ++i) { + if (node = group[i]) { + keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + ""; + if (nodeByKeyValue.has(keyValue)) { + exit[i] = node; + } else { + nodeByKeyValue.set(keyValue, node); + } + } + } - function backIn(t) { - return (t = +t) * t * (s * (t - 1) + t); + // Compute the key for each datum. + // If there a node associated with this key, join and add it to update. + // If there is not (or the key is a duplicate), add it to enter. + for (i = 0; i < dataLength; ++i) { + keyValue = key.call(parent, data[i], i, data) + ""; + if (node = nodeByKeyValue.get(keyValue)) { + update[i] = node; + node.__data__ = data[i]; + nodeByKeyValue.delete(keyValue); + } else { + enter[i] = new EnterNode(parent, data[i]); + } } - backIn.overshoot = custom; + // Add any remaining nodes that were not bound to data to exit. + for (i = 0; i < groupLength; ++i) { + if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) { + exit[i] = node; + } + } +} - return backIn; -})(overshoot); +function datum(node) { + return node.__data__; +} -var backOut = (function custom(s) { - s = +s; +function selection_data(value, key) { + if (!arguments.length) return Array.from(this, datum); - function backOut(t) { - return --t * t * ((t + 1) * s + t) + 1; - } + var bind = key ? bindKey : bindIndex, + parents = this._parents, + groups = this._groups; - backOut.overshoot = custom; + if (typeof value !== "function") value = constant(value); - return backOut; -})(overshoot); + for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) { + var parent = parents[j], + group = groups[j], + groupLength = group.length, + data = array(value.call(parent, parent && parent.__data__, j, parents)), + dataLength = data.length, + enterGroup = enter[j] = new Array(dataLength), + updateGroup = update[j] = new Array(dataLength), + exitGroup = exit[j] = new Array(groupLength); -var backInOut = (function custom(s) { - s = +s; + bind(parent, group, enterGroup, updateGroup, exitGroup, data, key); - function backInOut(t) { - return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + // Now connect the enter nodes to their following update node, such that + // appendChild can insert the materialized enter node before this node, + // rather than at the end of the parent node. + for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) { + if (previous = enterGroup[i0]) { + if (i0 >= i1) i1 = i0 + 1; + while (!(next = updateGroup[i1]) && ++i1 < dataLength); + previous._next = next || null; + } + } } - backInOut.overshoot = custom; + update = new Selection(update, parents); + update._enter = enter; + update._exit = exit; + return update; +} - return backInOut; -})(overshoot); +function selection_exit() { + return new Selection(this._exit || this._groups.map(sparse), this._parents); +} -var tau = 2 * Math.PI, - amplitude = 1, - period = 0.3; +function selection_join(onenter, onupdate, onexit) { + var enter = this.enter(), update = this, exit = this.exit(); + enter = typeof onenter === "function" ? onenter(enter) : enter.append(onenter + ""); + if (onupdate != null) update = onupdate(update); + if (onexit == null) exit.remove(); else onexit(exit); + return enter && update ? enter.merge(update).order() : update; +} -var elasticIn = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); +function selection_merge(selection) { + if (!(selection instanceof Selection)) throw new Error("invalid merge"); - function elasticIn(t) { - return a * tpmt(-(--t)) * Math.sin((s - t) / p); + for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } + } } - elasticIn.amplitude = function(a) { return custom(a, p * tau); }; - elasticIn.period = function(p) { return custom(a, p); }; - - return elasticIn; -})(amplitude, period); - -var elasticOut = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); - - function elasticOut(t) { - return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); + for (; j < m0; ++j) { + merges[j] = groups0[j]; } - elasticOut.amplitude = function(a) { return custom(a, p * tau); }; - elasticOut.period = function(p) { return custom(a, p); }; - - return elasticOut; -})(amplitude, period); + return new Selection(merges, this._parents); +} -var elasticInOut = (function custom(a, p) { - var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); +function selection_order() { - function elasticInOut(t) { - return ((t = t * 2 - 1) < 0 - ? a * tpmt(-t) * Math.sin((s - t) / p) - : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; + for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) { + for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) { + if (node = group[i]) { + if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next); + next = node; + } + } } - elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; - elasticInOut.period = function(p) { return custom(a, p); }; - - return elasticInOut; -})(amplitude, period); - -exports.easeBack = backInOut; -exports.easeBackIn = backIn; -exports.easeBackInOut = backInOut; -exports.easeBackOut = backOut; -exports.easeBounce = bounceOut; -exports.easeBounceIn = bounceIn; -exports.easeBounceInOut = bounceInOut; -exports.easeBounceOut = bounceOut; -exports.easeCircle = circleInOut; -exports.easeCircleIn = circleIn; -exports.easeCircleInOut = circleInOut; -exports.easeCircleOut = circleOut; -exports.easeCubic = cubicInOut; -exports.easeCubicIn = cubicIn; -exports.easeCubicInOut = cubicInOut; -exports.easeCubicOut = cubicOut; -exports.easeElastic = elasticOut; -exports.easeElasticIn = elasticIn; -exports.easeElasticInOut = elasticInOut; -exports.easeElasticOut = elasticOut; -exports.easeExp = expInOut; -exports.easeExpIn = expIn; -exports.easeExpInOut = expInOut; -exports.easeExpOut = expOut; -exports.easeLinear = linear; -exports.easePoly = polyInOut; -exports.easePolyIn = polyIn; -exports.easePolyInOut = polyInOut; -exports.easePolyOut = polyOut; -exports.easeQuad = quadInOut; -exports.easeQuadIn = quadIn; -exports.easeQuadInOut = quadInOut; -exports.easeQuadOut = quadOut; -exports.easeSin = sinInOut; -exports.easeSinIn = sinIn; -exports.easeSinInOut = sinInOut; -exports.easeSinOut = sinOut; + return this; +} -Object.defineProperty(exports, '__esModule', { value: true }); +function selection_sort(compare) { + if (!compare) compare = ascending; -})); -}); + function compareNode(a, b) { + return a && b ? compare(a.__data__, b.__data__) : !a - !b; + } -var d3Transition = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-transition/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) ; -}(commonjsGlobal, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { -var emptyOn = d3Dispatch.dispatch("start", "end", "cancel", "interrupt"); -var emptyTween = []; + for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group[i]) { + sortgroup[i] = node; + } + } + sortgroup.sort(compareNode); + } -var CREATED = 0; -var SCHEDULED = 1; -var STARTING = 2; -var STARTED = 3; -var RUNNING = 4; -var ENDING = 5; -var ENDED = 6; + return new Selection(sortgroups, this._parents).order(); +} -function schedule(node, name, id, index, group, timing) { - var schedules = node.__transition; - if (!schedules) node.__transition = {}; - else if (id in schedules) return; - create(node, id, { - name: name, - index: index, // For context during callback. - group: group, // For context during callback. - on: emptyOn, - tween: emptyTween, - time: timing.time, - delay: timing.delay, - duration: timing.duration, - ease: timing.ease, - timer: null, - state: CREATED - }); +function ascending(a, b) { + return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; } -function init(node, id) { - var schedule = get(node, id); - if (schedule.state > CREATED) throw new Error("too late; already scheduled"); - return schedule; +function selection_call() { + var callback = arguments[0]; + arguments[0] = this; + callback.apply(null, arguments); + return this; } -function set(node, id) { - var schedule = get(node, id); - if (schedule.state > STARTED) throw new Error("too late; already running"); - return schedule; +function selection_nodes() { + return Array.from(this); } -function get(node, id) { - var schedule = node.__transition; - if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); - return schedule; +function selection_node() { + + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length; i < n; ++i) { + var node = group[i]; + if (node) return node; + } + } + + return null; } -function create(node, id, self) { - var schedules = node.__transition, - tween; +function selection_size() { + let size = 0; + for (const node of this) ++size; // eslint-disable-line no-unused-vars + return size; +} - // Initialize the self timer when the transition is created. - // Note the actual delay is not known until the first callback! - schedules[id] = self; - self.timer = d3Timer.timer(schedule, 0, self.time); +function selection_empty() { + return !this.node(); +} - function schedule(elapsed) { - self.state = SCHEDULED; - self.timer.restart(start, self.delay, self.time); +function selection_each(callback) { - // If the elapsed delay is less than our first sleep, start immediately. - if (self.delay <= elapsed) start(elapsed - self.delay); + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) callback.call(node, node.__data__, i, group); + } } - function start(elapsed) { - var i, j, n, o; + return this; +} - // If the state is not SCHEDULED, then we previously errored on start. - if (self.state !== SCHEDULED) return stop(); +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} - for (i in schedules) { - o = schedules[i]; - if (o.name !== self.name) continue; +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; +} - // While this element already has a starting transition during this frame, - // defer starting an interrupting transition until that transition has a - // chance to tick (and possibly end); see d3/d3-transition#54! - if (o.state === STARTED) return d3Timer.timeout(start); +function attrConstant(name, value) { + return function() { + this.setAttribute(name, value); + }; +} - // Interrupt the active transition, if any. - if (o.state === RUNNING) { - o.state = ENDED; - o.timer.stop(); - o.on.call("interrupt", node, node.__data__, o.index, o.group); - delete schedules[i]; - } +function attrConstantNS(fullname, value) { + return function() { + this.setAttributeNS(fullname.space, fullname.local, value); + }; +} - // Cancel any pre-empted transitions. - else if (+i < id) { - o.state = ENDED; - o.timer.stop(); - o.on.call("cancel", node, node.__data__, o.index, o.group); - delete schedules[i]; - } - } +function attrFunction(name, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttribute(name); + else this.setAttribute(name, v); + }; +} - // Defer the first tick to end of the current frame; see d3/d3#1576. - // Note the transition may be canceled after start and before the first tick! - // Note this must be scheduled before the start event; see d3/d3-transition#16! - // Assuming this is successful, subsequent callbacks go straight to tick. - d3Timer.timeout(function() { - if (self.state === STARTED) { - self.state = RUNNING; - self.timer.restart(tick, self.delay, self.time); - tick(elapsed); - } - }); +function attrFunctionNS(fullname, value) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.removeAttributeNS(fullname.space, fullname.local); + else this.setAttributeNS(fullname.space, fullname.local, v); + }; +} - // Dispatch the start event. - // Note this must be done before the tween are initialized. - self.state = STARTING; - self.on.call("start", node, node.__data__, self.index, self.group); - if (self.state !== STARTING) return; // interrupted - self.state = STARTED; +function selection_attr(name, value) { + var fullname = namespace(name); - // Initialize the tween, deleting null tween. - tween = new Array(n = self.tween.length); - for (i = 0, j = -1; i < n; ++i) { - if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { - tween[++j] = o; - } - } - tween.length = j + 1; + if (arguments.length < 2) { + var node = this.node(); + return fullname.local + ? node.getAttributeNS(fullname.space, fullname.local) + : node.getAttribute(fullname); } - function tick(elapsed) { - var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), - i = -1, - n = tween.length; - - while (++i < n) { - tween[i].call(node, t); - } + return this.each((value == null + ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction) + : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value)); +} - // Dispatch the end event. - if (self.state === ENDING) { - self.on.call("end", node, node.__data__, self.index, self.group); - stop(); - } - } +function defaultView(node) { + return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node + || (node.document && node) // node is a Window + || node.defaultView; // node is a Document +} - function stop() { - self.state = ENDED; - self.timer.stop(); - delete schedules[id]; - for (var i in schedules) return; // eslint-disable-line no-unused-vars - delete node.__transition; - } +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; } -function interrupt(node, name) { - var schedules = node.__transition, - schedule, - active, - empty = true, - i; +function styleConstant(name, value, priority) { + return function() { + this.style.setProperty(name, value, priority); + }; +} - if (!schedules) return; +function styleFunction(name, value, priority) { + return function() { + var v = value.apply(this, arguments); + if (v == null) this.style.removeProperty(name); + else this.style.setProperty(name, v, priority); + }; +} - name = name == null ? null : name + ""; +function selection_style(name, value, priority) { + return arguments.length > 1 + ? this.each((value == null + ? styleRemove : typeof value === "function" + ? styleFunction + : styleConstant)(name, value, priority == null ? "" : priority)) + : styleValue(this.node(), name); +} - for (i in schedules) { - if ((schedule = schedules[i]).name !== name) { empty = false; continue; } - active = schedule.state > STARTING && schedule.state < ENDING; - schedule.state = ENDED; - schedule.timer.stop(); - schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); - delete schedules[i]; - } +function styleValue(node, name) { + return node.style.getPropertyValue(name) + || defaultView(node).getComputedStyle(node, null).getPropertyValue(name); +} - if (empty) delete node.__transition; +function propertyRemove(name) { + return function() { + delete this[name]; + }; } -function selection_interrupt(name) { - return this.each(function() { - interrupt(this, name); - }); +function propertyConstant(name, value) { + return function() { + this[name] = value; + }; } -function tweenRemove(id, name) { - var tween0, tween1; +function propertyFunction(name, value) { return function() { - var schedule = set(this, id), - tween = schedule.tween; + var v = value.apply(this, arguments); + if (v == null) delete this[name]; + else this[name] = v; + }; +} - // If this node shared tween with the previous node, - // just assign the updated shared tween and we’re done! - // Otherwise, copy-on-write. - if (tween !== tween0) { - tween1 = tween0 = tween; - for (var i = 0, n = tween1.length; i < n; ++i) { - if (tween1[i].name === name) { - tween1 = tween1.slice(); - tween1.splice(i, 1); - break; - } - } +function selection_property(name, value) { + return arguments.length > 1 + ? this.each((value == null + ? propertyRemove : typeof value === "function" + ? propertyFunction + : propertyConstant)(name, value)) + : this.node()[name]; +} + +function classArray(string) { + return string.trim().split(/^|\s+/); +} + +function classList(node) { + return node.classList || new ClassList(node); +} + +function ClassList(node) { + this._node = node; + this._names = classArray(node.getAttribute("class") || ""); +} + +ClassList.prototype = { + add: function(name) { + var i = this._names.indexOf(name); + if (i < 0) { + this._names.push(name); + this._node.setAttribute("class", this._names.join(" ")); + } + }, + remove: function(name) { + var i = this._names.indexOf(name); + if (i >= 0) { + this._names.splice(i, 1); + this._node.setAttribute("class", this._names.join(" ")); } + }, + contains: function(name) { + return this._names.indexOf(name) >= 0; + } +}; - schedule.tween = tween1; - }; +function classedAdd(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.add(names[i]); } -function tweenFunction(id, name, value) { - var tween0, tween1; - if (typeof value !== "function") throw new Error; - return function() { - var schedule = set(this, id), - tween = schedule.tween; +function classedRemove(node, names) { + var list = classList(node), i = -1, n = names.length; + while (++i < n) list.remove(names[i]); +} - // If this node shared tween with the previous node, - // just assign the updated shared tween and we’re done! - // Otherwise, copy-on-write. - if (tween !== tween0) { - tween1 = (tween0 = tween).slice(); - for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { - if (tween1[i].name === name) { - tween1[i] = t; - break; - } - } - if (i === n) tween1.push(t); - } +function classedTrue(names) { + return function() { + classedAdd(this, names); + }; +} - schedule.tween = tween1; +function classedFalse(names) { + return function() { + classedRemove(this, names); }; } -function transition_tween(name, value) { - var id = this._id; +function classedFunction(names, value) { + return function() { + (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names); + }; +} - name += ""; +function selection_classed(name, value) { + var names = classArray(name + ""); if (arguments.length < 2) { - var tween = get(this.node(), id).tween; - for (var i = 0, n = tween.length, t; i < n; ++i) { - if ((t = tween[i]).name === name) { - return t.value; - } - } - return null; + var list = classList(this.node()), i = -1, n = names.length; + while (++i < n) if (!list.contains(names[i])) return false; + return true; } - return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); -} - -function tweenValue(transition, name, value) { - var id = transition._id; - - transition.each(function() { - var schedule = set(this, id); - (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); - }); - - return function(node) { - return get(node, id).value[name]; - }; + return this.each((typeof value === "function" + ? classedFunction : value + ? classedTrue + : classedFalse)(names, value)); } -function interpolate(a, b) { - var c; - return (typeof b === "number" ? d3Interpolate.interpolateNumber - : b instanceof d3Color.color ? d3Interpolate.interpolateRgb - : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) - : d3Interpolate.interpolateString)(a, b); +function textRemove() { + this.textContent = ""; } -function attrRemove(name) { +function textConstant(value) { return function() { - this.removeAttribute(name); + this.textContent = value; }; } -function attrRemoveNS(fullname) { +function textFunction(value) { return function() { - this.removeAttributeNS(fullname.space, fullname.local); + var v = value.apply(this, arguments); + this.textContent = v == null ? "" : v; }; } -function attrConstant(name, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = this.getAttribute(name); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); - }; +function selection_text(value) { + return arguments.length + ? this.each(value == null + ? textRemove : (typeof value === "function" + ? textFunction + : textConstant)(value)) + : this.node().textContent; } -function attrConstantNS(fullname, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = this.getAttributeNS(fullname.space, fullname.local); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); - }; +function htmlRemove() { + this.innerHTML = ""; } -function attrFunction(name, interpolate, value) { - var string00, - string10, - interpolate0; +function htmlConstant(value) { return function() { - var string0, value1 = value(this), string1; - if (value1 == null) return void this.removeAttribute(name); - string0 = this.getAttribute(name); - string1 = value1 + ""; - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + this.innerHTML = value; }; } -function attrFunctionNS(fullname, interpolate, value) { - var string00, - string10, - interpolate0; +function htmlFunction(value) { return function() { - var string0, value1 = value(this), string1; - if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); - string0 = this.getAttributeNS(fullname.space, fullname.local); - string1 = value1 + ""; - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + var v = value.apply(this, arguments); + this.innerHTML = v == null ? "" : v; }; } -function transition_attr(name, value) { - var fullname = d3Selection.namespace(name), i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; - return this.attrTween(name, typeof value === "function" - ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) - : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) - : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); +function selection_html(value) { + return arguments.length + ? this.each(value == null + ? htmlRemove : (typeof value === "function" + ? htmlFunction + : htmlConstant)(value)) + : this.node().innerHTML; } -function attrInterpolate(name, i) { - return function(t) { - this.setAttribute(name, i.call(this, t)); - }; +function raise() { + if (this.nextSibling) this.parentNode.appendChild(this); } -function attrInterpolateNS(fullname, i) { - return function(t) { - this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); - }; +function selection_raise() { + return this.each(raise); } -function attrTweenNS(fullname, value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); - return t0; - } - tween._value = value; - return tween; +function lower() { + if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild); } -function attrTween(name, value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); - return t0; - } - tween._value = value; - return tween; +function selection_lower() { + return this.each(lower); } -function transition_attrTween(name, value) { - var key = "attr." + name; - if (arguments.length < 2) return (key = this.tween(key)) && key._value; - if (value == null) return this.tween(key, null); - if (typeof value !== "function") throw new Error; - var fullname = d3Selection.namespace(name); - return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +function selection_append(name) { + var create = typeof name === "function" ? name : creator(name); + return this.select(function() { + return this.appendChild(create.apply(this, arguments)); + }); } -function delayFunction(id, value) { - return function() { - init(this, id).delay = +value.apply(this, arguments); - }; +function constantNull() { + return null; } -function delayConstant(id, value) { - return value = +value, function() { - init(this, id).delay = value; - }; +function selection_insert(name, before) { + var create = typeof name === "function" ? name : creator(name), + select = before == null ? constantNull : typeof before === "function" ? before : selector(before); + return this.select(function() { + return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null); + }); } -function transition_delay(value) { - var id = this._id; +function remove() { + var parent = this.parentNode; + if (parent) parent.removeChild(this); +} - return arguments.length - ? this.each((typeof value === "function" - ? delayFunction - : delayConstant)(id, value)) - : get(this.node(), id).delay; +function selection_remove() { + return this.each(remove); } -function durationFunction(id, value) { - return function() { - set(this, id).duration = +value.apply(this, arguments); - }; +function selection_cloneShallow() { + var clone = this.cloneNode(false), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; } -function durationConstant(id, value) { - return value = +value, function() { - set(this, id).duration = value; - }; +function selection_cloneDeep() { + var clone = this.cloneNode(true), parent = this.parentNode; + return parent ? parent.insertBefore(clone, this.nextSibling) : clone; } -function transition_duration(value) { - var id = this._id; +function selection_clone(deep) { + return this.select(deep ? selection_cloneDeep : selection_cloneShallow); +} +function selection_datum(value) { return arguments.length - ? this.each((typeof value === "function" - ? durationFunction - : durationConstant)(id, value)) - : get(this.node(), id).duration; + ? this.property("__data__", value) + : this.node().__data__; } -function easeConstant(id, value) { - if (typeof value !== "function") throw new Error; - return function() { - set(this, id).ease = value; +function contextListener(listener) { + return function(event) { + listener.call(this, event, this.__data__); }; } -function transition_ease(value) { - var id = this._id; - - return arguments.length - ? this.each(easeConstant(id, value)) - : get(this.node(), id).ease; +function parseTypenames(typenames) { + return typenames.trim().split(/^|\s+/).map(function(t) { + var name = "", i = t.indexOf("."); + if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i); + return {type: t, name: name}; + }); } -function easeVarying(id, value) { +function onRemove(typename) { return function() { - var v = value.apply(this, arguments); - if (typeof v !== "function") throw new Error; - set(this, id).ease = v; + var on = this.__on; + if (!on) return; + for (var j = 0, i = -1, m = on.length, o; j < m; ++j) { + if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + } else { + on[++i] = o; + } + } + if (++i) on.length = i; + else delete this.__on; }; } -function transition_easeVarying(value) { - if (typeof value !== "function") throw new Error; - return this.each(easeVarying(this._id, value)); +function onAdd(typename, value, options) { + return function() { + var on = this.__on, o, listener = contextListener(value); + if (on) for (var j = 0, m = on.length; j < m; ++j) { + if ((o = on[j]).type === typename.type && o.name === typename.name) { + this.removeEventListener(o.type, o.listener, o.options); + this.addEventListener(o.type, o.listener = listener, o.options = options); + o.value = value; + return; + } + } + this.addEventListener(typename.type, listener, options); + o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options}; + if (!on) this.__on = [o]; + else on.push(o); + }; } -function transition_filter(match) { - if (typeof match !== "function") match = d3Selection.matcher(match); +function selection_on(typename, value, options) { + var typenames = parseTypenames(typename + ""), i, n = typenames.length, t; - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { - if ((node = group[i]) && match.call(node, node.__data__, i, group)) { - subgroup.push(node); + if (arguments.length < 2) { + var on = this.node().__on; + if (on) for (var j = 0, m = on.length, o; j < m; ++j) { + for (i = 0, o = on[j]; i < n; ++i) { + if ((t = typenames[i]).type === o.type && t.name === o.name) { + return o.value; + } } } + return; } - return new Transition(subgroups, this._parents, this._name, this._id); + on = value ? onAdd : onRemove; + for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options)); + return this; } -function transition_merge(transition) { - if (transition._id !== this._id) throw new Error; - - for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { - for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { - if (node = group0[i] || group1[i]) { - merge[i] = node; - } - } - } +function dispatchEvent(node, type, params) { + var window = defaultView(node), + event = window.CustomEvent; - for (; j < m0; ++j) { - merges[j] = groups0[j]; + if (typeof event === "function") { + event = new event(type, params); + } else { + event = window.document.createEvent("Event"); + if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail; + else event.initEvent(type, false, false); } - return new Transition(merges, this._parents, this._name, this._id); -} - -function start(name) { - return (name + "").trim().split(/^|\s+/).every(function(t) { - var i = t.indexOf("."); - if (i >= 0) t = t.slice(0, i); - return !t || t === "start"; - }); + node.dispatchEvent(event); } -function onFunction(id, name, listener) { - var on0, on1, sit = start(name) ? init : set; +function dispatchConstant(type, params) { return function() { - var schedule = sit(this, id), - on = schedule.on; - - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); - - schedule.on = on1; + return dispatchEvent(this, type, params); }; } -function transition_on(name, listener) { - var id = this._id; - - return arguments.length < 2 - ? get(this.node(), id).on.on(name) - : this.each(onFunction(id, name, listener)); -} - -function removeFunction(id) { +function dispatchFunction(type, params) { return function() { - var parent = this.parentNode; - for (var i in this.__transition) if (+i !== id) return; - if (parent) parent.removeChild(this); + return dispatchEvent(this, type, params.apply(this, arguments)); }; } -function transition_remove() { - return this.on("end.remove", removeFunction(this._id)); -} - -function transition_select(select) { - var name = this._name, - id = this._id; - - if (typeof select !== "function") select = d3Selection.selector(select); - - for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { - if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { - if ("__data__" in node) subnode.__data__ = node.__data__; - subgroup[i] = subnode; - schedule(subgroup[i], name, id, i, subgroup, get(node, id)); - } - } - } - - return new Transition(subgroups, this._parents, name, id); +function selection_dispatch(type, params) { + return this.each((typeof params === "function" + ? dispatchFunction + : dispatchConstant)(type, params)); } -function transition_selectAll(select) { - var name = this._name, - id = this._id; - - if (typeof select !== "function") select = d3Selection.selectorAll(select); - - for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { - if (child = children[k]) { - schedule(child, name, id, k, children, inherit); - } - } - subgroups.push(children); - parents.push(node); - } +function* selection_iterator() { + for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) { + for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) { + if (node = group[i]) yield node; } } - - return new Transition(subgroups, parents, name, id); } -var Selection = d3Selection.selection.prototype.constructor; +var root = [null]; -function transition_selection() { - return new Selection(this._groups, this._parents); +function Selection(groups, parents) { + this._groups = groups; + this._parents = parents; } -function styleNull(name, interpolate) { - var string00, - string10, - interpolate0; - return function() { - var string0 = d3Selection.style(this, name), - string1 = (this.style.removeProperty(name), d3Selection.style(this, name)); - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, string10 = string1); - }; +function selection() { + return new Selection([[document.documentElement]], root); } -function styleRemove(name) { - return function() { - this.style.removeProperty(name); - }; +function selection_selection() { + return this; } -function styleConstant(name, interpolate, value1) { - var string00, - string1 = value1 + "", - interpolate0; - return function() { - var string0 = d3Selection.style(this, name); - return string0 === string1 ? null - : string0 === string00 ? interpolate0 - : interpolate0 = interpolate(string00 = string0, value1); - }; -} +Selection.prototype = selection.prototype = { + constructor: Selection, + select: selection_select, + selectAll: selection_selectAll, + selectChild: selection_selectChild, + selectChildren: selection_selectChildren, + filter: selection_filter, + data: selection_data, + enter: selection_enter, + exit: selection_exit, + join: selection_join, + merge: selection_merge, + selection: selection_selection, + order: selection_order, + sort: selection_sort, + call: selection_call, + nodes: selection_nodes, + node: selection_node, + size: selection_size, + empty: selection_empty, + each: selection_each, + attr: selection_attr, + style: selection_style, + property: selection_property, + classed: selection_classed, + text: selection_text, + html: selection_html, + raise: selection_raise, + lower: selection_lower, + append: selection_append, + insert: selection_insert, + remove: selection_remove, + clone: selection_clone, + datum: selection_datum, + on: selection_on, + dispatch: selection_dispatch, + [Symbol.iterator]: selection_iterator +}; -function styleFunction(name, interpolate, value) { - var string00, - string10, - interpolate0; - return function() { - var string0 = d3Selection.style(this, name), - value1 = value(this), - string1 = value1 + ""; - if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); - return string0 === string1 ? null - : string0 === string00 && string1 === string10 ? interpolate0 - : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); - }; +function select(selector) { + return typeof selector === "string" + ? new Selection([[document.querySelector(selector)]], [document.documentElement]) + : new Selection([[selector]], root); } -function styleMaybeRemove(id, name) { - var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; - return function() { - var schedule = set(this, id), - on = schedule.on, - listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; +function create(name) { + return select(creator(name).call(document.documentElement)); +} - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); +var nextId = 0; - schedule.on = on1; - }; +function local() { + return new Local; } -function transition_style(name, value, priority) { - var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; - return value == null ? this - .styleTween(name, styleNull(name, i)) - .on("end.style." + name, styleRemove(name)) - : typeof value === "function" ? this - .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) - .each(styleMaybeRemove(this._id, name)) - : this - .styleTween(name, styleConstant(name, i, value), priority) - .on("end.style." + name, null); +function Local() { + this._ = "@" + (++nextId).toString(36); } -function styleInterpolate(name, i, priority) { - return function(t) { - this.style.setProperty(name, i.call(this, t), priority); - }; +Local.prototype = local.prototype = { + constructor: Local, + get: function(node) { + var id = this._; + while (!(id in node)) if (!(node = node.parentNode)) return; + return node[id]; + }, + set: function(node, value) { + return node[this._] = value; + }, + remove: function(node) { + return this._ in node && delete node[this._]; + }, + toString: function() { + return this._; + } +}; + +function sourceEvent(event) { + let sourceEvent; + while (sourceEvent = event.sourceEvent) event = sourceEvent; + return event; } -function styleTween(name, value, priority) { - var t, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); - return t; +function pointer(event, node) { + event = sourceEvent(event); + if (node === undefined) node = event.currentTarget; + if (node) { + var svg = node.ownerSVGElement || node; + if (svg.createSVGPoint) { + var point = svg.createSVGPoint(); + point.x = event.clientX, point.y = event.clientY; + point = point.matrixTransform(node.getScreenCTM().inverse()); + return [point.x, point.y]; + } + if (node.getBoundingClientRect) { + var rect = node.getBoundingClientRect(); + return [event.clientX - rect.left - node.clientLeft, event.clientY - rect.top - node.clientTop]; + } } - tween._value = value; - return tween; + return [event.pageX, event.pageY]; } -function transition_styleTween(name, value, priority) { - var key = "style." + (name += ""); - if (arguments.length < 2) return (key = this.tween(key)) && key._value; - if (value == null) return this.tween(key, null); - if (typeof value !== "function") throw new Error; - return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +function pointers(events, node) { + if (events.target) { // i.e., instanceof Event, not TouchList or iterable + events = sourceEvent(events); + if (node === undefined) node = events.currentTarget; + events = events.touches || [events]; + } + return Array.from(events, event => pointer(event, node)); } -function textConstant(value) { - return function() { - this.textContent = value; - }; +function selectAll(selector) { + return typeof selector === "string" + ? new Selection([document.querySelectorAll(selector)], [document.documentElement]) + : new Selection([selector == null ? [] : array(selector)], root); } -function textFunction(value) { - return function() { - var value1 = value(this); - this.textContent = value1 == null ? "" : value1; - }; -} +exports.create = create; +exports.creator = creator; +exports.local = local; +exports.matcher = matcher; +exports.namespace = namespace; +exports.namespaces = namespaces; +exports.pointer = pointer; +exports.pointers = pointers; +exports.select = select; +exports.selectAll = selectAll; +exports.selection = selection; +exports.selector = selector; +exports.selectorAll = selectorAll; +exports.style = styleValue; +exports.window = defaultView; -function transition_text(value) { - return this.tween("text", typeof value === "function" - ? textFunction(tweenValue(this, "text", value)) - : textConstant(value == null ? "" : value + "")); -} +Object.defineProperty(exports, '__esModule', { value: true }); -function textInterpolate(i) { - return function(t) { - this.textContent = i.call(this, t); - }; -} +})); +}); -function textTween(value) { - var t0, i0; - function tween() { - var i = value.apply(this, arguments); - if (i !== i0) t0 = (i0 = i) && textInterpolate(i); - return t0; - } - tween._value = value; - return tween; +var d3Drag = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-drag/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Dispatch, d3Selection) ; +}(commonjsGlobal, function (exports, d3Dispatch, d3Selection) { +function nopropagation(event) { + event.stopImmediatePropagation(); } -function transition_textTween(value) { - var key = "text"; - if (arguments.length < 1) return (key = this.tween(key)) && key._value; - if (value == null) return this.tween(key, null); - if (typeof value !== "function") throw new Error; - return this.tween(key, textTween(value)); +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); } -function transition_transition() { - var name = this._name, - id0 = this._id, - id1 = newId(); - - for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - var inherit = get(node, id0); - schedule(node, name, id1, i, group, { - time: inherit.time + inherit.delay + inherit.duration, - delay: 0, - duration: inherit.duration, - ease: inherit.ease - }); - } - } +function nodrag(view) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", noevent, true); + if ("onselectstart" in root) { + selection.on("selectstart.drag", noevent, true); + } else { + root.__noselect = root.style.MozUserSelect; + root.style.MozUserSelect = "none"; } - - return new Transition(groups, this._parents, name, id1); } -function transition_end() { - var on0, on1, that = this, id = that._id, size = that.size(); - return new Promise(function(resolve, reject) { - var cancel = {value: reject}, - end = {value: function() { if (--size === 0) resolve(); }}; - - that.each(function() { - var schedule = set(this, id), - on = schedule.on; - - // If this node shared a dispatch with the previous node, - // just assign the updated shared dispatch and we’re done! - // Otherwise, copy-on-write. - if (on !== on0) { - on1 = (on0 = on).copy(); - on1._.cancel.push(cancel); - on1._.interrupt.push(cancel); - on1._.end.push(end); - } +function yesdrag(view, noclick) { + var root = view.document.documentElement, + selection = d3Selection.select(view).on("dragstart.drag", null); + if (noclick) { + selection.on("click.drag", noevent, true); + setTimeout(function() { selection.on("click.drag", null); }, 0); + } + if ("onselectstart" in root) { + selection.on("selectstart.drag", null); + } else { + root.style.MozUserSelect = root.__noselect; + delete root.__noselect; + } +} - schedule.on = on1; - }); +var constant = x => () => x; - // The selection was empty, resolve end immediately - if (size === 0) resolve(); +function DragEvent(type, { + sourceEvent, + subject, + target, + identifier, + active, + x, y, dx, dy, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + subject: {value: subject, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + identifier: {value: identifier, enumerable: true, configurable: true}, + active: {value: active, enumerable: true, configurable: true}, + x: {value: x, enumerable: true, configurable: true}, + y: {value: y, enumerable: true, configurable: true}, + dx: {value: dx, enumerable: true, configurable: true}, + dy: {value: dy, enumerable: true, configurable: true}, + _: {value: dispatch} }); } -var id = 0; +DragEvent.prototype.on = function() { + var value = this._.on.apply(this._, arguments); + return value === this._ ? this : value; +}; -function Transition(groups, parents, name, id) { - this._groups = groups; - this._parents = parents; - this._name = name; - this._id = id; +// Ignore right-click, since that should open the context menu. +function defaultFilter(event) { + return !event.ctrlKey && !event.button; } -function transition(name) { - return d3Selection.selection().transition(name); +function defaultContainer() { + return this.parentNode; } -function newId() { - return ++id; +function defaultSubject(event, d) { + return d == null ? {x: event.x, y: event.y} : d; } -var selection_prototype = d3Selection.selection.prototype; +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} -Transition.prototype = transition.prototype = { - constructor: Transition, - select: transition_select, - selectAll: transition_selectAll, - filter: transition_filter, - merge: transition_merge, - selection: transition_selection, - transition: transition_transition, - call: selection_prototype.call, - nodes: selection_prototype.nodes, - node: selection_prototype.node, - size: selection_prototype.size, - empty: selection_prototype.empty, - each: selection_prototype.each, - on: transition_on, - attr: transition_attr, - attrTween: transition_attrTween, - style: transition_style, - styleTween: transition_styleTween, - text: transition_text, - textTween: transition_textTween, - remove: transition_remove, - tween: transition_tween, - delay: transition_delay, - duration: transition_duration, - ease: transition_ease, - easeVarying: transition_easeVarying, - end: transition_end, - [Symbol.iterator]: selection_prototype[Symbol.iterator] -}; +function drag() { + var filter = defaultFilter, + container = defaultContainer, + subject = defaultSubject, + touchable = defaultTouchable, + gestures = {}, + listeners = d3Dispatch.dispatch("start", "drag", "end"), + active = 0, + mousedownx, + mousedowny, + mousemoving, + touchending, + clickDistance2 = 0; -var defaultTiming = { - time: null, // Set on use. - delay: 0, - duration: 250, - ease: d3Ease.easeCubicInOut -}; + function drag(selection) { + selection + .on("mousedown.drag", mousedowned) + .filter(touchable) + .on("touchstart.drag", touchstarted) + .on("touchmove.drag", touchmoved) + .on("touchend.drag touchcancel.drag", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } -function inherit(node, id) { - var timing; - while (!(timing = node.__transition) || !(timing = timing[id])) { - if (!(node = node.parentNode)) { - throw new Error(`transition ${id} not found`); + function mousedowned(event, d) { + if (touchending || !filter.call(this, event, d)) return; + var gesture = beforestart(this, container.call(this, event, d), event, d, "mouse"); + if (!gesture) return; + d3Selection.select(event.view).on("mousemove.drag", mousemoved, true).on("mouseup.drag", mouseupped, true); + nodrag(event.view); + nopropagation(event); + mousemoving = false; + mousedownx = event.clientX; + mousedowny = event.clientY; + gesture("start", event); + } + + function mousemoved(event) { + noevent(event); + if (!mousemoving) { + var dx = event.clientX - mousedownx, dy = event.clientY - mousedowny; + mousemoving = dx * dx + dy * dy > clickDistance2; } + gestures.mouse("drag", event); } - return timing; -} -function selection_transition(name) { - var id, - timing; + function mouseupped(event) { + d3Selection.select(event.view).on("mousemove.drag mouseup.drag", null); + yesdrag(event.view, mousemoving); + noevent(event); + gestures.mouse("end", event); + } - if (name instanceof Transition) { - id = name._id, name = name._name; - } else { - id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; + function touchstarted(event, d) { + if (!filter.call(this, event, d)) return; + var touches = event.changedTouches, + c = container.call(this, event, d), + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = beforestart(this, c, event, d, touches[i].identifier, touches[i])) { + nopropagation(event); + gesture("start", event, touches[i]); + } + } } - for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { - for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { - if (node = group[i]) { - schedule(node, name, id, i, group, timing || inherit(node, id)); + function touchmoved(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; + + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + noevent(event); + gesture("drag", event, touches[i]); } } } - return new Transition(groups, this._parents, name, id); -} + function touchended(event) { + var touches = event.changedTouches, + n = touches.length, i, gesture; -d3Selection.selection.prototype.interrupt = selection_interrupt; -d3Selection.selection.prototype.transition = selection_transition; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + for (i = 0; i < n; ++i) { + if (gesture = gestures[touches[i].identifier]) { + nopropagation(event); + gesture("end", event, touches[i]); + } + } + } -var root = [null]; + function beforestart(that, container, event, d, identifier, touch) { + var dispatch = listeners.copy(), + p = d3Selection.pointer(touch || event, container), dx, dy, + s; -function active(node, name) { - var schedules = node.__transition, - schedule, - i; + if ((s = subject.call(that, new DragEvent("beforestart", { + sourceEvent: event, + target: drag, + identifier, + active, + x: p[0], + y: p[1], + dx: 0, + dy: 0, + dispatch + }), d)) == null) return; - if (schedules) { - name = name == null ? null : name + ""; - for (i in schedules) { - if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { - return new Transition([[node]], root, name, +i); + dx = s.x - p[0] || 0; + dy = s.y - p[1] || 0; + + return function gesture(type, event, touch) { + var p0 = p, n; + switch (type) { + case "start": gestures[identifier] = gesture, n = active++; break; + case "end": delete gestures[identifier], --active; // nobreak + case "drag": p = d3Selection.pointer(touch || event, container), n = active; break; } - } + dispatch.call( + type, + that, + new DragEvent(type, { + sourceEvent: event, + subject: s, + target: drag, + identifier, + active: n, + x: p[0] + dx, + y: p[1] + dy, + dx: p[0] - p0[0], + dy: p[1] - p0[1], + dispatch + }), + d + ); + }; } - return null; + drag.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), drag) : filter; + }; + + drag.container = function(_) { + return arguments.length ? (container = typeof _ === "function" ? _ : constant(_), drag) : container; + }; + + drag.subject = function(_) { + return arguments.length ? (subject = typeof _ === "function" ? _ : constant(_), drag) : subject; + }; + + drag.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), drag) : touchable; + }; + + drag.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? drag : value; + }; + + drag.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, drag) : Math.sqrt(clickDistance2); + }; + + return drag; } -exports.active = active; -exports.interrupt = interrupt; -exports.transition = transition; +exports.drag = drag; +exports.dragDisable = nodrag; +exports.dragEnable = yesdrag; Object.defineProperty(exports, '__esModule', { value: true }); })); }); -var d3Brush = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-brush/ v2.1.0 Copyright 2020 Mike Bostock +var d3Color = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-color/ v2.0.0 Copyright 2020 Mike Bostock (function (global, factory) { -factory(exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) ; -}(commonjsGlobal, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { -var constant = x => () => x; - -function BrushEvent(type, { - sourceEvent, - target, - selection, - mode, - dispatch -}) { - Object.defineProperties(this, { - type: {value: type, enumerable: true, configurable: true}, - sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, - target: {value: target, enumerable: true, configurable: true}, - selection: {value: selection, enumerable: true, configurable: true}, - mode: {value: mode, enumerable: true, configurable: true}, - _: {value: dispatch} - }); -} - -function nopropagation(event) { - event.stopImmediatePropagation(); -} - -function noevent(event) { - event.preventDefault(); - event.stopImmediatePropagation(); -} - -var MODE_DRAG = {name: "drag"}, - MODE_SPACE = {name: "space"}, - MODE_HANDLE = {name: "handle"}, - MODE_CENTER = {name: "center"}; - -const {abs, max, min} = Math; - -function number1(e) { - return [+e[0], +e[1]]; +factory(exports) ; +}(commonjsGlobal, function (exports) { +function define(constructor, factory, prototype) { + constructor.prototype = factory.prototype = prototype; + prototype.constructor = constructor; } -function number2(e) { - return [number1(e[0]), number1(e[1])]; +function extend(parent, definition) { + var prototype = Object.create(parent.prototype); + for (var key in definition) prototype[key] = definition[key]; + return prototype; } -var X = { - name: "x", - handles: ["w", "e"].map(type), - input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; }, - output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } -}; - -var Y = { - name: "y", - handles: ["n", "s"].map(type), - input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; }, - output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } -}; - -var XY = { - name: "xy", - handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), - input: function(xy) { return xy == null ? null : number2(xy); }, - output: function(xy) { return xy; } -}; - -var cursors = { - overlay: "crosshair", - selection: "move", - n: "ns-resize", - e: "ew-resize", - s: "ns-resize", - w: "ew-resize", - nw: "nwse-resize", - ne: "nesw-resize", - se: "nwse-resize", - sw: "nesw-resize" -}; - -var flipX = { - e: "w", - w: "e", - nw: "ne", - ne: "nw", - se: "sw", - sw: "se" -}; +function Color() {} -var flipY = { - n: "s", - s: "n", - nw: "sw", - ne: "se", - se: "ne", - sw: "nw" -}; +var darker = 0.7; +var brighter = 1 / darker; -var signsX = { - overlay: +1, - selection: +1, - n: null, - e: +1, - s: null, - w: -1, - nw: -1, - ne: +1, - se: +1, - sw: -1 -}; +var reI = "\\s*([+-]?\\d+)\\s*", + reN = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", + reP = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", + reHex = /^#([0-9a-f]{3,8})$/, + reRgbInteger = new RegExp("^rgb\\(" + [reI, reI, reI] + "\\)$"), + reRgbPercent = new RegExp("^rgb\\(" + [reP, reP, reP] + "\\)$"), + reRgbaInteger = new RegExp("^rgba\\(" + [reI, reI, reI, reN] + "\\)$"), + reRgbaPercent = new RegExp("^rgba\\(" + [reP, reP, reP, reN] + "\\)$"), + reHslPercent = new RegExp("^hsl\\(" + [reN, reP, reP] + "\\)$"), + reHslaPercent = new RegExp("^hsla\\(" + [reN, reP, reP, reN] + "\\)$"); -var signsY = { - overlay: +1, - selection: +1, - n: -1, - e: null, - s: +1, - w: null, - nw: -1, - ne: -1, - se: +1, - sw: +1 +var named = { + aliceblue: 0xf0f8ff, + antiquewhite: 0xfaebd7, + aqua: 0x00ffff, + aquamarine: 0x7fffd4, + azure: 0xf0ffff, + beige: 0xf5f5dc, + bisque: 0xffe4c4, + black: 0x000000, + blanchedalmond: 0xffebcd, + blue: 0x0000ff, + blueviolet: 0x8a2be2, + brown: 0xa52a2a, + burlywood: 0xdeb887, + cadetblue: 0x5f9ea0, + chartreuse: 0x7fff00, + chocolate: 0xd2691e, + coral: 0xff7f50, + cornflowerblue: 0x6495ed, + cornsilk: 0xfff8dc, + crimson: 0xdc143c, + cyan: 0x00ffff, + darkblue: 0x00008b, + darkcyan: 0x008b8b, + darkgoldenrod: 0xb8860b, + darkgray: 0xa9a9a9, + darkgreen: 0x006400, + darkgrey: 0xa9a9a9, + darkkhaki: 0xbdb76b, + darkmagenta: 0x8b008b, + darkolivegreen: 0x556b2f, + darkorange: 0xff8c00, + darkorchid: 0x9932cc, + darkred: 0x8b0000, + darksalmon: 0xe9967a, + darkseagreen: 0x8fbc8f, + darkslateblue: 0x483d8b, + darkslategray: 0x2f4f4f, + darkslategrey: 0x2f4f4f, + darkturquoise: 0x00ced1, + darkviolet: 0x9400d3, + deeppink: 0xff1493, + deepskyblue: 0x00bfff, + dimgray: 0x696969, + dimgrey: 0x696969, + dodgerblue: 0x1e90ff, + firebrick: 0xb22222, + floralwhite: 0xfffaf0, + forestgreen: 0x228b22, + fuchsia: 0xff00ff, + gainsboro: 0xdcdcdc, + ghostwhite: 0xf8f8ff, + gold: 0xffd700, + goldenrod: 0xdaa520, + gray: 0x808080, + green: 0x008000, + greenyellow: 0xadff2f, + grey: 0x808080, + honeydew: 0xf0fff0, + hotpink: 0xff69b4, + indianred: 0xcd5c5c, + indigo: 0x4b0082, + ivory: 0xfffff0, + khaki: 0xf0e68c, + lavender: 0xe6e6fa, + lavenderblush: 0xfff0f5, + lawngreen: 0x7cfc00, + lemonchiffon: 0xfffacd, + lightblue: 0xadd8e6, + lightcoral: 0xf08080, + lightcyan: 0xe0ffff, + lightgoldenrodyellow: 0xfafad2, + lightgray: 0xd3d3d3, + lightgreen: 0x90ee90, + lightgrey: 0xd3d3d3, + lightpink: 0xffb6c1, + lightsalmon: 0xffa07a, + lightseagreen: 0x20b2aa, + lightskyblue: 0x87cefa, + lightslategray: 0x778899, + lightslategrey: 0x778899, + lightsteelblue: 0xb0c4de, + lightyellow: 0xffffe0, + lime: 0x00ff00, + limegreen: 0x32cd32, + linen: 0xfaf0e6, + magenta: 0xff00ff, + maroon: 0x800000, + mediumaquamarine: 0x66cdaa, + mediumblue: 0x0000cd, + mediumorchid: 0xba55d3, + mediumpurple: 0x9370db, + mediumseagreen: 0x3cb371, + mediumslateblue: 0x7b68ee, + mediumspringgreen: 0x00fa9a, + mediumturquoise: 0x48d1cc, + mediumvioletred: 0xc71585, + midnightblue: 0x191970, + mintcream: 0xf5fffa, + mistyrose: 0xffe4e1, + moccasin: 0xffe4b5, + navajowhite: 0xffdead, + navy: 0x000080, + oldlace: 0xfdf5e6, + olive: 0x808000, + olivedrab: 0x6b8e23, + orange: 0xffa500, + orangered: 0xff4500, + orchid: 0xda70d6, + palegoldenrod: 0xeee8aa, + palegreen: 0x98fb98, + paleturquoise: 0xafeeee, + palevioletred: 0xdb7093, + papayawhip: 0xffefd5, + peachpuff: 0xffdab9, + peru: 0xcd853f, + pink: 0xffc0cb, + plum: 0xdda0dd, + powderblue: 0xb0e0e6, + purple: 0x800080, + rebeccapurple: 0x663399, + red: 0xff0000, + rosybrown: 0xbc8f8f, + royalblue: 0x4169e1, + saddlebrown: 0x8b4513, + salmon: 0xfa8072, + sandybrown: 0xf4a460, + seagreen: 0x2e8b57, + seashell: 0xfff5ee, + sienna: 0xa0522d, + silver: 0xc0c0c0, + skyblue: 0x87ceeb, + slateblue: 0x6a5acd, + slategray: 0x708090, + slategrey: 0x708090, + snow: 0xfffafa, + springgreen: 0x00ff7f, + steelblue: 0x4682b4, + tan: 0xd2b48c, + teal: 0x008080, + thistle: 0xd8bfd8, + tomato: 0xff6347, + turquoise: 0x40e0d0, + violet: 0xee82ee, + wheat: 0xf5deb3, + white: 0xffffff, + whitesmoke: 0xf5f5f5, + yellow: 0xffff00, + yellowgreen: 0x9acd32 }; -function type(t) { - return {type: t}; -} +define(Color, color, { + copy: function(channels) { + return Object.assign(new this.constructor, this, channels); + }, + displayable: function() { + return this.rgb().displayable(); + }, + hex: color_formatHex, // Deprecated! Use color.formatHex. + formatHex: color_formatHex, + formatHsl: color_formatHsl, + formatRgb: color_formatRgb, + toString: color_formatRgb +}); -// Ignore right-click, since that should open the context menu. -function defaultFilter(event) { - return !event.ctrlKey && !event.button; +function color_formatHex() { + return this.rgb().formatHex(); } -function defaultExtent() { - var svg = this.ownerSVGElement || this; - if (svg.hasAttribute("viewBox")) { - svg = svg.viewBox.baseVal; - return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; - } - return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +function color_formatHsl() { + return hslConvert(this).formatHsl(); } -function defaultTouchable() { - return navigator.maxTouchPoints || ("ontouchstart" in this); +function color_formatRgb() { + return this.rgb().formatRgb(); } -// Like d3.local, but with the name “__brush” rather than auto-generated. -function local(node) { - while (!node.__brush) if (!(node = node.parentNode)) return; - return node.__brush; +function color(format) { + var m, l; + format = (format + "").trim().toLowerCase(); + return (m = reHex.exec(format)) ? (l = m[1].length, m = parseInt(m[1], 16), l === 6 ? rgbn(m) // #ff0000 + : l === 3 ? new Rgb((m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), ((m & 0xf) << 4) | (m & 0xf), 1) // #f00 + : l === 8 ? rgba(m >> 24 & 0xff, m >> 16 & 0xff, m >> 8 & 0xff, (m & 0xff) / 0xff) // #ff000000 + : l === 4 ? rgba((m >> 12 & 0xf) | (m >> 8 & 0xf0), (m >> 8 & 0xf) | (m >> 4 & 0xf0), (m >> 4 & 0xf) | (m & 0xf0), (((m & 0xf) << 4) | (m & 0xf)) / 0xff) // #f000 + : null) // invalid hex + : (m = reRgbInteger.exec(format)) ? new Rgb(m[1], m[2], m[3], 1) // rgb(255, 0, 0) + : (m = reRgbPercent.exec(format)) ? new Rgb(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, 1) // rgb(100%, 0%, 0%) + : (m = reRgbaInteger.exec(format)) ? rgba(m[1], m[2], m[3], m[4]) // rgba(255, 0, 0, 1) + : (m = reRgbaPercent.exec(format)) ? rgba(m[1] * 255 / 100, m[2] * 255 / 100, m[3] * 255 / 100, m[4]) // rgb(100%, 0%, 0%, 1) + : (m = reHslPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, 1) // hsl(120, 50%, 50%) + : (m = reHslaPercent.exec(format)) ? hsla(m[1], m[2] / 100, m[3] / 100, m[4]) // hsla(120, 50%, 50%, 1) + : named.hasOwnProperty(format) ? rgbn(named[format]) // eslint-disable-line no-prototype-builtins + : format === "transparent" ? new Rgb(NaN, NaN, NaN, 0) + : null; } -function empty(extent) { - return extent[0][0] === extent[1][0] - || extent[0][1] === extent[1][1]; +function rgbn(n) { + return new Rgb(n >> 16 & 0xff, n >> 8 & 0xff, n & 0xff, 1); } -function brushSelection(node) { - var state = node.__brush; - return state ? state.dim.output(state.selection) : null; +function rgba(r, g, b, a) { + if (a <= 0) r = g = b = NaN; + return new Rgb(r, g, b, a); } -function brushX() { - return brush$1(X); +function rgbConvert(o) { + if (!(o instanceof Color)) o = color(o); + if (!o) return new Rgb; + o = o.rgb(); + return new Rgb(o.r, o.g, o.b, o.opacity); } -function brushY() { - return brush$1(Y); +function rgb(r, g, b, opacity) { + return arguments.length === 1 ? rgbConvert(r) : new Rgb(r, g, b, opacity == null ? 1 : opacity); } -function brush() { - return brush$1(XY); +function Rgb(r, g, b, opacity) { + this.r = +r; + this.g = +g; + this.b = +b; + this.opacity = +opacity; } -function brush$1(dim) { - var extent = defaultExtent, - filter = defaultFilter, - touchable = defaultTouchable, - keys = true, - listeners = d3Dispatch.dispatch("start", "brush", "end"), - handleSize = 6, - touchending; - - function brush(group) { - var overlay = group - .property("__brush", initialize) - .selectAll(".overlay") - .data([type("overlay")]); - - overlay.enter().append("rect") - .attr("class", "overlay") - .attr("pointer-events", "all") - .attr("cursor", cursors.overlay) - .merge(overlay) - .each(function() { - var extent = local(this).extent; - d3Selection.select(this) - .attr("x", extent[0][0]) - .attr("y", extent[0][1]) - .attr("width", extent[1][0] - extent[0][0]) - .attr("height", extent[1][1] - extent[0][1]); - }); - - group.selectAll(".selection") - .data([type("selection")]) - .enter().append("rect") - .attr("class", "selection") - .attr("cursor", cursors.selection) - .attr("fill", "#777") - .attr("fill-opacity", 0.3) - .attr("stroke", "#fff") - .attr("shape-rendering", "crispEdges"); - - var handle = group.selectAll(".handle") - .data(dim.handles, function(d) { return d.type; }); - - handle.exit().remove(); - - handle.enter().append("rect") - .attr("class", function(d) { return "handle handle--" + d.type; }) - .attr("cursor", function(d) { return cursors[d.type]; }); - - group - .each(redraw) - .attr("fill", "none") - .attr("pointer-events", "all") - .on("mousedown.brush", started) - .filter(touchable) - .on("touchstart.brush", started) - .on("touchmove.brush", touchmoved) - .on("touchend.brush touchcancel.brush", touchended) - .style("touch-action", "none") - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); - } - - brush.move = function(group, selection) { - if (group.tween) { - group - .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); }) - .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); }) - .tween("brush", function() { - var that = this, - state = that.__brush, - emit = emitter(that, arguments), - selection0 = state.selection, - selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), - i = d3Interpolate.interpolate(selection0, selection1); - - function tween(t) { - state.selection = t === 1 && selection1 === null ? null : i(t); - redraw.call(that); - emit.brush(); - } - - return selection0 !== null && selection1 !== null ? tween : tween(1); - }); - } else { - group - .each(function() { - var that = this, - args = arguments, - state = that.__brush, - selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), - emit = emitter(that, args).beforestart(); - - d3Transition.interrupt(that); - state.selection = selection1 === null ? null : selection1; - redraw.call(that); - emit.start().brush().end(); - }); - } - }; - - brush.clear = function(group) { - brush.move(group, null); - }; - - function redraw() { - var group = d3Selection.select(this), - selection = local(this).selection; - - if (selection) { - group.selectAll(".selection") - .style("display", null) - .attr("x", selection[0][0]) - .attr("y", selection[0][1]) - .attr("width", selection[1][0] - selection[0][0]) - .attr("height", selection[1][1] - selection[0][1]); +define(Rgb, rgb, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Rgb(this.r * k, this.g * k, this.b * k, this.opacity); + }, + rgb: function() { + return this; + }, + displayable: function() { + return (-0.5 <= this.r && this.r < 255.5) + && (-0.5 <= this.g && this.g < 255.5) + && (-0.5 <= this.b && this.b < 255.5) + && (0 <= this.opacity && this.opacity <= 1); + }, + hex: rgb_formatHex, // Deprecated! Use color.formatHex. + formatHex: rgb_formatHex, + formatRgb: rgb_formatRgb, + toString: rgb_formatRgb +})); - group.selectAll(".handle") - .style("display", null) - .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) - .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) - .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) - .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); - } +function rgb_formatHex() { + return "#" + hex(this.r) + hex(this.g) + hex(this.b); +} - else { - group.selectAll(".selection,.handle") - .style("display", "none") - .attr("x", null) - .attr("y", null) - .attr("width", null) - .attr("height", null); - } - } +function rgb_formatRgb() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "rgb(" : "rgba(") + + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + + (a === 1 ? ")" : ", " + a + ")"); +} - function emitter(that, args, clean) { - var emit = that.__brush.emitter; - return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean); - } +function hex(value) { + value = Math.max(0, Math.min(255, Math.round(value) || 0)); + return (value < 16 ? "0" : "") + value.toString(16); +} - function Emitter(that, args, clean) { - this.that = that; - this.args = args; - this.state = that.__brush; - this.active = 0; - this.clean = clean; - } +function hsla(h, s, l, a) { + if (a <= 0) h = s = l = NaN; + else if (l <= 0 || l >= 1) h = s = NaN; + else if (s <= 0) h = NaN; + return new Hsl(h, s, l, a); +} - Emitter.prototype = { - beforestart: function() { - if (++this.active === 1) this.state.emitter = this, this.starting = true; - return this; - }, - start: function(event, mode) { - if (this.starting) this.starting = false, this.emit("start", event, mode); - else this.emit("brush", event); - return this; - }, - brush: function(event, mode) { - this.emit("brush", event, mode); - return this; - }, - end: function(event, mode) { - if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode); - return this; - }, - emit: function(type, event, mode) { - var d = d3Selection.select(this.that).datum(); - listeners.call( - type, - this.that, - new BrushEvent(type, { - sourceEvent: event, - target: brush, - selection: dim.output(this.state.selection), - mode, - dispatch: listeners - }), - d - ); - } - }; +function hslConvert(o) { + if (o instanceof Hsl) return new Hsl(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Color)) o = color(o); + if (!o) return new Hsl; + if (o instanceof Hsl) return o; + o = o.rgb(); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + h = NaN, + s = max - min, + l = (max + min) / 2; + if (s) { + if (r === max) h = (g - b) / s + (g < b) * 6; + else if (g === max) h = (b - r) / s + 2; + else h = (r - g) / s + 4; + s /= l < 0.5 ? max + min : 2 - max - min; + h *= 60; + } else { + s = l > 0 && l < 1 ? 0 : h; + } + return new Hsl(h, s, l, o.opacity); +} - function started(event) { - if (touchending && !event.touches) return; - if (!filter.apply(this, arguments)) return; +function hsl(h, s, l, opacity) { + return arguments.length === 1 ? hslConvert(h) : new Hsl(h, s, l, opacity == null ? 1 : opacity); +} - var that = this, - type = event.target.__data__.type, - mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE), - signX = dim === Y ? null : signsX[type], - signY = dim === X ? null : signsY[type], - state = local(that), - extent = state.extent, - selection = state.selection, - W = extent[0][0], w0, w1, - N = extent[0][1], n0, n1, - E = extent[1][0], e0, e1, - S = extent[1][1], s0, s1, - dx = 0, - dy = 0, - moving, - shifting = signX && signY && keys && event.shiftKey, - lockX, - lockY, - points = Array.from(event.touches || [event], t => { - const i = t.identifier; - t = d3Selection.pointer(t, that); - t.point0 = t.slice(); - t.identifier = i; - return t; - }); +function Hsl(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} - if (type === "overlay") { - if (selection) moving = true; - const pts = [points[0], points[1] || points[0]]; - state.selection = selection = [[ - w0 = dim === Y ? W : min(pts[0][0], pts[1][0]), - n0 = dim === X ? N : min(pts[0][1], pts[1][1]) - ], [ - e0 = dim === Y ? E : max(pts[0][0], pts[1][0]), - s0 = dim === X ? S : max(pts[0][1], pts[1][1]) - ]]; - if (points.length > 1) move(); - } else { - w0 = selection[0][0]; - n0 = selection[0][1]; - e0 = selection[1][0]; - s0 = selection[1][1]; - } +define(Hsl, hsl, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Hsl(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = this.h % 360 + (this.h < 0) * 360, + s = isNaN(h) || isNaN(this.s) ? 0 : this.s, + l = this.l, + m2 = l + (l < 0.5 ? l : 1 - l) * s, + m1 = 2 * l - m2; + return new Rgb( + hsl2rgb(h >= 240 ? h - 240 : h + 120, m1, m2), + hsl2rgb(h, m1, m2), + hsl2rgb(h < 120 ? h + 240 : h - 120, m1, m2), + this.opacity + ); + }, + displayable: function() { + return (0 <= this.s && this.s <= 1 || isNaN(this.s)) + && (0 <= this.l && this.l <= 1) + && (0 <= this.opacity && this.opacity <= 1); + }, + formatHsl: function() { + var a = this.opacity; a = isNaN(a) ? 1 : Math.max(0, Math.min(1, a)); + return (a === 1 ? "hsl(" : "hsla(") + + (this.h || 0) + ", " + + (this.s || 0) * 100 + "%, " + + (this.l || 0) * 100 + "%" + + (a === 1 ? ")" : ", " + a + ")"); + } +})); - w1 = w0; - n1 = n0; - e1 = e0; - s1 = s0; +/* From FvD 13.37, CSS Color Module Level 3 */ +function hsl2rgb(h, m1, m2) { + return (h < 60 ? m1 + (m2 - m1) * h / 60 + : h < 180 ? m2 + : h < 240 ? m1 + (m2 - m1) * (240 - h) / 60 + : m1) * 255; +} - var group = d3Selection.select(that) - .attr("pointer-events", "none"); +const radians = Math.PI / 180; +const degrees = 180 / Math.PI; - var overlay = group.selectAll(".overlay") - .attr("cursor", cursors[type]); +// https://observablehq.com/@mbostock/lab-and-rgb +const K = 18, + Xn = 0.96422, + Yn = 1, + Zn = 0.82521, + t0 = 4 / 29, + t1 = 6 / 29, + t2 = 3 * t1 * t1, + t3 = t1 * t1 * t1; - d3Transition.interrupt(that); - var emit = emitter(that, arguments, true).beforestart(); +function labConvert(o) { + if (o instanceof Lab) return new Lab(o.l, o.a, o.b, o.opacity); + if (o instanceof Hcl) return hcl2lab(o); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = rgb2lrgb(o.r), + g = rgb2lrgb(o.g), + b = rgb2lrgb(o.b), + y = xyz2lab((0.2225045 * r + 0.7168786 * g + 0.0606169 * b) / Yn), x, z; + if (r === g && g === b) x = z = y; else { + x = xyz2lab((0.4360747 * r + 0.3850649 * g + 0.1430804 * b) / Xn); + z = xyz2lab((0.0139322 * r + 0.0971045 * g + 0.7141733 * b) / Zn); + } + return new Lab(116 * y - 16, 500 * (x - y), 200 * (y - z), o.opacity); +} - if (event.touches) { - emit.moved = moved; - emit.ended = ended; - } else { - var view = d3Selection.select(event.view) - .on("mousemove.brush", moved, true) - .on("mouseup.brush", ended, true); - if (keys) view - .on("keydown.brush", keydowned, true) - .on("keyup.brush", keyupped, true); +function gray(l, opacity) { + return new Lab(l, 0, 0, opacity == null ? 1 : opacity); +} - d3Drag.dragDisable(event.view); - } +function lab(l, a, b, opacity) { + return arguments.length === 1 ? labConvert(l) : new Lab(l, a, b, opacity == null ? 1 : opacity); +} - redraw.call(that); - emit.start(event, mode.name); +function Lab(l, a, b, opacity) { + this.l = +l; + this.a = +a; + this.b = +b; + this.opacity = +opacity; +} - function moved(event) { - for (const p of event.changedTouches || [event]) { - for (const d of points) - if (d.identifier === p.identifier) d.cur = d3Selection.pointer(p, that); - } - if (shifting && !lockX && !lockY && points.length === 1) { - const point = points[0]; - if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1])) - lockY = true; - else - lockX = true; - } - for (const point of points) - if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1]; - moving = true; - noevent(event); - move(event); - } +define(Lab, lab, extend(Color, { + brighter: function(k) { + return new Lab(this.l + K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + darker: function(k) { + return new Lab(this.l - K * (k == null ? 1 : k), this.a, this.b, this.opacity); + }, + rgb: function() { + var y = (this.l + 16) / 116, + x = isNaN(this.a) ? y : y + this.a / 500, + z = isNaN(this.b) ? y : y - this.b / 200; + x = Xn * lab2xyz(x); + y = Yn * lab2xyz(y); + z = Zn * lab2xyz(z); + return new Rgb( + lrgb2rgb( 3.1338561 * x - 1.6168667 * y - 0.4906146 * z), + lrgb2rgb(-0.9787684 * x + 1.9161415 * y + 0.0334540 * z), + lrgb2rgb( 0.0719453 * x - 0.2289914 * y + 1.4052427 * z), + this.opacity + ); + } +})); - function move(event) { - const point = points[0], point0 = point.point0; - var t; +function xyz2lab(t) { + return t > t3 ? Math.pow(t, 1 / 3) : t / t2 + t0; +} - dx = point[0] - point0[0]; - dy = point[1] - point0[1]; +function lab2xyz(t) { + return t > t1 ? t * t * t : t2 * (t - t0); +} - switch (mode) { - case MODE_SPACE: - case MODE_DRAG: { - if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; - if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; - break; - } - case MODE_HANDLE: { - if (points[1]) { - if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1; - if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1; - } else { - if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0; - else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx; - if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0; - else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy; - } - break; - } - case MODE_CENTER: { - if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX)); - if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY)); - break; - } - } +function lrgb2rgb(x) { + return 255 * (x <= 0.0031308 ? 12.92 * x : 1.055 * Math.pow(x, 1 / 2.4) - 0.055); +} - if (e1 < w1) { - signX *= -1; - t = w0, w0 = e0, e0 = t; - t = w1, w1 = e1, e1 = t; - if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); - } +function rgb2lrgb(x) { + return (x /= 255) <= 0.04045 ? x / 12.92 : Math.pow((x + 0.055) / 1.055, 2.4); +} - if (s1 < n1) { - signY *= -1; - t = n0, n0 = s0, s0 = t; - t = n1, n1 = s1, s1 = t; - if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); - } +function hclConvert(o) { + if (o instanceof Hcl) return new Hcl(o.h, o.c, o.l, o.opacity); + if (!(o instanceof Lab)) o = labConvert(o); + if (o.a === 0 && o.b === 0) return new Hcl(NaN, 0 < o.l && o.l < 100 ? 0 : NaN, o.l, o.opacity); + var h = Math.atan2(o.b, o.a) * degrees; + return new Hcl(h < 0 ? h + 360 : h, Math.sqrt(o.a * o.a + o.b * o.b), o.l, o.opacity); +} - if (state.selection) selection = state.selection; // May be set by brush.move! - if (lockX) w1 = selection[0][0], e1 = selection[1][0]; - if (lockY) n1 = selection[0][1], s1 = selection[1][1]; +function lch(l, c, h, opacity) { + return arguments.length === 1 ? hclConvert(l) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} - if (selection[0][0] !== w1 - || selection[0][1] !== n1 - || selection[1][0] !== e1 - || selection[1][1] !== s1) { - state.selection = [[w1, n1], [e1, s1]]; - redraw.call(that); - emit.brush(event, mode.name); - } - } +function hcl(h, c, l, opacity) { + return arguments.length === 1 ? hclConvert(h) : new Hcl(h, c, l, opacity == null ? 1 : opacity); +} - function ended(event) { - nopropagation(event); - if (event.touches) { - if (event.touches.length) return; - if (touchending) clearTimeout(touchending); - touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! - } else { - d3Drag.dragEnable(event.view, moving); - view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); - } - group.attr("pointer-events", "all"); - overlay.attr("cursor", cursors.overlay); - if (state.selection) selection = state.selection; // May be set by brush.move (on start)! - if (empty(selection)) state.selection = null, redraw.call(that); - emit.end(event, mode.name); - } +function Hcl(h, c, l, opacity) { + this.h = +h; + this.c = +c; + this.l = +l; + this.opacity = +opacity; +} - function keydowned(event) { - switch (event.keyCode) { - case 16: { // SHIFT - shifting = signX && signY; - break; - } - case 18: { // ALT - if (mode === MODE_HANDLE) { - if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; - if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; - mode = MODE_CENTER; - move(); - } - break; - } - case 32: { // SPACE; takes priority over ALT - if (mode === MODE_HANDLE || mode === MODE_CENTER) { - if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; - if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; - mode = MODE_SPACE; - overlay.attr("cursor", cursors.selection); - move(); - } - break; - } - default: return; - } - noevent(event); - } +function hcl2lab(o) { + if (isNaN(o.h)) return new Lab(o.l, 0, 0, o.opacity); + var h = o.h * radians; + return new Lab(o.l, Math.cos(h) * o.c, Math.sin(h) * o.c, o.opacity); +} - function keyupped(event) { - switch (event.keyCode) { - case 16: { // SHIFT - if (shifting) { - lockX = lockY = shifting = false; - move(); - } - break; - } - case 18: { // ALT - if (mode === MODE_CENTER) { - if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; - if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; - mode = MODE_HANDLE; - move(); - } - break; - } - case 32: { // SPACE - if (mode === MODE_SPACE) { - if (event.altKey) { - if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; - if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; - mode = MODE_CENTER; - } else { - if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; - if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; - mode = MODE_HANDLE; - } - overlay.attr("cursor", cursors[type]); - move(); - } - break; - } - default: return; - } - noevent(event); - } +define(Hcl, hcl, extend(Color, { + brighter: function(k) { + return new Hcl(this.h, this.c, this.l + K * (k == null ? 1 : k), this.opacity); + }, + darker: function(k) { + return new Hcl(this.h, this.c, this.l - K * (k == null ? 1 : k), this.opacity); + }, + rgb: function() { + return hcl2lab(this).rgb(); } +})); + +var A = -0.14861, + B = +1.78277, + C = -0.29227, + D = -0.90649, + E = +1.97294, + ED = E * D, + EB = E * B, + BC_DA = B * C - D * A; + +function cubehelixConvert(o) { + if (o instanceof Cubehelix) return new Cubehelix(o.h, o.s, o.l, o.opacity); + if (!(o instanceof Rgb)) o = rgbConvert(o); + var r = o.r / 255, + g = o.g / 255, + b = o.b / 255, + l = (BC_DA * b + ED * r - EB * g) / (BC_DA + ED - EB), + bl = b - l, + k = (E * (g - l) - C * bl) / D, + s = Math.sqrt(k * k + bl * bl) / (E * l * (1 - l)), // NaN if l=0 or l=1 + h = s ? Math.atan2(k, bl) * degrees - 120 : NaN; + return new Cubehelix(h < 0 ? h + 360 : h, s, l, o.opacity); +} - function touchmoved(event) { - emitter(this, arguments).moved(event); - } +function cubehelix(h, s, l, opacity) { + return arguments.length === 1 ? cubehelixConvert(h) : new Cubehelix(h, s, l, opacity == null ? 1 : opacity); +} - function touchended(event) { - emitter(this, arguments).ended(event); - } +function Cubehelix(h, s, l, opacity) { + this.h = +h; + this.s = +s; + this.l = +l; + this.opacity = +opacity; +} - function initialize() { - var state = this.__brush || {selection: null}; - state.extent = number2(extent.apply(this, arguments)); - state.dim = dim; - return state; +define(Cubehelix, cubehelix, extend(Color, { + brighter: function(k) { + k = k == null ? brighter : Math.pow(brighter, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + darker: function(k) { + k = k == null ? darker : Math.pow(darker, k); + return new Cubehelix(this.h, this.s, this.l * k, this.opacity); + }, + rgb: function() { + var h = isNaN(this.h) ? 0 : (this.h + 120) * radians, + l = +this.l, + a = isNaN(this.s) ? 0 : this.s * l * (1 - l), + cosh = Math.cos(h), + sinh = Math.sin(h); + return new Rgb( + 255 * (l + a * (A * cosh + B * sinh)), + 255 * (l + a * (C * cosh + D * sinh)), + 255 * (l + a * (E * cosh)), + this.opacity + ); } +})); - brush.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; - }; +exports.color = color; +exports.cubehelix = cubehelix; +exports.gray = gray; +exports.hcl = hcl; +exports.hsl = hsl; +exports.lab = lab; +exports.lch = lch; +exports.rgb = rgb; - brush.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; - }; +Object.defineProperty(exports, '__esModule', { value: true }); - brush.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; - }; +})); +}); - brush.handleSize = function(_) { - return arguments.length ? (handleSize = +_, brush) : handleSize; - }; +var d3Interpolate = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-interpolate/ v2.0.1 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Color) ; +}(commonjsGlobal, function (exports, d3Color) { +function basis(t1, v0, v1, v2, v3) { + var t2 = t1 * t1, t3 = t2 * t1; + return ((1 - 3 * t1 + 3 * t2 - t3) * v0 + + (4 - 6 * t2 + 3 * t3) * v1 + + (1 + 3 * t1 + 3 * t2 - 3 * t3) * v2 + + t3 * v3) / 6; +} - brush.keyModifiers = function(_) { - return arguments.length ? (keys = !!_, brush) : keys; +function basis$1(values) { + var n = values.length - 1; + return function(t) { + var i = t <= 0 ? (t = 0) : t >= 1 ? (t = 1, n - 1) : Math.floor(t * n), + v1 = values[i], + v2 = values[i + 1], + v0 = i > 0 ? values[i - 1] : 2 * v1 - v2, + v3 = i < n - 1 ? values[i + 2] : 2 * v2 - v1; + return basis((t - i / n) * n, v0, v1, v2, v3); }; +} - brush.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? brush : value; +function basisClosed(values) { + var n = values.length; + return function(t) { + var i = Math.floor(((t %= 1) < 0 ? ++t : t) * n), + v0 = values[(i + n - 1) % n], + v1 = values[i % n], + v2 = values[(i + 1) % n], + v3 = values[(i + 2) % n]; + return basis((t - i / n) * n, v0, v1, v2, v3); }; - - return brush; } -exports.brush = brush; -exports.brushSelection = brushSelection; -exports.brushX = brushX; -exports.brushY = brushY; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); -}); - -var d3Path = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-path/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -const pi = Math.PI, - tau = 2 * pi, - epsilon = 1e-6, - tauEpsilon = tau - epsilon; +var constant = x => () => x; -function Path() { - this._x0 = this._y0 = // start of current subpath - this._x1 = this._y1 = null; // end of current subpath - this._ = ""; +function linear(a, d) { + return function(t) { + return a + t * d; + }; } -function path() { - return new Path; +function exponential(a, b, y) { + return a = Math.pow(a, y), b = Math.pow(b, y) - a, y = 1 / y, function(t) { + return Math.pow(a + t * b, y); + }; } -Path.prototype = path.prototype = { - constructor: Path, - moveTo: function(x, y) { - this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); - }, - closePath: function() { - if (this._x1 !== null) { - this._x1 = this._x0, this._y1 = this._y0; - this._ += "Z"; - } - }, - lineTo: function(x, y) { - this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); - }, - quadraticCurveTo: function(x1, y1, x, y) { - this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); - }, - bezierCurveTo: function(x1, y1, x2, y2, x, y) { - this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); - }, - arcTo: function(x1, y1, x2, y2, r) { - x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; - var x0 = this._x1, - y0 = this._y1, - x21 = x2 - x1, - y21 = y2 - y1, - x01 = x0 - x1, - y01 = y0 - y1, - l01_2 = x01 * x01 + y01 * y01; +function hue(a, b) { + var d = b - a; + return d ? linear(a, d > 180 || d < -180 ? d - 360 * Math.round(d / 360) : d) : constant(isNaN(a) ? b : a); +} - // Is the radius negative? Error. - if (r < 0) throw new Error("negative radius: " + r); +function gamma(y) { + return (y = +y) === 1 ? nogamma : function(a, b) { + return b - a ? exponential(a, b, y) : constant(isNaN(a) ? b : a); + }; +} - // Is this path empty? Move to (x1,y1). - if (this._x1 === null) { - this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); - } +function nogamma(a, b) { + var d = b - a; + return d ? linear(a, d) : constant(isNaN(a) ? b : a); +} - // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. - else if (!(l01_2 > epsilon)); +var rgb = (function rgbGamma(y) { + var color = gamma(y); - // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? - // Equivalently, is (x1,y1) coincident with (x2,y2)? - // Or, is the radius zero? Line to (x1,y1). - else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { - this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); - } + function rgb(start, end) { + var r = color((start = d3Color.rgb(start)).r, (end = d3Color.rgb(end)).r), + g = color(start.g, end.g), + b = color(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.r = r(t); + start.g = g(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; + } - // Otherwise, draw an arc! - else { - var x20 = x2 - x0, - y20 = y2 - y0, - l21_2 = x21 * x21 + y21 * y21, - l20_2 = x20 * x20 + y20 * y20, - l21 = Math.sqrt(l21_2), - l01 = Math.sqrt(l01_2), - l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), - t01 = l / l01, - t21 = l / l21; + rgb.gamma = rgbGamma; - // If the start tangent is not coincident with (x0,y0), line to. - if (Math.abs(t01 - 1) > epsilon) { - this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); - } + return rgb; +})(1); - this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); +function rgbSpline(spline) { + return function(colors) { + var n = colors.length, + r = new Array(n), + g = new Array(n), + b = new Array(n), + i, color; + for (i = 0; i < n; ++i) { + color = d3Color.rgb(colors[i]); + r[i] = color.r || 0; + g[i] = color.g || 0; + b[i] = color.b || 0; } - }, - arc: function(x, y, r, a0, a1, ccw) { - x = +x, y = +y, r = +r, ccw = !!ccw; - var dx = r * Math.cos(a0), - dy = r * Math.sin(a0), - x0 = x + dx, - y0 = y + dy, - cw = 1 ^ ccw, - da = ccw ? a0 - a1 : a1 - a0; + r = spline(r); + g = spline(g); + b = spline(b); + color.opacity = 1; + return function(t) { + color.r = r(t); + color.g = g(t); + color.b = b(t); + return color + ""; + }; + }; +} - // Is the radius negative? Error. - if (r < 0) throw new Error("negative radius: " + r); +var rgbBasis = rgbSpline(basis$1); +var rgbBasisClosed = rgbSpline(basisClosed); - // Is this path empty? Move to (x0,y0). - if (this._x1 === null) { - this._ += "M" + x0 + "," + y0; - } +function numberArray(a, b) { + if (!b) b = []; + var n = a ? Math.min(b.length, a.length) : 0, + c = b.slice(), + i; + return function(t) { + for (i = 0; i < n; ++i) c[i] = a[i] * (1 - t) + b[i] * t; + return c; + }; +} - // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). - else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { - this._ += "L" + x0 + "," + y0; - } +function isNumberArray(x) { + return ArrayBuffer.isView(x) && !(x instanceof DataView); +} - // Is this arc empty? We’re done. - if (!r) return; +function array(a, b) { + return (isNumberArray(b) ? numberArray : genericArray)(a, b); +} - // Does the angle go the wrong way? Flip the direction. - if (da < 0) da = da % tau + tau; +function genericArray(a, b) { + var nb = b ? b.length : 0, + na = a ? Math.min(nb, a.length) : 0, + x = new Array(na), + c = new Array(nb), + i; - // Is this a complete circle? Draw two arcs to complete the circle. - if (da > tauEpsilon) { - this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); - } + for (i = 0; i < na; ++i) x[i] = value(a[i], b[i]); + for (; i < nb; ++i) c[i] = b[i]; - // Is this arc non-empty? Draw an arc! - else if (da > epsilon) { - this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); - } - }, - rect: function(x, y, w, h) { - this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; - }, - toString: function() { - return this._; - } -}; + return function(t) { + for (i = 0; i < na; ++i) c[i] = x[i](t); + return c; + }; +} -exports.path = path; +function date(a, b) { + var d = new Date; + return a = +a, b = +b, function(t) { + return d.setTime(a * (1 - t) + b * t), d; + }; +} -Object.defineProperty(exports, '__esModule', { value: true }); +function number(a, b) { + return a = +a, b = +b, function(t) { + return a * (1 - t) + b * t; + }; +} -})); -}); +function object(a, b) { + var i = {}, + c = {}, + k; -var d3Chord = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-chord/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Path) ; -}(commonjsGlobal, function (exports, d3Path) { -var abs = Math.abs; -var cos = Math.cos; -var sin = Math.sin; -var pi = Math.PI; -var halfPi = pi / 2; -var tau = pi * 2; -var max = Math.max; -var epsilon = 1e-12; + if (a === null || typeof a !== "object") a = {}; + if (b === null || typeof b !== "object") b = {}; -function range(i, j) { - return Array.from({length: j - i}, (_, k) => i + k); -} + for (k in b) { + if (k in a) { + i[k] = value(a[k], b[k]); + } else { + c[k] = b[k]; + } + } -function compareValue(compare) { - return function(a, b) { - return compare( - a.source.value + a.target.value, - b.source.value + b.target.value - ); + return function(t) { + for (k in i) c[k] = i[k](t); + return c; }; } -function chord() { - return chord$1(false, false); -} +var reA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, + reB = new RegExp(reA.source, "g"); -function chordTranspose() { - return chord$1(false, true); +function zero(b) { + return function() { + return b; + }; } -function chordDirected() { - return chord$1(true, false); +function one(b) { + return function(t) { + return b(t) + ""; + }; } -function chord$1(directed, transpose) { - var padAngle = 0, - sortGroups = null, - sortSubgroups = null, - sortChords = null; - - function chord(matrix) { - var n = matrix.length, - groupSums = new Array(n), - groupIndex = range(0, n), - chords = new Array(n * n), - groups = new Array(n), - k = 0, dx; +function string(a, b) { + var bi = reA.lastIndex = reB.lastIndex = 0, // scan index for next number in b + am, // current match in a + bm, // current match in b + bs, // string preceding current number in b, if any + i = -1, // index in s + s = [], // string constants and placeholders + q = []; // number interpolators - matrix = Float64Array.from({length: n * n}, transpose - ? (_, i) => matrix[i % n][i / n | 0] - : (_, i) => matrix[i / n | 0][i % n]); + // Coerce inputs to strings. + a = a + "", b = b + ""; - // Compute the scaling factor from value to angle in [0, 2pi]. - for (let i = 0; i < n; ++i) { - let x = 0; - for (let j = 0; j < n; ++j) x += matrix[i * n + j] + directed * matrix[j * n + i]; - k += groupSums[i] = x; + // Interpolate pairs of numbers in a & b. + while ((am = reA.exec(a)) + && (bm = reB.exec(b))) { + if ((bs = bm.index) > bi) { // a string precedes the next number in b + bs = b.slice(bi, bs); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; } - k = max(0, tau - padAngle * n) / k; - dx = k ? padAngle : tau / n; - - // Compute the angles for each group and constituent chord. - { - let x = 0; - if (sortGroups) groupIndex.sort((a, b) => sortGroups(groupSums[a], groupSums[b])); - for (const i of groupIndex) { - const x0 = x; - if (directed) { - const subgroupIndex = range(~n + 1, n).filter(j => j < 0 ? matrix[~j * n + i] : matrix[i * n + j]); - if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])); - for (const j of subgroupIndex) { - if (j < 0) { - const chord = chords[~j * n + i] || (chords[~j * n + i] = {source: null, target: null}); - chord.target = {index: i, startAngle: x, endAngle: x += matrix[~j * n + i] * k, value: matrix[~j * n + i]}; - } else { - const chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); - chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; - } - } - groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; - } else { - const subgroupIndex = range(0, n).filter(j => matrix[i * n + j] || matrix[j * n + i]); - if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(matrix[i * n + a], matrix[i * n + b])); - for (const j of subgroupIndex) { - let chord; - if (i < j) { - chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); - chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; - } else { - chord = chords[j * n + i] || (chords[j * n + i] = {source: null, target: null}); - chord.target = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; - if (i === j) chord.source = chord.target; - } - if (chord.source && chord.target && chord.source.value < chord.target.value) { - const source = chord.source; - chord.source = chord.target; - chord.target = source; - } - } - groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; - } - x += dx; - } + if ((am = am[0]) === (bm = bm[0])) { // numbers in a & b match + if (s[i]) s[i] += bm; // coalesce with previous string + else s[++i] = bm; + } else { // interpolate non-matching numbers + s[++i] = null; + q.push({i: i, x: number(am, bm)}); } - - // Remove empty chords. - chords = Object.values(chords); - chords.groups = groups; - return sortChords ? chords.sort(sortChords) : chords; + bi = reB.lastIndex; } - chord.padAngle = function(_) { - return arguments.length ? (padAngle = max(0, _), chord) : padAngle; - }; + // Add remains of b. + if (bi < b.length) { + bs = b.slice(bi); + if (s[i]) s[i] += bs; // coalesce with previous string + else s[++i] = bs; + } - chord.sortGroups = function(_) { - return arguments.length ? (sortGroups = _, chord) : sortGroups; - }; + // Special optimization for only a single match. + // Otherwise, interpolate each of the numbers and rejoin the string. + return s.length < 2 ? (q[0] + ? one(q[0].x) + : zero(b)) + : (b = q.length, function(t) { + for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }); +} - chord.sortSubgroups = function(_) { - return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; - }; +function value(a, b) { + var t = typeof b, c; + return b == null || t === "boolean" ? constant(b) + : (t === "number" ? number + : t === "string" ? ((c = d3Color.color(b)) ? (b = c, rgb) : string) + : b instanceof d3Color.color ? rgb + : b instanceof Date ? date + : isNumberArray(b) ? numberArray + : Array.isArray(b) ? genericArray + : typeof b.valueOf !== "function" && typeof b.toString !== "function" || isNaN(b) ? object + : number)(a, b); +} - chord.sortChords = function(_) { - return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; +function discrete(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; }; - - return chord; } -var slice = Array.prototype.slice; - -function constant(x) { - return function() { - return x; +function hue$1(a, b) { + var i = hue(+a, +b); + return function(t) { + var x = i(t); + return x - 360 * Math.floor(x / 360); }; } -function defaultSource(d) { - return d.source; +function round(a, b) { + return a = +a, b = +b, function(t) { + return Math.round(a * (1 - t) + b * t); + }; } -function defaultTarget(d) { - return d.target; -} +var degrees = 180 / Math.PI; -function defaultRadius(d) { - return d.radius; -} +var identity = { + translateX: 0, + translateY: 0, + rotate: 0, + skewX: 0, + scaleX: 1, + scaleY: 1 +}; -function defaultStartAngle(d) { - return d.startAngle; +function decompose(a, b, c, d, e, f) { + var scaleX, scaleY, skewX; + if (scaleX = Math.sqrt(a * a + b * b)) a /= scaleX, b /= scaleX; + if (skewX = a * c + b * d) c -= a * skewX, d -= b * skewX; + if (scaleY = Math.sqrt(c * c + d * d)) c /= scaleY, d /= scaleY, skewX /= scaleY; + if (a * d < b * c) a = -a, b = -b, skewX = -skewX, scaleX = -scaleX; + return { + translateX: e, + translateY: f, + rotate: Math.atan2(b, a) * degrees, + skewX: Math.atan(skewX) * degrees, + scaleX: scaleX, + scaleY: scaleY + }; } -function defaultEndAngle(d) { - return d.endAngle; -} +var svgNode; -function defaultPadAngle() { - return 0; +/* eslint-disable no-undef */ +function parseCss(value) { + const m = new (typeof DOMMatrix === "function" ? DOMMatrix : WebKitCSSMatrix)(value + ""); + return m.isIdentity ? identity : decompose(m.a, m.b, m.c, m.d, m.e, m.f); } -function defaultArrowheadRadius() { - return 10; +function parseSvg(value) { + if (value == null) return identity; + if (!svgNode) svgNode = document.createElementNS("http://www.w3.org/2000/svg", "g"); + svgNode.setAttribute("transform", value); + if (!(value = svgNode.transform.baseVal.consolidate())) return identity; + value = value.matrix; + return decompose(value.a, value.b, value.c, value.d, value.e, value.f); } -function ribbon(headRadius) { - var source = defaultSource, - target = defaultTarget, - sourceRadius = defaultRadius, - targetRadius = defaultRadius, - startAngle = defaultStartAngle, - endAngle = defaultEndAngle, - padAngle = defaultPadAngle, - context = null; - - function ribbon() { - var buffer, - s = source.apply(this, arguments), - t = target.apply(this, arguments), - ap = padAngle.apply(this, arguments) / 2, - argv = slice.call(arguments), - sr = +sourceRadius.apply(this, (argv[0] = s, argv)), - sa0 = startAngle.apply(this, argv) - halfPi, - sa1 = endAngle.apply(this, argv) - halfPi, - tr = +targetRadius.apply(this, (argv[0] = t, argv)), - ta0 = startAngle.apply(this, argv) - halfPi, - ta1 = endAngle.apply(this, argv) - halfPi; +function interpolateTransform(parse, pxComma, pxParen, degParen) { - if (!context) context = buffer = d3Path.path(); + function pop(s) { + return s.length ? s.pop() + " " : ""; + } - if (ap > epsilon) { - if (abs(sa1 - sa0) > ap * 2 + epsilon) sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap); - else sa0 = sa1 = (sa0 + sa1) / 2; - if (abs(ta1 - ta0) > ap * 2 + epsilon) ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap); - else ta0 = ta1 = (ta0 + ta1) / 2; + function translate(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push("translate(", null, pxComma, null, pxParen); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb || yb) { + s.push("translate(" + xb + pxComma + yb + pxParen); } + } - context.moveTo(sr * cos(sa0), sr * sin(sa0)); - context.arc(0, 0, sr, sa0, sa1); - if (sa0 !== ta0 || sa1 !== ta1) { - if (headRadius) { - var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2; - context.quadraticCurveTo(0, 0, tr2 * cos(ta0), tr2 * sin(ta0)); - context.lineTo(tr * cos(ta2), tr * sin(ta2)); - context.lineTo(tr2 * cos(ta1), tr2 * sin(ta1)); - } else { - context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); - context.arc(0, 0, tr, ta0, ta1); - } + function rotate(a, b, s, q) { + if (a !== b) { + if (a - b > 180) b += 360; else if (b - a > 180) a += 360; // shortest path + q.push({i: s.push(pop(s) + "rotate(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "rotate(" + b + degParen); } - context.quadraticCurveTo(0, 0, sr * cos(sa0), sr * sin(sa0)); - context.closePath(); - - if (buffer) return context = null, buffer + "" || null; } - if (headRadius) ribbon.headRadius = function(_) { - return arguments.length ? (headRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : headRadius; - }; - - ribbon.radius = function(_) { - return arguments.length ? (sourceRadius = targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; - }; - - ribbon.sourceRadius = function(_) { - return arguments.length ? (sourceRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; - }; - - ribbon.targetRadius = function(_) { - return arguments.length ? (targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : targetRadius; - }; - - ribbon.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; - }; - - ribbon.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; - }; + function skewX(a, b, s, q) { + if (a !== b) { + q.push({i: s.push(pop(s) + "skewX(", null, degParen) - 2, x: number(a, b)}); + } else if (b) { + s.push(pop(s) + "skewX(" + b + degParen); + } + } - ribbon.padAngle = function(_) { - return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : padAngle; - }; + function scale(xa, ya, xb, yb, s, q) { + if (xa !== xb || ya !== yb) { + var i = s.push(pop(s) + "scale(", null, ",", null, ")"); + q.push({i: i - 4, x: number(xa, xb)}, {i: i - 2, x: number(ya, yb)}); + } else if (xb !== 1 || yb !== 1) { + s.push(pop(s) + "scale(" + xb + "," + yb + ")"); + } + } - ribbon.source = function(_) { - return arguments.length ? (source = _, ribbon) : source; + return function(a, b) { + var s = [], // string constants and placeholders + q = []; // number interpolators + a = parse(a), b = parse(b); + translate(a.translateX, a.translateY, b.translateX, b.translateY, s, q); + rotate(a.rotate, b.rotate, s, q); + skewX(a.skewX, b.skewX, s, q); + scale(a.scaleX, a.scaleY, b.scaleX, b.scaleY, s, q); + a = b = null; // gc + return function(t) { + var i = -1, n = q.length, o; + while (++i < n) s[(o = q[i]).i] = o.x(t); + return s.join(""); + }; }; +} - ribbon.target = function(_) { - return arguments.length ? (target = _, ribbon) : target; - }; +var interpolateTransformCss = interpolateTransform(parseCss, "px, ", "px)", "deg)"); +var interpolateTransformSvg = interpolateTransform(parseSvg, ", ", ")", ")"); - ribbon.context = function(_) { - return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; - }; +var epsilon2 = 1e-12; - return ribbon; +function cosh(x) { + return ((x = Math.exp(x)) + 1 / x) / 2; } -function ribbon$1() { - return ribbon(); +function sinh(x) { + return ((x = Math.exp(x)) - 1 / x) / 2; } -function ribbonArrow() { - return ribbon(defaultArrowheadRadius); +function tanh(x) { + return ((x = Math.exp(2 * x)) - 1) / (x + 1); } -exports.chord = chord; -exports.chordDirected = chordDirected; -exports.chordTranspose = chordTranspose; -exports.ribbon = ribbon$1; -exports.ribbonArrow = ribbonArrow; +var zoom = (function zoomRho(rho, rho2, rho4) { + + // p0 = [ux0, uy0, w0] + // p1 = [ux1, uy1, w1] + function zoom(p0, p1) { + var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], + ux1 = p1[0], uy1 = p1[1], w1 = p1[2], + dx = ux1 - ux0, + dy = uy1 - uy0, + d2 = dx * dx + dy * dy, + i, + S; + + // Special case for u0 ≅ u1. + if (d2 < epsilon2) { + S = Math.log(w1 / w0) / rho; + i = function(t) { + return [ + ux0 + t * dx, + uy0 + t * dy, + w0 * Math.exp(rho * t * S) + ]; + }; + } -Object.defineProperty(exports, '__esModule', { value: true }); + // General case. + else { + var d1 = Math.sqrt(d2), + b0 = (w1 * w1 - w0 * w0 + rho4 * d2) / (2 * w0 * rho2 * d1), + b1 = (w1 * w1 - w0 * w0 - rho4 * d2) / (2 * w1 * rho2 * d1), + r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), + r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1); + S = (r1 - r0) / rho; + i = function(t) { + var s = t * S, + coshr0 = cosh(r0), + u = w0 / (rho2 * d1) * (coshr0 * tanh(rho * s + r0) - sinh(r0)); + return [ + ux0 + u * dx, + uy0 + u * dy, + w0 * coshr0 / cosh(rho * s + r0) + ]; + }; + } -})); -}); + i.duration = S * 1000 * rho / Math.SQRT2; -var d3Contour = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-contour/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Array) ; -}(commonjsGlobal, function (exports, d3Array) { -var array = Array.prototype; + return i; + } -var slice = array.slice; + zoom.rho = function(_) { + var _1 = Math.max(1e-3, +_), _2 = _1 * _1, _4 = _2 * _2; + return zoomRho(_1, _2, _4); + }; -function ascending(a, b) { - return a - b; -} + return zoom; +})(Math.SQRT2, 2, 4); -function area(ring) { - var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; - while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; - return area; +function hsl(hue) { + return function(start, end) { + var h = hue((start = d3Color.hsl(start)).h, (end = d3Color.hsl(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; + } } -var constant = x => () => x; +var hsl$1 = hsl(hue); +var hslLong = hsl(nogamma); -function contains(ring, hole) { - var i = -1, n = hole.length, c; - while (++i < n) if (c = ringContains(ring, hole[i])) return c; - return 0; +function lab(start, end) { + var l = nogamma((start = d3Color.lab(start)).l, (end = d3Color.lab(end)).l), + a = nogamma(start.a, end.a), + b = nogamma(start.b, end.b), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.l = l(t); + start.a = a(t); + start.b = b(t); + start.opacity = opacity(t); + return start + ""; + }; } -function ringContains(ring, point) { - var x = point[0], y = point[1], contains = -1; - for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { - var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; - if (segmentContains(pi, pj, point)) return 0; - if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; +function hcl(hue) { + return function(start, end) { + var h = hue((start = d3Color.hcl(start)).h, (end = d3Color.hcl(end)).h), + c = nogamma(start.c, end.c), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.c = c(t); + start.l = l(t); + start.opacity = opacity(t); + return start + ""; + }; } - return contains; } -function segmentContains(a, b, c) { - var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); -} +var hcl$1 = hcl(hue); +var hclLong = hcl(nogamma); -function collinear(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); -} +function cubehelix(hue) { + return (function cubehelixGamma(y) { + y = +y; -function within(p, q, r) { - return p <= q && q <= r || r <= q && q <= p; -} + function cubehelix(start, end) { + var h = hue((start = d3Color.cubehelix(start)).h, (end = d3Color.cubehelix(end)).h), + s = nogamma(start.s, end.s), + l = nogamma(start.l, end.l), + opacity = nogamma(start.opacity, end.opacity); + return function(t) { + start.h = h(t); + start.s = s(t); + start.l = l(Math.pow(t, y)); + start.opacity = opacity(t); + return start + ""; + }; + } -function noop() {} + cubehelix.gamma = cubehelixGamma; -var cases = [ - [], - [[[1.0, 1.5], [0.5, 1.0]]], - [[[1.5, 1.0], [1.0, 1.5]]], - [[[1.5, 1.0], [0.5, 1.0]]], - [[[1.0, 0.5], [1.5, 1.0]]], - [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], - [[[1.0, 0.5], [1.0, 1.5]]], - [[[1.0, 0.5], [0.5, 1.0]]], - [[[0.5, 1.0], [1.0, 0.5]]], - [[[1.0, 1.5], [1.0, 0.5]]], - [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], - [[[1.5, 1.0], [1.0, 0.5]]], - [[[0.5, 1.0], [1.5, 1.0]]], - [[[1.0, 1.5], [1.5, 1.0]]], - [[[0.5, 1.0], [1.0, 1.5]]], - [] -]; + return cubehelix; + })(1); +} -function contours() { - var dx = 1, - dy = 1, - threshold = d3Array.thresholdSturges, - smooth = smoothLinear; +var cubehelix$1 = cubehelix(hue); +var cubehelixLong = cubehelix(nogamma); - function contours(values) { - var tz = threshold(values); +function piecewise(interpolate, values) { + if (values === undefined) values = interpolate, interpolate = value; + var i = 0, n = values.length - 1, v = values[0], I = new Array(n < 0 ? 0 : n); + while (i < n) I[i] = interpolate(v, v = values[++i]); + return function(t) { + var i = Math.max(0, Math.min(n - 1, Math.floor(t *= n))); + return I[i](t - i); + }; +} - // Convert number of thresholds into uniform thresholds. - if (!Array.isArray(tz)) { - var domain = d3Array.extent(values), start = domain[0], stop = domain[1]; - tz = d3Array.tickStep(start, stop, tz); - tz = d3Array.range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); - } else { - tz = tz.slice().sort(ascending); - } +function quantize(interpolator, n) { + var samples = new Array(n); + for (var i = 0; i < n; ++i) samples[i] = interpolator(i / (n - 1)); + return samples; +} - return tz.map(function(value) { - return contour(values, value); - }); - } +exports.interpolate = value; +exports.interpolateArray = array; +exports.interpolateBasis = basis$1; +exports.interpolateBasisClosed = basisClosed; +exports.interpolateCubehelix = cubehelix$1; +exports.interpolateCubehelixLong = cubehelixLong; +exports.interpolateDate = date; +exports.interpolateDiscrete = discrete; +exports.interpolateHcl = hcl$1; +exports.interpolateHclLong = hclLong; +exports.interpolateHsl = hsl$1; +exports.interpolateHslLong = hslLong; +exports.interpolateHue = hue$1; +exports.interpolateLab = lab; +exports.interpolateNumber = number; +exports.interpolateNumberArray = numberArray; +exports.interpolateObject = object; +exports.interpolateRgb = rgb; +exports.interpolateRgbBasis = rgbBasis; +exports.interpolateRgbBasisClosed = rgbBasisClosed; +exports.interpolateRound = round; +exports.interpolateString = string; +exports.interpolateTransformCss = interpolateTransformCss; +exports.interpolateTransformSvg = interpolateTransformSvg; +exports.interpolateZoom = zoom; +exports.piecewise = piecewise; +exports.quantize = quantize; - // Accumulate, smooth contour rings, assign holes to exterior rings. - // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js - function contour(values, value) { - var polygons = [], - holes = []; +Object.defineProperty(exports, '__esModule', { value: true }); - isorings(values, value, function(ring) { - smooth(ring, values, value); - if (area(ring) > 0) polygons.push([ring]); - else holes.push(ring); - }); +})); +}); - holes.forEach(function(hole) { - for (var i = 0, n = polygons.length, polygon; i < n; ++i) { - if (contains((polygon = polygons[i])[0], hole) !== -1) { - polygon.push(hole); - return; - } - } - }); +var d3Timer = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-timer/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, function (exports) { +var frame = 0, // is an animation frame pending? + timeout = 0, // is a timeout pending? + interval = 0, // are any timers active? + pokeDelay = 1000, // how frequently we check for clock skew + taskHead, + taskTail, + clockLast = 0, + clockNow = 0, + clockSkew = 0, + clock = typeof performance === "object" && performance.now ? performance : Date, + setFrame = typeof window === "object" && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function(f) { setTimeout(f, 17); }; - return { - type: "MultiPolygon", - value: value, - coordinates: polygons - }; - } +function now() { + return clockNow || (setFrame(clearNow), clockNow = clock.now() + clockSkew); +} - // Marching squares with isolines stitched into rings. - // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js - function isorings(values, value, callback) { - var fragmentByStart = new Array, - fragmentByEnd = new Array, - x, y, t0, t1, t2, t3; +function clearNow() { + clockNow = 0; +} - // Special case for the first row (y = -1, t2 = t3 = 0). - x = y = -1; - t1 = values[0] >= value; - cases[t1 << 1].forEach(stitch); - while (++x < dx - 1) { - t0 = t1, t1 = values[x + 1] >= value; - cases[t0 | t1 << 1].forEach(stitch); - } - cases[t1 << 0].forEach(stitch); +function Timer() { + this._call = + this._time = + this._next = null; +} - // General case for the intermediate rows. - while (++y < dy - 1) { - x = -1; - t1 = values[y * dx + dx] >= value; - t2 = values[y * dx] >= value; - cases[t1 << 1 | t2 << 2].forEach(stitch); - while (++x < dx - 1) { - t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; - t3 = t2, t2 = values[y * dx + x + 1] >= value; - cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); - } - cases[t1 | t2 << 3].forEach(stitch); +Timer.prototype = timer.prototype = { + constructor: Timer, + restart: function(callback, delay, time) { + if (typeof callback !== "function") throw new TypeError("callback is not a function"); + time = (time == null ? now() : +time) + (delay == null ? 0 : +delay); + if (!this._next && taskTail !== this) { + if (taskTail) taskTail._next = this; + else taskHead = this; + taskTail = this; } - - // Special case for the last row (y = dy - 1, t0 = t1 = 0). - x = -1; - t2 = values[y * dx] >= value; - cases[t2 << 2].forEach(stitch); - while (++x < dx - 1) { - t3 = t2, t2 = values[y * dx + x + 1] >= value; - cases[t2 << 2 | t3 << 3].forEach(stitch); + this._call = callback; + this._time = time; + sleep(); + }, + stop: function() { + if (this._call) { + this._call = null; + this._time = Infinity; + sleep(); } - cases[t2 << 3].forEach(stitch); + } +}; - function stitch(line) { - var start = [line[0][0] + x, line[0][1] + y], - end = [line[1][0] + x, line[1][1] + y], - startIndex = index(start), - endIndex = index(end), - f, g; - if (f = fragmentByEnd[startIndex]) { - if (g = fragmentByStart[endIndex]) { - delete fragmentByEnd[f.end]; - delete fragmentByStart[g.start]; - if (f === g) { - f.ring.push(end); - callback(f.ring); - } else { - fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; - } - } else { - delete fragmentByEnd[f.end]; - f.ring.push(end); - fragmentByEnd[f.end = endIndex] = f; - } - } else if (f = fragmentByStart[endIndex]) { - if (g = fragmentByEnd[startIndex]) { - delete fragmentByStart[f.start]; - delete fragmentByEnd[g.end]; - if (f === g) { - f.ring.push(end); - callback(f.ring); - } else { - fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; - } - } else { - delete fragmentByStart[f.start]; - f.ring.unshift(start); - fragmentByStart[f.start = startIndex] = f; - } - } else { - fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; - } - } +function timer(callback, delay, time) { + var t = new Timer; + t.restart(callback, delay, time); + return t; +} + +function timerFlush() { + now(); // Get the current time, if not already set. + ++frame; // Pretend we’ve set an alarm, if we haven’t already. + var t = taskHead, e; + while (t) { + if ((e = clockNow - t._time) >= 0) t._call.call(null, e); + t = t._next; } + --frame; +} - function index(point) { - return point[0] * 2 + point[1] * (dx + 1) * 4; +function wake() { + clockNow = (clockLast = clock.now()) + clockSkew; + frame = timeout = 0; + try { + timerFlush(); + } finally { + frame = 0; + nap(); + clockNow = 0; } +} - function smoothLinear(ring, values, value) { - ring.forEach(function(point) { - var x = point[0], - y = point[1], - xt = x | 0, - yt = y | 0, - v0, - v1 = values[yt * dx + xt]; - if (x > 0 && x < dx && xt === x) { - v0 = values[yt * dx + xt - 1]; - point[0] = x + (value - v0) / (v1 - v0) - 0.5; - } - if (y > 0 && y < dy && yt === y) { - v0 = values[(yt - 1) * dx + xt]; - point[1] = y + (value - v0) / (v1 - v0) - 0.5; - } - }); +function poke() { + var now = clock.now(), delay = now - clockLast; + if (delay > pokeDelay) clockSkew -= delay, clockLast = now; +} + +function nap() { + var t0, t1 = taskHead, t2, time = Infinity; + while (t1) { + if (t1._call) { + if (time > t1._time) time = t1._time; + t0 = t1, t1 = t1._next; + } else { + t2 = t1._next, t1._next = null; + t1 = t0 ? t0._next = t2 : taskHead = t2; + } } + taskTail = t0; + sleep(time); +} - contours.contour = contour; +function sleep(time) { + if (frame) return; // Soonest alarm already set, or will be. + if (timeout) timeout = clearTimeout(timeout); + var delay = time - clockNow; // Strictly less than if we recomputed clockNow. + if (delay > 24) { + if (time < Infinity) timeout = setTimeout(wake, time - clock.now() - clockSkew); + if (interval) interval = clearInterval(interval); + } else { + if (!interval) clockLast = clock.now(), interval = setInterval(poke, pokeDelay); + frame = 1, setFrame(wake); + } +} - contours.size = function(_) { - if (!arguments.length) return [dx, dy]; - var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]); - if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); - return dx = _0, dy = _1, contours; - }; +function timeout$1(callback, delay, time) { + var t = new Timer; + delay = delay == null ? 0 : +delay; + t.restart(elapsed => { + t.stop(); + callback(elapsed + delay); + }, delay, time); + return t; +} - contours.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; +function interval$1(callback, delay, time) { + var t = new Timer, total = delay; + if (delay == null) return t.restart(callback, delay, time), t; + t._restart = t.restart; + t.restart = function(callback, delay, time) { + delay = +delay, time = time == null ? now() : +time; + t._restart(function tick(elapsed) { + elapsed += total; + t._restart(tick, total += delay, time); + callback(elapsed); + }, delay, time); }; + t.restart(callback, delay, time); + return t; +} - contours.smooth = function(_) { - return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; - }; +exports.interval = interval$1; +exports.now = now; +exports.timeout = timeout$1; +exports.timer = timer; +exports.timerFlush = timerFlush; - return contours; +Object.defineProperty(exports, '__esModule', { value: true }); + +})); +}); + +var d3Ease = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-ease/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, function (exports) { +const linear = t => +t; + +function quadIn(t) { + return t * t; } -// TODO Optimize edge cases. -// TODO Optimize index calculation. -// TODO Optimize arguments. -function blurX(source, target, r) { - var n = source.width, - m = source.height, - w = (r << 1) + 1; - for (var j = 0; j < m; ++j) { - for (var i = 0, sr = 0; i < n + r; ++i) { - if (i < n) { - sr += source.data[i + j * n]; - } - if (i >= r) { - if (i >= w) { - sr -= source.data[i - w + j * n]; - } - target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); - } - } - } +function quadOut(t) { + return t * (2 - t); } -// TODO Optimize edge cases. -// TODO Optimize index calculation. -// TODO Optimize arguments. -function blurY(source, target, r) { - var n = source.width, - m = source.height, - w = (r << 1) + 1; - for (var i = 0; i < n; ++i) { - for (var j = 0, sr = 0; j < m + r; ++j) { - if (j < m) { - sr += source.data[i + j * n]; - } - if (j >= r) { - if (j >= w) { - sr -= source.data[i + (j - w) * n]; - } - target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); - } - } - } +function quadInOut(t) { + return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2; } -function defaultX(d) { - return d[0]; +function cubicIn(t) { + return t * t * t; } -function defaultY(d) { - return d[1]; +function cubicOut(t) { + return --t * t * t + 1; } -function defaultWeight() { - return 1; +function cubicInOut(t) { + return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2; } -function density() { - var x = defaultX, - y = defaultY, - weight = defaultWeight, - dx = 960, - dy = 500, - r = 20, // blur radius - k = 2, // log2(grid cell size) - o = r * 3, // grid offset, to pad for blur - n = (dx + o * 2) >> k, // grid width - m = (dy + o * 2) >> k, // grid height - threshold = constant(20); +var exponent = 3; - function density(data) { - var values0 = new Float32Array(n * m), - values1 = new Float32Array(n * m); +var polyIn = (function custom(e) { + e = +e; - data.forEach(function(d, i, data) { - var xi = (+x(d, i, data) + o) >> k, - yi = (+y(d, i, data) + o) >> k, - wi = +weight(d, i, data); - if (xi >= 0 && xi < n && yi >= 0 && yi < m) { - values0[xi + yi * n] += wi; - } - }); + function polyIn(t) { + return Math.pow(t, e); + } - // TODO Optimize. - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); - blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); - blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + polyIn.exponent = custom; - var tz = threshold(values0); + return polyIn; +})(exponent); - // Convert number of thresholds into uniform thresholds. - if (!Array.isArray(tz)) { - var stop = d3Array.max(values0); - tz = d3Array.tickStep(0, stop, tz); - tz = d3Array.range(0, Math.floor(stop / tz) * tz, tz); - tz.shift(); - } +var polyOut = (function custom(e) { + e = +e; - return contours() - .thresholds(tz) - .size([n, m]) - (values0) - .map(transform); + function polyOut(t) { + return 1 - Math.pow(1 - t, e); } - function transform(geometry) { - geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. - geometry.coordinates.forEach(transformPolygon); - return geometry; - } + polyOut.exponent = custom; - function transformPolygon(coordinates) { - coordinates.forEach(transformRing); - } + return polyOut; +})(exponent); - function transformRing(coordinates) { - coordinates.forEach(transformPoint); - } +var polyInOut = (function custom(e) { + e = +e; - // TODO Optimize. - function transformPoint(coordinates) { - coordinates[0] = coordinates[0] * Math.pow(2, k) - o; - coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + function polyInOut(t) { + return ((t *= 2) <= 1 ? Math.pow(t, e) : 2 - Math.pow(2 - t, e)) / 2; } - function resize() { - o = r * 3; - n = (dx + o * 2) >> k; - m = (dy + o * 2) >> k; - return density; - } + polyInOut.exponent = custom; - density.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; - }; + return polyInOut; +})(exponent); - density.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; - }; +var pi = Math.PI, + halfPi = pi / 2; - density.weight = function(_) { - return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; - }; +function sinIn(t) { + return (+t === 1) ? 1 : 1 - Math.cos(t * halfPi); +} - density.size = function(_) { - if (!arguments.length) return [dx, dy]; - var _0 = +_[0], _1 = +_[1]; - if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); - return dx = _0, dy = _1, resize(); - }; +function sinOut(t) { + return Math.sin(t * halfPi); +} - density.cellSize = function(_) { - if (!arguments.length) return 1 << k; - if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); - return k = Math.floor(Math.log(_) / Math.LN2), resize(); - }; +function sinInOut(t) { + return (1 - Math.cos(pi * t)) / 2; +} - density.thresholds = function(_) { - return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; - }; +// tpmt is two power minus ten times t scaled to [0,1] +function tpmt(x) { + return (Math.pow(2, -10 * x) - 0.0009765625) * 1.0009775171065494; +} - density.bandwidth = function(_) { - if (!arguments.length) return Math.sqrt(r * (r + 1)); - if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); - return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); - }; +function expIn(t) { + return tpmt(1 - +t); +} - return density; +function expOut(t) { + return 1 - tpmt(t); } -exports.contourDensity = density; -exports.contours = contours; +function expInOut(t) { + return ((t *= 2) <= 1 ? tpmt(1 - t) : 2 - tpmt(t - 1)) / 2; +} -Object.defineProperty(exports, '__esModule', { value: true }); +function circleIn(t) { + return 1 - Math.sqrt(1 - t * t); +} -})); -}); +function circleOut(t) { + return Math.sqrt(1 - --t * t); +} -var d3Delaunay = createCommonjsModule(function (module, exports) { -// https://github.com/d3/d3-delaunay v5.3.0 Copyright 2020 Mike Bostock -// https://github.com/mapbox/delaunator v4.0.1. Copyright 2019 Mapbox, Inc. -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -const EPSILON = Math.pow(2, -52); -const EDGE_STACK = new Uint32Array(512); +function circleInOut(t) { + return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2; +} -class Delaunator { +var b1 = 4 / 11, + b2 = 6 / 11, + b3 = 8 / 11, + b4 = 3 / 4, + b5 = 9 / 11, + b6 = 10 / 11, + b7 = 15 / 16, + b8 = 21 / 22, + b9 = 63 / 64, + b0 = 1 / b1 / b1; - static from(points, getX = defaultGetX, getY = defaultGetY) { - const n = points.length; - const coords = new Float64Array(n * 2); +function bounceIn(t) { + return 1 - bounceOut(1 - t); +} - for (let i = 0; i < n; i++) { - const p = points[i]; - coords[2 * i] = getX(p); - coords[2 * i + 1] = getY(p); - } +function bounceOut(t) { + return (t = +t) < b1 ? b0 * t * t : t < b3 ? b0 * (t -= b2) * t + b4 : t < b6 ? b0 * (t -= b5) * t + b7 : b0 * (t -= b8) * t + b9; +} - return new Delaunator(coords); - } +function bounceInOut(t) { + return ((t *= 2) <= 1 ? 1 - bounceOut(1 - t) : bounceOut(t - 1) + 1) / 2; +} - constructor(coords) { - const n = coords.length >> 1; - if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.'); +var overshoot = 1.70158; + +var backIn = (function custom(s) { + s = +s; + + function backIn(t) { + return (t = +t) * t * (s * (t - 1) + t); + } + + backIn.overshoot = custom; + + return backIn; +})(overshoot); + +var backOut = (function custom(s) { + s = +s; + + function backOut(t) { + return --t * t * ((t + 1) * s + t) + 1; + } + + backOut.overshoot = custom; + + return backOut; +})(overshoot); + +var backInOut = (function custom(s) { + s = +s; - this.coords = coords; + function backInOut(t) { + return ((t *= 2) < 1 ? t * t * ((s + 1) * t - s) : (t -= 2) * t * ((s + 1) * t + s) + 2) / 2; + } - // arrays that will store the triangulation graph - const maxTriangles = Math.max(2 * n - 5, 0); - this._triangles = new Uint32Array(maxTriangles * 3); - this._halfedges = new Int32Array(maxTriangles * 3); + backInOut.overshoot = custom; - // temporary arrays for tracking the edges of the advancing convex hull - this._hashSize = Math.ceil(Math.sqrt(n)); - this._hullPrev = new Uint32Array(n); // edge to prev edge - this._hullNext = new Uint32Array(n); // edge to next edge - this._hullTri = new Uint32Array(n); // edge to adjacent triangle - this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash + return backInOut; +})(overshoot); - // temporary arrays for sorting points - this._ids = new Uint32Array(n); - this._dists = new Float64Array(n); +var tau = 2 * Math.PI, + amplitude = 1, + period = 0.3; - this.update(); - } +var elasticIn = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); - update() { - const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this; - const n = coords.length >> 1; + function elasticIn(t) { + return a * tpmt(-(--t)) * Math.sin((s - t) / p); + } - // populate an array of point indices; calculate input data bbox - let minX = Infinity; - let minY = Infinity; - let maxX = -Infinity; - let maxY = -Infinity; + elasticIn.amplitude = function(a) { return custom(a, p * tau); }; + elasticIn.period = function(p) { return custom(a, p); }; - for (let i = 0; i < n; i++) { - const x = coords[2 * i]; - const y = coords[2 * i + 1]; - if (x < minX) minX = x; - if (y < minY) minY = y; - if (x > maxX) maxX = x; - if (y > maxY) maxY = y; - this._ids[i] = i; - } - const cx = (minX + maxX) / 2; - const cy = (minY + maxY) / 2; + return elasticIn; +})(amplitude, period); - let minDist = Infinity; - let i0, i1, i2; +var elasticOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); - // pick a seed point close to the center - for (let i = 0; i < n; i++) { - const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); - if (d < minDist) { - i0 = i; - minDist = d; - } - } - const i0x = coords[2 * i0]; - const i0y = coords[2 * i0 + 1]; + function elasticOut(t) { + return 1 - a * tpmt(t = +t) * Math.sin((t + s) / p); + } - minDist = Infinity; + elasticOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticOut.period = function(p) { return custom(a, p); }; - // find the point closest to the seed - for (let i = 0; i < n; i++) { - if (i === i0) continue; - const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]); - if (d < minDist && d > 0) { - i1 = i; - minDist = d; - } - } - let i1x = coords[2 * i1]; - let i1y = coords[2 * i1 + 1]; + return elasticOut; +})(amplitude, period); - let minRadius = Infinity; +var elasticInOut = (function custom(a, p) { + var s = Math.asin(1 / (a = Math.max(1, a))) * (p /= tau); - // find the third point which forms the smallest circumcircle with the first two - for (let i = 0; i < n; i++) { - if (i === i0 || i === i1) continue; - const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]); - if (r < minRadius) { - i2 = i; - minRadius = r; - } - } - let i2x = coords[2 * i2]; - let i2y = coords[2 * i2 + 1]; + function elasticInOut(t) { + return ((t = t * 2 - 1) < 0 + ? a * tpmt(-t) * Math.sin((s - t) / p) + : 2 - a * tpmt(t) * Math.sin((s + t) / p)) / 2; + } - if (minRadius === Infinity) { - // order collinear points by dx (or dy if all x are identical) - // and return the list as a hull - for (let i = 0; i < n; i++) { - this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]); - } - quicksort(this._ids, this._dists, 0, n - 1); - const hull = new Uint32Array(n); - let j = 0; - for (let i = 0, d0 = -Infinity; i < n; i++) { - const id = this._ids[i]; - if (this._dists[id] > d0) { - hull[j++] = id; - d0 = this._dists[id]; - } - } - this.hull = hull.subarray(0, j); - this.triangles = new Uint32Array(0); - this.halfedges = new Uint32Array(0); - return; - } + elasticInOut.amplitude = function(a) { return custom(a, p * tau); }; + elasticInOut.period = function(p) { return custom(a, p); }; - // swap the order of the seed points for counter-clockwise orientation - if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { - const i = i1; - const x = i1x; - const y = i1y; - i1 = i2; - i1x = i2x; - i1y = i2y; - i2 = i; - i2x = x; - i2y = y; - } + return elasticInOut; +})(amplitude, period); - const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); - this._cx = center.x; - this._cy = center.y; +exports.easeBack = backInOut; +exports.easeBackIn = backIn; +exports.easeBackInOut = backInOut; +exports.easeBackOut = backOut; +exports.easeBounce = bounceOut; +exports.easeBounceIn = bounceIn; +exports.easeBounceInOut = bounceInOut; +exports.easeBounceOut = bounceOut; +exports.easeCircle = circleInOut; +exports.easeCircleIn = circleIn; +exports.easeCircleInOut = circleInOut; +exports.easeCircleOut = circleOut; +exports.easeCubic = cubicInOut; +exports.easeCubicIn = cubicIn; +exports.easeCubicInOut = cubicInOut; +exports.easeCubicOut = cubicOut; +exports.easeElastic = elasticOut; +exports.easeElasticIn = elasticIn; +exports.easeElasticInOut = elasticInOut; +exports.easeElasticOut = elasticOut; +exports.easeExp = expInOut; +exports.easeExpIn = expIn; +exports.easeExpInOut = expInOut; +exports.easeExpOut = expOut; +exports.easeLinear = linear; +exports.easePoly = polyInOut; +exports.easePolyIn = polyIn; +exports.easePolyInOut = polyInOut; +exports.easePolyOut = polyOut; +exports.easeQuad = quadInOut; +exports.easeQuadIn = quadIn; +exports.easeQuadInOut = quadInOut; +exports.easeQuadOut = quadOut; +exports.easeSin = sinInOut; +exports.easeSinIn = sinIn; +exports.easeSinInOut = sinInOut; +exports.easeSinOut = sinOut; - for (let i = 0; i < n; i++) { - this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y); - } +Object.defineProperty(exports, '__esModule', { value: true }); - // sort the points by distance from the seed triangle circumcenter - quicksort(this._ids, this._dists, 0, n - 1); +})); +}); - // set up the seed triangle as the starting hull - this._hullStart = i0; - let hullSize = 3; +var d3Transition = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-transition/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) ; +}(commonjsGlobal, function (exports, d3Selection, d3Dispatch, d3Timer, d3Interpolate, d3Color, d3Ease) { +var emptyOn = d3Dispatch.dispatch("start", "end", "cancel", "interrupt"); +var emptyTween = []; - hullNext[i0] = hullPrev[i2] = i1; - hullNext[i1] = hullPrev[i0] = i2; - hullNext[i2] = hullPrev[i1] = i0; +var CREATED = 0; +var SCHEDULED = 1; +var STARTING = 2; +var STARTED = 3; +var RUNNING = 4; +var ENDING = 5; +var ENDED = 6; - hullTri[i0] = 0; - hullTri[i1] = 1; - hullTri[i2] = 2; +function schedule(node, name, id, index, group, timing) { + var schedules = node.__transition; + if (!schedules) node.__transition = {}; + else if (id in schedules) return; + create(node, id, { + name: name, + index: index, // For context during callback. + group: group, // For context during callback. + on: emptyOn, + tween: emptyTween, + time: timing.time, + delay: timing.delay, + duration: timing.duration, + ease: timing.ease, + timer: null, + state: CREATED + }); +} - hullHash.fill(-1); - hullHash[this._hashKey(i0x, i0y)] = i0; - hullHash[this._hashKey(i1x, i1y)] = i1; - hullHash[this._hashKey(i2x, i2y)] = i2; +function init(node, id) { + var schedule = get(node, id); + if (schedule.state > CREATED) throw new Error("too late; already scheduled"); + return schedule; +} - this.trianglesLen = 0; - this._addTriangle(i0, i1, i2, -1, -1, -1); +function set(node, id) { + var schedule = get(node, id); + if (schedule.state > STARTED) throw new Error("too late; already running"); + return schedule; +} - for (let k = 0, xp, yp; k < this._ids.length; k++) { - const i = this._ids[k]; - const x = coords[2 * i]; - const y = coords[2 * i + 1]; +function get(node, id) { + var schedule = node.__transition; + if (!schedule || !(schedule = schedule[id])) throw new Error("transition not found"); + return schedule; +} - // skip near-duplicate points - if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue; - xp = x; - yp = y; +function create(node, id, self) { + var schedules = node.__transition, + tween; - // skip seed triangle points - if (i === i0 || i === i1 || i === i2) continue; + // Initialize the self timer when the transition is created. + // Note the actual delay is not known until the first callback! + schedules[id] = self; + self.timer = d3Timer.timer(schedule, 0, self.time); - // find a visible edge on the convex hull using edge hash - let start = 0; - for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { - start = hullHash[(key + j) % this._hashSize]; - if (start !== -1 && start !== hullNext[start]) break; - } + function schedule(elapsed) { + self.state = SCHEDULED; + self.timer.restart(start, self.delay, self.time); - start = hullPrev[start]; - let e = start, q; - while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) { - e = q; - if (e === start) { - e = -1; - break; - } - } - if (e === -1) continue; // likely a near-duplicate point; skip it + // If the elapsed delay is less than our first sleep, start immediately. + if (self.delay <= elapsed) start(elapsed - self.delay); + } - // add the first triangle from the point - let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); + function start(elapsed) { + var i, j, n, o; - // recursively flip triangles from the point until they satisfy the Delaunay condition - hullTri[i] = this._legalize(t + 2); - hullTri[e] = t; // keep track of boundary triangles on the hull - hullSize++; + // If the state is not SCHEDULED, then we previously errored on start. + if (self.state !== SCHEDULED) return stop(); - // walk forward through the hull, adding more triangles and flipping recursively - let n = hullNext[e]; - while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) { - t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]); - hullTri[i] = this._legalize(t + 2); - hullNext[n] = n; // mark as removed - hullSize--; - n = q; - } + for (i in schedules) { + o = schedules[i]; + if (o.name !== self.name) continue; - // walk backward from the other side, adding more triangles and flipping - if (e === start) { - while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) { - t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]); - this._legalize(t + 2); - hullTri[q] = t; - hullNext[e] = e; // mark as removed - hullSize--; - e = q; - } - } + // While this element already has a starting transition during this frame, + // defer starting an interrupting transition until that transition has a + // chance to tick (and possibly end); see d3/d3-transition#54! + if (o.state === STARTED) return d3Timer.timeout(start); - // update the hull indices - this._hullStart = hullPrev[i] = e; - hullNext[e] = hullPrev[n] = i; - hullNext[i] = n; + // Interrupt the active transition, if any. + if (o.state === RUNNING) { + o.state = ENDED; + o.timer.stop(); + o.on.call("interrupt", node, node.__data__, o.index, o.group); + delete schedules[i]; + } - // save the two new edges in the hash table - hullHash[this._hashKey(x, y)] = i; - hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; - } + // Cancel any pre-empted transitions. + else if (+i < id) { + o.state = ENDED; + o.timer.stop(); + o.on.call("cancel", node, node.__data__, o.index, o.group); + delete schedules[i]; + } + } - this.hull = new Uint32Array(hullSize); - for (let i = 0, e = this._hullStart; i < hullSize; i++) { - this.hull[i] = e; - e = hullNext[e]; - } + // Defer the first tick to end of the current frame; see d3/d3#1576. + // Note the transition may be canceled after start and before the first tick! + // Note this must be scheduled before the start event; see d3/d3-transition#16! + // Assuming this is successful, subsequent callbacks go straight to tick. + d3Timer.timeout(function() { + if (self.state === STARTED) { + self.state = RUNNING; + self.timer.restart(tick, self.delay, self.time); + tick(elapsed); + } + }); - // trim typed triangle mesh arrays - this.triangles = this._triangles.subarray(0, this.trianglesLen); - this.halfedges = this._halfedges.subarray(0, this.trianglesLen); - } + // Dispatch the start event. + // Note this must be done before the tween are initialized. + self.state = STARTING; + self.on.call("start", node, node.__data__, self.index, self.group); + if (self.state !== STARTING) return; // interrupted + self.state = STARTED; - _hashKey(x, y) { - return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; + // Initialize the tween, deleting null tween. + tween = new Array(n = self.tween.length); + for (i = 0, j = -1; i < n; ++i) { + if (o = self.tween[i].value.call(node, node.__data__, self.index, self.group)) { + tween[++j] = o; + } } + tween.length = j + 1; + } - _legalize(a) { - const {_triangles: triangles, _halfedges: halfedges, coords} = this; - - let i = 0; - let ar = 0; + function tick(elapsed) { + var t = elapsed < self.duration ? self.ease.call(null, elapsed / self.duration) : (self.timer.restart(stop), self.state = ENDING, 1), + i = -1, + n = tween.length; - // recursion eliminated with a fixed-size stack - while (true) { - const b = halfedges[a]; + while (++i < n) { + tween[i].call(node, t); + } - /* if the pair of triangles doesn't satisfy the Delaunay condition - * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, - * then do the same check/flip recursively for the new pair of triangles - * - * pl pl - * /||\ / \ - * al/ || \bl al/ \a - * / || \ / \ - * / a||b \ flip /___ar___\ - * p0\ || /p1 => p0\---bl---/p1 - * \ || / \ / - * ar\ || /br b\ /br - * \||/ \ / - * pr pr - */ - const a0 = a - a % 3; - ar = a0 + (a + 2) % 3; + // Dispatch the end event. + if (self.state === ENDING) { + self.on.call("end", node, node.__data__, self.index, self.group); + stop(); + } + } - if (b === -1) { // convex hull edge - if (i === 0) break; - a = EDGE_STACK[--i]; - continue; - } + function stop() { + self.state = ENDED; + self.timer.stop(); + delete schedules[id]; + for (var i in schedules) return; // eslint-disable-line no-unused-vars + delete node.__transition; + } +} - const b0 = b - b % 3; - const al = a0 + (a + 1) % 3; - const bl = b0 + (b + 2) % 3; +function interrupt(node, name) { + var schedules = node.__transition, + schedule, + active, + empty = true, + i; - const p0 = triangles[ar]; - const pr = triangles[a]; - const pl = triangles[al]; - const p1 = triangles[bl]; + if (!schedules) return; - const illegal = inCircle( - coords[2 * p0], coords[2 * p0 + 1], - coords[2 * pr], coords[2 * pr + 1], - coords[2 * pl], coords[2 * pl + 1], - coords[2 * p1], coords[2 * p1 + 1]); + name = name == null ? null : name + ""; - if (illegal) { - triangles[a] = p1; - triangles[b] = p0; + for (i in schedules) { + if ((schedule = schedules[i]).name !== name) { empty = false; continue; } + active = schedule.state > STARTING && schedule.state < ENDING; + schedule.state = ENDED; + schedule.timer.stop(); + schedule.on.call(active ? "interrupt" : "cancel", node, node.__data__, schedule.index, schedule.group); + delete schedules[i]; + } - const hbl = halfedges[bl]; + if (empty) delete node.__transition; +} - // edge swapped on the other side of the hull (rare); fix the halfedge reference - if (hbl === -1) { - let e = this._hullStart; - do { - if (this._hullTri[e] === bl) { - this._hullTri[e] = a; - break; - } - e = this._hullPrev[e]; - } while (e !== this._hullStart); - } - this._link(a, hbl); - this._link(b, halfedges[ar]); - this._link(ar, bl); +function selection_interrupt(name) { + return this.each(function() { + interrupt(this, name); + }); +} - const br = b0 + (b + 1) % 3; +function tweenRemove(id, name) { + var tween0, tween1; + return function() { + var schedule = set(this, id), + tween = schedule.tween; - // don't worry about hitting the cap: it can only happen on extremely degenerate input - if (i < EDGE_STACK.length) { - EDGE_STACK[i++] = br; - } - } else { - if (i === 0) break; - a = EDGE_STACK[--i]; - } + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = tween0 = tween; + for (var i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1 = tween1.slice(); + tween1.splice(i, 1); + break; } - - return ar; + } } - _link(a, b) { - this._halfedges[a] = b; - if (b !== -1) this._halfedges[b] = a; - } + schedule.tween = tween1; + }; +} - // add a new triangle given vertex indices and adjacent half-edge ids - _addTriangle(i0, i1, i2, a, b, c) { - const t = this.trianglesLen; +function tweenFunction(id, name, value) { + var tween0, tween1; + if (typeof value !== "function") throw new Error; + return function() { + var schedule = set(this, id), + tween = schedule.tween; - this._triangles[t] = i0; - this._triangles[t + 1] = i1; - this._triangles[t + 2] = i2; + // If this node shared tween with the previous node, + // just assign the updated shared tween and we’re done! + // Otherwise, copy-on-write. + if (tween !== tween0) { + tween1 = (tween0 = tween).slice(); + for (var t = {name: name, value: value}, i = 0, n = tween1.length; i < n; ++i) { + if (tween1[i].name === name) { + tween1[i] = t; + break; + } + } + if (i === n) tween1.push(t); + } - this._link(t, a); - this._link(t + 1, b); - this._link(t + 2, c); + schedule.tween = tween1; + }; +} - this.trianglesLen += 3; +function transition_tween(name, value) { + var id = this._id; - return t; + name += ""; + + if (arguments.length < 2) { + var tween = get(this.node(), id).tween; + for (var i = 0, n = tween.length, t; i < n; ++i) { + if ((t = tween[i]).name === name) { + return t.value; + } } -} + return null; + } -// monotonically increases with real angle, but doesn't need expensive trigonometry -function pseudoAngle(dx, dy) { - const p = dx / (Math.abs(dx) + Math.abs(dy)); - return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] + return this.each((value == null ? tweenRemove : tweenFunction)(id, name, value)); } -function dist(ax, ay, bx, by) { - const dx = ax - bx; - const dy = ay - by; - return dx * dx + dy * dy; -} +function tweenValue(transition, name, value) { + var id = transition._id; -// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check -function orientIfSure(px, py, rx, ry, qx, qy) { - const l = (ry - py) * (qx - px); - const r = (rx - px) * (qy - py); - return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0; -} + transition.each(function() { + var schedule = set(this, id); + (schedule.value || (schedule.value = {}))[name] = value.apply(this, arguments); + }); -// a more robust orientation test that's stable in a given triangle (to fix robustness issues) -function orient(rx, ry, qx, qy, px, py) { - const sign = orientIfSure(px, py, rx, ry, qx, qy) || - orientIfSure(rx, ry, qx, qy, px, py) || - orientIfSure(qx, qy, px, py, rx, ry); - return sign < 0; + return function(node) { + return get(node, id).value[name]; + }; } -function inCircle(ax, ay, bx, by, cx, cy, px, py) { - const dx = ax - px; - const dy = ay - py; - const ex = bx - px; - const ey = by - py; - const fx = cx - px; - const fy = cy - py; +function interpolate(a, b) { + var c; + return (typeof b === "number" ? d3Interpolate.interpolateNumber + : b instanceof d3Color.color ? d3Interpolate.interpolateRgb + : (c = d3Color.color(b)) ? (b = c, d3Interpolate.interpolateRgb) + : d3Interpolate.interpolateString)(a, b); +} - const ap = dx * dx + dy * dy; - const bp = ex * ex + ey * ey; - const cp = fx * fx + fy * fy; +function attrRemove(name) { + return function() { + this.removeAttribute(name); + }; +} - return dx * (ey * cp - bp * fy) - - dy * (ex * cp - bp * fx) + - ap * (ex * fy - ey * fx) < 0; +function attrRemoveNS(fullname) { + return function() { + this.removeAttributeNS(fullname.space, fullname.local); + }; } -function circumradius(ax, ay, bx, by, cx, cy) { - const dx = bx - ax; - const dy = by - ay; - const ex = cx - ax; - const ey = cy - ay; +function attrConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttribute(name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} - const bl = dx * dx + dy * dy; - const cl = ex * ex + ey * ey; - const d = 0.5 / (dx * ey - dy * ex); +function attrConstantNS(fullname, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = this.getAttributeNS(fullname.space, fullname.local); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} - const x = (ey * bl - dy * cl) * d; - const y = (dx * cl - ex * bl) * d; +function attrFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttribute(name); + string0 = this.getAttribute(name); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} - return x * x + y * y; +function attrFunctionNS(fullname, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0, value1 = value(this), string1; + if (value1 == null) return void this.removeAttributeNS(fullname.space, fullname.local); + string0 = this.getAttributeNS(fullname.space, fullname.local); + string1 = value1 + ""; + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; } -function circumcenter(ax, ay, bx, by, cx, cy) { - const dx = bx - ax; - const dy = by - ay; - const ex = cx - ax; - const ey = cy - ay; +function transition_attr(name, value) { + var fullname = d3Selection.namespace(name), i = fullname === "transform" ? d3Interpolate.interpolateTransformSvg : interpolate; + return this.attrTween(name, typeof value === "function" + ? (fullname.local ? attrFunctionNS : attrFunction)(fullname, i, tweenValue(this, "attr." + name, value)) + : value == null ? (fullname.local ? attrRemoveNS : attrRemove)(fullname) + : (fullname.local ? attrConstantNS : attrConstant)(fullname, i, value)); +} - const bl = dx * dx + dy * dy; - const cl = ex * ex + ey * ey; - const d = 0.5 / (dx * ey - dy * ex); +function attrInterpolate(name, i) { + return function(t) { + this.setAttribute(name, i.call(this, t)); + }; +} - const x = ax + (ey * bl - dy * cl) * d; - const y = ay + (dx * cl - ex * bl) * d; +function attrInterpolateNS(fullname, i) { + return function(t) { + this.setAttributeNS(fullname.space, fullname.local, i.call(this, t)); + }; +} - return {x, y}; +function attrTweenNS(fullname, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolateNS(fullname, i); + return t0; + } + tween._value = value; + return tween; } -function quicksort(ids, dists, left, right) { - if (right - left <= 20) { - for (let i = left + 1; i <= right; i++) { - const temp = ids[i]; - const tempDist = dists[temp]; - let j = i - 1; - while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--]; - ids[j + 1] = temp; - } - } else { - const median = (left + right) >> 1; - let i = left + 1; - let j = right; - swap(ids, median, i); - if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right); - if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right); - if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i); +function attrTween(name, value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && attrInterpolate(name, i); + return t0; + } + tween._value = value; + return tween; +} - const temp = ids[i]; - const tempDist = dists[temp]; - while (true) { - do i++; while (dists[ids[i]] < tempDist); - do j--; while (dists[ids[j]] > tempDist); - if (j < i) break; - swap(ids, i, j); - } - ids[left + 1] = ids[j]; - ids[j] = temp; +function transition_attrTween(name, value) { + var key = "attr." + name; + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + var fullname = d3Selection.namespace(name); + return this.tween(key, (fullname.local ? attrTweenNS : attrTween)(fullname, value)); +} - if (right - i + 1 >= j - left) { - quicksort(ids, dists, i, right); - quicksort(ids, dists, left, j - 1); - } else { - quicksort(ids, dists, left, j - 1); - quicksort(ids, dists, i, right); - } - } +function delayFunction(id, value) { + return function() { + init(this, id).delay = +value.apply(this, arguments); + }; } -function swap(arr, i, j) { - const tmp = arr[i]; - arr[i] = arr[j]; - arr[j] = tmp; +function delayConstant(id, value) { + return value = +value, function() { + init(this, id).delay = value; + }; } -function defaultGetX(p) { - return p[0]; +function transition_delay(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? delayFunction + : delayConstant)(id, value)) + : get(this.node(), id).delay; } -function defaultGetY(p) { - return p[1]; + +function durationFunction(id, value) { + return function() { + set(this, id).duration = +value.apply(this, arguments); + }; } -const epsilon = 1e-6; +function durationConstant(id, value) { + return value = +value, function() { + set(this, id).duration = value; + }; +} -class Path { - constructor() { - this._x0 = this._y0 = // start of current subpath - this._x1 = this._y1 = null; // end of current subpath - this._ = ""; - } - moveTo(x, y) { - this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`; - } - closePath() { - if (this._x1 !== null) { - this._x1 = this._x0, this._y1 = this._y0; - this._ += "Z"; - } - } - lineTo(x, y) { - this._ += `L${this._x1 = +x},${this._y1 = +y}`; - } - arc(x, y, r) { - x = +x, y = +y, r = +r; - const x0 = x + r; - const y0 = y; - if (r < 0) throw new Error("negative radius"); - if (this._x1 === null) this._ += `M${x0},${y0}`; - else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += "L" + x0 + "," + y0; - if (!r) return; - this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`; - } - rect(x, y, w, h) { - this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`; - } - value() { - return this._ || null; - } +function transition_duration(value) { + var id = this._id; + + return arguments.length + ? this.each((typeof value === "function" + ? durationFunction + : durationConstant)(id, value)) + : get(this.node(), id).duration; } -class Polygon { - constructor() { - this._ = []; - } - moveTo(x, y) { - this._.push([x, y]); - } - closePath() { - this._.push(this._[0].slice()); - } - lineTo(x, y) { - this._.push([x, y]); - } - value() { - return this._.length ? this._ : null; - } +function easeConstant(id, value) { + if (typeof value !== "function") throw new Error; + return function() { + set(this, id).ease = value; + }; } -class Voronoi { - constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) { - if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error("invalid bounds"); - this.delaunay = delaunay; - this._circumcenters = new Float64Array(delaunay.points.length * 2); - this.vectors = new Float64Array(delaunay.points.length * 2); - this.xmax = xmax, this.xmin = xmin; - this.ymax = ymax, this.ymin = ymin; - this._init(); - } - update() { - this.delaunay.update(); - this._init(); - return this; - } - _init() { - const {delaunay: {points, hull, triangles}, vectors} = this; +function transition_ease(value) { + var id = this._id; - // Compute circumcenters. - const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2); - for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) { - const t1 = triangles[i] * 2; - const t2 = triangles[i + 1] * 2; - const t3 = triangles[i + 2] * 2; - const x1 = points[t1]; - const y1 = points[t1 + 1]; - const x2 = points[t2]; - const y2 = points[t2 + 1]; - const x3 = points[t3]; - const y3 = points[t3 + 1]; + return arguments.length + ? this.each(easeConstant(id, value)) + : get(this.node(), id).ease; +} - const dx = x2 - x1; - const dy = y2 - y1; - const ex = x3 - x1; - const ey = y3 - y1; - const bl = dx * dx + dy * dy; - const cl = ex * ex + ey * ey; - const ab = (dx * ey - dy * ex) * 2; +function easeVarying(id, value) { + return function() { + var v = value.apply(this, arguments); + if (typeof v !== "function") throw new Error; + set(this, id).ease = v; + }; +} - if (!ab) { - // degenerate case (collinear diagram) - x = (x1 + x3) / 2 - 1e8 * ey; - y = (y1 + y3) / 2 + 1e8 * ex; - } - else if (Math.abs(ab) < 1e-8) { - // almost equal points (degenerate triangle) - x = (x1 + x3) / 2; - y = (y1 + y3) / 2; - } else { - const d = 1 / ab; - x = x1 + (ey * bl - dy * cl) * d; - y = y1 + (dx * cl - ex * bl) * d; - } - circumcenters[j] = x; - circumcenters[j + 1] = y; - } +function transition_easeVarying(value) { + if (typeof value !== "function") throw new Error; + return this.each(easeVarying(this._id, value)); +} - // Compute exterior cell rays. - let h = hull[hull.length - 1]; - let p0, p1 = h * 4; - let x0, x1 = points[2 * h]; - let y0, y1 = points[2 * h + 1]; - vectors.fill(0); - for (let i = 0; i < hull.length; ++i) { - h = hull[i]; - p0 = p1, x0 = x1, y0 = y1; - p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1]; - vectors[p0 + 2] = vectors[p1] = y0 - y1; - vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0; - } - } - render(context) { - const buffer = context == null ? context = new Path : undefined; - const {delaunay: {halfedges, inedges, hull}, circumcenters, vectors} = this; - if (hull.length <= 1) return null; - for (let i = 0, n = halfedges.length; i < n; ++i) { - const j = halfedges[i]; - if (j < i) continue; - const ti = Math.floor(i / 3) * 2; - const tj = Math.floor(j / 3) * 2; - const xi = circumcenters[ti]; - const yi = circumcenters[ti + 1]; - const xj = circumcenters[tj]; - const yj = circumcenters[tj + 1]; - this._renderSegment(xi, yi, xj, yj, context); - } - let h0, h1 = hull[hull.length - 1]; - for (let i = 0; i < hull.length; ++i) { - h0 = h1, h1 = hull[i]; - const t = Math.floor(inedges[h1] / 3) * 2; - const x = circumcenters[t]; - const y = circumcenters[t + 1]; - const v = h0 * 4; - const p = this._project(x, y, vectors[v + 2], vectors[v + 3]); - if (p) this._renderSegment(x, y, p[0], p[1], context); - } - return buffer && buffer.value(); - } - renderBounds(context) { - const buffer = context == null ? context = new Path : undefined; - context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin); - return buffer && buffer.value(); - } - renderCell(i, context) { - const buffer = context == null ? context = new Path : undefined; - const points = this._clip(i); - if (points === null || !points.length) return; - context.moveTo(points[0], points[1]); - let n = points.length; - while (points[0] === points[n-2] && points[1] === points[n-1] && n > 1) n -= 2; - for (let i = 2; i < n; i += 2) { - if (points[i] !== points[i-2] || points[i+1] !== points[i-1]) - context.lineTo(points[i], points[i + 1]); +function transition_filter(match) { + if (typeof match !== "function") match = d3Selection.matcher(match); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) { + if ((node = group[i]) && match.call(node, node.__data__, i, group)) { + subgroup.push(node); + } } - context.closePath(); - return buffer && buffer.value(); } - *cellPolygons() { - const {delaunay: {points}} = this; - for (let i = 0, n = points.length / 2; i < n; ++i) { - const cell = this.cellPolygon(i); - if (cell) cell.index = i, yield cell; + + return new Transition(subgroups, this._parents, this._name, this._id); +} + +function transition_merge(transition) { + if (transition._id !== this._id) throw new Error; + + for (var groups0 = this._groups, groups1 = transition._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) { + for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) { + if (node = group0[i] || group1[i]) { + merge[i] = node; + } } } - cellPolygon(i) { - const polygon = new Polygon; - this.renderCell(i, polygon); - return polygon.value(); + + for (; j < m0; ++j) { + merges[j] = groups0[j]; } - _renderSegment(x0, y0, x1, y1, context) { - let S; - const c0 = this._regioncode(x0, y0); - const c1 = this._regioncode(x1, y1); - if (c0 === 0 && c1 === 0) { - context.moveTo(x0, y0); - context.lineTo(x1, y1); - } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) { - context.moveTo(S[0], S[1]); - context.lineTo(S[2], S[3]); + + return new Transition(merges, this._parents, this._name, this._id); +} + +function start(name) { + return (name + "").trim().split(/^|\s+/).every(function(t) { + var i = t.indexOf("."); + if (i >= 0) t = t.slice(0, i); + return !t || t === "start"; + }); +} + +function onFunction(id, name, listener) { + var on0, on1, sit = start(name) ? init : set; + return function() { + var schedule = sit(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) (on1 = (on0 = on).copy()).on(name, listener); + + schedule.on = on1; + }; +} + +function transition_on(name, listener) { + var id = this._id; + + return arguments.length < 2 + ? get(this.node(), id).on.on(name) + : this.each(onFunction(id, name, listener)); +} + +function removeFunction(id) { + return function() { + var parent = this.parentNode; + for (var i in this.__transition) if (+i !== id) return; + if (parent) parent.removeChild(this); + }; +} + +function transition_remove() { + return this.on("end.remove", removeFunction(this._id)); +} + +function transition_select(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selector(select); + + for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) { + if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) { + if ("__data__" in node) subnode.__data__ = node.__data__; + subgroup[i] = subnode; + schedule(subgroup[i], name, id, i, subgroup, get(node, id)); + } } } - contains(i, x, y) { - if ((x = +x, x !== x) || (y = +y, y !== y)) return false; - return this.delaunay._step(i, x, y) === i; - } - *neighbors(i) { - const ci = this._clip(i); - if (ci) for (const j of this.delaunay.neighbors(i)) { - const cj = this._clip(j); - // find the common edge - if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) { - for (let aj = 0, lj = cj.length; aj < lj; aj += 2) { - if (ci[ai] == cj[aj] - && ci[ai + 1] == cj[aj + 1] - && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] - && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj] - ) { - yield j; - break loop; + + return new Transition(subgroups, this._parents, name, id); +} + +function transition_selectAll(select) { + var name = this._name, + id = this._id; + + if (typeof select !== "function") select = d3Selection.selectorAll(select); + + for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + for (var children = select.call(node, node.__data__, i, group), child, inherit = get(node, id), k = 0, l = children.length; k < l; ++k) { + if (child = children[k]) { + schedule(child, name, id, k, children, inherit); } } + subgroups.push(children); + parents.push(node); } } } - _cell(i) { - const {circumcenters, delaunay: {inedges, halfedges, triangles}} = this; - const e0 = inedges[i]; - if (e0 === -1) return null; // coincident point - const points = []; - let e = e0; - do { - const t = Math.floor(e / 3); - points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]); - e = e % 3 === 2 ? e - 2 : e + 1; - if (triangles[e] !== i) break; // bad triangulation - e = halfedges[e]; - } while (e !== e0 && e !== -1); - return points; + + return new Transition(subgroups, parents, name, id); +} + +var Selection = d3Selection.selection.prototype.constructor; + +function transition_selection() { + return new Selection(this._groups, this._parents); +} + +function styleNull(name, interpolate) { + var string00, + string10, + interpolate0; + return function() { + var string0 = d3Selection.style(this, name), + string1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, string10 = string1); + }; +} + +function styleRemove(name) { + return function() { + this.style.removeProperty(name); + }; +} + +function styleConstant(name, interpolate, value1) { + var string00, + string1 = value1 + "", + interpolate0; + return function() { + var string0 = d3Selection.style(this, name); + return string0 === string1 ? null + : string0 === string00 ? interpolate0 + : interpolate0 = interpolate(string00 = string0, value1); + }; +} + +function styleFunction(name, interpolate, value) { + var string00, + string10, + interpolate0; + return function() { + var string0 = d3Selection.style(this, name), + value1 = value(this), + string1 = value1 + ""; + if (value1 == null) string1 = value1 = (this.style.removeProperty(name), d3Selection.style(this, name)); + return string0 === string1 ? null + : string0 === string00 && string1 === string10 ? interpolate0 + : (string10 = string1, interpolate0 = interpolate(string00 = string0, value1)); + }; +} + +function styleMaybeRemove(id, name) { + var on0, on1, listener0, key = "style." + name, event = "end." + key, remove; + return function() { + var schedule = set(this, id), + on = schedule.on, + listener = schedule.value[key] == null ? remove || (remove = styleRemove(name)) : undefined; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0 || listener0 !== listener) (on1 = (on0 = on).copy()).on(event, listener0 = listener); + + schedule.on = on1; + }; +} + +function transition_style(name, value, priority) { + var i = (name += "") === "transform" ? d3Interpolate.interpolateTransformCss : interpolate; + return value == null ? this + .styleTween(name, styleNull(name, i)) + .on("end.style." + name, styleRemove(name)) + : typeof value === "function" ? this + .styleTween(name, styleFunction(name, i, tweenValue(this, "style." + name, value))) + .each(styleMaybeRemove(this._id, name)) + : this + .styleTween(name, styleConstant(name, i, value), priority) + .on("end.style." + name, null); +} + +function styleInterpolate(name, i, priority) { + return function(t) { + this.style.setProperty(name, i.call(this, t), priority); + }; +} + +function styleTween(name, value, priority) { + var t, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t = (i0 = i) && styleInterpolate(name, i, priority); + return t; + } + tween._value = value; + return tween; +} + +function transition_styleTween(name, value, priority) { + var key = "style." + (name += ""); + if (arguments.length < 2) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, styleTween(name, value, priority == null ? "" : priority)); +} + +function textConstant(value) { + return function() { + this.textContent = value; + }; +} + +function textFunction(value) { + return function() { + var value1 = value(this); + this.textContent = value1 == null ? "" : value1; + }; +} + +function transition_text(value) { + return this.tween("text", typeof value === "function" + ? textFunction(tweenValue(this, "text", value)) + : textConstant(value == null ? "" : value + "")); +} + +function textInterpolate(i) { + return function(t) { + this.textContent = i.call(this, t); + }; +} + +function textTween(value) { + var t0, i0; + function tween() { + var i = value.apply(this, arguments); + if (i !== i0) t0 = (i0 = i) && textInterpolate(i); + return t0; } - _clip(i) { - // degenerate case (1 valid point: return the box) - if (i === 0 && this.delaunay.hull.length === 1) { - return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; + tween._value = value; + return tween; +} + +function transition_textTween(value) { + var key = "text"; + if (arguments.length < 1) return (key = this.tween(key)) && key._value; + if (value == null) return this.tween(key, null); + if (typeof value !== "function") throw new Error; + return this.tween(key, textTween(value)); +} + +function transition_transition() { + var name = this._name, + id0 = this._id, + id1 = newId(); + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + var inherit = get(node, id0); + schedule(node, name, id1, i, group, { + time: inherit.time + inherit.delay + inherit.duration, + delay: 0, + duration: inherit.duration, + ease: inherit.ease + }); + } } - const points = this._cell(i); - if (points === null) return null; - const {vectors: V} = this; - const v = i * 4; - return V[v] || V[v + 1] - ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) - : this._clipFinite(i, points); } - _clipFinite(i, points) { - const n = points.length; - let P = null; - let x0, y0, x1 = points[n - 2], y1 = points[n - 1]; - let c0, c1 = this._regioncode(x1, y1); - let e0, e1; - for (let j = 0; j < n; j += 2) { - x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1]; - c0 = c1, c1 = this._regioncode(x1, y1); - if (c0 === 0 && c1 === 0) { - e0 = e1, e1 = 0; - if (P) P.push(x1, y1); - else P = [x1, y1]; - } else { - let S, sx0, sy0, sx1, sy1; - if (c0 === 0) { - if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue; - [sx0, sy0, sx1, sy1] = S; - } else { - if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue; - [sx1, sy1, sx0, sy0] = S; - e0 = e1, e1 = this._edgecode(sx0, sy0); - if (e0 && e1) this._edge(i, e0, e1, P, P.length); - if (P) P.push(sx0, sy0); - else P = [sx0, sy0]; - } - e0 = e1, e1 = this._edgecode(sx1, sy1); - if (e0 && e1) this._edge(i, e0, e1, P, P.length); - if (P) P.push(sx1, sy1); - else P = [sx1, sy1]; + + return new Transition(groups, this._parents, name, id1); +} + +function transition_end() { + var on0, on1, that = this, id = that._id, size = that.size(); + return new Promise(function(resolve, reject) { + var cancel = {value: reject}, + end = {value: function() { if (--size === 0) resolve(); }}; + + that.each(function() { + var schedule = set(this, id), + on = schedule.on; + + // If this node shared a dispatch with the previous node, + // just assign the updated shared dispatch and we’re done! + // Otherwise, copy-on-write. + if (on !== on0) { + on1 = (on0 = on).copy(); + on1._.cancel.push(cancel); + on1._.interrupt.push(cancel); + on1._.end.push(end); } + + schedule.on = on1; + }); + + // The selection was empty, resolve end immediately + if (size === 0) resolve(); + }); +} + +var id = 0; + +function Transition(groups, parents, name, id) { + this._groups = groups; + this._parents = parents; + this._name = name; + this._id = id; +} + +function transition(name) { + return d3Selection.selection().transition(name); +} + +function newId() { + return ++id; +} + +var selection_prototype = d3Selection.selection.prototype; + +Transition.prototype = transition.prototype = { + constructor: Transition, + select: transition_select, + selectAll: transition_selectAll, + filter: transition_filter, + merge: transition_merge, + selection: transition_selection, + transition: transition_transition, + call: selection_prototype.call, + nodes: selection_prototype.nodes, + node: selection_prototype.node, + size: selection_prototype.size, + empty: selection_prototype.empty, + each: selection_prototype.each, + on: transition_on, + attr: transition_attr, + attrTween: transition_attrTween, + style: transition_style, + styleTween: transition_styleTween, + text: transition_text, + textTween: transition_textTween, + remove: transition_remove, + tween: transition_tween, + delay: transition_delay, + duration: transition_duration, + ease: transition_ease, + easeVarying: transition_easeVarying, + end: transition_end, + [Symbol.iterator]: selection_prototype[Symbol.iterator] +}; + +var defaultTiming = { + time: null, // Set on use. + delay: 0, + duration: 250, + ease: d3Ease.easeCubicInOut +}; + +function inherit(node, id) { + var timing; + while (!(timing = node.__transition) || !(timing = timing[id])) { + if (!(node = node.parentNode)) { + throw new Error(`transition ${id} not found`); } - if (P) { - e0 = e1, e1 = this._edgecode(P[0], P[1]); - if (e0 && e1) this._edge(i, e0, e1, P, P.length); - } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { - return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; - } - return P; } - _clipSegment(x0, y0, x1, y1, c0, c1) { - while (true) { - if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1]; - if (c0 & c1) return null; - let x, y, c = c0 || c1; - if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax; - else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin; - else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax; - else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin; - if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0); - else x1 = x, y1 = y, c1 = this._regioncode(x1, y1); - } + return timing; +} + +function selection_transition(name) { + var id, + timing; + + if (name instanceof Transition) { + id = name._id, name = name._name; + } else { + id = newId(), (timing = defaultTiming).time = d3Timer.now(), name = name == null ? null : name + ""; } - _clipInfinite(i, points, vx0, vy0, vxn, vyn) { - let P = Array.from(points), p; - if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]); - if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]); - if (P = this._clipFinite(i, P)) { - for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) { - c0 = c1, c1 = this._edgecode(P[j], P[j + 1]); - if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length; + + for (var groups = this._groups, m = groups.length, j = 0; j < m; ++j) { + for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) { + if (node = group[i]) { + schedule(node, name, id, i, group, timing || inherit(node, id)); } - } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { - P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax]; } - return P; } - _edge(i, e0, e1, P, j) { - while (e0 !== e1) { - let x, y; - switch (e0) { - case 0b0101: e0 = 0b0100; continue; // top-left - case 0b0100: e0 = 0b0110, x = this.xmax, y = this.ymin; break; // top - case 0b0110: e0 = 0b0010; continue; // top-right - case 0b0010: e0 = 0b1010, x = this.xmax, y = this.ymax; break; // right - case 0b1010: e0 = 0b1000; continue; // bottom-right - case 0b1000: e0 = 0b1001, x = this.xmin, y = this.ymax; break; // bottom - case 0b1001: e0 = 0b0001; continue; // bottom-left - case 0b0001: e0 = 0b0101, x = this.xmin, y = this.ymin; break; // left - } - if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) { - P.splice(j, 0, x, y), j += 2; - } - } - if (P.length > 4) { - for (let i = 0; i < P.length; i+= 2) { - const j = (i + 2) % P.length, k = (i + 4) % P.length; - if (P[i] === P[j] && P[j] === P[k] - || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) - P.splice(j, 2), i -= 2; + + return new Transition(groups, this._parents, name, id); +} + +d3Selection.selection.prototype.interrupt = selection_interrupt; +d3Selection.selection.prototype.transition = selection_transition; + +var root = [null]; + +function active(node, name) { + var schedules = node.__transition, + schedule, + i; + + if (schedules) { + name = name == null ? null : name + ""; + for (i in schedules) { + if ((schedule = schedules[i]).state > SCHEDULED && schedule.name === name) { + return new Transition([[node]], root, name, +i); } } - return j; } - _project(x0, y0, vx, vy) { - let t = Infinity, c, x, y; - if (vy < 0) { // top - if (y0 <= this.ymin) return null; - if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx; - } else if (vy > 0) { // bottom - if (y0 >= this.ymax) return null; - if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx; + + return null; +} + +exports.active = active; +exports.interrupt = interrupt; +exports.transition = transition; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); +}); + +var d3Brush = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-brush/ v2.1.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) ; +}(commonjsGlobal, function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { +var constant = x => () => x; + +function BrushEvent(type, { + sourceEvent, + target, + selection, + mode, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + selection: {value: selection, enumerable: true, configurable: true}, + mode: {value: mode, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +function nopropagation(event) { + event.stopImmediatePropagation(); +} + +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +var MODE_DRAG = {name: "drag"}, + MODE_SPACE = {name: "space"}, + MODE_HANDLE = {name: "handle"}, + MODE_CENTER = {name: "center"}; + +const {abs, max, min} = Math; + +function number1(e) { + return [+e[0], +e[1]]; +} + +function number2(e) { + return [number1(e[0]), number1(e[1])]; +} + +var X = { + name: "x", + handles: ["w", "e"].map(type), + input: function(x, e) { return x == null ? null : [[+x[0], e[0][1]], [+x[1], e[1][1]]]; }, + output: function(xy) { return xy && [xy[0][0], xy[1][0]]; } +}; + +var Y = { + name: "y", + handles: ["n", "s"].map(type), + input: function(y, e) { return y == null ? null : [[e[0][0], +y[0]], [e[1][0], +y[1]]]; }, + output: function(xy) { return xy && [xy[0][1], xy[1][1]]; } +}; + +var XY = { + name: "xy", + handles: ["n", "w", "e", "s", "nw", "ne", "sw", "se"].map(type), + input: function(xy) { return xy == null ? null : number2(xy); }, + output: function(xy) { return xy; } +}; + +var cursors = { + overlay: "crosshair", + selection: "move", + n: "ns-resize", + e: "ew-resize", + s: "ns-resize", + w: "ew-resize", + nw: "nwse-resize", + ne: "nesw-resize", + se: "nwse-resize", + sw: "nesw-resize" +}; + +var flipX = { + e: "w", + w: "e", + nw: "ne", + ne: "nw", + se: "sw", + sw: "se" +}; + +var flipY = { + n: "s", + s: "n", + nw: "sw", + ne: "se", + se: "ne", + sw: "nw" +}; + +var signsX = { + overlay: +1, + selection: +1, + n: null, + e: +1, + s: null, + w: -1, + nw: -1, + ne: +1, + se: +1, + sw: -1 +}; + +var signsY = { + overlay: +1, + selection: +1, + n: -1, + e: null, + s: +1, + w: null, + nw: -1, + ne: -1, + se: +1, + sw: +1 +}; + +function type(t) { + return {type: t}; +} + +// Ignore right-click, since that should open the context menu. +function defaultFilter(event) { + return !event.ctrlKey && !event.button; +} + +function defaultExtent() { + var svg = this.ownerSVGElement || this; + if (svg.hasAttribute("viewBox")) { + svg = svg.viewBox.baseVal; + return [[svg.x, svg.y], [svg.x + svg.width, svg.y + svg.height]]; + } + return [[0, 0], [svg.width.baseVal.value, svg.height.baseVal.value]]; +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +// Like d3.local, but with the name “__brush” rather than auto-generated. +function local(node) { + while (!node.__brush) if (!(node = node.parentNode)) return; + return node.__brush; +} + +function empty(extent) { + return extent[0][0] === extent[1][0] + || extent[0][1] === extent[1][1]; +} + +function brushSelection(node) { + var state = node.__brush; + return state ? state.dim.output(state.selection) : null; +} + +function brushX() { + return brush$1(X); +} + +function brushY() { + return brush$1(Y); +} + +function brush() { + return brush$1(XY); +} + +function brush$1(dim) { + var extent = defaultExtent, + filter = defaultFilter, + touchable = defaultTouchable, + keys = true, + listeners = d3Dispatch.dispatch("start", "brush", "end"), + handleSize = 6, + touchending; + + function brush(group) { + var overlay = group + .property("__brush", initialize) + .selectAll(".overlay") + .data([type("overlay")]); + + overlay.enter().append("rect") + .attr("class", "overlay") + .attr("pointer-events", "all") + .attr("cursor", cursors.overlay) + .merge(overlay) + .each(function() { + var extent = local(this).extent; + d3Selection.select(this) + .attr("x", extent[0][0]) + .attr("y", extent[0][1]) + .attr("width", extent[1][0] - extent[0][0]) + .attr("height", extent[1][1] - extent[0][1]); + }); + + group.selectAll(".selection") + .data([type("selection")]) + .enter().append("rect") + .attr("class", "selection") + .attr("cursor", cursors.selection) + .attr("fill", "#777") + .attr("fill-opacity", 0.3) + .attr("stroke", "#fff") + .attr("shape-rendering", "crispEdges"); + + var handle = group.selectAll(".handle") + .data(dim.handles, function(d) { return d.type; }); + + handle.exit().remove(); + + handle.enter().append("rect") + .attr("class", function(d) { return "handle handle--" + d.type; }) + .attr("cursor", function(d) { return cursors[d.type]; }); + + group + .each(redraw) + .attr("fill", "none") + .attr("pointer-events", "all") + .on("mousedown.brush", started) + .filter(touchable) + .on("touchstart.brush", started) + .on("touchmove.brush", touchmoved) + .on("touchend.brush touchcancel.brush", touchended) + .style("touch-action", "none") + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + brush.move = function(group, selection) { + if (group.tween) { + group + .on("start.brush", function(event) { emitter(this, arguments).beforestart().start(event); }) + .on("interrupt.brush end.brush", function(event) { emitter(this, arguments).end(event); }) + .tween("brush", function() { + var that = this, + state = that.__brush, + emit = emitter(that, arguments), + selection0 = state.selection, + selection1 = dim.input(typeof selection === "function" ? selection.apply(this, arguments) : selection, state.extent), + i = d3Interpolate.interpolate(selection0, selection1); + + function tween(t) { + state.selection = t === 1 && selection1 === null ? null : i(t); + redraw.call(that); + emit.brush(); + } + + return selection0 !== null && selection1 !== null ? tween : tween(1); + }); + } else { + group + .each(function() { + var that = this, + args = arguments, + state = that.__brush, + selection1 = dim.input(typeof selection === "function" ? selection.apply(that, args) : selection, state.extent), + emit = emitter(that, args).beforestart(); + + d3Transition.interrupt(that); + state.selection = selection1 === null ? null : selection1; + redraw.call(that); + emit.start().brush().end(); + }); } - if (vx > 0) { // right - if (x0 >= this.xmax) return null; - if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy; - } else if (vx < 0) { // left - if (x0 <= this.xmin) return null; - if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy; + }; + + brush.clear = function(group) { + brush.move(group, null); + }; + + function redraw() { + var group = d3Selection.select(this), + selection = local(this).selection; + + if (selection) { + group.selectAll(".selection") + .style("display", null) + .attr("x", selection[0][0]) + .attr("y", selection[0][1]) + .attr("width", selection[1][0] - selection[0][0]) + .attr("height", selection[1][1] - selection[0][1]); + + group.selectAll(".handle") + .style("display", null) + .attr("x", function(d) { return d.type[d.type.length - 1] === "e" ? selection[1][0] - handleSize / 2 : selection[0][0] - handleSize / 2; }) + .attr("y", function(d) { return d.type[0] === "s" ? selection[1][1] - handleSize / 2 : selection[0][1] - handleSize / 2; }) + .attr("width", function(d) { return d.type === "n" || d.type === "s" ? selection[1][0] - selection[0][0] + handleSize : handleSize; }) + .attr("height", function(d) { return d.type === "e" || d.type === "w" ? selection[1][1] - selection[0][1] + handleSize : handleSize; }); + } + + else { + group.selectAll(".selection,.handle") + .style("display", "none") + .attr("x", null) + .attr("y", null) + .attr("width", null) + .attr("height", null); } - return [x, y]; } - _edgecode(x, y) { - return (x === this.xmin ? 0b0001 - : x === this.xmax ? 0b0010 : 0b0000) - | (y === this.ymin ? 0b0100 - : y === this.ymax ? 0b1000 : 0b0000); + + function emitter(that, args, clean) { + var emit = that.__brush.emitter; + return emit && (!clean || !emit.clean) ? emit : new Emitter(that, args, clean); } - _regioncode(x, y) { - return (x < this.xmin ? 0b0001 - : x > this.xmax ? 0b0010 : 0b0000) - | (y < this.ymin ? 0b0100 - : y > this.ymax ? 0b1000 : 0b0000); + + function Emitter(that, args, clean) { + this.that = that; + this.args = args; + this.state = that.__brush; + this.active = 0; + this.clean = clean; } -} -const tau = 2 * Math.PI, pow = Math.pow; + Emitter.prototype = { + beforestart: function() { + if (++this.active === 1) this.state.emitter = this, this.starting = true; + return this; + }, + start: function(event, mode) { + if (this.starting) this.starting = false, this.emit("start", event, mode); + else this.emit("brush", event); + return this; + }, + brush: function(event, mode) { + this.emit("brush", event, mode); + return this; + }, + end: function(event, mode) { + if (--this.active === 0) delete this.state.emitter, this.emit("end", event, mode); + return this; + }, + emit: function(type, event, mode) { + var d = d3Selection.select(this.that).datum(); + listeners.call( + type, + this.that, + new BrushEvent(type, { + sourceEvent: event, + target: brush, + selection: dim.output(this.state.selection), + mode, + dispatch: listeners + }), + d + ); + } + }; -function pointX(p) { - return p[0]; -} + function started(event) { + if (touchending && !event.touches) return; + if (!filter.apply(this, arguments)) return; -function pointY(p) { - return p[1]; -} + var that = this, + type = event.target.__data__.type, + mode = (keys && event.metaKey ? type = "overlay" : type) === "selection" ? MODE_DRAG : (keys && event.altKey ? MODE_CENTER : MODE_HANDLE), + signX = dim === Y ? null : signsX[type], + signY = dim === X ? null : signsY[type], + state = local(that), + extent = state.extent, + selection = state.selection, + W = extent[0][0], w0, w1, + N = extent[0][1], n0, n1, + E = extent[1][0], e0, e1, + S = extent[1][1], s0, s1, + dx = 0, + dy = 0, + moving, + shifting = signX && signY && keys && event.shiftKey, + lockX, + lockY, + points = Array.from(event.touches || [event], t => { + const i = t.identifier; + t = d3Selection.pointer(t, that); + t.point0 = t.slice(); + t.identifier = i; + return t; + }); -// A triangulation is collinear if all its triangles have a non-null area -function collinear(d) { - const {triangles, coords} = d; - for (let i = 0; i < triangles.length; i += 3) { - const a = 2 * triangles[i], - b = 2 * triangles[i + 1], - c = 2 * triangles[i + 2], - cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) - - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]); - if (cross > 1e-10) return false; - } - return true; -} + if (type === "overlay") { + if (selection) moving = true; + const pts = [points[0], points[1] || points[0]]; + state.selection = selection = [[ + w0 = dim === Y ? W : min(pts[0][0], pts[1][0]), + n0 = dim === X ? N : min(pts[0][1], pts[1][1]) + ], [ + e0 = dim === Y ? E : max(pts[0][0], pts[1][0]), + s0 = dim === X ? S : max(pts[0][1], pts[1][1]) + ]]; + if (points.length > 1) move(); + } else { + w0 = selection[0][0]; + n0 = selection[0][1]; + e0 = selection[1][0]; + s0 = selection[1][1]; + } -function jitter(x, y, r) { - return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r]; -} + w1 = w0; + n1 = n0; + e1 = e0; + s1 = s0; -class Delaunay { - static from(points, fx = pointX, fy = pointY, that) { - return new Delaunay("length" in points - ? flatArray(points, fx, fy, that) - : Float64Array.from(flatIterable(points, fx, fy, that))); - } - constructor(points) { - this._delaunator = new Delaunator(points); - this.inedges = new Int32Array(points.length / 2); - this._hullIndex = new Int32Array(points.length / 2); - this.points = this._delaunator.coords; - this._init(); - } - update() { - this._delaunator.update(); - this._init(); - return this; - } - _init() { - const d = this._delaunator, points = this.points; + var group = d3Selection.select(that) + .attr("pointer-events", "none"); - // check for collinear - if (d.hull && d.hull.length > 2 && collinear(d)) { - this.collinear = Int32Array.from({length: points.length/2}, (_,i) => i) - .sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors - const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], - bounds = [ points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1] ], - r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]); - for (let i = 0, n = points.length / 2; i < n; ++i) { - const p = jitter(points[2 * i], points[2 * i + 1], r); - points[2 * i] = p[0]; - points[2 * i + 1] = p[1]; - } - this._delaunator = new Delaunator(points); + var overlay = group.selectAll(".overlay") + .attr("cursor", cursors[type]); + + d3Transition.interrupt(that); + var emit = emitter(that, arguments, true).beforestart(); + + if (event.touches) { + emit.moved = moved; + emit.ended = ended; } else { - delete this.collinear; + var view = d3Selection.select(event.view) + .on("mousemove.brush", moved, true) + .on("mouseup.brush", ended, true); + if (keys) view + .on("keydown.brush", keydowned, true) + .on("keyup.brush", keyupped, true); + + d3Drag.dragDisable(event.view); } - const halfedges = this.halfedges = this._delaunator.halfedges; - const hull = this.hull = this._delaunator.hull; - const triangles = this.triangles = this._delaunator.triangles; - const inedges = this.inedges.fill(-1); - const hullIndex = this._hullIndex.fill(-1); + redraw.call(that); + emit.start(event, mode.name); - // Compute an index from each point to an (arbitrary) incoming halfedge - // Used to give the first neighbor of each point; for this reason, - // on the hull we give priority to exterior halfedges - for (let e = 0, n = halfedges.length; e < n; ++e) { - const p = triangles[e % 3 === 2 ? e - 2 : e + 1]; - if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e; - } - for (let i = 0, n = hull.length; i < n; ++i) { - hullIndex[hull[i]] = i; + function moved(event) { + for (const p of event.changedTouches || [event]) { + for (const d of points) + if (d.identifier === p.identifier) d.cur = d3Selection.pointer(p, that); + } + if (shifting && !lockX && !lockY && points.length === 1) { + const point = points[0]; + if (abs(point.cur[0] - point[0]) > abs(point.cur[1] - point[1])) + lockY = true; + else + lockX = true; + } + for (const point of points) + if (point.cur) point[0] = point.cur[0], point[1] = point.cur[1]; + moving = true; + noevent(event); + move(event); } - // degenerate case: 1 or 2 (distinct) points - if (hull.length <= 2 && hull.length > 0) { - this.triangles = new Int32Array(3).fill(-1); - this.halfedges = new Int32Array(3).fill(-1); - this.triangles[0] = hull[0]; - this.triangles[1] = hull[1]; - this.triangles[2] = hull[1]; - inedges[hull[0]] = 1; - if (hull.length === 2) inedges[hull[1]] = 0; - } - } - voronoi(bounds) { - return new Voronoi(this, bounds); - } - *neighbors(i) { - const {inedges, hull, _hullIndex, halfedges, triangles, collinear} = this; + function move(event) { + const point = points[0], point0 = point.point0; + var t; - // degenerate case with several collinear points - if (collinear) { - const l = collinear.indexOf(i); - if (l > 0) yield collinear[l - 1]; - if (l < collinear.length - 1) yield collinear[l + 1]; - return; - } + dx = point[0] - point0[0]; + dy = point[1] - point0[1]; - const e0 = inedges[i]; - if (e0 === -1) return; // coincident point - let e = e0, p0 = -1; - do { - yield p0 = triangles[e]; - e = e % 3 === 2 ? e - 2 : e + 1; - if (triangles[e] !== i) return; // bad triangulation - e = halfedges[e]; - if (e === -1) { - const p = hull[(_hullIndex[i] + 1) % hull.length]; - if (p !== p0) yield p; - return; - } - } while (e !== e0); - } - find(x, y, i = 0) { - if ((x = +x, x !== x) || (y = +y, y !== y)) return -1; - const i0 = i; - let c; - while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c; - return c; - } - _step(i, x, y) { - const {inedges, hull, _hullIndex, halfedges, triangles, points} = this; - if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1); - let c = i; - let dc = pow(x - points[i * 2], 2) + pow(y - points[i * 2 + 1], 2); - const e0 = inedges[i]; - let e = e0; - do { - let t = triangles[e]; - const dt = pow(x - points[t * 2], 2) + pow(y - points[t * 2 + 1], 2); - if (dt < dc) dc = dt, c = t; - e = e % 3 === 2 ? e - 2 : e + 1; - if (triangles[e] !== i) break; // bad triangulation - e = halfedges[e]; - if (e === -1) { - e = hull[(_hullIndex[i] + 1) % hull.length]; - if (e !== t) { - if (pow(x - points[e * 2], 2) + pow(y - points[e * 2 + 1], 2) < dc) return e; + switch (mode) { + case MODE_SPACE: + case MODE_DRAG: { + if (signX) dx = max(W - w0, min(E - e0, dx)), w1 = w0 + dx, e1 = e0 + dx; + if (signY) dy = max(N - n0, min(S - s0, dy)), n1 = n0 + dy, s1 = s0 + dy; + break; + } + case MODE_HANDLE: { + if (points[1]) { + if (signX) w1 = max(W, min(E, points[0][0])), e1 = max(W, min(E, points[1][0])), signX = 1; + if (signY) n1 = max(N, min(S, points[0][1])), s1 = max(N, min(S, points[1][1])), signY = 1; + } else { + if (signX < 0) dx = max(W - w0, min(E - w0, dx)), w1 = w0 + dx, e1 = e0; + else if (signX > 0) dx = max(W - e0, min(E - e0, dx)), w1 = w0, e1 = e0 + dx; + if (signY < 0) dy = max(N - n0, min(S - n0, dy)), n1 = n0 + dy, s1 = s0; + else if (signY > 0) dy = max(N - s0, min(S - s0, dy)), n1 = n0, s1 = s0 + dy; + } + break; + } + case MODE_CENTER: { + if (signX) w1 = max(W, min(E, w0 - dx * signX)), e1 = max(W, min(E, e0 + dx * signX)); + if (signY) n1 = max(N, min(S, n0 - dy * signY)), s1 = max(N, min(S, s0 + dy * signY)); + break; } - break; } - } while (e !== e0); - return c; - } - render(context) { - const buffer = context == null ? context = new Path : undefined; - const {points, halfedges, triangles} = this; - for (let i = 0, n = halfedges.length; i < n; ++i) { - const j = halfedges[i]; - if (j < i) continue; - const ti = triangles[i] * 2; - const tj = triangles[j] * 2; - context.moveTo(points[ti], points[ti + 1]); - context.lineTo(points[tj], points[tj + 1]); - } - this.renderHull(context); - return buffer && buffer.value(); - } - renderPoints(context, r = 2) { - const buffer = context == null ? context = new Path : undefined; - const {points} = this; - for (let i = 0, n = points.length; i < n; i += 2) { - const x = points[i], y = points[i + 1]; - context.moveTo(x + r, y); - context.arc(x, y, r, 0, tau); + + if (e1 < w1) { + signX *= -1; + t = w0, w0 = e0, e0 = t; + t = w1, w1 = e1, e1 = t; + if (type in flipX) overlay.attr("cursor", cursors[type = flipX[type]]); + } + + if (s1 < n1) { + signY *= -1; + t = n0, n0 = s0, s0 = t; + t = n1, n1 = s1, s1 = t; + if (type in flipY) overlay.attr("cursor", cursors[type = flipY[type]]); + } + + if (state.selection) selection = state.selection; // May be set by brush.move! + if (lockX) w1 = selection[0][0], e1 = selection[1][0]; + if (lockY) n1 = selection[0][1], s1 = selection[1][1]; + + if (selection[0][0] !== w1 + || selection[0][1] !== n1 + || selection[1][0] !== e1 + || selection[1][1] !== s1) { + state.selection = [[w1, n1], [e1, s1]]; + redraw.call(that); + emit.brush(event, mode.name); + } } - return buffer && buffer.value(); - } - renderHull(context) { - const buffer = context == null ? context = new Path : undefined; - const {hull, points} = this; - const h = hull[0] * 2, n = hull.length; - context.moveTo(points[h], points[h + 1]); - for (let i = 1; i < n; ++i) { - const h = 2 * hull[i]; - context.lineTo(points[h], points[h + 1]); + + function ended(event) { + nopropagation(event); + if (event.touches) { + if (event.touches.length) return; + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, 500); // Ghost clicks are delayed! + } else { + d3Drag.dragEnable(event.view, moving); + view.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); + } + group.attr("pointer-events", "all"); + overlay.attr("cursor", cursors.overlay); + if (state.selection) selection = state.selection; // May be set by brush.move (on start)! + if (empty(selection)) state.selection = null, redraw.call(that); + emit.end(event, mode.name); } - context.closePath(); - return buffer && buffer.value(); - } - hullPolygon() { - const polygon = new Polygon; - this.renderHull(polygon); - return polygon.value(); - } - renderTriangle(i, context) { - const buffer = context == null ? context = new Path : undefined; - const {points, triangles} = this; - const t0 = triangles[i *= 3] * 2; - const t1 = triangles[i + 1] * 2; - const t2 = triangles[i + 2] * 2; - context.moveTo(points[t0], points[t0 + 1]); - context.lineTo(points[t1], points[t1 + 1]); - context.lineTo(points[t2], points[t2 + 1]); - context.closePath(); - return buffer && buffer.value(); - } - *trianglePolygons() { - const {triangles} = this; - for (let i = 0, n = triangles.length / 3; i < n; ++i) { - yield this.trianglePolygon(i); + + function keydowned(event) { + switch (event.keyCode) { + case 16: { // SHIFT + shifting = signX && signY; + break; + } + case 18: { // ALT + if (mode === MODE_HANDLE) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + move(); + } + break; + } + case 32: { // SPACE; takes priority over ALT + if (mode === MODE_HANDLE || mode === MODE_CENTER) { + if (signX < 0) e0 = e1 - dx; else if (signX > 0) w0 = w1 - dx; + if (signY < 0) s0 = s1 - dy; else if (signY > 0) n0 = n1 - dy; + mode = MODE_SPACE; + overlay.attr("cursor", cursors.selection); + move(); + } + break; + } + default: return; + } + noevent(event); + } + + function keyupped(event) { + switch (event.keyCode) { + case 16: { // SHIFT + if (shifting) { + lockX = lockY = shifting = false; + move(); + } + break; + } + case 18: { // ALT + if (mode === MODE_CENTER) { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + move(); + } + break; + } + case 32: { // SPACE + if (mode === MODE_SPACE) { + if (event.altKey) { + if (signX) e0 = e1 - dx * signX, w0 = w1 + dx * signX; + if (signY) s0 = s1 - dy * signY, n0 = n1 + dy * signY; + mode = MODE_CENTER; + } else { + if (signX < 0) e0 = e1; else if (signX > 0) w0 = w1; + if (signY < 0) s0 = s1; else if (signY > 0) n0 = n1; + mode = MODE_HANDLE; + } + overlay.attr("cursor", cursors[type]); + move(); + } + break; + } + default: return; + } + noevent(event); } } - trianglePolygon(i) { - const polygon = new Polygon; - this.renderTriangle(i, polygon); - return polygon.value(); + + function touchmoved(event) { + emitter(this, arguments).moved(event); } -} -function flatArray(points, fx, fy, that) { - const n = points.length; - const array = new Float64Array(n * 2); - for (let i = 0; i < n; ++i) { - const p = points[i]; - array[i * 2] = fx.call(that, p, i, points); - array[i * 2 + 1] = fy.call(that, p, i, points); + function touchended(event) { + emitter(this, arguments).ended(event); } - return array; -} -function* flatIterable(points, fx, fy, that) { - let i = 0; - for (const p of points) { - yield fx.call(that, p, i, points); - yield fy.call(that, p, i, points); - ++i; + function initialize() { + var state = this.__brush || {selection: null}; + state.extent = number2(extent.apply(this, arguments)); + state.dim = dim; + return state; } + + brush.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant(number2(_)), brush) : extent; + }; + + brush.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), brush) : filter; + }; + + brush.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), brush) : touchable; + }; + + brush.handleSize = function(_) { + return arguments.length ? (handleSize = +_, brush) : handleSize; + }; + + brush.keyModifiers = function(_) { + return arguments.length ? (keys = !!_, brush) : keys; + }; + + brush.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? brush : value; + }; + + return brush; } -exports.Delaunay = Delaunay; -exports.Voronoi = Voronoi; +exports.brush = brush; +exports.brushSelection = brushSelection; +exports.brushX = brushX; +exports.brushY = brushY; Object.defineProperty(exports, '__esModule', { value: true }); })); }); -var d3Dsv = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-dsv/ v2.0.0 Copyright 2020 Mike Bostock +var d3Path = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-path/ v2.0.0 Copyright 2020 Mike Bostock (function (global, factory) { factory(exports) ; }(commonjsGlobal, function (exports) { -var EOL = {}, - EOF = {}, - QUOTE = 34, - NEWLINE = 10, - RETURN = 13; +const pi = Math.PI, + tau = 2 * pi, + epsilon = 1e-6, + tauEpsilon = tau - epsilon; -function objectConverter(columns) { - return new Function("d", "return {" + columns.map(function(name, i) { - return JSON.stringify(name) + ": d[" + i + "] || \"\""; - }).join(",") + "}"); +function Path() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; } -function customConverter(columns, f) { - var object = objectConverter(columns); - return function(row, i) { - return f(object(row), i, columns); - }; +function path() { + return new Path; } -// Compute unique columns in order of discovery. -function inferColumns(rows) { - var columnSet = Object.create(null), - columns = []; - - rows.forEach(function(row) { - for (var column in row) { - if (!(column in columnSet)) { - columns.push(columnSet[column] = column); - } +Path.prototype = path.prototype = { + constructor: Path, + moveTo: function(x, y) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y); + }, + closePath: function() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; } - }); - - return columns; -} - -function pad(value, width) { - var s = value + "", length = s.length; - return length < width ? new Array(width - length + 1).join(0) + s : s; -} - -function formatYear(year) { - return year < 0 ? "-" + pad(-year, 6) - : year > 9999 ? "+" + pad(year, 6) - : pad(year, 4); -} - -function formatDate(date) { - var hours = date.getUTCHours(), - minutes = date.getUTCMinutes(), - seconds = date.getUTCSeconds(), - milliseconds = date.getUTCMilliseconds(); - return isNaN(date) ? "Invalid Date" - : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) - + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" - : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" - : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" - : ""); -} + }, + lineTo: function(x, y) { + this._ += "L" + (this._x1 = +x) + "," + (this._y1 = +y); + }, + quadraticCurveTo: function(x1, y1, x, y) { + this._ += "Q" + (+x1) + "," + (+y1) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { + this._ += "C" + (+x1) + "," + (+y1) + "," + (+x2) + "," + (+y2) + "," + (this._x1 = +x) + "," + (this._y1 = +y); + }, + arcTo: function(x1, y1, x2, y2, r) { + x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r; + var x0 = this._x1, + y0 = this._y1, + x21 = x2 - x1, + y21 = y2 - y1, + x01 = x0 - x1, + y01 = y0 - y1, + l01_2 = x01 * x01 + y01 * y01; -function dsv(delimiter) { - var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), - DELIMITER = delimiter.charCodeAt(0); + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); - function parse(text, f) { - var convert, columns, rows = parseRows(text, function(row, i) { - if (convert) return convert(row, i - 1); - columns = row, convert = f ? customConverter(row, f) : objectConverter(row); - }); - rows.columns = columns || []; - return rows; - } + // Is this path empty? Move to (x1,y1). + if (this._x1 === null) { + this._ += "M" + (this._x1 = x1) + "," + (this._y1 = y1); + } - function parseRows(text, f) { - var rows = [], // output rows - N = text.length, - I = 0, // current character index - n = 0, // current line number - t, // current token - eof = N <= 0, // current token followed by EOF? - eol = false; // current token followed by EOL? + // Or, is (x1,y1) coincident with (x0,y0)? Do nothing. + else if (!(l01_2 > epsilon)); - // Strip the trailing newline. - if (text.charCodeAt(N - 1) === NEWLINE) --N; - if (text.charCodeAt(N - 1) === RETURN) --N; + // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear? + // Equivalently, is (x1,y1) coincident with (x2,y2)? + // Or, is the radius zero? Line to (x1,y1). + else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) { + this._ += "L" + (this._x1 = x1) + "," + (this._y1 = y1); + } - function token() { - if (eof) return EOF; - if (eol) return eol = false, EOL; + // Otherwise, draw an arc! + else { + var x20 = x2 - x0, + y20 = y2 - y0, + l21_2 = x21 * x21 + y21 * y21, + l20_2 = x20 * x20 + y20 * y20, + l21 = Math.sqrt(l21_2), + l01 = Math.sqrt(l01_2), + l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2), + t01 = l / l01, + t21 = l / l21; - // Unescape quotes. - var i, j = I, c; - if (text.charCodeAt(j) === QUOTE) { - while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); - if ((i = I) >= N) eof = true; - else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; - else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } - return text.slice(j + 1, i - 1).replace(/""/g, "\""); + // If the start tangent is not coincident with (x0,y0), line to. + if (Math.abs(t01 - 1) > epsilon) { + this._ += "L" + (x1 + t01 * x01) + "," + (y1 + t01 * y01); } - // Find next delimiter or newline. - while (I < N) { - if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; - else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } - else if (c !== DELIMITER) continue; - return text.slice(j, i); - } + this._ += "A" + r + "," + r + ",0,0," + (+(y01 * x20 > x01 * y20)) + "," + (this._x1 = x1 + t21 * x21) + "," + (this._y1 = y1 + t21 * y21); + } + }, + arc: function(x, y, r, a0, a1, ccw) { + x = +x, y = +y, r = +r, ccw = !!ccw; + var dx = r * Math.cos(a0), + dy = r * Math.sin(a0), + x0 = x + dx, + y0 = y + dy, + cw = 1 ^ ccw, + da = ccw ? a0 - a1 : a1 - a0; - // Return last token before EOF. - return eof = true, text.slice(j, N); + // Is the radius negative? Error. + if (r < 0) throw new Error("negative radius: " + r); + + // Is this path empty? Move to (x0,y0). + if (this._x1 === null) { + this._ += "M" + x0 + "," + y0; } - while ((t = token()) !== EOF) { - var row = []; - while (t !== EOL && t !== EOF) row.push(t), t = token(); - if (f && (row = f(row, n++)) == null) continue; - rows.push(row); + // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0). + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) { + this._ += "L" + x0 + "," + y0; } - return rows; - } + // Is this arc empty? We’re done. + if (!r) return; - function preformatBody(rows, columns) { - return rows.map(function(row) { - return columns.map(function(column) { - return formatValue(row[column]); - }).join(delimiter); - }); - } + // Does the angle go the wrong way? Flip the direction. + if (da < 0) da = da % tau + tau; - function format(rows, columns) { - if (columns == null) columns = inferColumns(rows); - return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); - } + // Is this a complete circle? Draw two arcs to complete the circle. + if (da > tauEpsilon) { + this._ += "A" + r + "," + r + ",0,1," + cw + "," + (x - dx) + "," + (y - dy) + "A" + r + "," + r + ",0,1," + cw + "," + (this._x1 = x0) + "," + (this._y1 = y0); + } - function formatBody(rows, columns) { - if (columns == null) columns = inferColumns(rows); - return preformatBody(rows, columns).join("\n"); + // Is this arc non-empty? Draw an arc! + else if (da > epsilon) { + this._ += "A" + r + "," + r + ",0," + (+(da >= pi)) + "," + cw + "," + (this._x1 = x + r * Math.cos(a1)) + "," + (this._y1 = y + r * Math.sin(a1)); + } + }, + rect: function(x, y, w, h) { + this._ += "M" + (this._x0 = this._x1 = +x) + "," + (this._y0 = this._y1 = +y) + "h" + (+w) + "v" + (+h) + "h" + (-w) + "Z"; + }, + toString: function() { + return this._; } +}; - function formatRows(rows) { - return rows.map(formatRow).join("\n"); - } +exports.path = path; - function formatRow(row) { - return row.map(formatValue).join(delimiter); - } +Object.defineProperty(exports, '__esModule', { value: true }); - function formatValue(value) { - return value == null ? "" - : value instanceof Date ? formatDate(value) - : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" - : value; - } +})); +}); - return { - parse: parse, - parseRows: parseRows, - format: format, - formatBody: formatBody, - formatRows: formatRows, - formatRow: formatRow, - formatValue: formatValue +var d3Chord = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-chord/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Path) ; +}(commonjsGlobal, function (exports, d3Path) { +var abs = Math.abs; +var cos = Math.cos; +var sin = Math.sin; +var pi = Math.PI; +var halfPi = pi / 2; +var tau = pi * 2; +var max = Math.max; +var epsilon = 1e-12; + +function range(i, j) { + return Array.from({length: j - i}, (_, k) => i + k); +} + +function compareValue(compare) { + return function(a, b) { + return compare( + a.source.value + a.target.value, + b.source.value + b.target.value + ); }; } -var csv = dsv(","); +function chord() { + return chord$1(false, false); +} -var csvParse = csv.parse; -var csvParseRows = csv.parseRows; -var csvFormat = csv.format; -var csvFormatBody = csv.formatBody; -var csvFormatRows = csv.formatRows; -var csvFormatRow = csv.formatRow; -var csvFormatValue = csv.formatValue; +function chordTranspose() { + return chord$1(false, true); +} -var tsv = dsv("\t"); +function chordDirected() { + return chord$1(true, false); +} -var tsvParse = tsv.parse; -var tsvParseRows = tsv.parseRows; -var tsvFormat = tsv.format; -var tsvFormatBody = tsv.formatBody; -var tsvFormatRows = tsv.formatRows; -var tsvFormatRow = tsv.formatRow; -var tsvFormatValue = tsv.formatValue; +function chord$1(directed, transpose) { + var padAngle = 0, + sortGroups = null, + sortSubgroups = null, + sortChords = null; -function autoType(object) { - for (var key in object) { - var value = object[key].trim(), number, m; - if (!value) value = null; - else if (value === "true") value = true; - else if (value === "false") value = false; - else if (value === "NaN") value = NaN; - else if (!isNaN(number = +value)) value = number; - else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { - if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); - value = new Date(value); - } - else continue; - object[key] = value; - } - return object; -} + function chord(matrix) { + var n = matrix.length, + groupSums = new Array(n), + groupIndex = range(0, n), + chords = new Array(n * n), + groups = new Array(n), + k = 0, dx; -// https://github.com/d3/d3-dsv/issues/45 -const fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); + matrix = Float64Array.from({length: n * n}, transpose + ? (_, i) => matrix[i % n][i / n | 0] + : (_, i) => matrix[i / n | 0][i % n]); -exports.autoType = autoType; -exports.csvFormat = csvFormat; -exports.csvFormatBody = csvFormatBody; -exports.csvFormatRow = csvFormatRow; -exports.csvFormatRows = csvFormatRows; -exports.csvFormatValue = csvFormatValue; -exports.csvParse = csvParse; -exports.csvParseRows = csvParseRows; -exports.dsvFormat = dsv; -exports.tsvFormat = tsvFormat; -exports.tsvFormatBody = tsvFormatBody; -exports.tsvFormatRow = tsvFormatRow; -exports.tsvFormatRows = tsvFormatRows; -exports.tsvFormatValue = tsvFormatValue; -exports.tsvParse = tsvParse; -exports.tsvParseRows = tsvParseRows; + // Compute the scaling factor from value to angle in [0, 2pi]. + for (let i = 0; i < n; ++i) { + let x = 0; + for (let j = 0; j < n; ++j) x += matrix[i * n + j] + directed * matrix[j * n + i]; + k += groupSums[i] = x; + } + k = max(0, tau - padAngle * n) / k; + dx = k ? padAngle : tau / n; + + // Compute the angles for each group and constituent chord. + { + let x = 0; + if (sortGroups) groupIndex.sort((a, b) => sortGroups(groupSums[a], groupSums[b])); + for (const i of groupIndex) { + const x0 = x; + if (directed) { + const subgroupIndex = range(~n + 1, n).filter(j => j < 0 ? matrix[~j * n + i] : matrix[i * n + j]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(a < 0 ? -matrix[~a * n + i] : matrix[i * n + a], b < 0 ? -matrix[~b * n + i] : matrix[i * n + b])); + for (const j of subgroupIndex) { + if (j < 0) { + const chord = chords[~j * n + i] || (chords[~j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[~j * n + i] * k, value: matrix[~j * n + i]}; + } else { + const chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } else { + const subgroupIndex = range(0, n).filter(j => matrix[i * n + j] || matrix[j * n + i]); + if (sortSubgroups) subgroupIndex.sort((a, b) => sortSubgroups(matrix[i * n + a], matrix[i * n + b])); + for (const j of subgroupIndex) { + let chord; + if (i < j) { + chord = chords[i * n + j] || (chords[i * n + j] = {source: null, target: null}); + chord.source = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + } else { + chord = chords[j * n + i] || (chords[j * n + i] = {source: null, target: null}); + chord.target = {index: i, startAngle: x, endAngle: x += matrix[i * n + j] * k, value: matrix[i * n + j]}; + if (i === j) chord.source = chord.target; + } + if (chord.source && chord.target && chord.source.value < chord.target.value) { + const source = chord.source; + chord.source = chord.target; + chord.target = source; + } + } + groups[i] = {index: i, startAngle: x0, endAngle: x, value: groupSums[i]}; + } + x += dx; + } + } -Object.defineProperty(exports, '__esModule', { value: true }); + // Remove empty chords. + chords = Object.values(chords); + chords.groups = groups; + return sortChords ? chords.sort(sortChords) : chords; + } -})); -}); + chord.padAngle = function(_) { + return arguments.length ? (padAngle = max(0, _), chord) : padAngle; + }; -var d3Fetch = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-fetch/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Dsv) ; -}(commonjsGlobal, function (exports, d3Dsv) { -function responseBlob(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.blob(); -} + chord.sortGroups = function(_) { + return arguments.length ? (sortGroups = _, chord) : sortGroups; + }; -function blob(input, init) { - return fetch(input, init).then(responseBlob); -} + chord.sortSubgroups = function(_) { + return arguments.length ? (sortSubgroups = _, chord) : sortSubgroups; + }; -function responseArrayBuffer(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.arrayBuffer(); -} + chord.sortChords = function(_) { + return arguments.length ? (_ == null ? sortChords = null : (sortChords = compareValue(_))._ = _, chord) : sortChords && sortChords._; + }; -function buffer(input, init) { - return fetch(input, init).then(responseArrayBuffer); + return chord; } -function responseText(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - return response.text(); -} +var slice = Array.prototype.slice; -function text(input, init) { - return fetch(input, init).then(responseText); +function constant(x) { + return function() { + return x; + }; } -function dsvParse(parse) { - return function(input, init, row) { - if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; - return text(input, init).then(function(response) { - return parse(response, row); - }); - }; +function defaultSource(d) { + return d.source; } -function dsv(delimiter, input, init, row) { - if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; - var format = d3Dsv.dsvFormat(delimiter); - return text(input, init).then(function(response) { - return format.parse(response, row); - }); +function defaultTarget(d) { + return d.target; } -var csv = dsvParse(d3Dsv.csvParse); -var tsv = dsvParse(d3Dsv.tsvParse); +function defaultRadius(d) { + return d.radius; +} -function image(input, init) { - return new Promise(function(resolve, reject) { - var image = new Image; - for (var key in init) image[key] = init[key]; - image.onerror = reject; - image.onload = function() { resolve(image); }; - image.src = input; - }); +function defaultStartAngle(d) { + return d.startAngle; } -function responseJson(response) { - if (!response.ok) throw new Error(response.status + " " + response.statusText); - if (response.status === 204 || response.status === 205) return; - return response.json(); +function defaultEndAngle(d) { + return d.endAngle; } -function json(input, init) { - return fetch(input, init).then(responseJson); +function defaultPadAngle() { + return 0; } -function parser(type) { - return (input, init) => text(input, init) - .then(text => (new DOMParser).parseFromString(text, type)); +function defaultArrowheadRadius() { + return 10; } -var xml = parser("application/xml"); +function ribbon(headRadius) { + var source = defaultSource, + target = defaultTarget, + sourceRadius = defaultRadius, + targetRadius = defaultRadius, + startAngle = defaultStartAngle, + endAngle = defaultEndAngle, + padAngle = defaultPadAngle, + context = null; -var html = parser("text/html"); + function ribbon() { + var buffer, + s = source.apply(this, arguments), + t = target.apply(this, arguments), + ap = padAngle.apply(this, arguments) / 2, + argv = slice.call(arguments), + sr = +sourceRadius.apply(this, (argv[0] = s, argv)), + sa0 = startAngle.apply(this, argv) - halfPi, + sa1 = endAngle.apply(this, argv) - halfPi, + tr = +targetRadius.apply(this, (argv[0] = t, argv)), + ta0 = startAngle.apply(this, argv) - halfPi, + ta1 = endAngle.apply(this, argv) - halfPi; -var svg = parser("image/svg+xml"); + if (!context) context = buffer = d3Path.path(); -exports.blob = blob; -exports.buffer = buffer; -exports.csv = csv; -exports.dsv = dsv; -exports.html = html; -exports.image = image; -exports.json = json; -exports.svg = svg; -exports.text = text; -exports.tsv = tsv; -exports.xml = xml; + if (ap > epsilon) { + if (abs(sa1 - sa0) > ap * 2 + epsilon) sa1 > sa0 ? (sa0 += ap, sa1 -= ap) : (sa0 -= ap, sa1 += ap); + else sa0 = sa1 = (sa0 + sa1) / 2; + if (abs(ta1 - ta0) > ap * 2 + epsilon) ta1 > ta0 ? (ta0 += ap, ta1 -= ap) : (ta0 -= ap, ta1 += ap); + else ta0 = ta1 = (ta0 + ta1) / 2; + } -Object.defineProperty(exports, '__esModule', { value: true }); + context.moveTo(sr * cos(sa0), sr * sin(sa0)); + context.arc(0, 0, sr, sa0, sa1); + if (sa0 !== ta0 || sa1 !== ta1) { + if (headRadius) { + var hr = +headRadius.apply(this, arguments), tr2 = tr - hr, ta2 = (ta0 + ta1) / 2; + context.quadraticCurveTo(0, 0, tr2 * cos(ta0), tr2 * sin(ta0)); + context.lineTo(tr * cos(ta2), tr * sin(ta2)); + context.lineTo(tr2 * cos(ta1), tr2 * sin(ta1)); + } else { + context.quadraticCurveTo(0, 0, tr * cos(ta0), tr * sin(ta0)); + context.arc(0, 0, tr, ta0, ta1); + } + } + context.quadraticCurveTo(0, 0, sr * cos(sa0), sr * sin(sa0)); + context.closePath(); -})); -}); + if (buffer) return context = null, buffer + "" || null; + } -var d3Quadtree = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-quadtree/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -function tree_add(d) { - const x = +this._x.call(null, d), - y = +this._y.call(null, d); - return add(this.cover(x, y), x, y, d); -} + if (headRadius) ribbon.headRadius = function(_) { + return arguments.length ? (headRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : headRadius; + }; -function add(tree, x, y, d) { - if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points + ribbon.radius = function(_) { + return arguments.length ? (sourceRadius = targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; + }; - var parent, - node = tree._root, - leaf = {data: d}, - x0 = tree._x0, - y0 = tree._y0, - x1 = tree._x1, - y1 = tree._y1, - xm, - ym, - xp, - yp, - right, - bottom, - i, - j; + ribbon.sourceRadius = function(_) { + return arguments.length ? (sourceRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : sourceRadius; + }; - // If the tree is empty, initialize the root as a leaf. - if (!node) return tree._root = leaf, tree; + ribbon.targetRadius = function(_) { + return arguments.length ? (targetRadius = typeof _ === "function" ? _ : constant(+_), ribbon) : targetRadius; + }; - // Find the existing leaf for the new point, or add it. - while (node.length) { - if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; - if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; - if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; - } + ribbon.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : startAngle; + }; - // Is the new point is exactly coincident with the existing point? - xp = +tree._x.call(null, node.data); - yp = +tree._y.call(null, node.data); - if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; + ribbon.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : endAngle; + }; - // Otherwise, split the leaf node until the old and new point are separated. - do { - parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); - if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; - if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; - } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); - return parent[j] = node, parent[i] = leaf, tree; -} + ribbon.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), ribbon) : padAngle; + }; -function addAll(data) { - var d, i, n = data.length, - x, - y, - xz = new Array(n), - yz = new Array(n), - x0 = Infinity, - y0 = Infinity, - x1 = -Infinity, - y1 = -Infinity; + ribbon.source = function(_) { + return arguments.length ? (source = _, ribbon) : source; + }; - // Compute the points and their extent. - for (i = 0; i < n; ++i) { - if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; - xz[i] = x; - yz[i] = y; - if (x < x0) x0 = x; - if (x > x1) x1 = x; - if (y < y0) y0 = y; - if (y > y1) y1 = y; - } + ribbon.target = function(_) { + return arguments.length ? (target = _, ribbon) : target; + }; - // If there were no (valid) points, abort. - if (x0 > x1 || y0 > y1) return this; + ribbon.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), ribbon) : context; + }; - // Expand the tree to cover the new points. - this.cover(x0, y0).cover(x1, y1); + return ribbon; +} - // Add the new points. - for (i = 0; i < n; ++i) { - add(this, xz[i], yz[i], data[i]); - } +function ribbon$1() { + return ribbon(); +} - return this; +function ribbonArrow() { + return ribbon(defaultArrowheadRadius); } -function tree_cover(x, y) { - if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points +exports.chord = chord; +exports.chordDirected = chordDirected; +exports.chordTranspose = chordTranspose; +exports.ribbon = ribbon$1; +exports.ribbonArrow = ribbonArrow; - var x0 = this._x0, - y0 = this._y0, - x1 = this._x1, - y1 = this._y1; +Object.defineProperty(exports, '__esModule', { value: true }); - // If the quadtree has no extent, initialize them. - // Integer extent are necessary so that if we later double the extent, - // the existing quadrant boundaries don’t change due to floating point error! - if (isNaN(x0)) { - x1 = (x0 = Math.floor(x)) + 1; - y1 = (y0 = Math.floor(y)) + 1; - } +})); +}); - // Otherwise, double repeatedly to cover. - else { - var z = x1 - x0 || 1, - node = this._root, - parent, - i; +var d3Contour = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-contour/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Array) ; +}(commonjsGlobal, function (exports, d3Array) { +var array = Array.prototype; - while (x0 > x || x >= x1 || y0 > y || y >= y1) { - i = (y < y0) << 1 | (x < x0); - parent = new Array(4), parent[i] = node, node = parent, z *= 2; - switch (i) { - case 0: x1 = x0 + z, y1 = y0 + z; break; - case 1: x0 = x1 - z, y1 = y0 + z; break; - case 2: x1 = x0 + z, y0 = y1 - z; break; - case 3: x0 = x1 - z, y0 = y1 - z; break; - } - } +var slice = array.slice; - if (this._root && this._root.length) this._root = node; - } +function ascending(a, b) { + return a - b; +} - this._x0 = x0; - this._y0 = y0; - this._x1 = x1; - this._y1 = y1; - return this; +function area(ring) { + var i = 0, n = ring.length, area = ring[n - 1][1] * ring[0][0] - ring[n - 1][0] * ring[0][1]; + while (++i < n) area += ring[i - 1][1] * ring[i][0] - ring[i - 1][0] * ring[i][1]; + return area; } -function tree_data() { - var data = []; - this.visit(function(node) { - if (!node.length) do data.push(node.data); while (node = node.next) - }); - return data; +var constant = x => () => x; + +function contains(ring, hole) { + var i = -1, n = hole.length, c; + while (++i < n) if (c = ringContains(ring, hole[i])) return c; + return 0; } -function tree_extent(_) { - return arguments.length - ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) - : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; +function ringContains(ring, point) { + var x = point[0], y = point[1], contains = -1; + for (var i = 0, n = ring.length, j = n - 1; i < n; j = i++) { + var pi = ring[i], xi = pi[0], yi = pi[1], pj = ring[j], xj = pj[0], yj = pj[1]; + if (segmentContains(pi, pj, point)) return 0; + if (((yi > y) !== (yj > y)) && ((x < (xj - xi) * (y - yi) / (yj - yi) + xi))) contains = -contains; + } + return contains; } -function Quad(node, x0, y0, x1, y1) { - this.node = node; - this.x0 = x0; - this.y0 = y0; - this.x1 = x1; - this.y1 = y1; +function segmentContains(a, b, c) { + var i; return collinear(a, b, c) && within(a[i = +(a[0] === b[0])], c[i], b[i]); } -function tree_find(x, y, radius) { - var data, - x0 = this._x0, - y0 = this._y0, - x1, - y1, - x2, - y2, - x3 = this._x1, - y3 = this._y1, - quads = [], - node = this._root, - q, - i; +function collinear(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) === (c[0] - a[0]) * (b[1] - a[1]); +} - if (node) quads.push(new Quad(node, x0, y0, x3, y3)); - if (radius == null) radius = Infinity; - else { - x0 = x - radius, y0 = y - radius; - x3 = x + radius, y3 = y + radius; - radius *= radius; +function within(p, q, r) { + return p <= q && q <= r || r <= q && q <= p; +} + +function noop() {} + +var cases = [ + [], + [[[1.0, 1.5], [0.5, 1.0]]], + [[[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [0.5, 1.0]]], + [[[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 1.5], [0.5, 1.0]], [[1.0, 0.5], [1.5, 1.0]]], + [[[1.0, 0.5], [1.0, 1.5]]], + [[[1.0, 0.5], [0.5, 1.0]]], + [[[0.5, 1.0], [1.0, 0.5]]], + [[[1.0, 1.5], [1.0, 0.5]]], + [[[0.5, 1.0], [1.0, 0.5]], [[1.5, 1.0], [1.0, 1.5]]], + [[[1.5, 1.0], [1.0, 0.5]]], + [[[0.5, 1.0], [1.5, 1.0]]], + [[[1.0, 1.5], [1.5, 1.0]]], + [[[0.5, 1.0], [1.0, 1.5]]], + [] +]; + +function contours() { + var dx = 1, + dy = 1, + threshold = d3Array.thresholdSturges, + smooth = smoothLinear; + + function contours(values) { + var tz = threshold(values); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var domain = d3Array.extent(values), start = domain[0], stop = domain[1]; + tz = d3Array.tickStep(start, stop, tz); + tz = d3Array.range(Math.floor(start / tz) * tz, Math.floor(stop / tz) * tz, tz); + } else { + tz = tz.slice().sort(ascending); + } + + return tz.map(function(value) { + return contour(values, value); + }); } - while (q = quads.pop()) { + // Accumulate, smooth contour rings, assign holes to exterior rings. + // Based on https://github.com/mbostock/shapefile/blob/v0.6.2/shp/polygon.js + function contour(values, value) { + var polygons = [], + holes = []; - // Stop searching if this quadrant can’t contain a closer node. - if (!(node = q.node) - || (x1 = q.x0) > x3 - || (y1 = q.y0) > y3 - || (x2 = q.x1) < x0 - || (y2 = q.y1) < y0) continue; + isorings(values, value, function(ring) { + smooth(ring, values, value); + if (area(ring) > 0) polygons.push([ring]); + else holes.push(ring); + }); - // Bisect the current quadrant. - if (node.length) { - var xm = (x1 + x2) / 2, - ym = (y1 + y2) / 2; + holes.forEach(function(hole) { + for (var i = 0, n = polygons.length, polygon; i < n; ++i) { + if (contains((polygon = polygons[i])[0], hole) !== -1) { + polygon.push(hole); + return; + } + } + }); - quads.push( - new Quad(node[3], xm, ym, x2, y2), - new Quad(node[2], x1, ym, xm, y2), - new Quad(node[1], xm, y1, x2, ym), - new Quad(node[0], x1, y1, xm, ym) - ); + return { + type: "MultiPolygon", + value: value, + coordinates: polygons + }; + } - // Visit the closest quadrant first. - if (i = (y >= ym) << 1 | (x >= xm)) { - q = quads[quads.length - 1]; - quads[quads.length - 1] = quads[quads.length - 1 - i]; - quads[quads.length - 1 - i] = q; + // Marching squares with isolines stitched into rings. + // Based on https://github.com/topojson/topojson-client/blob/v3.0.0/src/stitch.js + function isorings(values, value, callback) { + var fragmentByStart = new Array, + fragmentByEnd = new Array, + x, y, t0, t1, t2, t3; + + // Special case for the first row (y = -1, t2 = t3 = 0). + x = y = -1; + t1 = values[0] >= value; + cases[t1 << 1].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[x + 1] >= value; + cases[t0 | t1 << 1].forEach(stitch); + } + cases[t1 << 0].forEach(stitch); + + // General case for the intermediate rows. + while (++y < dy - 1) { + x = -1; + t1 = values[y * dx + dx] >= value; + t2 = values[y * dx] >= value; + cases[t1 << 1 | t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t0 = t1, t1 = values[y * dx + dx + x + 1] >= value; + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t0 | t1 << 1 | t2 << 2 | t3 << 3].forEach(stitch); } + cases[t1 | t2 << 3].forEach(stitch); + } + + // Special case for the last row (y = dy - 1, t0 = t1 = 0). + x = -1; + t2 = values[y * dx] >= value; + cases[t2 << 2].forEach(stitch); + while (++x < dx - 1) { + t3 = t2, t2 = values[y * dx + x + 1] >= value; + cases[t2 << 2 | t3 << 3].forEach(stitch); } + cases[t2 << 3].forEach(stitch); - // Visit this point. (Visiting coincident points isn’t necessary!) - else { - var dx = x - +this._x.call(null, node.data), - dy = y - +this._y.call(null, node.data), - d2 = dx * dx + dy * dy; - if (d2 < radius) { - var d = Math.sqrt(radius = d2); - x0 = x - d, y0 = y - d; - x3 = x + d, y3 = y + d; - data = node.data; + function stitch(line) { + var start = [line[0][0] + x, line[0][1] + y], + end = [line[1][0] + x, line[1][1] + y], + startIndex = index(start), + endIndex = index(end), + f, g; + if (f = fragmentByEnd[startIndex]) { + if (g = fragmentByStart[endIndex]) { + delete fragmentByEnd[f.end]; + delete fragmentByStart[g.start]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[f.start] = fragmentByEnd[g.end] = {start: f.start, end: g.end, ring: f.ring.concat(g.ring)}; + } + } else { + delete fragmentByEnd[f.end]; + f.ring.push(end); + fragmentByEnd[f.end = endIndex] = f; + } + } else if (f = fragmentByStart[endIndex]) { + if (g = fragmentByEnd[startIndex]) { + delete fragmentByStart[f.start]; + delete fragmentByEnd[g.end]; + if (f === g) { + f.ring.push(end); + callback(f.ring); + } else { + fragmentByStart[g.start] = fragmentByEnd[f.end] = {start: g.start, end: f.end, ring: g.ring.concat(f.ring)}; + } + } else { + delete fragmentByStart[f.start]; + f.ring.unshift(start); + fragmentByStart[f.start = startIndex] = f; + } + } else { + fragmentByStart[startIndex] = fragmentByEnd[endIndex] = {start: startIndex, end: endIndex, ring: [start, end]}; } } } - return data; -} - -function tree_remove(d) { - if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points - - var parent, - node = this._root, - retainer, - previous, - next, - x0 = this._x0, - y0 = this._y0, - x1 = this._x1, - y1 = this._y1, - x, - y, - xm, - ym, - right, - bottom, - i, - j; - - // If the tree is empty, initialize the root as a leaf. - if (!node) return this; + function index(point) { + return point[0] * 2 + point[1] * (dx + 1) * 4; + } - // Find the leaf node for the point. - // While descending, also retain the deepest parent with a non-removed sibling. - if (node.length) while (true) { - if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; - if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; - if (!(parent = node, node = node[i = bottom << 1 | right])) return this; - if (!node.length) break; - if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; + function smoothLinear(ring, values, value) { + ring.forEach(function(point) { + var x = point[0], + y = point[1], + xt = x | 0, + yt = y | 0, + v0, + v1 = values[yt * dx + xt]; + if (x > 0 && x < dx && xt === x) { + v0 = values[yt * dx + xt - 1]; + point[0] = x + (value - v0) / (v1 - v0) - 0.5; + } + if (y > 0 && y < dy && yt === y) { + v0 = values[(yt - 1) * dx + xt]; + point[1] = y + (value - v0) / (v1 - v0) - 0.5; + } + }); } - // Find the point to remove. - while (node.data !== d) if (!(previous = node, node = node.next)) return this; - if (next = node.next) delete node.next; + contours.contour = contour; - // If there are multiple coincident points, remove just the point. - if (previous) return (next ? previous.next = next : delete previous.next), this; + contours.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = Math.floor(_[0]), _1 = Math.floor(_[1]); + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, contours; + }; - // If this is the root point, remove it. - if (!parent) return this._root = next, this; + contours.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), contours) : threshold; + }; - // Remove this leaf. - next ? parent[i] = next : delete parent[i]; + contours.smooth = function(_) { + return arguments.length ? (smooth = _ ? smoothLinear : noop, contours) : smooth === smoothLinear; + }; - // If the parent now contains exactly one leaf, collapse superfluous parents. - if ((node = parent[0] || parent[1] || parent[2] || parent[3]) - && node === (parent[3] || parent[2] || parent[1] || parent[0]) - && !node.length) { - if (retainer) retainer[j] = node; - else this._root = node; - } + return contours; +} - return this; +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurX(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var j = 0; j < m; ++j) { + for (var i = 0, sr = 0; i < n + r; ++i) { + if (i < n) { + sr += source.data[i + j * n]; + } + if (i >= r) { + if (i >= w) { + sr -= source.data[i - w + j * n]; + } + target.data[i - r + j * n] = sr / Math.min(i + 1, n - 1 + w - i, w); + } + } + } } -function removeAll(data) { - for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); - return this; +// TODO Optimize edge cases. +// TODO Optimize index calculation. +// TODO Optimize arguments. +function blurY(source, target, r) { + var n = source.width, + m = source.height, + w = (r << 1) + 1; + for (var i = 0; i < n; ++i) { + for (var j = 0, sr = 0; j < m + r; ++j) { + if (j < m) { + sr += source.data[i + j * n]; + } + if (j >= r) { + if (j >= w) { + sr -= source.data[i + (j - w) * n]; + } + target.data[i + (j - r) * n] = sr / Math.min(j + 1, m - 1 + w - j, w); + } + } + } } -function tree_root() { - return this._root; +function defaultX(d) { + return d[0]; } -function tree_size() { - var size = 0; - this.visit(function(node) { - if (!node.length) do ++size; while (node = node.next) - }); - return size; +function defaultY(d) { + return d[1]; } -function tree_visit(callback) { - var quads = [], q, node = this._root, child, x0, y0, x1, y1; - if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); - while (q = quads.pop()) { - if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { - var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; - if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); - if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); - if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); - if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); - } - } - return this; +function defaultWeight() { + return 1; } -function tree_visitAfter(callback) { - var quads = [], next = [], q; - if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); - while (q = quads.pop()) { - var node = q.node; - if (node.length) { - var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; - if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); - if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); - if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); - if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); +function density() { + var x = defaultX, + y = defaultY, + weight = defaultWeight, + dx = 960, + dy = 500, + r = 20, // blur radius + k = 2, // log2(grid cell size) + o = r * 3, // grid offset, to pad for blur + n = (dx + o * 2) >> k, // grid width + m = (dy + o * 2) >> k, // grid height + threshold = constant(20); + + function density(data) { + var values0 = new Float32Array(n * m), + values1 = new Float32Array(n * m); + + data.forEach(function(d, i, data) { + var xi = (+x(d, i, data) + o) >> k, + yi = (+y(d, i, data) + o) >> k, + wi = +weight(d, i, data); + if (xi >= 0 && xi < n && yi >= 0 && yi < m) { + values0[xi + yi * n] += wi; + } + }); + + // TODO Optimize. + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + blurX({width: n, height: m, data: values0}, {width: n, height: m, data: values1}, r >> k); + blurY({width: n, height: m, data: values1}, {width: n, height: m, data: values0}, r >> k); + + var tz = threshold(values0); + + // Convert number of thresholds into uniform thresholds. + if (!Array.isArray(tz)) { + var stop = d3Array.max(values0); + tz = d3Array.tickStep(0, stop, tz); + tz = d3Array.range(0, Math.floor(stop / tz) * tz, tz); + tz.shift(); } - next.push(q); - } - while (q = next.pop()) { - callback(q.node, q.x0, q.y0, q.x1, q.y1); - } - return this; -} -function defaultX(d) { - return d[0]; -} + return contours() + .thresholds(tz) + .size([n, m]) + (values0) + .map(transform); + } -function tree_x(_) { - return arguments.length ? (this._x = _, this) : this._x; -} + function transform(geometry) { + geometry.value *= Math.pow(2, -2 * k); // Density in points per square pixel. + geometry.coordinates.forEach(transformPolygon); + return geometry; + } -function defaultY(d) { - return d[1]; -} + function transformPolygon(coordinates) { + coordinates.forEach(transformRing); + } -function tree_y(_) { - return arguments.length ? (this._y = _, this) : this._y; -} + function transformRing(coordinates) { + coordinates.forEach(transformPoint); + } -function quadtree(nodes, x, y) { - var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); - return nodes == null ? tree : tree.addAll(nodes); -} + // TODO Optimize. + function transformPoint(coordinates) { + coordinates[0] = coordinates[0] * Math.pow(2, k) - o; + coordinates[1] = coordinates[1] * Math.pow(2, k) - o; + } -function Quadtree(x, y, x0, y0, x1, y1) { - this._x = x; - this._y = y; - this._x0 = x0; - this._y0 = y0; - this._x1 = x1; - this._y1 = y1; - this._root = undefined; -} + function resize() { + o = r * 3; + n = (dx + o * 2) >> k; + m = (dy + o * 2) >> k; + return density; + } -function leaf_copy(leaf) { - var copy = {data: leaf.data}, next = copy; - while (leaf = leaf.next) next = next.next = {data: leaf.data}; - return copy; -} + density.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), density) : x; + }; -var treeProto = quadtree.prototype = Quadtree.prototype; + density.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), density) : y; + }; -treeProto.copy = function() { - var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), - node = this._root, - nodes, - child; + density.weight = function(_) { + return arguments.length ? (weight = typeof _ === "function" ? _ : constant(+_), density) : weight; + }; - if (!node) return copy; + density.size = function(_) { + if (!arguments.length) return [dx, dy]; + var _0 = +_[0], _1 = +_[1]; + if (!(_0 >= 0 && _1 >= 0)) throw new Error("invalid size"); + return dx = _0, dy = _1, resize(); + }; - if (!node.length) return copy._root = leaf_copy(node), copy; + density.cellSize = function(_) { + if (!arguments.length) return 1 << k; + if (!((_ = +_) >= 1)) throw new Error("invalid cell size"); + return k = Math.floor(Math.log(_) / Math.LN2), resize(); + }; - nodes = [{source: node, target: copy._root = new Array(4)}]; - while (node = nodes.pop()) { - for (var i = 0; i < 4; ++i) { - if (child = node.source[i]) { - if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); - else node.target[i] = leaf_copy(child); - } - } - } + density.thresholds = function(_) { + return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), density) : threshold; + }; - return copy; -}; + density.bandwidth = function(_) { + if (!arguments.length) return Math.sqrt(r * (r + 1)); + if (!((_ = +_) >= 0)) throw new Error("invalid bandwidth"); + return r = Math.round((Math.sqrt(4 * _ * _ + 1) - 1) / 2), resize(); + }; -treeProto.add = tree_add; -treeProto.addAll = addAll; -treeProto.cover = tree_cover; -treeProto.data = tree_data; -treeProto.extent = tree_extent; -treeProto.find = tree_find; -treeProto.remove = tree_remove; -treeProto.removeAll = removeAll; -treeProto.root = tree_root; -treeProto.size = tree_size; -treeProto.visit = tree_visit; -treeProto.visitAfter = tree_visitAfter; -treeProto.x = tree_x; -treeProto.y = tree_y; + return density; +} -exports.quadtree = quadtree; +exports.contourDensity = density; +exports.contours = contours; Object.defineProperty(exports, '__esModule', { value: true }); })); }); -var d3Force = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-force/ v2.1.1 Copyright 2020 Mike Bostock +var d3Delaunay = createCommonjsModule(function (module, exports) { +// https://github.com/d3/d3-delaunay v5.3.0 Copyright 2020 Mike Bostock +// https://github.com/mapbox/delaunator v4.0.1. Copyright 2019 Mapbox, Inc. (function (global, factory) { -factory(exports, d3Quadtree, d3Dispatch, d3Timer) ; -}(commonjsGlobal, function (exports, d3Quadtree, d3Dispatch, d3Timer) { -function center(x, y) { - var nodes, strength = 1; +factory(exports) ; +}(commonjsGlobal, function (exports) { +const EPSILON = Math.pow(2, -52); +const EDGE_STACK = new Uint32Array(512); - if (x == null) x = 0; - if (y == null) y = 0; +class Delaunator { - function force() { - var i, - n = nodes.length, - node, - sx = 0, - sy = 0; + static from(points, getX = defaultGetX, getY = defaultGetY) { + const n = points.length; + const coords = new Float64Array(n * 2); - for (i = 0; i < n; ++i) { - node = nodes[i], sx += node.x, sy += node.y; - } + for (let i = 0; i < n; i++) { + const p = points[i]; + coords[2 * i] = getX(p); + coords[2 * i + 1] = getY(p); + } - for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) { - node = nodes[i], node.x -= sx, node.y -= sy; + return new Delaunator(coords); } - } - force.initialize = function(_) { - nodes = _; - }; + constructor(coords) { + const n = coords.length >> 1; + if (n > 0 && typeof coords[0] !== 'number') throw new Error('Expected coords to contain numbers.'); - force.x = function(_) { - return arguments.length ? (x = +_, force) : x; - }; + this.coords = coords; - force.y = function(_) { - return arguments.length ? (y = +_, force) : y; - }; + // arrays that will store the triangulation graph + const maxTriangles = Math.max(2 * n - 5, 0); + this._triangles = new Uint32Array(maxTriangles * 3); + this._halfedges = new Int32Array(maxTriangles * 3); - force.strength = function(_) { - return arguments.length ? (strength = +_, force) : strength; - }; + // temporary arrays for tracking the edges of the advancing convex hull + this._hashSize = Math.ceil(Math.sqrt(n)); + this._hullPrev = new Uint32Array(n); // edge to prev edge + this._hullNext = new Uint32Array(n); // edge to next edge + this._hullTri = new Uint32Array(n); // edge to adjacent triangle + this._hullHash = new Int32Array(this._hashSize).fill(-1); // angular edge hash - return force; -} + // temporary arrays for sorting points + this._ids = new Uint32Array(n); + this._dists = new Float64Array(n); -function constant(x) { - return function() { - return x; - }; -} + this.update(); + } -function jiggle(random) { - return (random() - 0.5) * 1e-6; -} + update() { + const {coords, _hullPrev: hullPrev, _hullNext: hullNext, _hullTri: hullTri, _hullHash: hullHash} = this; + const n = coords.length >> 1; -function x(d) { - return d.x + d.vx; -} + // populate an array of point indices; calculate input data bbox + let minX = Infinity; + let minY = Infinity; + let maxX = -Infinity; + let maxY = -Infinity; -function y(d) { - return d.y + d.vy; -} + for (let i = 0; i < n; i++) { + const x = coords[2 * i]; + const y = coords[2 * i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; + this._ids[i] = i; + } + const cx = (minX + maxX) / 2; + const cy = (minY + maxY) / 2; + + let minDist = Infinity; + let i0, i1, i2; + + // pick a seed point close to the center + for (let i = 0; i < n; i++) { + const d = dist(cx, cy, coords[2 * i], coords[2 * i + 1]); + if (d < minDist) { + i0 = i; + minDist = d; + } + } + const i0x = coords[2 * i0]; + const i0y = coords[2 * i0 + 1]; -function collide(radius) { - var nodes, - radii, - random, - strength = 1, - iterations = 1; + minDist = Infinity; - if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius); + // find the point closest to the seed + for (let i = 0; i < n; i++) { + if (i === i0) continue; + const d = dist(i0x, i0y, coords[2 * i], coords[2 * i + 1]); + if (d < minDist && d > 0) { + i1 = i; + minDist = d; + } + } + let i1x = coords[2 * i1]; + let i1y = coords[2 * i1 + 1]; - function force() { - var i, n = nodes.length, - tree, - node, - xi, - yi, - ri, - ri2; + let minRadius = Infinity; - for (var k = 0; k < iterations; ++k) { - tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare); - for (i = 0; i < n; ++i) { - node = nodes[i]; - ri = radii[node.index], ri2 = ri * ri; - xi = node.x + node.vx; - yi = node.y + node.vy; - tree.visit(apply); - } - } + // find the third point which forms the smallest circumcircle with the first two + for (let i = 0; i < n; i++) { + if (i === i0 || i === i1) continue; + const r = circumradius(i0x, i0y, i1x, i1y, coords[2 * i], coords[2 * i + 1]); + if (r < minRadius) { + i2 = i; + minRadius = r; + } + } + let i2x = coords[2 * i2]; + let i2y = coords[2 * i2 + 1]; - function apply(quad, x0, y0, x1, y1) { - var data = quad.data, rj = quad.r, r = ri + rj; - if (data) { - if (data.index > node.index) { - var x = xi - data.x - data.vx, - y = yi - data.y - data.vy, - l = x * x + y * y; - if (l < r * r) { - if (x === 0) x = jiggle(random), l += x * x; - if (y === 0) y = jiggle(random), l += y * y; - l = (r - (l = Math.sqrt(l))) / l * strength; - node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); - node.vy += (y *= l) * r; - data.vx -= x * (r = 1 - r); - data.vy -= y * r; - } + if (minRadius === Infinity) { + // order collinear points by dx (or dy if all x are identical) + // and return the list as a hull + for (let i = 0; i < n; i++) { + this._dists[i] = (coords[2 * i] - coords[0]) || (coords[2 * i + 1] - coords[1]); + } + quicksort(this._ids, this._dists, 0, n - 1); + const hull = new Uint32Array(n); + let j = 0; + for (let i = 0, d0 = -Infinity; i < n; i++) { + const id = this._ids[i]; + if (this._dists[id] > d0) { + hull[j++] = id; + d0 = this._dists[id]; + } + } + this.hull = hull.subarray(0, j); + this.triangles = new Uint32Array(0); + this.halfedges = new Uint32Array(0); + return; } - return; - } - return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; - } - } - function prepare(quad) { - if (quad.data) return quad.r = radii[quad.data.index]; - for (var i = quad.r = 0; i < 4; ++i) { - if (quad[i] && quad[i].r > quad.r) { - quad.r = quad[i].r; - } - } - } + // swap the order of the seed points for counter-clockwise orientation + if (orient(i0x, i0y, i1x, i1y, i2x, i2y)) { + const i = i1; + const x = i1x; + const y = i1y; + i1 = i2; + i1x = i2x; + i1y = i2y; + i2 = i; + i2x = x; + i2y = y; + } - function initialize() { - if (!nodes) return; - var i, n = nodes.length, node; - radii = new Array(n); - for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); - } + const center = circumcenter(i0x, i0y, i1x, i1y, i2x, i2y); + this._cx = center.x; + this._cy = center.y; - force.initialize = function(_nodes, _random) { - nodes = _nodes; - random = _random; - initialize(); - }; + for (let i = 0; i < n; i++) { + this._dists[i] = dist(coords[2 * i], coords[2 * i + 1], center.x, center.y); + } - force.iterations = function(_) { - return arguments.length ? (iterations = +_, force) : iterations; - }; + // sort the points by distance from the seed triangle circumcenter + quicksort(this._ids, this._dists, 0, n - 1); - force.strength = function(_) { - return arguments.length ? (strength = +_, force) : strength; - }; + // set up the seed triangle as the starting hull + this._hullStart = i0; + let hullSize = 3; - force.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; - }; + hullNext[i0] = hullPrev[i2] = i1; + hullNext[i1] = hullPrev[i0] = i2; + hullNext[i2] = hullPrev[i1] = i0; - return force; -} + hullTri[i0] = 0; + hullTri[i1] = 1; + hullTri[i2] = 2; -function index(d) { - return d.index; -} + hullHash.fill(-1); + hullHash[this._hashKey(i0x, i0y)] = i0; + hullHash[this._hashKey(i1x, i1y)] = i1; + hullHash[this._hashKey(i2x, i2y)] = i2; -function find(nodeById, nodeId) { - var node = nodeById.get(nodeId); - if (!node) throw new Error("node not found: " + nodeId); - return node; -} + this.trianglesLen = 0; + this._addTriangle(i0, i1, i2, -1, -1, -1); -function link(links) { - var id = index, - strength = defaultStrength, - strengths, - distance = constant(30), - distances, - nodes, - count, - bias, - random, - iterations = 1; + for (let k = 0, xp, yp; k < this._ids.length; k++) { + const i = this._ids[k]; + const x = coords[2 * i]; + const y = coords[2 * i + 1]; - if (links == null) links = []; + // skip near-duplicate points + if (k > 0 && Math.abs(x - xp) <= EPSILON && Math.abs(y - yp) <= EPSILON) continue; + xp = x; + yp = y; - function defaultStrength(link) { - return 1 / Math.min(count[link.source.index], count[link.target.index]); - } + // skip seed triangle points + if (i === i0 || i === i1 || i === i2) continue; - function force(alpha) { - for (var k = 0, n = links.length; k < iterations; ++k) { - for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { - link = links[i], source = link.source, target = link.target; - x = target.x + target.vx - source.x - source.vx || jiggle(random); - y = target.y + target.vy - source.y - source.vy || jiggle(random); - l = Math.sqrt(x * x + y * y); - l = (l - distances[i]) / l * alpha * strengths[i]; - x *= l, y *= l; - target.vx -= x * (b = bias[i]); - target.vy -= y * b; - source.vx += x * (b = 1 - b); - source.vy += y * b; - } - } - } + // find a visible edge on the convex hull using edge hash + let start = 0; + for (let j = 0, key = this._hashKey(x, y); j < this._hashSize; j++) { + start = hullHash[(key + j) % this._hashSize]; + if (start !== -1 && start !== hullNext[start]) break; + } - function initialize() { - if (!nodes) return; + start = hullPrev[start]; + let e = start, q; + while (q = hullNext[e], !orient(x, y, coords[2 * e], coords[2 * e + 1], coords[2 * q], coords[2 * q + 1])) { + e = q; + if (e === start) { + e = -1; + break; + } + } + if (e === -1) continue; // likely a near-duplicate point; skip it - var i, - n = nodes.length, - m = links.length, - nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])), - link; + // add the first triangle from the point + let t = this._addTriangle(e, i, hullNext[e], -1, -1, hullTri[e]); - for (i = 0, count = new Array(n); i < m; ++i) { - link = links[i], link.index = i; - if (typeof link.source !== "object") link.source = find(nodeById, link.source); - if (typeof link.target !== "object") link.target = find(nodeById, link.target); - count[link.source.index] = (count[link.source.index] || 0) + 1; - count[link.target.index] = (count[link.target.index] || 0) + 1; - } + // recursively flip triangles from the point until they satisfy the Delaunay condition + hullTri[i] = this._legalize(t + 2); + hullTri[e] = t; // keep track of boundary triangles on the hull + hullSize++; + + // walk forward through the hull, adding more triangles and flipping recursively + let n = hullNext[e]; + while (q = hullNext[n], orient(x, y, coords[2 * n], coords[2 * n + 1], coords[2 * q], coords[2 * q + 1])) { + t = this._addTriangle(n, i, q, hullTri[i], -1, hullTri[n]); + hullTri[i] = this._legalize(t + 2); + hullNext[n] = n; // mark as removed + hullSize--; + n = q; + } + + // walk backward from the other side, adding more triangles and flipping + if (e === start) { + while (q = hullPrev[e], orient(x, y, coords[2 * q], coords[2 * q + 1], coords[2 * e], coords[2 * e + 1])) { + t = this._addTriangle(q, i, e, -1, hullTri[e], hullTri[q]); + this._legalize(t + 2); + hullTri[q] = t; + hullNext[e] = e; // mark as removed + hullSize--; + e = q; + } + } - for (i = 0, bias = new Array(m); i < m; ++i) { - link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); - } + // update the hull indices + this._hullStart = hullPrev[i] = e; + hullNext[e] = hullPrev[n] = i; + hullNext[i] = n; - strengths = new Array(m), initializeStrength(); - distances = new Array(m), initializeDistance(); - } + // save the two new edges in the hash table + hullHash[this._hashKey(x, y)] = i; + hullHash[this._hashKey(coords[2 * e], coords[2 * e + 1])] = e; + } - function initializeStrength() { - if (!nodes) return; + this.hull = new Uint32Array(hullSize); + for (let i = 0, e = this._hullStart; i < hullSize; i++) { + this.hull[i] = e; + e = hullNext[e]; + } - for (var i = 0, n = links.length; i < n; ++i) { - strengths[i] = +strength(links[i], i, links); + // trim typed triangle mesh arrays + this.triangles = this._triangles.subarray(0, this.trianglesLen); + this.halfedges = this._halfedges.subarray(0, this.trianglesLen); } - } - - function initializeDistance() { - if (!nodes) return; - for (var i = 0, n = links.length; i < n; ++i) { - distances[i] = +distance(links[i], i, links); + _hashKey(x, y) { + return Math.floor(pseudoAngle(x - this._cx, y - this._cy) * this._hashSize) % this._hashSize; } - } - force.initialize = function(_nodes, _random) { - nodes = _nodes; - random = _random; - initialize(); - }; + _legalize(a) { + const {_triangles: triangles, _halfedges: halfedges, coords} = this; - force.links = function(_) { - return arguments.length ? (links = _, initialize(), force) : links; - }; + let i = 0; + let ar = 0; - force.id = function(_) { - return arguments.length ? (id = _, force) : id; - }; + // recursion eliminated with a fixed-size stack + while (true) { + const b = halfedges[a]; - force.iterations = function(_) { - return arguments.length ? (iterations = +_, force) : iterations; - }; + /* if the pair of triangles doesn't satisfy the Delaunay condition + * (p1 is inside the circumcircle of [p0, pl, pr]), flip them, + * then do the same check/flip recursively for the new pair of triangles + * + * pl pl + * /||\ / \ + * al/ || \bl al/ \a + * / || \ / \ + * / a||b \ flip /___ar___\ + * p0\ || /p1 => p0\---bl---/p1 + * \ || / \ / + * ar\ || /br b\ /br + * \||/ \ / + * pr pr + */ + const a0 = a - a % 3; + ar = a0 + (a + 2) % 3; - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; - }; + if (b === -1) { // convex hull edge + if (i === 0) break; + a = EDGE_STACK[--i]; + continue; + } - force.distance = function(_) { - return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; - }; + const b0 = b - b % 3; + const al = a0 + (a + 1) % 3; + const bl = b0 + (b + 2) % 3; - return force; -} + const p0 = triangles[ar]; + const pr = triangles[a]; + const pl = triangles[al]; + const p1 = triangles[bl]; -// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use -const a = 1664525; -const c = 1013904223; -const m = 4294967296; // 2^32 + const illegal = inCircle( + coords[2 * p0], coords[2 * p0 + 1], + coords[2 * pr], coords[2 * pr + 1], + coords[2 * pl], coords[2 * pl + 1], + coords[2 * p1], coords[2 * p1 + 1]); -function lcg() { - let s = 1; - return () => (s = (a * s + c) % m) / m; -} + if (illegal) { + triangles[a] = p1; + triangles[b] = p0; -function x$1(d) { - return d.x; -} + const hbl = halfedges[bl]; -function y$1(d) { - return d.y; -} + // edge swapped on the other side of the hull (rare); fix the halfedge reference + if (hbl === -1) { + let e = this._hullStart; + do { + if (this._hullTri[e] === bl) { + this._hullTri[e] = a; + break; + } + e = this._hullPrev[e]; + } while (e !== this._hullStart); + } + this._link(a, hbl); + this._link(b, halfedges[ar]); + this._link(ar, bl); -var initialRadius = 10, - initialAngle = Math.PI * (3 - Math.sqrt(5)); + const br = b0 + (b + 1) % 3; -function simulation(nodes) { - var simulation, - alpha = 1, - alphaMin = 0.001, - alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), - alphaTarget = 0, - velocityDecay = 0.6, - forces = new Map(), - stepper = d3Timer.timer(step), - event = d3Dispatch.dispatch("tick", "end"), - random = lcg(); + // don't worry about hitting the cap: it can only happen on extremely degenerate input + if (i < EDGE_STACK.length) { + EDGE_STACK[i++] = br; + } + } else { + if (i === 0) break; + a = EDGE_STACK[--i]; + } + } - if (nodes == null) nodes = []; + return ar; + } - function step() { - tick(); - event.call("tick", simulation); - if (alpha < alphaMin) { - stepper.stop(); - event.call("end", simulation); + _link(a, b) { + this._halfedges[a] = b; + if (b !== -1) this._halfedges[b] = a; } - } - function tick(iterations) { - var i, n = nodes.length, node; + // add a new triangle given vertex indices and adjacent half-edge ids + _addTriangle(i0, i1, i2, a, b, c) { + const t = this.trianglesLen; - if (iterations === undefined) iterations = 1; + this._triangles[t] = i0; + this._triangles[t + 1] = i1; + this._triangles[t + 2] = i2; - for (var k = 0; k < iterations; ++k) { - alpha += (alphaTarget - alpha) * alphaDecay; + this._link(t, a); + this._link(t + 1, b); + this._link(t + 2, c); - forces.forEach(function(force) { - force(alpha); - }); + this.trianglesLen += 3; - for (i = 0; i < n; ++i) { - node = nodes[i]; - if (node.fx == null) node.x += node.vx *= velocityDecay; - else node.x = node.fx, node.vx = 0; - if (node.fy == null) node.y += node.vy *= velocityDecay; - else node.y = node.fy, node.vy = 0; - } + return t; } +} - return simulation; - } +// monotonically increases with real angle, but doesn't need expensive trigonometry +function pseudoAngle(dx, dy) { + const p = dx / (Math.abs(dx) + Math.abs(dy)); + return (dy > 0 ? 3 - p : 1 + p) / 4; // [0..1] +} - function initializeNodes() { - for (var i = 0, n = nodes.length, node; i < n; ++i) { - node = nodes[i], node.index = i; - if (node.fx != null) node.x = node.fx; - if (node.fy != null) node.y = node.fy; - if (isNaN(node.x) || isNaN(node.y)) { - var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; - node.x = radius * Math.cos(angle); - node.y = radius * Math.sin(angle); - } - if (isNaN(node.vx) || isNaN(node.vy)) { - node.vx = node.vy = 0; - } - } - } +function dist(ax, ay, bx, by) { + const dx = ax - bx; + const dy = ay - by; + return dx * dx + dy * dy; +} - function initializeForce(force) { - if (force.initialize) force.initialize(nodes, random); - return force; - } +// return 2d orientation sign if we're confident in it through J. Shewchuk's error bound check +function orientIfSure(px, py, rx, ry, qx, qy) { + const l = (ry - py) * (qx - px); + const r = (rx - px) * (qy - py); + return Math.abs(l - r) >= 3.3306690738754716e-16 * Math.abs(l + r) ? l - r : 0; +} - initializeNodes(); +// a more robust orientation test that's stable in a given triangle (to fix robustness issues) +function orient(rx, ry, qx, qy, px, py) { + const sign = orientIfSure(px, py, rx, ry, qx, qy) || + orientIfSure(rx, ry, qx, qy, px, py) || + orientIfSure(qx, qy, px, py, rx, ry); + return sign < 0; +} + +function inCircle(ax, ay, bx, by, cx, cy, px, py) { + const dx = ax - px; + const dy = ay - py; + const ex = bx - px; + const ey = by - py; + const fx = cx - px; + const fy = cy - py; + + const ap = dx * dx + dy * dy; + const bp = ex * ex + ey * ey; + const cp = fx * fx + fy * fy; - return simulation = { - tick: tick, + return dx * (ey * cp - bp * fy) - + dy * (ex * cp - bp * fx) + + ap * (ex * fy - ey * fx) < 0; +} - restart: function() { - return stepper.restart(step), simulation; - }, +function circumradius(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; - stop: function() { - return stepper.stop(), simulation; - }, + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); - nodes: function(_) { - return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; - }, + const x = (ey * bl - dy * cl) * d; + const y = (dx * cl - ex * bl) * d; - alpha: function(_) { - return arguments.length ? (alpha = +_, simulation) : alpha; - }, + return x * x + y * y; +} - alphaMin: function(_) { - return arguments.length ? (alphaMin = +_, simulation) : alphaMin; - }, +function circumcenter(ax, ay, bx, by, cx, cy) { + const dx = bx - ax; + const dy = by - ay; + const ex = cx - ax; + const ey = cy - ay; - alphaDecay: function(_) { - return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; - }, + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const d = 0.5 / (dx * ey - dy * ex); - alphaTarget: function(_) { - return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; - }, + const x = ax + (ey * bl - dy * cl) * d; + const y = ay + (dx * cl - ex * bl) * d; - velocityDecay: function(_) { - return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; - }, + return {x, y}; +} - randomSource: function(_) { - return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; - }, +function quicksort(ids, dists, left, right) { + if (right - left <= 20) { + for (let i = left + 1; i <= right; i++) { + const temp = ids[i]; + const tempDist = dists[temp]; + let j = i - 1; + while (j >= left && dists[ids[j]] > tempDist) ids[j + 1] = ids[j--]; + ids[j + 1] = temp; + } + } else { + const median = (left + right) >> 1; + let i = left + 1; + let j = right; + swap(ids, median, i); + if (dists[ids[left]] > dists[ids[right]]) swap(ids, left, right); + if (dists[ids[i]] > dists[ids[right]]) swap(ids, i, right); + if (dists[ids[left]] > dists[ids[i]]) swap(ids, left, i); - force: function(name, _) { - return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); - }, + const temp = ids[i]; + const tempDist = dists[temp]; + while (true) { + do i++; while (dists[ids[i]] < tempDist); + do j--; while (dists[ids[j]] > tempDist); + if (j < i) break; + swap(ids, i, j); + } + ids[left + 1] = ids[j]; + ids[j] = temp; - find: function(x, y, radius) { - var i = 0, - n = nodes.length, - dx, - dy, - d2, - node, - closest; + if (right - i + 1 >= j - left) { + quicksort(ids, dists, i, right); + quicksort(ids, dists, left, j - 1); + } else { + quicksort(ids, dists, left, j - 1); + quicksort(ids, dists, i, right); + } + } +} - if (radius == null) radius = Infinity; - else radius *= radius; +function swap(arr, i, j) { + const tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; +} - for (i = 0; i < n; ++i) { - node = nodes[i]; - dx = x - node.x; - dy = y - node.y; - d2 = dx * dx + dy * dy; - if (d2 < radius) closest = node, radius = d2; - } +function defaultGetX(p) { + return p[0]; +} +function defaultGetY(p) { + return p[1]; +} - return closest; - }, +const epsilon = 1e-6; - on: function(name, _) { - return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); +class Path { + constructor() { + this._x0 = this._y0 = // start of current subpath + this._x1 = this._y1 = null; // end of current subpath + this._ = ""; + } + moveTo(x, y) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`; + } + closePath() { + if (this._x1 !== null) { + this._x1 = this._x0, this._y1 = this._y0; + this._ += "Z"; } - }; + } + lineTo(x, y) { + this._ += `L${this._x1 = +x},${this._y1 = +y}`; + } + arc(x, y, r) { + x = +x, y = +y, r = +r; + const x0 = x + r; + const y0 = y; + if (r < 0) throw new Error("negative radius"); + if (this._x1 === null) this._ += `M${x0},${y0}`; + else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) this._ += "L" + x0 + "," + y0; + if (!r) return; + this._ += `A${r},${r},0,1,1,${x - r},${y}A${r},${r},0,1,1,${this._x1 = x0},${this._y1 = y0}`; + } + rect(x, y, w, h) { + this._ += `M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${+w}v${+h}h${-w}Z`; + } + value() { + return this._ || null; + } } -function manyBody() { - var nodes, - node, - random, - alpha, - strength = constant(-30), - strengths, - distanceMin2 = 1, - distanceMax2 = Infinity, - theta2 = 0.81; - - function force(_) { - var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate); - for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); +class Polygon { + constructor() { + this._ = []; + } + moveTo(x, y) { + this._.push([x, y]); + } + closePath() { + this._.push(this._[0].slice()); + } + lineTo(x, y) { + this._.push([x, y]); + } + value() { + return this._.length ? this._ : null; } +} - function initialize() { - if (!nodes) return; - var i, n = nodes.length, node; - strengths = new Array(n); - for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); +class Voronoi { + constructor(delaunay, [xmin, ymin, xmax, ymax] = [0, 0, 960, 500]) { + if (!((xmax = +xmax) >= (xmin = +xmin)) || !((ymax = +ymax) >= (ymin = +ymin))) throw new Error("invalid bounds"); + this.delaunay = delaunay; + this._circumcenters = new Float64Array(delaunay.points.length * 2); + this.vectors = new Float64Array(delaunay.points.length * 2); + this.xmax = xmax, this.xmin = xmin; + this.ymax = ymax, this.ymin = ymin; + this._init(); } + update() { + this.delaunay.update(); + this._init(); + return this; + } + _init() { + const {delaunay: {points, hull, triangles}, vectors} = this; - function accumulate(quad) { - var strength = 0, q, c, weight = 0, x, y, i; + // Compute circumcenters. + const circumcenters = this.circumcenters = this._circumcenters.subarray(0, triangles.length / 3 * 2); + for (let i = 0, j = 0, n = triangles.length, x, y; i < n; i += 3, j += 2) { + const t1 = triangles[i] * 2; + const t2 = triangles[i + 1] * 2; + const t3 = triangles[i + 2] * 2; + const x1 = points[t1]; + const y1 = points[t1 + 1]; + const x2 = points[t2]; + const y2 = points[t2 + 1]; + const x3 = points[t3]; + const y3 = points[t3 + 1]; - // For internal nodes, accumulate forces from child quadrants. - if (quad.length) { - for (x = y = i = 0; i < 4; ++i) { - if ((q = quad[i]) && (c = Math.abs(q.value))) { - strength += q.value, weight += c, x += c * q.x, y += c * q.y; - } + const dx = x2 - x1; + const dy = y2 - y1; + const ex = x3 - x1; + const ey = y3 - y1; + const bl = dx * dx + dy * dy; + const cl = ex * ex + ey * ey; + const ab = (dx * ey - dy * ex) * 2; + + if (!ab) { + // degenerate case (collinear diagram) + x = (x1 + x3) / 2 - 1e8 * ey; + y = (y1 + y3) / 2 + 1e8 * ex; + } + else if (Math.abs(ab) < 1e-8) { + // almost equal points (degenerate triangle) + x = (x1 + x3) / 2; + y = (y1 + y3) / 2; + } else { + const d = 1 / ab; + x = x1 + (ey * bl - dy * cl) * d; + y = y1 + (dx * cl - ex * bl) * d; } - quad.x = x / weight; - quad.y = y / weight; + circumcenters[j] = x; + circumcenters[j + 1] = y; } - // For leaf nodes, accumulate forces from coincident quadrants. - else { - q = quad; - q.x = q.data.x; - q.y = q.data.y; - do strength += strengths[q.data.index]; - while (q = q.next); + // Compute exterior cell rays. + let h = hull[hull.length - 1]; + let p0, p1 = h * 4; + let x0, x1 = points[2 * h]; + let y0, y1 = points[2 * h + 1]; + vectors.fill(0); + for (let i = 0; i < hull.length; ++i) { + h = hull[i]; + p0 = p1, x0 = x1, y0 = y1; + p1 = h * 4, x1 = points[2 * h], y1 = points[2 * h + 1]; + vectors[p0 + 2] = vectors[p1] = y0 - y1; + vectors[p0 + 3] = vectors[p1 + 1] = x1 - x0; } - - quad.value = strength; } - - function apply(quad, x1, _, x2) { - if (!quad.value) return true; - - var x = quad.x - node.x, - y = quad.y - node.y, - w = x2 - x1, - l = x * x + y * y; - - // Apply the Barnes-Hut approximation if possible. - // Limit forces for very close nodes; randomize direction if coincident. - if (w * w / theta2 < l) { - if (l < distanceMax2) { - if (x === 0) x = jiggle(random), l += x * x; - if (y === 0) y = jiggle(random), l += y * y; - if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); - node.vx += x * quad.value * alpha / l; - node.vy += y * quad.value * alpha / l; - } - return true; + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {delaunay: {halfedges, inedges, hull}, circumcenters, vectors} = this; + if (hull.length <= 1) return null; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = Math.floor(i / 3) * 2; + const tj = Math.floor(j / 3) * 2; + const xi = circumcenters[ti]; + const yi = circumcenters[ti + 1]; + const xj = circumcenters[tj]; + const yj = circumcenters[tj + 1]; + this._renderSegment(xi, yi, xj, yj, context); } - - // Otherwise, process points directly. - else if (quad.length || l >= distanceMax2) return; - - // Limit forces for very close nodes; randomize direction if coincident. - if (quad.data !== node || quad.next) { - if (x === 0) x = jiggle(random), l += x * x; - if (y === 0) y = jiggle(random), l += y * y; - if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + let h0, h1 = hull[hull.length - 1]; + for (let i = 0; i < hull.length; ++i) { + h0 = h1, h1 = hull[i]; + const t = Math.floor(inedges[h1] / 3) * 2; + const x = circumcenters[t]; + const y = circumcenters[t + 1]; + const v = h0 * 4; + const p = this._project(x, y, vectors[v + 2], vectors[v + 3]); + if (p) this._renderSegment(x, y, p[0], p[1], context); } - - do if (quad.data !== node) { - w = strengths[quad.data.index] * alpha / l; - node.vx += x * w; - node.vy += y * w; - } while (quad = quad.next); + return buffer && buffer.value(); } - - force.initialize = function(_nodes, _random) { - nodes = _nodes; - random = _random; - initialize(); - }; - - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; - - force.distanceMin = function(_) { - return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); - }; - - force.distanceMax = function(_) { - return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); - }; - - force.theta = function(_) { - return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); - }; - - return force; -} - -function radial(radius, x, y) { - var nodes, - strength = constant(0.1), - strengths, - radiuses; - - if (typeof radius !== "function") radius = constant(+radius); - if (x == null) x = 0; - if (y == null) y = 0; - - function force(alpha) { - for (var i = 0, n = nodes.length; i < n; ++i) { - var node = nodes[i], - dx = node.x - x || 1e-6, - dy = node.y - y || 1e-6, - r = Math.sqrt(dx * dx + dy * dy), - k = (radiuses[i] - r) * strengths[i] * alpha / r; - node.vx += dx * k; - node.vy += dy * k; + renderBounds(context) { + const buffer = context == null ? context = new Path : undefined; + context.rect(this.xmin, this.ymin, this.xmax - this.xmin, this.ymax - this.ymin); + return buffer && buffer.value(); + } + renderCell(i, context) { + const buffer = context == null ? context = new Path : undefined; + const points = this._clip(i); + if (points === null || !points.length) return; + context.moveTo(points[0], points[1]); + let n = points.length; + while (points[0] === points[n-2] && points[1] === points[n-1] && n > 1) n -= 2; + for (let i = 2; i < n; i += 2) { + if (points[i] !== points[i-2] || points[i+1] !== points[i-1]) + context.lineTo(points[i], points[i + 1]); } + context.closePath(); + return buffer && buffer.value(); } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length; - strengths = new Array(n); - radiuses = new Array(n); - for (i = 0; i < n; ++i) { - radiuses[i] = +radius(nodes[i], i, nodes); - strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); + *cellPolygons() { + const {delaunay: {points}} = this; + for (let i = 0, n = points.length / 2; i < n; ++i) { + const cell = this.cellPolygon(i); + if (cell) cell.index = i, yield cell; } } - - force.initialize = function(_) { - nodes = _, initialize(); - }; - - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; - - force.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; - }; - - force.x = function(_) { - return arguments.length ? (x = +_, force) : x; - }; - - force.y = function(_) { - return arguments.length ? (y = +_, force) : y; - }; - - return force; -} - -function x$2(x) { - var strength = constant(0.1), - nodes, - strengths, - xz; - - if (typeof x !== "function") x = constant(x == null ? 0 : +x); - - function force(alpha) { - for (var i = 0, n = nodes.length, node; i < n; ++i) { - node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + cellPolygon(i) { + const polygon = new Polygon; + this.renderCell(i, polygon); + return polygon.value(); + } + _renderSegment(x0, y0, x1, y1, context) { + let S; + const c0 = this._regioncode(x0, y0); + const c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + context.moveTo(x0, y0); + context.lineTo(x1, y1); + } else if (S = this._clipSegment(x0, y0, x1, y1, c0, c1)) { + context.moveTo(S[0], S[1]); + context.lineTo(S[2], S[3]); } } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length; - strengths = new Array(n); - xz = new Array(n); - for (i = 0; i < n; ++i) { - strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + contains(i, x, y) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return false; + return this.delaunay._step(i, x, y) === i; + } + *neighbors(i) { + const ci = this._clip(i); + if (ci) for (const j of this.delaunay.neighbors(i)) { + const cj = this._clip(j); + // find the common edge + if (cj) loop: for (let ai = 0, li = ci.length; ai < li; ai += 2) { + for (let aj = 0, lj = cj.length; aj < lj; aj += 2) { + if (ci[ai] == cj[aj] + && ci[ai + 1] == cj[aj + 1] + && ci[(ai + 2) % li] == cj[(aj + lj - 2) % lj] + && ci[(ai + 3) % li] == cj[(aj + lj - 1) % lj] + ) { + yield j; + break loop; + } + } + } + } + } + _cell(i) { + const {circumcenters, delaunay: {inedges, halfedges, triangles}} = this; + const e0 = inedges[i]; + if (e0 === -1) return null; // coincident point + const points = []; + let e = e0; + do { + const t = Math.floor(e / 3); + points.push(circumcenters[t * 2], circumcenters[t * 2 + 1]); + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + } while (e !== e0 && e !== -1); + return points; + } + _clip(i) { + // degenerate case (1 valid point: return the box) + if (i === 0 && this.delaunay.hull.length === 1) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; } + const points = this._cell(i); + if (points === null) return null; + const {vectors: V} = this; + const v = i * 4; + return V[v] || V[v + 1] + ? this._clipInfinite(i, points, V[v], V[v + 1], V[v + 2], V[v + 3]) + : this._clipFinite(i, points); } - - force.initialize = function(_) { - nodes = _; - initialize(); - }; - - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; - - force.x = function(_) { - return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; - }; - - return force; -} - -function y$2(y) { - var strength = constant(0.1), - nodes, - strengths, - yz; - - if (typeof y !== "function") y = constant(y == null ? 0 : +y); - - function force(alpha) { - for (var i = 0, n = nodes.length, node; i < n; ++i) { - node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + _clipFinite(i, points) { + const n = points.length; + let P = null; + let x0, y0, x1 = points[n - 2], y1 = points[n - 1]; + let c0, c1 = this._regioncode(x1, y1); + let e0, e1; + for (let j = 0; j < n; j += 2) { + x0 = x1, y0 = y1, x1 = points[j], y1 = points[j + 1]; + c0 = c1, c1 = this._regioncode(x1, y1); + if (c0 === 0 && c1 === 0) { + e0 = e1, e1 = 0; + if (P) P.push(x1, y1); + else P = [x1, y1]; + } else { + let S, sx0, sy0, sx1, sy1; + if (c0 === 0) { + if ((S = this._clipSegment(x0, y0, x1, y1, c0, c1)) === null) continue; + [sx0, sy0, sx1, sy1] = S; + } else { + if ((S = this._clipSegment(x1, y1, x0, y0, c1, c0)) === null) continue; + [sx1, sy1, sx0, sy0] = S; + e0 = e1, e1 = this._edgecode(sx0, sy0); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx0, sy0); + else P = [sx0, sy0]; + } + e0 = e1, e1 = this._edgecode(sx1, sy1); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + if (P) P.push(sx1, sy1); + else P = [sx1, sy1]; + } + } + if (P) { + e0 = e1, e1 = this._edgecode(P[0], P[1]); + if (e0 && e1) this._edge(i, e0, e1, P, P.length); + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + return [this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax, this.xmin, this.ymin]; } + return P; } - - function initialize() { - if (!nodes) return; - var i, n = nodes.length; - strengths = new Array(n); - yz = new Array(n); - for (i = 0; i < n; ++i) { - strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + _clipSegment(x0, y0, x1, y1, c0, c1) { + while (true) { + if (c0 === 0 && c1 === 0) return [x0, y0, x1, y1]; + if (c0 & c1) return null; + let x, y, c = c0 || c1; + if (c & 0b1000) x = x0 + (x1 - x0) * (this.ymax - y0) / (y1 - y0), y = this.ymax; + else if (c & 0b0100) x = x0 + (x1 - x0) * (this.ymin - y0) / (y1 - y0), y = this.ymin; + else if (c & 0b0010) y = y0 + (y1 - y0) * (this.xmax - x0) / (x1 - x0), x = this.xmax; + else y = y0 + (y1 - y0) * (this.xmin - x0) / (x1 - x0), x = this.xmin; + if (c0) x0 = x, y0 = y, c0 = this._regioncode(x0, y0); + else x1 = x, y1 = y, c1 = this._regioncode(x1, y1); } } - - force.initialize = function(_) { - nodes = _; - initialize(); - }; - - force.strength = function(_) { - return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; - }; - - force.y = function(_) { - return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; - }; - - return force; -} - -exports.forceCenter = center; -exports.forceCollide = collide; -exports.forceLink = link; -exports.forceManyBody = manyBody; -exports.forceRadial = radial; -exports.forceSimulation = simulation; -exports.forceX = x$2; -exports.forceY = y$2; - -Object.defineProperty(exports, '__esModule', { value: true }); - -})); -}); - -var d3Format = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-format/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, (function (exports) { -function formatDecimal(x) { - return Math.abs(x = Math.round(x)) >= 1e21 - ? x.toLocaleString("en").replace(/,/g, "") - : x.toString(10); -} - -// Computes the decimal coefficient and exponent of the specified number x with -// significant digits p, where x is positive and p is in [1, 21] or undefined. -// For example, formatDecimalParts(1.23) returns ["123", 0]. -function formatDecimalParts(x, p) { - if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity - var i, coefficient = x.slice(0, i); - - // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ - // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). - return [ - coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, - +x.slice(i + 1) - ]; -} - -function exponent(x) { - return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN; -} - -function formatGroup(grouping, thousands) { - return function(value, width) { - var i = value.length, - t = [], - j = 0, - g = grouping[0], - length = 0; - - while (i > 0 && g > 0) { - if (length + g + 1 > width) g = Math.max(1, width - length); - t.push(value.substring(i -= g, i + g)); - if ((length += g + 1) > width) break; - g = grouping[j = (j + 1) % grouping.length]; + _clipInfinite(i, points, vx0, vy0, vxn, vyn) { + let P = Array.from(points), p; + if (p = this._project(P[0], P[1], vx0, vy0)) P.unshift(p[0], p[1]); + if (p = this._project(P[P.length - 2], P[P.length - 1], vxn, vyn)) P.push(p[0], p[1]); + if (P = this._clipFinite(i, P)) { + for (let j = 0, n = P.length, c0, c1 = this._edgecode(P[n - 2], P[n - 1]); j < n; j += 2) { + c0 = c1, c1 = this._edgecode(P[j], P[j + 1]); + if (c0 && c1) j = this._edge(i, c0, c1, P, j), n = P.length; + } + } else if (this.contains(i, (this.xmin + this.xmax) / 2, (this.ymin + this.ymax) / 2)) { + P = [this.xmin, this.ymin, this.xmax, this.ymin, this.xmax, this.ymax, this.xmin, this.ymax]; } - - return t.reverse().join(thousands); - }; -} - -function formatNumerals(numerals) { - return function(value) { - return value.replace(/[0-9]/g, function(i) { - return numerals[+i]; - }); - }; -} - -// [[fill]align][sign][symbol][0][width][,][.precision][~][type] -var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; - -function formatSpecifier(specifier) { - if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); - var match; - return new FormatSpecifier({ - fill: match[1], - align: match[2], - sign: match[3], - symbol: match[4], - zero: match[5], - width: match[6], - comma: match[7], - precision: match[8] && match[8].slice(1), - trim: match[9], - type: match[10] - }); -} - -formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof - -function FormatSpecifier(specifier) { - this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; - this.align = specifier.align === undefined ? ">" : specifier.align + ""; - this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; - this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; - this.zero = !!specifier.zero; - this.width = specifier.width === undefined ? undefined : +specifier.width; - this.comma = !!specifier.comma; - this.precision = specifier.precision === undefined ? undefined : +specifier.precision; - this.trim = !!specifier.trim; - this.type = specifier.type === undefined ? "" : specifier.type + ""; -} - -FormatSpecifier.prototype.toString = function() { - return this.fill - + this.align - + this.sign - + this.symbol - + (this.zero ? "0" : "") - + (this.width === undefined ? "" : Math.max(1, this.width | 0)) - + (this.comma ? "," : "") - + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) - + (this.trim ? "~" : "") - + this.type; -}; - -// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. -function formatTrim(s) { - out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { - switch (s[i]) { - case ".": i0 = i1 = i; break; - case "0": if (i0 === 0) i0 = i; i1 = i; break; - default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; + return P; + } + _edge(i, e0, e1, P, j) { + while (e0 !== e1) { + let x, y; + switch (e0) { + case 0b0101: e0 = 0b0100; continue; // top-left + case 0b0100: e0 = 0b0110, x = this.xmax, y = this.ymin; break; // top + case 0b0110: e0 = 0b0010; continue; // top-right + case 0b0010: e0 = 0b1010, x = this.xmax, y = this.ymax; break; // right + case 0b1010: e0 = 0b1000; continue; // bottom-right + case 0b1000: e0 = 0b1001, x = this.xmin, y = this.ymax; break; // bottom + case 0b1001: e0 = 0b0001; continue; // bottom-left + case 0b0001: e0 = 0b0101, x = this.xmin, y = this.ymin; break; // left + } + if ((P[j] !== x || P[j + 1] !== y) && this.contains(i, x, y)) { + P.splice(j, 0, x, y), j += 2; + } + } + if (P.length > 4) { + for (let i = 0; i < P.length; i+= 2) { + const j = (i + 2) % P.length, k = (i + 4) % P.length; + if (P[i] === P[j] && P[j] === P[k] + || P[i + 1] === P[j + 1] && P[j + 1] === P[k + 1]) + P.splice(j, 2), i -= 2; + } } + return j; + } + _project(x0, y0, vx, vy) { + let t = Infinity, c, x, y; + if (vy < 0) { // top + if (y0 <= this.ymin) return null; + if ((c = (this.ymin - y0) / vy) < t) y = this.ymin, x = x0 + (t = c) * vx; + } else if (vy > 0) { // bottom + if (y0 >= this.ymax) return null; + if ((c = (this.ymax - y0) / vy) < t) y = this.ymax, x = x0 + (t = c) * vx; + } + if (vx > 0) { // right + if (x0 >= this.xmax) return null; + if ((c = (this.xmax - x0) / vx) < t) x = this.xmax, y = y0 + (t = c) * vy; + } else if (vx < 0) { // left + if (x0 <= this.xmin) return null; + if ((c = (this.xmin - x0) / vx) < t) x = this.xmin, y = y0 + (t = c) * vy; + } + return [x, y]; + } + _edgecode(x, y) { + return (x === this.xmin ? 0b0001 + : x === this.xmax ? 0b0010 : 0b0000) + | (y === this.ymin ? 0b0100 + : y === this.ymax ? 0b1000 : 0b0000); + } + _regioncode(x, y) { + return (x < this.xmin ? 0b0001 + : x > this.xmax ? 0b0010 : 0b0000) + | (y < this.ymin ? 0b0100 + : y > this.ymax ? 0b1000 : 0b0000); } - return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; } -var prefixExponent; +const tau = 2 * Math.PI, pow = Math.pow; -function formatPrefixAuto(x, p) { - var d = formatDecimalParts(x, p); - if (!d) return x + ""; - var coefficient = d[0], - exponent = d[1], - i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, - n = coefficient.length; - return i === n ? coefficient - : i > n ? coefficient + new Array(i - n + 1).join("0") - : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) - : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! +function pointX(p) { + return p[0]; } -function formatRounded(x, p) { - var d = formatDecimalParts(x, p); - if (!d) return x + ""; - var coefficient = d[0], - exponent = d[1]; - return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient - : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) - : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +function pointY(p) { + return p[1]; } -var formatTypes = { - "%": (x, p) => (x * 100).toFixed(p), - "b": (x) => Math.round(x).toString(2), - "c": (x) => x + "", - "d": formatDecimal, - "e": (x, p) => x.toExponential(p), - "f": (x, p) => x.toFixed(p), - "g": (x, p) => x.toPrecision(p), - "o": (x) => Math.round(x).toString(8), - "p": (x, p) => formatRounded(x * 100, p), - "r": formatRounded, - "s": formatPrefixAuto, - "X": (x) => Math.round(x).toString(16).toUpperCase(), - "x": (x) => Math.round(x).toString(16) -}; - -function identity(x) { - return x; +// A triangulation is collinear if all its triangles have a non-null area +function collinear(d) { + const {triangles, coords} = d; + for (let i = 0; i < triangles.length; i += 3) { + const a = 2 * triangles[i], + b = 2 * triangles[i + 1], + c = 2 * triangles[i + 2], + cross = (coords[c] - coords[a]) * (coords[b + 1] - coords[a + 1]) + - (coords[b] - coords[a]) * (coords[c + 1] - coords[a + 1]); + if (cross > 1e-10) return false; + } + return true; } -var map = Array.prototype.map, - prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; - -function formatLocale(locale) { - var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), - currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", - currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", - decimal = locale.decimal === undefined ? "." : locale.decimal + "", - numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), - percent = locale.percent === undefined ? "%" : locale.percent + "", - minus = locale.minus === undefined ? "−" : locale.minus + "", - nan = locale.nan === undefined ? "NaN" : locale.nan + ""; - - function newFormat(specifier) { - specifier = formatSpecifier(specifier); - - var fill = specifier.fill, - align = specifier.align, - sign = specifier.sign, - symbol = specifier.symbol, - zero = specifier.zero, - width = specifier.width, - comma = specifier.comma, - precision = specifier.precision, - trim = specifier.trim, - type = specifier.type; - - // The "n" type is an alias for ",g". - if (type === "n") comma = true, type = "g"; - - // The "" type, and any invalid type, is an alias for ".12~g". - else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; - - // If zero fill is specified, padding goes after sign and before digits. - if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; - - // Compute the prefix and suffix. - // For SI-prefix, the suffix is lazily computed. - var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", - suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; - - // What format function should we use? - // Is this an integer type? - // Can this type generate exponential notation? - var formatType = formatTypes[type], - maybeSuffix = /[defgprs%]/.test(type); - - // Set the default precision if not specified, - // or clamp the specified precision to the supported range. - // For significant precision, it must be in [1, 21]. - // For fixed precision, it must be in [0, 20]. - precision = precision === undefined ? 6 - : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) - : Math.max(0, Math.min(20, precision)); - - function format(value) { - var valuePrefix = prefix, - valueSuffix = suffix, - i, n, c; +function jitter(x, y, r) { + return [x + Math.sin(x + y) * r, y + Math.cos(x - y) * r]; +} - if (type === "c") { - valueSuffix = formatType(value) + valueSuffix; - value = ""; - } else { - value = +value; +class Delaunay { + static from(points, fx = pointX, fy = pointY, that) { + return new Delaunay("length" in points + ? flatArray(points, fx, fy, that) + : Float64Array.from(flatIterable(points, fx, fy, that))); + } + constructor(points) { + this._delaunator = new Delaunator(points); + this.inedges = new Int32Array(points.length / 2); + this._hullIndex = new Int32Array(points.length / 2); + this.points = this._delaunator.coords; + this._init(); + } + update() { + this._delaunator.update(); + this._init(); + return this; + } + _init() { + const d = this._delaunator, points = this.points; - // Determine the sign. -0 is not less than 0, but 1 / -0 is! - var valueNegative = value < 0 || 1 / value < 0; + // check for collinear + if (d.hull && d.hull.length > 2 && collinear(d)) { + this.collinear = Int32Array.from({length: points.length/2}, (_,i) => i) + .sort((i, j) => points[2 * i] - points[2 * j] || points[2 * i + 1] - points[2 * j + 1]); // for exact neighbors + const e = this.collinear[0], f = this.collinear[this.collinear.length - 1], + bounds = [ points[2 * e], points[2 * e + 1], points[2 * f], points[2 * f + 1] ], + r = 1e-8 * Math.hypot(bounds[3] - bounds[1], bounds[2] - bounds[0]); + for (let i = 0, n = points.length / 2; i < n; ++i) { + const p = jitter(points[2 * i], points[2 * i + 1], r); + points[2 * i] = p[0]; + points[2 * i + 1] = p[1]; + } + this._delaunator = new Delaunator(points); + } else { + delete this.collinear; + } - // Perform the initial formatting. - value = isNaN(value) ? nan : formatType(Math.abs(value), precision); + const halfedges = this.halfedges = this._delaunator.halfedges; + const hull = this.hull = this._delaunator.hull; + const triangles = this.triangles = this._delaunator.triangles; + const inedges = this.inedges.fill(-1); + const hullIndex = this._hullIndex.fill(-1); - // Trim insignificant zeros. - if (trim) value = formatTrim(value); + // Compute an index from each point to an (arbitrary) incoming halfedge + // Used to give the first neighbor of each point; for this reason, + // on the hull we give priority to exterior halfedges + for (let e = 0, n = halfedges.length; e < n; ++e) { + const p = triangles[e % 3 === 2 ? e - 2 : e + 1]; + if (halfedges[e] === -1 || inedges[p] === -1) inedges[p] = e; + } + for (let i = 0, n = hull.length; i < n; ++i) { + hullIndex[hull[i]] = i; + } - // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. - if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; + // degenerate case: 1 or 2 (distinct) points + if (hull.length <= 2 && hull.length > 0) { + this.triangles = new Int32Array(3).fill(-1); + this.halfedges = new Int32Array(3).fill(-1); + this.triangles[0] = hull[0]; + this.triangles[1] = hull[1]; + this.triangles[2] = hull[1]; + inedges[hull[0]] = 1; + if (hull.length === 2) inedges[hull[1]] = 0; + } + } + voronoi(bounds) { + return new Voronoi(this, bounds); + } + *neighbors(i) { + const {inedges, hull, _hullIndex, halfedges, triangles, collinear} = this; - // Compute the prefix and suffix. - valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; - valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); + // degenerate case with several collinear points + if (collinear) { + const l = collinear.indexOf(i); + if (l > 0) yield collinear[l - 1]; + if (l < collinear.length - 1) yield collinear[l + 1]; + return; + } - // Break the formatted value into the integer “value” part that can be - // grouped, and fractional or exponential “suffix” part that is not. - if (maybeSuffix) { - i = -1, n = value.length; - while (++i < n) { - if (c = value.charCodeAt(i), 48 > c || c > 57) { - valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; - value = value.slice(0, i); - break; - } - } + const e0 = inedges[i]; + if (e0 === -1) return; // coincident point + let e = e0, p0 = -1; + do { + yield p0 = triangles[e]; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) return; // bad triangulation + e = halfedges[e]; + if (e === -1) { + const p = hull[(_hullIndex[i] + 1) % hull.length]; + if (p !== p0) yield p; + return; + } + } while (e !== e0); + } + find(x, y, i = 0) { + if ((x = +x, x !== x) || (y = +y, y !== y)) return -1; + const i0 = i; + let c; + while ((c = this._step(i, x, y)) >= 0 && c !== i && c !== i0) i = c; + return c; + } + _step(i, x, y) { + const {inedges, hull, _hullIndex, halfedges, triangles, points} = this; + if (inedges[i] === -1 || !points.length) return (i + 1) % (points.length >> 1); + let c = i; + let dc = pow(x - points[i * 2], 2) + pow(y - points[i * 2 + 1], 2); + const e0 = inedges[i]; + let e = e0; + do { + let t = triangles[e]; + const dt = pow(x - points[t * 2], 2) + pow(y - points[t * 2 + 1], 2); + if (dt < dc) dc = dt, c = t; + e = e % 3 === 2 ? e - 2 : e + 1; + if (triangles[e] !== i) break; // bad triangulation + e = halfedges[e]; + if (e === -1) { + e = hull[(_hullIndex[i] + 1) % hull.length]; + if (e !== t) { + if (pow(x - points[e * 2], 2) + pow(y - points[e * 2 + 1], 2) < dc) return e; } + break; } + } while (e !== e0); + return c; + } + render(context) { + const buffer = context == null ? context = new Path : undefined; + const {points, halfedges, triangles} = this; + for (let i = 0, n = halfedges.length; i < n; ++i) { + const j = halfedges[i]; + if (j < i) continue; + const ti = triangles[i] * 2; + const tj = triangles[j] * 2; + context.moveTo(points[ti], points[ti + 1]); + context.lineTo(points[tj], points[tj + 1]); + } + this.renderHull(context); + return buffer && buffer.value(); + } + renderPoints(context, r = 2) { + const buffer = context == null ? context = new Path : undefined; + const {points} = this; + for (let i = 0, n = points.length; i < n; i += 2) { + const x = points[i], y = points[i + 1]; + context.moveTo(x + r, y); + context.arc(x, y, r, 0, tau); + } + return buffer && buffer.value(); + } + renderHull(context) { + const buffer = context == null ? context = new Path : undefined; + const {hull, points} = this; + const h = hull[0] * 2, n = hull.length; + context.moveTo(points[h], points[h + 1]); + for (let i = 1; i < n; ++i) { + const h = 2 * hull[i]; + context.lineTo(points[h], points[h + 1]); + } + context.closePath(); + return buffer && buffer.value(); + } + hullPolygon() { + const polygon = new Polygon; + this.renderHull(polygon); + return polygon.value(); + } + renderTriangle(i, context) { + const buffer = context == null ? context = new Path : undefined; + const {points, triangles} = this; + const t0 = triangles[i *= 3] * 2; + const t1 = triangles[i + 1] * 2; + const t2 = triangles[i + 2] * 2; + context.moveTo(points[t0], points[t0 + 1]); + context.lineTo(points[t1], points[t1 + 1]); + context.lineTo(points[t2], points[t2 + 1]); + context.closePath(); + return buffer && buffer.value(); + } + *trianglePolygons() { + const {triangles} = this; + for (let i = 0, n = triangles.length / 3; i < n; ++i) { + yield this.trianglePolygon(i); + } + } + trianglePolygon(i) { + const polygon = new Polygon; + this.renderTriangle(i, polygon); + return polygon.value(); + } +} - // If the fill character is not "0", grouping is applied before padding. - if (comma && !zero) value = group(value, Infinity); - - // Compute the padding. - var length = valuePrefix.length + value.length + valueSuffix.length, - padding = length < width ? new Array(width - length + 1).join(fill) : ""; +function flatArray(points, fx, fy, that) { + const n = points.length; + const array = new Float64Array(n * 2); + for (let i = 0; i < n; ++i) { + const p = points[i]; + array[i * 2] = fx.call(that, p, i, points); + array[i * 2 + 1] = fy.call(that, p, i, points); + } + return array; +} - // If the fill character is "0", grouping is applied after padding. - if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; +function* flatIterable(points, fx, fy, that) { + let i = 0; + for (const p of points) { + yield fx.call(that, p, i, points); + yield fy.call(that, p, i, points); + ++i; + } +} - // Reconstruct the final output based on the desired alignment. - switch (align) { - case "<": value = valuePrefix + value + valueSuffix + padding; break; - case "=": value = valuePrefix + padding + value + valueSuffix; break; - case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; - default: value = padding + valuePrefix + value + valueSuffix; break; - } +exports.Delaunay = Delaunay; +exports.Voronoi = Voronoi; - return numerals(value); - } +Object.defineProperty(exports, '__esModule', { value: true }); - format.toString = function() { - return specifier + ""; - }; +})); +}); - return format; - } +var d3Dsv = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-dsv/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, function (exports) { +var EOL = {}, + EOF = {}, + QUOTE = 34, + NEWLINE = 10, + RETURN = 13; - function formatPrefix(specifier, value) { - var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), - e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, - k = Math.pow(10, -e), - prefix = prefixes[8 + e / 3]; - return function(value) { - return f(k * value) + prefix; - }; - } +function objectConverter(columns) { + return new Function("d", "return {" + columns.map(function(name, i) { + return JSON.stringify(name) + ": d[" + i + "] || \"\""; + }).join(",") + "}"); +} - return { - format: newFormat, - formatPrefix: formatPrefix +function customConverter(columns, f) { + var object = objectConverter(columns); + return function(row, i) { + return f(object(row), i, columns); }; } -var locale; +// Compute unique columns in order of discovery. +function inferColumns(rows) { + var columnSet = Object.create(null), + columns = []; -defaultLocale({ - thousands: ",", - grouping: [3], - currency: ["$", ""] -}); + rows.forEach(function(row) { + for (var column in row) { + if (!(column in columnSet)) { + columns.push(columnSet[column] = column); + } + } + }); -function defaultLocale(definition) { - locale = formatLocale(definition); - exports.format = locale.format; - exports.formatPrefix = locale.formatPrefix; - return locale; + return columns; } -function precisionFixed(step) { - return Math.max(0, -exponent(Math.abs(step))); +function pad(value, width) { + var s = value + "", length = s.length; + return length < width ? new Array(width - length + 1).join(0) + s : s; } -function precisionPrefix(step, value) { - return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); +function formatYear(year) { + return year < 0 ? "-" + pad(-year, 6) + : year > 9999 ? "+" + pad(year, 6) + : pad(year, 4); } -function precisionRound(step, max) { - step = Math.abs(step), max = Math.abs(max) - step; - return Math.max(0, exponent(max) - exponent(step)) + 1; +function formatDate(date) { + var hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + return isNaN(date) ? "Invalid Date" + : formatYear(date.getUTCFullYear()) + "-" + pad(date.getUTCMonth() + 1, 2) + "-" + pad(date.getUTCDate(), 2) + + (milliseconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "." + pad(milliseconds, 3) + "Z" + : seconds ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + ":" + pad(seconds, 2) + "Z" + : minutes || hours ? "T" + pad(hours, 2) + ":" + pad(minutes, 2) + "Z" + : ""); } -exports.FormatSpecifier = FormatSpecifier; -exports.formatDefaultLocale = defaultLocale; -exports.formatLocale = formatLocale; -exports.formatSpecifier = formatSpecifier; -exports.precisionFixed = precisionFixed; -exports.precisionPrefix = precisionPrefix; -exports.precisionRound = precisionRound; +function dsv(delimiter) { + var reFormat = new RegExp("[\"" + delimiter + "\n\r]"), + DELIMITER = delimiter.charCodeAt(0); -Object.defineProperty(exports, '__esModule', { value: true }); + function parse(text, f) { + var convert, columns, rows = parseRows(text, function(row, i) { + if (convert) return convert(row, i - 1); + columns = row, convert = f ? customConverter(row, f) : objectConverter(row); + }); + rows.columns = columns || []; + return rows; + } -}))); -}); + function parseRows(text, f) { + var rows = [], // output rows + N = text.length, + I = 0, // current character index + n = 0, // current line number + t, // current token + eof = N <= 0, // current token followed by EOF? + eol = false; // current token followed by EOL? -var d3Geo = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-geo/ v2.0.2 Copyright 2021 Mike Bostock -(function (global, factory) { -factory(exports, d3Array) ; -}(commonjsGlobal, function (exports, d3Array) { -var epsilon = 1e-6; -var epsilon2 = 1e-12; -var pi = Math.PI; -var halfPi = pi / 2; -var quarterPi = pi / 4; -var tau = pi * 2; + // Strip the trailing newline. + if (text.charCodeAt(N - 1) === NEWLINE) --N; + if (text.charCodeAt(N - 1) === RETURN) --N; -var degrees = 180 / pi; -var radians = pi / 180; + function token() { + if (eof) return EOF; + if (eol) return eol = false, EOL; -var abs = Math.abs; -var atan = Math.atan; -var atan2 = Math.atan2; -var cos = Math.cos; -var ceil = Math.ceil; -var exp = Math.exp; -var hypot = Math.hypot; -var log = Math.log; -var pow = Math.pow; -var sin = Math.sin; -var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; -var sqrt = Math.sqrt; -var tan = Math.tan; + // Unescape quotes. + var i, j = I, c; + if (text.charCodeAt(j) === QUOTE) { + while (I++ < N && text.charCodeAt(I) !== QUOTE || text.charCodeAt(++I) === QUOTE); + if ((i = I) >= N) eof = true; + else if ((c = text.charCodeAt(I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + return text.slice(j + 1, i - 1).replace(/""/g, "\""); + } -function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); -} + // Find next delimiter or newline. + while (I < N) { + if ((c = text.charCodeAt(i = I++)) === NEWLINE) eol = true; + else if (c === RETURN) { eol = true; if (text.charCodeAt(I) === NEWLINE) ++I; } + else if (c !== DELIMITER) continue; + return text.slice(j, i); + } -function asin(x) { - return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); -} + // Return last token before EOF. + return eof = true, text.slice(j, N); + } -function haversin(x) { - return (x = sin(x / 2)) * x; -} + while ((t = token()) !== EOF) { + var row = []; + while (t !== EOL && t !== EOF) row.push(t), t = token(); + if (f && (row = f(row, n++)) == null) continue; + rows.push(row); + } -function noop() {} + return rows; + } -function streamGeometry(geometry, stream) { - if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { - streamGeometryType[geometry.type](geometry, stream); + function preformatBody(rows, columns) { + return rows.map(function(row) { + return columns.map(function(column) { + return formatValue(row[column]); + }).join(delimiter); + }); } -} -var streamObjectType = { - Feature: function(object, stream) { - streamGeometry(object.geometry, stream); - }, - FeatureCollection: function(object, stream) { - var features = object.features, i = -1, n = features.length; - while (++i < n) streamGeometry(features[i].geometry, stream); + function format(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return [columns.map(formatValue).join(delimiter)].concat(preformatBody(rows, columns)).join("\n"); } -}; -var streamGeometryType = { - Sphere: function(object, stream) { - stream.sphere(); - }, - Point: function(object, stream) { - object = object.coordinates; - stream.point(object[0], object[1], object[2]); - }, - MultiPoint: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); - }, - LineString: function(object, stream) { - streamLine(object.coordinates, stream, 0); - }, - MultiLineString: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) streamLine(coordinates[i], stream, 0); - }, - Polygon: function(object, stream) { - streamPolygon(object.coordinates, stream); - }, - MultiPolygon: function(object, stream) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) streamPolygon(coordinates[i], stream); - }, - GeometryCollection: function(object, stream) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) streamGeometry(geometries[i], stream); + function formatBody(rows, columns) { + if (columns == null) columns = inferColumns(rows); + return preformatBody(rows, columns).join("\n"); } -}; -function streamLine(coordinates, stream, closed) { - var i = -1, n = coordinates.length - closed, coordinate; - stream.lineStart(); - while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); - stream.lineEnd(); -} + function formatRows(rows) { + return rows.map(formatRow).join("\n"); + } -function streamPolygon(coordinates, stream) { - var i = -1, n = coordinates.length; - stream.polygonStart(); - while (++i < n) streamLine(coordinates[i], stream, 1); - stream.polygonEnd(); -} + function formatRow(row) { + return row.map(formatValue).join(delimiter); + } -function geoStream(object, stream) { - if (object && streamObjectType.hasOwnProperty(object.type)) { - streamObjectType[object.type](object, stream); - } else { - streamGeometry(object, stream); + function formatValue(value) { + return value == null ? "" + : value instanceof Date ? formatDate(value) + : reFormat.test(value += "") ? "\"" + value.replace(/"/g, "\"\"") + "\"" + : value; } -} -var areaRingSum = new d3Array.Adder(); + return { + parse: parse, + parseRows: parseRows, + format: format, + formatBody: formatBody, + formatRows: formatRows, + formatRow: formatRow, + formatValue: formatValue + }; +} -// hello? +var csv = dsv(","); -var areaSum = new d3Array.Adder(), - lambda00, - phi00, - lambda0, - cosPhi0, - sinPhi0; +var csvParse = csv.parse; +var csvParseRows = csv.parseRows; +var csvFormat = csv.format; +var csvFormatBody = csv.formatBody; +var csvFormatRows = csv.formatRows; +var csvFormatRow = csv.formatRow; +var csvFormatValue = csv.formatValue; -var areaStream = { - point: noop, - lineStart: noop, - lineEnd: noop, - polygonStart: function() { - areaRingSum = new d3Array.Adder(); - areaStream.lineStart = areaRingStart; - areaStream.lineEnd = areaRingEnd; - }, - polygonEnd: function() { - var areaRing = +areaRingSum; - areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); - this.lineStart = this.lineEnd = this.point = noop; - }, - sphere: function() { - areaSum.add(tau); - } -}; +var tsv = dsv("\t"); -function areaRingStart() { - areaStream.point = areaPointFirst; -} +var tsvParse = tsv.parse; +var tsvParseRows = tsv.parseRows; +var tsvFormat = tsv.format; +var tsvFormatBody = tsv.formatBody; +var tsvFormatRows = tsv.formatRows; +var tsvFormatRow = tsv.formatRow; +var tsvFormatValue = tsv.formatValue; -function areaRingEnd() { - areaPoint(lambda00, phi00); +function autoType(object) { + for (var key in object) { + var value = object[key].trim(), number, m; + if (!value) value = null; + else if (value === "true") value = true; + else if (value === "false") value = false; + else if (value === "NaN") value = NaN; + else if (!isNaN(number = +value)) value = number; + else if (m = value.match(/^([-+]\d{2})?\d{4}(-\d{2}(-\d{2})?)?(T\d{2}:\d{2}(:\d{2}(\.\d{3})?)?(Z|[-+]\d{2}:\d{2})?)?$/)) { + if (fixtz && !!m[4] && !m[7]) value = value.replace(/-/g, "/").replace(/T/, " "); + value = new Date(value); + } + else continue; + object[key] = value; + } + return object; } -function areaPointFirst(lambda, phi) { - areaStream.point = areaPoint; - lambda00 = lambda, phi00 = phi; - lambda *= radians, phi *= radians; - lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); -} +// https://github.com/d3/d3-dsv/issues/45 +const fixtz = new Date("2019-01-01T00:00").getHours() || new Date("2019-07-01T00:00").getHours(); -function areaPoint(lambda, phi) { - lambda *= radians, phi *= radians; - phi = phi / 2 + quarterPi; // half the angular distance from south pole +exports.autoType = autoType; +exports.csvFormat = csvFormat; +exports.csvFormatBody = csvFormatBody; +exports.csvFormatRow = csvFormatRow; +exports.csvFormatRows = csvFormatRows; +exports.csvFormatValue = csvFormatValue; +exports.csvParse = csvParse; +exports.csvParseRows = csvParseRows; +exports.dsvFormat = dsv; +exports.tsvFormat = tsvFormat; +exports.tsvFormatBody = tsvFormatBody; +exports.tsvFormatRow = tsvFormatRow; +exports.tsvFormatRows = tsvFormatRows; +exports.tsvFormatValue = tsvFormatValue; +exports.tsvParse = tsvParse; +exports.tsvParseRows = tsvParseRows; - // Spherical excess E for a spherical triangle with vertices: south pole, - // previous point, current point. Uses a formula derived from Cagnoli’s - // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). - var dLambda = lambda - lambda0, - sdLambda = dLambda >= 0 ? 1 : -1, - adLambda = sdLambda * dLambda, - cosPhi = cos(phi), - sinPhi = sin(phi), - k = sinPhi0 * sinPhi, - u = cosPhi0 * cosPhi + k * cos(adLambda), - v = k * sdLambda * sin(adLambda); - areaRingSum.add(atan2(v, u)); +Object.defineProperty(exports, '__esModule', { value: true }); - // Advance the previous points. - lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; -} +})); +}); -function area(object) { - areaSum = new d3Array.Adder(); - geoStream(object, areaStream); - return areaSum * 2; +var d3Fetch = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-fetch/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Dsv) ; +}(commonjsGlobal, function (exports, d3Dsv) { +function responseBlob(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.blob(); } -function spherical(cartesian) { - return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; +function blob(input, init) { + return fetch(input, init).then(responseBlob); } -function cartesian(spherical) { - var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); - return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; +function responseArrayBuffer(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.arrayBuffer(); } -function cartesianDot(a, b) { - return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; +function buffer(input, init) { + return fetch(input, init).then(responseArrayBuffer); } -function cartesianCross(a, b) { - return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; +function responseText(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + return response.text(); } -// TODO return a -function cartesianAddInPlace(a, b) { - a[0] += b[0], a[1] += b[1], a[2] += b[2]; +function text(input, init) { + return fetch(input, init).then(responseText); } -function cartesianScale(vector, k) { - return [vector[0] * k, vector[1] * k, vector[2] * k]; +function dsvParse(parse) { + return function(input, init, row) { + if (arguments.length === 2 && typeof init === "function") row = init, init = undefined; + return text(input, init).then(function(response) { + return parse(response, row); + }); + }; } -// TODO return d -function cartesianNormalizeInPlace(d) { - var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); - d[0] /= l, d[1] /= l, d[2] /= l; +function dsv(delimiter, input, init, row) { + if (arguments.length === 3 && typeof init === "function") row = init, init = undefined; + var format = d3Dsv.dsvFormat(delimiter); + return text(input, init).then(function(response) { + return format.parse(response, row); + }); } -var lambda0$1, phi0, lambda1, phi1, // bounds - lambda2, // previous lambda-coordinate - lambda00$1, phi00$1, // first point - p0, // previous 3D point - deltaSum, - ranges, - range; - -var boundsStream = { - point: boundsPoint, - lineStart: boundsLineStart, - lineEnd: boundsLineEnd, - polygonStart: function() { - boundsStream.point = boundsRingPoint; - boundsStream.lineStart = boundsRingStart; - boundsStream.lineEnd = boundsRingEnd; - deltaSum = new d3Array.Adder(); - areaStream.polygonStart(); - }, - polygonEnd: function() { - areaStream.polygonEnd(); - boundsStream.point = boundsPoint; - boundsStream.lineStart = boundsLineStart; - boundsStream.lineEnd = boundsLineEnd; - if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); - else if (deltaSum > epsilon) phi1 = 90; - else if (deltaSum < -epsilon) phi0 = -90; - range[0] = lambda0$1, range[1] = lambda1; - }, - sphere: function() { - lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); - } -}; +var csv = dsvParse(d3Dsv.csvParse); +var tsv = dsvParse(d3Dsv.tsvParse); -function boundsPoint(lambda, phi) { - ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); - if (phi < phi0) phi0 = phi; - if (phi > phi1) phi1 = phi; +function image(input, init) { + return new Promise(function(resolve, reject) { + var image = new Image; + for (var key in init) image[key] = init[key]; + image.onerror = reject; + image.onload = function() { resolve(image); }; + image.src = input; + }); } -function linePoint(lambda, phi) { - var p = cartesian([lambda * radians, phi * radians]); - if (p0) { - var normal = cartesianCross(p0, p), - equatorial = [normal[1], -normal[0], 0], - inflection = cartesianCross(equatorial, normal); - cartesianNormalizeInPlace(inflection); - inflection = spherical(inflection); - var delta = lambda - lambda2, - sign = delta > 0 ? 1 : -1, - lambdai = inflection[0] * degrees * sign, - phii, - antimeridian = abs(delta) > 180; - if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = inflection[1] * degrees; - if (phii > phi1) phi1 = phii; - } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { - phii = -inflection[1] * degrees; - if (phii < phi0) phi0 = phii; - } else { - if (phi < phi0) phi0 = phi; - if (phi > phi1) phi1 = phi; - } - if (antimeridian) { - if (lambda < lambda2) { - if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; - } else { - if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; - } - } else { - if (lambda1 >= lambda0$1) { - if (lambda < lambda0$1) lambda0$1 = lambda; - if (lambda > lambda1) lambda1 = lambda; - } else { - if (lambda > lambda2) { - if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; - } else { - if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; - } - } - } - } else { - ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); - } - if (phi < phi0) phi0 = phi; - if (phi > phi1) phi1 = phi; - p0 = p, lambda2 = lambda; +function responseJson(response) { + if (!response.ok) throw new Error(response.status + " " + response.statusText); + if (response.status === 204 || response.status === 205) return; + return response.json(); } -function boundsLineStart() { - boundsStream.point = linePoint; +function json(input, init) { + return fetch(input, init).then(responseJson); } -function boundsLineEnd() { - range[0] = lambda0$1, range[1] = lambda1; - boundsStream.point = boundsPoint; - p0 = null; +function parser(type) { + return (input, init) => text(input, init) + .then(text => (new DOMParser).parseFromString(text, type)); } -function boundsRingPoint(lambda, phi) { - if (p0) { - var delta = lambda - lambda2; - deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); - } else { - lambda00$1 = lambda, phi00$1 = phi; - } - areaStream.point(lambda, phi); - linePoint(lambda, phi); -} +var xml = parser("application/xml"); -function boundsRingStart() { - areaStream.lineStart(); -} +var html = parser("text/html"); -function boundsRingEnd() { - boundsRingPoint(lambda00$1, phi00$1); - areaStream.lineEnd(); - if (abs(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180); - range[0] = lambda0$1, range[1] = lambda1; - p0 = null; -} +var svg = parser("image/svg+xml"); -// Finds the left-right distance between two longitudes. -// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want -// the distance between ±180° to be 360°. -function angle(lambda0, lambda1) { - return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; -} +exports.blob = blob; +exports.buffer = buffer; +exports.csv = csv; +exports.dsv = dsv; +exports.html = html; +exports.image = image; +exports.json = json; +exports.svg = svg; +exports.text = text; +exports.tsv = tsv; +exports.xml = xml; -function rangeCompare(a, b) { - return a[0] - b[0]; -} +Object.defineProperty(exports, '__esModule', { value: true }); -function rangeContains(range, x) { - return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; -} +})); +}); -function bounds(feature) { - var i, n, a, b, merged, deltaMax, delta; +var d3Quadtree = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-quadtree/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, function (exports) { +function tree_add(d) { + const x = +this._x.call(null, d), + y = +this._y.call(null, d); + return add(this.cover(x, y), x, y, d); +} - phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); - ranges = []; - geoStream(feature, boundsStream); +function add(tree, x, y, d) { + if (isNaN(x) || isNaN(y)) return tree; // ignore invalid points - // First, sort ranges by their minimum longitudes. - if (n = ranges.length) { - ranges.sort(rangeCompare); + var parent, + node = tree._root, + leaf = {data: d}, + x0 = tree._x0, + y0 = tree._y0, + x1 = tree._x1, + y1 = tree._y1, + xm, + ym, + xp, + yp, + right, + bottom, + i, + j; - // Then, merge any ranges that overlap. - for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { - b = ranges[i]; - if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { - if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; - if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; - } else { - merged.push(a = b); - } - } + // If the tree is empty, initialize the root as a leaf. + if (!node) return tree._root = leaf, tree; - // Finally, find the largest gap between the merged ranges. - // The final bounding box will be the inverse of this gap. - for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { - b = merged[i]; - if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; - } + // Find the existing leaf for the new point, or add it. + while (node.length) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (parent = node, !(node = node[i = bottom << 1 | right])) return parent[i] = leaf, tree; } - ranges = range = null; + // Is the new point is exactly coincident with the existing point? + xp = +tree._x.call(null, node.data); + yp = +tree._y.call(null, node.data); + if (x === xp && y === yp) return leaf.next = node, parent ? parent[i] = leaf : tree._root = leaf, tree; - return lambda0$1 === Infinity || phi0 === Infinity - ? [[NaN, NaN], [NaN, NaN]] - : [[lambda0$1, phi0], [lambda1, phi1]]; + // Otherwise, split the leaf node until the old and new point are separated. + do { + parent = parent ? parent[i] = new Array(4) : tree._root = new Array(4); + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + } while ((i = bottom << 1 | right) === (j = (yp >= ym) << 1 | (xp >= xm))); + return parent[j] = node, parent[i] = leaf, tree; } -var W0, W1, - X0, Y0, Z0, - X1, Y1, Z1, - X2, Y2, Z2, - lambda00$2, phi00$2, // first point - x0, y0, z0; // previous point +function addAll(data) { + var d, i, n = data.length, + x, + y, + xz = new Array(n), + yz = new Array(n), + x0 = Infinity, + y0 = Infinity, + x1 = -Infinity, + y1 = -Infinity; -var centroidStream = { - sphere: noop, - point: centroidPoint, - lineStart: centroidLineStart, - lineEnd: centroidLineEnd, - polygonStart: function() { - centroidStream.lineStart = centroidRingStart; - centroidStream.lineEnd = centroidRingEnd; - }, - polygonEnd: function() { - centroidStream.lineStart = centroidLineStart; - centroidStream.lineEnd = centroidLineEnd; + // Compute the points and their extent. + for (i = 0; i < n; ++i) { + if (isNaN(x = +this._x.call(null, d = data[i])) || isNaN(y = +this._y.call(null, d))) continue; + xz[i] = x; + yz[i] = y; + if (x < x0) x0 = x; + if (x > x1) x1 = x; + if (y < y0) y0 = y; + if (y > y1) y1 = y; } -}; - -// Arithmetic mean of Cartesian vectors. -function centroidPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi); - centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); -} -function centroidPointCartesian(x, y, z) { - ++W0; - X0 += (x - X0) / W0; - Y0 += (y - Y0) / W0; - Z0 += (z - Z0) / W0; -} + // If there were no (valid) points, abort. + if (x0 > x1 || y0 > y1) return this; -function centroidLineStart() { - centroidStream.point = centroidLinePointFirst; -} + // Expand the tree to cover the new points. + this.cover(x0, y0).cover(x1, y1); -function centroidLinePointFirst(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi); - x0 = cosPhi * cos(lambda); - y0 = cosPhi * sin(lambda); - z0 = sin(phi); - centroidStream.point = centroidLinePoint; - centroidPointCartesian(x0, y0, z0); -} + // Add the new points. + for (i = 0; i < n; ++i) { + add(this, xz[i], yz[i], data[i]); + } -function centroidLinePoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi), - x = cosPhi * cos(lambda), - y = cosPhi * sin(lambda), - z = sin(phi), - w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); - W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); + return this; } -function centroidLineEnd() { - centroidStream.point = centroidPoint; -} +function tree_cover(x, y) { + if (isNaN(x = +x) || isNaN(y = +y)) return this; // ignore invalid points -// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, -// J. Applied Mechanics 42, 239 (1975). -function centroidRingStart() { - centroidStream.point = centroidRingPointFirst; -} + var x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1; -function centroidRingEnd() { - centroidRingPoint(lambda00$2, phi00$2); - centroidStream.point = centroidPoint; -} + // If the quadtree has no extent, initialize them. + // Integer extent are necessary so that if we later double the extent, + // the existing quadrant boundaries don’t change due to floating point error! + if (isNaN(x0)) { + x1 = (x0 = Math.floor(x)) + 1; + y1 = (y0 = Math.floor(y)) + 1; + } -function centroidRingPointFirst(lambda, phi) { - lambda00$2 = lambda, phi00$2 = phi; - lambda *= radians, phi *= radians; - centroidStream.point = centroidRingPoint; - var cosPhi = cos(phi); - x0 = cosPhi * cos(lambda); - y0 = cosPhi * sin(lambda); - z0 = sin(phi); - centroidPointCartesian(x0, y0, z0); -} + // Otherwise, double repeatedly to cover. + else { + var z = x1 - x0 || 1, + node = this._root, + parent, + i; -function centroidRingPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var cosPhi = cos(phi), - x = cosPhi * cos(lambda), - y = cosPhi * sin(lambda), - z = sin(phi), - cx = y0 * z - z0 * y, - cy = z0 * x - x0 * z, - cz = x0 * y - y0 * x, - m = hypot(cx, cy, cz), - w = asin(m), // line weight = angle - v = m && -w / m; // area weight multiplier - X2.add(v * cx); - Y2.add(v * cy); - Z2.add(v * cz); - W1 += w; - X1 += w * (x0 + (x0 = x)); - Y1 += w * (y0 + (y0 = y)); - Z1 += w * (z0 + (z0 = z)); - centroidPointCartesian(x0, y0, z0); -} + while (x0 > x || x >= x1 || y0 > y || y >= y1) { + i = (y < y0) << 1 | (x < x0); + parent = new Array(4), parent[i] = node, node = parent, z *= 2; + switch (i) { + case 0: x1 = x0 + z, y1 = y0 + z; break; + case 1: x0 = x1 - z, y1 = y0 + z; break; + case 2: x1 = x0 + z, y0 = y1 - z; break; + case 3: x0 = x1 - z, y0 = y1 - z; break; + } + } -function centroid(object) { - W0 = W1 = - X0 = Y0 = Z0 = - X1 = Y1 = Z1 = 0; - X2 = new d3Array.Adder(); - Y2 = new d3Array.Adder(); - Z2 = new d3Array.Adder(); - geoStream(object, centroidStream); + if (this._root && this._root.length) this._root = node; + } - var x = +X2, - y = +Y2, - z = +Z2, - m = hypot(x, y, z); + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + return this; +} - // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. - if (m < epsilon2) { - x = X1, y = Y1, z = Z1; - // If the feature has zero length, fall back to arithmetic mean of point vectors. - if (W1 < epsilon) x = X0, y = Y0, z = Z0; - m = hypot(x, y, z); - // If the feature still has an undefined ccentroid, then return. - if (m < epsilon2) return [NaN, NaN]; - } +function tree_data() { + var data = []; + this.visit(function(node) { + if (!node.length) do data.push(node.data); while (node = node.next) + }); + return data; +} - return [atan2(y, x) * degrees, asin(z / m) * degrees]; +function tree_extent(_) { + return arguments.length + ? this.cover(+_[0][0], +_[0][1]).cover(+_[1][0], +_[1][1]) + : isNaN(this._x0) ? undefined : [[this._x0, this._y0], [this._x1, this._y1]]; } -function constant(x) { - return function() { - return x; - }; +function Quad(node, x0, y0, x1, y1) { + this.node = node; + this.x0 = x0; + this.y0 = y0; + this.x1 = x1; + this.y1 = y1; } -function compose(a, b) { +function tree_find(x, y, radius) { + var data, + x0 = this._x0, + y0 = this._y0, + x1, + y1, + x2, + y2, + x3 = this._x1, + y3 = this._y1, + quads = [], + node = this._root, + q, + i; - function compose(x, y) { - return x = a(x, y), b(x[0], x[1]); + if (node) quads.push(new Quad(node, x0, y0, x3, y3)); + if (radius == null) radius = Infinity; + else { + x0 = x - radius, y0 = y - radius; + x3 = x + radius, y3 = y + radius; + radius *= radius; } - if (a.invert && b.invert) compose.invert = function(x, y) { - return x = b.invert(x, y), x && a.invert(x[0], x[1]); - }; + while (q = quads.pop()) { - return compose; -} + // Stop searching if this quadrant can’t contain a closer node. + if (!(node = q.node) + || (x1 = q.x0) > x3 + || (y1 = q.y0) > y3 + || (x2 = q.x1) < x0 + || (y2 = q.y1) < y0) continue; -function rotationIdentity(lambda, phi) { - return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; -} + // Bisect the current quadrant. + if (node.length) { + var xm = (x1 + x2) / 2, + ym = (y1 + y2) / 2; -rotationIdentity.invert = rotationIdentity; + quads.push( + new Quad(node[3], xm, ym, x2, y2), + new Quad(node[2], x1, ym, xm, y2), + new Quad(node[1], xm, y1, x2, ym), + new Quad(node[0], x1, y1, xm, ym) + ); -function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { - return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) - : rotationLambda(deltaLambda)) - : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) - : rotationIdentity); -} + // Visit the closest quadrant first. + if (i = (y >= ym) << 1 | (x >= xm)) { + q = quads[quads.length - 1]; + quads[quads.length - 1] = quads[quads.length - 1 - i]; + quads[quads.length - 1 - i] = q; + } + } -function forwardRotationLambda(deltaLambda) { - return function(lambda, phi) { - return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; - }; -} + // Visit this point. (Visiting coincident points isn’t necessary!) + else { + var dx = x - +this._x.call(null, node.data), + dy = y - +this._y.call(null, node.data), + d2 = dx * dx + dy * dy; + if (d2 < radius) { + var d = Math.sqrt(radius = d2); + x0 = x - d, y0 = y - d; + x3 = x + d, y3 = y + d; + data = node.data; + } + } + } -function rotationLambda(deltaLambda) { - var rotation = forwardRotationLambda(deltaLambda); - rotation.invert = forwardRotationLambda(-deltaLambda); - return rotation; + return data; } -function rotationPhiGamma(deltaPhi, deltaGamma) { - var cosDeltaPhi = cos(deltaPhi), - sinDeltaPhi = sin(deltaPhi), - cosDeltaGamma = cos(deltaGamma), - sinDeltaGamma = sin(deltaGamma); +function tree_remove(d) { + if (isNaN(x = +this._x.call(null, d)) || isNaN(y = +this._y.call(null, d))) return this; // ignore invalid points - function rotation(lambda, phi) { - var cosPhi = cos(phi), - x = cos(lambda) * cosPhi, - y = sin(lambda) * cosPhi, - z = sin(phi), - k = z * cosDeltaPhi + x * sinDeltaPhi; - return [ - atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), - asin(k * cosDeltaGamma + y * sinDeltaGamma) - ]; + var parent, + node = this._root, + retainer, + previous, + next, + x0 = this._x0, + y0 = this._y0, + x1 = this._x1, + y1 = this._y1, + x, + y, + xm, + ym, + right, + bottom, + i, + j; + + // If the tree is empty, initialize the root as a leaf. + if (!node) return this; + + // Find the leaf node for the point. + // While descending, also retain the deepest parent with a non-removed sibling. + if (node.length) while (true) { + if (right = x >= (xm = (x0 + x1) / 2)) x0 = xm; else x1 = xm; + if (bottom = y >= (ym = (y0 + y1) / 2)) y0 = ym; else y1 = ym; + if (!(parent = node, node = node[i = bottom << 1 | right])) return this; + if (!node.length) break; + if (parent[(i + 1) & 3] || parent[(i + 2) & 3] || parent[(i + 3) & 3]) retainer = parent, j = i; } - rotation.invert = function(lambda, phi) { - var cosPhi = cos(phi), - x = cos(lambda) * cosPhi, - y = sin(lambda) * cosPhi, - z = sin(phi), - k = z * cosDeltaGamma - y * sinDeltaGamma; - return [ - atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), - asin(k * cosDeltaPhi - x * sinDeltaPhi) - ]; - }; + // Find the point to remove. + while (node.data !== d) if (!(previous = node, node = node.next)) return this; + if (next = node.next) delete node.next; - return rotation; -} + // If there are multiple coincident points, remove just the point. + if (previous) return (next ? previous.next = next : delete previous.next), this; -function rotation(rotate) { - rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); + // If this is the root point, remove it. + if (!parent) return this._root = next, this; - function forward(coordinates) { - coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; + // Remove this leaf. + next ? parent[i] = next : delete parent[i]; + + // If the parent now contains exactly one leaf, collapse superfluous parents. + if ((node = parent[0] || parent[1] || parent[2] || parent[3]) + && node === (parent[3] || parent[2] || parent[1] || parent[0]) + && !node.length) { + if (retainer) retainer[j] = node; + else this._root = node; } - forward.invert = function(coordinates) { - coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); - return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; - }; + return this; +} - return forward; +function removeAll(data) { + for (var i = 0, n = data.length; i < n; ++i) this.remove(data[i]); + return this; } -// Generates a circle centered at [0°, 0°], with a given radius and precision. -function circleStream(stream, radius, delta, direction, t0, t1) { - if (!delta) return; - var cosRadius = cos(radius), - sinRadius = sin(radius), - step = direction * delta; - if (t0 == null) { - t0 = radius + direction * tau; - t1 = radius - step / 2; - } else { - t0 = circleRadius(cosRadius, t0); - t1 = circleRadius(cosRadius, t1); - if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; - } - for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { - point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); - stream.point(point[0], point[1]); - } +function tree_root() { + return this._root; } -// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. -function circleRadius(cosRadius, point) { - point = cartesian(point), point[0] -= cosRadius; - cartesianNormalizeInPlace(point); - var radius = acos(-point[1]); - return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; +function tree_size() { + var size = 0; + this.visit(function(node) { + if (!node.length) do ++size; while (node = node.next) + }); + return size; } -function circle() { - var center = constant([0, 0]), - radius = constant(90), - precision = constant(6), - ring, - rotate, - stream = {point: point}; +function tree_visit(callback) { + var quads = [], q, node = this._root, child, x0, y0, x1, y1; + if (node) quads.push(new Quad(node, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + if (!callback(node = q.node, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1) && node.length) { + var xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + } + } + return this; +} - function point(x, y) { - ring.push(x = rotate(x, y)); - x[0] *= degrees, x[1] *= degrees; +function tree_visitAfter(callback) { + var quads = [], next = [], q; + if (this._root) quads.push(new Quad(this._root, this._x0, this._y0, this._x1, this._y1)); + while (q = quads.pop()) { + var node = q.node; + if (node.length) { + var child, x0 = q.x0, y0 = q.y0, x1 = q.x1, y1 = q.y1, xm = (x0 + x1) / 2, ym = (y0 + y1) / 2; + if (child = node[0]) quads.push(new Quad(child, x0, y0, xm, ym)); + if (child = node[1]) quads.push(new Quad(child, xm, y0, x1, ym)); + if (child = node[2]) quads.push(new Quad(child, x0, ym, xm, y1)); + if (child = node[3]) quads.push(new Quad(child, xm, ym, x1, y1)); + } + next.push(q); } - - function circle() { - var c = center.apply(this, arguments), - r = radius.apply(this, arguments) * radians, - p = precision.apply(this, arguments) * radians; - ring = []; - rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; - circleStream(stream, r, p, 1); - c = {type: "Polygon", coordinates: [ring]}; - ring = rotate = null; - return c; + while (q = next.pop()) { + callback(q.node, q.x0, q.y0, q.x1, q.y1); } + return this; +} - circle.center = function(_) { - return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; - }; +function defaultX(d) { + return d[0]; +} - circle.radius = function(_) { - return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; - }; +function tree_x(_) { + return arguments.length ? (this._x = _, this) : this._x; +} - circle.precision = function(_) { - return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; - }; +function defaultY(d) { + return d[1]; +} - return circle; +function tree_y(_) { + return arguments.length ? (this._y = _, this) : this._y; } -function clipBuffer() { - var lines = [], - line; - return { - point: function(x, y, m) { - line.push([x, y, m]); - }, - lineStart: function() { - lines.push(line = []); - }, - lineEnd: noop, - rejoin: function() { - if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); - }, - result: function() { - var result = lines; - lines = []; - line = null; - return result; - } - }; +function quadtree(nodes, x, y) { + var tree = new Quadtree(x == null ? defaultX : x, y == null ? defaultY : y, NaN, NaN, NaN, NaN); + return nodes == null ? tree : tree.addAll(nodes); } -function pointEqual(a, b) { - return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; +function Quadtree(x, y, x0, y0, x1, y1) { + this._x = x; + this._y = y; + this._x0 = x0; + this._y0 = y0; + this._x1 = x1; + this._y1 = y1; + this._root = undefined; } -function Intersection(point, points, other, entry) { - this.x = point; - this.z = points; - this.o = other; // another intersection - this.e = entry; // is an entry? - this.v = false; // visited - this.n = this.p = null; // next & previous +function leaf_copy(leaf) { + var copy = {data: leaf.data}, next = copy; + while (leaf = leaf.next) next = next.next = {data: leaf.data}; + return copy; } -// A generalized polygon clipping algorithm: given a polygon that has been cut -// into its visible line segments, and rejoins the segments by interpolating -// along the clip edge. -function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { - var subject = [], - clip = [], - i, - n; +var treeProto = quadtree.prototype = Quadtree.prototype; - segments.forEach(function(segment) { - if ((n = segment.length - 1) <= 0) return; - var n, p0 = segment[0], p1 = segment[n], x; +treeProto.copy = function() { + var copy = new Quadtree(this._x, this._y, this._x0, this._y0, this._x1, this._y1), + node = this._root, + nodes, + child; - if (pointEqual(p0, p1)) { - if (!p0[2] && !p1[2]) { - stream.lineStart(); - for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); - stream.lineEnd(); - return; + if (!node) return copy; + + if (!node.length) return copy._root = leaf_copy(node), copy; + + nodes = [{source: node, target: copy._root = new Array(4)}]; + while (node = nodes.pop()) { + for (var i = 0; i < 4; ++i) { + if (child = node.source[i]) { + if (child.length) nodes.push({source: child, target: node.target[i] = new Array(4)}); + else node.target[i] = leaf_copy(child); } - // handle degenerate cases by moving the point - p1[0] += 2 * epsilon; } + } - subject.push(x = new Intersection(p0, segment, null, true)); - clip.push(x.o = new Intersection(p0, null, x, false)); - subject.push(x = new Intersection(p1, segment, null, false)); - clip.push(x.o = new Intersection(p1, null, x, true)); - }); + return copy; +}; - if (!subject.length) return; +treeProto.add = tree_add; +treeProto.addAll = addAll; +treeProto.cover = tree_cover; +treeProto.data = tree_data; +treeProto.extent = tree_extent; +treeProto.find = tree_find; +treeProto.remove = tree_remove; +treeProto.removeAll = removeAll; +treeProto.root = tree_root; +treeProto.size = tree_size; +treeProto.visit = tree_visit; +treeProto.visitAfter = tree_visitAfter; +treeProto.x = tree_x; +treeProto.y = tree_y; - clip.sort(compareIntersection); - link(subject); - link(clip); +exports.quadtree = quadtree; - for (i = 0, n = clip.length; i < n; ++i) { - clip[i].e = startInside = !startInside; - } +Object.defineProperty(exports, '__esModule', { value: true }); - var start = subject[0], - points, - point; +})); +}); - while (1) { - // Find first unvisited intersection. - var current = start, - isSubject = true; - while (current.v) if ((current = current.n) === start) return; - points = current.z; - stream.lineStart(); - do { - current.v = current.o.v = true; - if (current.e) { - if (isSubject) { - for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.n.x, 1, stream); - } - current = current.n; - } else { - if (isSubject) { - points = current.p.z; - for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); - } else { - interpolate(current.x, current.p.x, -1, stream); - } - current = current.p; - } - current = current.o; - points = current.z; - isSubject = !isSubject; - } while (!current.v); - stream.lineEnd(); - } -} +var d3Force = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-force/ v2.1.1 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Quadtree, d3Dispatch, d3Timer) ; +}(commonjsGlobal, function (exports, d3Quadtree, d3Dispatch, d3Timer) { +function center(x, y) { + var nodes, strength = 1; -function link(array) { - if (!(n = array.length)) return; - var n, - i = 0, - a = array[0], - b; - while (++i < n) { - a.n = b = array[i]; - b.p = a; - a = b; + if (x == null) x = 0; + if (y == null) y = 0; + + function force() { + var i, + n = nodes.length, + node, + sx = 0, + sy = 0; + + for (i = 0; i < n; ++i) { + node = nodes[i], sx += node.x, sy += node.y; + } + + for (sx = (sx / n - x) * strength, sy = (sy / n - y) * strength, i = 0; i < n; ++i) { + node = nodes[i], node.x -= sx, node.y -= sy; + } } - a.n = b = array[0]; - b.p = a; + + force.initialize = function(_) { + nodes = _; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; + + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; + }; + + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; + + return force; } -function longitude(point) { - if (abs(point[0]) <= pi) - return point[0]; - else - return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); +function constant(x) { + return function() { + return x; + }; } -function polygonContains(polygon, point) { - var lambda = longitude(point), - phi = point[1], - sinPhi = sin(phi), - normal = [sin(lambda), -cos(lambda), 0], - angle = 0, - winding = 0; +function jiggle(random) { + return (random() - 0.5) * 1e-6; +} - var sum = new d3Array.Adder(); +function x(d) { + return d.x + d.vx; +} - if (sinPhi === 1) phi = halfPi + epsilon; - else if (sinPhi === -1) phi = -halfPi - epsilon; +function y(d) { + return d.y + d.vy; +} - for (var i = 0, n = polygon.length; i < n; ++i) { - if (!(m = (ring = polygon[i]).length)) continue; - var ring, - m, - point0 = ring[m - 1], - lambda0 = longitude(point0), - phi0 = point0[1] / 2 + quarterPi, - sinPhi0 = sin(phi0), - cosPhi0 = cos(phi0); +function collide(radius) { + var nodes, + radii, + random, + strength = 1, + iterations = 1; - for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { - var point1 = ring[j], - lambda1 = longitude(point1), - phi1 = point1[1] / 2 + quarterPi, - sinPhi1 = sin(phi1), - cosPhi1 = cos(phi1), - delta = lambda1 - lambda0, - sign = delta >= 0 ? 1 : -1, - absDelta = sign * delta, - antimeridian = absDelta > pi, - k = sinPhi0 * sinPhi1; + if (typeof radius !== "function") radius = constant(radius == null ? 1 : +radius); - sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); - angle += antimeridian ? delta + sign * tau : delta; + function force() { + var i, n = nodes.length, + tree, + node, + xi, + yi, + ri, + ri2; - // Are the longitudes either side of the point’s meridian (lambda), - // and are the latitudes smaller than the parallel (phi)? - if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { - var arc = cartesianCross(cartesian(point0), cartesian(point1)); - cartesianNormalizeInPlace(arc); - var intersection = cartesianCross(normal, arc); - cartesianNormalizeInPlace(intersection); - var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); - if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { - winding += antimeridian ^ delta >= 0 ? 1 : -1; - } + for (var k = 0; k < iterations; ++k) { + tree = d3Quadtree.quadtree(nodes, x, y).visitAfter(prepare); + for (i = 0; i < n; ++i) { + node = nodes[i]; + ri = radii[node.index], ri2 = ri * ri; + xi = node.x + node.vx; + yi = node.y + node.vy; + tree.visit(apply); } } - } - - // First, determine whether the South pole is inside or outside: - // - // It is inside if: - // * the polygon winds around it in a clockwise direction. - // * the polygon does not (cumulatively) wind around it, but has a negative - // (counter-clockwise) area. - // - // Second, count the (signed) number of times a segment crosses a lambda - // from the point to the South pole. If it is zero, then the point is the - // same side as the South pole. - return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ (winding & 1); -} - -function clip(pointVisible, clipLine, interpolate, start) { - return function(sink) { - var line = clipLine(sink), - ringBuffer = clipBuffer(), - ringSink = clipLine(ringBuffer), - polygonStarted = false, - polygon, - segments, - ring; - - var clip = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { - clip.point = pointRing; - clip.lineStart = ringStart; - clip.lineEnd = ringEnd; - segments = []; - polygon = []; - }, - polygonEnd: function() { - clip.point = point; - clip.lineStart = lineStart; - clip.lineEnd = lineEnd; - segments = d3Array.merge(segments); - var startInside = polygonContains(polygon, start); - if (segments.length) { - if (!polygonStarted) sink.polygonStart(), polygonStarted = true; - clipRejoin(segments, compareIntersection, startInside, interpolate, sink); - } else if (startInside) { - if (!polygonStarted) sink.polygonStart(), polygonStarted = true; - sink.lineStart(); - interpolate(null, null, 1, sink); - sink.lineEnd(); + function apply(quad, x0, y0, x1, y1) { + var data = quad.data, rj = quad.r, r = ri + rj; + if (data) { + if (data.index > node.index) { + var x = xi - data.x - data.vx, + y = yi - data.y - data.vy, + l = x * x + y * y; + if (l < r * r) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + l = (r - (l = Math.sqrt(l))) / l * strength; + node.vx += (x *= l) * (r = (rj *= rj) / (ri2 + rj)); + node.vy += (y *= l) * r; + data.vx -= x * (r = 1 - r); + data.vy -= y * r; + } } - if (polygonStarted) sink.polygonEnd(), polygonStarted = false; - segments = polygon = null; - }, - sphere: function() { - sink.polygonStart(); - sink.lineStart(); - interpolate(null, null, 1, sink); - sink.lineEnd(); - sink.polygonEnd(); + return; } - }; - - function point(lambda, phi) { - if (pointVisible(lambda, phi)) sink.point(lambda, phi); + return x0 > xi + r || x1 < xi - r || y0 > yi + r || y1 < yi - r; } + } - function pointLine(lambda, phi) { - line.point(lambda, phi); + function prepare(quad) { + if (quad.data) return quad.r = radii[quad.data.index]; + for (var i = quad.r = 0; i < 4; ++i) { + if (quad[i] && quad[i].r > quad.r) { + quad.r = quad[i].r; + } } + } - function lineStart() { - clip.point = pointLine; - line.lineStart(); - } + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + radii = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], radii[node.index] = +radius(node, i, nodes); + } - function lineEnd() { - clip.point = point; - line.lineEnd(); - } + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; - function pointRing(lambda, phi) { - ring.push([lambda, phi]); - ringSink.point(lambda, phi); - } + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; - function ringStart() { - ringSink.lineStart(); - ring = []; - } + force.strength = function(_) { + return arguments.length ? (strength = +_, force) : strength; + }; - function ringEnd() { - pointRing(ring[0][0], ring[0][1]); - ringSink.lineEnd(); + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; - var clean = ringSink.clean(), - ringSegments = ringBuffer.result(), - i, n = ringSegments.length, m, - segment, - point; + return force; +} - ring.pop(); - polygon.push(ring); - ring = null; +function index(d) { + return d.index; +} - if (!n) return; +function find(nodeById, nodeId) { + var node = nodeById.get(nodeId); + if (!node) throw new Error("node not found: " + nodeId); + return node; +} - // No intersections. - if (clean & 1) { - segment = ringSegments[0]; - if ((m = segment.length - 1) > 0) { - if (!polygonStarted) sink.polygonStart(), polygonStarted = true; - sink.lineStart(); - for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); - sink.lineEnd(); - } - return; +function link(links) { + var id = index, + strength = defaultStrength, + strengths, + distance = constant(30), + distances, + nodes, + count, + bias, + random, + iterations = 1; + + if (links == null) links = []; + + function defaultStrength(link) { + return 1 / Math.min(count[link.source.index], count[link.target.index]); + } + + function force(alpha) { + for (var k = 0, n = links.length; k < iterations; ++k) { + for (var i = 0, link, source, target, x, y, l, b; i < n; ++i) { + link = links[i], source = link.source, target = link.target; + x = target.x + target.vx - source.x - source.vx || jiggle(random); + y = target.y + target.vy - source.y - source.vy || jiggle(random); + l = Math.sqrt(x * x + y * y); + l = (l - distances[i]) / l * alpha * strengths[i]; + x *= l, y *= l; + target.vx -= x * (b = bias[i]); + target.vy -= y * b; + source.vx += x * (b = 1 - b); + source.vy += y * b; } + } + } - // Rejoin connected segments. - // TODO reuse ringBuffer.rejoin()? - if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); + function initialize() { + if (!nodes) return; - segments.push(ringSegments.filter(validSegment)); + var i, + n = nodes.length, + m = links.length, + nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d])), + link; + + for (i = 0, count = new Array(n); i < m; ++i) { + link = links[i], link.index = i; + if (typeof link.source !== "object") link.source = find(nodeById, link.source); + if (typeof link.target !== "object") link.target = find(nodeById, link.target); + count[link.source.index] = (count[link.source.index] || 0) + 1; + count[link.target.index] = (count[link.target.index] || 0) + 1; } - return clip; - }; -} + for (i = 0, bias = new Array(m); i < m; ++i) { + link = links[i], bias[i] = count[link.source.index] / (count[link.source.index] + count[link.target.index]); + } -function validSegment(segment) { - return segment.length > 1; -} + strengths = new Array(m), initializeStrength(); + distances = new Array(m), initializeDistance(); + } -// Intersections are sorted along the clip edge. For both antimeridian cutting -// and circle clipping, the same comparison is used. -function compareIntersection(a, b) { - return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) - - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); -} + function initializeStrength() { + if (!nodes) return; -var clipAntimeridian = clip( - function() { return true; }, - clipAntimeridianLine, - clipAntimeridianInterpolate, - [-pi, -halfPi] -); + for (var i = 0, n = links.length; i < n; ++i) { + strengths[i] = +strength(links[i], i, links); + } + } -// Takes a line and cuts into visible segments. Return values: 0 - there were -// intersections or the line was empty; 1 - no intersections; 2 - there were -// intersections, and the first and last segments should be rejoined. -function clipAntimeridianLine(stream) { - var lambda0 = NaN, - phi0 = NaN, - sign0 = NaN, - clean; // no intersections + function initializeDistance() { + if (!nodes) return; - return { - lineStart: function() { - stream.lineStart(); - clean = 1; - }, - point: function(lambda1, phi1) { - var sign1 = lambda1 > 0 ? pi : -pi, - delta = abs(lambda1 - lambda0); - if (abs(delta - pi) < epsilon) { // line crosses a pole - stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); - stream.point(sign0, phi0); - stream.lineEnd(); - stream.lineStart(); - stream.point(sign1, phi0); - stream.point(lambda1, phi0); - clean = 0; - } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian - if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies - if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; - phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); - stream.point(sign0, phi0); - stream.lineEnd(); - stream.lineStart(); - stream.point(sign1, phi0); - clean = 0; - } - stream.point(lambda0 = lambda1, phi0 = phi1); - sign0 = sign1; - }, - lineEnd: function() { - stream.lineEnd(); - lambda0 = phi0 = NaN; - }, - clean: function() { - return 2 - clean; // if intersections, rejoin first and last segments + for (var i = 0, n = links.length; i < n; ++i) { + distances[i] = +distance(links[i], i, links); } + } + + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); }; -} -function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { - var cosPhi0, - cosPhi1, - sinLambda0Lambda1 = sin(lambda0 - lambda1); - return abs(sinLambda0Lambda1) > epsilon - ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) - - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) - / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) - : (phi0 + phi1) / 2; -} + force.links = function(_) { + return arguments.length ? (links = _, initialize(), force) : links; + }; -function clipAntimeridianInterpolate(from, to, direction, stream) { - var phi; - if (from == null) { - phi = direction * halfPi; - stream.point(-pi, phi); - stream.point(0, phi); - stream.point(pi, phi); - stream.point(pi, 0); - stream.point(pi, -phi); - stream.point(0, -phi); - stream.point(-pi, -phi); - stream.point(-pi, 0); - stream.point(-pi, phi); - } else if (abs(from[0] - to[0]) > epsilon) { - var lambda = from[0] < to[0] ? pi : -pi; - phi = direction * lambda / 2; - stream.point(-lambda, phi); - stream.point(0, phi); - stream.point(lambda, phi); - } else { - stream.point(to[0], to[1]); - } -} + force.id = function(_) { + return arguments.length ? (id = _, force) : id; + }; -function clipCircle(radius) { - var cr = cos(radius), - delta = 6 * radians, - smallRadius = cr > 0, - notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case + force.iterations = function(_) { + return arguments.length ? (iterations = +_, force) : iterations; + }; - function interpolate(from, to, direction, stream) { - circleStream(stream, radius, delta, direction, from, to); - } + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initializeStrength(), force) : strength; + }; - function visible(lambda, phi) { - return cos(lambda) * cos(phi) > cr; - } + force.distance = function(_) { + return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance; + }; - // Takes a line and cuts into visible segments. Return values used for polygon - // clipping: 0 - there were intersections or the line was empty; 1 - no - // intersections 2 - there were intersections, and the first and last segments - // should be rejoined. - function clipLine(stream) { - var point0, // previous point - c0, // code for previous point - v0, // visibility of previous point - v00, // visibility of first point - clean; // no intersections - return { - lineStart: function() { - v00 = v0 = false; - clean = 1; - }, - point: function(lambda, phi) { - var point1 = [lambda, phi], - point2, - v = visible(lambda, phi), - c = smallRadius - ? v ? 0 : code(lambda, phi) - : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; - if (!point0 && (v00 = v0 = v)) stream.lineStart(); - if (v !== v0) { - point2 = intersect(point0, point1); - if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) - point1[2] = 1; - } - if (v !== v0) { - clean = 0; - if (v) { - // outside going in - stream.lineStart(); - point2 = intersect(point1, point0); - stream.point(point2[0], point2[1]); - } else { - // inside going out - point2 = intersect(point0, point1); - stream.point(point2[0], point2[1], 2); - stream.lineEnd(); - } - point0 = point2; - } else if (notHemisphere && point0 && smallRadius ^ v) { - var t; - // If the codes for two points are different, or are both zero, - // and there this segment intersects with the small circle. - if (!(c & c0) && (t = intersect(point1, point0, true))) { - clean = 0; - if (smallRadius) { - stream.lineStart(); - stream.point(t[0][0], t[0][1]); - stream.point(t[1][0], t[1][1]); - stream.lineEnd(); - } else { - stream.point(t[1][0], t[1][1]); - stream.lineEnd(); - stream.lineStart(); - stream.point(t[0][0], t[0][1], 3); - } - } - } - if (v && (!point0 || !pointEqual(point0, point1))) { - stream.point(point1[0], point1[1]); - } - point0 = point1, v0 = v, c0 = c; - }, - lineEnd: function() { - if (v0) stream.lineEnd(); - point0 = null; - }, - // Rejoin first and last segments if there were intersections and the first - // and last points were visible. - clean: function() { - return clean | ((v00 && v0) << 1); - } - }; - } + return force; +} - // Intersects the great circle between a and b with the clip circle. - function intersect(a, b, two) { - var pa = cartesian(a), - pb = cartesian(b); +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const a = 1664525; +const c = 1013904223; +const m = 4294967296; // 2^32 + +function lcg() { + let s = 1; + return () => (s = (a * s + c) % m) / m; +} - // We have two planes, n1.p = d1 and n2.p = d2. - // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). - var n1 = [1, 0, 0], // normal - n2 = cartesianCross(pa, pb), - n2n2 = cartesianDot(n2, n2), - n1n2 = n2[0], // cartesianDot(n1, n2), - determinant = n2n2 - n1n2 * n1n2; +function x$1(d) { + return d.x; +} - // Two polar points. - if (!determinant) return !two && a; +function y$1(d) { + return d.y; +} - var c1 = cr * n2n2 / determinant, - c2 = -cr * n1n2 / determinant, - n1xn2 = cartesianCross(n1, n2), - A = cartesianScale(n1, c1), - B = cartesianScale(n2, c2); - cartesianAddInPlace(A, B); +var initialRadius = 10, + initialAngle = Math.PI * (3 - Math.sqrt(5)); - // Solve |p(t)|^2 = 1. - var u = n1xn2, - w = cartesianDot(A, u), - uu = cartesianDot(u, u), - t2 = w * w - uu * (cartesianDot(A, A) - 1); +function simulation(nodes) { + var simulation, + alpha = 1, + alphaMin = 0.001, + alphaDecay = 1 - Math.pow(alphaMin, 1 / 300), + alphaTarget = 0, + velocityDecay = 0.6, + forces = new Map(), + stepper = d3Timer.timer(step), + event = d3Dispatch.dispatch("tick", "end"), + random = lcg(); - if (t2 < 0) return; + if (nodes == null) nodes = []; - var t = sqrt(t2), - q = cartesianScale(u, (-w - t) / uu); - cartesianAddInPlace(q, A); - q = spherical(q); + function step() { + tick(); + event.call("tick", simulation); + if (alpha < alphaMin) { + stepper.stop(); + event.call("end", simulation); + } + } - if (!two) return q; + function tick(iterations) { + var i, n = nodes.length, node; - // Two intersection points. - var lambda0 = a[0], - lambda1 = b[0], - phi0 = a[1], - phi1 = b[1], - z; + if (iterations === undefined) iterations = 1; - if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; + for (var k = 0; k < iterations; ++k) { + alpha += (alphaTarget - alpha) * alphaDecay; - var delta = lambda1 - lambda0, - polar = abs(delta - pi) < epsilon, - meridian = polar || delta < epsilon; + forces.forEach(function(force) { + force(alpha); + }); - if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (node.fx == null) node.x += node.vx *= velocityDecay; + else node.x = node.fx, node.vx = 0; + if (node.fy == null) node.y += node.vy *= velocityDecay; + else node.y = node.fy, node.vy = 0; + } + } - // Check that the first point is between a and b. - if (meridian - ? polar - ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) - : phi0 <= q[1] && q[1] <= phi1 - : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { - var q1 = cartesianScale(u, (-w + t) / uu); - cartesianAddInPlace(q1, A); - return [q, spherical(q1)]; + return simulation; + } + + function initializeNodes() { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.index = i; + if (node.fx != null) node.x = node.fx; + if (node.fy != null) node.y = node.fy; + if (isNaN(node.x) || isNaN(node.y)) { + var radius = initialRadius * Math.sqrt(0.5 + i), angle = i * initialAngle; + node.x = radius * Math.cos(angle); + node.y = radius * Math.sin(angle); + } + if (isNaN(node.vx) || isNaN(node.vy)) { + node.vx = node.vy = 0; + } } } - // Generates a 4-bit vector representing the location of a point relative to - // the small circle's bounding box. - function code(lambda, phi) { - var r = smallRadius ? radius : pi - radius, - code = 0; - if (lambda < -r) code |= 1; // left - else if (lambda > r) code |= 2; // right - if (phi < -r) code |= 4; // below - else if (phi > r) code |= 8; // above - return code; + function initializeForce(force) { + if (force.initialize) force.initialize(nodes, random); + return force; } - return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); -} + initializeNodes(); -function clipLine(a, b, x0, y0, x1, y1) { - var ax = a[0], - ay = a[1], - bx = b[0], - by = b[1], - t0 = 0, - t1 = 1, - dx = bx - ax, - dy = by - ay, - r; + return simulation = { + tick: tick, - r = x0 - ax; - if (!dx && r > 0) return; - r /= dx; - if (dx < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dx > 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } + restart: function() { + return stepper.restart(step), simulation; + }, - r = x1 - ax; - if (!dx && r < 0) return; - r /= dx; - if (dx < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dx > 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } + stop: function() { + return stepper.stop(), simulation; + }, - r = y0 - ay; - if (!dy && r > 0) return; - r /= dy; - if (dy < 0) { - if (r < t0) return; - if (r < t1) t1 = r; - } else if (dy > 0) { - if (r > t1) return; - if (r > t0) t0 = r; + nodes: function(_) { + return arguments.length ? (nodes = _, initializeNodes(), forces.forEach(initializeForce), simulation) : nodes; + }, + + alpha: function(_) { + return arguments.length ? (alpha = +_, simulation) : alpha; + }, + + alphaMin: function(_) { + return arguments.length ? (alphaMin = +_, simulation) : alphaMin; + }, + + alphaDecay: function(_) { + return arguments.length ? (alphaDecay = +_, simulation) : +alphaDecay; + }, + + alphaTarget: function(_) { + return arguments.length ? (alphaTarget = +_, simulation) : alphaTarget; + }, + + velocityDecay: function(_) { + return arguments.length ? (velocityDecay = 1 - _, simulation) : 1 - velocityDecay; + }, + + randomSource: function(_) { + return arguments.length ? (random = _, forces.forEach(initializeForce), simulation) : random; + }, + + force: function(name, _) { + return arguments.length > 1 ? ((_ == null ? forces.delete(name) : forces.set(name, initializeForce(_))), simulation) : forces.get(name); + }, + + find: function(x, y, radius) { + var i = 0, + n = nodes.length, + dx, + dy, + d2, + node, + closest; + + if (radius == null) radius = Infinity; + else radius *= radius; + + for (i = 0; i < n; ++i) { + node = nodes[i]; + dx = x - node.x; + dy = y - node.y; + d2 = dx * dx + dy * dy; + if (d2 < radius) closest = node, radius = d2; + } + + return closest; + }, + + on: function(name, _) { + return arguments.length > 1 ? (event.on(name, _), simulation) : event.on(name); + } + }; +} + +function manyBody() { + var nodes, + node, + random, + alpha, + strength = constant(-30), + strengths, + distanceMin2 = 1, + distanceMax2 = Infinity, + theta2 = 0.81; + + function force(_) { + var i, n = nodes.length, tree = d3Quadtree.quadtree(nodes, x$1, y$1).visitAfter(accumulate); + for (alpha = _, i = 0; i < n; ++i) node = nodes[i], tree.visit(apply); } - r = y1 - ay; - if (!dy && r < 0) return; - r /= dy; - if (dy < 0) { - if (r > t1) return; - if (r > t0) t0 = r; - } else if (dy > 0) { - if (r < t0) return; - if (r < t1) t1 = r; + function initialize() { + if (!nodes) return; + var i, n = nodes.length, node; + strengths = new Array(n); + for (i = 0; i < n; ++i) node = nodes[i], strengths[node.index] = +strength(node, i, nodes); } - if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; - if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; - return true; -} - -var clipMax = 1e9, clipMin = -clipMax; + function accumulate(quad) { + var strength = 0, q, c, weight = 0, x, y, i; -// TODO Use d3-polygon’s polygonContains here for the ring check? -// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + // For internal nodes, accumulate forces from child quadrants. + if (quad.length) { + for (x = y = i = 0; i < 4; ++i) { + if ((q = quad[i]) && (c = Math.abs(q.value))) { + strength += q.value, weight += c, x += c * q.x, y += c * q.y; + } + } + quad.x = x / weight; + quad.y = y / weight; + } -function clipRectangle(x0, y0, x1, y1) { + // For leaf nodes, accumulate forces from coincident quadrants. + else { + q = quad; + q.x = q.data.x; + q.y = q.data.y; + do strength += strengths[q.data.index]; + while (q = q.next); + } - function visible(x, y) { - return x0 <= x && x <= x1 && y0 <= y && y <= y1; + quad.value = strength; } - function interpolate(from, to, direction, stream) { - var a = 0, a1 = 0; - if (from == null - || (a = corner(from, direction)) !== (a1 = corner(to, direction)) - || comparePoint(from, to) < 0 ^ direction > 0) { - do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); - while ((a = (a + direction + 4) % 4) !== a1); - } else { - stream.point(to[0], to[1]); + function apply(quad, x1, _, x2) { + if (!quad.value) return true; + + var x = quad.x - node.x, + y = quad.y - node.y, + w = x2 - x1, + l = x * x + y * y; + + // Apply the Barnes-Hut approximation if possible. + // Limit forces for very close nodes; randomize direction if coincident. + if (w * w / theta2 < l) { + if (l < distanceMax2) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + node.vx += x * quad.value * alpha / l; + node.vy += y * quad.value * alpha / l; + } + return true; } - } - function corner(p, direction) { - return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 - : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 - : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 - : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon - } + // Otherwise, process points directly. + else if (quad.length || l >= distanceMax2) return; - function compareIntersection(a, b) { - return comparePoint(a.x, b.x); - } + // Limit forces for very close nodes; randomize direction if coincident. + if (quad.data !== node || quad.next) { + if (x === 0) x = jiggle(random), l += x * x; + if (y === 0) y = jiggle(random), l += y * y; + if (l < distanceMin2) l = Math.sqrt(distanceMin2 * l); + } - function comparePoint(a, b) { - var ca = corner(a, 1), - cb = corner(b, 1); - return ca !== cb ? ca - cb - : ca === 0 ? b[1] - a[1] - : ca === 1 ? a[0] - b[0] - : ca === 2 ? a[1] - b[1] - : b[0] - a[0]; + do if (quad.data !== node) { + w = strengths[quad.data.index] * alpha / l; + node.vx += x * w; + node.vy += y * w; + } while (quad = quad.next); } - return function(stream) { - var activeStream = stream, - bufferStream = clipBuffer(), - segments, - polygon, - ring, - x__, y__, v__, // first point - x_, y_, v_, // previous point - first, - clean; + force.initialize = function(_nodes, _random) { + nodes = _nodes; + random = _random; + initialize(); + }; - var clipStream = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: polygonStart, - polygonEnd: polygonEnd - }; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; - function point(x, y) { - if (visible(x, y)) activeStream.point(x, y); - } + force.distanceMin = function(_) { + return arguments.length ? (distanceMin2 = _ * _, force) : Math.sqrt(distanceMin2); + }; - function polygonInside() { - var winding = 0; + force.distanceMax = function(_) { + return arguments.length ? (distanceMax2 = _ * _, force) : Math.sqrt(distanceMax2); + }; - for (var i = 0, n = polygon.length; i < n; ++i) { - for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { - a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; - if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } - else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } - } - } + force.theta = function(_) { + return arguments.length ? (theta2 = _ * _, force) : Math.sqrt(theta2); + }; - return winding; - } + return force; +} - // Buffer geometry within a polygon and then clip it en masse. - function polygonStart() { - activeStream = bufferStream, segments = [], polygon = [], clean = true; - } +function radial(radius, x, y) { + var nodes, + strength = constant(0.1), + strengths, + radiuses; - function polygonEnd() { - var startInside = polygonInside(), - cleanInside = clean && startInside, - visible = (segments = d3Array.merge(segments)).length; - if (cleanInside || visible) { - stream.polygonStart(); - if (cleanInside) { - stream.lineStart(); - interpolate(null, null, 1, stream); - stream.lineEnd(); - } - if (visible) { - clipRejoin(segments, compareIntersection, startInside, interpolate, stream); - } - stream.polygonEnd(); - } - activeStream = stream, segments = polygon = ring = null; - } + if (typeof radius !== "function") radius = constant(+radius); + if (x == null) x = 0; + if (y == null) y = 0; - function lineStart() { - clipStream.point = linePoint; - if (polygon) polygon.push(ring = []); - first = true; - v_ = false; - x_ = y_ = NaN; + function force(alpha) { + for (var i = 0, n = nodes.length; i < n; ++i) { + var node = nodes[i], + dx = node.x - x || 1e-6, + dy = node.y - y || 1e-6, + r = Math.sqrt(dx * dx + dy * dy), + k = (radiuses[i] - r) * strengths[i] * alpha / r; + node.vx += dx * k; + node.vy += dy * k; } + } - // TODO rather than special-case polygons, simply handle them separately. - // Ideally, coincident intersection points should be jittered to avoid - // clipping issues. - function lineEnd() { - if (segments) { - linePoint(x__, y__); - if (v__ && v_) bufferStream.rejoin(); - segments.push(bufferStream.result()); - } - clipStream.point = point; - if (v_) activeStream.lineEnd(); + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + radiuses = new Array(n); + for (i = 0; i < n; ++i) { + radiuses[i] = +radius(nodes[i], i, nodes); + strengths[i] = isNaN(radiuses[i]) ? 0 : +strength(nodes[i], i, nodes); } + } - function linePoint(x, y) { - var v = visible(x, y); - if (polygon) ring.push([x, y]); - if (first) { - x__ = x, y__ = y, v__ = v; - first = false; - if (v) { - activeStream.lineStart(); - activeStream.point(x, y); - } - } else { - if (v && v_) activeStream.point(x, y); - else { - var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], - b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; - if (clipLine(a, b, x0, y0, x1, y1)) { - if (!v_) { - activeStream.lineStart(); - activeStream.point(a[0], a[1]); - } - activeStream.point(b[0], b[1]); - if (!v) activeStream.lineEnd(); - clean = false; - } else if (v) { - activeStream.lineStart(); - activeStream.point(x, y); - clean = false; - } - } - } - x_ = x, y_ = y, v_ = v; - } + force.initialize = function(_) { + nodes = _, initialize(); + }; + + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), initialize(), force) : radius; + }; + + force.x = function(_) { + return arguments.length ? (x = +_, force) : x; + }; - return clipStream; + force.y = function(_) { + return arguments.length ? (y = +_, force) : y; }; + + return force; } -function extent() { - var x0 = 0, - y0 = 0, - x1 = 960, - y1 = 500, - cache, - cacheStream, - clip; +function x$2(x) { + var strength = constant(0.1), + nodes, + strengths, + xz; - return clip = { - stream: function(stream) { - return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); - }, - extent: function(_) { - return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + if (typeof x !== "function") x = constant(x == null ? 0 : +x); + + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vx += (xz[i] - node.x) * strengths[i] * alpha; + } + } + + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + xz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(xz[i] = +x(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); } + } + + force.initialize = function(_) { + nodes = _; + initialize(); }; -} -var lengthSum, - lambda0$2, - sinPhi0$1, - cosPhi0$1; + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; -var lengthStream = { - sphere: noop, - point: noop, - lineStart: lengthLineStart, - lineEnd: noop, - polygonStart: noop, - polygonEnd: noop -}; + force.x = function(_) { + return arguments.length ? (x = typeof _ === "function" ? _ : constant(+_), initialize(), force) : x; + }; -function lengthLineStart() { - lengthStream.point = lengthPointFirst; - lengthStream.lineEnd = lengthLineEnd; + return force; } -function lengthLineEnd() { - lengthStream.point = lengthStream.lineEnd = noop; -} +function y$2(y) { + var strength = constant(0.1), + nodes, + strengths, + yz; -function lengthPointFirst(lambda, phi) { - lambda *= radians, phi *= radians; - lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); - lengthStream.point = lengthPoint; -} + if (typeof y !== "function") y = constant(y == null ? 0 : +y); -function lengthPoint(lambda, phi) { - lambda *= radians, phi *= radians; - var sinPhi = sin(phi), - cosPhi = cos(phi), - delta = abs(lambda - lambda0$2), - cosDelta = cos(delta), - sinDelta = sin(delta), - x = cosPhi * sinDelta, - y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, - z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; - lengthSum.add(atan2(sqrt(x * x + y * y), z)); - lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; -} + function force(alpha) { + for (var i = 0, n = nodes.length, node; i < n; ++i) { + node = nodes[i], node.vy += (yz[i] - node.y) * strengths[i] * alpha; + } + } -function length(object) { - lengthSum = new d3Array.Adder(); - geoStream(object, lengthStream); - return +lengthSum; -} + function initialize() { + if (!nodes) return; + var i, n = nodes.length; + strengths = new Array(n); + yz = new Array(n); + for (i = 0; i < n; ++i) { + strengths[i] = isNaN(yz[i] = +y(nodes[i], i, nodes)) ? 0 : +strength(nodes[i], i, nodes); + } + } -var coordinates = [null, null], - object = {type: "LineString", coordinates: coordinates}; + force.initialize = function(_) { + nodes = _; + initialize(); + }; -function distance(a, b) { - coordinates[0] = a; - coordinates[1] = b; - return length(object); + force.strength = function(_) { + return arguments.length ? (strength = typeof _ === "function" ? _ : constant(+_), initialize(), force) : strength; + }; + + force.y = function(_) { + return arguments.length ? (y = typeof _ === "function" ? _ : constant(+_), initialize(), force) : y; + }; + + return force; } -var containsObjectType = { - Feature: function(object, point) { - return containsGeometry(object.geometry, point); - }, - FeatureCollection: function(object, point) { - var features = object.features, i = -1, n = features.length; - while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; - return false; - } -}; +exports.forceCenter = center; +exports.forceCollide = collide; +exports.forceLink = link; +exports.forceManyBody = manyBody; +exports.forceRadial = radial; +exports.forceSimulation = simulation; +exports.forceX = x$2; +exports.forceY = y$2; -var containsGeometryType = { - Sphere: function() { - return true; - }, - Point: function(object, point) { - return containsPoint(object.coordinates, point); - }, - MultiPoint: function(object, point) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) if (containsPoint(coordinates[i], point)) return true; - return false; - }, - LineString: function(object, point) { - return containsLine(object.coordinates, point); - }, - MultiLineString: function(object, point) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) if (containsLine(coordinates[i], point)) return true; - return false; - }, - Polygon: function(object, point) { - return containsPolygon(object.coordinates, point); - }, - MultiPolygon: function(object, point) { - var coordinates = object.coordinates, i = -1, n = coordinates.length; - while (++i < n) if (containsPolygon(coordinates[i], point)) return true; - return false; - }, - GeometryCollection: function(object, point) { - var geometries = object.geometries, i = -1, n = geometries.length; - while (++i < n) if (containsGeometry(geometries[i], point)) return true; - return false; - } -}; +Object.defineProperty(exports, '__esModule', { value: true }); -function containsGeometry(geometry, point) { - return geometry && containsGeometryType.hasOwnProperty(geometry.type) - ? containsGeometryType[geometry.type](geometry, point) - : false; +})); +}); + +var d3Format = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-format/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, (function (exports) { +function formatDecimal(x) { + return Math.abs(x = Math.round(x)) >= 1e21 + ? x.toLocaleString("en").replace(/,/g, "") + : x.toString(10); } -function containsPoint(coordinates, point) { - return distance(coordinates, point) === 0; +// Computes the decimal coefficient and exponent of the specified number x with +// significant digits p, where x is positive and p is in [1, 21] or undefined. +// For example, formatDecimalParts(1.23) returns ["123", 0]. +function formatDecimalParts(x, p) { + if ((i = (x = p ? x.toExponential(p - 1) : x.toExponential()).indexOf("e")) < 0) return null; // NaN, ±Infinity + var i, coefficient = x.slice(0, i); + + // The string returned by toExponential either has the form \d\.\d+e[-+]\d+ + // (e.g., 1.2e+3) or the form \de[-+]\d+ (e.g., 1e+3). + return [ + coefficient.length > 1 ? coefficient[0] + coefficient.slice(2) : coefficient, + +x.slice(i + 1) + ]; } -function containsLine(coordinates, point) { - var ao, bo, ab; - for (var i = 0, n = coordinates.length; i < n; i++) { - bo = distance(coordinates[i], point); - if (bo === 0) return true; - if (i > 0) { - ab = distance(coordinates[i], coordinates[i - 1]); - if ( - ab > 0 && - ao <= ab && - bo <= ab && - (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab - ) - return true; - } - ao = bo; - } - return false; +function exponent(x) { + return x = formatDecimalParts(Math.abs(x)), x ? x[1] : NaN; } -function containsPolygon(coordinates, point) { - return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); +function formatGroup(grouping, thousands) { + return function(value, width) { + var i = value.length, + t = [], + j = 0, + g = grouping[0], + length = 0; + + while (i > 0 && g > 0) { + if (length + g + 1 > width) g = Math.max(1, width - length); + t.push(value.substring(i -= g, i + g)); + if ((length += g + 1) > width) break; + g = grouping[j = (j + 1) % grouping.length]; + } + + return t.reverse().join(thousands); + }; } -function ringRadians(ring) { - return ring = ring.map(pointRadians), ring.pop(), ring; +function formatNumerals(numerals) { + return function(value) { + return value.replace(/[0-9]/g, function(i) { + return numerals[+i]; + }); + }; } -function pointRadians(point) { - return [point[0] * radians, point[1] * radians]; -} +// [[fill]align][sign][symbol][0][width][,][.precision][~][type] +var re = /^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i; -function contains(object, point) { - return (object && containsObjectType.hasOwnProperty(object.type) - ? containsObjectType[object.type] - : containsGeometry)(object, point); +function formatSpecifier(specifier) { + if (!(match = re.exec(specifier))) throw new Error("invalid format: " + specifier); + var match; + return new FormatSpecifier({ + fill: match[1], + align: match[2], + sign: match[3], + symbol: match[4], + zero: match[5], + width: match[6], + comma: match[7], + precision: match[8] && match[8].slice(1), + trim: match[9], + type: match[10] + }); } -function graticuleX(y0, y1, dy) { - var y = d3Array.range(y0, y1 - epsilon, dy).concat(y1); - return function(x) { return y.map(function(y) { return [x, y]; }); }; -} +formatSpecifier.prototype = FormatSpecifier.prototype; // instanceof -function graticuleY(x0, x1, dx) { - var x = d3Array.range(x0, x1 - epsilon, dx).concat(x1); - return function(y) { return x.map(function(x) { return [x, y]; }); }; +function FormatSpecifier(specifier) { + this.fill = specifier.fill === undefined ? " " : specifier.fill + ""; + this.align = specifier.align === undefined ? ">" : specifier.align + ""; + this.sign = specifier.sign === undefined ? "-" : specifier.sign + ""; + this.symbol = specifier.symbol === undefined ? "" : specifier.symbol + ""; + this.zero = !!specifier.zero; + this.width = specifier.width === undefined ? undefined : +specifier.width; + this.comma = !!specifier.comma; + this.precision = specifier.precision === undefined ? undefined : +specifier.precision; + this.trim = !!specifier.trim; + this.type = specifier.type === undefined ? "" : specifier.type + ""; } -function graticule() { - var x1, x0, X1, X0, - y1, y0, Y1, Y0, - dx = 10, dy = dx, DX = 90, DY = 360, - x, y, X, Y, - precision = 2.5; +FormatSpecifier.prototype.toString = function() { + return this.fill + + this.align + + this.sign + + this.symbol + + (this.zero ? "0" : "") + + (this.width === undefined ? "" : Math.max(1, this.width | 0)) + + (this.comma ? "," : "") + + (this.precision === undefined ? "" : "." + Math.max(0, this.precision | 0)) + + (this.trim ? "~" : "") + + this.type; +}; - function graticule() { - return {type: "MultiLineString", coordinates: lines()}; +// Trims insignificant zeros, e.g., replaces 1.2000k with 1.2k. +function formatTrim(s) { + out: for (var n = s.length, i = 1, i0 = -1, i1; i < n; ++i) { + switch (s[i]) { + case ".": i0 = i1 = i; break; + case "0": if (i0 === 0) i0 = i; i1 = i; break; + default: if (!+s[i]) break out; if (i0 > 0) i0 = 0; break; + } } + return i0 > 0 ? s.slice(0, i0) + s.slice(i1 + 1) : s; +} - function lines() { - return d3Array.range(ceil(X0 / DX) * DX, X1, DX).map(X) - .concat(d3Array.range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) - .concat(d3Array.range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x)) - .concat(d3Array.range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y)); - } +var prefixExponent; - graticule.lines = function() { - return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); - }; +function formatPrefixAuto(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1], + i = exponent - (prefixExponent = Math.max(-8, Math.min(8, Math.floor(exponent / 3))) * 3) + 1, + n = coefficient.length; + return i === n ? coefficient + : i > n ? coefficient + new Array(i - n + 1).join("0") + : i > 0 ? coefficient.slice(0, i) + "." + coefficient.slice(i) + : "0." + new Array(1 - i).join("0") + formatDecimalParts(x, Math.max(0, p + i - 1))[0]; // less than 1y! +} - graticule.outline = function() { - return { - type: "Polygon", - coordinates: [ - X(X0).concat( - Y(Y1).slice(1), - X(X1).reverse().slice(1), - Y(Y0).reverse().slice(1)) - ] - }; - }; +function formatRounded(x, p) { + var d = formatDecimalParts(x, p); + if (!d) return x + ""; + var coefficient = d[0], + exponent = d[1]; + return exponent < 0 ? "0." + new Array(-exponent).join("0") + coefficient + : coefficient.length > exponent + 1 ? coefficient.slice(0, exponent + 1) + "." + coefficient.slice(exponent + 1) + : coefficient + new Array(exponent - coefficient.length + 2).join("0"); +} - graticule.extent = function(_) { - if (!arguments.length) return graticule.extentMinor(); - return graticule.extentMajor(_).extentMinor(_); - }; +var formatTypes = { + "%": (x, p) => (x * 100).toFixed(p), + "b": (x) => Math.round(x).toString(2), + "c": (x) => x + "", + "d": formatDecimal, + "e": (x, p) => x.toExponential(p), + "f": (x, p) => x.toFixed(p), + "g": (x, p) => x.toPrecision(p), + "o": (x) => Math.round(x).toString(8), + "p": (x, p) => formatRounded(x * 100, p), + "r": formatRounded, + "s": formatPrefixAuto, + "X": (x) => Math.round(x).toString(16).toUpperCase(), + "x": (x) => Math.round(x).toString(16) +}; - graticule.extentMajor = function(_) { - if (!arguments.length) return [[X0, Y0], [X1, Y1]]; - X0 = +_[0][0], X1 = +_[1][0]; - Y0 = +_[0][1], Y1 = +_[1][1]; - if (X0 > X1) _ = X0, X0 = X1, X1 = _; - if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; - return graticule.precision(precision); - }; +function identity(x) { + return x; +} - graticule.extentMinor = function(_) { - if (!arguments.length) return [[x0, y0], [x1, y1]]; - x0 = +_[0][0], x1 = +_[1][0]; - y0 = +_[0][1], y1 = +_[1][1]; - if (x0 > x1) _ = x0, x0 = x1, x1 = _; - if (y0 > y1) _ = y0, y0 = y1, y1 = _; - return graticule.precision(precision); - }; +var map = Array.prototype.map, + prefixes = ["y","z","a","f","p","n","µ","m","","k","M","G","T","P","E","Z","Y"]; - graticule.step = function(_) { - if (!arguments.length) return graticule.stepMinor(); - return graticule.stepMajor(_).stepMinor(_); - }; +function formatLocale(locale) { + var group = locale.grouping === undefined || locale.thousands === undefined ? identity : formatGroup(map.call(locale.grouping, Number), locale.thousands + ""), + currencyPrefix = locale.currency === undefined ? "" : locale.currency[0] + "", + currencySuffix = locale.currency === undefined ? "" : locale.currency[1] + "", + decimal = locale.decimal === undefined ? "." : locale.decimal + "", + numerals = locale.numerals === undefined ? identity : formatNumerals(map.call(locale.numerals, String)), + percent = locale.percent === undefined ? "%" : locale.percent + "", + minus = locale.minus === undefined ? "−" : locale.minus + "", + nan = locale.nan === undefined ? "NaN" : locale.nan + ""; - graticule.stepMajor = function(_) { - if (!arguments.length) return [DX, DY]; - DX = +_[0], DY = +_[1]; - return graticule; - }; + function newFormat(specifier) { + specifier = formatSpecifier(specifier); - graticule.stepMinor = function(_) { - if (!arguments.length) return [dx, dy]; - dx = +_[0], dy = +_[1]; - return graticule; - }; + var fill = specifier.fill, + align = specifier.align, + sign = specifier.sign, + symbol = specifier.symbol, + zero = specifier.zero, + width = specifier.width, + comma = specifier.comma, + precision = specifier.precision, + trim = specifier.trim, + type = specifier.type; - graticule.precision = function(_) { - if (!arguments.length) return precision; - precision = +_; - x = graticuleX(y0, y1, 90); - y = graticuleY(x0, x1, precision); - X = graticuleX(Y0, Y1, 90); - Y = graticuleY(X0, X1, precision); - return graticule; - }; + // The "n" type is an alias for ",g". + if (type === "n") comma = true, type = "g"; - return graticule - .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) - .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); -} + // The "" type, and any invalid type, is an alias for ".12~g". + else if (!formatTypes[type]) precision === undefined && (precision = 12), trim = true, type = "g"; -function graticule10() { - return graticule()(); -} + // If zero fill is specified, padding goes after sign and before digits. + if (zero || (fill === "0" && align === "=")) zero = true, fill = "0", align = "="; -function interpolate(a, b) { - var x0 = a[0] * radians, - y0 = a[1] * radians, - x1 = b[0] * radians, - y1 = b[1] * radians, - cy0 = cos(y0), - sy0 = sin(y0), - cy1 = cos(y1), - sy1 = sin(y1), - kx0 = cy0 * cos(x0), - ky0 = cy0 * sin(x0), - kx1 = cy1 * cos(x1), - ky1 = cy1 * sin(x1), - d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), - k = sin(d); + // Compute the prefix and suffix. + // For SI-prefix, the suffix is lazily computed. + var prefix = symbol === "$" ? currencyPrefix : symbol === "#" && /[boxX]/.test(type) ? "0" + type.toLowerCase() : "", + suffix = symbol === "$" ? currencySuffix : /[%p]/.test(type) ? percent : ""; - var interpolate = d ? function(t) { - var B = sin(t *= d) / k, - A = sin(d - t) / k, - x = A * kx0 + B * kx1, - y = A * ky0 + B * ky1, - z = A * sy0 + B * sy1; - return [ - atan2(y, x) * degrees, - atan2(z, sqrt(x * x + y * y)) * degrees - ]; - } : function() { - return [x0 * degrees, y0 * degrees]; - }; + // What format function should we use? + // Is this an integer type? + // Can this type generate exponential notation? + var formatType = formatTypes[type], + maybeSuffix = /[defgprs%]/.test(type); - interpolate.distance = d; + // Set the default precision if not specified, + // or clamp the specified precision to the supported range. + // For significant precision, it must be in [1, 21]. + // For fixed precision, it must be in [0, 20]. + precision = precision === undefined ? 6 + : /[gprs]/.test(type) ? Math.max(1, Math.min(21, precision)) + : Math.max(0, Math.min(20, precision)); - return interpolate; -} + function format(value) { + var valuePrefix = prefix, + valueSuffix = suffix, + i, n, c; -var identity = x => x; + if (type === "c") { + valueSuffix = formatType(value) + valueSuffix; + value = ""; + } else { + value = +value; -var areaSum$1 = new d3Array.Adder(), - areaRingSum$1 = new d3Array.Adder(), - x00, - y00, - x0$1, - y0$1; + // Determine the sign. -0 is not less than 0, but 1 / -0 is! + var valueNegative = value < 0 || 1 / value < 0; -var areaStream$1 = { - point: noop, - lineStart: noop, - lineEnd: noop, - polygonStart: function() { - areaStream$1.lineStart = areaRingStart$1; - areaStream$1.lineEnd = areaRingEnd$1; - }, - polygonEnd: function() { - areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop; - areaSum$1.add(abs(areaRingSum$1)); - areaRingSum$1 = new d3Array.Adder(); - }, - result: function() { - var area = areaSum$1 / 2; - areaSum$1 = new d3Array.Adder(); - return area; - } -}; + // Perform the initial formatting. + value = isNaN(value) ? nan : formatType(Math.abs(value), precision); -function areaRingStart$1() { - areaStream$1.point = areaPointFirst$1; -} + // Trim insignificant zeros. + if (trim) value = formatTrim(value); -function areaPointFirst$1(x, y) { - areaStream$1.point = areaPoint$1; - x00 = x0$1 = x, y00 = y0$1 = y; -} + // If a negative value rounds to zero after formatting, and no explicit positive sign is requested, hide the sign. + if (valueNegative && +value === 0 && sign !== "+") valueNegative = false; -function areaPoint$1(x, y) { - areaRingSum$1.add(y0$1 * x - x0$1 * y); - x0$1 = x, y0$1 = y; -} + // Compute the prefix and suffix. + valuePrefix = (valueNegative ? (sign === "(" ? sign : minus) : sign === "-" || sign === "(" ? "" : sign) + valuePrefix; + valueSuffix = (type === "s" ? prefixes[8 + prefixExponent / 3] : "") + valueSuffix + (valueNegative && sign === "(" ? ")" : ""); -function areaRingEnd$1() { - areaPoint$1(x00, y00); -} + // Break the formatted value into the integer “value” part that can be + // grouped, and fractional or exponential “suffix” part that is not. + if (maybeSuffix) { + i = -1, n = value.length; + while (++i < n) { + if (c = value.charCodeAt(i), 48 > c || c > 57) { + valueSuffix = (c === 46 ? decimal + value.slice(i + 1) : value.slice(i)) + valueSuffix; + value = value.slice(0, i); + break; + } + } + } + } -var x0$2 = Infinity, - y0$2 = x0$2, - x1 = -x0$2, - y1 = x1; + // If the fill character is not "0", grouping is applied before padding. + if (comma && !zero) value = group(value, Infinity); -var boundsStream$1 = { - point: boundsPoint$1, - lineStart: noop, - lineEnd: noop, - polygonStart: noop, - polygonEnd: noop, - result: function() { - var bounds = [[x0$2, y0$2], [x1, y1]]; - x1 = y1 = -(y0$2 = x0$2 = Infinity); - return bounds; - } -}; + // Compute the padding. + var length = valuePrefix.length + value.length + valueSuffix.length, + padding = length < width ? new Array(width - length + 1).join(fill) : ""; -function boundsPoint$1(x, y) { - if (x < x0$2) x0$2 = x; - if (x > x1) x1 = x; - if (y < y0$2) y0$2 = y; - if (y > y1) y1 = y; -} + // If the fill character is "0", grouping is applied after padding. + if (comma && zero) value = group(padding + value, padding.length ? width - valueSuffix.length : Infinity), padding = ""; -// TODO Enforce positive area for exterior, negative area for interior? + // Reconstruct the final output based on the desired alignment. + switch (align) { + case "<": value = valuePrefix + value + valueSuffix + padding; break; + case "=": value = valuePrefix + padding + value + valueSuffix; break; + case "^": value = padding.slice(0, length = padding.length >> 1) + valuePrefix + value + valueSuffix + padding.slice(length); break; + default: value = padding + valuePrefix + value + valueSuffix; break; + } -var X0$1 = 0, - Y0$1 = 0, - Z0$1 = 0, - X1$1 = 0, - Y1$1 = 0, - Z1$1 = 0, - X2$1 = 0, - Y2$1 = 0, - Z2$1 = 0, - x00$1, - y00$1, - x0$3, - y0$3; + return numerals(value); + } -var centroidStream$1 = { - point: centroidPoint$1, - lineStart: centroidLineStart$1, - lineEnd: centroidLineEnd$1, - polygonStart: function() { - centroidStream$1.lineStart = centroidRingStart$1; - centroidStream$1.lineEnd = centroidRingEnd$1; - }, - polygonEnd: function() { - centroidStream$1.point = centroidPoint$1; - centroidStream$1.lineStart = centroidLineStart$1; - centroidStream$1.lineEnd = centroidLineEnd$1; - }, - result: function() { - var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] - : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] - : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] - : [NaN, NaN]; - X0$1 = Y0$1 = Z0$1 = - X1$1 = Y1$1 = Z1$1 = - X2$1 = Y2$1 = Z2$1 = 0; - return centroid; + format.toString = function() { + return specifier + ""; + }; + + return format; } -}; -function centroidPoint$1(x, y) { - X0$1 += x; - Y0$1 += y; - ++Z0$1; + function formatPrefix(specifier, value) { + var f = newFormat((specifier = formatSpecifier(specifier), specifier.type = "f", specifier)), + e = Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3, + k = Math.pow(10, -e), + prefix = prefixes[8 + e / 3]; + return function(value) { + return f(k * value) + prefix; + }; + } + + return { + format: newFormat, + formatPrefix: formatPrefix + }; } -function centroidLineStart$1() { - centroidStream$1.point = centroidPointFirstLine; +var locale; + +defaultLocale({ + thousands: ",", + grouping: [3], + currency: ["$", ""] +}); + +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.format = locale.format; + exports.formatPrefix = locale.formatPrefix; + return locale; } -function centroidPointFirstLine(x, y) { - centroidStream$1.point = centroidPointLine; - centroidPoint$1(x0$3 = x, y0$3 = y); +function precisionFixed(step) { + return Math.max(0, -exponent(Math.abs(step))); } -function centroidPointLine(x, y) { - var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; - centroidPoint$1(x0$3 = x, y0$3 = y); +function precisionPrefix(step, value) { + return Math.max(0, Math.max(-8, Math.min(8, Math.floor(exponent(value) / 3))) * 3 - exponent(Math.abs(step))); } -function centroidLineEnd$1() { - centroidStream$1.point = centroidPoint$1; +function precisionRound(step, max) { + step = Math.abs(step), max = Math.abs(max) - step; + return Math.max(0, exponent(max) - exponent(step)) + 1; } -function centroidRingStart$1() { - centroidStream$1.point = centroidPointFirstRing; +exports.FormatSpecifier = FormatSpecifier; +exports.formatDefaultLocale = defaultLocale; +exports.formatLocale = formatLocale; +exports.formatSpecifier = formatSpecifier; +exports.precisionFixed = precisionFixed; +exports.precisionPrefix = precisionPrefix; +exports.precisionRound = precisionRound; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +}); + +var d3Geo = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-geo/ v2.0.2 Copyright 2021 Mike Bostock +(function (global, factory) { +factory(exports, d3Array) ; +}(commonjsGlobal, function (exports, d3Array) { +var epsilon = 1e-6; +var epsilon2 = 1e-12; +var pi = Math.PI; +var halfPi = pi / 2; +var quarterPi = pi / 4; +var tau = pi * 2; + +var degrees = 180 / pi; +var radians = pi / 180; + +var abs = Math.abs; +var atan = Math.atan; +var atan2 = Math.atan2; +var cos = Math.cos; +var ceil = Math.ceil; +var exp = Math.exp; +var hypot = Math.hypot; +var log = Math.log; +var pow = Math.pow; +var sin = Math.sin; +var sign = Math.sign || function(x) { return x > 0 ? 1 : x < 0 ? -1 : 0; }; +var sqrt = Math.sqrt; +var tan = Math.tan; + +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); } -function centroidRingEnd$1() { - centroidPointRing(x00$1, y00$1); +function asin(x) { + return x > 1 ? halfPi : x < -1 ? -halfPi : Math.asin(x); } -function centroidPointFirstRing(x, y) { - centroidStream$1.point = centroidPointRing; - centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); +function haversin(x) { + return (x = sin(x / 2)) * x; } -function centroidPointRing(x, y) { - var dx = x - x0$3, - dy = y - y0$3, - z = sqrt(dx * dx + dy * dy); - - X1$1 += z * (x0$3 + x) / 2; - Y1$1 += z * (y0$3 + y) / 2; - Z1$1 += z; - - z = y0$3 * x - x0$3 * y; - X2$1 += z * (x0$3 + x); - Y2$1 += z * (y0$3 + y); - Z2$1 += z * 3; - centroidPoint$1(x0$3 = x, y0$3 = y); -} +function noop() {} -function PathContext(context) { - this._context = context; +function streamGeometry(geometry, stream) { + if (geometry && streamGeometryType.hasOwnProperty(geometry.type)) { + streamGeometryType[geometry.type](geometry, stream); + } } -PathContext.prototype = { - _radius: 4.5, - pointRadius: function(_) { - return this._radius = _, this; - }, - polygonStart: function() { - this._line = 0; - }, - polygonEnd: function() { - this._line = NaN; +var streamObjectType = { + Feature: function(object, stream) { + streamGeometry(object.geometry, stream); }, - lineStart: function() { - this._point = 0; + FeatureCollection: function(object, stream) { + var features = object.features, i = -1, n = features.length; + while (++i < n) streamGeometry(features[i].geometry, stream); + } +}; + +var streamGeometryType = { + Sphere: function(object, stream) { + stream.sphere(); }, - lineEnd: function() { - if (this._line === 0) this._context.closePath(); - this._point = NaN; + Point: function(object, stream) { + object = object.coordinates; + stream.point(object[0], object[1], object[2]); }, - point: function(x, y) { - switch (this._point) { - case 0: { - this._context.moveTo(x, y); - this._point = 1; - break; - } - case 1: { - this._context.lineTo(x, y); - break; - } - default: { - this._context.moveTo(x + this._radius, y); - this._context.arc(x, y, this._radius, 0, tau); - break; - } - } + MultiPoint: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) object = coordinates[i], stream.point(object[0], object[1], object[2]); }, - result: noop -}; - -var lengthSum$1 = new d3Array.Adder(), - lengthRing, - x00$2, - y00$2, - x0$4, - y0$4; - -var lengthStream$1 = { - point: noop, - lineStart: function() { - lengthStream$1.point = lengthPointFirst$1; + LineString: function(object, stream) { + streamLine(object.coordinates, stream, 0); }, - lineEnd: function() { - if (lengthRing) lengthPoint$1(x00$2, y00$2); - lengthStream$1.point = noop; + MultiLineString: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamLine(coordinates[i], stream, 0); }, - polygonStart: function() { - lengthRing = true; + Polygon: function(object, stream) { + streamPolygon(object.coordinates, stream); }, - polygonEnd: function() { - lengthRing = null; + MultiPolygon: function(object, stream) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) streamPolygon(coordinates[i], stream); }, - result: function() { - var length = +lengthSum$1; - lengthSum$1 = new d3Array.Adder(); - return length; + GeometryCollection: function(object, stream) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) streamGeometry(geometries[i], stream); } }; -function lengthPointFirst$1(x, y) { - lengthStream$1.point = lengthPoint$1; - x00$2 = x0$4 = x, y00$2 = y0$4 = y; +function streamLine(coordinates, stream, closed) { + var i = -1, n = coordinates.length - closed, coordinate; + stream.lineStart(); + while (++i < n) coordinate = coordinates[i], stream.point(coordinate[0], coordinate[1], coordinate[2]); + stream.lineEnd(); } -function lengthPoint$1(x, y) { - x0$4 -= x, y0$4 -= y; - lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); - x0$4 = x, y0$4 = y; +function streamPolygon(coordinates, stream) { + var i = -1, n = coordinates.length; + stream.polygonStart(); + while (++i < n) streamLine(coordinates[i], stream, 1); + stream.polygonEnd(); } -function PathString() { - this._string = []; +function geoStream(object, stream) { + if (object && streamObjectType.hasOwnProperty(object.type)) { + streamObjectType[object.type](object, stream); + } else { + streamGeometry(object, stream); + } } -PathString.prototype = { - _radius: 4.5, - _circle: circle$1(4.5), - pointRadius: function(_) { - if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; - return this; - }, +var areaRingSum = new d3Array.Adder(); + +// hello? + +var areaSum = new d3Array.Adder(), + lambda00, + phi00, + lambda0, + cosPhi0, + sinPhi0; + +var areaStream = { + point: noop, + lineStart: noop, + lineEnd: noop, polygonStart: function() { - this._line = 0; + areaRingSum = new d3Array.Adder(); + areaStream.lineStart = areaRingStart; + areaStream.lineEnd = areaRingEnd; }, polygonEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._line === 0) this._string.push("Z"); - this._point = NaN; - }, - point: function(x, y) { - switch (this._point) { - case 0: { - this._string.push("M", x, ",", y); - this._point = 1; - break; - } - case 1: { - this._string.push("L", x, ",", y); - break; - } - default: { - if (this._circle == null) this._circle = circle$1(this._radius); - this._string.push("M", x, ",", y, this._circle); - break; - } - } + var areaRing = +areaRingSum; + areaSum.add(areaRing < 0 ? tau + areaRing : areaRing); + this.lineStart = this.lineEnd = this.point = noop; }, - result: function() { - if (this._string.length) { - var result = this._string.join(""); - this._string = []; - return result; - } else { - return null; - } + sphere: function() { + areaSum.add(tau); } }; -function circle$1(radius) { - return "m0," + radius - + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius - + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius - + "z"; +function areaRingStart() { + areaStream.point = areaPointFirst; } -function index(projection, context) { - var pointRadius = 4.5, - projectionStream, - contextStream; - - function path(object) { - if (object) { - if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); - geoStream(object, projectionStream(contextStream)); - } - return contextStream.result(); - } - - path.area = function(object) { - geoStream(object, projectionStream(areaStream$1)); - return areaStream$1.result(); - }; - - path.measure = function(object) { - geoStream(object, projectionStream(lengthStream$1)); - return lengthStream$1.result(); - }; - - path.bounds = function(object) { - geoStream(object, projectionStream(boundsStream$1)); - return boundsStream$1.result(); - }; - - path.centroid = function(object) { - geoStream(object, projectionStream(centroidStream$1)); - return centroidStream$1.result(); - }; +function areaRingEnd() { + areaPoint(lambda00, phi00); +} - path.projection = function(_) { - return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; - }; +function areaPointFirst(lambda, phi) { + areaStream.point = areaPoint; + lambda00 = lambda, phi00 = phi; + lambda *= radians, phi *= radians; + lambda0 = lambda, cosPhi0 = cos(phi = phi / 2 + quarterPi), sinPhi0 = sin(phi); +} - path.context = function(_) { - if (!arguments.length) return context; - contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); - if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); - return path; - }; +function areaPoint(lambda, phi) { + lambda *= radians, phi *= radians; + phi = phi / 2 + quarterPi; // half the angular distance from south pole - path.pointRadius = function(_) { - if (!arguments.length) return pointRadius; - pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); - return path; - }; + // Spherical excess E for a spherical triangle with vertices: south pole, + // previous point, current point. Uses a formula derived from Cagnoli’s + // theorem. See Todhunter, Spherical Trig. (1871), Sec. 103, Eq. (2). + var dLambda = lambda - lambda0, + sdLambda = dLambda >= 0 ? 1 : -1, + adLambda = sdLambda * dLambda, + cosPhi = cos(phi), + sinPhi = sin(phi), + k = sinPhi0 * sinPhi, + u = cosPhi0 * cosPhi + k * cos(adLambda), + v = k * sdLambda * sin(adLambda); + areaRingSum.add(atan2(v, u)); - return path.projection(projection).context(context); + // Advance the previous points. + lambda0 = lambda, cosPhi0 = cosPhi, sinPhi0 = sinPhi; } -function transform(methods) { - return { - stream: transformer(methods) - }; +function area(object) { + areaSum = new d3Array.Adder(); + geoStream(object, areaStream); + return areaSum * 2; } -function transformer(methods) { - return function(stream) { - var s = new TransformStream; - for (var key in methods) s[key] = methods[key]; - s.stream = stream; - return s; - }; +function spherical(cartesian) { + return [atan2(cartesian[1], cartesian[0]), asin(cartesian[2])]; } -function TransformStream() {} - -TransformStream.prototype = { - constructor: TransformStream, - point: function(x, y) { this.stream.point(x, y); }, - sphere: function() { this.stream.sphere(); }, - lineStart: function() { this.stream.lineStart(); }, - lineEnd: function() { this.stream.lineEnd(); }, - polygonStart: function() { this.stream.polygonStart(); }, - polygonEnd: function() { this.stream.polygonEnd(); } -}; +function cartesian(spherical) { + var lambda = spherical[0], phi = spherical[1], cosPhi = cos(phi); + return [cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)]; +} -function fit(projection, fitBounds, object) { - var clip = projection.clipExtent && projection.clipExtent(); - projection.scale(150).translate([0, 0]); - if (clip != null) projection.clipExtent(null); - geoStream(object, projection.stream(boundsStream$1)); - fitBounds(boundsStream$1.result()); - if (clip != null) projection.clipExtent(clip); - return projection; +function cartesianDot(a, b) { + return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } -function fitExtent(projection, extent, object) { - return fit(projection, function(b) { - var w = extent[1][0] - extent[0][0], - h = extent[1][1] - extent[0][1], - k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), - x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, - y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; - projection.scale(150 * k).translate([x, y]); - }, object); +function cartesianCross(a, b) { + return [a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0]]; } -function fitSize(projection, size, object) { - return fitExtent(projection, [[0, 0], size], object); +// TODO return a +function cartesianAddInPlace(a, b) { + a[0] += b[0], a[1] += b[1], a[2] += b[2]; } -function fitWidth(projection, width, object) { - return fit(projection, function(b) { - var w = +width, - k = w / (b[1][0] - b[0][0]), - x = (w - k * (b[1][0] + b[0][0])) / 2, - y = -k * b[0][1]; - projection.scale(150 * k).translate([x, y]); - }, object); +function cartesianScale(vector, k) { + return [vector[0] * k, vector[1] * k, vector[2] * k]; } -function fitHeight(projection, height, object) { - return fit(projection, function(b) { - var h = +height, - k = h / (b[1][1] - b[0][1]), - x = -k * b[0][0], - y = (h - k * (b[1][1] + b[0][1])) / 2; - projection.scale(150 * k).translate([x, y]); - }, object); +// TODO return d +function cartesianNormalizeInPlace(d) { + var l = sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]); + d[0] /= l, d[1] /= l, d[2] /= l; } -var maxDepth = 16, // maximum depth of subdivision - cosMinDistance = cos(30 * radians); // cos(minimum angular distance) +var lambda0$1, phi0, lambda1, phi1, // bounds + lambda2, // previous lambda-coordinate + lambda00$1, phi00$1, // first point + p0, // previous 3D point + deltaSum, + ranges, + range; -function resample(project, delta2) { - return +delta2 ? resample$1(project, delta2) : resampleNone(project); +var boundsStream = { + point: boundsPoint, + lineStart: boundsLineStart, + lineEnd: boundsLineEnd, + polygonStart: function() { + boundsStream.point = boundsRingPoint; + boundsStream.lineStart = boundsRingStart; + boundsStream.lineEnd = boundsRingEnd; + deltaSum = new d3Array.Adder(); + areaStream.polygonStart(); + }, + polygonEnd: function() { + areaStream.polygonEnd(); + boundsStream.point = boundsPoint; + boundsStream.lineStart = boundsLineStart; + boundsStream.lineEnd = boundsLineEnd; + if (areaRingSum < 0) lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + else if (deltaSum > epsilon) phi1 = 90; + else if (deltaSum < -epsilon) phi0 = -90; + range[0] = lambda0$1, range[1] = lambda1; + }, + sphere: function() { + lambda0$1 = -(lambda1 = 180), phi0 = -(phi1 = 90); + } +}; + +function boundsPoint(lambda, phi) { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; } -function resampleNone(project) { - return transformer({ - point: function(x, y) { - x = project(x, y); - this.stream.point(x[0], x[1]); +function linePoint(lambda, phi) { + var p = cartesian([lambda * radians, phi * radians]); + if (p0) { + var normal = cartesianCross(p0, p), + equatorial = [normal[1], -normal[0], 0], + inflection = cartesianCross(equatorial, normal); + cartesianNormalizeInPlace(inflection); + inflection = spherical(inflection); + var delta = lambda - lambda2, + sign = delta > 0 ? 1 : -1, + lambdai = inflection[0] * degrees * sign, + phii, + antimeridian = abs(delta) > 180; + if (antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = inflection[1] * degrees; + if (phii > phi1) phi1 = phii; + } else if (lambdai = (lambdai + 360) % 360 - 180, antimeridian ^ (sign * lambda2 < lambdai && lambdai < sign * lambda)) { + phii = -inflection[1] * degrees; + if (phii < phi0) phi0 = phii; + } else { + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; } - }); + if (antimeridian) { + if (lambda < lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } else { + if (lambda1 >= lambda0$1) { + if (lambda < lambda0$1) lambda0$1 = lambda; + if (lambda > lambda1) lambda1 = lambda; + } else { + if (lambda > lambda2) { + if (angle(lambda0$1, lambda) > angle(lambda0$1, lambda1)) lambda1 = lambda; + } else { + if (angle(lambda, lambda1) > angle(lambda0$1, lambda1)) lambda0$1 = lambda; + } + } + } + } else { + ranges.push(range = [lambda0$1 = lambda, lambda1 = lambda]); + } + if (phi < phi0) phi0 = phi; + if (phi > phi1) phi1 = phi; + p0 = p, lambda2 = lambda; } -function resample$1(project, delta2) { +function boundsLineStart() { + boundsStream.point = linePoint; +} - function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { - var dx = x1 - x0, - dy = y1 - y0, - d2 = dx * dx + dy * dy; - if (d2 > 4 * delta2 && depth--) { - var a = a0 + a1, - b = b0 + b1, - c = c0 + c1, - m = sqrt(a * a + b * b + c * c), - phi2 = asin(c /= m), - lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), - p = project(lambda2, phi2), - x2 = p[0], - y2 = p[1], - dx2 = x2 - x0, - dy2 = y2 - y0, - dz = dy * dx2 - dx * dy2; - if (dz * dz / d2 > delta2 // perpendicular projected distance - || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end - || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); - stream.point(x2, y2); - resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); - } - } +function boundsLineEnd() { + range[0] = lambda0$1, range[1] = lambda1; + boundsStream.point = boundsPoint; + p0 = null; +} + +function boundsRingPoint(lambda, phi) { + if (p0) { + var delta = lambda - lambda2; + deltaSum.add(abs(delta) > 180 ? delta + (delta > 0 ? 360 : -360) : delta); + } else { + lambda00$1 = lambda, phi00$1 = phi; } - return function(stream) { - var lambda00, x00, y00, a00, b00, c00, // first point - lambda0, x0, y0, a0, b0, c0; // previous point + areaStream.point(lambda, phi); + linePoint(lambda, phi); +} - var resampleStream = { - point: point, - lineStart: lineStart, - lineEnd: lineEnd, - polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, - polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } - }; +function boundsRingStart() { + areaStream.lineStart(); +} - function point(x, y) { - x = project(x, y); - stream.point(x[0], x[1]); - } +function boundsRingEnd() { + boundsRingPoint(lambda00$1, phi00$1); + areaStream.lineEnd(); + if (abs(deltaSum) > epsilon) lambda0$1 = -(lambda1 = 180); + range[0] = lambda0$1, range[1] = lambda1; + p0 = null; +} - function lineStart() { - x0 = NaN; - resampleStream.point = linePoint; - stream.lineStart(); - } +// Finds the left-right distance between two longitudes. +// This is almost the same as (lambda1 - lambda0 + 360°) % 360°, except that we want +// the distance between ±180° to be 360°. +function angle(lambda0, lambda1) { + return (lambda1 -= lambda0) < 0 ? lambda1 + 360 : lambda1; +} - function linePoint(lambda, phi) { - var c = cartesian([lambda, phi]), p = project(lambda, phi); - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); - stream.point(x0, y0); - } +function rangeCompare(a, b) { + return a[0] - b[0]; +} - function lineEnd() { - resampleStream.point = point; - stream.lineEnd(); - } +function rangeContains(range, x) { + return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x; +} - function ringStart() { - lineStart(); - resampleStream.point = ringPoint; - resampleStream.lineEnd = ringEnd; - } +function bounds(feature) { + var i, n, a, b, merged, deltaMax, delta; - function ringPoint(lambda, phi) { - linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; - resampleStream.point = linePoint; + phi1 = lambda1 = -(lambda0$1 = phi0 = Infinity); + ranges = []; + geoStream(feature, boundsStream); + + // First, sort ranges by their minimum longitudes. + if (n = ranges.length) { + ranges.sort(rangeCompare); + + // Then, merge any ranges that overlap. + for (i = 1, a = ranges[0], merged = [a]; i < n; ++i) { + b = ranges[i]; + if (rangeContains(a, b[0]) || rangeContains(a, b[1])) { + if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1]; + if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0]; + } else { + merged.push(a = b); + } } - function ringEnd() { - resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); - resampleStream.lineEnd = lineEnd; - lineEnd(); + // Finally, find the largest gap between the merged ranges. + // The final bounding box will be the inverse of this gap. + for (deltaMax = -Infinity, n = merged.length - 1, i = 0, a = merged[n]; i <= n; a = b, ++i) { + b = merged[i]; + if ((delta = angle(a[1], b[0])) > deltaMax) deltaMax = delta, lambda0$1 = b[0], lambda1 = a[1]; } + } - return resampleStream; - }; + ranges = range = null; + + return lambda0$1 === Infinity || phi0 === Infinity + ? [[NaN, NaN], [NaN, NaN]] + : [[lambda0$1, phi0], [lambda1, phi1]]; } -var transformRadians = transformer({ - point: function(x, y) { - this.stream.point(x * radians, y * radians); +var W0, W1, + X0, Y0, Z0, + X1, Y1, Z1, + X2, Y2, Z2, + lambda00$2, phi00$2, // first point + x0, y0, z0; // previous point + +var centroidStream = { + sphere: noop, + point: centroidPoint, + lineStart: centroidLineStart, + lineEnd: centroidLineEnd, + polygonStart: function() { + centroidStream.lineStart = centroidRingStart; + centroidStream.lineEnd = centroidRingEnd; + }, + polygonEnd: function() { + centroidStream.lineStart = centroidLineStart; + centroidStream.lineEnd = centroidLineEnd; } -}); +}; -function transformRotate(rotate) { - return transformer({ - point: function(x, y) { - var r = rotate(x, y); - return this.stream.point(r[0], r[1]); - } - }); +// Arithmetic mean of Cartesian vectors. +function centroidPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + centroidPointCartesian(cosPhi * cos(lambda), cosPhi * sin(lambda), sin(phi)); } -function scaleTranslate(k, dx, dy, sx, sy) { - function transform(x, y) { - x *= sx; y *= sy; - return [dx + k * x, dy - k * y]; - } - transform.invert = function(x, y) { - return [(x - dx) / k * sx, (dy - y) / k * sy]; - }; - return transform; +function centroidPointCartesian(x, y, z) { + ++W0; + X0 += (x - X0) / W0; + Y0 += (y - Y0) / W0; + Z0 += (z - Z0) / W0; } -function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { - if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); - var cosAlpha = cos(alpha), - sinAlpha = sin(alpha), - a = cosAlpha * k, - b = sinAlpha * k, - ai = cosAlpha / k, - bi = sinAlpha / k, - ci = (sinAlpha * dy - cosAlpha * dx) / k, - fi = (sinAlpha * dx + cosAlpha * dy) / k; - function transform(x, y) { - x *= sx; y *= sy; - return [a * x - b * y + dx, dy - b * x - a * y]; - } - transform.invert = function(x, y) { - return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; - }; - return transform; +function centroidLineStart() { + centroidStream.point = centroidLinePointFirst; } -function projection(project) { - return projectionMutator(function() { return project; })(); +function centroidLinePointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidStream.point = centroidLinePoint; + centroidPointCartesian(x0, y0, z0); } -function projectionMutator(projectAt) { - var project, - k = 150, // scale - x = 480, y = 250, // translate - lambda = 0, phi = 0, // center - deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate - alpha = 0, // post-rotate angle - sx = 1, // reflectX - sy = 1, // reflectX - theta = null, preclip = clipAntimeridian, // pre-clip angle - x0 = null, y0, x1, y1, postclip = identity, // post-clip extent - delta2 = 0.5, // precision - projectResample, - projectTransform, - projectRotateTransform, - cache, - cacheStream; - - function projection(point) { - return projectRotateTransform(point[0] * radians, point[1] * radians); - } - - function invert(point) { - point = projectRotateTransform.invert(point[0], point[1]); - return point && [point[0] * degrees, point[1] * degrees]; - } - - projection.stream = function(stream) { - return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); - }; - - projection.preclip = function(_) { - return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; - }; - - projection.postclip = function(_) { - return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; - }; +function centroidLinePoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + w = atan2(sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} - projection.clipAngle = function(_) { - return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; - }; +function centroidLineEnd() { + centroidStream.point = centroidPoint; +} - projection.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }; +// See J. E. Brock, The Inertia Tensor for a Spherical Triangle, +// J. Applied Mechanics 42, 239 (1975). +function centroidRingStart() { + centroidStream.point = centroidRingPointFirst; +} - projection.scale = function(_) { - return arguments.length ? (k = +_, recenter()) : k; - }; +function centroidRingEnd() { + centroidRingPoint(lambda00$2, phi00$2); + centroidStream.point = centroidPoint; +} - projection.translate = function(_) { - return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; - }; +function centroidRingPointFirst(lambda, phi) { + lambda00$2 = lambda, phi00$2 = phi; + lambda *= radians, phi *= radians; + centroidStream.point = centroidRingPoint; + var cosPhi = cos(phi); + x0 = cosPhi * cos(lambda); + y0 = cosPhi * sin(lambda); + z0 = sin(phi); + centroidPointCartesian(x0, y0, z0); +} - projection.center = function(_) { - return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; - }; +function centroidRingPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var cosPhi = cos(phi), + x = cosPhi * cos(lambda), + y = cosPhi * sin(lambda), + z = sin(phi), + cx = y0 * z - z0 * y, + cy = z0 * x - x0 * z, + cz = x0 * y - y0 * x, + m = hypot(cx, cy, cz), + w = asin(m), // line weight = angle + v = m && -w / m; // area weight multiplier + X2.add(v * cx); + Y2.add(v * cy); + Z2.add(v * cz); + W1 += w; + X1 += w * (x0 + (x0 = x)); + Y1 += w * (y0 + (y0 = y)); + Z1 += w * (z0 + (z0 = z)); + centroidPointCartesian(x0, y0, z0); +} - projection.rotate = function(_) { - return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; - }; +function centroid(object) { + W0 = W1 = + X0 = Y0 = Z0 = + X1 = Y1 = Z1 = 0; + X2 = new d3Array.Adder(); + Y2 = new d3Array.Adder(); + Z2 = new d3Array.Adder(); + geoStream(object, centroidStream); - projection.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; - }; + var x = +X2, + y = +Y2, + z = +Z2, + m = hypot(x, y, z); - projection.reflectX = function(_) { - return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; - }; + // If the area-weighted ccentroid is undefined, fall back to length-weighted ccentroid. + if (m < epsilon2) { + x = X1, y = Y1, z = Z1; + // If the feature has zero length, fall back to arithmetic mean of point vectors. + if (W1 < epsilon) x = X0, y = Y0, z = Z0; + m = hypot(x, y, z); + // If the feature still has an undefined ccentroid, then return. + if (m < epsilon2) return [NaN, NaN]; + } - projection.reflectY = function(_) { - return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; - }; + return [atan2(y, x) * degrees, asin(z / m) * degrees]; +} - projection.precision = function(_) { - return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); +function constant(x) { + return function() { + return x; }; +} - projection.fitExtent = function(extent, object) { - return fitExtent(projection, extent, object); - }; +function compose(a, b) { - projection.fitSize = function(size, object) { - return fitSize(projection, size, object); - }; + function compose(x, y) { + return x = a(x, y), b(x[0], x[1]); + } - projection.fitWidth = function(width, object) { - return fitWidth(projection, width, object); + if (a.invert && b.invert) compose.invert = function(x, y) { + return x = b.invert(x, y), x && a.invert(x[0], x[1]); }; - projection.fitHeight = function(height, object) { - return fitHeight(projection, height, object); - }; + return compose; +} - function recenter() { - var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), - transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); - rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); - projectTransform = compose(project, transform); - projectRotateTransform = compose(rotate, projectTransform); - projectResample = resample(projectTransform, delta2); - return reset(); - } +function rotationIdentity(lambda, phi) { + return [abs(lambda) > pi ? lambda + Math.round(-lambda / tau) * tau : lambda, phi]; +} - function reset() { - cache = cacheStream = null; - return projection; - } +rotationIdentity.invert = rotationIdentity; - return function() { - project = projectAt.apply(this, arguments); - projection.invert = project.invert && invert; - return recenter(); - }; +function rotateRadians(deltaLambda, deltaPhi, deltaGamma) { + return (deltaLambda %= tau) ? (deltaPhi || deltaGamma ? compose(rotationLambda(deltaLambda), rotationPhiGamma(deltaPhi, deltaGamma)) + : rotationLambda(deltaLambda)) + : (deltaPhi || deltaGamma ? rotationPhiGamma(deltaPhi, deltaGamma) + : rotationIdentity); } -function conicProjection(projectAt) { - var phi0 = 0, - phi1 = pi / 3, - m = projectionMutator(projectAt), - p = m(phi0, phi1); - - p.parallels = function(_) { - return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; +function forwardRotationLambda(deltaLambda) { + return function(lambda, phi) { + return lambda += deltaLambda, [lambda > pi ? lambda - tau : lambda < -pi ? lambda + tau : lambda, phi]; }; +} - return p; +function rotationLambda(deltaLambda) { + var rotation = forwardRotationLambda(deltaLambda); + rotation.invert = forwardRotationLambda(-deltaLambda); + return rotation; } -function cylindricalEqualAreaRaw(phi0) { - var cosPhi0 = cos(phi0); +function rotationPhiGamma(deltaPhi, deltaGamma) { + var cosDeltaPhi = cos(deltaPhi), + sinDeltaPhi = sin(deltaPhi), + cosDeltaGamma = cos(deltaGamma), + sinDeltaGamma = sin(deltaGamma); - function forward(lambda, phi) { - return [lambda * cosPhi0, sin(phi) / cosPhi0]; + function rotation(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaPhi + x * sinDeltaPhi; + return [ + atan2(y * cosDeltaGamma - k * sinDeltaGamma, x * cosDeltaPhi - z * sinDeltaPhi), + asin(k * cosDeltaGamma + y * sinDeltaGamma) + ]; } - forward.invert = function(x, y) { - return [x / cosPhi0, asin(y * cosPhi0)]; + rotation.invert = function(lambda, phi) { + var cosPhi = cos(phi), + x = cos(lambda) * cosPhi, + y = sin(lambda) * cosPhi, + z = sin(phi), + k = z * cosDeltaGamma - y * sinDeltaGamma; + return [ + atan2(y * cosDeltaGamma + z * sinDeltaGamma, x * cosDeltaPhi + k * sinDeltaPhi), + asin(k * cosDeltaPhi - x * sinDeltaPhi) + ]; }; - return forward; + return rotation; } -function conicEqualAreaRaw(y0, y1) { - var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; - - // Are the parallels symmetrical around the Equator? - if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); - - var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; +function rotation(rotate) { + rotate = rotateRadians(rotate[0] * radians, rotate[1] * radians, rotate.length > 2 ? rotate[2] * radians : 0); - function project(x, y) { - var r = sqrt(c - 2 * n * sin(y)) / n; - return [r * sin(x *= n), r0 - r * cos(x)]; + function forward(coordinates) { + coordinates = rotate(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; } - project.invert = function(x, y) { - var r0y = r0 - y, - l = atan2(x, abs(r0y)) * sign(r0y); - if (r0y * n < 0) - l -= pi * sign(x) * sign(r0y); - return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + forward.invert = function(coordinates) { + coordinates = rotate.invert(coordinates[0] * radians, coordinates[1] * radians); + return coordinates[0] *= degrees, coordinates[1] *= degrees, coordinates; }; - return project; -} - -function conicEqualArea() { - return conicProjection(conicEqualAreaRaw) - .scale(155.424) - .center([0, 33.6442]); + return forward; } -function albers() { - return conicEqualArea() - .parallels([29.5, 45.5]) - .scale(1070) - .translate([480, 250]) - .rotate([96, 0]) - .center([-0.6, 38.7]); +// Generates a circle centered at [0°, 0°], with a given radius and precision. +function circleStream(stream, radius, delta, direction, t0, t1) { + if (!delta) return; + var cosRadius = cos(radius), + sinRadius = sin(radius), + step = direction * delta; + if (t0 == null) { + t0 = radius + direction * tau; + t1 = radius - step / 2; + } else { + t0 = circleRadius(cosRadius, t0); + t1 = circleRadius(cosRadius, t1); + if (direction > 0 ? t0 < t1 : t0 > t1) t0 += direction * tau; + } + for (var point, t = t0; direction > 0 ? t > t1 : t < t1; t -= step) { + point = spherical([cosRadius, -sinRadius * cos(t), -sinRadius * sin(t)]); + stream.point(point[0], point[1]); + } } -// The projections must have mutually exclusive clip regions on the sphere, -// as this will avoid emitting interleaving lines and polygons. -function multiplex(streams) { - var n = streams.length; - return { - point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, - sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, - lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, - lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, - polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, - polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } - }; +// Returns the signed angle of a cartesian point relative to [cosRadius, 0, 0]. +function circleRadius(cosRadius, point) { + point = cartesian(point), point[0] -= cosRadius; + cartesianNormalizeInPlace(point); + var radius = acos(-point[1]); + return ((-point[2] < 0 ? -radius : radius) + tau - epsilon) % tau; } -// A composite projection for the United States, configured by default for -// 960×500. The projection also works quite well at 960×600 if you change the -// scale to 1285 and adjust the translate accordingly. The set of standard -// parallels for each region comes from USGS, which is published here: -// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers -function albersUsa() { - var cache, - cacheStream, - lower48 = albers(), lower48Point, - alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 - hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 - point, pointStream = {point: function(x, y) { point = [x, y]; }}; +function circle() { + var center = constant([0, 0]), + radius = constant(90), + precision = constant(6), + ring, + rotate, + stream = {point: point}; - function albersUsa(coordinates) { - var x = coordinates[0], y = coordinates[1]; - return point = null, - (lower48Point.point(x, y), point) - || (alaskaPoint.point(x, y), point) - || (hawaiiPoint.point(x, y), point); + function point(x, y) { + ring.push(x = rotate(x, y)); + x[0] *= degrees, x[1] *= degrees; } - albersUsa.invert = function(coordinates) { - var k = lower48.scale(), - t = lower48.translate(), - x = (coordinates[0] - t[0]) / k, - y = (coordinates[1] - t[1]) / k; - return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska - : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii - : lower48).invert(coordinates); - }; + function circle() { + var c = center.apply(this, arguments), + r = radius.apply(this, arguments) * radians, + p = precision.apply(this, arguments) * radians; + ring = []; + rotate = rotateRadians(-c[0] * radians, -c[1] * radians, 0).invert; + circleStream(stream, r, p, 1); + c = {type: "Polygon", coordinates: [ring]}; + ring = rotate = null; + return c; + } - albersUsa.stream = function(stream) { - return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + circle.center = function(_) { + return arguments.length ? (center = typeof _ === "function" ? _ : constant([+_[0], +_[1]]), circle) : center; }; - albersUsa.precision = function(_) { - if (!arguments.length) return lower48.precision(); - lower48.precision(_), alaska.precision(_), hawaii.precision(_); - return reset(); + circle.radius = function(_) { + return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), circle) : radius; }; - albersUsa.scale = function(_) { - if (!arguments.length) return lower48.scale(); - lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); - return albersUsa.translate(lower48.translate()); + circle.precision = function(_) { + return arguments.length ? (precision = typeof _ === "function" ? _ : constant(+_), circle) : precision; }; - albersUsa.translate = function(_) { - if (!arguments.length) return lower48.translate(); - var k = lower48.scale(), x = +_[0], y = +_[1]; + return circle; +} - lower48Point = lower48 - .translate(_) - .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) - .stream(pointStream); +function clipBuffer() { + var lines = [], + line; + return { + point: function(x, y, m) { + line.push([x, y, m]); + }, + lineStart: function() { + lines.push(line = []); + }, + lineEnd: noop, + rejoin: function() { + if (lines.length > 1) lines.push(lines.pop().concat(lines.shift())); + }, + result: function() { + var result = lines; + lines = []; + line = null; + return result; + } + }; +} - alaskaPoint = alaska - .translate([x - 0.307 * k, y + 0.201 * k]) - .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) - .stream(pointStream); +function pointEqual(a, b) { + return abs(a[0] - b[0]) < epsilon && abs(a[1] - b[1]) < epsilon; +} - hawaiiPoint = hawaii - .translate([x - 0.205 * k, y + 0.212 * k]) - .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) - .stream(pointStream); +function Intersection(point, points, other, entry) { + this.x = point; + this.z = points; + this.o = other; // another intersection + this.e = entry; // is an entry? + this.v = false; // visited + this.n = this.p = null; // next & previous +} - return reset(); - }; +// A generalized polygon clipping algorithm: given a polygon that has been cut +// into its visible line segments, and rejoins the segments by interpolating +// along the clip edge. +function clipRejoin(segments, compareIntersection, startInside, interpolate, stream) { + var subject = [], + clip = [], + i, + n; - albersUsa.fitExtent = function(extent, object) { - return fitExtent(albersUsa, extent, object); - }; + segments.forEach(function(segment) { + if ((n = segment.length - 1) <= 0) return; + var n, p0 = segment[0], p1 = segment[n], x; - albersUsa.fitSize = function(size, object) { - return fitSize(albersUsa, size, object); - }; + if (pointEqual(p0, p1)) { + if (!p0[2] && !p1[2]) { + stream.lineStart(); + for (i = 0; i < n; ++i) stream.point((p0 = segment[i])[0], p0[1]); + stream.lineEnd(); + return; + } + // handle degenerate cases by moving the point + p1[0] += 2 * epsilon; + } - albersUsa.fitWidth = function(width, object) { - return fitWidth(albersUsa, width, object); - }; + subject.push(x = new Intersection(p0, segment, null, true)); + clip.push(x.o = new Intersection(p0, null, x, false)); + subject.push(x = new Intersection(p1, segment, null, false)); + clip.push(x.o = new Intersection(p1, null, x, true)); + }); - albersUsa.fitHeight = function(height, object) { - return fitHeight(albersUsa, height, object); - }; + if (!subject.length) return; - function reset() { - cache = cacheStream = null; - return albersUsa; + clip.sort(compareIntersection); + link(subject); + link(clip); + + for (i = 0, n = clip.length; i < n; ++i) { + clip[i].e = startInside = !startInside; } - return albersUsa.scale(1070); -} + var start = subject[0], + points, + point; -function azimuthalRaw(scale) { - return function(x, y) { - var cx = cos(x), - cy = cos(y), - k = scale(cx * cy); - if (k === Infinity) return [2, 0]; - return [ - k * cy * sin(x), - k * sin(y) - ]; + while (1) { + // Find first unvisited intersection. + var current = start, + isSubject = true; + while (current.v) if ((current = current.n) === start) return; + points = current.z; + stream.lineStart(); + do { + current.v = current.o.v = true; + if (current.e) { + if (isSubject) { + for (i = 0, n = points.length; i < n; ++i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.n.x, 1, stream); + } + current = current.n; + } else { + if (isSubject) { + points = current.p.z; + for (i = points.length - 1; i >= 0; --i) stream.point((point = points[i])[0], point[1]); + } else { + interpolate(current.x, current.p.x, -1, stream); + } + current = current.p; + } + current = current.o; + points = current.z; + isSubject = !isSubject; + } while (!current.v); + stream.lineEnd(); } } -function azimuthalInvert(angle) { - return function(x, y) { - var z = sqrt(x * x + y * y), - c = angle(z), - sc = sin(c), - cc = cos(c); - return [ - atan2(x * sc, z * cc), - asin(z && y * sc / z) - ]; +function link(array) { + if (!(n = array.length)) return; + var n, + i = 0, + a = array[0], + b; + while (++i < n) { + a.n = b = array[i]; + b.p = a; + a = b; } + a.n = b = array[0]; + b.p = a; } -var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { - return sqrt(2 / (1 + cxcy)); -}); - -azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { - return 2 * asin(z / 2); -}); - -function azimuthalEqualArea() { - return projection(azimuthalEqualAreaRaw) - .scale(124.75) - .clipAngle(180 - 1e-3); -} - -var azimuthalEquidistantRaw = azimuthalRaw(function(c) { - return (c = acos(c)) && c / sin(c); -}); - -azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { - return z; -}); - -function azimuthalEquidistant() { - return projection(azimuthalEquidistantRaw) - .scale(79.4188) - .clipAngle(180 - 1e-3); -} - -function mercatorRaw(lambda, phi) { - return [lambda, log(tan((halfPi + phi) / 2))]; +function longitude(point) { + if (abs(point[0]) <= pi) + return point[0]; + else + return sign(point[0]) * ((abs(point[0]) + pi) % tau - pi); } -mercatorRaw.invert = function(x, y) { - return [x, 2 * atan(exp(y)) - halfPi]; -}; - -function mercator() { - return mercatorProjection(mercatorRaw) - .scale(961 / tau); -} +function polygonContains(polygon, point) { + var lambda = longitude(point), + phi = point[1], + sinPhi = sin(phi), + normal = [sin(lambda), -cos(lambda), 0], + angle = 0, + winding = 0; -function mercatorProjection(project) { - var m = projection(project), - center = m.center, - scale = m.scale, - translate = m.translate, - clipExtent = m.clipExtent, - x0 = null, y0, x1, y1; // clip extent + var sum = new d3Array.Adder(); - m.scale = function(_) { - return arguments.length ? (scale(_), reclip()) : scale(); - }; + if (sinPhi === 1) phi = halfPi + epsilon; + else if (sinPhi === -1) phi = -halfPi - epsilon; - m.translate = function(_) { - return arguments.length ? (translate(_), reclip()) : translate(); - }; + for (var i = 0, n = polygon.length; i < n; ++i) { + if (!(m = (ring = polygon[i]).length)) continue; + var ring, + m, + point0 = ring[m - 1], + lambda0 = longitude(point0), + phi0 = point0[1] / 2 + quarterPi, + sinPhi0 = sin(phi0), + cosPhi0 = cos(phi0); - m.center = function(_) { - return arguments.length ? (center(_), reclip()) : center(); - }; + for (var j = 0; j < m; ++j, lambda0 = lambda1, sinPhi0 = sinPhi1, cosPhi0 = cosPhi1, point0 = point1) { + var point1 = ring[j], + lambda1 = longitude(point1), + phi1 = point1[1] / 2 + quarterPi, + sinPhi1 = sin(phi1), + cosPhi1 = cos(phi1), + delta = lambda1 - lambda0, + sign = delta >= 0 ? 1 : -1, + absDelta = sign * delta, + antimeridian = absDelta > pi, + k = sinPhi0 * sinPhi1; - m.clipExtent = function(_) { - return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }; + sum.add(atan2(k * sign * sin(absDelta), cosPhi0 * cosPhi1 + k * cos(absDelta))); + angle += antimeridian ? delta + sign * tau : delta; - function reclip() { - var k = pi * scale(), - t = m(rotation(m.rotate()).invert([0, 0])); - return clipExtent(x0 == null - ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw - ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] - : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); + // Are the longitudes either side of the point’s meridian (lambda), + // and are the latitudes smaller than the parallel (phi)? + if (antimeridian ^ lambda0 >= lambda ^ lambda1 >= lambda) { + var arc = cartesianCross(cartesian(point0), cartesian(point1)); + cartesianNormalizeInPlace(arc); + var intersection = cartesianCross(normal, arc); + cartesianNormalizeInPlace(intersection); + var phiArc = (antimeridian ^ delta >= 0 ? -1 : 1) * asin(intersection[2]); + if (phi > phiArc || phi === phiArc && (arc[0] || arc[1])) { + winding += antimeridian ^ delta >= 0 ? 1 : -1; + } + } + } } - return reclip(); -} + // First, determine whether the South pole is inside or outside: + // + // It is inside if: + // * the polygon winds around it in a clockwise direction. + // * the polygon does not (cumulatively) wind around it, but has a negative + // (counter-clockwise) area. + // + // Second, count the (signed) number of times a segment crosses a lambda + // from the point to the South pole. If it is zero, then the point is the + // same side as the South pole. -function tany(y) { - return tan((halfPi + y) / 2); + return (angle < -epsilon || angle < epsilon && sum < -epsilon2) ^ (winding & 1); } -function conicConformalRaw(y0, y1) { - var cy0 = cos(y0), - n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), - f = cy0 * pow(tany(y0), n) / n; +function clip(pointVisible, clipLine, interpolate, start) { + return function(sink) { + var line = clipLine(sink), + ringBuffer = clipBuffer(), + ringSink = clipLine(ringBuffer), + polygonStarted = false, + polygon, + segments, + ring; - if (!n) return mercatorRaw; + var clip = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { + clip.point = pointRing; + clip.lineStart = ringStart; + clip.lineEnd = ringEnd; + segments = []; + polygon = []; + }, + polygonEnd: function() { + clip.point = point; + clip.lineStart = lineStart; + clip.lineEnd = lineEnd; + segments = d3Array.merge(segments); + var startInside = polygonContains(polygon, start); + if (segments.length) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + clipRejoin(segments, compareIntersection, startInside, interpolate, sink); + } else if (startInside) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + } + if (polygonStarted) sink.polygonEnd(), polygonStarted = false; + segments = polygon = null; + }, + sphere: function() { + sink.polygonStart(); + sink.lineStart(); + interpolate(null, null, 1, sink); + sink.lineEnd(); + sink.polygonEnd(); + } + }; - function project(x, y) { - if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; } - else { if (y > halfPi - epsilon) y = halfPi - epsilon; } - var r = f / pow(tany(y), n); - return [r * sin(n * x), f - r * cos(n * x)]; - } + function point(lambda, phi) { + if (pointVisible(lambda, phi)) sink.point(lambda, phi); + } - project.invert = function(x, y) { - var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), - l = atan2(x, abs(fy)) * sign(fy); - if (fy * n < 0) - l -= pi * sign(x) * sign(fy); - return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi]; - }; + function pointLine(lambda, phi) { + line.point(lambda, phi); + } - return project; -} + function lineStart() { + clip.point = pointLine; + line.lineStart(); + } -function conicConformal() { - return conicProjection(conicConformalRaw) - .scale(109.5) - .parallels([30, 30]); -} + function lineEnd() { + clip.point = point; + line.lineEnd(); + } -function equirectangularRaw(lambda, phi) { - return [lambda, phi]; -} + function pointRing(lambda, phi) { + ring.push([lambda, phi]); + ringSink.point(lambda, phi); + } -equirectangularRaw.invert = equirectangularRaw; + function ringStart() { + ringSink.lineStart(); + ring = []; + } -function equirectangular() { - return projection(equirectangularRaw) - .scale(152.63); -} + function ringEnd() { + pointRing(ring[0][0], ring[0][1]); + ringSink.lineEnd(); -function conicEquidistantRaw(y0, y1) { - var cy0 = cos(y0), - n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), - g = cy0 / n + y0; + var clean = ringSink.clean(), + ringSegments = ringBuffer.result(), + i, n = ringSegments.length, m, + segment, + point; - if (abs(n) < epsilon) return equirectangularRaw; + ring.pop(); + polygon.push(ring); + ring = null; - function project(x, y) { - var gy = g - y, nx = n * x; - return [gy * sin(nx), g - gy * cos(nx)]; - } + if (!n) return; - project.invert = function(x, y) { - var gy = g - y, - l = atan2(x, abs(gy)) * sign(gy); - if (gy * n < 0) - l -= pi * sign(x) * sign(gy); - return [l / n, g - sign(n) * sqrt(x * x + gy * gy)]; - }; + // No intersections. + if (clean & 1) { + segment = ringSegments[0]; + if ((m = segment.length - 1) > 0) { + if (!polygonStarted) sink.polygonStart(), polygonStarted = true; + sink.lineStart(); + for (i = 0; i < m; ++i) sink.point((point = segment[i])[0], point[1]); + sink.lineEnd(); + } + return; + } - return project; -} + // Rejoin connected segments. + // TODO reuse ringBuffer.rejoin()? + if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift())); -function conicEquidistant() { - return conicProjection(conicEquidistantRaw) - .scale(131.154) - .center([0, 13.9389]); + segments.push(ringSegments.filter(validSegment)); + } + + return clip; + }; } -var A1 = 1.340264, - A2 = -0.081106, - A3 = 0.000893, - A4 = 0.003796, - M = sqrt(3) / 2, - iterations = 12; +function validSegment(segment) { + return segment.length > 1; +} -function equalEarthRaw(lambda, phi) { - var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; - return [ - lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), - l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - ]; +// Intersections are sorted along the clip edge. For both antimeridian cutting +// and circle clipping, the same comparison is used. +function compareIntersection(a, b) { + return ((a = a.x)[0] < 0 ? a[1] - halfPi - epsilon : halfPi - a[1]) + - ((b = b.x)[0] < 0 ? b[1] - halfPi - epsilon : halfPi - b[1]); } -equalEarthRaw.invert = function(x, y) { - var l = y, l2 = l * l, l6 = l2 * l2 * l2; - for (var i = 0, delta, fy, fpy; i < iterations; ++i) { - fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; - fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); - l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; - if (abs(delta) < epsilon2) break; - } - return [ - M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), - asin(sin(l) / M) - ]; -}; +var clipAntimeridian = clip( + function() { return true; }, + clipAntimeridianLine, + clipAntimeridianInterpolate, + [-pi, -halfPi] +); -function equalEarth() { - return projection(equalEarthRaw) - .scale(177.158); -} +// Takes a line and cuts into visible segments. Return values: 0 - there were +// intersections or the line was empty; 1 - no intersections; 2 - there were +// intersections, and the first and last segments should be rejoined. +function clipAntimeridianLine(stream) { + var lambda0 = NaN, + phi0 = NaN, + sign0 = NaN, + clean; // no intersections -function gnomonicRaw(x, y) { - var cy = cos(y), k = cos(x) * cy; - return [cy * sin(x) / k, sin(y) / k]; + return { + lineStart: function() { + stream.lineStart(); + clean = 1; + }, + point: function(lambda1, phi1) { + var sign1 = lambda1 > 0 ? pi : -pi, + delta = abs(lambda1 - lambda0); + if (abs(delta - pi) < epsilon) { // line crosses a pole + stream.point(lambda0, phi0 = (phi0 + phi1) / 2 > 0 ? halfPi : -halfPi); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + stream.point(lambda1, phi0); + clean = 0; + } else if (sign0 !== sign1 && delta >= pi) { // line crosses antimeridian + if (abs(lambda0 - sign0) < epsilon) lambda0 -= sign0 * epsilon; // handle degeneracies + if (abs(lambda1 - sign1) < epsilon) lambda1 -= sign1 * epsilon; + phi0 = clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1); + stream.point(sign0, phi0); + stream.lineEnd(); + stream.lineStart(); + stream.point(sign1, phi0); + clean = 0; + } + stream.point(lambda0 = lambda1, phi0 = phi1); + sign0 = sign1; + }, + lineEnd: function() { + stream.lineEnd(); + lambda0 = phi0 = NaN; + }, + clean: function() { + return 2 - clean; // if intersections, rejoin first and last segments + } + }; } -gnomonicRaw.invert = azimuthalInvert(atan); +function clipAntimeridianIntersect(lambda0, phi0, lambda1, phi1) { + var cosPhi0, + cosPhi1, + sinLambda0Lambda1 = sin(lambda0 - lambda1); + return abs(sinLambda0Lambda1) > epsilon + ? atan((sin(phi0) * (cosPhi1 = cos(phi1)) * sin(lambda1) + - sin(phi1) * (cosPhi0 = cos(phi0)) * sin(lambda0)) + / (cosPhi0 * cosPhi1 * sinLambda0Lambda1)) + : (phi0 + phi1) / 2; +} -function gnomonic() { - return projection(gnomonicRaw) - .scale(144.049) - .clipAngle(60); +function clipAntimeridianInterpolate(from, to, direction, stream) { + var phi; + if (from == null) { + phi = direction * halfPi; + stream.point(-pi, phi); + stream.point(0, phi); + stream.point(pi, phi); + stream.point(pi, 0); + stream.point(pi, -phi); + stream.point(0, -phi); + stream.point(-pi, -phi); + stream.point(-pi, 0); + stream.point(-pi, phi); + } else if (abs(from[0] - to[0]) > epsilon) { + var lambda = from[0] < to[0] ? pi : -pi; + phi = direction * lambda / 2; + stream.point(-lambda, phi); + stream.point(0, phi); + stream.point(lambda, phi); + } else { + stream.point(to[0], to[1]); + } } -function identity$1() { - var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect - alpha = 0, ca, sa, // angle - x0 = null, y0, x1, y1, // clip extent - kx = 1, ky = 1, - transform = transformer({ - point: function(x, y) { - var p = projection([x, y]); - this.stream.point(p[0], p[1]); - } - }), - postclip = identity, - cache, - cacheStream; +function clipCircle(radius) { + var cr = cos(radius), + delta = 6 * radians, + smallRadius = cr > 0, + notHemisphere = abs(cr) > epsilon; // TODO optimise for this common case - function reset() { - kx = k * sx; - ky = k * sy; - cache = cacheStream = null; - return projection; + function interpolate(from, to, direction, stream) { + circleStream(stream, radius, delta, direction, from, to); } - function projection (p) { - var x = p[0] * kx, y = p[1] * ky; - if (alpha) { - var t = y * ca - x * sa; - x = x * ca + y * sa; - y = t; - } - return [x + tx, y + ty]; + function visible(lambda, phi) { + return cos(lambda) * cos(phi) > cr; + } + + // Takes a line and cuts into visible segments. Return values used for polygon + // clipping: 0 - there were intersections or the line was empty; 1 - no + // intersections 2 - there were intersections, and the first and last segments + // should be rejoined. + function clipLine(stream) { + var point0, // previous point + c0, // code for previous point + v0, // visibility of previous point + v00, // visibility of first point + clean; // no intersections + return { + lineStart: function() { + v00 = v0 = false; + clean = 1; + }, + point: function(lambda, phi) { + var point1 = [lambda, phi], + point2, + v = visible(lambda, phi), + c = smallRadius + ? v ? 0 : code(lambda, phi) + : v ? code(lambda + (lambda < 0 ? pi : -pi), phi) : 0; + if (!point0 && (v00 = v0 = v)) stream.lineStart(); + if (v !== v0) { + point2 = intersect(point0, point1); + if (!point2 || pointEqual(point0, point2) || pointEqual(point1, point2)) + point1[2] = 1; + } + if (v !== v0) { + clean = 0; + if (v) { + // outside going in + stream.lineStart(); + point2 = intersect(point1, point0); + stream.point(point2[0], point2[1]); + } else { + // inside going out + point2 = intersect(point0, point1); + stream.point(point2[0], point2[1], 2); + stream.lineEnd(); + } + point0 = point2; + } else if (notHemisphere && point0 && smallRadius ^ v) { + var t; + // If the codes for two points are different, or are both zero, + // and there this segment intersects with the small circle. + if (!(c & c0) && (t = intersect(point1, point0, true))) { + clean = 0; + if (smallRadius) { + stream.lineStart(); + stream.point(t[0][0], t[0][1]); + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + } else { + stream.point(t[1][0], t[1][1]); + stream.lineEnd(); + stream.lineStart(); + stream.point(t[0][0], t[0][1], 3); + } + } + } + if (v && (!point0 || !pointEqual(point0, point1))) { + stream.point(point1[0], point1[1]); + } + point0 = point1, v0 = v, c0 = c; + }, + lineEnd: function() { + if (v0) stream.lineEnd(); + point0 = null; + }, + // Rejoin first and last segments if there were intersections and the first + // and last points were visible. + clean: function() { + return clean | ((v00 && v0) << 1); + } + }; } - projection.invert = function(p) { - var x = p[0] - tx, y = p[1] - ty; - if (alpha) { - var t = y * ca + x * sa; - x = x * ca - y * sa; - y = t; - } - return [x / kx, y / ky]; - }; - projection.stream = function(stream) { - return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); - }; - projection.postclip = function(_) { - return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; - }; - projection.clipExtent = function(_) { - return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; - }; - projection.scale = function(_) { - return arguments.length ? (k = +_, reset()) : k; - }; - projection.translate = function(_) { - return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; - }; - projection.angle = function(_) { - return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees; - }; - projection.reflectX = function(_) { - return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; - }; - projection.reflectY = function(_) { - return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; - }; - projection.fitExtent = function(extent, object) { - return fitExtent(projection, extent, object); - }; - projection.fitSize = function(size, object) { - return fitSize(projection, size, object); - }; - projection.fitWidth = function(width, object) { - return fitWidth(projection, width, object); - }; - projection.fitHeight = function(height, object) { - return fitHeight(projection, height, object); - }; - return projection; -} + // Intersects the great circle between a and b with the clip circle. + function intersect(a, b, two) { + var pa = cartesian(a), + pb = cartesian(b); -function naturalEarth1Raw(lambda, phi) { - var phi2 = phi * phi, phi4 = phi2 * phi2; - return [ - lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), - phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - ]; -} + // We have two planes, n1.p = d1 and n2.p = d2. + // Find intersection line p(t) = c1 n1 + c2 n2 + t (n1 ⨯ n2). + var n1 = [1, 0, 0], // normal + n2 = cartesianCross(pa, pb), + n2n2 = cartesianDot(n2, n2), + n1n2 = n2[0], // cartesianDot(n1, n2), + determinant = n2n2 - n1n2 * n1n2; -naturalEarth1Raw.invert = function(x, y) { - var phi = y, i = 25, delta; - do { - var phi2 = phi * phi, phi4 = phi2 * phi2; - phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / - (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); - } while (abs(delta) > epsilon && --i > 0); - return [ - x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), - phi - ]; -}; + // Two polar points. + if (!determinant) return !two && a; -function naturalEarth1() { - return projection(naturalEarth1Raw) - .scale(175.295); -} + var c1 = cr * n2n2 / determinant, + c2 = -cr * n1n2 / determinant, + n1xn2 = cartesianCross(n1, n2), + A = cartesianScale(n1, c1), + B = cartesianScale(n2, c2); + cartesianAddInPlace(A, B); -function orthographicRaw(x, y) { - return [cos(y) * sin(x), sin(y)]; -} + // Solve |p(t)|^2 = 1. + var u = n1xn2, + w = cartesianDot(A, u), + uu = cartesianDot(u, u), + t2 = w * w - uu * (cartesianDot(A, A) - 1); -orthographicRaw.invert = azimuthalInvert(asin); + if (t2 < 0) return; -function orthographic() { - return projection(orthographicRaw) - .scale(249.5) - .clipAngle(90 + epsilon); -} + var t = sqrt(t2), + q = cartesianScale(u, (-w - t) / uu); + cartesianAddInPlace(q, A); + q = spherical(q); -function stereographicRaw(x, y) { - var cy = cos(y), k = 1 + cos(x) * cy; - return [cy * sin(x) / k, sin(y) / k]; -} + if (!two) return q; -stereographicRaw.invert = azimuthalInvert(function(z) { - return 2 * atan(z); -}); + // Two intersection points. + var lambda0 = a[0], + lambda1 = b[0], + phi0 = a[1], + phi1 = b[1], + z; -function stereographic() { - return projection(stereographicRaw) - .scale(250) - .clipAngle(142); -} + if (lambda1 < lambda0) z = lambda0, lambda0 = lambda1, lambda1 = z; -function transverseMercatorRaw(lambda, phi) { - return [log(tan((halfPi + phi) / 2)), -lambda]; + var delta = lambda1 - lambda0, + polar = abs(delta - pi) < epsilon, + meridian = polar || delta < epsilon; + + if (!polar && phi1 < phi0) z = phi0, phi0 = phi1, phi1 = z; + + // Check that the first point is between a and b. + if (meridian + ? polar + ? phi0 + phi1 > 0 ^ q[1] < (abs(q[0] - lambda0) < epsilon ? phi0 : phi1) + : phi0 <= q[1] && q[1] <= phi1 + : delta > pi ^ (lambda0 <= q[0] && q[0] <= lambda1)) { + var q1 = cartesianScale(u, (-w + t) / uu); + cartesianAddInPlace(q1, A); + return [q, spherical(q1)]; + } + } + + // Generates a 4-bit vector representing the location of a point relative to + // the small circle's bounding box. + function code(lambda, phi) { + var r = smallRadius ? radius : pi - radius, + code = 0; + if (lambda < -r) code |= 1; // left + else if (lambda > r) code |= 2; // right + if (phi < -r) code |= 4; // below + else if (phi > r) code |= 8; // above + return code; + } + + return clip(visible, clipLine, interpolate, smallRadius ? [0, -radius] : [-pi, radius - pi]); } -transverseMercatorRaw.invert = function(x, y) { - return [-y, 2 * atan(exp(x)) - halfPi]; -}; +function clipLine(a, b, x0, y0, x1, y1) { + var ax = a[0], + ay = a[1], + bx = b[0], + by = b[1], + t0 = 0, + t1 = 1, + dx = bx - ax, + dy = by - ay, + r; -function transverseMercator() { - var m = mercatorProjection(transverseMercatorRaw), - center = m.center, - rotate = m.rotate; + r = x0 - ax; + if (!dx && r > 0) return; + r /= dx; + if (dx < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dx > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } - m.center = function(_) { - return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); - }; + r = x1 - ax; + if (!dx && r < 0) return; + r /= dx; + if (dx < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dx > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } - m.rotate = function(_) { - return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); - }; + r = y0 - ay; + if (!dy && r > 0) return; + r /= dy; + if (dy < 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } else if (dy > 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } - return rotate([0, 0, 90]) - .scale(159.155); + r = y1 - ay; + if (!dy && r < 0) return; + r /= dy; + if (dy < 0) { + if (r > t1) return; + if (r > t0) t0 = r; + } else if (dy > 0) { + if (r < t0) return; + if (r < t1) t1 = r; + } + + if (t0 > 0) a[0] = ax + t0 * dx, a[1] = ay + t0 * dy; + if (t1 < 1) b[0] = ax + t1 * dx, b[1] = ay + t1 * dy; + return true; } -exports.geoAlbers = albers; -exports.geoAlbersUsa = albersUsa; -exports.geoArea = area; -exports.geoAzimuthalEqualArea = azimuthalEqualArea; -exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; -exports.geoAzimuthalEquidistant = azimuthalEquidistant; -exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; -exports.geoBounds = bounds; -exports.geoCentroid = centroid; -exports.geoCircle = circle; -exports.geoClipAntimeridian = clipAntimeridian; -exports.geoClipCircle = clipCircle; -exports.geoClipExtent = extent; -exports.geoClipRectangle = clipRectangle; -exports.geoConicConformal = conicConformal; -exports.geoConicConformalRaw = conicConformalRaw; -exports.geoConicEqualArea = conicEqualArea; -exports.geoConicEqualAreaRaw = conicEqualAreaRaw; -exports.geoConicEquidistant = conicEquidistant; -exports.geoConicEquidistantRaw = conicEquidistantRaw; -exports.geoContains = contains; -exports.geoDistance = distance; -exports.geoEqualEarth = equalEarth; -exports.geoEqualEarthRaw = equalEarthRaw; -exports.geoEquirectangular = equirectangular; -exports.geoEquirectangularRaw = equirectangularRaw; -exports.geoGnomonic = gnomonic; -exports.geoGnomonicRaw = gnomonicRaw; -exports.geoGraticule = graticule; -exports.geoGraticule10 = graticule10; -exports.geoIdentity = identity$1; -exports.geoInterpolate = interpolate; -exports.geoLength = length; -exports.geoMercator = mercator; -exports.geoMercatorRaw = mercatorRaw; -exports.geoNaturalEarth1 = naturalEarth1; -exports.geoNaturalEarth1Raw = naturalEarth1Raw; -exports.geoOrthographic = orthographic; -exports.geoOrthographicRaw = orthographicRaw; -exports.geoPath = index; -exports.geoProjection = projection; -exports.geoProjectionMutator = projectionMutator; -exports.geoRotation = rotation; -exports.geoStereographic = stereographic; -exports.geoStereographicRaw = stereographicRaw; -exports.geoStream = geoStream; -exports.geoTransform = transform; -exports.geoTransverseMercator = transverseMercator; -exports.geoTransverseMercatorRaw = transverseMercatorRaw; +var clipMax = 1e9, clipMin = -clipMax; + +// TODO Use d3-polygon’s polygonContains here for the ring check? +// TODO Eliminate duplicate buffering in clipBuffer and polygon.push? + +function clipRectangle(x0, y0, x1, y1) { + + function visible(x, y) { + return x0 <= x && x <= x1 && y0 <= y && y <= y1; + } -Object.defineProperty(exports, '__esModule', { value: true }); + function interpolate(from, to, direction, stream) { + var a = 0, a1 = 0; + if (from == null + || (a = corner(from, direction)) !== (a1 = corner(to, direction)) + || comparePoint(from, to) < 0 ^ direction > 0) { + do stream.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0); + while ((a = (a + direction + 4) % 4) !== a1); + } else { + stream.point(to[0], to[1]); + } + } -})); -}); + function corner(p, direction) { + return abs(p[0] - x0) < epsilon ? direction > 0 ? 0 : 3 + : abs(p[0] - x1) < epsilon ? direction > 0 ? 2 : 1 + : abs(p[1] - y0) < epsilon ? direction > 0 ? 1 : 0 + : direction > 0 ? 3 : 2; // abs(p[1] - y1) < epsilon + } -var d3Hierarchy = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-hierarchy/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -function defaultSeparation(a, b) { - return a.parent === b.parent ? 1 : 2; -} + function compareIntersection(a, b) { + return comparePoint(a.x, b.x); + } -function meanX(children) { - return children.reduce(meanXReduce, 0) / children.length; -} + function comparePoint(a, b) { + var ca = corner(a, 1), + cb = corner(b, 1); + return ca !== cb ? ca - cb + : ca === 0 ? b[1] - a[1] + : ca === 1 ? a[0] - b[0] + : ca === 2 ? a[1] - b[1] + : b[0] - a[0]; + } -function meanXReduce(x, c) { - return x + c.x; -} + return function(stream) { + var activeStream = stream, + bufferStream = clipBuffer(), + segments, + polygon, + ring, + x__, y__, v__, // first point + x_, y_, v_, // previous point + first, + clean; -function maxY(children) { - return 1 + children.reduce(maxYReduce, 0); -} + var clipStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: polygonStart, + polygonEnd: polygonEnd + }; -function maxYReduce(y, c) { - return Math.max(y, c.y); -} + function point(x, y) { + if (visible(x, y)) activeStream.point(x, y); + } -function leafLeft(node) { - var children; - while (children = node.children) node = children[0]; - return node; -} + function polygonInside() { + var winding = 0; -function leafRight(node) { - var children; - while (children = node.children) node = children[children.length - 1]; - return node; -} + for (var i = 0, n = polygon.length; i < n; ++i) { + for (var ring = polygon[i], j = 1, m = ring.length, point = ring[0], a0, a1, b0 = point[0], b1 = point[1]; j < m; ++j) { + a0 = b0, a1 = b1, point = ring[j], b0 = point[0], b1 = point[1]; + if (a1 <= y1) { if (b1 > y1 && (b0 - a0) * (y1 - a1) > (b1 - a1) * (x0 - a0)) ++winding; } + else { if (b1 <= y1 && (b0 - a0) * (y1 - a1) < (b1 - a1) * (x0 - a0)) --winding; } + } + } -function cluster() { - var separation = defaultSeparation, - dx = 1, - dy = 1, - nodeSize = false; + return winding; + } - function cluster(root) { - var previousNode, - x = 0; + // Buffer geometry within a polygon and then clip it en masse. + function polygonStart() { + activeStream = bufferStream, segments = [], polygon = [], clean = true; + } - // First walk, computing the initial x & y values. - root.eachAfter(function(node) { - var children = node.children; - if (children) { - node.x = meanX(children); - node.y = maxY(children); - } else { - node.x = previousNode ? x += separation(node, previousNode) : 0; - node.y = 0; - previousNode = node; + function polygonEnd() { + var startInside = polygonInside(), + cleanInside = clean && startInside, + visible = (segments = d3Array.merge(segments)).length; + if (cleanInside || visible) { + stream.polygonStart(); + if (cleanInside) { + stream.lineStart(); + interpolate(null, null, 1, stream); + stream.lineEnd(); + } + if (visible) { + clipRejoin(segments, compareIntersection, startInside, interpolate, stream); + } + stream.polygonEnd(); } - }); + activeStream = stream, segments = polygon = ring = null; + } - var left = leafLeft(root), - right = leafRight(root), - x0 = left.x - separation(left, right) / 2, - x1 = right.x + separation(right, left) / 2; + function lineStart() { + clipStream.point = linePoint; + if (polygon) polygon.push(ring = []); + first = true; + v_ = false; + x_ = y_ = NaN; + } - // Second walk, normalizing x & y to the desired size. - return root.eachAfter(nodeSize ? function(node) { - node.x = (node.x - root.x) * dx; - node.y = (root.y - node.y) * dy; - } : function(node) { - node.x = (node.x - x0) / (x1 - x0) * dx; - node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; - }); - } + // TODO rather than special-case polygons, simply handle them separately. + // Ideally, coincident intersection points should be jittered to avoid + // clipping issues. + function lineEnd() { + if (segments) { + linePoint(x__, y__); + if (v__ && v_) bufferStream.rejoin(); + segments.push(bufferStream.result()); + } + clipStream.point = point; + if (v_) activeStream.lineEnd(); + } - cluster.separation = function(x) { - return arguments.length ? (separation = x, cluster) : separation; - }; + function linePoint(x, y) { + var v = visible(x, y); + if (polygon) ring.push([x, y]); + if (first) { + x__ = x, y__ = y, v__ = v; + first = false; + if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + } + } else { + if (v && v_) activeStream.point(x, y); + else { + var a = [x_ = Math.max(clipMin, Math.min(clipMax, x_)), y_ = Math.max(clipMin, Math.min(clipMax, y_))], + b = [x = Math.max(clipMin, Math.min(clipMax, x)), y = Math.max(clipMin, Math.min(clipMax, y))]; + if (clipLine(a, b, x0, y0, x1, y1)) { + if (!v_) { + activeStream.lineStart(); + activeStream.point(a[0], a[1]); + } + activeStream.point(b[0], b[1]); + if (!v) activeStream.lineEnd(); + clean = false; + } else if (v) { + activeStream.lineStart(); + activeStream.point(x, y); + clean = false; + } + } + } + x_ = x, y_ = y, v_ = v; + } - cluster.size = function(x) { - return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + return clipStream; }; +} - cluster.nodeSize = function(x) { - return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); +function extent() { + var x0 = 0, + y0 = 0, + x1 = 960, + y1 = 500, + cache, + cacheStream, + clip; + + return clip = { + stream: function(stream) { + return cache && cacheStream === stream ? cache : cache = clipRectangle(x0, y0, x1, y1)(cacheStream = stream); + }, + extent: function(_) { + return arguments.length ? (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1], cache = cacheStream = null, clip) : [[x0, y0], [x1, y1]]; + } }; +} - return cluster; +var lengthSum, + lambda0$2, + sinPhi0$1, + cosPhi0$1; + +var lengthStream = { + sphere: noop, + point: noop, + lineStart: lengthLineStart, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop +}; + +function lengthLineStart() { + lengthStream.point = lengthPointFirst; + lengthStream.lineEnd = lengthLineEnd; } -function count(node) { - var sum = 0, - children = node.children, - i = children && children.length; - if (!i) sum = 1; - else while (--i >= 0) sum += children[i].value; - node.value = sum; +function lengthLineEnd() { + lengthStream.point = lengthStream.lineEnd = noop; +} + +function lengthPointFirst(lambda, phi) { + lambda *= radians, phi *= radians; + lambda0$2 = lambda, sinPhi0$1 = sin(phi), cosPhi0$1 = cos(phi); + lengthStream.point = lengthPoint; } -function node_count() { - return this.eachAfter(count); +function lengthPoint(lambda, phi) { + lambda *= radians, phi *= radians; + var sinPhi = sin(phi), + cosPhi = cos(phi), + delta = abs(lambda - lambda0$2), + cosDelta = cos(delta), + sinDelta = sin(delta), + x = cosPhi * sinDelta, + y = cosPhi0$1 * sinPhi - sinPhi0$1 * cosPhi * cosDelta, + z = sinPhi0$1 * sinPhi + cosPhi0$1 * cosPhi * cosDelta; + lengthSum.add(atan2(sqrt(x * x + y * y), z)); + lambda0$2 = lambda, sinPhi0$1 = sinPhi, cosPhi0$1 = cosPhi; } -function node_each(callback, that) { - let index = -1; - for (const node of this) { - callback.call(that, node, ++index, this); - } - return this; +function length(object) { + lengthSum = new d3Array.Adder(); + geoStream(object, lengthStream); + return +lengthSum; } -function node_eachBefore(callback, that) { - var node = this, nodes = [node], children, i, index = -1; - while (node = nodes.pop()) { - callback.call(that, node, ++index, this); - if (children = node.children) { - for (i = children.length - 1; i >= 0; --i) { - nodes.push(children[i]); - } - } - } - return this; +var coordinates = [null, null], + object = {type: "LineString", coordinates: coordinates}; + +function distance(a, b) { + coordinates[0] = a; + coordinates[1] = b; + return length(object); } -function node_eachAfter(callback, that) { - var node = this, nodes = [node], next = [], children, i, n, index = -1; - while (node = nodes.pop()) { - next.push(node); - if (children = node.children) { - for (i = 0, n = children.length; i < n; ++i) { - nodes.push(children[i]); - } - } - } - while (node = next.pop()) { - callback.call(that, node, ++index, this); +var containsObjectType = { + Feature: function(object, point) { + return containsGeometry(object.geometry, point); + }, + FeatureCollection: function(object, point) { + var features = object.features, i = -1, n = features.length; + while (++i < n) if (containsGeometry(features[i].geometry, point)) return true; + return false; } - return this; -} +}; -function node_find(callback, that) { - let index = -1; - for (const node of this) { - if (callback.call(that, node, ++index, this)) { - return node; - } +var containsGeometryType = { + Sphere: function() { + return true; + }, + Point: function(object, point) { + return containsPoint(object.coordinates, point); + }, + MultiPoint: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPoint(coordinates[i], point)) return true; + return false; + }, + LineString: function(object, point) { + return containsLine(object.coordinates, point); + }, + MultiLineString: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsLine(coordinates[i], point)) return true; + return false; + }, + Polygon: function(object, point) { + return containsPolygon(object.coordinates, point); + }, + MultiPolygon: function(object, point) { + var coordinates = object.coordinates, i = -1, n = coordinates.length; + while (++i < n) if (containsPolygon(coordinates[i], point)) return true; + return false; + }, + GeometryCollection: function(object, point) { + var geometries = object.geometries, i = -1, n = geometries.length; + while (++i < n) if (containsGeometry(geometries[i], point)) return true; + return false; } -} +}; -function node_sum(value) { - return this.eachAfter(function(node) { - var sum = +value(node.data) || 0, - children = node.children, - i = children && children.length; - while (--i >= 0) sum += children[i].value; - node.value = sum; - }); +function containsGeometry(geometry, point) { + return geometry && containsGeometryType.hasOwnProperty(geometry.type) + ? containsGeometryType[geometry.type](geometry, point) + : false; } -function node_sort(compare) { - return this.eachBefore(function(node) { - if (node.children) { - node.children.sort(compare); - } - }); +function containsPoint(coordinates, point) { + return distance(coordinates, point) === 0; } -function node_path(end) { - var start = this, - ancestor = leastCommonAncestor(start, end), - nodes = [start]; - while (start !== ancestor) { - start = start.parent; - nodes.push(start); - } - var k = nodes.length; - while (end !== ancestor) { - nodes.splice(k, 0, end); - end = end.parent; +function containsLine(coordinates, point) { + var ao, bo, ab; + for (var i = 0, n = coordinates.length; i < n; i++) { + bo = distance(coordinates[i], point); + if (bo === 0) return true; + if (i > 0) { + ab = distance(coordinates[i], coordinates[i - 1]); + if ( + ab > 0 && + ao <= ab && + bo <= ab && + (ao + bo - ab) * (1 - Math.pow((ao - bo) / ab, 2)) < epsilon2 * ab + ) + return true; + } + ao = bo; } - return nodes; + return false; } -function leastCommonAncestor(a, b) { - if (a === b) return a; - var aNodes = a.ancestors(), - bNodes = b.ancestors(), - c = null; - a = aNodes.pop(); - b = bNodes.pop(); - while (a === b) { - c = a; - a = aNodes.pop(); - b = bNodes.pop(); - } - return c; +function containsPolygon(coordinates, point) { + return !!polygonContains(coordinates.map(ringRadians), pointRadians(point)); } -function node_ancestors() { - var node = this, nodes = [node]; - while (node = node.parent) { - nodes.push(node); - } - return nodes; +function ringRadians(ring) { + return ring = ring.map(pointRadians), ring.pop(), ring; } -function node_descendants() { - return Array.from(this); +function pointRadians(point) { + return [point[0] * radians, point[1] * radians]; } -function node_leaves() { - var leaves = []; - this.eachBefore(function(node) { - if (!node.children) { - leaves.push(node); - } - }); - return leaves; +function contains(object, point) { + return (object && containsObjectType.hasOwnProperty(object.type) + ? containsObjectType[object.type] + : containsGeometry)(object, point); } -function node_links() { - var root = this, links = []; - root.each(function(node) { - if (node !== root) { // Don’t include the root’s parent, if any. - links.push({source: node.parent, target: node}); - } - }); - return links; +function graticuleX(y0, y1, dy) { + var y = d3Array.range(y0, y1 - epsilon, dy).concat(y1); + return function(x) { return y.map(function(y) { return [x, y]; }); }; } -function* node_iterator() { - var node = this, current, next = [node], children, i, n; - do { - current = next.reverse(), next = []; - while (node = current.pop()) { - yield node; - if (children = node.children) { - for (i = 0, n = children.length; i < n; ++i) { - next.push(children[i]); - } - } - } - } while (next.length); +function graticuleY(x0, x1, dx) { + var x = d3Array.range(x0, x1 - epsilon, dx).concat(x1); + return function(y) { return x.map(function(x) { return [x, y]; }); }; } -function hierarchy(data, children) { - if (data instanceof Map) { - data = [undefined, data]; - if (children === undefined) children = mapChildren; - } else if (children === undefined) { - children = objectChildren; - } - - var root = new Node(data), - node, - nodes = [root], - child, - childs, - i, - n; +function graticule() { + var x1, x0, X1, X0, + y1, y0, Y1, Y0, + dx = 10, dy = dx, DX = 90, DY = 360, + x, y, X, Y, + precision = 2.5; - while (node = nodes.pop()) { - if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) { - node.children = childs; - for (i = n - 1; i >= 0; --i) { - nodes.push(child = childs[i] = new Node(childs[i])); - child.parent = node; - child.depth = node.depth + 1; - } - } + function graticule() { + return {type: "MultiLineString", coordinates: lines()}; } - return root.eachBefore(computeHeight); -} + function lines() { + return d3Array.range(ceil(X0 / DX) * DX, X1, DX).map(X) + .concat(d3Array.range(ceil(Y0 / DY) * DY, Y1, DY).map(Y)) + .concat(d3Array.range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon; }).map(x)) + .concat(d3Array.range(ceil(y0 / dy) * dy, y1, dy).filter(function(y) { return abs(y % DY) > epsilon; }).map(y)); + } -function node_copy() { - return hierarchy(this).eachBefore(copyData); -} + graticule.lines = function() { + return lines().map(function(coordinates) { return {type: "LineString", coordinates: coordinates}; }); + }; -function objectChildren(d) { - return d.children; -} + graticule.outline = function() { + return { + type: "Polygon", + coordinates: [ + X(X0).concat( + Y(Y1).slice(1), + X(X1).reverse().slice(1), + Y(Y0).reverse().slice(1)) + ] + }; + }; -function mapChildren(d) { - return Array.isArray(d) ? d[1] : null; -} + graticule.extent = function(_) { + if (!arguments.length) return graticule.extentMinor(); + return graticule.extentMajor(_).extentMinor(_); + }; -function copyData(node) { - if (node.data.value !== undefined) node.value = node.data.value; - node.data = node.data.data; -} + graticule.extentMajor = function(_) { + if (!arguments.length) return [[X0, Y0], [X1, Y1]]; + X0 = +_[0][0], X1 = +_[1][0]; + Y0 = +_[0][1], Y1 = +_[1][1]; + if (X0 > X1) _ = X0, X0 = X1, X1 = _; + if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _; + return graticule.precision(precision); + }; -function computeHeight(node) { - var height = 0; - do node.height = height; - while ((node = node.parent) && (node.height < ++height)); -} + graticule.extentMinor = function(_) { + if (!arguments.length) return [[x0, y0], [x1, y1]]; + x0 = +_[0][0], x1 = +_[1][0]; + y0 = +_[0][1], y1 = +_[1][1]; + if (x0 > x1) _ = x0, x0 = x1, x1 = _; + if (y0 > y1) _ = y0, y0 = y1, y1 = _; + return graticule.precision(precision); + }; -function Node(data) { - this.data = data; - this.depth = - this.height = 0; - this.parent = null; -} + graticule.step = function(_) { + if (!arguments.length) return graticule.stepMinor(); + return graticule.stepMajor(_).stepMinor(_); + }; -Node.prototype = hierarchy.prototype = { - constructor: Node, - count: node_count, - each: node_each, - eachAfter: node_eachAfter, - eachBefore: node_eachBefore, - find: node_find, - sum: node_sum, - sort: node_sort, - path: node_path, - ancestors: node_ancestors, - descendants: node_descendants, - leaves: node_leaves, - links: node_links, - copy: node_copy, - [Symbol.iterator]: node_iterator -}; + graticule.stepMajor = function(_) { + if (!arguments.length) return [DX, DY]; + DX = +_[0], DY = +_[1]; + return graticule; + }; -function array(x) { - return typeof x === "object" && "length" in x - ? x // Array, TypedArray, NodeList, array-like - : Array.from(x); // Map, Set, iterable, string, or anything else -} + graticule.stepMinor = function(_) { + if (!arguments.length) return [dx, dy]; + dx = +_[0], dy = +_[1]; + return graticule; + }; -function shuffle(array) { - var m = array.length, - t, - i; + graticule.precision = function(_) { + if (!arguments.length) return precision; + precision = +_; + x = graticuleX(y0, y1, 90); + y = graticuleY(x0, x1, precision); + X = graticuleX(Y0, Y1, 90); + Y = graticuleY(X0, X1, precision); + return graticule; + }; - while (m) { - i = Math.random() * m-- | 0; - t = array[m]; - array[m] = array[i]; - array[i] = t; - } + return graticule + .extentMajor([[-180, -90 + epsilon], [180, 90 - epsilon]]) + .extentMinor([[-180, -80 - epsilon], [180, 80 + epsilon]]); +} - return array; +function graticule10() { + return graticule()(); } -function enclose(circles) { - var i = 0, n = (circles = shuffle(Array.from(circles))).length, B = [], p, e; +function interpolate(a, b) { + var x0 = a[0] * radians, + y0 = a[1] * radians, + x1 = b[0] * radians, + y1 = b[1] * radians, + cy0 = cos(y0), + sy0 = sin(y0), + cy1 = cos(y1), + sy1 = sin(y1), + kx0 = cy0 * cos(x0), + ky0 = cy0 * sin(x0), + kx1 = cy1 * cos(x1), + ky1 = cy1 * sin(x1), + d = 2 * asin(sqrt(haversin(y1 - y0) + cy0 * cy1 * haversin(x1 - x0))), + k = sin(d); - while (i < n) { - p = circles[i]; - if (e && enclosesWeak(e, p)) ++i; - else e = encloseBasis(B = extendBasis(B, p)), i = 0; - } + var interpolate = d ? function(t) { + var B = sin(t *= d) / k, + A = sin(d - t) / k, + x = A * kx0 + B * kx1, + y = A * ky0 + B * ky1, + z = A * sy0 + B * sy1; + return [ + atan2(y, x) * degrees, + atan2(z, sqrt(x * x + y * y)) * degrees + ]; + } : function() { + return [x0 * degrees, y0 * degrees]; + }; - return e; + interpolate.distance = d; + + return interpolate; } -function extendBasis(B, p) { - var i, j; +var identity = x => x; - if (enclosesWeakAll(p, B)) return [p]; +var areaSum$1 = new d3Array.Adder(), + areaRingSum$1 = new d3Array.Adder(), + x00, + y00, + x0$1, + y0$1; - // If we get here then B must have at least one element. - for (i = 0; i < B.length; ++i) { - if (enclosesNot(p, B[i]) - && enclosesWeakAll(encloseBasis2(B[i], p), B)) { - return [B[i], p]; - } +var areaStream$1 = { + point: noop, + lineStart: noop, + lineEnd: noop, + polygonStart: function() { + areaStream$1.lineStart = areaRingStart$1; + areaStream$1.lineEnd = areaRingEnd$1; + }, + polygonEnd: function() { + areaStream$1.lineStart = areaStream$1.lineEnd = areaStream$1.point = noop; + areaSum$1.add(abs(areaRingSum$1)); + areaRingSum$1 = new d3Array.Adder(); + }, + result: function() { + var area = areaSum$1 / 2; + areaSum$1 = new d3Array.Adder(); + return area; } +}; - // If we get here then B must have at least two elements. - for (i = 0; i < B.length - 1; ++i) { - for (j = i + 1; j < B.length; ++j) { - if (enclosesNot(encloseBasis2(B[i], B[j]), p) - && enclosesNot(encloseBasis2(B[i], p), B[j]) - && enclosesNot(encloseBasis2(B[j], p), B[i]) - && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { - return [B[i], B[j], p]; - } - } - } +function areaRingStart$1() { + areaStream$1.point = areaPointFirst$1; +} - // If we get here then something is very wrong. - throw new Error; +function areaPointFirst$1(x, y) { + areaStream$1.point = areaPoint$1; + x00 = x0$1 = x, y00 = y0$1 = y; } -function enclosesNot(a, b) { - var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; - return dr < 0 || dr * dr < dx * dx + dy * dy; +function areaPoint$1(x, y) { + areaRingSum$1.add(y0$1 * x - x0$1 * y); + x0$1 = x, y0$1 = y; } -function enclosesWeak(a, b) { - var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y; - return dr > 0 && dr * dr > dx * dx + dy * dy; +function areaRingEnd$1() { + areaPoint$1(x00, y00); +} + +var x0$2 = Infinity, + y0$2 = x0$2, + x1 = -x0$2, + y1 = x1; + +var boundsStream$1 = { + point: boundsPoint$1, + lineStart: noop, + lineEnd: noop, + polygonStart: noop, + polygonEnd: noop, + result: function() { + var bounds = [[x0$2, y0$2], [x1, y1]]; + x1 = y1 = -(y0$2 = x0$2 = Infinity); + return bounds; + } +}; + +function boundsPoint$1(x, y) { + if (x < x0$2) x0$2 = x; + if (x > x1) x1 = x; + if (y < y0$2) y0$2 = y; + if (y > y1) y1 = y; } -function enclosesWeakAll(a, B) { - for (var i = 0; i < B.length; ++i) { - if (!enclosesWeak(a, B[i])) { - return false; - } - } - return true; -} +// TODO Enforce positive area for exterior, negative area for interior? -function encloseBasis(B) { - switch (B.length) { - case 1: return encloseBasis1(B[0]); - case 2: return encloseBasis2(B[0], B[1]); - case 3: return encloseBasis3(B[0], B[1], B[2]); +var X0$1 = 0, + Y0$1 = 0, + Z0$1 = 0, + X1$1 = 0, + Y1$1 = 0, + Z1$1 = 0, + X2$1 = 0, + Y2$1 = 0, + Z2$1 = 0, + x00$1, + y00$1, + x0$3, + y0$3; + +var centroidStream$1 = { + point: centroidPoint$1, + lineStart: centroidLineStart$1, + lineEnd: centroidLineEnd$1, + polygonStart: function() { + centroidStream$1.lineStart = centroidRingStart$1; + centroidStream$1.lineEnd = centroidRingEnd$1; + }, + polygonEnd: function() { + centroidStream$1.point = centroidPoint$1; + centroidStream$1.lineStart = centroidLineStart$1; + centroidStream$1.lineEnd = centroidLineEnd$1; + }, + result: function() { + var centroid = Z2$1 ? [X2$1 / Z2$1, Y2$1 / Z2$1] + : Z1$1 ? [X1$1 / Z1$1, Y1$1 / Z1$1] + : Z0$1 ? [X0$1 / Z0$1, Y0$1 / Z0$1] + : [NaN, NaN]; + X0$1 = Y0$1 = Z0$1 = + X1$1 = Y1$1 = Z1$1 = + X2$1 = Y2$1 = Z2$1 = 0; + return centroid; } -} +}; -function encloseBasis1(a) { - return { - x: a.x, - y: a.y, - r: a.r - }; +function centroidPoint$1(x, y) { + X0$1 += x; + Y0$1 += y; + ++Z0$1; } -function encloseBasis2(a, b) { - var x1 = a.x, y1 = a.y, r1 = a.r, - x2 = b.x, y2 = b.y, r2 = b.r, - x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, - l = Math.sqrt(x21 * x21 + y21 * y21); - return { - x: (x1 + x2 + x21 / l * r21) / 2, - y: (y1 + y2 + y21 / l * r21) / 2, - r: (l + r1 + r2) / 2 - }; +function centroidLineStart$1() { + centroidStream$1.point = centroidPointFirstLine; } -function encloseBasis3(a, b, c) { - var x1 = a.x, y1 = a.y, r1 = a.r, - x2 = b.x, y2 = b.y, r2 = b.r, - x3 = c.x, y3 = c.y, r3 = c.r, - a2 = x1 - x2, - a3 = x1 - x3, - b2 = y1 - y2, - b3 = y1 - y3, - c2 = r2 - r1, - c3 = r3 - r1, - d1 = x1 * x1 + y1 * y1 - r1 * r1, - d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, - d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, - ab = a3 * b2 - a2 * b3, - xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, - xb = (b3 * c2 - b2 * c3) / ab, - ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, - yb = (a2 * c3 - a3 * c2) / ab, - A = xb * xb + yb * yb - 1, - B = 2 * (r1 + xa * xb + ya * yb), - C = xa * xa + ya * ya - r1 * r1, - r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); - return { - x: x1 + xa + xb * r, - y: y1 + ya + yb * r, - r: r - }; +function centroidPointFirstLine(x, y) { + centroidStream$1.point = centroidPointLine; + centroidPoint$1(x0$3 = x, y0$3 = y); } -function place(b, a, c) { - var dx = b.x - a.x, x, a2, - dy = b.y - a.y, y, b2, - d2 = dx * dx + dy * dy; - if (d2) { - a2 = a.r + c.r, a2 *= a2; - b2 = b.r + c.r, b2 *= b2; - if (a2 > b2) { - x = (d2 + b2 - a2) / (2 * d2); - y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); - c.x = b.x - x * dx - y * dy; - c.y = b.y - x * dy + y * dx; - } else { - x = (d2 + a2 - b2) / (2 * d2); - y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); - c.x = a.x + x * dx - y * dy; - c.y = a.y + x * dy + y * dx; - } - } else { - c.x = a.x + c.r; - c.y = a.y; - } +function centroidPointLine(x, y) { + var dx = x - x0$3, dy = y - y0$3, z = sqrt(dx * dx + dy * dy); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; + centroidPoint$1(x0$3 = x, y0$3 = y); } -function intersects(a, b) { - var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; - return dr > 0 && dr * dr > dx * dx + dy * dy; +function centroidLineEnd$1() { + centroidStream$1.point = centroidPoint$1; } -function score(node) { - var a = node._, - b = node.next._, - ab = a.r + b.r, - dx = (a.x * b.r + b.x * a.r) / ab, - dy = (a.y * b.r + b.y * a.r) / ab; - return dx * dx + dy * dy; +function centroidRingStart$1() { + centroidStream$1.point = centroidPointFirstRing; } -function Node$1(circle) { - this._ = circle; - this.next = null; - this.previous = null; +function centroidRingEnd$1() { + centroidPointRing(x00$1, y00$1); } -function packEnclose(circles) { - if (!(n = (circles = array(circles)).length)) return 0; - - var a, b, c, n, aa, ca, i, j, k, sj, sk; - - // Place the first circle. - a = circles[0], a.x = 0, a.y = 0; - if (!(n > 1)) return a.r; +function centroidPointFirstRing(x, y) { + centroidStream$1.point = centroidPointRing; + centroidPoint$1(x00$1 = x0$3 = x, y00$1 = y0$3 = y); +} - // Place the second circle. - b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; - if (!(n > 2)) return a.r + b.r; +function centroidPointRing(x, y) { + var dx = x - x0$3, + dy = y - y0$3, + z = sqrt(dx * dx + dy * dy); - // Place the third circle. - place(b, a, c = circles[2]); + X1$1 += z * (x0$3 + x) / 2; + Y1$1 += z * (y0$3 + y) / 2; + Z1$1 += z; - // Initialize the front-chain using the first three circles a, b and c. - a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); - a.next = c.previous = b; - b.next = a.previous = c; - c.next = b.previous = a; + z = y0$3 * x - x0$3 * y; + X2$1 += z * (x0$3 + x); + Y2$1 += z * (y0$3 + y); + Z2$1 += z * 3; + centroidPoint$1(x0$3 = x, y0$3 = y); +} - // Attempt to place each remaining circle… - pack: for (i = 3; i < n; ++i) { - place(a._, b._, c = circles[i]), c = new Node$1(c); +function PathContext(context) { + this._context = context; +} - // Find the closest intersecting circle on the front-chain, if any. - // “Closeness” is determined by linear distance along the front-chain. - // “Ahead” or “behind” is likewise determined by linear distance. - j = b.next, k = a.previous, sj = b._.r, sk = a._.r; - do { - if (sj <= sk) { - if (intersects(j._, c._)) { - b = j, a.next = b, b.previous = a, --i; - continue pack; - } - sj += j._.r, j = j.next; - } else { - if (intersects(k._, c._)) { - a = k, a.next = b, b.previous = a, --i; - continue pack; - } - sk += k._.r, k = k.previous; +PathContext.prototype = { + _radius: 4.5, + pointRadius: function(_) { + return this._radius = _, this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._context.closePath(); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._context.moveTo(x, y); + this._point = 1; + break; } - } while (j !== k.next); - - // Success! Insert the new circle c between a and b. - c.previous = a, c.next = b, a.next = b.previous = b = c; - - // Compute the new closest circle pair to the centroid. - aa = score(a); - while ((c = c.next) !== b) { - if ((ca = score(c)) < aa) { - a = c, aa = ca; + case 1: { + this._context.lineTo(x, y); + break; } - } - b = a.next; - } - - // Compute the enclosing circle of the front chain. - a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); - - // Translate the circles to put the enclosing circle around the origin. - for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; + default: { + this._context.moveTo(x + this._radius, y); + this._context.arc(x, y, this._radius, 0, tau); + break; + } + } + }, + result: noop +}; - return c.r; -} +var lengthSum$1 = new d3Array.Adder(), + lengthRing, + x00$2, + y00$2, + x0$4, + y0$4; -function siblings(circles) { - packEnclose(circles); - return circles; -} +var lengthStream$1 = { + point: noop, + lineStart: function() { + lengthStream$1.point = lengthPointFirst$1; + }, + lineEnd: function() { + if (lengthRing) lengthPoint$1(x00$2, y00$2); + lengthStream$1.point = noop; + }, + polygonStart: function() { + lengthRing = true; + }, + polygonEnd: function() { + lengthRing = null; + }, + result: function() { + var length = +lengthSum$1; + lengthSum$1 = new d3Array.Adder(); + return length; + } +}; -function optional(f) { - return f == null ? null : required(f); +function lengthPointFirst$1(x, y) { + lengthStream$1.point = lengthPoint$1; + x00$2 = x0$4 = x, y00$2 = y0$4 = y; } -function required(f) { - if (typeof f !== "function") throw new Error; - return f; +function lengthPoint$1(x, y) { + x0$4 -= x, y0$4 -= y; + lengthSum$1.add(sqrt(x0$4 * x0$4 + y0$4 * y0$4)); + x0$4 = x, y0$4 = y; } -function constantZero() { - return 0; +function PathString() { + this._string = []; } -function constant(x) { - return function() { - return x; - }; -} +PathString.prototype = { + _radius: 4.5, + _circle: circle$1(4.5), + pointRadius: function(_) { + if ((_ = +_) !== this._radius) this._radius = _, this._circle = null; + return this; + }, + polygonStart: function() { + this._line = 0; + }, + polygonEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._line === 0) this._string.push("Z"); + this._point = NaN; + }, + point: function(x, y) { + switch (this._point) { + case 0: { + this._string.push("M", x, ",", y); + this._point = 1; + break; + } + case 1: { + this._string.push("L", x, ",", y); + break; + } + default: { + if (this._circle == null) this._circle = circle$1(this._radius); + this._string.push("M", x, ",", y, this._circle); + break; + } + } + }, + result: function() { + if (this._string.length) { + var result = this._string.join(""); + this._string = []; + return result; + } else { + return null; + } + } +}; -function defaultRadius(d) { - return Math.sqrt(d.value); +function circle$1(radius) { + return "m0," + radius + + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + + "z"; } -function index() { - var radius = null, - dx = 1, - dy = 1, - padding = constantZero; +function index(projection, context) { + var pointRadius = 4.5, + projectionStream, + contextStream; - function pack(root) { - root.x = dx / 2, root.y = dy / 2; - if (radius) { - root.eachBefore(radiusLeaf(radius)) - .eachAfter(packChildren(padding, 0.5)) - .eachBefore(translateChild(1)); - } else { - root.eachBefore(radiusLeaf(defaultRadius)) - .eachAfter(packChildren(constantZero, 1)) - .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) - .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + function path(object) { + if (object) { + if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments)); + geoStream(object, projectionStream(contextStream)); } - return root; + return contextStream.result(); } - pack.radius = function(x) { - return arguments.length ? (radius = optional(x), pack) : radius; - }; - - pack.size = function(x) { - return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + path.area = function(object) { + geoStream(object, projectionStream(areaStream$1)); + return areaStream$1.result(); }; - pack.padding = function(x) { - return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; + path.measure = function(object) { + geoStream(object, projectionStream(lengthStream$1)); + return lengthStream$1.result(); }; - return pack; -} - -function radiusLeaf(radius) { - return function(node) { - if (!node.children) { - node.r = Math.max(0, +radius(node) || 0); - } + path.bounds = function(object) { + geoStream(object, projectionStream(boundsStream$1)); + return boundsStream$1.result(); }; -} - -function packChildren(padding, k) { - return function(node) { - if (children = node.children) { - var children, - i, - n = children.length, - r = padding(node) * k || 0, - e; - if (r) for (i = 0; i < n; ++i) children[i].r += r; - e = packEnclose(children); - if (r) for (i = 0; i < n; ++i) children[i].r -= r; - node.r = e + r; - } + path.centroid = function(object) { + geoStream(object, projectionStream(centroidStream$1)); + return centroidStream$1.result(); }; -} -function translateChild(k) { - return function(node) { - var parent = node.parent; - node.r *= k; - if (parent) { - node.x = parent.x + k * node.x; - node.y = parent.y + k * node.y; - } + path.projection = function(_) { + return arguments.length ? (projectionStream = _ == null ? (projection = null, identity) : (projection = _).stream, path) : projection; }; -} - -function roundNode(node) { - node.x0 = Math.round(node.x0); - node.y0 = Math.round(node.y0); - node.x1 = Math.round(node.x1); - node.y1 = Math.round(node.y1); -} - -function treemapDice(parent, x0, y0, x1, y1) { - var nodes = parent.children, - node, - i = -1, - n = nodes.length, - k = parent.value && (x1 - x0) / parent.value; - - while (++i < n) { - node = nodes[i], node.y0 = y0, node.y1 = y1; - node.x0 = x0, node.x1 = x0 += node.value * k; - } -} - -function partition() { - var dx = 1, - dy = 1, - padding = 0, - round = false; - - function partition(root) { - var n = root.height + 1; - root.x0 = - root.y0 = padding; - root.x1 = dx; - root.y1 = dy / n; - root.eachBefore(positionNode(dy, n)); - if (round) root.eachBefore(roundNode); - return root; - } - function positionNode(dy, n) { - return function(node) { - if (node.children) { - treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); - } - var x0 = node.x0, - y0 = node.y0, - x1 = node.x1 - padding, - y1 = node.y1 - padding; - if (x1 < x0) x0 = x1 = (x0 + x1) / 2; - if (y1 < y0) y0 = y1 = (y0 + y1) / 2; - node.x0 = x0; - node.y0 = y0; - node.x1 = x1; - node.y1 = y1; - }; - } + path.context = function(_) { + if (!arguments.length) return context; + contextStream = _ == null ? (context = null, new PathString) : new PathContext(context = _); + if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius); + return path; + }; - partition.round = function(x) { - return arguments.length ? (round = !!x, partition) : round; + path.pointRadius = function(_) { + if (!arguments.length) return pointRadius; + pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_); + return path; }; - partition.size = function(x) { - return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + return path.projection(projection).context(context); +} + +function transform(methods) { + return { + stream: transformer(methods) }; +} - partition.padding = function(x) { - return arguments.length ? (padding = +x, partition) : padding; +function transformer(methods) { + return function(stream) { + var s = new TransformStream; + for (var key in methods) s[key] = methods[key]; + s.stream = stream; + return s; }; +} - return partition; +function TransformStream() {} + +TransformStream.prototype = { + constructor: TransformStream, + point: function(x, y) { this.stream.point(x, y); }, + sphere: function() { this.stream.sphere(); }, + lineStart: function() { this.stream.lineStart(); }, + lineEnd: function() { this.stream.lineEnd(); }, + polygonStart: function() { this.stream.polygonStart(); }, + polygonEnd: function() { this.stream.polygonEnd(); } +}; + +function fit(projection, fitBounds, object) { + var clip = projection.clipExtent && projection.clipExtent(); + projection.scale(150).translate([0, 0]); + if (clip != null) projection.clipExtent(null); + geoStream(object, projection.stream(boundsStream$1)); + fitBounds(boundsStream$1.result()); + if (clip != null) projection.clipExtent(clip); + return projection; } -var preroot = {depth: -1}, - ambiguous = {}; +function fitExtent(projection, extent, object) { + return fit(projection, function(b) { + var w = extent[1][0] - extent[0][0], + h = extent[1][1] - extent[0][1], + k = Math.min(w / (b[1][0] - b[0][0]), h / (b[1][1] - b[0][1])), + x = +extent[0][0] + (w - k * (b[1][0] + b[0][0])) / 2, + y = +extent[0][1] + (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} -function defaultId(d) { - return d.id; +function fitSize(projection, size, object) { + return fitExtent(projection, [[0, 0], size], object); } -function defaultParentId(d) { - return d.parentId; +function fitWidth(projection, width, object) { + return fit(projection, function(b) { + var w = +width, + k = w / (b[1][0] - b[0][0]), + x = (w - k * (b[1][0] + b[0][0])) / 2, + y = -k * b[0][1]; + projection.scale(150 * k).translate([x, y]); + }, object); } -function stratify() { - var id = defaultId, - parentId = defaultParentId; +function fitHeight(projection, height, object) { + return fit(projection, function(b) { + var h = +height, + k = h / (b[1][1] - b[0][1]), + x = -k * b[0][0], + y = (h - k * (b[1][1] + b[0][1])) / 2; + projection.scale(150 * k).translate([x, y]); + }, object); +} - function stratify(data) { - var nodes = Array.from(data), - n = nodes.length, - d, - i, - root, - parent, - node, - nodeId, - nodeKey, - nodeByKey = new Map; +var maxDepth = 16, // maximum depth of subdivision + cosMinDistance = cos(30 * radians); // cos(minimum angular distance) - for (i = 0; i < n; ++i) { - d = nodes[i], node = nodes[i] = new Node(d); - if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { - nodeKey = node.id = nodeId; - nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); - } - if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { - node.parent = nodeId; - } +function resample(project, delta2) { + return +delta2 ? resample$1(project, delta2) : resampleNone(project); +} + +function resampleNone(project) { + return transformer({ + point: function(x, y) { + x = project(x, y); + this.stream.point(x[0], x[1]); } + }); +} - for (i = 0; i < n; ++i) { - node = nodes[i]; - if (nodeId = node.parent) { - parent = nodeByKey.get(nodeId); - if (!parent) throw new Error("missing: " + nodeId); - if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); - if (parent.children) parent.children.push(node); - else parent.children = [node]; - node.parent = parent; - } else { - if (root) throw new Error("multiple roots"); - root = node; +function resample$1(project, delta2) { + + function resampleLineTo(x0, y0, lambda0, a0, b0, c0, x1, y1, lambda1, a1, b1, c1, depth, stream) { + var dx = x1 - x0, + dy = y1 - y0, + d2 = dx * dx + dy * dy; + if (d2 > 4 * delta2 && depth--) { + var a = a0 + a1, + b = b0 + b1, + c = c0 + c1, + m = sqrt(a * a + b * b + c * c), + phi2 = asin(c /= m), + lambda2 = abs(abs(c) - 1) < epsilon || abs(lambda0 - lambda1) < epsilon ? (lambda0 + lambda1) / 2 : atan2(b, a), + p = project(lambda2, phi2), + x2 = p[0], + y2 = p[1], + dx2 = x2 - x0, + dy2 = y2 - y0, + dz = dy * dx2 - dx * dy2; + if (dz * dz / d2 > delta2 // perpendicular projected distance + || abs((dx * dx2 + dy * dy2) / d2 - 0.5) > 0.3 // midpoint close to an end + || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) { // angular distance + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x2, y2, lambda2, a /= m, b /= m, c, depth, stream); + stream.point(x2, y2); + resampleLineTo(x2, y2, lambda2, a, b, c, x1, y1, lambda1, a1, b1, c1, depth, stream); } } + } + return function(stream) { + var lambda00, x00, y00, a00, b00, c00, // first point + lambda0, x0, y0, a0, b0, c0; // previous point - if (!root) throw new Error("no root"); - root.parent = preroot; - root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); - root.parent = null; - if (n > 0) throw new Error("cycle"); + var resampleStream = { + point: point, + lineStart: lineStart, + lineEnd: lineEnd, + polygonStart: function() { stream.polygonStart(); resampleStream.lineStart = ringStart; }, + polygonEnd: function() { stream.polygonEnd(); resampleStream.lineStart = lineStart; } + }; - return root; - } + function point(x, y) { + x = project(x, y); + stream.point(x[0], x[1]); + } - stratify.id = function(x) { - return arguments.length ? (id = required(x), stratify) : id; - }; + function lineStart() { + x0 = NaN; + resampleStream.point = linePoint; + stream.lineStart(); + } - stratify.parentId = function(x) { - return arguments.length ? (parentId = required(x), stratify) : parentId; - }; + function linePoint(lambda, phi) { + var c = cartesian([lambda, phi]), p = project(lambda, phi); + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x0 = p[0], y0 = p[1], lambda0 = lambda, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream); + stream.point(x0, y0); + } - return stratify; -} + function lineEnd() { + resampleStream.point = point; + stream.lineEnd(); + } -function defaultSeparation$1(a, b) { - return a.parent === b.parent ? 1 : 2; -} + function ringStart() { + lineStart(); + resampleStream.point = ringPoint; + resampleStream.lineEnd = ringEnd; + } -// function radialSeparation(a, b) { -// return (a.parent === b.parent ? 1 : 2) / a.depth; -// } + function ringPoint(lambda, phi) { + linePoint(lambda00 = lambda, phi), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0; + resampleStream.point = linePoint; + } -// This function is used to traverse the left contour of a subtree (or -// subforest). It returns the successor of v on this contour. This successor is -// either given by the leftmost child of v or by the thread of v. The function -// returns null if and only if v is on the highest level of its subtree. -function nextLeft(v) { - var children = v.children; - return children ? children[0] : v.t; -} + function ringEnd() { + resampleLineTo(x0, y0, lambda0, a0, b0, c0, x00, y00, lambda00, a00, b00, c00, maxDepth, stream); + resampleStream.lineEnd = lineEnd; + lineEnd(); + } -// This function works analogously to nextLeft. -function nextRight(v) { - var children = v.children; - return children ? children[children.length - 1] : v.t; + return resampleStream; + }; } -// Shifts the current subtree rooted at w+. This is done by increasing -// prelim(w+) and mod(w+) by shift. -function moveSubtree(wm, wp, shift) { - var change = shift / (wp.i - wm.i); - wp.c -= change; - wp.s += shift; - wm.c += change; - wp.z += shift; - wp.m += shift; +var transformRadians = transformer({ + point: function(x, y) { + this.stream.point(x * radians, y * radians); + } +}); + +function transformRotate(rotate) { + return transformer({ + point: function(x, y) { + var r = rotate(x, y); + return this.stream.point(r[0], r[1]); + } + }); } -// All other shifts, applied to the smaller subtrees between w- and w+, are -// performed by this function. To prepare the shifts, we have to adjust -// change(w+), shift(w+), and change(w-). -function executeShifts(v) { - var shift = 0, - change = 0, - children = v.children, - i = children.length, - w; - while (--i >= 0) { - w = children[i]; - w.z += shift; - w.m += shift; - shift += w.s + (change += w.c); +function scaleTranslate(k, dx, dy, sx, sy) { + function transform(x, y) { + x *= sx; y *= sy; + return [dx + k * x, dy - k * y]; } + transform.invert = function(x, y) { + return [(x - dx) / k * sx, (dy - y) / k * sy]; + }; + return transform; } -// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, -// returns the specified (default) ancestor. -function nextAncestor(vim, v, ancestor) { - return vim.a.parent === v.parent ? vim.a : ancestor; +function scaleTranslateRotate(k, dx, dy, sx, sy, alpha) { + if (!alpha) return scaleTranslate(k, dx, dy, sx, sy); + var cosAlpha = cos(alpha), + sinAlpha = sin(alpha), + a = cosAlpha * k, + b = sinAlpha * k, + ai = cosAlpha / k, + bi = sinAlpha / k, + ci = (sinAlpha * dy - cosAlpha * dx) / k, + fi = (sinAlpha * dx + cosAlpha * dy) / k; + function transform(x, y) { + x *= sx; y *= sy; + return [a * x - b * y + dx, dy - b * x - a * y]; + } + transform.invert = function(x, y) { + return [sx * (ai * x - bi * y + ci), sy * (fi - bi * x - ai * y)]; + }; + return transform; } -function TreeNode(node, i) { - this._ = node; - this.parent = null; - this.children = null; - this.A = null; // default ancestor - this.a = this; // ancestor - this.z = 0; // prelim - this.m = 0; // mod - this.c = 0; // change - this.s = 0; // shift - this.t = null; // thread - this.i = i; // number +function projection(project) { + return projectionMutator(function() { return project; })(); } -TreeNode.prototype = Object.create(Node.prototype); +function projectionMutator(projectAt) { + var project, + k = 150, // scale + x = 480, y = 250, // translate + lambda = 0, phi = 0, // center + deltaLambda = 0, deltaPhi = 0, deltaGamma = 0, rotate, // pre-rotate + alpha = 0, // post-rotate angle + sx = 1, // reflectX + sy = 1, // reflectX + theta = null, preclip = clipAntimeridian, // pre-clip angle + x0 = null, y0, x1, y1, postclip = identity, // post-clip extent + delta2 = 0.5, // precision + projectResample, + projectTransform, + projectRotateTransform, + cache, + cacheStream; -function treeRoot(root) { - var tree = new TreeNode(root, 0), - node, - nodes = [tree], - child, - children, - i, - n; + function projection(point) { + return projectRotateTransform(point[0] * radians, point[1] * radians); + } - while (node = nodes.pop()) { - if (children = node._.children) { - node.children = new Array(n = children.length); - for (i = n - 1; i >= 0; --i) { - nodes.push(child = node.children[i] = new TreeNode(children[i], i)); - child.parent = node; - } - } + function invert(point) { + point = projectRotateTransform.invert(point[0], point[1]); + return point && [point[0] * degrees, point[1] * degrees]; } - (tree.parent = new TreeNode(null, 0)).children = [tree]; - return tree; -} + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transformRadians(transformRotate(rotate)(preclip(projectResample(postclip(cacheStream = stream))))); + }; -// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm -function tree() { - var separation = defaultSeparation$1, - dx = 1, - dy = 1, - nodeSize = null; + projection.preclip = function(_) { + return arguments.length ? (preclip = _, theta = undefined, reset()) : preclip; + }; - function tree(root) { - var t = treeRoot(root); + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; - // Compute the layout using Buchheim et al.’s algorithm. - t.eachAfter(firstWalk), t.parent.m = -t.z; - t.eachBefore(secondWalk); + projection.clipAngle = function(_) { + return arguments.length ? (preclip = +_ ? clipCircle(theta = _ * radians) : (theta = null, clipAntimeridian), reset()) : theta * degrees; + }; - // If a fixed node size is specified, scale x and y. - if (nodeSize) root.eachBefore(sizeNode); + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; - // If a fixed tree size is specified, scale x and y based on the extent. - // Compute the left-most, right-most, and depth-most nodes for extents. - else { - var left = root, - right = root, - bottom = root; - root.eachBefore(function(node) { - if (node.x < left.x) left = node; - if (node.x > right.x) right = node; - if (node.depth > bottom.depth) bottom = node; - }); - var s = left === right ? 1 : separation(left, right) / 2, - tx = s - left.x, - kx = dx / (right.x + s + tx), - ky = dy / (bottom.depth || 1); - root.eachBefore(function(node) { - node.x = (node.x + tx) * kx; - node.y = node.depth * ky; - }); - } + projection.scale = function(_) { + return arguments.length ? (k = +_, recenter()) : k; + }; - return root; - } + projection.translate = function(_) { + return arguments.length ? (x = +_[0], y = +_[1], recenter()) : [x, y]; + }; - // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is - // applied recursively to the children of v, as well as the function - // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the - // node v is placed to the midpoint of its outermost children. - function firstWalk(v) { - var children = v.children, - siblings = v.parent.children, - w = v.i ? siblings[v.i - 1] : null; - if (children) { - executeShifts(v); - var midpoint = (children[0].z + children[children.length - 1].z) / 2; - if (w) { - v.z = w.z + separation(v._, w._); - v.m = v.z - midpoint; - } else { - v.z = midpoint; - } - } else if (w) { - v.z = w.z + separation(v._, w._); - } - v.parent.A = apportion(v, w, v.parent.A || siblings[0]); - } + projection.center = function(_) { + return arguments.length ? (lambda = _[0] % 360 * radians, phi = _[1] % 360 * radians, recenter()) : [lambda * degrees, phi * degrees]; + }; - // Computes all real x-coordinates by summing up the modifiers recursively. - function secondWalk(v) { - v._.x = v.z + v.parent.m; - v.m += v.parent.m; - } + projection.rotate = function(_) { + return arguments.length ? (deltaLambda = _[0] % 360 * radians, deltaPhi = _[1] % 360 * radians, deltaGamma = _.length > 2 ? _[2] % 360 * radians : 0, recenter()) : [deltaLambda * degrees, deltaPhi * degrees, deltaGamma * degrees]; + }; - // The core of the algorithm. Here, a new subtree is combined with the - // previous subtrees. Threads are used to traverse the inside and outside - // contours of the left and right subtree up to the highest common level. The - // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the - // superscript o means outside and i means inside, the subscript - means left - // subtree and + means right subtree. For summing up the modifiers along the - // contour, we use respective variables si+, si-, so-, and so+. Whenever two - // nodes of the inside contours conflict, we compute the left one of the - // greatest uncommon ancestors using the function ANCESTOR and call MOVE - // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. - // Finally, we add a new thread (if necessary). - function apportion(v, w, ancestor) { - if (w) { - var vip = v, - vop = v, - vim = w, - vom = vip.parent.children[0], - sip = vip.m, - sop = vop.m, - sim = vim.m, - som = vom.m, - shift; - while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { - vom = nextLeft(vom); - vop = nextRight(vop); - vop.a = v; - shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); - if (shift > 0) { - moveSubtree(nextAncestor(vim, v, ancestor), v, shift); - sip += shift; - sop += shift; - } - sim += vim.m; - sip += vip.m; - som += vom.m; - sop += vop.m; - } - if (vim && !nextRight(vop)) { - vop.t = vim; - vop.m += sim - sop; - } - if (vip && !nextLeft(vom)) { - vom.t = vip; - vom.m += sip - som; - ancestor = v; - } - } - return ancestor; + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, recenter()) : alpha * degrees; + }; + + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, recenter()) : sx < 0; + }; + + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, recenter()) : sy < 0; + }; + + projection.precision = function(_) { + return arguments.length ? (projectResample = resample(projectTransform, delta2 = _ * _), reset()) : sqrt(delta2); + }; + + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + function recenter() { + var center = scaleTranslateRotate(k, 0, 0, sx, sy, alpha).apply(null, project(lambda, phi)), + transform = scaleTranslateRotate(k, x - center[0], y - center[1], sx, sy, alpha); + rotate = rotateRadians(deltaLambda, deltaPhi, deltaGamma); + projectTransform = compose(project, transform); + projectRotateTransform = compose(rotate, projectTransform); + projectResample = resample(projectTransform, delta2); + return reset(); } - function sizeNode(node) { - node.x *= dx; - node.y = node.depth * dy; + function reset() { + cache = cacheStream = null; + return projection; } - tree.separation = function(x) { - return arguments.length ? (separation = x, tree) : separation; + return function() { + project = projectAt.apply(this, arguments); + projection.invert = project.invert && invert; + return recenter(); }; +} - tree.size = function(x) { - return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); - }; +function conicProjection(projectAt) { + var phi0 = 0, + phi1 = pi / 3, + m = projectionMutator(projectAt), + p = m(phi0, phi1); - tree.nodeSize = function(x) { - return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + p.parallels = function(_) { + return arguments.length ? m(phi0 = _[0] * radians, phi1 = _[1] * radians) : [phi0 * degrees, phi1 * degrees]; }; - return tree; + return p; } -function treemapSlice(parent, x0, y0, x1, y1) { - var nodes = parent.children, - node, - i = -1, - n = nodes.length, - k = parent.value && (y1 - y0) / parent.value; +function cylindricalEqualAreaRaw(phi0) { + var cosPhi0 = cos(phi0); - while (++i < n) { - node = nodes[i], node.x0 = x0, node.x1 = x1; - node.y0 = y0, node.y1 = y0 += node.value * k; + function forward(lambda, phi) { + return [lambda * cosPhi0, sin(phi) / cosPhi0]; } -} -var phi = (1 + Math.sqrt(5)) / 2; + forward.invert = function(x, y) { + return [x / cosPhi0, asin(y * cosPhi0)]; + }; -function squarifyRatio(ratio, parent, x0, y0, x1, y1) { - var rows = [], - nodes = parent.children, - row, - nodeValue, - i0 = 0, - i1 = 0, - n = nodes.length, - dx, dy, - value = parent.value, - sumValue, - minValue, - maxValue, - newRatio, - minRatio, - alpha, - beta; + return forward; +} - while (i0 < n) { - dx = x1 - x0, dy = y1 - y0; +function conicEqualAreaRaw(y0, y1) { + var sy0 = sin(y0), n = (sy0 + sin(y1)) / 2; - // Find the next non-empty node. - do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); - minValue = maxValue = sumValue; - alpha = Math.max(dy / dx, dx / dy) / (value * ratio); - beta = sumValue * sumValue * alpha; - minRatio = Math.max(maxValue / beta, beta / minValue); + // Are the parallels symmetrical around the Equator? + if (abs(n) < epsilon) return cylindricalEqualAreaRaw(y0); - // Keep adding nodes while the aspect ratio maintains or improves. - for (; i1 < n; ++i1) { - sumValue += nodeValue = nodes[i1].value; - if (nodeValue < minValue) minValue = nodeValue; - if (nodeValue > maxValue) maxValue = nodeValue; - beta = sumValue * sumValue * alpha; - newRatio = Math.max(maxValue / beta, beta / minValue); - if (newRatio > minRatio) { sumValue -= nodeValue; break; } - minRatio = newRatio; - } + var c = 1 + sy0 * (2 * n - sy0), r0 = sqrt(c) / n; - // Position and record the row orientation. - rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); - if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); - else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); - value -= sumValue, i0 = i1; + function project(x, y) { + var r = sqrt(c - 2 * n * sin(y)) / n; + return [r * sin(x *= n), r0 - r * cos(x)]; } - return rows; + project.invert = function(x, y) { + var r0y = r0 - y, + l = atan2(x, abs(r0y)) * sign(r0y); + if (r0y * n < 0) + l -= pi * sign(x) * sign(r0y); + return [l / n, asin((c - (x * x + r0y * r0y) * n * n) / (2 * n))]; + }; + + return project; } -var squarify = (function custom(ratio) { +function conicEqualArea() { + return conicProjection(conicEqualAreaRaw) + .scale(155.424) + .center([0, 33.6442]); +} - function squarify(parent, x0, y0, x1, y1) { - squarifyRatio(ratio, parent, x0, y0, x1, y1); +function albers() { + return conicEqualArea() + .parallels([29.5, 45.5]) + .scale(1070) + .translate([480, 250]) + .rotate([96, 0]) + .center([-0.6, 38.7]); +} + +// The projections must have mutually exclusive clip regions on the sphere, +// as this will avoid emitting interleaving lines and polygons. +function multiplex(streams) { + var n = streams.length; + return { + point: function(x, y) { var i = -1; while (++i < n) streams[i].point(x, y); }, + sphere: function() { var i = -1; while (++i < n) streams[i].sphere(); }, + lineStart: function() { var i = -1; while (++i < n) streams[i].lineStart(); }, + lineEnd: function() { var i = -1; while (++i < n) streams[i].lineEnd(); }, + polygonStart: function() { var i = -1; while (++i < n) streams[i].polygonStart(); }, + polygonEnd: function() { var i = -1; while (++i < n) streams[i].polygonEnd(); } + }; +} + +// A composite projection for the United States, configured by default for +// 960×500. The projection also works quite well at 960×600 if you change the +// scale to 1285 and adjust the translate accordingly. The set of standard +// parallels for each region comes from USGS, which is published here: +// http://egsc.usgs.gov/isb/pubs/MapProjections/projections.html#albers +function albersUsa() { + var cache, + cacheStream, + lower48 = albers(), lower48Point, + alaska = conicEqualArea().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), alaskaPoint, // EPSG:3338 + hawaii = conicEqualArea().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), hawaiiPoint, // ESRI:102007 + point, pointStream = {point: function(x, y) { point = [x, y]; }}; + + function albersUsa(coordinates) { + var x = coordinates[0], y = coordinates[1]; + return point = null, + (lower48Point.point(x, y), point) + || (alaskaPoint.point(x, y), point) + || (hawaiiPoint.point(x, y), point); } - squarify.ratio = function(x) { - return custom((x = +x) > 1 ? x : 1); + albersUsa.invert = function(coordinates) { + var k = lower48.scale(), + t = lower48.translate(), + x = (coordinates[0] - t[0]) / k, + y = (coordinates[1] - t[1]) / k; + return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska + : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii + : lower48).invert(coordinates); }; - return squarify; -})(phi); + albersUsa.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]); + }; -function index$1() { - var tile = squarify, - round = false, - dx = 1, - dy = 1, - paddingStack = [0], - paddingInner = constantZero, - paddingTop = constantZero, - paddingRight = constantZero, - paddingBottom = constantZero, - paddingLeft = constantZero; + albersUsa.precision = function(_) { + if (!arguments.length) return lower48.precision(); + lower48.precision(_), alaska.precision(_), hawaii.precision(_); + return reset(); + }; - function treemap(root) { - root.x0 = - root.y0 = 0; - root.x1 = dx; - root.y1 = dy; - root.eachBefore(positionNode); - paddingStack = [0]; - if (round) root.eachBefore(roundNode); - return root; - } + albersUsa.scale = function(_) { + if (!arguments.length) return lower48.scale(); + lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_); + return albersUsa.translate(lower48.translate()); + }; - function positionNode(node) { - var p = paddingStack[node.depth], - x0 = node.x0 + p, - y0 = node.y0 + p, - x1 = node.x1 - p, - y1 = node.y1 - p; - if (x1 < x0) x0 = x1 = (x0 + x1) / 2; - if (y1 < y0) y0 = y1 = (y0 + y1) / 2; - node.x0 = x0; - node.y0 = y0; - node.x1 = x1; - node.y1 = y1; - if (node.children) { - p = paddingStack[node.depth + 1] = paddingInner(node) / 2; - x0 += paddingLeft(node) - p; - y0 += paddingTop(node) - p; - x1 -= paddingRight(node) - p; - y1 -= paddingBottom(node) - p; - if (x1 < x0) x0 = x1 = (x0 + x1) / 2; - if (y1 < y0) y0 = y1 = (y0 + y1) / 2; - tile(node, x0, y0, x1, y1); - } - } + albersUsa.translate = function(_) { + if (!arguments.length) return lower48.translate(); + var k = lower48.scale(), x = +_[0], y = +_[1]; + + lower48Point = lower48 + .translate(_) + .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]]) + .stream(pointStream); + + alaskaPoint = alaska + .translate([x - 0.307 * k, y + 0.201 * k]) + .clipExtent([[x - 0.425 * k + epsilon, y + 0.120 * k + epsilon], [x - 0.214 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); - treemap.round = function(x) { - return arguments.length ? (round = !!x, treemap) : round; - }; + hawaiiPoint = hawaii + .translate([x - 0.205 * k, y + 0.212 * k]) + .clipExtent([[x - 0.214 * k + epsilon, y + 0.166 * k + epsilon], [x - 0.115 * k - epsilon, y + 0.234 * k - epsilon]]) + .stream(pointStream); - treemap.size = function(x) { - return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + return reset(); }; - treemap.tile = function(x) { - return arguments.length ? (tile = required(x), treemap) : tile; + albersUsa.fitExtent = function(extent, object) { + return fitExtent(albersUsa, extent, object); }; - treemap.padding = function(x) { - return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + albersUsa.fitSize = function(size, object) { + return fitSize(albersUsa, size, object); }; - treemap.paddingInner = function(x) { - return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; + albersUsa.fitWidth = function(width, object) { + return fitWidth(albersUsa, width, object); }; - treemap.paddingOuter = function(x) { - return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + albersUsa.fitHeight = function(height, object) { + return fitHeight(albersUsa, height, object); }; - treemap.paddingTop = function(x) { - return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; - }; + function reset() { + cache = cacheStream = null; + return albersUsa; + } - treemap.paddingRight = function(x) { - return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; - }; + return albersUsa.scale(1070); +} - treemap.paddingBottom = function(x) { - return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; - }; +function azimuthalRaw(scale) { + return function(x, y) { + var cx = cos(x), + cy = cos(y), + k = scale(cx * cy); + if (k === Infinity) return [2, 0]; + return [ + k * cy * sin(x), + k * sin(y) + ]; + } +} - treemap.paddingLeft = function(x) { - return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; - }; +function azimuthalInvert(angle) { + return function(x, y) { + var z = sqrt(x * x + y * y), + c = angle(z), + sc = sin(c), + cc = cos(c); + return [ + atan2(x * sc, z * cc), + asin(z && y * sc / z) + ]; + } +} - return treemap; +var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) { + return sqrt(2 / (1 + cxcy)); +}); + +azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) { + return 2 * asin(z / 2); +}); + +function azimuthalEqualArea() { + return projection(azimuthalEqualAreaRaw) + .scale(124.75) + .clipAngle(180 - 1e-3); } -function binary(parent, x0, y0, x1, y1) { - var nodes = parent.children, - i, n = nodes.length, - sum, sums = new Array(n + 1); +var azimuthalEquidistantRaw = azimuthalRaw(function(c) { + return (c = acos(c)) && c / sin(c); +}); - for (sums[0] = sum = i = 0; i < n; ++i) { - sums[i + 1] = sum += nodes[i].value; - } +azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) { + return z; +}); - partition(0, n, parent.value, x0, y0, x1, y1); +function azimuthalEquidistant() { + return projection(azimuthalEquidistantRaw) + .scale(79.4188) + .clipAngle(180 - 1e-3); +} - function partition(i, j, value, x0, y0, x1, y1) { - if (i >= j - 1) { - var node = nodes[i]; - node.x0 = x0, node.y0 = y0; - node.x1 = x1, node.y1 = y1; - return; - } +function mercatorRaw(lambda, phi) { + return [lambda, log(tan((halfPi + phi) / 2))]; +} - var valueOffset = sums[i], - valueTarget = (value / 2) + valueOffset, - k = i + 1, - hi = j - 1; +mercatorRaw.invert = function(x, y) { + return [x, 2 * atan(exp(y)) - halfPi]; +}; - while (k < hi) { - var mid = k + hi >>> 1; - if (sums[mid] < valueTarget) k = mid + 1; - else hi = mid; - } +function mercator() { + return mercatorProjection(mercatorRaw) + .scale(961 / tau); +} - if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; +function mercatorProjection(project) { + var m = projection(project), + center = m.center, + scale = m.scale, + translate = m.translate, + clipExtent = m.clipExtent, + x0 = null, y0, x1, y1; // clip extent - var valueLeft = sums[k] - valueOffset, - valueRight = value - valueLeft; + m.scale = function(_) { + return arguments.length ? (scale(_), reclip()) : scale(); + }; - if ((x1 - x0) > (y1 - y0)) { - var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1; - partition(i, k, valueLeft, x0, y0, xk, y1); - partition(k, j, valueRight, xk, y0, x1, y1); - } else { - var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1; - partition(i, k, valueLeft, x0, y0, x1, yk); - partition(k, j, valueRight, x0, yk, x1, y1); - } + m.translate = function(_) { + return arguments.length ? (translate(_), reclip()) : translate(); + }; + + m.center = function(_) { + return arguments.length ? (center(_), reclip()) : center(); + }; + + m.clipExtent = function(_) { + return arguments.length ? ((_ == null ? x0 = y0 = x1 = y1 = null : (x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1])), reclip()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + + function reclip() { + var k = pi * scale(), + t = m(rotation(m.rotate()).invert([0, 0])); + return clipExtent(x0 == null + ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw + ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]] + : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]); } + + return reclip(); } -function sliceDice(parent, x0, y0, x1, y1) { - (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); +function tany(y) { + return tan((halfPi + y) / 2); } -var resquarify = (function custom(ratio) { +function conicConformalRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : log(cy0 / cos(y1)) / log(tany(y1) / tany(y0)), + f = cy0 * pow(tany(y0), n) / n; - function resquarify(parent, x0, y0, x1, y1) { - if ((rows = parent._squarify) && (rows.ratio === ratio)) { - var rows, - row, - nodes, - i, - j = -1, - n, - m = rows.length, - value = parent.value; + if (!n) return mercatorRaw; - while (++j < m) { - row = rows[j], nodes = row.children; - for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; - if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1); - else treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1); - value -= row.value; - } - } else { - parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); - rows.ratio = ratio; - } + function project(x, y) { + if (f > 0) { if (y < -halfPi + epsilon) y = -halfPi + epsilon; } + else { if (y > halfPi - epsilon) y = halfPi - epsilon; } + var r = f / pow(tany(y), n); + return [r * sin(n * x), f - r * cos(n * x)]; } - resquarify.ratio = function(x) { - return custom((x = +x) > 1 ? x : 1); + project.invert = function(x, y) { + var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy), + l = atan2(x, abs(fy)) * sign(fy); + if (fy * n < 0) + l -= pi * sign(x) * sign(fy); + return [l / n, 2 * atan(pow(f / r, 1 / n)) - halfPi]; }; - return resquarify; -})(phi); + return project; +} -exports.cluster = cluster; -exports.hierarchy = hierarchy; -exports.pack = index; -exports.packEnclose = enclose; -exports.packSiblings = siblings; -exports.partition = partition; -exports.stratify = stratify; -exports.tree = tree; -exports.treemap = index$1; -exports.treemapBinary = binary; -exports.treemapDice = treemapDice; -exports.treemapResquarify = resquarify; -exports.treemapSlice = treemapSlice; -exports.treemapSliceDice = sliceDice; -exports.treemapSquarify = squarify; +function conicConformal() { + return conicProjection(conicConformalRaw) + .scale(109.5) + .parallels([30, 30]); +} -Object.defineProperty(exports, '__esModule', { value: true }); +function equirectangularRaw(lambda, phi) { + return [lambda, phi]; +} -})); -}); +equirectangularRaw.invert = equirectangularRaw; + +function equirectangular() { + return projection(equirectangularRaw) + .scale(152.63); +} + +function conicEquidistantRaw(y0, y1) { + var cy0 = cos(y0), + n = y0 === y1 ? sin(y0) : (cy0 - cos(y1)) / (y1 - y0), + g = cy0 / n + y0; -var d3Polygon = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-polygon/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports) ; -}(commonjsGlobal, function (exports) { -function area(polygon) { - var i = -1, - n = polygon.length, - a, - b = polygon[n - 1], - area = 0; + if (abs(n) < epsilon) return equirectangularRaw; - while (++i < n) { - a = b; - b = polygon[i]; - area += a[1] * b[0] - a[0] * b[1]; + function project(x, y) { + var gy = g - y, nx = n * x; + return [gy * sin(nx), g - gy * cos(nx)]; } - return area / 2; + project.invert = function(x, y) { + var gy = g - y, + l = atan2(x, abs(gy)) * sign(gy); + if (gy * n < 0) + l -= pi * sign(x) * sign(gy); + return [l / n, g - sign(n) * sqrt(x * x + gy * gy)]; + }; + + return project; } -function centroid(polygon) { - var i = -1, - n = polygon.length, - x = 0, - y = 0, - a, - b = polygon[n - 1], - c, - k = 0; +function conicEquidistant() { + return conicProjection(conicEquidistantRaw) + .scale(131.154) + .center([0, 13.9389]); +} - while (++i < n) { - a = b; - b = polygon[i]; - k += c = a[0] * b[1] - b[0] * a[1]; - x += (a[0] + b[0]) * c; - y += (a[1] + b[1]) * c; +var A1 = 1.340264, + A2 = -0.081106, + A3 = 0.000893, + A4 = 0.003796, + M = sqrt(3) / 2, + iterations = 12; + +function equalEarthRaw(lambda, phi) { + var l = asin(M * sin(phi)), l2 = l * l, l6 = l2 * l2 * l2; + return [ + lambda * cos(l) / (M * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2))), + l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) + ]; +} + +equalEarthRaw.invert = function(x, y) { + var l = y, l2 = l * l, l6 = l2 * l2 * l2; + for (var i = 0, delta, fy, fpy; i < iterations; ++i) { + fy = l * (A1 + A2 * l2 + l6 * (A3 + A4 * l2)) - y; + fpy = A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2); + l -= delta = fy / fpy, l2 = l * l, l6 = l2 * l2 * l2; + if (abs(delta) < epsilon2) break; } + return [ + M * x * (A1 + 3 * A2 * l2 + l6 * (7 * A3 + 9 * A4 * l2)) / cos(l), + asin(sin(l) / M) + ]; +}; - return k *= 3, [x / k, y / k]; +function equalEarth() { + return projection(equalEarthRaw) + .scale(177.158); } -// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of -// the 3D cross product in a quadrant I Cartesian coordinate system (+x is -// right, +y is up). Returns a positive value if ABC is counter-clockwise, -// negative if clockwise, and zero if the points are collinear. -function cross(a, b, c) { - return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); +function gnomonicRaw(x, y) { + var cy = cos(y), k = cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; } -function lexicographicOrder(a, b) { - return a[0] - b[0] || a[1] - b[1]; +gnomonicRaw.invert = azimuthalInvert(atan); + +function gnomonic() { + return projection(gnomonicRaw) + .scale(144.049) + .clipAngle(60); } -// Computes the upper convex hull per the monotone chain algorithm. -// Assumes points.length >= 3, is sorted by x, unique in y. -// Returns an array of indices into points in left-to-right order. -function computeUpperHullIndexes(points) { - const n = points.length, - indexes = [0, 1]; - let size = 2, i; +function identity$1() { + var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, // scale, translate and reflect + alpha = 0, ca, sa, // angle + x0 = null, y0, x1, y1, // clip extent + kx = 1, ky = 1, + transform = transformer({ + point: function(x, y) { + var p = projection([x, y]); + this.stream.point(p[0], p[1]); + } + }), + postclip = identity, + cache, + cacheStream; - for (i = 2; i < n; ++i) { - while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; - indexes[size++] = i; + function reset() { + kx = k * sx; + ky = k * sy; + cache = cacheStream = null; + return projection; } - return indexes.slice(0, size); // remove popped points + function projection (p) { + var x = p[0] * kx, y = p[1] * ky; + if (alpha) { + var t = y * ca - x * sa; + x = x * ca + y * sa; + y = t; + } + return [x + tx, y + ty]; + } + projection.invert = function(p) { + var x = p[0] - tx, y = p[1] - ty; + if (alpha) { + var t = y * ca + x * sa; + x = x * ca - y * sa; + y = t; + } + return [x / kx, y / ky]; + }; + projection.stream = function(stream) { + return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream)); + }; + projection.postclip = function(_) { + return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip; + }; + projection.clipExtent = function(_) { + return arguments.length ? (postclip = _ == null ? (x0 = y0 = x1 = y1 = null, identity) : clipRectangle(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]), reset()) : x0 == null ? null : [[x0, y0], [x1, y1]]; + }; + projection.scale = function(_) { + return arguments.length ? (k = +_, reset()) : k; + }; + projection.translate = function(_) { + return arguments.length ? (tx = +_[0], ty = +_[1], reset()) : [tx, ty]; + }; + projection.angle = function(_) { + return arguments.length ? (alpha = _ % 360 * radians, sa = sin(alpha), ca = cos(alpha), reset()) : alpha * degrees; + }; + projection.reflectX = function(_) { + return arguments.length ? (sx = _ ? -1 : 1, reset()) : sx < 0; + }; + projection.reflectY = function(_) { + return arguments.length ? (sy = _ ? -1 : 1, reset()) : sy < 0; + }; + projection.fitExtent = function(extent, object) { + return fitExtent(projection, extent, object); + }; + projection.fitSize = function(size, object) { + return fitSize(projection, size, object); + }; + projection.fitWidth = function(width, object) { + return fitWidth(projection, width, object); + }; + projection.fitHeight = function(height, object) { + return fitHeight(projection, height, object); + }; + + return projection; } -function hull(points) { - if ((n = points.length) < 3) return null; +function naturalEarth1Raw(lambda, phi) { + var phi2 = phi * phi, phi4 = phi2 * phi2; + return [ + lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))), + phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) + ]; +} - var i, - n, - sortedPoints = new Array(n), - flippedPoints = new Array(n); +naturalEarth1Raw.invert = function(x, y) { + var phi = y, i = 25, delta; + do { + var phi2 = phi * phi, phi4 = phi2 * phi2; + phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) / + (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4))); + } while (abs(delta) > epsilon && --i > 0); + return [ + x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))), + phi + ]; +}; - for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; - sortedPoints.sort(lexicographicOrder); - for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; +function naturalEarth1() { + return projection(naturalEarth1Raw) + .scale(175.295); +} - var upperIndexes = computeUpperHullIndexes(sortedPoints), - lowerIndexes = computeUpperHullIndexes(flippedPoints); +function orthographicRaw(x, y) { + return [cos(y) * sin(x), sin(y)]; +} - // Construct the hull polygon, removing possible duplicate endpoints. - var skipLeft = lowerIndexes[0] === upperIndexes[0], - skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], - hull = []; +orthographicRaw.invert = azimuthalInvert(asin); - // Add upper hull in right-to-l order. - // Then add lower hull in left-to-right order. - for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); - for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); +function orthographic() { + return projection(orthographicRaw) + .scale(249.5) + .clipAngle(90 + epsilon); +} - return hull; +function stereographicRaw(x, y) { + var cy = cos(y), k = 1 + cos(x) * cy; + return [cy * sin(x) / k, sin(y) / k]; } -function contains(polygon, point) { - var n = polygon.length, - p = polygon[n - 1], - x = point[0], y = point[1], - x0 = p[0], y0 = p[1], - x1, y1, - inside = false; +stereographicRaw.invert = azimuthalInvert(function(z) { + return 2 * atan(z); +}); - for (var i = 0; i < n; ++i) { - p = polygon[i], x1 = p[0], y1 = p[1]; - if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; - x0 = x1, y0 = y1; - } +function stereographic() { + return projection(stereographicRaw) + .scale(250) + .clipAngle(142); +} - return inside; +function transverseMercatorRaw(lambda, phi) { + return [log(tan((halfPi + phi) / 2)), -lambda]; } -function length(polygon) { - var i = -1, - n = polygon.length, - b = polygon[n - 1], - xa, - ya, - xb = b[0], - yb = b[1], - perimeter = 0; +transverseMercatorRaw.invert = function(x, y) { + return [-y, 2 * atan(exp(x)) - halfPi]; +}; - while (++i < n) { - xa = xb; - ya = yb; - b = polygon[i]; - xb = b[0]; - yb = b[1]; - xa -= xb; - ya -= yb; - perimeter += Math.hypot(xa, ya); - } +function transverseMercator() { + var m = mercatorProjection(transverseMercatorRaw), + center = m.center, + rotate = m.rotate; - return perimeter; + m.center = function(_) { + return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]); + }; + + m.rotate = function(_) { + return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]); + }; + + return rotate([0, 0, 90]) + .scale(159.155); } -exports.polygonArea = area; -exports.polygonCentroid = centroid; -exports.polygonContains = contains; -exports.polygonHull = hull; -exports.polygonLength = length; +exports.geoAlbers = albers; +exports.geoAlbersUsa = albersUsa; +exports.geoArea = area; +exports.geoAzimuthalEqualArea = azimuthalEqualArea; +exports.geoAzimuthalEqualAreaRaw = azimuthalEqualAreaRaw; +exports.geoAzimuthalEquidistant = azimuthalEquidistant; +exports.geoAzimuthalEquidistantRaw = azimuthalEquidistantRaw; +exports.geoBounds = bounds; +exports.geoCentroid = centroid; +exports.geoCircle = circle; +exports.geoClipAntimeridian = clipAntimeridian; +exports.geoClipCircle = clipCircle; +exports.geoClipExtent = extent; +exports.geoClipRectangle = clipRectangle; +exports.geoConicConformal = conicConformal; +exports.geoConicConformalRaw = conicConformalRaw; +exports.geoConicEqualArea = conicEqualArea; +exports.geoConicEqualAreaRaw = conicEqualAreaRaw; +exports.geoConicEquidistant = conicEquidistant; +exports.geoConicEquidistantRaw = conicEquidistantRaw; +exports.geoContains = contains; +exports.geoDistance = distance; +exports.geoEqualEarth = equalEarth; +exports.geoEqualEarthRaw = equalEarthRaw; +exports.geoEquirectangular = equirectangular; +exports.geoEquirectangularRaw = equirectangularRaw; +exports.geoGnomonic = gnomonic; +exports.geoGnomonicRaw = gnomonicRaw; +exports.geoGraticule = graticule; +exports.geoGraticule10 = graticule10; +exports.geoIdentity = identity$1; +exports.geoInterpolate = interpolate; +exports.geoLength = length; +exports.geoMercator = mercator; +exports.geoMercatorRaw = mercatorRaw; +exports.geoNaturalEarth1 = naturalEarth1; +exports.geoNaturalEarth1Raw = naturalEarth1Raw; +exports.geoOrthographic = orthographic; +exports.geoOrthographicRaw = orthographicRaw; +exports.geoPath = index; +exports.geoProjection = projection; +exports.geoProjectionMutator = projectionMutator; +exports.geoRotation = rotation; +exports.geoStereographic = stereographic; +exports.geoStereographicRaw = stereographicRaw; +exports.geoStream = geoStream; +exports.geoTransform = transform; +exports.geoTransverseMercator = transverseMercator; +exports.geoTransverseMercatorRaw = transverseMercatorRaw; Object.defineProperty(exports, '__esModule', { value: true }); })); }); -var d3Random = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-random/ v2.2.2 Copyright 2020 Mike Bostock +var d3Hierarchy = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-hierarchy/ v2.0.0 Copyright 2020 Mike Bostock (function (global, factory) { factory(exports) ; -}(commonjsGlobal, (function (exports) { -var defaultSource = Math.random; +}(commonjsGlobal, function (exports) { +function defaultSeparation(a, b) { + return a.parent === b.parent ? 1 : 2; +} -var uniform = (function sourceRandomUniform(source) { - function randomUniform(min, max) { - min = min == null ? 0 : +min; - max = max == null ? 1 : +max; - if (arguments.length === 1) max = min, min = 0; - else max -= min; - return function() { - return source() * max + min; - }; - } +function meanX(children) { + return children.reduce(meanXReduce, 0) / children.length; +} - randomUniform.source = sourceRandomUniform; +function meanXReduce(x, c) { + return x + c.x; +} - return randomUniform; -})(defaultSource); +function maxY(children) { + return 1 + children.reduce(maxYReduce, 0); +} -var int = (function sourceRandomInt(source) { - function randomInt(min, max) { - if (arguments.length < 2) max = min, min = 0; - min = Math.floor(min); - max = Math.floor(max) - min; - return function() { - return Math.floor(source() * max + min); - }; - } +function maxYReduce(y, c) { + return Math.max(y, c.y); +} - randomInt.source = sourceRandomInt; +function leafLeft(node) { + var children; + while (children = node.children) node = children[0]; + return node; +} - return randomInt; -})(defaultSource); +function leafRight(node) { + var children; + while (children = node.children) node = children[children.length - 1]; + return node; +} -var normal = (function sourceRandomNormal(source) { - function randomNormal(mu, sigma) { - var x, r; - mu = mu == null ? 0 : +mu; - sigma = sigma == null ? 1 : +sigma; - return function() { - var y; +function cluster() { + var separation = defaultSeparation, + dx = 1, + dy = 1, + nodeSize = false; - // If available, use the second previously-generated uniform random. - if (x != null) y = x, x = null; + function cluster(root) { + var previousNode, + x = 0; - // Otherwise, generate a new x and y. - else do { - x = source() * 2 - 1; - y = source() * 2 - 1; - r = x * x + y * y; - } while (!r || r > 1); + // First walk, computing the initial x & y values. + root.eachAfter(function(node) { + var children = node.children; + if (children) { + node.x = meanX(children); + node.y = maxY(children); + } else { + node.x = previousNode ? x += separation(node, previousNode) : 0; + node.y = 0; + previousNode = node; + } + }); - return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); - }; + var left = leafLeft(root), + right = leafRight(root), + x0 = left.x - separation(left, right) / 2, + x1 = right.x + separation(right, left) / 2; + + // Second walk, normalizing x & y to the desired size. + return root.eachAfter(nodeSize ? function(node) { + node.x = (node.x - root.x) * dx; + node.y = (root.y - node.y) * dy; + } : function(node) { + node.x = (node.x - x0) / (x1 - x0) * dx; + node.y = (1 - (root.y ? node.y / root.y : 1)) * dy; + }); } - randomNormal.source = sourceRandomNormal; + cluster.separation = function(x) { + return arguments.length ? (separation = x, cluster) : separation; + }; - return randomNormal; -})(defaultSource); + cluster.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]); + }; -var logNormal = (function sourceRandomLogNormal(source) { - var N = normal.source(source); + cluster.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null); + }; - function randomLogNormal() { - var randomNormal = N.apply(this, arguments); - return function() { - return Math.exp(randomNormal()); - }; + return cluster; +} + +function count(node) { + var sum = 0, + children = node.children, + i = children && children.length; + if (!i) sum = 1; + else while (--i >= 0) sum += children[i].value; + node.value = sum; +} + +function node_count() { + return this.eachAfter(count); +} + +function node_each(callback, that) { + let index = -1; + for (const node of this) { + callback.call(that, node, ++index, this); } + return this; +} - randomLogNormal.source = sourceRandomLogNormal; +function node_eachBefore(callback, that) { + var node = this, nodes = [node], children, i, index = -1; + while (node = nodes.pop()) { + callback.call(that, node, ++index, this); + if (children = node.children) { + for (i = children.length - 1; i >= 0; --i) { + nodes.push(children[i]); + } + } + } + return this; +} - return randomLogNormal; -})(defaultSource); +function node_eachAfter(callback, that) { + var node = this, nodes = [node], next = [], children, i, n, index = -1; + while (node = nodes.pop()) { + next.push(node); + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + nodes.push(children[i]); + } + } + } + while (node = next.pop()) { + callback.call(that, node, ++index, this); + } + return this; +} -var irwinHall = (function sourceRandomIrwinHall(source) { - function randomIrwinHall(n) { - if ((n = +n) <= 0) return () => 0; - return function() { - for (var sum = 0, i = n; i > 1; --i) sum += source(); - return sum + i * source(); - }; +function node_find(callback, that) { + let index = -1; + for (const node of this) { + if (callback.call(that, node, ++index, this)) { + return node; + } } +} - randomIrwinHall.source = sourceRandomIrwinHall; +function node_sum(value) { + return this.eachAfter(function(node) { + var sum = +value(node.data) || 0, + children = node.children, + i = children && children.length; + while (--i >= 0) sum += children[i].value; + node.value = sum; + }); +} - return randomIrwinHall; -})(defaultSource); +function node_sort(compare) { + return this.eachBefore(function(node) { + if (node.children) { + node.children.sort(compare); + } + }); +} -var bates = (function sourceRandomBates(source) { - var I = irwinHall.source(source); +function node_path(end) { + var start = this, + ancestor = leastCommonAncestor(start, end), + nodes = [start]; + while (start !== ancestor) { + start = start.parent; + nodes.push(start); + } + var k = nodes.length; + while (end !== ancestor) { + nodes.splice(k, 0, end); + end = end.parent; + } + return nodes; +} - function randomBates(n) { - // use limiting distribution at n === 0 - if ((n = +n) === 0) return source; - var randomIrwinHall = I(n); - return function() { - return randomIrwinHall() / n; - }; +function leastCommonAncestor(a, b) { + if (a === b) return a; + var aNodes = a.ancestors(), + bNodes = b.ancestors(), + c = null; + a = aNodes.pop(); + b = bNodes.pop(); + while (a === b) { + c = a; + a = aNodes.pop(); + b = bNodes.pop(); } + return c; +} - randomBates.source = sourceRandomBates; +function node_ancestors() { + var node = this, nodes = [node]; + while (node = node.parent) { + nodes.push(node); + } + return nodes; +} - return randomBates; -})(defaultSource); +function node_descendants() { + return Array.from(this); +} -var exponential = (function sourceRandomExponential(source) { - function randomExponential(lambda) { - return function() { - return -Math.log1p(-source()) / lambda; - }; - } +function node_leaves() { + var leaves = []; + this.eachBefore(function(node) { + if (!node.children) { + leaves.push(node); + } + }); + return leaves; +} - randomExponential.source = sourceRandomExponential; +function node_links() { + var root = this, links = []; + root.each(function(node) { + if (node !== root) { // Don’t include the root’s parent, if any. + links.push({source: node.parent, target: node}); + } + }); + return links; +} - return randomExponential; -})(defaultSource); +function* node_iterator() { + var node = this, current, next = [node], children, i, n; + do { + current = next.reverse(), next = []; + while (node = current.pop()) { + yield node; + if (children = node.children) { + for (i = 0, n = children.length; i < n; ++i) { + next.push(children[i]); + } + } + } + } while (next.length); +} -var pareto = (function sourceRandomPareto(source) { - function randomPareto(alpha) { - if ((alpha = +alpha) < 0) throw new RangeError("invalid alpha"); - alpha = 1 / -alpha; - return function() { - return Math.pow(1 - source(), alpha); - }; +function hierarchy(data, children) { + if (data instanceof Map) { + data = [undefined, data]; + if (children === undefined) children = mapChildren; + } else if (children === undefined) { + children = objectChildren; } - randomPareto.source = sourceRandomPareto; - - return randomPareto; -})(defaultSource); + var root = new Node(data), + node, + nodes = [root], + child, + childs, + i, + n; -var bernoulli = (function sourceRandomBernoulli(source) { - function randomBernoulli(p) { - if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); - return function() { - return Math.floor(source() + p); - }; + while (node = nodes.pop()) { + if ((childs = children(node.data)) && (n = (childs = Array.from(childs)).length)) { + node.children = childs; + for (i = n - 1; i >= 0; --i) { + nodes.push(child = childs[i] = new Node(childs[i])); + child.parent = node; + child.depth = node.depth + 1; + } + } } - randomBernoulli.source = sourceRandomBernoulli; - - return randomBernoulli; -})(defaultSource); + return root.eachBefore(computeHeight); +} -var geometric = (function sourceRandomGeometric(source) { - function randomGeometric(p) { - if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); - if (p === 0) return () => Infinity; - if (p === 1) return () => 1; - p = Math.log1p(-p); - return function() { - return 1 + Math.floor(Math.log1p(-source()) / p); - }; - } +function node_copy() { + return hierarchy(this).eachBefore(copyData); +} - randomGeometric.source = sourceRandomGeometric; +function objectChildren(d) { + return d.children; +} - return randomGeometric; -})(defaultSource); +function mapChildren(d) { + return Array.isArray(d) ? d[1] : null; +} -var gamma = (function sourceRandomGamma(source) { - var randomNormal = normal.source(source)(); +function copyData(node) { + if (node.data.value !== undefined) node.value = node.data.value; + node.data = node.data.data; +} - function randomGamma(k, theta) { - if ((k = +k) < 0) throw new RangeError("invalid k"); - // degenerate distribution if k === 0 - if (k === 0) return () => 0; - theta = theta == null ? 1 : +theta; - // exponential distribution if k === 1 - if (k === 1) return () => -Math.log1p(-source()) * theta; +function computeHeight(node) { + var height = 0; + do node.height = height; + while ((node = node.parent) && (node.height < ++height)); +} - var d = (k < 1 ? k + 1 : k) - 1 / 3, - c = 1 / (3 * Math.sqrt(d)), - multiplier = k < 1 ? () => Math.pow(source(), 1 / k) : () => 1; - return function() { - do { - do { - var x = randomNormal(), - v = 1 + c * x; - } while (v <= 0); - v *= v * v; - var u = 1 - source(); - } while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v))); - return d * v * multiplier() * theta; - }; - } +function Node(data) { + this.data = data; + this.depth = + this.height = 0; + this.parent = null; +} - randomGamma.source = sourceRandomGamma; +Node.prototype = hierarchy.prototype = { + constructor: Node, + count: node_count, + each: node_each, + eachAfter: node_eachAfter, + eachBefore: node_eachBefore, + find: node_find, + sum: node_sum, + sort: node_sort, + path: node_path, + ancestors: node_ancestors, + descendants: node_descendants, + leaves: node_leaves, + links: node_links, + copy: node_copy, + [Symbol.iterator]: node_iterator +}; - return randomGamma; -})(defaultSource); +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else +} -var beta = (function sourceRandomBeta(source) { - var G = gamma.source(source); +function shuffle(array) { + var m = array.length, + t, + i; - function randomBeta(alpha, beta) { - var X = G(alpha), - Y = G(beta); - return function() { - var x = X(); - return x === 0 ? 0 : x / (x + Y()); - }; + while (m) { + i = Math.random() * m-- | 0; + t = array[m]; + array[m] = array[i]; + array[i] = t; } - randomBeta.source = sourceRandomBeta; - - return randomBeta; -})(defaultSource); + return array; +} -var binomial = (function sourceRandomBinomial(source) { - var G = geometric.source(source), - B = beta.source(source); +function enclose(circles) { + var i = 0, n = (circles = shuffle(Array.from(circles))).length, B = [], p, e; - function randomBinomial(n, p) { - n = +n; - if ((p = +p) >= 1) return () => n; - if (p <= 0) return () => 0; - return function() { - var acc = 0, nn = n, pp = p; - while (nn * pp > 16 && nn * (1 - pp) > 16) { - var i = Math.floor((nn + 1) * pp), - y = B(i, nn - i + 1)(); - if (y <= pp) { - acc += i; - nn -= i; - pp = (pp - y) / (1 - y); - } else { - nn = i - 1; - pp /= y; - } - } - var sign = pp < 0.5, - pFinal = sign ? pp : 1 - pp, - g = G(pFinal); - for (var s = g(), k = 0; s <= nn; ++k) s += g(); - return acc + (sign ? k : nn - k); - }; + while (i < n) { + p = circles[i]; + if (e && enclosesWeak(e, p)) ++i; + else e = encloseBasis(B = extendBasis(B, p)), i = 0; } - randomBinomial.source = sourceRandomBinomial; + return e; +} - return randomBinomial; -})(defaultSource); +function extendBasis(B, p) { + var i, j; -var weibull = (function sourceRandomWeibull(source) { - function randomWeibull(k, a, b) { - var outerFunc; - if ((k = +k) === 0) { - outerFunc = x => -Math.log(x); - } else { - k = 1 / k; - outerFunc = x => Math.pow(x, k); + if (enclosesWeakAll(p, B)) return [p]; + + // If we get here then B must have at least one element. + for (i = 0; i < B.length; ++i) { + if (enclosesNot(p, B[i]) + && enclosesWeakAll(encloseBasis2(B[i], p), B)) { + return [B[i], p]; } - a = a == null ? 0 : +a; - b = b == null ? 1 : +b; - return function() { - return a + b * outerFunc(-Math.log1p(-source())); - }; } - randomWeibull.source = sourceRandomWeibull; - - return randomWeibull; -})(defaultSource); - -var cauchy = (function sourceRandomCauchy(source) { - function randomCauchy(a, b) { - a = a == null ? 0 : +a; - b = b == null ? 1 : +b; - return function() { - return a + b * Math.tan(Math.PI * source()); - }; + // If we get here then B must have at least two elements. + for (i = 0; i < B.length - 1; ++i) { + for (j = i + 1; j < B.length; ++j) { + if (enclosesNot(encloseBasis2(B[i], B[j]), p) + && enclosesNot(encloseBasis2(B[i], p), B[j]) + && enclosesNot(encloseBasis2(B[j], p), B[i]) + && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) { + return [B[i], B[j], p]; + } + } } - randomCauchy.source = sourceRandomCauchy; - - return randomCauchy; -})(defaultSource); - -var logistic = (function sourceRandomLogistic(source) { - function randomLogistic(a, b) { - a = a == null ? 0 : +a; - b = b == null ? 1 : +b; - return function() { - var u = source(); - return a + b * Math.log(u / (1 - u)); - }; - } + // If we get here then something is very wrong. + throw new Error; +} - randomLogistic.source = sourceRandomLogistic; +function enclosesNot(a, b) { + var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y; + return dr < 0 || dr * dr < dx * dx + dy * dy; +} - return randomLogistic; -})(defaultSource); +function enclosesWeak(a, b) { + var dr = a.r - b.r + Math.max(a.r, b.r, 1) * 1e-9, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} -var poisson = (function sourceRandomPoisson(source) { - var G = gamma.source(source), - B = binomial.source(source); +function enclosesWeakAll(a, B) { + for (var i = 0; i < B.length; ++i) { + if (!enclosesWeak(a, B[i])) { + return false; + } + } + return true; +} - function randomPoisson(lambda) { - return function() { - var acc = 0, l = lambda; - while (l > 16) { - var n = Math.floor(0.875 * l), - t = G(n)(); - if (t > l) return acc + B(n - 1, l / t)(); - acc += n; - l -= t; - } - for (var s = -Math.log1p(-source()), k = 0; s <= l; ++k) s -= Math.log1p(-source()); - return acc + k; - }; +function encloseBasis(B) { + switch (B.length) { + case 1: return encloseBasis1(B[0]); + case 2: return encloseBasis2(B[0], B[1]); + case 3: return encloseBasis3(B[0], B[1], B[2]); } +} - randomPoisson.source = sourceRandomPoisson; +function encloseBasis1(a) { + return { + x: a.x, + y: a.y, + r: a.r + }; +} - return randomPoisson; -})(defaultSource); +function encloseBasis2(a, b) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1, + l = Math.sqrt(x21 * x21 + y21 * y21); + return { + x: (x1 + x2 + x21 / l * r21) / 2, + y: (y1 + y2 + y21 / l * r21) / 2, + r: (l + r1 + r2) / 2 + }; +} -// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use -const mul = 0x19660D; -const inc = 0x3C6EF35F; -const eps = 1 / 0x100000000; +function encloseBasis3(a, b, c) { + var x1 = a.x, y1 = a.y, r1 = a.r, + x2 = b.x, y2 = b.y, r2 = b.r, + x3 = c.x, y3 = c.y, r3 = c.r, + a2 = x1 - x2, + a3 = x1 - x3, + b2 = y1 - y2, + b3 = y1 - y3, + c2 = r2 - r1, + c3 = r3 - r1, + d1 = x1 * x1 + y1 * y1 - r1 * r1, + d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2, + d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3, + ab = a3 * b2 - a2 * b3, + xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1, + xb = (b3 * c2 - b2 * c3) / ab, + ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1, + yb = (a2 * c3 - a3 * c2) / ab, + A = xb * xb + yb * yb - 1, + B = 2 * (r1 + xa * xb + ya * yb), + C = xa * xa + ya * ya - r1 * r1, + r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B); + return { + x: x1 + xa + xb * r, + y: y1 + ya + yb * r, + r: r + }; +} -function lcg(seed = Math.random()) { - let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0; - return () => (state = mul * state + inc | 0, eps * (state >>> 0)); +function place(b, a, c) { + var dx = b.x - a.x, x, a2, + dy = b.y - a.y, y, b2, + d2 = dx * dx + dy * dy; + if (d2) { + a2 = a.r + c.r, a2 *= a2; + b2 = b.r + c.r, b2 *= b2; + if (a2 > b2) { + x = (d2 + b2 - a2) / (2 * d2); + y = Math.sqrt(Math.max(0, b2 / d2 - x * x)); + c.x = b.x - x * dx - y * dy; + c.y = b.y - x * dy + y * dx; + } else { + x = (d2 + a2 - b2) / (2 * d2); + y = Math.sqrt(Math.max(0, a2 / d2 - x * x)); + c.x = a.x + x * dx - y * dy; + c.y = a.y + x * dy + y * dx; + } + } else { + c.x = a.x + c.r; + c.y = a.y; + } } -exports.randomBates = bates; -exports.randomBernoulli = bernoulli; -exports.randomBeta = beta; -exports.randomBinomial = binomial; -exports.randomCauchy = cauchy; -exports.randomExponential = exponential; -exports.randomGamma = gamma; -exports.randomGeometric = geometric; -exports.randomInt = int; -exports.randomIrwinHall = irwinHall; -exports.randomLcg = lcg; -exports.randomLogNormal = logNormal; -exports.randomLogistic = logistic; -exports.randomNormal = normal; -exports.randomPareto = pareto; -exports.randomPoisson = poisson; -exports.randomUniform = uniform; -exports.randomWeibull = weibull; - -Object.defineProperty(exports, '__esModule', { value: true }); +function intersects(a, b) { + var dr = a.r + b.r - 1e-6, dx = b.x - a.x, dy = b.y - a.y; + return dr > 0 && dr * dr > dx * dx + dy * dy; +} -}))); -}); +function score(node) { + var a = node._, + b = node.next._, + ab = a.r + b.r, + dx = (a.x * b.r + b.x * a.r) / ab, + dy = (a.y * b.r + b.y * a.r) / ab; + return dx * dx + dy * dy; +} -var d3Time = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-time/ v2.1.1 Copyright 2021 Mike Bostock -(function (global, factory) { -factory(exports, d3Array) ; -}(commonjsGlobal, (function (exports, d3Array) { -var t0 = new Date, - t1 = new Date; +function Node$1(circle) { + this._ = circle; + this.next = null; + this.previous = null; +} -function newInterval(floori, offseti, count, field) { +function packEnclose(circles) { + if (!(n = (circles = array(circles)).length)) return 0; - function interval(date) { - return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; - } + var a, b, c, n, aa, ca, i, j, k, sj, sk; - interval.floor = function(date) { - return floori(date = new Date(+date)), date; - }; + // Place the first circle. + a = circles[0], a.x = 0, a.y = 0; + if (!(n > 1)) return a.r; - interval.ceil = function(date) { - return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; - }; + // Place the second circle. + b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0; + if (!(n > 2)) return a.r + b.r; - interval.round = function(date) { - var d0 = interval(date), - d1 = interval.ceil(date); - return date - d0 < d1 - date ? d0 : d1; - }; + // Place the third circle. + place(b, a, c = circles[2]); - interval.offset = function(date, step) { - return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; - }; + // Initialize the front-chain using the first three circles a, b and c. + a = new Node$1(a), b = new Node$1(b), c = new Node$1(c); + a.next = c.previous = b; + b.next = a.previous = c; + c.next = b.previous = a; - interval.range = function(start, stop, step) { - var range = [], previous; - start = interval.ceil(start); - step = step == null ? 1 : Math.floor(step); - if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date - do range.push(previous = new Date(+start)), offseti(start, step), floori(start); - while (previous < start && start < stop); - return range; - }; + // Attempt to place each remaining circle… + pack: for (i = 3; i < n; ++i) { + place(a._, b._, c = circles[i]), c = new Node$1(c); - interval.filter = function(test) { - return newInterval(function(date) { - if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); - }, function(date, step) { - if (date >= date) { - if (step < 0) while (++step <= 0) { - while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty - } else while (--step >= 0) { - while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + // Find the closest intersecting circle on the front-chain, if any. + // “Closeness” is determined by linear distance along the front-chain. + // “Ahead” or “behind” is likewise determined by linear distance. + j = b.next, k = a.previous, sj = b._.r, sk = a._.r; + do { + if (sj <= sk) { + if (intersects(j._, c._)) { + b = j, a.next = b, b.previous = a, --i; + continue pack; + } + sj += j._.r, j = j.next; + } else { + if (intersects(k._, c._)) { + a = k, a.next = b, b.previous = a, --i; + continue pack; } + sk += k._.r, k = k.previous; } - }); - }; + } while (j !== k.next); - if (count) { - interval.count = function(start, end) { - t0.setTime(+start), t1.setTime(+end); - floori(t0), floori(t1); - return Math.floor(count(t0, t1)); - }; + // Success! Insert the new circle c between a and b. + c.previous = a, c.next = b, a.next = b.previous = b = c; - interval.every = function(step) { - step = Math.floor(step); - return !isFinite(step) || !(step > 0) ? null - : !(step > 1) ? interval - : interval.filter(field - ? function(d) { return field(d) % step === 0; } - : function(d) { return interval.count(0, d) % step === 0; }); - }; + // Compute the new closest circle pair to the centroid. + aa = score(a); + while ((c = c.next) !== b) { + if ((ca = score(c)) < aa) { + a = c, aa = ca; + } + } + b = a.next; } - return interval; -} - -var millisecond = newInterval(function() { - // noop -}, function(date, step) { - date.setTime(+date + step); -}, function(start, end) { - return end - start; -}); - -// An optimized implementation for this simple case. -millisecond.every = function(k) { - k = Math.floor(k); - if (!isFinite(k) || !(k > 0)) return null; - if (!(k > 1)) return millisecond; - return newInterval(function(date) { - date.setTime(Math.floor(date / k) * k); - }, function(date, step) { - date.setTime(+date + step * k); - }, function(start, end) { - return (end - start) / k; - }); -}; -var milliseconds = millisecond.range; + // Compute the enclosing circle of the front chain. + a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a); -const durationSecond = 1000; -const durationMinute = durationSecond * 60; -const durationHour = durationMinute * 60; -const durationDay = durationHour * 24; -const durationWeek = durationDay * 7; -const durationMonth = durationDay * 30; -const durationYear = durationDay * 365; + // Translate the circles to put the enclosing circle around the origin. + for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y; -var second = newInterval(function(date) { - date.setTime(date - date.getMilliseconds()); -}, function(date, step) { - date.setTime(+date + step * durationSecond); -}, function(start, end) { - return (end - start) / durationSecond; -}, function(date) { - return date.getUTCSeconds(); -}); -var seconds = second.range; + return c.r; +} -var minute = newInterval(function(date) { - date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); -}, function(date, step) { - date.setTime(+date + step * durationMinute); -}, function(start, end) { - return (end - start) / durationMinute; -}, function(date) { - return date.getMinutes(); -}); -var minutes = minute.range; +function siblings(circles) { + packEnclose(circles); + return circles; +} -var hour = newInterval(function(date) { - date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); -}, function(date, step) { - date.setTime(+date + step * durationHour); -}, function(start, end) { - return (end - start) / durationHour; -}, function(date) { - return date.getHours(); -}); -var hours = hour.range; +function optional(f) { + return f == null ? null : required(f); +} -var day = newInterval( - date => date.setHours(0, 0, 0, 0), - (date, step) => date.setDate(date.getDate() + step), - (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay, - date => date.getDate() - 1 -); -var days = day.range; +function required(f) { + if (typeof f !== "function") throw new Error; + return f; +} -function weekday(i) { - return newInterval(function(date) { - date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); - date.setHours(0, 0, 0, 0); - }, function(date, step) { - date.setDate(date.getDate() + step * 7); - }, function(start, end) { - return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; - }); +function constantZero() { + return 0; } -var sunday = weekday(0); -var monday = weekday(1); -var tuesday = weekday(2); -var wednesday = weekday(3); -var thursday = weekday(4); -var friday = weekday(5); -var saturday = weekday(6); +function constant(x) { + return function() { + return x; + }; +} -var sundays = sunday.range; -var mondays = monday.range; -var tuesdays = tuesday.range; -var wednesdays = wednesday.range; -var thursdays = thursday.range; -var fridays = friday.range; -var saturdays = saturday.range; +function defaultRadius(d) { + return Math.sqrt(d.value); +} -var month = newInterval(function(date) { - date.setDate(1); - date.setHours(0, 0, 0, 0); -}, function(date, step) { - date.setMonth(date.getMonth() + step); -}, function(start, end) { - return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; -}, function(date) { - return date.getMonth(); -}); -var months = month.range; +function index() { + var radius = null, + dx = 1, + dy = 1, + padding = constantZero; -var year = newInterval(function(date) { - date.setMonth(0, 1); - date.setHours(0, 0, 0, 0); -}, function(date, step) { - date.setFullYear(date.getFullYear() + step); -}, function(start, end) { - return end.getFullYear() - start.getFullYear(); -}, function(date) { - return date.getFullYear(); -}); + function pack(root) { + root.x = dx / 2, root.y = dy / 2; + if (radius) { + root.eachBefore(radiusLeaf(radius)) + .eachAfter(packChildren(padding, 0.5)) + .eachBefore(translateChild(1)); + } else { + root.eachBefore(radiusLeaf(defaultRadius)) + .eachAfter(packChildren(constantZero, 1)) + .eachAfter(packChildren(padding, root.r / Math.min(dx, dy))) + .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r))); + } + return root; + } -// An optimized implementation for this simple case. -year.every = function(k) { - return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { - date.setFullYear(Math.floor(date.getFullYear() / k) * k); - date.setMonth(0, 1); - date.setHours(0, 0, 0, 0); - }, function(date, step) { - date.setFullYear(date.getFullYear() + step * k); - }); -}; -var years = year.range; + pack.radius = function(x) { + return arguments.length ? (radius = optional(x), pack) : radius; + }; -var utcMinute = newInterval(function(date) { - date.setUTCSeconds(0, 0); -}, function(date, step) { - date.setTime(+date + step * durationMinute); -}, function(start, end) { - return (end - start) / durationMinute; -}, function(date) { - return date.getUTCMinutes(); -}); -var utcMinutes = utcMinute.range; + pack.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy]; + }; -var utcHour = newInterval(function(date) { - date.setUTCMinutes(0, 0, 0); -}, function(date, step) { - date.setTime(+date + step * durationHour); -}, function(start, end) { - return (end - start) / durationHour; -}, function(date) { - return date.getUTCHours(); -}); -var utcHours = utcHour.range; + pack.padding = function(x) { + return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding; + }; -var utcDay = newInterval(function(date) { - date.setUTCHours(0, 0, 0, 0); -}, function(date, step) { - date.setUTCDate(date.getUTCDate() + step); -}, function(start, end) { - return (end - start) / durationDay; -}, function(date) { - return date.getUTCDate() - 1; -}); -var utcDays = utcDay.range; + return pack; +} -function utcWeekday(i) { - return newInterval(function(date) { - date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); - date.setUTCHours(0, 0, 0, 0); - }, function(date, step) { - date.setUTCDate(date.getUTCDate() + step * 7); - }, function(start, end) { - return (end - start) / durationWeek; - }); +function radiusLeaf(radius) { + return function(node) { + if (!node.children) { + node.r = Math.max(0, +radius(node) || 0); + } + }; } -var utcSunday = utcWeekday(0); -var utcMonday = utcWeekday(1); -var utcTuesday = utcWeekday(2); -var utcWednesday = utcWeekday(3); -var utcThursday = utcWeekday(4); -var utcFriday = utcWeekday(5); -var utcSaturday = utcWeekday(6); +function packChildren(padding, k) { + return function(node) { + if (children = node.children) { + var children, + i, + n = children.length, + r = padding(node) * k || 0, + e; -var utcSundays = utcSunday.range; -var utcMondays = utcMonday.range; -var utcTuesdays = utcTuesday.range; -var utcWednesdays = utcWednesday.range; -var utcThursdays = utcThursday.range; -var utcFridays = utcFriday.range; -var utcSaturdays = utcSaturday.range; + if (r) for (i = 0; i < n; ++i) children[i].r += r; + e = packEnclose(children); + if (r) for (i = 0; i < n; ++i) children[i].r -= r; + node.r = e + r; + } + }; +} -var utcMonth = newInterval(function(date) { - date.setUTCDate(1); - date.setUTCHours(0, 0, 0, 0); -}, function(date, step) { - date.setUTCMonth(date.getUTCMonth() + step); -}, function(start, end) { - return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; -}, function(date) { - return date.getUTCMonth(); -}); -var utcMonths = utcMonth.range; +function translateChild(k) { + return function(node) { + var parent = node.parent; + node.r *= k; + if (parent) { + node.x = parent.x + k * node.x; + node.y = parent.y + k * node.y; + } + }; +} -var utcYear = newInterval(function(date) { - date.setUTCMonth(0, 1); - date.setUTCHours(0, 0, 0, 0); -}, function(date, step) { - date.setUTCFullYear(date.getUTCFullYear() + step); -}, function(start, end) { - return end.getUTCFullYear() - start.getUTCFullYear(); -}, function(date) { - return date.getUTCFullYear(); -}); +function roundNode(node) { + node.x0 = Math.round(node.x0); + node.y0 = Math.round(node.y0); + node.x1 = Math.round(node.x1); + node.y1 = Math.round(node.y1); +} -// An optimized implementation for this simple case. -utcYear.every = function(k) { - return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { - date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); - date.setUTCMonth(0, 1); - date.setUTCHours(0, 0, 0, 0); - }, function(date, step) { - date.setUTCFullYear(date.getUTCFullYear() + step * k); - }); -}; -var utcYears = utcYear.range; +function treemapDice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (x1 - x0) / parent.value; -function ticker(year, month, week, day, hour, minute) { + while (++i < n) { + node = nodes[i], node.y0 = y0, node.y1 = y1; + node.x0 = x0, node.x1 = x0 += node.value * k; + } +} - const tickIntervals = [ - [second, 1, durationSecond], - [second, 5, 5 * durationSecond], - [second, 15, 15 * durationSecond], - [second, 30, 30 * durationSecond], - [minute, 1, durationMinute], - [minute, 5, 5 * durationMinute], - [minute, 15, 15 * durationMinute], - [minute, 30, 30 * durationMinute], - [ hour, 1, durationHour ], - [ hour, 3, 3 * durationHour ], - [ hour, 6, 6 * durationHour ], - [ hour, 12, 12 * durationHour ], - [ day, 1, durationDay ], - [ day, 2, 2 * durationDay ], - [ week, 1, durationWeek ], - [ month, 1, durationMonth ], - [ month, 3, 3 * durationMonth ], - [ year, 1, durationYear ] - ]; +function partition() { + var dx = 1, + dy = 1, + padding = 0, + round = false; - function ticks(start, stop, count) { - const reverse = stop < start; - if (reverse) [start, stop] = [stop, start]; - const interval = count && typeof count.range === "function" ? count : tickInterval(start, stop, count); - const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop - return reverse ? ticks.reverse() : ticks; + function partition(root) { + var n = root.height + 1; + root.x0 = + root.y0 = padding; + root.x1 = dx; + root.y1 = dy / n; + root.eachBefore(positionNode(dy, n)); + if (round) root.eachBefore(roundNode); + return root; } - function tickInterval(start, stop, count) { - const target = Math.abs(stop - start) / count; - const i = d3Array.bisector(([,, step]) => step).right(tickIntervals, target); - if (i === tickIntervals.length) return year.every(d3Array.tickStep(start / durationYear, stop / durationYear, count)); - if (i === 0) return millisecond.every(Math.max(d3Array.tickStep(start, stop, count), 1)); - const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; - return t.every(step); + function positionNode(dy, n) { + return function(node) { + if (node.children) { + treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n); + } + var x0 = node.x0, + y0 = node.y0, + x1 = node.x1 - padding, + y1 = node.y1 - padding; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + }; } - return [ticks, tickInterval]; -} + partition.round = function(x) { + return arguments.length ? (round = !!x, partition) : round; + }; -const [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute); -const [timeTicks, timeTickInterval] = ticker(year, month, sunday, day, hour, minute); + partition.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy]; + }; -exports.timeDay = day; -exports.timeDays = days; -exports.timeFriday = friday; -exports.timeFridays = fridays; -exports.timeHour = hour; -exports.timeHours = hours; -exports.timeInterval = newInterval; -exports.timeMillisecond = millisecond; -exports.timeMilliseconds = milliseconds; -exports.timeMinute = minute; -exports.timeMinutes = minutes; -exports.timeMonday = monday; -exports.timeMondays = mondays; -exports.timeMonth = month; -exports.timeMonths = months; -exports.timeSaturday = saturday; -exports.timeSaturdays = saturdays; -exports.timeSecond = second; -exports.timeSeconds = seconds; -exports.timeSunday = sunday; -exports.timeSundays = sundays; -exports.timeThursday = thursday; -exports.timeThursdays = thursdays; -exports.timeTickInterval = timeTickInterval; -exports.timeTicks = timeTicks; -exports.timeTuesday = tuesday; -exports.timeTuesdays = tuesdays; -exports.timeWednesday = wednesday; -exports.timeWednesdays = wednesdays; -exports.timeWeek = sunday; -exports.timeWeeks = sundays; -exports.timeYear = year; -exports.timeYears = years; -exports.utcDay = utcDay; -exports.utcDays = utcDays; -exports.utcFriday = utcFriday; -exports.utcFridays = utcFridays; -exports.utcHour = utcHour; -exports.utcHours = utcHours; -exports.utcMillisecond = millisecond; -exports.utcMilliseconds = milliseconds; -exports.utcMinute = utcMinute; -exports.utcMinutes = utcMinutes; -exports.utcMonday = utcMonday; -exports.utcMondays = utcMondays; -exports.utcMonth = utcMonth; -exports.utcMonths = utcMonths; -exports.utcSaturday = utcSaturday; -exports.utcSaturdays = utcSaturdays; -exports.utcSecond = second; -exports.utcSeconds = seconds; -exports.utcSunday = utcSunday; -exports.utcSundays = utcSundays; -exports.utcThursday = utcThursday; -exports.utcThursdays = utcThursdays; -exports.utcTickInterval = utcTickInterval; -exports.utcTicks = utcTicks; -exports.utcTuesday = utcTuesday; -exports.utcTuesdays = utcTuesdays; -exports.utcWednesday = utcWednesday; -exports.utcWednesdays = utcWednesdays; -exports.utcWeek = utcSunday; -exports.utcWeeks = utcSundays; -exports.utcYear = utcYear; -exports.utcYears = utcYears; + partition.padding = function(x) { + return arguments.length ? (padding = +x, partition) : padding; + }; -Object.defineProperty(exports, '__esModule', { value: true }); + return partition; +} -}))); -}); +var preroot = {depth: -1}, + ambiguous = {}; -var d3TimeFormat = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-time-format/ v3.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Time) ; -}(commonjsGlobal, function (exports, d3Time) { -function localDate(d) { - if (0 <= d.y && d.y < 100) { - var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); - date.setFullYear(d.y); - return date; - } - return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); +function defaultId(d) { + return d.id; } -function utcDate(d) { - if (0 <= d.y && d.y < 100) { - var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); - date.setUTCFullYear(d.y); - return date; - } - return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); +function defaultParentId(d) { + return d.parentId; } -function newDate(y, m, d) { - return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; -} +function stratify() { + var id = defaultId, + parentId = defaultParentId; -function formatLocale(locale) { - var locale_dateTime = locale.dateTime, - locale_date = locale.date, - locale_time = locale.time, - locale_periods = locale.periods, - locale_weekdays = locale.days, - locale_shortWeekdays = locale.shortDays, - locale_months = locale.months, - locale_shortMonths = locale.shortMonths; + function stratify(data) { + var nodes = Array.from(data), + n = nodes.length, + d, + i, + root, + parent, + node, + nodeId, + nodeKey, + nodeByKey = new Map; - var periodRe = formatRe(locale_periods), - periodLookup = formatLookup(locale_periods), - weekdayRe = formatRe(locale_weekdays), - weekdayLookup = formatLookup(locale_weekdays), - shortWeekdayRe = formatRe(locale_shortWeekdays), - shortWeekdayLookup = formatLookup(locale_shortWeekdays), - monthRe = formatRe(locale_months), - monthLookup = formatLookup(locale_months), - shortMonthRe = formatRe(locale_shortMonths), - shortMonthLookup = formatLookup(locale_shortMonths); + for (i = 0; i < n; ++i) { + d = nodes[i], node = nodes[i] = new Node(d); + if ((nodeId = id(d, i, data)) != null && (nodeId += "")) { + nodeKey = node.id = nodeId; + nodeByKey.set(nodeKey, nodeByKey.has(nodeKey) ? ambiguous : node); + } + if ((nodeId = parentId(d, i, data)) != null && (nodeId += "")) { + node.parent = nodeId; + } + } - var formats = { - "a": formatShortWeekday, - "A": formatWeekday, - "b": formatShortMonth, - "B": formatMonth, - "c": null, - "d": formatDayOfMonth, - "e": formatDayOfMonth, - "f": formatMicroseconds, - "g": formatYearISO, - "G": formatFullYearISO, - "H": formatHour24, - "I": formatHour12, - "j": formatDayOfYear, - "L": formatMilliseconds, - "m": formatMonthNumber, - "M": formatMinutes, - "p": formatPeriod, - "q": formatQuarter, - "Q": formatUnixTimestamp, - "s": formatUnixTimestampSeconds, - "S": formatSeconds, - "u": formatWeekdayNumberMonday, - "U": formatWeekNumberSunday, - "V": formatWeekNumberISO, - "w": formatWeekdayNumberSunday, - "W": formatWeekNumberMonday, - "x": null, - "X": null, - "y": formatYear, - "Y": formatFullYear, - "Z": formatZone, - "%": formatLiteralPercent - }; + for (i = 0; i < n; ++i) { + node = nodes[i]; + if (nodeId = node.parent) { + parent = nodeByKey.get(nodeId); + if (!parent) throw new Error("missing: " + nodeId); + if (parent === ambiguous) throw new Error("ambiguous: " + nodeId); + if (parent.children) parent.children.push(node); + else parent.children = [node]; + node.parent = parent; + } else { + if (root) throw new Error("multiple roots"); + root = node; + } + } - var utcFormats = { - "a": formatUTCShortWeekday, - "A": formatUTCWeekday, - "b": formatUTCShortMonth, - "B": formatUTCMonth, - "c": null, - "d": formatUTCDayOfMonth, - "e": formatUTCDayOfMonth, - "f": formatUTCMicroseconds, - "g": formatUTCYearISO, - "G": formatUTCFullYearISO, - "H": formatUTCHour24, - "I": formatUTCHour12, - "j": formatUTCDayOfYear, - "L": formatUTCMilliseconds, - "m": formatUTCMonthNumber, - "M": formatUTCMinutes, - "p": formatUTCPeriod, - "q": formatUTCQuarter, - "Q": formatUnixTimestamp, - "s": formatUnixTimestampSeconds, - "S": formatUTCSeconds, - "u": formatUTCWeekdayNumberMonday, - "U": formatUTCWeekNumberSunday, - "V": formatUTCWeekNumberISO, - "w": formatUTCWeekdayNumberSunday, - "W": formatUTCWeekNumberMonday, - "x": null, - "X": null, - "y": formatUTCYear, - "Y": formatUTCFullYear, - "Z": formatUTCZone, - "%": formatLiteralPercent + if (!root) throw new Error("no root"); + root.parent = preroot; + root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight); + root.parent = null; + if (n > 0) throw new Error("cycle"); + + return root; + } + + stratify.id = function(x) { + return arguments.length ? (id = required(x), stratify) : id; }; - var parses = { - "a": parseShortWeekday, - "A": parseWeekday, - "b": parseShortMonth, - "B": parseMonth, - "c": parseLocaleDateTime, - "d": parseDayOfMonth, - "e": parseDayOfMonth, - "f": parseMicroseconds, - "g": parseYear, - "G": parseFullYear, - "H": parseHour24, - "I": parseHour24, - "j": parseDayOfYear, - "L": parseMilliseconds, - "m": parseMonthNumber, - "M": parseMinutes, - "p": parsePeriod, - "q": parseQuarter, - "Q": parseUnixTimestamp, - "s": parseUnixTimestampSeconds, - "S": parseSeconds, - "u": parseWeekdayNumberMonday, - "U": parseWeekNumberSunday, - "V": parseWeekNumberISO, - "w": parseWeekdayNumberSunday, - "W": parseWeekNumberMonday, - "x": parseLocaleDate, - "X": parseLocaleTime, - "y": parseYear, - "Y": parseFullYear, - "Z": parseZone, - "%": parseLiteralPercent + stratify.parentId = function(x) { + return arguments.length ? (parentId = required(x), stratify) : parentId; }; - // These recursive directive definitions must be deferred. - formats.x = newFormat(locale_date, formats); - formats.X = newFormat(locale_time, formats); - formats.c = newFormat(locale_dateTime, formats); - utcFormats.x = newFormat(locale_date, utcFormats); - utcFormats.X = newFormat(locale_time, utcFormats); - utcFormats.c = newFormat(locale_dateTime, utcFormats); + return stratify; +} - function newFormat(specifier, formats) { - return function(date) { - var string = [], - i = -1, - j = 0, - n = specifier.length, - c, - pad, - format; +function defaultSeparation$1(a, b) { + return a.parent === b.parent ? 1 : 2; +} - if (!(date instanceof Date)) date = new Date(+date); +// function radialSeparation(a, b) { +// return (a.parent === b.parent ? 1 : 2) / a.depth; +// } - while (++i < n) { - if (specifier.charCodeAt(i) === 37) { - string.push(specifier.slice(j, i)); - if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); - else pad = c === "e" ? " " : "0"; - if (format = formats[c]) c = format(date, pad); - string.push(c); - j = i + 1; - } - } +// This function is used to traverse the left contour of a subtree (or +// subforest). It returns the successor of v on this contour. This successor is +// either given by the leftmost child of v or by the thread of v. The function +// returns null if and only if v is on the highest level of its subtree. +function nextLeft(v) { + var children = v.children; + return children ? children[0] : v.t; +} - string.push(specifier.slice(j, i)); - return string.join(""); - }; - } +// This function works analogously to nextLeft. +function nextRight(v) { + var children = v.children; + return children ? children[children.length - 1] : v.t; +} - function newParse(specifier, Z) { - return function(string) { - var d = newDate(1900, undefined, 1), - i = parseSpecifier(d, specifier, string += "", 0), - week, day; - if (i != string.length) return null; +// Shifts the current subtree rooted at w+. This is done by increasing +// prelim(w+) and mod(w+) by shift. +function moveSubtree(wm, wp, shift) { + var change = shift / (wp.i - wm.i); + wp.c -= change; + wp.s += shift; + wm.c += change; + wp.z += shift; + wp.m += shift; +} - // If a UNIX timestamp is specified, return it. - if ("Q" in d) return new Date(d.Q); - if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); +// All other shifts, applied to the smaller subtrees between w- and w+, are +// performed by this function. To prepare the shifts, we have to adjust +// change(w+), shift(w+), and change(w-). +function executeShifts(v) { + var shift = 0, + change = 0, + children = v.children, + i = children.length, + w; + while (--i >= 0) { + w = children[i]; + w.z += shift; + w.m += shift; + shift += w.s + (change += w.c); + } +} - // If this is utcParse, never use the local timezone. - if (Z && !("Z" in d)) d.Z = 0; +// If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise, +// returns the specified (default) ancestor. +function nextAncestor(vim, v, ancestor) { + return vim.a.parent === v.parent ? vim.a : ancestor; +} - // The am-pm flag is 0 for AM, and 1 for PM. - if ("p" in d) d.H = d.H % 12 + d.p * 12; +function TreeNode(node, i) { + this._ = node; + this.parent = null; + this.children = null; + this.A = null; // default ancestor + this.a = this; // ancestor + this.z = 0; // prelim + this.m = 0; // mod + this.c = 0; // change + this.s = 0; // shift + this.t = null; // thread + this.i = i; // number +} - // If the month was not specified, inherit from the quarter. - if (d.m === undefined) d.m = "q" in d ? d.q : 0; +TreeNode.prototype = Object.create(Node.prototype); - // Convert day-of-week and week-of-year to day-of-year. - if ("V" in d) { - if (d.V < 1 || d.V > 53) return null; - if (!("w" in d)) d.w = 1; - if ("Z" in d) { - week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); - week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week); - week = d3Time.utcDay.offset(week, (d.V - 1) * 7); - d.y = week.getUTCFullYear(); - d.m = week.getUTCMonth(); - d.d = week.getUTCDate() + (d.w + 6) % 7; - } else { - week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); - week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week); - week = d3Time.timeDay.offset(week, (d.V - 1) * 7); - d.y = week.getFullYear(); - d.m = week.getMonth(); - d.d = week.getDate() + (d.w + 6) % 7; - } - } else if ("W" in d || "U" in d) { - if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; - day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); - d.m = 0; - d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; - } +function treeRoot(root) { + var tree = new TreeNode(root, 0), + node, + nodes = [tree], + child, + children, + i, + n; - // If a time zone is specified, all fields are interpreted as UTC and then - // offset according to the specified time zone. - if ("Z" in d) { - d.H += d.Z / 100 | 0; - d.M += d.Z % 100; - return utcDate(d); + while (node = nodes.pop()) { + if (children = node._.children) { + node.children = new Array(n = children.length); + for (i = n - 1; i >= 0; --i) { + nodes.push(child = node.children[i] = new TreeNode(children[i], i)); + child.parent = node; } - - // Otherwise, all fields are in local time. - return localDate(d); - }; + } } - function parseSpecifier(d, specifier, string, j) { - var i = 0, - n = specifier.length, - m = string.length, - c, - parse; + (tree.parent = new TreeNode(null, 0)).children = [tree]; + return tree; +} - while (i < n) { - if (j >= m) return -1; - c = specifier.charCodeAt(i++); - if (c === 37) { - c = specifier.charAt(i++); - parse = parses[c in pads ? specifier.charAt(i++) : c]; - if (!parse || ((j = parse(d, string, j)) < 0)) return -1; - } else if (c != string.charCodeAt(j++)) { - return -1; - } +// Node-link tree diagram using the Reingold-Tilford "tidy" algorithm +function tree() { + var separation = defaultSeparation$1, + dx = 1, + dy = 1, + nodeSize = null; + + function tree(root) { + var t = treeRoot(root); + + // Compute the layout using Buchheim et al.’s algorithm. + t.eachAfter(firstWalk), t.parent.m = -t.z; + t.eachBefore(secondWalk); + + // If a fixed node size is specified, scale x and y. + if (nodeSize) root.eachBefore(sizeNode); + + // If a fixed tree size is specified, scale x and y based on the extent. + // Compute the left-most, right-most, and depth-most nodes for extents. + else { + var left = root, + right = root, + bottom = root; + root.eachBefore(function(node) { + if (node.x < left.x) left = node; + if (node.x > right.x) right = node; + if (node.depth > bottom.depth) bottom = node; + }); + var s = left === right ? 1 : separation(left, right) / 2, + tx = s - left.x, + kx = dx / (right.x + s + tx), + ky = dy / (bottom.depth || 1); + root.eachBefore(function(node) { + node.x = (node.x + tx) * kx; + node.y = node.depth * ky; + }); } - return j; - } - - function parsePeriod(d, string, i) { - var n = periodRe.exec(string.slice(i)); - return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + return root; } - function parseShortWeekday(d, string, i) { - var n = shortWeekdayRe.exec(string.slice(i)); - return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is + // applied recursively to the children of v, as well as the function + // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the + // node v is placed to the midpoint of its outermost children. + function firstWalk(v) { + var children = v.children, + siblings = v.parent.children, + w = v.i ? siblings[v.i - 1] : null; + if (children) { + executeShifts(v); + var midpoint = (children[0].z + children[children.length - 1].z) / 2; + if (w) { + v.z = w.z + separation(v._, w._); + v.m = v.z - midpoint; + } else { + v.z = midpoint; + } + } else if (w) { + v.z = w.z + separation(v._, w._); + } + v.parent.A = apportion(v, w, v.parent.A || siblings[0]); } - function parseWeekday(d, string, i) { - var n = weekdayRe.exec(string.slice(i)); - return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + // Computes all real x-coordinates by summing up the modifiers recursively. + function secondWalk(v) { + v._.x = v.z + v.parent.m; + v.m += v.parent.m; } - function parseShortMonth(d, string, i) { - var n = shortMonthRe.exec(string.slice(i)); - return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + // The core of the algorithm. Here, a new subtree is combined with the + // previous subtrees. Threads are used to traverse the inside and outside + // contours of the left and right subtree up to the highest common level. The + // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the + // superscript o means outside and i means inside, the subscript - means left + // subtree and + means right subtree. For summing up the modifiers along the + // contour, we use respective variables si+, si-, so-, and so+. Whenever two + // nodes of the inside contours conflict, we compute the left one of the + // greatest uncommon ancestors using the function ANCESTOR and call MOVE + // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees. + // Finally, we add a new thread (if necessary). + function apportion(v, w, ancestor) { + if (w) { + var vip = v, + vop = v, + vim = w, + vom = vip.parent.children[0], + sip = vip.m, + sop = vop.m, + sim = vim.m, + som = vom.m, + shift; + while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) { + vom = nextLeft(vom); + vop = nextRight(vop); + vop.a = v; + shift = vim.z + sim - vip.z - sip + separation(vim._, vip._); + if (shift > 0) { + moveSubtree(nextAncestor(vim, v, ancestor), v, shift); + sip += shift; + sop += shift; + } + sim += vim.m; + sip += vip.m; + som += vom.m; + sop += vop.m; + } + if (vim && !nextRight(vop)) { + vop.t = vim; + vop.m += sim - sop; + } + if (vip && !nextLeft(vom)) { + vom.t = vip; + vom.m += sip - som; + ancestor = v; + } + } + return ancestor; } - function parseMonth(d, string, i) { - var n = monthRe.exec(string.slice(i)); - return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + function sizeNode(node) { + node.x *= dx; + node.y = node.depth * dy; } - function parseLocaleDateTime(d, string, i) { - return parseSpecifier(d, locale_dateTime, string, i); - } + tree.separation = function(x) { + return arguments.length ? (separation = x, tree) : separation; + }; - function parseLocaleDate(d, string, i) { - return parseSpecifier(d, locale_date, string, i); - } + tree.size = function(x) { + return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]); + }; - function parseLocaleTime(d, string, i) { - return parseSpecifier(d, locale_time, string, i); - } + tree.nodeSize = function(x) { + return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null); + }; - function formatShortWeekday(d) { - return locale_shortWeekdays[d.getDay()]; - } + return tree; +} - function formatWeekday(d) { - return locale_weekdays[d.getDay()]; - } +function treemapSlice(parent, x0, y0, x1, y1) { + var nodes = parent.children, + node, + i = -1, + n = nodes.length, + k = parent.value && (y1 - y0) / parent.value; - function formatShortMonth(d) { - return locale_shortMonths[d.getMonth()]; + while (++i < n) { + node = nodes[i], node.x0 = x0, node.x1 = x1; + node.y0 = y0, node.y1 = y0 += node.value * k; } +} - function formatMonth(d) { - return locale_months[d.getMonth()]; - } +var phi = (1 + Math.sqrt(5)) / 2; - function formatPeriod(d) { - return locale_periods[+(d.getHours() >= 12)]; - } +function squarifyRatio(ratio, parent, x0, y0, x1, y1) { + var rows = [], + nodes = parent.children, + row, + nodeValue, + i0 = 0, + i1 = 0, + n = nodes.length, + dx, dy, + value = parent.value, + sumValue, + minValue, + maxValue, + newRatio, + minRatio, + alpha, + beta; - function formatQuarter(d) { - return 1 + ~~(d.getMonth() / 3); - } + while (i0 < n) { + dx = x1 - x0, dy = y1 - y0; - function formatUTCShortWeekday(d) { - return locale_shortWeekdays[d.getUTCDay()]; - } + // Find the next non-empty node. + do sumValue = nodes[i1++].value; while (!sumValue && i1 < n); + minValue = maxValue = sumValue; + alpha = Math.max(dy / dx, dx / dy) / (value * ratio); + beta = sumValue * sumValue * alpha; + minRatio = Math.max(maxValue / beta, beta / minValue); - function formatUTCWeekday(d) { - return locale_weekdays[d.getUTCDay()]; - } + // Keep adding nodes while the aspect ratio maintains or improves. + for (; i1 < n; ++i1) { + sumValue += nodeValue = nodes[i1].value; + if (nodeValue < minValue) minValue = nodeValue; + if (nodeValue > maxValue) maxValue = nodeValue; + beta = sumValue * sumValue * alpha; + newRatio = Math.max(maxValue / beta, beta / minValue); + if (newRatio > minRatio) { sumValue -= nodeValue; break; } + minRatio = newRatio; + } - function formatUTCShortMonth(d) { - return locale_shortMonths[d.getUTCMonth()]; + // Position and record the row orientation. + rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)}); + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1); + value -= sumValue, i0 = i1; } - function formatUTCMonth(d) { - return locale_months[d.getUTCMonth()]; - } + return rows; +} - function formatUTCPeriod(d) { - return locale_periods[+(d.getUTCHours() >= 12)]; - } +var squarify = (function custom(ratio) { - function formatUTCQuarter(d) { - return 1 + ~~(d.getUTCMonth() / 3); + function squarify(parent, x0, y0, x1, y1) { + squarifyRatio(ratio, parent, x0, y0, x1, y1); } - return { - format: function(specifier) { - var f = newFormat(specifier += "", formats); - f.toString = function() { return specifier; }; - return f; - }, - parse: function(specifier) { - var p = newParse(specifier += "", false); - p.toString = function() { return specifier; }; - return p; - }, - utcFormat: function(specifier) { - var f = newFormat(specifier += "", utcFormats); - f.toString = function() { return specifier; }; - return f; - }, - utcParse: function(specifier) { - var p = newParse(specifier += "", true); - p.toString = function() { return specifier; }; - return p; - } + squarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); }; -} -var pads = {"-": "", "_": " ", "0": "0"}, - numberRe = /^\s*\d+/, // note: ignores next directive - percentRe = /^%/, - requoteRe = /[\\^$*+?|[\]().{}]/g; + return squarify; +})(phi); + +function index$1() { + var tile = squarify, + round = false, + dx = 1, + dy = 1, + paddingStack = [0], + paddingInner = constantZero, + paddingTop = constantZero, + paddingRight = constantZero, + paddingBottom = constantZero, + paddingLeft = constantZero; + + function treemap(root) { + root.x0 = + root.y0 = 0; + root.x1 = dx; + root.y1 = dy; + root.eachBefore(positionNode); + paddingStack = [0]; + if (round) root.eachBefore(roundNode); + return root; + } -function pad(value, fill, width) { - var sign = value < 0 ? "-" : "", - string = (sign ? -value : value) + "", - length = string.length; - return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); -} + function positionNode(node) { + var p = paddingStack[node.depth], + x0 = node.x0 + p, + y0 = node.y0 + p, + x1 = node.x1 - p, + y1 = node.y1 - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + node.x0 = x0; + node.y0 = y0; + node.x1 = x1; + node.y1 = y1; + if (node.children) { + p = paddingStack[node.depth + 1] = paddingInner(node) / 2; + x0 += paddingLeft(node) - p; + y0 += paddingTop(node) - p; + x1 -= paddingRight(node) - p; + y1 -= paddingBottom(node) - p; + if (x1 < x0) x0 = x1 = (x0 + x1) / 2; + if (y1 < y0) y0 = y1 = (y0 + y1) / 2; + tile(node, x0, y0, x1, y1); + } + } -function requote(s) { - return s.replace(requoteRe, "\\$&"); -} + treemap.round = function(x) { + return arguments.length ? (round = !!x, treemap) : round; + }; -function formatRe(names) { - return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); -} + treemap.size = function(x) { + return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy]; + }; -function formatLookup(names) { - return new Map(names.map((name, i) => [name.toLowerCase(), i])); -} + treemap.tile = function(x) { + return arguments.length ? (tile = required(x), treemap) : tile; + }; -function parseWeekdayNumberSunday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 1)); - return n ? (d.w = +n[0], i + n[0].length) : -1; -} + treemap.padding = function(x) { + return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner(); + }; -function parseWeekdayNumberMonday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 1)); - return n ? (d.u = +n[0], i + n[0].length) : -1; -} + treemap.paddingInner = function(x) { + return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner; + }; -function parseWeekNumberSunday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.U = +n[0], i + n[0].length) : -1; -} + treemap.paddingOuter = function(x) { + return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop(); + }; -function parseWeekNumberISO(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.V = +n[0], i + n[0].length) : -1; -} + treemap.paddingTop = function(x) { + return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop; + }; -function parseWeekNumberMonday(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.W = +n[0], i + n[0].length) : -1; -} + treemap.paddingRight = function(x) { + return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight; + }; -function parseFullYear(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 4)); - return n ? (d.y = +n[0], i + n[0].length) : -1; -} + treemap.paddingBottom = function(x) { + return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom; + }; -function parseYear(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; -} + treemap.paddingLeft = function(x) { + return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft; + }; -function parseZone(d, string, i) { - var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); - return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; + return treemap; } -function parseQuarter(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 1)); - return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; -} +function binary(parent, x0, y0, x1, y1) { + var nodes = parent.children, + i, n = nodes.length, + sum, sums = new Array(n + 1); -function parseMonthNumber(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.m = n[0] - 1, i + n[0].length) : -1; -} + for (sums[0] = sum = i = 0; i < n; ++i) { + sums[i + 1] = sum += nodes[i].value; + } -function parseDayOfMonth(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.d = +n[0], i + n[0].length) : -1; -} + partition(0, n, parent.value, x0, y0, x1, y1); -function parseDayOfYear(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 3)); - return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; -} + function partition(i, j, value, x0, y0, x1, y1) { + if (i >= j - 1) { + var node = nodes[i]; + node.x0 = x0, node.y0 = y0; + node.x1 = x1, node.y1 = y1; + return; + } -function parseHour24(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.H = +n[0], i + n[0].length) : -1; -} + var valueOffset = sums[i], + valueTarget = (value / 2) + valueOffset, + k = i + 1, + hi = j - 1; -function parseMinutes(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.M = +n[0], i + n[0].length) : -1; -} + while (k < hi) { + var mid = k + hi >>> 1; + if (sums[mid] < valueTarget) k = mid + 1; + else hi = mid; + } -function parseSeconds(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 2)); - return n ? (d.S = +n[0], i + n[0].length) : -1; -} + if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k; -function parseMilliseconds(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 3)); - return n ? (d.L = +n[0], i + n[0].length) : -1; -} + var valueLeft = sums[k] - valueOffset, + valueRight = value - valueLeft; -function parseMicroseconds(d, string, i) { - var n = numberRe.exec(string.slice(i, i + 6)); - return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; + if ((x1 - x0) > (y1 - y0)) { + var xk = value ? (x0 * valueRight + x1 * valueLeft) / value : x1; + partition(i, k, valueLeft, x0, y0, xk, y1); + partition(k, j, valueRight, xk, y0, x1, y1); + } else { + var yk = value ? (y0 * valueRight + y1 * valueLeft) / value : y1; + partition(i, k, valueLeft, x0, y0, x1, yk); + partition(k, j, valueRight, x0, yk, x1, y1); + } + } } -function parseLiteralPercent(d, string, i) { - var n = percentRe.exec(string.slice(i, i + 1)); - return n ? i + n[0].length : -1; +function sliceDice(parent, x0, y0, x1, y1) { + (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1); } -function parseUnixTimestamp(d, string, i) { - var n = numberRe.exec(string.slice(i)); - return n ? (d.Q = +n[0], i + n[0].length) : -1; -} +var resquarify = (function custom(ratio) { -function parseUnixTimestampSeconds(d, string, i) { - var n = numberRe.exec(string.slice(i)); - return n ? (d.s = +n[0], i + n[0].length) : -1; -} + function resquarify(parent, x0, y0, x1, y1) { + if ((rows = parent._squarify) && (rows.ratio === ratio)) { + var rows, + row, + nodes, + i, + j = -1, + n, + m = rows.length, + value = parent.value; -function formatDayOfMonth(d, p) { - return pad(d.getDate(), p, 2); -} + while (++j < m) { + row = rows[j], nodes = row.children; + for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value; + if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += (y1 - y0) * row.value / value : y1); + else treemapSlice(row, x0, y0, value ? x0 += (x1 - x0) * row.value / value : x1, y1); + value -= row.value; + } + } else { + parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1); + rows.ratio = ratio; + } + } -function formatHour24(d, p) { - return pad(d.getHours(), p, 2); -} + resquarify.ratio = function(x) { + return custom((x = +x) > 1 ? x : 1); + }; -function formatHour12(d, p) { - return pad(d.getHours() % 12 || 12, p, 2); -} + return resquarify; +})(phi); -function formatDayOfYear(d, p) { - return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); -} +exports.cluster = cluster; +exports.hierarchy = hierarchy; +exports.pack = index; +exports.packEnclose = enclose; +exports.packSiblings = siblings; +exports.partition = partition; +exports.stratify = stratify; +exports.tree = tree; +exports.treemap = index$1; +exports.treemapBinary = binary; +exports.treemapDice = treemapDice; +exports.treemapResquarify = resquarify; +exports.treemapSlice = treemapSlice; +exports.treemapSliceDice = sliceDice; +exports.treemapSquarify = squarify; -function formatMilliseconds(d, p) { - return pad(d.getMilliseconds(), p, 3); -} +Object.defineProperty(exports, '__esModule', { value: true }); -function formatMicroseconds(d, p) { - return formatMilliseconds(d, p) + "000"; -} +})); +}); -function formatMonthNumber(d, p) { - return pad(d.getMonth() + 1, p, 2); -} +var d3Polygon = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-polygon/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, function (exports) { +function area(polygon) { + var i = -1, + n = polygon.length, + a, + b = polygon[n - 1], + area = 0; -function formatMinutes(d, p) { - return pad(d.getMinutes(), p, 2); -} + while (++i < n) { + a = b; + b = polygon[i]; + area += a[1] * b[0] - a[0] * b[1]; + } -function formatSeconds(d, p) { - return pad(d.getSeconds(), p, 2); + return area / 2; } -function formatWeekdayNumberMonday(d) { - var day = d.getDay(); - return day === 0 ? 7 : day; -} +function centroid(polygon) { + var i = -1, + n = polygon.length, + x = 0, + y = 0, + a, + b = polygon[n - 1], + c, + k = 0; -function formatWeekNumberSunday(d, p) { - return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2); -} + while (++i < n) { + a = b; + b = polygon[i]; + k += c = a[0] * b[1] - b[0] * a[1]; + x += (a[0] + b[0]) * c; + y += (a[1] + b[1]) * c; + } -function dISO(d) { - var day = d.getDay(); - return (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); + return k *= 3, [x / k, y / k]; } -function formatWeekNumberISO(d, p) { - d = dISO(d); - return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2); +// Returns the 2D cross product of AB and AC vectors, i.e., the z-component of +// the 3D cross product in a quadrant I Cartesian coordinate system (+x is +// right, +y is up). Returns a positive value if ABC is counter-clockwise, +// negative if clockwise, and zero if the points are collinear. +function cross(a, b, c) { + return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]); } -function formatWeekdayNumberSunday(d) { - return d.getDay(); +function lexicographicOrder(a, b) { + return a[0] - b[0] || a[1] - b[1]; } -function formatWeekNumberMonday(d, p) { - return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2); -} +// Computes the upper convex hull per the monotone chain algorithm. +// Assumes points.length >= 3, is sorted by x, unique in y. +// Returns an array of indices into points in left-to-right order. +function computeUpperHullIndexes(points) { + const n = points.length, + indexes = [0, 1]; + let size = 2, i; -function formatYear(d, p) { - return pad(d.getFullYear() % 100, p, 2); -} + for (i = 2; i < n; ++i) { + while (size > 1 && cross(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size; + indexes[size++] = i; + } -function formatYearISO(d, p) { - d = dISO(d); - return pad(d.getFullYear() % 100, p, 2); + return indexes.slice(0, size); // remove popped points } -function formatFullYear(d, p) { - return pad(d.getFullYear() % 10000, p, 4); -} +function hull(points) { + if ((n = points.length) < 3) return null; -function formatFullYearISO(d, p) { - var day = d.getDay(); - d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); - return pad(d.getFullYear() % 10000, p, 4); -} + var i, + n, + sortedPoints = new Array(n), + flippedPoints = new Array(n); -function formatZone(d) { - var z = d.getTimezoneOffset(); - return (z > 0 ? "-" : (z *= -1, "+")) - + pad(z / 60 | 0, "0", 2) - + pad(z % 60, "0", 2); -} + for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i]; + sortedPoints.sort(lexicographicOrder); + for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]]; -function formatUTCDayOfMonth(d, p) { - return pad(d.getUTCDate(), p, 2); -} + var upperIndexes = computeUpperHullIndexes(sortedPoints), + lowerIndexes = computeUpperHullIndexes(flippedPoints); -function formatUTCHour24(d, p) { - return pad(d.getUTCHours(), p, 2); -} + // Construct the hull polygon, removing possible duplicate endpoints. + var skipLeft = lowerIndexes[0] === upperIndexes[0], + skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1], + hull = []; -function formatUTCHour12(d, p) { - return pad(d.getUTCHours() % 12 || 12, p, 2); -} + // Add upper hull in right-to-l order. + // Then add lower hull in left-to-right order. + for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]); + for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]); -function formatUTCDayOfYear(d, p) { - return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); + return hull; } -function formatUTCMilliseconds(d, p) { - return pad(d.getUTCMilliseconds(), p, 3); -} +function contains(polygon, point) { + var n = polygon.length, + p = polygon[n - 1], + x = point[0], y = point[1], + x0 = p[0], y0 = p[1], + x1, y1, + inside = false; -function formatUTCMicroseconds(d, p) { - return formatUTCMilliseconds(d, p) + "000"; -} + for (var i = 0; i < n; ++i) { + p = polygon[i], x1 = p[0], y1 = p[1]; + if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside; + x0 = x1, y0 = y1; + } -function formatUTCMonthNumber(d, p) { - return pad(d.getUTCMonth() + 1, p, 2); + return inside; } -function formatUTCMinutes(d, p) { - return pad(d.getUTCMinutes(), p, 2); -} +function length(polygon) { + var i = -1, + n = polygon.length, + b = polygon[n - 1], + xa, + ya, + xb = b[0], + yb = b[1], + perimeter = 0; -function formatUTCSeconds(d, p) { - return pad(d.getUTCSeconds(), p, 2); -} + while (++i < n) { + xa = xb; + ya = yb; + b = polygon[i]; + xb = b[0]; + yb = b[1]; + xa -= xb; + ya -= yb; + perimeter += Math.hypot(xa, ya); + } -function formatUTCWeekdayNumberMonday(d) { - var dow = d.getUTCDay(); - return dow === 0 ? 7 : dow; + return perimeter; } -function formatUTCWeekNumberSunday(d, p) { - return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2); -} +exports.polygonArea = area; +exports.polygonCentroid = centroid; +exports.polygonContains = contains; +exports.polygonHull = hull; +exports.polygonLength = length; -function UTCdISO(d) { - var day = d.getUTCDay(); - return (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); -} +Object.defineProperty(exports, '__esModule', { value: true }); -function formatUTCWeekNumberISO(d, p) { - d = UTCdISO(d); - return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2); -} +})); +}); -function formatUTCWeekdayNumberSunday(d) { - return d.getUTCDay(); -} +var d3Random = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-random/ v2.2.2 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports) ; +}(commonjsGlobal, (function (exports) { +var defaultSource = Math.random; -function formatUTCWeekNumberMonday(d, p) { - return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2); -} +var uniform = (function sourceRandomUniform(source) { + function randomUniform(min, max) { + min = min == null ? 0 : +min; + max = max == null ? 1 : +max; + if (arguments.length === 1) max = min, min = 0; + else max -= min; + return function() { + return source() * max + min; + }; + } -function formatUTCYear(d, p) { - return pad(d.getUTCFullYear() % 100, p, 2); -} + randomUniform.source = sourceRandomUniform; -function formatUTCYearISO(d, p) { - d = UTCdISO(d); - return pad(d.getUTCFullYear() % 100, p, 2); -} + return randomUniform; +})(defaultSource); -function formatUTCFullYear(d, p) { - return pad(d.getUTCFullYear() % 10000, p, 4); -} +var int = (function sourceRandomInt(source) { + function randomInt(min, max) { + if (arguments.length < 2) max = min, min = 0; + min = Math.floor(min); + max = Math.floor(max) - min; + return function() { + return Math.floor(source() * max + min); + }; + } -function formatUTCFullYearISO(d, p) { - var day = d.getUTCDay(); - d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); - return pad(d.getUTCFullYear() % 10000, p, 4); -} + randomInt.source = sourceRandomInt; -function formatUTCZone() { - return "+0000"; -} + return randomInt; +})(defaultSource); -function formatLiteralPercent() { - return "%"; -} +var normal = (function sourceRandomNormal(source) { + function randomNormal(mu, sigma) { + var x, r; + mu = mu == null ? 0 : +mu; + sigma = sigma == null ? 1 : +sigma; + return function() { + var y; -function formatUnixTimestamp(d) { - return +d; -} + // If available, use the second previously-generated uniform random. + if (x != null) y = x, x = null; -function formatUnixTimestampSeconds(d) { - return Math.floor(+d / 1000); -} + // Otherwise, generate a new x and y. + else do { + x = source() * 2 - 1; + y = source() * 2 - 1; + r = x * x + y * y; + } while (!r || r > 1); -var locale; + return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r); + }; + } -defaultLocale({ - dateTime: "%x, %X", - date: "%-m/%-d/%Y", - time: "%-I:%M:%S %p", - periods: ["AM", "PM"], - days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] -}); + randomNormal.source = sourceRandomNormal; -function defaultLocale(definition) { - locale = formatLocale(definition); - exports.timeFormat = locale.format; - exports.timeParse = locale.parse; - exports.utcFormat = locale.utcFormat; - exports.utcParse = locale.utcParse; - return locale; -} + return randomNormal; +})(defaultSource); -var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; +var logNormal = (function sourceRandomLogNormal(source) { + var N = normal.source(source); -function formatIsoNative(date) { - return date.toISOString(); -} + function randomLogNormal() { + var randomNormal = N.apply(this, arguments); + return function() { + return Math.exp(randomNormal()); + }; + } -var formatIso = Date.prototype.toISOString - ? formatIsoNative - : exports.utcFormat(isoSpecifier); + randomLogNormal.source = sourceRandomLogNormal; -function parseIsoNative(string) { - var date = new Date(string); - return isNaN(date) ? null : date; -} + return randomLogNormal; +})(defaultSource); -var parseIso = +new Date("2000-01-01T00:00:00.000Z") - ? parseIsoNative - : exports.utcParse(isoSpecifier); +var irwinHall = (function sourceRandomIrwinHall(source) { + function randomIrwinHall(n) { + if ((n = +n) <= 0) return () => 0; + return function() { + for (var sum = 0, i = n; i > 1; --i) sum += source(); + return sum + i * source(); + }; + } -exports.isoFormat = formatIso; -exports.isoParse = parseIso; -exports.timeFormatDefaultLocale = defaultLocale; -exports.timeFormatLocale = formatLocale; + randomIrwinHall.source = sourceRandomIrwinHall; -Object.defineProperty(exports, '__esModule', { value: true }); + return randomIrwinHall; +})(defaultSource); -})); -}); +var bates = (function sourceRandomBates(source) { + var I = irwinHall.source(source); -var d3Scale = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-scale/ v3.3.0 Copyright 2021 Mike Bostock -(function (global, factory) { -factory(exports, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) ; -}(commonjsGlobal, (function (exports, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) { -function initRange(domain, range) { - switch (arguments.length) { - case 0: break; - case 1: this.range(domain); break; - default: this.range(range).domain(domain); break; + function randomBates(n) { + // use limiting distribution at n === 0 + if ((n = +n) === 0) return source; + var randomIrwinHall = I(n); + return function() { + return randomIrwinHall() / n; + }; } - return this; -} -function initInterpolator(domain, interpolator) { - switch (arguments.length) { - case 0: break; - case 1: { - if (typeof domain === "function") this.interpolator(domain); - else this.range(domain); - break; - } - default: { - this.domain(domain); - if (typeof interpolator === "function") this.interpolator(interpolator); - else this.range(interpolator); - break; - } + randomBates.source = sourceRandomBates; + + return randomBates; +})(defaultSource); + +var exponential = (function sourceRandomExponential(source) { + function randomExponential(lambda) { + return function() { + return -Math.log1p(-source()) / lambda; + }; } - return this; -} -const implicit = Symbol("implicit"); + randomExponential.source = sourceRandomExponential; -function ordinal() { - var index = new Map(), - domain = [], - range = [], - unknown = implicit; + return randomExponential; +})(defaultSource); - function scale(d) { - var key = d + "", i = index.get(key); - if (!i) { - if (unknown !== implicit) return unknown; - index.set(key, i = domain.push(d)); - } - return range[(i - 1) % range.length]; +var pareto = (function sourceRandomPareto(source) { + function randomPareto(alpha) { + if ((alpha = +alpha) < 0) throw new RangeError("invalid alpha"); + alpha = 1 / -alpha; + return function() { + return Math.pow(1 - source(), alpha); + }; } - scale.domain = function(_) { - if (!arguments.length) return domain.slice(); - domain = [], index = new Map(); - for (const value of _) { - const key = value + ""; - if (index.has(key)) continue; - index.set(key, domain.push(value)); - } - return scale; - }; + randomPareto.source = sourceRandomPareto; - scale.range = function(_) { - return arguments.length ? (range = Array.from(_), scale) : range.slice(); - }; + return randomPareto; +})(defaultSource); - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; +var bernoulli = (function sourceRandomBernoulli(source) { + function randomBernoulli(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + return function() { + return Math.floor(source() + p); + }; + } - scale.copy = function() { - return ordinal(domain, range).unknown(unknown); - }; + randomBernoulli.source = sourceRandomBernoulli; - initRange.apply(scale, arguments); + return randomBernoulli; +})(defaultSource); - return scale; -} +var geometric = (function sourceRandomGeometric(source) { + function randomGeometric(p) { + if ((p = +p) < 0 || p > 1) throw new RangeError("invalid p"); + if (p === 0) return () => Infinity; + if (p === 1) return () => 1; + p = Math.log1p(-p); + return function() { + return 1 + Math.floor(Math.log1p(-source()) / p); + }; + } -function band() { - var scale = ordinal().unknown(undefined), - domain = scale.domain, - ordinalRange = scale.range, - r0 = 0, - r1 = 1, - step, - bandwidth, - round = false, - paddingInner = 0, - paddingOuter = 0, - align = 0.5; + randomGeometric.source = sourceRandomGeometric; - delete scale.unknown; + return randomGeometric; +})(defaultSource); - function rescale() { - var n = domain().length, - reverse = r1 < r0, - start = reverse ? r1 : r0, - stop = reverse ? r0 : r1; - step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); - if (round) step = Math.floor(step); - start += (stop - start - step * (n - paddingInner)) * align; - bandwidth = step * (1 - paddingInner); - if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); - var values = d3Array.range(n).map(function(i) { return start + step * i; }); - return ordinalRange(reverse ? values.reverse() : values); - } +var gamma = (function sourceRandomGamma(source) { + var randomNormal = normal.source(source)(); - scale.domain = function(_) { - return arguments.length ? (domain(_), rescale()) : domain(); - }; + function randomGamma(k, theta) { + if ((k = +k) < 0) throw new RangeError("invalid k"); + // degenerate distribution if k === 0 + if (k === 0) return () => 0; + theta = theta == null ? 1 : +theta; + // exponential distribution if k === 1 + if (k === 1) return () => -Math.log1p(-source()) * theta; + + var d = (k < 1 ? k + 1 : k) - 1 / 3, + c = 1 / (3 * Math.sqrt(d)), + multiplier = k < 1 ? () => Math.pow(source(), 1 / k) : () => 1; + return function() { + do { + do { + var x = randomNormal(), + v = 1 + c * x; + } while (v <= 0); + v *= v * v; + var u = 1 - source(); + } while (u >= 1 - 0.0331 * x * x * x * x && Math.log(u) >= 0.5 * x * x + d * (1 - v + Math.log(v))); + return d * v * multiplier() * theta; + }; + } - scale.range = function(_) { - return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; - }; + randomGamma.source = sourceRandomGamma; - scale.rangeRound = function(_) { - return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale(); - }; + return randomGamma; +})(defaultSource); - scale.bandwidth = function() { - return bandwidth; - }; +var beta = (function sourceRandomBeta(source) { + var G = gamma.source(source); - scale.step = function() { - return step; - }; + function randomBeta(alpha, beta) { + var X = G(alpha), + Y = G(beta); + return function() { + var x = X(); + return x === 0 ? 0 : x / (x + Y()); + }; + } - scale.round = function(_) { - return arguments.length ? (round = !!_, rescale()) : round; - }; + randomBeta.source = sourceRandomBeta; - scale.padding = function(_) { - return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; - }; + return randomBeta; +})(defaultSource); - scale.paddingInner = function(_) { - return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; - }; +var binomial = (function sourceRandomBinomial(source) { + var G = geometric.source(source), + B = beta.source(source); - scale.paddingOuter = function(_) { - return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; - }; + function randomBinomial(n, p) { + n = +n; + if ((p = +p) >= 1) return () => n; + if (p <= 0) return () => 0; + return function() { + var acc = 0, nn = n, pp = p; + while (nn * pp > 16 && nn * (1 - pp) > 16) { + var i = Math.floor((nn + 1) * pp), + y = B(i, nn - i + 1)(); + if (y <= pp) { + acc += i; + nn -= i; + pp = (pp - y) / (1 - y); + } else { + nn = i - 1; + pp /= y; + } + } + var sign = pp < 0.5, + pFinal = sign ? pp : 1 - pp, + g = G(pFinal); + for (var s = g(), k = 0; s <= nn; ++k) s += g(); + return acc + (sign ? k : nn - k); + }; + } - scale.align = function(_) { - return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; - }; + randomBinomial.source = sourceRandomBinomial; - scale.copy = function() { - return band(domain(), [r0, r1]) - .round(round) - .paddingInner(paddingInner) - .paddingOuter(paddingOuter) - .align(align); - }; + return randomBinomial; +})(defaultSource); - return initRange.apply(rescale(), arguments); -} +var weibull = (function sourceRandomWeibull(source) { + function randomWeibull(k, a, b) { + var outerFunc; + if ((k = +k) === 0) { + outerFunc = x => -Math.log(x); + } else { + k = 1 / k; + outerFunc = x => Math.pow(x, k); + } + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * outerFunc(-Math.log1p(-source())); + }; + } -function pointish(scale) { - var copy = scale.copy; + randomWeibull.source = sourceRandomWeibull; - scale.padding = scale.paddingOuter; - delete scale.paddingInner; - delete scale.paddingOuter; + return randomWeibull; +})(defaultSource); - scale.copy = function() { - return pointish(copy()); - }; +var cauchy = (function sourceRandomCauchy(source) { + function randomCauchy(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + return a + b * Math.tan(Math.PI * source()); + }; + } - return scale; -} + randomCauchy.source = sourceRandomCauchy; -function point() { - return pointish(band.apply(null, arguments).paddingInner(1)); -} + return randomCauchy; +})(defaultSource); -function constants(x) { - return function() { - return x; - }; -} +var logistic = (function sourceRandomLogistic(source) { + function randomLogistic(a, b) { + a = a == null ? 0 : +a; + b = b == null ? 1 : +b; + return function() { + var u = source(); + return a + b * Math.log(u / (1 - u)); + }; + } -function number$1(x) { - return +x; -} + randomLogistic.source = sourceRandomLogistic; -var unit = [0, 1]; + return randomLogistic; +})(defaultSource); -function identity$1(x) { - return x; -} +var poisson = (function sourceRandomPoisson(source) { + var G = gamma.source(source), + B = binomial.source(source); -function normalize(a, b) { - return (b -= (a = +a)) - ? function(x) { return (x - a) / b; } - : constants(isNaN(b) ? NaN : 0.5); -} + function randomPoisson(lambda) { + return function() { + var acc = 0, l = lambda; + while (l > 16) { + var n = Math.floor(0.875 * l), + t = G(n)(); + if (t > l) return acc + B(n - 1, l / t)(); + acc += n; + l -= t; + } + for (var s = -Math.log1p(-source()), k = 0; s <= l; ++k) s -= Math.log1p(-source()); + return acc + k; + }; + } -function clamper(a, b) { - var t; - if (a > b) t = a, a = b, b = t; - return function(x) { return Math.max(a, Math.min(b, x)); }; -} + randomPoisson.source = sourceRandomPoisson; -// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. -// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. -function bimap(domain, range, interpolate) { - var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; - if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); - else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); - return function(x) { return r0(d0(x)); }; -} + return randomPoisson; +})(defaultSource); -function polymap(domain, range, interpolate) { - var j = Math.min(domain.length, range.length) - 1, - d = new Array(j), - r = new Array(j), - i = -1; +// https://en.wikipedia.org/wiki/Linear_congruential_generator#Parameters_in_common_use +const mul = 0x19660D; +const inc = 0x3C6EF35F; +const eps = 1 / 0x100000000; - // Reverse descending domains. - if (domain[j] < domain[0]) { - domain = domain.slice().reverse(); - range = range.slice().reverse(); - } +function lcg(seed = Math.random()) { + let state = (0 <= seed && seed < 1 ? seed / eps : Math.abs(seed)) | 0; + return () => (state = mul * state + inc | 0, eps * (state >>> 0)); +} - while (++i < j) { - d[i] = normalize(domain[i], domain[i + 1]); - r[i] = interpolate(range[i], range[i + 1]); - } +exports.randomBates = bates; +exports.randomBernoulli = bernoulli; +exports.randomBeta = beta; +exports.randomBinomial = binomial; +exports.randomCauchy = cauchy; +exports.randomExponential = exponential; +exports.randomGamma = gamma; +exports.randomGeometric = geometric; +exports.randomInt = int; +exports.randomIrwinHall = irwinHall; +exports.randomLcg = lcg; +exports.randomLogNormal = logNormal; +exports.randomLogistic = logistic; +exports.randomNormal = normal; +exports.randomPareto = pareto; +exports.randomPoisson = poisson; +exports.randomUniform = uniform; +exports.randomWeibull = weibull; - return function(x) { - var i = d3Array.bisect(domain, x, 1, j) - 1; - return r[i](d[i](x)); - }; -} +Object.defineProperty(exports, '__esModule', { value: true }); -function copy$1(source, target) { - return target - .domain(source.domain()) - .range(source.range()) - .interpolate(source.interpolate()) - .clamp(source.clamp()) - .unknown(source.unknown()); -} +}))); +}); -function transformer$2() { - var domain = unit, - range = unit, - interpolate = d3Interpolate.interpolate, - transform, - untransform, - unknown, - clamp = identity$1, - piecewise, - output, - input; +var d3Time = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-time/ v2.1.1 Copyright 2021 Mike Bostock +(function (global, factory) { +factory(exports, d3Array) ; +}(commonjsGlobal, (function (exports, d3Array) { +var t0 = new Date, + t1 = new Date; - function rescale() { - var n = Math.min(domain.length, range.length); - if (clamp !== identity$1) clamp = clamper(domain[0], domain[n - 1]); - piecewise = n > 2 ? polymap : bimap; - output = input = null; - return scale; - } +function newInterval(floori, offseti, count, field) { - function scale(x) { - return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + function interval(date) { + return floori(date = arguments.length === 0 ? new Date : new Date(+date)), date; } - scale.invert = function(y) { - return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y))); + interval.floor = function(date) { + return floori(date = new Date(+date)), date; }; - scale.domain = function(_) { - return arguments.length ? (domain = Array.from(_, number$1), rescale()) : domain.slice(); + interval.ceil = function(date) { + return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date; }; - scale.range = function(_) { - return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + interval.round = function(date) { + var d0 = interval(date), + d1 = interval.ceil(date); + return date - d0 < d1 - date ? d0 : d1; }; - scale.rangeRound = function(_) { - return range = Array.from(_), interpolate = d3Interpolate.interpolateRound, rescale(); + interval.offset = function(date, step) { + return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date; }; - scale.clamp = function(_) { - return arguments.length ? (clamp = _ ? true : identity$1, rescale()) : clamp !== identity$1; + interval.range = function(start, stop, step) { + var range = [], previous; + start = interval.ceil(start); + step = step == null ? 1 : Math.floor(step); + if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date + do range.push(previous = new Date(+start)), offseti(start, step), floori(start); + while (previous < start && start < stop); + return range; }; - scale.interpolate = function(_) { - return arguments.length ? (interpolate = _, rescale()) : interpolate; + interval.filter = function(test) { + return newInterval(function(date) { + if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1); + }, function(date, step) { + if (date >= date) { + if (step < 0) while (++step <= 0) { + while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty + } else while (--step >= 0) { + while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty + } + } + }); }; - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; + if (count) { + interval.count = function(start, end) { + t0.setTime(+start), t1.setTime(+end); + floori(t0), floori(t1); + return Math.floor(count(t0, t1)); + }; - return function(t, u) { - transform = t, untransform = u; - return rescale(); - }; -} + interval.every = function(step) { + step = Math.floor(step); + return !isFinite(step) || !(step > 0) ? null + : !(step > 1) ? interval + : interval.filter(field + ? function(d) { return field(d) % step === 0; } + : function(d) { return interval.count(0, d) % step === 0; }); + }; + } -function continuous() { - return transformer$2()(identity$1, identity$1); + return interval; } -function tickFormat(start, stop, count, specifier) { - var step = d3Array.tickStep(start, stop, count), - precision; - specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); - switch (specifier.type) { - case "s": { - var value = Math.max(Math.abs(start), Math.abs(stop)); - if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; - return d3Format.formatPrefix(specifier, value); - } - case "": - case "e": - case "g": - case "p": - case "r": { - if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); - break; - } - case "f": - case "%": { - if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; - break; - } - } - return d3Format.format(specifier); -} +var millisecond = newInterval(function() { + // noop +}, function(date, step) { + date.setTime(+date + step); +}, function(start, end) { + return end - start; +}); -function linearish(scale) { - var domain = scale.domain; +// An optimized implementation for this simple case. +millisecond.every = function(k) { + k = Math.floor(k); + if (!isFinite(k) || !(k > 0)) return null; + if (!(k > 1)) return millisecond; + return newInterval(function(date) { + date.setTime(Math.floor(date / k) * k); + }, function(date, step) { + date.setTime(+date + step * k); + }, function(start, end) { + return (end - start) / k; + }); +}; +var milliseconds = millisecond.range; - scale.ticks = function(count) { - var d = domain(); - return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); - }; +const durationSecond = 1000; +const durationMinute = durationSecond * 60; +const durationHour = durationMinute * 60; +const durationDay = durationHour * 24; +const durationWeek = durationDay * 7; +const durationMonth = durationDay * 30; +const durationYear = durationDay * 365; - scale.tickFormat = function(count, specifier) { - var d = domain(); - return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); - }; +var second = newInterval(function(date) { + date.setTime(date - date.getMilliseconds()); +}, function(date, step) { + date.setTime(+date + step * durationSecond); +}, function(start, end) { + return (end - start) / durationSecond; +}, function(date) { + return date.getUTCSeconds(); +}); +var seconds = second.range; - scale.nice = function(count) { - if (count == null) count = 10; +var minute = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getMinutes(); +}); +var minutes = minute.range; - var d = domain(); - var i0 = 0; - var i1 = d.length - 1; - var start = d[i0]; - var stop = d[i1]; - var prestep; - var step; - var maxIter = 10; +var hour = newInterval(function(date) { + date.setTime(date - date.getMilliseconds() - date.getSeconds() * durationSecond - date.getMinutes() * durationMinute); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getHours(); +}); +var hours = hour.range; - if (stop < start) { - step = start, start = stop, stop = step; - step = i0, i0 = i1, i1 = step; - } - - while (maxIter-- > 0) { - step = d3Array.tickIncrement(start, stop, count); - if (step === prestep) { - d[i0] = start; - d[i1] = stop; - return domain(d); - } else if (step > 0) { - start = Math.floor(start / step) * step; - stop = Math.ceil(stop / step) * step; - } else if (step < 0) { - start = Math.ceil(start * step) / step; - stop = Math.floor(stop * step) / step; - } else { - break; - } - prestep = step; - } +var day = newInterval( + date => date.setHours(0, 0, 0, 0), + (date, step) => date.setDate(date.getDate() + step), + (start, end) => (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay, + date => date.getDate() - 1 +); +var days = day.range; + +function weekday(i) { + return newInterval(function(date) { + date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setDate(date.getDate() + step * 7); + }, function(start, end) { + return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek; + }); +} + +var sunday = weekday(0); +var monday = weekday(1); +var tuesday = weekday(2); +var wednesday = weekday(3); +var thursday = weekday(4); +var friday = weekday(5); +var saturday = weekday(6); + +var sundays = sunday.range; +var mondays = monday.range; +var tuesdays = tuesday.range; +var wednesdays = wednesday.range; +var thursdays = thursday.range; +var fridays = friday.range; +var saturdays = saturday.range; + +var month = newInterval(function(date) { + date.setDate(1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setMonth(date.getMonth() + step); +}, function(start, end) { + return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12; +}, function(date) { + return date.getMonth(); +}); +var months = month.range; - return scale; - }; +var year = newInterval(function(date) { + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); +}, function(date, step) { + date.setFullYear(date.getFullYear() + step); +}, function(start, end) { + return end.getFullYear() - start.getFullYear(); +}, function(date) { + return date.getFullYear(); +}); - return scale; -} +// An optimized implementation for this simple case. +year.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setFullYear(Math.floor(date.getFullYear() / k) * k); + date.setMonth(0, 1); + date.setHours(0, 0, 0, 0); + }, function(date, step) { + date.setFullYear(date.getFullYear() + step * k); + }); +}; +var years = year.range; -function linear() { - var scale = continuous(); +var utcMinute = newInterval(function(date) { + date.setUTCSeconds(0, 0); +}, function(date, step) { + date.setTime(+date + step * durationMinute); +}, function(start, end) { + return (end - start) / durationMinute; +}, function(date) { + return date.getUTCMinutes(); +}); +var utcMinutes = utcMinute.range; - scale.copy = function() { - return copy$1(scale, linear()); - }; +var utcHour = newInterval(function(date) { + date.setUTCMinutes(0, 0, 0); +}, function(date, step) { + date.setTime(+date + step * durationHour); +}, function(start, end) { + return (end - start) / durationHour; +}, function(date) { + return date.getUTCHours(); +}); +var utcHours = utcHour.range; - initRange.apply(scale, arguments); +var utcDay = newInterval(function(date) { + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCDate(date.getUTCDate() + step); +}, function(start, end) { + return (end - start) / durationDay; +}, function(date) { + return date.getUTCDate() - 1; +}); +var utcDays = utcDay.range; - return linearish(scale); +function utcWeekday(i) { + return newInterval(function(date) { + date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCDate(date.getUTCDate() + step * 7); + }, function(start, end) { + return (end - start) / durationWeek; + }); } -function identity(domain) { - var unknown; - - function scale(x) { - return x == null || isNaN(x = +x) ? unknown : x; - } - - scale.invert = scale; - - scale.domain = scale.range = function(_) { - return arguments.length ? (domain = Array.from(_, number$1), scale) : domain.slice(); - }; +var utcSunday = utcWeekday(0); +var utcMonday = utcWeekday(1); +var utcTuesday = utcWeekday(2); +var utcWednesday = utcWeekday(3); +var utcThursday = utcWeekday(4); +var utcFriday = utcWeekday(5); +var utcSaturday = utcWeekday(6); - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; +var utcSundays = utcSunday.range; +var utcMondays = utcMonday.range; +var utcTuesdays = utcTuesday.range; +var utcWednesdays = utcWednesday.range; +var utcThursdays = utcThursday.range; +var utcFridays = utcFriday.range; +var utcSaturdays = utcSaturday.range; - scale.copy = function() { - return identity(domain).unknown(unknown); - }; +var utcMonth = newInterval(function(date) { + date.setUTCDate(1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCMonth(date.getUTCMonth() + step); +}, function(start, end) { + return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12; +}, function(date) { + return date.getUTCMonth(); +}); +var utcMonths = utcMonth.range; - domain = arguments.length ? Array.from(domain, number$1) : [0, 1]; +var utcYear = newInterval(function(date) { + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); +}, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step); +}, function(start, end) { + return end.getUTCFullYear() - start.getUTCFullYear(); +}, function(date) { + return date.getUTCFullYear(); +}); - return linearish(scale); -} +// An optimized implementation for this simple case. +utcYear.every = function(k) { + return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) { + date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k); + date.setUTCMonth(0, 1); + date.setUTCHours(0, 0, 0, 0); + }, function(date, step) { + date.setUTCFullYear(date.getUTCFullYear() + step * k); + }); +}; +var utcYears = utcYear.range; -function nice(domain, interval) { - domain = domain.slice(); +function ticker(year, month, week, day, hour, minute) { - var i0 = 0, - i1 = domain.length - 1, - x0 = domain[i0], - x1 = domain[i1], - t; + const tickIntervals = [ + [second, 1, durationSecond], + [second, 5, 5 * durationSecond], + [second, 15, 15 * durationSecond], + [second, 30, 30 * durationSecond], + [minute, 1, durationMinute], + [minute, 5, 5 * durationMinute], + [minute, 15, 15 * durationMinute], + [minute, 30, 30 * durationMinute], + [ hour, 1, durationHour ], + [ hour, 3, 3 * durationHour ], + [ hour, 6, 6 * durationHour ], + [ hour, 12, 12 * durationHour ], + [ day, 1, durationDay ], + [ day, 2, 2 * durationDay ], + [ week, 1, durationWeek ], + [ month, 1, durationMonth ], + [ month, 3, 3 * durationMonth ], + [ year, 1, durationYear ] + ]; - if (x1 < x0) { - t = i0, i0 = i1, i1 = t; - t = x0, x0 = x1, x1 = t; + function ticks(start, stop, count) { + const reverse = stop < start; + if (reverse) [start, stop] = [stop, start]; + const interval = count && typeof count.range === "function" ? count : tickInterval(start, stop, count); + const ticks = interval ? interval.range(start, +stop + 1) : []; // inclusive stop + return reverse ? ticks.reverse() : ticks; } - domain[i0] = interval.floor(x0); - domain[i1] = interval.ceil(x1); - return domain; -} + function tickInterval(start, stop, count) { + const target = Math.abs(stop - start) / count; + const i = d3Array.bisector(([,, step]) => step).right(tickIntervals, target); + if (i === tickIntervals.length) return year.every(d3Array.tickStep(start / durationYear, stop / durationYear, count)); + if (i === 0) return millisecond.every(Math.max(d3Array.tickStep(start, stop, count), 1)); + const [t, step] = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i]; + return t.every(step); + } -function transformLog(x) { - return Math.log(x); + return [ticks, tickInterval]; } -function transformExp(x) { - return Math.exp(x); -} +const [utcTicks, utcTickInterval] = ticker(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute); +const [timeTicks, timeTickInterval] = ticker(year, month, sunday, day, hour, minute); -function transformLogn(x) { - return -Math.log(-x); -} +exports.timeDay = day; +exports.timeDays = days; +exports.timeFriday = friday; +exports.timeFridays = fridays; +exports.timeHour = hour; +exports.timeHours = hours; +exports.timeInterval = newInterval; +exports.timeMillisecond = millisecond; +exports.timeMilliseconds = milliseconds; +exports.timeMinute = minute; +exports.timeMinutes = minutes; +exports.timeMonday = monday; +exports.timeMondays = mondays; +exports.timeMonth = month; +exports.timeMonths = months; +exports.timeSaturday = saturday; +exports.timeSaturdays = saturdays; +exports.timeSecond = second; +exports.timeSeconds = seconds; +exports.timeSunday = sunday; +exports.timeSundays = sundays; +exports.timeThursday = thursday; +exports.timeThursdays = thursdays; +exports.timeTickInterval = timeTickInterval; +exports.timeTicks = timeTicks; +exports.timeTuesday = tuesday; +exports.timeTuesdays = tuesdays; +exports.timeWednesday = wednesday; +exports.timeWednesdays = wednesdays; +exports.timeWeek = sunday; +exports.timeWeeks = sundays; +exports.timeYear = year; +exports.timeYears = years; +exports.utcDay = utcDay; +exports.utcDays = utcDays; +exports.utcFriday = utcFriday; +exports.utcFridays = utcFridays; +exports.utcHour = utcHour; +exports.utcHours = utcHours; +exports.utcMillisecond = millisecond; +exports.utcMilliseconds = milliseconds; +exports.utcMinute = utcMinute; +exports.utcMinutes = utcMinutes; +exports.utcMonday = utcMonday; +exports.utcMondays = utcMondays; +exports.utcMonth = utcMonth; +exports.utcMonths = utcMonths; +exports.utcSaturday = utcSaturday; +exports.utcSaturdays = utcSaturdays; +exports.utcSecond = second; +exports.utcSeconds = seconds; +exports.utcSunday = utcSunday; +exports.utcSundays = utcSundays; +exports.utcThursday = utcThursday; +exports.utcThursdays = utcThursdays; +exports.utcTickInterval = utcTickInterval; +exports.utcTicks = utcTicks; +exports.utcTuesday = utcTuesday; +exports.utcTuesdays = utcTuesdays; +exports.utcWednesday = utcWednesday; +exports.utcWednesdays = utcWednesdays; +exports.utcWeek = utcSunday; +exports.utcWeeks = utcSundays; +exports.utcYear = utcYear; +exports.utcYears = utcYears; -function transformExpn(x) { - return -Math.exp(-x); -} +Object.defineProperty(exports, '__esModule', { value: true }); -function pow10(x) { - return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; -} +}))); +}); -function powp(base) { - return base === 10 ? pow10 - : base === Math.E ? Math.exp - : function(x) { return Math.pow(base, x); }; +var d3TimeFormat = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-time-format/ v3.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Time) ; +}(commonjsGlobal, function (exports, d3Time) { +function localDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L); + date.setFullYear(d.y); + return date; + } + return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L); } -function logp(base) { - return base === Math.E ? Math.log - : base === 10 && Math.log10 - || base === 2 && Math.log2 - || (base = Math.log(base), function(x) { return Math.log(x) / base; }); +function utcDate(d) { + if (0 <= d.y && d.y < 100) { + var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L)); + date.setUTCFullYear(d.y); + return date; + } + return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L)); } -function reflect(f) { - return function(x) { - return -f(-x); - }; +function newDate(y, m, d) { + return {y: y, m: m, d: d, H: 0, M: 0, S: 0, L: 0}; } -function loggish(transform) { - var scale = transform(transformLog, transformExp), - domain = scale.domain, - base = 10, - logs, - pows; - - function rescale() { - logs = logp(base), pows = powp(base); - if (domain()[0] < 0) { - logs = reflect(logs), pows = reflect(pows); - transform(transformLogn, transformExpn); - } else { - transform(transformLog, transformExp); - } - return scale; - } - - scale.base = function(_) { - return arguments.length ? (base = +_, rescale()) : base; - }; - - scale.domain = function(_) { - return arguments.length ? (domain(_), rescale()) : domain(); - }; - - scale.ticks = function(count) { - var d = domain(), - u = d[0], - v = d[d.length - 1], - r; - - if (r = v < u) i = u, u = v, v = i; - - var i = logs(u), - j = logs(v), - p, - k, - t, - n = count == null ? 10 : +count, - z = []; - - if (!(base % 1) && j - i < n) { - i = Math.floor(i), j = Math.ceil(j); - if (u > 0) for (; i <= j; ++i) { - for (k = 1, p = pows(i); k < base; ++k) { - t = p * k; - if (t < u) continue; - if (t > v) break; - z.push(t); - } - } else for (; i <= j; ++i) { - for (k = base - 1, p = pows(i); k >= 1; --k) { - t = p * k; - if (t < u) continue; - if (t > v) break; - z.push(t); - } - } - if (z.length * 2 < n) z = d3Array.ticks(u, v, n); - } else { - z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); - } +function formatLocale(locale) { + var locale_dateTime = locale.dateTime, + locale_date = locale.date, + locale_time = locale.time, + locale_periods = locale.periods, + locale_weekdays = locale.days, + locale_shortWeekdays = locale.shortDays, + locale_months = locale.months, + locale_shortMonths = locale.shortMonths; - return r ? z.reverse() : z; - }; + var periodRe = formatRe(locale_periods), + periodLookup = formatLookup(locale_periods), + weekdayRe = formatRe(locale_weekdays), + weekdayLookup = formatLookup(locale_weekdays), + shortWeekdayRe = formatRe(locale_shortWeekdays), + shortWeekdayLookup = formatLookup(locale_shortWeekdays), + monthRe = formatRe(locale_months), + monthLookup = formatLookup(locale_months), + shortMonthRe = formatRe(locale_shortMonths), + shortMonthLookup = formatLookup(locale_shortMonths); - scale.tickFormat = function(count, specifier) { - if (specifier == null) specifier = base === 10 ? ".0e" : ","; - if (typeof specifier !== "function") specifier = d3Format.format(specifier); - if (count === Infinity) return specifier; - if (count == null) count = 10; - var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? - return function(d) { - var i = d / pows(Math.round(logs(d))); - if (i * base < base - 0.5) i *= base; - return i <= k ? specifier(d) : ""; - }; + var formats = { + "a": formatShortWeekday, + "A": formatWeekday, + "b": formatShortMonth, + "B": formatMonth, + "c": null, + "d": formatDayOfMonth, + "e": formatDayOfMonth, + "f": formatMicroseconds, + "g": formatYearISO, + "G": formatFullYearISO, + "H": formatHour24, + "I": formatHour12, + "j": formatDayOfYear, + "L": formatMilliseconds, + "m": formatMonthNumber, + "M": formatMinutes, + "p": formatPeriod, + "q": formatQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatSeconds, + "u": formatWeekdayNumberMonday, + "U": formatWeekNumberSunday, + "V": formatWeekNumberISO, + "w": formatWeekdayNumberSunday, + "W": formatWeekNumberMonday, + "x": null, + "X": null, + "y": formatYear, + "Y": formatFullYear, + "Z": formatZone, + "%": formatLiteralPercent }; - scale.nice = function() { - return domain(nice(domain(), { - floor: function(x) { return pows(Math.floor(logs(x))); }, - ceil: function(x) { return pows(Math.ceil(logs(x))); } - })); + var utcFormats = { + "a": formatUTCShortWeekday, + "A": formatUTCWeekday, + "b": formatUTCShortMonth, + "B": formatUTCMonth, + "c": null, + "d": formatUTCDayOfMonth, + "e": formatUTCDayOfMonth, + "f": formatUTCMicroseconds, + "g": formatUTCYearISO, + "G": formatUTCFullYearISO, + "H": formatUTCHour24, + "I": formatUTCHour12, + "j": formatUTCDayOfYear, + "L": formatUTCMilliseconds, + "m": formatUTCMonthNumber, + "M": formatUTCMinutes, + "p": formatUTCPeriod, + "q": formatUTCQuarter, + "Q": formatUnixTimestamp, + "s": formatUnixTimestampSeconds, + "S": formatUTCSeconds, + "u": formatUTCWeekdayNumberMonday, + "U": formatUTCWeekNumberSunday, + "V": formatUTCWeekNumberISO, + "w": formatUTCWeekdayNumberSunday, + "W": formatUTCWeekNumberMonday, + "x": null, + "X": null, + "y": formatUTCYear, + "Y": formatUTCFullYear, + "Z": formatUTCZone, + "%": formatLiteralPercent }; - return scale; -} - -function log() { - var scale = loggish(transformer$2()).domain([1, 10]); - - scale.copy = function() { - return copy$1(scale, log()).base(scale.base()); + var parses = { + "a": parseShortWeekday, + "A": parseWeekday, + "b": parseShortMonth, + "B": parseMonth, + "c": parseLocaleDateTime, + "d": parseDayOfMonth, + "e": parseDayOfMonth, + "f": parseMicroseconds, + "g": parseYear, + "G": parseFullYear, + "H": parseHour24, + "I": parseHour24, + "j": parseDayOfYear, + "L": parseMilliseconds, + "m": parseMonthNumber, + "M": parseMinutes, + "p": parsePeriod, + "q": parseQuarter, + "Q": parseUnixTimestamp, + "s": parseUnixTimestampSeconds, + "S": parseSeconds, + "u": parseWeekdayNumberMonday, + "U": parseWeekNumberSunday, + "V": parseWeekNumberISO, + "w": parseWeekdayNumberSunday, + "W": parseWeekNumberMonday, + "x": parseLocaleDate, + "X": parseLocaleTime, + "y": parseYear, + "Y": parseFullYear, + "Z": parseZone, + "%": parseLiteralPercent }; - initRange.apply(scale, arguments); - - return scale; -} - -function transformSymlog(c) { - return function(x) { - return Math.sign(x) * Math.log1p(Math.abs(x / c)); - }; -} + // These recursive directive definitions must be deferred. + formats.x = newFormat(locale_date, formats); + formats.X = newFormat(locale_time, formats); + formats.c = newFormat(locale_dateTime, formats); + utcFormats.x = newFormat(locale_date, utcFormats); + utcFormats.X = newFormat(locale_time, utcFormats); + utcFormats.c = newFormat(locale_dateTime, utcFormats); -function transformSymexp(c) { - return function(x) { - return Math.sign(x) * Math.expm1(Math.abs(x)) * c; - }; -} + function newFormat(specifier, formats) { + return function(date) { + var string = [], + i = -1, + j = 0, + n = specifier.length, + c, + pad, + format; -function symlogish(transform) { - var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); + if (!(date instanceof Date)) date = new Date(+date); - scale.constant = function(_) { - return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; - }; + while (++i < n) { + if (specifier.charCodeAt(i) === 37) { + string.push(specifier.slice(j, i)); + if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i); + else pad = c === "e" ? " " : "0"; + if (format = formats[c]) c = format(date, pad); + string.push(c); + j = i + 1; + } + } - return linearish(scale); -} + string.push(specifier.slice(j, i)); + return string.join(""); + }; + } -function symlog() { - var scale = symlogish(transformer$2()); + function newParse(specifier, Z) { + return function(string) { + var d = newDate(1900, undefined, 1), + i = parseSpecifier(d, specifier, string += "", 0), + week, day; + if (i != string.length) return null; - scale.copy = function() { - return copy$1(scale, symlog()).constant(scale.constant()); - }; + // If a UNIX timestamp is specified, return it. + if ("Q" in d) return new Date(d.Q); + if ("s" in d) return new Date(d.s * 1000 + ("L" in d ? d.L : 0)); - return initRange.apply(scale, arguments); -} + // If this is utcParse, never use the local timezone. + if (Z && !("Z" in d)) d.Z = 0; -function transformPow(exponent) { - return function(x) { - return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); - }; -} + // The am-pm flag is 0 for AM, and 1 for PM. + if ("p" in d) d.H = d.H % 12 + d.p * 12; -function transformSqrt(x) { - return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); -} + // If the month was not specified, inherit from the quarter. + if (d.m === undefined) d.m = "q" in d ? d.q : 0; -function transformSquare(x) { - return x < 0 ? -x * x : x * x; -} + // Convert day-of-week and week-of-year to day-of-year. + if ("V" in d) { + if (d.V < 1 || d.V > 53) return null; + if (!("w" in d)) d.w = 1; + if ("Z" in d) { + week = utcDate(newDate(d.y, 0, 1)), day = week.getUTCDay(); + week = day > 4 || day === 0 ? d3Time.utcMonday.ceil(week) : d3Time.utcMonday(week); + week = d3Time.utcDay.offset(week, (d.V - 1) * 7); + d.y = week.getUTCFullYear(); + d.m = week.getUTCMonth(); + d.d = week.getUTCDate() + (d.w + 6) % 7; + } else { + week = localDate(newDate(d.y, 0, 1)), day = week.getDay(); + week = day > 4 || day === 0 ? d3Time.timeMonday.ceil(week) : d3Time.timeMonday(week); + week = d3Time.timeDay.offset(week, (d.V - 1) * 7); + d.y = week.getFullYear(); + d.m = week.getMonth(); + d.d = week.getDate() + (d.w + 6) % 7; + } + } else if ("W" in d || "U" in d) { + if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0; + day = "Z" in d ? utcDate(newDate(d.y, 0, 1)).getUTCDay() : localDate(newDate(d.y, 0, 1)).getDay(); + d.m = 0; + d.d = "W" in d ? (d.w + 6) % 7 + d.W * 7 - (day + 5) % 7 : d.w + d.U * 7 - (day + 6) % 7; + } -function powish(transform) { - var scale = transform(identity$1, identity$1), - exponent = 1; + // If a time zone is specified, all fields are interpreted as UTC and then + // offset according to the specified time zone. + if ("Z" in d) { + d.H += d.Z / 100 | 0; + d.M += d.Z % 100; + return utcDate(d); + } - function rescale() { - return exponent === 1 ? transform(identity$1, identity$1) - : exponent === 0.5 ? transform(transformSqrt, transformSquare) - : transform(transformPow(exponent), transformPow(1 / exponent)); + // Otherwise, all fields are in local time. + return localDate(d); + }; } - scale.exponent = function(_) { - return arguments.length ? (exponent = +_, rescale()) : exponent; - }; - - return linearish(scale); -} - -function pow() { - var scale = powish(transformer$2()); - - scale.copy = function() { - return copy$1(scale, pow()).exponent(scale.exponent()); - }; - - initRange.apply(scale, arguments); - - return scale; -} + function parseSpecifier(d, specifier, string, j) { + var i = 0, + n = specifier.length, + m = string.length, + c, + parse; -function sqrt() { - return pow.apply(null, arguments).exponent(0.5); -} + while (i < n) { + if (j >= m) return -1; + c = specifier.charCodeAt(i++); + if (c === 37) { + c = specifier.charAt(i++); + parse = parses[c in pads ? specifier.charAt(i++) : c]; + if (!parse || ((j = parse(d, string, j)) < 0)) return -1; + } else if (c != string.charCodeAt(j++)) { + return -1; + } + } -function square(x) { - return Math.sign(x) * x * x; -} + return j; + } -function unsquare(x) { - return Math.sign(x) * Math.sqrt(Math.abs(x)); -} + function parsePeriod(d, string, i) { + var n = periodRe.exec(string.slice(i)); + return n ? (d.p = periodLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } -function radial() { - var squared = continuous(), - range = [0, 1], - round = false, - unknown; + function parseShortWeekday(d, string, i) { + var n = shortWeekdayRe.exec(string.slice(i)); + return n ? (d.w = shortWeekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } - function scale(x) { - var y = unsquare(squared(x)); - return isNaN(y) ? unknown : round ? Math.round(y) : y; + function parseWeekday(d, string, i) { + var n = weekdayRe.exec(string.slice(i)); + return n ? (d.w = weekdayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; } - scale.invert = function(y) { - return squared.invert(square(y)); - }; + function parseShortMonth(d, string, i) { + var n = shortMonthRe.exec(string.slice(i)); + return n ? (d.m = shortMonthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } - scale.domain = function(_) { - return arguments.length ? (squared.domain(_), scale) : squared.domain(); - }; + function parseMonth(d, string, i) { + var n = monthRe.exec(string.slice(i)); + return n ? (d.m = monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1; + } - scale.range = function(_) { - return arguments.length ? (squared.range((range = Array.from(_, number$1)).map(square)), scale) : range.slice(); - }; + function parseLocaleDateTime(d, string, i) { + return parseSpecifier(d, locale_dateTime, string, i); + } - scale.rangeRound = function(_) { - return scale.range(_).round(true); - }; + function parseLocaleDate(d, string, i) { + return parseSpecifier(d, locale_date, string, i); + } - scale.round = function(_) { - return arguments.length ? (round = !!_, scale) : round; - }; + function parseLocaleTime(d, string, i) { + return parseSpecifier(d, locale_time, string, i); + } - scale.clamp = function(_) { - return arguments.length ? (squared.clamp(_), scale) : squared.clamp(); - }; + function formatShortWeekday(d) { + return locale_shortWeekdays[d.getDay()]; + } - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; + function formatWeekday(d) { + return locale_weekdays[d.getDay()]; + } - scale.copy = function() { - return radial(squared.domain(), range) - .round(round) - .clamp(squared.clamp()) - .unknown(unknown); - }; + function formatShortMonth(d) { + return locale_shortMonths[d.getMonth()]; + } - initRange.apply(scale, arguments); + function formatMonth(d) { + return locale_months[d.getMonth()]; + } - return linearish(scale); -} + function formatPeriod(d) { + return locale_periods[+(d.getHours() >= 12)]; + } -function quantile() { - var domain = [], - range = [], - thresholds = [], - unknown; + function formatQuarter(d) { + return 1 + ~~(d.getMonth() / 3); + } - function rescale() { - var i = 0, n = Math.max(1, range.length); - thresholds = new Array(n - 1); - while (++i < n) thresholds[i - 1] = d3Array.quantileSorted(domain, i / n); - return scale; + function formatUTCShortWeekday(d) { + return locale_shortWeekdays[d.getUTCDay()]; } - function scale(x) { - return x == null || isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)]; + function formatUTCWeekday(d) { + return locale_weekdays[d.getUTCDay()]; } - scale.invertExtent = function(y) { - var i = range.indexOf(y); - return i < 0 ? [NaN, NaN] : [ - i > 0 ? thresholds[i - 1] : domain[0], - i < thresholds.length ? thresholds[i] : domain[domain.length - 1] - ]; - }; + function formatUTCShortMonth(d) { + return locale_shortMonths[d.getUTCMonth()]; + } - scale.domain = function(_) { - if (!arguments.length) return domain.slice(); - domain = []; - for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); - domain.sort(d3Array.ascending); - return rescale(); - }; + function formatUTCMonth(d) { + return locale_months[d.getUTCMonth()]; + } - scale.range = function(_) { - return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); - }; + function formatUTCPeriod(d) { + return locale_periods[+(d.getUTCHours() >= 12)]; + } - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; + function formatUTCQuarter(d) { + return 1 + ~~(d.getUTCMonth() / 3); + } - scale.quantiles = function() { - return thresholds.slice(); + return { + format: function(specifier) { + var f = newFormat(specifier += "", formats); + f.toString = function() { return specifier; }; + return f; + }, + parse: function(specifier) { + var p = newParse(specifier += "", false); + p.toString = function() { return specifier; }; + return p; + }, + utcFormat: function(specifier) { + var f = newFormat(specifier += "", utcFormats); + f.toString = function() { return specifier; }; + return f; + }, + utcParse: function(specifier) { + var p = newParse(specifier += "", true); + p.toString = function() { return specifier; }; + return p; + } }; +} - scale.copy = function() { - return quantile() - .domain(domain) - .range(range) - .unknown(unknown); - }; +var pads = {"-": "", "_": " ", "0": "0"}, + numberRe = /^\s*\d+/, // note: ignores next directive + percentRe = /^%/, + requoteRe = /[\\^$*+?|[\]().{}]/g; - return initRange.apply(scale, arguments); +function pad(value, fill, width) { + var sign = value < 0 ? "-" : "", + string = (sign ? -value : value) + "", + length = string.length; + return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string); } -function quantize() { - var x0 = 0, - x1 = 1, - n = 1, - domain = [0.5], - range = [0, 1], - unknown; - - function scale(x) { - return x != null && x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; - } +function requote(s) { + return s.replace(requoteRe, "\\$&"); +} - function rescale() { - var i = -1; - domain = new Array(n); - while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); - return scale; - } +function formatRe(names) { + return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i"); +} - scale.domain = function(_) { - return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1]; - }; +function formatLookup(names) { + return new Map(names.map((name, i) => [name.toLowerCase(), i])); +} - scale.range = function(_) { - return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice(); - }; +function parseWeekdayNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.w = +n[0], i + n[0].length) : -1; +} - scale.invertExtent = function(y) { - var i = range.indexOf(y); - return i < 0 ? [NaN, NaN] - : i < 1 ? [x0, domain[0]] - : i >= n ? [domain[n - 1], x1] - : [domain[i - 1], domain[i]]; - }; +function parseWeekdayNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.u = +n[0], i + n[0].length) : -1; +} - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : scale; - }; +function parseWeekNumberSunday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.U = +n[0], i + n[0].length) : -1; +} - scale.thresholds = function() { - return domain.slice(); - }; +function parseWeekNumberISO(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.V = +n[0], i + n[0].length) : -1; +} - scale.copy = function() { - return quantize() - .domain([x0, x1]) - .range(range) - .unknown(unknown); - }; +function parseWeekNumberMonday(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.W = +n[0], i + n[0].length) : -1; +} - return initRange.apply(linearish(scale), arguments); +function parseFullYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 4)); + return n ? (d.y = +n[0], i + n[0].length) : -1; } -function threshold() { - var domain = [0.5], - range = [0, 1], - unknown, - n = 1; +function parseYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1; +} - function scale(x) { - return x != null && x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; - } +function parseZone(d, string, i) { + var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6)); + return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1; +} - scale.domain = function(_) { - return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); - }; +function parseQuarter(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 1)); + return n ? (d.q = n[0] * 3 - 3, i + n[0].length) : -1; +} - scale.range = function(_) { - return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); - }; +function parseMonthNumber(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.m = n[0] - 1, i + n[0].length) : -1; +} - scale.invertExtent = function(y) { - var i = range.indexOf(y); - return [domain[i - 1], domain[i]]; - }; +function parseDayOfMonth(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.d = +n[0], i + n[0].length) : -1; +} - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; +function parseDayOfYear(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1; +} - scale.copy = function() { - return threshold() - .domain(domain) - .range(range) - .unknown(unknown); - }; +function parseHour24(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.H = +n[0], i + n[0].length) : -1; +} - return initRange.apply(scale, arguments); +function parseMinutes(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.M = +n[0], i + n[0].length) : -1; } -function date(t) { - return new Date(t); +function parseSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 2)); + return n ? (d.S = +n[0], i + n[0].length) : -1; } -function number(t) { - return t instanceof Date ? +t : +new Date(+t); +function parseMilliseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 3)); + return n ? (d.L = +n[0], i + n[0].length) : -1; } -function calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) { - var scale = continuous(), - invert = scale.invert, - domain = scale.domain; +function parseMicroseconds(d, string, i) { + var n = numberRe.exec(string.slice(i, i + 6)); + return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1; +} - var formatMillisecond = format(".%L"), - formatSecond = format(":%S"), - formatMinute = format("%I:%M"), - formatHour = format("%I %p"), - formatDay = format("%a %d"), - formatWeek = format("%b %d"), - formatMonth = format("%B"), - formatYear = format("%Y"); +function parseLiteralPercent(d, string, i) { + var n = percentRe.exec(string.slice(i, i + 1)); + return n ? i + n[0].length : -1; +} - function tickFormat(date) { - return (second(date) < date ? formatMillisecond - : minute(date) < date ? formatSecond - : hour(date) < date ? formatMinute - : day(date) < date ? formatHour - : month(date) < date ? (week(date) < date ? formatDay : formatWeek) - : year(date) < date ? formatMonth - : formatYear)(date); - } +function parseUnixTimestamp(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.Q = +n[0], i + n[0].length) : -1; +} - scale.invert = function(y) { - return new Date(invert(y)); - }; +function parseUnixTimestampSeconds(d, string, i) { + var n = numberRe.exec(string.slice(i)); + return n ? (d.s = +n[0], i + n[0].length) : -1; +} - scale.domain = function(_) { - return arguments.length ? domain(Array.from(_, number)) : domain().map(date); - }; +function formatDayOfMonth(d, p) { + return pad(d.getDate(), p, 2); +} - scale.ticks = function(interval) { - var d = domain(); - return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval); - }; +function formatHour24(d, p) { + return pad(d.getHours(), p, 2); +} - scale.tickFormat = function(count, specifier) { - return specifier == null ? tickFormat : format(specifier); - }; +function formatHour12(d, p) { + return pad(d.getHours() % 12 || 12, p, 2); +} - scale.nice = function(interval) { - var d = domain(); - if (!interval || typeof interval.range !== "function") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval); - return interval ? domain(nice(d, interval)) : scale; - }; +function formatDayOfYear(d, p) { + return pad(1 + d3Time.timeDay.count(d3Time.timeYear(d), d), p, 3); +} - scale.copy = function() { - return copy$1(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format)); - }; +function formatMilliseconds(d, p) { + return pad(d.getMilliseconds(), p, 3); +} - return scale; +function formatMicroseconds(d, p) { + return formatMilliseconds(d, p) + "000"; } -function time() { - return initRange.apply(calendar(d3Time.timeTicks, d3Time.timeTickInterval, d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +function formatMonthNumber(d, p) { + return pad(d.getMonth() + 1, p, 2); } -function utcTime() { - return initRange.apply(calendar(d3Time.utcTicks, d3Time.utcTickInterval, d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +function formatMinutes(d, p) { + return pad(d.getMinutes(), p, 2); } -function transformer$1() { - var x0 = 0, - x1 = 1, - t0, - t1, - k10, - transform, - interpolator = identity$1, - clamp = false, - unknown; +function formatSeconds(d, p) { + return pad(d.getSeconds(), p, 2); +} - function scale(x) { - return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); - } +function formatWeekdayNumberMonday(d) { + var day = d.getDay(); + return day === 0 ? 7 : day; +} - scale.domain = function(_) { - return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; - }; +function formatWeekNumberSunday(d, p) { + return pad(d3Time.timeSunday.count(d3Time.timeYear(d) - 1, d), p, 2); +} - scale.clamp = function(_) { - return arguments.length ? (clamp = !!_, scale) : clamp; - }; +function dISO(d) { + var day = d.getDay(); + return (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); +} - scale.interpolator = function(_) { - return arguments.length ? (interpolator = _, scale) : interpolator; - }; +function formatWeekNumberISO(d, p) { + d = dISO(d); + return pad(d3Time.timeThursday.count(d3Time.timeYear(d), d) + (d3Time.timeYear(d).getDay() === 4), p, 2); +} - function range(interpolate) { - return function(_) { - var r0, r1; - return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)]; - }; - } +function formatWeekdayNumberSunday(d) { + return d.getDay(); +} - scale.range = range(d3Interpolate.interpolate); +function formatWeekNumberMonday(d, p) { + return pad(d3Time.timeMonday.count(d3Time.timeYear(d) - 1, d), p, 2); +} - scale.rangeRound = range(d3Interpolate.interpolateRound); +function formatYear(d, p) { + return pad(d.getFullYear() % 100, p, 2); +} - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; +function formatYearISO(d, p) { + d = dISO(d); + return pad(d.getFullYear() % 100, p, 2); +} - return function(t) { - transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); - return scale; - }; +function formatFullYear(d, p) { + return pad(d.getFullYear() % 10000, p, 4); } -function copy(source, target) { - return target - .domain(source.domain()) - .interpolator(source.interpolator()) - .clamp(source.clamp()) - .unknown(source.unknown()); +function formatFullYearISO(d, p) { + var day = d.getDay(); + d = (day >= 4 || day === 0) ? d3Time.timeThursday(d) : d3Time.timeThursday.ceil(d); + return pad(d.getFullYear() % 10000, p, 4); } -function sequential() { - var scale = linearish(transformer$1()(identity$1)); +function formatZone(d) { + var z = d.getTimezoneOffset(); + return (z > 0 ? "-" : (z *= -1, "+")) + + pad(z / 60 | 0, "0", 2) + + pad(z % 60, "0", 2); +} - scale.copy = function() { - return copy(scale, sequential()); - }; +function formatUTCDayOfMonth(d, p) { + return pad(d.getUTCDate(), p, 2); +} - return initInterpolator.apply(scale, arguments); +function formatUTCHour24(d, p) { + return pad(d.getUTCHours(), p, 2); } -function sequentialLog() { - var scale = loggish(transformer$1()).domain([1, 10]); +function formatUTCHour12(d, p) { + return pad(d.getUTCHours() % 12 || 12, p, 2); +} - scale.copy = function() { - return copy(scale, sequentialLog()).base(scale.base()); - }; +function formatUTCDayOfYear(d, p) { + return pad(1 + d3Time.utcDay.count(d3Time.utcYear(d), d), p, 3); +} - return initInterpolator.apply(scale, arguments); +function formatUTCMilliseconds(d, p) { + return pad(d.getUTCMilliseconds(), p, 3); } -function sequentialSymlog() { - var scale = symlogish(transformer$1()); +function formatUTCMicroseconds(d, p) { + return formatUTCMilliseconds(d, p) + "000"; +} - scale.copy = function() { - return copy(scale, sequentialSymlog()).constant(scale.constant()); - }; +function formatUTCMonthNumber(d, p) { + return pad(d.getUTCMonth() + 1, p, 2); +} - return initInterpolator.apply(scale, arguments); +function formatUTCMinutes(d, p) { + return pad(d.getUTCMinutes(), p, 2); } -function sequentialPow() { - var scale = powish(transformer$1()); +function formatUTCSeconds(d, p) { + return pad(d.getUTCSeconds(), p, 2); +} - scale.copy = function() { - return copy(scale, sequentialPow()).exponent(scale.exponent()); - }; +function formatUTCWeekdayNumberMonday(d) { + var dow = d.getUTCDay(); + return dow === 0 ? 7 : dow; +} - return initInterpolator.apply(scale, arguments); +function formatUTCWeekNumberSunday(d, p) { + return pad(d3Time.utcSunday.count(d3Time.utcYear(d) - 1, d), p, 2); } -function sequentialSqrt() { - return sequentialPow.apply(null, arguments).exponent(0.5); +function UTCdISO(d) { + var day = d.getUTCDay(); + return (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); } -function sequentialQuantile() { - var domain = [], - interpolator = identity$1; +function formatUTCWeekNumberISO(d, p) { + d = UTCdISO(d); + return pad(d3Time.utcThursday.count(d3Time.utcYear(d), d) + (d3Time.utcYear(d).getUTCDay() === 4), p, 2); +} - function scale(x) { - if (x != null && !isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x, 1) - 1) / (domain.length - 1)); - } +function formatUTCWeekdayNumberSunday(d) { + return d.getUTCDay(); +} - scale.domain = function(_) { - if (!arguments.length) return domain.slice(); - domain = []; - for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); - domain.sort(d3Array.ascending); - return scale; - }; +function formatUTCWeekNumberMonday(d, p) { + return pad(d3Time.utcMonday.count(d3Time.utcYear(d) - 1, d), p, 2); +} - scale.interpolator = function(_) { - return arguments.length ? (interpolator = _, scale) : interpolator; - }; +function formatUTCYear(d, p) { + return pad(d.getUTCFullYear() % 100, p, 2); +} - scale.range = function() { - return domain.map((d, i) => interpolator(i / (domain.length - 1))); - }; +function formatUTCYearISO(d, p) { + d = UTCdISO(d); + return pad(d.getUTCFullYear() % 100, p, 2); +} - scale.quantiles = function(n) { - return Array.from({length: n + 1}, (_, i) => d3Array.quantile(domain, i / n)); - }; +function formatUTCFullYear(d, p) { + return pad(d.getUTCFullYear() % 10000, p, 4); +} - scale.copy = function() { - return sequentialQuantile(interpolator).domain(domain); - }; +function formatUTCFullYearISO(d, p) { + var day = d.getUTCDay(); + d = (day >= 4 || day === 0) ? d3Time.utcThursday(d) : d3Time.utcThursday.ceil(d); + return pad(d.getUTCFullYear() % 10000, p, 4); +} - return initInterpolator.apply(scale, arguments); +function formatUTCZone() { + return "+0000"; } -function transformer() { - var x0 = 0, - x1 = 0.5, - x2 = 1, - s = 1, - t0, - t1, - t2, - k10, - k21, - interpolator = identity$1, - transform, - clamp = false, - unknown; +function formatLiteralPercent() { + return "%"; +} - function scale(x) { - return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); - } +function formatUnixTimestamp(d) { + return +d; +} - scale.domain = function(_) { - return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2]; - }; +function formatUnixTimestampSeconds(d) { + return Math.floor(+d / 1000); +} - scale.clamp = function(_) { - return arguments.length ? (clamp = !!_, scale) : clamp; - }; +var locale; - scale.interpolator = function(_) { - return arguments.length ? (interpolator = _, scale) : interpolator; - }; +defaultLocale({ + dateTime: "%x, %X", + date: "%-m/%-d/%Y", + time: "%-I:%M:%S %p", + periods: ["AM", "PM"], + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] +}); - function range(interpolate) { - return function(_) { - var r0, r1, r2; - return arguments.length ? ([r0, r1, r2] = _, interpolator = d3Interpolate.piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)]; - }; - } +function defaultLocale(definition) { + locale = formatLocale(definition); + exports.timeFormat = locale.format; + exports.timeParse = locale.parse; + exports.utcFormat = locale.utcFormat; + exports.utcParse = locale.utcParse; + return locale; +} - scale.range = range(d3Interpolate.interpolate); +var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ"; - scale.rangeRound = range(d3Interpolate.interpolateRound); +function formatIsoNative(date) { + return date.toISOString(); +} - scale.unknown = function(_) { - return arguments.length ? (unknown = _, scale) : unknown; - }; +var formatIso = Date.prototype.toISOString + ? formatIsoNative + : exports.utcFormat(isoSpecifier); - return function(t) { - transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1; - return scale; - }; +function parseIsoNative(string) { + var date = new Date(string); + return isNaN(date) ? null : date; } -function diverging() { - var scale = linearish(transformer()(identity$1)); +var parseIso = +new Date("2000-01-01T00:00:00.000Z") + ? parseIsoNative + : exports.utcParse(isoSpecifier); - scale.copy = function() { - return copy(scale, diverging()); - }; +exports.isoFormat = formatIso; +exports.isoParse = parseIso; +exports.timeFormatDefaultLocale = defaultLocale; +exports.timeFormatLocale = formatLocale; - return initInterpolator.apply(scale, arguments); -} +Object.defineProperty(exports, '__esModule', { value: true }); -function divergingLog() { - var scale = loggish(transformer()).domain([0.1, 1, 10]); +})); +}); - scale.copy = function() { - return copy(scale, divergingLog()).base(scale.base()); - }; +var d3Scale = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-scale/ v3.3.0 Copyright 2021 Mike Bostock +(function (global, factory) { +factory(exports, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) ; +}(commonjsGlobal, (function (exports, d3Array, d3Interpolate, d3Format, d3Time, d3TimeFormat) { +function initRange(domain, range) { + switch (arguments.length) { + case 0: break; + case 1: this.range(domain); break; + default: this.range(range).domain(domain); break; + } + return this; +} - return initInterpolator.apply(scale, arguments); +function initInterpolator(domain, interpolator) { + switch (arguments.length) { + case 0: break; + case 1: { + if (typeof domain === "function") this.interpolator(domain); + else this.range(domain); + break; + } + default: { + this.domain(domain); + if (typeof interpolator === "function") this.interpolator(interpolator); + else this.range(interpolator); + break; + } + } + return this; } -function divergingSymlog() { - var scale = symlogish(transformer()); +const implicit = Symbol("implicit"); - scale.copy = function() { - return copy(scale, divergingSymlog()).constant(scale.constant()); +function ordinal() { + var index = new Map(), + domain = [], + range = [], + unknown = implicit; + + function scale(d) { + var key = d + "", i = index.get(key); + if (!i) { + if (unknown !== implicit) return unknown; + index.set(key, i = domain.push(d)); + } + return range[(i - 1) % range.length]; + } + + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = [], index = new Map(); + for (const value of _) { + const key = value + ""; + if (index.has(key)) continue; + index.set(key, domain.push(value)); + } + return scale; }; - return initInterpolator.apply(scale, arguments); -} + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), scale) : range.slice(); + }; -function divergingPow() { - var scale = powish(transformer()); + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; scale.copy = function() { - return copy(scale, divergingPow()).exponent(scale.exponent()); + return ordinal(domain, range).unknown(unknown); }; - return initInterpolator.apply(scale, arguments); -} + initRange.apply(scale, arguments); -function divergingSqrt() { - return divergingPow.apply(null, arguments).exponent(0.5); + return scale; } -exports.scaleBand = band; -exports.scaleDiverging = diverging; -exports.scaleDivergingLog = divergingLog; -exports.scaleDivergingPow = divergingPow; -exports.scaleDivergingSqrt = divergingSqrt; -exports.scaleDivergingSymlog = divergingSymlog; -exports.scaleIdentity = identity; -exports.scaleImplicit = implicit; -exports.scaleLinear = linear; -exports.scaleLog = log; -exports.scaleOrdinal = ordinal; -exports.scalePoint = point; -exports.scalePow = pow; -exports.scaleQuantile = quantile; -exports.scaleQuantize = quantize; -exports.scaleRadial = radial; -exports.scaleSequential = sequential; -exports.scaleSequentialLog = sequentialLog; -exports.scaleSequentialPow = sequentialPow; -exports.scaleSequentialQuantile = sequentialQuantile; -exports.scaleSequentialSqrt = sequentialSqrt; -exports.scaleSequentialSymlog = sequentialSymlog; -exports.scaleSqrt = sqrt; -exports.scaleSymlog = symlog; -exports.scaleThreshold = threshold; -exports.scaleTime = time; -exports.scaleUtc = utcTime; -exports.tickFormat = tickFormat; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -}); - -var d3ScaleChromatic = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-scale-chromatic/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Interpolate, d3Color) ; -}(commonjsGlobal, function (exports, d3Interpolate, d3Color) { -function colors(specifier) { - var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; - while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); - return colors; -} +function band() { + var scale = ordinal().unknown(undefined), + domain = scale.domain, + ordinalRange = scale.range, + r0 = 0, + r1 = 1, + step, + bandwidth, + round = false, + paddingInner = 0, + paddingOuter = 0, + align = 0.5; -var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); + delete scale.unknown; -var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); + function rescale() { + var n = domain().length, + reverse = r1 < r0, + start = reverse ? r1 : r0, + stop = reverse ? r0 : r1; + step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2); + if (round) step = Math.floor(step); + start += (stop - start - step * (n - paddingInner)) * align; + bandwidth = step * (1 - paddingInner); + if (round) start = Math.round(start), bandwidth = Math.round(bandwidth); + var values = d3Array.range(n).map(function(i) { return start + step * i; }); + return ordinalRange(reverse ? values.reverse() : values); + } -var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; -var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); + scale.range = function(_) { + return arguments.length ? ([r0, r1] = _, r0 = +r0, r1 = +r1, rescale()) : [r0, r1]; + }; -var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); + scale.rangeRound = function(_) { + return [r0, r1] = _, r0 = +r0, r1 = +r1, round = true, rescale(); + }; -var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); + scale.bandwidth = function() { + return bandwidth; + }; -var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); + scale.step = function() { + return step; + }; -var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); + scale.round = function(_) { + return arguments.length ? (round = !!_, rescale()) : round; + }; -var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); + scale.padding = function(_) { + return arguments.length ? (paddingInner = Math.min(1, paddingOuter = +_), rescale()) : paddingInner; + }; -var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); + scale.paddingInner = function(_) { + return arguments.length ? (paddingInner = Math.min(1, _), rescale()) : paddingInner; + }; -var ramp = scheme => d3Interpolate.interpolateRgbBasis(scheme[scheme.length - 1]); + scale.paddingOuter = function(_) { + return arguments.length ? (paddingOuter = +_, rescale()) : paddingOuter; + }; -var scheme = new Array(3).concat( - "d8b365f5f5f55ab4ac", - "a6611adfc27d80cdc1018571", - "a6611adfc27df5f5f580cdc1018571", - "8c510ad8b365f6e8c3c7eae55ab4ac01665e", - "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", - "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", - "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", - "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", - "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" -).map(colors); + scale.align = function(_) { + return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align; + }; -var BrBG = ramp(scheme); + scale.copy = function() { + return band(domain(), [r0, r1]) + .round(round) + .paddingInner(paddingInner) + .paddingOuter(paddingOuter) + .align(align); + }; -var scheme$1 = new Array(3).concat( - "af8dc3f7f7f77fbf7b", - "7b3294c2a5cfa6dba0008837", - "7b3294c2a5cff7f7f7a6dba0008837", - "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", - "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", - "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", - "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", - "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", - "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" -).map(colors); + return initRange.apply(rescale(), arguments); +} -var PRGn = ramp(scheme$1); +function pointish(scale) { + var copy = scale.copy; -var scheme$2 = new Array(3).concat( - "e9a3c9f7f7f7a1d76a", - "d01c8bf1b6dab8e1864dac26", - "d01c8bf1b6daf7f7f7b8e1864dac26", - "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", - "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", - "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", - "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", - "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", - "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" -).map(colors); + scale.padding = scale.paddingOuter; + delete scale.paddingInner; + delete scale.paddingOuter; -var PiYG = ramp(scheme$2); + scale.copy = function() { + return pointish(copy()); + }; -var scheme$3 = new Array(3).concat( - "998ec3f7f7f7f1a340", - "5e3c99b2abd2fdb863e66101", - "5e3c99b2abd2f7f7f7fdb863e66101", - "542788998ec3d8daebfee0b6f1a340b35806", - "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", - "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", - "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", - "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", - "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" -).map(colors); + return scale; +} -var PuOr = ramp(scheme$3); +function point() { + return pointish(band.apply(null, arguments).paddingInner(1)); +} -var scheme$4 = new Array(3).concat( - "ef8a62f7f7f767a9cf", - "ca0020f4a58292c5de0571b0", - "ca0020f4a582f7f7f792c5de0571b0", - "b2182bef8a62fddbc7d1e5f067a9cf2166ac", - "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", - "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", - "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", - "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", - "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" -).map(colors); +function constants(x) { + return function() { + return x; + }; +} -var RdBu = ramp(scheme$4); +function number$1(x) { + return +x; +} -var scheme$5 = new Array(3).concat( - "ef8a62ffffff999999", - "ca0020f4a582bababa404040", - "ca0020f4a582ffffffbababa404040", - "b2182bef8a62fddbc7e0e0e09999994d4d4d", - "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", - "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", - "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", - "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", - "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" -).map(colors); +var unit = [0, 1]; -var RdGy = ramp(scheme$5); +function identity$1(x) { + return x; +} -var scheme$6 = new Array(3).concat( - "fc8d59ffffbf91bfdb", - "d7191cfdae61abd9e92c7bb6", - "d7191cfdae61ffffbfabd9e92c7bb6", - "d73027fc8d59fee090e0f3f891bfdb4575b4", - "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", - "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", - "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", - "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", - "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" -).map(colors); +function normalize(a, b) { + return (b -= (a = +a)) + ? function(x) { return (x - a) / b; } + : constants(isNaN(b) ? NaN : 0.5); +} -var RdYlBu = ramp(scheme$6); +function clamper(a, b) { + var t; + if (a > b) t = a, a = b, b = t; + return function(x) { return Math.max(a, Math.min(b, x)); }; +} -var scheme$7 = new Array(3).concat( - "fc8d59ffffbf91cf60", - "d7191cfdae61a6d96a1a9641", - "d7191cfdae61ffffbfa6d96a1a9641", - "d73027fc8d59fee08bd9ef8b91cf601a9850", - "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", - "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", - "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", - "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", - "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" -).map(colors); +// normalize(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1]. +// interpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding range value x in [a,b]. +function bimap(domain, range, interpolate) { + var d0 = domain[0], d1 = domain[1], r0 = range[0], r1 = range[1]; + if (d1 < d0) d0 = normalize(d1, d0), r0 = interpolate(r1, r0); + else d0 = normalize(d0, d1), r0 = interpolate(r0, r1); + return function(x) { return r0(d0(x)); }; +} -var RdYlGn = ramp(scheme$7); +function polymap(domain, range, interpolate) { + var j = Math.min(domain.length, range.length) - 1, + d = new Array(j), + r = new Array(j), + i = -1; -var scheme$8 = new Array(3).concat( - "fc8d59ffffbf99d594", - "d7191cfdae61abdda42b83ba", - "d7191cfdae61ffffbfabdda42b83ba", - "d53e4ffc8d59fee08be6f59899d5943288bd", - "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", - "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", - "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", - "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", - "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" -).map(colors); + // Reverse descending domains. + if (domain[j] < domain[0]) { + domain = domain.slice().reverse(); + range = range.slice().reverse(); + } -var Spectral = ramp(scheme$8); + while (++i < j) { + d[i] = normalize(domain[i], domain[i + 1]); + r[i] = interpolate(range[i], range[i + 1]); + } -var scheme$9 = new Array(3).concat( - "e5f5f999d8c92ca25f", - "edf8fbb2e2e266c2a4238b45", - "edf8fbb2e2e266c2a42ca25f006d2c", - "edf8fbccece699d8c966c2a42ca25f006d2c", - "edf8fbccece699d8c966c2a441ae76238b45005824", - "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", - "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" -).map(colors); + return function(x) { + var i = d3Array.bisect(domain, x, 1, j) - 1; + return r[i](d[i](x)); + }; +} -var BuGn = ramp(scheme$9); +function copy$1(source, target) { + return target + .domain(source.domain()) + .range(source.range()) + .interpolate(source.interpolate()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} -var scheme$a = new Array(3).concat( - "e0ecf49ebcda8856a7", - "edf8fbb3cde38c96c688419d", - "edf8fbb3cde38c96c68856a7810f7c", - "edf8fbbfd3e69ebcda8c96c68856a7810f7c", - "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", - "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", - "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" -).map(colors); +function transformer$2() { + var domain = unit, + range = unit, + interpolate = d3Interpolate.interpolate, + transform, + untransform, + unknown, + clamp = identity$1, + piecewise, + output, + input; -var BuPu = ramp(scheme$a); + function rescale() { + var n = Math.min(domain.length, range.length); + if (clamp !== identity$1) clamp = clamper(domain[0], domain[n - 1]); + piecewise = n > 2 ? polymap : bimap; + output = input = null; + return scale; + } -var scheme$b = new Array(3).concat( - "e0f3dba8ddb543a2ca", - "f0f9e8bae4bc7bccc42b8cbe", - "f0f9e8bae4bc7bccc443a2ca0868ac", - "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", - "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", - "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", - "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" -).map(colors); + function scale(x) { + return x == null || isNaN(x = +x) ? unknown : (output || (output = piecewise(domain.map(transform), range, interpolate)))(transform(clamp(x))); + } -var GnBu = ramp(scheme$b); + scale.invert = function(y) { + return clamp(untransform((input || (input = piecewise(range, domain.map(transform), d3Interpolate.interpolateNumber)))(y))); + }; -var scheme$c = new Array(3).concat( - "fee8c8fdbb84e34a33", - "fef0d9fdcc8afc8d59d7301f", - "fef0d9fdcc8afc8d59e34a33b30000", - "fef0d9fdd49efdbb84fc8d59e34a33b30000", - "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", - "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", - "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" -).map(colors); + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_, number$1), rescale()) : domain.slice(); + }; -var OrRd = ramp(scheme$c); + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); + }; -var scheme$d = new Array(3).concat( - "ece2f0a6bddb1c9099", - "f6eff7bdc9e167a9cf02818a", - "f6eff7bdc9e167a9cf1c9099016c59", - "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", - "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", - "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", - "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" -).map(colors); + scale.rangeRound = function(_) { + return range = Array.from(_), interpolate = d3Interpolate.interpolateRound, rescale(); + }; -var PuBuGn = ramp(scheme$d); + scale.clamp = function(_) { + return arguments.length ? (clamp = _ ? true : identity$1, rescale()) : clamp !== identity$1; + }; -var scheme$e = new Array(3).concat( - "ece7f2a6bddb2b8cbe", - "f1eef6bdc9e174a9cf0570b0", - "f1eef6bdc9e174a9cf2b8cbe045a8d", - "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", - "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", - "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", - "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" -).map(colors); + scale.interpolate = function(_) { + return arguments.length ? (interpolate = _, rescale()) : interpolate; + }; -var PuBu = ramp(scheme$e); + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; -var scheme$f = new Array(3).concat( - "e7e1efc994c7dd1c77", - "f1eef6d7b5d8df65b0ce1256", - "f1eef6d7b5d8df65b0dd1c77980043", - "f1eef6d4b9dac994c7df65b0dd1c77980043", - "f1eef6d4b9dac994c7df65b0e7298ace125691003f", - "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", - "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" -).map(colors); + return function(t, u) { + transform = t, untransform = u; + return rescale(); + }; +} -var PuRd = ramp(scheme$f); +function continuous() { + return transformer$2()(identity$1, identity$1); +} -var scheme$g = new Array(3).concat( - "fde0ddfa9fb5c51b8a", - "feebe2fbb4b9f768a1ae017e", - "feebe2fbb4b9f768a1c51b8a7a0177", - "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", - "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", - "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", - "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" -).map(colors); +function tickFormat(start, stop, count, specifier) { + var step = d3Array.tickStep(start, stop, count), + precision; + specifier = d3Format.formatSpecifier(specifier == null ? ",f" : specifier); + switch (specifier.type) { + case "s": { + var value = Math.max(Math.abs(start), Math.abs(stop)); + if (specifier.precision == null && !isNaN(precision = d3Format.precisionPrefix(step, value))) specifier.precision = precision; + return d3Format.formatPrefix(specifier, value); + } + case "": + case "e": + case "g": + case "p": + case "r": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e"); + break; + } + case "f": + case "%": { + if (specifier.precision == null && !isNaN(precision = d3Format.precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2; + break; + } + } + return d3Format.format(specifier); +} -var RdPu = ramp(scheme$g); +function linearish(scale) { + var domain = scale.domain; -var scheme$h = new Array(3).concat( - "edf8b17fcdbb2c7fb8", - "ffffcca1dab441b6c4225ea8", - "ffffcca1dab441b6c42c7fb8253494", - "ffffccc7e9b47fcdbb41b6c42c7fb8253494", - "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", - "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", - "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" -).map(colors); + scale.ticks = function(count) { + var d = domain(); + return d3Array.ticks(d[0], d[d.length - 1], count == null ? 10 : count); + }; -var YlGnBu = ramp(scheme$h); + scale.tickFormat = function(count, specifier) { + var d = domain(); + return tickFormat(d[0], d[d.length - 1], count == null ? 10 : count, specifier); + }; -var scheme$i = new Array(3).concat( - "f7fcb9addd8e31a354", - "ffffccc2e69978c679238443", - "ffffccc2e69978c67931a354006837", - "ffffccd9f0a3addd8e78c67931a354006837", - "ffffccd9f0a3addd8e78c67941ab5d238443005a32", - "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", - "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" -).map(colors); + scale.nice = function(count) { + if (count == null) count = 10; -var YlGn = ramp(scheme$i); + var d = domain(); + var i0 = 0; + var i1 = d.length - 1; + var start = d[i0]; + var stop = d[i1]; + var prestep; + var step; + var maxIter = 10; -var scheme$j = new Array(3).concat( - "fff7bcfec44fd95f0e", - "ffffd4fed98efe9929cc4c02", - "ffffd4fed98efe9929d95f0e993404", - "ffffd4fee391fec44ffe9929d95f0e993404", - "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", - "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", - "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" -).map(colors); + if (stop < start) { + step = start, start = stop, stop = step; + step = i0, i0 = i1, i1 = step; + } + + while (maxIter-- > 0) { + step = d3Array.tickIncrement(start, stop, count); + if (step === prestep) { + d[i0] = start; + d[i1] = stop; + return domain(d); + } else if (step > 0) { + start = Math.floor(start / step) * step; + stop = Math.ceil(stop / step) * step; + } else if (step < 0) { + start = Math.ceil(start * step) / step; + stop = Math.floor(stop * step) / step; + } else { + break; + } + prestep = step; + } -var YlOrBr = ramp(scheme$j); + return scale; + }; -var scheme$k = new Array(3).concat( - "ffeda0feb24cf03b20", - "ffffb2fecc5cfd8d3ce31a1c", - "ffffb2fecc5cfd8d3cf03b20bd0026", - "ffffb2fed976feb24cfd8d3cf03b20bd0026", - "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", - "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", - "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" -).map(colors); + return scale; +} -var YlOrRd = ramp(scheme$k); +function linear() { + var scale = continuous(); -var scheme$l = new Array(3).concat( - "deebf79ecae13182bd", - "eff3ffbdd7e76baed62171b5", - "eff3ffbdd7e76baed63182bd08519c", - "eff3ffc6dbef9ecae16baed63182bd08519c", - "eff3ffc6dbef9ecae16baed64292c62171b5084594", - "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", - "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" -).map(colors); + scale.copy = function() { + return copy$1(scale, linear()); + }; -var Blues = ramp(scheme$l); + initRange.apply(scale, arguments); -var scheme$m = new Array(3).concat( - "e5f5e0a1d99b31a354", - "edf8e9bae4b374c476238b45", - "edf8e9bae4b374c47631a354006d2c", - "edf8e9c7e9c0a1d99b74c47631a354006d2c", - "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", - "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", - "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" -).map(colors); + return linearish(scale); +} -var Greens = ramp(scheme$m); +function identity(domain) { + var unknown; -var scheme$n = new Array(3).concat( - "f0f0f0bdbdbd636363", - "f7f7f7cccccc969696525252", - "f7f7f7cccccc969696636363252525", - "f7f7f7d9d9d9bdbdbd969696636363252525", - "f7f7f7d9d9d9bdbdbd969696737373525252252525", - "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", - "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" -).map(colors); + function scale(x) { + return x == null || isNaN(x = +x) ? unknown : x; + } + + scale.invert = scale; -var Greys = ramp(scheme$n); + scale.domain = scale.range = function(_) { + return arguments.length ? (domain = Array.from(_, number$1), scale) : domain.slice(); + }; -var scheme$o = new Array(3).concat( - "efedf5bcbddc756bb1", - "f2f0f7cbc9e29e9ac86a51a3", - "f2f0f7cbc9e29e9ac8756bb154278f", - "f2f0f7dadaebbcbddc9e9ac8756bb154278f", - "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", - "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", - "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" -).map(colors); + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; + }; -var Purples = ramp(scheme$o); + scale.copy = function() { + return identity(domain).unknown(unknown); + }; -var scheme$p = new Array(3).concat( - "fee0d2fc9272de2d26", - "fee5d9fcae91fb6a4acb181d", - "fee5d9fcae91fb6a4ade2d26a50f15", - "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", - "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", - "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", - "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" -).map(colors); + domain = arguments.length ? Array.from(domain, number$1) : [0, 1]; -var Reds = ramp(scheme$p); + return linearish(scale); +} -var scheme$q = new Array(3).concat( - "fee6cefdae6be6550d", - "feeddefdbe85fd8d3cd94701", - "feeddefdbe85fd8d3ce6550da63603", - "feeddefdd0a2fdae6bfd8d3ce6550da63603", - "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", - "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", - "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" -).map(colors); +function nice(domain, interval) { + domain = domain.slice(); -var Oranges = ramp(scheme$q); + var i0 = 0, + i1 = domain.length - 1, + x0 = domain[i0], + x1 = domain[i1], + t; -function cividis(t) { - t = Math.max(0, Math.min(1, t)); - return "rgb(" - + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " - + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " - + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) - + ")"; -} + if (x1 < x0) { + t = i0, i0 = i1, i1 = t; + t = x0, x0 = x1, x1 = t; + } -var cubehelix = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); + domain[i0] = interval.floor(x0); + domain[i1] = interval.ceil(x1); + return domain; +} -var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); +function transformLog(x) { + return Math.log(x); +} -var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); +function transformExp(x) { + return Math.exp(x); +} -var c = d3Color.cubehelix(); +function transformLogn(x) { + return -Math.log(-x); +} -function rainbow(t) { - if (t < 0 || t > 1) t -= Math.floor(t); - var ts = Math.abs(t - 0.5); - c.h = 360 * t - 100; - c.s = 1.5 - 1.5 * ts; - c.l = 0.8 - 0.9 * ts; - return c + ""; +function transformExpn(x) { + return -Math.exp(-x); } -var c$1 = d3Color.rgb(), - pi_1_3 = Math.PI / 3, - pi_2_3 = Math.PI * 2 / 3; +function pow10(x) { + return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x; +} -function sinebow(t) { - var x; - t = (0.5 - t) * Math.PI; - c$1.r = 255 * (x = Math.sin(t)) * x; - c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; - c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; - return c$1 + ""; +function powp(base) { + return base === 10 ? pow10 + : base === Math.E ? Math.exp + : function(x) { return Math.pow(base, x); }; } -function turbo(t) { - t = Math.max(0, Math.min(1, t)); - return "rgb(" - + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " - + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " - + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) - + ")"; +function logp(base) { + return base === Math.E ? Math.log + : base === 10 && Math.log10 + || base === 2 && Math.log2 + || (base = Math.log(base), function(x) { return Math.log(x) / base; }); } -function ramp$1(range) { - var n = range.length; - return function(t) { - return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; +function reflect(f) { + return function(x) { + return -f(-x); }; } -var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); +function loggish(transform) { + var scale = transform(transformLog, transformExp), + domain = scale.domain, + base = 10, + logs, + pows; -var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + function rescale() { + logs = logp(base), pows = powp(base); + if (domain()[0] < 0) { + logs = reflect(logs), pows = reflect(pows); + transform(transformLogn, transformExpn); + } else { + transform(transformLog, transformExp); + } + return scale; + } -var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + scale.base = function(_) { + return arguments.length ? (base = +_, rescale()) : base; + }; -var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + scale.domain = function(_) { + return arguments.length ? (domain(_), rescale()) : domain(); + }; -exports.interpolateBlues = Blues; -exports.interpolateBrBG = BrBG; -exports.interpolateBuGn = BuGn; -exports.interpolateBuPu = BuPu; -exports.interpolateCividis = cividis; -exports.interpolateCool = cool; -exports.interpolateCubehelixDefault = cubehelix; -exports.interpolateGnBu = GnBu; -exports.interpolateGreens = Greens; -exports.interpolateGreys = Greys; -exports.interpolateInferno = inferno; -exports.interpolateMagma = magma; -exports.interpolateOrRd = OrRd; -exports.interpolateOranges = Oranges; -exports.interpolatePRGn = PRGn; -exports.interpolatePiYG = PiYG; -exports.interpolatePlasma = plasma; -exports.interpolatePuBu = PuBu; -exports.interpolatePuBuGn = PuBuGn; -exports.interpolatePuOr = PuOr; -exports.interpolatePuRd = PuRd; -exports.interpolatePurples = Purples; -exports.interpolateRainbow = rainbow; -exports.interpolateRdBu = RdBu; -exports.interpolateRdGy = RdGy; -exports.interpolateRdPu = RdPu; -exports.interpolateRdYlBu = RdYlBu; -exports.interpolateRdYlGn = RdYlGn; -exports.interpolateReds = Reds; -exports.interpolateSinebow = sinebow; -exports.interpolateSpectral = Spectral; -exports.interpolateTurbo = turbo; -exports.interpolateViridis = viridis; -exports.interpolateWarm = warm; -exports.interpolateYlGn = YlGn; -exports.interpolateYlGnBu = YlGnBu; -exports.interpolateYlOrBr = YlOrBr; -exports.interpolateYlOrRd = YlOrRd; -exports.schemeAccent = Accent; -exports.schemeBlues = scheme$l; -exports.schemeBrBG = scheme; -exports.schemeBuGn = scheme$9; -exports.schemeBuPu = scheme$a; -exports.schemeCategory10 = category10; -exports.schemeDark2 = Dark2; -exports.schemeGnBu = scheme$b; -exports.schemeGreens = scheme$m; -exports.schemeGreys = scheme$n; -exports.schemeOrRd = scheme$c; -exports.schemeOranges = scheme$q; -exports.schemePRGn = scheme$1; -exports.schemePaired = Paired; -exports.schemePastel1 = Pastel1; -exports.schemePastel2 = Pastel2; -exports.schemePiYG = scheme$2; -exports.schemePuBu = scheme$e; -exports.schemePuBuGn = scheme$d; -exports.schemePuOr = scheme$3; -exports.schemePuRd = scheme$f; -exports.schemePurples = scheme$o; -exports.schemeRdBu = scheme$4; -exports.schemeRdGy = scheme$5; -exports.schemeRdPu = scheme$g; -exports.schemeRdYlBu = scheme$6; -exports.schemeRdYlGn = scheme$7; -exports.schemeReds = scheme$p; -exports.schemeSet1 = Set1; -exports.schemeSet2 = Set2; -exports.schemeSet3 = Set3; -exports.schemeSpectral = scheme$8; -exports.schemeTableau10 = Tableau10; -exports.schemeYlGn = scheme$i; -exports.schemeYlGnBu = scheme$h; -exports.schemeYlOrBr = scheme$j; -exports.schemeYlOrRd = scheme$k; + scale.ticks = function(count) { + var d = domain(), + u = d[0], + v = d[d.length - 1], + r; + + if (r = v < u) i = u, u = v, v = i; + + var i = logs(u), + j = logs(v), + p, + k, + t, + n = count == null ? 10 : +count, + z = []; + + if (!(base % 1) && j - i < n) { + i = Math.floor(i), j = Math.ceil(j); + if (u > 0) for (; i <= j; ++i) { + for (k = 1, p = pows(i); k < base; ++k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } else for (; i <= j; ++i) { + for (k = base - 1, p = pows(i); k >= 1; --k) { + t = p * k; + if (t < u) continue; + if (t > v) break; + z.push(t); + } + } + if (z.length * 2 < n) z = d3Array.ticks(u, v, n); + } else { + z = d3Array.ticks(i, j, Math.min(j - i, n)).map(pows); + } -Object.defineProperty(exports, '__esModule', { value: true }); + return r ? z.reverse() : z; + }; -})); -}); + scale.tickFormat = function(count, specifier) { + if (specifier == null) specifier = base === 10 ? ".0e" : ","; + if (typeof specifier !== "function") specifier = d3Format.format(specifier); + if (count === Infinity) return specifier; + if (count == null) count = 10; + var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate? + return function(d) { + var i = d / pows(Math.round(logs(d))); + if (i * base < base - 0.5) i *= base; + return i <= k ? specifier(d) : ""; + }; + }; -var d3Shape = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-shape/ v2.1.0 Copyright 2021 Mike Bostock -(function (global, factory) { -factory(exports, d3Path) ; -}(commonjsGlobal, (function (exports, d3Path) { -function constant(x) { - return function constant() { - return x; + scale.nice = function() { + return domain(nice(domain(), { + floor: function(x) { return pows(Math.floor(logs(x))); }, + ceil: function(x) { return pows(Math.ceil(logs(x))); } + })); }; + + return scale; } -var abs = Math.abs; -var atan2 = Math.atan2; -var cos = Math.cos; -var max = Math.max; -var min = Math.min; -var sin = Math.sin; -var sqrt = Math.sqrt; +function log() { + var scale = loggish(transformer$2()).domain([1, 10]); -var epsilon = 1e-12; -var pi = Math.PI; -var halfPi = pi / 2; -var tau = 2 * pi; + scale.copy = function() { + return copy$1(scale, log()).base(scale.base()); + }; -function acos(x) { - return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); -} + initRange.apply(scale, arguments); -function asin(x) { - return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); + return scale; } -function arcInnerRadius(d) { - return d.innerRadius; +function transformSymlog(c) { + return function(x) { + return Math.sign(x) * Math.log1p(Math.abs(x / c)); + }; } -function arcOuterRadius(d) { - return d.outerRadius; +function transformSymexp(c) { + return function(x) { + return Math.sign(x) * Math.expm1(Math.abs(x)) * c; + }; } -function arcStartAngle(d) { - return d.startAngle; -} +function symlogish(transform) { + var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); -function arcEndAngle(d) { - return d.endAngle; -} + scale.constant = function(_) { + return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; + }; -function arcPadAngle(d) { - return d && d.padAngle; // Note: optional! + return linearish(scale); } -function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { - var x10 = x1 - x0, y10 = y1 - y0, - x32 = x3 - x2, y32 = y3 - y2, - t = y32 * x10 - x32 * y10; - if (t * t < epsilon) return; - t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; - return [x0 + t * x10, y0 + t * y10]; -} +function symlog() { + var scale = symlogish(transformer$2()); -// Compute perpendicular offset line of length rc. -// http://mathworld.wolfram.com/Circle-LineIntersection.html -function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { - var x01 = x0 - x1, - y01 = y0 - y1, - lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), - ox = lo * y01, - oy = -lo * x01, - x11 = x0 + ox, - y11 = y0 + oy, - x10 = x1 + ox, - y10 = y1 + oy, - x00 = (x11 + x10) / 2, - y00 = (y11 + y10) / 2, - dx = x10 - x11, - dy = y10 - y11, - d2 = dx * dx + dy * dy, - r = r1 - rc, - D = x11 * y10 - x10 * y11, - d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), - cx0 = (D * dy - dx * d) / d2, - cy0 = (-D * dx - dy * d) / d2, - cx1 = (D * dy + dx * d) / d2, - cy1 = (-D * dx + dy * d) / d2, - dx0 = cx0 - x00, - dy0 = cy0 - y00, - dx1 = cx1 - x00, - dy1 = cy1 - y00; + scale.copy = function() { + return copy$1(scale, symlog()).constant(scale.constant()); + }; - // Pick the closer of the two intersection points. - // TODO Is there a faster way to determine which intersection to use? - if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; + return initRange.apply(scale, arguments); +} - return { - cx: cx0, - cy: cy0, - x01: -ox, - y01: -oy, - x11: cx0 * (r1 / r - 1), - y11: cy0 * (r1 / r - 1) +function transformPow(exponent) { + return function(x) { + return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); }; } -function arc() { - var innerRadius = arcInnerRadius, - outerRadius = arcOuterRadius, - cornerRadius = constant(0), - padRadius = null, - startAngle = arcStartAngle, - endAngle = arcEndAngle, - padAngle = arcPadAngle, - context = null; - - function arc() { - var buffer, - r, - r0 = +innerRadius.apply(this, arguments), - r1 = +outerRadius.apply(this, arguments), - a0 = startAngle.apply(this, arguments) - halfPi, - a1 = endAngle.apply(this, arguments) - halfPi, - da = abs(a1 - a0), - cw = a1 > a0; - - if (!context) context = buffer = d3Path.path(); - - // Ensure that the outer radius is always larger than the inner radius. - if (r1 < r0) r = r1, r1 = r0, r0 = r; - - // Is it a point? - if (!(r1 > epsilon)) context.moveTo(0, 0); - - // Or is it a circle or annulus? - else if (da > tau - epsilon) { - context.moveTo(r1 * cos(a0), r1 * sin(a0)); - context.arc(0, 0, r1, a0, a1, !cw); - if (r0 > epsilon) { - context.moveTo(r0 * cos(a1), r0 * sin(a1)); - context.arc(0, 0, r0, a1, a0, cw); - } - } - - // Or is it a circular or annular sector? - else { - var a01 = a0, - a11 = a1, - a00 = a0, - a10 = a1, - da0 = da, - da1 = da, - ap = padAngle.apply(this, arguments) / 2, - rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), - rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), - rc0 = rc, - rc1 = rc, - t0, - t1; - - // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. - if (rp > epsilon) { - var p0 = asin(rp / r0 * sin(ap)), - p1 = asin(rp / r1 * sin(ap)); - if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; - else da0 = 0, a00 = a10 = (a0 + a1) / 2; - if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; - else da1 = 0, a01 = a11 = (a0 + a1) / 2; - } +function transformSqrt(x) { + return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); +} - var x01 = r1 * cos(a01), - y01 = r1 * sin(a01), - x10 = r0 * cos(a10), - y10 = r0 * sin(a10); +function transformSquare(x) { + return x < 0 ? -x * x : x * x; +} - // Apply rounded corners? - if (rc > epsilon) { - var x11 = r1 * cos(a11), - y11 = r1 * sin(a11), - x00 = r0 * cos(a00), - y00 = r0 * sin(a00), - oc; +function powish(transform) { + var scale = transform(identity$1, identity$1), + exponent = 1; - // Restrict the corner radius according to the sector angle. - if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { - var ax = x01 - oc[0], - ay = y01 - oc[1], - bx = x11 - oc[0], - by = y11 - oc[1], - kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), - lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); - rc0 = min(rc, (r0 - lc) / (kc - 1)); - rc1 = min(rc, (r1 - lc) / (kc + 1)); - } - } + function rescale() { + return exponent === 1 ? transform(identity$1, identity$1) + : exponent === 0.5 ? transform(transformSqrt, transformSquare) + : transform(transformPow(exponent), transformPow(1 / exponent)); + } - // Is the sector collapsed to a line? - if (!(da1 > epsilon)) context.moveTo(x01, y01); + scale.exponent = function(_) { + return arguments.length ? (exponent = +_, rescale()) : exponent; + }; - // Does the sector’s outer ring have rounded corners? - else if (rc1 > epsilon) { - t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); - t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); + return linearish(scale); +} - context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); +function pow() { + var scale = powish(transformer$2()); - // Have the corners merged? - if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); + scale.copy = function() { + return copy$1(scale, pow()).exponent(scale.exponent()); + }; - // Otherwise, draw the two corners and the ring. - else { - context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); - context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); - context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); - } - } + initRange.apply(scale, arguments); - // Or is the outer ring just a circular arc? - else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); + return scale; +} - // Is there no inner ring, and it’s a circular sector? - // Or perhaps it’s an annular sector collapsed due to padding? - if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); +function sqrt() { + return pow.apply(null, arguments).exponent(0.5); +} - // Does the sector’s inner ring (or point) have rounded corners? - else if (rc0 > epsilon) { - t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); - t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); +function square(x) { + return Math.sign(x) * x * x; +} - context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); +function unsquare(x) { + return Math.sign(x) * Math.sqrt(Math.abs(x)); +} - // Have the corners merged? - if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); +function radial() { + var squared = continuous(), + range = [0, 1], + round = false, + unknown; - // Otherwise, draw the two corners and the ring. - else { - context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); - context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); - context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); - } - } + function scale(x) { + var y = unsquare(squared(x)); + return isNaN(y) ? unknown : round ? Math.round(y) : y; + } - // Or is the inner ring just a circular arc? - else context.arc(0, 0, r0, a10, a00, cw); - } + scale.invert = function(y) { + return squared.invert(square(y)); + }; - context.closePath(); + scale.domain = function(_) { + return arguments.length ? (squared.domain(_), scale) : squared.domain(); + }; - if (buffer) return context = null, buffer + "" || null; - } + scale.range = function(_) { + return arguments.length ? (squared.range((range = Array.from(_, number$1)).map(square)), scale) : range.slice(); + }; - arc.centroid = function() { - var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, - a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; - return [cos(a) * r, sin(a) * r]; + scale.rangeRound = function(_) { + return scale.range(_).round(true); }; - arc.innerRadius = function(_) { - return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + scale.round = function(_) { + return arguments.length ? (round = !!_, scale) : round; }; - arc.outerRadius = function(_) { - return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + scale.clamp = function(_) { + return arguments.length ? (squared.clamp(_), scale) : squared.clamp(); }; - arc.cornerRadius = function(_) { - return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; }; - arc.padRadius = function(_) { - return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + scale.copy = function() { + return radial(squared.domain(), range) + .round(round) + .clamp(squared.clamp()) + .unknown(unknown); }; - arc.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + initRange.apply(scale, arguments); + + return linearish(scale); +} + +function quantile() { + var domain = [], + range = [], + thresholds = [], + unknown; + + function rescale() { + var i = 0, n = Math.max(1, range.length); + thresholds = new Array(n - 1); + while (++i < n) thresholds[i - 1] = d3Array.quantileSorted(domain, i / n); + return scale; + } + + function scale(x) { + return x == null || isNaN(x = +x) ? unknown : range[d3Array.bisect(thresholds, x)]; + } + + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] : [ + i > 0 ? thresholds[i - 1] : domain[0], + i < thresholds.length ? thresholds[i] : domain[domain.length - 1] + ]; }; - arc.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return rescale(); }; - arc.padAngle = function(_) { - return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), rescale()) : range.slice(); }; - arc.context = function(_) { - return arguments.length ? ((context = _ == null ? null : _), arc) : context; + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; }; - return arc; -} + scale.quantiles = function() { + return thresholds.slice(); + }; -var slice = Array.prototype.slice; + scale.copy = function() { + return quantile() + .domain(domain) + .range(range) + .unknown(unknown); + }; -function array(x) { - return typeof x === "object" && "length" in x - ? x // Array, TypedArray, NodeList, array-like - : Array.from(x); // Map, Set, iterable, string, or anything else + return initRange.apply(scale, arguments); } -function Linear(context) { - this._context = context; -} +function quantize() { + var x0 = 0, + x1 = 1, + n = 1, + domain = [0.5], + range = [0, 1], + unknown; -Linear.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; // proceed - default: this._context.lineTo(x, y); break; - } + function scale(x) { + return x != null && x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; } -}; -function curveLinear(context) { - return new Linear(context); -} + function rescale() { + var i = -1; + domain = new Array(n); + while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1); + return scale; + } -function x(p) { - return p[0]; -} + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, x0 = +x0, x1 = +x1, rescale()) : [x0, x1]; + }; -function y(p) { - return p[1]; -} + scale.range = function(_) { + return arguments.length ? (n = (range = Array.from(_)).length - 1, rescale()) : range.slice(); + }; -function line(x$1, y$1) { - var defined = constant(true), - context = null, - curve = curveLinear, - output = null; + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return i < 0 ? [NaN, NaN] + : i < 1 ? [x0, domain[0]] + : i >= n ? [domain[n - 1], x1] + : [domain[i - 1], domain[i]]; + }; - x$1 = typeof x$1 === "function" ? x$1 : (x$1 === undefined) ? x : constant(x$1); - y$1 = typeof y$1 === "function" ? y$1 : (y$1 === undefined) ? y : constant(y$1); + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : scale; + }; - function line(data) { - var i, - n = (data = array(data)).length, - d, - defined0 = false, - buffer; + scale.thresholds = function() { + return domain.slice(); + }; - if (context == null) output = curve(buffer = d3Path.path()); + scale.copy = function() { + return quantize() + .domain([x0, x1]) + .range(range) + .unknown(unknown); + }; - for (i = 0; i <= n; ++i) { - if (!(i < n && defined(d = data[i], i, data)) === defined0) { - if (defined0 = !defined0) output.lineStart(); - else output.lineEnd(); - } - if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); - } + return initRange.apply(linearish(scale), arguments); +} + +function threshold() { + var domain = [0.5], + range = [0, 1], + unknown, + n = 1; - if (buffer) return output = null, buffer + "" || null; + function scale(x) { + return x != null && x <= x ? range[d3Array.bisect(domain, x, 0, n)] : unknown; } - line.x = function(_) { - return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), line) : x$1; + scale.domain = function(_) { + return arguments.length ? (domain = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : domain.slice(); }; - line.y = function(_) { - return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), line) : y$1; + scale.range = function(_) { + return arguments.length ? (range = Array.from(_), n = Math.min(domain.length, range.length - 1), scale) : range.slice(); }; - line.defined = function(_) { - return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; + scale.invertExtent = function(y) { + var i = range.indexOf(y); + return [domain[i - 1], domain[i]]; }; - line.curve = function(_) { - return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; }; - line.context = function(_) { - return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + scale.copy = function() { + return threshold() + .domain(domain) + .range(range) + .unknown(unknown); }; - return line; + return initRange.apply(scale, arguments); } -function area(x0, y0, y1) { - var x1 = null, - defined = constant(true), - context = null, - curve = curveLinear, - output = null; - - x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? x : constant(+x0); - y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? constant(0) : constant(+y0); - y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? y : constant(+y1); - - function area(data) { - var i, - j, - k, - n = (data = array(data)).length, - d, - defined0 = false, - buffer, - x0z = new Array(n), - y0z = new Array(n); +function date(t) { + return new Date(t); +} - if (context == null) output = curve(buffer = d3Path.path()); +function number(t) { + return t instanceof Date ? +t : +new Date(+t); +} - for (i = 0; i <= n; ++i) { - if (!(i < n && defined(d = data[i], i, data)) === defined0) { - if (defined0 = !defined0) { - j = i; - output.areaStart(); - output.lineStart(); - } else { - output.lineEnd(); - output.lineStart(); - for (k = i - 1; k >= j; --k) { - output.point(x0z[k], y0z[k]); - } - output.lineEnd(); - output.areaEnd(); - } - } - if (defined0) { - x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); - output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); - } - } +function calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format) { + var scale = continuous(), + invert = scale.invert, + domain = scale.domain; - if (buffer) return output = null, buffer + "" || null; - } + var formatMillisecond = format(".%L"), + formatSecond = format(":%S"), + formatMinute = format("%I:%M"), + formatHour = format("%I %p"), + formatDay = format("%a %d"), + formatWeek = format("%b %d"), + formatMonth = format("%B"), + formatYear = format("%Y"); - function arealine() { - return line().defined(defined).curve(curve).context(context); + function tickFormat(date) { + return (second(date) < date ? formatMillisecond + : minute(date) < date ? formatSecond + : hour(date) < date ? formatMinute + : day(date) < date ? formatHour + : month(date) < date ? (week(date) < date ? formatDay : formatWeek) + : year(date) < date ? formatMonth + : formatYear)(date); } - area.x = function(_) { - return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; + scale.invert = function(y) { + return new Date(invert(y)); }; - area.x0 = function(_) { - return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; + scale.domain = function(_) { + return arguments.length ? domain(Array.from(_, number)) : domain().map(date); }; - area.x1 = function(_) { - return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; + scale.ticks = function(interval) { + var d = domain(); + return ticks(d[0], d[d.length - 1], interval == null ? 10 : interval); }; - area.y = function(_) { - return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; + scale.tickFormat = function(count, specifier) { + return specifier == null ? tickFormat : format(specifier); }; - area.y0 = function(_) { - return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; + scale.nice = function(interval) { + var d = domain(); + if (!interval || typeof interval.range !== "function") interval = tickInterval(d[0], d[d.length - 1], interval == null ? 10 : interval); + return interval ? domain(nice(d, interval)) : scale; }; - area.y1 = function(_) { - return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; + scale.copy = function() { + return copy$1(scale, calendar(ticks, tickInterval, year, month, week, day, hour, minute, second, format)); }; - area.lineX0 = - area.lineY0 = function() { - return arealine().x(x0).y(y0); + return scale; +} + +function time() { + return initRange.apply(calendar(d3Time.timeTicks, d3Time.timeTickInterval, d3Time.timeYear, d3Time.timeMonth, d3Time.timeWeek, d3Time.timeDay, d3Time.timeHour, d3Time.timeMinute, d3Time.timeSecond, d3TimeFormat.timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]), arguments); +} + +function utcTime() { + return initRange.apply(calendar(d3Time.utcTicks, d3Time.utcTickInterval, d3Time.utcYear, d3Time.utcMonth, d3Time.utcWeek, d3Time.utcDay, d3Time.utcHour, d3Time.utcMinute, d3Time.utcSecond, d3TimeFormat.utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]), arguments); +} + +function transformer$1() { + var x0 = 0, + x1 = 1, + t0, + t1, + k10, + transform, + interpolator = identity$1, + clamp = false, + unknown; + + function scale(x) { + return x == null || isNaN(x = +x) ? unknown : interpolator(k10 === 0 ? 0.5 : (x = (transform(x) - t0) * k10, clamp ? Math.max(0, Math.min(1, x)) : x)); + } + + scale.domain = function(_) { + return arguments.length ? ([x0, x1] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0), scale) : [x0, x1]; }; - area.lineY1 = function() { - return arealine().x(x0).y(y1); + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; }; - area.lineX1 = function() { - return arealine().x(x1).y(y0); + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; }; - area.defined = function(_) { - return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; + function range(interpolate) { + return function(_) { + var r0, r1; + return arguments.length ? ([r0, r1] = _, interpolator = interpolate(r0, r1), scale) : [interpolator(0), interpolator(1)]; + }; + } + + scale.range = range(d3Interpolate.interpolate); + + scale.rangeRound = range(d3Interpolate.interpolateRound); + + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; }; - area.curve = function(_) { - return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), k10 = t0 === t1 ? 0 : 1 / (t1 - t0); + return scale; }; +} - area.context = function(_) { - return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; +function copy(source, target) { + return target + .domain(source.domain()) + .interpolator(source.interpolator()) + .clamp(source.clamp()) + .unknown(source.unknown()); +} + +function sequential() { + var scale = linearish(transformer$1()(identity$1)); + + scale.copy = function() { + return copy(scale, sequential()); }; - return area; + return initInterpolator.apply(scale, arguments); } -function descending$1(a, b) { - return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; +function sequentialLog() { + var scale = loggish(transformer$1()).domain([1, 10]); + + scale.copy = function() { + return copy(scale, sequentialLog()).base(scale.base()); + }; + + return initInterpolator.apply(scale, arguments); } -function identity(d) { - return d; +function sequentialSymlog() { + var scale = symlogish(transformer$1()); + + scale.copy = function() { + return copy(scale, sequentialSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); } -function pie() { - var value = identity, - sortValues = descending$1, - sort = null, - startAngle = constant(0), - endAngle = constant(tau), - padAngle = constant(0); +function sequentialPow() { + var scale = powish(transformer$1()); - function pie(data) { - var i, - n = (data = array(data)).length, - j, - k, - sum = 0, - index = new Array(n), - arcs = new Array(n), - a0 = +startAngle.apply(this, arguments), - da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), - a1, - p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), - pa = p * (da < 0 ? -1 : 1), - v; + scale.copy = function() { + return copy(scale, sequentialPow()).exponent(scale.exponent()); + }; - for (i = 0; i < n; ++i) { - if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { - sum += v; - } - } + return initInterpolator.apply(scale, arguments); +} - // Optionally sort the arcs by previously-computed values or by data. - if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); - else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); +function sequentialSqrt() { + return sequentialPow.apply(null, arguments).exponent(0.5); +} - // Compute the arcs! They are stored in the original data's order. - for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { - j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { - data: data[j], - index: i, - value: v, - startAngle: a0, - endAngle: a1, - padAngle: p - }; - } +function sequentialQuantile() { + var domain = [], + interpolator = identity$1; - return arcs; + function scale(x) { + if (x != null && !isNaN(x = +x)) return interpolator((d3Array.bisect(domain, x, 1) - 1) / (domain.length - 1)); } - pie.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; - }; - - pie.sortValues = function(_) { - return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; + scale.domain = function(_) { + if (!arguments.length) return domain.slice(); + domain = []; + for (let d of _) if (d != null && !isNaN(d = +d)) domain.push(d); + domain.sort(d3Array.ascending); + return scale; }; - pie.sort = function(_) { - return arguments.length ? (sort = _, sortValues = null, pie) : sort; + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; }; - pie.startAngle = function(_) { - return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; + scale.range = function() { + return domain.map((d, i) => interpolator(i / (domain.length - 1))); }; - pie.endAngle = function(_) { - return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; + scale.quantiles = function(n) { + return Array.from({length: n + 1}, (_, i) => d3Array.quantile(domain, i / n)); }; - pie.padAngle = function(_) { - return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; + scale.copy = function() { + return sequentialQuantile(interpolator).domain(domain); }; - return pie; + return initInterpolator.apply(scale, arguments); } -var curveRadialLinear = curveRadial$1(curveLinear); - -function Radial(curve) { - this._curve = curve; -} +function transformer() { + var x0 = 0, + x1 = 0.5, + x2 = 1, + s = 1, + t0, + t1, + t2, + k10, + k21, + interpolator = identity$1, + transform, + clamp = false, + unknown; -Radial.prototype = { - areaStart: function() { - this._curve.areaStart(); - }, - areaEnd: function() { - this._curve.areaEnd(); - }, - lineStart: function() { - this._curve.lineStart(); - }, - lineEnd: function() { - this._curve.lineEnd(); - }, - point: function(a, r) { - this._curve.point(r * Math.sin(a), r * -Math.cos(a)); + function scale(x) { + return isNaN(x = +x) ? unknown : (x = 0.5 + ((x = +transform(x)) - t1) * (s * x < s * t1 ? k10 : k21), interpolator(clamp ? Math.max(0, Math.min(1, x)) : x)); } -}; -function curveRadial$1(curve) { + scale.domain = function(_) { + return arguments.length ? ([x0, x1, x2] = _, t0 = transform(x0 = +x0), t1 = transform(x1 = +x1), t2 = transform(x2 = +x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1, scale) : [x0, x1, x2]; + }; - function radial(context) { - return new Radial(curve(context)); - } + scale.clamp = function(_) { + return arguments.length ? (clamp = !!_, scale) : clamp; + }; - radial._curve = curve; + scale.interpolator = function(_) { + return arguments.length ? (interpolator = _, scale) : interpolator; + }; - return radial; -} + function range(interpolate) { + return function(_) { + var r0, r1, r2; + return arguments.length ? ([r0, r1, r2] = _, interpolator = d3Interpolate.piecewise(interpolate, [r0, r1, r2]), scale) : [interpolator(0), interpolator(0.5), interpolator(1)]; + }; + } -function lineRadial(l) { - var c = l.curve; + scale.range = range(d3Interpolate.interpolate); - l.angle = l.x, delete l.x; - l.radius = l.y, delete l.y; + scale.rangeRound = range(d3Interpolate.interpolateRound); - l.curve = function(_) { - return arguments.length ? c(curveRadial$1(_)) : c()._curve; + scale.unknown = function(_) { + return arguments.length ? (unknown = _, scale) : unknown; }; - return l; + return function(t) { + transform = t, t0 = t(x0), t1 = t(x1), t2 = t(x2), k10 = t0 === t1 ? 0 : 0.5 / (t1 - t0), k21 = t1 === t2 ? 0 : 0.5 / (t2 - t1), s = t1 < t0 ? -1 : 1; + return scale; + }; } -function lineRadial$1() { - return lineRadial(line().curve(curveRadialLinear)); -} +function diverging() { + var scale = linearish(transformer()(identity$1)); -function areaRadial() { - var a = area().curve(curveRadialLinear), - c = a.curve, - x0 = a.lineX0, - x1 = a.lineX1, - y0 = a.lineY0, - y1 = a.lineY1; + scale.copy = function() { + return copy(scale, diverging()); + }; - a.angle = a.x, delete a.x; - a.startAngle = a.x0, delete a.x0; - a.endAngle = a.x1, delete a.x1; - a.radius = a.y, delete a.y; - a.innerRadius = a.y0, delete a.y0; - a.outerRadius = a.y1, delete a.y1; - a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; - a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; - a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; - a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + return initInterpolator.apply(scale, arguments); +} - a.curve = function(_) { - return arguments.length ? c(curveRadial$1(_)) : c()._curve; +function divergingLog() { + var scale = loggish(transformer()).domain([0.1, 1, 10]); + + scale.copy = function() { + return copy(scale, divergingLog()).base(scale.base()); }; - return a; + return initInterpolator.apply(scale, arguments); } -function pointRadial(x, y) { - return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; -} +function divergingSymlog() { + var scale = symlogish(transformer()); -function linkSource(d) { - return d.source; + scale.copy = function() { + return copy(scale, divergingSymlog()).constant(scale.constant()); + }; + + return initInterpolator.apply(scale, arguments); } -function linkTarget(d) { - return d.target; +function divergingPow() { + var scale = powish(transformer()); + + scale.copy = function() { + return copy(scale, divergingPow()).exponent(scale.exponent()); + }; + + return initInterpolator.apply(scale, arguments); } -function link(curve) { - var source = linkSource, - target = linkTarget, - x$1 = x, - y$1 = y, - context = null; +function divergingSqrt() { + return divergingPow.apply(null, arguments).exponent(0.5); +} - function link() { - var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); - if (!context) context = buffer = d3Path.path(); - curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); - if (buffer) return context = null, buffer + "" || null; - } +exports.scaleBand = band; +exports.scaleDiverging = diverging; +exports.scaleDivergingLog = divergingLog; +exports.scaleDivergingPow = divergingPow; +exports.scaleDivergingSqrt = divergingSqrt; +exports.scaleDivergingSymlog = divergingSymlog; +exports.scaleIdentity = identity; +exports.scaleImplicit = implicit; +exports.scaleLinear = linear; +exports.scaleLog = log; +exports.scaleOrdinal = ordinal; +exports.scalePoint = point; +exports.scalePow = pow; +exports.scaleQuantile = quantile; +exports.scaleQuantize = quantize; +exports.scaleRadial = radial; +exports.scaleSequential = sequential; +exports.scaleSequentialLog = sequentialLog; +exports.scaleSequentialPow = sequentialPow; +exports.scaleSequentialQuantile = sequentialQuantile; +exports.scaleSequentialSqrt = sequentialSqrt; +exports.scaleSequentialSymlog = sequentialSymlog; +exports.scaleSqrt = sqrt; +exports.scaleSymlog = symlog; +exports.scaleThreshold = threshold; +exports.scaleTime = time; +exports.scaleUtc = utcTime; +exports.tickFormat = tickFormat; - link.source = function(_) { - return arguments.length ? (source = _, link) : source; - }; +Object.defineProperty(exports, '__esModule', { value: true }); - link.target = function(_) { - return arguments.length ? (target = _, link) : target; - }; +}))); +}); - link.x = function(_) { - return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link) : x$1; - }; +var d3ScaleChromatic = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-scale-chromatic/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Interpolate, d3Color) ; +}(commonjsGlobal, function (exports, d3Interpolate, d3Color) { +function colors(specifier) { + var n = specifier.length / 6 | 0, colors = new Array(n), i = 0; + while (i < n) colors[i] = "#" + specifier.slice(i * 6, ++i * 6); + return colors; +} - link.y = function(_) { - return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link) : y$1; - }; +var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"); - link.context = function(_) { - return arguments.length ? ((context = _ == null ? null : _), link) : context; - }; +var Accent = colors("7fc97fbeaed4fdc086ffff99386cb0f0027fbf5b17666666"); - return link; -} +var Dark2 = colors("1b9e77d95f027570b3e7298a66a61ee6ab02a6761d666666"); -function curveHorizontal(context, x0, y0, x1, y1) { - context.moveTo(x0, y0); - context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); -} +var Paired = colors("a6cee31f78b4b2df8a33a02cfb9a99e31a1cfdbf6fff7f00cab2d66a3d9affff99b15928"); -function curveVertical(context, x0, y0, x1, y1) { - context.moveTo(x0, y0); - context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); -} +var Pastel1 = colors("fbb4aeb3cde3ccebc5decbe4fed9a6ffffcce5d8bdfddaecf2f2f2"); -function curveRadial(context, x0, y0, x1, y1) { - var p0 = pointRadial(x0, y0), - p1 = pointRadial(x0, y0 = (y0 + y1) / 2), - p2 = pointRadial(x1, y0), - p3 = pointRadial(x1, y1); - context.moveTo(p0[0], p0[1]); - context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); -} +var Pastel2 = colors("b3e2cdfdcdaccbd5e8f4cae4e6f5c9fff2aef1e2cccccccc"); -function linkHorizontal() { - return link(curveHorizontal); -} +var Set1 = colors("e41a1c377eb84daf4a984ea3ff7f00ffff33a65628f781bf999999"); -function linkVertical() { - return link(curveVertical); -} +var Set2 = colors("66c2a5fc8d628da0cbe78ac3a6d854ffd92fe5c494b3b3b3"); -function linkRadial() { - var l = link(curveRadial); - l.angle = l.x, delete l.x; - l.radius = l.y, delete l.y; - return l; -} +var Set3 = colors("8dd3c7ffffb3bebadafb807280b1d3fdb462b3de69fccde5d9d9d9bc80bdccebc5ffed6f"); -var circle = { - draw: function(context, size) { - var r = Math.sqrt(size / pi); - context.moveTo(r, 0); - context.arc(0, 0, r, 0, tau); - } -}; +var Tableau10 = colors("4e79a7f28e2ce1575976b7b259a14fedc949af7aa1ff9da79c755fbab0ab"); -var cross = { - draw: function(context, size) { - var r = Math.sqrt(size / 5) / 2; - context.moveTo(-3 * r, -r); - context.lineTo(-r, -r); - context.lineTo(-r, -3 * r); - context.lineTo(r, -3 * r); - context.lineTo(r, -r); - context.lineTo(3 * r, -r); - context.lineTo(3 * r, r); - context.lineTo(r, r); - context.lineTo(r, 3 * r); - context.lineTo(-r, 3 * r); - context.lineTo(-r, r); - context.lineTo(-3 * r, r); - context.closePath(); - } -}; +var ramp = scheme => d3Interpolate.interpolateRgbBasis(scheme[scheme.length - 1]); -var tan30 = Math.sqrt(1 / 3), - tan30_2 = tan30 * 2; +var scheme = new Array(3).concat( + "d8b365f5f5f55ab4ac", + "a6611adfc27d80cdc1018571", + "a6611adfc27df5f5f580cdc1018571", + "8c510ad8b365f6e8c3c7eae55ab4ac01665e", + "8c510ad8b365f6e8c3f5f5f5c7eae55ab4ac01665e", + "8c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e", + "8c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e", + "5430058c510abf812ddfc27df6e8c3c7eae580cdc135978f01665e003c30", + "5430058c510abf812ddfc27df6e8c3f5f5f5c7eae580cdc135978f01665e003c30" +).map(colors); -var diamond = { - draw: function(context, size) { - var y = Math.sqrt(size / tan30_2), - x = y * tan30; - context.moveTo(0, -y); - context.lineTo(x, 0); - context.lineTo(0, y); - context.lineTo(-x, 0); - context.closePath(); - } -}; +var BrBG = ramp(scheme); -var ka = 0.89081309152928522810, - kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), - kx = Math.sin(tau / 10) * kr, - ky = -Math.cos(tau / 10) * kr; +var scheme$1 = new Array(3).concat( + "af8dc3f7f7f77fbf7b", + "7b3294c2a5cfa6dba0008837", + "7b3294c2a5cff7f7f7a6dba0008837", + "762a83af8dc3e7d4e8d9f0d37fbf7b1b7837", + "762a83af8dc3e7d4e8f7f7f7d9f0d37fbf7b1b7837", + "762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b7837", + "762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b7837", + "40004b762a839970abc2a5cfe7d4e8d9f0d3a6dba05aae611b783700441b", + "40004b762a839970abc2a5cfe7d4e8f7f7f7d9f0d3a6dba05aae611b783700441b" +).map(colors); -var star = { - draw: function(context, size) { - var r = Math.sqrt(size * ka), - x = kx * r, - y = ky * r; - context.moveTo(0, -r); - context.lineTo(x, y); - for (var i = 1; i < 5; ++i) { - var a = tau * i / 5, - c = Math.cos(a), - s = Math.sin(a); - context.lineTo(s * r, -c * r); - context.lineTo(c * x - s * y, s * x + c * y); - } - context.closePath(); - } -}; +var PRGn = ramp(scheme$1); -var square = { - draw: function(context, size) { - var w = Math.sqrt(size), - x = -w / 2; - context.rect(x, x, w, w); - } -}; +var scheme$2 = new Array(3).concat( + "e9a3c9f7f7f7a1d76a", + "d01c8bf1b6dab8e1864dac26", + "d01c8bf1b6daf7f7f7b8e1864dac26", + "c51b7de9a3c9fde0efe6f5d0a1d76a4d9221", + "c51b7de9a3c9fde0eff7f7f7e6f5d0a1d76a4d9221", + "c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221", + "c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221", + "8e0152c51b7dde77aef1b6dafde0efe6f5d0b8e1867fbc414d9221276419", + "8e0152c51b7dde77aef1b6dafde0eff7f7f7e6f5d0b8e1867fbc414d9221276419" +).map(colors); -var sqrt3 = Math.sqrt(3); +var PiYG = ramp(scheme$2); -var triangle = { - draw: function(context, size) { - var y = -Math.sqrt(size / (sqrt3 * 3)); - context.moveTo(0, y * 2); - context.lineTo(-sqrt3 * y, -y); - context.lineTo(sqrt3 * y, -y); - context.closePath(); - } -}; +var scheme$3 = new Array(3).concat( + "998ec3f7f7f7f1a340", + "5e3c99b2abd2fdb863e66101", + "5e3c99b2abd2f7f7f7fdb863e66101", + "542788998ec3d8daebfee0b6f1a340b35806", + "542788998ec3d8daebf7f7f7fee0b6f1a340b35806", + "5427888073acb2abd2d8daebfee0b6fdb863e08214b35806", + "5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b35806", + "2d004b5427888073acb2abd2d8daebfee0b6fdb863e08214b358067f3b08", + "2d004b5427888073acb2abd2d8daebf7f7f7fee0b6fdb863e08214b358067f3b08" +).map(colors); -var c = -0.5, - s = Math.sqrt(3) / 2, - k = 1 / Math.sqrt(12), - a = (k / 2 + 1) * 3; +var PuOr = ramp(scheme$3); -var wye = { - draw: function(context, size) { - var r = Math.sqrt(size / a), - x0 = r / 2, - y0 = r * k, - x1 = x0, - y1 = r * k + r, - x2 = -x1, - y2 = y1; - context.moveTo(x0, y0); - context.lineTo(x1, y1); - context.lineTo(x2, y2); - context.lineTo(c * x0 - s * y0, s * x0 + c * y0); - context.lineTo(c * x1 - s * y1, s * x1 + c * y1); - context.lineTo(c * x2 - s * y2, s * x2 + c * y2); - context.lineTo(c * x0 + s * y0, c * y0 - s * x0); - context.lineTo(c * x1 + s * y1, c * y1 - s * x1); - context.lineTo(c * x2 + s * y2, c * y2 - s * x2); - context.closePath(); - } -}; +var scheme$4 = new Array(3).concat( + "ef8a62f7f7f767a9cf", + "ca0020f4a58292c5de0571b0", + "ca0020f4a582f7f7f792c5de0571b0", + "b2182bef8a62fddbc7d1e5f067a9cf2166ac", + "b2182bef8a62fddbc7f7f7f7d1e5f067a9cf2166ac", + "b2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac", + "b2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac", + "67001fb2182bd6604df4a582fddbc7d1e5f092c5de4393c32166ac053061", + "67001fb2182bd6604df4a582fddbc7f7f7f7d1e5f092c5de4393c32166ac053061" +).map(colors); -var symbols = [ - circle, - cross, - diamond, - square, - star, - triangle, - wye -]; +var RdBu = ramp(scheme$4); -function symbol(type, size) { - var context = null; - type = typeof type === "function" ? type : constant(type || circle); - size = typeof size === "function" ? size : constant(size === undefined ? 64 : +size); +var scheme$5 = new Array(3).concat( + "ef8a62ffffff999999", + "ca0020f4a582bababa404040", + "ca0020f4a582ffffffbababa404040", + "b2182bef8a62fddbc7e0e0e09999994d4d4d", + "b2182bef8a62fddbc7ffffffe0e0e09999994d4d4d", + "b2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d", + "b2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d", + "67001fb2182bd6604df4a582fddbc7e0e0e0bababa8787874d4d4d1a1a1a", + "67001fb2182bd6604df4a582fddbc7ffffffe0e0e0bababa8787874d4d4d1a1a1a" +).map(colors); - function symbol() { - var buffer; - if (!context) context = buffer = d3Path.path(); - type.apply(this, arguments).draw(context, +size.apply(this, arguments)); - if (buffer) return context = null, buffer + "" || null; - } +var RdGy = ramp(scheme$5); - symbol.type = function(_) { - return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; - }; +var scheme$6 = new Array(3).concat( + "fc8d59ffffbf91bfdb", + "d7191cfdae61abd9e92c7bb6", + "d7191cfdae61ffffbfabd9e92c7bb6", + "d73027fc8d59fee090e0f3f891bfdb4575b4", + "d73027fc8d59fee090ffffbfe0f3f891bfdb4575b4", + "d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4", + "d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4", + "a50026d73027f46d43fdae61fee090e0f3f8abd9e974add14575b4313695", + "a50026d73027f46d43fdae61fee090ffffbfe0f3f8abd9e974add14575b4313695" +).map(colors); + +var RdYlBu = ramp(scheme$6); - symbol.size = function(_) { - return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; - }; +var scheme$7 = new Array(3).concat( + "fc8d59ffffbf91cf60", + "d7191cfdae61a6d96a1a9641", + "d7191cfdae61ffffbfa6d96a1a9641", + "d73027fc8d59fee08bd9ef8b91cf601a9850", + "d73027fc8d59fee08bffffbfd9ef8b91cf601a9850", + "d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850", + "d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850", + "a50026d73027f46d43fdae61fee08bd9ef8ba6d96a66bd631a9850006837", + "a50026d73027f46d43fdae61fee08bffffbfd9ef8ba6d96a66bd631a9850006837" +).map(colors); - symbol.context = function(_) { - return arguments.length ? (context = _ == null ? null : _, symbol) : context; - }; +var RdYlGn = ramp(scheme$7); - return symbol; -} +var scheme$8 = new Array(3).concat( + "fc8d59ffffbf99d594", + "d7191cfdae61abdda42b83ba", + "d7191cfdae61ffffbfabdda42b83ba", + "d53e4ffc8d59fee08be6f59899d5943288bd", + "d53e4ffc8d59fee08bffffbfe6f59899d5943288bd", + "d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd", + "d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd", + "9e0142d53e4ff46d43fdae61fee08be6f598abdda466c2a53288bd5e4fa2", + "9e0142d53e4ff46d43fdae61fee08bffffbfe6f598abdda466c2a53288bd5e4fa2" +).map(colors); -function noop() {} +var Spectral = ramp(scheme$8); -function point$3(that, x, y) { - that._context.bezierCurveTo( - (2 * that._x0 + that._x1) / 3, - (2 * that._y0 + that._y1) / 3, - (that._x0 + 2 * that._x1) / 3, - (that._y0 + 2 * that._y1) / 3, - (that._x0 + 4 * that._x1 + x) / 6, - (that._y0 + 4 * that._y1 + y) / 6 - ); -} +var scheme$9 = new Array(3).concat( + "e5f5f999d8c92ca25f", + "edf8fbb2e2e266c2a4238b45", + "edf8fbb2e2e266c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a42ca25f006d2c", + "edf8fbccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45005824", + "f7fcfde5f5f9ccece699d8c966c2a441ae76238b45006d2c00441b" +).map(colors); -function Basis(context) { - this._context = context; -} +var BuGn = ramp(scheme$9); -Basis.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 3: point$3(this, this._x1, this._y1); // proceed - case 2: this._context.lineTo(this._x1, this._y1); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed - default: point$3(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; +var scheme$a = new Array(3).concat( + "e0ecf49ebcda8856a7", + "edf8fbb3cde38c96c688419d", + "edf8fbb3cde38c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68856a7810f7c", + "edf8fbbfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d6e016b", + "f7fcfde0ecf4bfd3e69ebcda8c96c68c6bb188419d810f7c4d004b" +).map(colors); -function basis(context) { - return new Basis(context); -} +var BuPu = ramp(scheme$a); -function BasisClosed(context) { - this._context = context; -} +var scheme$b = new Array(3).concat( + "e0f3dba8ddb543a2ca", + "f0f9e8bae4bc7bccc42b8cbe", + "f0f9e8bae4bc7bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc443a2ca0868ac", + "f0f9e8ccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe08589e", + "f7fcf0e0f3dbccebc5a8ddb57bccc44eb3d32b8cbe0868ac084081" +).map(colors); -BasisClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x2, this._y2); - this._context.closePath(); - break; - } - case 2: { - this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); - this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x2, this._y2); - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._x2 = x, this._y2 = y; break; - case 1: this._point = 2; this._x3 = x, this._y3 = y; break; - case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; - default: point$3(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; +var GnBu = ramp(scheme$b); -function basisClosed(context) { - return new BasisClosed(context); -} +var scheme$c = new Array(3).concat( + "fee8c8fdbb84e34a33", + "fef0d9fdcc8afc8d59d7301f", + "fef0d9fdcc8afc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59e34a33b30000", + "fef0d9fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301f990000", + "fff7ecfee8c8fdd49efdbb84fc8d59ef6548d7301fb300007f0000" +).map(colors); -function BasisOpen(context) { - this._context = context; -} +var OrRd = ramp(scheme$c); -BasisOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = NaN; - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; - case 3: this._point = 4; // proceed - default: point$3(this, x, y); break; - } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - } -}; +var scheme$d = new Array(3).concat( + "ece2f0a6bddb1c9099", + "f6eff7bdc9e167a9cf02818a", + "f6eff7bdc9e167a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf1c9099016c59", + "f6eff7d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016450", + "fff7fbece2f0d0d1e6a6bddb67a9cf3690c002818a016c59014636" +).map(colors); -function basisOpen(context) { - return new BasisOpen(context); -} +var PuBuGn = ramp(scheme$d); -class Bump { - constructor(context, x) { - this._context = context; - this._x = x; - } - areaStart() { - this._line = 0; - } - areaEnd() { - this._line = NaN; - } - lineStart() { - this._point = 0; - } - lineEnd() { - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - } - point(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: { - this._point = 1; - if (this._line) this._context.lineTo(x, y); - else this._context.moveTo(x, y); - break; - } - case 1: this._point = 2; // proceed - default: { - if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y); - else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y); - break; - } - } - this._x0 = x, this._y0 = y; - } -} +var scheme$e = new Array(3).concat( + "ece7f2a6bddb2b8cbe", + "f1eef6bdc9e174a9cf0570b0", + "f1eef6bdc9e174a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf2b8cbe045a8d", + "f1eef6d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0034e7b", + "fff7fbece7f2d0d1e6a6bddb74a9cf3690c00570b0045a8d023858" +).map(colors); -function bumpX(context) { - return new Bump(context, true); -} +var PuBu = ramp(scheme$e); -function bumpY(context) { - return new Bump(context, false); -} +var scheme$f = new Array(3).concat( + "e7e1efc994c7dd1c77", + "f1eef6d7b5d8df65b0ce1256", + "f1eef6d7b5d8df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0dd1c77980043", + "f1eef6d4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125691003f", + "f7f4f9e7e1efd4b9dac994c7df65b0e7298ace125698004367001f" +).map(colors); -function Bundle(context, beta) { - this._basis = new Basis(context); - this._beta = beta; -} +var PuRd = ramp(scheme$f); -Bundle.prototype = { - lineStart: function() { - this._x = []; - this._y = []; - this._basis.lineStart(); - }, - lineEnd: function() { - var x = this._x, - y = this._y, - j = x.length - 1; +var scheme$g = new Array(3).concat( + "fde0ddfa9fb5c51b8a", + "feebe2fbb4b9f768a1ae017e", + "feebe2fbb4b9f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1c51b8a7a0177", + "feebe2fcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a0177", + "fff7f3fde0ddfcc5c0fa9fb5f768a1dd3497ae017e7a017749006a" +).map(colors); - if (j > 0) { - var x0 = x[0], - y0 = y[0], - dx = x[j] - x0, - dy = y[j] - y0, - i = -1, - t; +var RdPu = ramp(scheme$g); - while (++i <= j) { - t = i / j; - this._basis.point( - this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), - this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) - ); - } - } +var scheme$h = new Array(3).concat( + "edf8b17fcdbb2c7fb8", + "ffffcca1dab441b6c4225ea8", + "ffffcca1dab441b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c42c7fb8253494", + "ffffccc7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea80c2c84", + "ffffd9edf8b1c7e9b47fcdbb41b6c41d91c0225ea8253494081d58" +).map(colors); - this._x = this._y = null; - this._basis.lineEnd(); - }, - point: function(x, y) { - this._x.push(+x); - this._y.push(+y); - } -}; +var YlGnBu = ramp(scheme$h); -var bundle = (function custom(beta) { +var scheme$i = new Array(3).concat( + "f7fcb9addd8e31a354", + "ffffccc2e69978c679238443", + "ffffccc2e69978c67931a354006837", + "ffffccd9f0a3addd8e78c67931a354006837", + "ffffccd9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443005a32", + "ffffe5f7fcb9d9f0a3addd8e78c67941ab5d238443006837004529" +).map(colors); - function bundle(context) { - return beta === 1 ? new Basis(context) : new Bundle(context, beta); - } +var YlGn = ramp(scheme$i); - bundle.beta = function(beta) { - return custom(+beta); - }; +var scheme$j = new Array(3).concat( + "fff7bcfec44fd95f0e", + "ffffd4fed98efe9929cc4c02", + "ffffd4fed98efe9929d95f0e993404", + "ffffd4fee391fec44ffe9929d95f0e993404", + "ffffd4fee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c028c2d04", + "ffffe5fff7bcfee391fec44ffe9929ec7014cc4c02993404662506" +).map(colors); - return bundle; -})(0.85); +var YlOrBr = ramp(scheme$j); -function point$2(that, x, y) { - that._context.bezierCurveTo( - that._x1 + that._k * (that._x2 - that._x0), - that._y1 + that._k * (that._y2 - that._y0), - that._x2 + that._k * (that._x1 - x), - that._y2 + that._k * (that._y1 - y), - that._x2, - that._y2 - ); -} +var scheme$k = new Array(3).concat( + "ffeda0feb24cf03b20", + "ffffb2fecc5cfd8d3ce31a1c", + "ffffb2fecc5cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cf03b20bd0026", + "ffffb2fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cb10026", + "ffffccffeda0fed976feb24cfd8d3cfc4e2ae31a1cbd0026800026" +).map(colors); -function Cardinal(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} +var YlOrRd = ramp(scheme$k); -Cardinal.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 2: this._context.lineTo(this._x2, this._y2); break; - case 3: point$2(this, this._x1, this._y1); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; this._x1 = x, this._y1 = y; break; - case 2: this._point = 3; // proceed - default: point$2(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; +var scheme$l = new Array(3).concat( + "deebf79ecae13182bd", + "eff3ffbdd7e76baed62171b5", + "eff3ffbdd7e76baed63182bd08519c", + "eff3ffc6dbef9ecae16baed63182bd08519c", + "eff3ffc6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b5084594", + "f7fbffdeebf7c6dbef9ecae16baed64292c62171b508519c08306b" +).map(colors); -var cardinal = (function custom(tension) { +var Blues = ramp(scheme$l); - function cardinal(context) { - return new Cardinal(context, tension); - } +var scheme$m = new Array(3).concat( + "e5f5e0a1d99b31a354", + "edf8e9bae4b374c476238b45", + "edf8e9bae4b374c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47631a354006d2c", + "edf8e9c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45005a32", + "f7fcf5e5f5e0c7e9c0a1d99b74c47641ab5d238b45006d2c00441b" +).map(colors); - cardinal.tension = function(tension) { - return custom(+tension); - }; +var Greens = ramp(scheme$m); - return cardinal; -})(0); +var scheme$n = new Array(3).concat( + "f0f0f0bdbdbd636363", + "f7f7f7cccccc969696525252", + "f7f7f7cccccc969696636363252525", + "f7f7f7d9d9d9bdbdbd969696636363252525", + "f7f7f7d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525", + "fffffff0f0f0d9d9d9bdbdbd969696737373525252252525000000" +).map(colors); -function CardinalClosed(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; -} +var Greys = ramp(scheme$n); -CardinalClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 2: { - this._context.lineTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - this.point(this._x5, this._y5); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; this._x3 = x, this._y3 = y; break; - case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; - case 2: this._point = 3; this._x5 = x, this._y5 = y; break; - default: point$2(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; +var scheme$o = new Array(3).concat( + "efedf5bcbddc756bb1", + "f2f0f7cbc9e29e9ac86a51a3", + "f2f0f7cbc9e29e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8756bb154278f", + "f2f0f7dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a34a1486", + "fcfbfdefedf5dadaebbcbddc9e9ac8807dba6a51a354278f3f007d" +).map(colors); + +var Purples = ramp(scheme$o); -var cardinalClosed = (function custom(tension) { +var scheme$p = new Array(3).concat( + "fee0d2fc9272de2d26", + "fee5d9fcae91fb6a4acb181d", + "fee5d9fcae91fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4ade2d26a50f15", + "fee5d9fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181d99000d", + "fff5f0fee0d2fcbba1fc9272fb6a4aef3b2ccb181da50f1567000d" +).map(colors); - function cardinal(context) { - return new CardinalClosed(context, tension); - } +var Reds = ramp(scheme$p); - cardinal.tension = function(tension) { - return custom(+tension); - }; +var scheme$q = new Array(3).concat( + "fee6cefdae6be6550d", + "feeddefdbe85fd8d3cd94701", + "feeddefdbe85fd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3ce6550da63603", + "feeddefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d948018c2d04", + "fff5ebfee6cefdd0a2fdae6bfd8d3cf16913d94801a636037f2704" +).map(colors); - return cardinal; -})(0); +var Oranges = ramp(scheme$q); -function CardinalOpen(context, tension) { - this._context = context; - this._k = (1 - tension) / 6; +function cividis(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(-4.54 - t * (35.34 - t * (2381.73 - t * (6402.7 - t * (7024.72 - t * 2710.57))))))) + ", " + + Math.max(0, Math.min(255, Math.round(32.49 + t * (170.73 + t * (52.82 - t * (131.46 - t * (176.58 - t * 67.37))))))) + ", " + + Math.max(0, Math.min(255, Math.round(81.24 + t * (442.36 - t * (2482.43 - t * (6167.24 - t * (6614.94 - t * 2475.67))))))) + + ")"; } -CardinalOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; - case 3: this._point = 4; // proceed - default: point$2(this, x, y); break; - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; - -var cardinalOpen = (function custom(tension) { +var cubehelix = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(300, 0.5, 0.0), d3Color.cubehelix(-240, 0.5, 1.0)); - function cardinal(context) { - return new CardinalOpen(context, tension); - } +var warm = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(-100, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); - cardinal.tension = function(tension) { - return custom(+tension); - }; +var cool = d3Interpolate.interpolateCubehelixLong(d3Color.cubehelix(260, 0.75, 0.35), d3Color.cubehelix(80, 1.50, 0.8)); - return cardinal; -})(0); +var c = d3Color.cubehelix(); -function point$1(that, x, y) { - var x1 = that._x1, - y1 = that._y1, - x2 = that._x2, - y2 = that._y2; +function rainbow(t) { + if (t < 0 || t > 1) t -= Math.floor(t); + var ts = Math.abs(t - 0.5); + c.h = 360 * t - 100; + c.s = 1.5 - 1.5 * ts; + c.l = 0.8 - 0.9 * ts; + return c + ""; +} - if (that._l01_a > epsilon) { - var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, - n = 3 * that._l01_a * (that._l01_a + that._l12_a); - x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; - y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; - } +var c$1 = d3Color.rgb(), + pi_1_3 = Math.PI / 3, + pi_2_3 = Math.PI * 2 / 3; - if (that._l23_a > epsilon) { - var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, - m = 3 * that._l23_a * (that._l23_a + that._l12_a); - x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; - y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; - } +function sinebow(t) { + var x; + t = (0.5 - t) * Math.PI; + c$1.r = 255 * (x = Math.sin(t)) * x; + c$1.g = 255 * (x = Math.sin(t + pi_1_3)) * x; + c$1.b = 255 * (x = Math.sin(t + pi_2_3)) * x; + return c$1 + ""; +} - that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +function turbo(t) { + t = Math.max(0, Math.min(1, t)); + return "rgb(" + + Math.max(0, Math.min(255, Math.round(34.61 + t * (1172.33 - t * (10793.56 - t * (33300.12 - t * (38394.49 - t * 14825.05))))))) + ", " + + Math.max(0, Math.min(255, Math.round(23.31 + t * (557.33 + t * (1225.33 - t * (3574.96 - t * (1073.77 + t * 707.56))))))) + ", " + + Math.max(0, Math.min(255, Math.round(27.2 + t * (3211.1 - t * (15327.97 - t * (27814 - t * (22569.18 - t * 6838.66))))))) + + ")"; } -function CatmullRom(context, alpha) { - this._context = context; - this._alpha = alpha; +function ramp$1(range) { + var n = range.length; + return function(t) { + return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))]; + }; } -CatmullRom.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 2: this._context.lineTo(this._x2, this._y2); break; - case 3: this.point(this._x2, this._y2); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; +var viridis = ramp$1(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")); + +var magma = ramp$1(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")); + +var inferno = ramp$1(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")); + +var plasma = ramp$1(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")); + +exports.interpolateBlues = Blues; +exports.interpolateBrBG = BrBG; +exports.interpolateBuGn = BuGn; +exports.interpolateBuPu = BuPu; +exports.interpolateCividis = cividis; +exports.interpolateCool = cool; +exports.interpolateCubehelixDefault = cubehelix; +exports.interpolateGnBu = GnBu; +exports.interpolateGreens = Greens; +exports.interpolateGreys = Greys; +exports.interpolateInferno = inferno; +exports.interpolateMagma = magma; +exports.interpolateOrRd = OrRd; +exports.interpolateOranges = Oranges; +exports.interpolatePRGn = PRGn; +exports.interpolatePiYG = PiYG; +exports.interpolatePlasma = plasma; +exports.interpolatePuBu = PuBu; +exports.interpolatePuBuGn = PuBuGn; +exports.interpolatePuOr = PuOr; +exports.interpolatePuRd = PuRd; +exports.interpolatePurples = Purples; +exports.interpolateRainbow = rainbow; +exports.interpolateRdBu = RdBu; +exports.interpolateRdGy = RdGy; +exports.interpolateRdPu = RdPu; +exports.interpolateRdYlBu = RdYlBu; +exports.interpolateRdYlGn = RdYlGn; +exports.interpolateReds = Reds; +exports.interpolateSinebow = sinebow; +exports.interpolateSpectral = Spectral; +exports.interpolateTurbo = turbo; +exports.interpolateViridis = viridis; +exports.interpolateWarm = warm; +exports.interpolateYlGn = YlGn; +exports.interpolateYlGnBu = YlGnBu; +exports.interpolateYlOrBr = YlOrBr; +exports.interpolateYlOrRd = YlOrRd; +exports.schemeAccent = Accent; +exports.schemeBlues = scheme$l; +exports.schemeBrBG = scheme; +exports.schemeBuGn = scheme$9; +exports.schemeBuPu = scheme$a; +exports.schemeCategory10 = category10; +exports.schemeDark2 = Dark2; +exports.schemeGnBu = scheme$b; +exports.schemeGreens = scheme$m; +exports.schemeGreys = scheme$n; +exports.schemeOrRd = scheme$c; +exports.schemeOranges = scheme$q; +exports.schemePRGn = scheme$1; +exports.schemePaired = Paired; +exports.schemePastel1 = Pastel1; +exports.schemePastel2 = Pastel2; +exports.schemePiYG = scheme$2; +exports.schemePuBu = scheme$e; +exports.schemePuBuGn = scheme$d; +exports.schemePuOr = scheme$3; +exports.schemePuRd = scheme$f; +exports.schemePurples = scheme$o; +exports.schemeRdBu = scheme$4; +exports.schemeRdGy = scheme$5; +exports.schemeRdPu = scheme$g; +exports.schemeRdYlBu = scheme$6; +exports.schemeRdYlGn = scheme$7; +exports.schemeReds = scheme$p; +exports.schemeSet1 = Set1; +exports.schemeSet2 = Set2; +exports.schemeSet3 = Set3; +exports.schemeSpectral = scheme$8; +exports.schemeTableau10 = Tableau10; +exports.schemeYlGn = scheme$i; +exports.schemeYlGnBu = scheme$h; +exports.schemeYlOrBr = scheme$j; +exports.schemeYlOrRd = scheme$k; + +Object.defineProperty(exports, '__esModule', { value: true }); + +})); +}); + +var d3Shape = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-shape/ v2.1.0 Copyright 2021 Mike Bostock +(function (global, factory) { +factory(exports, d3Path) ; +}(commonjsGlobal, (function (exports, d3Path) { +function constant(x) { + return function constant() { + return x; + }; +} - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } +var abs = Math.abs; +var atan2 = Math.atan2; +var cos = Math.cos; +var max = Math.max; +var min = Math.min; +var sin = Math.sin; +var sqrt = Math.sqrt; - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; // proceed - default: point$1(this, x, y); break; - } +var epsilon = 1e-12; +var pi = Math.PI; +var halfPi = pi / 2; +var tau = 2 * pi; - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; +function acos(x) { + return x > 1 ? 0 : x < -1 ? pi : Math.acos(x); +} -var catmullRom = (function custom(alpha) { +function asin(x) { + return x >= 1 ? halfPi : x <= -1 ? -halfPi : Math.asin(x); +} - function catmullRom(context) { - return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); - } +function arcInnerRadius(d) { + return d.innerRadius; +} - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; +function arcOuterRadius(d) { + return d.outerRadius; +} - return catmullRom; -})(0.5); +function arcStartAngle(d) { + return d.startAngle; +} -function CatmullRomClosed(context, alpha) { - this._context = context; - this._alpha = alpha; +function arcEndAngle(d) { + return d.endAngle; } -CatmullRomClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = - this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 1: { - this._context.moveTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 2: { - this._context.lineTo(this._x3, this._y3); - this._context.closePath(); - break; - } - case 3: { - this.point(this._x3, this._y3); - this.point(this._x4, this._y4); - this.point(this._x5, this._y5); - break; - } - } - }, - point: function(x, y) { - x = +x, y = +y; +function arcPadAngle(d) { + return d && d.padAngle; // Note: optional! +} - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); - } +function intersect(x0, y0, x1, y1, x2, y2, x3, y3) { + var x10 = x1 - x0, y10 = y1 - y0, + x32 = x3 - x2, y32 = y3 - y2, + t = y32 * x10 - x32 * y10; + if (t * t < epsilon) return; + t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / t; + return [x0 + t * x10, y0 + t * y10]; +} - switch (this._point) { - case 0: this._point = 1; this._x3 = x, this._y3 = y; break; - case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; - case 2: this._point = 3; this._x5 = x, this._y5 = y; break; - default: point$1(this, x, y); break; - } +// Compute perpendicular offset line of length rc. +// http://mathworld.wolfram.com/Circle-LineIntersection.html +function cornerTangents(x0, y0, x1, y1, r1, rc, cw) { + var x01 = x0 - x1, + y01 = y0 - y1, + lo = (cw ? rc : -rc) / sqrt(x01 * x01 + y01 * y01), + ox = lo * y01, + oy = -lo * x01, + x11 = x0 + ox, + y11 = y0 + oy, + x10 = x1 + ox, + y10 = y1 + oy, + x00 = (x11 + x10) / 2, + y00 = (y11 + y10) / 2, + dx = x10 - x11, + dy = y10 - y11, + d2 = dx * dx + dy * dy, + r = r1 - rc, + D = x11 * y10 - x10 * y11, + d = (dy < 0 ? -1 : 1) * sqrt(max(0, r * r * d2 - D * D)), + cx0 = (D * dy - dx * d) / d2, + cy0 = (-D * dx - dy * d) / d2, + cx1 = (D * dy + dx * d) / d2, + cy1 = (-D * dx + dy * d) / d2, + dx0 = cx0 - x00, + dy0 = cy0 - y00, + dx1 = cx1 - x00, + dy1 = cy1 - y00; - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; + // Pick the closer of the two intersection points. + // TODO Is there a faster way to determine which intersection to use? + if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1; -var catmullRomClosed = (function custom(alpha) { + return { + cx: cx0, + cy: cy0, + x01: -ox, + y01: -oy, + x11: cx0 * (r1 / r - 1), + y11: cy0 * (r1 / r - 1) + }; +} - function catmullRom(context) { - return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); - } +function arc() { + var innerRadius = arcInnerRadius, + outerRadius = arcOuterRadius, + cornerRadius = constant(0), + padRadius = null, + startAngle = arcStartAngle, + endAngle = arcEndAngle, + padAngle = arcPadAngle, + context = null; - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; + function arc() { + var buffer, + r, + r0 = +innerRadius.apply(this, arguments), + r1 = +outerRadius.apply(this, arguments), + a0 = startAngle.apply(this, arguments) - halfPi, + a1 = endAngle.apply(this, arguments) - halfPi, + da = abs(a1 - a0), + cw = a1 > a0; - return catmullRom; -})(0.5); + if (!context) context = buffer = d3Path.path(); -function CatmullRomOpen(context, alpha) { - this._context = context; - this._alpha = alpha; -} + // Ensure that the outer radius is always larger than the inner radius. + if (r1 < r0) r = r1, r1 = r0, r0 = r; -CatmullRomOpen.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = this._x2 = - this._y0 = this._y1 = this._y2 = NaN; - this._l01_a = this._l12_a = this._l23_a = - this._l01_2a = this._l12_2a = this._l23_2a = - this._point = 0; - }, - lineEnd: function() { - if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - x = +x, y = +y; + // Is it a point? + if (!(r1 > epsilon)) context.moveTo(0, 0); - if (this._point) { - var x23 = this._x2 - x, - y23 = this._y2 - y; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + // Or is it a circle or annulus? + else if (da > tau - epsilon) { + context.moveTo(r1 * cos(a0), r1 * sin(a0)); + context.arc(0, 0, r1, a0, a1, !cw); + if (r0 > epsilon) { + context.moveTo(r0 * cos(a1), r0 * sin(a1)); + context.arc(0, 0, r0, a1, a0, cw); + } } - switch (this._point) { - case 0: this._point = 1; break; - case 1: this._point = 2; break; - case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; - case 3: this._point = 4; // proceed - default: point$1(this, x, y); break; - } + // Or is it a circular or annular sector? + else { + var a01 = a0, + a11 = a1, + a00 = a0, + a10 = a1, + da0 = da, + da1 = da, + ap = padAngle.apply(this, arguments) / 2, + rp = (ap > epsilon) && (padRadius ? +padRadius.apply(this, arguments) : sqrt(r0 * r0 + r1 * r1)), + rc = min(abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments)), + rc0 = rc, + rc1 = rc, + t0, + t1; + + // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0. + if (rp > epsilon) { + var p0 = asin(rp / r0 * sin(ap)), + p1 = asin(rp / r1 * sin(ap)); + if ((da0 -= p0 * 2) > epsilon) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0; + else da0 = 0, a00 = a10 = (a0 + a1) / 2; + if ((da1 -= p1 * 2) > epsilon) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1; + else da1 = 0, a01 = a11 = (a0 + a1) / 2; + } - this._l01_a = this._l12_a, this._l12_a = this._l23_a; - this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; - this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; - this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; - } -}; + var x01 = r1 * cos(a01), + y01 = r1 * sin(a01), + x10 = r0 * cos(a10), + y10 = r0 * sin(a10); -var catmullRomOpen = (function custom(alpha) { + // Apply rounded corners? + if (rc > epsilon) { + var x11 = r1 * cos(a11), + y11 = r1 * sin(a11), + x00 = r0 * cos(a00), + y00 = r0 * sin(a00), + oc; - function catmullRom(context) { - return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); - } + // Restrict the corner radius according to the sector angle. + if (da < pi && (oc = intersect(x01, y01, x00, y00, x11, y11, x10, y10))) { + var ax = x01 - oc[0], + ay = y01 - oc[1], + bx = x11 - oc[0], + by = y11 - oc[1], + kc = 1 / sin(acos((ax * bx + ay * by) / (sqrt(ax * ax + ay * ay) * sqrt(bx * bx + by * by))) / 2), + lc = sqrt(oc[0] * oc[0] + oc[1] * oc[1]); + rc0 = min(rc, (r0 - lc) / (kc - 1)); + rc1 = min(rc, (r1 - lc) / (kc + 1)); + } + } - catmullRom.alpha = function(alpha) { - return custom(+alpha); - }; + // Is the sector collapsed to a line? + if (!(da1 > epsilon)) context.moveTo(x01, y01); - return catmullRom; -})(0.5); + // Does the sector’s outer ring have rounded corners? + else if (rc1 > epsilon) { + t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw); + t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw); -function LinearClosed(context) { - this._context = context; -} + context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01); -LinearClosed.prototype = { - areaStart: noop, - areaEnd: noop, - lineStart: function() { - this._point = 0; - }, - lineEnd: function() { - if (this._point) this._context.closePath(); - }, - point: function(x, y) { - x = +x, y = +y; - if (this._point) this._context.lineTo(x, y); - else this._point = 1, this._context.moveTo(x, y); - } -}; + // Have the corners merged? + if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); -function linearClosed(context) { - return new LinearClosed(context); -} + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc1, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r1, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), !cw); + context.arc(t1.cx, t1.cy, rc1, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } -function sign(x) { - return x < 0 ? -1 : 1; -} + // Or is the outer ring just a circular arc? + else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw); -// Calculate the slopes of the tangents (Hermite-type interpolation) based on -// the following paper: Steffen, M. 1990. A Simple Method for Monotonic -// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. -// NOV(II), P. 443, 1990. -function slope3(that, x2, y2) { - var h0 = that._x1 - that._x0, - h1 = x2 - that._x1, - s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), - s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), - p = (s0 * h1 + s1 * h0) / (h0 + h1); - return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; -} + // Is there no inner ring, and it’s a circular sector? + // Or perhaps it’s an annular sector collapsed due to padding? + if (!(r0 > epsilon) || !(da0 > epsilon)) context.lineTo(x10, y10); -// Calculate a one-sided slope. -function slope2(that, t) { - var h = that._x1 - that._x0; - return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; -} + // Does the sector’s inner ring (or point) have rounded corners? + else if (rc0 > epsilon) { + t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw); + t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw); -// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations -// "you can express cubic Hermite interpolation in terms of cubic Bézier curves -// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". -function point(that, t0, t1) { - var x0 = that._x0, - y0 = that._y0, - x1 = that._x1, - y1 = that._y1, - dx = (x1 - x0) / 3; - that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); -} + context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01); -function MonotoneX(context) { - this._context = context; -} + // Have the corners merged? + if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t1.y01, t1.x01), !cw); -MonotoneX.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x0 = this._x1 = - this._y0 = this._y1 = - this._t0 = NaN; - this._point = 0; - }, - lineEnd: function() { - switch (this._point) { - case 2: this._context.lineTo(this._x1, this._y1); break; - case 3: point(this, this._t0, slope2(this, this._t0)); break; - } - if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - this._line = 1 - this._line; - }, - point: function(x, y) { - var t1 = NaN; + // Otherwise, draw the two corners and the ring. + else { + context.arc(t0.cx, t0.cy, rc0, atan2(t0.y01, t0.x01), atan2(t0.y11, t0.x11), !cw); + context.arc(0, 0, r0, atan2(t0.cy + t0.y11, t0.cx + t0.x11), atan2(t1.cy + t1.y11, t1.cx + t1.x11), cw); + context.arc(t1.cx, t1.cy, rc0, atan2(t1.y11, t1.x11), atan2(t1.y01, t1.x01), !cw); + } + } - x = +x, y = +y; - if (x === this._x1 && y === this._y1) return; // Ignore coincident points. - switch (this._point) { - case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; - case 1: this._point = 2; break; - case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break; - default: point(this, this._t0, t1 = slope3(this, x, y)); break; + // Or is the inner ring just a circular arc? + else context.arc(0, 0, r0, a10, a00, cw); } - this._x0 = this._x1, this._x1 = x; - this._y0 = this._y1, this._y1 = y; - this._t0 = t1; - } -}; - -function MonotoneY(context) { - this._context = new ReflectContext(context); -} + context.closePath(); -(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { - MonotoneX.prototype.point.call(this, y, x); -}; + if (buffer) return context = null, buffer + "" || null; + } -function ReflectContext(context) { - this._context = context; -} + arc.centroid = function() { + var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, + a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi / 2; + return [cos(a) * r, sin(a) * r]; + }; -ReflectContext.prototype = { - moveTo: function(x, y) { this._context.moveTo(y, x); }, - closePath: function() { this._context.closePath(); }, - lineTo: function(x, y) { this._context.lineTo(y, x); }, - bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } -}; + arc.innerRadius = function(_) { + return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant(+_), arc) : innerRadius; + }; -function monotoneX(context) { - return new MonotoneX(context); -} + arc.outerRadius = function(_) { + return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant(+_), arc) : outerRadius; + }; -function monotoneY(context) { - return new MonotoneY(context); -} + arc.cornerRadius = function(_) { + return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant(+_), arc) : cornerRadius; + }; -function Natural(context) { - this._context = context; -} + arc.padRadius = function(_) { + return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant(+_), arc) : padRadius; + }; -Natural.prototype = { - areaStart: function() { - this._line = 0; - }, - areaEnd: function() { - this._line = NaN; - }, - lineStart: function() { - this._x = []; - this._y = []; - }, - lineEnd: function() { - var x = this._x, - y = this._y, - n = x.length; + arc.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), arc) : startAngle; + }; - if (n) { - this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); - if (n === 2) { - this._context.lineTo(x[1], y[1]); - } else { - var px = controlPoints(x), - py = controlPoints(y); - for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { - this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); - } - } - } + arc.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), arc) : endAngle; + }; - if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); - this._line = 1 - this._line; - this._x = this._y = null; - }, - point: function(x, y) { - this._x.push(+x); - this._y.push(+y); - } -}; + arc.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), arc) : padAngle; + }; -// See https://www.particleincell.com/2012/bezier-splines/ for derivation. -function controlPoints(x) { - var i, - n = x.length - 1, - m, - a = new Array(n), - b = new Array(n), - r = new Array(n); - a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; - for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; - a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; - for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; - a[n - 1] = r[n - 1] / b[n - 1]; - for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; - b[n - 1] = (x[n] + a[n - 1]) / 2; - for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; - return [a, b]; + arc.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), arc) : context; + }; + + return arc; } -function natural(context) { - return new Natural(context); +var slice = Array.prototype.slice; + +function array(x) { + return typeof x === "object" && "length" in x + ? x // Array, TypedArray, NodeList, array-like + : Array.from(x); // Map, Set, iterable, string, or anything else } -function Step(context, t) { +function Linear(context) { this._context = context; - this._t = t; } -Step.prototype = { +Linear.prototype = { areaStart: function() { this._line = 0; }, @@ -46781,3361 +45947,4195 @@ Step.prototype = { this._line = NaN; }, lineStart: function() { - this._x = this._y = NaN; this._point = 0; }, lineEnd: function() { - if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); - if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + this._line = 1 - this._line; }, point: function(x, y) { x = +x, y = +y; switch (this._point) { case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; case 1: this._point = 2; // proceed - default: { - if (this._t <= 0) { - this._context.lineTo(this._x, y); - this._context.lineTo(x, y); - } else { - var x1 = this._x * (1 - this._t) + x * this._t; - this._context.lineTo(x1, this._y); - this._context.lineTo(x1, y); - } - break; - } + default: this._context.lineTo(x, y); break; } - this._x = x, this._y = y; } }; -function step(context) { - return new Step(context, 0.5); -} - -function stepBefore(context) { - return new Step(context, 0); -} - -function stepAfter(context) { - return new Step(context, 1); +function curveLinear(context) { + return new Linear(context); } -function none$1(series, order) { - if (!((n = series.length) > 1)) return; - for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { - s0 = s1, s1 = series[order[i]]; - for (j = 0; j < m; ++j) { - s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; - } - } +function x(p) { + return p[0]; } -function none(series) { - var n = series.length, o = new Array(n); - while (--n >= 0) o[n] = n; - return o; +function y(p) { + return p[1]; } -function stackValue(d, key) { - return d[key]; -} +function line(x$1, y$1) { + var defined = constant(true), + context = null, + curve = curveLinear, + output = null; -function stackSeries(key) { - const series = []; - series.key = key; - return series; -} + x$1 = typeof x$1 === "function" ? x$1 : (x$1 === undefined) ? x : constant(x$1); + y$1 = typeof y$1 === "function" ? y$1 : (y$1 === undefined) ? y : constant(y$1); -function stack() { - var keys = constant([]), - order = none, - offset = none$1, - value = stackValue; + function line(data) { + var i, + n = (data = array(data)).length, + d, + defined0 = false, + buffer; - function stack(data) { - var sz = Array.from(keys.apply(this, arguments), stackSeries), - i, n = sz.length, j = -1, - oz; + if (context == null) output = curve(buffer = d3Path.path()); - for (const d of data) { - for (i = 0, ++j; i < n; ++i) { - (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d; + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) output.lineStart(); + else output.lineEnd(); } + if (defined0) output.point(+x$1(d, i, data), +y$1(d, i, data)); } - for (i = 0, oz = array(order(sz)); i < n; ++i) { - sz[oz[i]].index = i; - } - - offset(sz, oz); - return sz; + if (buffer) return output = null, buffer + "" || null; } - stack.keys = function(_) { - return arguments.length ? (keys = typeof _ === "function" ? _ : constant(Array.from(_)), stack) : keys; + line.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), line) : x$1; }; - stack.value = function(_) { - return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; + line.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), line) : y$1; }; - stack.order = function(_) { - return arguments.length ? (order = _ == null ? none : typeof _ === "function" ? _ : constant(Array.from(_)), stack) : order; + line.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), line) : defined; }; - stack.offset = function(_) { - return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + line.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve; }; - return stack; -} - -function expand(series, order) { - if (!((n = series.length) > 0)) return; - for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { - for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; - if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; - } - none$1(series, order); -} - -function diverging(series, order) { - if (!((n = series.length) > 0)) return; - for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { - for (yp = yn = 0, i = 0; i < n; ++i) { - if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { - d[0] = yp, d[1] = yp += dy; - } else if (dy < 0) { - d[1] = yn, d[0] = yn += dy; - } else { - d[0] = 0, d[1] = dy; - } - } - } -} - -function silhouette(series, order) { - if (!((n = series.length) > 0)) return; - for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { - for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; - s0[j][1] += s0[j][0] = -y / 2; - } - none$1(series, order); -} - -function wiggle(series, order) { - if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; - for (var y = 0, j = 1, s0, m, n; j < m; ++j) { - for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { - var si = series[order[i]], - sij0 = si[j][1] || 0, - sij1 = si[j - 1][1] || 0, - s3 = (sij0 - sij1) / 2; - for (var k = 0; k < i; ++k) { - var sk = series[order[k]], - skj0 = sk[j][1] || 0, - skj1 = sk[j - 1][1] || 0; - s3 += skj0 - skj1; - } - s1 += sij0, s2 += s3 * sij0; - } - s0[j - 1][1] += s0[j - 1][0] = y; - if (s1) y -= s2 / s1; - } - s0[j - 1][1] += s0[j - 1][0] = y; - none$1(series, order); -} - -function appearance(series) { - var peaks = series.map(peak); - return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); -} + line.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context; + }; -function peak(series) { - var i = -1, j = 0, n = series.length, vi, vj = -Infinity; - while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; - return j; + return line; } -function ascending(series) { - var sums = series.map(sum); - return none(series).sort(function(a, b) { return sums[a] - sums[b]; }); -} +function area(x0, y0, y1) { + var x1 = null, + defined = constant(true), + context = null, + curve = curveLinear, + output = null; -function sum(series) { - var s = 0, i = -1, n = series.length, v; - while (++i < n) if (v = +series[i][1]) s += v; - return s; -} + x0 = typeof x0 === "function" ? x0 : (x0 === undefined) ? x : constant(+x0); + y0 = typeof y0 === "function" ? y0 : (y0 === undefined) ? constant(0) : constant(+y0); + y1 = typeof y1 === "function" ? y1 : (y1 === undefined) ? y : constant(+y1); -function descending(series) { - return ascending(series).reverse(); -} + function area(data) { + var i, + j, + k, + n = (data = array(data)).length, + d, + defined0 = false, + buffer, + x0z = new Array(n), + y0z = new Array(n); -function insideOut(series) { - var n = series.length, - i, - j, - sums = series.map(sum), - order = appearance(series), - top = 0, - bottom = 0, - tops = [], - bottoms = []; + if (context == null) output = curve(buffer = d3Path.path()); - for (i = 0; i < n; ++i) { - j = order[i]; - if (top < bottom) { - top += sums[j]; - tops.push(j); - } else { - bottom += sums[j]; - bottoms.push(j); + for (i = 0; i <= n; ++i) { + if (!(i < n && defined(d = data[i], i, data)) === defined0) { + if (defined0 = !defined0) { + j = i; + output.areaStart(); + output.lineStart(); + } else { + output.lineEnd(); + output.lineStart(); + for (k = i - 1; k >= j; --k) { + output.point(x0z[k], y0z[k]); + } + output.lineEnd(); + output.areaEnd(); + } + } + if (defined0) { + x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data); + output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]); + } } + + if (buffer) return output = null, buffer + "" || null; } - return bottoms.reverse().concat(tops); -} + function arealine() { + return line().defined(defined).curve(curve).context(context); + } -function reverse(series) { - return none(series).reverse(); -} + area.x = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), x1 = null, area) : x0; + }; -exports.arc = arc; -exports.area = area; -exports.areaRadial = areaRadial; -exports.curveBasis = basis; -exports.curveBasisClosed = basisClosed; -exports.curveBasisOpen = basisOpen; -exports.curveBumpX = bumpX; -exports.curveBumpY = bumpY; -exports.curveBundle = bundle; -exports.curveCardinal = cardinal; -exports.curveCardinalClosed = cardinalClosed; -exports.curveCardinalOpen = cardinalOpen; -exports.curveCatmullRom = catmullRom; -exports.curveCatmullRomClosed = catmullRomClosed; -exports.curveCatmullRomOpen = catmullRomOpen; -exports.curveLinear = curveLinear; -exports.curveLinearClosed = linearClosed; -exports.curveMonotoneX = monotoneX; -exports.curveMonotoneY = monotoneY; -exports.curveNatural = natural; -exports.curveStep = step; -exports.curveStepAfter = stepAfter; -exports.curveStepBefore = stepBefore; -exports.line = line; -exports.lineRadial = lineRadial$1; -exports.linkHorizontal = linkHorizontal; -exports.linkRadial = linkRadial; -exports.linkVertical = linkVertical; -exports.pie = pie; -exports.pointRadial = pointRadial; -exports.radialArea = areaRadial; -exports.radialLine = lineRadial$1; -exports.stack = stack; -exports.stackOffsetDiverging = diverging; -exports.stackOffsetExpand = expand; -exports.stackOffsetNone = none$1; -exports.stackOffsetSilhouette = silhouette; -exports.stackOffsetWiggle = wiggle; -exports.stackOrderAppearance = appearance; -exports.stackOrderAscending = ascending; -exports.stackOrderDescending = descending; -exports.stackOrderInsideOut = insideOut; -exports.stackOrderNone = none; -exports.stackOrderReverse = reverse; -exports.symbol = symbol; -exports.symbolCircle = circle; -exports.symbolCross = cross; -exports.symbolDiamond = diamond; -exports.symbolSquare = square; -exports.symbolStar = star; -exports.symbolTriangle = triangle; -exports.symbolWye = wye; -exports.symbols = symbols; + area.x0 = function(_) { + return arguments.length ? (x0 = typeof _ === "function" ? _ : constant(+_), area) : x0; + }; -Object.defineProperty(exports, '__esModule', { value: true }); + area.x1 = function(_) { + return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : x1; + }; -}))); -}); + area.y = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), y1 = null, area) : y0; + }; -var d3Zoom = createCommonjsModule(function (module, exports) { -// https://d3js.org/d3-zoom/ v2.0.0 Copyright 2020 Mike Bostock -(function (global, factory) { -factory(exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) ; -}(commonjsGlobal, (function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { -var constant = x => () => x; + area.y0 = function(_) { + return arguments.length ? (y0 = typeof _ === "function" ? _ : constant(+_), area) : y0; + }; -function ZoomEvent(type, { - sourceEvent, - target, - transform, - dispatch -}) { - Object.defineProperties(this, { - type: {value: type, enumerable: true, configurable: true}, - sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, - target: {value: target, enumerable: true, configurable: true}, - transform: {value: transform, enumerable: true, configurable: true}, - _: {value: dispatch} - }); -} + area.y1 = function(_) { + return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant(+_), area) : y1; + }; -function Transform(k, x, y) { - this.k = k; - this.x = x; - this.y = y; -} + area.lineX0 = + area.lineY0 = function() { + return arealine().x(x0).y(y0); + }; -Transform.prototype = { - constructor: Transform, - scale: function(k) { - return k === 1 ? this : new Transform(this.k * k, this.x, this.y); - }, - translate: function(x, y) { - return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); - }, - apply: function(point) { - return [point[0] * this.k + this.x, point[1] * this.k + this.y]; - }, - applyX: function(x) { - return x * this.k + this.x; - }, - applyY: function(y) { - return y * this.k + this.y; - }, - invert: function(location) { - return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; - }, - invertX: function(x) { - return (x - this.x) / this.k; - }, - invertY: function(y) { - return (y - this.y) / this.k; - }, - rescaleX: function(x) { - return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); - }, - rescaleY: function(y) { - return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); - }, - toString: function() { - return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; - } -}; + area.lineY1 = function() { + return arealine().x(x0).y(y1); + }; -var identity = new Transform(1, 0, 0); + area.lineX1 = function() { + return arealine().x(x1).y(y0); + }; -transform.prototype = Transform.prototype; + area.defined = function(_) { + return arguments.length ? (defined = typeof _ === "function" ? _ : constant(!!_), area) : defined; + }; -function transform(node) { - while (!node.__zoom) if (!(node = node.parentNode)) return identity; - return node.__zoom; -} + area.curve = function(_) { + return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve; + }; -function nopropagation(event) { - event.stopImmediatePropagation(); -} + area.context = function(_) { + return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context; + }; -function noevent(event) { - event.preventDefault(); - event.stopImmediatePropagation(); + return area; } -// Ignore right-click, since that should open the context menu. -// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event -function defaultFilter(event) { - return (!event.ctrlKey || event.type === 'wheel') && !event.button; +function descending$1(a, b) { + return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN; } -function defaultExtent() { - var e = this; - if (e instanceof SVGElement) { - e = e.ownerSVGElement || e; - if (e.hasAttribute("viewBox")) { - e = e.viewBox.baseVal; - return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; - } - return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; - } - return [[0, 0], [e.clientWidth, e.clientHeight]]; +function identity(d) { + return d; } -function defaultTransform() { - return this.__zoom || identity; -} +function pie() { + var value = identity, + sortValues = descending$1, + sort = null, + startAngle = constant(0), + endAngle = constant(tau), + padAngle = constant(0); -function defaultWheelDelta(event) { - return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); -} + function pie(data) { + var i, + n = (data = array(data)).length, + j, + k, + sum = 0, + index = new Array(n), + arcs = new Array(n), + a0 = +startAngle.apply(this, arguments), + da = Math.min(tau, Math.max(-tau, endAngle.apply(this, arguments) - a0)), + a1, + p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)), + pa = p * (da < 0 ? -1 : 1), + v; -function defaultTouchable() { - return navigator.maxTouchPoints || ("ontouchstart" in this); -} + for (i = 0; i < n; ++i) { + if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) { + sum += v; + } + } -function defaultConstrain(transform, extent, translateExtent) { - var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], - dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], - dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], - dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; - return transform.translate( - dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), - dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) - ); -} + // Optionally sort the arcs by previously-computed values or by data. + if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); }); + else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); }); -function zoom() { - var filter = defaultFilter, - extent = defaultExtent, - constrain = defaultConstrain, - wheelDelta = defaultWheelDelta, - touchable = defaultTouchable, - scaleExtent = [0, Infinity], - translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], - duration = 250, - interpolate = d3Interpolate.interpolateZoom, - listeners = d3Dispatch.dispatch("start", "zoom", "end"), - touchstarting, - touchfirst, - touchending, - touchDelay = 500, - wheelDelay = 150, - clickDistance2 = 0, - tapDistance = 10; + // Compute the arcs! They are stored in the original data's order. + for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) { + j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = { + data: data[j], + index: i, + value: v, + startAngle: a0, + endAngle: a1, + padAngle: p + }; + } - function zoom(selection) { - selection - .property("__zoom", defaultTransform) - .on("wheel.zoom", wheeled) - .on("mousedown.zoom", mousedowned) - .on("dblclick.zoom", dblclicked) - .filter(touchable) - .on("touchstart.zoom", touchstarted) - .on("touchmove.zoom", touchmoved) - .on("touchend.zoom touchcancel.zoom", touchended) - .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + return arcs; } - zoom.transform = function(collection, transform, point, event) { - var selection = collection.selection ? collection.selection() : collection; - selection.property("__zoom", defaultTransform); - if (collection !== selection) { - schedule(collection, transform, point, event); - } else { - selection.interrupt().each(function() { - gesture(this, arguments) - .event(event) - .start() - .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) - .end(); - }); - } + pie.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), pie) : value; }; - zoom.scaleBy = function(selection, k, p, event) { - zoom.scaleTo(selection, function() { - var k0 = this.__zoom.k, - k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return k0 * k1; - }, p, event); + pie.sortValues = function(_) { + return arguments.length ? (sortValues = _, sort = null, pie) : sortValues; }; - zoom.scaleTo = function(selection, k, p, event) { - zoom.transform(selection, function() { - var e = extent.apply(this, arguments), - t0 = this.__zoom, - p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, - p1 = t0.invert(p0), - k1 = typeof k === "function" ? k.apply(this, arguments) : k; - return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); - }, p, event); + pie.sort = function(_) { + return arguments.length ? (sort = _, sortValues = null, pie) : sort; }; - zoom.translateBy = function(selection, x, y, event) { - zoom.transform(selection, function() { - return constrain(this.__zoom.translate( - typeof x === "function" ? x.apply(this, arguments) : x, - typeof y === "function" ? y.apply(this, arguments) : y - ), extent.apply(this, arguments), translateExtent); - }, null, event); + pie.startAngle = function(_) { + return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant(+_), pie) : startAngle; }; - zoom.translateTo = function(selection, x, y, p, event) { - zoom.transform(selection, function() { - var e = extent.apply(this, arguments), - t = this.__zoom, - p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; - return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( - typeof x === "function" ? -x.apply(this, arguments) : -x, - typeof y === "function" ? -y.apply(this, arguments) : -y - ), e, translateExtent); - }, p, event); + pie.endAngle = function(_) { + return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant(+_), pie) : endAngle; }; - function scale(transform, k) { - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); - return k === transform.k ? transform : new Transform(k, transform.x, transform.y); - } + pie.padAngle = function(_) { + return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant(+_), pie) : padAngle; + }; - function translate(transform, p0, p1) { - var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; - return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); - } + return pie; +} - function centroid(extent) { - return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; - } +var curveRadialLinear = curveRadial$1(curveLinear); - function schedule(transition, transform, point, event) { - transition - .on("start.zoom", function() { gesture(this, arguments).event(event).start(); }) - .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }) - .tween("zoom", function() { - var that = this, - args = arguments, - g = gesture(that, args).event(event), - e = extent.apply(that, args), - p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, - w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), - a = that.__zoom, - b = typeof transform === "function" ? transform.apply(that, args) : transform, - i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); - return function(t) { - if (t === 1) t = b; // Avoid rounding error on end. - else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } - g.zoom(null, t); - }; - }); - } +function Radial(curve) { + this._curve = curve; +} - function gesture(that, args, clean) { - return (!clean && that.__zooming) || new Gesture(that, args); +Radial.prototype = { + areaStart: function() { + this._curve.areaStart(); + }, + areaEnd: function() { + this._curve.areaEnd(); + }, + lineStart: function() { + this._curve.lineStart(); + }, + lineEnd: function() { + this._curve.lineEnd(); + }, + point: function(a, r) { + this._curve.point(r * Math.sin(a), r * -Math.cos(a)); } +}; - function Gesture(that, args) { - this.that = that; - this.args = args; - this.active = 0; - this.sourceEvent = null; - this.extent = extent.apply(that, args); - this.taps = 0; +function curveRadial$1(curve) { + + function radial(context) { + return new Radial(curve(context)); } - Gesture.prototype = { - event: function(event) { - if (event) this.sourceEvent = event; - return this; - }, - start: function() { - if (++this.active === 1) { - this.that.__zooming = this; - this.emit("start"); - } - return this; - }, - zoom: function(key, transform) { - if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); - if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); - if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); - this.that.__zoom = transform; - this.emit("zoom"); - return this; - }, - end: function() { - if (--this.active === 0) { - delete this.that.__zooming; - this.emit("end"); - } - return this; - }, - emit: function(type) { - var d = d3Selection.select(this.that).datum(); - listeners.call( - type, - this.that, - new ZoomEvent(type, { - sourceEvent: this.sourceEvent, - target: zoom, - type, - transform: this.that.__zoom, - dispatch: listeners - }), - d - ); - } + radial._curve = curve; + + return radial; +} + +function lineRadial(l) { + var c = l.curve; + + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + + l.curve = function(_) { + return arguments.length ? c(curveRadial$1(_)) : c()._curve; + }; + + return l; +} + +function lineRadial$1() { + return lineRadial(line().curve(curveRadialLinear)); +} + +function areaRadial() { + var a = area().curve(curveRadialLinear), + c = a.curve, + x0 = a.lineX0, + x1 = a.lineX1, + y0 = a.lineY0, + y1 = a.lineY1; + + a.angle = a.x, delete a.x; + a.startAngle = a.x0, delete a.x0; + a.endAngle = a.x1, delete a.x1; + a.radius = a.y, delete a.y; + a.innerRadius = a.y0, delete a.y0; + a.outerRadius = a.y1, delete a.y1; + a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0; + a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1; + a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0; + a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1; + + a.curve = function(_) { + return arguments.length ? c(curveRadial$1(_)) : c()._curve; }; - function wheeled(event, ...args) { - if (!filter.apply(this, arguments)) return; - var g = gesture(this, args).event(event), - t = this.__zoom, - k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), - p = d3Selection.pointer(event); + return a; +} - // If the mouse is in the same location as before, reuse it. - // If there were recent wheel events, reset the wheel idle timeout. - if (g.wheel) { - if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { - g.mouse[1] = t.invert(g.mouse[0] = p); - } - clearTimeout(g.wheel); - } +function pointRadial(x, y) { + return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)]; +} - // If this wheel event won’t trigger a transform change, ignore it. - else if (t.k === k) return; +function linkSource(d) { + return d.source; +} - // Otherwise, capture the mouse point and location at the start. - else { - g.mouse = [p, t.invert(p)]; - d3Transition.interrupt(this); - g.start(); - } +function linkTarget(d) { + return d.target; +} - noevent(event); - g.wheel = setTimeout(wheelidled, wheelDelay); - g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); +function link(curve) { + var source = linkSource, + target = linkTarget, + x$1 = x, + y$1 = y, + context = null; - function wheelidled() { - g.wheel = null; - g.end(); - } + function link() { + var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv); + if (!context) context = buffer = d3Path.path(); + curve(context, +x$1.apply(this, (argv[0] = s, argv)), +y$1.apply(this, argv), +x$1.apply(this, (argv[0] = t, argv)), +y$1.apply(this, argv)); + if (buffer) return context = null, buffer + "" || null; } - function mousedowned(event, ...args) { - if (touchending || !filter.apply(this, arguments)) return; - var g = gesture(this, args, true).event(event), - v = d3Selection.select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), - p = d3Selection.pointer(event, currentTarget), - currentTarget = event.currentTarget, - x0 = event.clientX, - y0 = event.clientY; + link.source = function(_) { + return arguments.length ? (source = _, link) : source; + }; - d3Drag.dragDisable(event.view); - nopropagation(event); - g.mouse = [p, this.__zoom.invert(p)]; - d3Transition.interrupt(this); - g.start(); + link.target = function(_) { + return arguments.length ? (target = _, link) : target; + }; - function mousemoved(event) { - noevent(event); - if (!g.moved) { - var dx = event.clientX - x0, dy = event.clientY - y0; - g.moved = dx * dx + dy * dy > clickDistance2; - } - g.event(event) - .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3Selection.pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); - } + link.x = function(_) { + return arguments.length ? (x$1 = typeof _ === "function" ? _ : constant(+_), link) : x$1; + }; - function mouseupped(event) { - v.on("mousemove.zoom mouseup.zoom", null); - d3Drag.dragEnable(event.view, g.moved); - noevent(event); - g.event(event).end(); - } - } + link.y = function(_) { + return arguments.length ? (y$1 = typeof _ === "function" ? _ : constant(+_), link) : y$1; + }; - function dblclicked(event, ...args) { - if (!filter.apply(this, arguments)) return; - var t0 = this.__zoom, - p0 = d3Selection.pointer(event.changedTouches ? event.changedTouches[0] : event, this), - p1 = t0.invert(p0), - k1 = t0.k * (event.shiftKey ? 0.5 : 2), - t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + link.context = function(_) { + return arguments.length ? ((context = _ == null ? null : _), link) : context; + }; - noevent(event); - if (duration > 0) d3Selection.select(this).transition().duration(duration).call(schedule, t1, p0, event); - else d3Selection.select(this).call(zoom.transform, t1, p0, event); - } + return link; +} - function touchstarted(event, ...args) { - if (!filter.apply(this, arguments)) return; - var touches = event.touches, - n = touches.length, - g = gesture(this, args, event.changedTouches.length === n).event(event), - started, i, t, p; +function curveHorizontal(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1); +} - nopropagation(event); - for (i = 0; i < n; ++i) { - t = touches[i], p = d3Selection.pointer(t, this); - p = [p, this.__zoom.invert(p), t.identifier]; - if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; - else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; - } +function curveVertical(context, x0, y0, x1, y1) { + context.moveTo(x0, y0); + context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1); +} - if (touchstarting) touchstarting = clearTimeout(touchstarting); +function curveRadial(context, x0, y0, x1, y1) { + var p0 = pointRadial(x0, y0), + p1 = pointRadial(x0, y0 = (y0 + y1) / 2), + p2 = pointRadial(x1, y0), + p3 = pointRadial(x1, y1); + context.moveTo(p0[0], p0[1]); + context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]); +} - if (started) { - if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); - d3Transition.interrupt(this); - g.start(); - } +function linkHorizontal() { + return link(curveHorizontal); +} + +function linkVertical() { + return link(curveVertical); +} + +function linkRadial() { + var l = link(curveRadial); + l.angle = l.x, delete l.x; + l.radius = l.y, delete l.y; + return l; +} + +var circle = { + draw: function(context, size) { + var r = Math.sqrt(size / pi); + context.moveTo(r, 0); + context.arc(0, 0, r, 0, tau); } +}; - function touchmoved(event, ...args) { - if (!this.__zooming) return; - var g = gesture(this, args).event(event), - touches = event.changedTouches, - n = touches.length, i, t, p, l; +var cross = { + draw: function(context, size) { + var r = Math.sqrt(size / 5) / 2; + context.moveTo(-3 * r, -r); + context.lineTo(-r, -r); + context.lineTo(-r, -3 * r); + context.lineTo(r, -3 * r); + context.lineTo(r, -r); + context.lineTo(3 * r, -r); + context.lineTo(3 * r, r); + context.lineTo(r, r); + context.lineTo(r, 3 * r); + context.lineTo(-r, 3 * r); + context.lineTo(-r, r); + context.lineTo(-3 * r, r); + context.closePath(); + } +}; - noevent(event); - for (i = 0; i < n; ++i) { - t = touches[i], p = d3Selection.pointer(t, this); - if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; - else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; - } - t = g.that.__zoom; - if (g.touch1) { - var p0 = g.touch0[0], l0 = g.touch0[1], - p1 = g.touch1[0], l1 = g.touch1[1], - dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, - dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; - t = scale(t, Math.sqrt(dp / dl)); - p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; - l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; +var tan30 = Math.sqrt(1 / 3), + tan30_2 = tan30 * 2; + +var diamond = { + draw: function(context, size) { + var y = Math.sqrt(size / tan30_2), + x = y * tan30; + context.moveTo(0, -y); + context.lineTo(x, 0); + context.lineTo(0, y); + context.lineTo(-x, 0); + context.closePath(); + } +}; + +var ka = 0.89081309152928522810, + kr = Math.sin(pi / 10) / Math.sin(7 * pi / 10), + kx = Math.sin(tau / 10) * kr, + ky = -Math.cos(tau / 10) * kr; + +var star = { + draw: function(context, size) { + var r = Math.sqrt(size * ka), + x = kx * r, + y = ky * r; + context.moveTo(0, -r); + context.lineTo(x, y); + for (var i = 1; i < 5; ++i) { + var a = tau * i / 5, + c = Math.cos(a), + s = Math.sin(a); + context.lineTo(s * r, -c * r); + context.lineTo(c * x - s * y, s * x + c * y); } - else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; - else return; + context.closePath(); + } +}; + +var square = { + draw: function(context, size) { + var w = Math.sqrt(size), + x = -w / 2; + context.rect(x, x, w, w); + } +}; - g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); +var sqrt3 = Math.sqrt(3); + +var triangle = { + draw: function(context, size) { + var y = -Math.sqrt(size / (sqrt3 * 3)); + context.moveTo(0, y * 2); + context.lineTo(-sqrt3 * y, -y); + context.lineTo(sqrt3 * y, -y); + context.closePath(); } +}; - function touchended(event, ...args) { - if (!this.__zooming) return; - var g = gesture(this, args).event(event), - touches = event.changedTouches, - n = touches.length, i, t; +var c = -0.5, + s = Math.sqrt(3) / 2, + k = 1 / Math.sqrt(12), + a = (k / 2 + 1) * 3; - nopropagation(event); - if (touchending) clearTimeout(touchending); - touchending = setTimeout(function() { touchending = null; }, touchDelay); - for (i = 0; i < n; ++i) { - t = touches[i]; - if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; - else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; - } - if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; - if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); - else { - g.end(); - // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. - if (g.taps === 2) { - t = d3Selection.pointer(t, this); - if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { - var p = d3Selection.select(this).on("dblclick.zoom"); - if (p) p.apply(this, arguments); - } - } - } +var wye = { + draw: function(context, size) { + var r = Math.sqrt(size / a), + x0 = r / 2, + y0 = r * k, + x1 = x0, + y1 = r * k + r, + x2 = -x1, + y2 = y1; + context.moveTo(x0, y0); + context.lineTo(x1, y1); + context.lineTo(x2, y2); + context.lineTo(c * x0 - s * y0, s * x0 + c * y0); + context.lineTo(c * x1 - s * y1, s * x1 + c * y1); + context.lineTo(c * x2 - s * y2, s * x2 + c * y2); + context.lineTo(c * x0 + s * y0, c * y0 - s * x0); + context.lineTo(c * x1 + s * y1, c * y1 - s * x1); + context.lineTo(c * x2 + s * y2, c * y2 - s * x2); + context.closePath(); } +}; - zoom.wheelDelta = function(_) { - return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; - }; +var symbols = [ + circle, + cross, + diamond, + square, + star, + triangle, + wye +]; - zoom.filter = function(_) { - return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; - }; +function symbol(type, size) { + var context = null; + type = typeof type === "function" ? type : constant(type || circle); + size = typeof size === "function" ? size : constant(size === undefined ? 64 : +size); - zoom.touchable = function(_) { - return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; - }; + function symbol() { + var buffer; + if (!context) context = buffer = d3Path.path(); + type.apply(this, arguments).draw(context, +size.apply(this, arguments)); + if (buffer) return context = null, buffer + "" || null; + } - zoom.extent = function(_) { - return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + symbol.type = function(_) { + return arguments.length ? (type = typeof _ === "function" ? _ : constant(_), symbol) : type; }; - zoom.scaleExtent = function(_) { - return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + symbol.size = function(_) { + return arguments.length ? (size = typeof _ === "function" ? _ : constant(+_), symbol) : size; }; - zoom.translateExtent = function(_) { - return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + symbol.context = function(_) { + return arguments.length ? (context = _ == null ? null : _, symbol) : context; }; - zoom.constrain = function(_) { - return arguments.length ? (constrain = _, zoom) : constrain; - }; + return symbol; +} - zoom.duration = function(_) { - return arguments.length ? (duration = +_, zoom) : duration; - }; +function noop() {} - zoom.interpolate = function(_) { - return arguments.length ? (interpolate = _, zoom) : interpolate; - }; +function point$3(that, x, y) { + that._context.bezierCurveTo( + (2 * that._x0 + that._x1) / 3, + (2 * that._y0 + that._y1) / 3, + (that._x0 + 2 * that._x1) / 3, + (that._y0 + 2 * that._y1) / 3, + (that._x0 + 4 * that._x1 + x) / 6, + (that._y0 + 4 * that._y1 + y) / 6 + ); +} - zoom.on = function() { - var value = listeners.on.apply(listeners, arguments); - return value === listeners ? zoom : value; - }; +function Basis(context) { + this._context = context; +} - zoom.clickDistance = function(_) { - return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); - }; +Basis.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 3: point$3(this, this._x1, this._y1); // proceed + case 2: this._context.lineTo(this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; - zoom.tapDistance = function(_) { - return arguments.length ? (tapDistance = +_, zoom) : tapDistance; - }; +function basis(context) { + return new Basis(context); +} + +function BasisClosed(context) { + this._context = context; +} + +BasisClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x2, this._y2); + this._context.closePath(); + break; + } + case 2: { + this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3); + this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x2, this._y2); + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x2 = x, this._y2 = y; break; + case 1: this._point = 2; this._x3 = x, this._y3 = y; break; + case 2: this._point = 3; this._x4 = x, this._y4 = y; this._context.moveTo((this._x0 + 4 * this._x1 + x) / 6, (this._y0 + 4 * this._y1 + y) / 6); break; + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; + +function basisClosed(context) { + return new BasisClosed(context); +} + +function BasisOpen(context) { + this._context = context; +} + +BasisOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; var x0 = (this._x0 + 4 * this._x1 + x) / 6, y0 = (this._y0 + 4 * this._y1 + y) / 6; this._line ? this._context.lineTo(x0, y0) : this._context.moveTo(x0, y0); break; + case 3: this._point = 4; // proceed + default: point$3(this, x, y); break; + } + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + } +}; - return zoom; +function basisOpen(context) { + return new BasisOpen(context); } -exports.zoom = zoom; -exports.zoomIdentity = identity; -exports.zoomTransform = transform; - -Object.defineProperty(exports, '__esModule', { value: true }); - -}))); -}); - -var d3_node = createCommonjsModule(function (module, exports) { - -Object.defineProperty(exports, '__esModule', { value: true }); - +class Bump { + constructor(context, x) { + this._context = context; + this._x = x; + } + areaStart() { + this._line = 0; + } + areaEnd() { + this._line = NaN; + } + lineStart() { + this._point = 0; + } + lineEnd() { + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + } + point(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: { + this._point = 1; + if (this._line) this._context.lineTo(x, y); + else this._context.moveTo(x, y); + break; + } + case 1: this._point = 2; // proceed + default: { + if (this._x) this._context.bezierCurveTo(this._x0 = (this._x0 + x) / 2, this._y0, this._x0, y, x, y); + else this._context.bezierCurveTo(this._x0, this._y0 = (this._y0 + y) / 2, x, this._y0, x, y); + break; + } + } + this._x0 = x, this._y0 = y; + } +} +function bumpX(context) { + return new Bump(context, true); +} +function bumpY(context) { + return new Bump(context, false); +} +function Bundle(context, beta) { + this._basis = new Basis(context); + this._beta = beta; +} +Bundle.prototype = { + lineStart: function() { + this._x = []; + this._y = []; + this._basis.lineStart(); + }, + lineEnd: function() { + var x = this._x, + y = this._y, + j = x.length - 1; + if (j > 0) { + var x0 = x[0], + y0 = y[0], + dx = x[j] - x0, + dy = y[j] - y0, + i = -1, + t; + while (++i <= j) { + t = i / j; + this._basis.point( + this._beta * x[i] + (1 - this._beta) * (x0 + t * dx), + this._beta * y[i] + (1 - this._beta) * (y0 + t * dy) + ); + } + } + this._x = this._y = null; + this._basis.lineEnd(); + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; +var bundle = (function custom(beta) { + function bundle(context) { + return beta === 1 ? new Basis(context) : new Bundle(context, beta); + } + bundle.beta = function(beta) { + return custom(+beta); + }; + return bundle; +})(0.85); +function point$2(that, x, y) { + that._context.bezierCurveTo( + that._x1 + that._k * (that._x2 - that._x0), + that._y1 + that._k * (that._y2 - that._y0), + that._x2 + that._k * (that._x1 - x), + that._y2 + that._k * (that._y1 - y), + that._x2, + that._y2 + ); +} +function Cardinal(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} +Cardinal.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: point$2(this, this._x1, this._y1); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; this._x1 = x, this._y1 = y; break; + case 2: this._point = 3; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; +var cardinal = (function custom(tension) { + function cardinal(context) { + return new Cardinal(context, tension); + } + cardinal.tension = function(tension) { + return custom(+tension); + }; + return cardinal; +})(0); +function CardinalClosed(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} +CardinalClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; +var cardinalClosed = (function custom(tension) { + function cardinal(context) { + return new CardinalClosed(context, tension); + } + cardinal.tension = function(tension) { + return custom(+tension); + }; + return cardinal; +})(0); +function CardinalOpen(context, tension) { + this._context = context; + this._k = (1 - tension) / 6; +} +CardinalOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$2(this, x, y); break; + } + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; +var cardinalOpen = (function custom(tension) { + function cardinal(context) { + return new CardinalOpen(context, tension); + } + cardinal.tension = function(tension) { + return custom(+tension); + }; + return cardinal; +})(0); -var version = "6.7.0"; +function point$1(that, x, y) { + var x1 = that._x1, + y1 = that._y1, + x2 = that._x2, + y2 = that._y2; -exports.version = version; -Object.keys(d3Array).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Array[k]; - } - }); -}); -Object.keys(d3Axis).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Axis[k]; - } - }); -}); -Object.keys(d3Brush).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Brush[k]; - } - }); -}); -Object.keys(d3Chord).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Chord[k]; - } - }); -}); -Object.keys(d3Color).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Color[k]; - } - }); -}); -Object.keys(d3Contour).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Contour[k]; - } - }); -}); -Object.keys(d3Delaunay).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Delaunay[k]; - } - }); -}); -Object.keys(d3Dispatch).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Dispatch[k]; - } - }); -}); -Object.keys(d3Drag).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Drag[k]; - } - }); -}); -Object.keys(d3Dsv).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Dsv[k]; - } - }); -}); -Object.keys(d3Ease).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Ease[k]; - } - }); -}); -Object.keys(d3Fetch).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Fetch[k]; - } - }); -}); -Object.keys(d3Force).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Force[k]; - } - }); -}); -Object.keys(d3Format).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Format[k]; - } - }); -}); -Object.keys(d3Geo).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Geo[k]; - } - }); -}); -Object.keys(d3Hierarchy).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Hierarchy[k]; - } - }); -}); -Object.keys(d3Interpolate).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Interpolate[k]; - } - }); -}); -Object.keys(d3Path).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Path[k]; - } - }); -}); -Object.keys(d3Polygon).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Polygon[k]; - } - }); -}); -Object.keys(d3Quadtree).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Quadtree[k]; - } - }); -}); -Object.keys(d3Random).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Random[k]; - } - }); -}); -Object.keys(d3Scale).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Scale[k]; - } - }); -}); -Object.keys(d3ScaleChromatic).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3ScaleChromatic[k]; - } - }); -}); -Object.keys(d3Selection).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Selection[k]; - } - }); -}); -Object.keys(d3Shape).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Shape[k]; - } - }); -}); -Object.keys(d3Time).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Time[k]; - } - }); -}); -Object.keys(d3TimeFormat).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3TimeFormat[k]; - } - }); -}); -Object.keys(d3Timer).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Timer[k]; - } - }); -}); -Object.keys(d3Transition).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Transition[k]; - } - }); -}); -Object.keys(d3Zoom).forEach(function (k) { - if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { - enumerable: true, - get: function () { - return d3Zoom[k]; - } - }); -}); -}); + if (that._l01_a > epsilon) { + var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a, + n = 3 * that._l01_a * (that._l01_a + that._l12_a); + x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n; + y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n; + } -const arcDiagram = (graph, app, currFile, modal, width, height) => { - const data = graphlibToD3(graph); - const margin = { top: 20, right: 20, bottom: 20, left: 150 }; - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", height) - .attr("width", width); - const nodes = data.nodes.map(({ id, name }) => ({ - id, - name, - sourceLinks: [], - targetLinks: [], - })); - const nodeById = new Map(nodes.map((d) => [d.id, d])); - const links = data.links.map(({ source, target }) => ({ - source: nodeById.get(source), - target: nodeById.get(target), - })); - for (const link of links) { - const { source, target } = link; - source.sourceLinks.push(link); - target.targetLinks.push(link); - } - svg.append("style").text(` - -path { - stroke: #808080; - opacity: 0.8; -} - -text { - stroke: var(--text-a); - opacity: 0.8; -} - - -.hover g.primary text { - fill: black; -} - -.hover g.secondary text { - fill: #333; -} - -.hover .secondary { - color: red; -} - -.hover path.primary { - stroke: #333; - stroke-opacity: 1; -} - -.hover rect { - opacity: 1; - cursor: pointer; -} - -`); - const y = d3_node.scalePoint(nodes.map((d) => d.name).sort(d3_node.ascending), [ - margin.top, - height - margin.bottom, - ]); - const label = svg - .append("g") - .attr("font-family", "sans-serif") - .attr("font-size", 10) - .attr("text-anchor", "end") - .selectAll("g") - .data(nodes) - .join("g") - .attr("transform", (d) => `translate(${margin.left},${(d.y = y(d.name))})`) - .call((g) => g - .append("text") - .attr("x", -6) - .attr("dy", "0.35em") - // .attr("fill", (d) => d3.lab(color(d.group)).darker(2)) - .text((d) => d.name)) - .call((g) => g.append("circle").attr("r", 3) - // .attr("fill", (d) => color(d.group)) - ); - const path = svg - .insert("g", "*") - .attr("fill", "none") - .attr("stroke-opacity", 0.6) - .attr("stroke-width", 1.5) - .selectAll("path") - .data(links) - .join("path") - // .attr("stroke", (d) => - // d.source.group === d.target.group ? color(d.source.group) : "#aaa" - // ) - .attr("d", arc); - const step = 104; - const nodeClick = (event, dest) => { - openOrSwitch(app, dest, event); - modal.close(); - }; - svg - .append("g") - .attr("fill", "none") - .attr("pointer-events", "all") - .selectAll("rect") - .data(nodes) - .join("rect") - .attr("width", margin.left + 40) - .attr("height", step) - .attr("y", (d) => y(d.name) - step / 2) - .on("mouseover", (d) => { - svg.classed("hover", true); - label.classed("primary", (n) => n === d); - label.classed("secondary", (n) => n.sourceLinks.some((l) => l.target === d) || - n.targetLinks.some((l) => l.source === d)); - path - .classed("primary", (l) => l.source === d || l.target === d) - .filter(".primary") - .raise(); - }) - .on("mouseout", (d) => { - svg.classed("hover", false); - label.classed("primary", false); - label.classed("secondary", false); - path.classed("primary", false).order(); - }) - .on("click", (event, d) => { - nodeClick(event, d.name); - }); - // function update() { - // y.domain(nodes.sort(viewof order.value).map(d => d.id)); - // const t = svg.transition() - // .duration(750); - // label.transition(t) - // .delay((d, i) => i * 20) - // .attrTween("transform", d => { - // const i = d3.interpolateNumber(d.y, y(d.id)); - // return t => `translate(${margin.left},${d.y = i(t)})`; - // }); - // path.transition(t) - // .duration(750 + nodes.length * 20) - // .attrTween("d", d => () => arc(d)); - // overlay.transition(t) - // .delay((d, i) => i * 20) - // .attr("y", d => y(d.id) - step / 2); - // } - // viewof order.addEventListener("input", update); - // invalidation.then(() => viewof order.removeEventListener("input", update)); - function arc(d) { - const y1 = d.source.y; - const y2 = d.target.y; - const r = Math.abs(y2 - y1) / 2; - return `M${margin.left},${y1}A${r},${r} 0,0,${y1 < y2 ? 1 : 0} ${margin.left},${y2}`; - } - function zoomed({ transform }) { - svg.attr("transform", transform); - } - svg.call(d3_node.zoom() - .extent([ - [0, 0], - [width, height], - ]) - .scaleExtent([0.5, 8]) - .on("zoom", zoomed)); + if (that._l23_a > epsilon) { + var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a, + m = 3 * that._l23_a * (that._l23_a + that._l12_a); + x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m; + y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m; + } + + that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2); +} + +function CatmullRom(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRom.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x2, this._y2); break; + case 3: this.point(this._x2, this._y2); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; // proceed + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } +}; + +var catmullRom = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomClosed(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = + this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 1: { + this._context.moveTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 2: { + this._context.lineTo(this._x3, this._y3); + this._context.closePath(); + break; + } + case 3: { + this.point(this._x3, this._y3); + this.point(this._x4, this._y4); + this.point(this._x5, this._y5); + break; + } + } + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; this._x3 = x, this._y3 = y; break; + case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break; + case 2: this._point = 3; this._x5 = x, this._y5 = y; break; + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } }; -const circlePacking = (graph, app, currFile, modal, width, height) => { - const flatAdj = dfsFlatAdjList(graph, currFile.basename); - console.log({ flatAdj }); - const hierarchy = d3_node.stratify()(flatAdj); - console.log({ hierarchy }); - const adjList = bfsAdjList(graph, currFile.basename); - console.log({ adjList }); - const noDoubles = [...adjList]; - noDoubles.forEach((a, i) => { - if (noDoubles.some((b, j) => i !== j && a.name === b.name)) { - const index = noDoubles.findIndex((b, j) => i !== j && a.name === b.name); - noDoubles.splice(index, 1); - } - }); - // const noDoubles = adjList.filter((a) => { - // !adjList.some((b) => { - // console.log({ a, b }); - // return a.name !== b.name && a.parentId === b.parentId; - // }); - // }); - console.log({ noDoubles }); - // const root = stratify(noDoubles); - // console.log(root); - // const hierarchy: d3Tree = createTreeHierarchy(noDoubles, { - // id: "name", - // excludeParent: true, - // }); - // console.log({ hierarchy }); - const linkArr = noDoubles.map((d) => { - return { source: d.name, target: d.parentId }; - }); - const links = linkArr.map((d) => Object.create(d)); - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", height) - .attr("width", width); - const nodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent"); - // Initialize the circle: all located at the center of the svg area - const node = svg - .append("g") - .selectAll("circle") - .data(noDoubles) - .join("circle") - .attr("r", (d) => Math.round(d.height / 10) + 10) - .attr("cx", width / 2) - .attr("cy", height / 2) - .style("fill", nodeColour) - .style("fill-opacity", 0.6) - .attr("stroke", nodeColour) - .style("stroke-width", 4); - node.attr("aria-label", (d) => d.name); - const nodeClick = (event, dest) => { - app.workspace.getActiveFile(); - openOrSwitch(app, dest, event); - modal.close(); - }; - node.on("click", (event, d) => { - nodeClick(event, d.name); - }); - svg - .append("g") - .attr("stroke", "#868282") - .attr("stroke-opacity", 0.6) - .selectAll("line") - .data(links) - .join("line") - .attr("stroke-width", 0.8); - // Features of the forces applied to the nodes: - const simulation = d3_node.forceSimulation() - .force("center", d3_node.forceCenter() - .x(width / 2) - .y(height / 2)) // Attraction to the center of the svg area - .force("charge", d3_node.forceManyBody().strength(0.5)) // Nodes are attracted one each other of value is > 0 - .force("collide", d3_node.forceCollide().strength(0.025).radius(30).iterations(1)); // Force that avoids circle overlapping - // Apply these forces to the nodes and update their positions. - // Once the force algorithm is happy with positions ('alpha' value is low enough), simulations will stop. - simulation.nodes(noDoubles).on("tick", function (d) { - node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); - }); - function zoomed({ transform }) { - node.attr("transform", transform); - } - svg.call(d3_node.zoom() - .extent([ - [0, 0], - [width, height], - ]) - .scaleExtent([0.5, 8]) - .on("zoom", zoomed)); - const drag = (simulation) => { - function dragstarted(event, d) { - if (!event.active) - simulation.alphaTarget(0.3).restart(); - d.fx = d.x; - d.fy = d.y; - } - function dragged(event, d) { - d.fx = event.x; - d.fy = event.y; - } - function dragended(event, d) { - if (!event.active) - simulation.alphaTarget(0); - d.fx = null; - d.fy = null; - } - return d3_node.drag() - .on("start", dragstarted) - .on("drag", dragged) - .on("end", dragended); - }; - node.call(drag(simulation)); - // const pack = (data) => - // d3.pack().size([width, height]).padding(3)( - // d3 - // .hierarchy(data) - // .sum((d) => d.value) - // .sort((a, b) => b.value - a.value) - // ); - // const root = pack(hierarchy); - // const svg = d3 - // .select(".d3-graph") - // .append("svg") - // .attr("height", height) - // .attr("width", width) - // .style("font", "10px sans-serif") - // .style("overflow", "visible") - // .attr("text-anchor", "middle"); - // const node = svg - // .append("g") - // .attr("pointer-events", "all") - // .selectAll("g") - // .data(root.descendants()) - // .join("g") - // .attr("transform", (d) => `translate(${d.x},${d.y})`); - // node - // .append("circle") - // .attr("r", (d) => d.r) - // .attr("stroke", (d) => (d.children ? "#bbb" : "none")) - // .attr("fill", (d) => (d.children ? "none" : "#ddd")); - // const leaf = node.filter((d) => !d.children); - // leaf.select("circle"); - // // leaf - // // .append("clipPath") - // // .attr("id", (d) => (d.clipUid = DOM.uid("clip")).id) - // // .append("use") - // // .attr("xlink:href", (d) => d.leafUid.href); - // // leaf - // // .append("text") - // // .attr("clip-path", (d) => d.clipUid) - // // .selectAll("tspan") - // // .data((d) => d.data.name.split(/(?=[A-Z][^A-Z])/g)) - // // .join("tspan") - // // .attr("x", 0) - // // .attr("y", (d, i, nodes) => `${i - nodes.length / 2 + 0.8}em`) - // // .text((d) => d); - // node.append("title").text( - // (d) => `${d - // .ancestors() - // .map((d) => d.data.data.name) - // .reverse() - // .join("/")} - // ${d.value.toLocaleString()}` - // ); +var catmullRomClosed = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function CatmullRomOpen(context, alpha) { + this._context = context; + this._alpha = alpha; +} + +CatmullRomOpen.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = this._x2 = + this._y0 = this._y1 = this._y2 = NaN; + this._l01_a = this._l12_a = this._l23_a = + this._l01_2a = this._l12_2a = this._l23_2a = + this._point = 0; + }, + lineEnd: function() { + if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + + if (this._point) { + var x23 = this._x2 - x, + y23 = this._y2 - y; + this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha)); + } + + switch (this._point) { + case 0: this._point = 1; break; + case 1: this._point = 2; break; + case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break; + case 3: this._point = 4; // proceed + default: point$1(this, x, y); break; + } + + this._l01_a = this._l12_a, this._l12_a = this._l23_a; + this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a; + this._x0 = this._x1, this._x1 = this._x2, this._x2 = x; + this._y0 = this._y1, this._y1 = this._y2, this._y2 = y; + } }; -const edgeBundling = (graph, app, currFile, modal, width, height) => { - const flatAdj = dfsFlatAdjList(graph, currFile.basename); - console.log({ flatAdj }); - const hier = d3_node.stratify()(flatAdj); - console.log({ hier }); - const PADDING_BUBBLE = 15; // distance between edge end and bubble - const PADDING_LABEL = 30; // distance between edge end and engineer name - const BUBBLE_SIZE_MIN = 4; - const BUBBLE_SIZE_MAX = 20; - var diameter = 560, radius = diameter / 2, innerRadius = radius - 170; // between center and edge end - // The 'cluster' function takes 1 argument as input. It also has methods (??) like cluster.separation(), cluster.size() and cluster.nodeSize() - var cluster = d3_node.cluster().size([360, innerRadius]); - var line = d3_node.lineRadial() - .curve(d3_node.curveBundle.beta(0.85)) - .radius(function (d) { - return d[1]; - }) - .angle(function (d) { - return (d[0] / 180) * Math.PI; - }); - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", height) - .attr("width", width) - .append("g") - .attr("transform", "translate(" + radius + "," + radius + ")"); - var link = svg.append("g").selectAll(".link"), label = svg.append("g").selectAll(".label"), bubble = svg.append("g").selectAll(".bubble"); - // Add a scale for bubble size - var bubbleSizeScale = d3_node.scaleLinear() - .domain([0, 100]) - .range([BUBBLE_SIZE_MIN, BUBBLE_SIZE_MAX]); - // Scale for the bubble size - // If wanna see your data - // console.log(hierarchicalData) - // Reformat the data - var root = packageHierarchy(hier) - //debugger; - .sum(function (d) { - console.log(d); - return d.height; - }); - // console.log(root) - // Build an object that gives feature of each leaves - cluster(root); - const leaves = root.leaves(); - // Leaves is an array of Objects. 1 item = one leaf. Provides x and y for leaf position in the svg. Also gives details about its parent. - link - .data(packageImports(leaves)) - .enter() - .append("path") - .each(function (d) { - (d.source = d[0]), (d.target = d[d.length - 1]); - }) - .attr("class", "link") - .attr("d", line) - .attr("fill", "none") - .attr("stroke", "black"); - label - .data(leaves) - .enter() - .append("text") - .attr("class", "label") - .attr("dy", "0.31em") - .attr("transform", function (d) { - return ("rotate(" + - (d.x - 90) + - ")translate(" + - (d.y + PADDING_LABEL) + - ",0)" + - (d.x < 180 ? "" : "rotate(180)")); - }) - .attr("text-anchor", function (d) { - return d.x < 180 ? "start" : "end"; - }) - .text(function (d) { - return d.data.key; - }); - bubble - .data(leaves) - .enter() - .append("circle") - .attr("class", "bubble") - .attr("transform", function (d) { - return ("rotate(" + (d.x - 90) + ")translate(" + (d.y + PADDING_BUBBLE) + ",0)"); - }) - .attr("r", (d) => bubbleSizeScale(d.value)) - .attr("stroke", "black") - .attr("fill", "#69a3b2") - .style("opacity", 0.2); - // Lazily construct the package hierarchy from class names. - function packageHierarchy(classes) { - var map = {}; - function find(name, data) { - var node = map[name], i; - if (!node) { - node = map[name] = data || { name: name, children: [] }; - if (name.length) { - node.parent = find(name.substring(0, (i = name.lastIndexOf(".")))); - node.parent.children.push(node); - node.key = name.substring(i + 1); - } - } - return node; - } - classes.forEach(function (d) { - find(d.name, d); - }); - return d3_node.hierarchy(map[""]); - } - // Return a list of imports for the given array of nodes. - function packageImports(nodes) { - var map = {}, imports = []; - // Compute a map from name to node. - nodes.forEach(function (d) { - map[d.data.name] = d; - }); - // For each import, construct a link from the source to target node. - nodes.forEach(function (d) { - if (d.data.imports) - d.data.imports.forEach(function (i) { - imports.push(map[d.data.name].path(map[i])); - }); - }); - return imports; - } +var catmullRomOpen = (function custom(alpha) { + + function catmullRom(context) { + return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0); + } + + catmullRom.alpha = function(alpha) { + return custom(+alpha); + }; + + return catmullRom; +})(0.5); + +function LinearClosed(context) { + this._context = context; +} + +LinearClosed.prototype = { + areaStart: noop, + areaEnd: noop, + lineStart: function() { + this._point = 0; + }, + lineEnd: function() { + if (this._point) this._context.closePath(); + }, + point: function(x, y) { + x = +x, y = +y; + if (this._point) this._context.lineTo(x, y); + else this._point = 1, this._context.moveTo(x, y); + } +}; + +function linearClosed(context) { + return new LinearClosed(context); +} + +function sign(x) { + return x < 0 ? -1 : 1; +} + +// Calculate the slopes of the tangents (Hermite-type interpolation) based on +// the following paper: Steffen, M. 1990. A Simple Method for Monotonic +// Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO. +// NOV(II), P. 443, 1990. +function slope3(that, x2, y2) { + var h0 = that._x1 - that._x0, + h1 = x2 - that._x1, + s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0), + s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0), + p = (s0 * h1 + s1 * h0) / (h0 + h1); + return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0; +} + +// Calculate a one-sided slope. +function slope2(that, t) { + var h = that._x1 - that._x0; + return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t; +} + +// According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations +// "you can express cubic Hermite interpolation in terms of cubic Bézier curves +// with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1". +function point(that, t0, t1) { + var x0 = that._x0, + y0 = that._y0, + x1 = that._x1, + y1 = that._y1, + dx = (x1 - x0) / 3; + that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1); +} + +function MonotoneX(context) { + this._context = context; +} + +MonotoneX.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x0 = this._x1 = + this._y0 = this._y1 = + this._t0 = NaN; + this._point = 0; + }, + lineEnd: function() { + switch (this._point) { + case 2: this._context.lineTo(this._x1, this._y1); break; + case 3: point(this, this._t0, slope2(this, this._t0)); break; + } + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + this._line = 1 - this._line; + }, + point: function(x, y) { + var t1 = NaN; + + x = +x, y = +y; + if (x === this._x1 && y === this._y1) return; // Ignore coincident points. + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; break; + case 2: this._point = 3; point(this, slope2(this, t1 = slope3(this, x, y)), t1); break; + default: point(this, this._t0, t1 = slope3(this, x, y)); break; + } + + this._x0 = this._x1, this._x1 = x; + this._y0 = this._y1, this._y1 = y; + this._t0 = t1; + } +}; + +function MonotoneY(context) { + this._context = new ReflectContext(context); +} + +(MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) { + MonotoneX.prototype.point.call(this, y, x); +}; + +function ReflectContext(context) { + this._context = context; +} + +ReflectContext.prototype = { + moveTo: function(x, y) { this._context.moveTo(y, x); }, + closePath: function() { this._context.closePath(); }, + lineTo: function(x, y) { this._context.lineTo(y, x); }, + bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); } +}; + +function monotoneX(context) { + return new MonotoneX(context); +} + +function monotoneY(context) { + return new MonotoneY(context); +} + +function Natural(context) { + this._context = context; +} + +Natural.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = []; + this._y = []; + }, + lineEnd: function() { + var x = this._x, + y = this._y, + n = x.length; + + if (n) { + this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]); + if (n === 2) { + this._context.lineTo(x[1], y[1]); + } else { + var px = controlPoints(x), + py = controlPoints(y); + for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) { + this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]); + } + } + } + + if (this._line || (this._line !== 0 && n === 1)) this._context.closePath(); + this._line = 1 - this._line; + this._x = this._y = null; + }, + point: function(x, y) { + this._x.push(+x); + this._y.push(+y); + } +}; + +// See https://www.particleincell.com/2012/bezier-splines/ for derivation. +function controlPoints(x) { + var i, + n = x.length - 1, + m, + a = new Array(n), + b = new Array(n), + r = new Array(n); + a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1]; + for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1]; + a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n]; + for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1]; + a[n - 1] = r[n - 1] / b[n - 1]; + for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i]; + b[n - 1] = (x[n] + a[n - 1]) / 2; + for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1]; + return [a, b]; +} + +function natural(context) { + return new Natural(context); +} + +function Step(context, t) { + this._context = context; + this._t = t; +} + +Step.prototype = { + areaStart: function() { + this._line = 0; + }, + areaEnd: function() { + this._line = NaN; + }, + lineStart: function() { + this._x = this._y = NaN; + this._point = 0; + }, + lineEnd: function() { + if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y); + if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath(); + if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line; + }, + point: function(x, y) { + x = +x, y = +y; + switch (this._point) { + case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break; + case 1: this._point = 2; // proceed + default: { + if (this._t <= 0) { + this._context.lineTo(this._x, y); + this._context.lineTo(x, y); + } else { + var x1 = this._x * (1 - this._t) + x * this._t; + this._context.lineTo(x1, this._y); + this._context.lineTo(x1, y); + } + break; + } + } + this._x = x, this._y = y; + } }; -const forceDirectedG = (graph, app, currFile, modal, width, height) => { - modal.plugin; - let nodeToGetTo = currFile.basename; - console.log({ nodeToGetTo }); - console.time("Find all paths"); - // let pathsFromNodeToGetTo = graphlib.alg.dijkstra(graph, nodeToGetTo); - console.timeEnd("Find all paths"); - const defaultNodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent"); - let currNodeColour = defaultNodeColour; - const colourChangeInput = d3_node.select(".d3-graph") - .append("input") - .attr("type", "color"); - colourChangeInput.on("change", function changeColor(el) { - currNodeColour = el.target.value; - node - .transition() - .duration(300) - .style("fill", (d) => { - if (d.index === currNodeIndex) - return; - return currNodeColour; - }); - }); - // const saveLayoutButton = modal.contentEl.createEl('button', { text: 'Save Layout' }) - // .addEventListener('click', saveGraph) - const data = graphlibToD3(graph); - const links = data.links.map((d) => Object.create(d)); - const currNode = data.nodes.find((node) => node.name === currFile.basename); - let currNodeIndex; - if (!currNode) { - const id = data.nodes.length; - data.nodes.push({ id, name: currFile.basename }); - currNodeIndex = id; - } - else { - currNodeIndex = currNode.id; - } - const nodes = data.nodes.map((d) => Object.create(d)); - const simulation = d3_node.forceSimulation(nodes) - .force("link", d3_node.forceLink(links).id((d) => d.id)) - .force("charge", d3_node.forceManyBody().strength(-8)) - .force("center", d3_node.forceCenter(width / 2, height / 2).strength(0.5)); - const drag = (simulation) => { - function dragstarted(event, d) { - if (!event.active) - simulation.alphaTarget(0.3).restart(); - d.fx = d.x; - d.fy = d.y; - } - function dragged(event, d) { - d.fx = event.x; - d.fy = event.y; - } - function dragended(event, d) { - if (!event.active) - simulation.alphaTarget(0); - d.fx = null; - d.fy = null; - } - return d3_node.drag() - .on("start", dragstarted) - .on("drag", dragged) - .on("end", dragended); - }; - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", height) - .attr("width", width) - .attr("class", "forceDirectedG"); - const link = svg - .append("g") - .attr("stroke", "#868282") - .attr("stroke-opacity", 0.6) - .selectAll("line") - .data(links) - .join("line") - .attr("stroke-width", 0.8) - .attr("marker-end", "url(#end)"); - svg - .append("svg:g") - .selectAll("path") - .data(links) - .enter() - .append("svg:path") - // .attr("class", function(d) { return "link " + d.type; }) - .attr("class", "link") - .attr("marker-end", "url(#end)"); - svg - .append("svg:defs") - .selectAll("marker") - .data(["end"]) // Different link/path types can be defined here - .enter() - .append("svg:marker") // This section adds in the arrows - .attr("id", String) - .attr("viewBox", "0 -5 10 10") - .attr("refX", 20) - .attr("refY", 0.1) - .attr("markerWidth", 6) - .attr("markerHeight", 6) - .attr("orient", "auto") - // .attr("stroke", "#868282") - .attr("stroke-width", 10) - .append("svg:path") - .attr("d", "M0,-5L10,0L0,5"); - const nameFromIndex = (d) => data.nodes.find((node) => node.id === d.index).name; - const node = svg - .append("g") - .selectAll("circle") - .data(nodes) - .join("circle") - .attr("r", 5) - .attr("fill", (d) => { - if (nameFromIndex(d) === currFile.basename) { - return "#ffffff"; - } - else { - return currNodeColour; - } - }) - .call(drag(simulation)); - node.attr("aria-label", (d) => d.name); - const nodeClick = (event, dest) => { - openOrSwitch(app, dest, event); - modal.close(); - }; - node.on("click", (event, d) => { - nodeClick(event, d.name); - }); - node.on("mousedown", (event, d) => { - if (event.button === 2) { - nodeToGetTo = d.name; - node.style("fill", (n) => { - if (n.name === nodeToGetTo) { - return "#ff0000"; - } - else - return currNodeColour; - }); - // pathsFromNodeToGetTo = graphlib.alg.dijkstra(graph, nodeToGetTo); - } - }); - function linked(a, b) { - if (a === b) - return true; - const linkedArr = links.find((link) => (link.source.index === a && link.target.index === b) || - (link.target.index === a && link.source.index === b)); - return !!linkedArr; - } - // function walkDijkstraPaths( - // paths: { [node: string]: graphlib.Path }, - // startNode: string - // ) { - // if (startNode === nodeToGetTo || paths[startNode].distance === Infinity) - // return []; - // let step = startNode; - // const path: string[] = [startNode]; - // let i = 0; - // const MAX = 300; - // while (paths[step].predecessor !== nodeToGetTo && i < MAX) { - // i++; - // step = paths[step].predecessor; - // path.push(step); - // } - // if (i >= MAX) return []; - // path.push(nodeToGetTo); - // return path; - // } - node - .on("mouseover", (event, d) => { - node - .transition() - .duration(150) - .style("opacity", (o) => { - return linked(d.index, o.index) ? 1 : 0.2; - }); - link - .transition() - .duration(150) - .style("opacity", function (o) { - return o.source.index === d.index || o.target.index === d.index - ? 1 - : 0.2; - }); - // Highlight path from hovered node to currNode - nameFromIndex(d); - // const path = walkDijkstraPaths(pathsFromNodeToGetTo, hoveredNode); - // if (path.length) { - // link - // .transition() - // .duration(150) - // .style("stroke", function (link) { - // if ( - // path.includes(nameFromIndex(link.source)) && - // path.includes(nameFromIndex(link.target)) - // ) - // return currNodeColour; - // }) - // .style("opacity", function (link) { - // if ( - // path.includes(nameFromIndex(link.source)) && - // path.includes(nameFromIndex(link.target)) - // ) - // return 1; - // }); - // } - }) - .on("mouseout", unfocus); - function unfocus() { - // labelNode.attr("display", "block"); - node.style("opacity", 1); - link.style("opacity", 1).style("stroke", "#868282"); - } - simulation.on("tick", () => { - link - .attr("x1", (d) => d.source.x) - .attr("y1", (d) => d.source.y) - .attr("x2", (d) => d.target.x) - .attr("y2", (d) => d.target.y); - node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); - }); - function zoomed({ transform }) { - node.attr("transform", transform); - link.attr("transform", transform); - } - svg.call(d3_node.zoom() - .extent([ - [0, 0], - [width, height], - ]) - .scaleExtent([0.5, 10]) - .on("zoom", zoomed)); +function step(context) { + return new Step(context, 0.5); +} + +function stepBefore(context) { + return new Step(context, 0); +} + +function stepAfter(context) { + return new Step(context, 1); +} + +function none$1(series, order) { + if (!((n = series.length) > 1)) return; + for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) { + s0 = s1, s1 = series[order[i]]; + for (j = 0; j < m; ++j) { + s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1]; + } + } +} + +function none(series) { + var n = series.length, o = new Array(n); + while (--n >= 0) o[n] = n; + return o; +} + +function stackValue(d, key) { + return d[key]; +} + +function stackSeries(key) { + const series = []; + series.key = key; + return series; +} + +function stack() { + var keys = constant([]), + order = none, + offset = none$1, + value = stackValue; + + function stack(data) { + var sz = Array.from(keys.apply(this, arguments), stackSeries), + i, n = sz.length, j = -1, + oz; + + for (const d of data) { + for (i = 0, ++j; i < n; ++i) { + (sz[i][j] = [0, +value(d, sz[i].key, j, data)]).data = d; + } + } + + for (i = 0, oz = array(order(sz)); i < n; ++i) { + sz[oz[i]].index = i; + } + + offset(sz, oz); + return sz; + } + + stack.keys = function(_) { + return arguments.length ? (keys = typeof _ === "function" ? _ : constant(Array.from(_)), stack) : keys; + }; + + stack.value = function(_) { + return arguments.length ? (value = typeof _ === "function" ? _ : constant(+_), stack) : value; + }; + + stack.order = function(_) { + return arguments.length ? (order = _ == null ? none : typeof _ === "function" ? _ : constant(Array.from(_)), stack) : order; + }; + + stack.offset = function(_) { + return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset; + }; + + return stack; +} + +function expand(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) { + for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0; + if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y; + } + none$1(series, order); +} + +function diverging(series, order) { + if (!((n = series.length) > 0)) return; + for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) { + for (yp = yn = 0, i = 0; i < n; ++i) { + if ((dy = (d = series[order[i]][j])[1] - d[0]) > 0) { + d[0] = yp, d[1] = yp += dy; + } else if (dy < 0) { + d[1] = yn, d[0] = yn += dy; + } else { + d[0] = 0, d[1] = dy; + } + } + } +} + +function silhouette(series, order) { + if (!((n = series.length) > 0)) return; + for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) { + for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0; + s0[j][1] += s0[j][0] = -y / 2; + } + none$1(series, order); +} + +function wiggle(series, order) { + if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return; + for (var y = 0, j = 1, s0, m, n; j < m; ++j) { + for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) { + var si = series[order[i]], + sij0 = si[j][1] || 0, + sij1 = si[j - 1][1] || 0, + s3 = (sij0 - sij1) / 2; + for (var k = 0; k < i; ++k) { + var sk = series[order[k]], + skj0 = sk[j][1] || 0, + skj1 = sk[j - 1][1] || 0; + s3 += skj0 - skj1; + } + s1 += sij0, s2 += s3 * sij0; + } + s0[j - 1][1] += s0[j - 1][0] = y; + if (s1) y -= s2 / s1; + } + s0[j - 1][1] += s0[j - 1][0] = y; + none$1(series, order); +} + +function appearance(series) { + var peaks = series.map(peak); + return none(series).sort(function(a, b) { return peaks[a] - peaks[b]; }); +} + +function peak(series) { + var i = -1, j = 0, n = series.length, vi, vj = -Infinity; + while (++i < n) if ((vi = +series[i][1]) > vj) vj = vi, j = i; + return j; +} + +function ascending(series) { + var sums = series.map(sum); + return none(series).sort(function(a, b) { return sums[a] - sums[b]; }); +} + +function sum(series) { + var s = 0, i = -1, n = series.length, v; + while (++i < n) if (v = +series[i][1]) s += v; + return s; +} + +function descending(series) { + return ascending(series).reverse(); +} + +function insideOut(series) { + var n = series.length, + i, + j, + sums = series.map(sum), + order = appearance(series), + top = 0, + bottom = 0, + tops = [], + bottoms = []; + + for (i = 0; i < n; ++i) { + j = order[i]; + if (top < bottom) { + top += sums[j]; + tops.push(j); + } else { + bottom += sums[j]; + bottoms.push(j); + } + } + + return bottoms.reverse().concat(tops); +} + +function reverse(series) { + return none(series).reverse(); +} + +exports.arc = arc; +exports.area = area; +exports.areaRadial = areaRadial; +exports.curveBasis = basis; +exports.curveBasisClosed = basisClosed; +exports.curveBasisOpen = basisOpen; +exports.curveBumpX = bumpX; +exports.curveBumpY = bumpY; +exports.curveBundle = bundle; +exports.curveCardinal = cardinal; +exports.curveCardinalClosed = cardinalClosed; +exports.curveCardinalOpen = cardinalOpen; +exports.curveCatmullRom = catmullRom; +exports.curveCatmullRomClosed = catmullRomClosed; +exports.curveCatmullRomOpen = catmullRomOpen; +exports.curveLinear = curveLinear; +exports.curveLinearClosed = linearClosed; +exports.curveMonotoneX = monotoneX; +exports.curveMonotoneY = monotoneY; +exports.curveNatural = natural; +exports.curveStep = step; +exports.curveStepAfter = stepAfter; +exports.curveStepBefore = stepBefore; +exports.line = line; +exports.lineRadial = lineRadial$1; +exports.linkHorizontal = linkHorizontal; +exports.linkRadial = linkRadial; +exports.linkVertical = linkVertical; +exports.pie = pie; +exports.pointRadial = pointRadial; +exports.radialArea = areaRadial; +exports.radialLine = lineRadial$1; +exports.stack = stack; +exports.stackOffsetDiverging = diverging; +exports.stackOffsetExpand = expand; +exports.stackOffsetNone = none$1; +exports.stackOffsetSilhouette = silhouette; +exports.stackOffsetWiggle = wiggle; +exports.stackOrderAppearance = appearance; +exports.stackOrderAscending = ascending; +exports.stackOrderDescending = descending; +exports.stackOrderInsideOut = insideOut; +exports.stackOrderNone = none; +exports.stackOrderReverse = reverse; +exports.symbol = symbol; +exports.symbolCircle = circle; +exports.symbolCross = cross; +exports.symbolDiamond = diamond; +exports.symbolSquare = square; +exports.symbolStar = star; +exports.symbolTriangle = triangle; +exports.symbolWye = wye; +exports.symbols = symbols; + +Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +}); + +var d3Zoom = createCommonjsModule(function (module, exports) { +// https://d3js.org/d3-zoom/ v2.0.0 Copyright 2020 Mike Bostock +(function (global, factory) { +factory(exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) ; +}(commonjsGlobal, (function (exports, d3Dispatch, d3Drag, d3Interpolate, d3Selection, d3Transition) { +var constant = x => () => x; + +function ZoomEvent(type, { + sourceEvent, + target, + transform, + dispatch +}) { + Object.defineProperties(this, { + type: {value: type, enumerable: true, configurable: true}, + sourceEvent: {value: sourceEvent, enumerable: true, configurable: true}, + target: {value: target, enumerable: true, configurable: true}, + transform: {value: transform, enumerable: true, configurable: true}, + _: {value: dispatch} + }); +} + +function Transform(k, x, y) { + this.k = k; + this.x = x; + this.y = y; +} + +Transform.prototype = { + constructor: Transform, + scale: function(k) { + return k === 1 ? this : new Transform(this.k * k, this.x, this.y); + }, + translate: function(x, y) { + return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y); + }, + apply: function(point) { + return [point[0] * this.k + this.x, point[1] * this.k + this.y]; + }, + applyX: function(x) { + return x * this.k + this.x; + }, + applyY: function(y) { + return y * this.k + this.y; + }, + invert: function(location) { + return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k]; + }, + invertX: function(x) { + return (x - this.x) / this.k; + }, + invertY: function(y) { + return (y - this.y) / this.k; + }, + rescaleX: function(x) { + return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x)); + }, + rescaleY: function(y) { + return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y)); + }, + toString: function() { + return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")"; + } }; -const icicle = (graph, app, currFile, modal, width, viewHeight) => { - const flatAdj = dfsFlatAdjList(graph, currFile.basename); - console.log({ flatAdj }); - const hier = d3_node.stratify()(flatAdj); - console.log({ hier }); - const format = d3_node.format(",d"); - const color = d3_node.scaleOrdinal(d3_node.quantize(d3_node.interpolateRainbow, hier.children.length + 1)); - const partition = (data) => { - const root = d3_node.hierarchy(data) - .sum((d) => d.value) - .sort((a, b) => b.height - a.height || b.value - a.value); - return d3_node.partition().size([viewHeight, ((root.height + 1) * width) / 3])(root); - }; - const root = partition(hier); - let focus = root; - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", viewHeight) - .attr("width", width) - .style("font", "10px sans-serif"); - const cell = svg - .selectAll("g") - .data(root.descendants()) - .join("g") - .attr("transform", (d) => `translate(${d.y0},${d.x0})`); - const rect = cell - .append("rect") - .attr("width", (d) => d.y1 - d.y0 - 1) - .attr("height", (d) => rectHeight(d)) - .attr("fill-opacity", 0.6) - .attr("fill", (d) => { - if (!d.depth) - return "#ccc"; - while (d.depth > 1) - d = d.parent; - return color(d.data.data.name); - }) - .style("cursor", "pointer") - .on("click", clicked); - const text = cell - .append("text") - .style("user-select", "none") - .attr("pointer-events", "none") - .attr("x", 4) - .attr("y", 13); - // .attr("fill-opacity", (d) => +labelVisible(d)); - text.append("tspan").text((d) => d.data.data.name); - const tspan = text - .append("tspan") - .attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7) - .text((d) => ` ${format(d.value)}`); - cell.append("title").text((d) => `${d.ancestors().map((d) => d.data.data.name) - // .reverse() - // .join("/")}\n${format(d.value) - }`); - function clicked(event, p) { - console.log({ p }); - focus = focus === p ? (p = p.parent) : p; - root.each((d) => { - d.target = { - x0: ((d.x0 - p.x0) / (p.x1 - p.x0)) * viewHeight, - x1: ((d.x1 - p.x0) / (p.x1 - p.x0)) * viewHeight, - y0: d.y0 - p.y0, - y1: d.y1 - p.y0, - }; - console.log(d.target.x0); - }); - const t = cell - .transition() - .duration(750) - .attr("transform", (d) => `translate(${d.target.y0},${d.target.x0})`); - rect.transition(t).attr("height", (d) => rectHeight(d.target)); - text.transition(t).attr("fill-opacity", (d) => +labelVisible(d.target)); - tspan - .transition(t) - .attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7); - } - function rectHeight(d) { - console.log({ d }); - return d.x1 - d.x0 - Math.min(1, (d.x1 - d.x0) / 2); - } - function labelVisible(d) { - return d.y1 <= width && d.y0 >= 0 && d.x1 - d.x0 > 16; - } -}; +var identity = new Transform(1, 0, 0); + +transform.prototype = Transform.prototype; + +function transform(node) { + while (!node.__zoom) if (!(node = node.parentNode)) return identity; + return node.__zoom; +} + +function nopropagation(event) { + event.stopImmediatePropagation(); +} + +function noevent(event) { + event.preventDefault(); + event.stopImmediatePropagation(); +} + +// Ignore right-click, since that should open the context menu. +// except for pinch-to-zoom, which is sent as a wheel+ctrlKey event +function defaultFilter(event) { + return (!event.ctrlKey || event.type === 'wheel') && !event.button; +} + +function defaultExtent() { + var e = this; + if (e instanceof SVGElement) { + e = e.ownerSVGElement || e; + if (e.hasAttribute("viewBox")) { + e = e.viewBox.baseVal; + return [[e.x, e.y], [e.x + e.width, e.y + e.height]]; + } + return [[0, 0], [e.width.baseVal.value, e.height.baseVal.value]]; + } + return [[0, 0], [e.clientWidth, e.clientHeight]]; +} + +function defaultTransform() { + return this.__zoom || identity; +} + +function defaultWheelDelta(event) { + return -event.deltaY * (event.deltaMode === 1 ? 0.05 : event.deltaMode ? 1 : 0.002) * (event.ctrlKey ? 10 : 1); +} + +function defaultTouchable() { + return navigator.maxTouchPoints || ("ontouchstart" in this); +} + +function defaultConstrain(transform, extent, translateExtent) { + var dx0 = transform.invertX(extent[0][0]) - translateExtent[0][0], + dx1 = transform.invertX(extent[1][0]) - translateExtent[1][0], + dy0 = transform.invertY(extent[0][1]) - translateExtent[0][1], + dy1 = transform.invertY(extent[1][1]) - translateExtent[1][1]; + return transform.translate( + dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1), + dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1) + ); +} + +function zoom() { + var filter = defaultFilter, + extent = defaultExtent, + constrain = defaultConstrain, + wheelDelta = defaultWheelDelta, + touchable = defaultTouchable, + scaleExtent = [0, Infinity], + translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]], + duration = 250, + interpolate = d3Interpolate.interpolateZoom, + listeners = d3Dispatch.dispatch("start", "zoom", "end"), + touchstarting, + touchfirst, + touchending, + touchDelay = 500, + wheelDelay = 150, + clickDistance2 = 0, + tapDistance = 10; + + function zoom(selection) { + selection + .property("__zoom", defaultTransform) + .on("wheel.zoom", wheeled) + .on("mousedown.zoom", mousedowned) + .on("dblclick.zoom", dblclicked) + .filter(touchable) + .on("touchstart.zoom", touchstarted) + .on("touchmove.zoom", touchmoved) + .on("touchend.zoom touchcancel.zoom", touchended) + .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)"); + } + + zoom.transform = function(collection, transform, point, event) { + var selection = collection.selection ? collection.selection() : collection; + selection.property("__zoom", defaultTransform); + if (collection !== selection) { + schedule(collection, transform, point, event); + } else { + selection.interrupt().each(function() { + gesture(this, arguments) + .event(event) + .start() + .zoom(null, typeof transform === "function" ? transform.apply(this, arguments) : transform) + .end(); + }); + } + }; + + zoom.scaleBy = function(selection, k, p, event) { + zoom.scaleTo(selection, function() { + var k0 = this.__zoom.k, + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return k0 * k1; + }, p, event); + }; + + zoom.scaleTo = function(selection, k, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t0 = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p, + p1 = t0.invert(p0), + k1 = typeof k === "function" ? k.apply(this, arguments) : k; + return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent); + }, p, event); + }; + + zoom.translateBy = function(selection, x, y, event) { + zoom.transform(selection, function() { + return constrain(this.__zoom.translate( + typeof x === "function" ? x.apply(this, arguments) : x, + typeof y === "function" ? y.apply(this, arguments) : y + ), extent.apply(this, arguments), translateExtent); + }, null, event); + }; + + zoom.translateTo = function(selection, x, y, p, event) { + zoom.transform(selection, function() { + var e = extent.apply(this, arguments), + t = this.__zoom, + p0 = p == null ? centroid(e) : typeof p === "function" ? p.apply(this, arguments) : p; + return constrain(identity.translate(p0[0], p0[1]).scale(t.k).translate( + typeof x === "function" ? -x.apply(this, arguments) : -x, + typeof y === "function" ? -y.apply(this, arguments) : -y + ), e, translateExtent); + }, p, event); + }; + + function scale(transform, k) { + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k)); + return k === transform.k ? transform : new Transform(k, transform.x, transform.y); + } + + function translate(transform, p0, p1) { + var x = p0[0] - p1[0] * transform.k, y = p0[1] - p1[1] * transform.k; + return x === transform.x && y === transform.y ? transform : new Transform(transform.k, x, y); + } + + function centroid(extent) { + return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2]; + } + + function schedule(transition, transform, point, event) { + transition + .on("start.zoom", function() { gesture(this, arguments).event(event).start(); }) + .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).event(event).end(); }) + .tween("zoom", function() { + var that = this, + args = arguments, + g = gesture(that, args).event(event), + e = extent.apply(that, args), + p = point == null ? centroid(e) : typeof point === "function" ? point.apply(that, args) : point, + w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]), + a = that.__zoom, + b = typeof transform === "function" ? transform.apply(that, args) : transform, + i = interpolate(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k)); + return function(t) { + if (t === 1) t = b; // Avoid rounding error on end. + else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); } + g.zoom(null, t); + }; + }); + } + + function gesture(that, args, clean) { + return (!clean && that.__zooming) || new Gesture(that, args); + } + + function Gesture(that, args) { + this.that = that; + this.args = args; + this.active = 0; + this.sourceEvent = null; + this.extent = extent.apply(that, args); + this.taps = 0; + } + + Gesture.prototype = { + event: function(event) { + if (event) this.sourceEvent = event; + return this; + }, + start: function() { + if (++this.active === 1) { + this.that.__zooming = this; + this.emit("start"); + } + return this; + }, + zoom: function(key, transform) { + if (this.mouse && key !== "mouse") this.mouse[1] = transform.invert(this.mouse[0]); + if (this.touch0 && key !== "touch") this.touch0[1] = transform.invert(this.touch0[0]); + if (this.touch1 && key !== "touch") this.touch1[1] = transform.invert(this.touch1[0]); + this.that.__zoom = transform; + this.emit("zoom"); + return this; + }, + end: function() { + if (--this.active === 0) { + delete this.that.__zooming; + this.emit("end"); + } + return this; + }, + emit: function(type) { + var d = d3Selection.select(this.that).datum(); + listeners.call( + type, + this.that, + new ZoomEvent(type, { + sourceEvent: this.sourceEvent, + target: zoom, + type, + transform: this.that.__zoom, + dispatch: listeners + }), + d + ); + } + }; + + function wheeled(event, ...args) { + if (!filter.apply(this, arguments)) return; + var g = gesture(this, args).event(event), + t = this.__zoom, + k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))), + p = d3Selection.pointer(event); + + // If the mouse is in the same location as before, reuse it. + // If there were recent wheel events, reset the wheel idle timeout. + if (g.wheel) { + if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) { + g.mouse[1] = t.invert(g.mouse[0] = p); + } + clearTimeout(g.wheel); + } + + // If this wheel event won’t trigger a transform change, ignore it. + else if (t.k === k) return; + + // Otherwise, capture the mouse point and location at the start. + else { + g.mouse = [p, t.invert(p)]; + d3Transition.interrupt(this); + g.start(); + } + + noevent(event); + g.wheel = setTimeout(wheelidled, wheelDelay); + g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent)); + + function wheelidled() { + g.wheel = null; + g.end(); + } + } -const radialTree = (graph, app, currFile, modal, width, height) => { - const flatAdj = dfsFlatAdjList(graph, currFile.basename); - console.log({ flatAdj }); - const hierarchy = d3_node.stratify()(flatAdj); - console.log({ hierarchy }); - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", height) - .attr("width", width); - const root = d3_node.hierarchy(hierarchy, (d) => d.children) - .sum((d) => (d.children ? 0 : 1)) - .sort((a, b) => a.depth - b.depth); - const outerRadius = width / 2; - const innerRadius = outerRadius - 170; - const cluster = d3_node.cluster() - .size([360, innerRadius]) - .separation((a, b) => 1); - const color = d3_node.scaleOrdinal() - .domain(graph.nodes()) - .range(d3_node.schemeCategory10); - function maxLength(d) { - return d.data.data.depth + (d.children ? d3_node.max(d.children, maxLength) : 0); - } - function setRadius(d, y0, k) { - d.radius = (y0 += d.data.data.depth) * k; - if (d.children) - d.children.forEach((d) => setRadius(d, y0, k)); - } - function setColor(d) { - var name = d.data.data.name; - d.color = - color.domain().indexOf(name) >= 0 - ? color(name) - : d.parent - ? d.parent.color - : null; - if (d.children) - d.children.forEach(setColor); - } - function linkConstant(d) { - return linkStep(d.source.x, d.source.y, d.target.x, d.target.y); - } - function linkExtensionConstant(d) { - return linkStep(d.target.x, d.target.y, d.target.x, innerRadius); - } - function linkStep(startAngle, startRadius, endAngle, endRadius) { - const c0 = Math.cos((startAngle = ((startAngle - 90) / 180) * Math.PI)); - const s0 = Math.sin(startAngle); - const c1 = Math.cos((endAngle = ((endAngle - 90) / 180) * Math.PI)); - const s1 = Math.sin(endAngle); - return ("M" + - startRadius * c0 + - "," + - startRadius * s0 + - (endAngle === startAngle - ? "" - : "A" + - startRadius + - "," + - startRadius + - " 0 0 " + - (endAngle > startAngle ? 1 : 0) + - " " + - startRadius * c1 + - "," + - startRadius * s1) + - "L" + - endRadius * c1 + - "," + - endRadius * s1); - } - const legend = (svg) => { - const g = svg - .selectAll("g") - .data(color.domain()) - .join("g") - .attr("transform", (d, i) => `translate(${-outerRadius},${-outerRadius + i * 20})`); - g.append("rect").attr("width", 18).attr("height", 18).attr("fill", color); - g.append("text") - .attr("x", 24) - .attr("y", 9) - .attr("dy", "0.35em") - .text((d) => d); - }; - cluster(root); - setRadius(root, (root.data.data.depth = 0), innerRadius / maxLength(root)); - setColor(root); - svg.append("g").call(legend); - svg.append("style").text(` - -.link--active { -stroke: #000 !important; -stroke-width: 1.5px; -} - -.link-extension--active { -stroke-opacity: .6; -} - -.label--active { -font-weight: bold; -} - -`); - const linkExtension = svg - .append("g") - .attr("fill", "none") - .attr("stroke", "#000") - .attr("stroke-opacity", 0.25) - .selectAll("path") - .data(root.links().filter((d) => !d.target.children)) - .join("path") - .each(function (d) { - d.target.linkExtensionNode = this; - }) - .attr("d", linkExtensionConstant); - const link = svg - .append("g") - .attr("fill", "none") - .attr("stroke", "#000") - .selectAll("path") - .data(root.links()) - .join("path") - .each(function (d) { - d.target.linkNode = this; - }) - .attr("d", linkConstant) - .attr("stroke", (d) => d.target.color); - const label = svg - .append("g") - .selectAll("text") - .data(root.leaves()) - .join("text") - .attr("dy", ".31em") - .attr("transform", (d) => `rotate(${d.x - 90}) translate(${innerRadius + 4},0)${d.x < 180 ? "" : " rotate(180)"}`) - .attr("text-anchor", (d) => (d.x < 180 ? "start" : "end")) - .text((d) => d.data.data.name) - .on("mouseover", mouseovered(true)) - .on("mouseout", mouseovered(false)); - // function update(checked) { - // const t = d3.transition().duration(750); - // linkExtension - // .transition(t) - // .attr("d", checked ? linkExtensionVariable : linkExtensionConstant); - // link.transition(t).attr("d", checked ? linkVariable : linkConstant); - // } - function mouseovered(active) { - return function (event, d) { - d3_node.select(this).classed("label--active", active); - d3_node.select(d.linkExtensionNode) - .classed("link-extension--active", active) - .raise(); - do - d3_node.select(d.linkNode).classed("link--active", active).raise(); - while ((d = d.parent)); - }; - } - function zoomed({ transform }) { - linkExtension.attr("transform", transform); - link.attr("transform", transform); - label.attr("transform", transform); - } - svg.call(d3_node.zoom() - .extent([ - [0, 0], - [width, height], - ]) - .scaleExtent([0.5, 8]) - .on("zoom", zoomed)); -}; + function mousedowned(event, ...args) { + if (touchending || !filter.apply(this, arguments)) return; + var g = gesture(this, args, true).event(event), + v = d3Selection.select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true), + p = d3Selection.pointer(event, currentTarget), + currentTarget = event.currentTarget, + x0 = event.clientX, + y0 = event.clientY; + + d3Drag.dragDisable(event.view); + nopropagation(event); + g.mouse = [p, this.__zoom.invert(p)]; + d3Transition.interrupt(this); + g.start(); + + function mousemoved(event) { + noevent(event); + if (!g.moved) { + var dx = event.clientX - x0, dy = event.clientY - y0; + g.moved = dx * dx + dy * dy > clickDistance2; + } + g.event(event) + .zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = d3Selection.pointer(event, currentTarget), g.mouse[1]), g.extent, translateExtent)); + } + + function mouseupped(event) { + v.on("mousemove.zoom mouseup.zoom", null); + d3Drag.dragEnable(event.view, g.moved); + noevent(event); + g.event(event).end(); + } + } + + function dblclicked(event, ...args) { + if (!filter.apply(this, arguments)) return; + var t0 = this.__zoom, + p0 = d3Selection.pointer(event.changedTouches ? event.changedTouches[0] : event, this), + p1 = t0.invert(p0), + k1 = t0.k * (event.shiftKey ? 0.5 : 2), + t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, args), translateExtent); + + noevent(event); + if (duration > 0) d3Selection.select(this).transition().duration(duration).call(schedule, t1, p0, event); + else d3Selection.select(this).call(zoom.transform, t1, p0, event); + } + + function touchstarted(event, ...args) { + if (!filter.apply(this, arguments)) return; + var touches = event.touches, + n = touches.length, + g = gesture(this, args, event.changedTouches.length === n).event(event), + started, i, t, p; + + nopropagation(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.pointer(t, this); + p = [p, this.__zoom.invert(p), t.identifier]; + if (!g.touch0) g.touch0 = p, started = true, g.taps = 1 + !!touchstarting; + else if (!g.touch1 && g.touch0[2] !== p[2]) g.touch1 = p, g.taps = 0; + } + + if (touchstarting) touchstarting = clearTimeout(touchstarting); + + if (started) { + if (g.taps < 2) touchfirst = p[0], touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay); + d3Transition.interrupt(this); + g.start(); + } + } + + function touchmoved(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t, p, l; + + noevent(event); + for (i = 0; i < n; ++i) { + t = touches[i], p = d3Selection.pointer(t, this); + if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p; + else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p; + } + t = g.that.__zoom; + if (g.touch1) { + var p0 = g.touch0[0], l0 = g.touch0[1], + p1 = g.touch1[0], l1 = g.touch1[1], + dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp, + dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl; + t = scale(t, Math.sqrt(dp / dl)); + p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2]; + l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2]; + } + else if (g.touch0) p = g.touch0[0], l = g.touch0[1]; + else return; -const sunburst = (graph, app, currFile, modal, width, height) => { - const flatAdj = dfsFlatAdjList(graph, currFile.basename); - console.log({ flatAdj }); - const hierarchy = d3_node.stratify()(flatAdj); - console.log({ hierarchy }); - var radius = Math.min(width, height) / 2; // < -- 2 - var color = d3_node.scaleOrdinal(d3_node.schemeCategory10); - var g = d3_node.select("svg") // <-- 1 - .attr("width", width) // <-- 2 - .attr("height", height) - .append("g") // <-- 3 - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); // <-- 4 - var g = d3_node.select("svg") // returns a handle to the element - .attr("width", width) // sets the width of and then returns the element again - .attr("height", height) // (same as width) - .append("g") // adds a element to the element. It returns the element - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); // takes the element and moves the [0,0] center over and down - var g = d3_node.select("svg") // --> - .attr("width", width) // --> - .attr("height", height) // --> - .append("g") // --> - .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); // --> - var partition = d3_node.partition() // <-- 1 - .size([2 * Math.PI, radius]); // <-- 2 - var root = d3_node.hierarchy(hierarchy) // <-- 1 - .sum(function (d) { - return d.height; - }); // <-- 2 - partition(root); // <-- 1 - var arc = d3_node.arc() // <-- 2 - .startAngle(function (d) { - return d.x0; - }) - .endAngle(function (d) { - return d.x1; - }) - .innerRadius(function (d) { - return d.y0; - }) - .outerRadius(function (d) { - return d.y1; - }); - g.selectAll("path") // <-- 1 - .data(root.descendants()) // <-- 2 - .enter() // <-- 3 - .append("path") // <-- 4 - .attr("display", function (d) { - return d.depth ? null : "none"; - }) // <-- 5 - .attr("d", arc) // <-- 6 - .style("stroke", "#fff") // <-- 7 - .style("fill", function (d) { - return color((d.children ? d : d.parent).data.name); - }); // <-- 8 -}; + g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent)); + } -const tidyTree = (graph, app, currFile, modal, width, height) => { - // const adjList: AdjListItem[] = bfsAdjList(graph, currFile.basename); - // console.log({ adjList }); - // const noDoubles = [...adjList]; - // noDoubles.forEach((a, i, list) => { - // if (list.some((b, j) => i !== j && a.parentId === b.parentId)) { - // noDoubles.splice(i, 1); - // } - // }); - // console.log({ noDoubles }); - const tree = (data) => { - const root = d3_node.hierarchy(data); - root.dx = 10; - root.dy = width / (root.height + 1); - return d3_node.tree().nodeSize([root.dx, root.dy])(root); - }; - const flatAdj = dfsFlatAdjList(graph, currFile.basename); - console.log({ flatAdj }); - const hierarchy = d3_node.stratify()(flatAdj); - console.log({ hierarchy }); - const root = tree(hierarchy); - console.log(root); - let x0 = Infinity; - let x1 = -x0; - root.each((d) => { - if (d.x > x1) - x1 = d.x; - if (d.x < x0) - x0 = d.x; - }); - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", height) - .attr("width", width); - const g = svg - .append("g") - .attr("font-family", "sans-serif") - .attr("font-size", 10) - .attr("transform", `translate(${root.dy / 3},${root.dx - x0})`); - g - .append("g") - .attr("fill", "none") - .attr("stroke", "#555") - .attr("stroke-opacity", 0.4) - .attr("stroke-width", 1.5) - .selectAll("path") - .data(root.links()) - .join("path") - .attr("d", d3_node.linkHorizontal() - .x((d) => d.y) - .y((d) => d.x)); - const node = g - .append("g") - .attr("stroke-linejoin", "round") - .attr("stroke-width", 10) - .selectAll("g") - .data(root.descendants()) - .join("g") - .attr("transform", (d) => `translate(${d.y},${d.x})`); - node - .append("circle") - .attr("fill", (d) => (d.children ? "#555" : "#999")) - .attr("r", 10); - node.attr("aria-label", (d) => { - console.log(d); - return d.data.data.name; - }); - const nodeClick = (event, dest) => { - openOrSwitch(app, dest, event); - modal.close(); - }; - node.on("click", (event, d) => { - console.log({ d }); - nodeClick(event, d.data.data.name); - }); - node - .append("text") - .attr("dy", "0.31em") - .attr("x", (d) => (d.children ? -6 : 6)) - .attr("text-anchor", (d) => (d.children ? "end" : "start")) - .text((d) => d.data.data.name) - .clone(true) - .lower() - .attr("stroke", "white"); - function zoomed({ transform }) { - svg.attr("transform", transform); - } - svg.call(d3_node.zoom() - .extent([ - [0, 0], - [width, height], - ]) - .scaleExtent([0.5, 8]) - .on("zoom", zoomed)); -}; + function touchended(event, ...args) { + if (!this.__zooming) return; + var g = gesture(this, args).event(event), + touches = event.changedTouches, + n = touches.length, i, t; -const treeMap = (graph, app, currFile, modal, width, height) => { - const flatAdj = dfsFlatAdjList(graph, currFile.basename); - console.log({ flatAdj }); - const hierarchy = d3_node.stratify()(flatAdj); - console.log({ hierarchy }); - const root = d3_node.treemap() - .tile(d3_node.treemapBinary) - .size([width, height]) - .padding(1) - .round(true)(hierarchy.sum((d) => d.height).sort((a, b) => b.height - a.height)); - // const root = treemap(data); - const svg = d3_node.select(".d3-graph") - .append("svg") - .attr("height", height) - .attr("width", width) - .style("font", "10px sans-serif"); - const leaf = svg - .selectAll("g") - .data(root.leaves()) - .join("g") - .attr("transform", (d) => `translate(${d.x0},${d.y0})`); - leaf.attr("aria-label", (d) => d.data.name); - // leaf.append("title").text( - // (d) => - // `${d - // .ancestors() - // .reverse() - // .map((d) => d.data.id) - // .join("/")}\n${format(d.height)}` - // ); - const color = d3_node.scaleOrdinal(d3_node.schemeCategory10); - leaf - .append("rect") - // .attr("id", (d) => (d.leafUid = DOM.uid("leaf")).id) - .attr("fill", (d) => { - while (d.depth > 1) - d = d.parent; - return color(d.data.id); - }) - .attr("fill-opacity", 0.6) - .attr("width", (d) => d.x1 - d.x0) - .attr("height", (d) => d.y1 - d.y0); - leaf - .append("clipPath") - // .attr("id", (d) => (d.clipUid = DOM.uid("clip")).id) - .append("use"); - // .attr("xlink:href", (d) => d.leafUid.href); - // leaf - // .append("text") - // .attr("clip-path", (d) => d.clipUid) - // .selectAll("tspan") - // .data((d) => { - // console.log({ d }); - // return d.data.name.split(/(?=[A-Z][^A-Z])/g).concat(format(d.height)); - // }) - // .join("tspan") - // .attr("x", 3) - // .attr( - // "y", - // (d, i, nodes) => `${(i === nodes.length - 1) * 0.3 + 1.1 + i * 0.9}em` - // ) - // .attr("fill-opacity", (d, i, nodes) => - // i === nodes.length - 1 ? 0.7 : null - // ); - // // .text((d) => d); - const nodeClick = (event, dest) => { - openOrSwitch(app, dest, event); - modal.close(); - }; - leaf.on("click", (event, d) => { - console.log({ d }); - nodeClick(event, d.data.name); - }); - function zoomed({ transform }) { - svg.attr("transform", transform); - } - svg.call(d3_node.zoom() - .extent([ - [0, 0], - [width, height], - ]) - .scaleExtent([0.5, 8]) - .on("zoom", zoomed)); -}; + nopropagation(event); + if (touchending) clearTimeout(touchending); + touchending = setTimeout(function() { touchending = null; }, touchDelay); + for (i = 0; i < n; ++i) { + t = touches[i]; + if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0; + else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1; + } + if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1; + if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]); + else { + g.end(); + // If this was a dbltap, reroute to the (optional) dblclick.zoom handler. + if (g.taps === 2) { + t = d3Selection.pointer(t, this); + if (Math.hypot(touchfirst[0] - t[0], touchfirst[1] - t[1]) < tapDistance) { + var p = d3Selection.select(this).on("dblclick.zoom"); + if (p) p.apply(this, arguments); + } + } + } + } -/* src\Components\VisComp.svelte generated by Svelte v3.35.0 */ + zoom.wheelDelta = function(_) { + return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant(+_), zoom) : wheelDelta; + }; -function get_each_context(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[20] = list[i]; - child_ctx[21] = list; - child_ctx[22] = i; - return child_ctx; -} + zoom.filter = function(_) { + return arguments.length ? (filter = typeof _ === "function" ? _ : constant(!!_), zoom) : filter; + }; -function get_each_context_1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[23] = list[i]; - return child_ctx; -} + zoom.touchable = function(_) { + return arguments.length ? (touchable = typeof _ === "function" ? _ : constant(!!_), zoom) : touchable; + }; -// (163:8) {#each selector.options as op} -function create_each_block_1(ctx) { - let option; - let t_value = /*op*/ ctx[23] + ""; - let t; - let option_value_value; + zoom.extent = function(_) { + return arguments.length ? (extent = typeof _ === "function" ? _ : constant([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent; + }; - return { - c() { - option = element("option"); - t = text(t_value); - option.__value = option_value_value = /*op*/ ctx[23]; - option.value = option.__value; - }, - m(target, anchor) { - insert(target, option, anchor); - append(option, t); - }, - p(ctx, dirty) { - if (dirty & /*selectors*/ 1 && t_value !== (t_value = /*op*/ ctx[23] + "")) set_data(t, t_value); + zoom.scaleExtent = function(_) { + return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]]; + }; - if (dirty & /*selectors*/ 1 && option_value_value !== (option_value_value = /*op*/ ctx[23])) { - option.__value = option_value_value; - option.value = option.__value; - } - }, - d(detaching) { - if (detaching) detach(option); - } - }; + zoom.translateExtent = function(_) { + return arguments.length ? (translateExtent[0][0] = +_[0][0], translateExtent[1][0] = +_[1][0], translateExtent[0][1] = +_[0][1], translateExtent[1][1] = +_[1][1], zoom) : [[translateExtent[0][0], translateExtent[0][1]], [translateExtent[1][0], translateExtent[1][1]]]; + }; + + zoom.constrain = function(_) { + return arguments.length ? (constrain = _, zoom) : constrain; + }; + + zoom.duration = function(_) { + return arguments.length ? (duration = +_, zoom) : duration; + }; + + zoom.interpolate = function(_) { + return arguments.length ? (interpolate = _, zoom) : interpolate; + }; + + zoom.on = function() { + var value = listeners.on.apply(listeners, arguments); + return value === listeners ? zoom : value; + }; + + zoom.clickDistance = function(_) { + return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2); + }; + + zoom.tapDistance = function(_) { + return arguments.length ? (tapDistance = +_, zoom) : tapDistance; + }; + + return zoom; } -// (153:2) {#each selectors as selector} -function create_each_block(ctx) { - let span; - let t0_value = /*selector*/ ctx[20].text + ""; - let t0; - let t1; - let select; - let select_value_value; - let t2; - let mounted; - let dispose; - let each_value_1 = /*selector*/ ctx[20].options; - let each_blocks = []; +exports.zoom = zoom; +exports.zoomIdentity = identity; +exports.zoomTransform = transform; - for (let i = 0; i < each_value_1.length; i += 1) { - each_blocks[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); - } +Object.defineProperty(exports, '__esModule', { value: true }); - function change_handler(...args) { - return /*change_handler*/ ctx[3](/*selector*/ ctx[20], /*each_value*/ ctx[21], /*selector_index*/ ctx[22], ...args); - } +}))); +}); + +var d3_node = createCommonjsModule(function (module, exports) { + +Object.defineProperty(exports, '__esModule', { value: true }); - return { - c() { - span = element("span"); - t0 = text(t0_value); - t1 = text(":\r\n \r\n "); - select = element("select"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - t2 = space(); - }, - m(target, anchor) { - insert(target, span, anchor); - append(span, t0); - append(span, t1); - append(span, select); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(select, null); - } - select_option(select, /*selector*/ ctx[20].val); - append(span, t2); - if (!mounted) { - dispose = listen(select, "change", change_handler); - mounted = true; - } - }, - p(new_ctx, dirty) { - ctx = new_ctx; - if (dirty & /*selectors*/ 1 && t0_value !== (t0_value = /*selector*/ ctx[20].text + "")) set_data(t0, t0_value); - if (dirty & /*selectors*/ 1) { - each_value_1 = /*selector*/ ctx[20].options; - let i; - for (i = 0; i < each_value_1.length; i += 1) { - const child_ctx = get_each_context_1(ctx, each_value_1, i); - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block_1(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(select, null); - } - } - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - each_blocks.length = each_value_1.length; - } - if (dirty & /*selectors*/ 1 && select_value_value !== (select_value_value = /*selector*/ ctx[20].val)) { - select_option(select, /*selector*/ ctx[20].val); - } - }, - d(detaching) { - if (detaching) detach(span); - destroy_each(each_blocks, detaching); - mounted = false; - dispose(); - } - }; -} -function create_fragment$1(ctx) { - let div0; - let t; - let div1; - let each_value = /*selectors*/ ctx[0]; - let each_blocks = []; - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); - } - return { - c() { - div0 = element("div"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } - t = space(); - div1 = element("div"); - attr(div1, "class", "d3-graph"); - }, - m(target, anchor) { - insert(target, div0, anchor); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].m(div0, null); - } - insert(target, t, anchor); - insert(target, div1, anchor); - }, - p(ctx, [dirty]) { - if (dirty & /*selectors*/ 1) { - each_value = /*selectors*/ ctx[0]; - let i; - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context(ctx, each_value, i); - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(div0, null); - } - } - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } - each_blocks.length = each_value.length; - } - }, - i: noop, - o: noop, - d(detaching) { - if (detaching) detach(div0); - destroy_each(each_blocks, detaching); - if (detaching) detach(t); - if (detaching) detach(div1); - } - }; -} -function instance$1($$self, $$props, $$invalidate) { - let argArr; - - - let { modal } = $$props; - let { settings } = $$props; - const { app } = modal; - const { plugin } = modal; - const currFile = app.workspace.getActiveFile(); - const selectors = [ - { - text: "Type", - options: VISTYPES, - val: settings.visGraph - }, - { - text: "Relation", - options: RELATIONS, - val: settings.visRelation - }, - { - text: "Close Implied", - options: REAlCLOSED, - val: settings.visClosed - }, - { - text: "No Unlinked", - options: ALLUNLINKED, - val: settings.visAll - } - ]; - const [width, height] = [Math.round(window.innerWidth / 1.3), Math.round(window.innerHeight / 1.3)]; - const { mainG } = plugin; - const [up, same, down] = [ - getSubInDirs(mainG, "up"), - getSubInDirs(mainG, "same"), - getSubInDirs(mainG, "down") - ]; - const [closedParentNoSingle, closedSiblingNoSingle, closedChildNoSingle] = [ - closeImpliedLinks(up, down), - closeImpliedLinks(same, same), - closeImpliedLinks(down, up) - ]; - const graphs = { - Parent: { - Real: { - All: up, - "No Unlinked": removeUnlinkedNodes(up) - }, - Closed: { - All: closedParentNoSingle, - "No Unlinked": removeUnlinkedNodes(closedParentNoSingle) - } - }, - Sibling: { - Real: { - All: same, - "No Unlinked": removeUnlinkedNodes(same) - }, - Closed: { - All: closedSiblingNoSingle, - "No Unlinked": removeUnlinkedNodes(closedSiblingNoSingle) - } - }, - Child: { - Real: { - All: down, - "No Unlinked": removeUnlinkedNodes(down) - }, - Closed: { - All: closedChildNoSingle, - "No Unlinked": removeUnlinkedNodes(closedChildNoSingle) - } + + + +var version = "6.7.0"; + +exports.version = version; +Object.keys(d3Array).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Array[k]; + } + }); +}); +Object.keys(d3Axis).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Axis[k]; + } + }); +}); +Object.keys(d3Brush).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Brush[k]; + } + }); +}); +Object.keys(d3Chord).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Chord[k]; + } + }); +}); +Object.keys(d3Color).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Color[k]; + } + }); +}); +Object.keys(d3Contour).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Contour[k]; + } + }); +}); +Object.keys(d3Delaunay).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Delaunay[k]; + } + }); +}); +Object.keys(d3Dispatch).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dispatch[k]; + } + }); +}); +Object.keys(d3Drag).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Drag[k]; + } + }); +}); +Object.keys(d3Dsv).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Dsv[k]; + } + }); +}); +Object.keys(d3Ease).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Ease[k]; + } + }); +}); +Object.keys(d3Fetch).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Fetch[k]; + } + }); +}); +Object.keys(d3Force).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Force[k]; + } + }); +}); +Object.keys(d3Format).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Format[k]; + } + }); +}); +Object.keys(d3Geo).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Geo[k]; + } + }); +}); +Object.keys(d3Hierarchy).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Hierarchy[k]; + } + }); +}); +Object.keys(d3Interpolate).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Interpolate[k]; + } + }); +}); +Object.keys(d3Path).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Path[k]; + } + }); +}); +Object.keys(d3Polygon).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Polygon[k]; + } + }); +}); +Object.keys(d3Quadtree).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Quadtree[k]; + } + }); +}); +Object.keys(d3Random).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Random[k]; + } + }); +}); +Object.keys(d3Scale).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Scale[k]; + } + }); +}); +Object.keys(d3ScaleChromatic).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3ScaleChromatic[k]; + } + }); +}); +Object.keys(d3Selection).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Selection[k]; } - }; - - const types = { - "Force Directed Graph": { fun: forceDirectedG }, - "Tidy Tree": { fun: tidyTree }, - "Circle Packing": { fun: circlePacking }, - "Edge Bundling": { fun: edgeBundling }, - "Arc Diagram": { fun: arcDiagram }, - Sunburst: { fun: sunburst }, - "Tree Map": { fun: treeMap }, - Icicle: { fun: icicle }, - "Radial Tree": { fun: radialTree } - }; - - function draw(type) { - var _a; - - if (!document.querySelector(".d3-graph")) { - setTimeout( - () => { - var _a; - - (_a = document.querySelector(".d3-graph")) === null || _a === void 0 - ? void 0 - : _a.empty(); - - try { - types[type].fun(...argArr); - } catch(error) { - console.log(error); - } - }, - 10 - ); - } else { - (_a = document.querySelector(".d3-graph")) === null || _a === void 0 - ? void 0 - : _a.empty(); - - try { - types[type].fun(...argArr); - } catch(error) { - console.log(error); - } + }); +}); +Object.keys(d3Shape).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Shape[k]; } - } - - const change_handler = (selector, each_value, selector_index, el) => { - $$invalidate(0, each_value[selector_index].val = el.target.value, selectors); - }; - - $$self.$$set = $$props => { - if ("modal" in $$props) $$invalidate(1, modal = $$props.modal); - if ("settings" in $$props) $$invalidate(2, settings = $$props.settings); - }; - - $$self.$$.update = () => { - if ($$self.$$.dirty & /*selectors, modal*/ 3) { - argArr = [ - graphs[selectors[1].val][selectors[2].val][selectors[3].val], - app, - currFile, - modal, - width, - height - ]; + }); +}); +Object.keys(d3Time).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Time[k]; } - - if ($$self.$$.dirty & /*selectors*/ 1) { - draw(selectors[0].val); + }); +}); +Object.keys(d3TimeFormat).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3TimeFormat[k]; } - }; + }); +}); +Object.keys(d3Timer).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Timer[k]; + } + }); +}); +Object.keys(d3Transition).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Transition[k]; + } + }); +}); +Object.keys(d3Zoom).forEach(function (k) { + if (k !== 'default' && !exports.hasOwnProperty(k)) Object.defineProperty(exports, k, { + enumerable: true, + get: function () { + return d3Zoom[k]; + } + }); +}); +}); - return [selectors, modal, settings, change_handler]; -} +const arcDiagram = (graph, app, currFile, modal, width, height) => { + const data = graphlibToD3(graph); + const margin = { top: 20, right: 20, bottom: 20, left: 150 }; + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", height) + .attr("width", width); + const nodes = data.nodes.map(({ id, name }) => ({ + id, + name, + sourceLinks: [], + targetLinks: [], + })); + const nodeById = new Map(nodes.map((d) => [d.id, d])); + const links = data.links.map(({ source, target }) => ({ + source: nodeById.get(source), + target: nodeById.get(target), + })); + for (const link of links) { + const { source, target } = link; + source.sourceLinks.push(link); + target.targetLinks.push(link); + } + svg.append("style").text(` + +path { + stroke: #808080; + opacity: 0.8; +} + +text { + stroke: var(--text-a); + opacity: 0.8; +} + + +.hover g.primary text { + fill: black; +} + +.hover g.secondary text { + fill: #333; +} + +.hover .secondary { + color: red; +} + +.hover path.primary { + stroke: #333; + stroke-opacity: 1; +} + +.hover rect { + opacity: 1; + cursor: pointer; +} + +`); + const y = d3_node.scalePoint(nodes.map((d) => d.name).sort(d3_node.ascending), [ + margin.top, + height - margin.bottom, + ]); + const label = svg + .append("g") + .attr("font-family", "sans-serif") + .attr("font-size", 10) + .attr("text-anchor", "end") + .selectAll("g") + .data(nodes) + .join("g") + .attr("transform", (d) => `translate(${margin.left},${(d.y = y(d.name))})`) + .call((g) => g + .append("text") + .attr("x", -6) + .attr("dy", "0.35em") + // .attr("fill", (d) => d3.lab(color(d.group)).darker(2)) + .text((d) => d.name)) + .call((g) => g.append("circle").attr("r", 3) + // .attr("fill", (d) => color(d.group)) + ); + const path = svg + .insert("g", "*") + .attr("fill", "none") + .attr("stroke-opacity", 0.6) + .attr("stroke-width", 1.5) + .selectAll("path") + .data(links) + .join("path") + // .attr("stroke", (d) => + // d.source.group === d.target.group ? color(d.source.group) : "#aaa" + // ) + .attr("d", arc); + const step = 104; + const nodeClick = (event, dest) => { + openOrSwitch(app, dest, event); + modal.close(); + }; + svg + .append("g") + .attr("fill", "none") + .attr("pointer-events", "all") + .selectAll("rect") + .data(nodes) + .join("rect") + .attr("width", margin.left + 40) + .attr("height", step) + .attr("y", (d) => y(d.name) - step / 2) + .on("mouseover", (d) => { + svg.classed("hover", true); + label.classed("primary", (n) => n === d); + label.classed("secondary", (n) => n.sourceLinks.some((l) => l.target === d) || + n.targetLinks.some((l) => l.source === d)); + path + .classed("primary", (l) => l.source === d || l.target === d) + .filter(".primary") + .raise(); + }) + .on("mouseout", (d) => { + svg.classed("hover", false); + label.classed("primary", false); + label.classed("secondary", false); + path.classed("primary", false).order(); + }) + .on("click", (event, d) => { + nodeClick(event, d.name); + }); + // function update() { + // y.domain(nodes.sort(viewof order.value).map(d => d.id)); + // const t = svg.transition() + // .duration(750); + // label.transition(t) + // .delay((d, i) => i * 20) + // .attrTween("transform", d => { + // const i = d3.interpolateNumber(d.y, y(d.id)); + // return t => `translate(${margin.left},${d.y = i(t)})`; + // }); + // path.transition(t) + // .duration(750 + nodes.length * 20) + // .attrTween("d", d => () => arc(d)); + // overlay.transition(t) + // .delay((d, i) => i * 20) + // .attr("y", d => y(d.id) - step / 2); + // } + // viewof order.addEventListener("input", update); + // invalidation.then(() => viewof order.removeEventListener("input", update)); + function arc(d) { + const y1 = d.source.y; + const y2 = d.target.y; + const r = Math.abs(y2 - y1) / 2; + return `M${margin.left},${y1}A${r},${r} 0,0,${y1 < y2 ? 1 : 0} ${margin.left},${y2}`; + } + function zoomed({ transform }) { + svg.attr("transform", transform); + } + svg.call(d3_node.zoom() + .extent([ + [0, 0], + [width, height], + ]) + .scaleExtent([0.5, 8]) + .on("zoom", zoomed)); +}; -class VisComp extends SvelteComponent { - constructor(options) { - super(); - init(this, options, instance$1, create_fragment$1, safe_not_equal, { modal: 1, settings: 2 }); - } -} +const circlePacking = (graph, app, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy = d3_node.stratify()(flatAdj); + console.log({ hierarchy }); + const adjList = bfsAdjList(graph, currFile.basename); + console.log({ adjList }); + const noDoubles = [...adjList]; + noDoubles.forEach((a, i) => { + if (noDoubles.some((b, j) => i !== j && a.name === b.name)) { + const index = noDoubles.findIndex((b, j) => i !== j && a.name === b.name); + noDoubles.splice(index, 1); + } + }); + // const noDoubles = adjList.filter((a) => { + // !adjList.some((b) => { + // console.log({ a, b }); + // return a.name !== b.name && a.parentId === b.parentId; + // }); + // }); + console.log({ noDoubles }); + // const root = stratify(noDoubles); + // console.log(root); + // const hierarchy: d3Tree = createTreeHierarchy(noDoubles, { + // id: "name", + // excludeParent: true, + // }); + // console.log({ hierarchy }); + const linkArr = noDoubles.map((d) => { + return { source: d.name, target: d.parentId }; + }); + const links = linkArr.map((d) => Object.create(d)); + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", height) + .attr("width", width); + const nodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent"); + // Initialize the circle: all located at the center of the svg area + const node = svg + .append("g") + .selectAll("circle") + .data(noDoubles) + .join("circle") + .attr("r", (d) => Math.round(d.height / 10) + 10) + .attr("cx", width / 2) + .attr("cy", height / 2) + .style("fill", nodeColour) + .style("fill-opacity", 0.6) + .attr("stroke", nodeColour) + .style("stroke-width", 4); + node.attr("aria-label", (d) => d.name); + const nodeClick = (event, dest) => { + app.workspace.getActiveFile(); + openOrSwitch(app, dest, event); + modal.close(); + }; + node.on("click", (event, d) => { + nodeClick(event, d.name); + }); + svg + .append("g") + .attr("stroke", "#868282") + .attr("stroke-opacity", 0.6) + .selectAll("line") + .data(links) + .join("line") + .attr("stroke-width", 0.8); + // Features of the forces applied to the nodes: + const simulation = d3_node.forceSimulation() + .force("center", d3_node.forceCenter() + .x(width / 2) + .y(height / 2)) // Attraction to the center of the svg area + .force("charge", d3_node.forceManyBody().strength(0.5)) // Nodes are attracted one each other of value is > 0 + .force("collide", d3_node.forceCollide().strength(0.025).radius(30).iterations(1)); // Force that avoids circle overlapping + // Apply these forces to the nodes and update their positions. + // Once the force algorithm is happy with positions ('alpha' value is low enough), simulations will stop. + simulation.nodes(noDoubles).on("tick", function (d) { + node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); + }); + function zoomed({ transform }) { + node.attr("transform", transform); + } + svg.call(d3_node.zoom() + .extent([ + [0, 0], + [width, height], + ]) + .scaleExtent([0.5, 8]) + .on("zoom", zoomed)); + const drag = (simulation) => { + function dragstarted(event, d) { + if (!event.active) + simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; + } + function dragged(event, d) { + d.fx = event.x; + d.fy = event.y; + } + function dragended(event, d) { + if (!event.active) + simulation.alphaTarget(0); + d.fx = null; + d.fy = null; + } + return d3_node.drag() + .on("start", dragstarted) + .on("drag", dragged) + .on("end", dragended); + }; + node.call(drag(simulation)); + // const pack = (data) => + // d3.pack().size([width, height]).padding(3)( + // d3 + // .hierarchy(data) + // .sum((d) => d.value) + // .sort((a, b) => b.value - a.value) + // ); + // const root = pack(hierarchy); + // const svg = d3 + // .select(".d3-graph") + // .append("svg") + // .attr("height", height) + // .attr("width", width) + // .style("font", "10px sans-serif") + // .style("overflow", "visible") + // .attr("text-anchor", "middle"); + // const node = svg + // .append("g") + // .attr("pointer-events", "all") + // .selectAll("g") + // .data(root.descendants()) + // .join("g") + // .attr("transform", (d) => `translate(${d.x},${d.y})`); + // node + // .append("circle") + // .attr("r", (d) => d.r) + // .attr("stroke", (d) => (d.children ? "#bbb" : "none")) + // .attr("fill", (d) => (d.children ? "none" : "#ddd")); + // const leaf = node.filter((d) => !d.children); + // leaf.select("circle"); + // // leaf + // // .append("clipPath") + // // .attr("id", (d) => (d.clipUid = DOM.uid("clip")).id) + // // .append("use") + // // .attr("xlink:href", (d) => d.leafUid.href); + // // leaf + // // .append("text") + // // .attr("clip-path", (d) => d.clipUid) + // // .selectAll("tspan") + // // .data((d) => d.data.name.split(/(?=[A-Z][^A-Z])/g)) + // // .join("tspan") + // // .attr("x", 0) + // // .attr("y", (d, i, nodes) => `${i - nodes.length / 2 + 0.8}em`) + // // .text((d) => d); + // node.append("title").text( + // (d) => `${d + // .ancestors() + // .map((d) => d.data.data.name) + // .reverse() + // .join("/")} + // ${d.value.toLocaleString()}` + // ); +}; -function graphlibToD3(g) { - const d3Graph = { nodes: [], links: [] }; - const edgeIDs = {}; - g.nodes().forEach((node, i) => { - d3Graph.nodes.push({ id: i, name: node }); - edgeIDs[node] = i; +const edgeBundling = (graph, app, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hier = d3_node.stratify()(flatAdj); + console.log({ hier }); + const PADDING_BUBBLE = 15; // distance between edge end and bubble + const PADDING_LABEL = 30; // distance between edge end and engineer name + const BUBBLE_SIZE_MIN = 4; + const BUBBLE_SIZE_MAX = 20; + var diameter = 560, radius = diameter / 2, innerRadius = radius - 170; // between center and edge end + // The 'cluster' function takes 1 argument as input. It also has methods (??) like cluster.separation(), cluster.size() and cluster.nodeSize() + var cluster = d3_node.cluster().size([360, innerRadius]); + var line = d3_node.lineRadial() + .curve(d3_node.curveBundle.beta(0.85)) + .radius(function (d) { + return d[1]; + }) + .angle(function (d) { + return (d[0] / 180) * Math.PI; + }); + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", height) + .attr("width", width) + .append("g") + .attr("transform", "translate(" + radius + "," + radius + ")"); + var link = svg.append("g").selectAll(".link"), label = svg.append("g").selectAll(".label"), bubble = svg.append("g").selectAll(".bubble"); + // Add a scale for bubble size + var bubbleSizeScale = d3_node.scaleLinear() + .domain([0, 100]) + .range([BUBBLE_SIZE_MIN, BUBBLE_SIZE_MAX]); + // Scale for the bubble size + // If wanna see your data + // console.log(hierarchicalData) + // Reformat the data + var root = packageHierarchy(hier) + //debugger; + .sum(function (d) { + console.log(d); + return d.height; + }); + // console.log(root) + // Build an object that gives feature of each leaves + cluster(root); + const leaves = root.leaves(); + // Leaves is an array of Objects. 1 item = one leaf. Provides x and y for leaf position in the svg. Also gives details about its parent. + link + .data(packageImports(leaves)) + .enter() + .append("path") + .each(function (d) { + (d.source = d[0]), (d.target = d[d.length - 1]); + }) + .attr("class", "link") + .attr("d", line) + .attr("fill", "none") + .attr("stroke", "black"); + label + .data(leaves) + .enter() + .append("text") + .attr("class", "label") + .attr("dy", "0.31em") + .attr("transform", function (d) { + return ("rotate(" + + (d.x - 90) + + ")translate(" + + (d.y + PADDING_LABEL) + + ",0)" + + (d.x < 180 ? "" : "rotate(180)")); + }) + .attr("text-anchor", function (d) { + return d.x < 180 ? "start" : "end"; + }) + .text(function (d) { + return d.data.key; }); - g.forEachEdge((k, a, s, t) => { - d3Graph.links.push({ - source: edgeIDs[s], - target: edgeIDs[t], + bubble + .data(leaves) + .enter() + .append("circle") + .attr("class", "bubble") + .attr("transform", function (d) { + return ("rotate(" + (d.x - 90) + ")translate(" + (d.y + PADDING_BUBBLE) + ",0)"); + }) + .attr("r", (d) => bubbleSizeScale(d.value)) + .attr("stroke", "black") + .attr("fill", "#69a3b2") + .style("opacity", 0.2); + // Lazily construct the package hierarchy from class names. + function packageHierarchy(classes) { + var map = {}; + function find(name, data) { + var node = map[name], i; + if (!node) { + node = map[name] = data || { name: name, children: [] }; + if (name.length) { + node.parent = find(name.substring(0, (i = name.lastIndexOf(".")))); + node.parent.children.push(node); + node.key = name.substring(i + 1); + } + } + return node; + } + classes.forEach(function (d) { + find(d.name, d); + }); + return d3_node.hierarchy(map[""]); + } + // Return a list of imports for the given array of nodes. + function packageImports(nodes) { + var map = {}, imports = []; + // Compute a map from name to node. + nodes.forEach(function (d) { + map[d.data.name] = d; + }); + // For each import, construct a link from the source to target node. + nodes.forEach(function (d) { + if (d.data.imports) + d.data.imports.forEach(function (i) { + imports.push(map[d.data.name].path(map[i])); + }); + }); + return imports; + } +}; + +const forceDirectedG = (graph, app, currFile, modal, width, height) => { + modal.plugin; + let nodeToGetTo = currFile.basename; + console.log({ nodeToGetTo }); + console.time("Find all paths"); + // let pathsFromNodeToGetTo = graphlib.alg.dijkstra(graph, nodeToGetTo); + console.timeEnd("Find all paths"); + const defaultNodeColour = getComputedStyle(document.body).getPropertyValue("--text-accent"); + let currNodeColour = defaultNodeColour; + const colourChangeInput = d3_node.select(".d3-graph") + .append("input") + .attr("type", "color"); + colourChangeInput.on("change", function changeColor(el) { + currNodeColour = el.target.value; + node + .transition() + .duration(300) + .style("fill", (d) => { + if (d.index === currNodeIndex) + return; + return currNodeColour; }); }); - return d3Graph; -} -function bfsAdjList(g, startNode) { - const queue = [startNode]; - const adjList = []; - let i = 0; - while (queue.length && i < 1000) { - i++; - const currNode = queue.shift(); - const neighbours = { - succs: getOutNeighbours(g, currNode), - pres: getInNeighbours(g, currNode), - }; - console.log({ currNode, neighbours }); - const next = { - name: currNode, - pres: undefined, - succs: undefined, - parentId: i, - depth: i, - }; - if (neighbours.succs.length) { - next.succs = neighbours.succs; - queue.push(...neighbours.succs); + // const saveLayoutButton = modal.contentEl.createEl('button', { text: 'Save Layout' }) + // .addEventListener('click', saveGraph) + const data = graphlibToD3(graph); + const links = data.links.map((d) => Object.create(d)); + const currNode = data.nodes.find((node) => node.name === currFile.basename); + let currNodeIndex; + if (!currNode) { + const id = data.nodes.length; + data.nodes.push({ id, name: currFile.basename }); + currNodeIndex = id; + } + else { + currNodeIndex = currNode.id; + } + const nodes = data.nodes.map((d) => Object.create(d)); + const simulation = d3_node.forceSimulation(nodes) + .force("link", d3_node.forceLink(links).id((d) => d.id)) + .force("charge", d3_node.forceManyBody().strength(-8)) + .force("center", d3_node.forceCenter(width / 2, height / 2).strength(0.5)); + const drag = (simulation) => { + function dragstarted(event, d) { + if (!event.active) + simulation.alphaTarget(0.3).restart(); + d.fx = d.x; + d.fy = d.y; } - if (neighbours.pres.length) { - next.pres = neighbours.pres; + function dragged(event, d) { + d.fx = event.x; + d.fy = event.y; } - adjList.push(next); - } - const maxDepth = adjList.sort((a, b) => a.depth - b.depth).last().depth; - adjList.forEach((item) => (item.height = maxDepth - item.depth)); - return adjList; -} -function dfsFlatAdjList(g, startNode) { - const nodes = g.nodes(); - const nodeCount = nodes.length; - const visits = {}; - nodes.forEach((node, i) => { - visits[node] = nodeCount * i; - }); - const queue = [startNode]; - const adjList = []; - let depth = 1; - let i = 0; - while (queue.length && i < 1000) { - i++; - const currNode = queue.shift(); - const next = getOutNeighbours(g, currNode); - if (next.length) { - queue.unshift(...next); - next.forEach((succ) => { - const parentId = nodeCount * nodes.indexOf(succ); - if (!adjList.some((adjItem) => adjItem.name === currNode && adjItem.parentId === parentId)) { - adjList.push({ - id: visits[currNode], - name: currNode, - parentId, - depth, - }); - visits[currNode]++; + function dragended(event, d) { + if (!event.active) + simulation.alphaTarget(0); + d.fx = null; + d.fy = null; + } + return d3_node.drag() + .on("start", dragstarted) + .on("drag", dragged) + .on("end", dragended); + }; + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", height) + .attr("width", width) + .attr("class", "forceDirectedG"); + const link = svg + .append("g") + .attr("stroke", "#868282") + .attr("stroke-opacity", 0.6) + .selectAll("line") + .data(links) + .join("line") + .attr("stroke-width", 0.8) + .attr("marker-end", "url(#end)"); + svg + .append("svg:g") + .selectAll("path") + .data(links) + .enter() + .append("svg:path") + // .attr("class", function(d) { return "link " + d.type; }) + .attr("class", "link") + .attr("marker-end", "url(#end)"); + svg + .append("svg:defs") + .selectAll("marker") + .data(["end"]) // Different link/path types can be defined here + .enter() + .append("svg:marker") // This section adds in the arrows + .attr("id", String) + .attr("viewBox", "0 -5 10 10") + .attr("refX", 20) + .attr("refY", 0.1) + .attr("markerWidth", 6) + .attr("markerHeight", 6) + .attr("orient", "auto") + // .attr("stroke", "#868282") + .attr("stroke-width", 10) + .append("svg:path") + .attr("d", "M0,-5L10,0L0,5"); + const nameFromIndex = (d) => data.nodes.find((node) => node.id === d.index).name; + const node = svg + .append("g") + .selectAll("circle") + .data(nodes) + .join("circle") + .attr("r", 5) + .attr("fill", (d) => { + if (nameFromIndex(d) === currFile.basename) { + return "#ffffff"; + } + else { + return currNodeColour; + } + }) + .call(drag(simulation)); + node.attr("aria-label", (d) => d.name); + const nodeClick = (event, dest) => { + openOrSwitch(app, dest, event); + modal.close(); + }; + node.on("click", (event, d) => { + nodeClick(event, d.name); + }); + node.on("mousedown", (event, d) => { + if (event.button === 2) { + nodeToGetTo = d.name; + node.style("fill", (n) => { + if (n.name === nodeToGetTo) { + return "#ff0000"; } + else + return currNodeColour; }); - depth++; - } - else { - adjList.push({ - id: visits[currNode], - name: currNode, - parentId: 999999999, - depth, - }); - depth = 1; - visits[currNode]++; + // pathsFromNodeToGetTo = graphlib.alg.dijkstra(graph, nodeToGetTo); } + }); + function linked(a, b) { + if (a === b) + return true; + const linkedArr = links.find((link) => (link.source.index === a && link.target.index === b) || + (link.target.index === a && link.source.index === b)); + return !!linkedArr; + } + // function walkDijkstraPaths( + // paths: { [node: string]: graphlib.Path }, + // startNode: string + // ) { + // if (startNode === nodeToGetTo || paths[startNode].distance === Infinity) + // return []; + // let step = startNode; + // const path: string[] = [startNode]; + // let i = 0; + // const MAX = 300; + // while (paths[step].predecessor !== nodeToGetTo && i < MAX) { + // i++; + // step = paths[step].predecessor; + // path.push(step); + // } + // if (i >= MAX) return []; + // path.push(nodeToGetTo); + // return path; + // } + node + .on("mouseover", (event, d) => { + node + .transition() + .duration(150) + .style("opacity", (o) => { + return linked(d.index, o.index) ? 1 : 0.2; + }); + link + .transition() + .duration(150) + .style("opacity", function (o) { + return o.source.index === d.index || o.target.index === d.index + ? 1 + : 0.2; + }); + // Highlight path from hovered node to currNode + nameFromIndex(d); + // const path = walkDijkstraPaths(pathsFromNodeToGetTo, hoveredNode); + // if (path.length) { + // link + // .transition() + // .duration(150) + // .style("stroke", function (link) { + // if ( + // path.includes(nameFromIndex(link.source)) && + // path.includes(nameFromIndex(link.target)) + // ) + // return currNodeColour; + // }) + // .style("opacity", function (link) { + // if ( + // path.includes(nameFromIndex(link.source)) && + // path.includes(nameFromIndex(link.target)) + // ) + // return 1; + // }); + // } + }) + .on("mouseout", unfocus); + function unfocus() { + // labelNode.attr("display", "block"); + node.style("opacity", 1); + link.style("opacity", 1).style("stroke", "#868282"); + } + simulation.on("tick", () => { + link + .attr("x1", (d) => d.source.x) + .attr("y1", (d) => d.source.y) + .attr("x2", (d) => d.target.x) + .attr("y2", (d) => d.target.y); + node.attr("cx", (d) => d.x).attr("cy", (d) => d.y); + }); + function zoomed({ transform }) { + node.attr("transform", transform); + link.attr("transform", transform); + } + svg.call(d3_node.zoom() + .extent([ + [0, 0], + [width, height], + ]) + .scaleExtent([0.5, 10]) + .on("zoom", zoomed)); +}; + +const icicle = (graph, app, currFile, modal, width, viewHeight) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hier = d3_node.stratify()(flatAdj); + console.log({ hier }); + const format = d3_node.format(",d"); + const color = d3_node.scaleOrdinal(d3_node.quantize(d3_node.interpolateRainbow, hier.children.length + 1)); + const partition = (data) => { + const root = d3_node.hierarchy(data) + .sum((d) => d.value) + .sort((a, b) => b.height - a.height || b.value - a.value); + return d3_node.partition().size([viewHeight, ((root.height + 1) * width) / 3])(root); + }; + const root = partition(hier); + let focus = root; + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", viewHeight) + .attr("width", width) + .style("font", "10px sans-serif"); + const cell = svg + .selectAll("g") + .data(root.descendants()) + .join("g") + .attr("transform", (d) => `translate(${d.y0},${d.x0})`); + const rect = cell + .append("rect") + .attr("width", (d) => d.y1 - d.y0 - 1) + .attr("height", (d) => rectHeight(d)) + .attr("fill-opacity", 0.6) + .attr("fill", (d) => { + if (!d.depth) + return "#ccc"; + while (d.depth > 1) + d = d.parent; + return color(d.data.data.name); + }) + .style("cursor", "pointer") + .on("click", clicked); + const text = cell + .append("text") + .style("user-select", "none") + .attr("pointer-events", "none") + .attr("x", 4) + .attr("y", 13); + // .attr("fill-opacity", (d) => +labelVisible(d)); + text.append("tspan").text((d) => d.data.data.name); + const tspan = text + .append("tspan") + .attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7) + .text((d) => ` ${format(d.value)}`); + cell.append("title").text((d) => `${d.ancestors().map((d) => d.data.data.name) + // .reverse() + // .join("/")}\n${format(d.value) + }`); + function clicked(event, p) { + console.log({ p }); + focus = focus === p ? (p = p.parent) : p; + root.each((d) => { + d.target = { + x0: ((d.x0 - p.x0) / (p.x1 - p.x0)) * viewHeight, + x1: ((d.x1 - p.x0) / (p.x1 - p.x0)) * viewHeight, + y0: d.y0 - p.y0, + y1: d.y1 - p.y0, + }; + console.log(d.target.x0); + }); + const t = cell + .transition() + .duration(750) + .attr("transform", (d) => `translate(${d.target.y0},${d.target.x0})`); + rect.transition(t).attr("height", (d) => rectHeight(d.target)); + text.transition(t).attr("fill-opacity", (d) => +labelVisible(d.target)); + tspan + .transition(t) + .attr("fill-opacity", (d) => (labelVisible(d) ? 1 : 0) * 0.7); + } + function rectHeight(d) { + console.log({ d }); + return d.x1 - d.x0 - Math.min(1, (d.x1 - d.x0) / 2); + } + function labelVisible(d) { + return d.y1 <= width && d.y0 >= 0 && d.x1 - d.x0 > 16; + } +}; + +const radialTree = (graph, app, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy = d3_node.stratify()(flatAdj); + console.log({ hierarchy }); + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", height) + .attr("width", width); + const root = d3_node.hierarchy(hierarchy, (d) => d.children) + .sum((d) => (d.children ? 0 : 1)) + .sort((a, b) => a.depth - b.depth); + const outerRadius = width / 2; + const innerRadius = outerRadius - 170; + const cluster = d3_node.cluster() + .size([360, innerRadius]) + .separation((a, b) => 1); + const color = d3_node.scaleOrdinal() + .domain(graph.nodes()) + .range(d3_node.schemeCategory10); + function maxLength(d) { + return d.data.data.depth + (d.children ? d3_node.max(d.children, maxLength) : 0); + } + function setRadius(d, y0, k) { + d.radius = (y0 += d.data.data.depth) * k; + if (d.children) + d.children.forEach((d) => setRadius(d, y0, k)); + } + function setColor(d) { + var name = d.data.data.name; + d.color = + color.domain().indexOf(name) >= 0 + ? color(name) + : d.parent + ? d.parent.color + : null; + if (d.children) + d.children.forEach(setColor); + } + function linkConstant(d) { + return linkStep(d.source.x, d.source.y, d.target.x, d.target.y); + } + function linkExtensionConstant(d) { + return linkStep(d.target.x, d.target.y, d.target.x, innerRadius); + } + function linkStep(startAngle, startRadius, endAngle, endRadius) { + const c0 = Math.cos((startAngle = ((startAngle - 90) / 180) * Math.PI)); + const s0 = Math.sin(startAngle); + const c1 = Math.cos((endAngle = ((endAngle - 90) / 180) * Math.PI)); + const s1 = Math.sin(endAngle); + return ("M" + + startRadius * c0 + + "," + + startRadius * s0 + + (endAngle === startAngle + ? "" + : "A" + + startRadius + + "," + + startRadius + + " 0 0 " + + (endAngle > startAngle ? 1 : 0) + + " " + + startRadius * c1 + + "," + + startRadius * s1) + + "L" + + endRadius * c1 + + "," + + endRadius * s1); } - adjList.push({ - id: 999999999, - name: "CONTAINER", - parentId: undefined, - depth: 0, - }); - const maxDepth = adjList.sort((a, b) => a.depth - b.depth).last().depth; - adjList.forEach((item) => (item.height = maxDepth - item.depth)); - console.log({ visits }); - return adjList; + const legend = (svg) => { + const g = svg + .selectAll("g") + .data(color.domain()) + .join("g") + .attr("transform", (d, i) => `translate(${-outerRadius},${-outerRadius + i * 20})`); + g.append("rect").attr("width", 18).attr("height", 18).attr("fill", color); + g.append("text") + .attr("x", 24) + .attr("y", 9) + .attr("dy", "0.35em") + .text((d) => d); + }; + cluster(root); + setRadius(root, (root.data.data.depth = 0), innerRadius / maxLength(root)); + setColor(root); + svg.append("g").call(legend); + svg.append("style").text(` + +.link--active { +stroke: #000 !important; +stroke-width: 1.5px; } -d3_node.stratify() - .id(function (d) { - console.log({ d }); - return d.name; -}) - .parentId(function (d) { - return d.parentId; -}); -class VisModal extends require$$0.Modal { - constructor(app, plugin) { - super(app); - this.plugin = plugin; - this.modal = this; - } - onOpen() { - new require$$0.Notice("Alot of these features may not work, it is still very experimental."); - const { contentEl } = this; - contentEl.empty(); - new VisComp({ - target: contentEl, - props: { - modal: this, - settings: this.plugin.settings, - }, - }); + +.link-extension--active { +stroke-opacity: .6; +} + +.label--active { +font-weight: bold; +} + +`); + const linkExtension = svg + .append("g") + .attr("fill", "none") + .attr("stroke", "#000") + .attr("stroke-opacity", 0.25) + .selectAll("path") + .data(root.links().filter((d) => !d.target.children)) + .join("path") + .each(function (d) { + d.target.linkExtensionNode = this; + }) + .attr("d", linkExtensionConstant); + const link = svg + .append("g") + .attr("fill", "none") + .attr("stroke", "#000") + .selectAll("path") + .data(root.links()) + .join("path") + .each(function (d) { + d.target.linkNode = this; + }) + .attr("d", linkConstant) + .attr("stroke", (d) => d.target.color); + const label = svg + .append("g") + .selectAll("text") + .data(root.leaves()) + .join("text") + .attr("dy", ".31em") + .attr("transform", (d) => `rotate(${d.x - 90}) translate(${innerRadius + 4},0)${d.x < 180 ? "" : " rotate(180)"}`) + .attr("text-anchor", (d) => (d.x < 180 ? "start" : "end")) + .text((d) => d.data.data.name) + .on("mouseover", mouseovered(true)) + .on("mouseout", mouseovered(false)); + // function update(checked) { + // const t = d3.transition().duration(750); + // linkExtension + // .transition(t) + // .attr("d", checked ? linkExtensionVariable : linkExtensionConstant); + // link.transition(t).attr("d", checked ? linkVariable : linkConstant); + // } + function mouseovered(active) { + return function (event, d) { + d3_node.select(this).classed("label--active", active); + d3_node.select(d.linkExtensionNode) + .classed("link-extension--active", active) + .raise(); + do + d3_node.select(d.linkNode).classed("link--active", active).raise(); + while ((d = d.parent)); + }; } - onClose() { - this.contentEl.empty(); + function zoomed({ transform }) { + linkExtension.attr("transform", transform); + link.attr("transform", transform); + label.attr("transform", transform); } -} - -/* src\Components\ModifyHNItemComp.svelte generated by Svelte v3.35.0 */ - -function add_css() { - var style = element("style"); - style.id = "svelte-13g4k7i-style"; - style.textContent = "pre.svelte-13g4k7i{display:inline}"; - append(document.head, style); -} - -// (21:2) {#if rel === "up"} -function create_if_block_2(ctx) { - let if_block_anchor; - - function select_block_type(ctx, dirty) { - if (/*hnItem*/ ctx[2].depth === 0) return create_if_block_3; - return create_else_block; - } - - let current_block_type = select_block_type(ctx); - let if_block = current_block_type(ctx); - - return { - c() { - if_block.c(); - if_block_anchor = empty(); - }, - m(target, anchor) { - if_block.m(target, anchor); - insert(target, if_block_anchor, anchor); - }, - p(ctx, dirty) { - if (current_block_type === (current_block_type = select_block_type(ctx)) && if_block) { - if_block.p(ctx, dirty); - } else { - if_block.d(1); - if_block = current_block_type(ctx); + svg.call(d3_node.zoom() + .extent([ + [0, 0], + [width, height], + ]) + .scaleExtent([0.5, 8]) + .on("zoom", zoomed)); +}; - if (if_block) { - if_block.c(); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } - }, - d(detaching) { - if_block.d(detaching); - if (detaching) detach(if_block_anchor); - } - }; -} +const sunburst = (graph, app, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy = d3_node.stratify()(flatAdj); + console.log({ hierarchy }); + var radius = Math.min(width, height) / 2; // < -- 2 + var color = d3_node.scaleOrdinal(d3_node.schemeCategory10); + var g = d3_node.select("svg") // <-- 1 + .attr("width", width) // <-- 2 + .attr("height", height) + .append("g") // <-- 3 + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); // <-- 4 + var g = d3_node.select("svg") // returns a handle to the element + .attr("width", width) // sets the width of and then returns the element again + .attr("height", height) // (same as width) + .append("g") // adds a element to the element. It returns the element + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); // takes the element and moves the [0,0] center over and down + var g = d3_node.select("svg") // --> + .attr("width", width) // --> + .attr("height", height) // --> + .append("g") // --> + .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"); // --> + var partition = d3_node.partition() // <-- 1 + .size([2 * Math.PI, radius]); // <-- 2 + var root = d3_node.hierarchy(hierarchy) // <-- 1 + .sum(function (d) { + return d.height; + }); // <-- 2 + partition(root); // <-- 1 + var arc = d3_node.arc() // <-- 2 + .startAngle(function (d) { + return d.x0; + }) + .endAngle(function (d) { + return d.x1; + }) + .innerRadius(function (d) { + return d.y0; + }) + .outerRadius(function (d) { + return d.y1; + }); + g.selectAll("path") // <-- 1 + .data(root.descendants()) // <-- 2 + .enter() // <-- 3 + .append("path") // <-- 4 + .attr("display", function (d) { + return d.depth ? null : "none"; + }) // <-- 5 + .attr("d", arc) // <-- 6 + .style("stroke", "#fff") // <-- 7 + .style("fill", function (d) { + return color((d.children ? d : d.parent).data.name); + }); // <-- 8 +}; -// (24:4) {:else} -function create_else_block(ctx) { - let div; - let pre; - let t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth - 4, true) + ""; - let t; +const tidyTree = (graph, app, currFile, modal, width, height) => { + // const adjList: AdjListItem[] = bfsAdjList(graph, currFile.basename); + // console.log({ adjList }); + // const noDoubles = [...adjList]; + // noDoubles.forEach((a, i, list) => { + // if (list.some((b, j) => i !== j && a.parentId === b.parentId)) { + // noDoubles.splice(i, 1); + // } + // }); + // console.log({ noDoubles }); + const tree = (data) => { + const root = d3_node.hierarchy(data); + root.dx = 10; + root.dy = width / (root.height + 1); + return d3_node.tree().nodeSize([root.dx, root.dy])(root); + }; + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy = d3_node.stratify()(flatAdj); + console.log({ hierarchy }); + const root = tree(hierarchy); + console.log(root); + let x0 = Infinity; + let x1 = -x0; + root.each((d) => { + if (d.x > x1) + x1 = d.x; + if (d.x < x0) + x0 = d.x; + }); + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", height) + .attr("width", width); + const g = svg + .append("g") + .attr("font-family", "sans-serif") + .attr("font-size", 10) + .attr("transform", `translate(${root.dy / 3},${root.dx - x0})`); + g + .append("g") + .attr("fill", "none") + .attr("stroke", "#555") + .attr("stroke-opacity", 0.4) + .attr("stroke-width", 1.5) + .selectAll("path") + .data(root.links()) + .join("path") + .attr("d", d3_node.linkHorizontal() + .x((d) => d.y) + .y((d) => d.x)); + const node = g + .append("g") + .attr("stroke-linejoin", "round") + .attr("stroke-width", 10) + .selectAll("g") + .data(root.descendants()) + .join("g") + .attr("transform", (d) => `translate(${d.y},${d.x})`); + node + .append("circle") + .attr("fill", (d) => (d.children ? "#555" : "#999")) + .attr("r", 10); + node.attr("aria-label", (d) => { + console.log(d); + return d.data.data.name; + }); + const nodeClick = (event, dest) => { + openOrSwitch(app, dest, event); + modal.close(); + }; + node.on("click", (event, d) => { + console.log({ d }); + nodeClick(event, d.data.data.name); + }); + node + .append("text") + .attr("dy", "0.31em") + .attr("x", (d) => (d.children ? -6 : 6)) + .attr("text-anchor", (d) => (d.children ? "end" : "start")) + .text((d) => d.data.data.name) + .clone(true) + .lower() + .attr("stroke", "white"); + function zoomed({ transform }) { + svg.attr("transform", transform); + } + svg.call(d3_node.zoom() + .extent([ + [0, 0], + [width, height], + ]) + .scaleExtent([0.5, 8]) + .on("zoom", zoomed)); +}; - return { - c() { - div = element("div"); - pre = element("pre"); - t = text(t_value); - attr(pre, "class", "svelte-13g4k7i"); - }, - m(target, anchor) { - insert(target, div, anchor); - append(div, pre); - append(pre, t); - }, - p(ctx, dirty) { - if (dirty & /*newItem, hnItem*/ 36 && t_value !== (t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth - 4, true) + "")) set_data(t, t_value); - }, - d(detaching) { - if (detaching) detach(div); - } - }; -} +const treeMap = (graph, app, currFile, modal, width, height) => { + const flatAdj = dfsFlatAdjList(graph, currFile.basename); + console.log({ flatAdj }); + const hierarchy = d3_node.stratify()(flatAdj); + console.log({ hierarchy }); + const root = d3_node.treemap() + .tile(d3_node.treemapBinary) + .size([width, height]) + .padding(1) + .round(true)(hierarchy.sum((d) => d.height).sort((a, b) => b.height - a.height)); + // const root = treemap(data); + const svg = d3_node.select(".d3-graph") + .append("svg") + .attr("height", height) + .attr("width", width) + .style("font", "10px sans-serif"); + const leaf = svg + .selectAll("g") + .data(root.leaves()) + .join("g") + .attr("transform", (d) => `translate(${d.x0},${d.y0})`); + leaf.attr("aria-label", (d) => d.data.name); + // leaf.append("title").text( + // (d) => + // `${d + // .ancestors() + // .reverse() + // .map((d) => d.data.id) + // .join("/")}\n${format(d.height)}` + // ); + const color = d3_node.scaleOrdinal(d3_node.schemeCategory10); + leaf + .append("rect") + // .attr("id", (d) => (d.leafUid = DOM.uid("leaf")).id) + .attr("fill", (d) => { + while (d.depth > 1) + d = d.parent; + return color(d.data.id); + }) + .attr("fill-opacity", 0.6) + .attr("width", (d) => d.x1 - d.x0) + .attr("height", (d) => d.y1 - d.y0); + leaf + .append("clipPath") + // .attr("id", (d) => (d.clipUid = DOM.uid("clip")).id) + .append("use"); + // .attr("xlink:href", (d) => d.leafUid.href); + // leaf + // .append("text") + // .attr("clip-path", (d) => d.clipUid) + // .selectAll("tspan") + // .data((d) => { + // console.log({ d }); + // return d.data.name.split(/(?=[A-Z][^A-Z])/g).concat(format(d.height)); + // }) + // .join("tspan") + // .attr("x", 3) + // .attr( + // "y", + // (d, i, nodes) => `${(i === nodes.length - 1) * 0.3 + 1.1 + i * 0.9}em` + // ) + // .attr("fill-opacity", (d, i, nodes) => + // i === nodes.length - 1 ? 0.7 : null + // ); + // // .text((d) => d); + const nodeClick = (event, dest) => { + openOrSwitch(app, dest, event); + modal.close(); + }; + leaf.on("click", (event, d) => { + console.log({ d }); + nodeClick(event, d.data.name); + }); + function zoomed({ transform }) { + svg.attr("transform", transform); + } + svg.call(d3_node.zoom() + .extent([ + [0, 0], + [width, height], + ]) + .scaleExtent([0.5, 8]) + .on("zoom", zoomed)); +}; -// (22:4) {#if hnItem.depth === 0} -function create_if_block_3(ctx) { - let div; +/* src\Components\VisComp.svelte generated by Svelte v3.35.0 */ - return { - c() { - div = element("div"); - div.textContent = "Can't add parent to top level item, choose another direction"; - }, - m(target, anchor) { - insert(target, div, anchor); - }, - p: noop, - d(detaching) { - if (detaching) detach(div); - } - }; +function get_each_context(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[20] = list[i]; + child_ctx[21] = list; + child_ctx[22] = i; + return child_ctx; } - -// (43:27) -function create_if_block_1(ctx) { - let div; - let pre; - let t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth + 4, true) + ""; - let t; - - return { - c() { - div = element("div"); - pre = element("pre"); - t = text(t_value); - attr(pre, "class", "svelte-13g4k7i"); - }, - m(target, anchor) { - insert(target, div, anchor); - append(div, pre); - append(pre, t); - }, - p(ctx, dirty) { - if (dirty & /*newItem, hnItem*/ 36 && t_value !== (t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth + 4, true) + "")) set_data(t, t_value); - }, - d(detaching) { - if (detaching) detach(div); - } - }; + +function get_each_context_1(ctx, list, i) { + const child_ctx = ctx.slice(); + child_ctx[23] = list[i]; + return child_ctx; } -// (37:2) {#if rel === "same"} -function create_if_block(ctx) { - let div; - let pre; - let t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth, true) + ""; +// (163:8) {#each selector.options as op} +function create_each_block_1(ctx) { + let option; + let t_value = /*op*/ ctx[23] + ""; let t; + let option_value_value; return { c() { - div = element("div"); - pre = element("pre"); + option = element("option"); t = text(t_value); - attr(pre, "class", "svelte-13g4k7i"); + option.__value = option_value_value = /*op*/ ctx[23]; + option.value = option.__value; }, m(target, anchor) { - insert(target, div, anchor); - append(div, pre); - append(pre, t); + insert(target, option, anchor); + append(option, t); }, p(ctx, dirty) { - if (dirty & /*newItem, hnItem*/ 36 && t_value !== (t_value = /*buildNewItem*/ ctx[6](/*newItem*/ ctx[5], /*hnItem*/ ctx[2].depth, true) + "")) set_data(t, t_value); + if (dirty & /*selectors*/ 1 && t_value !== (t_value = /*op*/ ctx[23] + "")) set_data(t, t_value); + + if (dirty & /*selectors*/ 1 && option_value_value !== (option_value_value = /*op*/ ctx[23])) { + option.__value = option_value_value; + option.value = option.__value; + } }, d(detaching) { - if (detaching) detach(div); + if (detaching) detach(option); } }; } -function create_fragment(ctx) { - let h5; +// (153:2) {#each selectors as selector} +function create_each_block(ctx) { + let span; + let t0_value = /*selector*/ ctx[20].text + ""; let t0; - let t1_value = ARROW_DIRECTIONS[/*rel*/ ctx[0]] + ""; let t1; - let t2; - let t3_value = dropWikilinks(/*hnItem*/ ctx[2].line) + ""; - let t3; - let t4; - let div1; - let t5; - let div0; - let pre; - let strong; - let t6_value = /*buildNewItem*/ ctx[6](dropWikilinks(/*hnItem*/ ctx[2].line), /*hnItem*/ ctx[2].depth, true) + ""; - let t6; - let t7; - let t8; let select; - let option0; - let option1; - let option2; - let t12; - let input; - let t13; - let button; + let select_value_value; + let t2; let mounted; let dispose; - let if_block0 = /*rel*/ ctx[0] === "up" && create_if_block_2(ctx); + let each_value_1 = /*selector*/ ctx[20].options; + let each_blocks = []; - function select_block_type_1(ctx, dirty) { - if (/*rel*/ ctx[0] === "same") return create_if_block; - if (/*rel*/ ctx[0] === "down") return create_if_block_1; + for (let i = 0; i < each_value_1.length; i += 1) { + each_blocks[i] = create_each_block_1(get_each_context_1(ctx, each_value_1, i)); } - let current_block_type = select_block_type_1(ctx); - let if_block1 = current_block_type && current_block_type(ctx); + function change_handler(...args) { + return /*change_handler*/ ctx[3](/*selector*/ ctx[20], /*each_value*/ ctx[21], /*selector_index*/ ctx[22], ...args); + } return { c() { - h5 = element("h5"); - t0 = text("Add an "); - t1 = text(t1_value); - t2 = text(" to "); - t3 = text(t3_value); - t4 = space(); - div1 = element("div"); - if (if_block0) if_block0.c(); - t5 = space(); - div0 = element("div"); - pre = element("pre"); - strong = element("strong"); - t6 = text(t6_value); - t7 = space(); - if (if_block1) if_block1.c(); - t8 = space(); + span = element("span"); + t0 = text(t0_value); + t1 = text(":\r\n \r\n "); select = element("select"); - option0 = element("option"); - option0.textContent = "up"; - option1 = element("option"); - option1.textContent = "same"; - option2 = element("option"); - option2.textContent = "down"; - t12 = space(); - input = element("input"); - t13 = space(); - button = element("button"); - button.textContent = "Add"; - attr(pre, "class", "svelte-13g4k7i"); - option0.__value = "up"; - option0.value = option0.__value; - option1.__value = "same"; - option1.value = option1.__value; - option2.__value = "down"; - option2.value = option2.__value; - attr(select, "class", "dropdown"); - attr(select, "width", "1"); - if (/*rel*/ ctx[0] === void 0) add_render_callback(() => /*select_change_handler*/ ctx[8].call(select)); - attr(input, "type", "text"); - attr(input, "placeholder", "New item"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + t2 = space(); }, m(target, anchor) { - insert(target, h5, anchor); - append(h5, t0); - append(h5, t1); - append(h5, t2); - append(h5, t3); - insert(target, t4, anchor); - insert(target, div1, anchor); - if (if_block0) if_block0.m(div1, null); - append(div1, t5); - append(div1, div0); - append(div0, pre); - append(pre, strong); - append(strong, t6); - append(div1, t7); - if (if_block1) if_block1.m(div1, null); - append(div1, t8); - append(div1, select); - append(select, option0); - append(select, option1); - append(select, option2); - select_option(select, /*rel*/ ctx[0]); - append(div1, t12); - append(div1, input); - /*input_binding*/ ctx[9](input); - set_input_value(input, /*newItem*/ ctx[5]); - append(div1, t13); - append(div1, button); + insert(target, span, anchor); + append(span, t0); + append(span, t1); + append(span, select); - if (!mounted) { - dispose = [ - listen(select, "change", /*select_change_handler*/ ctx[8]), - listen(input, "input", /*input_input_handler*/ ctx[10]), - listen(button, "click", /*click_handler*/ ctx[11]) - ]; + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(select, null); + } + + select_option(select, /*selector*/ ctx[20].val); + append(span, t2); + if (!mounted) { + dispose = listen(select, "change", change_handler); mounted = true; } }, - p(ctx, [dirty]) { - if (dirty & /*rel*/ 1 && t1_value !== (t1_value = ARROW_DIRECTIONS[/*rel*/ ctx[0]] + "")) set_data(t1, t1_value); - if (dirty & /*hnItem*/ 4 && t3_value !== (t3_value = dropWikilinks(/*hnItem*/ ctx[2].line) + "")) set_data(t3, t3_value); + p(new_ctx, dirty) { + ctx = new_ctx; + if (dirty & /*selectors*/ 1 && t0_value !== (t0_value = /*selector*/ ctx[20].text + "")) set_data(t0, t0_value); - if (/*rel*/ ctx[0] === "up") { - if (if_block0) { - if_block0.p(ctx, dirty); - } else { - if_block0 = create_if_block_2(ctx); - if_block0.c(); - if_block0.m(div1, t5); + if (dirty & /*selectors*/ 1) { + each_value_1 = /*selector*/ ctx[20].options; + let i; + + for (i = 0; i < each_value_1.length; i += 1) { + const child_ctx = get_each_context_1(ctx, each_value_1, i); + + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block_1(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(select, null); + } } - } else if (if_block0) { - if_block0.d(1); - if_block0 = null; + + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } + + each_blocks.length = each_value_1.length; } - if (dirty & /*hnItem*/ 4 && t6_value !== (t6_value = /*buildNewItem*/ ctx[6](dropWikilinks(/*hnItem*/ ctx[2].line), /*hnItem*/ ctx[2].depth, true) + "")) set_data(t6, t6_value); + if (dirty & /*selectors*/ 1 && select_value_value !== (select_value_value = /*selector*/ ctx[20].val)) { + select_option(select, /*selector*/ ctx[20].val); + } + }, + d(detaching) { + if (detaching) detach(span); + destroy_each(each_blocks, detaching); + mounted = false; + dispose(); + } + }; +} + +function create_fragment(ctx) { + let div0; + let t; + let div1; + let each_value = /*selectors*/ ctx[0]; + let each_blocks = []; + + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block(get_each_context(ctx, each_value, i)); + } + + return { + c() { + div0 = element("div"); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } + + t = space(); + div1 = element("div"); + attr(div1, "class", "d3-graph"); + }, + m(target, anchor) { + insert(target, div0, anchor); + + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].m(div0, null); + } + + insert(target, t, anchor); + insert(target, div1, anchor); + }, + p(ctx, [dirty]) { + if (dirty & /*selectors*/ 1) { + each_value = /*selectors*/ ctx[0]; + let i; - if (current_block_type === (current_block_type = select_block_type_1(ctx)) && if_block1) { - if_block1.p(ctx, dirty); - } else { - if (if_block1) if_block1.d(1); - if_block1 = current_block_type && current_block_type(ctx); + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context(ctx, each_value, i); - if (if_block1) { - if_block1.c(); - if_block1.m(div1, t8); + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(div0, null); + } } - } - if (dirty & /*rel*/ 1) { - select_option(select, /*rel*/ ctx[0]); - } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } - if (dirty & /*newItem*/ 32 && input.value !== /*newItem*/ ctx[5]) { - set_input_value(input, /*newItem*/ ctx[5]); + each_blocks.length = each_value.length; } }, i: noop, o: noop, d(detaching) { - if (detaching) detach(h5); - if (detaching) detach(t4); + if (detaching) detach(div0); + destroy_each(each_blocks, detaching); + if (detaching) detach(t); if (detaching) detach(div1); - if (if_block0) if_block0.d(); - - if (if_block1) { - if_block1.d(); - } - - /*input_binding*/ ctx[9](null); - mounted = false; - run_all(dispose); } }; } function instance($$self, $$props, $$invalidate) { + let argArr; let { modal } = $$props; let { settings } = $$props; - let { hnItem } = $$props; - let { file } = $$props; - let { rel } = $$props; - let inputEl; - let newItem = ""; - const buildNewItem = (newItem, depth = hnItem.depth, preview = false) => `${(" ").repeat(Math.round(depth / (preview ? 2 : 1)))}- ${preview ? newItem || "" : makeWiki(newItem)}`; - onMount(() => inputEl.focus()); - - function select_change_handler() { - rel = select_value(this); - $$invalidate(0, rel); - } + const { app } = modal; + const { plugin } = modal; + const currFile = app.workspace.getActiveFile(); - function input_binding($$value) { - binding_callbacks[$$value ? "unshift" : "push"](() => { - inputEl = $$value; - $$invalidate(4, inputEl); - }); - } + const selectors = [ + { + text: "Type", + options: VISTYPES, + val: settings.visGraph + }, + { + text: "Relation", + options: RELATIONS, + val: settings.visRelation + }, + { + text: "Close Implied", + options: REAlCLOSED, + val: settings.visClosed + }, + { + text: "No Unlinked", + options: ALLUNLINKED, + val: settings.visAll + } + ]; - function input_input_handler() { - newItem = this.value; - $$invalidate(5, newItem); - } + const [width, height] = [Math.round(window.innerWidth / 1.3), Math.round(window.innerHeight / 1.3)]; + const { mainG } = plugin; - const click_handler = async e => { - if (rel === "up" && hnItem.depth === 0) { - new require$$0.Notice("Can't add parent to top level item, choose another direction"); - return; - } else { - try { - const content = await modal.app.vault.read(file); - const lines = content.split("\n"); - const lineNo = rel === "up" ? hnItem.lineNo : hnItem.lineNo + 1; + const [up, same, down] = [ + getSubInDirs(mainG, "up"), + getSubInDirs(mainG, "same"), + getSubInDirs(mainG, "down") + ]; - const depth = rel === "up" - ? hnItem.depth - 4 - : rel === "down" ? hnItem.depth + 4 : hnItem.depth; + const [closedParentNoSingle, closedSiblingNoSingle, closedChildNoSingle] = [ + closeImpliedLinks(up, down), + closeImpliedLinks(same, same), + closeImpliedLinks(down, up) + ]; - lines.splice(lineNo, 0, buildNewItem(newItem, depth)); - await modal.app.vault.modify(file, lines.join("\n")); - modal.close(); - } catch(err) { - console$1.error(err); - new require$$0.Notice("An error occured, please check the console"); + const graphs = { + Parent: { + Real: { + All: up, + "No Unlinked": removeUnlinkedNodes(up) + }, + Closed: { + All: closedParentNoSingle, + "No Unlinked": removeUnlinkedNodes(closedParentNoSingle) + } + }, + Sibling: { + Real: { + All: same, + "No Unlinked": removeUnlinkedNodes(same) + }, + Closed: { + All: closedSiblingNoSingle, + "No Unlinked": removeUnlinkedNodes(closedSiblingNoSingle) + } + }, + Child: { + Real: { + All: down, + "No Unlinked": removeUnlinkedNodes(down) + }, + Closed: { + All: closedChildNoSingle, + "No Unlinked": removeUnlinkedNodes(closedChildNoSingle) } } }; - $$self.$$set = $$props => { - if ("modal" in $$props) $$invalidate(1, modal = $$props.modal); - if ("settings" in $$props) $$invalidate(7, settings = $$props.settings); - if ("hnItem" in $$props) $$invalidate(2, hnItem = $$props.hnItem); - if ("file" in $$props) $$invalidate(3, file = $$props.file); - if ("rel" in $$props) $$invalidate(0, rel = $$props.rel); + const types = { + "Force Directed Graph": { fun: forceDirectedG }, + "Tidy Tree": { fun: tidyTree }, + "Circle Packing": { fun: circlePacking }, + "Edge Bundling": { fun: edgeBundling }, + "Arc Diagram": { fun: arcDiagram }, + Sunburst: { fun: sunburst }, + "Tree Map": { fun: treeMap }, + Icicle: { fun: icicle }, + "Radial Tree": { fun: radialTree } }; - return [ - rel, - modal, - hnItem, - file, - inputEl, - newItem, - buildNewItem, - settings, - select_change_handler, - input_binding, - input_input_handler, - click_handler - ]; -} + function draw(type) { + var _a; -class ModifyHNItemComp extends SvelteComponent { - constructor(options) { - super(); - if (!document.getElementById("svelte-13g4k7i-style")) add_css(); + if (!document.querySelector(".d3-graph")) { + setTimeout( + () => { + var _a; - init(this, options, instance, create_fragment, safe_not_equal, { - modal: 1, - settings: 7, - hnItem: 2, - file: 3, - rel: 0 - }); + (_a = document.querySelector(".d3-graph")) === null || _a === void 0 + ? void 0 + : _a.empty(); + + try { + types[type].fun(...argArr); + } catch(error) { + console.log(error); + } + }, + 10 + ); + } else { + (_a = document.querySelector(".d3-graph")) === null || _a === void 0 + ? void 0 + : _a.empty(); + + try { + types[type].fun(...argArr); + } catch(error) { + console.log(error); + } + } } -} -class ModifyHierItemModal extends require$$0.Modal { - constructor(app, plugin, hnItem, file, rel) { - super(app); - this.plugin = plugin; - this.modal = this; - this.hnItem = hnItem; - this.file = file; - this.rel = rel; - } - onOpen() { - const { contentEl } = this; - contentEl.empty(); - new ModifyHNItemComp({ - target: contentEl, - props: { - modal: this, - settings: this.plugin.settings, - hnItem: this.hnItem, - file: this.file, - rel: this.rel, - }, - }); - } - onClose() { - this.contentEl.empty(); - } + const change_handler = (selector, each_value, selector_index, el) => { + $$invalidate(0, each_value[selector_index].val = el.target.value, selectors); + }; + + $$self.$$set = $$props => { + if ("modal" in $$props) $$invalidate(1, modal = $$props.modal); + if ("settings" in $$props) $$invalidate(2, settings = $$props.settings); + }; + + $$self.$$.update = () => { + if ($$self.$$.dirty & /*selectors, modal*/ 3) { + argArr = [ + graphs[selectors[1].val][selectors[2].val][selectors[3].val], + app, + currFile, + modal, + width, + height + ]; + } + + if ($$self.$$.dirty & /*selectors*/ 1) { + draw(selectors[0].val); + } + }; + + return [selectors, modal, settings, change_handler]; } -class HierarchyNoteManipulator extends require$$0.FuzzySuggestModal { - constructor(app, plugin, hierNoteName) { - super(app); - this.app = app; - this.plugin = plugin; - this.settings = this.plugin.settings; - this.hierNoteName = hierNoteName; - const chooseOverride = (evt) => { - // @ts-ignore - this.chooser.useSelectedItem(evt); - return false; - }; - this.scope.register([], "Delete", chooseOverride); - this.scope.register(["Shift"], "ArrowUp", chooseOverride); - this.scope.register(["Shift"], "ArrowRight", chooseOverride); - this.scope.register(["Shift"], "ArrowDown", chooseOverride); - } - async onOpen() { - this.setPlaceholder("HN Manipulator"); - this.setInstructions([ - { command: "Enter/Click", purpose: "Jump to item" }, - { command: "Shift + ↑", purpose: "Add parent" }, - { command: "Shift + →", purpose: "Add sibling" }, - { command: "Shift + ↓", purpose: "Add child" }, - { command: "Delete", purpose: "Delete item" }, - ]); - this.file = this.app.metadataCache.getFirstLinkpathDest(this.hierNoteName, ""); - if (!this.file) - this.lines = []; - const content = await this.app.vault.cachedRead(this.file); - this.lines = content.split("\n"); - this.listItems = this.app.metadataCache.getFileCache(this.file).listItems; - super.onOpen(); - } - getItems() { - const items = this.listItems - .map((item) => { - const i = item.position.start.line; - return { i, line: this.lines[i] }; - }) - .map((item) => { - const splits = item.line.split("- "); - const depth = splits[0].length; - const line = splits.slice(1).join("- "); - return { depth, line, lineNo: item.i }; +class VisComp extends SvelteComponent { + constructor(options) { + super(); + init(this, options, instance, create_fragment, safe_not_equal, { modal: 1, settings: 2 }); + } +} + +function graphlibToD3(g) { + const d3Graph = { nodes: [], links: [] }; + const edgeIDs = {}; + g.nodes().forEach((node, i) => { + d3Graph.nodes.push({ id: i, name: node }); + edgeIDs[node] = i; + }); + g.forEachEdge((k, a, s, t) => { + d3Graph.links.push({ + source: edgeIDs[s], + target: edgeIDs[t], }); - return items; - } - getItemText(item) { - return `${" ".repeat(item.depth)}- ${dropWikilinks(item.line)}`; - } - renderSuggestion(item, el) { - super.renderSuggestion(item, el); - el.innerText = `${" ".repeat(item.item.depth)}- ${dropWikilinks(item.item.line)}`; - } - async deleteItem(item) { - try { - this.lines.splice(item.lineNo, 1); - this.listItems.splice(item.lineNo, 1); - await this.app.vault.modify(this.file, this.lines.join("\n")); - new require$$0.Notice("Item deleted Succesfully"); + }); + return d3Graph; +} +function bfsAdjList(g, startNode) { + const queue = [startNode]; + const adjList = []; + let i = 0; + while (queue.length && i < 1000) { + i++; + const currNode = queue.shift(); + const neighbours = { + succs: getOutNeighbours(g, currNode), + pres: getInNeighbours(g, currNode), + }; + console.log({ currNode, neighbours }); + const next = { + name: currNode, + pres: undefined, + succs: undefined, + parentId: i, + depth: i, + }; + if (neighbours.succs.length) { + next.succs = neighbours.succs; + queue.push(...neighbours.succs); } - catch (err) { - loglevel.error(err); - new require$$0.Notice("An error occured. Please check the console"); + if (neighbours.pres.length) { + next.pres = neighbours.pres; } + adjList.push(next); } - onChooseItem(item, evt) { - if (evt instanceof KeyboardEvent && evt.key === "Delete") { - this.deleteItem(item); - } - else if (evt instanceof KeyboardEvent && evt.shiftKey) { - const rel = evt.key === "ArrowUp" - ? "up" - : evt.key === "ArrowDown" - ? "down" - : "same"; - new ModifyHierItemModal(this.app, this.plugin, item, this.file, rel).open(); - this.close(); + const maxDepth = adjList.sort((a, b) => a.depth - b.depth).last().depth; + adjList.forEach((item) => (item.height = maxDepth - item.depth)); + return adjList; +} +function dfsFlatAdjList(g, startNode) { + const nodes = g.nodes(); + const nodeCount = nodes.length; + const visits = {}; + nodes.forEach((node, i) => { + visits[node] = nodeCount * i; + }); + const queue = [startNode]; + const adjList = []; + let depth = 1; + let i = 0; + while (queue.length && i < 1000) { + i++; + const currNode = queue.shift(); + const next = getOutNeighbours(g, currNode); + if (next.length) { + queue.unshift(...next); + next.forEach((succ) => { + const parentId = nodeCount * nodes.indexOf(succ); + if (!adjList.some((adjItem) => adjItem.name === currNode && adjItem.parentId === parentId)) { + adjList.push({ + id: visits[currNode], + name: currNode, + parentId, + depth, + }); + visits[currNode]++; + } + }); + depth++; } else { - const view = this.app.workspace.getActiveViewOfType(require$$0.MarkdownView); - const { editor } = view !== null && view !== void 0 ? view : {}; - if (!editor) - return; - //@ts-ignore - view.leaf.openFile(this.file, { active: true, mode: "source" }); - editor.setCursor({ line: item.lineNo, ch: item.depth + 2 }); + adjList.push({ + id: visits[currNode], + name: currNode, + parentId: 999999999, + depth, + }); + depth = 1; + visits[currNode]++; } } -} - -class HierarchyNoteSelectorModal extends require$$0.FuzzySuggestModal { + adjList.push({ + id: 999999999, + name: "CONTAINER", + parentId: undefined, + depth: 0, + }); + const maxDepth = adjList.sort((a, b) => a.depth - b.depth).last().depth; + adjList.forEach((item) => (item.height = maxDepth - item.depth)); + console.log({ visits }); + return adjList; +} +d3_node.stratify() + .id(function (d) { + console.log({ d }); + return d.name; +}) + .parentId(function (d) { + return d.parentId; +}); +class VisModal extends require$$0.Modal { constructor(app, plugin) { super(app); - this.app = app; this.plugin = plugin; - this.settings = this.plugin.settings; + this.modal = this; } onOpen() { - this.setPlaceholder("HN Chooser"); - const { hierarchyNotes } = this.settings; - if (hierarchyNotes.length === 0) { - this.close(); - new require$$0.Notice("No hierarchy notes found"); - } - else if (hierarchyNotes.length === 1) { - this.close(); - new HierarchyNoteManipulator(this.app, this.plugin, hierarchyNotes[0]).open(); - } - else { - super.onOpen(); - } - } - getItems() { - return this.settings.hierarchyNotes; - } - getItemText(item) { - return `${item}`; - } - renderSuggestion(item, el) { - super.renderSuggestion(item, el); + new require$$0.Notice("Alot of these features may not work, it is still very experimental."); + const { contentEl } = this; + contentEl.empty(); + new VisComp({ + target: contentEl, + props: { + modal: this, + settings: this.plugin.settings, + }, + }); } - onChooseItem(item, evt) { - new HierarchyNoteManipulator(this.app, this.plugin, item).open(); - this.close(); + onClose() { + this.contentEl.empty(); } } @@ -50420,6 +50420,28 @@ class BCPlugin extends require$$0.Plugin { await copy(globalIndex); }, }); + ["up", "down", "next", "prev"].forEach((dir) => { + this.addCommand({ + id: `jump-to-first-${dir}`, + name: `Jump to first '${dir}'`, + callback: async () => { + const file = this.app.workspace.getActiveFile(); + if (!file) { + new require$$0.Notice("You need to be focussed on a Markdown file"); + return; + } + const { basename } = file; + const realsNImplieds = getRealnImplied(this, basename, dir)[dir]; + const allBCs = [...realsNImplieds.reals, ...realsNImplieds.implieds]; + if (allBCs.length === 0) { + new require$$0.Notice(`No ${dir} found`); + return; + } + const toFile = this.app.metadataCache.getFirstLinkpathDest(allBCs[0].to, ""); + this.app.workspace.activeLeaf.openFile(toFile); + }, + }); + }); this.addRibbonIcon(addFeatherIcon("tv"), "Breadcrumbs Visualisation", () => new VisModal(this.app, this).open()); this.statusBatItemEl = this.addStatusBarItem(); this.addSettingTab(new BCSettingTab(this.app, this)); @@ -50923,11 +50945,13 @@ class BCPlugin extends require$$0.Plugin { }); function noticeIfBroken(frontm) { const basename = getDVBasename(frontm.file); + // @ts-ignore if (frontm[BC_FOLDER_NOTE] === true) { const msg = `CONSOLE LOGGED: ${basename} is using a deprecated folder-note value. Instead of 'true', it now takes in the fieldName you want to use.`; new require$$0.Notice(msg); loglevel.warn(msg); } + // @ts-ignore if (frontm[BC_LINK_NOTE] === true) { const msg = `CONSOLE LOGGED: ${basename} is using a deprecated link-note value. Instead of 'true', it now takes in the fieldName you want to use.`; new require$$0.Notice(msg); diff --git a/src/graphUtils.ts b/src/graphUtils.ts index e6f903fb..ab750501 100644 --- a/src/graphUtils.ts +++ b/src/graphUtils.ts @@ -132,9 +132,9 @@ export const getSinks = (g: MultiGraph) => export const getSources = (g: MultiGraph) => g.filterNodes((node) => g.hasNode(node) && !g.inDegree(node)); -export const getOutNeighbours = (g: MultiGraph, node: string): string[] => +export const getOutNeighbours = (g: MultiGraph, node: string) => g.hasNode(node) ? g.outNeighbors(node) : []; -export const getInNeighbours = (g: MultiGraph, node: string): string[] => +export const getInNeighbours = (g: MultiGraph, node: string) => g.hasNode(node) ? g.inNeighbors(node) : []; export const getOppDir = (dir: Directions): Directions => { diff --git a/src/main.ts b/src/main.ts index 6112a0fa..9a83b922 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,7 +12,6 @@ import { Plugin, Pos, TFile, - WorkspaceLeaf, } from "obsidian"; import { addFeatherIcon, @@ -21,10 +20,6 @@ import { wait, waitForResolvedLinks, } from "obsidian-community-lib/dist/utils"; -import StatsView from "./StatsView"; -import DownView from "./DownView"; -import DucksView from "./DucksView"; -import MatrixView from "./MatrixView"; import { Debugger } from "src/Debugger"; import util from "util"; import { BCSettingTab } from "./BreadcrumbsSettingTab"; @@ -52,6 +47,8 @@ import { TRAIL_ICON, TRAIL_ICON_SVG, } from "./constants"; +import DownView from "./DownView"; +import DucksView from "./DucksView"; import { FieldSuggestor } from "./FieldSuggestor"; import { addEdgeIfNot, @@ -65,6 +62,7 @@ import { getSubForFields, getSubInDirs, } from "./graphUtils"; +import { HierarchyNoteSelectorModal } from "./HierNoteModal"; import type { BCSettings, Directions, @@ -76,6 +74,7 @@ import type { RawValue, ViewInfo, } from "./interfaces"; +import MatrixView from "./MatrixView"; import { createOrUpdateYaml, dropWikilinks, @@ -88,8 +87,8 @@ import { makeWiki, splitAtYaml, } from "./sharedFunctions"; +import StatsView from "./StatsView"; import { VisModal } from "./VisModal"; -import { HierarchyNoteSelectorModal } from "./HierNoteModal"; export default class BCPlugin extends Plugin { settings: BCSettings; @@ -366,6 +365,37 @@ export default class BCPlugin extends Plugin { }, }); + ["up", "down", "next", "prev"].forEach((dir) => { + this.addCommand({ + id: `jump-to-first-${dir}`, + name: `Jump to first '${dir}'`, + callback: async () => { + const file = this.app.workspace.getActiveFile(); + if (!file) { + new Notice("You need to be focussed on a Markdown file"); + return; + } + const { basename } = file; + const realsNImplieds = getRealnImplied( + this, + basename, + dir as Directions + )[dir]; + const allBCs = [...realsNImplieds.reals, ...realsNImplieds.implieds]; + if (allBCs.length === 0) { + new Notice(`No ${dir} found`); + return; + } + + const toFile = this.app.metadataCache.getFirstLinkpathDest( + allBCs[0].to, + "" + ); + this.app.workspace.activeLeaf.openFile(toFile); + }, + }); + }); + this.addRibbonIcon( addFeatherIcon("tv") as string, "Breadcrumbs Visualisation", @@ -581,7 +611,6 @@ export default class BCPlugin extends Plugin { field: string ) { CSVRows.forEach((row) => { - addNodesIfNot(g, [row.file]); if (field === "" || !row[field]) return; @@ -1077,11 +1106,13 @@ export default class BCPlugin extends Plugin { function noticeIfBroken(frontm: dvFrontmatterCache): void { const basename = getDVBasename(frontm.file); + // @ts-ignore if (frontm[BC_FOLDER_NOTE] === true) { const msg = `CONSOLE LOGGED: ${basename} is using a deprecated folder-note value. Instead of 'true', it now takes in the fieldName you want to use.`; new Notice(msg); warn(msg); } + // @ts-ignore if (frontm[BC_LINK_NOTE] === true) { const msg = `CONSOLE LOGGED: ${basename} is using a deprecated link-note value. Instead of 'true', it now takes in the fieldName you want to use.`; new Notice(msg);