function replacer( match, p1, p2 ) {
		var code;
		var out;

		// Reconstitute the emoji code in order to normalize the code string:
		code = ':' + p1 + ':';
		if ( p2 ) {
			p2 = p2.split( /,\s*/ ).join( ', ' ); // normalize any modifiers by ensuring consistent modifier spacing
			code += ':' + p2 + ':';
		}
		if ( hasOwnProp( TABLE, code ) ) {
			out = TABLE[ code ];

			// Note: we limit ourselves to emojis that are two columns wide--emoji being considered wide characters--hence, minus two. Depending on Unicode support, other emoji may not render as a single glyph.
			if ( out.length === 2 ) {
				len -= match.length - 2;
				return out;
			}
		}
		// If unable to convert an emoji code to a rendered emoji, return the matched substring unchanged:
		return match;
	}
Callback invoked for each match.

@private
@param {string} match - matched substring
@param {string} p1 - first string found by a parenthesized capture group
@param {(string|void)} p2 - second string found by a parenthesized capture group
@returns {string} replacement string