4. Traits of the Mosaic History, Found Among the Aztaeca Nations.
The tradition commences with an account of the deluge, as they had preserved
it in books made from the buffalo and deer skin, in which account there is
more certainty than if it had been preserved by mere oral tradition, handed
down from father to son.
They begin by painting, or as we would say by telling us that Noah, whom they
call Tezpi, saved himself with his wife, whom they call Xochiquetzal, on a
raft or canoe. Is not this the ark? The raft or canoe rested on or at the foot
of a mountain, which they call Colhuacan. Is not this Ararat? The men born
after this deluge were born dumb. Is not this the confusion of language at
Babel? A dove from the top of a tree destributes [distributes] languages to
them in the form of an olive leaf. Is not this the dove of Noah, which
returned with that leaf in her mouth, as related in Genisis [Genesis]? They
say that on this raft, besides Tezpi and his wife, were several children, and
animals, with grain, the preservation of which was of importance to mankind.
Is not this in almost exact accordance with what was saved in the ark with
Noah, as stated in Genisis [Genesis]?
When the Great Spirit, Tezcatlipoca, ordered the waters to withdraw, Tezpi
sent out from his raft a vulture, which never returned, on account of the
great quantities of dead carcases [carcasses] which it found to feed upon.. Is
not this the raven of Noah, which did not return when it was sent out the
second time, for the very reason here assigned by the Mexicans? Tezpi sent
other birds one of which was the humming bird; this bird alone returned,
holding in its beak a branch covered with leaves. Is not this the dove?-Tezpi,
seeing that fresh verdure now clothed the earth, quitted his raft near the
mountain of Colhuacan. Is not this an allusion to Ararat of Asia? They say the
tongues which the dove gave to mankind, were infinitely varied; which when
received, they immediately dispersed.-But among them were 15 heads or chiefs
of families, which were permitted to speak the same language, and these were
the Taltecs, the Aculhucans and Azteca nations who embodied themselves
together, which was very natural, and traveled they knew not where, but at
length arrived in the country of Aztalan, of the lake country of America. The
plates or engraving presented here is a surprising representation of the
deluge of Noah; and of the confusion of the ancient language at the building
of the tower of Babel, as related in the Book of Genisis [Genesis]. (see chap.
vii and xi.
We have derived the subject of this plate from Baron Humbolt's volume of
Researches in Mexico, who found it painted on a manuscript book, made of the
leaves of some kind of tree, suitable for the purpose, after the manner of
ancient nations of the sultry parts of Asia around the Mediterranean.
The plate, however here presented shows no more than a picture of the flood,
with Noah afloat on a raft, or as the traditions of some of the nations say on
a tree, a canoe, and some say in a vessel of huge dimensions. Italso [It also]
shows by the group of men approaching the bird, a somewhat obscure history of
the confusion of the ancient language at the building of Babel, by
representing them as being born dumb, who receive the gift of speech from a
dove, which flutters in the branches of the tree, while she presents the
languages to the mute throng, by bestowing upon each individual a leaf of the
tree, which is shown in the form of small commas suspended from its beak.
Among the different nations, according to Humboldt, who inhabited Mexico, were
found paintings which represented the deluge, orflood [or flood] of Tezpi.
The painting of which the plate is the representation, shows Tezpi, of Noah,
in the midst of the waters laying on his back. The mountain, the summit of
which is crowned by a tree and rises above the wasters is the peak of
Colhucan, the Ararat of the Mexicans. At the foot of the mountain on each side
appear the heads of Noah and his wife. The woman is known by the two points
extending up from her forehead, which is the universal designation of the
female sex among the Mexicans.; The horn at the left hand of the tree with a
human hand pointing to it, is the character representing a mountain and the
head of a bird placed above the head of Tezpi or Noah, shows the vulture which
the Mexicans say Tezpi sent out of his acalli or boat to see if the waters had
subsided.
In the figure of the bid with the leaves of a tree in his beak, is shown the
circumstance of the dove's return to the ark, when it had been sent out the
second time bringing a branch of the olive in its mouth; but in their
tradition it had become misplaced, and is made the author of the languages.
That birds have a language was believed by the nations of the old world. Some
of those nations retain a surprising traditional account of the deluge; who
say that Noah embarked in a spacious acalli or boat, with his wife, his
children, several animals, and grain, the preservation of which was of g eat
importance to mankind. When the Great Spirit, Tezcatlipoca, ordered the waters
to withdraw, Tezpi or Noah sent out from his boat a vulture. But the bird's
natural food was that of dead carcases [carcasses], it did not return on
account of the great number of dead carcasses with which the earth now dried
in some places abounded.
Tezpi sent out other birds one of which was humming bird; this bird alone
returned again to the boat, holding in his beak a branch covered with leaves.
Tezpi now knowing that the earth was dry, being clothed with fresh verdure,
quitted his bark near the mountain Colhucan or Ararat. A tradition of the same
fact, the deluge, is also found among the Indians of the Northwest. I
received, says a late traveller [traveler], the following account from a Chief
of one of the tribes in his own words, in the English. "..."
There are many things contained in the above that go to support the testimony
of the Book of Mormon, as well as that of the Mosaic history. The Mexican
records agree so well with the word of the book of Ether (found by the people
of Limhi, which is contained in the Book of Mormon) in relation to the
confounding of languages, that we insert the following:
BOOK OF ETHER-CHAP. I.
* * * Which Jared came forth with his brother and their families, with some
others and their families, from the great tower at the time the Lord
confounded the language of the people, and swear in his wrath that they should
be scattered upon all the face of this earth; and according to the word of the
Lord the people were scattered. And the brother of Jared being a large and
mighty man, and being a man highly favored of the Lord; for Jared his brother
said unto him, cry unto the Lord, that he will not confound us that we may not
understand our words. And it came to pass that the brother of Jared did cry
unto the Lord, and the Lord had compassion upon Jared; therefore he did not
confound the language of Jared; and Jared and his brother were not confounded.
Then Jared said unto his brother, cry again unto the Lord, and it maybe that
he will turn away his anger from them who are our friends, that he confound
not their language. And it came pass that the brother of Jared did cry unto
the Lord and the Lord had compassion upon their friends and their families
also, that they were not confounded. And it came to pass that Jared spoke
again unto his brother, saying, go and inquire of the Lord whether he will
drive us out of the land, and if he will drive us out of the land, cry unto
him whither we shall go.-And who knoweth but the Lord will carry us forth into
a land which is choice above all the earth. And if it so be, let us be
faithful unto the Lord, that we may receive it for our inheritance.
Here, then, we have two records found upon this continent, that go to support
the words of eternal truth-the Bible; and whilst these records, both of them,
sanction the testimony of the scriptures in regard to the flood, the tower of
Babel, ands the confusion of languages; the tradition and hyeroglyphics
[hieroglyphics] of the Zaltees, the Colhuacans, and the Azteca nations, in
regard to the confusion of languages and their travels to this land, is so
like that contained in the Book of Mormon, that the striking analogy must be
seen by every superficial observer.
In regard to the confusion of languages it is said of the above nations, that
there were "..." The Book of Mormon, concerning the same event, says: "..."-and it further states that Jared's brother's language was not
confounded; and they then prayed for their families and friends also, and the
Lord heard them in their behalf; and their language was not confounded. These
accounts, then, precisely agree, one of which was found in Ontario county, N.
Y., and the other in Mexico.
Again, those nations, of families, embodied themselves together and traveled
they know not where, but at length arrived in the country of Aztalan, of the
lake country of America. The Book of Mormon says, that the brother of Jared
cried unto the Lord, that he would give them another land; the Lord heard him,
and told him to go to a certain place, "..." This
it further speaks is the land of America. The coincidence is so striking that
further comment is unnecessary.-ED.


{Rewriter, INVERSES} = require './rewriter'
The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt matches against the beginning of the source code. When a match is found, a token is produced, we consume the match, and start again. Tokens are in the form:
[tag, value, locationData]
where locationData is {first_line, first_column, last_line, last_column}, which is a
format that can be fed directly into Jison. These
are read by jison in the parser.lexer
function defined in coffee-script.coffee.
{Rewriter, INVERSES} = require './rewriter'
Import the helpers we need.
{count, starts, compact, repeat, invertLiterate,
locationDataToString, throwSyntaxError} = require './helpers'
The Lexer class reads a stream of CoffeeScript and divvies it up into tagged tokens. Some potential ambiguity in the grammar has been avoided by pushing some extra smarts into the Lexer.
exports.Lexer = class Lexer
tokenize is the Lexer’s main method. Scan by attempting to match tokens one at a time, using a regular expression anchored at the start of the remaining code, or a custom recursive token-matching method (for interpolations). When the next token has been recorded, we move forward within the code past the token, and begin again.
Each tokenizing method is responsible for returning the number of characters it has consumed.
Before returning the token stream, run it through the Rewriter.
tokenize: (code, opts = {}) ->
@literate = opts.literate # Are we lexing literate CoffeeScript?
@indent = 0 # The current indentation level.
@baseIndent = 0 # The overall minimum indentation level
@indebt = 0 # The over-indentation at the current level.
@outdebt = 0 # The under-outdentation at the current level.
@indents = [] # The stack of all current indentation levels.
@ends = [] # The stack for pairing up tokens.
@tokens = [] # Stream of parsed tokens in the form `['TYPE', value, location data]`.
@seenFor = no # Used to recognize FORIN, FOROF and FORFROM tokens.
@seenImport = no # Used to recognize IMPORT FROM? AS? tokens.
@seenExport = no # Used to recognize EXPORT FROM? AS? tokens.
@importSpecifierList = no # Used to identify when in an IMPORT {...} FROM? ...
@exportSpecifierList = no # Used to identify when in an EXPORT {...} FROM? ...
@chunkLine =
opts.line or 0 # The start line for the current @chunk.
@chunkColumn =
opts.column or 0 # The start column of the current @chunk.
code = @clean code # The stripped, cleaned original source code.
At every position, run through this list of attempted matches,
short-circuiting if any of them succeed. Their order determines precedence:
@literalToken
is the fallback catch-all.
i = 0
while @chunk = code[i..]
consumed = \
@identifierToken() or
@commentToken() or
@whitespaceToken() or
@lineToken() or
@stringToken() or
@numberToken() or
@regexToken() or
@jsToken() or
@literalToken()
Update position
[@chunkLine, @chunkColumn] = @getLineAndColumnFromChunk consumed
i += consumed
return {@tokens, index: i} if opts.untilBalanced and @ends.length is 0
@closeIndentation()
@error "missing #{end.tag}", end.origin[2] if end = @ends.pop()
return @tokens if opts.rewrite is off
(new Rewriter).rewrite @tokens
Preprocess the code to remove leading and trailing whitespace, carriage returns, etc. If we’re lexing literate CoffeeScript, strip external Markdown by removing all lines that aren’t indented by at least four spaces or a tab.
clean: (code) ->
code = code.slice(1) if code.charCodeAt(0) is BOM
code = code.replace(/\r/g, '').replace TRAILING_SPACES, ''
if WHITESPACE.test code
code = "\n#{code}"
@chunkLine--
code = invertLiterate code if @literate
code
Matches identifying literals: variables, keywords, method names, etc.
Check to ensure that JavaScript reserved words aren’t being used as
identifiers. Because CoffeeScript reserves a handful of keywords that are
allowed in JavaScript, we’re careful not to tag them as keywords when
referenced as property names here, so you can still do jQuery.is()
even
though is
means ===
otherwise.
identifierToken: ->
return 0 unless match = IDENTIFIER.exec @chunk
[input, id, colon] = match
Preserve length of id for location data
idLength = id.length
poppedToken = undefined
if id is 'own' and @tag() is 'FOR'
@token 'OWN', id
return id.length
if id is 'from' and @tag() is 'YIELD'
@token 'FROM', id
return id.length
if id is 'as' and @seenImport
if @value() is '*'
<EMAIL_ADDRESS>- 1][0] = 'IMPORT_ALL'
else if @value() in COFFEE_KEYWORDS
<EMAIL_ADDRESS>- 1][0] = 'IDENTIFIER'
if @tag() in ['DEFAULT', 'IMPORT_ALL', 'IDENTIFIER']
@token 'AS', id
return id.length
if id is 'as' and @seenExport and @tag() in ['IDENTIFIER', 'DEFAULT']
@token 'AS', id
return id.length
if id is 'default' and @seenExport and @tag() in ['EXPORT', 'AS']
@token 'DEFAULT', id
return id.length
[..., prev] = @tokens
tag =
if colon or prev? and
(prev[0] in ['.', '?.', '::', '?::'] or
not prev.spaced and prev[0] is '@')
'PROPERTY'
else
'IDENTIFIER'
if tag is 'IDENTIFIER' and (id in JS_KEYWORDS or id in COFFEE_KEYWORDS) and
not (@exportSpecifierList and id in COFFEE_KEYWORDS)
tag = id.toUpperCase()
if tag is 'WHEN' and @tag() in LINE_BREAK
tag = 'LEADING_WHEN'
else if tag is 'FOR'
@seenFor = yes
else if tag is 'UNLESS'
tag = 'IF'
else if tag is 'IMPORT'
@seenImport = yes
else if tag is 'EXPORT'
@seenExport = yes
else if tag in UNARY
tag = 'UNARY'
else if tag in RELATION
if tag isnt 'INSTANCEOF' and @seenFor
tag = 'FOR' + tag
@seenFor = no
else
tag = 'RELATION'
if @value() is '!'
poppedToken = @tokens.pop()
id = '!' + id
else if tag is 'IDENTIFIER' and @seenFor and id is 'from' and
isForFrom(prev)
tag = 'FORFROM'
@seenFor = no
if tag is 'IDENTIFIER' and id in RESERVED
@error "reserved word '#{id}'", length: id.length
unless tag is 'PROPERTY'
if id in COFFEE_ALIASES
alias = id
id = COFFEE_ALIAS_MAP[id]
tag = switch id
when '!' then 'UNARY'
when '==', '!=' then 'COMPARE'
when 'true', 'false' then 'BOOL'
when 'break', 'continue', \
'debugger' then 'STATEMENT'
when '&&', '||' then id
else tag
tagToken = @token tag, id, 0, idLength
tagToken.origin = [tag, alias, tagToken[2]] if alias
if poppedToken
[tagToken[2].first_line, tagToken[2].first_column] =
[poppedToken[2].first_line, poppedToken[2].first_column]
if colon
colonOffset = input.lastIndexOf ':'
@token ':', ':', colonOffset, colon.length
input.length
Matches numbers, including decimals, hex, and exponential notation. Be careful not to interfere with ranges-in-progress.
numberToken: ->
return 0 unless match = NUMBER.exec @chunk
number = match[0]
lexedLength = number.length
switch
when /^0[BOX]/.test number
@error "radix prefix in '#{number}' must be lowercase", offset: 1
when /^(?!0x).*E/.test number
@error "exponential notation in '#{number}' must be indicated with a lowercase 'e'",
offset: number.indexOf('E')
when /^0\d*[89]/.test number
@error "decimal literal '#{number}' must not be prefixed with '0'", length: lexedLength
when /^0\d+/.test number
@error "octal literal '#{number}' must be prefixed with '0o'", length: lexedLength
base = switch number.charAt 1
when 'b' then 2
when 'o' then 8
when 'x' then 16
else null
numberValue = if base? then parseInt(number[2..], base) else parseFloat(number)
if number.charAt(1) in ['b', 'o']
number = "0x#{numberValue.toString 16}"
tag = if numberValue is Infinity then 'INFINITY' else 'NUMBER'
@token tag, number, 0, lexedLength
lexedLength
Matches strings, including multi-line strings, as well as heredocs, with or without interpolation.
stringToken: ->
[quote] = STRING_START.exec(@chunk) || []
return 0 unless quote
If the preceding token is from
and this is an import or export statement,
properly tag the from
.
if @tokens.length and @value() is 'from' and (@seenImport or @seenExport)
<EMAIL_ADDRESS>- 1][0] = 'FROM'
regex = switch quote
when "'" then STRING_SINGLE
when '"' then STRING_DOUBLE
when "'''" then HEREDOC_SINGLE
when '"""' then HEREDOC_DOUBLE
heredoc = quote.length is 3
{tokens, index: end} = @matchWithInterpolations regex, quote
$ = tokens.length - 1
delimiter = quote.charAt(0)
if heredoc
Find the smallest indentation. It will be removed from all lines later.
indent = null
doc = (token[1] for token, i in tokens when token[0] is 'NEOSTRING').join '#{}'
while match = HEREDOC_INDENT.exec doc
attempt = match[1]
indent = attempt if indent is null or 0 < attempt.length < indent.length
indentRegex = /// \n#{indent} ///g if indent
@mergeInterpolationTokens tokens, {delimiter}, (value, i) =>
value = @formatString value, delimiter: quote
value = value.replace indentRegex, '\n' if indentRegex
value = value.replace LEADING_BLANK_LINE, '' if i is 0
value = value.replace TRAILING_BLANK_LINE, '' if i is $
value
else
@mergeInterpolationTokens tokens, {delimiter}, (value, i) =>
value = @formatString value, delimiter: quote
value = value.replace SIMPLE_STRING_OMIT, (match, offset) ->
if (i is 0 and offset is 0) or
(i is $ and offset + match.length is value.length)
''
else
' '
value
end
Matches and consumes comments.
commentToken: ->
return 0 unless match = @chunk.match COMMENT
[comment, here] = match
if here
if match = HERECOMMENT_ILLEGAL.exec comment
@error "block comments cannot contain #{match[0]}",
offset: match.index, length: match[0].length
if here.indexOf('\n') >= 0
here = here.replace /// \n #{repeat ' ', @indent} ///g, '\n'
@token 'HERECOMMENT', here, 0, comment.length
comment.length
Matches JavaScript interpolated directly into the source via backticks.
jsToken: ->
return 0 unless @chunk.charAt(0) is '`' and
(match = HERE_JSTOKEN.exec(@chunk) or JSTOKEN.exec(@chunk))
Convert escaped backticks to backticks, and escaped backslashes just before escaped backticks to backslashes
script = match[1].replace /\\+(`|$)/g, (string) ->
string
is always a value like ‘`‘, ‘\`‘, ‘\\`‘, etc.
By reducing it to its latter half, we turn ‘`‘ to ‘', '\\\
‘ to ‘`‘, etc.
string[-Math.ceil(string.length / 2)..]
@token 'JS', script, 0, match[0].length
match[0].length
Matches regular expression literals, as well as multiline extended ones. Lexing regular expressions is difficult to distinguish from division, so we borrow some basic heuristics from JavaScript and Ruby.
regexToken: ->
switch
when match = REGEX_ILLEGAL.exec @chunk
@error "regular expressions cannot begin with #{match[2]}",
offset: match.index + match[1].length
when match = @matchWithInterpolations HEREGEX, '///'
{tokens, index} = match
when match = REGEX.exec @chunk
[regex, body, closed] = match
@validateEscapes body, isRegex: yes, offsetInChunk: 1
body = @formatRegex body, delimiter: '/'
index = regex.length
[..., prev] = @tokens
if prev
if prev.spaced and prev[0] in CALLABLE
return 0 if not closed or POSSIBLY_DIVISION.test regex
else if prev[0] in NOT_REGEX
return 0
@error 'missing / (unclosed regex)' unless closed
else
return 0
[flags] = REGEX_FLAGS.exec @chunk[index..]
end = index + flags.length
origin = @makeToken 'REGEX', null, 0, end
switch
when not VALID_FLAGS.test flags
@error "invalid regular expression flags #{flags}", offset: index, length: flags.length
when regex or tokens.length is 1
body ?= @formatHeregex tokens[0][1]
@token 'REGEX', "#{@makeDelimitedLiteral body, delimiter: '/'}#{flags}", 0, end, origin
else
@token 'REGEX_START', '(', 0, 0, origin
@token 'IDENTIFIER', 'RegExp', 0, 0
@token 'CALL_START', '(', 0, 0
@mergeInterpolationTokens tokens, {delimiter: '"', double: yes}, @formatHeregex
if flags
@token ',', ',', index - 1, 0
@token 'STRING', '"' + flags + '"', index - 1, flags.length
@token ')', ')', end - 1, 0
@token 'REGEX_END', ')', end - 1, 0
end
Matches newlines, indents, and outdents, and determines which is which. If we can detect that the current line is continued onto the next line, then the newline is suppressed:
elements
.each( ... )
.map( ... )
Keeps track of the level of indentation, because a single outdent token can close multiple indents, so we need to know how far in we happen to be.
lineToken: ->
return 0 unless match = MULTI_DENT.exec @chunk
indent = match[0]
@seenFor = no
@seenImport = no unless @importSpecifierList
@seenExport = no unless @exportSpecifierList
size = indent.length - 1 - indent.lastIndexOf '\n'
noNewlines = @unfinished()
if size - @indebt is @indent
if noNewlines then @suppressNewlines() else @newlineToken 0
return indent.length
if size > @indent
if noNewlines
@indebt = size - @indent
@suppressNewlines()
return indent.length
unless @tokens.length
@baseIndent = @indent = size
return indent.length
diff = size - @indent + @outdebt
@token 'INDENT', diff, indent.length - size, size
@indents.push diff
@ends.push {tag: 'OUTDENT'}
@outdebt = @indebt = 0
@indent = size
else if size < @baseIndent
@error 'missing indentation', offset: indent.length
else
@indebt = 0
@outdentToken @indent - size, noNewlines, indent.length
indent.length
Record an outdent token or multiple tokens, if we happen to be moving back inwards past several recorded indents. Sets new @indent value.
outdentToken: (moveOut, noNewlines, outdentLength) ->
decreasedIndent = @indent - moveOut
while moveOut > 0
lastIndent =<EMAIL_ADDRESS>- 1]
if not lastIndent
moveOut = 0
else if lastIndent is @outdebt
moveOut -= @outdebt
@outdebt = 0
else if lastIndent < @outdebt
@outdebt -= lastIndent
moveOut -= lastIndent
else
dent = @indents.pop() + @outdebt
if outdentLength and @chunk[outdentLength] in INDENTABLE_CLOSERS
decreasedIndent -= dent - moveOut
moveOut = dent
@outdebt = 0
pair might call outdentToken, so preserve decreasedIndent
@pair 'OUTDENT'
@token 'OUTDENT', moveOut, 0, outdentLength
moveOut -= dent
@outdebt -= moveOut if dent
@tokens.pop() while @value() is ';'
@token 'TERMINATOR', '\n', outdentLength, 0 unless @tag() is 'TERMINATOR' or noNewlines
@indent = decreasedIndent
this
Matches and consumes non-meaningful whitespace. Tag the previous token as being “spaced”, because there are some cases where it makes a difference.
whitespaceToken: ->
return 0 unless (match = WHITESPACE.exec @chunk) or
(nline = @chunk.charAt(0) is '\n')
[..., prev] = @tokens
prev[if match then 'spaced' else 'newLine'] = true if prev
if match then match[0].length else 0
Generate a newline token. Consecutive newlines get merged together.
newlineToken: (offset) ->
@tokens.pop() while @value() is ';'
@token 'TERMINATOR', '\n', offset, 0 unless @tag() is 'TERMINATOR'
this
Use a \
at a line-ending to suppress the newline.
The slash is removed here once its job is done.
suppressNewlines: ->
@tokens.pop() if @value() is '\\'
this
We treat all other single characters as a token. E.g.: ( ) , . !
Multi-character operators are also literal tokens, so that Jison can assign
the proper order of operations. There are some symbols that we tag specially
here. ;
and newlines are both treated as a TERMINATOR
, we distinguish
parentheses that indicate a method call from regular parentheses, and so on.
literalToken: ->
if match = OPERATOR.exec @chunk
[value] = match
@tagParameters() if CODE.test value
else
value = @chunk.charAt 0
tag = value
[..., prev] = @tokens
if prev and value in ['=', COMPOUND_ASSIGN...]
skipToken = false
if value is '=' and prev[1] in ['||', '&&'] and not prev.spaced
prev[0] = 'COMPOUND_ASSIGN'
prev[1] += '='
prev =<EMAIL_ADDRESS>- 2]
skipToken = true
if prev and prev[0] isnt 'PROPERTY'
origin = prev.origin ? prev
message = isUnassignable prev[1], origin[1]
@error message, origin[2] if message
return value.length if skipToken
if value is '{' and @seenImport
@importSpecifierList = yes
else if @importSpecifierList and value is '}'
@importSpecifierList = no
else if value is '{' and prev?[0] is 'EXPORT'
@exportSpecifierList = yes
else if @exportSpecifierList and value is '}'
@exportSpecifierList = no
if value is ';'
@seenFor = @seenImport = @seenExport = no
tag = 'TERMINATOR'
else if value is '*' and prev[0] is 'EXPORT'
tag = 'EXPORT_ALL'
else if value in MATH then tag = 'MATH'
else if value in COMPARE then tag = 'COMPARE'
else if value in COMPOUND_ASSIGN then tag = 'COMPOUND_ASSIGN'
else if value in UNARY then tag = 'UNARY'
else if value in UNARY_MATH then tag = 'UNARY_MATH'
else if value in SHIFT then tag = 'SHIFT'
else if value is '?' and prev?.spaced then tag = 'BIN?'
else if prev and not prev.spaced
if value is '(' and prev[0] in CALLABLE
prev[0] = 'FUNC_EXIST' if prev[0] is '?'
tag = 'CALL_START'
else if value is '[' and prev[0] in INDEXABLE
tag = 'INDEX_START'
switch prev[0]
when '?' then prev[0] = 'INDEX_SOAK'
token = @makeToken tag, value
switch value
when '(', '{', '[' then @ends.push {tag: INVERSES[value], origin: token}
when ')', '}', ']' then @pair value
@tokens.push token
value.length
A source of ambiguity in our grammar used to be parameter lists in function definitions versus argument lists in function calls. Walk backwards, tagging parameters specially in order to make things easier for the parser.
tagParameters: ->
return this if @tag() isnt ')'
stack = []
{tokens} = this
i = tokens.length
tokens[--i][0] = 'PARAM_END'
while tok = tokens[--i]
switch tok[0]
when ')'
stack.push tok
when '(', 'CALL_START'
if stack.length then stack.pop()
else if tok[0] is '('
tok[0] = 'PARAM_START'
return this
else return this
this
Close up all remaining open blocks at the end of the file.
closeIndentation: ->
@outdentToken @indent
Match the contents of a delimited token and expand variables and expressions inside it using Ruby-like notation for substitution of arbitrary expressions.
"Hello #{name.capitalize()}."
If it encounters an interpolation, this method will recursively create a new
Lexer and tokenize until the {
of #{
is balanced with a }
.
regex
matches the contents of a token (but not delimiter
, and not
#{
if interpolations are desired).delimiter
is the delimiter of the token. Examples are '
, "
, '''
,
"""
and ///
.This method allows us to have strings within interpolations within strings, ad infinitum.
matchWithInterpolations: (regex, delimiter) ->
tokens = []
offsetInChunk = delimiter.length
return null unless @chunk[...offsetInChunk] is delimiter
str = @chunk[offsetInChunk..]
loop
[strPart] = regex.exec str
@validateEscapes strPart, {isRegex: delimiter.charAt(0) is '/', offsetInChunk}
Push a fake ‘NEOSTRING’ token, which will get turned into a real string later.
tokens.push @makeToken 'NEOSTRING', strPart, offsetInChunk
str = str[strPart.length..]
offsetInChunk += strPart.length
break unless str[...2] is '#{'
The 1
s are to remove the #
in #{
.
[line, column] = @getLineAndColumnFromChunk offsetInChunk + 1
{tokens: nested, index} =
new Lexer().tokenize str[1..], line: line, column: column, untilBalanced: on
Skip the trailing }
.
index += 1
Turn the leading and trailing {
and }
into parentheses. Unnecessary
parentheses will be removed later.
[open, ..., close] = nested
open[0] = open[1] = '('
close[0] = close[1] = ')'
close.origin = ['', 'end of interpolation', close[2]]
Remove leading ‘TERMINATOR’ (if any).
nested.splice 1, 1 if nested[1]?[0] is 'TERMINATOR'
Push a fake ‘TOKENS’ token, which will get turned into real tokens later.
tokens.push ['TOKENS', nested]
str = str[index..]
offsetInChunk += index
unless str[...delimiter.length] is delimiter
@error "missing #{delimiter}", length: delimiter.length
[firstToken, ..., lastToken] = tokens
firstToken[2].first_column -= delimiter.length
if lastToken[1].substr(-1) is '\n'
lastToken[2].last_line += 1
lastToken[2].last_column = delimiter.length - 1
else
lastToken[2].last_column += delimiter.length
lastToken[2].last_column -= 1 if lastToken[1].length is 0
{tokens, index: offsetInChunk + delimiter.length}
Merge the array tokens
of the fake token types ‘TOKENS’ and ‘NEOSTRING’
(as returned by matchWithInterpolations
) into the token stream. The value
of ‘NEOSTRING’s are converted using fn
and turned into strings using
options
first.
mergeInterpolationTokens: (tokens, options, fn) ->
if tokens.length > 1
lparen = @token 'STRING_START', '(', 0, 0
firstIndex = @tokens.length
for token, i in tokens
[tag, value] = token
switch tag
when 'TOKENS'
Optimize out empty interpolations (an empty pair of parentheses).
continue if value.length is 2
Push all the tokens in the fake ‘TOKENS’ token. These already have sane location data.
locationToken = value[0]
tokensToPush = value
when 'NEOSTRING'
Convert ‘NEOSTRING’ into ‘STRING’.
converted = fn.call this, token[1], i
Optimize out empty strings. We ensure that the tokens stream always starts with a string token, though, to make sure that the result really is a string.
if converted.length is 0
if i is 0
firstEmptyStringIndex = @tokens.length
else
continue
However, there is one case where we can optimize away a starting empty string.
if i is 2 and firstEmptyStringIndex?
@tokens.splice firstEmptyStringIndex, 2 # Remove empty string and the plus.
token[0] = 'STRING'
token[1] = @makeDelimitedLiteral converted, options
locationToken = token
tokensToPush = [token]
if @tokens.length > firstIndex
Create a 0-length “+” token.
plusToken = @token '+', '+'
plusToken[2] =
first_line: locationToken[2].first_line
first_column: locationToken[2].first_column
last_line: locationToken[2].first_line
last_column: locationToken[2].first_column
@tokens.push tokensToPush...
if lparen
[..., lastToken] = tokens
lparen.origin = ['STRING', null,
first_line: lparen[2].first_line
first_column: lparen[2].first_column
last_line: lastToken[2].last_line
last_column: lastToken[2].last_column
]
rparen = @token 'STRING_END', ')'
rparen[2] =
first_line: lastToken[2].last_line
first_column: lastToken[2].last_column
last_line: lastToken[2].last_line
last_column: lastToken[2].last_column
Pairs up a closing token, ensuring that all listed pairs of tokens are correctly balanced throughout the course of the token stream.
pair: (tag) ->
[..., prev] = @ends
unless tag is wanted = prev?.tag
@error "unmatched #{tag}" unless 'OUTDENT' is wanted
[..., lastIndent] = @indents
@outdentToken lastIndent, true
return @pair tag
@ends.pop()
Returns the line and column number from an offset into the current chunk.
offset
is a number of characters into @chunk.
getLineAndColumnFromChunk: (offset) ->
if offset is 0
return [@chunkLine, @chunkColumn]
if offset >= @chunk.length
string = @chunk
else
string = @chunk[..offset-1]
lineCount = count string, '\n'
column = @chunkColumn
if lineCount > 0
[..., lastLine] = string.split '\n'
column = lastLine.length
else
column += string.length
[@chunkLine + lineCount, column]
Same as “token”, exception this just returns the token without adding it to the results.
makeToken: (tag, value, offsetInChunk = 0, length = value.length) ->
locationData = {}
[locationData.first_line, locationData.first_column] =
@getLineAndColumnFromChunk offsetInChunk
Use length - 1 for the final offset - we’re supplying the last_line and the last_column, so if last_column == first_column, then we’re looking at a character of length 1.
lastCharacter = if length > 0 then (length - 1) else 0
[locationData.last_line, locationData.last_column] =
@getLineAndColumnFromChunk offsetInChunk + lastCharacter
token = [tag, value, locationData]
token
Add a token to the results.
offset
is the offset into the current @chunk where the token starts.
length
is the length of the token in the @chunk, after the offset. If
not specified, the length of value
will be used.
Returns the new token.
token: (tag, value, offsetInChunk, length, origin) ->
token = @makeToken tag, value, offsetInChunk, length
token.origin = origin if origin
@tokens.push token
token
Peek at the last tag in the token stream.
tag: ->
[..., token] = @tokens
token?[0]
Peek at the last value in the token stream.
value: ->
[..., token] = @tokens
token?[1]
Are we in the midst of an unfinished expression?
unfinished: ->
LINE_CONTINUER.test(@chunk) or
@tag() in UNFINISHED
formatString: (str, options) ->
@replaceUnicodeCodePointEscapes str.replace(STRING_OMIT, '$1'), options
formatHeregex: (str) ->
@formatRegex str.replace(HEREGEX_OMIT, '$1$2'), delimiter: '///'
formatRegex: (str, options) ->
@replaceUnicodeCodePointEscapes str, options
unicodeCodePointToUnicodeEscapes: (codePoint) ->
toUnicodeEscape = (val) ->
str = val.toString 16
"\\u#{repeat '0', 4 - str.length}#{str}"
return toUnicodeEscape(codePoint) if codePoint < 0x10000
surrogate pair
high = Math.floor((codePoint - 0x10000) / 0x400) + 0xD800
low = (codePoint - 0x10000) % 0x400 + 0xDC00
"#{toUnicodeEscape(high)}#{toUnicodeEscape(low)}"
Replace \u{…} with \uxxxx[\uxxxx] in strings and regexes
replaceUnicodeCodePointEscapes: (str, options) ->
str.replace UNICODE_CODE_POINT_ESCAPE, (match, escapedBackslash, codePointHex, offset) =>
return escapedBackslash if escapedBackslash
codePointDecimal = parseInt codePointHex, 16
if codePointDecimal > 0x10ffff
@error "unicode code point escapes greater than \\u{10ffff} are not allowed",
offset: offset + options.delimiter.length
length: codePointHex.length + 4
@unicodeCodePointToUnicodeEscapes codePointDecimal
Validates escapes in strings and regexes.
validateEscapes: (str, options = {}) ->
invalidEscapeRegex =
if options.isRegex
REGEX_INVALID_ESCAPE
else
STRING_INVALID_ESCAPE
match = invalidEscapeRegex.exec str
return unless match
[[], before, octal, hex, unicodeCodePoint, unicode] = match
message =
if octal
"octal escape sequences are not allowed"
else
"invalid escape sequence"
invalidEscape = "\\#{octal or hex or unicodeCodePoint or unicode}"
@error "#{message} #{invalidEscape}",
offset: (options.offsetInChunk ? 0) + match.index + before.length
length: invalidEscape.length
Constructs a string or regex by escaping certain characters.
makeDelimitedLiteral: (body, options = {}) ->
body = '(?:)' if body is '' and options.delimiter is '/'
regex = ///
(\\\\) # escaped backslash
| (\\0(?=[1-7])) # nul character mistaken as octal escape
| \\?(#{options.delimiter}) # (possibly escaped) delimiter
| \\?(?: (\n)|(\r)|(\u2028)|(\u2029) ) # (possibly escaped) newlines
| (\\.) # other escapes
///g
body = body.replace regex, (match, backslash, nul, delimiter, lf, cr, ls, ps, other) -> switch
Ignore escaped backslashes.
when backslash then (if options.double then backslash + backslash else backslash)
when nul then '\\x00'
when delimiter then "\\#{delimiter}"
when lf then '\\n'
when cr then '\\r'
when ls then '\\u2028'
when ps then '\\u2029'
when other then (if options.double then "\\#{other}" else other)
"#{options.delimiter}#{body}#{options.delimiter}"
Throws an error at either a given offset from the current chunk or at the
location of a token (token[2]
).
error: (message, options = {}) ->
location =
if 'first_line' of options
options
else
[first_line, first_column] = @getLineAndColumnFromChunk options.offset ? 0
{first_line, first_column, last_column: first_column + (options.length ? 1) - 1}
throwSyntaxError message, location
isUnassignable = (name, displayName = name) -> switch
when name in [JS_KEYWORDS..., COFFEE_KEYWORDS...]
"keyword '#{displayName}' can't be assigned"
when name in STRICT_PROSCRIBED
"'#{displayName}' can't be assigned"
when name in RESERVED
"reserved word '#{displayName}' can't be assigned"
else
false
exports.isUnassignable = isUnassignable
from
isn’t a CoffeeScript keyword, but it behaves like one in import
and
export
statements (handled above) and in the declaration line of a for
loop. Try to detect when from
is a variable identifier and when it is this
“sometimes” keyword.
isForFrom = (prev) ->
if prev[0] is 'IDENTIFIER'
for i from from
, for from from iterable
if prev[1] is 'from'
prev[1][0] = 'IDENTIFIER'
yes
for i from iterable
yes
for from…
else if prev[0] is 'FOR'
no
for {from}…
, for [from]…
, for {a, from}…
, for {a: from}…
else if prev[1] in ['{', '[', ',', ':']
no
else
yes
Keywords that CoffeeScript shares in common with JavaScript.
JS_KEYWORDS = [
'true', 'false', 'null', 'this'
'new', 'delete', 'typeof', 'in', 'instanceof'
'return', 'throw', 'break', 'continue', 'debugger', 'yield'
'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally'
'class', 'extends', 'super'
'import', 'export', 'default'
]
CoffeeScript-only keywords.
COFFEE_KEYWORDS = [
'undefined', 'Infinity', 'NaN'
'then', 'unless', 'until', 'loop', 'of', 'by', 'when'
]
COFFEE_ALIAS_MAP =
and : '&&'
or : '||'
is : '=='
isnt : '!='
not : '!'
yes : 'true'
no : 'false'
on : 'true'
off : 'false'
COFFEE_ALIASES = (key for key of COFFEE_ALIAS_MAP)
COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES
The list of keywords that are reserved by JavaScript, but not used, or are used by CoffeeScript internally. We throw an error when these are encountered, to avoid having a JavaScript error at runtime.
RESERVED = [
'case', 'function', 'var', 'void', 'with', 'const', 'let', 'enum'
'native', 'implements', 'interface', 'package', 'private'
'protected', 'public', 'static'
]
STRICT_PROSCRIBED = ['arguments', 'eval']
The superset of both JavaScript keywords and reserved words, none of which may be used as identifiers or properties.
exports.JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED)
The character code of the nasty Microsoft madness otherwise known as the BOM.
BOM = 65279
Token matching regexes.
IDENTIFIER = /// ^
(?!\d)
( (?: (?!\s)[$\w\x7f-\uffff] )+ )
( [^\n\S]* : (?!:) )? # Is this a property name?
///
NUMBER = ///
^ 0b[01]+ | # binary
^ 0o[0-7]+ | # octal
^ 0x[\da-f]+ | # hex
^ \d*\.?\d+ (?:e[+-]?\d+)? # decimal
///i
OPERATOR = /// ^ (
?: [-=]> # function
| [-+*/%<>&|^!?=]= # compound assign / compare
| >>>=? # zero-fill right shift
| ([-+:])\1 # doubles
| ([&|<>*/%])\2=? # logic / shift / power / floor division / modulo
| \?(\.|::) # soak access
| \.{2,3} # range or splat
) ///
WHITESPACE = /^[^\n\S]+/
COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|###$)|^(?:\s*#(?!##[^#]).*)+/
CODE = /^[-=]>/
MULTI_DENT = /^(?:\n[^\n\S]*)+/
JSTOKEN = ///^ `(?!``) ((?: [^`\\] | \\[\s\S] )*) ` ///
HERE_JSTOKEN = ///^ ``` ((?: [^`\\] | \\[\s\S] | `(?!``) )*) ``` ///
String-matching-regexes.
STRING_START = /^(?:'''|"""|'|")/
STRING_SINGLE = /// ^(?: [^\\'] | \\[\s\S] )* ///
STRING_DOUBLE = /// ^(?: [^\\"#] | \\[\s\S] | \#(?!\{) )* ///
HEREDOC_SINGLE = /// ^(?: [^\\'] | \\[\s\S] | '(?!'') )* ///
HEREDOC_DOUBLE = /// ^(?: [^\\"#] | \\[\s\S] | "(?!"") | \#(?!\{) )* ///
STRING_OMIT = ///
((?:\\\\)+) # consume (and preserve) an even number of backslashes
| \\[^\S\n]*\n\s* # remove escaped newlines
///g
SIMPLE_STRING_OMIT = /\s*\n\s*/g
HEREDOC_INDENT = /\n+([^\n\S]*)(?=\S)/g
Regex-matching-regexes.
REGEX = /// ^
/ (?!/) ((
?: [^ [ / \n \\ ] # every other thing
| \\[^\n] # anything but newlines escaped
| \[ # character class
(?: \\[^\n] | [^ \] \n \\ ] )*
\]
)*) (/)?
///
REGEX_FLAGS = /^\w*/
VALID_FLAGS = /^(?!.*(.).*\1)[imguy]*$/
HEREGEX = /// ^(?: [^\\/#] | \\[\s\S] | /(?!//) | \#(?!\{) )* ///
HEREGEX_OMIT = ///
((?:\\\\)+) # consume (and preserve) an even number of backslashes
| \\(\s) # preserve escaped whitespace
| \s+(?:#.*)? # remove whitespace and comments
///g
REGEX_ILLEGAL = /// ^ ( / | /{3}\s*) (\*) ///
POSSIBLY_DIVISION = /// ^ /=?\s ///
Other regexes.
HERECOMMENT_ILLEGAL = /\*\//
LINE_CONTINUER = /// ^ \s* (?: , | \??\.(?![.\d]) | :: ) ///
STRING_INVALID_ESCAPE = ///
( (?:^|[^\\]) (?:\\\\)* ) # make sure the escape isn’t escaped
\\ (
?: (0[0-7]|[1-7]) # octal escape
| (x(?![\da-fA-F]{2}).{0,2}) # hex escape
| (u\{(?![\da-fA-F]{1,}\})[^}]*\}?) # unicode code point escape
| (u(?!\{|[\da-fA-F]{4}).{0,4}) # unicode escape
)
///
REGEX_INVALID_ESCAPE = ///
( (?:^|[^\\]) (?:\\\\)* ) # make sure the escape isn’t escaped
\\ (
?: (0[0-7]) # octal escape
| (x(?![\da-fA-F]{2}).{0,2}) # hex escape
| (u\{(?![\da-fA-F]{1,}\})[^}]*\}?) # unicode code point escape
| (u(?!\{|[\da-fA-F]{4}).{0,4}) # unicode escape
)
///
UNICODE_CODE_POINT_ESCAPE = ///
( \\\\ ) # make sure the escape isn’t escaped
|
\\u\{ ( [\da-fA-F]+ ) \}
///g
LEADING_BLANK_LINE = /^[^\n\S]*\n/
TRAILING_BLANK_LINE = /\n[^\n\S]*$/
TRAILING_SPACES = /\s+$/
Compound assignment tokens.
COMPOUND_ASSIGN = [
'-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>='
'&=', '^=', '|=', '**=', '//=', '%%='
]
Unary tokens.
UNARY = ['NEW', 'TYPEOF', 'DELETE', 'DO']
UNARY_MATH = ['!', '~']
Bit-shifting tokens.
SHIFT = ['<<', '>>', '>>>']
Comparison tokens.
COMPARE = ['==', '!=', '<', '>', '<=', '>=']
Mathematical tokens.
MATH = ['*', '/', '%', '//', '%%']
Relational tokens that are negatable with not
prefix.
RELATION = ['IN', 'OF', 'INSTANCEOF']
Boolean tokens.
BOOL = ['TRUE', 'FALSE']
Tokens which could legitimately be invoked or indexed. An opening parentheses or bracket following these tokens will be recorded as the start of a function invocation or indexing operation.
CALLABLE = ['IDENTIFIER', 'PROPERTY', ')', ']', '?', '@', 'THIS', 'SUPER']
INDEXABLE = CALLABLE.concat [
'NUMBER', 'INFINITY', 'NAN', 'STRING', 'STRING_END', 'REGEX', 'REGEX_END'
'BOOL', 'NULL', 'UNDEFINED', '}', '::'
]
Tokens which a regular expression will never immediately follow (except spaced CALLABLEs in some cases), but which a division operator can.
See: http://www-archive.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions
NOT_REGEX = INDEXABLE.concat ['++', '--']
Tokens that, when immediately preceding a WHEN
, indicate that the WHEN
occurs at the start of a line. We disambiguate these from trailing whens to
avoid an ambiguity in the grammar.
LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR']
Additional indent in front of these is ignored.
INDENTABLE_CLOSERS = [')', '}', ']']
Tokens that, when appearing at the end of a line, suppress a following TERMINATOR/INDENT token
UNFINISHED = ['\\', '.', '?.', '?::', 'UNARY', 'MATH', 'UNARY_MATH', '+', '-',
'**', 'SHIFT', 'RELATION', 'COMPARE', '&', '^', '|', '&&', '||',
'BIN?', 'THROW', 'EXTENDS', 'DEFAULT']


×
Close
Add Pairing
Ingredient
Category
{{cat.name}}
pairs with
{{cat.name}}
and the combination is
Tried and tested
Excellent
Good
Find foods that pair well with
e.g. Chicken, Coriander, Mustard, Onion
Or
Add a Pairing
About
Help
Flavor Trios
{{trio}}
Fresh additions
{{addition.ingredient1}} and {{addition.ingredient2}}


|
|
Recent changes:
2020-08-14 - Updated to 1.0 |
| Use recipe set: | |
| Color scheme: | |
| Display rates as: | |
| Rate precision: | |
| Factory precision: | |
| Minimum assembling machine level: | |
| Preferred furnace: | |
| Preferred fuel: | |
| Primary oil processing recipe: | |
| Preferred belt: | |
| Minimum pipe length: | |
| Mining productivity bonus: | +% |
| Default module: | |
| Default beacon: | × |
| Recipe sort order: |
|
| Format values as: |
|
This calculator is the result of a few years' worth of fooling around, off and on, with performing calculations using Factorio's recipe graph. You may find an essay on the subject, which outlines the techniques used in this calculator, here.
Features of this calculator include:
Clicking on the icon a second time will restore its dependencies.
This feature is not compatible with certain items, namely those that have no dependencies, and those that don't map one-to-one with a recipe.
Say the solution calls for 7500 units of heavy oil per second. With the default "minimum pipe length" setting, the calculator will display a value of "[pipe] × 7 ≤ 47." This means you will need seven parallel lanes of pipes, each with a maximum length of 47 segments.
The "minimum pipe length" setting controls the minimum number of segments that a pipe will be permitted before the calculator uses multiple lanes of pipes. It defaults to 17, which corresponds to a fluid rate of 1200/s, which is the output rate of an offshore pump.
The number of pipes will be omitted if only one pipe is required.


As you probably know by now, the YLD token has a dynamic supply. Tokens are minted upon timely repayment of a loan and 100% of fees collected are used to buy back tokens from the open market and burn them.
An economist is an expert who will tell you tomorrow why the things he predicted yesterday didn’t happen today.
– Laurence J. Peter
There are many variables within the Yield loan marketplace, such as interest rates, whether rewards are claimed early or not at all, and the price of YLD, to name a few. This calculator is aimed at helping people understand how each factor can affect the supply of YLD. It should be noted that this tool is purely for educational purposes as there is no way to truly know how each and every market participant will act. However, hopefully it succeeds in removing some of the guessing games around how each factor could affect the outcome.
The calculator inputs represent a 30-day period of loans on the Yield protocol and are subsequently extrapolated into a 12-month period on the chart below. The default settings are not based on any real figures since the app has yet to launch on mainnet, but they are meant to represent what we have deemed one possible, real-world scenario. Most of the variables should be pretty self-explanatory. Those with a question mark next to their label will reveal a short explanation where necessary.
Part of the responsibility is on you to use common sense and discern whether or not your inputs represent a realistic scenario. Some combinations will produce highly unlikely or flat-out impossible results. For example, if you have the price of YLD at $25, but the gross loan value for that period comes out to $500M then you may want to readjust because that would result in a total supply of zero within a few months time. Common sense would dictate that such a high gross loan value would justify a much higher YLD price.


Chapter 2 Experiment components
2.1 The problem statement
Experimentation as a problem-solving process carried out under controlled conditions in order to discover an unknown effect or law, to test or establish a hypothesis, or to illustrate a known law
Experimentation is described as many things: a method, an approach, a test, or a tool to generate evidence. All of this is true, but experimentation is first and foremost a problem-solving process.
The starting point for your experiment should not be the methodology, nor a predetermined answer; it should be the problem you are trying to resolve.
To help us chose the problem statement, we can go through the following steps:
Step 1: Choose a topic 1. What do I find interesting about the subject? 2. What is known about the subject? 3. What is missing and what are the gaps?
In theory, the topic could be in any field (for instance, agriculture, but also fiscal policy) and at any level (for instance, it could affect 20 people, or it could reach most of Canada’s population). It could touch upon the realm of policy, program, service delivery, regulatory and internal services.
The problem doesn’t always need to be causal in nature, in which case perhaps an observational study is better.
Step 2: Narrow the topic 1. What do you need to know more about on the topic? 2. Are you interested in social, political, economic, gender, religious issues related to your topic? - Find a “slant” on your topic and determine the root causes (physical, social, or organizational causes) - Develop possible solutions and select a solution 3. Will the results reveal something new or unexpected? 4. What is in scope and what is out of scope? 5. Can you clearly define hypotheses (If…then…) and explicitly state research questions?
The problem statement you develop should be clear and precise, but also scoped into a relevant policy area that is within your reach (in terms of jurisdiction, for instance). A problem that has too little impact to be deemed important is likely not a great fit, nor is a problem with little decision-making implications very useful to be explored. Similarly, problem statements that are too vague need to be modified so that they’re scoped appropriately.
Step 3: Find Resources 1. How do we design a research proposal that builds on existing knowledge to address critical questions? 2. The key here is getting to know what is already done on the topic and how can our design improve or build on current knowledge. 3. Perform a systematic literature search by using the keywords you have compiled and use them to search for books in Library Catalogs, blogs, or articles in online databases 4. Consult with experts and seek feedback
In a government context, the right scale and scope of the experiment will be dictated by what decision-makers need to know coupled with the various practical constraints that inevitably come along through the design process.
In general, this step will help us make the proposal more mutually exclusive and collectively exhaustive, MECE. By the end of this process, more so that before, we will be able to make statements that do not overlap in content and fully describe the problem at the highest level.
Step 4: Seek collaboration 1. Make sure the question is one that other people can get behind and support 2. Establish collaboration agreements and executive buy-in 3. Peer-review for clarity, scientific accuracy, and feasibility 4. Does the team have the expertise required to complete the project? If not, who else needs to be on team
Figuring out the problem will take time, and needs to be done in consultation with as many parties directly or indirectly potentially impacted by the experiment’s results. Before starting the problem definition stage, you should take time to discuss alongside colleagues, management and others (experts and practitioners, current users) what exactly you wish you fix.
Each of the steps above should be completed before moving on to the next one. However, steps can be repeated. For example, if you’re on the third step, you can still return to the previous step, and redefine the problem.
2.2 Determine interventions
It’s important to be clear what the different experimental designs can and can’t tell us. What sets observational studies apart from experimental studies is that there is a component of intervention in experimentation.
Only certain experimental designs are helpful for learning about impact and effectiveness of an intervention. Therefore, we need to select a design that best tells us whether or not our new idea is really making a difference. This approximates a controlled experiment of basic science. When setting up an experimental design, we need to think about what the intervention (treatment) might look like in our program/ operation. It is helpful to think of interventions as steps that help us evaluate the direct impacts of treatment or preventive measures on a situation.
When thinking about interventions, it is helpful to consider the two following points:
Deciding what to measure: using a government contractor example, consider what kind of data you’d need to answer your key question. In this case, you’d need to know the number and cost of current staff and the percentage of time they spend on necessary business functions. In answering this question, you likely need to answer many sub-questions (e.g., Are staff currently under-utilized? If so, what process improvements would help?). Finally, in your decision on what to measure, be sure to include any reasonable objections any stakeholders might have (e.g., If staff are reduced, how would the company respond to surges in demand?).
Deciding how to measure it: thinking about how you measure your data is just as important, especially before the data collection phase, because your measuring process either backs up or discredits your analysis later on. Key questions to ask for this step include: - What is your time frame? (e.g., annual versus quarterly costs) - What is your unit of measure? (e.g., USD versus Euro) - What factors should be included? (e.g., just annual salary versus annual salary plus cost of staff benefits)
2.3 Determine outcomes
When designing the intervention, it is also important to determine what you want to measure and what the hypothesized effects might be. This will illuminate what data we need to collect, set targets, and develop counter-measures. As part of this, we would want to identify the techniques we will need to perform the measurements and use the collected data for analysis.
An outcome measure, endpoint, effect measure or measure of effect is a measure which is used to assess the effect, both positive and negative, of an intervention or treatment. Measures can often be quantified using effect sizes. They can also be thought of as providing a score, an interpretation of results or at times a risk categorization of study groups. Prior to providing any intervention, an outcome measure provides baseline data on variable.
Also of note is that experimental studies are usually randomized, meaning the subjects are grouped by chance and we study what happens to people in each group (treatment and control). Any difference in outcomes can then be linked to the intervention.
For instance, a well designed randomized control trial (RCT) provides a strong evidence that a given intervention can postulate effectiveness or safety. A RCT is best used when we need to draw conclusions on causality but there are many other experimental designs we can draw on and this will be discussed in Module 3.
It helps to think of outcome measures through visualization of outcomes / prototypes
As well as increasing our understanding of what experimental design to use when, there is scope for experimenters to get much better at using different tools in combination to innovate more effectively. Prototypers, for instance, could use low-cost randomized trials like A/B tests or nimble trials to evaluate prototyped products or services.
Prototyping emphasizes front-loading risk and creating a solution with a better chance of success through stakeholder engagement. Using plastic Lego bricks to build prototypes of engineering products is a low-fi, low-resource way of making early operational or design issues obvious. But it won’t tell you whether or not the new system works in real life, or at scale.
When designing prototypes, we should think of implementing an intervention to measure the outcomes. For this, we need an independent variable or the factor that is manipulated, changed, or intervened. This is usually a variable that is placed on x-axis when grouping. We also need a dependent variable or the factor that is being measured and usually placed on y-axis during grouping and visualization.
2.4 Experimental design(s)
Next is to determine if randomization is possible, what the sampling unit and approach might be, how the control group might be set up as well as how many observations are needed based on power calculations.
Randomized experiments, or quasi-experimental designs, sometimes couched in deadly technical language, are uniquely valuable. Despite their unfashionable status among some policy wonks and evaluators, we will also highlight the value and utility of Quasi-Experimental designs in the next module. Other approaches may be also be suited to finding out different things, at different stages of developing a policy solution.
Regardless of what type of experiment we chose to do, it is helpful to think about the following variables:
- A control group is a group of ‘test’ items in an experiment. The control group will be used to compare with the experimental group
- The control group doesn’t get the treatment
- An experimental group is the group(s) of test items where only one change (called the experimental or independent variable) has been made
- The experimental group gets the treatment
- The experimental group may have dependent or independent variables
In the case when a real control group is not available, a synthetic control group or a more inventive statistical methods may be useful.
It is also in this step that we determine what information we want to collect, set a timeframe for data collection, and determine the data collection methods.
Source of error considerations - Mind the constants: the conditions that are kept the same for control and experimental groups - Not controlling for factors or parameters that are kept the same in both control and experimental groups can result in error - Type I error (α) is the rejection of a true null hypothesis (“false positive” finding or conclusion, e.g. “an innocent person is convicted”) or finding a difference when a difference does not exist - Type II error (β) is the non-rejection of a false null hypothesis (“false negative” finding or conclusion, e.g. a guilty person isn’t convicted) or not detecting a difference when one actually exists
Sample size considerations Sample size measures the number of individual samples measured or observations used in a survey or experiment. For example, if you test 100 people for COVID, your sample size is 100.
In general, we want to: - Maximize sample size (n): the larger the number of test items the more accurate the estimate - Use representative groups: the samples must reflect the natural variation in the population. - Use random or systematic sampling to reduce inherent bias in data.
For sample size calculations, we need a hypothesis test, a significance level for the test, the smallest effect size (∆) that is of scientific interest, and the intended power (power = 1 – β) of the test.
There are often softwares that help statisticians decide what sample size and power to chose for a set of sample observations. In general: - The price of increased power is that as standard deviation goes up, so does the probability of a Type I error because - As sample size increases, so does the power of the significance test. This is because a larger sample size narrows the distribution of the test statistic
Statistical power is a measure of the likelihood that a researcher will find statistical significance in a sample if the effect exists in the full population. Power is a function of three primary factors: sample size, effect size, significance level.
2.5 collect and analyze data
At this point, we have a problem, and intervention, a research plan, and data collection strategies. Therefore, we are ready to start implementing the experimental design to collect the data and then analyze it.
We can treat data as qualitative (descriptive) or quantitative (quantitative values/ numbers). Before you collect new data, determine what information could be collected from existing databases or sources on hand. Collect this data first. Also determine a file storing and naming system ahead of time to help all tasked team members collaborate. This process saves time and prevents team members from collecting the same information twice. If you need to gather data via observation or interviews, then develop an interview template ahead of time to ensure consistency and save time. Keep your collected data organized in a log with collection dates and add any source notes as you go (including any data normalization performed). This practice validates your conclusions down the road.
Quantitative data comes in the form of numbers, quantities and values and describes things in concrete and easily measurable terms. Examples include the number of students who applied to a grant, the rating a customer gave a product out of five stars and the number of times a visitor spent on the website.
Qualitative data is descriptive, rather than numeric. It is less concrete and less easily measurable than quantitative data. This data may contain descriptive phrases and opinions. Examples include an open ended review a customer writes about a product, an answer to an survey question about what type of applications a customer likes to fill and the conversation an applicant has with a service representative.
Regardless of what kind of data we collect, a proactive data management strategy will make storage, retrieval, and analysis easier.
The analysis phase is also as crucial because it turns raw data into valuable insights that we can use to enhance strategies, products and business decisions. We can often couple data analytics tools to raw data (e.g. power BI softwares, etc) to help with analysis. Visio, Nvivo, Minitab, Stata, and Microsoft Excel are other great tools and software packages for advanced statistical data analysis. The goal of analysis of the data to really to test the effects of the intervention we wanted to measure (e.g. comparing the differences between groups who got a treatment and those who didn’t).
Devote some time to review the results. What happened after you implemented the interventions? What worked, what didn’t, and what did your solution improve? Analyze if your actions made the required impact and if you addressed the root causes of the issue. It’s also time to look for improvements in the solution and to plan ongoing monitoring. You can also analyze what you’ve learned and what still needs to be learned when it comes to problem-solving processes and skills.
As you interpret the results, ask yourself these key questions:
- Does the data answer your original question? How?
- Does the data help you defend against any objections? How?
- Are there any limitation on your conclusions, any angles you haven’t considered?
Once you have uncovered the patterns and insights, you can start reporting back the findings to stakeholders. This step is also reiterative because as you report back, you can adapt the information. Through the presentation of the results, you disseminate the evidence that identities key learnings and adapt the program/ operation based on what the evidence dictates.
The goal of sharing the results and reporting back the process to executives is to reach consensus, generate additional learnings, and develop a better implementation plan.
Problem-solving tips
Problem-solving is a process of constant improvement and reiteration. Don’t expect the perfect solution from the start or that the problem won’t appear in the future. We should make efforts not to avoid problems because they’re part of the learning process. If you adopt an attitude in which you focus on finding solutions every time new challenges emerge, you’ll save yourself a lot of time and stress.


Class Menu
- java.lang.Object
-
- Menu
-
public class Menu extends java.lang.Object
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interface
Menu.CallBack
Interface that permites to create an Callback to each option of the Menu
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addData(java.lang.String newData)
Adds a new data line to printed before the menu options.void
addOption(java.lang.String name, java.lang.String settings, Menu.CallBack callBack)
Adds an option to the menu with settings.void
addOption(java.lang.String name, Menu.CallBack callBack)
Adds an option to the menu.void
addTableData(java.util.List<java.lang.String> newData)
Adds a new row to the menu table.void
addTableHeader(java.util.List<java.lang.String> newHeader)
Adds the table header or replaces it if there is some already.void
clear()
Clears all user inserted data, except the name of the menu.void
decreaseMinMax()
Goes to the previous page in the table pagination, by decreasing the minimum and maximum with offset.int
getMax()
Gets the maximum in the table pagination.int
getMin()
Gets the minimum in the table pagination.int
getOffset()
Gets the offset in the table pagination.void
increaseMinMax()
Goes to the next page in the table pagination, by incrementing the minimum and maximum with offsetvoid
setMax(int newMax)
Sets the maximum in the table paginationvoid
setMin(int newMin)
Sets the minimum in the table pagination.void
setOffset(int newStep)
Sets the offset in the table pagination.void
start()
Prints the Menu and starts a scanner to ask to the user for the menu option.void
start(java.lang.String newName)
Prints the Menu and starts a scanner to ask to the user for the menu option.
-
-
-
Constructor Detail
-
Menu
public Menu()
Constructor that creates an empty menu object. The table pagination starts at element 0 and ends in element 4 with offset equal to 4.
-
Menu
public Menu(java.lang.String newName)
Constructor that creates an empty menu object with a specific name. The table pagination starts at element 0 and ends in element 4 with offset equal to 4.- Parameters:
newName
- The name for the menu.
-
-
Method Detail
-
setOffset
public void setOffset(int newStep)
Sets the offset in the table pagination.- Parameters:
newStep
- An int that represents the new offset.
-
setMin
public void setMin(int newMin)
Sets the minimum in the table pagination.- Parameters:
newMin
- An int that represents the new minimum.
-
setMax
public void setMax(int newMax)
Sets the maximum in the table pagination- Parameters:
newMax
- An int that represents the new maximum
-
getOffset
public int getOffset()
Gets the offset in the table pagination.- Returns:
- An int that represents the offset.
-
getMin
public int getMin()
Gets the minimum in the table pagination.- Returns:
- An int that represents the minimum.
-
getMax
public int getMax()
Gets the maximum in the table pagination.- Returns:
- An int that represents the maximum.
-
increaseMinMax
public void increaseMinMax()
Goes to the next page in the table pagination, by incrementing the minimum and maximum with offset
-
decreaseMinMax
public void decreaseMinMax()
Goes to the previous page in the table pagination, by decreasing the minimum and maximum with offset.
-
start
public void start(java.lang.String newName)
Prints the Menu and starts a scanner to ask to the user for the menu option. The header of the Menu consists in the name of the menu. If there is some data or an header in the table, it will be printed. Having the option, this method calls the option callback.- Parameters:
newName
- The string that represents the menu name.
-
start
public void start()
Prints the Menu and starts a scanner to ask to the user for the menu option. The header of the Menu consists in the name of the menu. If there is some data or an header in the table, it will be printed. If not, data lines will be printed if there are some. Having the option, this method calls the option callback.
-
addOption
public void addOption(java.lang.String name, Menu.CallBack callBack)
Adds an option to the menu.- Parameters:
name
- The name of the option.callBack
- A implementation of method run of the interface CallBack. This implementation can be a lambda function/expression.
-
addOption
public void addOption(java.lang.String name, java.lang.String settings, Menu.CallBack callBack)
Adds an option to the menu with settings.- Parameters:
name
- The name of the optionsettings
- A string of setting to be used in this option.callBack
- A implementation of method run of the interface CallBack. This implementation can be a lambda function/expression.
-
addData
public void addData(java.lang.String newData)
Adds a new data line to printed before the menu options.- Parameters:
newData
- A string that represents a data line to be inserted.
-
addTableData
public void addTableData(java.util.List<java.lang.String> newData)
Adds a new row to the menu table.- Parameters:
newData
- A list of String (row) to be added to the bottom of the table.
-
addTableHeader
public void addTableHeader(java.util.List<java.lang.String> newHeader)
Adds the table header or replaces it if there is some already.- Parameters:
newHeader
- A list of string that represents the header.
-
clear
public void clear()
Clears all user inserted data, except the name of the menu.
-
-


{{ .Params.lead | safeHTML }}
Get startedThis remains the only purpose of a code analyser: to help you write better code, either by correcting you, or inspiring you.
Read about some of the concepts introduced by e2immu in The Road to Immutability, whether you are a novice at Java, or a life-long enthousiast.
e2immu provides practical definitions for immutability, and helps you maintain a balance between object orientend and functional paradigms.
Bend, or sharpen, the modification rules yourself: Annotated APIs determine how you view library code.
 The Gradle plugin runs the analyser.
Learn the concepts and use the support classes. The analyser is there to help, but it is not required.


2021 🌽
Enjoying part time work at Cropsafe, a popular Belfast disruptor solving problems within the field of farming. Mostly leading design, and creating digital as well as print content.
My name is Oliwia Widuto. I'm a multidisciplinary designer.
Find out what that means below.
Enjoying part time work at Cropsafe, a popular Belfast disruptor solving problems within the field of farming. Mostly leading design, and creating digital as well as print content.
Currently, I am a final year IXD student working on my major project, Environfriend. This project aims to support those working in the tech sector in decreasing their carbon footprint.
On Placement at Synergy Learning, working as a Theme Developer and Support Technician for LMS such as Moodle and Totara.
Jump into 2nd Year of IXD at Belfast Arts University with a heavy focus on front end development and experienece design. I worked on projects such as Memetal Health, Girlements, Codesseum, and Sherlock by Train.
Begin working at Fabric Yard as social media Content Strategist. Together, we created weekly sewing tutorials and ran a multitude of very succesful competitions and giveaways.
Move to Edinburgh to study Interactive Media Digital at Napier University. Check out my Case Studies to see what I did.
Start sewing business from home. As of 2020, I sell through Etsy as well as fulfilling wholesale orders on my bestseller, eco wipes. I have also worked on major bespoke projects for the likes of drag queens.
Commence my magical journey into Interaction Design through the Northern Regional College. Here I learned Graphic Design, Illustration, 3D Animation, and even hosted a live Facebook show.
Come 2nd in Texaco Children's Art Competition. My painting re-told a story of my late Grandmother in Photoshop.
Move from Ostroda in Poland, to Coleraine on the breezy North Coast of Ireland.
Hungry for more?
Hoke through the links in the footer ;)


Using an
Emote Command in some games (especially
MMORPGs) will trigger Emote Animations. Sometimes, these are also used as
Idle Animations, or
recycled by the devteam for cutscenes.
Examples
- Second Life, since all of the content is user-made, has literally thousands of emote animations and gestures.
- In World of Warcraft, the slash command "/dance" triggers a different dancing animation depending on the race and gender of your character. For example, male dwarves will perform a "Cossack" dance, while female dwarves will perform some Riverdance-esque Irish step-dancing. There are other animations as well. /rude, /train /roar, being a few examples.
- City of Heroes has over two hundred of these, including five different "/dance"s, a half-dozen variations on "/sit", eating, drinking, beating someone with a baseball bat, turning someone into a pumpkin, being turned into a pumpkin by someone, plotting evilly, and inviting someone to kiss your butt. Furthermore, new ones seem to be added with every major release of the game.
- The Lord of the Rings Online also includes over a hundred of animations with new ones being added frequently.  Many quests require you to perform certain animations to progress. Also, there are at least twelve different emotes for various dances alone.
- The Matrix Online includes several selectable dances which differ based on gender as well as a collection of interactive emotes. Players can either accept the emote or decline it, such as /kiss, /propose, /manhug, and /dap.
- Guild Wars also includes several, with dance (based on character profession) included. Also notable are /flute and /guitar ("Rostafan plays a mean air guitar.")
- Bored Everquest players proved that it's possible to make any character dance the macarena with stock emotes.
- While many multiplayer shooters have emotes (mostly victory gloats), the cult of multiplayer saber fighting in the later Dark Forces Saga games caused the developers to eventually add thirty different default emote animations.
- The child-targeted animation program 3D Movie Maker has various over-acted emotes for each character model (sit, talk, walk, etc). Thankfully for the movie makers, there's an option to pause the animations at a given frame, leading to entire movies where all character motions are built out of various mix-and-matched frames of other animations.
- Asheron's Call 2 has, amongst its more generic emotes, the "gokart" emote, which would cause a player to remain in a sitting position while moving.
- Final Fantasy XI actually has made multiple updates to its emotes. An early patch after the initial US release (later known as the "sitting nerf") changed the /sit emote for female characters so their legs weren't spread quite so wide. More recently the various dancing animations used for the Dancer job class were added as new /dance emotes.
- Puppeteers' animations will perform emotes along with their masters.
- Final Fantasy XIV has various animations that vary slightly depending on the Player Character's race, and sometimes their job. These are coupled with Idle Animations (as you can trigger them on command) and are used for almost every cutscene, which makes the characters seem robotic at times.
- Fable:
- Fable I has a wide variety of emote animations, many of which need to be unlocked by fulfilling certain criteria in-game. Despite it being a single-player game, they're actually useful: you use them for Romance Sidequests, frightening villagers, flipping off guards, farting to make children giggle, showing off trophies for extra renown, or even being forgiven for minor crimes.
- Fable II allows the player to "extend" certain emotes for better results with the caveat that, the longer the emote is extended, the greater the chance to fail. Failure can be funnier than success: failing the fart emote results in the player soiling themselves.
- Earth & Beyond had emotes for your character and your ship; yaw spins, barrel rolls, short loop-the-loops, all performed without influencing the direction of flight or breaking formation.
- Mabinogi added emotes for greeting, laughing, crying, and being angry, among others, around its 1-year anniversary in North America. As of mid-August 2010, further animations for salutes, formal greetings, and dancing were added.
- Tales of Symphonia has a mini-game in which the stock emotes are mapped to random keys on the controller, and the player must trigger emotes to match the demonstrating NPC.
- In Toontown Online, this varies from waving hello, to applauding, to growling, to growling with an organ playing in the background.
- The Wii A Boy and His Blob features a "hug Blob" button.
- Army of Two includes "Bromance" type stuff where you can high five your co-op team-mate, or shake hands. Or smack them. This will usually completely derail a mission for several minutes as players continually smack each other.
- Prince of Persia (2008) has a dedicated button for activating conversation between the Prince and Elika. The conversations do include snippets of the backstory, however.
- RuneScape has a few dozens of emote animations. Some are given out during certain holiday events, others are unlocked by completing requirements, and still others are only activated through the use of a specific item, weapon, or costume/cape.
- Flyff has quite a few of these.
- Portal 2's co-op features gestures.
- Dragon Quest IX has "Party Tricks", many of which are given out as rewards as you complete quests. They were most likely added because of the game's increased focus on multiplayer.
- League of Legends features a joke, taunt, dance and laughing emote for each champ, most of which come with its own animation.
- These are the only way players can directly communicate in Dark Souls and its sequels, besides buying and finding a certain kind of item in Oolacile that plays a pre-recorded message when used ("Hello!", "Very good!", "Help me!", "Thank you" and "I'm sorry".) It's common for invaders to bow to their opponent so each other can prepare for a duel, and some gestures are purely made for humiliating their opponents.
- Golden Sun: Dark Dawn replaces standard Yes and No answers to questions with 4 emote actions so Matthew can respond angrily or happily, etc.
- God Eater Burst has a variety of them keyed to the D-pad and shoulder buttons, ranging from clapping to a bow.
- PlanetSide has a wide variety of animations, the majority of which are played with voice callouts; "HELP!" will cause your character to wave their arms in the air, saying "Yes" causes them to make an "OK" gesture with their hand, et cetera. There's several hidden commands, such as "cabbagepatch", that causes your character to dance. Sadly, the animations are missing in the sequel.
- Space Engineers allows the space-suited players to use several emotes, which can be expanded with Game Mods. Amusingly, the animations are blended, allowing you to wave one arm in the air in celebration while the other is face-palming.
- Star Citizen has a wide selection of emotes for the sandbox universe, with each emote having a few variations. It's possible to hold down the trigger on your automatic rifle while dancing, sending a wild spray of bullets in every direction.
- LittleBigPlanet has the D-Pad entirely devoted to the player-controlled characters' emotions. Each button has a designated emotion (for example, up is for happy, right for angry, down for sad, and left for fear) and pressing it up to three times will change the intensity of the emotion.
- Demon's Souls and its various sequels and Spiritual Successors have a variety of pre-animated animations (including the highly memetic "Praise the Sun" gesture made famous in Dark Souls) that, along with mad-libs style messages ([Fill in the Blank] Ahead, Beware of [Whatever], Use [Thing], etc.), are the only means of non PvP player interaction.
- Torchlight II has these available in multiplayer and it overlaps with Emote Command and Slash Command by using a forward slash in the chat window. These included mostly humorous ones like /jump "[Player] tries to jump but can't." to /secret "[Player] is trolling Justin!"
- Warframe features dozens of animated actions the players can perform from their modifiable emote wheel, ranging from simple gestures like handshakes, to levitating, to elaborate "nartas".


{{up2day.weather.temp}}°C
{{up2day.weather.desc}}
Wind : {{up2day.weather.windSpeed}} km/h
{{x.title}}
Match day : {{league.leagueTable.matchday}}
| Position | Image | Name | Points | Played Games | Wins | Losses | Draws | Goals | Goals Against | Goal Difference |
|---|---|---|---|---|---|---|---|---|---|---|
| {{team.position}} | {{team.teamName}} | {{team.points}} | {{team.playedGames}} | {{team.wins}} | {{team.losses}} | {{team.draws}} | {{team.goals}} | {{team.goalsAgainst}} | {{team.goalDifference}} |


Required
Current
Loss
Difference
Expected Party A Districts
higher is better
District Population Imbalance
lower is better
Expected Efficiency Gap
higher is better
Loss


{% load staticfiles %}
After you familiarize yourself with the EA, things can get pretty boring. He does almost everything for you. But there is a lot of room for improvement.
We have talked about it before, and we won't get tired of repeating it: don't trust just one trading strategy! At Avanti, we make a very serious effort to generate trustworthy strategies using the top computational and statistical tools available. And nonetheless, we have to warn you. You must learn more strategies. You need to diversify.
Diversification is the technique of lessening the risks by dividing our capital among many strategies, markets or timeframes. How does it reduce risks? Let's see it by an example.
Below you will see the profit curve of four different implementations of the SMA + Knoxville strategy. These implementations belong to the Avanti's complete portfolio.
As you can see, each profit curve has its own 'personality'. They behave differently. That's because, if you read with attention the title of each chart, you will see that there are six currencies involved, two timeframes and two kinds of operations (buy-only and sell-only).
The magic happens when we invest using all these strategies at the same time. Just watch the profit curve:
There you see a better-behaved curve that sums the profits of the previous charts and is a lot less volatile at the same time. That is, more profits with less risk!
Finally, let's see the profit curve of a portfolio of thirteen variations of the SMA + Knoxville strategy.
This curve is even more stable and less volatile. Do you want a profit curve like this one? Get the complete portfolio now.


In addition to browsing the Earth, Google Earth allows you to view heavenly objects, including stars, constellations, galaxies, planets such as Mars and the Earth's moon. To view these objects, click View > Switch to Sky or click . and choose Sky. In Sky, the Earth is hidden and the 3D viewer presents a view of the sky.
Note - When you use Sky, the view is above your current location on Earth. For example, if you go to Paris and open Sky, you will see what is in the sky above Paris at the current time. When you exit Sky, you return to this same location.
Once you switch to Sky, you can navigate and see stars. Additionally, you can view other heavenly bodies by checking items in the Layers panel. Currently, these layers folders include:
|
|
As with other layer folders, you can expand these folders and display or hide layers by checking or unchecking them. You can click on points of interest to fly to and learn more about an object. For example, after checking the Backyard Astronomy layer, you can click a point of interest icon to learn about a particular star.
Note - Items checked in the Places panel (placemarks, polygons, etc.) appear as you view the sky. If you want to hide these items, just uncheck them in the Places panel.
In Sky, some Google Earth features are available, while others are disabled. Among other features, the following are available:
The following features are not available:
Note - You can navigate in Sky exactly as you do in the Earth view, except that you cannot tilt the view.
Position is depicted in the lower left corner of the 3D viewer. The coordinates are based on the motion of the sky due to the rotation of the Earth. These coordinates appear in the following units:
As time passes, the RA for the zenith rotates through 24 hours, but the declination remains constant.
You can search for heavenly objects. To do this, in the Search panel, click one of the following tabs:
After you enter your search terms, click the Search button . Results appear in the Search panel. Double click any result to navigate to that location.
You can display a grid of latitude and longitude lines over the imagery in the 3D viewer. To turn on the grid do one of the following:
The grid appears over the earth imagery as red lines, with each latitude/longitude degree line labeled in an axis across the center of the 3D viewer. You can position a astronomical feature in the 3D viewer and determine its basic spatial coordinates using this grid. As you zoom in, the level of detail of the degree lines increases.
To view imagery and terrain of Mars, click and choose Mars. You can navigate and explore just as you would on Earth. To return to
a view of Earth, click and choose Earth.
Updated on


@(env: String, charts: Seq[tools.Chart]) @admin_main("KPIs", env, isAuthed = true) {
Collected from Ophan data covering March 1, 2013 to present. Note there is a run in period on returning user metrics where we wait for these users to identify themselves by multiple visits.
@charts.map{ chart => } }


Meta information¶
pylidc was created by Matt Hancock while at Florida State University. It is available under an MIT license.
Publications¶
If you have used pylidc in your research, let us know!
It was developed for, and first mentioned in, the following publication:
- Matthew C. Hancock, Jerry F. Magnan. Lung nodule malignancy classification using only radiologist quantified image features as inputs to statistical learning algorithms: probing the Lung Image Database Consortium dataset with two statistical learning methods. SPIE Journal of Medical Imaging. Dec. 2016. http://dx.doi.org/10.1117/1.JMI.3.4.044504
License¶
The MIT License (MIT)
Copyright (c) 2016 pylidc Author: Matt Hancock<EMAIL_ADDRESS>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


|
|
| Button (Widget *parent) |
| |
| FSize2 | SizeHint () const override |
| | Gives the layout system a hint of how large this widget has to be. Note that the actual size may be different depending on the layout. More...
|
| |
|
virtual void | GenerateTriangles (RenderData &renderData, CommandList &cmdList, ISize2 windowSize) const override |
| | Output this widget's visual representation by pushing triangle draw commands into the command list. Note: This API will be removed once vector path graphics are implemented.
|
| |
| void | InitializeTheme (Theme &theme) override |
| | Should invoke Theme::InitializeWidget if this widget employs the use of painting delegation to themes. More...
|
| |
| void | Paint (Surface &surf, Theme *theme) const override |
| | Paint this widget's visual representation onto the surface. This function should be overridden by types implementing Widget if it is intended that they have a standalone visual appearance. More...
|
| |
| | Widget (Widget *parent) |
| | Widget constructor. More...
|
| |
| | Widget (Context &context) |
| | Top-level Widget constructor. Only use this overload for root widgets. More...
|
| |
| virtual bool | PointerHit (FPoint2 const &pointer) const |
| | Test whether the mouse pointer is hovering the widget. Custom widgets may override this to replace the default AABB intersection test. More...
|
| |
| virtual void | SetGeometry (FRect2 const &geometry) final |
| | Set geometry to be used for building the layout. More...
|
| |
|
virtual FRect2 | Geometry () const final |
| | Access the geometry AABB of this widget.
|
| |
|
virtual Widget * | Parent () const final |
| | Obtain a pointer to the parent of this widget. If there is no parent, nullptr is returned.
|
| |
|
virtual Context & | GetContext () const final |
| | Obtain a reference to the context this widget resides in.
|
| |
|
virtual std::size_t | NumChildren () const final |
| | Obtain the amount of children this widget owns. Useful for iterating over them.
|
| |
| template<typename T , typename... CtorArgs> |
| WidgetPtr< T > | MakeChild (CtorArgs &&... args) |
| | Create a new child widget of type T and append it to the list of children. More...
|
| |
| template<typename T , typename... CtorArgs> |
| WidgetPtr< T > | MakeChildAt (std::size_t at, CtorArgs &&... args) |
| | Create a new child widget of type T and put it at the specified index in the list of children. More...
|
| |
| virtual Widget * | GetChild (std::size_t at) final |
| | Obtain a pointer to the widget at index at. More...
|
| |
|
virtual void | SetHorizontalSizeHintBehaviour (SizeHintBehaviour shb) final |
| | Changes the horizontal (width) SizeHint behaviour.
|
| |
|
virtual SizeHintBehaviour | HorizontalSizeHintBehaviour () const final |
| | Returns the horizontal (width) SizeHint behaviour.
|
| |
|
virtual void | SetVerticalSizeHintBehaviour (SizeHintBehaviour shb) final |
| | Changes the vertical (height) SizeHint behaviour.
|
| |
|
virtual SizeHintBehaviour | VerticalSizeHintBehaviour () const final |
| | Returns the vertical (height) SizeHint behaviour.
|
| |
|
virtual void | SetLayout (Layout &layout) final |
| | Changes the layout this widget manages. This will take ownership of the pointer.
|
| |
|
virtual void | RemoveLayout () final |
| | Removes the layout this widget manages, if any.
|
| |
|
virtual Layout * | GetLayout () const final |
| | Returns the layout this widget manages. Possibly nullptr.
|
| |


Inspired by a combination of the modern ritual of filter coffee with the iconic vinyl record player, encouraging a nostalgic experience with the user. The design was born with a digital detox in mind, where the design language balances between simplicity and mystified alchemy.
There is a drawer to store both coffee and tea with an integrated lid and spoon.
The Barisieur has a standard alarm to wake you up up in the morning, you can turn the volume up and down for this.
The milk vessel cools through a peltier cooler and is activated by an infrared sensor.
Tested by top tea & coffee connoisseurs and the brew has been rated as 5/5
Tested by top tea & coffee connoisseurs and the brew has been rated as 5/5


EthanRDoesMC's Repo
EthanRDoesMC
makes original, creative tweaks.
Add to Cydia
Hosted Packages
Gandalf
Gandalf protects you from yourself. It's only a little bit more than kilobyte but has mega protection.
More info
Dummy Package
This package allows for safe testing with Gandalf.
More info


Getting involved with our team at Angular doesn't mean you can only contribute to Angular's open source. We have several components that Angular depends heavily upon. If you would like to contribute indirectly to us, check out some of these open source projects that interact with Angular.
If you've been working on some of your own features to add to AngularJS, check out our pull request page on GitHub.


SAML Authentication
SAML is a widely implemented and used Single Sign On (SSO) provider that allows applications and services to authenticate in a standard way, and brokers those authentication requests to one or more back-end authentication providers. The SAML authentication extension allows Guacamole to redirect to a SAML Identity Provider (IdP) for authentication and user services. This module does not provide any capability for storing or retrieving connections, and must be layered with other authentication extensions that provide connection management.
Downloading the SAML authentication extension
Guacamole’s SSO extensions are available separately from the main
guacamole.war
. The link for this and all other officially-supported and
compatible extensions for a particular version of Guacamole are provided on the
release notes for that version. You can find the release notes for current
versions of Guacamole here: http://guacamole.apache.org/releases/.
The SSO extensions are packaged together in a .tar.gz
file containing one
extension for each supported SSO method:
SSO Method |
Extension |
|---|---|
|
|
|
|
|
The extension for the desired SSO method, in this case
guacamole-auth-sso-saml-1.5.0.jar
from within the saml/
subdirectory,
must ultimately be placed in GUACAMOLE_HOME/extensions
.
Installing SAML authentication
Guacamole extensions are self-contained .jar
files which are located within
the GUACAMOLE_HOME/extensions
directory. If you are unsure where
GUACAMOLE_HOME
is located on your system, please consult
Configuring Guacamole before proceeding.
To install the SAML authentication extension, you must:
Create the
GUACAMOLE_HOME/extensions
directory, if it does not already exist.Copy
guacamole-auth-sso-saml-1.5.0.jar
withinGUACAMOLE_HOME/extensions
.Configure Guacamole to use SAML authentication, as described below.
Configuring Guacamole for SAML Authentication
The SAML authentication extension provides several configuration properties to set it up to talk to the IdP. The SAML IdP also must be configured with Guacamole as a Service Provider (SP). Configuration of the SAML IdP is beyond the scope of this document, and will vary widely based on the IdP in use.
saml-idp-metadata-url
The URI of the XML metadata file that from the SAML Identity Provider that contains all of the information the SAML extension needs in order to know how to authenticate with the IdP. This URI can either be a remote server (e.g.
https://
) or a local file on the filesystem (e.g.file://
). Often the metadata file contains most of the required properties for SAML authentication and the other parameters are not required.saml-idp-url
The base URL of the SAML IdP. This is the URL that the SAML authentication extension will use to redirect when requesting SAML authentication. If the
saml-idp-metadata-url
property is provided, this parameter will be ignored. If the metadata file is not provided this property is required.saml-entity-id
The entity ID of the Guacamole SAML client, which is generally the URL of the Guacamole server, but is not required to be so. This property is required if either the
saml-idp-metadata-url
property is not specified, or if the provided metadata file does not contain the SAML SP Entity ID for Guacamole Client.saml-callback-url
The URL that the IdP will use once authentication has succeeded to return to the Guacamole web application and provide the authentication details to the SAML extension. The SAML extension currently only supports callback as a POST operation to this callback URL. This property is required.
saml-strict
Require strict security checks during SAML logins. This will insure that valid certificates are present for all interactions with SAML servers and fail SAML authentication if security restrictions are violated. This property is optional, and will default to true, requiring strict security checks. This property should only be set to false in non-production environments during testing of SAML authentication.
saml-debug
Enable additional logging within the supporting SAML library that can assist in tracking down issues during SAML logins. This property is optional, and will default to false (no debugging).
saml-compress-request
Enable compression of the HTTP requests sent to the SAML IdP. This property is optional and will default to true (compression enabled).
saml-compress-response
Request that the SAML response returned by the IdP be compressed. This property is optional and will default to true (compression will be requested).
saml-group-attribute
The name of the attribute provided by the SAML IdP that contains group membership of the user. These groups will be parsed and used to map group membership of the user logging in, which can be used for permissions management within Guacamole Client, particularly when layered with other authentication modules. This property is optional, and defaults to “groups”.
Controlling login behavior
Guacamole loads authentication extensions in order of priority, and evaluates authentication attempts in this same order. This has implications for how the Guacamole login process behaves when an SSO extension is present:
- If the SSO extension has priority:
Users that are not yet authenticated will be immediately redirected to the configured identity provider. They will not see a Guacamole login screen.
- If a non-SSO extension has priority:
Users that are not yet authenticated will be presented with a Guacamole login screen. Additionally, links to the configured identity provider(s) will be available for users that wish to log in using SSO.
The default priority of extensions is dictated by their filenames, with
extensions that sort earlier alphabetically having higher priority than others.
This can be overridden by setting the extension-priority
property within
guacamole.properties
.
Automatically redirecting all unauthenticated users
To ensure users are redirected to the SAML identity provider immediately (without a Guacamole login screen), ensure the SAML extension has priority over all others:
extension-priority: saml
Presenting unauthenticated users with a login screen
To ensure users are given a normal Guacamole login screen and have the option to log in with traditional credentials or with SAML, ensure the SAML extension does not have priority:
extension-priority: *, saml
Completing the installation
Guacamole will only reread guacamole.properties
and load newly-installed
extensions during startup, so your servlet container will need to be restarted
before SAML authentication can be used. Doing this will disconnect all active
users, so be sure that it is safe to do so prior to attempting installation.
When ready, restart your servlet container and give the new authentication a
try.


You can do election with upto 500 voters.
You can do election with upto 1000 voters.
Capacity should be less than or equal {{electionVotersCapacity}}
Enter your card informaion
Visa
Master
If you need to upload csv file. choose that file and press upload button.


Nagoya Protocol - User Account Removal
Some text
Click here to remove your account
###deadline###
Some more text
Some legal text


--- layout: default layout_grid: true title: Communicate keywords: adaptive build develop distribute create apps develop build create develop description: Communicate with Adaptive - Create, Develop, Build & Distribute Apps As-A-Service and also Chat with us! class: fa fa-comments-o sitemap: priority: 1.0 lastmod: 2015-10-27T11:07:00+01:00 ---
| Project | Type | Tech | Description |
|---|---|---|---|
| {{p.project_slug}} | {{p.project_type}} | {{p.project_tech}} | {{p.description}} |


Mahjong is a four player "draw one, discard one" game in which players attempt to turn a randomly assigned collection of tiles into a winning collection of tiles. Any player may claim another player's discard (even when it would not be the claiming player's turn; claiming makes them the active player) if that tile can be used to form a set of three of a kind, or four of a kind. In addition, suited number tiles may be claimed to form a set of three consecutive same suited numbers, but this claim may not be made out of turn order. A player wins once they have four sets and a pair. While pairs cannot be claimed during normal play, if a tile completes a pair and in so doing forms a winning four sets and a pair, that tile may be claimed as a winning tile (the claim can be made because it's a win, not because it's a pair).