mapbox / node-or-tools Goto Github PK
View Code? Open in Web Editor NEWNode.js bindings for or-tools vehicle routing problems
License: MIT License
Node.js bindings for or-tools vehicle routing problems
License: MIT License
We want to be able to balance the number of locations serviced by each vehicle to be as even as possible. The use-case is for example drivers who are getting paid (at least partially) by number of deliveries.
This constraint should be behind a flag and optional.
Implementation: use the underlying solver to
Distribute
constraintDeviation
constraint for vehicle counts targeting the deviation
vardeviation
varRoughly as follows:
std::vector<IntVar*> vehicleCounts;
for (auto vehicle = 0; vehicle < numVehicles; ++vehicle)
vehicleCounts.push_back(solver->MakeIntVar(0, numNodes));
solver->AddConstraint(solver->MakeDistribute(vehicleVars, vehicleCounts));
auto* deviationVar = solver->MakeIntVar(0, numNodes * numNodes);
solver->AddConstraint(solver->MakeDeviation(vehicleCounts, deviationVar, numNodes));
model.AddVariableMinimizedByFinalizer(deviationVar);
Is it normal to have one result when specifying ONLY 1 vehicle available, and another order result when specifying more than one vehicle?
It is not taking the best (shortest and fastest) route. The image shows the points to visit ordered as the VRP result.
i use node-osrm to get the cost table using.
As you can see, it ordered to visit A > C > B > D
I Draw these points to osrm route and give this as not the fastest one.
The fastest one was ordering as A > B > C > D , just by some little difference, but i expect it to be the optimized order
We should allow for the user to not only add hard bounds (think: time window of 10am--11am, or a specific capacity) but also soft bounds which will add proportionally to the solution's cost if exceeded.
Use-case: think of a hard time window of 10am--1am. Maybe we want to be on time as often as possible. We could set a soft upper bound e.g. of 10:15am adding a penalty proportional to how late we are)
Implementation: see RoutingDimension
type's Soft
member functions adding penalties to the cost.
Hi,
Something is preventing me from installing node-or-tools and I can't seem to figure out what. I try running it on Windows 10 64bit in Powershell. I tried it both with node v8.10 and v6.13.1 installed. I already solved an issue with the python PATH settings, as well as with C++ VS 15 tools. I have node-gyp and node-pre-gyp installed using npm. I also tried installing without the msvsversion2015 flag.
My error log is as follows:
PS C:\Users\...> npm install node_or_tools --msvs_version=2015
> node_or_tools@1.0.5 install C:\Users\...\node_modules\node_or_tools
> node-pre-gyp install --fallback-to-build
node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.5/Release/node-v48-win32-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for node_or_tools@1.0.5 and node@6.13.1 (node-v48 ABI) (falling back to source compile with node-gyp)
C:\Users\...\node_modules\node_or_tools>if not defined npm_config_node_gyp (node "C:\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" clean ) else (node "" clean )
C:\Users\...\node_modules\node_or_tools>if not defined npm_config_node_gyp (node "C:\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" configure --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding --python=C:\Python\Python27\python.exe --msvs_version=2015 ) else (node "" configure --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding --python=C:\Python\Python27\python.exe --msvs_version=2015 )
C:\Users\...\node_modules\node_or_tools>if not defined npm_config_node_gyp (node "C:\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding ) else (node "" build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding )
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
install-deps
The system cannot find the specified path.
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(171,5): error MSB6006: "cmd.exe" exi
ted with code 1. [C:\Users\...\node_modules\node_or_tools\build\action_before_build.vcxproj]
gyp ERR! build error
gyp ERR! stack Error: `C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe` failed with exit code: 1
gyp ERR! stack at ChildProcess.onExit (C:\nodejs\node_modules\npm\node_modules\node-gyp\lib\build.js:276:23)
gyp ERR! stack at emitTwo (events.js:106:13)
gyp ERR! stack at ChildProcess.emit (events.js:191:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:219:12)
gyp ERR! System Windows_NT 10.0.16299
gyp ERR! command "C:\\nodejs\\node.exe" "C:\\nodejs\\node_modules\\npm\\node_modules\\node-gyp\\bin\\node-gyp.js" "build" "--fallback-to-build" "--module=C:\\Users\\...\\node_modules\\node_or_tools\\lib\\binding\\node_or_tools.node" "--module_name=node_or_tools" "--module_path=C:\\Users\\...\\node_modules\\node_or_tools\\lib\\binding"
gyp ERR! cwd C:\Users\...\node_modules\node_or_tools
gyp ERR! node -v v6.13.1
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute 'node-gyp.cmd build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding' (1)
node-pre-gyp ERR! stack at ChildProcess.<anonymous> (C:\Users\...\node_modules\node_or_tools\node_modules\node-pre-gyp\lib\util\compile.js:83:29)
node-pre-gyp ERR! stack at emitTwo (events.js:106:13)
node-pre-gyp ERR! stack at ChildProcess.emit (events.js:191:7)
node-pre-gyp ERR! stack at maybeClose (internal/child_process.js:920:16)
node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:230:5)
node-pre-gyp ERR! System Windows_NT 10.0.16299
node-pre-gyp ERR! command "C:\\nodejs\\node.exe" "C:\\Users\\...\\node_modules\\node_or_tools\\node_modules\\node-pre-gyp\\bin\\node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd C:\Users\...\node_modules\node_or_tools
node-pre-gyp ERR! node -v v6.13.1
node-pre-gyp ERR! node-pre-gyp -v v0.6.36
node-pre-gyp ERR! not ok
Failed to execute 'node-gyp.cmd build --fallback-to-build --module=C:\Users\...\node_modules\node_or_tools\lib\binding\node_or_tools.node --module_name=node_or_tools --module_path=C:\Users\...\node_modules\node_or_tools\lib\binding' (1)
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\...\package.json'
npm WARN ... No description
npm WARN ... No repository field.
npm WARN ... No README data
npm WARN ... No license field.
npm ERR! Windows_NT 10.0.16299
npm ERR! argv "C:\\nodejs\\node.exe" "C:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "node_or_tools" "--msvs_version=2015"
npm ERR! node v6.13.1
npm ERR! npm v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! node_or_tools@1.0.5 install: `node-pre-gyp install --fallback-to-build`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the node_or_tools@1.0.5 install script 'node-pre-gyp install --fallback-to-build'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the node_or_tools package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-pre-gyp install --fallback-to-build
npm ERR! You can get information on how to open an issue for this project with:
npm ERR! npm bugs node_or_tools
npm ERR! Or if that isn't available, you can get their info via:
npm ERR! npm owner ls node_or_tools
npm ERR! There is likely additional logging output above.
npm ERR! Please include the following file with any support request:
npm ERR! C:\Users\...\npm-debug.log
If necessary I can provide the debug.log file.
I hope that anyone could help me out on this, since I suspect the solution should be simple.
Had to downgrade to Node.js 9.7.1 to make it work...
In #23 we switched to statically linking against upstream libortools.a
and more importantly strip out debug symbols here. What we should do is build debug binaries for npm which link against libortools.a
with debug symbols not stripped out.
Tasks:
--debug
to node-pre-gyp
cc @karenzshea
At the moment we expose a single cost and duration matrix per vehicle. What we should allow for in the context of multiple vehicles is cost and duration factors on a per vehicle basis to scale the cost and duration matrix the user passes us, think
numVehicles: 3
costFactors: [1.0, 0.7, 1.5]
durationFactors: [1.0, 0.7, 1.5]
which would scale both the cost as well as the duration matrices depending on the factors for each vehicle. We need to separate cost and duration factors because users could specify e.g. distance as cost in which case costFactors
would be [1.0 1.0 1.0]
and durationFactors
would account for slower and faster vehicles.
Related: Heterogeneous Fleets #11
cc @karenzshea
Hello,
Trying to do an "npm install node_or_tools" on a SunOS 5.11 Linux machine but running into some errors. Have installed globally the "node-pre-gyp" package and "node-gyp" package. Here are the initial build errors...Does the node version have to be 4.8? I have installed Node 6.9.2 and NPM 5.0.3.
Thanks in advance for any help.
[email protected] install /home/routing/node_modules/node_or_tools
node-pre-gyp install --fallback-to-build
node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazon
s.com/node_or_tools/v1.0.3/Release/node-v48-sunos-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and nod
6.9.2 (node-v48 ABI) (falling back to source compile with node-gyp)
gyp: binding.gyp not found (cwd: /home/routing/node_modules/node_or_tools) whi
trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: gyp
failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/home/routing/node_modules/node-g
/lib/configure.js:336:16)
gyp ERR! stack at emitTwo (events.js:106:13)
gyp ERR! stack at ChildProcess.emit (events.js:191:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_proc
s.js:215:12)
gyp ERR! System SunOS 5.11
gyp ERR! command "/opt/local/bin/node" "/home/routing/node_modules/node-gyp/bi
node-gyp.js" "configure" "--fallback-to-build" "--module=/home/routing/node_mo
les/node_or_tools/lib/binding/node_or_tools.node" "--module_name=node_or_tools
"--module_path=/home/routing/node_modules/node_or_tools/lib/binding"
gyp ERR! cwd /home/routing/node_modules/node_or_tools
gyp ERR! node -v v6.9.2
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute '/opt/local/bin/node /home/ro
ing/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --modu
=/home/routing/node_modules/node_or_tools/lib/binding/node_or_tools.node --mod
e_name=node_or_tools --module_path=/home/routing/node_modules/node_or_tools/li
binding' (1)
node-pre-gyp ERR! stack at ChildProcess. (/home/routing/node_mo
les/node_or_tools/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack at emitTwo (events.js:106:13)
node-pre-gyp ERR! stack at ChildProcess.emit (events.js:191:7)
node-pre-gyp ERR! stack at maybeClose (internal/child_process.js:877:16)
node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/c
ld_process.js:226:5)
node-pre-gyp ERR! System SunOS 5.11
node-pre-gyp ERR! command "/opt/local/bin/node" "/home/routing/node_modules/no
_or_tools/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /home/routing/node_modules/node_or_tools
node-pre-gyp ERR! node -v v6.9.2
node-pre-gyp ERR! -v v0.6.36
node-pre-gyp ERR! not ok
Failed to execute '/opt/local/bin/node /home/routing/node_modules/node-gyp/bin
ode-gyp.js configure --fallback-to-build --module=/home/routing/node_modules/n
e_or_tools/lib/binding/node_or_tools.node --module_name=node_or_tools --module
ath=/home/routing/node_modules/node_or_tools/lib/binding' (1)
I've tried to build the Dockerfile as a step to deploy a testing app to AWS EC2, but I got this error:
Error: /usr/local/src/app/lib/binding/node_or_tools.node: invalid ELF header
at Error (native)
at Object.Module._extensions..node (module.js:434:18)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/usr/local/src/app/lib/index.js:1:18)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/usr/local/src/app/test/tsp.js:2:15)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
Error: /usr/local/src/app/lib/binding/node_or_tools.node: invalid ELF header
at Error (native)
at Object.Module._extensions..node (module.js:434:18)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/usr/local/src/app/lib/index.js:1:18)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/usr/local/src/app/test/vrp.js:2:15)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
test/tsp.js
1) test/tsp.js
test/vrp.js
2) test/vrp.js
0 passing (726.356ms)
2 failing
1) test/tsp.js test/tsp.js:
test/tsp.js
2) test/vrp.js test/vrp.js:
test/vrp.js
npm ERR! Test failed. See above for more details.
The command '/bin/sh -c apt-get update && apt-get install -y curl python make g++ && (curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash) && export NVM_DIR="$HOME/.nvm" && . ${NVM_DIR}/nvm.sh && nvm install 4.8 && nvm use 4.8 && npm install --unsafe-perm && npm test && apt-get clean && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 1
Also, I tried to run bash in a container of the resulted image:
docker run -it --rm 31f486c07bf6 /bin/bash
but it seems that npm/node are not installed? :
root@35c9b4eca133:/usr/local/src/app# npm
bash: npm: command not found
root@35c9b4eca133:/usr/local/src/app# node index
bash: node: command not found
root@35c9b4eca133:/usr/local/src/app# cd examples
bash: cd: examples: No such file or directory
root@35c9b4eca133:/usr/local/src/app# node index
bash: node: command not found
I've tried to run the example, however, I got this error:
/home/ubuntu/ortools/node-or-tools-master/example/index.js:78
MbxClient.getMatrix(locations.map(function (coord) { return { longitude: coord[0], latitude: coord[1] } }), {profile: profile}, function(err, results) {
^
TypeError: MbxClient.getMatrix is not a function
at Object.<anonymous> (/home/ubuntu/ortools/node-or-tools-master/example/index.js:78:11)
at Module._compile (module.js:410:26)
at Object.Module._extensions..js (module.js:417:10)
at Module.load (module.js:344:32)
at Function.Module._load (module.js:301:12)
at Module.runMain [as _onTimeout] (module.js:442:10)
at Timer.listOnTimeout (timers.js:92:15)
Process exited with code: 1
I am sure that MbxClient
is initialized, and I can see it in debugger as attached snapshot:
As for installed dependencies versions as below: ( [email protected]
)
ubuntu@ip-172-31-29-171:~/ortools/node-or-tools-master/example$ npm list
[email protected] /home/ubuntu/ortools/node-or-tools-master/example
├── @turf/[email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ └─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ ├── [email protected]
│ │ │ │ └─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├─┬ [email protected]
│ │ │ │ └── [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ └─┬ [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ └── [email protected]
└─┬ [email protected]
└─┬ [email protected]
├─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ └─┬ [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├─┬ [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ ├── [email protected]
│ │ │ └─┬ [email protected]
│ │ │ └── [email protected]
│ │ └─┬ [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ ├─┬ [email protected]
│ │ │ └── [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ ├── [email protected]
│ └── [email protected]
├─┬ [email protected]
│ └─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └─┬ [email protected]
│ │ ├── [email protected]
│ │ └── [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├─┬ [email protected]
│ │ └── [email protected]
│ └── [email protected]
└─┬ [email protected]
├─┬ [email protected]
│ └── [email protected]
├── [email protected]
├─┬ [email protected]
│ └── [email protected]
├─┬ [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ ├── [email protected]
│ └── [email protected]
└── [email protected]
So, do I miss something? please advice..
We should expose the possibility to specify multiple time windows per location.
Use-case: you can service a location between 9am--11am and between 1pm--3pm.
Implementation:
CumulVar(n)->SetRange(minStart, maxStop)
CumulVar(n)->RemoveInterval(stop, start)
.At the moment all routes start and end at a single depot. Always.
We should allow for vehicles to start already "on the road".
Use-case: real-time passenger pick up and drop-off "ride sharing".
Implementation:
Add dummy depot with artificial edges to all start locations. Set edge costs to zero.
In your example..
var vrpSolverOpts = {
numNodes: 3,
costs: [[0, 10, 10], [10, 0, 10], [10, 10, 0]],
durations: [[0, 2, 2], [2, 0, 2], [2, 2, 0]],
timeWindows: [[0, 9], [2, 3], [2, 3]], //<<<< here
demands: [[0, 0, 0], [1, 1, 1], [1, 1, 1]]
};
timeWindows
variable is including a value for the depot index, it must be a full time window? It is represented as hour?
As I am reviewing the source code of node example, I did not understand the depotIndex, can you please explain it?
Also, how to define origin point? considering locations
are all destinations?
Last question please, in the example, there is:
// 9am -- 5pm
var dayStarts = 0;
var dayEnds = 8 * 60 * 60;
how did you figure out the 9am ? as dayStarts equals to zero?
Thank you!
Hi, @daniel-j-h.
I have tried this library with these params.
numNodes = 7 (except depot)
demands = all 1
numVehicles = 3
and if I use vehicleCapacity >= 5 it will return just 2 routes and another empty route with cost 8778.
If I use vehicleCapacity = 4 it will return 3 routes with cost 9892.
How can I set the results to have full routes?
Thank you for your response.
ps. sry for my Eng, hope you understand.
Hey, guys. Thanks for making a great library. I'm getting beautifully optimized routes!
My issue revolves around the resulting library size. Pulling from npm, this library comes in at a chunk of 475 MB, and it looks like the biggest piece is libtools.a
@ 317 MB.
Is there any way I can reduce this size? We were really hoping to use this in a Lambda function to build optimal routes for our fleet, but the Lambda max is 250 MB. Is there another version of libtools.a
or node-or-tools in general that's a bit slimmer?
Thanks a lot for any help!
Edit: Using --build-from-source
doesn't work either if it helps.
npm i
> [email protected] install /Users/Jari/Copy/www/node-or-tools
> node-pre-gyp install --fallback-to-build
node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.4/Release/node-v51-darwin-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and [email protected] (node-v51 ABI) (falling back to source compile with node-gyp)
It only 403's with darwin, the linux binary does exist.
Hey,
There is this issue where providing a pair of pickup and delivery indices would lead to this error message: Unable to find a solution
It should return a valid route order based on cost array.
Returns Unable to find a solution
node-or-tools/test/vrp.js
file content to a new filesearchOpts
. pickups: [4, 7],
deliveries: [7, 10]
I have a pair of pickup and delivery indices and I want to visit one or more stops before visiting others.
This is my code snippet. You could see that if we remove the pickup and delivery indices, the code will work but after adding aforementioned indices, it returns Unable to find a solution
module.exports = () => {
const ortools = require('node_or_tools')
var locations = [
[0, 0], [0, 1], [0, 2], [0, 3],
[1, 0], [1, 1], [1, 2], [1, 3],
[2, 0], [2, 1], [2, 2], [2, 3],
[3, 0], [3, 1], [3, 2], [3, 3]]
var depot = 0
function manhattanDistance(lhs, rhs) {
return Math.abs(lhs[0] - rhs[0]) + Math.abs(lhs[1] - rhs[1])
}
var costMatrix = new Array(locations.length)
for (var from = 0; from < locations.length; ++from) {
costMatrix[from] = new Array(locations.length)
for (var to = 0; to < locations.length; ++to) {
costMatrix[from][to] = manhattanDistance(locations[from], locations[to])
}
}
var dayStarts = Hours(0)
var dayEnds = Hours(3)
var seed = 2147483650
function ParkMillerRNG(seed) {
var modulus = 2147483647
var multiplier = 48271
var increment = 0
var state = seed
return function() {
state = (multiplier * state + increment) % modulus
return state / modulus
}
}
var rand = ParkMillerRNG(seed)
function Seconds(v) {
return v
}
function Minutes(v) {
return Seconds(v * 60)
}
function Hours(v) {
return Minutes(v * 60)
}
var durationMatrix = new Array(locations.length)
for (var from = 0; from < locations.length; ++from) {
durationMatrix[from] = new Array(locations.length)
for (var to = 0; to < locations.length; ++to) {
var serviceTime = Minutes(3)
var travelTime = Minutes(costMatrix[from][to])
durationMatrix[from][to] = serviceTime + travelTime
}
}
var timeWindows = new Array(locations.length)
for (var at = 0; at < locations.length; ++at) {
if (at === depot) {
timeWindows[at] = [dayStarts, dayEnds]
continue
}
var earliest = dayStarts
var latest = dayEnds - Hours(1)
var start = rand() * (latest - earliest) + earliest
var stop = rand() * (latest - start) + start
timeWindows[at] = [start, stop]
}
var demandMatrix = new Array(locations.length)
for (var from = 0; from < locations.length; ++from) {
demandMatrix[from] = new Array(locations.length)
for (var to = 0; to < locations.length; ++to) {
if (from === depot)
demandMatrix[from][to] = 0
else
demandMatrix[from][to] = 1
}
}
var solverOpts = {
numNodes: locations.length,
costs: costMatrix,
durations: durationMatrix,
timeWindows: timeWindows,
demands: demandMatrix
}
var VRP = new ortools.VRP(solverOpts)
var numVehicles = 10
var timeHorizon = dayEnds - dayStarts
var vehicleCapacity = 10
// Dummy lock to let vehicle 0 go to location 2 and 3 first - to test route locks
var routeLocks = new Array(numVehicles)
for (var vehicle = 0; vehicle < numVehicles; ++vehicle) {
if (vehicle === 0)
routeLocks[vehicle] = [2, 3]
else
routeLocks[vehicle] = []
}
var searchOpts = {
computeTimeLimit: 1000,
numVehicles: numVehicles,
depotNode: depot,
timeHorizon: timeHorizon,
vehicleCapacity: vehicleCapacity,
routeLocks: routeLocks,
pickups: [4, 7],
deliveries: [7, 10]
}
VRP.Solve(searchOpts, function(err, solution) {
console.log('**********************')
console.log(err,solution)
console.log('**********************')
function used(v) {
return v.length == 0 ? 0 : 1
}
function addition(l, r) {
return l + r
}
var numVehiclesUsed = solution.routes.map(used).reduce(addition, 0)
function checkRoute(v) {
var depotInRoute = v.find(function(u) {
return u == depot
})
}
function checkTimeWindows(v) {
v.forEach(function(u) {
})
}
solution.routes.forEach(checkRoute)
solution.times.forEach(checkTimeWindows)
})
}
Hi,
I'am trying to minimize the number of vehicles while enforcing to maximize their usage. A vehicle can make a route of maximum 7 hours (I calculate "distance" base on time). To do this I use the following lines of code:
However, for what I saw it is apply as a maximum but not as a maximizer. Our idea is that if the algorithm finds 2 routes, then 1 route should be almost 7 hours lenght and the other only the necessary.
Thanks for you time,
Regards,
Support different types of vehicles such as walk, bike, car.
Could also be used to model "skill sets" when dispatching employees.
This requires the user to hand us vehicle-class specific
Implementation:
For Costs:
Use SetArcCostEvaluatorOfVehicle
and provide callback on a per-vehicle basis. We now require numVehicle cost matrices from the user.
For Time Dimension:
Use AddDimensionWithVehicleTransits
. Takes a vector of transition time evaluators per vehicle for pairs of nodes. Evaluator(i, j) { return ServiceTime(i) + TransitionTime(i, j); }
. We now require numVehicle duration matrices from the user.
For Capacity Dimension:
Use AddDimensionWithVehicleCapacity
. See explanation above.
For Time and Capacity:
Use AddDimensionWithVehicleTransitAndCapacity
. See explanation above.
When I try to install the example here: https://github.com/mapbox/node-or-tools/tree/master/example I get error:
Error: Cannot find module './binding/node_or_tools.node'
at Function.Module._resolveFilename (module.js:325:15)
at Function.Module._load (module.js:276:25)
at Module.require (module.js:353:17)
at require (internal/module.js:12:17)
at Object.<anonymous> (/Users/samir/Downloads/node-or-tools-master/lib/index.js:1:80)
at Module._compile (module.js:409:26)
at Object.Module._extensions..js (module.js:416:10)
at Module.load (module.js:343:32)
at Function.Module._load (module.js:300:12)
at Module.require (module.js:353:17)
although I did:
npm install
and I can see node_or_tools
is already installed:
npm WARN package.json [email protected] No repository field.
> [email protected] install /Users/samir/Downloads/node-or-tools-master/example/node_modules/node_or_tools
> node-pre-gyp install --fallback-to-build
[node_or_tools] Success: "/Users/samir/Downloads/node-or-tools-master/example/node_modules/node_or_tools/lib/binding/node_or_tools.node" already installed
Pass --update-binary to reinstall or --build-from-source to recompile
any idea?
Depends on having pre-built binary dependency in mason mapbox/mason#417.
Should be rigorously tested first.
i have been able to run your example, also modified it with OSRM to get more than 25 locations.
Did some other examples with more locations and vehicles, and everything works great.
But now i am going to go one step further and test other parameters, but I don't really understand the duration, can you please explain it?
This is what is written in the API docs.
durations
Array
Duration array the solver uses for time constraints. Two-dimensional with durations[from][to] being aNumber
representing the duration for servicing node from plus the time for traversing the arc from from to to.
I will try to explain the mean i understand, is it the time that takes to go from pointA to pointB plus the time the driver will stay in pointB
Supposing i will stay 10 minutes in each point
Distances Durations(Travel) Durations(Travel + Time servicing node)
| A - B - C | | A - B - C | | A - B - C |
A | 0 - 10 - 20 | A | 0 - 10 - 30 | A | 0 - 20 - 40 |
B | 10 - 0 - 10 | B | 10 - 0 - 10 | B | 20 - 0 - 20 |
C | 20 - 10 - 0 | C | 30 - 10 - 0 | C | 40 - 20 - 0 |
// And this is represented in the array as
distances = [[0,10,20],[10,0,10],[20,10,0]];
// durationTravel = [[0,10,20],[10,0,10],[20,10,0]]; // without the time servicing node
durationTravelPlusTimeServicing = [[0,20,40],[20,0,20],[40,20,0]];
Also i have another doubt about demand parameter. This is the definition in the readme
demands
Array
Demands array the solver uses for vehicle capacity constraints. Two-dimensional withdemands[from][to]
being a Number representing the demand at node from, for example number of packages to deliver to this location. The to node index is unused and reserved for future changes; set demands[at] to a constant array for now. The depot should have a demand of zero.
The instructions says that this has to be a bi-dimentional Array demands[from][to],
but only will read the from
value, how do you translate this?
// this is in the example
demands = [[0, 0, 0], [1, 1, 1], [1, 1, 1]];
/* if pointA demads 5 and pointB demands 10. How is going to be the array?,
I know first must be zero because it index to depot. */
demands = [[0,0,0], [5,5,5], [10,10,10]];
Is this correct?
Thank you!
This is very weird as it only happens if node_or_tools
is part of a package.json
with other packages, but it doesn't happen if node_or_tools
is the only package in the package.json
file.
Node version is v10.11.0
node-pre-gyp WARN Using request for node-pre-gyp https download
node-pre-gyp WARN Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.6/Release/node-v64-darwin-x64.tar.gz
node-pre-gyp WARN Pre-built binaries not found for [email protected] and [email protected] (node-v64 ABI, unknown) (falling back to source compile with node-gyp)
node-pre-gyp WARN Pre-built binaries not installable for [email protected] and [email protected] (node-v64 ABI, unknown) (falling back to source compile with node-gyp)
node-pre-gyp WARN Hit error Connection closed while downloading tarball file
ACTION binding_gyp_action_before_build_target_install_deps mason_packages
ACTION binding_gyp_action_before_build_target_install_deps mason_packages
Downloading Mason @ca9b4cb
Downloading Mason @ca9b4cb
* Downloading binary package osx-x86_64/protobuf/3.0.0.tar.gz...
* Downloading binary package osx-x86_64/protobuf/3.0.0.tar.gz...
* Installed binary package at /xxx/node_modules/node_or_tools/mason_packages/osx-x86_64/protobuf/3.0.0
* Linking /xxx/node_modules/node_or_tools/mason_packages/osx-x86_64/protobuf/3.0.0
* Links will be inside /xxx/node_modules/node_or_tools/mason_packages/.link/
* Using bash fallback for symlinking (install lndir for faster symlinking)
mv: cannot stat '/xxx/node_modules/node_or_tools/mason_packages/.binaries/osx-x86_64/protobuf/3.0.0.tar.gz.tmp': No such file or directory
The src folder exists in the repo but not in the npm package (it seems).
It's explicitly ignored in .npmignore
, why?
Environment
OSX/Linux (tried both)
Reproducible by
run npm install node_or_tools --build-from-source
Expectation
Building from source succeeds.
Logs
OSX: (full)
TOUCH Release/obj.target/action_before_build.stamp
SOLINK_MODULE(target) node_modules/node_or_tools/lib/binding/node_or_tools.node
clang: error: no such file or directory: 'Release/obj.target/node_or_tools/src/main.o'
clang: error: no such file or directory: 'Release/obj.target/node_or_tools/src/tsp.o'
clang: error: no such file or directory: 'Release/obj.target/node_or_tools/src/vrp.o'
make: *** [node_modules/node_or_tools/lib/binding/node_or_tools.node] Error 1
Linux: (full)
TOUCH Release/obj.target/action_before_build.stamp
SOLINK_MODULE(target) /usr/src/app/node_modules/node_or_tools/lib/binding/node_or_tools.node
g++: error: Release/obj.target/node_or_tools/src/main.o: No such file or directory
g++: error: Release/obj.target/node_or_tools/src/tsp.o: No such file or directory
g++: error: Release/obj.target/node_or_tools/src/vrp.o: No such file or directory
make: *** [/usr/src/app/node_modules/node_or_tools/lib/binding/node_or_tools.node] Error 1
node_or_tools.target.mk:156: recipe for target '/usr/src/app/node_modules/node_or_tools/lib/binding/node_or_tools.node' failed
The system supports only up to GLIBCXX_3.4.19. Any ideas on how to make it work?
The highest possible installed version is: libstdc++.i686 4.8.5-16.el7
I
any plan for supporting recent node version ?
node-pre-gyp WARN Using request for node-pre-gyp https download
node-pre-gyp WARN Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.6/Release/node-v67-linux-x64.tar.gz
node-pre-gyp WARN Pre-built binaries not found for [email protected] and [email protected] (node-v67 ABI, glibc) (falling back to source compile with node-gyp)
node-pre-gyp WARN Pre-built binaries not installable for [email protected] and [email protected] (node-v67 ABI, glibc) (falling back to source compile with node-gyp)
node-pre-gyp WARN Hit error Connection closed while downloading tarball file
Installation for the user should be as easy as
npm install node-or-tools
We already get our dependencies via mason and have a gyp-based buildsystem.
What's missing is using node-pre-gyp
on Travis to build and publish pre-build node-or-tools
binaries. Then we can npm publish
a package to npm.
We should support drivers starting at a specific time (i.e. not all at the begin of the day).
Implementation:
Constrain the min. arrival time at the route's first location:
auto index = model.Start(0);
auto* var = model.CumulVar(index, "Time");
var->SetMin(10am);
At the moment users can pass in a durations matrix for costs and we will minimize the total number of vehicle driving hours. In contrast, this ticket is about minimizing the total duration vehicles are on the road.
Implementation:
Minimize the route's end cumul var. for the time dimension. This will minimize the overall completion time.
for (auto vehicle = 0; vehicle < model.vehicles(); ++vehicle)
model.AddVariableMinimizedByFinalizer(model.CumulVar(model.End(vehicle), timeDimension));
I am working with routeLocks
to assign some points to a certain route and to visit them along with others remain, in a optimized way. But instead it just makes the VRP
to push them in first place to visit starting the route without analyze if those points are optimized.
As you can see in the image red route start from point depot, goes to point 1, next it goes back to point 2, and goes to point 3 which is close to point 1. With routeLock
I expected to assign those points to certain route and visit them optimized. As you can see the route is not optimized, it goes far away, and then comes close to depot, then goes far away close to the first point and come back to depot, the traveling time is the highest possible.
Any help?
Did I understand wrong?
Is Node-or-tools
capable to solve this and assign points to a route and visit them in a optimized way?
There are a few knobs we can tune and constraints we can set, especially here:
We should aim for common use-cases and make the API surface easy to use. At the same time it should be possible to tune your search based on the user's domain knowledge.
I just tried to test this repo at EC2, I've checked the linux flavor:
$ cat /proc/version
Linux version 4.9.51-10.52.amzn1.x86_64 (mockbuild@gobi-build-64010) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) ) #1 SMP Fri Sep 29 01:16:19 UTC 2017
if I tried to run npm install
I got this result:
ec2-user:~/environment/node-or-tools-master $ npm install
> [email protected] install /home/ec2-user/environment/node-or-tools-master/node_modules/node_or_tools
> node-pre-gyp install --fallback-to-build
[node_or_tools] Success: "/home/ec2-user/environment/node-or-tools-master/node_modules/node_or_tools/lib/binding/node_or_tools.node" is installed via remote
> [email protected] install /home/ec2-user/environment/node-or-tools-master
> node-gyp rebuild
gyp WARN download NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, please use NODEJS_ORG_MIRROR
gyp WARN download NVM_NODEJS_ORG_MIRROR is deprecated and will be removed in node-gyp v4, please use NODEJS_ORG_MIRROR
gyp: Undefined variable module_path in binding.gyp while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:305:16)
gyp ERR! stack at emitTwo (events.js:106:13)
gyp ERR! stack at ChildProcess.emit (events.js:191:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:219:12)
gyp ERR! System Linux 4.9.51-10.52.amzn1.x86_64
gyp ERR! command "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node" "/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /home/ec2-user/environment/node-or-tools-master
gyp ERR! node -v v6.11.4
gyp ERR! node-gyp -v v3.4.0
gyp ERR! not ok
npm WARN [email protected] No repository field.
npm WARN [email protected] No license field.
npm ERR! Linux 4.9.51-10.52.amzn1.x86_64
npm ERR! argv "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node" "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/npm" "install"
npm ERR! node v6.11.4
npm ERR! npm v3.10.10
npm ERR! code ELIFECYCLE
npm ERR! [email protected] install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script 'node-gyp rebuild'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the node_or_tools_example package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR! node-gyp rebuild
npm ERR! You can get information on how to open an issue for this project with:
npm ERR! npm bugs node_or_tools_example
npm ERR! Or if that isn't available, you can get their info via:
npm ERR! npm owner ls node_or_tools_example
npm ERR! There is likely additional logging output above.
npm ERR! Please include the following file with any support request:
npm ERR! /home/ec2-user/environment/node-or-tools-master/npm-debug.log
/home/ec2-user/environment/node-or-tools-master/npm-debug.log:
0 info it worked if it ends with ok
1 verbose cli [ '/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node',
1 verbose cli '/home/ec2-user/.nvm/versions/node/v6.11.4/bin/npm',
1 verbose cli 'install' ]
2 info using [email protected]
3 info using [email protected]
4 silly loadCurrentTree Starting
5 silly install loadCurrentTree
6 silly install readLocalPackageData
7 silly install normalizeTree
8 silly loadCurrentTree Finishing
9 silly loadIdealTree Starting
10 silly install loadIdealTree
11 silly cloneCurrentTree Starting
12 silly install cloneCurrentTreeToIdealTree
13 silly cloneCurrentTree Finishing
14 silly loadShrinkwrap Starting
15 silly install loadShrinkwrap
16 silly loadShrinkwrap Finishing
17 silly loadAllDepsIntoIdealTree Starting
18 silly install loadAllDepsIntoIdealTree
19 silly loadAllDepsIntoIdealTree Finishing
20 silly loadIdealTree Finishing
21 silly currentTree [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ ├── [email protected]
21 silly currentTree │ │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree └─┬ [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ │ └── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ ├── [email protected]
21 silly currentTree │ │ │ └─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├─┬ [email protected]
21 silly currentTree │ │ │ └── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ ├── [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ ├─┬ [email protected]
21 silly currentTree │ │ └── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ ├── [email protected]
21 silly currentTree │ └─┬ [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├─┬ [email protected]
21 silly currentTree │ └── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree ├── [email protected]
21 silly currentTree └── [email protected]
22 silly idealTree [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ ├── [email protected]
22 silly idealTree │ │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree └─┬ [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ │ └── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ ├── [email protected]
22 silly idealTree │ │ │ └─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├─┬ [email protected]
22 silly idealTree │ │ │ └── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ ├── [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ ├─┬ [email protected]
22 silly idealTree │ │ └── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ ├── [email protected]
22 silly idealTree │ └─┬ [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├─┬ [email protected]
22 silly idealTree │ └── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree ├── [email protected]
22 silly idealTree └── [email protected]
23 silly generateActionsToTake Starting
24 silly install generateActionsToTake
25 silly generateActionsToTake Finishing
26 silly diffTrees action count 0
27 silly decomposeActions action count 0
28 silly runTopLevelLifecycles Starting
29 silly install runPreinstallTopLevelLifecycles
30 silly preinstall [email protected] /home/ec2-user/environment/node-or-tools-master/node_or_tools_example-72236f2b
31 info lifecycle [email protected]~preinstall: [email protected]
32 silly lifecycle [email protected]~preinstall: no script for preinstall, continuing
33 silly executeActions Starting
34 silly install executeActions
35 silly doSerial global-install 0
36 silly doParallel fetch 0
37 verbose correctMkdir /home/ec2-user/.npm/_locks correctMkdir not in flight; initializing
38 verbose lock using /home/ec2-user/.npm/_locks/staging-85dfaefb2836ee20.lock for /home/ec2-user/environment/node-or-tools-master/node_modules/.staging
39 silly doParallel extract 0
40 silly doParallel preinstall 0
41 silly doReverseSerial remove 0
42 silly doSerial move 0
43 silly doSerial finalize 0
44 silly doSerial build 0
45 silly doSerial global-link 0
46 silly doParallel update-linked 0
47 silly doSerial install 0
48 silly doSerial postinstall 0
49 verbose unlock done using /home/ec2-user/.npm/_locks/staging-85dfaefb2836ee20.lock for /home/ec2-user/environment/node-or-tools-master/node_modules/.staging
50 silly executeActions Finishing
51 silly rollbackFailedOptional Starting
52 silly rollbackFailedOptional Finishing
53 silly install runPostinstallTopLevelLifecycles
54 silly build [email protected]
55 info linkStuff [email protected]
56 silly linkStuff [email protected] has /home/ec2-user/environment as its parent node_modules
57 verbose linkBins [email protected]
58 verbose linkMans [email protected]
59 silly install [email protected] /home/ec2-user/environment/node-or-tools-master/node_or_tools_example-72236f2b
60 info lifecycle [email protected]~install: [email protected]
61 verbose lifecycle [email protected]~install: unsafe-perm in lifecycle true
62 verbose lifecycle [email protected]~install: PATH: /home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/bin/node-gyp-bin:/home/ec2-user/environment/node-or-tools-master/node_modules/.bin:/home/ec2-user/.nvm/versions/node/v6.11.4/bin:/usr/local/rvm/gems/ruby-2.4.1/bin:/usr/local/rvm/gems/ruby-2.4.1@global/bin:/usr/local/rvm/rubies/ruby-2.4.1/bin:/usr/local/bin:/bin:/usr/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/opt/aws/bin:/usr/local/rvm/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin
63 verbose lifecycle [email protected]~install: CWD: /home/ec2-user/environment/node-or-tools-master
64 silly lifecycle [email protected]~install: Args: [ '-c', 'node-gyp rebuild' ]
65 silly lifecycle [email protected]~install: Returned: code: 1 signal: null
66 info lifecycle [email protected]~install: Failed to exec install script
67 warn [email protected] No repository field.
68 verbose If you need help, you may report this error at:
68 verbose <https://github.com/npm/npm/issues>
69 warn [email protected] No license field.
70 verbose If you need help, you may report this error at:
70 verbose <https://github.com/npm/npm/issues>
71 verbose stack Error: [email protected] install: `node-gyp rebuild`
71 verbose stack Exit status 1
71 verbose stack at EventEmitter.<anonymous> (/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/lib/utils/lifecycle.js:255:16)
71 verbose stack at emitTwo (events.js:106:13)
71 verbose stack at EventEmitter.emit (events.js:191:7)
71 verbose stack at ChildProcess.<anonymous> (/home/ec2-user/.nvm/versions/node/v6.11.4/lib/node_modules/npm/lib/utils/spawn.js:40:14)
71 verbose stack at emitTwo (events.js:106:13)
71 verbose stack at ChildProcess.emit (events.js:191:7)
71 verbose stack at maybeClose (internal/child_process.js:920:16)
71 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:230:5)
72 verbose pkgid [email protected]
73 verbose cwd /home/ec2-user/environment/node-or-tools-master
74 error Linux 4.9.51-10.52.amzn1.x86_64
75 error argv "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/node" "/home/ec2-user/.nvm/versions/node/v6.11.4/bin/npm" "install"
76 error node v6.11.4
77 error npm v3.10.10
78 error code ELIFECYCLE
79 error [email protected] install: `node-gyp rebuild`
79 error Exit status 1
80 error Failed at the [email protected] install script 'node-gyp rebuild'.
80 error Make sure you have the latest version of node.js and npm installed.
80 error If you do, this is most likely a problem with the node_or_tools_example package,
80 error not with npm itself.
80 error Tell the author that this fails on your system:
80 error node-gyp rebuild
80 error You can get information on how to open an issue for this project with:
80 error npm bugs node_or_tools_example
80 error Or if that isn't available, you can get their info via:
80 error npm owner ls node_or_tools_example
80 error There is likely additional logging output above.
81 verbose exit [ 1, true ]
In case of an error in the bindings we use SetErrorMessage in both the TSP and VRP worker to let NAN generate an Js Error for us. What we should add is not only a message but also a parse-able code, think:
{code: 'Timeout', message: 'Unable to find a solution, solver timed out'}
Implementation: in the async. workers override
void HandleErrorCallback()
and generate a Js Error object.
i got dis error in an attempt to in node-or-tool as npm successful installation
npm ERR! Linux 4.15.0-30-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install" "node-or-tools-master"
npm ERR! node v4.9.1
npm ERR! npm v2.15.11
npm ERR! code E404
npm ERR! 404 Not found : node-or-tools-master
npm ERR! 404
npm ERR! 404 'node-or-tools-master' is not in the npm registry.
npm ERR! 404 You should bug the author to publish it (or use the name yourself!)
npm ERR! 404
npm ERR! 404 Note that you can also install from a
npm ERR! 404 tarball, folder, http url, or git url.
npm ERR! Please include the following file with any support request:
npm ERR! /home/bunmalik/Desktop/thesis/codes/c++/Untitled Folder/npm-debug.log
Please I need guidance to go about this
i want minimize network time in other words: each vehicle time should be minimized as possible
1- this means force all vehicle to service locations
2- and balance number of locations serviced per vehicle
3- and minimizes the time the last vehicle will arrive to its end node
@daniel-j-h what you said about forcing all vehicle works fine but others not working at all
do you have any idea to do number 3?
We should output the capacity each vehicle has before / after servicing a location.
Use-case: being able to tell the vehicle's load at a specific time and place.
Implementation:
const auto* loadVar = capacityDimension.CumulVar(index);
assignment->Value(loadVar)
When doing npm install node_or_tools
with a non-LTS Node version, I receive the following error (relevant lines are the first three):
node-pre-gyp ERR! Tried to download(403): https://mapbox-node-binary.s3.amazonaws.com/node_or_tools/v1.0.3/Release/node-v51-darwin-x64.tar.gz
node-pre-gyp ERR! Pre-built binaries not found for [email protected] and [email protected] (node-v51 ABI) (falling back to source compile with node-gyp)
gyp: binding.gyp not found (cwd: /Users/.../node_modules/node_or_tools) while trying to load binding.gyp
gyp ERR! configure error
gyp ERR! stack Error: `gyp` failed with exit code: 1
gyp ERR! stack at ChildProcess.onCpExit (/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:336:16)
gyp ERR! stack at emitTwo (events.js:106:13)
gyp ERR! stack at ChildProcess.emit (events.js:194:7)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:215:12)
gyp ERR! System Darwin 16.6.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "configure" "--fallback-to-build" "--module=/Users/.../node_modules/node_or_tools/lib/binding/node_or_tools.node" "--module_name=node_or_tools" "--module_path=/Users/.../node_modules/node_or_tools/lib/binding"
gyp ERR! cwd /Users/.../node_modules/node_or_tools
gyp ERR! node -v v7.10.1
gyp ERR! node-gyp -v v3.6.2
gyp ERR! not ok
node-pre-gyp ERR! build error
node-pre-gyp ERR! stack Error: Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/Users/.../node_modules/node_or_tools/lib/binding/node_or_tools.node --module_name=node_or_tools --module_path=/Users/.../node_modules/node_or_tools/lib/binding' (1)
node-pre-gyp ERR! stack at ChildProcess.<anonymous> (/Users/.../node_modules/node_or_tools/node_modules/node-pre-gyp/lib/util/compile.js:83:29)
node-pre-gyp ERR! stack at emitTwo (events.js:106:13)
node-pre-gyp ERR! stack at ChildProcess.emit (events.js:194:7)
node-pre-gyp ERR! stack at maybeClose (internal/child_process.js:899:16)
node-pre-gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5)
node-pre-gyp ERR! System Darwin 16.6.0
node-pre-gyp ERR! command "/usr/local/bin/node" "/Users/.../node_modules/node_or_tools/node_modules/.bin/node-pre-gyp" "install" "--fallback-to-build"
node-pre-gyp ERR! cwd /Users/.../node_modules/node_or_tools
node-pre-gyp ERR! node -v v7.10.1
node-pre-gyp ERR! node-pre-gyp -v v0.6.36
node-pre-gyp ERR! not ok
Failed to execute '/usr/local/bin/node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js configure --fallback-to-build --module=/Users/.../node_modules/node_or_tools/lib/binding/node_or_tools.node --module_name=node_or_tools --module_path=/Users/.../node_modules/node_or_tools/lib/binding' (1)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: `node-pre-gyp install --fallback-to-build`
npm ERR! Exit status 1
This seems to be caused by the ignoring of bindings.gyp in the .npmignore. Is this intentional?
Can you provide a way to package the official ortools into a static link library, I failed to use bazel packaging, thank you
We have around 400 missions/locations. From what I understand, that means we need to start with 400x400 distance matrix. Both yours and Google's Distance Matrix APIs have a maximum of 25x25.
Is it expected that I make many (about 256) requests, and then merge the matrixes myself?
And if the Distance Matrix API can only handle 25x25, is OR-Tools even built to handle this many locations? Or am I supposed to do some sort of pre-culling before creating the matrix?
We need to be able to set multiple possible time windows for each customer (for example, one customer might be available 8-10 and 18-20, but not 10-18).
Node-or-tools only accepts one time window per node though...
I looked at the original OR-Tools docs too, and it seems to be the same there, so not just a limit of node-or-tools: https://developers.google.com/optimization/routing/tsp/vehicle_routing_time_windows
This seems like it would be a pretty common request, especially when you want to optimize schedules/routes for a whole week. I don't think this would add much to the computational complexity btw, as you're just splitting a range into blocks.
Do you have any suggestions? :)
We should provide an option to force all vehicles on the road.
Probably goes hand in hand with the fairness constraint, see #1.
Implementation: remove the depot from the start's NextVar
, so vehicles have to service locations:
model.CloseModel()
for (auto vehicle = 0; vehicle < numVehicles; ++vehicle) {
IntVar* const start = routing.NextVar(routing.Start(vehicle));
for (auto node = routing.Size(); node < routing.Size() + routing.vehicles(); ++node)
start->RemoveValue(node);
}
We should expose an option to configure locations as being optional.
Potentially adding a penalty to the solution if the location is not serviced.
Implementation: see model.AddDisjunction()
At the moment we expose a single vehicleCapacity
property. With it users can set the capacities for all their vehicles. What we should do instead is expose a vehicleCapacities
property (parallel array coinciding with the vehicles) where the user can specify a capacity on a per vehicle basis.
Related: Heterogeneous Fleets #11
cc @karenzshea
Hi @daniel-j-h , what a wonderful project you've got here! We at letsjobit.com have an app that does order management and planning alongside with route optimisation. Our app is built with Meteor.js (thus, in the nodejs world) but the optimiser is a customized version or o-tools, built in C++.
Our optimisation servers are nodejs services running C++ binaries with child_process
basically.
After seeing your project, I'm sure this is the way to go, but we lack the expertise on some of the libraries you're using (like NAN).
Would you be willing to point us in the right direction here or sharing the contact of someone that could assist?
Many thanks and well done!!
Looks like v6.7.1 of or-tools has been released. We're currently only linking against 6.0 (from May, 2017). We should update, and see if there are new knobs we can expose.
While testing the VPR with ~ 500 destinations with demands, some calculated tours are slightly over the given vehicle capacity. The given demands are floats with 2 decimals. Making the vehicle capacity and the demands integers (by multiply by 100), all the tour-demands are just below the vehicle capacity, which is correct.
https://github.com/mapbox/node-or-tools/blob/master/API.md#constructor-1 = Numbers. Floats are numbers, too.
Is this an error in documentation or a bug in the node-or-tools?
Hey, can I have an example of how to implement the following in the Google OR with time windows:
I know I have to use AddDimensionWithVehicleTransits but I dont know how to use it.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.