execd
Version:
Check if method has been called.
1,134 lines (871 loc) • 93.9 kB
JavaScript
"use strict";
/*;
@submodule-license:
The MIT License (MIT)
@mit-license
Copyright (@c) 2017 Richeve Siodina Bebedor
@email: richeve.bebedor@gmail.com
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.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 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.
@end-submodule-license
@submodule-configuration:
{
"package": "ehm",
"path": "ehm/meta.module.js",
"file": "meta.module.js",
"module": "ehm",
"author": "Richeve S. Bebedor",
"eMail": "richeve.bebedor@gmail.com",
"repository": "https://github.com/volkovasystems/ehm.git",
"test": "ehm-test.js",
"global": false,
"internal": true,
"class": true
}
@end-submodule-configuration
@submodule-documentation:
Meta class construct.
@end-submodule-documentation
@include:
{
"harden": "harden",
"sxty4": "sxty4"
}
@end-include
*/var _toStringTag = require("babel-runtime/core-js/symbol/to-string-tag");var _toStringTag2 = _interopRequireDefault(_toStringTag);var _stringify = require("babel-runtime/core-js/json/stringify");var _stringify2 = _interopRequireDefault(_stringify);var _getPrototypeOf = require("babel-runtime/core-js/object/get-prototype-of");var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf);var _toPrimitive = require("babel-runtime/core-js/symbol/to-primitive");var _toPrimitive2 = _interopRequireDefault(_toPrimitive);var _slicedToArray2 = require("babel-runtime/helpers/slicedToArray");var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);var _freeze = require("babel-runtime/core-js/object/freeze");var _freeze2 = _interopRequireDefault(_freeze);var _from = require("babel-runtime/core-js/array/from");var _from2 = _interopRequireDefault(_from);var _typeof2 = require("babel-runtime/helpers/typeof");var _typeof3 = _interopRequireDefault(_typeof2);var _hasInstance = require("babel-runtime/core-js/symbol/has-instance");var _hasInstance2 = _interopRequireDefault(_hasInstance);var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck");var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);var _createClass2 = require("babel-runtime/helpers/createClass");var _createClass3 = _interopRequireDefault(_createClass2);var _symbol = require("babel-runtime/core-js/symbol");var _symbol2 = _interopRequireDefault(_symbol);function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { default: obj };}
var harden = require("harden");
var sxty4 = require("sxty4");
var NAME = (0, _symbol2.default)("name");
var ENTITY = (0, _symbol2.default)("entity");
var TYPE = (0, _symbol2.default)("type");
var ERROR = (0, _symbol2.default)("error");
var OBJECT = (0, _symbol2.default)("object");
var BOOLEAN = (0, _symbol2.default)("boolean");
var STRING = (0, _symbol2.default)("string");
var NUMBER = (0, _symbol2.default)("number");
var VALUE = (0, _symbol2.default)("value");
var GARBAGE = (0, _symbol2.default)("garbage");
var CORRUPTED = (0, _symbol2.default)("corrupted");
var TAGGED = (0, _symbol2.default)("tagged");
var ARGUMENTS_PATTERN = /^\[object Arguments\]$/;
var CLASS_NAME_PATTERN = /^[A-Z][a-zA-Z0-9]+$/;
var DATA_URL_PATTERN = /^data\:[a-z][\-a-z0-9]+\/([a-z][\-a-z0-9]+)(?:\;base64)?\,/;
var EVAL_USAGE_PATTERN = /\beval\(.*?\)|\beval\b/gm;
var FUNCTION_CLASS_USAGE_PATTERN = /\bFunction\(.*?\)|\bFunction\b/gm;
var FLOAT_NUMBER_PATTERN = /\./;
var SYMBOL_PATTERN = /^Symbol\((.*?)\)$/;
var TAG_PATTERN = /^\[([a-zA-Z][\-a-zA-Z0-9]+)\s+[A-Z][a-zA-Z0-9]+(?:\:(.+?))?\]$/;
var DATA_URL_TAG = "data-url-tag";
var DEFAULT_FORMAT = DATA_URL_TAG;
var DEFAULT_DATA_URL_PREFIX = "data:text/@type;base64,";
var EMPTY_STRING = "";var
Meta = function () {(0, _createClass3.default)(Meta, null, [{ key: _hasInstance2.default, value: function value(
instance) {
/*;
@meta-configuration:
{
"instance:required": "*"
}
@end-meta-configuration
*/
return this.instanceOf(instance, this);
} }, { key: "instanceOf", value: function instanceOf(
instance, blueprint) {
/*;
@meta-configuration:
{
"instance:required": "*",
"blueprint": "function"
}
@end-meta-configuration
*/
if (
typeof instance == "function" &&
typeof blueprint == "function" &&
instance.name === blueprint.name ||
(typeof instance === "undefined" ? "undefined" : (0, _typeof3.default)(instance)) == "object" &&
instance != null &&
typeof blueprint == "function" &&
instance.constructor.name === blueprint.name)
{
return true;
}
/*;
@note:
Possibility of instance being garbage.
Do not remove this. This is a special procedure.
@end-note
*/
if (instance === GARBAGE) {
return false;
}
if (typeof blueprint != "function") {
blueprint = this;
}
try {
return new blueprint(GARBAGE).
__initialize__(instance, blueprint.name).
instanceOf(blueprint.name);
} catch (error) {
return false;
}
} }, { key: "create", value: function create(
blueprint, entity, state) {
/*;
@meta-configuration:
{
"blueprint:required": "function",
"entity": "*",
"state": Array
}
@end-meta-configuration
*/
if (arguments.length == 0) {
blueprint = this;
entity = undefined;
state = [];
}
if (arguments.length == 1) {
blueprint = this;
entity = arguments[0];
state = [];
}
if (arguments.length == 2) {
blueprint = arguments[0];
entity = arguments[1];
state = [];
}
if (typeof blueprint != "function") {
blueprint = this;
}
if ((typeof state === "undefined" ? "undefined" : (0, _typeof3.default)(state)) == "object") {
state = (0, _from2.default)(state);
} else {
state = [];
}
/*;
@note:
If we are going to throw an error here, possibility of infinite recursion.
We can push an error instead.
@end-note
*/
if (!(blueprint instanceof this)) {
state.push(new Error("incompatible blueprint, " + blueprint.name));
blueprint = this;
}
try {
var data = new blueprint(entity);
if (TAG_PATTERN.test(data.stringify())) {
state.push(TAGGED);
}
var index = state.length;
while (index--) {
var status = state[index];
if (status instanceof Error) {
data.setError(status);
} else {
harden(status, status, data);
}
}
return (0, _freeze2.default)(data);
} catch (error) {
state.push(new Error("cannot wrap data, " + error.stack));
return Meta.create(this, entity, state);
}
}
/*;
@static-method-documentation:
Default generic deserialization parser.
@end-static-method-documentation
*/ }, { key: "parser", value: function parser(
data) {
/*;
@meta-configuration:
{
"data:required": "string"
}
@end-meta-configuration
*/
if (typeof data != "string") {
throw new Error("cannot parse data, " + data);
}
try {
var token = data.match(TAG_PATTERN) || [];
var type = token[1] || "undefined";
var value = token[2] || EMPTY_STRING;
if (value == EMPTY_STRING) {
value = data;
}
/*;
@note:
If the value is a data url format, try to decode it.
Ensure that we have the correct type.
@end-note
*/
if (DATA_URL_PATTERN.test(value)) {
type = (value.match(DATA_URL_PATTERN) || [])[1] || type;
value = value.replace(DEFAULT_DATA_URL_PREFIX.replace("@type", type), EMPTY_STRING);
value = sxty4(value).decode();
}
switch (type) {
case "boolean":
if (value.toLowerCase() == "true") {
return true;
}
if (value.toLowerCase() == "false") {
return false;
}
throw new Error("cannot parse boolean, " + value);
case "function":
try {
if (EVAL_USAGE_PATTERN.test(value)) {
throw new Error("cannot parse function, contains eval, potential security issue");
}
if (FUNCTION_CLASS_USAGE_PATTERN.test(value)) {
throw new Error("cannot parse function, contains function class, potential security issue");
}
var method = new Function("return " + value)();
if (typeof method != "function") {
return function () {throw new Error("no operation done, " + value);};
}
return method;
} catch (error) {
throw new Error("cannot parse function, " + value + ", " + error.stack);
}
case "number":
try {
if (value == "Infinity") {
return Infinity;
}
if (value == "NaN") {
return NaN;
}
if (FLOAT_NUMBER_PATTERN.test(value)) {
return parseFloat(value);
}
if (!FLOAT_NUMBER_PATTERN.test(value)) {
return parseInt(value);
}
throw new Error("cannot parse number, " + value);
} catch (error) {
throw new Error("cannot parse number, " + value + ", " + error.stack);
}
case "object":
if (value == "null") {
return null;
}
try {
value = JSON.parse(value);
/*;
This is the specification for the basic
meta object structure.
*/
if (
"type" in value && typeof value.type == "string" &&
"name" in value && typeof value.name == "string" &&
"value" in value && typeof value.value == "string" &&
"format" in value && typeof value.format == "string" &&
value.format == DATA_URL_TAG &&
TAG_PATTERN.test(value.value))
{
return Meta.deserialize(value.value).valueOf();
}
return value;
} catch (error) {
return new Error("cannot parse object, " + value + ", " + error.stack);
}
case "string":
return value;
case "symbol":
var symbol = ((value.match(SYMBOL_PATTERN) || [])[1] || EMPTY_STRING).trim();
if (symbol == EMPTY_STRING) {
throw new Error("cannot parse symbol, " + value);
}
return (0, _symbol2.default)(symbol);
case "undefined":
return undefined;}
} catch (error) {
throw new Error("cannot parse data, " + data + ", " + error.stack);
}
throw new Error("cannot parse data, " + data);
}
/*;
@static-method-documentation:
Generic meta data deserialization.
@end-static-method-documentation
*/ }, { key: "deserialize", value: function deserialize(
data, parser, blueprint) {
/*;
@meta-configuration:
{
"data": "*",
"parser": "function",
"blueprint": "function"
}
@end-meta-configuration
*/var _Meta$__deserializeDe =
Meta.__deserializeDefer__(arguments, this, Meta.parser),_Meta$__deserializeDe2 = (0, _slicedToArray3.default)(_Meta$__deserializeDe, 4),data = _Meta$__deserializeDe2[0],parser = _Meta$__deserializeDe2[1],defer = _Meta$__deserializeDe2[2],blueprint = _Meta$__deserializeDe2[3];
try {
return Meta.create(blueprint, parser(data));
} catch (error) {
return Meta.create(blueprint, defer(data), [CORRUPTED, error]);
}
} }, { key: "__deserializeDefer__", value: function __deserializeDefer__(
parameter, blueprint, parser) {
/*;
@meta-configuration:
{
"parameter:required": Arguments,
"blueprint:required": "function",
"parser:required": "function"
}
@end-meta-configuration
*/
if (!ARGUMENTS_PATTERN.test(parameter)) {
throw new Error("invalid parameter");
}
if (typeof blueprint != "function") {
throw new Error("invalid blueprint");
}
if (typeof parser != "function") {
throw new Error("invalid parser");
}
var argument = parameter;
try {
parameter = (0, _from2.default)(parameter);
} catch (error) {
throw new Error("cannot process parameter, " + error.stack);
}
if (argument.length == 2) {
parameter = [argument[0], undefined, argument[1]];
}
blueprint = parameter.slice(1).
filter(function (parameter) {
return (
typeof parameter == "function" &&
"name" in parameter &&
typeof parameter.name == "string" &&
parameter.name != EMPTY_STRING &&
CLASS_NAME_PATTERN.test(parameter.name));
}).
concat(blueprint)[0];
var defer = parser;
parser = parameter.slice(1).
filter(function (parameter) {
return (
typeof parameter == "function" && (
!("name" in parameter) ||
typeof parameter.name != "string" ||
parameter.name == EMPTY_STRING ||
parameter.name == "anonymous" ||
parameter.name == "parser"));
}).
concat(defer)[0];
return [parameter[0], parser, defer, blueprint];
}
/*;
@static-method-documentation:
Checks if the tag is compatible.
@end-static-method-documentation
@note:
Override for specific compatibility checking.
@end-note
*/ }, { key: "isCompatible", value: function isCompatible(
tag) {
/*;
@meta-configuration:
{
"tag": "string"
}
@end-meta-configuration
*/
if (typeof tag != "string") {
return false;
}
return TAG_PATTERN.test(tag);
} }]);
function Meta(entity, name) {(0, _classCallCheck3.default)(this, Meta);
/*;
@meta-configuration:
{
"entity:required": "*",
"name:required": "string"
}
@end-meta-configuration
*/
this.__initialize__(entity, name);
}
/*;
@method-documentation:
This is an internal initialization procedure.
@end-method-documentation
*/(0, _createClass3.default)(Meta, [{ key: "__initialize__", value: function __initialize__(
entity, name) {
/*;
@meta-configuration:
{
"entity:required": "*",
"name:required": "string"
}
@end-meta-configuration
*/
if (!this.check(entity)) {
throw new Error("invalid entity");
}
var type = typeof entity === "undefined" ? "undefined" : (0, _typeof3.default)(entity);
name = name || type.replace(/^./, function (match) {return match.toUpperCase();});
if (typeof name != "string") {
throw new Error("invalid name");
}
this[TYPE] = type;
this[NAME] = name;
this[ENTITY] = entity;
this[ERROR] = [];
return this;
}
/*;
@method-documentation:
For generic checking of entity this is always true,
and this should be overridden.
@end-method-documentation
*/ }, { key: "check", value: function check(
entity) {
return true;
}
/*;
@method-documentation:
This will only support three types; string, number, boolean.
These types are serializable.
@end-method-documentation
@note:
Do not override this.
@end-note
*/ }, { key: _toPrimitive2.default, value: function value(
type) {
/*;
@meta-configuration:
{
"type:required": "string",
}
@end-meta-configuration
*/
switch (type) {
case "string":
return this.toString();
case "number":
return this.toNumber();
default:
return this.toBoolean();}
}
/*
@note:
These methods should be overridden.
@end-note
*/ }, { key: "tag",
/*;
@method-documentation:
Return a string tag format,
[type Name:value]
The value is optional.
@end-method-documentation
*/value: function tag(
value) {
/*;
@meta-configuration:
{
"value": "string"
}
@end-meta-configuration
*/
if (typeof value != "string") {
value = EMPTY_STRING;
}
if (value != EMPTY_STRING) {
value = ":" + value;
}
return ("[" + this.getType() + " " + this.getName() + ":@value]").replace(":@value", value);
}
/*;
@method-documentation:
Returns the object conversion of this data.
This will be used on JSON.stringify method.
@end-method-documentation
*/ }, { key: "toJSON", value: function toJSON()
{
return this[OBJECT];
}
/*;
@method-documentation:
Returns the object conversion of this data.
@end-method-documentation
*/ }, { key: "toObject", value: function toObject()
{
return this[OBJECT];
}
/*;
@method-documentation:
Returns the boolean conversion of this data.
@end-method-documentation
@note:
As much as possible, do not override this method.
@end-note
*/ }, { key: "toBoolean", value: function toBoolean()
{
return this[BOOLEAN];
}
/*;
@method-documentation:
Returns the string conversion of this data.
@end-method-documentation
@note:
As much as possible, do not override this method.
@end-note
*/ }, { key: "toString", value: function toString()
{
return this[STRING];
}
/*;
@method-documentation:
Returns the numerical conversion of this data.
@end-method-documentation
@note:
As much as possible, do not override this method.
@end-note
*/ }, { key: "toNumber", value: function toNumber()
{
return this[NUMBER];
}
/*;
@method-documentation:
Returns the original value.
@end-method-documentation
@note:
As much as possible, do not override this method.
@end-note
*/ }, { key: "valueOf", value: function valueOf()
{
return this[VALUE];
} }, { key: "typeOf", value: function typeOf(
type) {
/*;
@meta-configuration:
{
"type:required": "string"
}
@end-meta-configuration
*/
if (typeof type == "string") {
return (0, _typeof3.default)(this.valueOf()) == type;
}
return false;
}
/*
@note:
Some cases that instanceOf needs to be overridden.
@end-note
*/ }, { key: "instanceOf", value: function instanceOf(
blueprint) {
/*;
@meta-configuration:
{
"blueprint:required": [
"function",
"string"
]
}
@end-meta-configuration
*/
var entity = this.valueOf();
if (typeof blueprint == "function") {
return (
this instanceof blueprint ||
entity instanceof blueprint ||
typeof blueprint.name == "string" && this.instanceOf(blueprint.name));
}
if (typeof blueprint == "string") {
if (this.typeOf(blueprint.toLowerCase())) {
return true;
}
if (entity === null || typeof entity == "undefined") {
return false;
}
if (typeof entity == "function" && entity.name === blueprint) {
return true;
}
do {
if (
typeof entity == "function" &&
entity.name === blueprint ||
typeof entity.constructor == "function" &&
entity.constructor.name === blueprint)
{
return true;
}
} while (entity = (0, _getPrototypeOf2.default)(entity));
/*;
@note:
If you removed the condition, this may cause unwanted behavior.
@end-note
*/
if (this.constructor.name != blueprint) {
var _entity = this;
do {
if (
typeof _entity == "function" &&
_entity.name === blueprint ||
typeof _entity.constructor == "function" &&
_entity.constructor.name === blueprint)
{
return true;
}
} while (_entity = (0, _getPrototypeOf2.default)(_entity));
}
return false;
}
return false;
}
/*;
@note:
This is the generic stringify function,
for complex entity you need to override this.
@end-note
*/ }, { key: "stringify", value: function stringify()
{
try {
if (this.getType() == "object") {
return (0, _stringify2.default)(this.valueOf());
}
return EMPTY_STRING + this.valueOf();
} catch (error) {
try {
return this.valueOf().toString();
} catch (error) {
return this.toString();
}
}
}
/*;
@method-documentation:
This will call the static deserialization procedure of the constructor.
@end-method-documentation
*/ }, { key: "deserialize", value: function deserialize(
data, parser, blueprint) {
/*;
@meta-configuration:
{
"data": "*",
"parser": "function",
"blueprint": "function"
}
@end-meta-configuration
*/
var procedure = Meta.deserialize;
if (
typeof this.constructor == "function" &&
typeof this.constructor.deserialize == "function" &&
this.constructor.deserialize.name === "deserialize")
{
procedure = this.constructor.deserialize;
}
if (arguments.length == 2) {
return procedure(this.valueOf(), arguments[0], arguments[1]);
} else {
return procedure(data, parser, blueprint);
}
}
/*;
@static-method-documentation:
Default generic serialization interpreter.
@end-static-method-documentation
*/ }, { key: "serialize",
/*;
@method-documentation:
Returns a tag format with value.
The value must be a data URL format.
The interpreter function will accept a context parameter.
By default this will serialize the entity using plain/text base64 data URL format.
The interpreter must return a serialize format of the data to be placed on the tag.
@end-method-documentation
*/value: function serialize(
interpreter) {
/*;
@meta-configuration:
{
"interpreter": "function"
}
@end-meta-configuration
*/
var defer = Meta.interpreter;
if (typeof interpreter != "function") {
interpreter = defer;
}
try {
return this.tag(interpreter(this));
} catch (error) {
return this.tag(defer(this));
}
}
/*;
@method-documentation:
Strict value equality.
@end-method-documentation
@note:
Override for deep checking.
@end-note
*/ }, { key: "isEqual", value: function isEqual(
entity) {
/*;
@meta-configuration:
{
"entity:required": "*"
}
@end-meta-configuration
*/
if (entity instanceof Meta) {
return this.valueOf() === entity.valueOf();
}
return this.valueOf() === entity;
}
/*;
@method-documentation:
When the deserialization fails, or if there is error, this method returns true.
@end-method-documentation
*/ }, { key: "isCorrupted", value: function isCorrupted()
{
return (
this[CORRUPTED] === CORRUPTED ||
this.hasError());
} }, { key: "isTagged", value: function isTagged()
{
return (
this[TAGGED] === TAGGED ||
TAG_PATTERN.test(this.stringify()));
}
/*;
@method-documentation:
If the entity is not a tag format then it's raw.
@end-method-documentation
*/ }, { key: "isRaw", value: function isRaw()
{
return !this.isTagged();
} }, { key: "setError", value: function setError(
error) {
if (error instanceof Error) {
this.pushError(error);
}
return this;
} }, { key: "pushError", value: function pushError(
error) {
if (error instanceof Error) {
this[ERROR].push(error);
}
return this;
} }, { key: "getError", value: function getError()
{
return this[ERROR].reverse()[0];
} }, { key: "hasError", value: function hasError()
{
return this[ERROR].length > 0;
} }, { key: "transferError", value: function transferError(
container) {
/*;
@meta-configuration:
{
"container": Array
}
@end-meta-configuration
*/
if (container instanceof Array) {
var list = this[ERROR].reverse();
var index = list.length;
while (index--) {container.push(list[index]);}
}
return this;
}
/*;
@method-documentation:
Returns the clone of this data.
@end-method-documentation
*/ }, { key: "clone", value: function clone(
state) {
/*;
@meta-configuration:
{
"state": Array
}
@end-meta-configuration
*/
return Meta.create(this.constructor, this.valueOf(), state);
}
/*;
@method-documentation:
Returns the Meta instance of this data.
@end-method-documentation
*/ }, { key: "native", value: function native(
state) {
/*;
@meta-configuration:
{
"state": Array
}
@end-meta-configuration
*/
return Meta.create(Meta, this.valueOf(), state);
}
/*;
@method-documentation:
Reverts to the Meta instance of this data,
passing the incurred state from previous.
@end-method-documentation
*/ }, { key: "revert", value: function revert()
{
var state = [];
if (this.isCorrupted()) {
state.push(CORRUPTED);
}
if (this.hasError()) {
this.transferError(state);
}
return this.native(state);
} }, { key: "getType", value: function getType()
{
return this[TYPE];
} }, { key: "getName", value: function getName()
{
return this[NAME];
} }, { key: _toStringTag2.default, get: function get() {return this.getName();} /*;
@method-documentation:
Generally, this will return the basic object meta specification.
The format property dictates how the value must be interpreted.
@end-method-documentation
@note:
For special values that needs specific conversion to object type,
this method needs to be overridden.
@end-note
*/ }, { key: OBJECT, get: function get() {return (0, _freeze2.default)({ "type": this.getType(), "name": this.getName(), "value": this.serialize(), "format": DATA_URL_TAG });} }, { key: BOOLEAN, get: function get() {return true;} }, { key: STRING, get: function get() {return Object.prototype.toString.call(this.valueOf());} }, { key: NUMBER, get: function get() {return Infinity;} /*;
@get-method-documentation:
Returns the original value.
As much as possible do not override this.
@end-get-method-documentation
*/ }, { key: VALUE, get: function get() {return this[ENTITY];} }], [{ key: "interpreter", value: function interpreter(self) {/*;
@meta-configuration:
{
"self": Meta
}
@end-meta-configuration
*/var value = sxty4(self.stringify()).encode();return "" + DEFAULT_DATA_URL_PREFIX.replace("@type", self.getType()) + value;} }]);return Meta;}();harden("NAME", NAME, Meta);harden("ENTITY", ENTITY, Meta);harden("TYPE", TYPE, Meta);harden("OBJECT", OBJECT, Meta);harden("BOOLEAN", BOOLEAN, Meta);harden("STRING", STRING, Meta);harden("NUMBER", NUMBER, Meta);harden("VALUE", VALUE, Meta);harden("GARBAGE", GARBAGE, Meta);harden("CORRUPTED", CORRUPTED, Meta);harden("TAGGED", TAGGED, Meta);harden("TAG_PATTERN", TAG_PATTERN, Meta);harden("DATA_URL_TAG", DATA_URL_TAG, Meta);
module.exports = Meta;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1ldGEuc3VwcG9ydC5qcyJdLCJuYW1lcyI6WyJoYXJkZW4iLCJyZXF1aXJlIiwic3h0eTQiLCJOQU1FIiwiRU5USVRZIiwiVFlQRSIsIkVSUk9SIiwiT0JKRUNUIiwiQk9PTEVBTiIsIlNUUklORyIsIk5VTUJFUiIsIlZBTFVFIiwiR0FSQkFHRSIsIkNPUlJVUFRFRCIsIlRBR0dFRCIsIkFSR1VNRU5UU19QQVRURVJOIiwiQ0xBU1NfTkFNRV9QQVRURVJOIiwiREFUQV9VUkxfUEFUVEVSTiIsIkVWQUxfVVNBR0VfUEFUVEVSTiIsIkZVTkNUSU9OX0NMQVNTX1VTQUdFX1BBVFRFUk4iLCJGTE9BVF9OVU1CRVJfUEFUVEVSTiIsIlNZTUJPTF9QQVRURVJOIiwiVEFHX1BBVFRFUk4iLCJEQVRBX1VSTF9UQUciLCJERUZBVUxUX0ZPUk1BVCIsIkRFRkFVTFRfREFUQV9VUkxfUFJFRklYIiwiRU1QVFlfU1RSSU5HIiwiTWV0YSIsImluc3RhbmNlIiwiaW5zdGFuY2VPZiIsImJsdWVwcmludCIsIm5hbWUiLCJjb25zdHJ1Y3RvciIsIl9faW5pdGlhbGl6ZV9fIiwiZXJyb3IiLCJlbnRpdHkiLCJzdGF0ZSIsImFyZ3VtZW50cyIsImxlbmd0aCIsInVuZGVmaW5lZCIsInB1c2giLCJFcnJvciIsImRhdGEiLCJ0ZXN0Iiwic3RyaW5naWZ5IiwiaW5kZXgiLCJzdGF0dXMiLCJzZXRFcnJvciIsInN0YWNrIiwiY3JlYXRlIiwidG9rZW4iLCJtYXRjaCIsInR5cGUiLCJ2YWx1ZSIsInJlcGxhY2UiLCJkZWNvZGUiLCJ0b0xvd2VyQ2FzZSIsIm1ldGhvZCIsIkZ1bmN0aW9uIiwiSW5maW5pdHkiLCJOYU4iLCJwYXJzZUZsb2F0IiwicGFyc2VJbnQiLCJKU09OIiwicGFyc2UiLCJmb3JtYXQiLCJkZXNlcmlhbGl6ZSIsInZhbHVlT2YiLCJzeW1ib2wiLCJ0cmltIiwicGFyc2VyIiwiX19kZXNlcmlhbGl6ZURlZmVyX18iLCJkZWZlciIsInBhcmFtZXRlciIsImFyZ3VtZW50Iiwic2xpY2UiLCJmaWx0ZXIiLCJjb25jYXQiLCJ0YWciLCJjaGVjayIsInRvVXBwZXJDYXNlIiwidG9TdHJpbmciLCJ0b051bWJlciIsInRvQm9vbGVhbiIsImdldFR5cGUiLCJnZXROYW1lIiwidHlwZU9mIiwicHJvY2VkdXJlIiwiaW50ZXJwcmV0ZXIiLCJoYXNFcnJvciIsImlzVGFnZ2VkIiwicHVzaEVycm9yIiwicmV2ZXJzZSIsImNvbnRhaW5lciIsIkFycmF5IiwibGlzdCIsImlzQ29ycnVwdGVkIiwidHJhbnNmZXJFcnJvciIsIm5hdGl2ZSIsInNlcmlhbGl6ZSIsIk9iamVjdCIsInByb3RvdHlwZSIsImNhbGwiLCJzZWxmIiwiZW5jb2RlIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6IkFBQUE7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1REEsSUFBTUEsU0FBU0MsUUFBUyxRQUFULENBQWY7QUFDQSxJQUFNQyxRQUFRRCxRQUFTLE9BQVQsQ0FBZDs7QUFFQSxJQUFNRSxPQUFPLHNCQUFRLE1BQVIsQ0FBYjtBQUNBLElBQU1DLFNBQVMsc0JBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUMsT0FBTyxzQkFBUSxNQUFSLENBQWI7O0FBRUEsSUFBTUMsUUFBUSxzQkFBUSxPQUFSLENBQWQ7O0FBRUEsSUFBTUMsU0FBUyxzQkFBUSxRQUFSLENBQWY7QUFDQSxJQUFNQyxVQUFVLHNCQUFRLFNBQVIsQ0FBaEI7QUFDQSxJQUFNQyxTQUFTLHNCQUFRLFFBQVIsQ0FBZjtBQUNBLElBQU1DLFNBQVMsc0JBQVEsUUFBUixDQUFmO0FBQ0EsSUFBTUMsUUFBUSxzQkFBUSxPQUFSLENBQWQ7O0FBRUEsSUFBTUMsVUFBVSxzQkFBUSxTQUFSLENBQWhCO0FBQ0EsSUFBTUMsWUFBWSxzQkFBUSxXQUFSLENBQWxCO0FBQ0EsSUFBTUMsU0FBUyxzQkFBUSxRQUFSLENBQWY7O0FBRUEsSUFBTUMsb0JBQW9CLHdCQUExQjtBQUNBLElBQU1D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