Skip to content

Commit 4a07b3c

Browse files
authored
Merge pull request #85 from arnaud-m/feat-60
Define experimental protocol for solving cryptarithms - close #60
2 parents 9d16b95 + 9290406 commit 4a07b3c

28 files changed

+1733
-16
lines changed

README.org

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ It is based on [[https://github.com/chocoteam/choco-solver][choco-solver]] which
1717
- [[http://www.cadaeic.net/alphas.htm][An Alphametic Page]], Mike Keith - a must for alphametic lovers.
1818
- [[http://cryptarithms.awardspace.us/][Cryptarithms Online]], Jorge A. C. B. Soares - it contains the Sphinx collection, links, books.
1919
- [[http://www.tkcs-collins.com/truman/alphamet/alphamet.shtml][Alphametic Puzzles]], Truman Collins - he has solvers and even generators.
20-
20+
- You can also browse our [[file:src/main/cryptarithms/][collection of cryptarithms]].
2121

2222
* Download and Installation
2323

@@ -39,15 +39,16 @@ It is based on [[https://github.com/chocoteam/choco-solver][choco-solver]] which
3939
: mvn clean package -DskipTests=true
4040

4141
The jar file contains all required dependencies.
42-
The next step is simply to run one of the console applications.
43-
The links point to demonstration scripts.
42+
The next step is simply to run the console application.
43+
: java -cp target/cryptator-0.5.1-SNAPSHOT-with-dependencies.jar cryptator.Cryptator send+more=money
44+
45+
There are three console applications and the links below point to demonstration scripts.
4446

4547
- *solve a cryptarithm* with [[file:src/main/shell/demo-solve.sh][Cryptator]].
4648
- *generate cryptarithms* with [[file:src/main/shell/demo-generate.sh][Cryptagen]] (see the [[file:src/main/shell/demo-generate-output.md][demo output]]).
4749
- *play the game* with [[file:src/main/shell/demo-play.sh][Cryptamancer]].
4850

49-
50-
Execute the main classe without argument to display the help message.
51+
Execute the main class without argument to display the help message.
5152
** As a library
5253

5354
The jar file does not contains any dependencies, as of being used as a dependency of another application.

src/main/R/sample-words.R

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ p <- add_argument(p, "--letters", help="number of letters", type="integer", defa
6363
p <- add_argument(p, "--vowels", help="number of vowels", type="integer", default = 4)
6464
p <- add_argument(p, "--words", help="number of words per list", type="integer", default = 50)
6565
p <- add_argument(p, "--minlen", help="minimal word length", type="integer", default = 2)
66+
p <- add_argument(p, "--maxlen", help="maximal word length", type="integer", default = Inf)
6667

6768
## Parse the command line arguments
6869
argv <- parse_args(p)
@@ -74,8 +75,8 @@ argv <- parse_args(p)
7475
words <- ScanWords(argv$dictionary)
7576
cat("Scan", length(words), "words in", argv$dictionary,"\n")
7677

77-
words <- subset(words, nchar(words) >= argv$minlen)
78-
cat("Find", length(words), "words with length >=", argv$minlen,"\n")
78+
words <- subset(words, (argv$minlen <= nchar(words)) & (nchar(words) <= argv$maxlen))
79+
cat("Find ", length(words), " words with length in [", argv$minlen, ", ", argv$maxlen, "]\n", sep = "")
7980

8081
## Try generating words lists
8182
i <- 0 # instance
@@ -97,4 +98,4 @@ if(length(words) >= argv$words) {
9798
j <- j + 1
9899
}
99100
}
100-
cat("Generate", i , "words lists after", j, "tentatives\n")
101+
cat("Generate", i , "words list(s) after", j, "tentative(s)\n")

src/main/benchmarks/README.org

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
echo -v normal -d TRUE -lightM FALSE -lightP FALSE > algorithms/FF.dat
7373
#+END_SRC
7474

75-
*** Other algorithms
75+
*** All algorithms
7676

7777
#+BEGIN_SRC sh
7878
echo -v normal -d TRUE -lightM FALSE -lightP FALSE > algorithms/FF.dat
@@ -82,7 +82,6 @@
8282
#+END_SRC
8383

8484
* Generate and Solve
85-
8685
** Configure the solver
8786

8887
#+BEGIN_SRC sh
@@ -118,12 +117,8 @@ The word lists ~colors.txt~ and ~monsters.txt~ takes the most time by far (aroun
118117
generateLong 14 elements.txt
119118
generateLong 49 palindromes-fr.txt
120119
generateLong 41 palindromes-en.txt
121-
generateLong 14 countries.txt
122-
generateLong 11 computer.txt
123-
generateLong 12 jobs.txt
124-
generateLong 13 jobs.txt
125-
generateLong 13 vins.txt
126-
generateLong 28 mythologie-grecque/mythologie-grecque.txt
120+
generateLong 15 capitales.txt
121+
generateLong 16 capitales.txt
127122
#+END_SRC
128123

129124
** Configure the algorithm
@@ -132,7 +127,41 @@ The word lists ~colors.txt~ and ~monsters.txt~ takes the most time by far (aroun
132127
echo -v quiet -d FALSE -l TRUE -lightM FALSE -lightP FALSE > algorithms/ALL.dat
133128
#+END_SRC
134129

130+
131+
* Solve
132+
** Configure the solver
133+
134+
#+BEGIN_SRC sh
135+
rm solver.sh
136+
ln -s solver-solve.sh solver.sh
137+
#+END_SRC
138+
139+
** Configure instances
140+
141+
Select instance files in the directory ~instances-solve~.
142+
143+
- Filename prefixed by ~long~ requires the bignum model.
144+
- Filename prefixed by ~short~ are accepted by the scalar model.
145+
146+
** Configure the algorithm
147+
148+
#+BEGIN_SRC sh
149+
ARGS=" -v verbose -t 10"
150+
echo $ARGS -l TRUE > algorithms/BIGNUM.dat
151+
echo $ARGS -l FALSE -h FALSE > algorithms/SCALAR.dat
152+
echo $ARGS -l FALSE -h TRUE > algorithms/HORNER.dat
153+
154+
echo $ARGS -l TRUE -search 1 > algorithms/BIGNUM-1.dat
155+
echo $ARGS -l FALSE -h FALSE -search 1 > algorithms/SCALAR-1.dat
156+
echo $ARGS -l FALSE -h TRUE -search 1 > algorithms/HORNER-1.dat
157+
158+
#+END_SRC
159+
160+
135161
* Testing
162+
163+
Change the file extension accordingly.
164+
136165
** Solve instances in sequential
137166
#+BEGIN_SRC sh
138167
nohup gridjobs -l -p '*.dat' &
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
actor+actress+artist+cellist+contractor+electrician+internist+retailer+sailor+scientist+socialite+tailor=entertainer
2+
actor+actress+artist+contractor+courier+instructor+internist+nun+nurse+scientist+senator+star+treasurer=auctioneer
3+
actor+actress+astronaut+courier+instructor+internist+nun+scientist+scout+senator+trainer+treasurer=contractor
4+
actor+actress+captain+carpenter+cartoonist+optician+painter+pianist+poet+prince+reporter+trainer=contractor
5+
actor+actress+captain+carpenter+caterer+internist+operator+optician+painter+prince+scientist+senator=contractor
6+
actor+astronaut+caterer+courier+instructor+internist+nurse+scientist+scout+senator+trainer+treasurer=auctioneer
7+
actor+captain+carpenter+contractor+interpreter+operator+pilot+police+politician+prince+reporter+retailer=electrician
8+
actor+captain+caterer+contractor+entertainer+optician+oracle+painter+pilot+police+prince+principal=electrician
9+
actor+carpenter+caterer+entertainer+operator+oracle+painter+pilot+poet+prince+principal+reporter+retailer=electrician
10+
actress+aide+caterer+contractor+dancer+dentist+director+editor+scientist+senator+star+trader+trainer=cartoonist
11+
actress+artist+captain+caterer+contractor+internist+operator+painter+pianist+prince+reporter+senator+star=cartoonist
12+
actress+caterer+cellist+contractor+electrician+internist+oracle+sailor+senator+socialite+tailor+trainer=entertainer
13+
actress+caterer+contractor+dancer+dentist+dictator+director+editor+internist+senator+star+trader=cartoonist
14+
artist+captain+carpenter+internist+painter+pianist+pitcher+rancher+scientist+star+teacher+technician+trainer=researcher
15+
captain+carpenter+caterer+operator+oracle+painter+pilot+poet+police+politician+reporter+tailor+trainer=contractor
16+
captain+carpenter+electrician+operator+optician+oracle+painter+pilot+poet+principal+retailer+tailor+trainer=entertainer
17+
carpenter+caterer+contractor+interpreter+optician+pilot+poet+politician+prince+reporter+retailer+trainer=electrician
18+
carpenter+contractor+operator+optician+painter+pilot+poet+prince+principal+reporter+retailer+tailor=politician
19+
carpenter+contractor+operator+oracle+painter+poet+police+principal+reporter+retailer+tailor+trainer=politician
20+
electrician+operator+oracle+painter+poet+politician+prince+principal+reporter+retailer+tailor+trainer=entertainer
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
this+a+fire+therefore+for+all+histories+i+tell+a+tale+that+falsifies+its+title+tis+a+lie+the+tale+of+the+last+fire+horses+late+after+the+first+fathers+foresee+the+horrors+the+last+free+troll+terrifies+the+horses+of+fire+the+troll+rests+at+the+hole+of+losses+it+is+there+that+she+stores+roles+of+leathers+after+she+satisfies+her+hate+off+those+fears+a+taste+rises+as+she+hears+the+least+far+horse+those+fast+horses+that+first+hear+the+troll+flee+off+to+the+forest+the+horses+that+alerts+raise+the+stares+of+the+others+as+the+troll+assails+at+the+total+shift+her+teeth+tear+hoof+off+torso+as+the+last+horse+forfeits+its+life+the+first+fathers+hear+of+the+horrors+their+fears+that+the+fires+for+their+feasts+arrest+as+the+first+fathers+resettle+the+last+of+the+fire+horses+the+last+troll+harasses+the+forest+heart+free+at+last+of+the+last+troll+all+offer+their+fire+heat+to+the+assisters+far+off+the+troll+fasts+its+life+shorter+as+stars+rise+the+horses+rest+safe+after+all+share+hot+fish+as+their+affiliates+tailor+a+roofs+for+their+safe=fortresses
2+
aristocratic+prescription+prosopopoeia+protectorate=transoceanic
3+
narragansett+nonogenarian+osteoporosis+proportionate+transposition=retrogression
4+
internescine+osteoporosis+perspiration+postprocessor+proscription=transpiration
5+
antiperspirant+interstitial+presentation+proportionate+transliterate=transportation
6+
aristocratic+postposition+procrastinate+proprioception+proscription+protectorate+transoceanic=interpretation
7+
inappropriate+osteoporosis+procrastinate+prosopopoeia+reconnaissance+spectroscope+transcription=proprioception
8+
apperception+aristocratic+interpretation+presentation+proprioception+proscription+transpiration+transposition=concessionaire
9+
perspiration+postprocessor+practitioner+proscription+prosopopoeia+reconnaissance+transoceanic+transposition=concessionaire
10+
postposition+presentation+protestation+reconnaissance+spectroscope+spectroscopic+transcription+transposition=interpretation
11+
apperception+aristocratic+inconsistent+osteoporosis+prescription+protectorate+protestation+statistician=spectroscopic
12+
inconsistent+osteoporosis+perspiration+postposition+presentation+proportionate+spectroscopic+transpiration=transportation
13+
apperception+interception+practitioner+proscription+protectorate+spectroscope+spectroscopic+transoceanic=transposition
14+
apperception+aristocratic+concessionaire+conscription+inappropriate+incapacitate+inconsistent+interception+osteoporosis+perspiration+prescription+proscription+prosopopoeia+protectorate+protestation+statistician+transoceanic+transpiration=antiperspirant
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
as+a+stamp+collector+i+collect+dear+old+classic+stamps+cool+beer+labels+some+beer+coasters+old+beer+cans+nice+beer+caps+baseball+and+sports+cards+nine+and+ten+meccano+sets+lionel+model+trains+rare+books+and+maps+and+i+also+collected+some+real+rare+old=postcards
2+
as+a+stamp+collector+i+collect+dear+old+classic+stamps+cool+beer+labels+some+beer+coasters+old+beer+cans+nice+beer+caps+baseball+and+sports+cards+nine+and+ten+meccano+sets+lionel+model+trains+rare+books+and+maps+and+i+also+collected+some+real+rare+old+dolls+bears+race+cars+snooker+tables+and=postcards
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
lets+also+remember+the+golden+age+of+old+films+as+the+fantastic+bogart+and+the+fantastic+bergman+and+that+dear+old+sam+starred+in+one+of+the+most+memorable+action+films+called=casablanca
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
achille+ares+aristee+asia+asteria+atlas+attis+castor+ceos+cottos+crios+eole+eos+eros+ether+hera+heracles+hestia+hilaire+les+leto+otos+rhea+talos+tartare+thalassa+theia+trachios=olethros
2+
achille+ares+aristee+asia+asteria+atlas+attis+castor+ceos+cottos+crios+eole+eos+ether+helios+hera+hestia+hilaire+les+leto+olethros+otos+rhea+talos+tartare+thalassa+theia+trachios=heracles
3+
achille+ares+aristee+asia+astreos+atlas+attis+castor+ceos+chaos+cottos+crios+eole+eos+eros+ether+hera+heracles+hestia+hilaire+les+leto+olethros+otos+rhea+talos+tartare+theia=thalassa
4+
actor+actress+aide+artist+caterer+cellist+dictator+director+editor+oracle+soldier+star+tailor=retailer
5+
actor+actress+aide+artist+caterer+cellist+dictator+doctor+editor+soldier+star+trader=retailer
6+
actor+actress+aide+artist+caterer+cellist+dictator+doctor+sailor+soldier+star+trader=retailer
7+
actor+actress+aide+artist+caterer+cellist+director+editor+soldier+star+tailor+trader=retailer
8+
actor+actress+aide+artist+caterer+cellist+editor+sailor+soldier+star+tailor+trader=director
9+
actor+actress+aide+artist+caterer+courier+doctor+editor+educator+scout+trader+tutor=dictator
10+
actor+actress+aide+artist+caterer+director+doctor+editor+scout+star+trader+tutor=educator
11+
actor+actress+aide+artist+caterer+doctor+oracle+retailer+soldier+star+tailor+trader=director
12+
actor+actress+aide+artist+cellist+dictator+director+doctor+editor+oracle+sailor+soldier+star=retailer
13+
actor+actress+aide+artist+cellist+dictator+doctor+editor+oracle+soldier+star+tailor=retailer
14+
actor+actress+aide+caterer+cellist+dictator+editor+oracle+sailor+soldier+star+tailor=retailer
15+
actor+actress+aide+dancer+dictator+director+doctor+editor+scientist+senator+star+trader+trainer=internist
16+
actor+actress+artist+astronaut+caterer+nun+nurse+scientist+scout+senator+star+trainer+tutor=internist
17+
actor+actress+artist+captain+carpenter+caterer+optician+painter+poet+reporter+scientist+senator+star=internist
18+
actor+actress+artist+captain+caterer+painter+pianist+poet+prince+senator+star+trainer=princess
19+
actor+actress+artist+carpenter+caterer+operator+optician+pianist+poet+prince+senator+star+trainer=scientist
20+
actor+actress+artist+caterer+cellist+dictator+director+doctor+oracle+soldier+star+tailor+trader=retailer
21+
actor+aide+caterer+dancer+dictator+director+editor+optician+painter+poet+prince+trader+trainer=carpenter
22+
actor+artist+captain+caterer+internist+operator+optician+painter+pianist+poet+reporter+scientist+senator=carpenter
23+
actor+athlete+author+barber+butcher+butler+catcher+caterer+coach+cobbler+hobo+teacher+tutor=lecturer
24+
actor+athlete+author+barber+butler+catcher+caterer+coach+cobbler+laborer+oracle+teacher+tutor=lecturer
25+
actor+captain+carpenter+caterer+operator+optician+oracle+painter+poet+reporter+retailer+tailor+trainer=principal
26+
actor+captain+caterer+coach+operator+optician+painter+pitcher+poet+prince+rancher+teacher+trainer=reporter
27+
actor+captain+dictator+director+editor+operator+optician+painter+poet+prince+reporter+trader+trainer=carpenter
28+
actress+aide+artist+captain+caterer+dancer+dentist+internist+painter+pianist+prince+scientist+star=president
29+
actress+aide+artist+caterer+cellist+doctor+editor+retailer+sailor+soldier+star+trader=dictator
30+
actress+aide+artist+caterer+cellist+doctor+oracle+retailer+sailor+soldier+star+trader=dictator
31+
actress+aide+artist+caterer+cellist+editor+oracle+retailer+sailor+soldier+star+tailor+trader=dictator
32+
actress+artist+captain+carpenter+cashier+caterer+internist+pitcher+prince+rancher+star+teacher+trainer=scientist
33+
actress+artist+captain+cashier+catcher+caterer+harpist+painter+pianist+pitcher+prince+star+trainer=princess
34+
actress+artist+captain+cashier+catcher+caterer+harpist+pitcher+prince+rancher+star+teacher+trainer=princess
35+
actress+artist+captain+cashier+catcher+harpist+painter+pianist+pitcher+prince+rancher+star+trainer=princess
36+
actress+artist+captain+cashier+catcher+harpist+painter+pianist+pitcher+prince+star+teacher+trainer=princess
37+
actress+artist+cashier+catcher+caterer+harpist+painter+pianist+pitcher+prince+rancher+star+trainer=princess
38+
actress+athlete+cashier+caterer+cellist+coach+oracle+sailor+scholar+star+tailor+teacher=retailer
39+
actress+captain+operator+optician+painter+pianist+poet+prince+reporter+senator+star+trainer=carpenter
40+
aide+artist+dentist+designer+gardener+guide+internist+nurse+ranger+star+student+trainer=treasurer
41+
albania+algeria+angola+armenia+benin+gabon+gambia+georgia+lebanon+liberia+mali+niger+nigeria+romania=mongolia
42+
albania+algeria+angola+armenia+benin+gabon+gambia+georgia+mali+namibia+niger+nigeria+oman+romania=mongolia
43+
albania+algeria+angola+armenia+gabon+gambia+georgia+iran+lebanon+liberia+namibia+niger+nigeria+romania=mongolia
44+
albania+algeria+benin+brunei+burundi+grenada+guinea+india+iran+ireland+liberia+niger+nigeria+uganda=bulgaria
45+
albania+angola+armenia+gabon+gambia+georgia+lebanon+liberia+mali+namibia+niger+nigeria+oman+romania=mongolia
46+
andorra+armenia+cameroon+canada+congo+greece+grenada+india+iran+monaco+morocco+niger+nigeria+oman=dominica
47+
angel+beast+elf+genie+giant+titan=nessie
48+
angel+crone+demon+dragon+gnome+golem+orc=gorgon
49+
angel+crone+demon+gnome+golem+gorgon+ogre+orc=dragon
50+
angel+crone+demon+gnome+golem+gorgon+orc=dragon
51+
angel+crone+demon+gnome+golem+merman+orc=dragon
52+
angel+crone+demon+golem+merman+ogre+orc=dragon
53+
angel+crone+dragon+gnome+golem+ogre+orc=merman
54+
angel+crone+gnome+golem+hag+horror+orc=merman
55+
angel+demon+dragon+gnome+golem+ogre+troll=gorgon
56+
angel+dragon+gnome+golem+hag+horror+ogre=merman
57+
angel+genie+giant+gnome+golem+merman+titan+troll=gorgon
58+
angel+genie+giant+gnome+merman+titan+troll=gorgon
59+
angel+genie+giant+golem+gorgon+ogre+titan+troll=merman
60+
angel+genie+giant+golem+merman+ogre+titan+troll=gorgon
61+
angel+giant+gnome+golem+gorgon+ogre+titan+troll=merman
62+
angel+giant+gnome+golem+gorgon+titan+troll=merman
63+
angel+giant+golem+merman+ogre+titan+troll=gorgon
64+
angola+armenia+benin+gabon+gambia+georgia+iran+lebanon+liberia+mali+namibia+niger+nigeria+oman=mongolia
65+
animator+artist+emperor+empress+marine+mason+miner+painter+pianist+senator+star+trainer=importer
66+
apple+banana+grape+lemon+mango+melon+pear=orange
67+
aramon+corton+cot+macon+marsanne+romanee+roussane+roussanne+samos+sancerre+saumur+tannat+tursan=sauternes
68+
ares+aristee+artemis+asia+asteria+astreos+atlas+attis+eole+eos+eros+ether+helios+hemera+hemithee+hera+hermes+hestia+hilaire+les+leto+moros+olethros+otos+talos+tartare+theia+themis=thalassa
69+
ares+aristee+artemis+asia+asteria+astreos+atlas+attis+eole+eos+eros+ether+helios+hemera+hemithee+hera+hermes+hestia+hilaire+leto+metis+olethros+otos+rhea+talos+tartare+theia+themis=thalassa
70+
ares+aristee+artemis+asia+asteria+atlas+attis+eole+eos+eros+ether+helios+hemera+hemithee+hera+hermes+hestia+hilaire+les+leto+metis+moros+otos+rhea+talos+tartare+theia+themis=olethros
71+
ares+asia+asteria+astreos+atlas+attis+castor+ceos+chaos+crios+eole+eos+eros+ether+helios+hera+heracles+hestia+hilaire+les+leto+otos+rhea+talos+tartare+thalassa+theia+trachios=olethros
72+
captain+caterer+operator+optician+oracle+painter+pilot+police+prince+principal+reporter+retailer+trainer=carpenter
73+
cinco+oito+dez+doze+treze+catorze+dezoito=oitenta
74+
crone+dragon+genie+giant+ogre+orc+titan=gorgon
75+
demon+dryad+gnome+hag+horror+hydra=merman
76+
demon+dryad+gnome+hydra+merman+ogre=horror
77+
demon+dryad+gnome+mummy+ogre+undead=gorgon
78+
dragon+dryad+genie+giant+ogre+titan+yeti=gorgon
79+
genie+ghost+giant+gorgon+ogre+siren+titan=horror
80+
genie+ghost+giant+hag+nessie+ogre+siren+titan=horror
81+
genie+ghost+giant+horror+ogre+siren+titan=gorgon
82+
genie+ghost+giant+nessie+siren+titan=horror

src/main/benchmarks/solver-solve.sh

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
JAR=cryptator-0.5.1-SNAPSHOT-with-dependencies.jar
2+
MAINCLASS=cryptator.Cryptator
3+
4+
MAINARGS=`cat $1 | xargs`
5+
6+
## exclude cryptarithm with long words
7+
## grep -wvE '\w{10,}' $2 | sed 's/[[:space:]]//g' | xargs java -server -Xms512m -Xmx8192m -cp $JAR $MAINCLASS $MAINARGS
8+
9+
## exclude cryptarithm without long words
10+
## grep -wE '\w{10,}' $2 | sed 's/[[:space:]]//g' | xargs java -server -Xms512m -Xmx8192m -cp $JAR $MAINCLASS $MAINARGS
11+
12+
## Do not exclude anything
13+
sed 's/[[:space:]]//g' $2 | xargs java -server -Xms512m -Xmx8192m -cp $JAR $MAINCLASS $MAINARGS
14+
exit $?

src/main/cryptarithms/README.org

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#+STARTUP: overview hidestars logdone
2+
#+LANGUAGE: en
3+
#+TITLE: Cryptator Collection
4+
5+
- Thousands of cryptarithms generated by our solver.
6+
- Each file contains a theme collection.

0 commit comments

Comments
 (0)