Loading...
;
-
+
return (
{data.map(({ userSimulation, simulation, policy, household, userPolicy }) => (
@@ -84,17 +87,10 @@ import { useUserSimulationById } from '@/hooks/useUserSimulations';
const SimulationDetail = ({ simulationId }) => {
const userId = 'current-user-id';
-
- const {
- simulation,
- policy,
- household,
- userPolicy,
- userHousehold,
- isLoading,
- error,
- } = useUserSimulationById(userId, simulationId);
-
+
+ const { simulation, policy, household, userPolicy, userHousehold, isLoading, error } =
+ useUserSimulationById(userId, simulationId);
+
// All related data is fetched and normalized
};
```
@@ -107,36 +103,39 @@ graph TD
B --> B1[UserSimulation]
B --> B2[UserPolicy]
B --> B3[UserHousehold]
-
+
B1 --> C[Extract Simulation IDs]
C --> D[Fetch Simulations - Parallel]
D --> E[Extract Policy & Household IDs]
-
+
E --> F[Fetch Policies - Parallel]
E --> G[Fetch Households - Parallel]
-
+
F --> H[@normy/react-query Normalization]
G --> H
D --> H
-
+
H --> I[Enhanced Results with Full Context]
```
## Benefits
### 1. Performance
+
- **Cache First**: Always checks cache before fetching
- **Parallel Fetching**: Uses `useQueries` for parallel API calls
- **Deduplication**: Same objects are never fetched twice
- **Automatic Sharing**: Data is shared across all components
### 2. Developer Experience
+
- **Type Safety**: Full TypeScript support
- **Clean Code**: Follows DRY, CLEAN, SOLID principles
- **Reusable Utilities**: Leverages existing adapters and utilities
- **Helper Functions**: Provides convenient data access methods
### 3. Data Consistency
+
- **Automatic Updates**: Mutations update all references
- **Single Source of Truth**: Normalized cache ensures consistency
- **Relationship Integrity**: Maintains proper entity relationships
@@ -145,18 +144,18 @@ graph TD
The hook returns an object with:
-| Property | Type | Description |
-|----------|------|-------------|
-| `data` | `EnhancedUserSimulation[]` | Array of simulations with full context |
-| `isLoading` | `boolean` | Combined loading state |
-| `error` | `Error \| null` | Combined error state |
-| `associations` | `object` | Raw association data for simulations, policies, households |
-| `getSimulationWithFullContext` | `function` | Get a specific simulation by ID |
-| `getSimulationsByPolicy` | `function` | Filter simulations by policy ID |
-| `getSimulationsByHousehold` | `function` | Filter simulations by household ID |
-| `getNormalizedSimulation` | `function` | Direct access to normalized simulation |
-| `getNormalizedPolicy` | `function` | Direct access to normalized policy |
-| `getNormalizedHousehold` | `function` | Direct access to normalized household |
+| Property | Type | Description |
+| ------------------------------ | -------------------------- | ---------------------------------------------------------- |
+| `data` | `EnhancedUserSimulation[]` | Array of simulations with full context |
+| `isLoading` | `boolean` | Combined loading state |
+| `error` | `Error \| null` | Combined error state |
+| `associations` | `object` | Raw association data for simulations, policies, households |
+| `getSimulationWithFullContext` | `function` | Get a specific simulation by ID |
+| `getSimulationsByPolicy` | `function` | Filter simulations by policy ID |
+| `getSimulationsByHousehold` | `function` | Filter simulations by household ID |
+| `getNormalizedSimulation` | `function` | Direct access to normalized simulation |
+| `getNormalizedPolicy` | `function` | Direct access to normalized policy |
+| `getNormalizedHousehold` | `function` | Direct access to normalized household |
## Enhanced User Simulation Type
@@ -165,15 +164,15 @@ interface EnhancedUserSimulation {
// Core associations
userSimulation: UserSimulation;
simulation?: Simulation;
-
+
// Related entities
policy?: Policy;
household?: HouseholdMetadata;
-
+
// User associations for related entities
userPolicy?: UserPolicy;
userHousehold?: any;
-
+
// Status
isLoading: boolean;
error: Error | null;
@@ -183,17 +182,20 @@ interface EnhancedUserSimulation {
## Implementation Details
### Cache Strategy
+
1. Check normalized cache via `queryNormalizer.getObjectById()`
2. Check React Query cache via `queryClient.getQueryData()`
3. Fetch from API if not cached
4. Normalize and store in both caches
### Parallel Fetching
+
- Uses `useParallelQueries` utility for batch operations
- Fetches all simulations, policies, and households in parallel
- Minimizes waterfall requests
### Error Handling
+
- Combines errors from all queries
- Provides granular error information per entity
- Gracefully handles partial failures
@@ -217,7 +219,7 @@ import { useSimulationAssociationsByUser } from '@/hooks/useUserSimulationAssoci
const SimulationCount = () => {
const userId = 'current-user-id';
const { data: associations, isLoading } = useSimulationAssociationsByUser(userId);
-
+
return
You have {associations?.length || 0} simulations
;
};
```
@@ -259,4 +261,4 @@ const SimulationPage = () => {
## Example: Complete Implementation
-See `/app/src/hooks/examples/useEnhancedSimulationsExample.tsx` for complete implementation examples of both hooks.
\ No newline at end of file
+See `/app/src/hooks/examples/useEnhancedSimulationsExample.tsx` for complete implementation examples of both hooks.
diff --git a/app/index.html b/app/index.html
index 7986c00a6..c4ff4345a 100644
--- a/app/index.html
+++ b/app/index.html
@@ -1,4 +1,4 @@
-
+
@@ -8,12 +8,21 @@
content="minimum-scale=1, initial-scale=1, width=device-width, user-scalable=no"
/>
PolicyEngine
-
+
-
-
+
+
@@ -22,8 +31,14 @@
-
-
+
+
diff --git a/app/package-lock.json b/app/package-lock.json
index 7eca8daf0..11580d49d 100644
--- a/app/package-lock.json
+++ b/app/package-lock.json
@@ -147,7 +147,6 @@
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.27.1",
@@ -433,6 +432,7 @@
"resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz",
"integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"commander": "^2.15.1"
},
@@ -552,7 +552,6 @@
}
],
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=18"
},
@@ -576,7 +575,6 @@
}
],
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=18"
}
@@ -662,7 +660,6 @@
"integrity": "sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==",
"dev": true,
"license": "MPL-2.0",
- "peer": true,
"dependencies": {
"@edge-runtime/primitives": "4.1.0"
},
@@ -1222,7 +1219,6 @@
"integrity": "sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
@@ -1507,6 +1503,7 @@
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.10.tgz",
"integrity": "sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25"
@@ -1543,7 +1540,6 @@
"resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.1.2.tgz",
"integrity": "sha512-+maX0a1+fxh6Lvnzi0qb0AZsCnnHlIiTE/hFC+dd3eRfUW2PEKJ5/wTpmrX8IGyxa+NS+fXjZD/cU4Yt9xNjdg==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@floating-ui/react": "^0.26.28",
"clsx": "^2.1.1",
@@ -1579,7 +1575,6 @@
"resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.1.2.tgz",
"integrity": "sha512-BrriTsiazqZ2fLuL7UDasNTQJSaoJ7mN2qYVkdsiYI158lxJdUaFWHhd6BDyzK+W6thvBx2D+R/hh1rsWWefdQ==",
"license": "MIT",
- "peer": true,
"peerDependencies": {
"react": "^18.x || ^19.x"
}
@@ -1589,6 +1584,7 @@
"resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz",
"integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"get-stream": "^6.0.1",
"minimist": "^1.2.6"
@@ -1601,12 +1597,14 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz",
"integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/@mapbox/jsonlint-lines-primitives": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
"integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==",
+ "peer": true,
"engines": {
"node": ">= 0.6"
}
@@ -1616,6 +1614,7 @@
"resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz",
"integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==",
"license": "BSD-3-Clause",
+ "peer": true,
"peerDependencies": {
"mapbox-gl": ">=0.32.1 <2.0.0"
}
@@ -1646,25 +1645,29 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
"integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/@mapbox/tiny-sdf": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz",
"integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==",
- "license": "BSD-2-Clause"
+ "license": "BSD-2-Clause",
+ "peer": true
},
"node_modules/@mapbox/unitbezier": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz",
"integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==",
- "license": "BSD-2-Clause"
+ "license": "BSD-2-Clause",
+ "peer": true
},
"node_modules/@mapbox/vector-tile": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz",
"integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"@mapbox/point-geometry": "~0.1.0"
}
@@ -1674,6 +1677,7 @@
"resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz",
"integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==",
"license": "ISC",
+ "peer": true,
"engines": {
"node": ">=6.0.0"
}
@@ -1683,6 +1687,7 @@
"resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-20.4.0.tgz",
"integrity": "sha512-AzBy3095fTFPjDjmWpR2w6HVRAZJ6hQZUCwk5Plz6EyfnfuQW1odeW5i2Ai47Y6TBA2hQnC+azscjBSALpaWgw==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@mapbox/jsonlint-lines-primitives": "~2.0.2",
"@mapbox/unitbezier": "^0.0.1",
@@ -1702,13 +1707,15 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz",
"integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==",
- "license": "BSD-2-Clause"
+ "license": "BSD-2-Clause",
+ "peer": true
},
"node_modules/@maplibre/maplibre-gl-style-spec/node_modules/tinyqueue": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz",
"integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
@@ -1797,13 +1804,15 @@
"version": "3.8.2",
"resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.2.tgz",
"integrity": "sha512-wvsNmh1GYjyJfyEBPKJLTMzgf2c2bEbSIL50lmqVUi+o1NHaLPi1Lb4v7VxXXJn043BhNyrxUrWI85Q+zmjOVA==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/@plotly/d3-sankey": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz",
"integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"d3-array": "1",
"d3-collection": "1",
@@ -1815,6 +1824,7 @@
"resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz",
"integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"d3-array": "^1.2.1",
"d3-collection": "^1.0.4",
@@ -1827,6 +1837,7 @@
"resolved": "https://registry.npmjs.org/@plotly/mapbox-gl/-/mapbox-gl-1.13.4.tgz",
"integrity": "sha512-sR3/Pe5LqT/fhYgp4rT4aSFf1rTsxMbGiH6Hojc7PH36ny5Bn17iVFUjpzycafETURuFbLZUfjODO8LvSI+5zQ==",
"license": "SEE LICENSE IN LICENSE.txt",
+ "peer": true,
"dependencies": {
"@mapbox/geojson-rewind": "^0.5.2",
"@mapbox/geojson-types": "^1.0.2",
@@ -1860,6 +1871,7 @@
"resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz",
"integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"array-bounds": "^1.0.1",
"binary-search-bounds": "^2.0.4",
@@ -2502,7 +2514,6 @@
"resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.83.1.tgz",
"integrity": "sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==",
"license": "MIT",
- "peer": true,
"funding": {
"type": "github",
"url": "https://github.com/sponsors/tannerlinsley"
@@ -2523,7 +2534,6 @@
"resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.84.1.tgz",
"integrity": "sha512-zo7EUygcWJMQfFNWDSG7CBhy8irje/XY0RDVKKV4IQJAysb+ZJkkJPcnQi+KboyGUgT+SQebRFoTqLuTtfoDLw==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@tanstack/query-core": "5.83.1"
},
@@ -2558,7 +2568,6 @@
"integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@babel/code-frame": "^7.10.4",
"@babel/runtime": "^7.12.5",
@@ -2703,6 +2712,7 @@
"resolved": "https://registry.npmjs.org/@turf/area/-/area-7.2.0.tgz",
"integrity": "sha512-zuTTdQ4eoTI9nSSjerIy4QwgvxqwJVciQJ8tOPuMHbXJ9N/dNjI7bU8tasjhxas/Cx3NE9NxVHtNpYHL0FSzoA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@turf/helpers": "^7.2.0",
"@turf/meta": "^7.2.0",
@@ -2718,6 +2728,7 @@
"resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.2.0.tgz",
"integrity": "sha512-wzHEjCXlYZiDludDbXkpBSmv8Zu6tPGLmJ1sXQ6qDwpLE1Ew3mcWqt8AaxfTP5QwDNQa3sf2vvgTEzNbPQkCiA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@turf/helpers": "^7.2.0",
"@turf/meta": "^7.2.0",
@@ -2733,6 +2744,7 @@
"resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-7.2.0.tgz",
"integrity": "sha512-yJqDSw25T7P48au5KjvYqbDVZ7qVnipziVfZ9aSo7P2/jTE7d4BP21w0/XLi3T/9bry/t9PR1GDDDQljN4KfDw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@turf/helpers": "^7.2.0",
"@turf/meta": "^7.2.0",
@@ -2748,6 +2760,7 @@
"resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.2.0.tgz",
"integrity": "sha512-cXo7bKNZoa7aC7ydLmUR02oB3IgDe7MxiPuRz3cCtYQHn+BJ6h1tihmamYDWWUlPHgSNF0i3ATc4WmDECZafKw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/geojson": "^7946.0.10",
"tslib": "^2.8.1"
@@ -2761,6 +2774,7 @@
"resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.2.0.tgz",
"integrity": "sha512-igzTdHsQc8TV1RhPuOLVo74Px/hyPrVgVOTgjWQZzt3J9BVseCdpfY/0cJBdlSRI4S/yTmmHl7gAqjhpYH5Yaw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@turf/helpers": "^7.2.0",
"@types/geojson": "^7946.0.10"
@@ -2859,6 +2873,7 @@
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
@@ -2869,6 +2884,7 @@
"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
"integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/eslint": "*",
"@types/estree": "*"
@@ -2893,13 +2909,15 @@
"version": "7946.0.16",
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz",
"integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/geojson-vt": {
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/@types/geojson-vt/-/geojson-vt-3.2.5.tgz",
"integrity": "sha512-qDO7wqtprzlpe8FfQ//ClPV9xiuoh2nkIgiouIptON9w5jvD/fA4szvP9GBlDVdJ5dldAl0kX/sy3URbWwLx0g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/geojson": "*"
}
@@ -2936,19 +2954,22 @@
"version": "3.0.8",
"resolved": "https://registry.npmjs.org/@types/less/-/less-3.0.8.tgz",
"integrity": "sha512-Gjm4+H9noDJgu5EdT3rUw5MhPBag46fiOy27BefvWkNL8mlZnKnCaVVVTLKj6RYXed9b62CPKnPav9govyQDzA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/mapbox__point-geometry": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/@types/mapbox__point-geometry/-/mapbox__point-geometry-0.1.4.tgz",
"integrity": "sha512-mUWlSxAmYLfwnRBmgYV86tgYmMIICX4kza8YnE/eIlywGe2XoOxlpVnXWwir92xRLjwyarqwpu2EJKD2pk0IUA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/mapbox__vector-tile": {
"version": "1.3.4",
"resolved": "https://registry.npmjs.org/@types/mapbox__vector-tile/-/mapbox__vector-tile-1.3.4.tgz",
"integrity": "sha512-bpd8dRn9pr6xKvuEBQup8pwQfD4VUyqO/2deGjfpe6AwC8YRlyEipvefyRJUSiCJTZuCb8Pl1ciVV5ekqJ96Bg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/geojson": "*",
"@types/mapbox__point-geometry": "*",
@@ -2975,7 +2996,6 @@
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.16.0.tgz",
"integrity": "sha512-B2egV9wALML1JCpv3VQoQ+yesQKAmNMBIAY7OteVrikcOcAkWm+dGL6qpeCktPjAv6N1JLnhbNiqS35UpFyBsQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
"undici-types": "~6.21.0"
}
@@ -2984,7 +3004,8 @@
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz",
"integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@types/plotly.js": {
"version": "3.0.2",
@@ -2998,7 +3019,6 @@
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz",
"integrity": "sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==",
"license": "MIT",
- "peer": true,
"dependencies": {
"csstype": "^3.0.2"
}
@@ -3009,7 +3029,6 @@
"integrity": "sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==",
"dev": true,
"license": "MIT",
- "peer": true,
"peerDependencies": {
"@types/react": "^19.0.0"
}
@@ -3047,6 +3066,7 @@
"resolved": "https://registry.npmjs.org/@types/sass/-/sass-1.43.1.tgz",
"integrity": "sha512-BPdoIt1lfJ6B7rw35ncdwBZrAssjcwzI5LByIrYs+tpXlj/CAkuVdRsgZDdP4lq5EjyWzwxZCqAoFyHKFwp32g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/node": "*"
}
@@ -3056,6 +3076,7 @@
"resolved": "https://registry.npmjs.org/@types/stylus/-/stylus-0.48.43.tgz",
"integrity": "sha512-72dv/zdhuyXWVHUXG2VTPEQdOG+oen95/DNFx2aMFFaY6LoITI6PwEqf5x31JF49kp2w9hvUzkNfTGBIeg61LQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/node": "*"
}
@@ -3065,6 +3086,7 @@
"resolved": "https://registry.npmjs.org/@types/supercluster/-/supercluster-7.1.3.tgz",
"integrity": "sha512-Z0pOY34GDFl3Q6hUFYf3HkTwKEE02e7QgtJppBt+beEAxnyOpJua+voGFvxINBHa06GwLFFym7gRPY2SiKIfIA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/geojson": "*"
}
@@ -3134,7 +3156,6 @@
"integrity": "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@typescript-eslint/scope-manager": "8.36.0",
"@typescript-eslint/types": "8.36.0",
@@ -3686,6 +3707,7 @@
"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
"integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/helper-numbers": "1.13.2",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2"
@@ -3695,25 +3717,29 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
"integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@webassemblyjs/helper-api-error": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
"integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@webassemblyjs/helper-buffer": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
"integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@webassemblyjs/helper-numbers": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
"integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/floating-point-hex-parser": "1.13.2",
"@webassemblyjs/helper-api-error": "1.13.2",
@@ -3724,13 +3750,15 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
"integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@webassemblyjs/helper-wasm-section": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
"integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
@@ -3743,6 +3771,7 @@
"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
"integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@xtuc/ieee754": "^1.2.0"
}
@@ -3752,6 +3781,7 @@
"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
"integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
"license": "Apache-2.0",
+ "peer": true,
"dependencies": {
"@xtuc/long": "4.2.2"
}
@@ -3760,13 +3790,15 @@
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
"integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/@webassemblyjs/wasm-edit": {
"version": "1.14.1",
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
"integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
@@ -3783,6 +3815,7 @@
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
"integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-wasm-bytecode": "1.13.2",
@@ -3796,6 +3829,7 @@
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
"integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-buffer": "1.14.1",
@@ -3808,6 +3842,7 @@
"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
"integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@webassemblyjs/helper-api-error": "1.13.2",
@@ -3822,6 +3857,7 @@
"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
"integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@webassemblyjs/ast": "1.14.1",
"@xtuc/long": "4.2.2"
@@ -3831,13 +3867,15 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
"integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/@xtuc/long": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "license": "Apache-2.0"
+ "license": "Apache-2.0",
+ "peer": true
},
"node_modules/abbrev": {
"version": "3.0.1",
@@ -3853,14 +3891,14 @@
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz",
"integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/acorn": {
"version": "8.15.0",
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
"license": "MIT",
- "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -3883,6 +3921,7 @@
"resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz",
"integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10.13.0"
},
@@ -3945,6 +3984,7 @@
"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"ajv": "^8.0.0"
},
@@ -3962,6 +4002,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
@@ -3977,7 +4018,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/ansi-regex": {
"version": "5.0.1",
@@ -4031,7 +4073,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz",
"integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/array-buffer-byte-length": {
"version": "1.0.2",
@@ -4055,6 +4098,7 @@
"resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
"integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -4087,6 +4131,7 @@
"resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz",
"integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"array-bounds": "^1.0.0"
}
@@ -4095,13 +4140,15 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz",
"integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/array-rearrange": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz",
"integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/array-union": {
"version": "2.1.0",
@@ -4335,6 +4382,7 @@
"resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
"integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">= 0.6.0"
}
@@ -4377,7 +4425,8 @@
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz",
"integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/bindings": {
"version": "1.5.0",
@@ -4393,19 +4442,22 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz",
"integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/bitmap-sdf": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz",
"integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/bl": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
"integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
@@ -4460,7 +4512,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"caniuse-lite": "^1.0.30001726",
"electron-to-chromium": "^1.5.173",
@@ -4503,7 +4554,8 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/cac": {
"version": "6.7.14",
@@ -4631,6 +4683,7 @@
"resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz",
"integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"element-size": "^1.1.1"
}
@@ -4744,6 +4797,7 @@
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
"integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=6.0"
}
@@ -4759,7 +4813,8 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz",
"integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/clsx": {
"version": "2.1.1",
@@ -4782,6 +4837,7 @@
"resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz",
"integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-parse": "^1.3.8"
}
@@ -4791,6 +4847,7 @@
"resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz",
"integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-name": "^1.0.0"
}
@@ -4812,6 +4869,7 @@
"resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz",
"integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"clamp": "^1.0.1"
}
@@ -4827,6 +4885,7 @@
"resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz",
"integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"clamp": "^1.0.1",
"color-rgba": "^2.1.1",
@@ -4838,6 +4897,7 @@
"resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz",
"integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-name": "^1.0.0"
}
@@ -4847,6 +4907,7 @@
"resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz",
"integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-parse": "^1.4.2",
"color-space": "^2.0.0"
@@ -4857,6 +4918,7 @@
"resolved": "https://registry.npmjs.org/color-parse/-/color-parse-2.0.0.tgz",
"integrity": "sha512-g2Z+QnWsdHLppAbrpcFWo629kLOnOPtpxYV69GCqm92gqSgyXbzlfyN3MXs0412fPBkFmiuS+rXposgBgBa6Kg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-name": "^1.0.0"
}
@@ -4866,6 +4928,7 @@
"resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-3.0.0.tgz",
"integrity": "sha512-PPwZYkEY3M2THEHHV6Y95sGUie77S7X8v+h1r6LSAPF3/LL2xJ8duUXSrkic31Nzc4odPwHgUbiX/XuTYzQHQg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-parse": "^2.0.0",
"color-space": "^2.0.0"
@@ -4875,7 +4938,8 @@
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/color-space/-/color-space-2.3.2.tgz",
"integrity": "sha512-BcKnbOEsOarCwyoLstcoEztwT0IJxqqQkNwDuA3a65sICvvHL2yoeV13psoDFh5IuiOMnIOKdQDwB4Mk3BypiA==",
- "license": "Unlicense"
+ "license": "Unlicense",
+ "peer": true
},
"node_modules/colord": {
"version": "2.9.3",
@@ -4898,7 +4962,8 @@
"version": "2.20.3",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/concat-map": {
"version": "0.0.1",
@@ -4915,6 +4980,7 @@
"node >= 0.8"
],
"license": "MIT",
+ "peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
@@ -4962,7 +5028,8 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
"integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/cosmiconfig": {
"version": "9.0.0",
@@ -4995,7 +5062,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz",
"integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/create-require": {
"version": "1.1.1",
@@ -5023,6 +5091,7 @@
"resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz",
"integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"css-font-size-keywords": "^1.0.0",
"css-font-stretch-keywords": "^1.0.1",
@@ -5039,25 +5108,29 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz",
"integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/css-font-stretch-keywords": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz",
"integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/css-font-style-keywords": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz",
"integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/css-font-weight-keywords": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz",
"integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/css-functions-list": {
"version": "3.2.3",
@@ -5073,13 +5146,15 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz",
"integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/css-loader": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz",
"integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"icss-utils": "^5.1.0",
"postcss": "^8.4.33",
@@ -5114,7 +5189,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz",
"integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/css-tree": {
"version": "3.1.0",
@@ -5141,7 +5217,8 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
"integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/cssesc": {
"version": "3.0.0",
@@ -5180,6 +5257,7 @@
"resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz",
"integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"es5-ext": "^0.10.64",
"type": "^2.7.2"
@@ -5192,19 +5270,22 @@
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
"integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-collection": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
"integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-color": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz",
"integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==",
"license": "ISC",
+ "peer": true,
"engines": {
"node": ">=12"
}
@@ -5213,13 +5294,15 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz",
"integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-force": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz",
"integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"d3-collection": "1",
"d3-dispatch": "1",
@@ -5231,13 +5314,15 @@
"version": "1.4.5",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz",
"integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-geo": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz",
"integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"d3-array": "1"
}
@@ -5247,6 +5332,7 @@
"resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz",
"integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"commander": "2",
"d3-array": "1",
@@ -5265,13 +5351,15 @@
"version": "1.1.9",
"resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz",
"integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-interpolate": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz",
"integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"d3-color": "1 - 3"
},
@@ -5283,19 +5371,22 @@
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
"integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-quadtree": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz",
"integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-shape": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
"integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"d3-path": "1"
}
@@ -5304,13 +5395,15 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
"integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/d3-time-format": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz",
"integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"d3-time": "1"
}
@@ -5319,7 +5412,8 @@
"version": "1.0.10",
"resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz",
"integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/damerau-levenshtein": {
"version": "1.0.8",
@@ -5400,8 +5494,7 @@
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
"integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/debug": {
"version": "4.4.1",
@@ -5517,6 +5610,7 @@
"resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz",
"integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==",
"license": "MIT",
+ "peer": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -5534,7 +5628,8 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz",
"integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/detect-libc": {
"version": "2.1.2",
@@ -5613,6 +5708,7 @@
"resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz",
"integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"abs-svg-path": "~0.1.1",
"normalize-svg-path": "~0.1.0"
@@ -5623,6 +5719,7 @@
"resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz",
"integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">= 0.8.0"
}
@@ -5646,13 +5743,15 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz",
"integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/duplexify": {
"version": "3.7.1",
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz",
"integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"end-of-stream": "^1.0.0",
"inherits": "^2.0.1",
@@ -5664,7 +5763,8 @@
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz",
"integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
@@ -5736,13 +5836,15 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz",
"integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/elementary-circuits-directed-graph": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz",
"integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"strongly-connected-components": "^1.0.1"
}
@@ -5758,6 +5860,7 @@
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
"integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"once": "^1.4.0"
}
@@ -5767,6 +5870,7 @@
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz",
"integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"graceful-fs": "^4.2.4",
"tapable": "^2.2.0"
@@ -5996,6 +6100,7 @@
"integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==",
"hasInstallScript": true,
"license": "ISC",
+ "peer": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
@@ -6011,6 +6116,7 @@
"resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
@@ -6022,6 +6128,7 @@
"resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz",
"integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"d": "^1.0.2",
"ext": "^1.7.0"
@@ -6035,6 +6142,7 @@
"resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
"integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"d": "1",
"es5-ext": "^0.10.46",
@@ -6049,7 +6157,6 @@
"dev": true,
"hasInstallScript": true,
"license": "MIT",
- "peer": true,
"bin": {
"esbuild": "bin/esbuild"
},
@@ -6375,6 +6482,7 @@
"resolved": "https://registry.npmjs.org/esbuild-style-plugin/-/esbuild-style-plugin-1.6.3.tgz",
"integrity": "sha512-XPEKf4FjLjEVLv/dJH4UxDzXCrFHYpD93DBO8B+izdZARW5b7nNKQbnKv3J+7VDWJbgCU+hzfgIh2AuIZzlmXQ==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@types/less": "^3.0.3",
"@types/sass": "^1.43.1",
@@ -6479,6 +6587,7 @@
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
"integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"esprima": "^4.0.1",
"estraverse": "^5.2.0",
@@ -6501,7 +6610,6 @@
"integrity": "sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.12.1",
@@ -6577,7 +6685,6 @@
"integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"aria-query": "^5.3.2",
"array-includes": "^3.1.8",
@@ -6618,7 +6725,6 @@
"integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"array-includes": "^3.1.8",
"array.prototype.findlast": "^1.2.5",
@@ -6709,6 +6815,7 @@
"resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz",
"integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"d": "^1.0.1",
"es5-ext": "^0.10.62",
@@ -6825,6 +6932,7 @@
"resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"d": "1",
"es5-ext": "~0.10.14"
@@ -6835,6 +6943,7 @@
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.8.x"
}
@@ -6854,6 +6963,7 @@
"resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"type": "^2.7.2"
}
@@ -6869,6 +6979,7 @@
"resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
"integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"acorn": "^7.1.1",
"isarray": "^2.0.1"
@@ -6882,6 +6993,7 @@
"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
"license": "MIT",
+ "peer": true,
"bin": {
"acorn": "bin/acorn"
},
@@ -6930,6 +7042,7 @@
"resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz",
"integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"is-string-blank": "^1.0.1"
}
@@ -7088,6 +7201,7 @@
"resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz",
"integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"dtype": "^2.0.0"
}
@@ -7097,6 +7211,7 @@
"resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz",
"integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"css-font": "^1.0.0"
}
@@ -7106,6 +7221,7 @@
"resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz",
"integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"css-font": "^1.2.0"
}
@@ -7182,6 +7298,7 @@
"resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz",
"integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"inherits": "^2.0.1",
"readable-stream": "^2.0.0"
@@ -7256,6 +7373,7 @@
"resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz",
"integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"loader-utils": "^3.2.0"
}
@@ -7274,13 +7392,15 @@
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz",
"integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/get-canvas-context": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz",
"integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
@@ -7335,6 +7455,7 @@
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -7364,19 +7485,22 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz",
"integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==",
- "license": "Zlib"
+ "license": "Zlib",
+ "peer": true
},
"node_modules/gl-matrix": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
"integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/gl-text": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.4.0.tgz",
"integrity": "sha512-o47+XBqLCj1efmuNyCHt7/UEJmB9l66ql7pnobD6p+sgmBUdzfMZXIF0zD2+KRfpd99DJN+QXdvTFAGCKCVSmQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"bit-twiddle": "^1.0.2",
"color-normalize": "^1.5.0",
@@ -7402,6 +7526,7 @@
"resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz",
"integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"is-browser": "^2.0.1",
"is-firefox": "^1.0.3",
@@ -7449,7 +7574,8 @@
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "license": "BSD-2-Clause"
+ "license": "BSD-2-Clause",
+ "peer": true
},
"node_modules/glob/node_modules/brace-expansion": {
"version": "2.0.2",
@@ -7586,6 +7712,7 @@
"resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz",
"integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"glsl-token-inject-block": "^1.0.0",
"glsl-token-string": "^1.0.1",
@@ -7597,6 +7724,7 @@
"resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz",
"integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"resolve": "^0.6.1",
"xtend": "^2.1.2"
@@ -7606,12 +7734,14 @@
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz",
"integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-resolve/node_modules/xtend": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz",
"integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==",
+ "peer": true,
"engines": {
"node": ">=0.4"
}
@@ -7620,13 +7750,15 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz",
"integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-token-defines": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz",
"integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"glsl-tokenizer": "^2.0.0"
}
@@ -7635,13 +7767,15 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz",
"integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-token-descope": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz",
"integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"glsl-token-assignments": "^2.0.0",
"glsl-token-depth": "^1.1.0",
@@ -7653,37 +7787,43 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz",
"integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-token-properties": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz",
"integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-token-scope": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz",
"integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-token-string": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz",
"integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-token-whitespace-trim": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz",
"integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-tokenizer": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz",
"integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"through2": "^0.6.3"
}
@@ -7692,13 +7832,15 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-tokenizer/node_modules/readable-stream": {
"version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
@@ -7710,13 +7852,15 @@
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
"integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/glsl-tokenizer/node_modules/through2": {
"version": "0.6.5",
"resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
"integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"readable-stream": ">=1.0.33-1 <1.1.0-0",
"xtend": ">=4.0.0 <4.1.0-0"
@@ -7727,6 +7871,7 @@
"resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz",
"integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"bl": "^2.2.1",
"concat-stream": "^1.5.2",
@@ -7753,6 +7898,7 @@
"resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz",
"integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"glsl-inject-defines": "^1.0.1",
"glsl-token-defines": "^1.0.0",
@@ -7771,6 +7917,7 @@
"resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz",
"integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"@choojs/findup": "^0.2.0",
"events": "^3.2.0",
@@ -7812,7 +7959,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz",
"integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/harmony-reflect": {
"version": "1.6.2",
@@ -7848,6 +7996,7 @@
"resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz",
"integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"is-browser": "^2.0.1"
}
@@ -7857,6 +8006,7 @@
"resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz",
"integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"is-browser": "^2.0.1"
}
@@ -8372,6 +8522,7 @@
"resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
"integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
"license": "ISC",
+ "peer": true,
"engines": {
"node": "^10 || ^12 || >= 14"
},
@@ -8626,7 +8777,8 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz",
"integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/is-callable": {
"version": "1.2.7",
@@ -8748,6 +8900,7 @@
"resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
"integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
},
@@ -8760,6 +8913,7 @@
"resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz",
"integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -8820,6 +8974,7 @@
"resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz",
"integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -8841,7 +8996,8 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz",
"integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/is-negative-zero": {
"version": "2.0.3",
@@ -8888,6 +9044,7 @@
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
"integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -8897,6 +9054,7 @@
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
"integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -8987,13 +9145,15 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz",
"integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/is-svg-path": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz",
"integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/is-symbol": {
"version": "1.1.1",
@@ -9138,6 +9298,7 @@
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
"integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/node": "*",
"merge-stream": "^2.0.0",
@@ -9152,6 +9313,7 @@
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -9197,7 +9359,6 @@
"integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"cssstyle": "^4.2.1",
"data-urls": "^5.0.0",
@@ -9287,7 +9448,8 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz",
"integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/json5": {
"version": "2.2.3",
@@ -9370,7 +9532,8 @@
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz",
"integrity": "sha512-WbCVYJ27Sz8zi9Q7Q0xHC+05iwkm3Znipc2XTlrnJbsHMYktW4hPhXUE8Ys1engBrvffoSCqbil1JQAa7clRpA==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/keyv": {
"version": "4.5.4",
@@ -9444,6 +9607,7 @@
"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
"integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=6.11.5"
}
@@ -9453,6 +9617,7 @@
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz",
"integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">= 12.13.0"
}
@@ -9484,7 +9649,8 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/lodash.merge": {
"version": "4.6.2",
@@ -9584,6 +9750,7 @@
"resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz",
"integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"once": "~1.3.0"
}
@@ -9593,6 +9760,7 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
"integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"wrappy": "1"
}
@@ -9643,6 +9811,7 @@
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-4.7.1.tgz",
"integrity": "sha512-lgL7XpIwsgICiL82ITplfS7IGwrB1OJIw/pCvprDp2dhmSSEBgmPzYRvwYYYvJGJD7fxUv1Tvpih4nZ6VrLuaA==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"@mapbox/geojson-rewind": "^0.5.2",
"@mapbox/jsonlint-lines-primitives": "^2.0.2",
@@ -9683,31 +9852,36 @@
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz",
"integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==",
- "license": "BSD-2-Clause"
+ "license": "BSD-2-Clause",
+ "peer": true
},
"node_modules/maplibre-gl/node_modules/@mapbox/unitbezier": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.1.tgz",
"integrity": "sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==",
- "license": "BSD-2-Clause"
+ "license": "BSD-2-Clause",
+ "peer": true
},
"node_modules/maplibre-gl/node_modules/earcut": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/earcut/-/earcut-3.0.1.tgz",
"integrity": "sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/maplibre-gl/node_modules/geojson-vt": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-4.0.2.tgz",
"integrity": "sha512-AV9ROqlNqoZEIJGfm1ncNjEXfkz2hdFlZf0qkVfmkwdKa8vj7H16YUOT81rJw1rdFhyEDlN2Tds91p/glzbl5A==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/maplibre-gl/node_modules/global-prefix": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-4.0.0.tgz",
"integrity": "sha512-w0Uf9Y9/nyHinEk5vMJKRie+wa4kR5hmDbEhGGds/kG1PwGLLHKRoNMeJOyCQjjBkANlnScqgzcFwGHgmgLkVA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"ini": "^4.1.3",
"kind-of": "^6.0.3",
@@ -9722,6 +9896,7 @@
"resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz",
"integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==",
"license": "ISC",
+ "peer": true,
"engines": {
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
}
@@ -9731,6 +9906,7 @@
"resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
"integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
"license": "ISC",
+ "peer": true,
"engines": {
"node": ">=16"
}
@@ -9739,19 +9915,22 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/potpack/-/potpack-2.1.0.tgz",
"integrity": "sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/maplibre-gl/node_modules/quickselect": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-3.0.0.tgz",
"integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/maplibre-gl/node_modules/supercluster": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/supercluster/-/supercluster-8.0.1.tgz",
"integrity": "sha512-IiOea5kJ9iqzD2t7QJq/cREyLHTtSmUT6gQsweojg9WH2sYJqZK9SswTu6jrscO6D1G5v5vYZ9ru/eq85lXeZQ==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"kdbush": "^4.0.2"
}
@@ -9760,13 +9939,15 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz",
"integrity": "sha512-gRa9gwYU3ECmQYv3lslts5hxuIa90veaEcxDYuu3QGOIAEM2mOZkVHp48ANJuu1CURtRdHKUBY5Lm1tHV+sD4g==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/maplibre-gl/node_modules/which": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
"integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"isexe": "^3.1.1"
},
@@ -9802,6 +9983,7 @@
"resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz",
"integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -10152,7 +10334,8 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
"integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/merge2": {
"version": "1.4.1",
@@ -10881,6 +11064,7 @@
"resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz",
"integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"mouse-event": "^1.0.0"
}
@@ -10889,19 +11073,22 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz",
"integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/mouse-event-offset": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz",
"integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/mouse-wheel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz",
"integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"right-now": "^1.0.0",
"signum": "^1.0.0",
@@ -10928,7 +11115,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
"integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/nanoid": {
"version": "3.3.11",
@@ -10952,7 +11140,8 @@
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
"integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/natural-compare": {
"version": "1.4.0",
@@ -10966,6 +11155,7 @@
"resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz",
"integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"debug": "^3.2.6",
"iconv-lite": "^0.4.4",
@@ -10983,6 +11173,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"ms": "^2.1.1"
}
@@ -10992,6 +11183,7 @@
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@@ -11003,13 +11195,15 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/node-fetch": {
"version": "2.6.9",
@@ -11105,13 +11299,15 @@
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz",
"integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/number-is-integer": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz",
"integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"is-finite": "^1.0.1"
},
@@ -11238,6 +11434,7 @@
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"wrappy": "1"
}
@@ -11351,7 +11548,8 @@
"version": "3.1.8",
"resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz",
"integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/parse-entities": {
"version": "4.0.2",
@@ -11412,6 +11610,7 @@
"resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz",
"integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"pick-by-alias": "^1.2.0"
}
@@ -11420,13 +11619,15 @@
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz",
"integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/parse-unit": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz",
"integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/parse5": {
"version": "7.3.0",
@@ -11541,6 +11742,7 @@
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.3.0.tgz",
"integrity": "sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"ieee754": "^1.1.12",
"resolve-protobuf-schema": "^2.1.0"
@@ -11553,13 +11755,15 @@
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
"integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/pick-by-alias": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz",
"integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/picocolors": {
"version": "1.1.1",
@@ -11573,7 +11777,6 @@
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=12"
},
@@ -11650,13 +11853,15 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz",
"integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/polybooljs": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.2.tgz",
"integrity": "sha512-ziHW/02J0XuNuUtmidBc6GXE8YohYydp3DWPWXYsd7O721TjcmN+k6ezjdwkDqep+gnWnFY+yqZHvzElra2oCg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
@@ -11687,7 +11892,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"nanoid": "^3.3.11",
"picocolors": "^1.1.1",
@@ -11752,6 +11956,7 @@
"resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-6.0.1.tgz",
"integrity": "sha512-zyo2sAkVvuZFFy0gc2+4O+xar5dYlaVy/ebO24KT0ftk/iJevSNyPyQellsBLlnccwh7f6V6Y4GvuKRYToNgpQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"generic-names": "^4.0.0",
"icss-utils": "^5.1.0",
@@ -11771,6 +11976,7 @@
"resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
"integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
"license": "ISC",
+ "peer": true,
"engines": {
"node": "^10 || ^12 || >= 14"
},
@@ -11783,6 +11989,7 @@
"resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz",
"integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"icss-utils": "^5.0.0",
"postcss-selector-parser": "^7.0.0",
@@ -11800,6 +12007,7 @@
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -11813,6 +12021,7 @@
"resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
"integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"postcss-selector-parser": "^7.0.0"
},
@@ -11828,6 +12037,7 @@
"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz",
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -11841,6 +12051,7 @@
"resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
"integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"icss-utils": "^5.0.0"
},
@@ -11993,7 +12204,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
"integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/prelude-ls": {
"version": "1.2.1",
@@ -12011,7 +12223,6 @@
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
@@ -12080,6 +12291,7 @@
"resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz",
"integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"lodash.merge": "^4.6.2",
"needle": "^2.5.2",
@@ -12100,7 +12312,8 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
"integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/prop-types": {
"version": "15.8.1",
@@ -12133,7 +12346,8 @@
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
"integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/punycode": {
"version": "2.3.1",
@@ -12170,13 +12384,15 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
"integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/raf": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
"integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"performance-now": "^2.1.0"
}
@@ -12186,6 +12402,7 @@
"resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
"integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"safe-buffer": "^5.1.0"
}
@@ -12195,7 +12412,6 @@
"resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
"integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
"license": "MIT",
- "peer": true,
"engines": {
"node": ">=0.10.0"
}
@@ -12250,7 +12466,6 @@
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
"integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
"license": "MIT",
- "peer": true,
"dependencies": {
"scheduler": "^0.26.0"
},
@@ -12320,7 +12535,6 @@
"resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz",
"integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==",
"license": "MIT",
- "peer": true,
"dependencies": {
"@types/use-sync-external-store": "^0.0.6",
"use-sync-external-store": "^1.4.0"
@@ -12495,6 +12709,7 @@
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -12509,13 +12724,15 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/readable-stream/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/recast": {
"version": "0.23.11",
@@ -12565,8 +12782,7 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
"integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
- "license": "MIT",
- "peer": true
+ "license": "MIT"
},
"node_modules/redux-thunk": {
"version": "3.1.0",
@@ -12742,13 +12958,15 @@
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz",
"integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/regl-error2d": {
"version": "2.0.12",
"resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz",
"integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"array-bounds": "^1.0.1",
"color-normalize": "^1.5.0",
@@ -12764,6 +12982,7 @@
"resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.3.tgz",
"integrity": "sha512-fkgzW+tTn4QUQLpFKsUIE0sgWdCmXAM3ctXcCgoGBZTSX5FE2A0M7aynz7nrZT5baaftLrk9te54B+MEq4QcSA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"array-bounds": "^1.0.1",
"array-find-index": "^1.0.2",
@@ -12783,6 +13002,7 @@
"resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.3.1.tgz",
"integrity": "sha512-seOmMIVwaCwemSYz/y4WE0dbSO9svNFSqtTh5RE57I7PjGo3tcUYKtH0MTSoshcAsreoqN8HoCtnn8wfHXXfKQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@plotly/point-cluster": "^3.1.9",
"array-range": "^1.0.1",
@@ -12806,6 +13026,7 @@
"resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.4.3.tgz",
"integrity": "sha512-BADfVl/FHkQkyo8sRBwMYBqemqsgnu7JZAwUgvBvuwwuNUZAhSvLTbsEErS5bQXzOjDR0dWzJ4vXN2Q+QoPx0A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-name": "^1.0.0"
}
@@ -12815,6 +13036,7 @@
"resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.4.0.tgz",
"integrity": "sha512-Nti4qbzr/z2LbUWySr7H9dk3Rl7gZt7ihHAxlgT4Ho90EXWkjtkL1avTleu9yeGuqrt/chxTB6GKK8nZZ6V0+Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"color-parse": "^1.4.2",
"color-space": "^2.0.0"
@@ -12825,6 +13047,7 @@
"resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz",
"integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"array-bounds": "^1.0.1",
"array-range": "^1.0.1",
@@ -13002,6 +13225,7 @@
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"protocol-buffers-schema": "^3.3.1"
}
@@ -13021,7 +13245,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz",
"integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/rollup": {
"version": "4.44.2",
@@ -13098,7 +13323,8 @@
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
"integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==",
- "license": "BSD-3-Clause"
+ "license": "BSD-3-Clause",
+ "peer": true
},
"node_modules/safe-array-concat": {
"version": "1.1.3",
@@ -13138,7 +13364,8 @@
"url": "https://feross.org/support"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/safe-push-apply": {
"version": "1.0.0",
@@ -13185,7 +13412,8 @@
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz",
"integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/saxes": {
"version": "6.0.0",
@@ -13211,6 +13439,7 @@
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz",
"integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
@@ -13247,6 +13476,7 @@
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
@@ -13258,7 +13488,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/semver": {
"version": "7.7.2",
@@ -13277,6 +13508,7 @@
"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
"integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
"license": "BSD-3-Clause",
+ "peer": true,
"dependencies": {
"randombytes": "^2.1.0"
}
@@ -13340,7 +13572,8 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
"integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/shebang-command": {
"version": "2.0.0",
@@ -13462,7 +13695,8 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz",
"integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/slash": {
"version": "3.0.0",
@@ -13515,6 +13749,7 @@
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"buffer-from": "^1.0.0",
"source-map": "^0.6.0"
@@ -13534,6 +13769,7 @@
"version": "0.0.9",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz",
"integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==",
+ "peer": true,
"engines": {
"node": "*"
}
@@ -13550,6 +13786,7 @@
"resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.1.tgz",
"integrity": "sha512-MgWpQ/ZjGieSVB3eOJVs4OA2LT/q1vx98KPCTTQPzq/aLr0YUXTsgryTXr4SLfR0ZfUUCiedM9n/ABeDIyy4mA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"escodegen": "^2.1.0"
}
@@ -13581,7 +13818,6 @@
"integrity": "sha512-sVKbCj/OTx67jhmauhxc2dcr1P+yOgz/x3h0krwjyMgdc5Oubvxyg4NYDZmzAw+ym36g/lzH8N0Ccp4dwtdfxw==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@storybook/core": "8.6.14"
},
@@ -13625,6 +13861,7 @@
"resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
"integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"debug": "2"
}
@@ -13634,6 +13871,7 @@
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"ms": "2.0.0"
}
@@ -13642,19 +13880,22 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/stream-shift": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz",
"integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"safe-buffer": "~5.1.0"
}
@@ -13663,19 +13904,22 @@
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/string-hash": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
"integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
- "license": "CC0-1.0"
+ "license": "CC0-1.0",
+ "peer": true
},
"node_modules/string-split-by": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz",
"integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"parenthesis": "^3.1.5"
}
@@ -13960,13 +14204,15 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz",
"integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/style-loader": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz",
"integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">= 18.12.0"
},
@@ -14012,7 +14258,6 @@
}
],
"license": "MIT",
- "peer": true,
"dependencies": {
"@csstools/css-parser-algorithms": "^3.0.5",
"@csstools/css-tokenizer": "^3.0.4",
@@ -14282,7 +14527,6 @@
"integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"cssesc": "^3.0.0",
"util-deprecate": "^1.0.2"
@@ -14351,6 +14595,7 @@
"resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz",
"integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"kdbush": "^3.0.0"
}
@@ -14359,13 +14604,15 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz",
"integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/superscript-text": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz",
"integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/supports-color": {
"version": "7.2.0",
@@ -14413,13 +14660,15 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz",
"integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/svg-path-bounds": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz",
"integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"abs-svg-path": "^0.1.1",
"is-svg-path": "^1.0.1",
@@ -14432,6 +14681,7 @@
"resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz",
"integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"svg-arc-to-cubic-bezier": "^3.0.0"
}
@@ -14441,6 +14691,7 @@
"resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz",
"integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"bitmap-sdf": "^1.0.0",
"draw-svg-path": "^1.0.0",
@@ -14549,6 +14800,7 @@
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz",
"integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=6"
}
@@ -14585,6 +14837,7 @@
"resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz",
"integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
"acorn": "^8.14.0",
@@ -14603,6 +14856,7 @@
"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz",
"integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.25",
"jest-worker": "^27.4.5",
@@ -14637,6 +14891,7 @@
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
"integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"readable-stream": "~2.3.6",
"xtend": "~4.0.1"
@@ -14676,7 +14931,8 @@
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz",
"integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/tinyexec": {
"version": "0.3.2",
@@ -14716,7 +14972,8 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz",
"integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/tinyrainbow": {
"version": "2.0.0",
@@ -14762,13 +15019,15 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz",
"integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/to-px": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz",
"integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"parse-unit": "^1.0.1"
}
@@ -14791,6 +15050,7 @@
"resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz",
"integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==",
"license": "ISC",
+ "peer": true,
"dependencies": {
"commander": "2"
},
@@ -14977,7 +15237,8 @@
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/type/-/type-2.7.3.tgz",
"integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/type-check": {
"version": "0.4.0",
@@ -15086,13 +15347,15 @@
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/typedarray-pool": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz",
"integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"bit-twiddle": "^1.0.0",
"dup": "^1.0.0"
@@ -15104,7 +15367,6 @@
"integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==",
"dev": true,
"license": "Apache-2.0",
- "peer": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -15119,7 +15381,6 @@
"integrity": "sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"@typescript-eslint/eslint-plugin": "8.36.0",
"@typescript-eslint/parser": "8.36.0",
@@ -15335,7 +15596,8 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
"integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/update-browserslist-db": {
"version": "1.1.3",
@@ -15371,7 +15633,8 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz",
"integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==",
- "license": "MIT"
+ "license": "MIT",
+ "peer": true
},
"node_modules/uri-js": {
"version": "4.4.1",
@@ -15555,7 +15818,6 @@
"integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==",
"dev": true,
"license": "MIT",
- "peer": true,
"dependencies": {
"esbuild": "^0.25.0",
"fdir": "^6.4.4",
@@ -15746,6 +16008,7 @@
"resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz",
"integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"@mapbox/point-geometry": "0.1.0",
"@mapbox/vector-tile": "^1.3.1",
@@ -15770,6 +16033,7 @@
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz",
"integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"glob-to-regexp": "^0.4.1",
"graceful-fs": "^4.1.2"
@@ -15782,7 +16046,8 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz",
"integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==",
- "license": "Apache-2.0"
+ "license": "Apache-2.0",
+ "peer": true
},
"node_modules/web-namespaces": {
"version": "2.0.1",
@@ -15799,6 +16064,7 @@
"resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz",
"integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"get-canvas-context": "^1.0.1"
}
@@ -15867,6 +16133,7 @@
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz",
"integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==",
"license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10.13.0"
}
@@ -15883,6 +16150,7 @@
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
"license": "BSD-2-Clause",
+ "peer": true,
"dependencies": {
"esrecurse": "^4.3.0",
"estraverse": "^4.1.1"
@@ -15896,6 +16164,7 @@
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
"integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
"license": "BSD-2-Clause",
+ "peer": true,
"engines": {
"node": ">=4.0"
}
@@ -16082,6 +16351,7 @@
"resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.4.tgz",
"integrity": "sha512-VGRnLJS+xJmGDPodgJRnGIDwGu0s+Cr9V2HB3EzlDZ5n0qb8h5SJtGUEkjrphZYAglEiXZ6kiXdmk0H/h/uu/w==",
"license": "MIT",
+ "peer": true,
"dependencies": {
"object-assign": "^4.1.0"
}
@@ -16169,7 +16439,8 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
- "license": "ISC"
+ "license": "ISC",
+ "peer": true
},
"node_modules/write-file-atomic": {
"version": "5.0.1",
diff --git a/app/public/assets/posts/uk-mansion-tax/cover.png b/app/public/assets/posts/uk-mansion-tax/cover.png
new file mode 100644
index 000000000..0ef145057
Binary files /dev/null and b/app/public/assets/posts/uk-mansion-tax/cover.png differ
diff --git a/app/public/assets/posts/uk-mansion-tax/impact_data_1m.json b/app/public/assets/posts/uk-mansion-tax/impact_data_1m.json
new file mode 100644
index 000000000..9a78cb0b9
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/impact_data_1m.json
@@ -0,0 +1,569 @@
+{
+ "Cities of London and Westminster": { "pct": 6.691, "num": 929, "rev": 1858000 },
+ "Kensington and Bayswater": { "pct": 5.452, "num": 757, "rev": 1514000 },
+ "Chelsea and Fulham": { "pct": 4.163, "num": 578, "rev": 1156000 },
+ "Hampstead and Highgate": { "pct": 2.737, "num": 380, "rev": 760000 },
+ "Battersea": { "pct": 2.226, "num": 309, "rev": 618000 },
+ "Richmond Park": { "pct": 2.024, "num": 281, "rev": 562000 },
+ "Islington South and Finsbury": { "pct": 1.743, "num": 242, "rev": 484000 },
+ "Hammersmith and Chiswick": { "pct": 1.721, "num": 239, "rev": 478000 },
+ "Holborn and St Pancras": { "pct": 1.462, "num": 203, "rev": 406000 },
+ "Finchley and Golders Green": { "pct": 1.332, "num": 185, "rev": 370000 },
+ "Ealing Central and Acton": { "pct": 1.217, "num": 169, "rev": 338000 },
+ "Runnymede and Weybridge": { "pct": 1.21, "num": 168, "rev": 336000 },
+ "Wimbledon": { "pct": 1.116, "num": 155, "rev": 310000 },
+ "Queen's Park and Maida Vale": { "pct": 1.109, "num": 154, "rev": 308000 },
+ "Esher and Walton": { "pct": 1.095, "num": 152, "rev": 304000 },
+ "Hornsey and Friern Barnet": { "pct": 1.03, "num": 143, "rev": 286000 },
+ "Twickenham": { "pct": 0.965, "num": 134, "rev": 268000 },
+ "Windsor": { "pct": 0.936, "num": 130, "rev": 260000 },
+ "Putney": { "pct": 0.893, "num": 124, "rev": 248000 },
+ "Harpenden and Berkhamsted": { "pct": 0.864, "num": 120, "rev": 240000 },
+ "Tooting": { "pct": 0.857, "num": 119, "rev": 238000 },
+ "Dulwich and West Norwood": { "pct": 0.821, "num": 114, "rev": 228000 },
+ "Chesham and Amersham": { "pct": 0.792, "num": 110, "rev": 220000 },
+ "Beaconsfield": { "pct": 0.771, "num": 107, "rev": 214000 },
+ "Islington North": { "pct": 0.72, "num": 100, "rev": 200000 },
+ "Reigate": { "pct": 0.634, "num": 88, "rev": 176000 },
+ "Hackney South and Shoreditch": { "pct": 0.619, "num": 86, "rev": 172000 },
+ "Winchester": { "pct": 0.583, "num": 81, "rev": 162000 },
+ "Hertsmere": { "pct": 0.576, "num": 80, "rev": 160000 },
+ "Sevenoaks": { "pct": 0.569, "num": 79, "rev": 158000 },
+ "Guildford": { "pct": 0.569, "num": 79, "rev": 158000 },
+ "Maidenhead": { "pct": 0.555, "num": 77, "rev": 154000 },
+ "Bath": { "pct": 0.547, "num": 76, "rev": 152000 },
+ "South West Hertfordshire": { "pct": 0.54, "num": 75, "rev": 150000 },
+ "North Cotswolds": { "pct": 0.526, "num": 73, "rev": 146000 },
+ "Clapham and Brixton Hill": { "pct": 0.519, "num": 72, "rev": 144000 },
+ "Godalming and Ash": { "pct": 0.504, "num": 70, "rev": 140000 },
+ "Hackney North and Stoke Newington": { "pct": 0.49, "num": 68, "rev": 136000 },
+ "Oxford West and Abingdon": { "pct": 0.483, "num": 67, "rev": 134000 },
+ "Arundel and South Downs": { "pct": 0.483, "num": 67, "rev": 134000 },
+ "Tatton": { "pct": 0.483, "num": 67, "rev": 134000 },
+ "Poole": { "pct": 0.468, "num": 65, "rev": 130000 },
+ "Epping Forest": { "pct": 0.468, "num": 65, "rev": 130000 },
+ "Woking": { "pct": 0.439, "num": 61, "rev": 122000 },
+ "Henley and Thame": { "pct": 0.425, "num": 59, "rev": 118000 },
+ "Chipping Barnet": { "pct": 0.411, "num": 57, "rev": 114000 },
+ "St Albans": { "pct": 0.411, "num": 57, "rev": 114000 },
+ "Farnham and Bordon": { "pct": 0.411, "num": 57, "rev": 114000 },
+ "Hove and Portslade": { "pct": 0.396, "num": 55, "rev": 110000 },
+ "Brentwood and Ongar": { "pct": 0.396, "num": 55, "rev": 110000 },
+ "Vauxhall and Camberwell Green": { "pct": 0.375, "num": 52, "rev": 104000 },
+ "Bermondsey and Old Southwark": { "pct": 0.375, "num": 52, "rev": 104000 },
+ "Greenwich and Woolwich": { "pct": 0.353, "num": 49, "rev": 98000 },
+ "Dorking and Horley": { "pct": 0.353, "num": 49, "rev": 98000 },
+ "Lewisham West and East Dulwich": { "pct": 0.346, "num": 48, "rev": 96000 },
+ "Brent East": { "pct": 0.346, "num": 48, "rev": 96000 },
+ "Banbury": { "pct": 0.346, "num": 48, "rev": 96000 },
+ "Tunbridge Wells": { "pct": 0.339, "num": 47, "rev": 94000 },
+ "Hendon": { "pct": 0.331, "num": 46, "rev": 92000 },
+ "East Hampshire": { "pct": 0.331, "num": 46, "rev": 92000 },
+ "Chichester": { "pct": 0.324, "num": 45, "rev": 90000 },
+ "Southgate and Wood Green": { "pct": 0.324, "num": 45, "rev": 90000 },
+ "South Cotswolds": { "pct": 0.324, "num": 45, "rev": 90000 },
+ "Poplar and Limehouse": { "pct": 0.317, "num": 44, "rev": 88000 },
+ "Cambridge": { "pct": 0.317, "num": 44, "rev": 88000 },
+ "New Forest East": { "pct": 0.317, "num": 44, "rev": 88000 },
+ "Altrincham and Sale West": { "pct": 0.31, "num": 43, "rev": 86000 },
+ "Kingston and Surbiton": { "pct": 0.295, "num": 41, "rev": 82000 },
+ "Bromley and Biggin Hill": { "pct": 0.295, "num": 41, "rev": 82000 },
+ "East Surrey": { "pct": 0.295, "num": 41, "rev": 82000 },
+ "Newbury": { "pct": 0.288, "num": 40, "rev": 80000 },
+ "Ruislip, Northwood and Pinner": { "pct": 0.288, "num": 40, "rev": 80000 },
+ "Wycombe": { "pct": 0.288, "num": 40, "rev": 80000 },
+ "Reading Central": { "pct": 0.266, "num": 37, "rev": 74000 },
+ "Streatham and Croydon North": { "pct": 0.266, "num": 37, "rev": 74000 },
+ "Epsom and Ewell": { "pct": 0.259, "num": 36, "rev": 72000 },
+ "East Grinstead and Uckfield": { "pct": 0.259, "num": 36, "rev": 72000 },
+ "Reading West and Mid Berkshire": { "pct": 0.259, "num": 36, "rev": 72000 },
+ "Eltham and Chislehurst": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "North East Hampshire": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "Manchester Central": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "Leyton and Wanstead": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "South Devon": { "pct": 0.245, "num": 34, "rev": 68000 },
+ "Mid Buckinghamshire": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "New Forest West": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "Lewisham North": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "Wokingham": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "South Cambridgeshire": { "pct": 0.23, "num": 32, "rev": 64000 },
+ "Cheltenham": { "pct": 0.23, "num": 32, "rev": 64000 },
+ "Bristol Central": { "pct": 0.23, "num": 32, "rev": 64000 },
+ "Witney": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "North Cornwall": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "Mid Sussex": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "Romsey and Southampton North": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "Welwyn Hatfield": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "North West Essex": { "pct": 0.216, "num": 30, "rev": 60000 },
+ "Stratford-on-Avon": { "pct": 0.209, "num": 29, "rev": 58000 },
+ "Sussex Weald": { "pct": 0.209, "num": 29, "rev": 58000 },
+ "Truro and Falmouth": { "pct": 0.209, "num": 29, "rev": 58000 },
+ "Ealing Southall": { "pct": 0.202, "num": 28, "rev": 56000 },
+ "Meriden and Solihull East": { "pct": 0.202, "num": 28, "rev": 56000 },
+ "North East Hertfordshire": { "pct": 0.194, "num": 27, "rev": 54000 },
+ "Birmingham Ladywood": { "pct": 0.194, "num": 27, "rev": 54000 },
+ "Tonbridge": { "pct": 0.194, "num": 27, "rev": 54000 },
+ "Salisbury": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "York Central": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Bethnal Green and Stepney": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Harrow East": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Surrey Heath": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Wetherby and Easingwold": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "Beckenham and Penge": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "North West Hampshire": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "Kenilworth and Southam": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "Daventry": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "South Northamptonshire": { "pct": 0.173, "num": 24, "rev": 48000 },
+ "Croydon West": { "pct": 0.173, "num": 24, "rev": 48000 },
+ "East Wiltshire": { "pct": 0.173, "num": 24, "rev": 48000 },
+ "Frome and East Somerset": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Croydon South": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Didcot and Wantage": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Edmonton and Winchmore Hill": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Exeter": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Horsham": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Harrogate and Knaresborough": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Macclesfield": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Rutland and Stamford": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Cardiff South and Penarth": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Basildon and Billericay": { "pct": 0.151, "num": 21, "rev": 42000 },
+ "Peckham": { "pct": 0.151, "num": 21, "rev": 42000 },
+ "Canterbury": { "pct": 0.151, "num": 21, "rev": 42000 },
+ "Liverpool Riverside": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Tottenham": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Enfield North": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Exmouth and Exeter East": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Watford": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Luton South and South Bedfordshire": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Hitchin": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Hertford and Stortford": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Salford": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Bristol North West": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Bicester and Woodstock": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Chingford and Woodford Green": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Hamble Valley": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "North West Norfolk": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Maldon": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Hornchurch and Upminster": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Newcastle upon Tyne Central and West": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Droitwich and Evesham": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Warwick and Leamington": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Orpington": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Stretford and Urmston": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "North Somerset": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Tewkesbury": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Bury St Edmunds and Stowmarket": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Sutton and Cheam": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Lewes": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Oxford East": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Westmorland and Lonsdale": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Ely and East Cambridgeshire": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Eastbourne": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Skipton and Ripon": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Sheffield Central": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Hemel Hempstead": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Spelthorne": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Tamworth": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Wells and Mendip Hills": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Bexhill and Battle": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "St Austell and Newquay": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Leeds South": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Honiton and Sidmouth": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "West Dorset": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Manchester Rusholme": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Knowsley": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "South Dorset": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "St Ives": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Buckingham and Bletchley": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "North Northumberland": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Rushcliffe": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Broxbourne": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Ealing North": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Bromsgrove": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Brighton Pavilion": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Christchurch": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "North Devon": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Bournemouth West": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Loughborough": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Chester South and Eddisbury": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Weald of Kent": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "South West Norfolk": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Brentford and Isleworth": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Stratford and Bow": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Manchester Withington": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Mid Bedfordshire": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "South Suffolk": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Milton Keynes North": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Stourbridge": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "West Lancashire": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Braintree": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Leeds Central and Headingley": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Keighley and Ilkley": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Harlow": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Chelmsford": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Suffolk Coastal": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Isle of Wight West": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Isle of Wight East": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Romford": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Worcester": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Stroud": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Thirsk and Malton": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Nottingham South": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Nottingham East": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Melton and Syston": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Sutton Coldfield": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "North West Cambridgeshire": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Glastonbury and Somerton": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Melksham and Devizes": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Fylde": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Thornbury and Yate": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Coventry East": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Tiverton and Minehead": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Hexham": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Ashford": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Telford": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Hayes and Harlington": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "North Herefordshire": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "North Dorset": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Cheadle": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Scarborough and Whitby": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Torbay": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Birmingham Edgbaston": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Lewisham East": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Camborne and Redruth": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Neath and Swansea East": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Thurrock": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Mid Leicestershire": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Newcastle-under-Lyme": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Wirral West": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "North Norfolk": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Northampton North": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Leicester South": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Witham": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "York Outer": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Aylesbury": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Central Devon": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Harrow West": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Dartford": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Doncaster Central": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Corby and East Northamptonshire": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Gower": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Rugby": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Richmond and Northallerton": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "St Neots and Mid Cambridgeshire": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Ribble Valley": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Walthamstow": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Rayleigh and Wickford": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Portsmouth South": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Brecon, Radnor and Cwm Tawe": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Gloucester": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Peterborough": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Bognor Regis and Littlehampton": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Sittingbourne and Sheppey": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Congleton": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Broadland and Fakenham": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Filton and Bradley Stoke": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Bury South": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Hereford and South Herefordshire": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "West Worcestershire": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Yeovil": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Mid Dorset and North Poole": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Newcastle upon Tyne North": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Newark": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Wyre Forest": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Huntingdon": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Worthing West": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Earley and Woodley": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Shrewsbury": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Chester North and Neston": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Central Suffolk and North Ipswich": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "North West Leicestershire": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "North Bedfordshire": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Dover and Deal": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Derbyshire Dales": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Solihull West and Shirley": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Hinckley and Bosworth": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Bracknell": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Southend East and Rochford": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "South Ribble": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Brent West": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Stockport": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Gravesham": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Hastings and Rye": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "South West Wiltshire": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Ashfield": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Herne Bay and Sandwich": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Widnes and Halewood": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Basingstoke": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bassetlaw": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Oldham West, Chadderton and Royton": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bedford": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Birmingham Erdington": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Worsley and Eccles": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "North Shropshire": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Waveney Valley": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Crawley": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "South East Cornwall": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Washington and Gateshead South": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Wakefield and Rothwell": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Torridge and Tavistock": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Portsmouth North": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Stafford": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "St Helens North": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Rossendale and Darwen": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bristol East": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Southampton Itchen": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Sheffield Hallam": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bristol South": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Milton Keynes Central": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "South West Devon": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Monmouthshire": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Rochester and Strood": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Aberafan Maesteg": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Heywood and Middleton North": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Maidstone and Malling": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Llanelli": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Mid Norfolk": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Feltham and Heston": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Lichfield": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Harborough, Oadby and Wigston": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Mansfield": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Stevenage": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Plymouth Sutton and Devonport": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Brighton Kemptown and Peacehaven": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Southampton Test": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Broxtowe": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "South Leicestershire": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Cardiff West": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Sheffield South East": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Swindon South": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Redditch": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Clwyd North": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Penrith and Solway": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Makerfield": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Bradford South": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Pontefract, Castleford and Knottingley": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Bolsover": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "East Thanet": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Mid and South Pembrokeshire": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Wrexham": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Mid Derbyshire": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Normanton and Hemsworth": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Newport East": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Ilford North": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Wolverhampton West": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Dunstable and Leighton Buzzard": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Ilford South": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Kingswinford and South Staffordshire": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Carlisle": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Sefton Central": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Cardiff North": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Chippenham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Runcorn and Helsby": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Barking": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Clacton": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Wythenshawe and Sale East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Sheffield Heeley": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Slough": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Lincoln": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leicester West": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Halesowen": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Bridgwater": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Birmingham Selly Oak": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leeds North East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Uxbridge and South Ruislip": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Grantham and Bourne": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Vale of Glamorgan": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Sleaford and North Hykeham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Warrington South": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Burton and Uttoxeter": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Bury North": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "South Basildon and East Thurrock": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Wigan": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Bradford East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leeds North West": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Middlesbrough and Thornaby East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Gorton and Denton": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "North East Somerset and Hanham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "East Worthing and Shoreham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Erith and Thamesmead": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Derby North": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Derby South": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Nuneaton": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Pendle and Clitheroe": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leeds East": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Caerfyrddin": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Havant": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Harwich and North Essex": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "West Suffolk": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Sheffield Brightside and Hillsborough": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Birkenhead": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Nottingham North and Kimberley": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Wellingborough and Rushden": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "North East Derbyshire": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Walsall and Bloxwich": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Tynemouth": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Swindon North": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "South Derbyshire": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "South Shropshire": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Old Bexley and Sidcup": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Stoke-on-Trent South": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Taunton and Wellington": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Stoke-on-Trent Central": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Doncaster East and the Isle of Axholme": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Bournemouth East": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Leicester East": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Halifax": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Lancaster and Wyre": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Preston": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Chorley": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Bangor Aberconwy": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Chatham and Aylesford": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Carshalton and Wallington": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Morecambe and Lunesdale": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Mitcham and Morden": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Rochdale": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Louth and Horncastle": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Ynys M\u00f4n": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Alyn and Deeside": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Folkestone and Hythe": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Huddersfield": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Easington": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bristol North East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Southport": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Doncaster North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Forest of Dean": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bolton South and Walkden": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Rhondda and Ogmore": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Kingston upon Hull West and Haltemprice": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "St Helens South and Whiston": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bolton West": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Amber Valley": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Staffordshire Moorlands": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Merthyr Tydfil and Aberdare": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Boston and Skegness": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Stoke-on-Trent North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Stone, Great Wyrley and Penkridge": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Sunderland Central": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bradford West": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Darlington": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Wolverhampton South East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Newport West and Islwyn": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Luton North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Hartlepool": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Newcastle upon Tyne East and Wallsend": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Kettering": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Gillingham and Rainham": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Jarrow and Gateshead East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Warrington North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Smethwick": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Eastleigh": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Faversham and Mid Kent": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Dwyfor Meirionnydd": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bishop Auckland": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Croydon East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Blackburn": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "South Holland and The Deepings": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Kingston upon Hull North and Cottingham": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "South Norfolk": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Burnley": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Weston-super-Mare": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Hazel Grove": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Barnsley North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "West Ham and Beckton": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Ipswich": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Erewash": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Torfaen": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Swansea West": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Birmingham Hodge Hill and Solihull North": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Houghton and Sunderland South": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Blaenau Gwent and Rhymney": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Newton Abbot": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Blaydon and Consett": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Tipton and Wednesbury": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Whitehaven and Workington": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Plymouth Moor View": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Caerphilly": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Colne Valley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Cardiff East": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Dagenham and Rainham": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Aldershot": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Oldham East and Saddleworth": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Ossett and Denby Dale": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "North Warwickshire and Bedworth": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Goole and Pocklington": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Rother Valley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Coventry South": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Sherwood Forest": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Scunthorpe": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Chesterfield": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Leeds South West and Morley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Shipley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Rawmarsh and Conisbrough": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Bridlington and The Wolds": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Stalybridge and Hyde": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Northampton South": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Colchester": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Gainsborough": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Penistone and Stocksbridge": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Dewsbury and Batley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Liverpool Garston": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Crewe and Nantwich": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Birmingham Hall Green and Moseley": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "West Bromwich": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Calder Valley": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Bridgend": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Liverpool Wavertree": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Norwich South": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Barrow and Furness": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "High Peak": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Lowestoft": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Gedling": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "East Ham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "City of Durham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Clwyd East": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Rotherham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Birmingham Northfield": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Leigh and Atherton": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Ellesmere Port and Bromborough": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blyth and Ashington": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Norwich North": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blackpool South": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blackpool North and Fleetwood": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blackley and Middleton South": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Bolton North East": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Fareham and Waterlooville": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Spen Valley": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Southend West and Leigh": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Brigg and Immingham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Bootle": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Cramlington and Killingworth": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Great Yarmouth": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Kingston upon Hull East": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Stockton North": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "North Durham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "The Wrekin": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Gateshead Central and Whickham": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Hyndburn": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Redcar": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Leeds West and Pudsey": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Wolverhampton North East": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Ashton-under-Lyne": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "North East Cambridgeshire": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Ceredigion Preseli": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Barnsley South": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Gosport": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Middlesbrough South and East Cleveland": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Birmingham Yardley": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Coventry North West": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Selby": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Cannock Chase": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Beverley and Holderness": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Bexleyheath and Crayford": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Newton Aycliffe and Spennymoor": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Liverpool Walton": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Birmingham Perry Barr": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Dudley": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Wallasey": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Stockton West": { "pct": 0.007, "num": 1, "rev": 2000 }
+}
diff --git a/app/public/assets/posts/uk-mansion-tax/impact_data_2m.json b/app/public/assets/posts/uk-mansion-tax/impact_data_2m.json
new file mode 100644
index 000000000..439b05066
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/impact_data_2m.json
@@ -0,0 +1,569 @@
+{
+ "Cities of London and Westminster": { "pct": 9.453, "num": 742, "rev": 1484000 },
+ "Kensington and Bayswater": { "pct": 7.045, "num": 553, "rev": 1106000 },
+ "Chelsea and Fulham": { "pct": 4.638, "num": 364, "rev": 728000 },
+ "Hampstead and Highgate": { "pct": 3.019, "num": 237, "rev": 474000 },
+ "Battersea": { "pct": 1.669, "num": 131, "rev": 262000 },
+ "Richmond Park": { "pct": 1.873, "num": 147, "rev": 294000 },
+ "Islington South and Finsbury": { "pct": 1.745, "num": 137, "rev": 274000 },
+ "Hammersmith and Chiswick": { "pct": 1.567, "num": 123, "rev": 246000 },
+ "Holborn and St Pancras": { "pct": 1.72, "num": 135, "rev": 270000 },
+ "Finchley and Golders Green": { "pct": 1.363, "num": 107, "rev": 214000 },
+ "Ealing Central and Acton": { "pct": 0.956, "num": 75, "rev": 150000 },
+ "Runnymede and Weybridge": { "pct": 1.249, "num": 98, "rev": 196000 },
+ "Wimbledon": { "pct": 1.121, "num": 88, "rev": 176000 },
+ "Queen's Park and Maida Vale": { "pct": 1.096, "num": 86, "rev": 172000 },
+ "Esher and Walton": { "pct": 0.956, "num": 75, "rev": 150000 },
+ "Hornsey and Friern Barnet": { "pct": 0.612, "num": 48, "rev": 96000 },
+ "Twickenham": { "pct": 0.675, "num": 53, "rev": 106000 },
+ "Windsor": { "pct": 1.006, "num": 79, "rev": 158000 },
+ "Putney": { "pct": 0.573, "num": 45, "rev": 90000 },
+ "Harpenden and Berkhamsted": { "pct": 0.701, "num": 55, "rev": 110000 },
+ "Tooting": { "pct": 0.701, "num": 55, "rev": 110000 },
+ "Dulwich and West Norwood": { "pct": 0.624, "num": 49, "rev": 98000 },
+ "Chesham and Amersham": { "pct": 0.688, "num": 54, "rev": 108000 },
+ "Beaconsfield": { "pct": 0.624, "num": 49, "rev": 98000 },
+ "Islington North": { "pct": 0.51, "num": 40, "rev": 80000 },
+ "Reigate": { "pct": 0.395, "num": 31, "rev": 62000 },
+ "Hackney South and Shoreditch": { "pct": 0.586, "num": 46, "rev": 92000 },
+ "Winchester": { "pct": 0.408, "num": 32, "rev": 64000 },
+ "Hertsmere": { "pct": 0.561, "num": 44, "rev": 88000 },
+ "Sevenoaks": { "pct": 0.395, "num": 31, "rev": 62000 },
+ "Guildford": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Maidenhead": { "pct": 0.535, "num": 42, "rev": 84000 },
+ "Bath": { "pct": 0.446, "num": 35, "rev": 70000 },
+ "South West Hertfordshire": { "pct": 0.484, "num": 38, "rev": 76000 },
+ "North Cotswolds": { "pct": 0.484, "num": 38, "rev": 76000 },
+ "Clapham and Brixton Hill": { "pct": 0.382, "num": 30, "rev": 60000 },
+ "Godalming and Ash": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Hackney North and Stoke Newington": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Oxford West and Abingdon": { "pct": 0.497, "num": 39, "rev": 78000 },
+ "Arundel and South Downs": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Tatton": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Poole": { "pct": 0.408, "num": 32, "rev": 64000 },
+ "Epping Forest": { "pct": 0.433, "num": 34, "rev": 68000 },
+ "Woking": { "pct": 0.344, "num": 27, "rev": 54000 },
+ "Henley and Thame": { "pct": 0.382, "num": 30, "rev": 60000 },
+ "Chipping Barnet": { "pct": 0.319, "num": 25, "rev": 50000 },
+ "St Albans": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Farnham and Bordon": { "pct": 0.357, "num": 28, "rev": 56000 },
+ "Hove and Portslade": { "pct": 0.28, "num": 22, "rev": 44000 },
+ "Brentwood and Ongar": { "pct": 0.344, "num": 27, "rev": 54000 },
+ "Vauxhall and Camberwell Green": { "pct": 0.408, "num": 32, "rev": 64000 },
+ "Bermondsey and Old Southwark": { "pct": 0.459, "num": 36, "rev": 72000 },
+ "Greenwich and Woolwich": { "pct": 0.357, "num": 28, "rev": 56000 },
+ "Dorking and Horley": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Lewisham West and East Dulwich": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Brent East": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Banbury": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Tunbridge Wells": { "pct": 0.242, "num": 19, "rev": 38000 },
+ "Hendon": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "East Hampshire": { "pct": 0.319, "num": 25, "rev": 50000 },
+ "Chichester": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "Southgate and Wood Green": { "pct": 0.293, "num": 23, "rev": 46000 },
+ "South Cotswolds": { "pct": 0.28, "num": 22, "rev": 44000 },
+ "Poplar and Limehouse": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "Cambridge": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "New Forest East": { "pct": 0.319, "num": 25, "rev": 50000 },
+ "Altrincham and Sale West": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Kingston and Surbiton": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Bromley and Biggin Hill": { "pct": 0.331, "num": 26, "rev": 52000 },
+ "East Surrey": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Newbury": { "pct": 0.331, "num": 26, "rev": 52000 },
+ "Ruislip, Northwood and Pinner": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "Wycombe": { "pct": 0.331, "num": 26, "rev": 52000 },
+ "Reading Central": { "pct": 0.357, "num": 28, "rev": 56000 },
+ "Streatham and Croydon North": { "pct": 0.255, "num": 20, "rev": 40000 },
+ "Epsom and Ewell": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "East Grinstead and Uckfield": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Reading West and Mid Berkshire": { "pct": 0.28, "num": 22, "rev": 44000 },
+ "Eltham and Chislehurst": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "North East Hampshire": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Manchester Central": { "pct": 0.395, "num": 31, "rev": 62000 },
+ "Leyton and Wanstead": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "South Devon": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Mid Buckinghamshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "New Forest West": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Lewisham North": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Wokingham": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "South Cambridgeshire": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Cheltenham": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Bristol Central": { "pct": 0.293, "num": 23, "rev": 46000 },
+ "Witney": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "North Cornwall": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Mid Sussex": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "Romsey and Southampton North": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Welwyn Hatfield": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "North West Essex": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Stratford-on-Avon": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Sussex Weald": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Truro and Falmouth": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Ealing Southall": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Meriden and Solihull East": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "North East Hertfordshire": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Birmingham Ladywood": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "Tonbridge": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Salisbury": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "York Central": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Bethnal Green and Stepney": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Harrow East": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Surrey Heath": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Wetherby and Easingwold": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Beckenham and Penge": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "North West Hampshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Kenilworth and Southam": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Daventry": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "South Northamptonshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Croydon West": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "East Wiltshire": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Frome and East Somerset": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Croydon South": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Didcot and Wantage": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Edmonton and Winchmore Hill": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Exeter": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Horsham": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Harrogate and Knaresborough": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Macclesfield": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Rutland and Stamford": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Cardiff South and Penarth": { "pct": 0.242, "num": 19, "rev": 38000 },
+ "Basildon and Billericay": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Peckham": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Canterbury": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Liverpool Riverside": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "Tottenham": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Enfield North": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Exmouth and Exeter East": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Watford": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Luton South and South Bedfordshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Hitchin": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Hertford and Stortford": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Salford": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Bristol North West": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bicester and Woodstock": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Chingford and Woodford Green": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Hamble Valley": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "North West Norfolk": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Maldon": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Hornchurch and Upminster": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Newcastle upon Tyne Central and West": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Droitwich and Evesham": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Warwick and Leamington": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Orpington": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Stretford and Urmston": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "North Somerset": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Tewkesbury": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bury St Edmunds and Stowmarket": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Sutton and Cheam": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Lewes": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Oxford East": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Westmorland and Lonsdale": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Ely and East Cambridgeshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Eastbourne": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "Skipton and Ripon": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Sheffield Central": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Hemel Hempstead": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Spelthorne": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Tamworth": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Wells and Mendip Hills": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bexhill and Battle": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "St Austell and Newquay": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Leeds South": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Honiton and Sidmouth": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "West Dorset": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Manchester Rusholme": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Knowsley": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "South Dorset": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "St Ives": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Buckingham and Bletchley": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "North Northumberland": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Rushcliffe": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Broxbourne": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Ealing North": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bromsgrove": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Brighton Pavilion": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Christchurch": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "North Devon": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bournemouth West": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Loughborough": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Chester South and Eddisbury": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Weald of Kent": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "South West Norfolk": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Brentford and Isleworth": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Stratford and Bow": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Manchester Withington": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Mid Bedfordshire": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "South Suffolk": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Milton Keynes North": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Stourbridge": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "West Lancashire": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Braintree": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Leeds Central and Headingley": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Keighley and Ilkley": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Harlow": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Chelmsford": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Suffolk Coastal": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Isle of Wight West": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Isle of Wight East": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Romford": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Worcester": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Stroud": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Thirsk and Malton": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Nottingham South": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Nottingham East": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Melton and Syston": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Sutton Coldfield": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "North West Cambridgeshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Glastonbury and Somerton": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Melksham and Devizes": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Fylde": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Thornbury and Yate": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Coventry East": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Tiverton and Minehead": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Hexham": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Ashford": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Telford": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Hayes and Harlington": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "North Herefordshire": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "North Dorset": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Cheadle": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Scarborough and Whitby": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Torbay": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Birmingham Edgbaston": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Lewisham East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Camborne and Redruth": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Neath and Swansea East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Thurrock": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Mid Leicestershire": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Newcastle-under-Lyme": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Wirral West": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "North Norfolk": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Northampton North": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Leicester South": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Witham": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "York Outer": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Aylesbury": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Central Devon": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Harrow West": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Dartford": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Doncaster Central": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Corby and East Northamptonshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Gower": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Rugby": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Richmond and Northallerton": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "St Neots and Mid Cambridgeshire": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Ribble Valley": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Walthamstow": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Rayleigh and Wickford": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Portsmouth South": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Brecon, Radnor and Cwm Tawe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Gloucester": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Peterborough": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bognor Regis and Littlehampton": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Sittingbourne and Sheppey": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Congleton": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Broadland and Fakenham": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Filton and Bradley Stoke": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bury South": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Hereford and South Herefordshire": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "West Worcestershire": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Yeovil": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Mid Dorset and North Poole": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Newcastle upon Tyne North": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Newark": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Wyre Forest": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Huntingdon": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Worthing West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Earley and Woodley": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Shrewsbury": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Chester North and Neston": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Central Suffolk and North Ipswich": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "North West Leicestershire": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "North Bedfordshire": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Dover and Deal": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Derbyshire Dales": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Solihull West and Shirley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Hinckley and Bosworth": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Bracknell": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Southend East and Rochford": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Ribble": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Brent West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Stockport": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Gravesham": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Hastings and Rye": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South West Wiltshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Ashfield": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Herne Bay and Sandwich": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Widnes and Halewood": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Basingstoke": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bassetlaw": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Oldham West, Chadderton and Royton": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Bedford": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Birmingham Erdington": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Worsley and Eccles": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "North Shropshire": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Waveney Valley": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Crawley": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "South East Cornwall": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Washington and Gateshead South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Wakefield and Rothwell": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Torridge and Tavistock": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Portsmouth North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Stafford": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "St Helens North": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Rossendale and Darwen": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bristol East": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Southampton Itchen": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Sheffield Hallam": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bristol South": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Milton Keynes Central": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "South West Devon": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Monmouthshire": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Rochester and Strood": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Aberafan Maesteg": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Heywood and Middleton North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Maidstone and Malling": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Llanelli": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Mid Norfolk": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Feltham and Heston": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Lichfield": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Harborough, Oadby and Wigston": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Mansfield": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Stevenage": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Plymouth Sutton and Devonport": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Brighton Kemptown and Peacehaven": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Southampton Test": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Broxtowe": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "South Leicestershire": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Cardiff West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Sheffield South East": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Swindon South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Redditch": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Clwyd North": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Penrith and Solway": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Makerfield": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bradford South": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Pontefract, Castleford and Knottingley": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bolsover": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "East Thanet": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Mid and South Pembrokeshire": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Wrexham": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Mid Derbyshire": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Normanton and Hemsworth": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Newport East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Ilford North": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Wolverhampton West": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Dunstable and Leighton Buzzard": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Ilford South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Kingswinford and South Staffordshire": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Carlisle": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Sefton Central": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Cardiff North": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Chippenham": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Runcorn and Helsby": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Barking": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Clacton": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Wythenshawe and Sale East": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Sheffield Heeley": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Slough": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Lincoln": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Leicester West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Halesowen": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bridgwater": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Birmingham Selly Oak": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Leeds North East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Uxbridge and South Ruislip": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Grantham and Bourne": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Vale of Glamorgan": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sleaford and North Hykeham": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Warrington South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Burton and Uttoxeter": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Bury North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Basildon and East Thurrock": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Wigan": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bradford East": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Leeds North West": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Middlesbrough and Thornaby East": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Gorton and Denton": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "North East Somerset and Hanham": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "East Worthing and Shoreham": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Erith and Thamesmead": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Derby North": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Derby South": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Nuneaton": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Pendle and Clitheroe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Leeds East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Caerfyrddin": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Havant": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Harwich and North Essex": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "West Suffolk": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sheffield Brightside and Hillsborough": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Birkenhead": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Nottingham North and Kimberley": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Wellingborough and Rushden": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "North East Derbyshire": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Walsall and Bloxwich": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Tynemouth": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Swindon North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "South Derbyshire": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Shropshire": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Old Bexley and Sidcup": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Stoke-on-Trent South": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Taunton and Wellington": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stoke-on-Trent Central": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Doncaster East and the Isle of Axholme": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bournemouth East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Leicester East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Halifax": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Lancaster and Wyre": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Preston": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Chorley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bangor Aberconwy": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Chatham and Aylesford": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Carshalton and Wallington": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Morecambe and Lunesdale": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Mitcham and Morden": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Rochdale": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Louth and Horncastle": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Ynys M\u00f4n": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Alyn and Deeside": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Folkestone and Hythe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Huddersfield": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Easington": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Bristol North East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Southport": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Doncaster North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Forest of Dean": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bolton South and Walkden": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Rhondda and Ogmore": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Kingston upon Hull West and Haltemprice": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "St Helens South and Whiston": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bolton West": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Amber Valley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Staffordshire Moorlands": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Merthyr Tydfil and Aberdare": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Boston and Skegness": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stoke-on-Trent North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stone, Great Wyrley and Penkridge": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sunderland Central": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bradford West": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Darlington": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Wolverhampton South East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Newport West and Islwyn": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Luton North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Hartlepool": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Newcastle upon Tyne East and Wallsend": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Kettering": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Gillingham and Rainham": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Jarrow and Gateshead East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Warrington North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Smethwick": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Eastleigh": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Faversham and Mid Kent": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Dwyfor Meirionnydd": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bishop Auckland": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Croydon East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Blackburn": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "South Holland and The Deepings": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Kingston upon Hull North and Cottingham": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Norfolk": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Burnley": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Weston-super-Mare": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Hazel Grove": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Barnsley North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "West Ham and Beckton": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Ipswich": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Erewash": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Torfaen": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Swansea West": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Birmingham Hodge Hill and Solihull North": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Houghton and Sunderland South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blaenau Gwent and Rhymney": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Newton Abbot": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Blaydon and Consett": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Tipton and Wednesbury": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Whitehaven and Workington": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Plymouth Moor View": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Caerphilly": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Colne Valley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Cardiff East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Dagenham and Rainham": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Aldershot": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Oldham East and Saddleworth": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Ossett and Denby Dale": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "North Warwickshire and Bedworth": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Goole and Pocklington": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Rother Valley": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Coventry South": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sherwood Forest": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Scunthorpe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Chesterfield": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Leeds South West and Morley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Shipley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Rawmarsh and Conisbrough": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bridlington and The Wolds": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stalybridge and Hyde": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Northampton South": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Colchester": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Gainsborough": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Penistone and Stocksbridge": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Dewsbury and Batley": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Liverpool Garston": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Crewe and Nantwich": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Birmingham Hall Green and Moseley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "West Bromwich": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Calder Valley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bridgend": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Liverpool Wavertree": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Norwich South": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Barrow and Furness": { "pct": 0.0, "num": 0, "rev": 0 },
+ "High Peak": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Lowestoft": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Gedling": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "East Ham": { "pct": 0.0, "num": 0, "rev": 0 },
+ "City of Durham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Clwyd East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Rotherham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Birmingham Northfield": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Leigh and Atherton": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Ellesmere Port and Bromborough": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blyth and Ashington": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Norwich North": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blackpool South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blackpool North and Fleetwood": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Blackley and Middleton South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bolton North East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Fareham and Waterlooville": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Spen Valley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Southend West and Leigh": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Brigg and Immingham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bootle": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Cramlington and Killingworth": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Great Yarmouth": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Kingston upon Hull East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Stockton North": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "North Durham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "The Wrekin": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Gateshead Central and Whickham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Hyndburn": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Redcar": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Leeds West and Pudsey": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Wolverhampton North East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Ashton-under-Lyne": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "North East Cambridgeshire": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Ceredigion Preseli": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Barnsley South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Gosport": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Middlesbrough South and East Cleveland": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Birmingham Yardley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Coventry North West": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Selby": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Cannock Chase": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Beverley and Holderness": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bexleyheath and Crayford": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Newton Aycliffe and Spennymoor": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Liverpool Walton": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Birmingham Perry Barr": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Dudley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Wallasey": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Stockton West": { "pct": 0.013, "num": 1, "rev": 2000 }
+}
diff --git a/app/public/assets/posts/uk-mansion-tax/impact_data_combined.json b/app/public/assets/posts/uk-mansion-tax/impact_data_combined.json
new file mode 100644
index 000000000..f0b6f6d52
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/impact_data_combined.json
@@ -0,0 +1,1140 @@
+{
+ "1.5m": {
+ "Cities of London and Westminster": { "pct": 6.691, "num": 929, "rev": 1858000 },
+ "Kensington and Bayswater": { "pct": 5.452, "num": 757, "rev": 1514000 },
+ "Chelsea and Fulham": { "pct": 4.163, "num": 578, "rev": 1156000 },
+ "Hampstead and Highgate": { "pct": 2.737, "num": 380, "rev": 760000 },
+ "Battersea": { "pct": 2.226, "num": 309, "rev": 618000 },
+ "Richmond Park": { "pct": 2.024, "num": 281, "rev": 562000 },
+ "Islington South and Finsbury": { "pct": 1.743, "num": 242, "rev": 484000 },
+ "Hammersmith and Chiswick": { "pct": 1.721, "num": 239, "rev": 478000 },
+ "Holborn and St Pancras": { "pct": 1.462, "num": 203, "rev": 406000 },
+ "Finchley and Golders Green": { "pct": 1.332, "num": 185, "rev": 370000 },
+ "Ealing Central and Acton": { "pct": 1.217, "num": 169, "rev": 338000 },
+ "Runnymede and Weybridge": { "pct": 1.21, "num": 168, "rev": 336000 },
+ "Wimbledon": { "pct": 1.116, "num": 155, "rev": 310000 },
+ "Queen's Park and Maida Vale": { "pct": 1.109, "num": 154, "rev": 308000 },
+ "Esher and Walton": { "pct": 1.095, "num": 152, "rev": 304000 },
+ "Hornsey and Friern Barnet": { "pct": 1.03, "num": 143, "rev": 286000 },
+ "Twickenham": { "pct": 0.965, "num": 134, "rev": 268000 },
+ "Windsor": { "pct": 0.936, "num": 130, "rev": 260000 },
+ "Putney": { "pct": 0.893, "num": 124, "rev": 248000 },
+ "Harpenden and Berkhamsted": { "pct": 0.864, "num": 120, "rev": 240000 },
+ "Tooting": { "pct": 0.857, "num": 119, "rev": 238000 },
+ "Dulwich and West Norwood": { "pct": 0.821, "num": 114, "rev": 228000 },
+ "Chesham and Amersham": { "pct": 0.792, "num": 110, "rev": 220000 },
+ "Beaconsfield": { "pct": 0.771, "num": 107, "rev": 214000 },
+ "Islington North": { "pct": 0.72, "num": 100, "rev": 200000 },
+ "Reigate": { "pct": 0.634, "num": 88, "rev": 176000 },
+ "Hackney South and Shoreditch": { "pct": 0.619, "num": 86, "rev": 172000 },
+ "Winchester": { "pct": 0.583, "num": 81, "rev": 162000 },
+ "Hertsmere": { "pct": 0.576, "num": 80, "rev": 160000 },
+ "Sevenoaks": { "pct": 0.569, "num": 79, "rev": 158000 },
+ "Guildford": { "pct": 0.569, "num": 79, "rev": 158000 },
+ "Maidenhead": { "pct": 0.555, "num": 77, "rev": 154000 },
+ "Bath": { "pct": 0.547, "num": 76, "rev": 152000 },
+ "South West Hertfordshire": { "pct": 0.54, "num": 75, "rev": 150000 },
+ "North Cotswolds": { "pct": 0.526, "num": 73, "rev": 146000 },
+ "Clapham and Brixton Hill": { "pct": 0.519, "num": 72, "rev": 144000 },
+ "Godalming and Ash": { "pct": 0.504, "num": 70, "rev": 140000 },
+ "Hackney North and Stoke Newington": { "pct": 0.49, "num": 68, "rev": 136000 },
+ "Oxford West and Abingdon": { "pct": 0.483, "num": 67, "rev": 134000 },
+ "Arundel and South Downs": { "pct": 0.483, "num": 67, "rev": 134000 },
+ "Tatton": { "pct": 0.483, "num": 67, "rev": 134000 },
+ "Poole": { "pct": 0.468, "num": 65, "rev": 130000 },
+ "Epping Forest": { "pct": 0.468, "num": 65, "rev": 130000 },
+ "Woking": { "pct": 0.439, "num": 61, "rev": 122000 },
+ "Henley and Thame": { "pct": 0.425, "num": 59, "rev": 118000 },
+ "Chipping Barnet": { "pct": 0.411, "num": 57, "rev": 114000 },
+ "St Albans": { "pct": 0.411, "num": 57, "rev": 114000 },
+ "Farnham and Bordon": { "pct": 0.411, "num": 57, "rev": 114000 },
+ "Hove and Portslade": { "pct": 0.396, "num": 55, "rev": 110000 },
+ "Brentwood and Ongar": { "pct": 0.396, "num": 55, "rev": 110000 },
+ "Vauxhall and Camberwell Green": { "pct": 0.375, "num": 52, "rev": 104000 },
+ "Bermondsey and Old Southwark": { "pct": 0.375, "num": 52, "rev": 104000 },
+ "Greenwich and Woolwich": { "pct": 0.353, "num": 49, "rev": 98000 },
+ "Dorking and Horley": { "pct": 0.353, "num": 49, "rev": 98000 },
+ "Lewisham West and East Dulwich": { "pct": 0.346, "num": 48, "rev": 96000 },
+ "Brent East": { "pct": 0.346, "num": 48, "rev": 96000 },
+ "Banbury": { "pct": 0.346, "num": 48, "rev": 96000 },
+ "Tunbridge Wells": { "pct": 0.339, "num": 47, "rev": 94000 },
+ "Hendon": { "pct": 0.331, "num": 46, "rev": 92000 },
+ "East Hampshire": { "pct": 0.331, "num": 46, "rev": 92000 },
+ "Chichester": { "pct": 0.324, "num": 45, "rev": 90000 },
+ "Southgate and Wood Green": { "pct": 0.324, "num": 45, "rev": 90000 },
+ "South Cotswolds": { "pct": 0.324, "num": 45, "rev": 90000 },
+ "Poplar and Limehouse": { "pct": 0.317, "num": 44, "rev": 88000 },
+ "Cambridge": { "pct": 0.317, "num": 44, "rev": 88000 },
+ "New Forest East": { "pct": 0.317, "num": 44, "rev": 88000 },
+ "Altrincham and Sale West": { "pct": 0.31, "num": 43, "rev": 86000 },
+ "Kingston and Surbiton": { "pct": 0.295, "num": 41, "rev": 82000 },
+ "Bromley and Biggin Hill": { "pct": 0.295, "num": 41, "rev": 82000 },
+ "East Surrey": { "pct": 0.295, "num": 41, "rev": 82000 },
+ "Newbury": { "pct": 0.288, "num": 40, "rev": 80000 },
+ "Ruislip, Northwood and Pinner": { "pct": 0.288, "num": 40, "rev": 80000 },
+ "Wycombe": { "pct": 0.288, "num": 40, "rev": 80000 },
+ "Reading Central": { "pct": 0.266, "num": 37, "rev": 74000 },
+ "Streatham and Croydon North": { "pct": 0.266, "num": 37, "rev": 74000 },
+ "Epsom and Ewell": { "pct": 0.259, "num": 36, "rev": 72000 },
+ "East Grinstead and Uckfield": { "pct": 0.259, "num": 36, "rev": 72000 },
+ "Reading West and Mid Berkshire": { "pct": 0.259, "num": 36, "rev": 72000 },
+ "Eltham and Chislehurst": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "North East Hampshire": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "Manchester Central": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "Leyton and Wanstead": { "pct": 0.252, "num": 35, "rev": 70000 },
+ "South Devon": { "pct": 0.245, "num": 34, "rev": 68000 },
+ "Mid Buckinghamshire": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "New Forest West": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "Lewisham North": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "Wokingham": { "pct": 0.238, "num": 33, "rev": 66000 },
+ "South Cambridgeshire": { "pct": 0.23, "num": 32, "rev": 64000 },
+ "Cheltenham": { "pct": 0.23, "num": 32, "rev": 64000 },
+ "Bristol Central": { "pct": 0.23, "num": 32, "rev": 64000 },
+ "Witney": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "North Cornwall": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "Mid Sussex": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "Romsey and Southampton North": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "Welwyn Hatfield": { "pct": 0.223, "num": 31, "rev": 62000 },
+ "North West Essex": { "pct": 0.216, "num": 30, "rev": 60000 },
+ "Stratford-on-Avon": { "pct": 0.209, "num": 29, "rev": 58000 },
+ "Sussex Weald": { "pct": 0.209, "num": 29, "rev": 58000 },
+ "Truro and Falmouth": { "pct": 0.209, "num": 29, "rev": 58000 },
+ "Ealing Southall": { "pct": 0.202, "num": 28, "rev": 56000 },
+ "Meriden and Solihull East": { "pct": 0.202, "num": 28, "rev": 56000 },
+ "North East Hertfordshire": { "pct": 0.194, "num": 27, "rev": 54000 },
+ "Birmingham Ladywood": { "pct": 0.194, "num": 27, "rev": 54000 },
+ "Tonbridge": { "pct": 0.194, "num": 27, "rev": 54000 },
+ "Salisbury": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "York Central": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Bethnal Green and Stepney": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Harrow East": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Surrey Heath": { "pct": 0.187, "num": 26, "rev": 52000 },
+ "Wetherby and Easingwold": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "Beckenham and Penge": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "North West Hampshire": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "Kenilworth and Southam": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "Daventry": { "pct": 0.18, "num": 25, "rev": 50000 },
+ "South Northamptonshire": { "pct": 0.173, "num": 24, "rev": 48000 },
+ "Croydon West": { "pct": 0.173, "num": 24, "rev": 48000 },
+ "East Wiltshire": { "pct": 0.173, "num": 24, "rev": 48000 },
+ "Frome and East Somerset": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Croydon South": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Didcot and Wantage": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Edmonton and Winchmore Hill": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Exeter": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Horsham": { "pct": 0.166, "num": 23, "rev": 46000 },
+ "Harrogate and Knaresborough": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Macclesfield": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Rutland and Stamford": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Cardiff South and Penarth": { "pct": 0.158, "num": 22, "rev": 44000 },
+ "Basildon and Billericay": { "pct": 0.151, "num": 21, "rev": 42000 },
+ "Peckham": { "pct": 0.151, "num": 21, "rev": 42000 },
+ "Canterbury": { "pct": 0.151, "num": 21, "rev": 42000 },
+ "Liverpool Riverside": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Tottenham": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Enfield North": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Exmouth and Exeter East": { "pct": 0.144, "num": 20, "rev": 40000 },
+ "Watford": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Luton South and South Bedfordshire": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Hitchin": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Hertford and Stortford": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Salford": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Bristol North West": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Bicester and Woodstock": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Chingford and Woodford Green": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "Hamble Valley": { "pct": 0.137, "num": 19, "rev": 38000 },
+ "North West Norfolk": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Maldon": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Hornchurch and Upminster": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Newcastle upon Tyne Central and West": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Droitwich and Evesham": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Warwick and Leamington": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Orpington": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Stretford and Urmston": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "North Somerset": { "pct": 0.13, "num": 18, "rev": 36000 },
+ "Tewkesbury": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Bury St Edmunds and Stowmarket": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Sutton and Cheam": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Lewes": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Oxford East": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Westmorland and Lonsdale": { "pct": 0.122, "num": 17, "rev": 34000 },
+ "Ely and East Cambridgeshire": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Eastbourne": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Skipton and Ripon": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Sheffield Central": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Hemel Hempstead": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Spelthorne": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Tamworth": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Wells and Mendip Hills": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Bexhill and Battle": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "St Austell and Newquay": { "pct": 0.115, "num": 16, "rev": 32000 },
+ "Leeds South": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Honiton and Sidmouth": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "West Dorset": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Manchester Rusholme": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Knowsley": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "South Dorset": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "St Ives": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Buckingham and Bletchley": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "North Northumberland": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Rushcliffe": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Broxbourne": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Ealing North": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Bromsgrove": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Brighton Pavilion": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Christchurch": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "North Devon": { "pct": 0.108, "num": 15, "rev": 30000 },
+ "Bournemouth West": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Loughborough": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Chester South and Eddisbury": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Weald of Kent": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "South West Norfolk": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Brentford and Isleworth": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Stratford and Bow": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Manchester Withington": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Mid Bedfordshire": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "South Suffolk": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Milton Keynes North": { "pct": 0.101, "num": 14, "rev": 28000 },
+ "Stourbridge": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "West Lancashire": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Braintree": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Leeds Central and Headingley": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Keighley and Ilkley": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Harlow": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Chelmsford": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Suffolk Coastal": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Isle of Wight West": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Isle of Wight East": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Romford": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Worcester": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Stroud": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Thirsk and Malton": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Nottingham South": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Nottingham East": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Melton and Syston": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Sutton Coldfield": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "North West Cambridgeshire": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Glastonbury and Somerton": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Melksham and Devizes": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Fylde": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Thornbury and Yate": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Coventry East": { "pct": 0.094, "num": 13, "rev": 26000 },
+ "Tiverton and Minehead": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Hexham": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Ashford": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Telford": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Hayes and Harlington": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "North Herefordshire": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "North Dorset": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Cheadle": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Scarborough and Whitby": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Torbay": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Birmingham Edgbaston": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Lewisham East": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Camborne and Redruth": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Neath and Swansea East": { "pct": 0.086, "num": 12, "rev": 24000 },
+ "Thurrock": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Mid Leicestershire": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Newcastle-under-Lyme": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Wirral West": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "North Norfolk": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Northampton North": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Leicester South": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Witham": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "York Outer": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Aylesbury": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Central Devon": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Harrow West": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Dartford": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Doncaster Central": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Corby and East Northamptonshire": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Gower": { "pct": 0.079, "num": 11, "rev": 22000 },
+ "Rugby": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Richmond and Northallerton": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "St Neots and Mid Cambridgeshire": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Ribble Valley": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Walthamstow": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Rayleigh and Wickford": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Portsmouth South": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Brecon, Radnor and Cwm Tawe": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Gloucester": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Peterborough": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Bognor Regis and Littlehampton": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Sittingbourne and Sheppey": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Congleton": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Broadland and Fakenham": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Filton and Bradley Stoke": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Bury South": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Hereford and South Herefordshire": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "West Worcestershire": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Yeovil": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Mid Dorset and North Poole": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Newcastle upon Tyne North": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Newark": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Wyre Forest": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Huntingdon": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Worthing West": { "pct": 0.072, "num": 10, "rev": 20000 },
+ "Earley and Woodley": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Shrewsbury": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Chester North and Neston": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Central Suffolk and North Ipswich": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "North West Leicestershire": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "North Bedfordshire": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Dover and Deal": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Derbyshire Dales": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Solihull West and Shirley": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Hinckley and Bosworth": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Bracknell": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Southend East and Rochford": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "South Ribble": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Brent West": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Stockport": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Gravesham": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Hastings and Rye": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "South West Wiltshire": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Ashfield": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Herne Bay and Sandwich": { "pct": 0.065, "num": 9, "rev": 18000 },
+ "Widnes and Halewood": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Basingstoke": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bassetlaw": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Oldham West, Chadderton and Royton": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bedford": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Birmingham Erdington": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Worsley and Eccles": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "North Shropshire": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Waveney Valley": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Crawley": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "South East Cornwall": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Washington and Gateshead South": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Wakefield and Rothwell": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Torridge and Tavistock": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Portsmouth North": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Stafford": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "St Helens North": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Rossendale and Darwen": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bristol East": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Southampton Itchen": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Sheffield Hallam": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Bristol South": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Milton Keynes Central": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "South West Devon": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Monmouthshire": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Rochester and Strood": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Aberafan Maesteg": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Heywood and Middleton North": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Maidstone and Malling": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Llanelli": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Mid Norfolk": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Feltham and Heston": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Lichfield": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Harborough, Oadby and Wigston": { "pct": 0.058, "num": 8, "rev": 16000 },
+ "Mansfield": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Stevenage": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Plymouth Sutton and Devonport": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Brighton Kemptown and Peacehaven": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Southampton Test": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Broxtowe": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "South Leicestershire": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Cardiff West": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Sheffield South East": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Swindon South": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Redditch": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Clwyd North": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Penrith and Solway": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Makerfield": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Bradford South": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Pontefract, Castleford and Knottingley": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Bolsover": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "East Thanet": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Mid and South Pembrokeshire": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Wrexham": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Mid Derbyshire": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Normanton and Hemsworth": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Newport East": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Ilford North": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Wolverhampton West": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Dunstable and Leighton Buzzard": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Ilford South": { "pct": 0.05, "num": 7, "rev": 14000 },
+ "Kingswinford and South Staffordshire": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Carlisle": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Sefton Central": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Cardiff North": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Chippenham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Runcorn and Helsby": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Barking": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Clacton": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Wythenshawe and Sale East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Sheffield Heeley": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Slough": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Lincoln": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leicester West": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Halesowen": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Bridgwater": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Birmingham Selly Oak": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leeds North East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Uxbridge and South Ruislip": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Grantham and Bourne": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Vale of Glamorgan": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Sleaford and North Hykeham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Warrington South": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Burton and Uttoxeter": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Bury North": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "South Basildon and East Thurrock": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Wigan": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Bradford East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leeds North West": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Middlesbrough and Thornaby East": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Gorton and Denton": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "North East Somerset and Hanham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "East Worthing and Shoreham": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Erith and Thamesmead": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Derby North": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Derby South": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Nuneaton": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Pendle and Clitheroe": { "pct": 0.043, "num": 6, "rev": 12000 },
+ "Leeds East": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Caerfyrddin": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Havant": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Harwich and North Essex": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "West Suffolk": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Sheffield Brightside and Hillsborough": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Birkenhead": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Nottingham North and Kimberley": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Wellingborough and Rushden": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "North East Derbyshire": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Walsall and Bloxwich": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Tynemouth": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Swindon North": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "South Derbyshire": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "South Shropshire": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Old Bexley and Sidcup": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Stoke-on-Trent South": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Taunton and Wellington": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Stoke-on-Trent Central": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Doncaster East and the Isle of Axholme": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Bournemouth East": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Leicester East": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Halifax": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Lancaster and Wyre": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Preston": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Chorley": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Bangor Aberconwy": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Chatham and Aylesford": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Carshalton and Wallington": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Morecambe and Lunesdale": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Mitcham and Morden": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Rochdale": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Louth and Horncastle": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Ynys M\u00f4n": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Alyn and Deeside": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Folkestone and Hythe": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Huddersfield": { "pct": 0.036, "num": 5, "rev": 10000 },
+ "Easington": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bristol North East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Southport": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Doncaster North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Forest of Dean": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bolton South and Walkden": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Rhondda and Ogmore": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Kingston upon Hull West and Haltemprice": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "St Helens South and Whiston": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bolton West": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Amber Valley": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Staffordshire Moorlands": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Merthyr Tydfil and Aberdare": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Boston and Skegness": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Stoke-on-Trent North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Stone, Great Wyrley and Penkridge": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Sunderland Central": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bradford West": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Darlington": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Wolverhampton South East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Newport West and Islwyn": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Luton North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Hartlepool": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Newcastle upon Tyne East and Wallsend": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Kettering": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Gillingham and Rainham": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Jarrow and Gateshead East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Warrington North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Smethwick": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Eastleigh": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Faversham and Mid Kent": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Dwyfor Meirionnydd": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Bishop Auckland": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Croydon East": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Blackburn": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "South Holland and The Deepings": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Kingston upon Hull North and Cottingham": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "South Norfolk": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Burnley": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Weston-super-Mare": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Hazel Grove": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "Barnsley North": { "pct": 0.029, "num": 4, "rev": 8000 },
+ "West Ham and Beckton": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Ipswich": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Erewash": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Torfaen": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Swansea West": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Birmingham Hodge Hill and Solihull North": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Houghton and Sunderland South": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Blaenau Gwent and Rhymney": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Newton Abbot": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Blaydon and Consett": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Tipton and Wednesbury": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Whitehaven and Workington": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Plymouth Moor View": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Caerphilly": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Colne Valley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Cardiff East": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Dagenham and Rainham": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Aldershot": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Oldham East and Saddleworth": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Ossett and Denby Dale": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "North Warwickshire and Bedworth": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Goole and Pocklington": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Rother Valley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Coventry South": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Sherwood Forest": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Scunthorpe": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Chesterfield": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Leeds South West and Morley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Shipley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Rawmarsh and Conisbrough": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Bridlington and The Wolds": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Stalybridge and Hyde": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Northampton South": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Colchester": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Gainsborough": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Penistone and Stocksbridge": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Dewsbury and Batley": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Liverpool Garston": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Crewe and Nantwich": { "pct": 0.022, "num": 3, "rev": 6000 },
+ "Birmingham Hall Green and Moseley": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "West Bromwich": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Calder Valley": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Bridgend": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Liverpool Wavertree": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Norwich South": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Barrow and Furness": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "High Peak": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Lowestoft": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Gedling": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "East Ham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "City of Durham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Clwyd East": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Rotherham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Birmingham Northfield": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Leigh and Atherton": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Ellesmere Port and Bromborough": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blyth and Ashington": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Norwich North": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blackpool South": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blackpool North and Fleetwood": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Blackley and Middleton South": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Bolton North East": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Fareham and Waterlooville": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Spen Valley": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Southend West and Leigh": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Brigg and Immingham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Bootle": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Cramlington and Killingworth": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Great Yarmouth": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Kingston upon Hull East": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Stockton North": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "North Durham": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "The Wrekin": { "pct": 0.014, "num": 2, "rev": 4000 },
+ "Gateshead Central and Whickham": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Hyndburn": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Redcar": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Leeds West and Pudsey": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Wolverhampton North East": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Ashton-under-Lyne": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "North East Cambridgeshire": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Ceredigion Preseli": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Barnsley South": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Gosport": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Middlesbrough South and East Cleveland": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Birmingham Yardley": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Coventry North West": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Selby": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Cannock Chase": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Beverley and Holderness": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Bexleyheath and Crayford": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Newton Aycliffe and Spennymoor": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Liverpool Walton": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Birmingham Perry Barr": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Dudley": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Wallasey": { "pct": 0.007, "num": 1, "rev": 2000 },
+ "Stockton West": { "pct": 0.007, "num": 1, "rev": 2000 }
+ },
+ "2m": {
+ "Cities of London and Westminster": { "pct": 9.453, "num": 742, "rev": 1484000 },
+ "Kensington and Bayswater": { "pct": 7.045, "num": 553, "rev": 1106000 },
+ "Chelsea and Fulham": { "pct": 4.638, "num": 364, "rev": 728000 },
+ "Hampstead and Highgate": { "pct": 3.019, "num": 237, "rev": 474000 },
+ "Battersea": { "pct": 1.669, "num": 131, "rev": 262000 },
+ "Richmond Park": { "pct": 1.873, "num": 147, "rev": 294000 },
+ "Islington South and Finsbury": { "pct": 1.745, "num": 137, "rev": 274000 },
+ "Hammersmith and Chiswick": { "pct": 1.567, "num": 123, "rev": 246000 },
+ "Holborn and St Pancras": { "pct": 1.72, "num": 135, "rev": 270000 },
+ "Finchley and Golders Green": { "pct": 1.363, "num": 107, "rev": 214000 },
+ "Ealing Central and Acton": { "pct": 0.956, "num": 75, "rev": 150000 },
+ "Runnymede and Weybridge": { "pct": 1.249, "num": 98, "rev": 196000 },
+ "Wimbledon": { "pct": 1.121, "num": 88, "rev": 176000 },
+ "Queen's Park and Maida Vale": { "pct": 1.096, "num": 86, "rev": 172000 },
+ "Esher and Walton": { "pct": 0.956, "num": 75, "rev": 150000 },
+ "Hornsey and Friern Barnet": { "pct": 0.612, "num": 48, "rev": 96000 },
+ "Twickenham": { "pct": 0.675, "num": 53, "rev": 106000 },
+ "Windsor": { "pct": 1.006, "num": 79, "rev": 158000 },
+ "Putney": { "pct": 0.573, "num": 45, "rev": 90000 },
+ "Harpenden and Berkhamsted": { "pct": 0.701, "num": 55, "rev": 110000 },
+ "Tooting": { "pct": 0.701, "num": 55, "rev": 110000 },
+ "Dulwich and West Norwood": { "pct": 0.624, "num": 49, "rev": 98000 },
+ "Chesham and Amersham": { "pct": 0.688, "num": 54, "rev": 108000 },
+ "Beaconsfield": { "pct": 0.624, "num": 49, "rev": 98000 },
+ "Islington North": { "pct": 0.51, "num": 40, "rev": 80000 },
+ "Reigate": { "pct": 0.395, "num": 31, "rev": 62000 },
+ "Hackney South and Shoreditch": { "pct": 0.586, "num": 46, "rev": 92000 },
+ "Winchester": { "pct": 0.408, "num": 32, "rev": 64000 },
+ "Hertsmere": { "pct": 0.561, "num": 44, "rev": 88000 },
+ "Sevenoaks": { "pct": 0.395, "num": 31, "rev": 62000 },
+ "Guildford": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Maidenhead": { "pct": 0.535, "num": 42, "rev": 84000 },
+ "Bath": { "pct": 0.446, "num": 35, "rev": 70000 },
+ "South West Hertfordshire": { "pct": 0.484, "num": 38, "rev": 76000 },
+ "North Cotswolds": { "pct": 0.484, "num": 38, "rev": 76000 },
+ "Clapham and Brixton Hill": { "pct": 0.382, "num": 30, "rev": 60000 },
+ "Godalming and Ash": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Hackney North and Stoke Newington": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Oxford West and Abingdon": { "pct": 0.497, "num": 39, "rev": 78000 },
+ "Arundel and South Downs": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Tatton": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Poole": { "pct": 0.408, "num": 32, "rev": 64000 },
+ "Epping Forest": { "pct": 0.433, "num": 34, "rev": 68000 },
+ "Woking": { "pct": 0.344, "num": 27, "rev": 54000 },
+ "Henley and Thame": { "pct": 0.382, "num": 30, "rev": 60000 },
+ "Chipping Barnet": { "pct": 0.319, "num": 25, "rev": 50000 },
+ "St Albans": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Farnham and Bordon": { "pct": 0.357, "num": 28, "rev": 56000 },
+ "Hove and Portslade": { "pct": 0.28, "num": 22, "rev": 44000 },
+ "Brentwood and Ongar": { "pct": 0.344, "num": 27, "rev": 54000 },
+ "Vauxhall and Camberwell Green": { "pct": 0.408, "num": 32, "rev": 64000 },
+ "Bermondsey and Old Southwark": { "pct": 0.459, "num": 36, "rev": 72000 },
+ "Greenwich and Woolwich": { "pct": 0.357, "num": 28, "rev": 56000 },
+ "Dorking and Horley": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Lewisham West and East Dulwich": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Brent East": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Banbury": { "pct": 0.42, "num": 33, "rev": 66000 },
+ "Tunbridge Wells": { "pct": 0.242, "num": 19, "rev": 38000 },
+ "Hendon": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "East Hampshire": { "pct": 0.319, "num": 25, "rev": 50000 },
+ "Chichester": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "Southgate and Wood Green": { "pct": 0.293, "num": 23, "rev": 46000 },
+ "South Cotswolds": { "pct": 0.28, "num": 22, "rev": 44000 },
+ "Poplar and Limehouse": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "Cambridge": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "New Forest East": { "pct": 0.319, "num": 25, "rev": 50000 },
+ "Altrincham and Sale West": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Kingston and Surbiton": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Bromley and Biggin Hill": { "pct": 0.331, "num": 26, "rev": 52000 },
+ "East Surrey": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Newbury": { "pct": 0.331, "num": 26, "rev": 52000 },
+ "Ruislip, Northwood and Pinner": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "Wycombe": { "pct": 0.331, "num": 26, "rev": 52000 },
+ "Reading Central": { "pct": 0.357, "num": 28, "rev": 56000 },
+ "Streatham and Croydon North": { "pct": 0.255, "num": 20, "rev": 40000 },
+ "Epsom and Ewell": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "East Grinstead and Uckfield": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Reading West and Mid Berkshire": { "pct": 0.28, "num": 22, "rev": 44000 },
+ "Eltham and Chislehurst": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "North East Hampshire": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Manchester Central": { "pct": 0.395, "num": 31, "rev": 62000 },
+ "Leyton and Wanstead": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "South Devon": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Mid Buckinghamshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "New Forest West": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Lewisham North": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Wokingham": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "South Cambridgeshire": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Cheltenham": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Bristol Central": { "pct": 0.293, "num": 23, "rev": 46000 },
+ "Witney": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "North Cornwall": { "pct": 0.268, "num": 21, "rev": 42000 },
+ "Mid Sussex": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "Romsey and Southampton North": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Welwyn Hatfield": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "North West Essex": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Stratford-on-Avon": { "pct": 0.229, "num": 18, "rev": 36000 },
+ "Sussex Weald": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Truro and Falmouth": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Ealing Southall": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Meriden and Solihull East": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "North East Hertfordshire": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Birmingham Ladywood": { "pct": 0.306, "num": 24, "rev": 48000 },
+ "Tonbridge": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Salisbury": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "York Central": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Bethnal Green and Stepney": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Harrow East": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Surrey Heath": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Wetherby and Easingwold": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Beckenham and Penge": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "North West Hampshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Kenilworth and Southam": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Daventry": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "South Northamptonshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Croydon West": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "East Wiltshire": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Frome and East Somerset": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Croydon South": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Didcot and Wantage": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Edmonton and Winchmore Hill": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Exeter": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Horsham": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Harrogate and Knaresborough": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Macclesfield": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Rutland and Stamford": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Cardiff South and Penarth": { "pct": 0.242, "num": 19, "rev": 38000 },
+ "Basildon and Billericay": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Peckham": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Canterbury": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Liverpool Riverside": { "pct": 0.191, "num": 15, "rev": 30000 },
+ "Tottenham": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Enfield North": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Exmouth and Exeter East": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Watford": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Luton South and South Bedfordshire": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Hitchin": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Hertford and Stortford": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Salford": { "pct": 0.204, "num": 16, "rev": 32000 },
+ "Bristol North West": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bicester and Woodstock": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Chingford and Woodford Green": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Hamble Valley": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "North West Norfolk": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Maldon": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Hornchurch and Upminster": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Newcastle upon Tyne Central and West": { "pct": 0.217, "num": 17, "rev": 34000 },
+ "Droitwich and Evesham": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Warwick and Leamington": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Orpington": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Stretford and Urmston": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "North Somerset": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Tewkesbury": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bury St Edmunds and Stowmarket": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Sutton and Cheam": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Lewes": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Oxford East": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Westmorland and Lonsdale": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Ely and East Cambridgeshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Eastbourne": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "Skipton and Ripon": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Sheffield Central": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Hemel Hempstead": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Spelthorne": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Tamworth": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Wells and Mendip Hills": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bexhill and Battle": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "St Austell and Newquay": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Leeds South": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Honiton and Sidmouth": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "West Dorset": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Manchester Rusholme": { "pct": 0.166, "num": 13, "rev": 26000 },
+ "Knowsley": { "pct": 0.178, "num": 14, "rev": 28000 },
+ "South Dorset": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "St Ives": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Buckingham and Bletchley": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "North Northumberland": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Rushcliffe": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Broxbourne": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Ealing North": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bromsgrove": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Brighton Pavilion": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Christchurch": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "North Devon": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bournemouth West": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Loughborough": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Chester South and Eddisbury": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Weald of Kent": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "South West Norfolk": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Brentford and Isleworth": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Stratford and Bow": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Manchester Withington": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Mid Bedfordshire": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "South Suffolk": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Milton Keynes North": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Stourbridge": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "West Lancashire": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Braintree": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Leeds Central and Headingley": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Keighley and Ilkley": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Harlow": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Chelmsford": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Suffolk Coastal": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Isle of Wight West": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Isle of Wight East": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Romford": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Worcester": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Stroud": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Thirsk and Malton": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Nottingham South": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Nottingham East": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Melton and Syston": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Sutton Coldfield": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "North West Cambridgeshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Glastonbury and Somerton": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Melksham and Devizes": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Fylde": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Thornbury and Yate": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Coventry East": { "pct": 0.153, "num": 12, "rev": 24000 },
+ "Tiverton and Minehead": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Hexham": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Ashford": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Telford": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Hayes and Harlington": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "North Herefordshire": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "North Dorset": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Cheadle": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Scarborough and Whitby": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Torbay": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Birmingham Edgbaston": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Lewisham East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Camborne and Redruth": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Neath and Swansea East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Thurrock": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Mid Leicestershire": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Newcastle-under-Lyme": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Wirral West": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "North Norfolk": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Northampton North": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Leicester South": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Witham": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "York Outer": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Aylesbury": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Central Devon": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Harrow West": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Dartford": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Doncaster Central": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Corby and East Northamptonshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Gower": { "pct": 0.14, "num": 11, "rev": 22000 },
+ "Rugby": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Richmond and Northallerton": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "St Neots and Mid Cambridgeshire": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Ribble Valley": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Walthamstow": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Rayleigh and Wickford": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Portsmouth South": { "pct": 0.127, "num": 10, "rev": 20000 },
+ "Brecon, Radnor and Cwm Tawe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Gloucester": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Peterborough": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Bognor Regis and Littlehampton": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Sittingbourne and Sheppey": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Congleton": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Broadland and Fakenham": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Filton and Bradley Stoke": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bury South": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Hereford and South Herefordshire": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "West Worcestershire": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Yeovil": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Mid Dorset and North Poole": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Newcastle upon Tyne North": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Newark": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Wyre Forest": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Huntingdon": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Worthing West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Earley and Woodley": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Shrewsbury": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Chester North and Neston": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Central Suffolk and North Ipswich": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "North West Leicestershire": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "North Bedfordshire": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Dover and Deal": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Derbyshire Dales": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Solihull West and Shirley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Hinckley and Bosworth": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Bracknell": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Southend East and Rochford": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Ribble": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Brent West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Stockport": { "pct": 0.115, "num": 9, "rev": 18000 },
+ "Gravesham": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Hastings and Rye": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South West Wiltshire": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Ashfield": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Herne Bay and Sandwich": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Widnes and Halewood": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Basingstoke": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bassetlaw": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Oldham West, Chadderton and Royton": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Bedford": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Birmingham Erdington": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Worsley and Eccles": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "North Shropshire": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Waveney Valley": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Crawley": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "South East Cornwall": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Washington and Gateshead South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Wakefield and Rothwell": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Torridge and Tavistock": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Portsmouth North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Stafford": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "St Helens North": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Rossendale and Darwen": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Bristol East": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Southampton Itchen": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Sheffield Hallam": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bristol South": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Milton Keynes Central": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "South West Devon": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Monmouthshire": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Rochester and Strood": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Aberafan Maesteg": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Heywood and Middleton North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Maidstone and Malling": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Llanelli": { "pct": 0.102, "num": 8, "rev": 16000 },
+ "Mid Norfolk": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Feltham and Heston": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "Lichfield": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Harborough, Oadby and Wigston": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Mansfield": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Stevenage": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Plymouth Sutton and Devonport": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Brighton Kemptown and Peacehaven": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Southampton Test": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Broxtowe": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "South Leicestershire": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Cardiff West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Sheffield South East": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Swindon South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Redditch": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Clwyd North": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Penrith and Solway": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Makerfield": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bradford South": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Pontefract, Castleford and Knottingley": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bolsover": { "pct": 0.089, "num": 7, "rev": 14000 },
+ "East Thanet": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Mid and South Pembrokeshire": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Wrexham": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Mid Derbyshire": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Normanton and Hemsworth": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Newport East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Ilford North": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Wolverhampton West": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Dunstable and Leighton Buzzard": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Ilford South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Kingswinford and South Staffordshire": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Carlisle": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Sefton Central": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Cardiff North": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Chippenham": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Runcorn and Helsby": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Barking": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Clacton": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Wythenshawe and Sale East": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Sheffield Heeley": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Slough": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Lincoln": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Leicester West": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Halesowen": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bridgwater": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Birmingham Selly Oak": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Leeds North East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Uxbridge and South Ruislip": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Grantham and Bourne": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Vale of Glamorgan": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sleaford and North Hykeham": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Warrington South": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Burton and Uttoxeter": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Bury North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Basildon and East Thurrock": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Wigan": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bradford East": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Leeds North West": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Middlesbrough and Thornaby East": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Gorton and Denton": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "North East Somerset and Hanham": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "East Worthing and Shoreham": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Erith and Thamesmead": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Derby North": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Derby South": { "pct": 0.076, "num": 6, "rev": 12000 },
+ "Nuneaton": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Pendle and Clitheroe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Leeds East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Caerfyrddin": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Havant": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Harwich and North Essex": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "West Suffolk": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sheffield Brightside and Hillsborough": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Birkenhead": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Nottingham North and Kimberley": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Wellingborough and Rushden": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "North East Derbyshire": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Walsall and Bloxwich": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Tynemouth": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Swindon North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "South Derbyshire": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Shropshire": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Old Bexley and Sidcup": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Stoke-on-Trent South": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Taunton and Wellington": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stoke-on-Trent Central": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Doncaster East and the Isle of Axholme": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bournemouth East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Leicester East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Halifax": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Lancaster and Wyre": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Preston": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Chorley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bangor Aberconwy": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Chatham and Aylesford": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Carshalton and Wallington": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Morecambe and Lunesdale": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Mitcham and Morden": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Rochdale": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Louth and Horncastle": { "pct": 0.064, "num": 5, "rev": 10000 },
+ "Ynys M\u00f4n": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Alyn and Deeside": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Folkestone and Hythe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Huddersfield": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Easington": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Bristol North East": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Southport": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Doncaster North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Forest of Dean": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bolton South and Walkden": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Rhondda and Ogmore": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Kingston upon Hull West and Haltemprice": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "St Helens South and Whiston": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bolton West": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Amber Valley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Staffordshire Moorlands": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Merthyr Tydfil and Aberdare": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Boston and Skegness": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stoke-on-Trent North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stone, Great Wyrley and Penkridge": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sunderland Central": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bradford West": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Darlington": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Wolverhampton South East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Newport West and Islwyn": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Luton North": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Hartlepool": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Newcastle upon Tyne East and Wallsend": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Kettering": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Gillingham and Rainham": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Jarrow and Gateshead East": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Warrington North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Smethwick": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Eastleigh": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Faversham and Mid Kent": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Dwyfor Meirionnydd": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Bishop Auckland": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Croydon East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Blackburn": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "South Holland and The Deepings": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Kingston upon Hull North and Cottingham": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "South Norfolk": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Burnley": { "pct": 0.051, "num": 4, "rev": 8000 },
+ "Weston-super-Mare": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Hazel Grove": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Barnsley North": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "West Ham and Beckton": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Ipswich": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Erewash": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Torfaen": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Swansea West": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Birmingham Hodge Hill and Solihull North": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Houghton and Sunderland South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blaenau Gwent and Rhymney": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Newton Abbot": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Blaydon and Consett": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Tipton and Wednesbury": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Whitehaven and Workington": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Plymouth Moor View": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Caerphilly": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Colne Valley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Cardiff East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Dagenham and Rainham": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Aldershot": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Oldham East and Saddleworth": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Ossett and Denby Dale": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "North Warwickshire and Bedworth": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Goole and Pocklington": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Rother Valley": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Coventry South": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Sherwood Forest": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Scunthorpe": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Chesterfield": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Leeds South West and Morley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Shipley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Rawmarsh and Conisbrough": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bridlington and The Wolds": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Stalybridge and Hyde": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Northampton South": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Colchester": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Gainsborough": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Penistone and Stocksbridge": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Dewsbury and Batley": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Liverpool Garston": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Crewe and Nantwich": { "pct": 0.038, "num": 3, "rev": 6000 },
+ "Birmingham Hall Green and Moseley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "West Bromwich": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Calder Valley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Bridgend": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Liverpool Wavertree": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Norwich South": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Barrow and Furness": { "pct": 0.0, "num": 0, "rev": 0 },
+ "High Peak": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Lowestoft": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Gedling": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "East Ham": { "pct": 0.0, "num": 0, "rev": 0 },
+ "City of Durham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Clwyd East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Rotherham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Birmingham Northfield": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Leigh and Atherton": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Ellesmere Port and Bromborough": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blyth and Ashington": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Norwich North": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blackpool South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Blackpool North and Fleetwood": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Blackley and Middleton South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bolton North East": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Fareham and Waterlooville": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Spen Valley": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Southend West and Leigh": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Brigg and Immingham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bootle": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Cramlington and Killingworth": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Great Yarmouth": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Kingston upon Hull East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Stockton North": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "North Durham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "The Wrekin": { "pct": 0.025, "num": 2, "rev": 4000 },
+ "Gateshead Central and Whickham": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Hyndburn": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Redcar": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Leeds West and Pudsey": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Wolverhampton North East": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Ashton-under-Lyne": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "North East Cambridgeshire": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Ceredigion Preseli": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Barnsley South": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Gosport": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Middlesbrough South and East Cleveland": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Birmingham Yardley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Coventry North West": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Selby": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Cannock Chase": { "pct": 0.0, "num": 0, "rev": 0 },
+ "Beverley and Holderness": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Bexleyheath and Crayford": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Newton Aycliffe and Spennymoor": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Liverpool Walton": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Birmingham Perry Barr": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Dudley": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Wallasey": { "pct": 0.013, "num": 1, "rev": 2000 },
+ "Stockton West": { "pct": 0.013, "num": 1, "rev": 2000 }
+ }
+}
diff --git a/app/public/assets/posts/uk-mansion-tax/mansion_tax_constituency_data.csv b/app/public/assets/posts/uk-mansion-tax/mansion_tax_constituency_data.csv
new file mode 100644
index 000000000..89e1dfb67
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/mansion_tax_constituency_data.csv
@@ -0,0 +1,568 @@
+constituency,properties_1.5m,revenue_1.5m,properties_2m,revenue_2m
+Cities of London and Westminster,929,1858000,742,1484000
+Kensington and Bayswater,757,1514000,553,1106000
+Chelsea and Fulham,578,1156000,364,728000
+Hampstead and Highgate,380,760000,237,474000
+Battersea,309,618000,131,262000
+Richmond Park,281,562000,147,294000
+Islington South and Finsbury,242,484000,137,274000
+Hammersmith and Chiswick,239,478000,123,246000
+Holborn and St Pancras,203,406000,135,270000
+Finchley and Golders Green,185,370000,107,214000
+Ealing Central and Acton,169,338000,75,150000
+Runnymede and Weybridge,168,336000,98,196000
+Wimbledon,155,310000,88,176000
+Queen's Park and Maida Vale,154,308000,86,172000
+Esher and Walton,152,304000,75,150000
+Hornsey and Friern Barnet,143,286000,48,96000
+Twickenham,134,268000,53,106000
+Windsor,130,260000,79,158000
+Putney,124,248000,45,90000
+Harpenden and Berkhamsted,120,240000,55,110000
+Tooting,119,238000,55,110000
+Dulwich and West Norwood,114,228000,49,98000
+Chesham and Amersham,110,220000,54,108000
+Beaconsfield,107,214000,49,98000
+Islington North,100,200000,40,80000
+Reigate,88,176000,31,62000
+Hackney South and Shoreditch,86,172000,46,92000
+Winchester,81,162000,32,64000
+Hertsmere,80,160000,44,88000
+Sevenoaks,79,158000,31,62000
+Guildford,79,158000,33,66000
+Maidenhead,77,154000,42,84000
+Bath,76,152000,35,70000
+South West Hertfordshire,75,150000,38,76000
+North Cotswolds,73,146000,38,76000
+Clapham and Brixton Hill,72,144000,30,60000
+Godalming and Ash,70,140000,33,66000
+Hackney North and Stoke Newington,68,136000,18,36000
+Oxford West and Abingdon,67,134000,39,78000
+Arundel and South Downs,67,134000,33,66000
+Tatton,67,134000,33,66000
+Poole,65,130000,32,64000
+Epping Forest,65,130000,34,68000
+Woking,61,122000,27,54000
+Henley and Thame,59,118000,30,60000
+Chipping Barnet,57,114000,25,50000
+St Albans,57,114000,21,42000
+Farnham and Bordon,57,114000,28,56000
+Hove and Portslade,55,110000,22,44000
+Brentwood and Ongar,55,110000,27,54000
+Vauxhall and Camberwell Green,52,104000,32,64000
+Bermondsey and Old Southwark,52,104000,36,72000
+Greenwich and Woolwich,49,98000,28,56000
+Dorking and Horley,49,98000,16,32000
+Lewisham West and East Dulwich,48,96000,10,20000
+Brent East,48,96000,21,42000
+Banbury,48,96000,33,66000
+Tunbridge Wells,47,94000,19,38000
+Hendon,46,92000,21,42000
+East Hampshire,46,92000,25,50000
+Chichester,45,90000,24,48000
+Southgate and Wood Green,45,90000,23,46000
+South Cotswolds,45,90000,22,44000
+Poplar and Limehouse,44,88000,24,48000
+Cambridge,44,88000,24,48000
+New Forest East,44,88000,25,50000
+Altrincham and Sale West,43,86000,18,36000
+Kingston and Surbiton,41,82000,17,34000
+Bromley and Biggin Hill,41,82000,26,52000
+East Surrey,41,82000,18,36000
+Newbury,40,80000,26,52000
+"Ruislip, Northwood and Pinner",40,80000,15,30000
+Wycombe,40,80000,26,52000
+Reading Central,37,74000,28,56000
+Streatham and Croydon North,37,74000,20,40000
+Epsom and Ewell,36,72000,16,32000
+East Grinstead and Uckfield,36,72000,21,42000
+Reading West and Mid Berkshire,36,72000,22,44000
+Eltham and Chislehurst,35,70000,10,20000
+North East Hampshire,35,70000,11,22000
+Manchester Central,35,70000,31,62000
+Leyton and Wanstead,35,70000,17,34000
+South Devon,34,68000,11,22000
+Mid Buckinghamshire,33,66000,13,26000
+New Forest West,33,66000,10,20000
+Lewisham North,33,66000,17,34000
+Wokingham,33,66000,14,28000
+South Cambridgeshire,32,64000,17,34000
+Cheltenham,32,64000,9,18000
+Bristol Central,32,64000,23,46000
+Witney,31,62000,17,34000
+North Cornwall,31,62000,21,42000
+Mid Sussex,31,62000,15,30000
+Romsey and Southampton North,31,62000,13,26000
+Welwyn Hatfield,31,62000,17,34000
+North West Essex,30,60000,13,26000
+Stratford-on-Avon,29,58000,18,36000
+Sussex Weald,29,58000,10,20000
+Truro and Falmouth,29,58000,12,24000
+Ealing Southall,28,56000,9,18000
+Meriden and Solihull East,28,56000,14,28000
+North East Hertfordshire,27,54000,9,18000
+Birmingham Ladywood,27,54000,24,48000
+Tonbridge,27,54000,11,22000
+Salisbury,26,52000,12,24000
+York Central,26,52000,17,34000
+Bethnal Green and Stepney,26,52000,16,32000
+Harrow East,26,52000,5,10000
+Surrey Heath,26,52000,9,18000
+Wetherby and Easingwold,25,50000,16,32000
+Beckenham and Penge,25,50000,10,20000
+North West Hampshire,25,50000,13,26000
+Kenilworth and Southam,25,50000,10,20000
+Daventry,25,50000,16,32000
+South Northamptonshire,24,48000,13,26000
+Croydon West,24,48000,15,30000
+East Wiltshire,24,48000,10,20000
+Frome and East Somerset,23,46000,12,24000
+Croydon South,23,46000,13,26000
+Didcot and Wantage,23,46000,9,18000
+Edmonton and Winchmore Hill,23,46000,9,18000
+Exeter,23,46000,16,32000
+Horsham,23,46000,9,18000
+Harrogate and Knaresborough,22,44000,16,32000
+Macclesfield,22,44000,12,24000
+Rutland and Stamford,22,44000,12,24000
+Cardiff South and Penarth,22,44000,19,38000
+Basildon and Billericay,21,42000,12,24000
+Peckham,21,42000,10,20000
+Canterbury,21,42000,12,24000
+Liverpool Riverside,20,40000,15,30000
+Tottenham,20,40000,11,22000
+Enfield North,20,40000,11,22000
+Exmouth and Exeter East,20,40000,9,18000
+Watford,19,38000,13,26000
+Luton South and South Bedfordshire,19,38000,13,26000
+Hitchin,19,38000,8,16000
+Hertford and Stortford,19,38000,10,20000
+Salford,19,38000,16,32000
+Bristol North West,19,38000,7,14000
+Bicester and Woodstock,19,38000,11,22000
+Chingford and Woodford Green,19,38000,6,12000
+Hamble Valley,19,38000,10,20000
+North West Norfolk,18,36000,11,22000
+Maldon,18,36000,8,16000
+Hornchurch and Upminster,18,36000,10,20000
+Newcastle upon Tyne Central and West,18,36000,17,34000
+Droitwich and Evesham,18,36000,12,24000
+Warwick and Leamington,18,36000,8,16000
+Orpington,18,36000,8,16000
+Stretford and Urmston,18,36000,14,28000
+North Somerset,18,36000,7,14000
+Tewkesbury,17,34000,8,16000
+Bury St Edmunds and Stowmarket,17,34000,10,20000
+Sutton and Cheam,17,34000,3,6000
+Lewes,17,34000,7,14000
+Oxford East,17,34000,8,16000
+Westmorland and Lonsdale,17,34000,10,20000
+Ely and East Cambridgeshire,16,32000,6,12000
+Eastbourne,16,32000,14,28000
+Skipton and Ripon,16,32000,9,18000
+Sheffield Central,16,32000,12,24000
+Hemel Hempstead,16,32000,10,20000
+Spelthorne,16,32000,10,20000
+Tamworth,16,32000,8,16000
+Wells and Mendip Hills,16,32000,7,14000
+Bexhill and Battle,16,32000,10,20000
+St Austell and Newquay,16,32000,7,14000
+Leeds South,15,30000,12,24000
+Honiton and Sidmouth,15,30000,4,8000
+West Dorset,15,30000,7,14000
+Manchester Rusholme,15,30000,13,26000
+Knowsley,15,30000,14,28000
+South Dorset,15,30000,6,12000
+St Ives,15,30000,8,16000
+Buckingham and Bletchley,15,30000,7,14000
+North Northumberland,15,30000,11,22000
+Rushcliffe,15,30000,6,12000
+Broxbourne,15,30000,8,16000
+Ealing North,15,30000,8,16000
+Bromsgrove,15,30000,7,14000
+Brighton Pavilion,15,30000,6,12000
+Christchurch,15,30000,5,10000
+North Devon,15,30000,8,16000
+Bournemouth West,14,28000,3,6000
+Loughborough,14,28000,4,8000
+Chester South and Eddisbury,14,28000,6,12000
+Weald of Kent,14,28000,7,14000
+South West Norfolk,14,28000,12,24000
+Brentford and Isleworth,14,28000,7,14000
+Stratford and Bow,14,28000,8,16000
+Manchester Withington,14,28000,9,18000
+Mid Bedfordshire,14,28000,11,22000
+South Suffolk,14,28000,9,18000
+Milton Keynes North,14,28000,11,22000
+Stourbridge,13,26000,9,18000
+West Lancashire,13,26000,8,16000
+Braintree,13,26000,6,12000
+Leeds Central and Headingley,13,26000,8,16000
+Keighley and Ilkley,13,26000,8,16000
+Harlow,13,26000,7,14000
+Chelmsford,13,26000,8,16000
+Suffolk Coastal,13,26000,4,8000
+Isle of Wight West,13,26000,9,18000
+Isle of Wight East,13,26000,10,20000
+Romford,13,26000,9,18000
+Worcester,13,26000,10,20000
+Stroud,13,26000,7,14000
+Thirsk and Malton,13,26000,6,12000
+Nottingham South,13,26000,10,20000
+Nottingham East,13,26000,10,20000
+Melton and Syston,13,26000,10,20000
+Sutton Coldfield,13,26000,4,8000
+North West Cambridgeshire,13,26000,6,12000
+Glastonbury and Somerton,13,26000,8,16000
+Melksham and Devizes,13,26000,7,14000
+Fylde,13,26000,2,4000
+Thornbury and Yate,13,26000,9,18000
+Coventry East,13,26000,12,24000
+Tiverton and Minehead,12,24000,7,14000
+Hexham,12,24000,6,12000
+Ashford,12,24000,8,16000
+Telford,12,24000,9,18000
+Hayes and Harlington,12,24000,11,22000
+North Herefordshire,12,24000,9,18000
+North Dorset,12,24000,4,8000
+Cheadle,12,24000,6,12000
+Scarborough and Whitby,12,24000,9,18000
+Torbay,12,24000,11,22000
+Birmingham Edgbaston,12,24000,5,10000
+Lewisham East,12,24000,3,6000
+Camborne and Redruth,12,24000,5,10000
+Neath and Swansea East,12,24000,1,2000
+Thurrock,11,22000,11,22000
+Mid Leicestershire,11,22000,9,18000
+Newcastle-under-Lyme,11,22000,9,18000
+Wirral West,11,22000,8,16000
+North Norfolk,11,22000,4,8000
+Northampton North,11,22000,11,22000
+Leicester South,11,22000,9,18000
+Witham,11,22000,4,8000
+York Outer,11,22000,7,14000
+Aylesbury,11,22000,8,16000
+Central Devon,11,22000,3,6000
+Harrow West,11,22000,6,12000
+Dartford,11,22000,9,18000
+Doncaster Central,11,22000,8,16000
+Corby and East Northamptonshire,11,22000,6,12000
+Gower,11,22000,11,22000
+Rugby,10,20000,9,18000
+Richmond and Northallerton,10,20000,3,6000
+St Neots and Mid Cambridgeshire,10,20000,4,8000
+Ribble Valley,10,20000,6,12000
+Walthamstow,10,20000,3,6000
+Rayleigh and Wickford,10,20000,2,4000
+Portsmouth South,10,20000,10,20000
+"Brecon, Radnor and Cwm Tawe",10,20000,3,6000
+Gloucester,10,20000,5,10000
+Peterborough,10,20000,8,16000
+Bognor Regis and Littlehampton,10,20000,6,12000
+Sittingbourne and Sheppey,10,20000,9,18000
+Congleton,10,20000,7,14000
+Broadland and Fakenham,10,20000,5,10000
+Filton and Bradley Stoke,10,20000,7,14000
+Bury South,10,20000,8,16000
+Hereford and South Herefordshire,10,20000,7,14000
+West Worcestershire,10,20000,8,16000
+Yeovil,10,20000,7,14000
+Mid Dorset and North Poole,10,20000,5,10000
+Newcastle upon Tyne North,10,20000,6,12000
+Newark,10,20000,7,14000
+Wyre Forest,10,20000,8,16000
+Huntingdon,10,20000,4,8000
+Worthing West,10,20000,5,10000
+Earley and Woodley,9,18000,6,12000
+Shrewsbury,9,18000,4,8000
+Chester North and Neston,9,18000,3,6000
+Central Suffolk and North Ipswich,9,18000,8,16000
+North West Leicestershire,9,18000,4,8000
+North Bedfordshire,9,18000,8,16000
+Dover and Deal,9,18000,3,6000
+Derbyshire Dales,9,18000,5,10000
+Solihull West and Shirley,9,18000,1,2000
+Hinckley and Bosworth,9,18000,6,12000
+Bracknell,9,18000,7,14000
+Southend East and Rochford,9,18000,3,6000
+South Ribble,9,18000,6,12000
+Brent West,9,18000,5,10000
+Stockport,9,18000,9,18000
+Gravesham,9,18000,7,14000
+Hastings and Rye,9,18000,3,6000
+South West Wiltshire,9,18000,6,12000
+Ashfield,9,18000,8,16000
+Herne Bay and Sandwich,9,18000,6,12000
+Widnes and Halewood,8,16000,5,10000
+Basingstoke,8,16000,7,14000
+Bassetlaw,8,16000,5,10000
+"Oldham West, Chadderton and Royton",8,16000,6,12000
+Bedford,8,16000,6,12000
+Birmingham Erdington,8,16000,7,14000
+Worsley and Eccles,8,16000,6,12000
+North Shropshire,8,16000,5,10000
+Waveney Valley,8,16000,6,12000
+Crawley,8,16000,7,14000
+South East Cornwall,8,16000,2,4000
+Washington and Gateshead South,8,16000,5,10000
+Wakefield and Rothwell,8,16000,6,12000
+Torridge and Tavistock,8,16000,4,8000
+Portsmouth North,8,16000,4,8000
+Stafford,8,16000,4,8000
+St Helens North,8,16000,6,12000
+Rossendale and Darwen,8,16000,7,14000
+Bristol East,8,16000,7,14000
+Southampton Itchen,8,16000,7,14000
+Sheffield Hallam,8,16000,3,6000
+Bristol South,8,16000,7,14000
+Milton Keynes Central,8,16000,5,10000
+South West Devon,8,16000,1,2000
+Monmouthshire,8,16000,5,10000
+Rochester and Strood,8,16000,5,10000
+Aberafan Maesteg,8,16000,3,6000
+Heywood and Middleton North,8,16000,3,6000
+Maidstone and Malling,8,16000,6,12000
+Llanelli,8,16000,8,16000
+Mid Norfolk,8,16000,6,12000
+Feltham and Heston,8,16000,7,14000
+Lichfield,8,16000,3,6000
+"Harborough, Oadby and Wigston",8,16000,4,8000
+Mansfield,7,14000,5,10000
+Stevenage,7,14000,3,6000
+Plymouth Sutton and Devonport,7,14000,3,6000
+Brighton Kemptown and Peacehaven,7,14000,2,4000
+Southampton Test,7,14000,6,12000
+Broxtowe,7,14000,4,8000
+South Leicestershire,7,14000,5,10000
+Cardiff West,7,14000,5,10000
+Sheffield South East,7,14000,6,12000
+Swindon South,7,14000,5,10000
+Redditch,7,14000,4,8000
+Clwyd North,7,14000,5,10000
+Penrith and Solway,7,14000,3,6000
+Makerfield,7,14000,3,6000
+Bradford South,7,14000,6,12000
+"Pontefract, Castleford and Knottingley",7,14000,3,6000
+Bolsover,7,14000,7,14000
+East Thanet,7,14000,4,8000
+Mid and South Pembrokeshire,7,14000,3,6000
+Wrexham,7,14000,5,10000
+Mid Derbyshire,7,14000,4,8000
+Normanton and Hemsworth,7,14000,6,12000
+Newport East,7,14000,4,8000
+Ilford North,7,14000,6,12000
+Wolverhampton West,7,14000,4,8000
+Dunstable and Leighton Buzzard,7,14000,5,10000
+Ilford South,7,14000,5,10000
+Kingswinford and South Staffordshire,6,12000,3,6000
+Carlisle,6,12000,5,10000
+Sefton Central,6,12000,5,10000
+Cardiff North,6,12000,5,10000
+Chippenham,6,12000,6,12000
+Runcorn and Helsby,6,12000,4,8000
+Barking,6,12000,5,10000
+Clacton,6,12000,4,8000
+Wythenshawe and Sale East,6,12000,5,10000
+Sheffield Heeley,6,12000,3,6000
+Slough,6,12000,4,8000
+Lincoln,6,12000,2,4000
+Leicester West,6,12000,5,10000
+Halesowen,6,12000,2,4000
+Bridgwater,6,12000,4,8000
+Birmingham Selly Oak,6,12000,3,6000
+Leeds North East,6,12000,3,6000
+Uxbridge and South Ruislip,6,12000,4,8000
+Grantham and Bourne,6,12000,2,4000
+Vale of Glamorgan,6,12000,3,6000
+Sleaford and North Hykeham,6,12000,5,10000
+Warrington South,6,12000,5,10000
+Burton and Uttoxeter,6,12000,4,8000
+Bury North,6,12000,3,6000
+South Basildon and East Thurrock,6,12000,5,10000
+Wigan,6,12000,1,2000
+Bradford East,6,12000,6,12000
+Leeds North West,6,12000,4,8000
+Middlesbrough and Thornaby East,6,12000,5,10000
+Gorton and Denton,6,12000,5,10000
+North East Somerset and Hanham,6,12000,2,4000
+East Worthing and Shoreham,6,12000,6,12000
+Erith and Thamesmead,6,12000,2,4000
+Derby North,6,12000,5,10000
+Derby South,6,12000,6,12000
+Nuneaton,6,12000,5,10000
+Pendle and Clitheroe,6,12000,3,6000
+Leeds East,5,10000,4,8000
+Caerfyrddin,5,10000,4,8000
+Havant,5,10000,1,2000
+Harwich and North Essex,5,10000,2,4000
+West Suffolk,5,10000,3,6000
+Sheffield Brightside and Hillsborough,5,10000,1,2000
+Birkenhead,5,10000,3,6000
+Nottingham North and Kimberley,5,10000,5,10000
+Wellingborough and Rushden,5,10000,4,8000
+North East Derbyshire,5,10000,1,2000
+Walsall and Bloxwich,5,10000,4,8000
+Tynemouth,5,10000,3,6000
+Swindon North,5,10000,4,8000
+South Derbyshire,5,10000,3,6000
+South Shropshire,5,10000,1,2000
+Old Bexley and Sidcup,5,10000,1,2000
+Stoke-on-Trent South,5,10000,3,6000
+Taunton and Wellington,5,10000,3,6000
+Stoke-on-Trent Central,5,10000,4,8000
+Doncaster East and the Isle of Axholme,5,10000,3,6000
+Bournemouth East,5,10000,1,2000
+Leicester East,5,10000,4,8000
+Halifax,5,10000,4,8000
+Lancaster and Wyre,5,10000,4,8000
+Preston,5,10000,4,8000
+Chorley,5,10000,2,4000
+Bangor Aberconwy,5,10000,2,4000
+Chatham and Aylesford,5,10000,3,6000
+Carshalton and Wallington,5,10000,5,10000
+Morecambe and Lunesdale,5,10000,3,6000
+Mitcham and Morden,5,10000,3,6000
+Rochdale,5,10000,3,6000
+Louth and Horncastle,5,10000,5,10000
+Ynys Môn,5,10000,0,0
+Alyn and Deeside,5,10000,4,8000
+Folkestone and Hythe,5,10000,3,6000
+Huddersfield,5,10000,4,8000
+Easington,4,8000,4,8000
+Bristol North East,4,8000,4,8000
+Southport,4,8000,4,8000
+Doncaster North,4,8000,4,8000
+Forest of Dean,4,8000,2,4000
+Bolton South and Walkden,4,8000,3,6000
+Rhondda and Ogmore,4,8000,1,2000
+Kingston upon Hull West and Haltemprice,4,8000,3,6000
+St Helens South and Whiston,4,8000,3,6000
+Bolton West,4,8000,2,4000
+Amber Valley,4,8000,1,2000
+Staffordshire Moorlands,4,8000,3,6000
+Merthyr Tydfil and Aberdare,4,8000,2,4000
+Boston and Skegness,4,8000,3,6000
+Stoke-on-Trent North,4,8000,3,6000
+"Stone, Great Wyrley and Penkridge",4,8000,3,6000
+Sunderland Central,4,8000,3,6000
+Bradford West,4,8000,3,6000
+Darlington,4,8000,3,6000
+Wolverhampton South East,4,8000,3,6000
+Newport West and Islwyn,4,8000,3,6000
+Luton North,4,8000,4,8000
+Hartlepool,4,8000,4,8000
+Newcastle upon Tyne East and Wallsend,4,8000,3,6000
+Kettering,4,8000,3,6000
+Gillingham and Rainham,4,8000,3,6000
+Jarrow and Gateshead East,4,8000,3,6000
+Warrington North,4,8000,3,6000
+Smethwick,4,8000,2,4000
+Eastleigh,4,8000,2,4000
+Faversham and Mid Kent,4,8000,3,6000
+Dwyfor Meirionnydd,4,8000,3,6000
+Bishop Auckland,4,8000,2,4000
+Croydon East,4,8000,2,4000
+Blackburn,4,8000,2,4000
+South Holland and The Deepings,4,8000,3,6000
+Kingston upon Hull North and Cottingham,4,8000,3,6000
+South Norfolk,4,8000,3,6000
+Burnley,4,8000,4,8000
+Weston-super-Mare,4,8000,3,6000
+Hazel Grove,4,8000,3,6000
+Barnsley North,4,8000,3,6000
+West Ham and Beckton,3,6000,3,6000
+Ipswich,3,6000,3,6000
+Erewash,3,6000,2,4000
+Torfaen,3,6000,3,6000
+Swansea West,3,6000,0,0
+Birmingham Hodge Hill and Solihull North,3,6000,2,4000
+Houghton and Sunderland South,3,6000,1,2000
+Blaenau Gwent and Rhymney,3,6000,1,2000
+Newton Abbot,3,6000,2,4000
+Blaydon and Consett,3,6000,2,4000
+Tipton and Wednesbury,3,6000,3,6000
+Whitehaven and Workington,3,6000,1,2000
+Plymouth Moor View,3,6000,2,4000
+Caerphilly,3,6000,2,4000
+Colne Valley,3,6000,2,4000
+Cardiff East,3,6000,2,4000
+Dagenham and Rainham,3,6000,3,6000
+Aldershot,3,6000,3,6000
+Oldham East and Saddleworth,3,6000,2,4000
+Ossett and Denby Dale,3,6000,3,6000
+North Warwickshire and Bedworth,3,6000,3,6000
+Goole and Pocklington,3,6000,2,4000
+Rother Valley,3,6000,0,0
+Coventry South,3,6000,3,6000
+Sherwood Forest,3,6000,2,4000
+Scunthorpe,3,6000,3,6000
+Chesterfield,3,6000,2,4000
+Leeds South West and Morley,3,6000,1,2000
+Shipley,3,6000,1,2000
+Rawmarsh and Conisbrough,3,6000,2,4000
+Bridlington and The Wolds,3,6000,3,6000
+Stalybridge and Hyde,3,6000,3,6000
+Northampton South,3,6000,2,4000
+Colchester,3,6000,3,6000
+Gainsborough,3,6000,3,6000
+Penistone and Stocksbridge,3,6000,2,4000
+Dewsbury and Batley,3,6000,3,6000
+Liverpool Garston,3,6000,2,4000
+Crewe and Nantwich,3,6000,3,6000
+Birmingham Hall Green and Moseley,2,4000,1,2000
+West Bromwich,2,4000,1,2000
+Calder Valley,2,4000,2,4000
+Bridgend,2,4000,1,2000
+Liverpool Wavertree,2,4000,1,2000
+Norwich South,2,4000,2,4000
+Barrow and Furness,2,4000,0,0
+High Peak,2,4000,0,0
+Lowestoft,2,4000,2,4000
+Gedling,2,4000,1,2000
+East Ham,2,4000,0,0
+City of Durham,2,4000,1,2000
+Clwyd East,2,4000,2,4000
+Rotherham,2,4000,1,2000
+Birmingham Northfield,2,4000,2,4000
+Leigh and Atherton,2,4000,0,0
+Ellesmere Port and Bromborough,2,4000,1,2000
+Blyth and Ashington,2,4000,2,4000
+Norwich North,2,4000,1,2000
+Blackpool South,2,4000,1,2000
+Blackpool North and Fleetwood,2,4000,0,0
+Blackley and Middleton South,2,4000,1,2000
+Bolton North East,2,4000,2,4000
+Fareham and Waterlooville,2,4000,1,2000
+Spen Valley,2,4000,2,4000
+Southend West and Leigh,2,4000,1,2000
+Brigg and Immingham,2,4000,1,2000
+Bootle,2,4000,2,4000
+Cramlington and Killingworth,2,4000,2,4000
+Great Yarmouth,2,4000,1,2000
+Kingston upon Hull East,2,4000,1,2000
+Stockton North,2,4000,1,2000
+North Durham,2,4000,1,2000
+The Wrekin,2,4000,2,4000
+Gateshead Central and Whickham,1,2000,1,2000
+Hyndburn,1,2000,0,0
+Redcar,1,2000,1,2000
+Leeds West and Pudsey,1,2000,0,0
+Wolverhampton North East,1,2000,1,2000
+Ashton-under-Lyne,1,2000,1,2000
+North East Cambridgeshire,1,2000,0,0
+Ceredigion Preseli,1,2000,1,2000
+Barnsley South,1,2000,1,2000
+Gosport,1,2000,0,0
+Middlesbrough South and East Cleveland,1,2000,0,0
+Birmingham Yardley,1,2000,1,2000
+Coventry North West,1,2000,1,2000
+Selby,1,2000,1,2000
+Cannock Chase,1,2000,0,0
+Beverley and Holderness,1,2000,1,2000
+Bexleyheath and Crayford,1,2000,1,2000
+Newton Aycliffe and Spennymoor,1,2000,1,2000
+Liverpool Walton,1,2000,1,2000
+Birmingham Perry Barr,1,2000,1,2000
+Dudley,1,2000,1,2000
+Wallasey,1,2000,1,2000
+Stockton West,1,2000,1,2000
diff --git a/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3.html b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3.html
new file mode 100644
index 000000000..55def6cff
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3.html
@@ -0,0 +1,26701 @@
+
+
+
+
+
+
Mansion Tax Impact by Constituency
+
+
+
+
+
+
+
+
+
+
+
+
Search constituency
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Lower %
+ Higher %
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source: PolicyEngine analysis of Land Registry data (uprated to 2026-27 using OBR HPI)
+
+
+
+
+
+
diff --git a/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_1m.html b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_1m.html
new file mode 100644
index 000000000..1f4d311f0
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_1m.html
@@ -0,0 +1,26086 @@
+
+
+
+
+
+
Mansion Tax Impact by Constituency (£1.5m threshold)
+
+
+
+
+
+
+
+
+
+
+
+
Search constituency
+
+
+
+
+
+
+
+
+
+
+
+ Lower %
+ Higher %
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source: PolicyEngine analysis of Land Registry data (uprated to 2026-27 using OBR HPI)
+
+
+
+
+
+
diff --git a/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_2m.html b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_2m.html
new file mode 100644
index 000000000..3a0ae7fa2
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_2m.html
@@ -0,0 +1,26086 @@
+
+
+
+
+
+
Mansion Tax Impact by Constituency (£2m threshold)
+
+
+
+
+
+
+
+
+
+
+
+
Search constituency
+
+
+
+
+
+
+
+
+
+
+
+ Lower %
+ Higher %
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source: PolicyEngine analysis of Land Registry data (uprated to 2026-27 using OBR HPI)
+
+
+
+
+
+
diff --git a/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_combined_footer.txt b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_combined_footer.txt
new file mode 100644
index 000000000..1963f84e0
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_combined_footer.txt
@@ -0,0 +1,394 @@
+
+ const width = 800;
+ const height = 900;
+ const svg = d3.select('#map');
+ const g = svg.append('g');
+ const tooltip = document.getElementById('tooltip');
+
+ let currentView = 'geo';
+
+ // Calculate bounds of British National Grid coordinates
+ let xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity;
+ geoData.features.forEach(feature => {
+ const traverse = (coords) => {
+ if (typeof coords[0] === 'number') {
+ xMin = Math.min(xMin, coords[0]);
+ xMax = Math.max(xMax, coords[0]);
+ yMin = Math.min(yMin, coords[1]);
+ yMax = Math.max(yMax, coords[1]);
+ } else {
+ coords.forEach(traverse);
+ }
+ };
+ traverse(feature.geometry.coordinates);
+ });
+
+ // Create scale to fit British National Grid into SVG
+ const padding = 80;
+ const dataWidth = xMax - xMin;
+ const dataHeight = yMax - yMin;
+ const geoScale = Math.min((width - 2 * padding) / dataWidth, (height - 2 * padding) / dataHeight);
+ const geoOffsetX = (width - dataWidth * geoScale) / 2;
+ const geoOffsetY = (height - dataHeight * geoScale) / 2;
+
+ const projection = d3.geoTransform({
+ point: function(x, y) {
+ this.stream.point(
+ (x - xMin) * geoScale + geoOffsetX,
+ height - ((y - yMin) * geoScale + geoOffsetY)
+ );
+ }
+ });
+
+ const path = d3.geoPath().projection(projection);
+
+ // Calculate hex bounds
+ let hexQMin = Infinity, hexQMax = -Infinity, hexRMin = Infinity, hexRMax = -Infinity;
+ Object.values(hexData).forEach(h => {
+ hexQMin = Math.min(hexQMin, h.q);
+ hexQMax = Math.max(hexQMax, h.q);
+ hexRMin = Math.min(hexRMin, h.r);
+ hexRMax = Math.max(hexRMax, h.r);
+ });
+
+ // Hex positioning
+ const hexSize = 9;
+ const hexWidth = hexSize * 2;
+ const hexHeight = Math.sqrt(3) * hexSize;
+ const hexRangeQ = hexQMax - hexQMin;
+ const hexRangeR = hexRMax - hexRMin;
+ const hexTotalWidth = hexRangeQ * hexWidth * 0.75 + hexWidth;
+ const hexTotalHeight = hexRangeR * hexHeight + hexHeight;
+ const hexOffsetX = (width - hexTotalWidth) / 2;
+ const hexOffsetY = (height - hexTotalHeight) / 2;
+
+ function getHexPosition(q, r) {
+ const x = hexOffsetX + (q - hexQMin) * hexWidth * 0.75 + hexWidth / 2;
+ // Flip y-axis so south (London) is at the bottom
+ const y = hexOffsetY + (hexRMax - r) * hexHeight + (q % 2 !== 0 ? hexHeight / 2 : 0) + hexHeight / 2;
+ return { x, y };
+ }
+
+ // Hex path generator
+ function hexPath(cx, cy, size) {
+ const angles = [0, 60, 120, 180, 240, 300].map(a => a * Math.PI / 180);
+ const points = angles.map(a => [
+ cx + size * Math.cos(a),
+ cy + size * Math.sin(a)
+ ]);
+ return 'M' + points.map(p => p.join(',')).join('L') + 'Z';
+ }
+
+ // Color scale - sequential teal based on % of constituency
+ const maxPct = Math.max(...Object.values(impactData).map(d => d.pct));
+ const colorScale = d3.scaleSequential()
+ .domain([0, maxPct])
+ .interpolator(t => d3.interpolate('#e0e7ed', '#1a4a6e')(Math.pow(t, 0.5)));
+
+ // Calculate centroids for geo view
+ const centroids = {};
+ geoData.features.forEach(feature => {
+ const bounds = path.bounds(feature);
+ centroids[feature.properties.Name] = {
+ x: (bounds[0][0] + bounds[1][0]) / 2,
+ y: (bounds[0][1] + bounds[1][1]) / 2
+ };
+ });
+
+ // Draw geographic view (initial)
+ const paths = g.selectAll('path')
+ .data(geoData.features)
+ .join('path')
+ .attr('d', path)
+ .attr('class', 'constituency-path')
+ .attr('fill', d => {
+ const data = impactData[d.properties.Name];
+ return data ? colorScale(data.pct) : '#e0e7ed';
+ })
+ .attr('stroke', '#fff')
+ .attr('stroke-width', 0.3)
+ .on('click', handleClick);
+
+ function handleClick(event, d) {
+ event.stopPropagation();
+ const name = d.properties ? d.properties.Name : d.name;
+ const data = impactData[name] || { pct: 0, num: 0, rev: 0 };
+ showTooltip(name, data, event);
+ // Highlight
+ g.selectAll('.constituency-path, .hex')
+ .attr('stroke', '#fff')
+ .attr('stroke-width', currentView === 'geo' ? 0.3 : 1);
+ d3.select(this)
+ .attr('stroke', '#277674')
+ .attr('stroke-width', currentView === 'geo' ? 1.5 : 2);
+ }
+
+ function showTooltip(name, data, event) {
+ tooltip.innerHTML = `
+
${name}
+
+ Number
+ ${data.num.toLocaleString()}
+
+
+ Percent
+ ${data.pct.toFixed(2)}%
+
+
+ Est. revenue
+ £${data.rev.toLocaleString()}
+
+ `;
+ const rect = document.querySelector('.map-canvas').getBoundingClientRect();
+ tooltip.style.left = (event.clientX - rect.left) + 'px';
+ tooltip.style.top = (event.clientY - rect.top - 10) + 'px';
+ tooltip.style.display = 'block';
+ }
+
+ // Click outside to hide tooltip
+ svg.on('click', () => {
+ tooltip.style.display = 'none';
+ g.selectAll('.constituency-path, .hex')
+ .attr('stroke', '#fff')
+ .attr('stroke-width', currentView === 'geo' ? 0.3 : 1);
+ });
+
+ // Zoom behavior
+ const zoom = d3.zoom()
+ .scaleExtent([1, 8])
+ .on('zoom', (event) => {
+ g.attr('transform', event.transform);
+ });
+ svg.call(zoom);
+
+ // Set initial view to center UK with slight zoom
+ const initialScale = 1.1;
+ const initialX = (width - width * initialScale) / 2;
+ const initialY = (height - height * initialScale) / 2 - 200;
+ svg.call(zoom.transform, d3.zoomIdentity.translate(initialX, initialY).scale(initialScale));
+
+ document.getElementById('zoom-in').onclick = () => svg.transition().call(zoom.scaleBy, 1.5);
+ document.getElementById('zoom-out').onclick = () => svg.transition().call(zoom.scaleBy, 0.67);
+ document.getElementById('zoom-reset').onclick = () => {
+ svg.transition().call(zoom.transform, d3.zoomIdentity);
+ tooltip.style.display = 'none';
+ };
+
+ // View toggle
+ const btnGeo = document.getElementById('btn-geo');
+ const btnHex = document.getElementById('btn-hex');
+
+ btnGeo.onclick = () => {
+ if (currentView === 'geo') return;
+ currentView = 'geo';
+ btnGeo.classList.add('active');
+ btnHex.classList.remove('active');
+ switchToGeo();
+ };
+
+ btnHex.onclick = () => {
+ if (currentView === 'hex') return;
+ currentView = 'hex';
+ btnHex.classList.add('active');
+ btnGeo.classList.remove('active');
+ switchToHex();
+ };
+
+ function switchToHex() {
+ // Set zoom for hex view (zoomed out and shifted up to fit)
+ const hexScale = 0.8;
+ const hexX = (width - width * hexScale) / 2;
+ const hexY = (height - height * hexScale) / 2 - 60;
+ svg.transition().duration(300).call(zoom.transform, d3.zoomIdentity.translate(hexX, hexY).scale(hexScale));
+ tooltip.style.display = 'none';
+
+ // Remove existing paths
+ g.selectAll('path').remove();
+
+ // Create hex data array
+ const hexArray = geoData.features.map(feature => {
+ const name = feature.properties.Name;
+ const hex = hexData[name];
+ return {
+ name: name,
+ hex: hex,
+ feature: feature
+ };
+ }).filter(d => d.hex);
+
+ // Draw hexes
+ g.selectAll('.hex')
+ .data(hexArray)
+ .join('path')
+ .attr('class', 'hex')
+ .attr('d', d => {
+ const pos = getHexPosition(d.hex.q, d.hex.r);
+ return hexPath(pos.x, pos.y, hexSize);
+ })
+ .attr('fill', d => {
+ const data = impactData[d.name];
+ return data ? colorScale(data.pct) : '#e0e7ed';
+ })
+ .attr('stroke', '#fff')
+ .attr('stroke-width', 1)
+ .style('opacity', 0)
+ .on('click', function(event, d) {
+ event.stopPropagation();
+ const data = impactData[d.name] || { pct: 0, num: 0, rev: 0 };
+ showTooltip(d.name, data, event);
+ g.selectAll('.hex')
+ .attr('stroke', '#fff')
+ .attr('stroke-width', 1);
+ d3.select(this)
+ .attr('stroke', '#277674')
+ .attr('stroke-width', 2);
+ })
+ .transition()
+ .duration(500)
+ .style('opacity', 1);
+ }
+
+ function switchToGeo() {
+ // Reset zoom
+ svg.transition().duration(300).call(zoom.transform, d3.zoomIdentity);
+ tooltip.style.display = 'none';
+
+ // Remove hexes
+ g.selectAll('.hex').remove();
+
+ // Redraw paths
+ g.selectAll('path')
+ .data(geoData.features)
+ .join('path')
+ .attr('d', path)
+ .attr('class', 'constituency-path')
+ .attr('fill', d => {
+ const data = impactData[d.properties.Name];
+ return data ? colorScale(data.pct) : '#e0e7ed';
+ })
+ .attr('stroke', '#fff')
+ .attr('stroke-width', 0.3)
+ .style('opacity', 0)
+ .on('click', handleClick)
+ .transition()
+ .duration(500)
+ .style('opacity', 1);
+ }
+
+ // Search functionality
+ const searchInput = document.getElementById('search-input');
+ const searchResults = document.getElementById('search-results');
+ const allNames = geoData.features.map(f => f.properties.Name).sort();
+
+ searchInput.addEventListener('input', (e) => {
+ const query = e.target.value.toLowerCase();
+ if (query.length < 2) {
+ searchResults.style.display = 'none';
+ return;
+ }
+ const matches = allNames
+ .filter(name => name.toLowerCase().includes(query))
+ .slice(0, 5);
+
+ if (matches.length === 0) {
+ searchResults.style.display = 'none';
+ return;
+ }
+
+ searchResults.innerHTML = matches.map(name => {
+ const data = impactData[name] || { pct: 0, num: 0, rev: 0 };
+ return `
+
+ `;
+ }).join('');
+ searchResults.style.display = 'block';
+
+ searchResults.querySelectorAll('.search-result-item').forEach(btn => {
+ btn.onclick = () => {
+ const name = btn.dataset.name;
+ searchInput.value = name;
+ searchResults.style.display = 'none';
+
+ // Reset zoom first
+ svg.transition().duration(300).call(zoom.transform, d3.zoomIdentity);
+
+ // Show tooltip
+ const data = impactData[name] || { pct: 0, num: 0, rev: 0 };
+ tooltip.innerHTML = `
+
${name}
+
Number${data.num.toLocaleString()}
+
Percent${data.pct.toFixed(2)}%
+
Est. revenue£${data.rev.toLocaleString()}
+ `;
+
+ if (currentView === 'geo') {
+ // Highlight and zoom to constituency
+ g.selectAll('.constituency-path')
+ .attr('stroke', '#fff')
+ .attr('stroke-width', 0.3);
+ g.selectAll('.constituency-path')
+ .filter(d => d.properties.Name === name)
+ .attr('stroke', '#277674')
+ .attr('stroke-width', 1.5);
+
+ const feature = geoData.features.find(f => f.properties.Name === name);
+ if (feature) {
+ const bounds = path.bounds(feature);
+ const dx = bounds[1][0] - bounds[0][0];
+ const dy = bounds[1][1] - bounds[0][1];
+ const x = (bounds[0][0] + bounds[1][0]) / 2;
+ const y = (bounds[0][1] + bounds[1][1]) / 2;
+ const zoomScale = Math.min(4, 0.9 / Math.max(dx / width, dy / height));
+ const translate = [width / 2 - zoomScale * x, height / 2 - zoomScale * y];
+
+ svg.transition().duration(750).call(
+ zoom.transform,
+ d3.zoomIdentity.translate(translate[0], translate[1]).scale(zoomScale)
+ );
+
+ tooltip.style.left = '50%';
+ tooltip.style.top = '40%';
+ tooltip.style.display = 'block';
+ }
+ } else {
+ // Highlight hex
+ g.selectAll('.hex')
+ .attr('stroke', '#fff')
+ .attr('stroke-width', 1);
+ g.selectAll('.hex')
+ .filter(d => d.name === name)
+ .attr('stroke', '#277674')
+ .attr('stroke-width', 2);
+
+ const hex = hexData[name];
+ if (hex) {
+ const pos = getHexPosition(hex.q, hex.r);
+ const zoomScale = 3;
+ const translate = [width / 2 - zoomScale * pos.x, height / 2 - zoomScale * pos.y];
+
+ svg.transition().duration(750).call(
+ zoom.transform,
+ d3.zoomIdentity.translate(translate[0], translate[1]).scale(zoomScale)
+ );
+
+ tooltip.style.left = '50%';
+ tooltip.style.top = '40%';
+ tooltip.style.display = 'block';
+ }
+ }
+ };
+ });
+ });
+
+ // Hide search results when clicking outside
+ document.addEventListener('click', (e) => {
+ if (!e.target.closest('.search-container')) {
+ searchResults.style.display = 'none';
+ }
+ });
+
+
+
\ No newline at end of file
diff --git a/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_combined_header.txt b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_combined_header.txt
new file mode 100644
index 000000000..cd4eff3fb
--- /dev/null
+++ b/app/public/assets/posts/uk-mansion-tax/mansion_tax_d3_combined_header.txt
@@ -0,0 +1,305 @@
+
+
+
+
+
+
Mansion Tax Impact by Constituency (£1.5m threshold)
+
+
+
+
+
+
+
+
+
+
+
+
Search constituency
+
+
+
+
+
+
+
+
+
+
+
+ Lower %
+ Higher %
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Source: PolicyEngine analysis of Land Registry data (uprated to 2026-27 using OBR HPI)
+
+
+
+
diff --git a/app/public/charts/california-billionaire-tax-marginal-rates/mtr.html b/app/public/charts/california-billionaire-tax-marginal-rates/mtr.html
index 70332b4bc..12866c9d8 100644
--- a/app/public/charts/california-billionaire-tax-marginal-rates/mtr.html
+++ b/app/public/charts/california-billionaire-tax-marginal-rates/mtr.html
@@ -9,7 +9,7 @@