summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes (renamed from .gitattribute)0
-rw-r--r--.gitignore4
-rw-r--r--package.json10
-rw-r--r--src/genome/README.md12
-rw-r--r--src/genome/genome.js218
-rw-r--r--src/genome/genome.test.js282
-rw-r--r--src/genome/trial.js37
-rw-r--r--src/index.html14
-rw-r--r--src/mind/README.md37
-rw-r--r--src/mind/topology.js183
-rw-r--r--src/mind/topology.test.js235
-rw-r--r--src/simulation/actions.js260
-rw-r--r--src/simulation/actions.test.js294
-rw-r--r--src/simulation/game.js255
-rw-r--r--src/simulation/game.test.js59
-rw-r--r--src/simulation/lattice_rules.js77
-rw-r--r--src/simulation/lattice_rules.test.js147
-rw-r--r--src/simulation/postprocess.js18
-rw-r--r--src/simulation/postprocess.test.js37
-rw-r--r--src/simulation/senses.js182
-rw-r--r--src/simulation/senses.test.js499
-rw-r--r--src/simulation/trial.js12
-rw-r--r--src/simulation/validity.js14
-rw-r--r--src/simulation/validity.test.js43
-rw-r--r--src/ui/canvas.js11
-rw-r--r--src/ui/index.js75
-rw-r--r--src/util.js62
-rw-r--r--src/world/README.md53
-rw-r--r--src/world/agent.js56
-rw-r--r--src/world/agent.test.js49
-rw-r--r--src/world/lattice.js54
-rw-r--r--src/world/lattice.test.js111
-rw-r--r--src/world/proposal.js183
-rw-r--r--src/world/proposal.test.js197
-rw-r--r--src/world/sense.js17
-rw-r--r--src/world/sense.test.js33
-rw-r--r--src/world/world.js47
-rw-r--r--test.bat3
-rw-r--r--yarn.lock2135
39 files changed, 0 insertions, 6015 deletions
diff --git a/.gitattribute b/.gitattributes
index 176a458..176a458 100644
--- a/.gitattribute
+++ b/.gitattributes
diff --git a/.gitignore b/.gitignore
index 2804402..b25c15b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1 @@
-yarn-error.log
-node_modules/
-.*
-*.swp
*~
diff --git a/package.json b/package.json
deleted file mode 100644
index 2621654..0000000
--- a/package.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
- "devDependencies": {
- "jest": "^29.5.0"
- },
- "scripts": {
- "test": "NODE_OPTIONS=--experimental-vm-modules jest",
- "wtest": "test.bat"
- },
- "type": "module"
-}
diff --git a/src/genome/README.md b/src/genome/README.md
deleted file mode 100644
index 1135ed0..0000000
--- a/src/genome/README.md
+++ /dev/null
@@ -1,12 +0,0 @@
-src/genome
-==========
-
-Genomes represent the neural network that underlies a creature. They are an array of tuples of the form `[ source, sink, weight ]`, where:
-
- * `source` is an integer in the range `[0, N - num_outputs)`, representing the index of the source neuron
- * `sink` is an integer in the range `[num_inputs, N)`, representing the index of the sink neuron
- * `weight` is a floating-point value in the range `[-4, 4]`, representing the weight of the connection
-
-`num_input` and `num_output` are fixed by the environment (as they are the input senses and output actions of the creature, respectively).
-`N` is not fixed, but is instead determined by the maximum index present in the genome. As long as the maximum index is greater than or
-equal to `num_input + num_output`, the genome is considered valid.
diff --git a/src/genome/genome.js b/src/genome/genome.js
deleted file mode 100644
index 20974fc..0000000
--- a/src/genome/genome.js
+++ /dev/null
@@ -1,218 +0,0 @@
-'use strict';
-
-import { random_choice } from '../util.js';
-import { network } from '../mind/topology.js';
-
-
-// check if a given genome is valid and compute its size
-export function validate_genome(genome) {
- const { n_input, n_internal, n_output } = genome;
- console.log(n_input + n_internal);
- return genome.genes.reduce(
- (acc, [source, sink, weight]) => acc && (
- (source < n_input+n_internal) &&
- (sink >= n_input)
- ),
- true
- );
-}
-
-// parse a genome into a useable neural net
-export function parse_genome(genome) {
- const { n_input, n_internal, n_output } = genome;
-
- const n = genome.genes.reduce(
- (acc, [source, sink, weight]) => acc.connect(source, sink, weight),
- network(n_input, n_internal, n_output)
- );
-
- return n;
-}
-
-
-// --===== mutations =====--
-
-function clamp(value, min, max) {
- if (value > max) { return max; }
- if (value < min) { return min; }
- return value;
-}
-
-// adjust the source input of a gene
-export function mut_gene_source(n_input, n_internal, n_output, gene, r) {
- const [source, sink, weight] = gene;
-
- const new_source = r < 0.5 ? source-1 : source+1;
-
- return [
- clamp(new_source, 0, n_input+n_internal-1),
- sink,
- weight,
- ];
-}
-
-
-// adjust the sink target of a gene
-export function mut_gene_sink(n_input, n_internal, n_output, gene, r) {
- const [source, sink, weight] = gene;
-
- const new_sink = r < 0.5 ? sink-1 : sink+1;
-
- return [
- source,
- clamp(new_sink, n_input+n_internal, n_input+n_internal+n_output-1),
- weight,
- ];
-}
-
-
-// modify a gene's weight
-// only adjusts the weight by performing a weighted average, so as to
-// more gently modify the generated net
-export function mut_gene_weight(weight_max, gene, r) {
- const [source, sink, weight] = gene;
-
- const rr = (2*r)-1;
- const move = weight_max * rr;
- const new_weight = (2*weight + move)/3;
-
- return [
- source,
- sink,
- clamp(new_weight, -weight_max, weight_max),
- ];
-}
-
-
-
-// expand the size of the neural net encoded by the genome
-// relabels internal indices so that there is one extra internal neuron
-export function mut_genome_expand(genome, r) {
- const expand_index = Math.floor(genome.n_internal * r) + genome.n_input;
- const new_genes = genome.genes.map(([source, sink, weight]) => [
- source >= expand_index ? source+1 : source,
- sink >= expand_index ? sink+1 : sink,
- weight,
- ]);
-
- return {
- ...genome,
- n_internal: genome.n_internal+1,
- genes: new_genes,
- };
-}
-
-
-// contract the size of the neural net encoded by the genome
-// relabels internal indices so that there is one less internal neuron
-export function mut_genome_contract(genome, r) {
- const { n_input, n_internal, n_output } = genome;
- const contract_idx = Math.floor(n_internal * r) + n_input;
-
- // decrement sources on the contract index too, to prevent invalid genomes
- const new_source = (source) => source >= contract_idx ? source-1 : source;
- // decrement sinks only after the contract index
- const new_sink = (sink) => sink > contract_idx ? sink-1 : sink;
-
- const new_genes = genome.genes.map(([source, sink, weight]) => [
- new_source(source),
- new_sink(sink),
- weight,
- ]);
-
- return {
- ...genome,
- n_internal: n_internal-1,
- genes: new_genes,
- };
-}
-
-
-// append a newly generated gene to the end of the genome
-export function mut_genome_insert(genome, weight_max, r1=Math.random(), r2=Math.random(), r3=Math.random()) {
- const { n_input, n_internal, n_output } = genome;
- const source = Math.floor((n_input + n_internal) * r1);
- const sink = Math.floor((n_internal + n_output) * r2) + n_input;
- const weight = weight_max * ((2*r3)-1);
-
- return {
- ...genome,
- genes: [...genome.genes, [source, sink, weight]],
- };
-}
-
-
-// delete a gene from the genome
-export function mut_genome_delete(genome, r) {
- const del_idx = Math.floor(r * genome.genes.length);
- const genes = genome.genes.filter((_, idx) => idx != del_idx);
- return { ...genome, genes };
-}
-
-
-function mut_gene(
- [n_input, n_internal, n_output, genome],
- weight_max, r1, r2, r3
-) {
- const gene_idx = Math.floor(genome.length * r1);
- const mod = random_choice(['source', 'sink', 'weight'], r2);
- let new_gene;
- if (mod == 'source') {
- new_gene = mut_gene_source(
- n_input, n_internal, n_output,
- genome[gene_idx],
- r3
- );
- } else if (mod == 'sink') {
- new_gene = mut_gene_sink(
- n_input, n_internal, n_output,
- genome[gene_idx],
- r3
- );
- } else {
- new_gene = mut_gene_weight(
- weight_max, genome[gene_idx], r3
- );
- }
-
- const new_genome = genome.map((gene, idx) => {
- if (idx == gene_idx) { return new_gene; }
- return gene;
- });
-
- return [
- n_input, n_internal, n_output, new_genome
- ];
-}
-
-
-export function mutate_genome(obj, weight_max) {
- const mut = random_choice([
- 'gene', 'gene', 'gene',
- 'gene', 'gene', 'gene',
- 'gene', 'gene', 'gene',
- 'insert', 'delete',
- 'insert', 'delete',
- 'expand', 'contract',
- ], Math.random());
-
- if (mut == 'gene') {
- return mut_gene(
- obj, weight_max,
- Math.random(), Math.random(), Math.random()
- );
- } else if (mut == 'insert') {
- return mut_genome_insert(
- obj, weight_max,
- Math.random(), Math.random(), Math.random()
- );
- } else if (mut == 'delete') {
- return mut_genome_delete(obj, Math.random());
- } else if (mut == 'expand') {
- return mut_genome_expand(obj, Math.random());
- } else if (mut == 'contract') {
- return mut_genome_contract(obj, Math.random());
- } else {
- throw new Error(`bad mut value: ${mut}`);
- }
-}
diff --git a/src/genome/genome.test.js b/src/genome/genome.test.js
deleted file mode 100644
index bc64e4e..0000000
--- a/src/genome/genome.test.js
+++ /dev/null
@@ -1,282 +0,0 @@
-'use strict';
-
-// genome structure
-// {
-// genes: gene[]
-// n_input, n_internal, n_output
-// }
-
-
-import {
- validate_genome,
- parse_genome,
- mut_gene_source,
- mut_gene_sink,
- mut_gene_weight,
- mut_genome_expand,
- mut_genome_contract,
- mut_genome_insert,
- mut_genome_delete,
-} from './genome';
-
-
-test('genome validation', () => {
- expect(validate_genome({
- n_input: 0, n_internal: 1, n_output: 0,
- genes: [[0, 0, 1.0]],
- })).toBe(true);
- expect(validate_genome({
- n_input: 2, n_internal: 0, n_output: 1,
- genes: [[0, 2, 1]],
- })).toBe(true);
- expect(validate_genome({
- n_input: 2, n_internal: 0, n_output: 1,
- genes: [[2, 0, 1]],
- })).toBe(false);
- expect(validate_genome({
- n_input: 2, n_internal: 0, n_output: 1,
- genes: [[2, 2, 1]],
- })).toBe(false);
- expect(validate_genome({
- n_input: 2, n_internal: 1, n_output: 1,
- genes: [[3, 2, 1]],
- })).toBe(false);
-});
-
-
-test('parse a genome into a neural net', () => {
- const n = parse_genome({
- n_input: 1, n_internal: 1, n_output: 1,
- genes: [
- [0, 1, 1],
- [1, 1, 1],
- [1, 2, 1]
- ]
- });
-
- expect(n.input_count).toBe(1);
- expect(n.output_count).toBe(1);
- expect(n.compute([2], [-1])).toEqual([
- [ Math.tanh( Math.tanh( 2-1 ) ) ],
- [ Math.tanh( 2-1 ) ],
- ]);
-});
-
-
-test('mutate gene source', () => {
- const n_input = 3;
- const n_internal = 4;
- const n_output = 5;
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [0, 4, 0],
- 0.0
- )).toEqual([0, 4, 0]);
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [0, 4, 0],
- 1.0
- )).toEqual([1, 4, 0]);
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [6, 4, 0],
- 0.0
- )).toEqual([5, 4, 0]);
-
- expect(mut_gene_source(
- n_input, n_internal, n_output,
- [6, 4, 0],
- 1.0
- )).toEqual([6, 4, 0]);
-});
-
-
-test('mutate gene sink', () => {
- const n_input = 3;
- const n_internal = 4;
- const n_output = 5;
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [0, 7, 0],
- 0.0
- )).toEqual([0, 7, 0]);
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [0, 7, 0],
- 1.0
- )).toEqual([0, 8, 0]);
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [6, 11, 0],
- 0.0
- )).toEqual([6, 10, 0]);
-
- expect(mut_gene_sink(
- n_input, n_internal, n_output,
- [6, 11, 0],
- 1.0
- )).toEqual([6, 11, 0]);
-});
-
-
-test('mutate gene weight', () => {
- const weight_max = 4.0;
-
- expect(mut_gene_weight(
- weight_max, [0, 0, 1], 0.0
- )).toEqual([0, 0, (2 - 4)/3]);
-
- expect(mut_gene_weight(
- weight_max, [0, 0, -4], 1.0
- )).toEqual([0, 0, (-8 + 4)/3]);
-
- expect(mut_gene_weight(
- weight_max, [0, 0, 3], 0.5
- )).toEqual([0, 0, (6+0)/3]);
-});
-
-
-test('expand genome', () => {
- const n_input = 1;
- const n_internal = 3;
- const n_output = 1;
-
- const genome = {
- n_input, n_internal, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 0],
- [2, 3, 0],
- [3, 4, 0],
- ],
- };
-
- expect(mut_genome_expand(genome, 0.0)).toEqual({
- n_input, n_internal: n_internal+1, n_output,
- genes: [
- [0, 2, 0],
- [2, 3, 0],
- [3, 4, 0],
- [4, 5, 0],
- ],
- });
-
- expect(mut_genome_expand(genome, 0.5)).toEqual({
- n_input, n_internal: n_internal+1, n_output,
- genes: [
- [0, 1, 0],
- [1, 3, 0],
- [3, 4, 0],
- [4, 5, 0],
- ],
- });
-
- expect(mut_genome_expand(genome, 0.99)).toEqual({
- n_input, n_internal: n_internal+1, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 0],
- [2, 4, 0],
- [4, 5, 0],
- ],
- });
-});
-
-
-test('contract genome', () => {
- const n_input = 1;
- const n_internal = 3;
- const n_output = 1;
-
- const genome = {
- n_input, n_internal, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 1],
- [2, 3, 2],
- [3, 4, 3],
- ],
- };
-
- expect(mut_genome_contract(genome, 0.0)).toEqual({
- n_input, n_internal: n_internal-1, n_output,
- genes: [
- [0, 1, 0],
- [0, 1, 1],
- [1, 2, 2],
- [2, 3, 3],
- ],
- });
-
- expect(mut_genome_contract(genome, 0.5)).toEqual({
- n_input, n_internal: n_internal-1, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 1],
- [1, 2, 2],
- [2, 3, 3],
- ],
- });
-
- expect(mut_genome_contract(genome, 0.99)).toEqual({
- n_input, n_internal: n_internal-1, n_output,
- genes: [
- [0, 1, 0],
- [1, 2, 1],
- [2, 3, 2],
- [2, 3, 3],
- ],
- });
-});
-
-
-
-test('insert new genes', () => {
- const n_input = 1;
- const n_internal = 2;
- const n_output = 1;
- const weight_max = 4;
-
- expect(mut_genome_insert({
- n_input, n_internal, n_output,
- genes: []
- }, weight_max, 0, 0.5, 0)).toEqual({
- n_input, n_internal, n_output,
- genes: [[0, 2, -4]]
- });
-
- expect(mut_genome_insert({
- n_input, n_internal, n_output,
- genes: [[0, 2, -4]]
- }, weight_max, 0.99, 0, 1)).toEqual({
- n_input, n_internal, n_output,
- genes: [[0, 2, -4], [2, 1, 4]]
- });
-});
-
-
-test('remove genes', () => {
- const n_input = 0;
- const n_output = 0;
- const n_internal = 3;
- const genome = {
- n_input, n_internal, n_output,
- genes: [[0, 1, 0], [1, 2, 0]],
- };
-
- expect(mut_genome_delete(genome, 0.0)).toEqual({
- n_input, n_internal, n_output,
- genes: [[1, 2, 0]],
- });
-
- expect(mut_genome_delete(genome, 0.99)).toEqual({
- n_input, n_internal, n_output,
- genes: [[0, 1, 0]],
- });
-});
diff --git a/src/genome/trial.js b/src/genome/trial.js
deleted file mode 100644
index 2ce23bf..0000000
--- a/src/genome/trial.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import {
- get_size,
- mut_genome_insert, mutate_genome,
-} from './genome.js';
-
-const recurse = (f, x0, n) => {
- if (n == 0) {
- return x0;
- } else {
- return f(recurse(f, x0, n-1));
- }
-};
-
-
-const n_input = 5;
-const n_output = 5;
-
-
-const [_1, _2, _3, genome] = recurse(
- s => mut_genome_insert(
- s, 4,
- Math.random(), Math.random(), Math.random()
- ),
- [n_input, 10, n_output, []],
- 20);
-
-
-const n_internal = get_size(n_input, n_output, genome) - n_input - n_output;
-console.log([n_input, n_internal, n_output, genome]);
-
-const mutation = recurse(
- s => mutate_genome(s, 4),
- [n_input, n_internal, n_output, genome],
- 40
-);
-
-console.log(mutation);
diff --git a/src/index.html b/src/index.html
deleted file mode 100644
index 6b7ebf7..0000000
--- a/src/index.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!doctype html>
-<html>
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>nerine</title>
- <style>
- </style>
- <script type="module" src="ui/index.js"></script>
- </head>
- <body>
- <canvas id="canvas" width="95vw" height="95vw">
- </body>
-</html>
diff --git a/src/mind/README.md b/src/mind/README.md
deleted file mode 100644
index 1ece125..0000000
--- a/src/mind/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-mind
-====
-
-This module is used to create arbitrary stateful neural networks.
-
-The only export is the following function:
-
-```
-network(input_count, internal_count, output_count, weight_max = 4 : number)
-```
-
-This function returns an object that represents a neural network with `input_count` input neurons,
-`internal_count` internal (and stateful) neurons, and `output_count` output neurons. `max_weight` determines
-the maximum absolute value allowed for connection weights.
-
-A network object has two methods:
-
-```
-connect(source, sink, weight : number)
-```
-
-This method returns a new network object that is an exact copy of the original, except with a new
-connection between the neuron indexed by `source` and `sink`, with weight `weight`. Neuron indices
-are zero-indexed, and span all neurons, first the inputs, then the internal neurons, and finally the outputs.
-An error will be thrown if `source` is in the range of output neurons or if `sink` is in the range of input
-neurons.
-
-
-```
-compute(inputs, state : array[number])
-```
-
-This method returns a tuple `[output, newState]`, where `output` is an array of `output_count` values
-corresponding to the output neuron's computed values, and `newState` is the new state of the internal neurons.
-
-`input` must be an array of numbers with length equal to `input_count`, and `state` must be an array of numbers
-with length equal to `internal_count` or an error will be raised.
diff --git a/src/mind/topology.js b/src/mind/topology.js
deleted file mode 100644
index 946dd86..0000000
--- a/src/mind/topology.js
+++ /dev/null
@@ -1,183 +0,0 @@
-'use strict';
-
-import { create } from '../util.js';
-
-
-const DEFAULT_WEIGHT_MAX = 4;
-
-
-// prototype for network objects
-const network_proto = {
- connect: function(source, sink, weight) {
- return network_connect(this, source, sink, weight);
- },
- compute: function(inputs, state) {
- return network_compute(this, inputs, state);
- },
-};
-
-
-// create a new network
-export function network(input_count, internal_count, output_count, weight_max = 4) {
- const count = input_count + internal_count + output_count;
- const n = create({
- input_count,
- output_count,
- adjacency: new Array(count).fill([]),
- weight: [],
- }, network_proto);
- return n;
-}
-
-
-// check index is an input
-function is_input(n, index) {
- return index < n.input_count;
-}
-// check if index is an output
-function is_output(n, index) {
- return index >= (n.adjacency.length - n.output_count);
-}
-// check if index is a hidden neuron
-function is_hidden(n, index) {
- return (!is_input(n, index)) && (!is_output(n, index));
-}
-
-
-// returns a new network with an edge between the given nodes
-// with the given weight
-export function network_connect(n, source, sink, weight) {
- if (is_input(n, sink)) {
- // inputs cannot be sinks
- throw new Error(`attempt to use input as sink (${source} -> ${sink})`);
- }
- if (is_output(n, source)) {
- // outputs cannot be sources
- throw new Error(`attempt to use output as source (${source} -> ${sink})`);
- }
-
- return create({
- ...n,
- adjacency: n.adjacency.map((row, i) => {
- if (i === source && i === sink) {
- // self-loop
- return [...row, 2];
- } else if (i === source) {
- return [...row, 1];
- } else if (i === sink) {
- return [...row, -1];
- } else {
- return [...row, 0];
- }
- }),
- weight: [...n.weight, weight],
- }, network_proto);
-}
-
-
-// gets the indices of the edges incident on the given adjacency list
-function incident_edges(n, adj) {
- const incident = adj
- .map((edge, index) => (edge < 0) || (edge === 2) ? index : null)
- .filter(index => index !== null);
-
- return incident;
-}
-
-
-// get the indices of the ends of an edge
-// in the case of self-loops, both values are the same
-function edge_ends(n, edge) {
- const ends = n.adjacency
- .map((adj, index) => adj[edge] !== 0 ? index : null)
- .filter(index => index != null);
-
- ends.sort((a, b) => n.adjacency[a][edge] < n.adjacency[b][edge] ? -1 : 1);
-
- if (ends.length === 1) {
- return { source: ends[0], sink: ends[0] };
- } else if (ends.length === 2) {
- return { source: ends[1], sink: ends[0] };
- } else {
- throw new Error("something bad happened with the ends");
- }
-}
-
-
-// recursively get the value of a node from the input nodes,
-// optionally caching the computed values
-function get_value(n, index, input, prev, cache) {
- // check if value is cached
- if (cache !== undefined && cache[index]) {
- return cache[index];
- }
- // check if value is input
- if (is_input(n, index)) {
- return input[index];
- }
-
- const adj = n.adjacency[index]; // get adjacency list
- const incident = incident_edges(n, adj); // get incident edges
- const weight = incident.map(x => n.weight[x]); // edge weights
- const sources = incident // get ancestor nodes
- .map(x => edge_ends(n, x).source);
-
- // get the value of each ancestor
- const values = sources
- .map(x => x === index // if the ancestor is this node
- ? prev[x - n.input_count] // then the value is the previous value
- : get_value(n, x, input, prev, cache)); // else recurse
-
- const sum = values // compute the weighted sum of the values
- .reduce((acc, x, i) => acc + (weight[i] * x), 0);
-
- if (sum !== sum) { // NaN test
- console.log(n);
- console.log(sources);
- console.log(input);
- throw new Error(`failed to get output for index ${index}`);
- }
-
- // compute result
- const value = Math.tanh(sum);
-
- // !!! impure caching !!!
- // cache result
- if (cache !== undefined) {
- cache[index] = value;
- }
-
- return value;
-}
-
-
-// compute a network's output and new hidden state
-// given the input and previous hidden state
-export function network_compute(n, input, state) {
- // validate input
- if (input.length !== n.input_count) {
- throw new Error("incorrect number of input elements");
- }
- // validate state
- const hidden_count = n.adjacency.length - n.input_count - n.output_count;
- if (state.length !== hidden_count) {
- throw new Error("incorrect number of state elements");
- }
-
- // !!! impure caching !!!
- const value_cache = {};
-
- const result = Object.freeze(n.adjacency
- .map((x, i) => is_output(n, i) ? i : null) // output index or null
- .filter(i => i !== null) // remove nulls
- .map(x => get_value(n, x, input, state, value_cache)) // map to computed value
- );
-
- const newstate = Object.freeze(n.adjacency
- .map((x, i) => is_hidden(n, i) ? i : null) // hidden index or null
- .filter(i => i !== null) // remove nulls
- .map(x => get_value(n, x, input, state, value_cache)) // map to computed value (using cache)
- );
-
- return Object.freeze([result, newstate]);
-}
diff --git a/src/mind/topology.test.js b/src/mind/topology.test.js
deleted file mode 100644
index 52c196f..0000000
--- a/src/mind/topology.test.js
+++ /dev/null
@@ -1,235 +0,0 @@
-'use strict';
-
-import { network } from './topology';
-
-
-test('basic network functionality', () => {
- const n = network(0, 5, 0);
- expect(n).toEqual({
- input_count: 0,
- output_count: 0,
- adjacency: [ [], [], [], [], [] ],
- weight: [],
- });
-
- expect(() => n.adjacency = []).toThrow();
- expect(() => n.weight = []).toThrow();
-
- const nn = n.connect(0, 1, -2);
- expect(nn).toEqual({
- input_count: 0,
- output_count: 0,
- adjacency: [
- [ 1 ],
- [ -1 ],
- [ 0 ],
- [ 0 ],
- [ 0 ]
- ],
- weight: [ -2 ],
- });
-
- expect(() => nn.adjacency = []).toThrow();
- expect(() => nn.weight = []).toThrow();
-
- const nnn = nn.connect(2, 4, 3);
- expect(nnn).toEqual({
- input_count: 0,
- output_count: 0,
- adjacency: [
- [ 1, 0 ],
- [ -1, 0 ],
- [ 0, 1 ],
- [ 0, 0 ],
- [ 0, -1 ]
- ],
- weight: [ -2, 3 ],
- });
-
- expect(() => nnn.adjacency = []).toThrow();
- expect(() => nnn.weight = []).toThrow();
-});
-
-
-test(
-'networks are restricted from sinking to inputs or sourcing from outputs',
-() => {
- const n = network(2, 2, 2);
-
- expect(n.connect(1,2,0)).toEqual({
- input_count: 2,
- output_count: 2,
- adjacency: [
- [ 0 ],
- [ 1 ],
- [ -1 ],
- [ 0 ],
- [ 0 ],
- [ 0 ],
- ],
- weight: [ 0 ],
- });
- expect(() => n.connect(2, 1, 0)).toThrow();
-
- expect(n.connect(3, 4, 2)).toEqual({
- input_count: 2,
- output_count: 2,
- adjacency: [
- [ 0 ],
- [ 0 ],
- [ 0 ],
- [ 1 ],
- [ -1 ],
- [ 0 ],
- ],
- weight: [ 2 ],
- });
- expect(() => n.connect(4, 3, 2)).toThrow();
-});
-
-
-test('self-connections work correctly', () => {
- const n = network(0, 1, 0).connect(0, 0, 2.0);
- expect(n).toEqual({
- input_count: 0,
- output_count: 0,
- adjacency: [
- [ 2 ],
- ],
- weight: [ 2 ],
- });
-});
-
-
-test('network computations', () => {
- const n = network(1, 0, 1).connect(0, 1, 2.0);
- const input = [ -0.5 ];
- const state = [];
- const result = n.compute(input, state);
- expect(result).toEqual([
- [ Math.tanh(-0.5 * 2.0) ],
- [],
- ]);
-
- expect(input).toEqual([ -0.5 ]);
- expect(state).toEqual([]);
-
- expect(() => result[0] = 'hi').toThrow();
- expect(() => result[0].push('hi')).toThrow();
- expect(() => result[1] = 'hi').toThrow();
- expect(() => result[1].push('hi')).toThrow();
-});
-
-
-test('multiple input network', () => {
- const n = network(4, 0, 1)
- .connect(0, 4, -1.0)
- .connect(1, 4, -2.0)
- .connect(2, 4, 1.0)
- .connect(3, 4, 2.0)
-
- expect(n.compute([1, 2, 3, 5], [])).toEqual([
- [ Math.tanh(
- (-1.0 * 1) +
- (-2.0 * 2) +
- (1.0 * 3) +
- (2.0 * 5))],
- [],
- ]);
-});
-
-
-test('multiple outputs', () => {
- const n = network(4, 0, 2)
- .connect(0, 4, -1)
- .connect(1, 4, 1)
- .connect(2, 5, -1)
- .connect(3, 5, 1);
-
- expect(n.compute([1,2,3,5], [])).toEqual([
- [ Math.tanh(2-1), Math.tanh(5-3) ],
- [],
- ]);
-});
-
-
-test('hidden neurons', () => {
- const n = network(4, 2, 1)
- .connect(0, 4, -1)
- .connect(1, 4, 1)
- .connect(2, 5, -1)
- .connect(3, 5, 1)
- .connect(4, 6, -1)
- .connect(5, 6, 1);
-
- expect(n.compute([1,2,3,5], [ 0, 0 ])).toEqual([
- [ Math.tanh( Math.tanh(5-3) - Math.tanh(2-1) ) ],
- [ Math.tanh(2-1), Math.tanh(5-3) ],
- ]);
-});
-
-
-test('arbitrary hidden neurons', () => {
- const n = network(1, 2, 1)
- .connect(0, 1, 1)
- .connect(1, 2, -1)
- .connect(2, 3, 2)
-
- const [output, state] = n.compute([1], [0, 0]);
-
- expect(output).toEqual([
- Math.tanh(
- 2*Math.tanh(
- -1*Math.tanh(1)
- )
- )
- ]);
-
- expect(state).toEqual([
- Math.tanh(1),
- Math.tanh( -Math.tanh(1) ),
- ]);
-});
-
-
-test('memory', () => {
- const n = network(0, 1, 1).connect(0, 0, -0.5).connect(0, 1, 2);
-
- expect(n.compute([], [1])).toEqual([
- [ Math.tanh( 2 * Math.tanh( -0.5 * 1 ) ) ],
- [ Math.tanh( -0.5 * 1) ],
- ]);
-});
-
-
-test('memory and input', () => {
- const n = network(1, 1, 1)
- .connect(0, 1, 1)
- .connect(1, 1, 1)
- .connect(1, 2, 1);
-
- expect(n.compute([2], [-1])).toEqual([
- [ Math.tanh( Math.tanh( 2-1 ) ) ],
- [ Math.tanh( 2-1 ) ],
- ]);
-});
-
-
-test('input and state must be the correct size', () => {
- const n = network(2, 1, 1)
- .connect(0, 2, 1)
- .connect(1, 2, 1)
- .connect(2, 3, 1);
-
- // wrong input size
- expect(() => n.compute([], [4])).toThrow();
- expect(() => n.compute([1], [4])).toThrow();
- expect(() => n.compute([1, 1, 1], [4])).toThrow();
-
- // wrong state size
- expect(() => n.compute([1, 1], [])).toThrow();
- expect(() => n.compute([1, 1], [4, 4])).toThrow();
-
- // prove correct sizes work
- n.compute([1, 1], [4]);
-});
diff --git a/src/simulation/actions.js b/src/simulation/actions.js
deleted file mode 100644
index ad08572..0000000
--- a/src/simulation/actions.js
+++ /dev/null
@@ -1,260 +0,0 @@
-'use strict';
-
-const threshold = 0.5;
-
-
-const move_forward = {
- size: 1,
- propose: (world, agent, head) => {
- if (agent.flags.frozen === true) { return []; }
- if (head[0] > threshold) {
- console.log('move forward');
- console.log(agent.id, agent.x, agent.y);
- const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation];
- const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation];
- return [{
- agent_changes: [{
- agent_id: agent.id,
- x: agent.x + dx,
- y: agent.y + dy,
- }],
- }];
- } else {
- return [];
- }
- },
-};
-
-
-const move_backward = {
- size: 1,
- propose: (world, agent, head) => {
- if (agent.flags.frozen === true) { return []; }
- if (head[0] > threshold) {
- console.log('move backward');
- const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation];
- const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation];
- return [{
- agent_changes: [{
- agent_id: agent.id,
- x: agent.x - dx,
- y: agent.y - dy,
- }],
- }];
- } else {
- return [];
- }
- },
-};
-
-
-const turn_left = {
- size: 1,
- propose: (world, agent, head) => {
- if (agent.flags.frozen === true) { return []; }
- if (head[0] > threshold) {
- console.log('turn left');
- const orientation = { n: 'w', e: 'n', s: 'e', w: 's' }[agent.flags.orientation];
- return [{
- agent_changes: [{
- agent_id: agent.id,
- flags: { orientation },
- }],
- }];
- } else {
- return [];
- }
- },
-};
-
-
-const turn_right = {
- size: 1,
- propose: (world, agent, head) => {
- if (agent.flags.frozen === true) { return []; }
- if (head[0] > threshold) {
- console.log('turn right');
- const orientation = { n: 'e', e: 's', s: 'w', w: 'n' }[agent.flags.orientation];
- return [{
- agent_changes: [{
- agent_id: agent.id,
- flags: { orientation },
- }],
- }];
- } else {
- return [];
- }
- },
-};
-
-
-const place = {
- size: 1,
- propose: (world, agent, head) => {
- if (head[0] < threshold) { return []; }
- else {
- const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation];
- const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation];
- return [
- { lattice_changes: [{
- x: agent.x + dx, y: agent.y + dy,
- from: 'empty', to: 'mutable',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] },
- }]}
- ];
- }
- },
-};
-
-
-const trigger = {
- size: 1,
- propose: (world, agent, head) => {
- if (head[0] < threshold) { return []; }
- else {
- const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation];
- const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation];
- return [
- { lattice_changes: [{
- x: agent.x + dx, y: agent.y + dy,
- from: 'mutable', to: 'active',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] },
- }]}
- ];
- }
- },
-};
-
-
-const pretend_frozen = {
- size: 1,
- propose: (world, agent, head) => {
- if (head[0] < threshold) { return [{
- agent_changes: [{
- agent_id: agent.id,
- flags: { pretend_frozen: false },
- }],
- }]; }
- else {
- return [{
- agent_changes: [{
- agent_id: agent.id,
- flags: { pretend_frozen: true },
- }]
- }];
- }
- },
-};
-
-
-const unfreeze = {
- size: 1,
- propose: (world, agent, head) => {
- if (head[0] < threshold) { return []; }
- else {
- const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation];
- const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation];
- const target = world.agents.filter(
- a => a.x === agent.x+dx && a.y === agent.y+dy
- )[0];
- if (target === undefined) { return []; }
- return [
- { agent_changes: [{
- agent_id: target.id,
- flags: { frozen: false, emit: [0, 1, 0, 0, 0, 0, 0, 0] },
- }]}
- ];
- }
- },
-};
-
-
-const take_flag = {
- size: 1,
- propose: (world, agent, head) => {
- if (head[0] < threshold) { return []; }
- else {
- const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation];
- const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation];
- const target = world.agents.filter(
- a => a.x === agent.x+dx && a.y === agent.y+dy
- )[0];
- if (target === undefined || !target.flags.flag) {
- return [
- {
- lattice_changes: [{
- x: agent.x + dx, y: agent.y + dy,
- from: 'flag', to: 'empty',
- flags: { emit: [ 0, 0, 1, 0, 0, 0, 0, 0 ] },
- }],
- agent_changes: [{
- agent_id: agent.id,
- flags: { flag: true },
- }],
- }
- ];
- } else {
- return [{
- agent_changes: [
- {
- agent_id: target.id,
- flags: { flag: false },
- },
- {
- agent_id: agent.id,
- flags: { flag: true },
- },
- ],
- }];
- }
- }
- },
-};
-
-
-const drop_flag = {
- size: 1,
- propose: (world, agent, head) => {
- if (head[0] < threshold) { return []; }
- else if (!agent.flags.flag) { return []; }
- else {
- const dx = { n: 0, e: 1, s: 0, w: -1 }[agent.flags.orientation];
- const dy = { n: -1, e: 0, s: 1, w: 0 }[agent.flags.orientation];
- return [
- {
- lattice_changes: [{
- x: agent.x + dx, y: agent.y + dy,
- from: 'empty', to: 'flag',
- flags: { emit: [ 0, 0, -1, 0, 0, 0, 0, 0 ] },
- }],
- agent_changes: [{
- agent_id: agent.id,
- flags: { flag: false },
- }],
- }
- ];
- }
- },
-};
-
-
-const speak = {
- size: 8,
- propose: (world, agent, head) => {
- return [
- {
- agent_changes: [{
- agent_id: agent.id,
- flags: { emit: head },
- }],
- },
- ];
- },
-};
-
-
-export const actions = [
- move_forward, /*move_backward, */turn_left, turn_right,
- place, trigger, pretend_frozen, unfreeze, take_flag, drop_flag,
- speak,
-];
diff --git a/src/simulation/actions.test.js b/src/simulation/actions.test.js
deleted file mode 100644
index e8406bc..0000000
--- a/src/simulation/actions.test.js
+++ /dev/null
@@ -1,294 +0,0 @@
-'use strict';
-
-import { actions } from './actions.js';
-
-
-const [
- move_forward, move_backward,
- turn_left, turn_right,
- place, trigger,
- pretend_frozen, unfreeze,
- take_flag,
- ...rest
-] = actions;
-
-
-test("move forward", () => {
- const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } };
- const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } };
- const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } };
-
- expect(move_forward.propose(null, n, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: 0, y: -1 }] },
- ]);
- expect(move_forward.propose(null, s, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: 0, y: 1 }] },
- ]);
- expect(move_forward.propose(null, e, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: 1, y: 0 }] },
- ]);
- expect(move_forward.propose(null, w, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: -1, y: 0 }] },
- ]);
-
- expect(move_forward.propose(null, n, [0])).toEqual([]);
- expect(move_forward.propose(null, s, [-1])).toEqual([]);
- expect(move_forward.propose(null, e, [0])).toEqual([]);
- expect(move_forward.propose(null, w, [-1])).toEqual([]);
-});
-
-
-test("move backward", () => {
- const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } };
- const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } };
- const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } };
-
- expect(move_backward.propose(null, n, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: 0, y: 1 }] },
- ]);
- expect(move_backward.propose(null, s, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: 0, y: -1 }] },
- ]);
- expect(move_backward.propose(null, e, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: -1, y: 0 }] },
- ]);
- expect(move_backward.propose(null, w, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, x: 1, y: 0 }] },
- ]);
-
- expect(move_backward.propose(null, n, [0])).toEqual([]);
- expect(move_backward.propose(null, s, [-1])).toEqual([]);
- expect(move_backward.propose(null, e, [0])).toEqual([]);
- expect(move_backward.propose(null, w, [-1])).toEqual([]);
-});
-
-
-test("turn_left", () => {
- const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } };
- const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } };
- const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } };
-
- expect(turn_left.propose(null, n, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 'w' } }] },
- ]);
- expect(turn_left.propose(null, s, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 'e' } }] },
- ]);
- expect(turn_left.propose(null, e, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 'n' } }] },
- ]);
- expect(turn_left.propose(null, w, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 's' } }] },
- ]);
-
- expect(turn_left.propose(null, n, [0])).toEqual([]);
- expect(turn_left.propose(null, s, [-1])).toEqual([]);
- expect(turn_left.propose(null, e, [0])).toEqual([]);
- expect(turn_left.propose(null, w, [-1])).toEqual([]);
-});
-
-
-test("turn_right", () => {
- const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } };
- const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } };
- const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } };
-
- expect(turn_right.propose(null, n, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 'e' } }] },
- ]);
- expect(turn_right.propose(null, s, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 'w' } }] },
- ]);
- expect(turn_right.propose(null, e, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 's' } }] },
- ]);
- expect(turn_right.propose(null, w, [1])).toEqual([
- { agent_changes: [{ agent_id: 0, flags: { orientation: 'n' } }] },
- ]);
-
- expect(turn_right.propose(null, n, [0])).toEqual([]);
- expect(turn_right.propose(null, s, [-1])).toEqual([]);
- expect(turn_right.propose(null, e, [0])).toEqual([]);
- expect(turn_right.propose(null, w, [-1])).toEqual([]);
-});
-
-
-test("place", () => {
- const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } };
- const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } };
- const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } };
-
- expect(place.propose(null, n, [1])).toEqual([
- { lattice_changes: [
- {
- x: 0, y: -1, from: 'empty', to: 'mutable',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }
- }
- ]}
- ]);
- expect(place.propose(null, s, [1])).toEqual([
- { lattice_changes: [
- {
- x: 0, y: 1, from: 'empty', to: 'mutable',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }
- }
- ]}
- ]);
- expect(place.propose(null, e, [1])).toEqual([
- { lattice_changes: [
- {
- x: 1, y: 0, from: 'empty', to: 'mutable',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }
- }
- ]}
- ]);
- expect(place.propose(null, w, [1])).toEqual([
- { lattice_changes: [
- {
- x: -1, y: 0, from: 'empty', to: 'mutable',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] }
- }
- ]}
- ]);
-
- expect(place.propose(null, n, [0])).toEqual([]);
- expect(place.propose(null, s, [-1])).toEqual([]);
- expect(place.propose(null, e, [0])).toEqual([]);
- expect(place.propose(null, w, [-1])).toEqual([]);
-});
-
-
-test("trigger", () => {
- const n = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const s = { id: 0, x: 0, y: 0, flags: { orientation: 's' } };
- const e = { id: 0, x: 0, y: 0, flags: { orientation: 'e' } };
- const w = { id: 0, x: 0, y: 0, flags: { orientation: 'w' } };
-
- expect(trigger.propose(null, n, [1])).toEqual([
- { lattice_changes: [{
- x: 0, y: -1, from: 'mutable', to: 'active',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] },
- }]},
- ]);
- expect(trigger.propose(null, s, [1])).toEqual([
- { lattice_changes: [{
- x: 0, y: 1, from: 'mutable', to: 'active',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] },
- }]},
- ]);
- expect(trigger.propose(null, e, [1])).toEqual([
- { lattice_changes: [{
- x: 1, y: 0, from: 'mutable', to: 'active',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] },
- }]},
- ]);
- expect(trigger.propose(null, w, [1])).toEqual([
- { lattice_changes: [{
- x: -1, y: 0, from: 'mutable', to: 'active',
- flags: { emit: [1, 0, 0, 0, 0, 0, 0, 0] },
- }]},
- ]);
-
- expect(trigger.propose(null, n, [0])).toEqual([]);
- expect(trigger.propose(null, s, [-1])).toEqual([]);
- expect(trigger.propose(null, e, [0])).toEqual([]);
- expect(trigger.propose(null, w, [-1])).toEqual([]);
- });
-
-
-test("pretend frozen", () => {
- const agent = { id: 2, x: 0, y: 0, flags: { orientation: 'n' } };
-
- expect(pretend_frozen.propose(null, agent, [1])).toEqual([{
- agent_changes: [{
- agent_id: 2,
- flags: { pretend_frozen: true },
- }]
- }]);
-
- expect(pretend_frozen.propose(null, agent, [0])).toEqual([{
- agent_changes: [{
- agent_id: 2,
- flags: { pretend_frozen: false },
- }]
- }]);
-});
-
-
-test("unfreeze", () => {
- const agent1 = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const agent2 = { id: 1, x: 0, y: -1 };
- const agent3 = { id: 10, x: -1, y: 0 };
- const agents = [ agent1, agent2, agent3 ];
-
- expect(unfreeze.propose({agents}, agent1, [1])).toEqual([{
- agent_changes: [{
- agent_id: 1,
- flags: { frozen: false, emit: [ 0, 1, 0, 0, 0, 0, 0, 0 ] },
- }]
- }]);
-
- agent1.flags.orientation = 'w';
-
- expect(unfreeze.propose({agents}, agent1, [1])).toEqual([{
- agent_changes: [{
- agent_id: 10,
- flags: { frozen: false, emit: [ 0, 1, 0, 0, 0, 0, 0, 0 ] },
- }]
- }]);
-
- agent1.flags.orientation = 's';
- expect(unfreeze.propose({agents}, agent1, [1])).toEqual([]);
-
- expect(unfreeze.propose({agents}, agent1, [0])).toEqual([]);
-});
-
-
-test("take flag", () => {
- const agent = { id: 0, x: 0, y: 0, flags: { orientation: 'n' } };
- const other1 = { id: 1, x: 0, y: -1, flags: { flag: true } };
- const other2 = { id: 2, x: 0, y: 1, flags: { flag: false } };
-
- const world = { agents: [ agent, other1, other2 ] };
-
- expect(take_flag.propose(world, agent, [1])).toEqual([
- { agent_changes: [
- { agent_id: 1, flags: { flag: false } },
- { agent_id: 0, flags: { flag: true } },
- ]},
- ]);
-
- agent.flags.orientation = 's';
- expect(take_flag.propose(world, agent, [1])).toEqual([
- {
- lattice_changes: [
- {
- x: 0, y: 1, from: 'flag', to: 'empty',
- flags: { emit: [ 0, 0, 1, 0, 0, 0, 0, 0 ] },
- },
- ],
- agent_changes: [
- { agent_id: 0, flags: { flag: true } },
- ]
- },
- ]);
-
- expect(take_flag.propose(world, agent, [0])).toEqual([]);
-});
-
-
-test("frozen agents cannot move", () => {
- const agent = { id: 0, x: 0, y: 0, flags: { orientation: 'n', frozen: true } };
-
- const world = { agents: [agent] };
-
- expect(move_forward.propose(world, agent, [1])).toEqual([]);
- expect(move_backward.propose(world, agent, [1])).toEqual([]);
- expect(turn_left.propose(world, agent, [1])).toEqual([]);
- expect(turn_right.propose(world, agent, [1])).toEqual([]);
-});
diff --git a/src/simulation/game.js b/src/simulation/game.js
deleted file mode 100644
index 978289d..0000000
--- a/src/simulation/game.js
+++ /dev/null
@@ -1,255 +0,0 @@
-'use strict';
-
-
-import { random_choice, apply, shuffle } from '../util.js';
-import { mut_genome_insert, parse_genome } from '../genome/genome.js';
-import { world_update } from '../world/world.js';
-import { senses } from './senses.js';
-import { actions } from './actions.js';
-import { lattice_rules } from './lattice_rules.js';
-import { validity } from './validity.js';
-import { postprocess } from './postprocess.js';
-
-
-function is_wall(size, x, y) {
- return (
- x === 0 || x === size-1 ||
- y === 0 || y === size-1
- );
-}
-function is_corner(size, x, y) {
- const subsize = Math.floor(size/3);
- return (
- (x < subsize || x >= 2*subsize) &&
- (y < subsize || y >= 2*subsize)
- );
-}
-export function get_team(size, x, y) {
- const subsize = Math.floor(size/3);
- if (y < subsize) {
- return 0;
- } else if (x >= 2*subsize) {
- return 1;
- } else if (y >= 2*subsize) {
- return 2;
- } else if (x < subsize) {
- return 3;
- } else {
- return undefined;
- }
-}
-
-export function setup_board(size) {
- const lattice = [...Array(size)]
- .map(() => [...Array(size)])
- .map((row, y) => row.map((_, x) => {
- if (is_wall(size, x, y)) {
- return { type: 'immutable', flags: {} };
- } else if (is_corner(size, x, y)) {
- return { type: 'immutable', flags: {} };
- } else {
- const team = get_team(size, x, y);
- if (Math.random() > 0.95 && get_team(size, x, y) === undefined) {
- return { type: 'flag', flags: { team } };
- } else {
- return { type: 'empty', flags: { team } };
- }
- }
- }));
- return lattice;
-}
-
-
-export function create_world(size, teams) {
- const lattice = setup_board(size);
-
- const agents = teams.reduce(
- (agents, team, team_num) => {
- const team_cells = lattice.map((row, y) => row.map((cell, x) => [x, y, cell])).flat()
- // only check cells with the right team
- .filter(([x, y, cell]) => cell.type === 'empty' && cell.flags.team === team_num)
- return agents.concat(team.reduce(
- (acc, agent) => {
- const available_cells = team_cells.filter(([x, y, cell]) => acc.reduce(
- (occupied, a) => occupied && ((a.x !== x) || (a.y !== y)),
- true
- ))
- const [x, y, ..._] = random_choice(available_cells);
- const orientation = random_choice([ 'n', 'e', 's', 'w' ]);
- return [...acc, {...agent, x, y, flags: { ...agent.flags, team: team_num, orientation } }];
- },
- []
- ));
- },
- []
- ).flat();
-
- return { lattice, lattice_rules, agents, actions, senses, validity };
-};
-
-
-// team structure:
-// {
-// agents
-// genome
-// score
-// games
-// }
-
-const N_INPUT = senses.reduce((acc, sense) => acc + sense.size, 0);
-const N_OUTPUT = actions.reduce((acc, action) => acc + action.size, 0);
-const MAX_MUTATIONS = 15;
-
-
-let agent_id = 0;
-
-export function create_agent(genome, n_internal) {
- return {
- id: agent_id++, // !!!! side effect !!!!
- net: parse_genome(genome),
- state: [...Array(n_internal)].map(_ => (2*Math.random()) - 1),
- }
-}
-
-
-
-export function create_team(size, genome_size, n_internal) {
- const genome = apply(
- s => mut_genome_insert(s, 4),
- genome_size,
- {n_input: N_INPUT, n_internal, n_output: N_OUTPUT, genes: []},
- );
- console.log(N_INPUT, N_OUTPUT, genome);
-
- const agents = [...Array(size)].map(_ => create_agent(genome, n_internal));
- return { agents, genome, score: 0, games: 0 };
-}
-
-
-export function child_team(team, keep=Math.floor(team.size/2)) {
- const n_internal = get_size(team.genome) - N_INPUT - N_OUTPUT;
- const genome = apply(
- s => mutate_genome(s, 4),
- Math.floor(MAX_MUTATIONS * Math.random()),
- [N_INPUT, n_internal, N_OUTPUT, team.genome]
- );
-
- const old_agents = [...Array(team.agents.length - keep)].reduce(
- (acc, _) => {
- const idx = Math.floor(Math.random() * acc.length);
- acc.splice(idx, 1);
- return acc;
- },
- );
- const new_agents = [...Array(team.agents.length - keep)].map(_ => create_agent(genome, n_internal));
- const agents = [old_agents, new_agents].flat();
-
- return { agents, genome, score: 0, games: 0 };
-}
-
-
-// game structure:
-// {
-// world: world
-// team_indices: number[]
-// time: number
-// }
-
-
-export function create_game(size, teams, team_indices) {
- const world = create_world(size, team_indices.map(i => teams[i].agents));
- return { world, team_indices, time: 0 };
-}
-
-
-export function step_game(game) {
- return {
- ...game,
- world: world_update(game.world, postprocess),
- time: game.time + 1,
- };
-}
-
-
-function score(lattice, team_num) {
- const size = lattice.length;
-
- // count number of flags in the team's area
- return lattice
- .map((row, y) => row.map((cell, x) => [x, y, cell]))
- .flat()
- .filter(([x, y, cell]) => get_team(size, x, y) === team_num && cell.type === 'flag')
- .length;
-}
-
-export function finish_game(teams, game) {
- const scores = [0, 1, 2, 3].map(t => score(game.world.lattice, t));
- return game.team_indices.reduce(
- (acc, idx, i) => {
- const team = teams[idx];
- acc.splice(idx, 1, {...team, score: team.score + scores[i], games: team.games+1});
- return acc;
- },
- teams,
- );
-}
-
-
-
-// epoch structure
-// {
-// game
-// time
-// teams
-// }
-
-function random_indices(teams) {
- return [...Array(teams.length - 4)].reduce(
- (acc) => {
- const idx = Math.floor(Math.random() * acc.length);
- acc.splice(idx, 1);
- return acc;
- },
- [...teams.keys()]
- );
-}
-
-let epoch_num = 0;
-export function create_epoch(size, teams) {
- return {
- game: create_game(size, teams, random_indices(teams)),
- time: 0,
- epoch: epoch_num++, // !!!! side effects !!!!
- size,
- teams,
- }
-}
-
-
-const GAME_STEPS = 10000
-const EPOCH_STEPS = 200
-
-export function update_epoch(epoch) {
- if (epoch.game.time < GAME_STEPS) {
- return { ...epoch, game: step_game(epoch.game) };
- } else if (epoch.time < EPOCH_STEPS) {
- return {
- ...epoch,
- teams: finish_game(epoch.teams, epoch.game),
- game: create_game(size, epoch.teams, random_indices(epoch.teams)),
- time: epoch.time+1
- };
- } else {
- // epoch complete!!
- const source_teams = epoch.teams
- .map(team => {
- const normalized_score = team.score/team.games;
- const count = Math.ceil(16*normalized_score);
- return [...Array(count > 0 ? count : 1)].map(x => team)
- })
- .flat();
- const new_teams = [...Array(epoch.teams.length)]
- .reduce((acc) => child_team(random_choice(source_teams)), []);
- return create_epoch(epoch.size, new_teams);
- }
-}
diff --git a/src/simulation/game.test.js b/src/simulation/game.test.js
deleted file mode 100644
index 219dce6..0000000
--- a/src/simulation/game.test.js
+++ /dev/null
@@ -1,59 +0,0 @@
-'use strict';
-
-import { apply } from '../util.js';
-import { setup_board, create_world } from './game.js';
-
-
-test("set up boards correctly", () => {
- const _ = { type: 'empty', flags: {} };
- const a = { type: 'empty', flags: { team: 0 } };
- const b = { type: 'empty', flags: { team: 1 } };
- const c = { type: 'empty', flags: { team: 2 } };
- const d = { type: 'empty', flags: { team: 3 } };
- const W = { type: 'immutable', flags: {} };
-
- expect(setup_board(6)).toEqual([
- [ W, W, W, W, W, W, ],
- [ W, W, a, a, W, W, ],
- [ W, d, _, _, b, W, ],
- [ W, d, _, _, b, W, ],
- [ W, W, c, c, W, W, ],
- [ W, W, W, W, W, W, ],
- ]);
- expect(setup_board(9)).toEqual([
- [ W, W, W, W, W, W, W, W, W, ],
- [ W, W, W, a, a, a, W, W, W, ],
- [ W, W, W, a, a, a, W, W, W, ],
- [ W, d, d, _, _, _, b, b, W, ],
- [ W, d, d, _, _, _, b, b, W, ],
- [ W, d, d, _, _, _, b, b, W, ],
- [ W, W, W, c, c, c, W, W, W, ],
- [ W, W, W, c, c, c, W, W, W, ],
- [ W, W, W, W, W, W, W, W, W, ],
- ]);
-});
-
-
-test("creating a world works correctly", () => {
- const id = 0;
- const agent = (id) => ({ id, net: `${id}`, state: `s${id}` });
- const team1 = [agent(0), agent(1)];
- const team2 = [agent(2), agent(3)];
- const team3 = [agent(4), agent(5)];
- const team4 = [agent(6), agent(7)];
-
- const world = create_world(6, [team1, team2, team3, team4]);
- const agent_cell = (agent) => {
- const { x, y } = agent;
- return world.lattice[y][x];
- };
-
- expect(agent_cell(world.agents[0])).toEqual({ type: 'empty', flags: { team: 0 } });
- expect(agent_cell(world.agents[1])).toEqual({ type: 'empty', flags: { team: 0 } });
- expect(agent_cell(world.agents[2])).toEqual({ type: 'empty', flags: { team: 1 } });
- expect(agent_cell(world.agents[3])).toEqual({ type: 'empty', flags: { team: 1 } });
- expect(agent_cell(world.agents[4])).toEqual({ type: 'empty', flags: { team: 2 } });
- expect(agent_cell(world.agents[5])).toEqual({ type: 'empty', flags: { team: 2 } });
- expect(agent_cell(world.agents[6])).toEqual({ type: 'empty', flags: { team: 3 } });
- expect(agent_cell(world.agents[7])).toEqual({ type: 'empty', flags: { team: 3 } });
-});
diff --git a/src/simulation/lattice_rules.js b/src/simulation/lattice_rules.js
deleted file mode 100644
index cc2fc5b..0000000
--- a/src/simulation/lattice_rules.js
+++ /dev/null
@@ -1,77 +0,0 @@
-import { pairs } from '../util.js';
-import { get_team } from './game.js';
-
-function mod(k, n) {
- return ((k % n) + n) % n;
-}
-
-function pos_wrap(lattice, x, y) {
- const height = lattice.length;
- const width = lattice[0].length;
- return [mod(x, width), mod(y, height)];
-}
-
-
-function neighbors(lattice, x, y) {
- const offsets = [-1, 0, 1];
- const positions = pairs(offsets, offsets)
- .filter(([dx, dy]) => dx !== 0 || dy !== 0)
- .map(([dx, dy]) => pos_wrap(lattice, x+dx, y+dy));
- const neighbors = positions
- .map(([x, y]) => [x, y, lattice[y][x]]);
- return neighbors;
-}
-
-
-export const lattice_rules = {
-
- empty: (lattice, x, y) => {
- const num_active_neighbors = neighbors(lattice, x, y)
- .map(([x, y, cell]) => cell.type)
- .filter(type => type === 'mutable' || type === 'active')
- .length;
- if (num_active_neighbors === 3) {
- return { world_updates: [{
- x, y, from: 'empty', to: 'active',
- flags: { emit: [0, 0, 0, 0, 0, 0, 0, 1] },
- }]};
- } else {
- return { world_updates: [{
- x, y, flags: { team: get_team(lattice.length, x, y) },
- }]};
- }
- },
-
- active: (lattice, x, y) => {
- const num_active_neighbors = neighbors(lattice, x, y)
- .map(([x, y, cell]) => cell.type)
- .filter(type => type === 'mutable' || type === 'active')
- .length;
- const die = { world_updates: [{
- x, y, from: 'active', to: 'empty',
- flags: { emit: [0, 0, 0, 0, 0, 0, 0, -1] },
- }]};
- if (num_active_neighbors < 2) {
- return die;
- } else if (num_active_neighbors > 3) {
- return die;
- }
- },
-
- mutable: (lattice, x, y) => {
- const num_active_neighbors = neighbors(lattice, x, y)
- .map(([x, y, cell]) => cell.type)
- .filter(type => type === 'active')
- .length;
- if (num_active_neighbors > 0) {
- // become living cell
- return { world_updates: [{
- x, y, from: 'empty', to: 'active',
- flags: { emit: [0, 0, 0, 0, 0, 0, 0, 1] },
- }]};
- }
- },
- immutable: () => {},
- flag: () => {},
-
-};
diff --git a/src/simulation/lattice_rules.test.js b/src/simulation/lattice_rules.test.js
deleted file mode 100644
index c285711..0000000
--- a/src/simulation/lattice_rules.test.js
+++ /dev/null
@@ -1,147 +0,0 @@
-import { world_update } from '../world/world.js';
-import { lattice_rules } from './lattice_rules.js';
-
-
-function apply(f, n, x0) {
- if (n == 0) {
- return x0;
- } else {
- return f(apply(f, n-1, x0));
- }
-}
-
-
-// remove cell team information
-function clean_team(lattice) {
- return lattice.map(row => row.map(cell => ({...cell, flags: {...cell.flags, team: undefined } })));
-}
-
-
-test("blinker", () => {
- const L = { type: 'active', flags: { team: undefined, } };
- const _ = { type: 'empty', flags: { team: undefined, } };
- const l = { type: 'active', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, 1] } };
- const d = { type: 'empty', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, -1] } };
- const lattice = [
- [ _, _, _, _, _ ],
- [ _, _, _, _, _ ],
- [ _, L, L, L, _ ],
- [ _, _, _, _, _ ],
- [ _, _, _, _, _ ],
- ];
-
- const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] };
- expect(clean_team(world_update(world).lattice)).toEqual([
- [ _, _, _, _, _ ],
- [ _, _, l, _, _ ],
- [ _, d, L, d, _ ],
- [ _, _, l, _, _ ],
- [ _, _, _, _, _ ],
- ]);
- expect(clean_team(world_update(world_update(world)).lattice)).toEqual([
- [ _, _, _, _, _ ],
- [ _, _, d, _, _ ],
- [ _, l, L, l, _ ],
- [ _, _, d, _, _ ],
- [ _, _, _, _, _ ],
- ]);
-});
-
-
-test("glider", () => {
- const L = { type: 'active', flags: { team: undefined, } };
- const _ = { type: 'empty', flags: { team: undefined, } };
- const l = { type: 'active', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, 1] } };
- const d = { type: 'empty', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, -1] } };
- const lattice = [
- [ _, _, _, _, _, _ ],
- [ _, _, _, L, _, _ ],
- [ _, L, _, L, _, _ ],
- [ _, _, L, L, _, _ ],
- [ _, _, _, _, _, _ ],
- [ _, _, _, _, _, _ ],
- ];
-
- const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] };
- //expect(clean_team(world_update(world).lattice)).toEqual([
- expect(clean_team(apply(world_update, 1, world).lattice)).toEqual([
- [ _, _, _, _, _, _ ],
- [ _, _, l, d, _, _ ],
- [ _, d, _, L, l, _ ],
- [ _, _, L, L, _, _ ],
- [ _, _, _, _, _, _ ],
- [ _, _, _, _, _, _ ],
- ]);
- expect(clean_team(apply(world_update, 2, world).lattice)).toEqual([
- [ _, _, _, _, _, _ ],
- [ _, _, d, l, _, _ ],
- [ _, _, _, d, L, _ ],
- [ _, _, L, L, l, _ ],
- [ _, _, _, _, _, _ ],
- [ _, _, _, _, _, _ ],
- ]);
- expect(clean_team(apply(world_update, 3, world).lattice)).toEqual([
- [ _, _, _, _, _, _ ],
- [ _, _, _, d, _, _ ],
- [ _, _, l, _, L, _ ],
- [ _, _, d, L, L, _ ],
- [ _, _, _, l, _, _ ],
- [ _, _, _, _, _, _ ],
- ]);
- expect(clean_team(apply(world_update, 4, world).lattice)).toEqual([
- [ _, _, _, _, _, _ ],
- [ _, _, _, _, _, _ ],
- [ _, _, d, _, L, _ ],
- [ _, _, l, d, L, _ ],
- [ _, _, _, L, l, _ ],
- [ _, _, _, _, _, _ ],
- ]);
-});
-
-
-test("beehive", () => {
- const L = { type: 'active', flags: { team: undefined, } };
- const _ = { type: 'empty', flags: { team: undefined, } };
- const lattice = [
- [ _, _, _, _, _, _ ],
- [ _, _, L, L, _, _ ],
- [ _, L, _, _, L, _ ],
- [ _, _, L, L, _, _ ],
- [ _, _, _, _, _, _ ],
- ];
-
- const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] };
- //expect(clean_team(world_update(world).lattice)).toEqual([
- expect(clean_team(apply(world_update, 1, world).lattice)).toEqual(lattice);
-});
-
-
-test("mutables are activated by neighboring actives", () => {
- const L = { type: 'active', flags: { team: undefined, } };
- const _ = { type: 'empty', flags: { team: undefined, } };
- const l = { type: 'active', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, 1] } };
- const d = { type: 'empty', flags: { team: undefined, emit: [0, 0, 0, 0, 0, 0, 0, -1] } };
- const M = { type: 'mutable', flags: { team: undefined, } };
-
- const lattice = [
- [ _, _, _, _, ],
- [ _, L, M, _, ],
- [ _, M, M, _, ],
- [ _, _, _, _, ],
- ];
-
- const world = { lattice, lattice_rules, agents: [], senses: [], actions: [], validity: [] };
-
- expect(clean_team(apply(world_update, 1, world).lattice)).toEqual([
- [ _, _, _, _, ],
- [ _, L, l, _, ],
- [ _, l, l, _, ],
- [ _, _, _, _, ],
- ]);
- expect(clean_team(apply(world_update, 2, world).lattice)).toEqual([
- [ _, _, _, _, ],
- [ _, L, L, _, ],
- [ _, L, L, _, ],
- [ _, _, _, _, ],
- ]);
-});
diff --git a/src/simulation/postprocess.js b/src/simulation/postprocess.js
deleted file mode 100644
index d50839e..0000000
--- a/src/simulation/postprocess.js
+++ /dev/null
@@ -1,18 +0,0 @@
-'use strict';
-
-export const postprocess = [
- (world) => ({
- ...world,
- agents: world.agents.map(a => {
- const {x, y} = a;
- if (
- world.lattice[y][x].type === 'mutable' ||
- world.lattice[y][x].type === 'active'
- ) {
- return { ...a, flags: {...a.flags, frozen: true } };
- } else {
- return a;
- }
- }),
- }),
-];
diff --git a/src/simulation/postprocess.test.js b/src/simulation/postprocess.test.js
deleted file mode 100644
index dc77c6a..0000000
--- a/src/simulation/postprocess.test.js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict';
-
-import { world_update } from '../world/world.js';
-import { postprocess } from './postprocess.js';
-
-test("agents freeze when finishing on a mutable or active", () => {
- const agent = {
- id: 1,
- net: { compute: () => [[1], null] },
- state: null,
- x: 0, y: 0,
- flags: {},
- };
-
- const lattice = [[{ type: 'empty', flags: {} }]];
-
- const world = {
- lattice,
- lattice_rules: { empty: ()=>{}, active: ()=>{}, mutable: ()=>{} },
- agents: [agent],
- senses: [],
- actions: [],
- validity: [],
- };
-
- expect(world_update(world, postprocess).agents[0]).toEqual(agent);
- world.lattice[0][0].type = 'mutable';
- expect(world_update(world, postprocess).agents[0]).toEqual({
- ...agent,
- flags: { frozen: true },
- });
- world.lattice[0][0].type = 'active';
- expect(world_update(world, postprocess).agents[0]).toEqual({
- ...agent,
- flags: { frozen: true },
- });
-});
diff --git a/src/simulation/senses.js b/src/simulation/senses.js
deleted file mode 100644
index 970f86b..0000000
--- a/src/simulation/senses.js
+++ /dev/null
@@ -1,182 +0,0 @@
-'use strict';
-
-
-const frozen = {
- size: 1,
- read: (world, agent) => {
- if (agent.flags.frozen === true) {
- return [ 1 ];
- } else {
- return [ 0 ];
- }
- },
-};
-
-
-// add two arrays together element-wise with a scaling factor
-function array_scalesum(a, s, b) {
- return a.map((x, i) => x + (s*b[i]));
-}
-// determine the square of the distance between two cells
-function lattice_dist2(x0, y0, x1, y1) {
- if (x0 === x1 && y0 === y1) { return 1; } // not proper distance but avoids divide-by-zero errors c:
- return ((x0-x1)**2) + ((y0-y1)**2);
-}
-const hear = {
- size: 8,
- read: (world, agent) => {
- const {x, y} = agent;
- const lattice_sounds = world.lattice
- .map((row, cy) => row.map((cell, cx) => [ 1/lattice_dist2(x, y, cx, cy), cell ]))
- .flat()
- .filter(([scale, cell]) => cell.flags.emit !== undefined)
- .reduce(
- (acc, [scale, cell]) => array_scalesum(acc, scale, cell.flags.emit),
- [0, 0, 0, 0, 0, 0, 0, 0]
- );
- const agent_sounds = world.agents
- .filter(a => a.flags.emit !== undefined)
- .reduce(
- (acc, a) => array_scalesum(acc, 1/lattice_dist2(x, y, a.x, a.y), a.flags.emit),
- [0, 0, 0, 0, 0, 0, 0, 0]
- );
-
- return array_scalesum(lattice_sounds, 1, agent_sounds).map(ch => Math.tanh(ch));
- },
-};
-
-
-const [VIS_WIDTH, VIS_HEIGHT] = [31, 31];
-const [VIS_HWIDTH, VIS_HHEIGHT] = [Math.floor(VIS_WIDTH/2), Math.floor(VIS_HEIGHT/2)];
-function identity_mod(n, p) {
- const mod = (n % (2*p)) - p + 1;
- return mod/p;
-}
-
-function world_pos_to_vision_pos(world, agent, x, y) {
- const dx = x - agent.x;
- const dy = y - agent.y;
- const orientation = agent.flags.orientation || 'n';
- switch (orientation) {
- case 'n':
- return [VIS_HWIDTH+dx, VIS_HEIGHT+dy-1];
- case 's':
- return [VIS_HWIDTH-dx, VIS_HEIGHT-dy-1];
- case 'e':
- return [VIS_HWIDTH+dy, VIS_HEIGHT-dx-1];
- case 'w':
- return [VIS_HWIDTH-dy, VIS_HEIGHT+dx-1];
- }
-}
-
-function vision_pos_to_world_pos(world, agent, x, y) {
- const dx = x-VIS_HWIDTH;
- const dy = y-VIS_HEIGHT+1;
- const orientation = agent.flags.orientation || 'n';
- switch (orientation) {
- case 'n':
- return [agent.x + dx, agent.y + dy];
- case 's':
- return [agent.x - dx, agent.y - dy];
- case 'e':
- return [agent.x - dy, agent.y - dx];
- case 'w':
- return [agent.x + dy, agent.y + dx];
- }
-}
-
-function world_pos_to_vision_idx(world, agent, x, y) {
- const [vx, vy] = world_pos_to_vision_pos(world, agent, x, y);
- return (VIS_WIDTH * vy) + vx;
-}
-function vision_idx_to_world_pos(world, agent, idx) {
- const vx = idx % VIS_WIDTH;
- const vy = Math.floor(idx / VIS_WIDTH);
- const result = vision_pos_to_world_pos(world, agent, vx, vy);
- return result;
-}
-
-function see_cell(world, x, y) {
- const team = 0;
- const orientation = 0;
- if (!world.lattice[y] || !world.lattice[y][x]) {
- // beyond the map edge
- return [ 0, 0, 0 ];
- }
- const type = {
- active: -0.8,
- mutable: -0.4,
- empty: 0.0,
- immutable: 0.4,
- flag: 0.8,
- }[world.lattice[y][x].type];
- return [team, orientation, type];
-}
-
-
-function relative_orientation(viewer, agent) {
- switch(viewer.flags.orientation) {
- case 'n': return { n: -0.8, e: -0.4, s: 0.4, w: 0.8 }[agent.flags.orientation];
- case 'e': return { e: -0.8, s: -0.4, w: 0.4, n: 0.8 }[agent.flags.orientation];
- case 's': return { s: -0.8, w: -0.4, n: 0.4, e: 0.8 }[agent.flags.orientation];
- case 'w': return { w: -0.8, n: -0.4, e: 0.4, s: 0.8 }[agent.flags.orientation];
- }
-}
-
-
-function see_agent(viewer, agent) {
- const team = {
- 0: -0.8,
- 1: -0.4,
- 2: 0.4,
- 3: 0.8,
- }[agent.flags.team] + (identity_mod(agent.id, 11)/16);
- const orientation = relative_orientation(viewer, agent) + (identity_mod(agent.id, 37)/16);
- const frozen = agent.flags.frozen || agent.flags.pretend_frozen;
- const type = (() => {
- if (frozen && agent.flags.flag) {
- return -0.4;
- } else if (frozen) {
- return -0.8;
- } else if (agent.flags.flag) {
- return 0.8;
- } else {
- return 0.0;
- }
- })() + (identity_mod(agent.id, 499)/16);
-
- return [team, orientation, type];
-}
-
-
-const see = {
- size: 3*VIS_WIDTH * VIS_HEIGHT,
- read: (world, agent) => {
- const indices = [...Array(VIS_WIDTH*VIS_HEIGHT).keys()]
- const vision = indices
- .map(idx => {
- const [x, y] = vision_idx_to_world_pos(world, agent, idx);
- return see_cell(world, x, y);
- });
- const result = world.agents.reduce(
- (acc, a) => {
- const idx = world_pos_to_vision_idx(world, agent, a.x, a.y);
-
- if (idx < 0 || idx >= VIS_WIDTH*VIS_HEIGHT) {
- return acc;
- } else {
- acc.splice(idx, 1, see_agent(agent, a));
- return acc;
- }
- },
- vision
- );
- return result.flat();
- },
-};
-
-
-
-export const senses = [
- frozen, hear, see, { size: 1, read: () => [1] },
-];
diff --git a/src/simulation/senses.test.js b/src/simulation/senses.test.js
deleted file mode 100644
index d3941c7..0000000
--- a/src/simulation/senses.test.js
+++ /dev/null
@@ -1,499 +0,0 @@
-'use strict';
-
-import { senses } from './senses.js';
-
-const [ frozen, hear, see, ...rest ] = senses;
-
-
-test("frozen sense", () => {
- const agent = {
- id: 0, x: 0, y: 0,
- flags: { frozen: true, },
- };
-
- expect(frozen.read(null, agent)).toEqual([1]);
- agent.flags.frozen = false;
- expect(frozen.read(null, agent)).toEqual([0]);
-});
-
-
-// --===== hearing =====--
-
-test("hear nothing", () => {
- const agent = { id: 4, x: 1, y: 1, flags: {} };
- const o = { type: 'empty', flags: {} };
- const world = {
- lattice: [
- [ o, o, o ],
- [ o, o, o ],
- [ o, o, o ],
- ],
- agents: [agent],
- };
-
- expect(hear.read(world, agent)).toEqual([
- Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(0),
- Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(0),
- ]);
-});
-
-
-test("hear self", () => {
- const agent = { id: 4, x: 1, y: 1, flags: { emit: [1, 0, 0.5, 0, 0, 0, 0, 1] } };
- const o = { type: 'empty', flags: {} };
- const world = {
- lattice: [
- [ o, o, o ],
- [ o, o, o ],
- [ o, o, o ],
- ],
- agents: [agent],
- };
-
- expect(hear.read(world, agent)).toEqual([
- Math.tanh(1), Math.tanh(0), Math.tanh(0.5), Math.tanh(0),
- Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(1),
- ]);
-});
-
-
-test("hear cells", () => {
- const agent = { id: 4, x: 2, y: 2, flags: {} };
- const o = { type: 'empty', flags: {} };
- const s = { type: 'empty', flags: { emit: [1, 0.5, 0.25, 0.125, 0, 0, 0, 0] } };
- const world = {
- lattice: [
- [ o, o, s, o, o ],
- [ o, o, o, o, o ],
- [ o, s, o, o, o ],
- [ o, o, o, o, o ],
- [ o, o, o, o, o ],
- ],
- agents: [agent],
- };
-
- expect(hear.read(world, agent)).toEqual([
- Math.tanh(1.25), Math.tanh(0.625), Math.tanh(0.3125), Math.tanh(0.15625),
- Math.tanh(0), Math.tanh(0), Math.tanh(0), Math.tanh(0),
- ]);
-});
-
-
-test("hear cells & agents", () => {
- const agent = { id: 4, x: 2, y: 2, flags: {} };
- const agent2 = { id: 0, x: 2, y: 4, flags: { emit: [0, 0, 0, 0, 1, 1, 1, 1] } };
- const o = { type: 'empty', flags: {} };
- const s = { type: 'empty', flags: { emit: [1, 0.5, 0.25, 0.125, 0, 0, 0, 0] } };
- const world = {
- lattice: [
- [ o, o, s, o, o ],
- [ o, o, o, o, o ],
- [ o, s, o, o, o ],
- [ o, o, o, o, o ],
- [ o, o, o, o, o ],
- ],
- agents: [agent, agent2],
- };
-
- expect(hear.read(world, agent)).toEqual([
- Math.tanh(1.25), Math.tanh(0.625), Math.tanh(0.3125), Math.tanh(0.15625),
- Math.tanh(0.25), Math.tanh(0.25), Math.tanh(0.25), Math.tanh(0.25),
- ]);
-});
-
-
-// --===== vision =====--
-
-
-test("see agents", () => {
- const o = { type: 'empty', flags: {} };
- const lattice = [
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- [ o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o, o ],
- ];
- const agentA = { id: 0, x: 15, y: 30, flags: { team: 0, orientation: 'n' } };
- const agentB = { id: 1, x: 15, y: 0, flags: { team: 1, orientation: 's' } };
- const agentC = { id: 2, x: 0, y: 15, flags: { team: 2, orientation: 'e', flag: true } };
- const agentD = { id: 3, x: 30, y: 15, flags: { team: 3, orientation: 'w', frozen: true } };
- const agentE = { id: 4, x: 30, y: 30, flags: { team: 0, orientation: 's', flag: true, frozen: true } };
- const world = {
- lattice,
- agents: [agentA, agentB, agentC, agentD, agentE],
- };
-
- const an = [
- -0.8 + 0.0625*(-10/11), // team + identity
- -0.8 + 0.0625*(-36/37), // orientation + identity
- 0.0 + 0.0625*(-498/499), // class + identity
- ];
- const as = [
- -0.8 + 0.0625*(-10/11), // team + identity
- 0.4 + 0.0625*(-36/37), // orientation + identity
- 0.0 + 0.0625*(-498/499), // class + identity
- ];
- const ae = [
- -0.8 + 0.0625*(-10/11), // team + identity
- -0.4 + 0.0625*(-36/37), // orientation + identity
- 0.0 + 0.0625*(-498/499), // class + identity
- ];
- const aw = [
- -0.8 + 0.0625*(-10/11), // team + identity
- 0.8 + 0.0625*(-36/37), // orientation + identity
- 0.0 + 0.0625*(-498/499), // class + identity
- ];
-
- const bn = [
- -0.4 + 0.0625*(-9/11), // team + identity
- -0.8 + 0.0625*(-35/37), // orientation + identity
- 0.0 + 0.0625*(-497/499), // class + identity
- ];
- const bs = [
- -0.4 + 0.0625*(-9/11), // team + identity
- 0.4 + 0.0625*(-35/37), // orientation + identity
- 0.0 + 0.0625*(-497/499), // class + identity
- ];
- const be = [
- -0.4 + 0.0625*(-9/11), // team + identity
- -0.4 + 0.0625*(-35/37), // orientation + identity
- 0.0 + 0.0625*(-497/499), // class + identity
- ];
- const bw = [
- -0.4 + 0.0625*(-9/11), // team + identity
- 0.8 + 0.0625*(-35/37), // orientation + identity
- 0.0 + 0.0625*(-497/499), // class + identity
- ];
-
- const cn = [
- 0.4 + 0.0625*(-8/11), // team + identity
- -0.8 + 0.0625*(-34/37), // orientation + identity
- 0.8 + 0.0625*(-496/499), // class + identity
- ];
- const cs = [
- 0.4 + 0.0625*(-8/11), // team + identity
- 0.4 + 0.0625*(-34/37), // orientation + identity
- 0.8 + 0.0625*(-496/499), // class + identity
- ];
- const ce = [
- 0.4 + 0.0625*(-8/11), // team + identity
- -0.4 + 0.0625*(-34/37), // orientation + identity
- 0.8 + 0.0625*(-496/499), // class + identity
- ];
- const cw = [
- 0.4 + 0.0625*(-8/11), // team + identity
- 0.8 + 0.0625*(-34/37), // orientation + identity
- 0.8 + 0.0625*(-496/499), // class + identity
- ];
-
- const dn = [
- 0.8 + 0.0625*(-7/11), // team + identity
- -0.8 + 0.0625*(-33/37), // orientation + identity
- -0.8 + 0.0625*(-495/499), // class + identity
- ];
- const ds = [
- 0.8 + 0.0625*(-7/11), // team + identity
- 0.4 + 0.0625*(-33/37), // orientation + identity
- -0.8 + 0.0625*(-495/499), // class + identity
- ];
- const de = [
- 0.8 + 0.0625*(-7/11), // team + identity
- -0.4 + 0.0625*(-33/37), // orientation + identity
- -0.8 + 0.0625*(-495/499), // class + identity
- ];
- const dw = [
- 0.8 + 0.0625*(-7/11), // team + identity
- 0.8 + 0.0625*(-33/37), // orientation + identity
- -0.8 + 0.0625*(-495/499), // class + identity
- ];
-
- const en = [
- -0.8 + 0.0625*(-6/11), // team + identity
- -0.8 + 0.0625*(-32/37), // orientation + identity
- -0.4 + 0.0625*(-494/499), // class + identity
- ];
- const es = [
- -0.8 + 0.0625*(-6/11), // team + identity
- 0.4 + 0.0625*(-32/37), // orientation + identity
- -0.4 + 0.0625*(-494/499), // class + identity
- ];
- const ee = [
- -0.8 + 0.0625*(-6/11), // team + identity
- -0.4 + 0.0625*(-32/37), // orientation + identity
- -0.4 + 0.0625*(-494/499), // class + identity
- ];
- const ew = [
- -0.8 + 0.0625*(-6/11), // team + identity
- 0.8 + 0.0625*(-32/37), // orientation + identity
- -0.4 + 0.0625*(-494/499), // class + identity
- ];
-
- const _ = [
- 0.0, 0.0, 0.0,
- ];
-
-
- expect(see.read(world, agentA)).toEqual([
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, bs, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ce, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, dw,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, an, _, _, _, _, _, _, _, _, _, _, _, _, _, _, es,
- ]);
- expect(see.read(world, agentB)).toEqual([
- en, _, _, _, _, _, _, _, _, _, _, _, _, _, _, as, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- de, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, cw,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, bn, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ]);
- expect(see.read(world, agentC)).toEqual([
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, ds, _, _, _, _, _, _, _, _, _, _, _, _, _, _, ee,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- be, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, aw,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, cn, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ]);
- expect(see.read(world, agentD)).toEqual([
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, cs, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ae, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, bw,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ew, _, _, _, _, _, _, _, _, _, _, _, _, _, _, dn, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ]);
-});
-
-
-test("seeing 'nothing' looks like teamless empty squares", () => {
- const lattice = [[]];
- const agent = { id: 0, x: 0, y: 0, flags: { team: 0, orientation: 'n' } };
- const world = {
- lattice, agents: [agent],
- };
-
- const _ = [
- 0.0, 0.0, 0.0,
- ];
- const an = [
- -0.8 + 0.0625*(-10/11), // team + identity
- -0.8 + 0.0625*(-36/37), // orientation + identity
- 0.0 + 0.0625*(-498/499), // class + identity
- ];
-
- expect(see.read(world, agent)).toEqual([
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, an, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ]);
-});
-
-
-test("agents pretending to be frozen appear frozen", () => {
- const lattice = [[]];
- const agent = { id: 0, x: 0, y: 0, flags: { team: 0, orientation: 'n', pretend_frozen: true } };
- const world = {
- lattice, agents: [agent],
- };
-
- const _ = [
- 0.0, 0.0, 0.0,
- ];
- const an = [
- -0.8 + 0.0625*(-10/11), // team + identity
- -0.8 + 0.0625*(-36/37), // orientation + identity
- -0.8 + 0.0625*(-498/499), // class + identity
- ];
-
- expect(see.read(world, agent)).toEqual([
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, an, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _,
- ]);
-});
diff --git a/src/simulation/trial.js b/src/simulation/trial.js
deleted file mode 100644
index b4462c5..0000000
--- a/src/simulation/trial.js
+++ /dev/null
@@ -1,12 +0,0 @@
-'use strict';
-
-import { create_team, create_epoch, update_epoch } from './game.js';
-
-const start_teams = [...Array(50)].map(x => create_team(32, 5, 5));
-
-let epoch = create_epoch(start_teams);
-
-while (epoch.epoch < 1) {
- console.log(epoch.epoch, epoch.time, epoch.game.time);
- epoch = update_epoch(epoch);
-}
diff --git a/src/simulation/validity.js b/src/simulation/validity.js
deleted file mode 100644
index de4acd1..0000000
--- a/src/simulation/validity.js
+++ /dev/null
@@ -1,14 +0,0 @@
-export const validity = [
- // prevent agents from moving onto immutables
- (world, proposal) => (proposal.agent_changes || []).reduce(
- (acc, change) => {
- const {x, y} = change;
- if (x !== undefined && y !== undefined && world.lattice[y][x].type === 'immutable') {
- return false;
- } else {
- return acc;
- }
- },
- true,
- ),
-];
diff --git a/src/simulation/validity.test.js b/src/simulation/validity.test.js
deleted file mode 100644
index ba9e684..0000000
--- a/src/simulation/validity.test.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-import { world_update } from '../world/world.js';
-import { validity } from './validity.js';
-
-test("agents are not allowed to move into immutables", () => {
- const actions = [{
- size: 1, propose: (world, agent, head) => {
- return [{
- agent_changes: [{
- agent_id: agent.id,
- x: agent.x + 1, y: agent.y,
- }],
- }];
- },
- }];
-
- const agent = {
- id: 1,
- net: { compute: () => [[1], null] },
- state: null,
- x: 0, y: 0,
- flags: {},
- };
-
- const lattice = [[{ type: 'empty', flags: {} }, { type: 'immutable', flags: {} }]];
-
- const world = {
- lattice,
- lattice_rules: { empty: ()=>{}, immutable: ()=>{} },
- agents: [agent],
- senses: [],
- actions,
- validity,
- };
-
- expect(world_update(world).agents[0]).toEqual(agent);
- world.validity = [];
- expect(world_update(world).agents[0]).toEqual({
- ...agent,
- x: 1, y: 0,
- });
-});
diff --git a/src/ui/canvas.js b/src/ui/canvas.js
deleted file mode 100644
index b04b966..0000000
--- a/src/ui/canvas.js
+++ /dev/null
@@ -1,11 +0,0 @@
-'use strict';
-
-export function draw(canvas, size, fn) {
- const ctx = canvas.getContext("2d");
- const scale = canvas.clientWidth/size;
- ctx.save();
- ctx.scale(scale, scale);
- ctx.clearRect(0, 0, size, size);
- fn(ctx);
- ctx.restore();
-}
diff --git a/src/ui/index.js b/src/ui/index.js
deleted file mode 100644
index 01068cb..0000000
--- a/src/ui/index.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import { draw } from './canvas.js';
-import { create_team, create_epoch, update_epoch } from '../simulation/game.js';
-
-
-console.log("generating agents...");
-const start_teams = [...Array(4)].map(x => create_team(2, 400, 50));
-console.log("creating epoch...");
-let epoch = create_epoch(60, start_teams);
-console.log("ready!");
-
-
-function draw_cell(ctx, x, y, cell) {
- ctx.fillStyle = (() => {
- switch (cell.type) {
- case 'empty':
- return '#ffffff';
- case 'immutable':
- return '#0000ff';
- case 'mutable':
- return '#555555';
- case 'active':
- return '#000000';
- case 'flag':
- return '#ffff00';
- default:
- return '#00ff00';
- }
- })();
- ctx.fillRect(x, y, 1, 1);
-}
-
-function draw_agent(ctx, agent) {
- ctx.beginPath();
- ctx.fillStyle = '#ff0000';
- const { x, y } = agent;
- ctx.arc(x+.5, y+.5, .5, 0, 2*Math.PI);
- ctx.fill();
-}
-
-
-function render(canvas) {
- draw(canvas, epoch.size, (ctx) => {
- for (let y=0; y<epoch.size; y++) {
- for (let x=0; x<epoch.size; x++) {
- draw_cell(ctx, x, y, epoch.game.world.lattice[y][x]);
- }
- }
- epoch.game.world.agents.forEach(a => draw_agent(ctx, a));
- });
-}
-
-
-function update(canvas) {
- console.log('update');
- epoch = update_epoch(epoch);
- render(canvas);
- setTimeout(() => update(canvas), 1);
-}
-
-
-function main() {
- const canvas = document.getElementById('canvas');
- window.onresize = () => {
- const size = 0.95*window.innerWidth
- canvas.width = size;
- canvas.height = size;
- render(canvas);
- }
- window.onresize();
- console.log("c:");
- update(canvas);
-}
-
-
-window.onload = main;
diff --git a/src/util.js b/src/util.js
deleted file mode 100644
index f83039f..0000000
--- a/src/util.js
+++ /dev/null
@@ -1,62 +0,0 @@
-'use strict';
-
-
-export function create(obj, proto=Object.prototype) {
- const props = Object.keys(obj)
- .map((key) => [ key, { value: obj[key], enumerable: true } ])
- .reduce((acc, [ key, value ]) => ({ ...acc, [key]: value }), {});
-
- return Object.create(proto, props);
-};
-
-
-export function random_choice(collection, r=Math.random()) {
- const idx = Math.floor(collection.length * r);
- return collection[idx];
-}
-
-
-export function pairs(arr1, arr2) {
- return arr1
- .map((x, i) => arr2.map(y => [x, y]))
- .flat();
-}
-
-
-export function deepEqual(a, b, debug=false) {
- if (typeof(a) === 'object') {
- if (typeof(b) === 'object') {
- // do deep equality
- return [...new Set(Object.keys(a).concat(Object.keys(b)))].reduce(
- (acc, key) => {
- return acc && deepEqual(a[key], b[key]);
- },
- true
- );
- } else {
- // one object, one non-object
- return false;
- }
- } else {
- return a === b;
- }
-}
-
-
-export function apply(f, n, x0) {
- if (n == 0) {
- return x0;
- } else {
- return f(apply(f, n-1, x0));
- }
-}
-
-
-export function shuffle(arr) {
- const shuffled = [...arr];
- for (let i=arr.length-1; i > 0; i--) {
- const j = Math.floor(Math.random() * (i+1));
- [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]
- }
- return shuffled;
-}
diff --git a/src/world/README.md b/src/world/README.md
deleted file mode 100644
index a88eadc..0000000
--- a/src/world/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# world
-
-The world is composed of a cell lattice. Each cell can contain a specific type of cell, and these cells
-evolve according to fixed, regular rules.
-
-Agents exist on top of the cell lattice. They occupy specific cell locations, but those locations are
-otherwise considered empty. Agents exist independent of the cells and evolve independent of them, though of
-course they are intertwined.
-
-Time step process:
-
- * Agents update internal state and propose moves.
- * World updates
- * Agent moves are resolved in the new world, and agent status is updated.
- * World state is updated to include agents.
-
-Cell types:
-*(all cells, except for Empties and Flags, count as GoL living)*
-
- * Empty (territory-colored, GoL dead)
- * Immutable
- * Mutable
- * Active (GoL living)
- * Flag
-
-Agent aspects: (64)
- * team (4)
- * orientation (4)
- * mobile/frozen (2)
- * has flag (2)
- * identity (3-channel)
-
-Agents have *internal state* corresponding to the state of their internal neurons (and roughly corresponding to their memories and experiences) and *status*, which refers to things like their current orientation, position, and mobility.
-
-
-Agent senses:
- * Hearing (inverse square, infinite range)
- * Sight (2D top-down, see further ahead than behind or to the sides, 7-channel)
- * Match timer
- * Epoch timer
-
-Agent actions:
- * Move forward/backward
- * Turn left/right
- * Place mutable
- * Trigger mutable -> active (5x5 square ahead of agent)
- * Play frozen
- * Unfreeze
- * Take flag
- * Drop flag (immediately ahead of agent)
-
-
- When carrying a flag, an agent counts as a flag tile (and other agents can steal the flag from them!). Otherwise, an agent counts as an empty tile.
diff --git a/src/world/agent.js b/src/world/agent.js
deleted file mode 100644
index 2be7420..0000000
--- a/src/world/agent.js
+++ /dev/null
@@ -1,56 +0,0 @@
-'use strict';
-
-import { sense_read } from './sense.js';
-import { proposal_merge } from './proposal.js';
-
-
-export function agent_decide(world, agent, senses, actions) {
- const inputs = senses.map(s => sense_read(world, agent, s)).flat();
- const [result, state] = agent.net.compute(inputs, agent.state);
- console.log(result, state);
-
- const new_agent = { ...agent, state };
- const [proposals, _] = actions.reduce(
- ([proposals, result], action) => {
- const head = result.slice(0, action.size);
- const tail = result.slice(action.size);
-
- const props = action
- .propose(world, new_agent, head)
- .reduce(
- (acc, proposal) => proposal_merge(acc, proposal),
- proposals
- );
-
- return [props, tail];
- },
- [[], result]
- );
-
- return [new_agent, proposals];
-}
-
-
-function change_apply(agent, ch) {
- const { x, y, flags } = ch;
- return {
- ...agent,
- x: (x || agent.x), y: (y || agent.y),
- flags: { ...agent.flags, ...flags },
- };
-}
-
-
-export function agent_apply(agent, proposals) {
- return proposals
- .filter(p => p.agent_changes)
- .reduce(
- (acc, p) => p.agent_changes
- .filter(ch => ch.agent_id === agent.id)
- .reduce(
- (acc_, ch) => change_apply(acc_, ch),
- acc
- ),
- agent
- );
-}
diff --git a/src/world/agent.test.js b/src/world/agent.test.js
deleted file mode 100644
index d10a43a..0000000
--- a/src/world/agent.test.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import { agent_decide, agent_apply } from './agent.js';
-
-
-test("simple agent decisions", () => {
- const lattice = null;
- const agent = {
- id: 3,
- net: { compute: () => [[0, 1], 'state'] },
- state: null,
- x: 0, y: 0,
- flags: {},
- };
-
- const senses = [];
- const actions = [
- { size: 1, propose: (world, agent, head) => [{ agent_changes: [{ agent_id: 3, flags: { act1: head[0] } }] }] },
- { size: 1, propose: (world, agent, head) => [{ agent_changes: [{ agent_id: 3, flags: { act2: head[0] } }] }] },
- ];
-
- expect(agent_decide(lattice, agent, senses, actions)).toEqual([
- { ...agent, state: 'state' },
- actions.map((a, idx) => a.propose(null, null, [idx])).flat(),
- ]);
-});
-
-
-test("apply proposals to agent", () => {
- const props = [
- { agent_changes: [{ agent_id: 14, x: 4, y: 3 }] },
- { agent_changes: [{ agent_id: 16, x: 5, y: 3 }] },
- { agent_changes: [{ agent_id: 14, flags: { frozen: true } }] },
- ];
-
- const agent = {
- id: 14,
- net: null,
- state: null,
- x: 0, y: 0,
- flags: { frozen: false, emit: 6 }
- };
-
- expect(agent_apply(agent, props)).toEqual({
- id: 14,
- net: null,
- state: null,
- x: 4, y: 3,
- flags: { frozen: true, emit: 6 }
- });
-});
diff --git a/src/world/lattice.js b/src/world/lattice.js
deleted file mode 100644
index 066a5ca..0000000
--- a/src/world/lattice.js
+++ /dev/null
@@ -1,54 +0,0 @@
-'use strict';
-
-// get the proposals for cell updates
-export function lattice_update(lattice, update_rules) {
- return lattice
- .map((row, y) => row.map((cell, x) => [x, y, cell.type]))
- .flat()
- .reduce((acc, [x, y, type]) => [...acc, update_rules[type](lattice, x, y)], [])
- .filter(x => x !== undefined)
-}
-
-
-// check if, given the current lattice configuration, a proposal is valid
-export function lattice_valid(lattice, proposal) {
- if (!proposal.world_updates) { return true; }
- return proposal.world_updates.reduce(
- (acc, update) => {
- const valid =
- (update.x >= 0 && update.x < lattice[0].length) &&
- (update.y >= 0 && update.y < lattice.length) &&
- (lattice[update.y][update.x].type == update.from)
- return valid && acc;
- },
- true
- );
-}
-
-
-// apply a set of proposals, returning the new lattice
-export function lattice_apply(lattice, proposals) {
- const result = proposals.reduce(
- (acc, prop) => {
- const change = (prop.world_updates || []).reduce(
- (acc_, update) => {
- const cell = acc_[update.y][update.x];
- if (update.to) { cell.type = update.to; }
- if (update.flags) {
- cell.flags = { ...(cell.flags || {}), ...update.flags };
- //cell.flags = cell.flags || {}
- //// this is very side-effect-y but i couldn't think of a nicer compatible way of doing it 😔
- //for (let k of Object.keys(update.flags)) {
- // cell.flags[k] = update.flags[k];
- //}
- }
- return acc_
- },
- [...acc]
- );
- return change;
- },
- [...lattice]
- );
- return result;
-}
diff --git a/src/world/lattice.test.js b/src/world/lattice.test.js
deleted file mode 100644
index d1bdd13..0000000
--- a/src/world/lattice.test.js
+++ /dev/null
@@ -1,111 +0,0 @@
-'use strict';
-
-import { lattice_update, lattice_valid, lattice_apply } from './lattice.js';
-
-
-test("growth update rule", () => {
- const lattice = [[
- { type: 'empty', flags: {} },
- { type: 'empty', flags: {} },
- { type: 'plant', flags: {} },
- ]];
- const update_rules = {
- plant: () => {},
- empty: (lattice, x, y) => {
- if (lattice[y][x+1].type === 'plant') {
- return { world_updates: [{ x, y, from: 'empty', to: 'plant' }] };
- }
- },
- };
-
- expect(lattice_update(lattice, update_rules)).toEqual([
- { world_updates: [{ x: 1, y: 0, from: 'empty', to: 'plant' }] },
- ]);
-
- lattice[0][1] = { type: 'plant' };
-
- expect(lattice_update(lattice, update_rules)).toEqual([
- { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'plant' }] },
- ]);
-
- lattice[0][0] = { type: 'plant' };
-
- expect(lattice_update(lattice, update_rules)).toEqual([]);
-});
-
-
-//test("agents cannot move into non-empty tiles", () => {
-// const lattice = [[ {type: 'empty', flags: {}}, {type: 'filled', flags: {}} ]];
-// const bad_prop = [{ agent_updates: [{ agent_id: 14, x: 1, y: 0 }] }];
-// expect(lattice_valid(lattice, bad_prop)).toBe(false);
-// const good_prop = [{ agent_updates: [{ agent_id: 14, x: 0, y: 0 }] }];
-// expect(lattice_valid(lattice, bad_prop)).toBe(true);
-//});
-
-
-test("growth update rule applied", () => {
- const lattice = [[
- { type: 'empty', flags: {} },
- { type: 'empty', flags: {} },
- { type: 'plant', flags: {} },
- ]];
- expect(lattice_apply(lattice, [{ world_updates:[{ x: 1, y: 0, from: 'empty', to: 'plant' }]}])).toEqual([[
- { type: 'empty', flags: {} },
- { type: 'plant', flags: {} },
- { type: 'plant', flags: {} },
- ]]);
-
- expect(lattice_apply(lattice, [
- { world_updates: [{ x: 2, y: 0, from: 'plant', to: 'empty' } ]},
- { world_updates: [{ x: 1, y: 0, from: 'empty', to: 'plant' } ]},
- { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'plant' } ]},
- ])).toEqual([[
- { type: 'plant', flags: {} },
- { type: 'plant', flags: {} },
- { type: 'empty', flags: {} },
- ]]);
-});
-
-
-test("check proposals agains lattice for validity", () => {
- const lattice = [[ { type: 'empty' }, { type: 'empty' }, { type: 'plant' } ]];
- expect(lattice_valid(lattice, { world_updates: [{ x: -1, y: 0, from: 'blah', to: 'blah' }] })).toBe(false);
- expect(lattice_valid(lattice, { world_updates: [{ x: 0, y: 0, from: 'blah', to: 'blah' }] })).toBe(false);
- expect(lattice_valid(lattice, { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'blah' }] })).toBe(true);
- expect(lattice_valid(lattice, { world_updates: [{ x: 2, y: 0, from: 'empty', to: 'blah' }] })).toBe(false);
- expect(lattice_valid(lattice, { world_updates: [{ x: 2, y: 1, from: 'empty', to: 'blah' }] })).toBe(false);
-});
-
-
-// this test is no longer relevant because resetting the cell flags is taken care of by world_update,
-// not lattice_apply
-//
-//test("proposals update cell flags appropriately", () => {
-// const lattice = [
-// [
-// { type: 'empty', flags: { step: 1} },
-// { type: 'empty', flags: {} },
-// { type: 'plant', flags: { foo: 'bar' } },
-// ]
-// ];
-//
-// // flags are reset each time step
-// expect(lattice_apply(lattice, [{ world_updates:[{ x: 1, y: 0, from: 'empty', to: 'plant' }]}])).toEqual([[
-// { type: 'empty', flags: {} },
-// { type: 'plant', flags: {} },
-// { type: 'plant', flags: {} },
-// ]]);
-//
-// // flags are combined when updating
-// expect(lattice_apply(lattice, [
-// { world_updates: [{ x: 1, y: 0, flags: { foo: 'bar' } } ]},
-// { world_updates: [{ x: 1, y: 0, from: 'empty', to: 'plant', flags: { baz: 'baz' } } ]},
-// { world_updates: [{ x: 0, y: 0, from: 'empty', to: 'plant', flags: { foo: 'foo' } } ]},
-// { world_updates: [{ x: 0, y: 0, flags: { beep: 'boop' } } ]},
-// ])).toEqual([[
-// { type: 'plant', flags: { foo: 'foo', beep: 'boop' } },
-// { type: 'plant', flags: { foo: 'bar', baz: 'baz' } },
-// { type: 'plant', flags: {} },
-// ]]);
-//
-//});
diff --git a/src/world/proposal.js b/src/world/proposal.js
deleted file mode 100644
index 8baca06..0000000
--- a/src/world/proposal.js
+++ /dev/null
@@ -1,183 +0,0 @@
-import { pairs, deepEqual } from '../util.js';
-
-/* agent structure:
- * {
- * id: string
- * net: network
- * state: network_state
- * x, y: number
- * flags: object
- * }
- */
-
-
-/* cell structure:
- * {
- * type: string
- * flags: object
- * }
- */
-
-/* action structure:
- * {
- * name: string,
- * propose: (agent, output) => proposal[]
- * }
- */
-
-
-/* proposal structure
- * all proposed lattice and agent changes must be included for the proposed action to be valid
- * similarly, if any lattice or agent change creates merge conflicts, the proposal cannot be merged
- * and must be removed
- * {
- * lattice_changes: proposal_lattice_change[]?
- * agent_changes: proposal_agent_change[]?
- * }
- */
-
-/* proposal_lattice_change
- * {
- * x, y: number
- * from: string
- * to: string
- * flags: object?
- * }
- */
-
-/* proposal_agent_change
- * {
- * agent_id: string
- * x, y: number?
- * flags: object?
- * }
- */
-
-
-// check that two flags objects are compatible
-// flags are considered compatible if they do not have any common keys with different values
-function flags_compatible(a, b) {
- if (a === undefined || b === undefined) { return true; }
- const keys = [...new Set(Object.keys(a).concat(Object.keys(b)))];
- return keys.reduce(
- (acc, key) => {
- const eq = (a[key] === undefined || b[key] === undefined) ? true : deepEqual(a[key], b[key]);
- return acc && eq;
- },
- true
- );
-}
-
-
-// return a tuple [conflict, merge]
-// conflict is true if the two lattice_changes are incompatible
-// merge is true if the two lattice changes are identical
-// otherwise they are false
-function lattice_change_conflict(a, b) {
- if (deepEqual(a, b)) {
- // merge
- return [false, true];
- }
- if (
- a.x === b.x &&
- a.y === b.y &&
- (a.to != b.to || !flags_compatible((a.flags || {}), (b.flags || {})))
- ) {
- // conflict!
- return [true, false];
- } else {
- // no conflict c:
- return [false, false];
- }
-}
-
-
-// returns true as long as x & y are both defined
-function pos_exists(a) {
- if (a.x !== undefined && a.y !== undefined) {
- return true;
- } else {
- return false;
- }
-}
-
-
-// check the equality of two objects with (x,y) keys
-function pos_equal(a, b) {
- if (a.x !== b.x) { return false; }
- if (a.y !== b.y) { return false; }
- return true;
-}
-
-
-// agent changes merge if they are identical
-// they conflict if two agents are trying to move to the same tile, or
-// if the same agent is trying to move to two different tiles, or if an agent
-// is being updated to incompatible flags
-//
-//
-function agent_change_conflict(a, b) {
- if (deepEqual(a, b)) {
- // identical: merge
- return [false, true];
- } else if (a.agent_id === b.agent_id) {
- if (
- pos_exists(a) && pos_exists(b) && !pos_equal(a, b)
- ) {
- // same agent, different positions: conflict
- return [true, false];
- } else if (!flags_compatible(a.flags, b.flags)) {
- // same agent, incompatible flags: conflict
- return [true, false];
- } else {
- // no conflict c:
- return [false, false];
- }
- } else {
- // different agents
- if (pos_exists(a) && pos_exists(b) && pos_equal(a, b)) {
- // different agents, same position: conflict
- return [true, false];
- } else {
- // no conflict c:
- return [false, false];
- }
- }
-}
-
-
-// combine lattice_change and agent_change conflict/merge tuples for a pair of proposals
-function proposal_conflict_merge(a, b) {
- const [lattice_conflict, lattice_merge] = pairs(a.lattice_changes || [], b.lattice_changes || []).reduce(
- (acc, [a, b]) => {
- const [conflict, merge] = lattice_change_conflict(a, b);
- return [acc[0] || conflict, acc[1] || merge];
- },
- [false, false]
- );
- const [agent_conflict, agent_merge] = pairs(a.agent_changes || [], b.agent_changes || []).reduce(
- (acc, [a, b]) => {
- const [conflict, merge] = agent_change_conflict(a, b);
- return [acc[0] || conflict, acc[1] || merge];
- },
- [false, false]
- );
- return [lattice_conflict || agent_conflict, lattice_merge || agent_merge];
-}
-
-
-// merge proposals
-// if two sub-updates conflict, they are both omitted from the final merged proposal
-export function proposal_merge(arr, proposal) {
- const conflict_merge = arr.map(x => proposal_conflict_merge(x, proposal));
-
- // if any conflicts are detected then don't merge
- if (conflict_merge.reduce((acc, [c, m]) => acc || c, false)) {
- const conflict_free = arr.filter((x, i) => !conflict_merge[i][0]);
- return conflict_free;
- } else {
- // no conflicts, but need to merge identical actions
- const no_merge = arr.filter((x, i) => !conflict_merge[i][1]);
- return [...no_merge, proposal];
- }
-}
diff --git a/src/world/proposal.test.js b/src/world/proposal.test.js
deleted file mode 100644
index 2f870e6..0000000
--- a/src/world/proposal.test.js
+++ /dev/null
@@ -1,197 +0,0 @@
-import {
- proposal_merge,
-} from './proposal.js';
-
-
-// tile updates
-
-test("proposals changing different tiles don't conflict", () => {
- const a = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }],
- };
- const b = {
- lattice_changes: [{ x: 4, y: 4, from: 'empty', to: 'flag' }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a, b]);
-});
-
-
-test("proposals changing the same tile to different states conflict", () => {
- const a = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }],
- };
- const b = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'flag' }],
- };
-
- expect(proposal_merge([a], b)).toEqual([]);
-});
-
-
-test("proposals changing the same tile to the same state merge to a single proposal", () => {
- const a = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }],
- };
- const b = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable' }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a]);
-});
-
-
-test("proposals with identical tile updates but incompatible tile flags conflict", () => {
- const a = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'a' } }],
- };
- const b = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'b' } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([]);
-});
-
-
-test("proposals with identical tile updates but compatible tile flags do not conflict", () => {
- const a = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'a', r: 'd' } }],
- };
- const b = {
- lattice_changes: [{ x: 4, y: 3, from: 'empty', to: 'mutable', flags: { v: 'a', u: 'b' } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a, b]);
-});
-
-
-
-
-test("proposals moving two agents to the same tile conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }],
- };
- const b = {
- agent_changes: [{ agent_id: 'bbb', x: 4, y: 3 }],
- };
-
- expect(proposal_merge([a], b)).toEqual([]);
-});
-
-
-// agent updates
-test("proposals moving two agents to different tiles do not conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }],
- };
- const b = {
- agent_changes: [{ agent_id: 'bbb', x: 3, y: 3 }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a, b]);
-});
-
-
-test("proposals moving the same agent to different tiles conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }],
- };
- const b = {
- agent_changes: [{ agent_id: 'aaa', x: 3, y: 3 }],
- };
-
- expect(proposal_merge([a], b)).toEqual([]);
-});
-
-
-test("proposals moving the same agent to the same tile merge", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }],
- };
- const b = {
- agent_changes: [{ agent_id: 'aaa', x: 4, y: 3 }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a]);
-});
-
-
-test("proposals setting flags on different agents do not conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', flags: { frozen: false } }],
- };
-
- const b = {
- agent_changes: [{ agent_id: 'bbb', flags: { frozen: false } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a, b]);
-});
-
-
-test("setting the same agent to compatible flags does not conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', flags: { frozen: false } }],
- };
-
- const b = {
- agent_changes: [{ agent_id: 'aaa', flags: { crumpet: 'hi' } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a, b]);
-});
-
-
-test("setting the same agent to compatible object flags does not conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }],
- };
-
- const b = {
- agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0], hi: 4 } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a, b]);
-});
-
-
-test("setting the same agent to incompatible flags does conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', flags: { frozen: false } }],
- };
-
- const b = {
- agent_changes: [{ agent_id: 'aaa', flags: { frozen: true, crumpet: 'hi' } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([]);
-});
-
-
-test("setting the same agent to incompatible object flags does conflict", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }],
- };
-
- const b = {
- agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 1], hi: 4 } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([]);
-});
-
-
-test("setting the same agent to identical flags merges", () => {
- const a = {
- agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }],
- };
-
- const b = {
- agent_changes: [{ agent_id: 'aaa', flags: { emit: [0, 1, 1, 0] } }],
- };
-
- expect(proposal_merge([a], b)).toEqual([a]);
-});
-
-
-
diff --git a/src/world/sense.js b/src/world/sense.js
deleted file mode 100644
index 9b5c7d4..0000000
--- a/src/world/sense.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-/* sense structure:
- * {
- * size: number
- * read: function(lattice, agent) -> number[size]
- * }
- */
-
-
-export function sense_read(world, agent, sense) {
- const result = sense.read(world, agent);
- if (result.length !== sense.size) {
- throw new Error(`Expected result of size ${sense.size}, but got ${result.length} instead.`);
- }
- return result;
-}
diff --git a/src/world/sense.test.js b/src/world/sense.test.js
deleted file mode 100644
index 27ee2b5..0000000
--- a/src/world/sense.test.js
+++ /dev/null
@@ -1,33 +0,0 @@
-import { sense_read } from './sense.js';
-
-
-test("basic sense works", () => {
- const flag_sense = {
- size: 1,
- read: (world, agent) => {
- const {x, y} = agent;
- return [ world.lattice[y-1][x].type === 'flag' ? 1.0 : 0.0 ]
- },
- };
-
- const lattice = [[ { type: 'flag' } ]];
- const agent = { x: 0, y: 1 };
-
- expect(sense_read({lattice}, agent, flag_sense)).toEqual([1.0]);
-});
-
-
-test("senses throw if the size is incorrect", () => {
- const flag_sense = {
- size: 2,
- read: (world, agent) => {
- const {x, y} = agent;
- return [ world.lattice[y-1][x].type === 'flag' ? 1.0 : 0.0 ]
- },
- }
-
- const lattice = [[ { type: 'flag' } ]];
- const agent = { x: 0, y: 1 };
-
- expect(() => sense_read({lattice}, agent, flag_sense)).toThrow();
-});
diff --git a/src/world/world.js b/src/world/world.js
deleted file mode 100644
index 63d974a..0000000
--- a/src/world/world.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import { lattice_update, lattice_valid, lattice_apply } from './lattice.js';
-import { agent_decide, agent_apply } from './agent.js';
-import { proposal_merge } from './proposal.js';
-
-
-// world structure:
-// {
-// lattice
-// lattice_rules: object
-// agents: agent[]
-// senses: sense[]
-// actions: action[]
-// validity: (function(proposal) => bool)[]
-// }
-
-
-export function world_update(world, postprocess=[]) {
- const lattice_props = lattice_update(world.lattice, world.lattice_rules);
- const intermediate_lattice = lattice_apply(
- world.lattice.map(row => row.map(cell => ({ ...cell, flags: {} }))),
- lattice_props
- );
-
- const decisions = world.agents
- .map(a => agent_decide(world, a, world.senses, world.actions))
- .reduce(
- ([agents, props], [agent, prop]) => [[...agents, agent], [...props, prop]],
- [[], []]
- );
- const intermediate_agents = decisions[0];
- const agent_props = world.validity.reduce(
- (acc, rule) => acc.filter(prop => rule({...world, lattice: intermediate_lattice}, prop)),
- decisions[1]
- .flat()
- .reduce((acc, prop) => proposal_merge(acc, prop), [])
- .filter(prop => lattice_valid(intermediate_lattice, prop))
- );
-
- const lattice = lattice_apply(intermediate_lattice, agent_props);
- const agents = intermediate_agents.map(a => agent_apply(a, agent_props));
-
- const new_world = {...world, lattice, agents};
- return postprocess.reduce(
- (acc, f) => f(acc),
- new_world
- );
-}
diff --git a/test.bat b/test.bat
deleted file mode 100644
index c54907c..0000000
--- a/test.bat
+++ /dev/null
@@ -1,3 +0,0 @@
-set NODE_OPTIONS=--experimental-vm-modules
-
-jest
diff --git a/yarn.lock b/yarn.lock
deleted file mode 100644
index 87b5a72..0000000
--- a/yarn.lock
+++ /dev/null
@@ -1,2135 +0,0 @@
-# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
-# yarn lockfile v1
-
-
-"@ampproject/remapping@^2.2.0":
- version "2.2.1"
- resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
- integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
- dependencies:
- "@jridgewell/gen-mapping" "^0.3.0"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.5.tgz#234d98e1551960604f1246e6475891a570ad5658"
- integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==
- dependencies:
- "@babel/highlight" "^7.22.5"
-
-"@babel/compat-data@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.22.5.tgz#b1f6c86a02d85d2dd3368a2b67c09add8cd0c255"
- integrity sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==
-
-"@babel/core@^7.11.6", "@babel/core@^7.12.3":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.22.5.tgz#d67d9747ecf26ee7ecd3ebae1ee22225fe902a89"
- integrity sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==
- dependencies:
- "@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.22.5"
- "@babel/generator" "^7.22.5"
- "@babel/helper-compilation-targets" "^7.22.5"
- "@babel/helper-module-transforms" "^7.22.5"
- "@babel/helpers" "^7.22.5"
- "@babel/parser" "^7.22.5"
- "@babel/template" "^7.22.5"
- "@babel/traverse" "^7.22.5"
- "@babel/types" "^7.22.5"
- convert-source-map "^1.7.0"
- debug "^4.1.0"
- gensync "^1.0.0-beta.2"
- json5 "^2.2.2"
- semver "^6.3.0"
-
-"@babel/generator@^7.22.5", "@babel/generator@^7.7.2":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.22.5.tgz#1e7bf768688acfb05cf30b2369ef855e82d984f7"
- integrity sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==
- dependencies:
- "@babel/types" "^7.22.5"
- "@jridgewell/gen-mapping" "^0.3.2"
- "@jridgewell/trace-mapping" "^0.3.17"
- jsesc "^2.5.1"
-
-"@babel/helper-compilation-targets@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz#fc7319fc54c5e2fa14b2909cf3c5fd3046813e02"
- integrity sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==
- dependencies:
- "@babel/compat-data" "^7.22.5"
- "@babel/helper-validator-option" "^7.22.5"
- browserslist "^4.21.3"
- lru-cache "^5.1.1"
- semver "^6.3.0"
-
-"@babel/helper-environment-visitor@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz#f06dd41b7c1f44e1f8da6c4055b41ab3a09a7e98"
- integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==
-
-"@babel/helper-function-name@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz#ede300828905bb15e582c037162f99d5183af1be"
- integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==
- dependencies:
- "@babel/template" "^7.22.5"
- "@babel/types" "^7.22.5"
-
-"@babel/helper-hoist-variables@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
- integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-module-imports@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz#1a8f4c9f4027d23f520bd76b364d44434a72660c"
- integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-module-transforms@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz#0f65daa0716961b6e96b164034e737f60a80d2ef"
- integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==
- dependencies:
- "@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-module-imports" "^7.22.5"
- "@babel/helper-simple-access" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.5"
- "@babel/helper-validator-identifier" "^7.22.5"
- "@babel/template" "^7.22.5"
- "@babel/traverse" "^7.22.5"
- "@babel/types" "^7.22.5"
-
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
- integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
-
-"@babel/helper-simple-access@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
- integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-split-export-declaration@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz#88cf11050edb95ed08d596f7a044462189127a08"
- integrity sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==
- dependencies:
- "@babel/types" "^7.22.5"
-
-"@babel/helper-string-parser@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
- integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
-
-"@babel/helper-validator-identifier@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz#9544ef6a33999343c8740fa51350f30eeaaaf193"
- integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==
-
-"@babel/helper-validator-option@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz#de52000a15a177413c8234fa3a8af4ee8102d0ac"
- integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==
-
-"@babel/helpers@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.22.5.tgz#74bb4373eb390d1ceed74a15ef97767e63120820"
- integrity sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==
- dependencies:
- "@babel/template" "^7.22.5"
- "@babel/traverse" "^7.22.5"
- "@babel/types" "^7.22.5"
-
-"@babel/highlight@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.5.tgz#aa6c05c5407a67ebce408162b7ede789b4d22031"
- integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==
- dependencies:
- "@babel/helper-validator-identifier" "^7.22.5"
- chalk "^2.0.0"
- js-tokens "^4.0.0"
-
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.22.5.tgz#721fd042f3ce1896238cf1b341c77eb7dee7dbea"
- integrity sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==
-
-"@babel/plugin-syntax-async-generators@^7.8.4":
- version "7.8.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
- integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-bigint@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
- integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-class-properties@^7.8.3":
- version "7.12.13"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
- integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.12.13"
-
-"@babel/plugin-syntax-import-meta@^7.8.3":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
- integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-json-strings@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
- integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-jsx@^7.7.2":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918"
- integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
- integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
- integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-numeric-separator@^7.8.3":
- version "7.10.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
- integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
- dependencies:
- "@babel/helper-plugin-utils" "^7.10.4"
-
-"@babel/plugin-syntax-object-rest-spread@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
- integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
- integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-optional-chaining@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
- integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
- dependencies:
- "@babel/helper-plugin-utils" "^7.8.0"
-
-"@babel/plugin-syntax-top-level-await@^7.8.3":
- version "7.14.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
- integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
- dependencies:
- "@babel/helper-plugin-utils" "^7.14.5"
-
-"@babel/plugin-syntax-typescript@^7.7.2":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272"
- integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==
- dependencies:
- "@babel/helper-plugin-utils" "^7.22.5"
-
-"@babel/template@^7.22.5", "@babel/template@^7.3.3":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.5.tgz#0c8c4d944509875849bd0344ff0050756eefc6ec"
- integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==
- dependencies:
- "@babel/code-frame" "^7.22.5"
- "@babel/parser" "^7.22.5"
- "@babel/types" "^7.22.5"
-
-"@babel/traverse@^7.22.5", "@babel/traverse@^7.7.2":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.22.5.tgz#44bd276690db6f4940fdb84e1cb4abd2f729ccd1"
- integrity sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==
- dependencies:
- "@babel/code-frame" "^7.22.5"
- "@babel/generator" "^7.22.5"
- "@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
- "@babel/helper-hoist-variables" "^7.22.5"
- "@babel/helper-split-export-declaration" "^7.22.5"
- "@babel/parser" "^7.22.5"
- "@babel/types" "^7.22.5"
- debug "^4.1.0"
- globals "^11.1.0"
-
-"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.22.5.tgz#cd93eeaab025880a3a47ec881f4b096a5b786fbe"
- integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==
- dependencies:
- "@babel/helper-string-parser" "^7.22.5"
- "@babel/helper-validator-identifier" "^7.22.5"
- to-fast-properties "^2.0.0"
-
-"@bcoe/v8-coverage@^0.2.3":
- version "0.2.3"
- resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
- integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-
-"@istanbuljs/load-nyc-config@^1.0.0":
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
- integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
- dependencies:
- camelcase "^5.3.1"
- find-up "^4.1.0"
- get-package-type "^0.1.0"
- js-yaml "^3.13.1"
- resolve-from "^5.0.0"
-
-"@istanbuljs/schema@^0.1.2":
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
- integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
-
-"@jest/console@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57"
- integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==
- dependencies:
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- chalk "^4.0.0"
- jest-message-util "^29.5.0"
- jest-util "^29.5.0"
- slash "^3.0.0"
-
-"@jest/core@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03"
- integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==
- dependencies:
- "@jest/console" "^29.5.0"
- "@jest/reporters" "^29.5.0"
- "@jest/test-result" "^29.5.0"
- "@jest/transform" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- ansi-escapes "^4.2.1"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- exit "^0.1.2"
- graceful-fs "^4.2.9"
- jest-changed-files "^29.5.0"
- jest-config "^29.5.0"
- jest-haste-map "^29.5.0"
- jest-message-util "^29.5.0"
- jest-regex-util "^29.4.3"
- jest-resolve "^29.5.0"
- jest-resolve-dependencies "^29.5.0"
- jest-runner "^29.5.0"
- jest-runtime "^29.5.0"
- jest-snapshot "^29.5.0"
- jest-util "^29.5.0"
- jest-validate "^29.5.0"
- jest-watcher "^29.5.0"
- micromatch "^4.0.4"
- pretty-format "^29.5.0"
- slash "^3.0.0"
- strip-ansi "^6.0.0"
-
-"@jest/environment@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65"
- integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==
- dependencies:
- "@jest/fake-timers" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- jest-mock "^29.5.0"
-
-"@jest/expect-utils@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036"
- integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==
- dependencies:
- jest-get-type "^29.4.3"
-
-"@jest/expect@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba"
- integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==
- dependencies:
- expect "^29.5.0"
- jest-snapshot "^29.5.0"
-
-"@jest/fake-timers@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c"
- integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==
- dependencies:
- "@jest/types" "^29.5.0"
- "@sinonjs/fake-timers" "^10.0.2"
- "@types/node" "*"
- jest-message-util "^29.5.0"
- jest-mock "^29.5.0"
- jest-util "^29.5.0"
-
-"@jest/globals@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298"
- integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==
- dependencies:
- "@jest/environment" "^29.5.0"
- "@jest/expect" "^29.5.0"
- "@jest/types" "^29.5.0"
- jest-mock "^29.5.0"
-
-"@jest/reporters@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b"
- integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==
- dependencies:
- "@bcoe/v8-coverage" "^0.2.3"
- "@jest/console" "^29.5.0"
- "@jest/test-result" "^29.5.0"
- "@jest/transform" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@jridgewell/trace-mapping" "^0.3.15"
- "@types/node" "*"
- chalk "^4.0.0"
- collect-v8-coverage "^1.0.0"
- exit "^0.1.2"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- istanbul-lib-coverage "^3.0.0"
- istanbul-lib-instrument "^5.1.0"
- istanbul-lib-report "^3.0.0"
- istanbul-lib-source-maps "^4.0.0"
- istanbul-reports "^3.1.3"
- jest-message-util "^29.5.0"
- jest-util "^29.5.0"
- jest-worker "^29.5.0"
- slash "^3.0.0"
- string-length "^4.0.1"
- strip-ansi "^6.0.0"
- v8-to-istanbul "^9.0.1"
-
-"@jest/schemas@^29.4.3":
- version "29.4.3"
- resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788"
- integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==
- dependencies:
- "@sinclair/typebox" "^0.25.16"
-
-"@jest/source-map@^29.4.3":
- version "29.4.3"
- resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20"
- integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.15"
- callsites "^3.0.0"
- graceful-fs "^4.2.9"
-
-"@jest/test-result@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408"
- integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==
- dependencies:
- "@jest/console" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/istanbul-lib-coverage" "^2.0.0"
- collect-v8-coverage "^1.0.0"
-
-"@jest/test-sequencer@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4"
- integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==
- dependencies:
- "@jest/test-result" "^29.5.0"
- graceful-fs "^4.2.9"
- jest-haste-map "^29.5.0"
- slash "^3.0.0"
-
-"@jest/transform@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9"
- integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==
- dependencies:
- "@babel/core" "^7.11.6"
- "@jest/types" "^29.5.0"
- "@jridgewell/trace-mapping" "^0.3.15"
- babel-plugin-istanbul "^6.1.1"
- chalk "^4.0.0"
- convert-source-map "^2.0.0"
- fast-json-stable-stringify "^2.1.0"
- graceful-fs "^4.2.9"
- jest-haste-map "^29.5.0"
- jest-regex-util "^29.4.3"
- jest-util "^29.5.0"
- micromatch "^4.0.4"
- pirates "^4.0.4"
- slash "^3.0.0"
- write-file-atomic "^4.0.2"
-
-"@jest/types@^29.5.0":
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593"
- integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==
- dependencies:
- "@jest/schemas" "^29.4.3"
- "@types/istanbul-lib-coverage" "^2.0.0"
- "@types/istanbul-reports" "^3.0.0"
- "@types/node" "*"
- "@types/yargs" "^17.0.8"
- chalk "^4.0.0"
-
-"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
- version "0.3.3"
- resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
- integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
- dependencies:
- "@jridgewell/set-array" "^1.0.1"
- "@jridgewell/sourcemap-codec" "^1.4.10"
- "@jridgewell/trace-mapping" "^0.3.9"
-
-"@jridgewell/resolve-uri@3.1.0":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78"
- integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
-
-"@jridgewell/set-array@^1.0.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
- integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
-
-"@jridgewell/sourcemap-codec@1.4.14":
- version "1.4.14"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24"
- integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
-
-"@jridgewell/sourcemap-codec@^1.4.10":
- version "1.4.15"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
- integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
-
-"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
- version "0.3.18"
- resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6"
- integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==
- dependencies:
- "@jridgewell/resolve-uri" "3.1.0"
- "@jridgewell/sourcemap-codec" "1.4.14"
-
-"@sinclair/typebox@^0.25.16":
- version "0.25.24"
- resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718"
- integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==
-
-"@sinonjs/commons@^3.0.0":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72"
- integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==
- dependencies:
- type-detect "4.0.8"
-
-"@sinonjs/fake-timers@^10.0.2":
- version "10.2.0"
- resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz#b3e322a34c5f26e3184e7f6115695f299c1b1194"
- integrity sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==
- dependencies:
- "@sinonjs/commons" "^3.0.0"
-
-"@types/babel__core@^7.1.14":
- version "7.20.1"
- resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.1.tgz#916ecea274b0c776fec721e333e55762d3a9614b"
- integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==
- dependencies:
- "@babel/parser" "^7.20.7"
- "@babel/types" "^7.20.7"
- "@types/babel__generator" "*"
- "@types/babel__template" "*"
- "@types/babel__traverse" "*"
-
-"@types/babel__generator@*":
- version "7.6.4"
- resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7"
- integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==
- dependencies:
- "@babel/types" "^7.0.0"
-
-"@types/babel__template@*":
- version "7.4.1"
- resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969"
- integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==
- dependencies:
- "@babel/parser" "^7.1.0"
- "@babel/types" "^7.0.0"
-
-"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6":
- version "7.20.1"
- resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.1.tgz#dd6f1d2411ae677dcb2db008c962598be31d6acf"
- integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==
- dependencies:
- "@babel/types" "^7.20.7"
-
-"@types/graceful-fs@^4.1.3":
- version "4.1.6"
- resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae"
- integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==
- dependencies:
- "@types/node" "*"
-
-"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
- integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==
-
-"@types/istanbul-lib-report@*":
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
- integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
- dependencies:
- "@types/istanbul-lib-coverage" "*"
-
-"@types/istanbul-reports@^3.0.0":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff"
- integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==
- dependencies:
- "@types/istanbul-lib-report" "*"
-
-"@types/node@*":
- version "20.2.5"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.2.5.tgz#26d295f3570323b2837d322180dfbf1ba156fefb"
- integrity sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==
-
-"@types/prettier@^2.1.5":
- version "2.7.3"
- resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
- integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
-
-"@types/stack-utils@^2.0.0":
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c"
- integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==
-
-"@types/yargs-parser@*":
- version "21.0.0"
- resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b"
- integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==
-
-"@types/yargs@^17.0.8":
- version "17.0.24"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902"
- integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==
- dependencies:
- "@types/yargs-parser" "*"
-
-ansi-escapes@^4.2.1:
- version "4.3.2"
- resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
- integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
- dependencies:
- type-fest "^0.21.3"
-
-ansi-regex@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
- integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
-
-ansi-styles@^3.2.1:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
- integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
- dependencies:
- color-convert "^1.9.0"
-
-ansi-styles@^4.0.0, ansi-styles@^4.1.0:
- version "4.3.0"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
- integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
- dependencies:
- color-convert "^2.0.1"
-
-ansi-styles@^5.0.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
- integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
-
-anymatch@^3.0.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
- integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
- dependencies:
- normalize-path "^3.0.0"
- picomatch "^2.0.4"
-
-argparse@^1.0.7:
- version "1.0.10"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
- integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
- dependencies:
- sprintf-js "~1.0.2"
-
-babel-jest@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5"
- integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==
- dependencies:
- "@jest/transform" "^29.5.0"
- "@types/babel__core" "^7.1.14"
- babel-plugin-istanbul "^6.1.1"
- babel-preset-jest "^29.5.0"
- chalk "^4.0.0"
- graceful-fs "^4.2.9"
- slash "^3.0.0"
-
-babel-plugin-istanbul@^6.1.1:
- version "6.1.1"
- resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
- integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
- dependencies:
- "@babel/helper-plugin-utils" "^7.0.0"
- "@istanbuljs/load-nyc-config" "^1.0.0"
- "@istanbuljs/schema" "^0.1.2"
- istanbul-lib-instrument "^5.0.4"
- test-exclude "^6.0.0"
-
-babel-plugin-jest-hoist@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a"
- integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==
- dependencies:
- "@babel/template" "^7.3.3"
- "@babel/types" "^7.3.3"
- "@types/babel__core" "^7.1.14"
- "@types/babel__traverse" "^7.0.6"
-
-babel-preset-current-node-syntax@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
- integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
- dependencies:
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-bigint" "^7.8.3"
- "@babel/plugin-syntax-class-properties" "^7.8.3"
- "@babel/plugin-syntax-import-meta" "^7.8.3"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.8.3"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-top-level-await" "^7.8.3"
-
-babel-preset-jest@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2"
- integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==
- dependencies:
- babel-plugin-jest-hoist "^29.5.0"
- babel-preset-current-node-syntax "^1.0.0"
-
-balanced-match@^1.0.0:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
- integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
-
-brace-expansion@^1.1.7:
- version "1.1.11"
- resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
- integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
- dependencies:
- balanced-match "^1.0.0"
- concat-map "0.0.1"
-
-braces@^3.0.2:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
- integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
- dependencies:
- fill-range "^7.0.1"
-
-browserslist@^4.21.3:
- version "4.21.7"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.7.tgz#e2b420947e5fb0a58e8f4668ae6e23488127e551"
- integrity sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==
- dependencies:
- caniuse-lite "^1.0.30001489"
- electron-to-chromium "^1.4.411"
- node-releases "^2.0.12"
- update-browserslist-db "^1.0.11"
-
-bser@2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
- integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
- dependencies:
- node-int64 "^0.4.0"
-
-buffer-from@^1.0.0:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
- integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
-
-callsites@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
- integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
-
-camelcase@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
- integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-
-camelcase@^6.2.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
- integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-
-caniuse-lite@^1.0.30001489:
- version "1.0.30001497"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001497.tgz#0e5387b98e7dbf9c4f743fb16e92cbf0ca780714"
- integrity sha512-I4/duVK4wL6rAK/aKZl3HXB4g+lIZvaT4VLAn2rCgJ38jVLb0lv2Xug6QuqmxXFVRJMF74SPPWPJ/1Sdm3vCzw==
-
-chalk@^2.0.0:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
- integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
- dependencies:
- ansi-styles "^3.2.1"
- escape-string-regexp "^1.0.5"
- supports-color "^5.3.0"
-
-chalk@^4.0.0:
- version "4.1.2"
- resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
- integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
- dependencies:
- ansi-styles "^4.1.0"
- supports-color "^7.1.0"
-
-char-regex@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
- integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
-
-ci-info@^3.2.0:
- version "3.8.0"
- resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91"
- integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==
-
-cjs-module-lexer@^1.0.0:
- version "1.2.2"
- resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
- integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
-
-cliui@^8.0.1:
- version "8.0.1"
- resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
- integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==
- dependencies:
- string-width "^4.2.0"
- strip-ansi "^6.0.1"
- wrap-ansi "^7.0.0"
-
-co@^4.6.0:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
- integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
-
-collect-v8-coverage@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
- integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
-
-color-convert@^1.9.0:
- version "1.9.3"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
- integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
- dependencies:
- color-name "1.1.3"
-
-color-convert@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
- integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
- dependencies:
- color-name "~1.1.4"
-
-color-name@1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
- integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
-
-color-name@~1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
- integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
-
-concat-map@0.0.1:
- version "0.0.1"
- resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
- integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
-
-convert-source-map@^1.6.0, convert-source-map@^1.7.0:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
- integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
-
-convert-source-map@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
- integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
-
-cross-spawn@^7.0.3:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
-debug@^4.1.0, debug@^4.1.1:
- version "4.3.4"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
- integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
- dependencies:
- ms "2.1.2"
-
-dedent@^0.7.0:
- version "0.7.0"
- resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
- integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==
-
-deepmerge@^4.2.2:
- version "4.3.1"
- resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
- integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
-
-detect-newline@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
- integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
-
-diff-sequences@^29.4.3:
- version "29.4.3"
- resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2"
- integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==
-
-electron-to-chromium@^1.4.411:
- version "1.4.427"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.427.tgz#67e8069f7a864fc092fe2e09f196e68af5cb88a1"
- integrity sha512-HK3r9l+Jm8dYAm1ctXEWIC+hV60zfcjS9UA5BDlYvnI5S7PU/yytjpvSrTNrSSRRkuu3tDyZhdkwIczh+0DWaw==
-
-emittery@^0.13.1:
- version "0.13.1"
- resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad"
- integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==
-
-emoji-regex@^8.0.0:
- version "8.0.0"
- resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
- integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
-
-error-ex@^1.3.1:
- version "1.3.2"
- resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
- integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
- dependencies:
- is-arrayish "^0.2.1"
-
-escalade@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
- integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
-
-escape-string-regexp@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
- integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
-
-escape-string-regexp@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
- integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
-
-esprima@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
- integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
-
-execa@^5.0.0:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
- integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
- dependencies:
- cross-spawn "^7.0.3"
- get-stream "^6.0.0"
- human-signals "^2.1.0"
- is-stream "^2.0.0"
- merge-stream "^2.0.0"
- npm-run-path "^4.0.1"
- onetime "^5.1.2"
- signal-exit "^3.0.3"
- strip-final-newline "^2.0.0"
-
-exit@^0.1.2:
- version "0.1.2"
- resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
- integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
-
-expect@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7"
- integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==
- dependencies:
- "@jest/expect-utils" "^29.5.0"
- jest-get-type "^29.4.3"
- jest-matcher-utils "^29.5.0"
- jest-message-util "^29.5.0"
- jest-util "^29.5.0"
-
-fast-json-stable-stringify@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
- integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
-
-fb-watchman@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
- integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
- dependencies:
- bser "2.1.1"
-
-fill-range@^7.0.1:
- version "7.0.1"
- resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
- integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
- dependencies:
- to-regex-range "^5.0.1"
-
-find-up@^4.0.0, find-up@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
- integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
- dependencies:
- locate-path "^5.0.0"
- path-exists "^4.0.0"
-
-fs.realpath@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
- integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
-
-fsevents@^2.3.2:
- version "2.3.2"
- resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
- integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
-
-function-bind@^1.1.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
- integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
-
-gensync@^1.0.0-beta.2:
- version "1.0.0-beta.2"
- resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
- integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
-
-get-caller-file@^2.0.5:
- version "2.0.5"
- resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
- integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
-
-get-package-type@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
- integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
-
-get-stream@^6.0.0:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
- integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
-
-glob@^7.1.3, glob@^7.1.4:
- version "7.2.3"
- resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
- integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
- dependencies:
- fs.realpath "^1.0.0"
- inflight "^1.0.4"
- inherits "2"
- minimatch "^3.1.1"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
-globals@^11.1.0:
- version "11.12.0"
- resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
- integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
-
-graceful-fs@^4.2.9:
- version "4.2.11"
- resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
- integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
-
-has-flag@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
- integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
-
-has-flag@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
- integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
-
-has@^1.0.3:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
- integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
- dependencies:
- function-bind "^1.1.1"
-
-html-escaper@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
- integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
-
-human-signals@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
- integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
-
-import-local@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
- integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
- dependencies:
- pkg-dir "^4.2.0"
- resolve-cwd "^3.0.0"
-
-imurmurhash@^0.1.4:
- version "0.1.4"
- resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
- integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
-
-inflight@^1.0.4:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
- integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
- dependencies:
- once "^1.3.0"
- wrappy "1"
-
-inherits@2:
- version "2.0.4"
- resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
- integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
-
-is-arrayish@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
- integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
-
-is-core-module@^2.11.0:
- version "2.12.1"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd"
- integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==
- dependencies:
- has "^1.0.3"
-
-is-fullwidth-code-point@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
- integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
-
-is-generator-fn@^2.0.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
- integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
-
-is-number@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
- integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
-
-is-stream@^2.0.0:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
- integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-
-isexe@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
- integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
-
-istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
- integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
-
-istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
- version "5.2.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
- integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
- dependencies:
- "@babel/core" "^7.12.3"
- "@babel/parser" "^7.14.7"
- "@istanbuljs/schema" "^0.1.2"
- istanbul-lib-coverage "^3.2.0"
- semver "^6.3.0"
-
-istanbul-lib-report@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
- integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
- dependencies:
- istanbul-lib-coverage "^3.0.0"
- make-dir "^3.0.0"
- supports-color "^7.1.0"
-
-istanbul-lib-source-maps@^4.0.0:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
- integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
- dependencies:
- debug "^4.1.1"
- istanbul-lib-coverage "^3.0.0"
- source-map "^0.6.1"
-
-istanbul-reports@^3.1.3:
- version "3.1.5"
- resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae"
- integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==
- dependencies:
- html-escaper "^2.0.0"
- istanbul-lib-report "^3.0.0"
-
-jest-changed-files@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e"
- integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==
- dependencies:
- execa "^5.0.0"
- p-limit "^3.1.0"
-
-jest-circus@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317"
- integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==
- dependencies:
- "@jest/environment" "^29.5.0"
- "@jest/expect" "^29.5.0"
- "@jest/test-result" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- chalk "^4.0.0"
- co "^4.6.0"
- dedent "^0.7.0"
- is-generator-fn "^2.0.0"
- jest-each "^29.5.0"
- jest-matcher-utils "^29.5.0"
- jest-message-util "^29.5.0"
- jest-runtime "^29.5.0"
- jest-snapshot "^29.5.0"
- jest-util "^29.5.0"
- p-limit "^3.1.0"
- pretty-format "^29.5.0"
- pure-rand "^6.0.0"
- slash "^3.0.0"
- stack-utils "^2.0.3"
-
-jest-cli@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67"
- integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==
- dependencies:
- "@jest/core" "^29.5.0"
- "@jest/test-result" "^29.5.0"
- "@jest/types" "^29.5.0"
- chalk "^4.0.0"
- exit "^0.1.2"
- graceful-fs "^4.2.9"
- import-local "^3.0.2"
- jest-config "^29.5.0"
- jest-util "^29.5.0"
- jest-validate "^29.5.0"
- prompts "^2.0.1"
- yargs "^17.3.1"
-
-jest-config@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da"
- integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==
- dependencies:
- "@babel/core" "^7.11.6"
- "@jest/test-sequencer" "^29.5.0"
- "@jest/types" "^29.5.0"
- babel-jest "^29.5.0"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- deepmerge "^4.2.2"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- jest-circus "^29.5.0"
- jest-environment-node "^29.5.0"
- jest-get-type "^29.4.3"
- jest-regex-util "^29.4.3"
- jest-resolve "^29.5.0"
- jest-runner "^29.5.0"
- jest-util "^29.5.0"
- jest-validate "^29.5.0"
- micromatch "^4.0.4"
- parse-json "^5.2.0"
- pretty-format "^29.5.0"
- slash "^3.0.0"
- strip-json-comments "^3.1.1"
-
-jest-diff@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63"
- integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==
- dependencies:
- chalk "^4.0.0"
- diff-sequences "^29.4.3"
- jest-get-type "^29.4.3"
- pretty-format "^29.5.0"
-
-jest-docblock@^29.4.3:
- version "29.4.3"
- resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8"
- integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==
- dependencies:
- detect-newline "^3.0.0"
-
-jest-each@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06"
- integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==
- dependencies:
- "@jest/types" "^29.5.0"
- chalk "^4.0.0"
- jest-get-type "^29.4.3"
- jest-util "^29.5.0"
- pretty-format "^29.5.0"
-
-jest-environment-node@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967"
- integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==
- dependencies:
- "@jest/environment" "^29.5.0"
- "@jest/fake-timers" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- jest-mock "^29.5.0"
- jest-util "^29.5.0"
-
-jest-get-type@^29.4.3:
- version "29.4.3"
- resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5"
- integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==
-
-jest-haste-map@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de"
- integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==
- dependencies:
- "@jest/types" "^29.5.0"
- "@types/graceful-fs" "^4.1.3"
- "@types/node" "*"
- anymatch "^3.0.3"
- fb-watchman "^2.0.0"
- graceful-fs "^4.2.9"
- jest-regex-util "^29.4.3"
- jest-util "^29.5.0"
- jest-worker "^29.5.0"
- micromatch "^4.0.4"
- walker "^1.0.8"
- optionalDependencies:
- fsevents "^2.3.2"
-
-jest-leak-detector@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c"
- integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==
- dependencies:
- jest-get-type "^29.4.3"
- pretty-format "^29.5.0"
-
-jest-matcher-utils@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5"
- integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==
- dependencies:
- chalk "^4.0.0"
- jest-diff "^29.5.0"
- jest-get-type "^29.4.3"
- pretty-format "^29.5.0"
-
-jest-message-util@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e"
- integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==
- dependencies:
- "@babel/code-frame" "^7.12.13"
- "@jest/types" "^29.5.0"
- "@types/stack-utils" "^2.0.0"
- chalk "^4.0.0"
- graceful-fs "^4.2.9"
- micromatch "^4.0.4"
- pretty-format "^29.5.0"
- slash "^3.0.0"
- stack-utils "^2.0.3"
-
-jest-mock@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed"
- integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==
- dependencies:
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- jest-util "^29.5.0"
-
-jest-pnp-resolver@^1.2.2:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
- integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
-
-jest-regex-util@^29.4.3:
- version "29.4.3"
- resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8"
- integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==
-
-jest-resolve-dependencies@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4"
- integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==
- dependencies:
- jest-regex-util "^29.4.3"
- jest-snapshot "^29.5.0"
-
-jest-resolve@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc"
- integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==
- dependencies:
- chalk "^4.0.0"
- graceful-fs "^4.2.9"
- jest-haste-map "^29.5.0"
- jest-pnp-resolver "^1.2.2"
- jest-util "^29.5.0"
- jest-validate "^29.5.0"
- resolve "^1.20.0"
- resolve.exports "^2.0.0"
- slash "^3.0.0"
-
-jest-runner@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8"
- integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==
- dependencies:
- "@jest/console" "^29.5.0"
- "@jest/environment" "^29.5.0"
- "@jest/test-result" "^29.5.0"
- "@jest/transform" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- chalk "^4.0.0"
- emittery "^0.13.1"
- graceful-fs "^4.2.9"
- jest-docblock "^29.4.3"
- jest-environment-node "^29.5.0"
- jest-haste-map "^29.5.0"
- jest-leak-detector "^29.5.0"
- jest-message-util "^29.5.0"
- jest-resolve "^29.5.0"
- jest-runtime "^29.5.0"
- jest-util "^29.5.0"
- jest-watcher "^29.5.0"
- jest-worker "^29.5.0"
- p-limit "^3.1.0"
- source-map-support "0.5.13"
-
-jest-runtime@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420"
- integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==
- dependencies:
- "@jest/environment" "^29.5.0"
- "@jest/fake-timers" "^29.5.0"
- "@jest/globals" "^29.5.0"
- "@jest/source-map" "^29.4.3"
- "@jest/test-result" "^29.5.0"
- "@jest/transform" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- chalk "^4.0.0"
- cjs-module-lexer "^1.0.0"
- collect-v8-coverage "^1.0.0"
- glob "^7.1.3"
- graceful-fs "^4.2.9"
- jest-haste-map "^29.5.0"
- jest-message-util "^29.5.0"
- jest-mock "^29.5.0"
- jest-regex-util "^29.4.3"
- jest-resolve "^29.5.0"
- jest-snapshot "^29.5.0"
- jest-util "^29.5.0"
- slash "^3.0.0"
- strip-bom "^4.0.0"
-
-jest-snapshot@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce"
- integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==
- dependencies:
- "@babel/core" "^7.11.6"
- "@babel/generator" "^7.7.2"
- "@babel/plugin-syntax-jsx" "^7.7.2"
- "@babel/plugin-syntax-typescript" "^7.7.2"
- "@babel/traverse" "^7.7.2"
- "@babel/types" "^7.3.3"
- "@jest/expect-utils" "^29.5.0"
- "@jest/transform" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/babel__traverse" "^7.0.6"
- "@types/prettier" "^2.1.5"
- babel-preset-current-node-syntax "^1.0.0"
- chalk "^4.0.0"
- expect "^29.5.0"
- graceful-fs "^4.2.9"
- jest-diff "^29.5.0"
- jest-get-type "^29.4.3"
- jest-matcher-utils "^29.5.0"
- jest-message-util "^29.5.0"
- jest-util "^29.5.0"
- natural-compare "^1.4.0"
- pretty-format "^29.5.0"
- semver "^7.3.5"
-
-jest-util@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f"
- integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==
- dependencies:
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- chalk "^4.0.0"
- ci-info "^3.2.0"
- graceful-fs "^4.2.9"
- picomatch "^2.2.3"
-
-jest-validate@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc"
- integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==
- dependencies:
- "@jest/types" "^29.5.0"
- camelcase "^6.2.0"
- chalk "^4.0.0"
- jest-get-type "^29.4.3"
- leven "^3.1.0"
- pretty-format "^29.5.0"
-
-jest-watcher@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363"
- integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==
- dependencies:
- "@jest/test-result" "^29.5.0"
- "@jest/types" "^29.5.0"
- "@types/node" "*"
- ansi-escapes "^4.2.1"
- chalk "^4.0.0"
- emittery "^0.13.1"
- jest-util "^29.5.0"
- string-length "^4.0.1"
-
-jest-worker@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d"
- integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==
- dependencies:
- "@types/node" "*"
- jest-util "^29.5.0"
- merge-stream "^2.0.0"
- supports-color "^8.0.0"
-
-jest@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/jest/-/jest-29.5.0.tgz#f75157622f5ce7ad53028f2f8888ab53e1f1f24e"
- integrity sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==
- dependencies:
- "@jest/core" "^29.5.0"
- "@jest/types" "^29.5.0"
- import-local "^3.0.2"
- jest-cli "^29.5.0"
-
-js-tokens@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
- integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
-
-js-yaml@^3.13.1:
- version "3.14.1"
- resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
- integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
- dependencies:
- argparse "^1.0.7"
- esprima "^4.0.0"
-
-jsesc@^2.5.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
- integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-
-json-parse-even-better-errors@^2.3.0:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
- integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
-
-json5@^2.2.2:
- version "2.2.3"
- resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
- integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
-
-kleur@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
- integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
-
-leven@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
- integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
-
-lines-and-columns@^1.1.6:
- version "1.2.4"
- resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
- integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
-
-locate-path@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
- integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
- dependencies:
- p-locate "^4.1.0"
-
-lru-cache@^5.1.1:
- version "5.1.1"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
- integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
- dependencies:
- yallist "^3.0.2"
-
-lru-cache@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
- integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
- dependencies:
- yallist "^4.0.0"
-
-make-dir@^3.0.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
- integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
- dependencies:
- semver "^6.0.0"
-
-makeerror@1.0.12:
- version "1.0.12"
- resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
- integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
- dependencies:
- tmpl "1.0.5"
-
-merge-stream@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
- integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
-
-micromatch@^4.0.4:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
- integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
- dependencies:
- braces "^3.0.2"
- picomatch "^2.3.1"
-
-mimic-fn@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
- integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-
-minimatch@^3.0.4, minimatch@^3.1.1:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
- integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
- dependencies:
- brace-expansion "^1.1.7"
-
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-natural-compare@^1.4.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
- integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-
-node-int64@^0.4.0:
- version "0.4.0"
- resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
- integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
-
-node-releases@^2.0.12:
- version "2.0.12"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.12.tgz#35627cc224a23bfb06fb3380f2b3afaaa7eb1039"
- integrity sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==
-
-normalize-path@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
- integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
-
-npm-run-path@^4.0.1:
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
- integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
- dependencies:
- path-key "^3.0.0"
-
-once@^1.3.0:
- version "1.4.0"
- resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
- integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
- dependencies:
- wrappy "1"
-
-onetime@^5.1.2:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
- integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
- dependencies:
- mimic-fn "^2.1.0"
-
-p-limit@^2.2.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
- integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
- dependencies:
- p-try "^2.0.0"
-
-p-limit@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
- integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
- dependencies:
- yocto-queue "^0.1.0"
-
-p-locate@^4.1.0:
- version "4.1.0"
- resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
- integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
- dependencies:
- p-limit "^2.2.0"
-
-p-try@^2.0.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
- integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
-
-parse-json@^5.2.0:
- version "5.2.0"
- resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
- integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
- dependencies:
- "@babel/code-frame" "^7.0.0"
- error-ex "^1.3.1"
- json-parse-even-better-errors "^2.3.0"
- lines-and-columns "^1.1.6"
-
-path-exists@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
- integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
-
-path-is-absolute@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
- integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
-
-path-key@^3.0.0, path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
-path-parse@^1.0.7:
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
- integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
-
-picocolors@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
- integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
-
-picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
- version "2.3.1"
- resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
- integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
-
-pirates@^4.0.4:
- version "4.0.5"
- resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
- integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
-
-pkg-dir@^4.2.0:
- version "4.2.0"
- resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
- integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
- dependencies:
- find-up "^4.0.0"
-
-pretty-format@^29.5.0:
- version "29.5.0"
- resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a"
- integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==
- dependencies:
- "@jest/schemas" "^29.4.3"
- ansi-styles "^5.0.0"
- react-is "^18.0.0"
-
-prompts@^2.0.1:
- version "2.4.2"
- resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
- integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
- dependencies:
- kleur "^3.0.3"
- sisteransi "^1.0.5"
-
-pure-rand@^6.0.0:
- version "6.0.2"
- resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.2.tgz#a9c2ddcae9b68d736a8163036f088a2781c8b306"
- integrity sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==
-
-react-is@^18.0.0:
- version "18.2.0"
- resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b"
- integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==
-
-require-directory@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
- integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
-
-resolve-cwd@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
- integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
- dependencies:
- resolve-from "^5.0.0"
-
-resolve-from@^5.0.0:
- version "5.0.0"
- resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
- integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
-
-resolve.exports@^2.0.0:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800"
- integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==
-
-resolve@^1.20.0:
- version "1.22.2"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f"
- integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==
- dependencies:
- is-core-module "^2.11.0"
- path-parse "^1.0.7"
- supports-preserve-symlinks-flag "^1.0.0"
-
-semver@^6.0.0, semver@^6.3.0:
- version "6.3.0"
- resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
- integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
-
-semver@^7.3.5:
- version "7.5.1"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec"
- integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==
- dependencies:
- lru-cache "^6.0.0"
-
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
-signal-exit@^3.0.3, signal-exit@^3.0.7:
- version "3.0.7"
- resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
- integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
-
-sisteransi@^1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
- integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
-
-slash@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
- integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-
-source-map-support@0.5.13:
- version "0.5.13"
- resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932"
- integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==
- dependencies:
- buffer-from "^1.0.0"
- source-map "^0.6.0"
-
-source-map@^0.6.0, source-map@^0.6.1:
- version "0.6.1"
- resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
- integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
-
-sprintf-js@~1.0.2:
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
- integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
-
-stack-utils@^2.0.3:
- version "2.0.6"
- resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
- integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
- dependencies:
- escape-string-regexp "^2.0.0"
-
-string-length@^4.0.1:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
- integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
- dependencies:
- char-regex "^1.0.2"
- strip-ansi "^6.0.0"
-
-string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
- version "4.2.3"
- resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
- integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
- dependencies:
- emoji-regex "^8.0.0"
- is-fullwidth-code-point "^3.0.0"
- strip-ansi "^6.0.1"
-
-strip-ansi@^6.0.0, strip-ansi@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
- integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
- dependencies:
- ansi-regex "^5.0.1"
-
-strip-bom@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
- integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
-
-strip-final-newline@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
- integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
-
-strip-json-comments@^3.1.1:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
- integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-
-supports-color@^5.3.0:
- version "5.5.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
- integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
- dependencies:
- has-flag "^3.0.0"
-
-supports-color@^7.1.0:
- version "7.2.0"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
- integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
- dependencies:
- has-flag "^4.0.0"
-
-supports-color@^8.0.0:
- version "8.1.1"
- resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
- integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
- dependencies:
- has-flag "^4.0.0"
-
-supports-preserve-symlinks-flag@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
- integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
-
-test-exclude@^6.0.0:
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
- integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
- dependencies:
- "@istanbuljs/schema" "^0.1.2"
- glob "^7.1.4"
- minimatch "^3.0.4"
-
-tmpl@1.0.5:
- version "1.0.5"
- resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
- integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
-
-to-fast-properties@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
- integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
-
-to-regex-range@^5.0.1:
- version "5.0.1"
- resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
- integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
- dependencies:
- is-number "^7.0.0"
-
-type-detect@4.0.8:
- version "4.0.8"
- resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
- integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
-
-type-fest@^0.21.3:
- version "0.21.3"
- resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
- integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
-
-update-browserslist-db@^1.0.11:
- version "1.0.11"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940"
- integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==
- dependencies:
- escalade "^3.1.1"
- picocolors "^1.0.0"
-
-v8-to-istanbul@^9.0.1:
- version "9.1.0"
- resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz#1b83ed4e397f58c85c266a570fc2558b5feb9265"
- integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==
- dependencies:
- "@jridgewell/trace-mapping" "^0.3.12"
- "@types/istanbul-lib-coverage" "^2.0.1"
- convert-source-map "^1.6.0"
-
-walker@^1.0.8:
- version "1.0.8"
- resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
- integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
- dependencies:
- makeerror "1.0.12"
-
-which@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
-wrap-ansi@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
- integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
- dependencies:
- ansi-styles "^4.0.0"
- string-width "^4.1.0"
- strip-ansi "^6.0.0"
-
-wrappy@1:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
- integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
-
-write-file-atomic@^4.0.2:
- version "4.0.2"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd"
- integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==
- dependencies:
- imurmurhash "^0.1.4"
- signal-exit "^3.0.7"
-
-y18n@^5.0.5:
- version "5.0.8"
- resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
- integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
-
-yallist@^3.0.2:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
- integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
-
-yallist@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
- integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
-
-yargs-parser@^21.1.1:
- version "21.1.1"
- resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
- integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
-
-yargs@^17.3.1:
- version "17.7.2"
- resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
- integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
- dependencies:
- cliui "^8.0.1"
- escalade "^3.1.1"
- get-caller-file "^2.0.5"
- require-directory "^2.1.1"
- string-width "^4.2.3"
- y18n "^5.0.5"
- yargs-parser "^21.1.1"
-
-yocto-queue@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
- integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==