From 23dd9d8f043b13bf97f65c812f6402f4ae032ab8 Mon Sep 17 00:00:00 2001 From: Adam Shumann Date: Sat, 9 Sep 2017 13:06:01 -0500 Subject: [PATCH] Initial Commit --- .gitignore | 2 + README | 1 + auth.sample.js | 7 + gulpfile.js | 12 + package.json | 28 ++ src/Traveler.js | 584 ++++++++++++++++++++++++++ src/main.js | 269 ++++++++++++ yarn.lock | 1043 +++++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 1946 insertions(+) create mode 100644 .gitignore create mode 100644 README create mode 100644 auth.sample.js create mode 100644 gulpfile.js create mode 100644 package.json create mode 100644 src/Traveler.js create mode 100644 src/main.js create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9078990 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +auth.js diff --git a/README b/README new file mode 100644 index 0000000..426e22a --- /dev/null +++ b/README @@ -0,0 +1 @@ +# ZeSwarm diff --git a/auth.sample.js b/auth.sample.js new file mode 100644 index 0000000..dec8cd6 --- /dev/null +++ b/auth.sample.js @@ -0,0 +1,7 @@ +module.exports = { + email: 'emailOrUsername', + password: 'password', + host: 'server1.screepspl.us', + port: 443, + secure: true +} diff --git a/gulpfile.js b/gulpfile.js new file mode 100644 index 0000000..b36a771 --- /dev/null +++ b/gulpfile.js @@ -0,0 +1,12 @@ +const gulp = require('gulp') +const screeps = require('gulp-screeps') +const auth = require('./auth.js') + +gulp.task('default', ['screeps']) + +gulp.task('screeps', [], () => { + auth.branch = auth.branch || 'default' + auth.ptr = auth.ptr || false + gulp.src(`src/*.js`) + .pipe(screeps(auth)) +}) \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..c1382e8 --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "screeps", + "version": "1.0.0", + "description": "", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "gulp" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ags131/screeps.git" + }, + "author": "", + "license": "ISC", + "bugs": { + "url": "https://github.com/ags131/screeps/issues" + }, + "homepage": "https://github.com/ags131/screeps#readme", + "dependencies": {}, + "devDependencies": { + "gulp": "^3.9.1", + "gulp-screeps": "^1.0.3" + } +} diff --git a/src/Traveler.js b/src/Traveler.js new file mode 100644 index 0000000..7f91964 --- /dev/null +++ b/src/Traveler.js @@ -0,0 +1,584 @@ +/** + * To start using Traveler, require it in main.js: + * Example: var Traveler = require('Traveler.js'); + */ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Traveler { + /** + * move creep to destination + * @param creep + * @param destination + * @param options + * @returns {number} + */ + static travelTo(creep, destination, options = {}) { + // uncomment if you would like to register hostile rooms entered + // this.updateRoomStatus(creep.room); + if (!destination) { + return ERR_INVALID_ARGS; + } + if (creep.fatigue > 0) { + Traveler.circle(creep.pos, "aqua", .3); + return ERR_BUSY; + } + destination = this.normalizePos(destination); + // manage case where creep is nearby destination + let rangeToDestination = creep.pos.getRangeTo(destination); + if (options.range && rangeToDestination <= options.range) { + return OK; + } + else if (rangeToDestination <= 1) { + if (rangeToDestination === 1 && !options.range) { + let direction = creep.pos.getDirectionTo(destination); + if (options.returnData) { + options.returnData.nextPos = destination; + options.returnData.path = direction.toString(); + } + return creep.move(direction); + } + return OK; + } + // initialize data object + if (!creep.memory._trav) { + delete creep.memory._travel; + creep.memory._trav = {}; + } + let travelData = creep.memory._trav; + let state = this.deserializeState(travelData, destination); + // uncomment to visualize destination + // this.circle(destination.pos, "orange"); + // check if creep is stuck + if (this.isStuck(creep, state)) { + state.stuckCount++; + Traveler.circle(creep.pos, "magenta", state.stuckCount * .2); + } + else { + state.stuckCount = 0; + } + // handle case where creep is stuck + if (!options.stuckValue) { + options.stuckValue = DEFAULT_STUCK_VALUE; + } + if (state.stuckCount >= options.stuckValue && Math.random() > .5) { + options.ignoreCreeps = false; + options.freshMatrix = true; + delete travelData.path; + } + // TODO:handle case where creep moved by some other function, but destination is still the same + // delete path cache if destination is different + if (!this.samePos(state.destination, destination)) { + if (options.movingTarget && state.destination.isNearTo(destination)) { + travelData.path += state.destination.getDirectionTo(destination); + state.destination = destination; + } + else { + delete travelData.path; + } + } + if (options.repath && Math.random() < options.repath) { + // add some chance that you will find a new path randomly + delete travelData.path; + } + // pathfinding + let newPath = false; + if (!travelData.path) { + newPath = true; + if (creep.spawning) { + return ERR_BUSY; + } + state.destination = destination; + let cpu = Game.cpu.getUsed(); + let ret = this.findTravelPath(creep.pos, destination, options); + let cpuUsed = Game.cpu.getUsed() - cpu; + state.cpu = _.round(cpuUsed + state.cpu); + if (state.cpu > REPORT_CPU_THRESHOLD) { + // see note at end of file for more info on this + console.log(`TRAVELER: heavy cpu use: ${creep.name}, cpu: ${state.cpu} origin: ${creep.pos}, dest: ${destination}`); + } + let color = "orange"; + if (ret.incomplete) { + // uncommenting this is a great way to diagnose creep behavior issues + // console.log(`TRAVELER: incomplete path for ${creep.name}`); + color = "red"; + } + if (options.returnData) { + options.returnData.pathfinderReturn = ret; + } + travelData.path = Traveler.serializePath(creep.pos, ret.path, color); + state.stuckCount = 0; + } + this.serializeState(creep, destination, state, travelData); + if (!travelData.path || travelData.path.length === 0) { + return ERR_NO_PATH; + } + // consume path + if (state.stuckCount === 0 && !newPath) { + travelData.path = travelData.path.substr(1); + } + let nextDirection = parseInt(travelData.path[0], 10); + if (options.returnData) { + if (nextDirection) { + let nextPos = Traveler.positionAtDirection(creep.pos, nextDirection); + if (nextPos) { + options.returnData.nextPos = nextPos; + } + } + options.returnData.state = state; + options.returnData.path = travelData.path; + } + return creep.move(nextDirection); + } + /** + * make position objects consistent so that either can be used as an argument + * @param destination + * @returns {any} + */ + static normalizePos(destination) { + if (!(destination instanceof RoomPosition)) { + return destination.pos; + } + return destination; + } + /** + * check if room should be avoided by findRoute algorithm + * @param roomName + * @returns {RoomMemory|number} + */ + static checkAvoid(roomName) { + return Memory.rooms && Memory.rooms[roomName] && Memory.rooms[roomName].avoid; + } + /** + * check if a position is an exit + * @param pos + * @returns {boolean} + */ + static isExit(pos) { + return pos.x === 0 || pos.y === 0 || pos.x === 49 || pos.y === 49; + } + /** + * check two coordinates match + * @param pos1 + * @param pos2 + * @returns {boolean} + */ + static sameCoord(pos1, pos2) { + return pos1.x === pos2.x && pos1.y === pos2.y; + } + /** + * check if two positions match + * @param pos1 + * @param pos2 + * @returns {boolean} + */ + static samePos(pos1, pos2) { + return this.sameCoord(pos1, pos2) && pos1.roomName === pos2.roomName; + } + /** + * draw a circle at position + * @param pos + * @param color + * @param opacity + */ + static circle(pos, color, opacity) { + new RoomVisual(pos.roomName).circle(pos, { + radius: .45, fill: "transparent", stroke: color, strokeWidth: .15, opacity: opacity + }); + } + /** + * update memory on whether a room should be avoided based on controller owner + * @param room + */ + static updateRoomStatus(room) { + if (!room) { + return; + } + if (room.controller) { + if (room.controller.owner && !room.controller.my) { + room.memory.avoid = 1; + } + else { + delete room.memory.avoid; + } + } + } + /** + * find a path from origin to destination + * @param origin + * @param destination + * @param options + * @returns {PathfinderReturn} + */ + static findTravelPath(origin, destination, options = {}) { + _.defaults(options, { + ignoreCreeps: true, + maxOps: DEFAULT_MAXOPS, + range: 1, + }); + if (options.movingTarget) { + options.range = 0; + } + origin = this.normalizePos(origin); + destination = this.normalizePos(destination); + let originRoomName = origin.roomName; + let destRoomName = destination.roomName; + // check to see whether findRoute should be used + let roomDistance = Game.map.getRoomLinearDistance(origin.roomName, destination.roomName); + let allowedRooms = options.route; + if (!allowedRooms && (options.useFindRoute || (options.useFindRoute === undefined && roomDistance > 2))) { + let route = this.findRoute(origin.roomName, destination.roomName, options); + if (route) { + allowedRooms = route; + } + } + let roomsSearched = 0; + let callback = (roomName) => { + if (allowedRooms) { + if (!allowedRooms[roomName]) { + return false; + } + } + else if (!options.allowHostile && Traveler.checkAvoid(roomName) + && roomName !== destRoomName && roomName !== originRoomName) { + return false; + } + roomsSearched++; + let matrix; + let room = Game.rooms[roomName]; + if (room) { + if (options.ignoreStructures) { + matrix = new PathFinder.CostMatrix(); + if (!options.ignoreCreeps) { + Traveler.addCreepsToMatrix(room, matrix); + } + } + else if (options.ignoreCreeps || roomName !== originRoomName) { + matrix = this.getStructureMatrix(room, options.freshMatrix); + } + else { + matrix = this.getCreepMatrix(room); + } + if (options.obstacles) { + matrix = matrix.clone(); + for (let obstacle of options.obstacles) { + if (obstacle.pos.roomName !== roomName) { + continue; + } + matrix.set(obstacle.pos.x, obstacle.pos.y, 0xff); + } + } + } + if (options.roomCallback) { + if (!matrix) { + matrix = new PathFinder.CostMatrix(); + } + let outcome = options.roomCallback(roomName, matrix.clone()); + if (outcome !== undefined) { + return outcome; + } + } + return matrix; + }; + let ret = PathFinder.search(origin, { pos: destination, range: options.range }, { + maxOps: options.maxOps, + maxRooms: options.maxRooms, + plainCost: options.offRoad ? 1 : options.ignoreRoads ? 1 : 2, + swampCost: options.offRoad ? 1 : options.ignoreRoads ? 5 : 10, + roomCallback: callback, + }); + if (ret.incomplete && options.ensurePath) { + if (options.useFindRoute === undefined) { + // handle case where pathfinder failed at a short distance due to not using findRoute + // can happen for situations where the creep would have to take an uncommonly indirect path + // options.allowedRooms and options.routeCallback can also be used to handle this situation + if (roomDistance <= 2) { + console.log(`TRAVELER: path failed without findroute, trying with options.useFindRoute = true`); + console.log(`from: ${origin}, destination: ${destination}`); + options.useFindRoute = true; + ret = this.findTravelPath(origin, destination, options); + console.log(`TRAVELER: second attempt was ${ret.incomplete ? "not " : ""}successful`); + return ret; + } + // TODO: handle case where a wall or some other obstacle is blocking the exit assumed by findRoute + } + else { + } + } + return ret; + } + /** + * find a viable sequence of rooms that can be used to narrow down pathfinder's search algorithm + * @param origin + * @param destination + * @param options + * @returns {{}} + */ + static findRoute(origin, destination, options = {}) { + let restrictDistance = options.restrictDistance || Game.map.getRoomLinearDistance(origin, destination) + 10; + let allowedRooms = { [origin]: true, [destination]: true }; + let highwayBias = 1; + if (options.preferHighway) { + highwayBias = 2.5; + if (options.highwayBias) { + highwayBias = options.highwayBias; + } + } + let ret = Game.map.findRoute(origin, destination, { + routeCallback: (roomName) => { + if (options.routeCallback) { + let outcome = options.routeCallback(roomName); + if (outcome !== undefined) { + return outcome; + } + } + let rangeToRoom = Game.map.getRoomLinearDistance(origin, roomName); + if (rangeToRoom > restrictDistance) { + // room is too far out of the way + return Number.POSITIVE_INFINITY; + } + if (!options.allowHostile && Traveler.checkAvoid(roomName) && + roomName !== destination && roomName !== origin) { + // room is marked as "avoid" in room memory + return Number.POSITIVE_INFINITY; + } + let parsed; + if (options.preferHighway) { + parsed = /^[WE]([0-9]+)[NS]([0-9]+)$/.exec(roomName); + let isHighway = (parsed[1] % 10 === 0) || (parsed[2] % 10 === 0); + if (isHighway) { + return 1; + } + } + // SK rooms are avoided when there is no vision in the room, harvested-from SK rooms are allowed + if (!options.allowSK && !Game.rooms[roomName]) { + if (!parsed) { + parsed = /^[WE]([0-9]+)[NS]([0-9]+)$/.exec(roomName); + } + let fMod = parsed[1] % 10; + let sMod = parsed[2] % 10; + let isSK = !(fMod === 5 && sMod === 5) && + ((fMod >= 4) && (fMod <= 6)) && + ((sMod >= 4) && (sMod <= 6)); + if (isSK) { + return 10 * highwayBias; + } + } + return highwayBias; + }, + }); + if (!_.isArray(ret)) { + console.log(`couldn't findRoute to ${destination}`); + return; + } + for (let value of ret) { + allowedRooms[value.room] = true; + } + return allowedRooms; + } + /** + * check how many rooms were included in a route returned by findRoute + * @param origin + * @param destination + * @returns {number} + */ + static routeDistance(origin, destination) { + let linearDistance = Game.map.getRoomLinearDistance(origin, destination); + if (linearDistance >= 32) { + return linearDistance; + } + let allowedRooms = this.findRoute(origin, destination); + if (allowedRooms) { + return Object.keys(allowedRooms).length; + } + } + /** + * build a cost matrix based on structures in the room. Will be cached for more than one tick. Requires vision. + * @param room + * @param freshMatrix + * @returns {any} + */ + static getStructureMatrix(room, freshMatrix) { + if (!this.structureMatrixCache[room.name] || (freshMatrix && Game.time !== this.structureMatrixTick)) { + this.structureMatrixTick = Game.time; + let matrix = new PathFinder.CostMatrix(); + this.structureMatrixCache[room.name] = Traveler.addStructuresToMatrix(room, matrix, 1); + } + return this.structureMatrixCache[room.name]; + } + /** + * build a cost matrix based on creeps and structures in the room. Will be cached for one tick. Requires vision. + * @param room + * @returns {any} + */ + static getCreepMatrix(room) { + if (!this.creepMatrixCache[room.name] || Game.time !== this.creepMatrixTick) { + this.creepMatrixTick = Game.time; + this.creepMatrixCache[room.name] = Traveler.addCreepsToMatrix(room, this.getStructureMatrix(room, true).clone()); + } + return this.creepMatrixCache[room.name]; + } + /** + * add structures to matrix so that impassible structures can be avoided and roads given a lower cost + * @param room + * @param matrix + * @param roadCost + * @returns {CostMatrix} + */ + static addStructuresToMatrix(room, matrix, roadCost) { + let impassibleStructures = []; + for (let structure of room.find(FIND_STRUCTURES)) { + if (structure instanceof StructureRampart) { + if (!structure.my && !structure.isPublic) { + impassibleStructures.push(structure); + } + } + else if (structure instanceof StructureRoad) { + matrix.set(structure.pos.x, structure.pos.y, roadCost); + } + else if (structure instanceof StructureContainer) { + matrix.set(structure.pos.x, structure.pos.y, 5); + } + else { + impassibleStructures.push(structure); + } + } + for (let site of room.find(FIND_MY_CONSTRUCTION_SITES)) { + if (site.structureType === STRUCTURE_CONTAINER || site.structureType === STRUCTURE_ROAD + || site.structureType === STRUCTURE_RAMPART) { + continue; + } + matrix.set(site.pos.x, site.pos.y, 0xff); + } + for (let structure of impassibleStructures) { + matrix.set(structure.pos.x, structure.pos.y, 0xff); + } + return matrix; + } + /** + * add creeps to matrix so that they will be avoided by other creeps + * @param room + * @param matrix + * @returns {CostMatrix} + */ + static addCreepsToMatrix(room, matrix) { + room.find(FIND_CREEPS).forEach((creep) => matrix.set(creep.pos.x, creep.pos.y, 0xff)); + return matrix; + } + /** + * serialize a path, traveler style. Returns a string of directions. + * @param startPos + * @param path + * @param color + * @returns {string} + */ + static serializePath(startPos, path, color = "orange") { + let serializedPath = ""; + let lastPosition = startPos; + this.circle(startPos, color); + for (let position of path) { + if (position.roomName === lastPosition.roomName) { + new RoomVisual(position.roomName) + .line(position, lastPosition, { color: color, lineStyle: "dashed" }); + serializedPath += lastPosition.getDirectionTo(position); + } + lastPosition = position; + } + return serializedPath; + } + /** + * returns a position at a direction relative to origin + * @param origin + * @param direction + * @returns {RoomPosition} + */ + static positionAtDirection(origin, direction) { + let offsetX = [0, 0, 1, 1, 1, 0, -1, -1, -1]; + let offsetY = [0, -1, -1, 0, 1, 1, 1, 0, -1]; + let x = origin.x + offsetX[direction]; + let y = origin.y + offsetY[direction]; + if (x > 49 || x < 0 || y > 49 || y < 0) { + return; + } + return new RoomPosition(x, y, origin.roomName); + } + /** + * convert room avoidance memory from the old pattern to the one currently used + * @param cleanup + */ + static patchMemory(cleanup = false) { + if (!Memory.empire) { + return; + } + if (!Memory.empire.hostileRooms) { + return; + } + let count = 0; + for (let roomName in Memory.empire.hostileRooms) { + if (Memory.empire.hostileRooms[roomName]) { + if (!Memory.rooms[roomName]) { + Memory.rooms[roomName] = {}; + } + Memory.rooms[roomName].avoid = 1; + count++; + } + if (cleanup) { + delete Memory.empire.hostileRooms[roomName]; + } + } + if (cleanup) { + delete Memory.empire.hostileRooms; + } + console.log(`TRAVELER: room avoidance data patched for ${count} rooms`); + } + static deserializeState(travelData, destination) { + let state = {}; + if (travelData.state) { + state.lastCoord = { x: travelData.state[STATE_PREV_X], y: travelData.state[STATE_PREV_Y] }; + state.cpu = travelData.state[STATE_CPU]; + state.stuckCount = travelData.state[STATE_STUCK]; + state.destination = new RoomPosition(travelData.state[STATE_DEST_X], travelData.state[STATE_DEST_Y], travelData.state[STATE_DEST_ROOMNAME]); + } + else { + state.cpu = 0; + state.destination = destination; + } + return state; + } + static serializeState(creep, destination, state, travelData) { + travelData.state = [creep.pos.x, creep.pos.y, state.stuckCount, state.cpu, destination.x, destination.y, + destination.roomName]; + } + static isStuck(creep, state) { + let stuck = false; + if (state.lastCoord !== undefined) { + if (this.sameCoord(creep.pos, state.lastCoord)) { + // didn't move + stuck = true; + } + else if (this.isExit(creep.pos) && this.isExit(state.lastCoord)) { + // moved against exit + stuck = true; + } + } + return stuck; + } +} +Traveler.structureMatrixCache = {}; +Traveler.creepMatrixCache = {}; +exports.Traveler = Traveler; +// this might be higher than you wish, setting it lower is a great way to diagnose creep behavior issues. When creeps +// need to repath to often or they aren't finding valid paths, it can sometimes point to problems elsewhere in your code +const REPORT_CPU_THRESHOLD = 1000; +const DEFAULT_MAXOPS = 20000; +const DEFAULT_STUCK_VALUE = 2; +const STATE_PREV_X = 0; +const STATE_PREV_Y = 1; +const STATE_STUCK = 2; +const STATE_CPU = 3; +const STATE_DEST_X = 4; +const STATE_DEST_Y = 5; +const STATE_DEST_ROOMNAME = 6; +// assigns a function to Creep.prototype: creep.travelTo(destination) +Creep.prototype.travelTo = function (destination, options) { + return Traveler.travelTo(this, destination, options); +}; \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..4bfbd62 --- /dev/null +++ b/src/main.js @@ -0,0 +1,269 @@ +if(!Memory.lastTick) + Memory.lastTick = Date.now() +var Traveler = require('Traveler'); +let sayings = ` +Wandering +Scouting! +Looking|for food +Hello! +Coming|Through +Hunting|rabbits +... +`.split("\n").filter(s=>s) +let shooting = ` +πŸ”«PEW PEWπŸ”« +πŸ”«FIRE!!πŸ”« +Get Food +`.split("\n").filter(s=>s) +let psayings = ` +Looking|for food|in|USER's|room +Prepare|to be|eaten|USER +Planning|to eat|USER +Scouting|USER +... +`.split("\n").filter(s=>s) +let target = {} +let user = Game.spawns.Spawn1.owner.username +module.exports.loop = function(){ + target = { name: '', room: Game.flags.target && Game.flags.target.pos.roomName } + let now = Date.now() + let lt = Memory.lastTick + let vis = new RoomVisual() + let t = now - lt + let n = Memory.avgCnt || 1 + let avg = Memory.avg || t + avg = avg + (t - avg) / ++n + Memory.avg = avg + Memory.avgCnt = n + vis.text(`Tick Timing ${(t/1000).toFixed(3)}s`,25,3,{ size: 3 }) + vis.text(`Avg ${(avg/1000).toFixed(3)}s`,25,6,{ size: 3 }) + let workers = _.filter(Game.creeps,c=>c.getActiveBodyparts(WORK) && c.getActiveBodyparts(CARRY)) + let ccnt = _.size(Game.creeps) + vis.text(`${ccnt} alive (${workers.length}W,${ccnt-workers.length}S)`,25,8,{ size: 1 }) + Memory.lastTick = now + Memory.wn = Memory.wn || 1 + Memory.ledger = Memory.ledger || [] + let ea = Game.spawns.Spawn1.room.energyAvailable + let sp = Game.spawns.Spawn1.pos + vis.text(ea,sp.x,sp.y+2.5,{size: 2}) + if(Game.spawns.Spawn1.room.energyAvailable >= 50){ + Memory.ledger = [] + let n = Game.time.toString(36) + let sw = false + let nw = false + let rooms = Object.keys(Game.rooms) + rooms = _.sortBy(rooms,r => r === Game.spawns.Spawn1.room.name ? 1 : 10) + _.each(rooms,roomName => { + let room = Game.rooms[roomName] + if (room.controller && !room.controller.my && room.controller.level !== 0) return + if (!room.controller || room.controller.reservation) return + room.memory.wn = room.memory.wn || 1 + let w = workers.filter(w=>w.name.split('.')[2] == room.name) + let mult = room === Game.spawns.Spawn1.room ? 3 : 5 + let wanted = room.find(FIND_SOURCES).length * mult + if(w.length < wanted){ + if(!sw && Game.spawns.Spawn1.room.energyAvailable >= 200){ + Game.spawns.Spawn1.createCreep([MOVE,WORK,CARRY],[n,room.memory.wn++,room.name].join('.')) + Memory.ledger.unshift(['spawn',room.name]) + sw = true + } + nw = true + } + Memory.ledger.push([room.name,w.length,wanted]) + }) + if(sw || nw){ + Memory.ledger.unshift([`NEXT: worker (${Math.max(0,200-ea)})`]) + }else{ + Memory.ledger.unshift([`NEXT: scout (${Math.max(0,100-ea)})`]) + let body = [MOVE] + if(Game.flags.target || true){ + body.push(([RANGED_ATTACK,ATTACK,ATTACK,ATTACK,ATTACK,WORK,WORK])[Math.floor(Math.random()*7)]) + } + Game.spawns.Spawn1.createCreep(body,n) + } + } + + Memory.ledger.map(l=>l.filter(a=>a !== '').join(', ')).forEach((l,i,a)=>{ + let size = 1.5 + let sc = size + vis.text(l,0,sc+(i*sc),{ align: 'left', size }) + // vis.text(l,49,sc+(i*sc),{ align: 'right', size }) + // vis.text(l,0,50-(a.length*sc)+(i*sc),{ align: 'left', size }) + // vis.text(l,49,50-(a.length*sc)+(i*sc),{ align: 'right', size }) + }) + _.each(Game.creeps,c=>{ + if(c.getActiveBodyparts(WORK) && c.getActiveBodyparts(CARRY)){ + runWorker(c) + }else{ + runScout(c) + } + }) + _.each(Memory.creeps,(c,name)=>{ + if(!Game.creeps[name]) delete Memory.creeps[name] + }) + vis.text(`${Game.cpu.getUsed().toFixed(3)} cpu`,25,7,{ size: 1 }) +} + +function runWorker(c){ + if(c.carry.energy < 50){ + let [,n,roomName] = c.name.split('.') + if (roomName && c.pos.roomName != roomName) + return c.travelTo(new RoomPosition(25,25,roomName)) + let srcs = c.room.find(FIND_SOURCES) + let sn = parseInt(n) % srcs.length + let src = srcs[sn] + if(c.pos.isNearTo(src)) + c.harvest(src) + else + c.moveTo(src) + }else{ + if(c.room.controller && c.room.controller.my && c.room.controller.ticksToDowngrade < 15000){ + c.travelTo(c.room.controller) + c.upgradeController(c.room.controller) + return + } + let s = Game.spawns.Spawn1 + if(c.pos.isNearTo(s)){ + if (c.carry.energy <= (s.energyCapacity - s.energy)) { + c.transfer(s,RESOURCE_ENERGY) + } + } else if (s.energy < s.energyCapacity) { + c.moveTo(s) + } else { + let result = PathFinder.search(c.pos,{ pos: s.pos, range: 3 },{ flee: true }) + if(result && result.path.length){ + c.say('Fleeing') + return c.moveByPath(result.path) + } + } + } +} + +function runScout(c){ + if(Game.cpu.getUsed() >= 90) return + if(target.room && target.room != c.room.name){ + c.say(`tgt ${target.room}`) + return c.travelTo(new RoomPosition(25,25,target.room),{ preferHighway: true }) + } + let ct = c.room.controller + if(ct) { + if(!ct.sign || ct.sign.username != user || !ct.sign.text || (Date.now() - ct.sign.datetime) > 1*60*60*1000) { + if(c.pos.isNearTo(ct)){ + c.signController(ct,`Territory of ${user}. Intruders will be eaten`) + }else{ + c.travelTo(ct) + } + } + } + if(!c.memory.z) c.memory.z = c.notifyWhenAttacked(false) + let lastdir = c.memory.ld || Math.ceil(Math.random()*8) + let lp = c.memory.lp || c.pos + c.memory.lp = { x:c.pos.x,y:c.pos.y } + let stuck = lp.x == c.pos.x && lp.y == c.pos.y + if(stuck) { + lastdir = Math.ceil(Math.random()*8) + } + let dirs = [] + for(let i=0;i<10;i++) + dirs.push(lastdir) + if(Math.random()<0.2){ + for(let i=0;i<4;i++) + dirs.push(lastdir+1,lastdir-1) + if(Math.random()<0.10){ + dirs.push(lastdir+2,lastdir-2) + } + } + let dir = dirs[Math.floor(Math.random()*dirs.length)] + let pd = dir + dir = ((dir+8-1) % 8) + 1 + c.memory.ld = dir + { + let target = c.pos.findClosestByRange(FIND_HOSTILE_CREEPS, { filter: c=>c.owner.username != 'Source Keeper' }) + if(target && (!c.room.controller || (c.room.controller && (!c.room.controller.safeMode || c.room.controller.my))) && !c.getActiveBodyparts(WORK)){ + if(target.pos.getRangeTo(c) <= 3){ + let txt = shooting[Math.floor(Math.random()*shooting.length)] + if(target.pos.isNearTo(c)){ + if(c.getActiveBodyparts(ATTACK)){ + c.attack(target) + } + if(c.getActiveBodyparts(RANGED_ATTACK)){ + c.rangedAttack(target) + } + c.move(c.pos.getDirectionTo(target.pos)) + }else{ + c.rangedAttack(target) + c.travelTo(target) + } + c.say(txt,true) + }else{ + c.travelTo(target) + } + return + } + if(target && target.pos.getRangeTo(c) < 8 ){ + let hostiles = c.room.find(FIND_HOSTILE_CREEPS).filter(c=>c.getActiveBodyparts(ATTACK) + c.getActiveBodyparts(RANGED_ATTACK) > 2) + let result = PathFinder.search(c.pos,hostiles.map(c=>({ pos: c.pos, range: c.getActiveBodyparts(RANGED_ATTACK)?15:3 })),{ flee: true }) + if(result && result.path.length){ + c.say('Fleeing') + return c.moveByPath(result.path) + } + + } + } + { + let target = c.pos.findClosestByRange(FIND_STRUCTURES,{ filter(s){ return !s.my && s.structureType != 'controller' } }) + if(target && target.pos.getRangeTo(c) <= 30 && c.room.controller && !c.room.controller.safeMode){ + let towers = c.room.find(FIND_STRUCTURES,{ filter(s){ return s.structureType == 'tower'}}) || [] + if(!towers.length){ + c.room.createFlag(c.pos, 'target',COLOR_RED,COLOR_YELLOW) + } + let txt = shooting[Math.floor(Math.random()*shooting.length)] + if (c.getActiveBodyparts(WORK)){ + c.dismantle(target) + c.travelTo(target, { offroad: true }) + txt = 'DESTROY' + } + if (c.getActiveBodyparts(ATTACK)){ + c.attack(target) + c.travelTo(target, { offroad: true }) + } + if (c.getActiveBodyparts(RANGED_ATTACK)){ + c.rangedAttack(target) + } + c.say(txt,true) + return + } + if(!target && c.room.controller && Game.flags.target && Game.flags.target.pos.roomName == c.room.name){ + Game.flags.target.remove() + } + } + let csites = c.room.find(FIND_CONSTRUCTION_SITES) + if(csites.length && Math.random()<0.10){ + c.moveTo(csites[0],{ visualizePathStyle: { opacity: 1 }}) + if(c.memory._move) c.memory.ld = parseInt(c.memory._move.path.slice(4,1)) + }else{ + c.move(dir) + } + if(dir <= 0) console.log(pd,dir,dirs) + if(c.memory.phrase && c.memory.phrase.length){ + let txt = c.memory.phrase.shift() + c.say(txt,true) + } + if(Math.random() > 0.9) { + let txt = sayings[Math.floor(Math.random()*sayings.length)] + if(c.room.controller && c.room.controller.owner && c.room.controller.owner.username && c.room.controller.owner.username != 'ags131'){ + let user = c.room.controller.owner.username + txt = psayings[Math.floor(Math.random()*psayings.length)] + if(Math.random() > 0.7){ + let smileys = 'πŸ˜€πŸ˜πŸ˜ƒπŸ˜„πŸ˜†πŸ˜‰πŸ˜Šβ˜ΊοΈπŸ˜›πŸ˜œπŸ˜πŸ˜ˆ' + txt = smileys.substr(Math.floor(Math.random()*(smileys.length/2))*2,2) + } + txt = txt.replace(/USER/,user) + } + if(~txt.indexOf('|')){ + ;[txt,...phrase] = txt.split('|') + c.memory.phrase = phrase + } + c.say(txt,true) + } +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..1f122b7 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,1043 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-slice@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.0.0.tgz#e73034f00dcc1f40876008fd20feae77bd4b7c2f" + +array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +brace-expansion@^1.0.0: + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +chalk@^1.0.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +dateformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +extend@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +fancy-log@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" + dependencies: + chalk "^1.1.1" + time-stamp "^1.0.0" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +findup-sync@^0.4.2: + version "0.4.3" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-0.3.2.tgz#ff191eddcd7088a675b2610fffc976be9b8074b5" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^3.0.0: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +gulp-screeps@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gulp-screeps/-/gulp-screeps-1.0.3.tgz#ce93961e48199faf868e998ab83b3b7357a92151" + dependencies: + gulp-util "^3.0.6" + through2 "^2.0.0" + +gulp-util@^3.0.0, gulp-util@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + +interpret@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.3.tgz#cbc35c62eeee73f19ab7b10a801511401afc0f90" + +is-absolute@^0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-0.2.6.tgz#20de69f3db942ef2d87b9c2da36f172235b1b5eb" + dependencies: + is-relative "^0.2.1" + is-windows "^0.2.0" + +is-buffer@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-plain-object@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-relative@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-0.2.1.tgz#d27f4c7d516d175fb610db84bbeef23c3bc97aa5" + dependencies: + is-unc-path "^0.1.1" + +is-unc-path@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-0.1.2.tgz#6ab053a72573c10250ff416a3814c35178af39b9" + dependencies: + unc-path-regex "^0.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +liftoff@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.3.0.tgz#a98f2ff67183d8ba7cfaca10548bd7ff0550b385" + dependencies: + extend "^3.0.0" + findup-sync "^0.4.2" + fined "^1.0.1" + flagged-respawn "^0.3.2" + lodash.isplainobject "^4.0.4" + lodash.isstring "^4.0.1" + lodash.mapvalues "^4.4.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isplainobject@^4.0.4: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.mapvalues@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +map-cache@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +natives@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.0.tgz#e9ff841418a6b2ec7a495e939984f78f163e6e31" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +parse-filepath@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.1.tgz#159d6155d43904d16c10ef698911da1e91969b73" + dependencies: + is-absolute "^0.2.3" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0": + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.1.5: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve@^1.1.6, resolve@^1.1.7: + version "1.4.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" + dependencies: + path-parse "^1.0.5" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +stream-consume@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.0.tgz#a41ead1a6d6081ceb79f65b061901b6d8f3d1d0f" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +unc-path-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +which@^1.2.12: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +"xtend@>=4.0.0 <4.1.0-0", xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"