Code
Number of khipus with cords = 651
Number of all cords (including top cords and subsidiaries) = 58092
Number of pendant cords (including top cords) = 41819
A Counter Counts to a Count:
Between 1600 and 1615 A.D, a native Quechua speaking noble, named Felipe Guaman Poma de Ayala, wrote (and drew) a book-length account of native Inka life. He knew Spanish law allowed him to express his grievances of Spanish iniquities in a letter to the court of King Phillip II of Spain. This drawing, subsequently colorized, presents the scene of a khipu-kamayuq (a Khipu reader/maker) reciting a khipu to the Inka emperor Sapa Inka Tupac Yupanki (topaynqa yupomqui). Tupac Yupanki was the son of emperor Pachakutiq, the great Sapa Inka conqueror who made the larger four-state Inka empire.
Their names are Quechua - Yupomki might have some association with Quechua yupay-nki meaning âyour Counterâ). Pachacutiq can be broken down as (cutiq aka kutiy-qa, one whose return kutiy, starts a new pacha a new time/universe). Intriguingly, the spelling Guaman Poma uses, with mâs instead of nâs, implies a southern Quechua dialect, not a native Cusco dialect.
The writing on the above right âadministrador suyo-yoq - apu pomachaisa? translates asâAn administrator of a suyu (one of the four states of the Inca empire known as tawa-n-tin-suyu)â. Unfortunately, my modern-day Quechua skills leave me unable to translate the last line, but my guess is that here apu pomachaisa refers to the sacred place (apu) Pomacocha. Located close to the great city of Vilcashuaman, Pomacocha was regarded as an apu, likely because Tupac Yupanki was born there.In 1989, using the new abilities of the computer, Oxford University Press issued its fully integrated second edition, incorporating all the changes and additions of the supplements in twenty rather more slender volumes. To help boost sales in the late seventies a two-volume set in a much-reduced typeface was issued, a powerful magnifying glass included in every slipcase. Then came a CD-ROM, and not long afterward the great work was further adapted for use on-line. A third edition, with a vast budget, was in the works.
There is some occasional carping that the work reflects an elitist, male, British, Victorian tone. Yet even in the admission that, like so many achievements of the era, it did reflect a set of attitudes not wholly harmonic with those prevalent at the end of the twentieth century, none seem to suggest that any other dictionary has ever come close, or will ever come close, to the achievement that it offers. It was the heroic creation of a legion of interested and enthusiastic men and women of wide general knowledge and interest; and it lives on today, just as lives the language of which it rightly claims to be a portrait.
Simon Winchester - The Professor and the Madman:
A Tale of Murder, Insanity, and the Making of the Oxford English Dictionary
Like the Oxford dictionary, mentioned above, the Khipu Field Guide database is not the work of one or two people, but a group of enthusiastic khipu researchers. Iâd like to call out the many people who measured and created the first digital records of these khipus. However, first, I need to preface with a discussion about âdata sourcesâ and morality.
The field of epigraphy/decipherment has many stories of âesteemedâ scholars behaving badly. An example from history involves the decipherment of the Maya script. In the early 20th century, scholars were aware of the existence of the Maya script, but no one had been able to decipher it. In the 1950s, a Russian scholar named Yuri Knorosov began to make progress in deciphering the script, using a combination of linguistic analysis and comparisons to known Maya inscriptions. Knorosovâs work was not immediately recognized by the Western academic establishment, in part because he was a communist and his work was seen as potentially supporting Soviet claims to influence in Central America. Meanwhile, a British scholar named Eric Thompson had been working on the Maya script for years but had made little progress.
Thompson, who was widely respected in the academic community, was determined to maintain his position as the leading Maya scholar, and he began to systematically undermine Knorosovâs work. Eventually, Knorosovâs decipherment of the Maya script was widely accepted, and Thompsonâs prejudices were disposed of. However, Thompsonâs actions had delayed the recognition of Knorosovâs work and contributed to a climate of mistrust and fear in the academic community. The pursuit of decipherment seems to breed personal ambition and political considerations that influence the interpretation of historical evidence. For me, Thompsonâs lesson is to reemphasize the importance of integrity and accuracy in the pursuit of archaeological knowledge.
Pride, politics and citizenship are not the only biases. There is also gender. The 20th century architect Michael Ventris, who cracked âLinear Bâ, built his own work on âthe unsung heroine Alice Kober.â Sadly, the khipu field, has recent, similar parallels. In this respect, the external question has been raised, should I be using khipu measurements based on a khipu measurerâs morality? Like the Oxford dictionary, some of the the Khipu Field Guide database comes from a professor who did not reflect a set of attitudes wholly harmonic with those prevalent at the end of the twentieth century. Nonetheless, the khipus exist, as do the legion of interested and enthusiastic women and men of wide general knowledge and interest. In this discussion of data sources and morality, I have been guided by the philosopher/ethicist Erich Hatala Matthes. In his book Drawing the Line: What to Do with the Work of Immoral Artists from Museums to the Movies, Matthes explores the issues of intrinsic and extrinsic values of a creatorâs work and shows how ethically nuanced and careful we have to be, should we decide to:
a.) Choose to morally criticize an artefact
b.) Choose to consider the artefact makerâs morality, and
c.) Choose to prescribe how we should view or not view the artefact.
Each of these choices implies an ethical choice with many Socratic contradictions, and Matthes does his philosopherâs best to question every seemingly simple judgement about the willingness to choose to morally criticize.
One school of thought is that just as a Jackson Pollock drip painting has no evil intent, in situ, neither do khipu measurements. This school of thought says that canceling the khipu seems like an odd choice. Another school of thought says the artefactâs intent is only morally bad if you know the makerâs intent is morally bad. If you didnât know what an arrowhead was used for, and only later discover it killed not a deer, but a baby, would you cancel your archaeological research? Another probe questions how morality changes over time. Would you cancel research into Greek pottery because it depicted homoerotic scenes? How about 100 years ago? In the future, will this work be criticized because I was a fossil-fuel climate-change inducing American? Matthes raises many of these Socratic questions.
In the end, I have chosen the Serenity Prayer - God grant me the serenity to accept the things I cannot change; the courage to change the things I can; and the wisdom to know the difference. In this approach, the prayerâs writer independently arrived at the same conclusion as Matthes - accept there was complicity, but choose a path forward using solidarity, with transparency and the courage to change the things I can:
As for the wisdom to know the difference? I plead human.
Finally, a cautionary note about decipherment. I mentioned British architect and amateur linguist Michael Ventris and the Linear B script above. After years of study, Ventris became convinced that Linear B was an early form of Greek. This proved to be true, and was a major breakthrough in our understanding of ancient Greek civilization and language. However, the decipherment of Linear B also had unforeseen consequences. Having the language be âGreekâ radically overturned a standard picture of the prehistoric Aegean in the second millennium BC â and one standard view of when, where, and how Greek speakers arrived on the scene. The implication of Ventrisâs interpretation, in other words, went far beyond anything to do with how many cattle the Minoans had, or jars of olive oil they had collected. Instead it called into question the separateness and identities of the Minoans of Crete and the Mycenaeans of the mainland. Like the decipherment of our DNA to determine our ancestry, it is not surprising that people might be reluctant to face, just on the basis of an ambitious piece of decipherment of some receipts written on clay tablets, that they are not who they thought they were. Decipherment can have profound and unexpected consequences, and it often challenges long-held assumptions and beliefs.
The acronym KFG refers to this Khipu Field Guide database. Some of the KFG database was derived from data in the Harvard Khipu Database, often referred to as the KDB, a collection of khipu measurements from various authors, cataloged, and then converted into Excel files and a subsequent SQL database. Consequently, it is important to note this: The Khipu Field Guide (KFG) database is not a copy of the Harvard KDB. Although some data in the KFG is extracted from the KDB,and then vetted, cleansed and normalized, the KFG is a larger collection of khipu measurements and reference information, created from multiple sources, including:
Alas, there is one more complication with this statement.
Manuel Medrano, identified (using the museum shoe leather approach) that 15 of the khipus in the Harvard KDB are duplicates. At present, this list includes:
# | Most Recent Measurement | Older Measurement | Merged Modern Name |
---|---|---|---|
1 | AS067/MA029 | AS067/MA29 | KH0080 |
2 | HP035 (Missing from KFG) | AS047 | KH0058 |
3 | HP036 | AS038 | KH0049 |
4 | HP041 | AS046 | KH0057 |
5 | MM1086 | AS086 | MM1086 |
6 | UR035 | AS070 | KH0083 |
7 | UR043 | AS030 | KH0032 |
8 | UR044 | AS031, UR1031 | KH0033 |
9 | UR083 | AS208 | KH0227 |
10 | UR126 | UR115 | KH0350 |
11 | UR133 | UR036 | KH0267 |
12 | UR163 | AS056 | KH0067 |
13 | UR176 | LL01 | KH0001 |
14 | UR236 | AS181 | KH0197 |
15 | UR281 | AS068 | KH0081 |
As you can see many of these are Ascher khipus remeasured by Gary Urton, or Hugo Pereyra. In a few cases they are measurements of khipu by Urton, that were already measured by Urton. Want some similarity match tests? Here you go!
Textual information (chiefly Ascher notes on Ascher khipus plus measurement notes on Urton khipus) are merged into new khipus using using a modern names as suggested by the OKR, shown above. This new naming scheme does not diminish the original authors contributions, except for Urton whose contributions diminish by 3.
Again, since no one source is sufficient, the Khipu Field Guide (KFG) has used multiple sources to assemble itâs own database. Some khipus have had to rely on multiple sources such as the Harvard KDB, AND the Ascher databooks, AND the Excel spreadsheets to completely assemble one khipu correctly. From these numerous sources I have scraped, reconciled, cross-referenced, and assembled 655, useful, non-trivial khipus.
I need to stress the phrase well-formed. To draw khipus, first, the khipu data has to hang together. Cord groups have to have the right cords. Cords have to have the right knots, etc. This requirement, that the database have âreferentialâ integrity, so that it can be properly drawn tests the quality of the database data, and immediately makes errors visually apparent (or not visible if itâs that kind of error!). Consequently, much work in the KFG database was in resolving khipus so that they had referential integrity as well as accuracy at a given level such as knots, cords, etc. Secondly, the khipu has to have interesting data - a primary cord is not enough.
Prior to Urtonâs banishment from Harvard, the Harvard KDB was easily obtained from the Harvard Khipu Database project. The khipu data was in two forms - a limited set of 349 khipus in Excel and a bigger SQL database of about 625+ khipu. I chose the larger database, a territory largely untraveled. So the steps were to:
Along the journey, one night, tired and frustrated with data integrity checks, I saw a note in the cord database nudo desanudado. Unknotted knot. Thatâs what this cleansing has been like.
In the end, the Harvard Khipu Database, yielded about 490 khipu that could serve as the starting point for a database. By back-filling from the original Harvard Excel files and Jon Clindanielâs thesis files, I was able to reassemble another approximately 80 malformed khipus. An additional 19 khipus were assembled by hand from several sources and restored, by me, into âwholeâ khipus. Import of Kylie Quaveâs khipus, extracted from her original Excel spreadsheets, completely replaced 16 khipus that were, in fact, empty, restored 3 partial khipus, and added 3 new khipus. Numerous errors in the KDB khipus were repaired - resulting in changes to over 200 Harvard KDB khipus, with errors such as bad cord lengths, reversed cord/cord group order, incorrect cord group sequences, oddly named pendants, malformed subsidiaries, etc. were repaired by hand as a result of an error-checker failing, or the drawing failing.
The effort to build the initial starting point of Khipu Field Guideâs database from the Harvard KDB was long and gnarly (thatâs not an Academic word, but its use in Industry is appropriate here LOL). If you enjoy reading about pain and suffering feel free to read the documentation.
Before SQL, there was Excel. Many of the original files were collected and documented in Microsoft Excel. When I added the Ascherâs AS001-AS009 khipus, I used Excel. Eventually, I used Excel for everything. So, it turns out does almost everyone else. Although SQL scales, itâs monolithic approach makes update and additions difficult, and frankly, intimidating to the nonSQL. Althoug Iâve had a long career in Silicon Valley, including addressing large database scalability issues, I ended up having a loathing for SQL as a research vehicle. When I had to invent new khipus to solve a research problem, the process of SQL updates took a looong week instead of a short day to get the prototypes correct. At that point, I realized it was best to give up on SQL and start anew.
Version 2 of the database, after 4 years of SQL hacking, is built entirely on Excel files. Each Excel file is read by a python program, which then creates a python âpickleâ file (a binary representation of the python object) of the object-oriented Python Khipu class. From then on, the database is simply read into memory, as needed. Between the speed of Python object pickles, and the fact that we only have 650 khipu not 65000, I have given up on SQL, in this second incarnation of the Khipu FieldGuide database. The database is now a set of files in a standardized Excel Format. These datafiles are downloadable on their respective khipu information webpage. The entire database, consumes 26Mbytes of memory, gigantic, at the time the Harvard KDB was created, and PCs had 640kb, but a microscule amount of data in the 21st century.
Having each khipu have itâs own Excel file allows easy data-checking and rapid iteration on the data. Numerous data recording errors have been subsequently revealed and fixed in this manner.
As mentioned before, these authorâs files were provided in some form of Excel and added to the database via conversion to the standard KFG Excel format.
Now that we have a database of khipus, itâs a good time to review how complete the data is. For example, how many khipus have cords with knots, with known colors, etc. The current list of data to inventory includes:
Letâs evaluate each of these in turn. Weâll look only at Pendants for now in interests of making the search easier. Similarly, weâll only list the number of khipus that have at least some data.
Number of khipus with cords = 651
Number of all cords (including top cords and subsidiaries) = 58092
Number of pendant cords (including top cords) = 41819
num_corded_khipus = sum([aKhipu.num_all_cords() > 0 for aKhipu in all_khipus])
corded_khipus = [aKhipu for aKhipu in all_khipus]
num_cords = sum([aKhipu.num_all_cords() for aKhipu in all_khipus])
num_pendants = sum([aKhipu.num_pendant_cords() for aKhipu in all_khipus])
print(f"Number of khipus with cords = {num_corded_khipus}")
print(f"Number of all cords (including top cords and subsidiaries) = {num_cords}")
print(f"Number of pendant cords (including top cords) = {num_pendants}")
How many khipus have not measured their colors?
no_color_khipus = []
def has_no_color(aCord):
return aCord.main_color()=="PK" or aCord.main_color() == ""
no_color_khipus = []
for aKhipu in all_khipus:
if all([has_no_color(aCord) for aCord in aKhipu.all_cords()]):
no_color_khipus.append(aKhipu.name())
print(f"# of Khipus with No Known Color is {len(no_color_khipus)}")
khipu_rep = uloom.multiline(no_color_khipus, continuation_char="\n ")
print(f"No Color Khipus =\n{khipu_rep}")
# of Khipus with No Known Color is 3
No Color Khipus =
['AS072', 'AS073', 'AS187']
khipus_by_cord_ply = {aKhipu.kfg_name():0 for aKhipu in all_khipus}
for aKhipu in all_khipus:
if num_khipu_cords := aKhipu.num_all_cords():
khipus_by_cord_ply[aKhipu.kfg_name()] = (aKhipu.num_s_cords() + aKhipu.num_z_cords())/num_khipu_cords
khipus_by_cord_ply = dict(sorted(khipus_by_cord_ply.items(), key=lambda x:x[1]))
zero_cord_ply_khipus = [key for key in khipus_by_cord_ply.keys() if khipus_by_cord_ply[key]==0 ]
num_zero_cord_ply_khipus = len(zero_cord_ply_khipus)
print(f"# of Khipus with No Known Cord Ply/Spin is {num_zero_cord_ply_khipus}")
khipu_rep = uloom.multiline(zero_cord_ply_khipus, line_length=80, continuation_char="\n ")
print(f"Zero Cord Ply Khipus =\n{khipu_rep}")
# of Khipus with No Known Cord Ply/Spin is 136
Zero Cord Ply Khipus =
['AS001', 'AS002', 'AS003', 'AS004', 'AS005', 'AS006', 'AS007', 'AS008',
'AS009', 'AS010', 'AS011', 'AS012', 'AS013', 'AS014', 'AS015', 'AS016', 'AS017',
'AS018', 'AS019', 'AS020', 'AS021', 'AS023', 'AS024', 'AS025', 'AS026A',
'AS026B', 'AS027', 'AS028', 'AS029', 'AS35A', 'AS35B', 'AS035C', 'AS035D',
'AS036', 'AS037', 'AS039', 'AS041', 'AS042', 'AS043', 'AS044', 'AS045', 'AS048',
'AS050', 'AS054', 'AS055', 'AS059', 'AS060', 'AS061/MA036', 'AS062', 'AS063',
'AS063B', 'AS064', 'AS065', 'AS065B', 'AS066', 'AS069', 'AS071', 'AS072',
'AS073', 'AS077', 'AS081', 'AS082', 'AS083', 'AS085', 'AS089', 'AS090/N2',
'AS092', 'AS093', 'AS094', 'AS101 - Part 1', 'AS101 - Part 2', 'AS110', 'AS111',
'AS112', 'AS115', 'AS122', 'AS125', 'AS128', 'AS129', 'AS132', 'AS133', 'AS134',
'AS137', 'AS139', 'AS142', 'AS153', 'AS155', 'AS156', 'AS157', 'AS158', 'AS159',
'AS160', 'AS164', 'AS168', 'AS169', 'AS171', 'AS172', 'AS173', 'AS174', 'AS177',
'AS178', 'AS182', 'AS182B', 'AS183', 'AS184', 'AS185', 'AS186', 'AS187',
'AS188', 'AS189', 'AS201', 'AS202', 'AS203', 'AS204', 'AS205', 'AS206',
'AS207A', 'AS207B', 'AS207C', 'AS209', 'AS210', 'AS211', 'AS212', 'AS213',
'AS214', 'AS215', 'AS215F', 'HP052', 'KH0058', 'KH0080', 'UR1033A', 'UR1034',
'UR1040', 'UR1052', 'UR1127', 'UR1141']
khipus_by_cord_attachment = {}
for aKhipu in all_khipus:
if num_khipu_cords := aKhipu.num_pendant_cords():
khipus_by_cord_attachment[aKhipu.name()] = (aKhipu.num_top_cords() + aKhipu.num_recto_cords() + aKhipu.num_verso_cords())/num_khipu_cords
else:
khipus_by_cord_attachment[aKhipu.name()] = 0
khipus_by_cord_attachment = dict(sorted(khipus_by_cord_attachment.items(), key=lambda x:x[1]))
zero_cord_attachment_khipus = [key for key in khipus_by_cord_attachment.keys() if khipus_by_cord_attachment[key]==0 ]
num_zero_cord_attachment_khipus = len(zero_cord_attachment_khipus)
print(f"# of Khipus with No Known Cord Attachment is {num_zero_cord_attachment_khipus}")
khipu_rep = uloom.multiline(zero_cord_attachment_khipus, line_length=80, continuation_char="\n ")
print(f"Zero Cord Attachment Khipus =\n{khipu_rep}")
# of Khipus with No Known Cord Attachment is 4
Zero Cord Attachment Khipus =
['AS005', 'AS008', 'AS009', 'KH0058']
How many Khipus have no knots?
## Zero Knot Khipus
def satisfaction_condition(aCord):
return aCord.knotted_value==0
zero_knot_khipus = []
for aKhipu in all_khipus:
if all([satisfaction_condition(aCord) for aCord in aKhipu[:,:]]):
zero_knot_khipus.append(aKhipu.name())
print(f"# of Khipus with No Knots is {len(zero_knot_khipus)}")
khipu_rep = uloom.multiline(zero_knot_khipus, line_length=80, continuation_char="\n ")
print(f"Zero Knot Khipus =\n{khipu_rep}")
# of Khipus with No Knots is 14
Zero Knot Khipus =
['AS025', 'HP025', 'HP026', 'HP028', 'HP048', 'QU001', 'UR070', 'UR071',
'UR082', 'UR103', 'UR158', 'UR179', 'UR185', 'UR216']
How many Khipus have knots with unrecorded twists?
khipus_by_knot_twist = {}
for aKhipu in all_khipus:
if num_khipu_knots := aKhipu.num_knots():
khipus_by_knot_twist[aKhipu.kfg_name()] = (aKhipu.num_s_knots() + aKhipu.num_z_knots())/num_khipu_knots
else:
khipus_by_knot_twist[aKhipu.kfg_name()] = 0
khipus_by_knot_twist = dict(sorted(khipus_by_knot_twist.items(), key=lambda x:x[1]))
zero_knot_twist_khipus = [key for key in khipus_by_knot_twist.keys() if khipus_by_knot_twist[key]==0 ]
num_zero_knot_twist_khipus = len(zero_knot_twist_khipus)
print(f"# of Khipus with No Known Knot Twist is {num_zero_knot_twist_khipus}")
khipu_rep = uloom.multiline(zero_knot_twist_khipus, line_length=80, continuation_char="\n ")
print(f"No Known Knot Twist Khipus =\n{khipu_rep}")
# of Khipus with No Known Knot Twist is 188
No Known Knot Twist Khipus =
['AS001', 'AS002', 'AS003', 'AS004', 'AS005', 'AS006', 'AS007', 'AS008',
'AS009', 'AS010', 'AS011', 'AS012', 'AS013', 'AS014', 'AS015', 'AS016', 'AS017',
'AS018', 'AS019', 'AS020', 'AS021', 'AS023', 'AS024', 'AS025', 'AS026A',
'AS026B', 'AS027', 'AS028', 'AS029', 'AS35A', 'AS35B', 'AS035C', 'AS035D',
'AS036', 'AS037', 'AS039', 'AS041', 'AS042', 'AS043', 'AS044', 'AS045', 'AS048',
'AS050', 'AS054', 'AS055', 'AS059', 'AS060', 'AS061/MA036', 'AS062', 'AS063',
'AS063B', 'AS064', 'AS065', 'AS065B', 'AS066', 'AS069', 'AS071', 'AS072',
'AS073', 'AS077', 'AS081', 'AS082', 'AS083', 'AS085', 'AS089', 'AS090/N2',
'AS092', 'AS093', 'AS094', 'AS101 - Part 1', 'AS101 - Part 2', 'AS110', 'AS111',
'AS112', 'AS115', 'AS122', 'AS125', 'AS128', 'AS129', 'AS132', 'AS133', 'AS134',
'AS137', 'AS139', 'AS142', 'AS153', 'AS155', 'AS156', 'AS157', 'AS158', 'AS159',
'AS160', 'AS164', 'AS168', 'AS169', 'AS170', 'AS171', 'AS172', 'AS173', 'AS174',
'AS177', 'AS178', 'AS182', 'AS182B', 'AS183', 'AS184', 'AS185', 'AS186',
'AS187', 'AS188', 'AS189', 'AS198', 'AS200', 'AS201', 'AS202', 'AS203', 'AS204',
'AS205', 'AS206', 'AS207A', 'AS207B', 'AS207C', 'AS209', 'AS210', 'AS211',
'AS212', 'AS213', 'AS214', 'AS215', 'AS215F', 'HP025', 'HP026', 'HP028',
'HP038', 'HP039', 'HP044', 'HP047', 'HP048', 'HP049', 'HP052', 'KH0049',
'KH0058', 'KH0080', 'KH0081', 'MM011', 'MM013', 'MM014', 'QU001', 'QU005',
'QU006', 'UR002', 'UR013', 'UR024', 'UR039', 'UR040', 'UR041', 'UR042', 'UR051',
'UR052', 'UR053D', 'UR070', 'UR071', 'UR082', 'UR098', 'UR099', 'UR100',
'UR101', 'UR108', 'UR112', 'UR121', 'UR123', 'UR131A', 'UR131C', 'UR136',
'UR137', 'UR158', 'UR216', 'UR250', 'UR263', 'UR265', 'UR290', 'UR1034',
'UR1040', 'UR1097', 'UR1099', 'UR1105', 'UR1116', 'UR1117']
How many Khipus record axis orientation of long knots?
khipus_with_axis_orientation = []
for aKhipu in all_khipus:
if has_axis_declared := any([aKnot for aKnot in aKhipu.all_knots() if aKnot.axis_orientation]):
khipus_with_axis_orientation.append(aKhipu.kfg_name())
num_khipus_with_axis_orientation = len(khipus_with_axis_orientation)
print(f"# of Khipus with at least one knot which has axis_orientation declared is {num_khipus_with_axis_orientation}")
khipu_rep = uloom.multiline(khipus_with_axis_orientation, line_length=80, continuation_char="\n ")
print(f"Khipus with Knot Axis Orientation Declared =\n{khipu_rep}")
# of Khipus with at least one knot which has axis_orientation declared is 24
Khipus with Knot Axis Orientation Declared =
['MM001', 'MM002', 'MM003', 'MM004', 'MM005', 'MM006/AN001', 'MM007/AN002',
'MM008', 'MM009', 'MM010', 'MM011', 'MM012', 'MM013', 'MM014', 'MM015', 'MM016',
'MM017', 'MM018', 'MM019', 'MM020', 'MM021', 'MM022', 'MM1086', 'UR221']