Generate C header for Swift data types

by
4 views 356139a0...

Description

iOS only, requires pycparser for Python 3 -- for details, see https://github.com/maltek/swift-frida/tree/master/examples/c_header_gen

How to Use

Download the script and run it with Frida CLI:

Download Script

Then run with Frida:

frida -U -f YOUR_PACKAGE_NAME -l generate-c-header-for-swift-data-types.js

Replace YOUR_PACKAGE_NAME with the target app's package name.

Source Code

JavaScript
#!/usr/bin/env python3

import json
import os.path
import sys
from subprocess import run
from tempfile import NamedTemporaryFile

import frida

from pycparser.c_ast import Decl, Enum, Enumerator, IdentifierType, PtrDecl, Struct, TypeDecl, Typedef
from pycparser.c_generator import CGenerator
from pycparser.c_parser import CParser

dev = next(iter(dev for dev in frida.enumerate_devices() if dev.type == 'tether'))
session = dev.attach(sys.argv[1])
script = session.create_script(r"""(function(){function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}return e})()({1:[function(require,module,exports){
"use strict";

/* jshint esnext: true, evil: true */

var _set = require("babel-runtime/core-js/set");

var _set2 = _interopRequireDefault(_set);

var _getIterator2 = require("babel-runtime/core-js/get-iterator");

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _log = require("babel-runtime/core-js/math/log2");

var _log2 = _interopRequireDefault(_log);

var _map2 = require("babel-runtime/core-js/map");

var _map3 = _interopRequireDefault(_map2);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var convention = void 0;
if (Process.arch === "arm64" && Process.platform === "darwin") {
    // see swift-llvm/lib/Target/AArch64/AArch64CallingConvention.td
    convention = {
        selfRegister: 'x20',
        errorRegister: 'x21',
        indirectResultRegister: 'x8',
        maxInlineArgument: 128, // TODO: the optional string arg for dump() is much larger and inline!
        maxInlineReturn: 4 * Process.pointerSize, // see shouldPassIndirectlyForSwift in swift-llvm/lib/CodeGen/TargetInfo.cpp
        firstArgRegister: 'x0',
        maxVoluntaryInt: Process.pointerSize,
        maxInt: 8,
        maxIntAlignment: 8
    };
} else if (Process.arch === "arm" && Process.platform === "darwin") {
    // see swift-llvm/lib/Target/ARM/ARMCallingConv.td
    convention = {
        selfRegister: 'r10',
        errorRegister: 'r8',
        indirectResultRegister: undefined, // first argument, not a special register
        maxInlineArgument: 64, // TODO: watchOS uses 128
        maxInlineReturn: 4 * Process.pointerSize, // see shouldPassIndirectlyForSwift in swift-llvm/lib/CodeGen/TargetInfo.cpp
        firstArgRegister: 'r0',
        maxVoluntaryInt: Process.pointerSize,
        maxInt: 8,
        maxIntAlignment: 4
    };
} else {
    throw new Error("unknown platform");
}
//convention.freeze();

var errors = new _map3.default();

var storeError = new NativeCallback(function storeError() {
    errors.set(Process.getCurrentThreadId(), callStack);
}, 'void', ['pointer']);
function checkTrampolineError() {
    var id = Process.getCurrentThreadId();
    var val = errors.get(id, callStack);
    errors.remove(id);
    return val;
}

function makeCallTrampoline(func, withError, self, indirectResult) {
    if (!withError && !self && !indirectResult) return { callAddr: func };

    var buf = Memory.alloc(Process.pageSize);
    var wr = void 0,
        putBlxImm = void 0;
    if (Process.arch === "arm64") {
        wr = new Arm64Writer(buf);
        putBlxImm = 'putBlImm';
    } else {
        wr = new ThumbWriter(buf);
        putBlxImm = 'putBlxImm';
    }

    if (withError) wr.putLdrRegAddress(convention.errorRegister, ptr(0));
    // TODO: we should read the value for 'self' from a global/thread-local variable
    // that way, we don't need to regenerate this function for every call
    if (self) wr.putLdrRegAddress(convention.selfRegister, self);
    if (indirectResult) {
        if (!convention.indirectResultRegister) throw new Error("only provide the indirect result pointer on platforms with a specific register for it!");
        wr.putLdrRegAddress(convention.indirectResultRegister, indirectResult);
    }

    if (withError) {
        wr[putBlxImm](func);

        if (Process.arch === "arm64") wr.putTstRegImm(convention.errorRegister, ptr(0));else wr.putCmpRegImm(convention.errorRegister, ptr(0));

        wr.putBCondLabel('ne', 'err_case');
        wr.putRet(); // return if no error

        wr.putLabel('err_case');
        wr.putMovRegReg(convention.firstArgRegister, convention.errorRegister);
        wr[putBlxImm](storeError);
        wr.putRet();
    } else {
        wr.putBImm(func);
    }

    wr.flush();
    wr.dispose();

    Memory.protect(buf, Process.pageSize, 'r-x');
    var callAddr = void 0;
    if (Process.arch === "arm64") callAddr = buf;else callAddr = buf.or(ptr(1));
    return {
        'callAddr': callAddr,
        '_buf': buf
    };
};

function semanticLowering(signature) {
    function typeNeedsIndirection(t) {
        // TODO: generic arguments are also indirect (but we don't have any way to represent generic types yet)
        // TODO: value types containing generic arguments are also indirect
        // TODO: resilient value types are also indirect
        return t.kind === "Existential";
    }
    function addArg(type, indirect, ownership, target, special) {
        if (!indirect && type.kind === "Tuple") {
            type.tupleElements().forEach(function (e) {
                return addArg(e.type, indirect, ownership, target, special);
            });
        } else {
            indirect = indirect || typeNeedsIndirection(type);
            target.push({ type: type, indirect: indirect, ownership: ownership, special: special });
        }
    }

    var args = [];
    var swiftArgs = signature.getArguments();
    for (var i = 0; i < swiftArgs.length; i++) {
        var indirect = swiftArgs[i].inout;
        var isSelf = i === 0 && false; // TODO
        addArg(swiftArgs[i].type, indirect, args, indirect ? "keep" : "transfer", isSelf ? "self" : null);
    }

    var rets = [];
    addArg(signature.returnType, false, "return_take", rets, null);
    if (signature.flags.doesThrow) {
        addArg(Swift._typesByName.get("Swift.Error"), true, "return_take", rets, "error");
    }

    return { args: args, rets: rets };
}
function physicalLowering(semantic) {
    var legalTypesAndOffsets = [];
    var specialCases = [];

    var pointerType = "int" + Process.pointerSize * 8;
    function nextPowerOf2(val) {
        return Math.pow(2, Math.ceil((0, _log2.default)(val)));
    }
    function minimalInt(numValues) {
        var log2 = Math.ceil((0, _log2.default)(numValues));
        var nextMultipleOf8 = 8 + log2 - log2 % 8;
        return nextPowerOf2(nextMultipleOf8);
    }
    function addEmpty(start, end, res) {
        res.push(["empty", start, end]);
    }

    function addSwiftType(type, offset, res) {
        if (res === undefined) res = [];

        switch (type.kind) {
            case "Class":
            case "ObjCClassWrapper":
            case "ForeignClass":
            case "Metatype":
            case "Existential":
                res.push([pointer, offset, offset + Process.pointerSize]);
                break;
            case "Struct":
                {
                    var prevEnd = offset;
                    type.fields().forEach(function (f) {
                        var offs = offset + f.offset;

                        if (prevEnd < offs) addEmpty(prevEnd, offs, res);

                        if (f.weak) {
                            res.push([pointer, offs, offs + Process.pointerSize]);
                            prevEnd = offs + Process.pointerSize;
                        } else {
                            addSwiftType(f.type, offs, res);
                            prevEnd = offs + f.type.canonicalType.valueWitnessTable.size;
                        }
                    });
                    var end = offset + type.canonicalType.valueWitnessTable.size;
                    if (prevEnd < end) addEmpty(prevEnd, offs, res);
                    break;
                }
            case "Tuple":
                {
                    var _prevEnd = offset;
                    type.tupleElements().forEach(function (e) {
                        var offs = offset + e.offset;
                        if (_prevEnd < offs) addEmpty(_prevEnd, offs, res);

                        addSwiftType(e.type, offs, res);
                        _prevEnd = offs + e.type.canonicalType.valueWitnessTable.size;
                    });
                    var _end = offset + type.canonicalType.valueWitnessTable.size;
                    if (_prevEnd < _end) addEmpty(_prevEnd, offs, res);
                    break;
                }
            case "ErrorObject":
            case "ExistentialMetatype":
            case "Function":
                throw new Error("conversion to legal type for types of '" + type.kind + "' not yet implemented"); // TODO
            case "Optional":
            case "Enum":
                {
                    var numPayloads = type.nominalType.enum_.getNumPayloadCases();
                    var numEmpty = type.nominalType.enum_.getNumEmptyCases();
                    var enumSize = type.canonicalType.valueWitnessTable.size;
                    if (numPayloads === 0) {
                        // C-like enum
                        res.push(["int" + enumSize * 8, offset, offset + enumSize]);
                    } else if (numPayloads === 1) {
                        // single-payload enum
                        var payloadType = type.enumCases()[0].type;
                        addSwiftType(payloadType, offset, res); // payload is always at the beginning, possibly followed by discriminant
                        var payloadVwt = payloadType.canonicalType.valueWitnessTable;
                        var extraInhabitants = payloadVwt.extraInhabitantFlags.getNumExtraInhabitants();
                        if (extraInhabitants < numEmpty) {
                            // there is a tag at the end
                            var tagSize = minimalInt(numEmpty + numPayloads);
                            var _offs = offset + payloadVwt.size;
                            // TODO: verify that the tag does not get padded for alignment
                            res.push(["int" + tagSize, _offs, _offs + tagSize]);
                        } else {
                            // no tag
                            res.push(["opaque", offset, offset + enumSize]);
                        }
                    } else {
                        // multi-payload enum

                        // We can't use metadata to figure out whether the payload cases have enough overlapping
                        // spare bits.
                        // We can approximate by comparing the size of the largest payload with the size of the enum.
                        var enumCases = type.enumCases();
                        var largestSize = enumCases.reduce(function (s, c) {
                            if (c.type) return Math.max(s, c.type.canonicalType.valueWitnessTable.size);else return s;
                        }, 0);

                        // primary tag
                        if (enumSize > largestSize) {
                            res.push(["opaque", offset + largestSize, offset + enumSize]);
                        }

                        // payloads
                        for (var i = 0; i < enumCases.length; i++) {
                            if (enumCases[i].type) {
                                addSwiftType(enumCases[i].type, offset, res);
                            }
                        }

                        // secondary tag for the non-payload cases
                        if (numEmpty > 1) {
                            var _tagSize = minimalInt(numEmpty);
                            res.push(["opaque", offset, offset + _tagSize]);
                        }
                    }
                    break;
                }
            case "Opaque":
                {
                    var t = type.getCType();
                    if (t === undefined) throw new Error("the equivalent C type for type '" + type + "' is not known.");
                    if (t === "pointer") t = pointerType;
                    if (t.startsWith("uint")) t = t.slice(1);
                    if (t.startsWith("int") && parseInt(t.slice(3)) > convention.maxInt) t = "opaque";
                    container.push([t, offset]);
                    break;
                }
            default:
                throw new Error("type '" + type + "' is of unknown kind '" + type.kind + "'");
        }
    }

    for (var i = 0; i < semantic.length; i++) {
        if (semantic[i].special) {
            specialCases.push(semantic[i].special);
            continue;
        }

        if (semantic[i].indirect) legalTypesAndOffsets.push([pointerType, 0, Process.pointerSize]);else legalTypesAndOffsets.push(addSwiftType(semantic[i].type, 0));
    }

    function combineAdjacent() {
        var maps = {
            empty: new _map3.default(),
            opaque: new _map3.default()
        };
        for (var _i = 0; _i < legalTypesAndOffsets.length; _i++) {
            var legalType = legalTypesAndOffsets[_i][0];
            var map = maps[legalType];
            if (map === undefined) continue;
            for (var j = legalTypesAndOffsets[_i][1]; j < legalTypesAndOffsets[_i][2]; j++) {
                if (map.has(j)) {
                    var other = map.get(j);
                    var start = Math.min(legalTypesAndOffsets[_i][1], legalTypesAndOffsets[other][1]);
                    var end = Math.max(legalTypesAndOffsets[_i][2], legalTypesAndOffsets[other][2]);

                    for (var k = legalTypesAndOffsets[other][1]; k < legalTypesAndOffsets[other][1]; k++) {
                        map.delete(k);
                    }

                    legalTypesAndOffsets[other][1] = start;
                    legalTypesAndOffsets[other][2] = end;
                    _i = other - 1; // restart looking for other matches with the new bounds
                    break;
                } else {
                    map.set(j, _i);
                }
            }
        }
    }
    combineAdjacent();

    // find overlapped non-empty memory regions
    var indicesByOffset = new _map3.default();
    for (var _i2 = 0; _i2 < legalTypesAndOffsets.length; _i2++) {
        for (var j = legalTypesAndOffsets[_i2][1]; j < legalTypesAndOffsets[_i2][2]; j++) {
            if (!indicesByOffset.has(j)) indicesByOffset.set(j, []);
            indicesByOffset.get(j).push(_i2);
        }
    }
    // merge overlapped non-empty memory regions
    for (var _iterator = indicesByOffset.entries(), _isArray = Array.isArray(_iterator), _i3 = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
        var _ref;

        if (_isArray) {
            if (_i3 >= _iterator.length) break;
            _ref = _iterator[_i3++];
        } else {
            _i3 = _iterator.next();
            if (_i3.done) break;
            _ref = _i3.value;
        }

        var _ref4 = _ref,
            offset = _ref4[0],
            indices = _ref4[1];

        if (indices.length <= 1) continue;

        for (var _i10 = 1; _i10 < indices.length; _i10++) {
            var t0 = legalTypesAndOffsets[indices[_i10 - 1]];
            var t1 = legalTypesAndOffsets[indices[_i10]];
            if (t0[0] === t1[0]) continue;

            t0[0] = t1[0] = "opaque";
        }
    }

    combineAdjacent();

    // end of typed layout

    /* legal type sequence */

    // change types to opaque when their values have wrong alignment
    for (var _i4 = 0; _i4 < legalTypesAndOffsets.length; _i4++) {
        if (legalTypesAndOffsets[_i4][0] === "empty" || legalTypesAndOffsets[_i4][0] === "opaque") continue;

        var naturalAlignment = void 0;
        var size = legalTypesAndOffsets[_i4][2] - legalTypesAndOffsets[_i4][1];
        if (legalTypesAndOffsets[_i4][0].startsWith("int")) {
            naturalAlignment = Math.min(size, convention.maxVoluntaryInt);
        } else {
            naturalAlignment = size;
        }
        if (legalTypesAndOffsets[_i4][1] % naturalAlignment !== 0) {
            legalTypesAndOffsets[_i4][0] = "opaque";
        }
    }
    combineAdjacent();

    for (var _i5 = 0; _i5 < legalTypesAndOffsets.length; _i5++) {
        var _size = legalTypesAndOffsets[_i5][2] - legalTypesAndOffsets[_i5][1];
        if (legalTypesAndOffsets[_i5][0].startsWith("int") && _size <= convention.maxVoluntaryInt) legalTypesAndOffsets[_i5][0] = "opaque";
    }
    combineAdjacent();

    combineAdjacent = undefined; // make sure we don't combine anything below this point.
    // split opaque values at maximal aligned storage units
    for (var _i6 = 0; _i6 < legalTypesAndOffsets.length; _i6++) {
        if (legalTypesAndOffsets[_i6][0] !== "opaque") continue;
        var start = legalTypesAndOffsets[_i6][1];
        var end = legalTypesAndOffsets[_i6][2];
        var nextBoundary = start - start % convention.maxVoluntaryInt + convention.maxVoluntaryInt;
        while (nextBoundary < end - end % convention.maxVoluntaryInt) {
            legalTypesAndOffsets.push(["opaque", start, nextBoundary]);
            start = nextBoundary;
            nextBoundary += convention.maxVoluntaryInt;
        }
        legalTypesAndOffsets[_i6][1] = start;
    }
    // turn opaques into integers
    var perStorageUnit = new _map3.default();
    var lastStorageUnit = 0;
    for (var _i7 = 0; _i7 < legalTypesAndOffsets.length; _i7++) {
        if (legalTypesAndOffsets[_i7][0] !== "opaque") continue;
        var _start = legalTypesAndOffsets[_i7][1];
        var storageUnit = (_start - _start % convention.maxVoluntaryInt) / convention.maxVoluntaryInt;
        if (!perStorageUnit.has(storageUnit)) perStorageUnit.set(storageUnit, []);
        perStorageUnit.get(storageUnit).push(_i7);
        lastStorageUnit = Math.max(lastStorageUnit, storageUnit);
    }
    var toRemove = [];
    for (var _iterator2 = perStorageUnit.values(), _isArray2 = Array.isArray(_iterator2), _i8 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
        var _ref2;

        if (_isArray2) {
            if (_i8 >= _iterator2.length) break;
            _ref2 = _iterator2[_i8++];
        } else {
            _i8 = _iterator2.next();
            if (_i8.done) break;
            _ref2 = _i8.value;
        }

        var sharedUnit = _ref2;

        var _start2 = Number.POSITIVE_INFINITY;
        var _end2 = Number.NEGATIVE_INFINITY;
        for (var _iterator4 = sharedUnit, _isArray4 = Array.isArray(_iterator4), _i11 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
            var _ref5;

            if (_isArray4) {
                if (_i11 >= _iterator4.length) break;
                _ref5 = _iterator4[_i11++];
            } else {
                _i11 = _iterator4.next();
                if (_i11.done) break;
                _ref5 = _i11.value;
            }

            var _i12 = _ref5;

            _start2 = Math.min(legalTypesAndOffsets[_i12][1], _start2);
            _end2 = Math.max(legalTypesAndOffsets[_i12][2], _end2);
        }
        // remove all but one of the opaque values in this storage unit
        toRemove = toRemove.concat(sharedUnit.slice(1));

        var _size2 = void 0;
        for (_size2 = 1; _start2 + _size2 < _end2; _size2 *= 2) {}
        var newStart = _start2 & ~(_size2 - 1);
        if (newStart != _start2) _size2 *= 2;

        var newEnd = newStart + _size2;
        legalTypesAndOffsets[sharedUnit[0]] = ["int" + (_size2 * 8).toString(), newStart, newEnd];
    }
    toRemove.sort().reverse();
    for (var _iterator3 = toRemove, _isArray3 = Array.isArray(_iterator3), _i9 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
        var _ref3;

        if (_isArray3) {
            if (_i9 >= _iterator3.length) break;
            _ref3 = _iterator3[_i9++];
        } else {
            _i9 = _iterator3.next();
            if (_i9.done) break;
            _ref3 = _i9.value;
        }

        var _i13 = _ref3;

        legalTypesAndOffsets.splice(_i13, 1);
    }

    legalTypesAndOffsets.sort(function (a, b) {
        return a[1] - b[1];
    });

    return legalTypesAndOffsets;
}

function convertToCParams(signature) {
    var _semanticLowering = semanticLowering(signature),
        semanticArgs = _semanticLowering[0],
        semanticRets = _semanticLowering[1];

    var _map = [semanticArgs, semanticRets].map(physicalLowering),
        physicalArgs = _map[0],
        physicalRets = _map[1];

    // TODO: for generic functions, generic arguments are always passed indirectly, and arguments with the
    // type metadata of those arguments are added at the end of the arg list


    var lowered = [];
    var argInfos = [];

    // expand tuples into their components
    var argTypes = [];
    for (var i = 0; i < method.args.length; i++) {
        var elem = toCheck.shift();
        if (elem.kind === "Tuple") {
            toCheck = elem.elements.map(function (e) {
                return e.type;
            }).concat(toCheck);
        } else {
            argTypes.push(elem);
        }
    }

    // see NativeConventionSchema::getCoercionTypes
    for (var _i14 = 0; _i14 < params.length; _i14++) {
        // TODO: floats/doubles, vectors
        // see classifyArgumentType in swift-clang/lib/CodeGen/TargetInfo.cpp
        var type = method.args[_i14].type;
        var lowering = getLowering(params[_i14]);
        var vwt = type.canonicalType.valueWitnessTable;
        if (vwt.size === 0) // ignore zero-sized types
            continue;

        if (method.args[_i14].inout || vwt.flags.IsNonBitwiseTakable || vwt.size > CC.maxInlineArgument) {
            lowered.push({ size: Process.pointerSize, stride: Process.pointerSize, indirect: true });
        } else {
            lowered.push({ size: vwt.size, stride: vwt.stride, indirect: false });
        }
    }

    // see SwiftAggLowering::finish
    var remainingSpace = 0;
    for (var _i15 = 0; _i15 < lowered.length; _i15++) {}

    var indirectReturn = false;
    var cReturnType = 'void';
    if (method.returnType) {
        var _vwt = method.returnType.valueWitnessTable;
        // TODO: verify these are the right conditions for indirect returns
        if (_vwt.size > CC.maxInlineReturn || _vwt.flags.IsNonPOD) {
            indirectReturn = true;
            lowered.unshift({ size: Process.pointerSize, stride: Process.pointerSize, indirect: true });
        } else {
            var alignedSize = _vwt.size;
            var remaining = 0;
            cReturnType = [];
            var _arr = [8, 4, 2, 1];
            for (var _i16 = 0; _i16 < _arr.length; _i16++) {
                var size = _arr[_i16];
                // TODO: specify larger integers for int types larger than pointers
                while (size <= convention.maxVoluntaryInt && alignedSize > 0 && alignedSize % size === 0) {
                    // TODO: floats/doubles, vectors
                    cReturnType.push('uint' + (size * 8).toString());
                    alignedSize -= size;
                }
            }
        }
    }

    var overlappedWithSuccessor = new _set2.default();
    for (var _i17 = 0; _i17 < params.length; _i17++) {}

    var cParams = [],
        cArgTypes = [];
    for (var _i18 = 0; _i18 < params.length; _i18++) {}

    return { cParams: cParams, lowered: lowered };
}

module.exports = {
    convention: convention,
    makeCallTrampoline: makeCallTrampoline,
    checkTrampolineError: checkTrampolineError
};

},{"babel-runtime/core-js/get-iterator":8,"babel-runtime/core-js/map":10,"babel-runtime/core-js/math/log2":11,"babel-runtime/core-js/set":22}],2:[function(require,module,exports){
'use strict';

var _stringify = require('babel-runtime/core-js/json/stringify');

var _stringify2 = _interopRequireDefault(_stringify);

var _getIterator2 = require('babel-runtime/core-js/get-iterator');

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _keys = require('babel-runtime/core-js/object/keys');

var _keys2 = _interopRequireDefault(_keys);

var _typeof2 = require('babel-runtime/helpers/typeof');

var _typeof3 = _interopRequireDefault(_typeof2);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

require('../../loader');

function makeJsonCompat(obj) {
    switch (typeof obj === 'undefined' ? 'undefined' : (0, _typeof3.default)(obj)) {
        case "number":
        case "string":
        case "boolean":
        case "undefined":
            return obj;
    }
    if (obj === null) return null;
    if (obj instanceof NativePointer || obj instanceof Int64 || obj instanceof UInt64) return obj.toString();

    // use type names in place of type objects
    var res = obj instanceof Array ? [] : {};
    for (var _iterator = (0, _keys2.default)(obj), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
        var _ref;

        if (_isArray) {
            if (_i >= _iterator.length) break;
            _ref = _iterator[_i++];
        } else {
            _i = _iterator.next();
            if (_i.done) break;
            _ref = _i.value;
        }

        var prop = _ref;

        if (["canonicalType", "nominalType", "getSize", "fixedName", "_name", "Type", "withoutClassBound", "getObjCObject", "withClassBound"].indexOf(prop) !== -1) continue;

        var val = obj[prop];

        // call through functions
        if (val instanceof Function && !("isGeneric" in val)) {
            if (val.length == 0) val = val.call(obj);else continue;
        }

        // replace type objects with their names
        if (val && typeof val === "function" && "isGeneric" in val) {
            val = val.toString();
        }

        res[prop] = makeJsonCompat(val);
    }
    return res;
}

rpc.exports = {
    run: function run() {
        var types = Swift.enumerateTypesSync();
        var out = {};
        types.forEach(function (t) {
            if (t.isGeneric()) return;

            out[t.toString()] = makeJsonCompat(t);
            if (t.kind === "Existential") out[t.toString()].witnessTableCount = t.canonicalType.flags.getNumWitnessTables();
            if (t.kind != "Class" || t.canonicalType.isTypeMetadata()) out[t.toString()].size = t.canonicalType.valueWitnessTable.size;else out[t.toString()].size = '0x' + Process.pointerSize.toString(16);
        });
        return (0, _stringify2.default)(out);
    },
    demangle: function demangle(str) {
        return Swift.isSwiftName(str) ? Swift.demangle(str) : str;
    },
    pointersize: function pointersize() {
        return Process.pointerSize;
    }
};

},{"../../loader":4,"babel-runtime/core-js/get-iterator":8,"babel-runtime/core-js/json/stringify":9,"babel-runtime/core-js/object/keys":17,"babel-runtime/helpers/typeof":25}],3:[function(require,module,exports){
"use strict";

/* jshint esnext: true, evil: true */

var _keys = require('babel-runtime/core-js/object/keys');

var _keys2 = _interopRequireDefault(_keys);

var _set = require('babel-runtime/core-js/set');

var _set2 = _interopRequireDefault(_set);

var _from = require('babel-runtime/core-js/array/from');

var _from2 = _interopRequireDefault(_from);

var _map = require('babel-runtime/core-js/map');

var _map2 = _interopRequireDefault(_map);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var metadata = require('./metadata');
var types = require('./types');
var mangling = require('./mangling');
var swiftValue = require('./swift-value');
var CC = require('./calling-convention').convention;

var Swift = void 0;
var _api = null;

var _leakedMemory = []; // some runtime functions take pointers that must remain valid forever

var size_t = Process.pointerSize === 8 ? 'uint64' : Process.pointerSize === 4 ? 'uint32' : "unsupported platform";

Swift = module.exports = {

    get available() {
        return Module.findBaseAddress("libswiftCore.dylib") !== null;
    },

    isSwiftName: function isSwiftName(symbol) {
        var name = symbol.name || symbol;
        return name.startsWith(mangling.MANGLING_PREFIX);
    },


    // like Interceptor.attach, but with type information, so you get nice wrappers around the Swift values
    /*hook(target, callbacks, signature) {
        let interceptorCallbacks = {};
        if ("onEnter" in callbacks) {
            interceptorCallbacks.onEnter = function(args) {
                callbacks.onEnter([]);
            };
        }
        if ("onLeave" in callbacks) {
            interceptorCallbacks.onLeave = function(retval) {
                callbacks.onLeave(null);
            };
        }
        Interceptor.attach(target, interceptorCallbacks);
    },*/

    _mangled: new _map2.default(),

    // does not actually mangle the name, only has a lookup table with all names that have been demangled earlier
    getMangled: function getMangled(name) {
        return this._mangled.get(name);
    },
    demangle: function demangle(name) {
        if (!Swift.isSwiftName(name)) throw new Error("function name '" + name + "' is not a mangled Swift function");

        var cStr = Memory.allocUtf8String(name);
        var demangled = this._api.swift_demangle(cStr, name.length, ptr(0), ptr(0), 0);
        var res = Memory.readUtf8String(demangled);
        if ("free" in this._api) this._api.free(demangled);

        this._mangled.set(res, name);

        return res;
    },


    _typesByName: null,
    enumerateTypesSync: function enumerateTypesSync() {
        var typesByName = types.findAllTypes(this._api);

        this._typesByName = typesByName;
        return (0, _from2.default)(typesByName.values());
    },
    makeTupleType: function makeTupleType(labels, innerTypes) {
        if (innerTypes.length != labels.length) throw new Error("labels array and innerTypes array need the same length!");
        var elements = innerTypes.length ? Memory.alloc(Process.pointerSize * innerTypes.length) : ptr(0);
        var labelsStr = Memory.allocUtf8String(labels.join(" ") + " ");
        for (var i = 0; i < innerTypes.length; i++) {
            Memory.writePointer(elements.add(i * Process.pointerSize), innerTypes[i].canonicalType._ptr);
        }
        var valueWitnesses = ptr(0);
        var pointer = this._api.swift_getTupleTypeMetadata(innerTypes.length, elements, labelsStr, valueWitnesses);
        var canonical = new metadata.TargetMetadata(pointer);

        if (canonical.labels.toString === labelsStr.toString()) _leakedMemory.push(labelsStr); // if the tuple type is new, we must not ever dealllocate this string

        return new types.Type(null, canonical);
    },
    makeFunctionType: function makeFunctionType(args, returnType, flags) {
        var data = Memory.alloc(Process.pointerSize * (2 + args.length));

        var writeFlags = ptr(args.length).and(metadata.TargetFunctionTypeFlags.NumArgumentsMask);
        if (flags && flags.doesThrow) writeFlags = writeFlags.or(ptr(metadata.TargetFunctionTypeFlags.ThrowsMask));
        if (flags && flags.convention) writeFlags = writeFlags.or(ptr(metadata.FunctionMetadataConvention[flags.convention] << metadata.TargetFunctionTypeFlags.ConventionShift));

        Memory.writePointer(data, writeFlags);

        for (var i = 0; i < args.length; i++) {
            var val = void 0;
            if ("canonicalType" in args[i]) val = args[i].canonicalType._ptr;else {
                val = args[i].type.canonicalType._ptr;
                if (args[i].inout) val = val.or(1);
            }
            Memory.writePointer(data.add((i + 1) * Process.pointerSize), val);
        }
        if (returnType === null) returnType = this.makeTupleType([], []); // Void
        Memory.writePointer(data.add((args.length + 1) * Process.pointerSize), returnType.canonicalType._ptr);

        var pointer = this._api.swift_getFunctionTypeMetadata(data);
        return new types.Type(null, new metadata.TargetMetadata(pointer));
    },


    // Create a new types.Type object, from a Metadata*.
    // The name is only used for opaque types (builtins).
    _typeFromCanonical: function _typeFromCanonical(pointer, name) {
        return new types.Type(null, new metadata.TargetMetadata(pointer), name);
    },


    get _api() {
        if (_api !== null) return _api;
        if (!this.available) return null;

        var temporaryApi = {};
        var pending = [{
            module: "libsystem_malloc.dylib",
            functions: {
                "free": ['void', ['pointer']]
            },
            // optionals are functions/variables that might not be available
            optionals: {
                "free": "leaks don't break functionality"
            }
        }, {
            module: "libmacho.dylib",
            functions: {
                "getsectiondata": ['pointer', ['pointer', 'pointer', 'pointer', 'pointer']]
            }
        }, {
            module: "libswiftFoundation.dylib",
            functions: {
                "_T0SS10FoundationE8EncodingV4utf8ACfau": ['pointer', []],
                "_T0s14StringProtocolP10FoundationsAARzSS5IndexVADRtzlE01cA0Says4Int8VGSgSSACE8EncodingV5using_tF": ['pointer', ['pointer', 'pointer', 'pointer']]
            }
        }, {
            module: "CoreFoundation",
            functions: {
                "CFGetRetainCount": ['long', ['pointer']]
            }
        }, {
            module: "Foundation",
            functions: {
                'objc_storeStrong': ['void', ['pointer', 'pointer']]
            }
        }, {
            // see https://github.com/apple/swift/blob/master/docs/Runtime.md
            module: "libswiftCore.dylib",
            variables: new _set2.default(["_T0SSs14StringProtocolsWP", // protocol witness table for Swift.String : Swift.StringProtocol in Swift
            "_T0SSs16TextOutputStreamsWP", // protocol witness table for Swift.String : Swift.TextOutputStream in Swift
            "_T0s19_emptyStringStorages6UInt32Vv", // Swift._emptyStringStorage
            "_swift_release"]),
            functions: {
                "swift_demangle": ['pointer', ['pointer', size_t, 'pointer', 'pointer', 'int32']],

                'swift_unknownRetain': ['void', ['pointer']],
                'swift_unknownRelease': ['void', ['pointer']],
                'swift_bridgeObjectRelease': ['void', ['pointer']],
                'swift_weakLoadStrong': ['pointer', ['pointer']],
                'swift_weakAssign': ['void', ['pointer', 'pointer']],
                'swift_release': ['void', ['pointer']],
                'swift_retain': ['void', ['pointer']],

                //'swift_allocObject': ['pointer', ['pointer', size_t, size_t]],
                //'swift_allocBox': [['pointer', 'pointer'], ['pointer']],
                //'swift_deallocBox': ['void', ['pointer']],
                'swift_projectBox': ['pointer', ['pointer']],
                'swift_stringFromUTF8InRawMemory': ['void', ['pointer', 'pointer', size_t]],

                "swift_getTupleTypeMetadata": ['pointer', [size_t, 'pointer', 'pointer', 'pointer']],
                "swift_getExistentialMetatypeMetadata": ['pointer', ['pointer']],
                "swift_getExistentialTypeMetadata": ['pointer', ['int8', 'pointer', size_t, 'pointer']],
                //'swift_getGenericMetadata': ['pointer', ['pointer', 'pointer']],
                "swift_getObjCClassMetadata": ['pointer', ['pointer']],
                "swift_getFunctionTypeMetadata": ['pointer', ['pointer']],
                "swift_getForeignTypeMetadata": ['pointer', ['pointer']],
                "swift_getMetatypeMetadata": ['pointer', ['pointer']],

                "swift_getEnumCaseSinglePayload": ['int', ['pointer', 'pointer', 'uint']],
                "swift_getEnumCaseMultiPayload": ['uint', ['pointer', 'pointer']],

                'swift_conformsToProtocol': ['pointer', ['pointer', 'pointer']],
                'swift_dynamicCast': ['bool', ['pointer', 'pointer', 'pointer', 'pointer', size_t]],
                "swift_getDynamicType": ['pointer', ['pointer', 'pointer', 'int8']],

                "swift_getTypeByName": ['pointer', ['pointer', size_t]],
                "swift_getTypeName": [['pointer', 'pointer'], ['pointer', 'uchar']],

                "_T0s4dumpxx_q_z2toSSSg4nameSi6indentSi8maxDepthSi0E5Itemsts16TextOutputStreamR_r0_lF": CC.indirectResultRegister === undefined ?
                // no special indirect result register: one more param for indirect result
                ['void', ['pointer', 'pointer', 'pointer', 'pointer', 'pointer', 'pointer', 'int', 'pointer', 'pointer', 'pointer', 'pointer', 'pointer', 'pointer']] :
                // indirect result register must be set by hook
                ['void', ['pointer', 'pointer', 'pointer', 'pointer', 'pointer', 'int', 'pointer', 'pointer', 'pointer', 'pointer', 'pointer', 'pointer']]

            }
        }];
        pending.forEach(function (api) {
            var functions = api.functions || {};
            var variables = api.variables || new _set2.default();
            var optionals = api.optionals || {};

            var exportByName = Module.enumerateExportsSync(api.module).reduce(function (result, exp) {
                result[exp.name] = exp;
                return result;
            }, {});

            (0, _keys2.default)(functions).forEach(function (name) {
                var exp = exportByName[name];
                if (exp !== undefined && exp.type === 'function') {
                    var signature = functions[name];
                    if (typeof signature === 'function') {
                        signature.call(temporaryApi, exp.address);
                    } else {
                        temporaryApi[name] = new NativeFunction(exp.address, signature[0], signature[1], signature[2]);
                    }
                } else if (!(name in optionals)) {
                    throw new Error('missing function \'' + name + '\' in module \'' + api.module);
                }
            });

            variables.forEach(function (name) {
                var exp = exportByName[name];
                if (exp !== undefined && exp.type === 'variable') {
                    temporaryApi[name] = exp.address;
                } else if (!(name in optionals)) {
                    throw new Error('missing variable \'' + name + '\' in module \'' + api.module);
                }
            });
        });

        _api = temporaryApi;
        return _api;
    }
};

},{"./calling-convention":1,"./mangling":5,"./metadata":6,"./swift-value":151,"./types":152,"babel-runtime/core-js/array/from":7,"babel-runtime/core-js/map":10,"babel-runtime/core-js/object/keys":17,"babel-runtime/core-js/set":22}],4:[function(require,module,exports){
(function (global){
'use strict';

// a simple script for manually loading `index.js` into Frida, as well as some test code

global._debug = true;
var Swift = require('./index');
var mangling = require('./mangling');
Object.defineProperty(global, 'Swift', {
    value: Swift,
    configurable: true,
    enumerable: true
});

//console.log(Swift.enumerateTypesSync().filter(x => x.toString().indexOf("Any") !== -1).join("\n"));
//var t = Swift._typesByName.get("Foo.ViewController"); var testVar = new t(Module.findExportByName("Foo", "_T04Foo7testVarAA14ViewControllerCSgv")); console.log(testVar.toString())

}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})

},{"./index":3,"./mangling":5}],5:[function(require,module,exports){
"use strict";

/* jshint esnext: true, evil: true */

module.exports = {
    MANGLING_PREFIX: "_T" // 'old' mangling -- Swift HEAD has switched to using "_S"
};

},{}],6:[function(require,module,exports){
"use strict";

/* jshint esnext: true, evil: true */

var _log = require('babel-runtime/core-js/math/log2');

var _log2 = _interopRequireDefault(_log);

var _create = require('babel-runtime/core-js/object/create');

var _create2 = _interopRequireDefault(_create);

var _getIterator2 = require('babel-runtime/core-js/get-iterator');

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _entries = require('babel-runtime/core-js/object/entries');

var _entries2 = _interopRequireDefault(_entries);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var mangling = require('./mangling');

// for all these definitions, look at include/swift/Runtime/Metadata.h and friends in the Swift sources
// based on commit 2035c311736d15c9ef1a7e2e42a925a6ddae098c

function flagsToObject(definition, value) {
    var res = {};
    for (var _iterator = (0, _entries2.default)(definition), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
        var _ref;

        if (_isArray) {
            if (_i >= _iterator.length) break;
            _ref = _iterator[_i++];
        } else {
            _i = _iterator.next();
            if (_i.done) break;
            _ref = _i.value;
        }

        var _ref2 = _ref,
            flagName = _ref2[0],
            flagVal = _ref2[1];

        res[flagName] = (value & flagVal) === flagVal;
    }
    return res;
}

var ValueWitnessFlags = {
    AlignmentMask: 0x0000FFFF,
    IsNonPOD: 0x00010000,
    IsNonInline: 0x00020000,
    HasExtraInhabitants: 0x00040000,
    HasSpareBits: 0x00080000,
    IsNonBitwiseTakable: 0x00100000,
    HasEnumWitnesses: 0x00200000
};

function TypeLayout(pointer) {
    this._ptr = pointer;
}
TypeLayout.prototype = {
    // offset 0
    get size() {
        return Memory.readPointer(this._ptr.add(0));
    },
    // offset pointerSize
    get flags() {
        return flagsToObject(ValueWitnessFlags, Memory.readPointer(this._ptr.add(Process.pointerSize)).toInt32());
    },
    // offset 2* pointerSize
    get stride() {
        return Memory.readPointer(this._ptr.add(2 * Process.pointerSize));
    },
    // offset 3* pointerSize
    get extraInhabitantFlags() {
        if (!this.flags.HasExtraInhabitants) return 0;
        return new ExtraInhabitantFlags(this._ptr.add(3 * Process.pointerSize));
    }
};
function ExtraInhabitantFlags(pointer) {
    this._ptr = pointer;
}
ExtraInhabitantFlags.NumExtraInhabitantsMask = 0x7FFFFFFF;
ExtraInhabitantFlags.prototype = {
    get data() {
        return Memory.readPointer(this._ptr);
    },

    getNumExtraInhabitants: function getNumExtraInhabitants() {
        return this.data & ExtraInhabitantFlags.NumExtraInhabitantsMask;
    }
};
function ValueWitnessTable(pointer) {
    TypeLayout.call(this, pointer.add(17 * Process.pointerSize));
    this._vwt = pointer;
}
ValueWitnessTable.prototype = (0, _create2.default)(TypeLayout.prototype, {
    // offset 0
    destroyBuffer: {
        value: function value(buffer, self) {
            // void destroyBuffer(ValueBuffer *buffer, const Metadata *self);
            return new NativeFunction(Memory.readPointer(this._vwt.add(0)), 'void', ['pointer', 'pointer'])(buffer, self);
        },

        enumerable: true
    },
    // offset pointerSize
    initializeBufferWithCopyOfBuffer: {
        value: function value(dest, src, self) {
            // OpaqueValue *initializeBufferWithCopyOfBuffer(ValueBuffer *dest, ValueBuffer *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(1 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 2*pointerSize
    projectBuffer: {
        value: function value(buffer, self) {
            // OpaqueValue *projectBuffer(ValueBuffer *buffer, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(2 * Process.pointerSize)), 'pointer', ['pointer', 'pointer'])(buffer, self);
        },

        enumerable: true
    },
    // offset 3*pointerSize
    deallocateBuffer: {
        value: function value(buffer, self) {
            // void deallocateBuffer(ValueBuffer *buffer, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(3 * Process.pointerSize)), 'void', ['pointer', 'pointer'])(buffer, self);
        },

        enumerable: true
    },
    // offset 4*pointerSize
    destroy: {
        value: function value(object, self) {
            // void destroy(OpaqueValue *object, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(4 * Process.pointerSize)), 'void', ['pointer', 'pointer'])(object, self);
        },

        enumerable: true
    },
    // offset 5*pointerSize
    initializeBufferWithCopy: {
        value: function value(dest, src, self) {
            // OpaqueValue *initializeBufferWithCopy(ValueBuffer *dest, OpaqueValue *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(5 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 6*pointerSize
    initializeWithCopy: {
        value: function value(dest, src, self) {
            // OpaqueValue *initializeWithCopy(OpaqueValue *dest, OpaqueValue *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(6 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 7*pointerSize
    assignWithCopy: {
        value: function value(dest, src, self) {
            // OpaqueValue *assignWithCopy(OpaqueValue *dest, OpaqueValue *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(7 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 8*pointerSize
    initializeBufferWithTake: {
        value: function value(dest, src, self) {
            // OpaqueValue *initializeBufferWithTake(ValueBuffer *dest, OpaqueValue *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(8 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 9*pointerSize
    initializeWithTake: {
        value: function value(dest, src, self) {
            // OpaqueValue *initializeWithTake(OpaqueValue *dest, OpaqueValue *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(9 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 10*pointerSize
    assignWithTake: {
        value: function value(dest, src, self) {
            // OpaqueValue *assignWithTake(OpaqueValue *dest, OpaqueValue *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(10 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 11*pointerSize
    allocateBuffer: {
        value: function value(buffer, self) {
            // OpaqueValue *allocateBuffer(ValueBuffer *buffer, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(11 * Process.pointerSize)), 'pointer', ['pointer', 'pointer'])(buffer, self);
        },

        enumerable: true
    },
    // offset 12*pointerSize
    initializeBufferWithTakeOfBuffer: {
        value: function value(dest, src, self) {
            // OpaqueValue *initializeBufferWithTakeOfBuffer(ValueBuffer *dest, ValueBuffer *src, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(12 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(dest, src, self);
        },

        enumerable: true
    },
    // offset 13*pointerSize
    destroyArray: {
        value: function value(array, n, self) {
            // void destroyArray(OpaqueValue *array, size_t n, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(13 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer'])(array, n, self);
        },

        enumerable: true
    },
    // offset 14*pointerSize
    initializeArrayWithCopy: {
        value: function value(dest, src, n, self) {
            // OpaqueValue *initializeArrayWithCopy(OpaqueValue *dest, OpaqueValue *src, size_t n, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(14 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer', 'pointer'])(dest, src, n, self);
        },

        enumerable: true
    },
    // offset 15*pointerSize
    initializeArrayWithTakeFrontToBack: {
        value: function value(dest, src, n, self) {
            // OpaqueValue *initializeArrayWithTakeFrontToBack(OpaqueValue *dest, OpaqueValue *src, size_t n, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(15 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer', 'pointer'])(dest, src, n, self);
        },

        enumerable: true
    },
    // offset 16*pointerSize
    initializeArrayWithTakeBackToFront: {
        value: function value(dest, src, n, self) {
            // OpaqueValue *initializeArrayWithTakeBackToFront(OpaqueValue *dest, OpaqueValue *src, size_t n, const Metadata *self)
            return new NativeFunction(Memory.readPointer(this._vwt.add(16 * Process.pointerSize)), 'pointer', ['pointer', 'pointer', 'pointer', 'pointer'])(dest, src, n, self);
        },

        enumerable: true
    },
    isValueInline: {
        get: function get() {
            return !this.flags.IsNonInline;
        },

        enumerable: true
    }
});
function ExtraInhabitantsValueWitnessTable(pointer) {
    ValueWitnessTable.call(this, pointer);
}
ExtraInhabitantsValueWitnessTable.prototype = (0, _create2.default)(ValueWitnessTable.prototype, {
    // offset 21*pointerSize
    storeExtraInhabitant: {
        value: function value(dest, index, self) {
            // void storeExtraInhabitant(OpaqueValue *dest, int index, const Metadata *self);
            return new NativeFunction(Memory.readPointer(this._vwt.add(21 * Process.pointerSize)), 'void', ['pointer', 'int', 'pointer'])(dest, index, self);
        },

        enumerable: true
    },
    // offset 22*pointerSize
    getExtraInhabitant: {
        value: function value(src, self) {
            // int getExtraInhabitantIndex(const OpaqueValue *src, const Metadata *self);
            return new NativeFunction(Memory.readPointer(this._vwt.add(22 * Process.pointerSize)), 'int', ['pointer', 'pointer'])(src, self);
        },

        enumerable: true
    }
});
function EnumValueWitnessTable(pointer) {
    ExtraInhabitantsValueWitnessTable.call(this, pointer);
}
EnumValueWitnessTable.prototype = (0, _create2.default)(ExtraInhabitantsValueWitnessTable.prototype, {
    // offset 23*pointerSize
    getEnumTag: {
        value: function value(src, self) {
            // int getEnumTag(const OpaqueValue *src, const Metadata *self);
            return new NativeFunction(Memory.readPointer(this._vwt.add(23 * Process.pointerSize)), 'int', ['pointer', 'pointer'])(src, self);
        },

        enumerable: true
    },
    // offset 24*pointerSize
    destructiveProjectEnumData: {
        value: function value(src, self) {
            // void destructiveProjectEnumData(OpaqueValue *src, const Metadata *self);
            return new NativeFunction(Memory.readPointer(this._vwt.add(24 * Process.pointerSize)), 'void', ['pointer', 'pointer'])(src, self);
        },

        enumerable: true
    },
    // offset 25*pointerSize
    destructiveInjectEnumTag: {
        value: function value(src, tag, self) {
            // void destructiveInjectEnumTag(OpaqueValue *src, int tag, const Metadata *self);
            return new NativeFunction(Memory.readPointer(this._vwt.add(25 * Process.pointerSize)), 'void', ['pointer', 'int', 'pointer'])(src, tag, self);
        },

        enumerable: true
    }
});

function TargetProtocolConformanceRecord(ptr) {
    this._ptr = ptr;
}
TargetProtocolConformanceRecord.prototype = {
    // offset 0
    get protocol() {
        return new TargetProtocolDescriptor(RelativeIndirectablePointer(this._ptr.add(0)));
    },
    // offset 4
    get directType() {
        return RelativeIndirectablePointer(this._ptr.add(4));
    },
    get indirectClass() {
        return RelativeIndirectablePointer(this._ptr.add(4));
    },
    get typeDescriptor() {
        return RelativeIndirectablePointer(this._ptr.add(4));
    },

    // offset 8
    get witnessTable() {
        return RelativeDirectPointer(this._ptr.add(8));
    },
    get witnessTableAccessor() {
        return RelativeDirectPointer(this._ptr.add(8));
    },

    // offset 12
    get flags() {
        return Memory.readU32(this._ptr.add(12));
    },

    getTypeKind: function getTypeKind() {
        var TypeKindMask = 0x0000000F;
        var TypeKindShift = 0;
        return (this.flags & TypeKindMask) >>> TypeKindShift; // see TypeMetadataRecordKind
    },
    getConformanceKind: function getConformanceKind() {
        var ConformanceKindMask = 0x00000010;
        var ConformanceKindShift = 4;
        return (this.flags & ConformanceKindMask) >>> ConformanceKindShift; // see ProtocolConformanceFlags
    },
    getDirectType: function getDirectType() {
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.Universal:
                return null;
            case TypeMetadataRecordKind.UniqueDirectType:
            case TypeMetadataRecordKind.NonuniqueDirectType:
                break;

            case TypeMetadataRecordKind.UniqueDirectClass:
            case TypeMetadataRecordKind.UniqueIndirectClass:
            case TypeMetadataRecordKind.UniqueNominalTypeDescriptor:
                throw new Error("not direct type metadata");
        }
        return new TargetMetadata(this.directType);
    },
    getDirectClass: function getDirectClass() {
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.Universal:
                return null;
            case TypeMetadataRecordKind.UniqueDirectClass:
                break;

            case TypeMetadataRecordKind.UniqueDirectType:
            case TypeMetadataRecordKind.NonuniqueDirectType:
            case TypeMetadataRecordKind.UniqueNominalTypeDescriptor:
            case TypeMetadataRecordKind.UniqueIndirectClass:
                throw new Error("not direct class object");
        }
        return this.directType;
    },
    getIndirectClass: function getIndirectClass() {
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.Universal:
                return null;
            case TypeMetadataRecordKind.UniqueIndirectClass:
                break;

            case TypeMetadataRecordKind.UniqueDirectType:
            case TypeMetadataRecordKind.UniqueDirectClass:
            case TypeMetadataRecordKind.NonuniqueDirectType:
            case TypeMetadataRecordKind.UniqueNominalTypeDescriptor:
                throw new Error("not indirect class object");
        }
        return this.indirectClass;
    },
    getNominalTypeDescriptor: function getNominalTypeDescriptor() {
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.Universal:
                return null;

            case TypeMetadataRecordKind.UniqueNominalTypeDescriptor:
                break;

            case TypeMetadataRecordKind.UniqueDirectClass:
            case TypeMetadataRecordKind.UniqueIndirectClass:
            case TypeMetadataRecordKind.UniqueDirectType:
            case TypeMetadataRecordKind.NonuniqueDirectType:
                throw new Error("not generic metadata pattern");
        }

        return new TargetNominalTypeDescriptor(this.typeDescriptor);
    },


    /// Get the directly-referenced static witness table.
    getStaticWitnessTable: function getStaticWitnessTable() {
        switch (this.getConformanceKind()) {
            case ProtocolConformanceReferenceKind.WitnessTable:
                break;

            case ProtocolConformanceReferenceKind.WitnessTableAccessor:
                throw new Error("no witness table");
        }
        return this.witnessTable;
    },
    getWitnessTableAccessor: function getWitnessTableAccessor() {
        switch (this.getConformanceKind()) {
            case ProtocolConformanceReferenceKind.WitnessTableAccessor:
                break;

            case ProtocolConformanceReferenceKind.WitnessTable:
                throw new Error("not witness table accessor");
        }
        return new NativeFunction(this.witnessTableAccessor, 'pointer', ['pointer']);
    },
    getCanonicalTypeMetadata: function getCanonicalTypeMetadata(api) {
        var classMetadata = null;
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.UniqueDirectType:
                return this.getDirectType();
            case TypeMetadataRecordKind.NonuniqueDirectType:
                return new TargetMetadata(api.swift_getForeignTypeMetadata(this.getDirectType()._ptr));
            case TypeMetadataRecordKind.UniqueIndirectClass:
                classMetadata = Memory.readPointer(this.getIndirectClass());
                break;
            case TypeMetadataRecordKind.UniqueDirectClass:
                classMetadata = this.getDirectClass();
                break;
            case TypeMetadataRecordKind.UniqueNominalTypeDescriptor:
            case TypeMetadataRecordKind.Universal:
                return null;
        }
        if (classMetadata !== null && !classMetadata.isNull()) return new TargetMetadata(api.swift_getObjCClassMetadata(classMetadata));
        return null;
    },
    getWitnessTable: function getWitnessTable(type) {
        switch (this.getConformanceKind()) {
            case ProtocolConformanceReferenceKind.WitnessTable:
                return this.getStaticWitnessTable();

            case ProtocolConformanceReferenceKind.WitnessTableAccessor:
                return this.getWitnessTableAccessor()(this.type);
        }
    }
};
var ProtocolConformanceReferenceKind = {
    WitnessTable: 0,
    WitnessTableAccessor: 1
};

var FieldTypeFlags = {
    Indirect: 1,
    Weak: 2,

    typeMask: 0x3
};

var TypeMetadataRecordKind = {
    Universal: 0,
    UniqueDirectType: 1,
    NonuniqueDirectType: 2,
    UniqueIndirectClass: 3,
    UniqueNominalTypeDescriptor: 4,
    UniqueDirectClass: 0xF
};

function FlaggedPointer(type, bitPos) {
    var flagMask = 1 << bitPos;
    var pointerBitMask = ~flagMask;
    return function (val) {
        return {
            pointer: new type(val.and(pointerBitMask)),
            flag: !val.and(flagMask).isNull()
        };
    };
}
var Argument = FlaggedPointer(TargetMetadata, 0);

function RelativeDirectPointerIntPair(ptr) {
    var val = Memory.readS32(ptr);
    var offset = val & ~0x3;
    var intVal = val & 0x3;
    return {
        pointer: ptr.add(val & ~0x3),
        intVal: val & 0x3
    };
}
var NominalTypeKind = {
    "0": "Class",
    "1": "Struct",
    "2": "Enum",
    "3": "Optional"
};

var MetadataKind = {
    "0": "Class",
    "1": "Struct",
    "2": "Enum",
    "3": "Optional",

    "8": "Opaque",
    "9": "Tuple",
    "10": "Function",
    "12": "Existential",
    "13": "Metatype",
    "14": "ObjCClassWrapper",
    "15": "ExistentialMetatype",
    "16": "ForeignClass",
    "64": "HeapLocalVariable",
    "65": "HeapGenericLocalVariable",
    "128": "ErrorObject"
};

function TargetMetadata(pointer) {
    this._ptr = pointer;
    switch (this.kind) {
        case "Class":
            return new TargetClassMetadata(pointer);
        case "Struct":
            return new TargetValueMetadata(pointer);
        case "Enum":
        case "Optional":
            return new TargetEnumMetadata(pointer);
        //case "Opaque":
        case "Tuple":
            return new TargetTupleTypeMetadata(pointer);
        case "Function":
            return new TargetFunctionTypeMetadata(pointer);
        case "Existential":
            return new TargetExistentialTypeMetadata(pointer);
        case "Metatype":
            return new TargetMetatypeMetadata(pointer);
        case "ObjCClassWrapper":
            return new TargetObjCClassWrapperMetadata(pointer);
        case "ExistentialMetatype":
            return new TargetExistentialMetatypeMetadata(pointer);
        case "ForeignClass":
            return new TargetForeignTypeMetadata(pointer);
        // case "HeapLocalVariable":
        // case "HeapGenericLocalVariable":
        // case  "ErrorObject":
    }
}
TargetMetadata.prototype = {
    // offset -pointerSize
    get valueWitnessTable() {
        return new ValueWitnessTable(Memory.readPointer(this._ptr.sub(Process.pointerSize)));
    },

    get kind() {
        var val = Memory.readPointer(this._ptr);
        if (val.compare(ptr(4096)) > 0) {
            return "Class";
        }
        return MetadataKind[val.toInt32().toString()];
    },

    getNominalTypeDescriptor: function getNominalTypeDescriptor() {
        return null;
    },
    toString: function toString() {
        return "[TargetMetadata: " + this.kind + "@" + this._ptr + "]";
    }
};
var ClassFlags = {
    IsSwift1: 0x1,
    UsesSwift1Refcounting: 0x2,
    HasCustomObjCName: 0x4
};
function TargetClassMetadata(pointer) {
    this._ptr = pointer;
    if (this.kind !== "Class") throw new Error("type is not a class type");
}
TargetClassMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset -2 * pointerSize
    destructor: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("destructor not available for ObjC classes");
            return Memory.readPointer(this._ptr.sub(2 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset -1 * pointerSize
    valueWitnessTable: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("valueWitnessTable not available for ObjC classes");
            return new ValueWitnessTable(Memory.readPointer(this._ptr.sub(Process.pointerSize)));
        },

        enumerable: true
    },

    // offset 0
    isa: {
        get: function get() {
            var val = Memory.readPointer(this._ptr);
            if (val.compare(ptr(4096)) <= 0) {
                return null;
            }
            return val;
        },

        enumerable: true
    },
    // offset pointerSize
    superClass: {
        get: function get() {
            if (this.isPureObjC()) return null;
            var val = Memory.readPointer(this._ptr.add(Process.pointerSize));
            return val.isNull() ? null : new TargetClassMetadata(val);
        },

        enumerable: true
    },
    // offset 2*pointerSize
    cacheData: {
        get: function get() {
            return [Memory.readPointer(this._ptr.add(2 * Process.pointerSize)), Memory.readPointer(this._ptr.add(3 * Process.pointerSize))];
        },

        enumerable: true
    },
    // offset 4 * pointerSize
    data: {
        get: function get() {
            return Memory.readPointer(this._ptr.add(4 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 5 * pointerSize
    flags: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("flags not available for ObjC classes");
            return flagsToObject(ClassFlags, Memory.readU32(this._ptr.add(5 * Process.pointerSize)));
        },

        enumerable: true
    },
    // offset 5 * pointerSize + 4
    instanceAddressPoint: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("instanceAddressPoint not available for ObjC classes");
            return Memory.readU32(this._ptr.add(4 + 5 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 5 * pointerSize + 8
    instanceSize: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("instanceSize not available for ObjC classes");
            return Memory.readU32(this._ptr.add(8 + 5 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 5 * pointerSize + 12
    instanceAlignMask: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("instanceAlignMask not available for ObjC classes");
            return Memory.readU16(this._ptr.add(12 + 5 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 5 * pointerSize + 14: reserved
    // offset 5 * pointerSize + 16
    classSize: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("classSize not available for ObjC classes");
            return Memory.readU32(this._ptr.add(16 + 5 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 5 * pointerSize + 20
    classAddressPoint: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("classAddressPoint not available for ObjC classes");
            return Memory.readU32(this._ptr.add(20 + 5 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 5 * pointerSize + 24
    description: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("description not available for ObjC classes");
            return ConstTargetFarRelativeDirectPointer(this._ptr.add(24 + 5 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 6 * pointerSize + 24
    iVarDestroyer: {
        get: function get() {
            if (this.isPureObjC()) throw new Error("iVarDestroyer not available for ObjC classes");
            return new NativePointer(Memory.readPointer(this._ptr.add(24 + 6 * Process.pointerSize)), 'void', ['pointer']);
        },

        enumerable: true
    },
    // offset 7 * pointerSize + 24: superClass members (then superClass's superClass members...)
    //                          ... metadata reference for parent
    //                          ... generic parameters for this class
    //                          ... class variables
    //                          ... "tabulated" virtual methods

    isTypeMetadata: {
        value: function value() {
            return this.data.and(ptr(1)).equals(ptr(1));
        },
        enumerable: true
    },
    isPureObjC: {
        value: function value() {
            return !this.isTypeMetadata();
        },
        enumerable: true
    },
    isArtificialSubclass: {
        value: function value() {
            return this.description.compare(int64(0)) === 0;
        },
        enumerable: true
    },
    getDescription: {
        value: function value() {
            if (!this.isTypeMetadata()) throw new Error("assertion error");
            if (this.isArtificialSubclass()) throw new Error("assertion error");
            return this.description;
        },
        enumerable: true
    },
    getNominalTypeDescriptor: {
        value: function value() {
            if (this.isTypeMetadata() && !this.isArtificialSubclass()) return new TargetNominalTypeDescriptor(this.getDescription());else return null;
        },

        enumerable: true
    },
    getParentType: {
        value: function value(nominalType) {
            var genericParams = nominalType.genericParams;
            if (!genericParams.flags.HasParent) return null;

            return new TargetMetadata(this._ptr.add((genericParams.offset - 1) * Process.pointerSize));
        },

        enumerable: true
    },
    getGenericArgs: {
        value: function value() {
            return this.getNominalTypeDescriptor().getGenericArgs(this);
        },

        enumerable: true
    }
});
function TargetValueMetadata(pointer) {
    this._ptr = pointer;

    switch (this.kind) {
        case "Struct":
            break;
        default:
            throw new Error("type is not a value type");
    }
}
TargetValueMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset pointerSize
    description: {
        get: function get() {
            var val = ConstTargetFarRelativeDirectPointer(this._ptr.add(Process.pointerSize));
            if (val.isNull()) return null;
            return val;
        },

        enumerable: true
    },

    getGenericArgs: {
        value: function value() {
            return this.getNominalTypeDescriptor().getGenericArgs(this);
        },

        enumerable: true
    },
    getNominalTypeDescriptor: {
        value: function value() {
            if (this.description.isNull()) return null;
            return new TargetNominalTypeDescriptor(this.description);
        },

        enumerable: true
    }
});
function TargetEnumMetadata(pointer) {
    this._ptr = pointer;

    switch (this.kind) {
        case "Enum":
        case "Optional":
            break;
        default:
            throw new Error("type is not an enum type");
    }
}
TargetEnumMetadata.prototype = (0, _create2.default)(TargetValueMetadata.prototype, {
    valueWitnessTable: {
        get: function get() {
            return new EnumValueWitnessTable(Memory.readPointer(this._ptr.sub(Process.pointerSize)));
        },

        enumerable: true
    },
    payloadSize: {
        get: function get() {
            var nominalType = this.getNominalTypeDescriptor();
            if (!nominalType.enum_.hasPayloadSizeOffset()) return null;

            return Memory.readPointer(this._ptr.add(nominalType.enum_.getPayloadSizeOffset() * Process.pointerSize));
        },

        enumerable: true
    }
});

function TargetGenericMetadata(ptr) {
    this._ptr = ptr;
}
TargetGenericMetadata.prototype = {
    // offset 0
    get createFunction() {
        return new NativeFunction(Memory.readPointer(this._ptr.add(0)), 'pointer', ['pointer', 'pointer']);
    },

    // offset 0+pointerSize
    get metadataSize() {
        return Memory.readU32(this._ptr.add(0 + Process.pointerSize));
    },

    // offset 4+pointerSize
    get numKeyArguments() {
        return Memory.readU16(this._ptr.add(4 + Process.pointerSize));
    },

    // offset 6+pointerSize
    get addressPoint() {
        return Memory.readU16(this._ptr.add(6 + Process.pointerSize));
    },

    // offset 8+pointerSize
    get privateData() {
        return Memory.readByteArray(this._ptr.add(8 + Process.pointerSize), 16 * Process.pointerSize);
    },

    getMetadataTemplate: function getMetadataTemplate() {
        return this._ptr.add(8 + 17 * Process.pointerSize);
    },
    _getMetadata: function _getMetadata() {
        return new TargetMetadata(this.getMetadataTemplate().add(this.addressPoint));
    },
    getTemplateDescription: function getTemplateDescription() {
        var metadata = new TargetMetadata(this.getMetadataTemplate().add(this.addressPoint));
        return metadata.getNominalTypeDescriptor();
    }
};
function TargetTupleTypeMetadata(pointer) {
    this._ptr = pointer;

    if (this.kind != "Tuple") throw new Error("type is not a tuple type");
}
TargetTupleTypeMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset pointerSize
    numElements: {
        get: function get() {
            return uint64(Memory.readPointer(this._ptr.add(Process.pointerSize)).toString());
        },

        enumerable: true
    },
    // offset 2*pointerSize
    labels: {
        get: function get() {
            return Memory.readPointer(this._ptr.add(2 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset 3*pointerSize
    elements: {
        get: function get() {
            var elems = [];
            var sizeOfTupleElement = 2 * Process.pointerSize;
            for (var i = 0; i < this.numElements; i++) {
                elems.push(new TupleElement(this._ptr.add(3 * Process.pointerSize + i * sizeOfTupleElement)));
            }
            return elems;
        },

        enumerable: true
    }
});
function TupleElement(pointer) {
    this._ptr = pointer;
}
TupleElement.prototype = {
    // offset 0
    get type() {
        return new TargetMetadata(Memory.readPointer(this._ptr));
    },
    // offset pointerSize
    get offset() {
        return Memory.readPointer(this._ptr.add(Process.pointerSize)).toInt32();
    }
};
function TargetFunctionTypeMetadata(pointer) {
    this._ptr = pointer;

    if (this.kind != "Function") throw new Error("type is not a function type");
}
TargetFunctionTypeMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset pointerSize
    flags: {
        get: function get() {
            var val = Memory.readPointer(this._ptr.add(Process.pointerSize));
            return {
                numArguments: val.and(TargetFunctionTypeFlags.NumArgumentsMask).toInt32(),
                convention: val.and(TargetFunctionTypeFlags.ConventionMask).shr(TargetFunctionTypeFlags.ConventionShift).toInt32(),
                doesThrow: !val.and(TargetFunctionTypeFlags.ThrowsMask).isNull()
            };
        },

        enumerable: true
    },
    // offset 2*pointerSize
    resultType: {
        get: function get() {
            return new TargetMetadata(Memory.readPointer(this._ptr.add(2 * Process.pointerSize)));
        },

        enumerable: true
    },
    // offset 3*pointerSize
    getArguments: {
        value: function value() {
            var count = this.flags.numArguments;
            var args = [];
            var ptr = this._ptr.add(3 * Process.pointerSize);
            for (var i = 0; i < count; i++) {
                var arg = new Argument(Memory.readPointer(ptr.add(i * Process.pointerSize)));
                args.push({
                    inout: arg.flag,
                    type: arg.pointer
                });
            }
            return args;
        },
        enumerable: true
    }
});
var ForeignTypeMetadataFlags = {
    HasInitializationFunction: 1
};
function TargetForeignTypeMetadata(pointer) {
    this._ptr = pointer;

    if (this.kind != "ForeignClass") throw new Error("type is not a foreign class type");
}
TargetForeignTypeMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset -2 * pointerSize
    flags: {
        get: function get() {
            return flagsToObject(ForeignTypeMetadataFlags, Memory.readPointer(this._ptr.sub(2 * Process.pointerSize)));
        },

        enumerable: true
    },
    // offset -3 * pointerSize
    unique: {
        get: function get() {
            return Memory.readPointer(this._ptr.sub(3 * Process.pointerSize));
        },

        enumerable: true
    },
    // offset -4*pointerSize
    name: {
        get: function get() {
            return Memory.readUtf8String(Memory.readPointer(this._ptr.sub(4 * Process.pointerSize)));
        },

        enumerable: true
    },
    // offset -5*pointerSize
    initializationFunction: {
        get: function get() {
            return new NativeFunction(Memory.readPointer(this._ptr.sub(5 * Process.pointerSize)), 'void', ['pointer']);
        },

        enumerable: true
    }
});
function TargetObjCClassWrapperMetadata(pointer) {
    this._ptr = pointer;

    if (this.kind !== "ObjCClassWrapper") throw new Error("type is not a ObjC class wrapper type");
}
TargetObjCClassWrapperMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset pointerSize
    class_: {
        get: function get() {
            return Memory.readPointer(this._ptr.add(Process.pointerSize));
        },

        enumerable: true
    }
});
function ExistentialTypeFlags(val) {
    this._val = val;
}
ExistentialTypeFlags.prototype = {
    NumWitnessTablesMask: 0x00FFFFFF,
    ClassConstraintMask: 0x80000000,
    HasSuperclassMask: 0x40000000,
    SpecialProtocolMask: 0x3F000000,
    SpecialProtocolShift: 24,

    getNumWitnessTables: function getNumWitnessTables() {
        return this._val & this.NumWitnessTablesMask;
    },
    getClassConstraint: function getClassConstraint() {
        return !!(this._val & this.ClassConstraintMask) ? "Any" : "Class";
    },
    hasSuperclassConstraint: function hasSuperclassConstraint() {
        return !!(this._val & this.HasSuperclassMask);
    },
    getSpecialProtocol: function getSpecialProtocol() {
        var SpecialProtocol = ["None", "Error"];
        return SpecialProtocol[(this._val & this.SpecialProtocolMask) >> this.SpecialProtocolShift];
    }
};
function TargetExistentialTypeMetadata(pointer) {
    this._ptr = pointer;

    if (this.kind != "Existential") throw new Error("type is not a existential type");
}
TargetExistentialTypeMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset pointerSize
    flags: {
        get: function get() {
            return new ExistentialTypeFlags(Memory.readPointer(this._ptr.add(Process.pointerSize)));
        },

        enumerable: true
    },
    // offset 2*pointerSize
    protocols: {
        get: function get() {
            return new TargetProtocolDescriptorList(this._ptr.add(2 * Process.pointerSize));
        },

        enumerable: true
    },

    getRepresentation: {
        value: function value() {
            // Some existentials use special containers.
            switch (this.flags.getSpecialProtocol()) {
                case "Error":
                    return "Error";
                case "None":
                    break;
            }
            // The layout of standard containers depends on whether the existential is
            // class-constrained.
            if (this.isClassBounded()) return "Class";
            return "Opaque";
        },

        enumerable: true
    },
    isObjC: {
        value: function value() {
            return this.isClassBounded() && this.flags.getNumWitnessTables() == 0;
        },

        enumerable: true
    },
    isClassBounded: {
        value: function value() {
            return this.flags.getClassConstraint() == "Class";
        },

        enumerable: true
    },
    getSuperclassConstraint: {
        value: function value() {
            if (this.isObjC() || !this.flags.hasSuperclassConstraint()) return null;

            // Get a pointer to tail-allocated storage for this metadata record.
            // The superclass immediately follows the list of protocol descriptors.
            var ptr = this._ptr.add(Process.pointerSize * (3 + this.protocols.length));

            return new TargetMetadata(Memory.readPointer(ptr));
        },

        enumerable: true
        /*mayTakeValue*/
        /*deinitExistentialContainer*/
        /*projectValue*/
        /*getDynamicType*/
        /*getWitnessTable*/
    } });
function TargetExistentialMetatypeMetadata(pointer) {
    this._ptr = pointer;
    if (this.kind !== "ExistentialMetatype") throw new Error("type is not a metatype");
}
TargetExistentialMetatypeMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset pointerSize
    instanceType: {
        get: function get() {
            return new TargetMetadata(Memory.readPointer(this._ptr.add(Process.pointerSize)));
        },

        enumerable: true
    },
    // offset 2*pointerSize
    flags: {
        get: function get() {
            return new ExistentialTypeFlags(Memory.readPointer(this._ptr.add(2 * Process.pointerSize)));
        },

        enumerable: true
    },

    isObjC: {
        value: function value() {
            return this.isClassBounded() && this.flags.getNumWitnessTables() == 0;
        },

        enumerable: true
    },
    isClassBounded: {
        value: function value() {
            return this.flags.getClassConstraint() == "Class";
        },

        enumerable: true
    }
});
function TargetMetatypeMetadata(pointer) {
    this._ptr = pointer;
    if (this.kind !== "Metatype") throw new Error("type is not a metatype");
}
TargetMetatypeMetadata.prototype = (0, _create2.default)(TargetMetadata.prototype, {
    // offset pointerSize
    instanceType: {
        get: function get() {
            return new TargetMetadata(Memory.readPointer(this._ptr.add(Process.pointerSize)));
        },

        enumerable: true
    }
});

function TargetProtocolDescriptorList(pointer) {
    if (pointer.isNull()) return [];
    var numProtocols = Memory.readPointer(pointer).toInt32();
    var res = [];
    for (var i = 0; i < numProtocols; i++) {
        res.push(new TargetProtocolDescriptor(Memory.readPointer(pointer.add((i + 1) * Process.pointerSize))));
    }
    res.arrayLocation = pointer.add(Process.pointerSize);
    return res;
}
function TargetProtocolDescriptor(pointer) {
    this._ptr = pointer;
}
TargetProtocolDescriptor.prototype = {
    // offset 0
    get _ObjC_Isa() {
        return Memory.readPointer(this._ptr.add(0));
    },
    // offset pointerSize
    get name() {
        return Memory.readUtf8String(Memory.readPointer(this._ptr.add(Process.pointerSize)));
    },
    // offset 2*pointerSize
    get inheritedProtocols() {
        return new TargetProtocolDescriptorList(Memory.readPointer(this._ptr.add(2 * Process.pointerSize)));
    },
    // offset 3*pointerSize
    get _ObjC_InstanceMethods() {
        return Memory.readPointer(this._ptr.add(3 * Process.pointerSize));
    },
    // offset 4*pointerSize
    get _ObjC_ClassMethods() {
        return Memory.readPointer(this._ptr.add(4 * Process.pointerSize));
    },
    // offset 5*pointerSize
    get _ObjC_OptionalInstanceMethods() {
        return Memory.readPointer(this._ptr.add(5 * Process.pointerSize));
    },
    // offset 6*pointerSize
    get _ObjC_OptionalClassMethods() {
        return Memory.readPointer(this._ptr.add(6 * Process.pointerSize));
    },
    // offset 7*pointerSize
    get _ObjC_InstanceProperties() {
        return Memory.readPointer(this._ptr.add(7 * Process.pointerSize));
    },
    // offset 8*pointerSize
    get descriptorSize() {
        return Memory.readU32(this._ptr.add(8 * Process.pointerSize));
    },
    // offset 8*pointerSize + 4
    get flags() {
        return flagsToObject(ProtocolDescriptorFlags, Memory.readU32(this._ptr.add(8 * Process.pointerSize + 4)));
    },
    // offset 8*pointerSize + 8
    get minimumWitnessTableSizeInWords() {
        if (!this.flags.IsResilient) throw new Error("minimum witness table size not known!");
        return Memory.readU16(this._ptr.add(8 * Process.pointerSize + 8));
    },
    // offset 8*pointerSize + 10
    get defaultWitnessTableSizeInWords() {
        if (!this.flags.IsResilient) throw new Error("default witness table size not known!");
        return Memory.readU16(this._ptr.add(8 * Process.pointerSize + 8));
    },
    // offset 8*pointerSize + 12
    get reserved() {
        return Memory.readU32(this._ptr.add(8 * Process.pointerSize + 12));
    },

    // offset 8*pointerSize + 16
    getDefaultWitnesses: function getDefaultWitnesses() {
        if (!this.flags.IsResilient) throw new Error("default witness table not known!");
        // table with minimum size + default size entries
        return this._ptr.add(8 * Process.pointerSize + 16);
    }
};
var ProtocolDescriptorFlags = {
    IsSwift: 1,
    ClassConstraint: 2,
    DispatchStrategyMask: 0x3c,
    DispatchStrategyShift: 2,
    SpecialProtocolMask: 0x3C0,
    SpecialProtocolShift: 6,
    IsResilient: 0x400,
    _ObjCReserved: 0xFFFF0000
};

var TargetFunctionTypeFlags = {
    NumArgumentsMask: 0x00FFFFFF,
    ConventionMask: 0x0F000000,
    ConventionShift: 24,
    ThrowsMask: 0x10000000
};
var FunctionMetadataConvention = {
    Swift: 0,
    Block: 1,
    Thin: 2,
    CFunctionPointer: 3
};
var FunctionConventionStrings = ["swift", "block", "thin", "c"];

function RelativeIndirectablePointer(addr) {
    var relativeOffsetPlusIndirect = Memory.readS32(addr);
    var offset = relativeOffsetPlusIndirect & ~1;

    var val = addr.add(offset);
    if ((relativeOffsetPlusIndirect & 1) === 0) {
        // direct reference
        return val;
    } else {
        // indirect reference
        return Memory.readPointer(val);
    }
}
function ConstTargetFarRelativeDirectPointer(ptr) {
    var offset = Memory.readPointer(ptr);
    return ptr.add(offset);
}
function TargetRelativeDirectPointerRuntime(ptr, nullable) {
    var offset = Memory.readS32(ptr);
    if (nullable && offset === 0) return null;
    return ptr.add(offset);
}
var GenericParameterDescriptorFlags = {
    HasParent: 1,
    HasGenericParent: 2
};
function TargetNominalTypeDescriptor(ptr) {
    this._ptr = ptr;
}
TargetNominalTypeDescriptor.prototype = {
    // offset 0
    get mangledName() {
        var addr = TargetRelativeDirectPointerRuntime(this._ptr, true);
        return mangling.MANGLING_PREFIX + "0" + Memory.readUtf8String(addr);
    },
    // offset 4
    get clas() {
        if (this.getKind() !== "Class" && this.getKind() !== "Struct") throw new Error('this nominal type descriptor has no class or struct metadata');

        var ptr = this._ptr.add(4);
        return {
            _ptr: ptr,

            // offset 0
            get numFields() {
                return Memory.readU32(ptr.add(0));
            },
            // offset 4
            get fieldOffsetVectorOffset() {
                return Memory.readU32(ptr.add(4));
            },
            // offset 8
            // doubly-null-terminated list of strings
            get fieldNames() {
                return TargetRelativeDirectPointerRuntime(ptr.add(8), true);
            },
            // offset 12
            get getFieldTypes() {
                return TargetRelativeDirectPointerRuntime(ptr.add(12), true);
            },
            hasFieldOffsetVector: function hasFieldOffsetVector() {
                return this.fieldOffsetVectorOffset !== 0;
            }
        };
    },

    // offset 4
    get struct() {
        if (this.getKind() !== "Struct") throw new Error('this nominal type descriptor has no enum metadata');

        return this.clas;
    },

    // offset 4
    get enum_() {
        var ptr = this._ptr.add(4);
        if (this.getKind() !== "Enum" && this.getKind() !== "Optional") throw new Error('this nominal type descriptor has no enum metadata');

        return {
            // offset 0
            get numPayloadCasesAndPayloadSizeOffset() {
                return Memory.readU32(ptr.add(0));
            },
            // offset 4
            get numEmptyCases() {
                return Memory.readU32(ptr.add(4));
            },
            // offset 8
            // doubly-null-terminated list of strings
            get caseNames() {
                return TargetRelativeDirectPointerRuntime(ptr.add(8), true);
            },
            // offset 12
            get getCaseTypes() {
                return TargetRelativeDirectPointerRuntime(ptr.add(12), true);
            },

            getNumPayloadCases: function getNumPayloadCases() {
                return this.numPayloadCasesAndPayloadSizeOffset & 0x00FFFFFF;
            },
            getNumCases: function getNumCases() {
                return this.getNumPayloadCases() + this.numEmptyCases;
            },
            getPayloadSizeOffset: function getPayloadSizeOffset() {
                return (this.numPayloadCasesAndPayloadSizeOffset & 0xFF000000) >> 24;
            },
            hasPayloadSizeOffset: function hasPayloadSizeOffset() {
                return this.getPayloadSizeOffset() !== 0;
            }
        };
    },

    // offset 20
    get genericMetadataPatternAndKind() {
        return RelativeDirectPointerIntPair(this._ptr.add(20));
    },

    // offset 24
    get accessFunction() {
        return TargetRelativeDirectPointerRuntime(this._ptr.add(24), true);
    },

    getGenericMetadataPattern: function getGenericMetadataPattern() {
        return new TargetGenericMetadata(this.genericMetadataPatternAndKind.pointer);
    },
    getKind: function getKind() {
        return NominalTypeKind[this.genericMetadataPatternAndKind.intVal];
    },
    offsetToNameOffset: function offsetToNameOffset() {
        return 0;
    },


    // offset 28
    get genericParams() {
        var ptr = this._ptr.add(28);
        return {
            // offset 0
            get offset() {
                if (!this.isGeneric()) throw new Error("not generic!");
                return Memory.readU32(ptr.add(0));
            },
            // offset 4
            get numGenericRequirements() {
                return Memory.readU32(ptr.add(4));
            },
            // offset 8
            get numPrimaryParams() {
                return Memory.readU32(ptr.add(8));
            },
            // offset 12
            get flags() {
                return flagsToObject(GenericParameterDescriptorFlags, Memory.readU32(ptr.add(12)));
            },

            hasGenericRequirements: function hasGenericRequirements() {
                return this.numGenericRequirements > 0;
            },
            isGeneric: function isGeneric() {
                return this.hasGenericRequirements() || this.flags.HasGenericParent;
            }
        };
    },

    toString: function toString() {
        return "[TargetNominalType@" + this._ptr + ": " + this.mangledName + "]";
    },
    getGenericArgs: function getGenericArgs(canon) {
        var params = this.genericParams;
        var args = [];
        if (params.hasGenericRequirements()) {
            // the shift acts on signed 32bit numbers, like we need here
            var offset = params.offset << (0, _log2.default)(Process.pointerSize);
            for (var i = 0; i < params.numPrimaryParams; i++) {
                var _ptr = Memory.readPointer(canon._ptr.add(offset));
                if (_ptr.isNull()) args.push(null);else args.push(new TargetMetadata(_ptr));
                offset += Process.pointerSize;
            }
        }
        return args;
    }
};

function TargetTypeMetadataRecord(record) {
    this._record = record;
}
TargetTypeMetadataRecord.prototype = {
    get _directType() {
        return TargetRelativeDirectPointerRuntime(this._record, true);
    },
    get _typeDescriptor() {
        return TargetRelativeDirectPointerRuntime(this._record, true);
    },

    get _flags() {
        return Memory.readUInt(this._record.add(4));
    },

    getTypeKind: function getTypeKind() {
        var TypeKindMask = 0x0000000F;
        var TypeKindShift = 0;
        return (this._flags & TypeKindMask) >>> TypeKindShift; // see TypeMetadataRecordKind
    },
    getDirectType: function getDirectType() {
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.Universal:
                return null;

            case TypeMetadataRecordKind.UniqueDirectType:
            case TypeMetadataRecordKind.NonuniqueDirectType:
            case TypeMetadataRecordKind.UniqueDirectClass:
                break;

            case TypeMetadataRecordKind.UniqueIndirectClass:
            case TypeMetadataRecordKind.UniqueNominalTypeDescriptor:
                throw new Error("not direct type metadata");

            default:
                throw new Error("invalid type kind");
        }

        return this._directType;
    },
    getNominalTypeDescriptor: function getNominalTypeDescriptor() {
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.Universal:
                return null;

            case TypeMetadataRecordKind.UniqueNominalTypeDescriptor:
                break;

            case TypeMetadataRecordKind.UniqueDirectClass:
            case TypeMetadataRecordKind.UniqueIndirectClass:
            case TypeMetadataRecordKind.UniqueDirectType:
            case TypeMetadataRecordKind.NonuniqueDirectType:
                throw new Error("not generic metadata pattern");

            default:
                throw new Error("invalid type kind");
        }

        return new TargetNominalTypeDescriptor(this._typeDescriptor);
    },
    getCanonicalTypeMetadata: function getCanonicalTypeMetadata(api) {
        // returns a Metadata* for non-generic types
        var res = null;
        switch (this.getTypeKind()) {
            case TypeMetadataRecordKind.UniqueDirectType:
                res = this.getDirectType();
                break;
            case TypeMetadataRecordKind.NonuniqueDirectType:
                res = api.swift_getForeignTypeMetadata(this.getDirectType());
                break;
            case TypeMetadataRecordKind.UniqueDirectClass:
                var directType = this.getDirectType();
                if (directType) {
                    res = api.swift_getObjCClassMetadata(directType);
                }
                break;
            default:
                break;
        }
        return res === null ? null : new TargetMetadata(res);
    }
};

function OpaqueExistentialContainer(pointer) {
    this._ptr = pointer;
}
OpaqueExistentialContainer.prototype = {
    // offset 0
    get fixedSizeBuffer0() {
        return Memory.readPointer(this._ptr.add(0));
    },
    set fixedSizeBuffer0(value) {
        Memory.writePointer(this._ptr.add(0), value);
    },
    // class types have a pointer in the fixedSizeBuffer
    get heapObject() {
        return new HeapObject(this.fixedSizeBuffer0);
    },
    // offset 1*pointerSize
    get fixedSizeBuffer1() {
        return Memory.readPointer(this._ptr.add(Process.pointerSize));
    },
    // offset 2*pointerSize
    get fixedSizeBuffer2() {
        return Memory.readPointer(this._ptr.add(2 * Process.pointerSize));
    },
    // offset 3*pointerSize
    get type() {
        return new TargetMetadata(Memory.readPointer(this._ptr.add(3 * Process.pointerSize)));
    },
    set type(value) {
        Memory.writePointer(this._ptr.add(3 * Process.pointerSize), value._ptr);
    },
    // offset 4*pointerSize
    getWitnessTable: function getWitnessTable(index) {
        return Memory.readPointer(this._ptr.add((4 + index) * Process.pointerSize));
    },
    setWitnessTable: function setWitnessTable(index, val) {
        return Memory.writePointer(this._ptr.add((4 + index) * Process.pointerSize), val);
    }
};
function ClassExistentialContainer(pointer) {
    this._ptr = pointer;
}
ClassExistentialContainer.prototype = {
    // offset 0
    get heapObject() {
        return new HeapObject(Memory.readPointer(this._ptr.add(0)));
    },
    // offset pointerSize
    getWitnessTable: function getWitnessTable(index) {
        return Memory.readPointer(this._ptr.add((1 + index) * Process.pointerSize));
    }
};

function HeapObject(pointer) {
    this._ptr = pointer;
}
HeapObject.prototype = {
    // offset 0
    get heapMetadata() {
        return new TargetMetadata(Memory.readPointer(this._ptr.add(0)));
    }
};

var ProtocolClassConstraint = {
    Class: 0,
    Any: 1
};

module.exports = {
    TargetMetadata: TargetMetadata,
    TargetClassMetadata: TargetClassMetadata,
    TargetProtocolConformanceRecord: TargetProtocolConformanceRecord,
    TargetTypeMetadataRecord: TargetTypeMetadataRecord,
    TargetNominalTypeDescriptor: TargetNominalTypeDescriptor,
    TargetFunctionTypeFlags: TargetFunctionTypeFlags,
    NominalTypeKind: NominalTypeKind,
    TypeMetadataRecordKind: TypeMetadataRecordKind,
    FieldTypeFlags: FieldTypeFlags,
    FunctionMetadataConvention: FunctionMetadataConvention,
    FunctionConventionStrings: FunctionConventionStrings,
    MetadataKind: MetadataKind,
    OpaqueExistentialContainer: OpaqueExistentialContainer,
    ClassExistentialContainer: ClassExistentialContainer,
    ProtocolClassConstraint: ProtocolClassConstraint,
    TargetProtocolDescriptor: TargetProtocolDescriptor
};

},{"./mangling":5,"babel-runtime/core-js/get-iterator":8,"babel-runtime/core-js/math/log2":11,"babel-runtime/core-js/object/create":12,"babel-runtime/core-js/object/entries":15}],7:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/array/from"), __esModule: true };
},{"core-js/library/fn/array/from":26}],8:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/get-iterator"), __esModule: true };
},{"core-js/library/fn/get-iterator":27}],9:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/json/stringify"), __esModule: true };
},{"core-js/library/fn/json/stringify":28}],10:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/map"), __esModule: true };
},{"core-js/library/fn/map":29}],11:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/math/log2"), __esModule: true };
},{"core-js/library/fn/math/log2":30}],12:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/create"), __esModule: true };
},{"core-js/library/fn/object/create":31}],13:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/define-properties"), __esModule: true };
},{"core-js/library/fn/object/define-properties":32}],14:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/define-property"), __esModule: true };
},{"core-js/library/fn/object/define-property":33}],15:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/entries"), __esModule: true };
},{"core-js/library/fn/object/entries":34}],16:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/get-own-property-descriptors"), __esModule: true };
},{"core-js/library/fn/object/get-own-property-descriptors":35}],17:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/keys"), __esModule: true };
},{"core-js/library/fn/object/keys":36}],18:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/object/prevent-extensions"), __esModule: true };
},{"core-js/library/fn/object/prevent-extensions":37}],19:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/reflect/define-property"), __esModule: true };
},{"core-js/library/fn/reflect/define-property":38}],20:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/reflect/delete-property"), __esModule: true };
},{"core-js/library/fn/reflect/delete-property":39}],21:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/reflect/set-prototype-of"), __esModule: true };
},{"core-js/library/fn/reflect/set-prototype-of":40}],22:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/set"), __esModule: true };
},{"core-js/library/fn/set":41}],23:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/symbol"), __esModule: true };
},{"core-js/library/fn/symbol":42}],24:[function(require,module,exports){
module.exports = { "default": require("core-js/library/fn/symbol/iterator"), __esModule: true };
},{"core-js/library/fn/symbol/iterator":43}],25:[function(require,module,exports){
"use strict";

exports.__esModule = true;

var _iterator = require("../core-js/symbol/iterator");

var _iterator2 = _interopRequireDefault(_iterator);

var _symbol = require("../core-js/symbol");

var _symbol2 = _interopRequireDefault(_symbol);

var _typeof = typeof _symbol2.default === "function" && typeof _iterator2.default === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj; };

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

exports.default = typeof _symbol2.default === "function" && _typeof(_iterator2.default) === "symbol" ? function (obj) {
  return typeof obj === "undefined" ? "undefined" : _typeof(obj);
} : function (obj) {
  return obj && typeof _symbol2.default === "function" && obj.constructor === _symbol2.default && obj !== _symbol2.default.prototype ? "symbol" : typeof obj === "undefined" ? "undefined" : _typeof(obj);
};
},{"../core-js/symbol":23,"../core-js/symbol/iterator":24}],26:[function(require,module,exports){
require('../../modules/es6.string.iterator');
require('../../modules/es6.array.from');
module.exports = require('../../modules/_core').Array.from;

},{"../../modules/_core":58,"../../modules/es6.array.from":124,"../../modules/es6.string.iterator":138}],27:[function(require,module,exports){
require('../modules/web.dom.iterable');
require('../modules/es6.string.iterator');
module.exports = require('../modules/core.get-iterator');

},{"../modules/core.get-iterator":123,"../modules/es6.string.iterator":138,"../modules/web.dom.iterable":150}],28:[function(require,module,exports){
var core = require('../../modules/_core');
var $JSON = core.JSON || (core.JSON = { stringify: JSON.stringify });
module.exports = function stringify(it) { // eslint-disable-line no-unused-vars
  return $JSON.stringify.apply($JSON, arguments);
};

},{"../../modules/_core":58}],29:[function(require,module,exports){
require('../modules/es6.object.to-string');
require('../modules/es6.string.iterator');
require('../modules/web.dom.iterable');
require('../modules/es6.map');
require('../modules/es7.map.to-json');
require('../modules/es7.map.of');
require('../modules/es7.map.from');
module.exports = require('../modules/_core').Map;

},{"../modules/_core":58,"../modules/es6.map":126,"../modules/es6.object.to-string":133,"../modules/es6.string.iterator":138,"../modules/es7.map.from":140,"../modules/es7.map.of":141,"../modules/es7.map.to-json":142,"../modules/web.dom.iterable":150}],30:[function(require,module,exports){
require('../../modules/es6.math.log2');
module.exports = require('../../modules/_core').Math.log2;

},{"../../modules/_core":58,"../../modules/es6.math.log2":127}],31:[function(require,module,exports){
require('../../modules/es6.object.create');
var $Object = require('../../modules/_core').Object;
module.exports = function create(P, D) {
  return $Object.create(P, D);
};

},{"../../modules/_core":58,"../../modules/es6.object.create":128}],32:[function(require,module,exports){
require('../../modules/es6.object.define-properties');
var $Object = require('../../modules/_core').Object;
module.exports = function defineProperties(T, D) {
  return $Object.defineProperties(T, D);
};

},{"../../modules/_core":58,"../../modules/es6.object.define-properties":129}],33:[function(require,module,exports){
require('../../modules/es6.object.define-property');
var $Object = require('../../modules/_core').Object;
module.exports = function defineProperty(it, key, desc) {
  return $Object.defineProperty(it, key, desc);
};

},{"../../modules/_core":58,"../../modules/es6.object.define-property":130}],34:[function(require,module,exports){
require('../../modules/es7.object.entries');
module.exports = require('../../modules/_core').Object.entries;

},{"../../modules/_core":58,"../../modules/es7.object.entries":143}],35:[function(require,module,exports){
require('../../modules/es7.object.get-own-property-descriptors');
module.exports = require('../../modules/_core').Object.getOwnPropertyDescriptors;

},{"../../modules/_core":58,"../../modules/es7.object.get-own-property-descriptors":144}],36:[function(require,module,exports){
require('../../modules/es6.object.keys');
module.exports = require('../../modules/_core').Object.keys;

},{"../../modules/_core":58,"../../modules/es6.object.keys":131}],37:[function(require,module,exports){
require('../../modules/es6.object.prevent-extensions');
module.exports = require('../../modules/_core').Object.preventExtensions;

},{"../../modules/_core":58,"../../modules/es6.object.prevent-extensions":132}],38:[function(require,module,exports){
require('../../modules/es6.reflect.define-property');
module.exports = require('../../modules/_core').Reflect.defineProperty;

},{"../../modules/_core":58,"../../modules/es6.reflect.define-property":134}],39:[function(require,module,exports){
require('../../modules/es6.reflect.delete-property');
module.exports = require('../../modules/_core').Reflect.deleteProperty;

},{"../../modules/_core":58,"../../modules/es6.reflect.delete-property":135}],40:[function(require,module,exports){
require('../../modules/es6.reflect.set-prototype-of');
module.exports = require('../../modules/_core').Reflect.setPrototypeOf;

},{"../../modules/_core":58,"../../modules/es6.reflect.set-prototype-of":136}],41:[function(require,module,exports){
require('../modules/es6.object.to-string');
require('../modules/es6.string.iterator');
require('../modules/web.dom.iterable');
require('../modules/es6.set');
require('../modules/es7.set.to-json');
require('../modules/es7.set.of');
require('../modules/es7.set.from');
module.exports = require('../modules/_core').Set;

},{"../modules/_core":58,"../modules/es6.object.to-string":133,"../modules/es6.set":137,"../modules/es6.string.iterator":138,"../modules/es7.set.from":145,"../modules/es7.set.of":146,"../modules/es7.set.to-json":147,"../modules/web.dom.iterable":150}],42:[function(require,module,exports){
require('../../modules/es6.symbol');
require('../../modules/es6.object.to-string');
require('../../modules/es7.symbol.async-iterator');
require('../../modules/es7.symbol.observable');
module.exports = require('../../modules/_core').Symbol;

},{"../../modules/_core":58,"../../modules/es6.object.to-string":133,"../../modules/es6.symbol":139,"../../modules/es7.symbol.async-iterator":148,"../../modules/es7.symbol.observable":149}],43:[function(require,module,exports){
require('../../modules/es6.string.iterator');
require('../../modules/web.dom.iterable');
module.exports = require('../../modules/_wks-ext').f('iterator');

},{"../../modules/_wks-ext":120,"../../modules/es6.string.iterator":138,"../../modules/web.dom.iterable":150}],44:[function(require,module,exports){
module.exports = function (it) {
  if (typeof it != 'function') throw TypeError(it + ' is not a function!');
  return it;
};

},{}],45:[function(require,module,exports){
module.exports = function () { /* empty */ };

},{}],46:[function(require,module,exports){
module.exports = function (it, Constructor, name, forbiddenField) {
  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
    throw TypeError(name + ': incorrect invocation!');
  } return it;
};

},{}],47:[function(require,module,exports){
var isObject = require('./_is-object');
module.exports = function (it) {
  if (!isObject(it)) throw TypeError(it + ' is not an object!');
  return it;
};

},{"./_is-object":77}],48:[function(require,module,exports){
var forOf = require('./_for-of');

module.exports = function (iter, ITERATOR) {
  var result = [];
  forOf(iter, false, result.push, result, ITERATOR);
  return result;
};

},{"./_for-of":68}],49:[function(require,module,exports){
// false -> Array#indexOf
// true  -> Array#includes
var toIObject = require('./_to-iobject');
var toLength = require('./_to-length');
var toAbsoluteIndex = require('./_to-absolute-index');
module.exports = function (IS_INCLUDES) {
  return function ($this, el, fromIndex) {
    var O = toIObject($this);
    var length = toLength(O.length);
    var index = toAbsoluteIndex(fromIndex, length);
    var value;
    // Array#includes uses SameValueZero equality algorithm
    // eslint-disable-next-line no-self-compare
    if (IS_INCLUDES && el != el) while (length > index) {
      value = O[index++];
      // eslint-disable-next-line no-self-compare
      if (value != value) return true;
    // Array#indexOf ignores holes, Array#includes - not
    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
      if (O[index] === el) return IS_INCLUDES || index || 0;
    } return !IS_INCLUDES && -1;
  };
};

},{"./_to-absolute-index":111,"./_to-iobject":113,"./_to-length":114}],50:[function(require,module,exports){
// 0 -> Array#forEach
// 1 -> Array#map
// 2 -> Array#filter
// 3 -> Array#some
// 4 -> Array#every
// 5 -> Array#find
// 6 -> Array#findIndex
var ctx = require('./_ctx');
var IObject = require('./_iobject');
var toObject = require('./_to-object');
var toLength = require('./_to-length');
var asc = require('./_array-species-create');
module.exports = function (TYPE, $create) {
  var IS_MAP = TYPE == 1;
  var IS_FILTER = TYPE == 2;
  var IS_SOME = TYPE == 3;
  var IS_EVERY = TYPE == 4;
  var IS_FIND_INDEX = TYPE == 6;
  var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
  var create = $create || asc;
  return function ($this, callbackfn, that) {
    var O = toObject($this);
    var self = IObject(O);
    var f = ctx(callbackfn, that, 3);
    var length = toLength(self.length);
    var index = 0;
    var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
    var val, res;
    for (;length > index; index++) if (NO_HOLES || index in self) {
      val = self[index];
      res = f(val, index, O);
      if (TYPE) {
        if (IS_MAP) result[index] = res;   // map
        else if (res) switch (TYPE) {
          case 3: return true;             // some
          case 5: return val;              // find
          case 6: return index;            // findIndex
          case 2: result.push(val);        // filter
        } else if (IS_EVERY) return false; // every
      }
    }
    return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
  };
};

},{"./_array-species-create":52,"./_ctx":60,"./_iobject":74,"./_to-length":114,"./_to-object":115}],51:[function(require,module,exports){
var isObject = require('./_is-object');
var isArray = require('./_is-array');
var SPECIES = require('./_wks')('species');

module.exports = function (original) {
  var C;
  if (isArray(original)) {
    C = original.constructor;
    // cross-realm fallback
    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
    if (isObject(C)) {
      C = C[SPECIES];
      if (C === null) C = undefined;
    }
  } return C === undefined ? Array : C;
};

},{"./_is-array":76,"./_is-object":77,"./_wks":121}],52:[function(require,module,exports){
// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
var speciesConstructor = require('./_array-species-constructor');

module.exports = function (original, length) {
  return new (speciesConstructor(original))(length);
};

},{"./_array-species-constructor":51}],53:[function(require,module,exports){
// getting tag from 19.1.3.6 Object.prototype.toString()
var cof = require('./_cof');
var TAG = require('./_wks')('toStringTag');
// ES3 wrong here
var ARG = cof(function () { return arguments; }()) == 'Arguments';

// fallback for IE11 Script Access Denied error
var tryGet = function (it, key) {
  try {
    return it[key];
  } catch (e) { /* empty */ }
};

module.exports = function (it) {
  var O, T, B;
  return it === undefined ? 'Undefined' : it === null ? 'Null'
    // @@toStringTag case
    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
    // builtinTag case
    : ARG ? cof(O)
    // ES3 arguments fallback
    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
};

},{"./_cof":54,"./_wks":121}],54:[function(require,module,exports){
var toString = {}.toString;

module.exports = function (it) {
  return toString.call(it).slice(8, -1);
};

},{}],55:[function(require,module,exports){
'use strict';
var dP = require('./_object-dp').f;
var create = require('./_object-create');
var redefineAll = require('./_redefine-all');
var ctx = require('./_ctx');
var anInstance = require('./_an-instance');
var forOf = require('./_for-of');
var $iterDefine = require('./_iter-define');
var step = require('./_iter-step');
var setSpecies = require('./_set-species');
var DESCRIPTORS = require('./_descriptors');
var fastKey = require('./_meta').fastKey;
var validate = require('./_validate-collection');
var SIZE = DESCRIPTORS ? '_s' : 'size';

var getEntry = function (that, key) {
  // fast case
  var index = fastKey(key);
  var entry;
  if (index !== 'F') return that._i[index];
  // frozen object case
  for (entry = that._f; entry; entry = entry.n) {
    if (entry.k == key) return entry;
  }
};

module.exports = {
  getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
    var C = wrapper(function (that, iterable) {
      anInstance(that, C, NAME, '_i');
      that._t = NAME;         // collection type
      that._i = create(null); // index
      that._f = undefined;    // first entry
      that._l = undefined;    // last entry
      that[SIZE] = 0;         // size
      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
    });
    redefineAll(C.prototype, {
      // 23.1.3.1 Map.prototype.clear()
      // 23.2.3.2 Set.prototype.clear()
      clear: function clear() {
        for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
          entry.r = true;
          if (entry.p) entry.p = entry.p.n = undefined;
          delete data[entry.i];
        }
        that._f = that._l = undefined;
        that[SIZE] = 0;
      },
      // 23.1.3.3 Map.prototype.delete(key)
      // 23.2.3.4 Set.prototype.delete(value)
      'delete': function (key) {
        var that = validate(this, NAME);
        var entry = getEntry(that, key);
        if (entry) {
          var next = entry.n;
          var prev = entry.p;
          delete that._i[entry.i];
          entry.r = true;
          if (prev) prev.n = next;
          if (next) next.p = prev;
          if (that._f == entry) that._f = next;
          if (that._l == entry) that._l = prev;
          that[SIZE]--;
        } return !!entry;
      },
      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
      forEach: function forEach(callbackfn /* , that = undefined */) {
        validate(this, NAME);
        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
        var entry;
        while (entry = entry ? entry.n : this._f) {
          f(entry.v, entry.k, this);
          // revert to the last existing entry
          while (entry && entry.r) entry = entry.p;
        }
      },
      // 23.1.3.7 Map.prototype.has(key)
      // 23.2.3.7 Set.prototype.has(value)
      has: function has(key) {
        return !!getEntry(validate(this, NAME), key);
      }
    });
    if (DESCRIPTORS) dP(C.prototype, 'size', {
      get: function () {
        return validate(this, NAME)[SIZE];
      }
    });
    return C;
  },
  def: function (that, key, value) {
    var entry = getEntry(that, key);
    var prev, index;
    // change existing entry
    if (entry) {
      entry.v = value;
    // create new entry
    } else {
      that._l = entry = {
        i: index = fastKey(key, true), // <- index
        k: key,                        // <- key
        v: value,                      // <- value
        p: prev = that._l,             // <- previous entry
        n: undefined,                  // <- next entry
        r: false                       // <- removed
      };
      if (!that._f) that._f = entry;
      if (prev) prev.n = entry;
      that[SIZE]++;
      // add to index
      if (index !== 'F') that._i[index] = entry;
    } return that;
  },
  getEntry: getEntry,
  setStrong: function (C, NAME, IS_MAP) {
    // add .keys, .values, .entries, [@@iterator]
    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
    $iterDefine(C, NAME, function (iterated, kind) {
      this._t = validate(iterated, NAME); // target
      this._k = kind;                     // kind
      this._l = undefined;                // previous
    }, function () {
      var that = this;
      var kind = that._k;
      var entry = that._l;
      // revert to the last existing entry
      while (entry && entry.r) entry = entry.p;
      // get next entry
      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
        // or finish the iteration
        that._t = undefined;
        return step(1);
      }
      // return step by kind
      if (kind == 'keys') return step(0, entry.k);
      if (kind == 'values') return step(0, entry.v);
      return step(0, [entry.k, entry.v]);
    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);

    // add [@@species], 23.1.2.2, 23.2.2.2
    setSpecies(NAME);
  }
};

},{"./_an-instance":46,"./_ctx":60,"./_descriptors":62,"./_for-of":68,"./_iter-define":80,"./_iter-step":82,"./_meta":85,"./_object-create":86,"./_object-dp":87,"./_redefine-all":101,"./_set-species":106,"./_validate-collection":118}],56:[function(require,module,exports){
// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var classof = require('./_classof');
var from = require('./_array-from-iterable');
module.exports = function (NAME) {
  return function toJSON() {
    if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
    return from(this);
  };
};

},{"./_array-from-iterable":48,"./_classof":53}],57:[function(require,module,exports){
'use strict';
var global = require('./_global');
var $export = require('./_export');
var meta = require('./_meta');
var fails = require('./_fails');
var hide = require('./_hide');
var redefineAll = require('./_redefine-all');
var forOf = require('./_for-of');
var anInstance = require('./_an-instance');
var isObject = require('./_is-object');
var setToStringTag = require('./_set-to-string-tag');
var dP = require('./_object-dp').f;
var each = require('./_array-methods')(0);
var DESCRIPTORS = require('./_descriptors');

module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
  var Base = global[NAME];
  var C = Base;
  var ADDER = IS_MAP ? 'set' : 'add';
  var proto = C && C.prototype;
  var O = {};
  if (!DESCRIPTORS || typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
    new C().entries().next();
  }))) {
    // create collection constructor
    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
    redefineAll(C.prototype, methods);
    meta.NEED = true;
  } else {
    C = wrapper(function (target, iterable) {
      anInstance(target, C, NAME, '_c');
      target._c = new Base();
      if (iterable != undefined) forOf(iterable, IS_MAP, target[ADDER], target);
    });
    each('add,clear,delete,forEach,get,has,set,keys,values,entries,toJSON'.split(','), function (KEY) {
      var IS_ADDER = KEY == 'add' || KEY == 'set';
      if (KEY in proto && !(IS_WEAK && KEY == 'clear')) hide(C.prototype, KEY, function (a, b) {
        anInstance(this, C, KEY);
        if (!IS_ADDER && IS_WEAK && !isObject(a)) return KEY == 'get' ? undefined : false;
        var result = this._c[KEY](a === 0 ? 0 : a, b);
        return IS_ADDER ? this : result;
      });
    });
    IS_WEAK || dP(C.prototype, 'size', {
      get: function () {
        return this._c.size;
      }
    });
  }

  setToStringTag(C, NAME);

  O[NAME] = C;
  $export($export.G + $export.W + $export.F, O);

  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);

  return C;
};

},{"./_an-instance":46,"./_array-methods":50,"./_descriptors":62,"./_export":66,"./_fails":67,"./_for-of":68,"./_global":69,"./_hide":71,"./_is-object":77,"./_meta":85,"./_object-dp":87,"./_redefine-all":101,"./_set-to-string-tag":107}],58:[function(require,module,exports){
var core = module.exports = { version: '2.5.1' };
if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef

},{}],59:[function(require,module,exports){
'use strict';
var $defineProperty = require('./_object-dp');
var createDesc = require('./_property-desc');

module.exports = function (object, index, value) {
  if (index in object) $defineProperty.f(object, index, createDesc(0, value));
  else object[index] = value;
};

},{"./_object-dp":87,"./_property-desc":100}],60:[function(require,module,exports){
// optional / simple context binding
var aFunction = require('./_a-function');
module.exports = function (fn, that, length) {
  aFunction(fn);
  if (that === undefined) return fn;
  switch (length) {
    case 1: return function (a) {
      return fn.call(that, a);
    };
    case 2: return function (a, b) {
      return fn.call(that, a, b);
    };
    case 3: return function (a, b, c) {
      return fn.call(that, a, b, c);
    };
  }
  return function (/* ...args */) {
    return fn.apply(that, arguments);
  };
};

},{"./_a-function":44}],61:[function(require,module,exports){
// 7.2.1 RequireObjectCoercible(argument)
module.exports = function (it) {
  if (it == undefined) throw TypeError("Can't call method on  " + it);
  return it;
};

},{}],62:[function(require,module,exports){
// Thank's IE8 for his funny defineProperty
module.exports = !require('./_fails')(function () {
  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
});

},{"./_fails":67}],63:[function(require,module,exports){
var isObject = require('./_is-object');
var document = require('./_global').document;
// typeof document.createElement is 'object' in old IE
var is = isObject(document) && isObject(document.createElement);
module.exports = function (it) {
  return is ? document.createElement(it) : {};
};

},{"./_global":69,"./_is-object":77}],64:[function(require,module,exports){
// IE 8- don't enum bug keys
module.exports = (
  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
).split(',');

},{}],65:[function(require,module,exports){
// all enumerable object keys, includes symbols
var getKeys = require('./_object-keys');
var gOPS = require('./_object-gops');
var pIE = require('./_object-pie');
module.exports = function (it) {
  var result = getKeys(it);
  var getSymbols = gOPS.f;
  if (getSymbols) {
    var symbols = getSymbols(it);
    var isEnum = pIE.f;
    var i = 0;
    var key;
    while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
  } return result;
};

},{"./_object-gops":92,"./_object-keys":95,"./_object-pie":96}],66:[function(require,module,exports){
var global = require('./_global');
var core = require('./_core');
var ctx = require('./_ctx');
var hide = require('./_hide');
var PROTOTYPE = 'prototype';

var $export = function (type, name, source) {
  var IS_FORCED = type & $export.F;
  var IS_GLOBAL = type & $export.G;
  var IS_STATIC = type & $export.S;
  var IS_PROTO = type & $export.P;
  var IS_BIND = type & $export.B;
  var IS_WRAP = type & $export.W;
  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
  var expProto = exports[PROTOTYPE];
  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];
  var key, own, out;
  if (IS_GLOBAL) source = name;
  for (key in source) {
    // contains in native
    own = !IS_FORCED && target && target[key] !== undefined;
    if (own && key in exports) continue;
    // export native or passed
    out = own ? target[key] : source[key];
    // prevent global pollution for namespaces
    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
    // bind timers to global for call from export context
    : IS_BIND && own ? ctx(out, global)
    // wrap global constructors for prevent change them in library
    : IS_WRAP && target[key] == out ? (function (C) {
      var F = function (a, b, c) {
        if (this instanceof C) {
          switch (arguments.length) {
            case 0: return new C();
            case 1: return new C(a);
            case 2: return new C(a, b);
          } return new C(a, b, c);
        } return C.apply(this, arguments);
      };
      F[PROTOTYPE] = C[PROTOTYPE];
      return F;
    // make static versions for prototype methods
    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
    if (IS_PROTO) {
      (exports.virtual || (exports.virtual = {}))[key] = out;
      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);
    }
  }
};
// type bitmap
$export.F = 1;   // forced
$export.G = 2;   // global
$export.S = 4;   // static
$export.P = 8;   // proto
$export.B = 16;  // bind
$export.W = 32;  // wrap
$export.U = 64;  // safe
$export.R = 128; // real proto method for `library`
module.exports = $export;

},{"./_core":58,"./_ctx":60,"./_global":69,"./_hide":71}],67:[function(require,module,exports){
module.exports = function (exec) {
  try {
    return !!exec();
  } catch (e) {
    return true;
  }
};

},{}],68:[function(require,module,exports){
var ctx = require('./_ctx');
var call = require('./_iter-call');
var isArrayIter = require('./_is-array-iter');
var anObject = require('./_an-object');
var toLength = require('./_to-length');
var getIterFn = require('./core.get-iterator-method');
var BREAK = {};
var RETURN = {};
var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
  var f = ctx(fn, that, entries ? 2 : 1);
  var index = 0;
  var length, step, iterator, result;
  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
  // fast case for arrays with default iterator
  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
    if (result === BREAK || result === RETURN) return result;
  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
    result = call(iterator, f, step.value, entries);
    if (result === BREAK || result === RETURN) return result;
  }
};
exports.BREAK = BREAK;
exports.RETURN = RETURN;

},{"./_an-object":47,"./_ctx":60,"./_is-array-iter":75,"./_iter-call":78,"./_to-length":114,"./core.get-iterator-method":122}],69:[function(require,module,exports){
// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
var global = module.exports = typeof window != 'undefined' && window.Math == Math
  ? window : typeof self != 'undefined' && self.Math == Math ? self
  // eslint-disable-next-line no-new-func
  : Function('return this')();
if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef

},{}],70:[function(require,module,exports){
var hasOwnProperty = {}.hasOwnProperty;
module.exports = function (it, key) {
  return hasOwnProperty.call(it, key);
};

},{}],71:[function(require,module,exports){
var dP = require('./_object-dp');
var createDesc = require('./_property-desc');
module.exports = require('./_descriptors') ? function (object, key, value) {
  return dP.f(object, key, createDesc(1, value));
} : function (object, key, value) {
  object[key] = value;
  return object;
};

},{"./_descriptors":62,"./_object-dp":87,"./_property-desc":100}],72:[function(require,module,exports){
var document = require('./_global').document;
module.exports = document && document.documentElement;

},{"./_global":69}],73:[function(require,module,exports){
module.exports = !require('./_descriptors') && !require('./_fails')(function () {
  return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;
});

},{"./_descriptors":62,"./_dom-create":63,"./_fails":67}],74:[function(require,module,exports){
// fallback for non-array-like ES3 and non-enumerable old V8 strings
var cof = require('./_cof');
// eslint-disable-next-line no-prototype-builtins
module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
  return cof(it) == 'String' ? it.split('') : Object(it);
};

},{"./_cof":54}],75:[function(require,module,exports){
// check on default Array iterator
var Iterators = require('./_iterators');
var ITERATOR = require('./_wks')('iterator');
var ArrayProto = Array.prototype;

module.exports = function (it) {
  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
};

},{"./_iterators":83,"./_wks":121}],76:[function(require,module,exports){
// 7.2.2 IsArray(argument)
var cof = require('./_cof');
module.exports = Array.isArray || function isArray(arg) {
  return cof(arg) == 'Array';
};

},{"./_cof":54}],77:[function(require,module,exports){
module.exports = function (it) {
  return typeof it === 'object' ? it !== null : typeof it === 'function';
};

},{}],78:[function(require,module,exports){
// call something on iterator step with safe closing on error
var anObject = require('./_an-object');
module.exports = function (iterator, fn, value, entries) {
  try {
    return entries ? fn(anObject(value)[0], value[1]) : fn(value);
  // 7.4.6 IteratorClose(iterator, completion)
  } catch (e) {
    var ret = iterator['return'];
    if (ret !== undefined) anObject(ret.call(iterator));
    throw e;
  }
};

},{"./_an-object":47}],79:[function(require,module,exports){
'use strict';
var create = require('./_object-create');
var descriptor = require('./_property-desc');
var setToStringTag = require('./_set-to-string-tag');
var IteratorPrototype = {};

// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
require('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });

module.exports = function (Constructor, NAME, next) {
  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
  setToStringTag(Constructor, NAME + ' Iterator');
};

},{"./_hide":71,"./_object-create":86,"./_property-desc":100,"./_set-to-string-tag":107,"./_wks":121}],80:[function(require,module,exports){
'use strict';
var LIBRARY = require('./_library');
var $export = require('./_export');
var redefine = require('./_redefine');
var hide = require('./_hide');
var has = require('./_has');
var Iterators = require('./_iterators');
var $iterCreate = require('./_iter-create');
var setToStringTag = require('./_set-to-string-tag');
var getPrototypeOf = require('./_object-gpo');
var ITERATOR = require('./_wks')('iterator');
var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
var FF_ITERATOR = '@@iterator';
var KEYS = 'keys';
var VALUES = 'values';

var returnThis = function () { return this; };

module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
  $iterCreate(Constructor, NAME, next);
  var getMethod = function (kind) {
    if (!BUGGY && kind in proto) return proto[kind];
    switch (kind) {
      case KEYS: return function keys() { return new Constructor(this, kind); };
      case VALUES: return function values() { return new Constructor(this, kind); };
    } return function entries() { return new Constructor(this, kind); };
  };
  var TAG = NAME + ' Iterator';
  var DEF_VALUES = DEFAULT == VALUES;
  var VALUES_BUG = false;
  var proto = Base.prototype;
  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
  var $default = $native || getMethod(DEFAULT);
  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
  var methods, key, IteratorPrototype;
  // Fix native
  if ($anyNative) {
    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
      // Set @@toStringTag to native iterators
      setToStringTag(IteratorPrototype, TAG, true);
      // fix for some old engines
      if (!LIBRARY && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);
    }
  }
  // fix Array#{values, @@iterator}.name in V8 / FF
  if (DEF_VALUES && $native && $native.name !== VALUES) {
    VALUES_BUG = true;
    $default = function values() { return $native.call(this); };
  }
  // Define iterator
  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
    hide(proto, ITERATOR, $default);
  }
  // Plug for library
  Iterators[NAME] = $default;
  Iterators[TAG] = returnThis;
  if (DEFAULT) {
    methods = {
      values: DEF_VALUES ? $default : getMethod(VALUES),
      keys: IS_SET ? $default : getMethod(KEYS),
      entries: $entries
    };
    if (FORCED) for (key in methods) {
      if (!(key in proto)) redefine(proto, key, methods[key]);
    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
  }
  return methods;
};

},{"./_export":66,"./_has":70,"./_hide":71,"./_iter-create":79,"./_iterators":83,"./_library":84,"./_object-gpo":93,"./_redefine":102,"./_set-to-string-tag":107,"./_wks":121}],81:[function(require,module,exports){
var ITERATOR = require('./_wks')('iterator');
var SAFE_CLOSING = false;

try {
  var riter = [7][ITERATOR]();
  riter['return'] = function () { SAFE_CLOSING = true; };
  // eslint-disable-next-line no-throw-literal
  Array.from(riter, function () { throw 2; });
} catch (e) { /* empty */ }

module.exports = function (exec, skipClosing) {
  if (!skipClosing && !SAFE_CLOSING) return false;
  var safe = false;
  try {
    var arr = [7];
    var iter = arr[ITERATOR]();
    iter.next = function () { return { done: safe = true }; };
    arr[ITERATOR] = function () { return iter; };
    exec(arr);
  } catch (e) { /* empty */ }
  return safe;
};

},{"./_wks":121}],82:[function(require,module,exports){
module.exports = function (done, value) {
  return { value: value, done: !!done };
};

},{}],83:[function(require,module,exports){
module.exports = {};

},{}],84:[function(require,module,exports){
module.exports = true;

},{}],85:[function(require,module,exports){
var META = require('./_uid')('meta');
var isObject = require('./_is-object');
var has = require('./_has');
var setDesc = require('./_object-dp').f;
var id = 0;
var isExtensible = Object.isExtensible || function () {
  return true;
};
var FREEZE = !require('./_fails')(function () {
  return isExtensible(Object.preventExtensions({}));
});
var setMeta = function (it) {
  setDesc(it, META, { value: {
    i: 'O' + ++id, // object ID
    w: {}          // weak collections IDs
  } });
};
var fastKey = function (it, create) {
  // return primitive with prefix
  if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
  if (!has(it, META)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return 'F';
    // not necessary to add metadata
    if (!create) return 'E';
    // add missing metadata
    setMeta(it);
  // return object ID
  } return it[META].i;
};
var getWeak = function (it, create) {
  if (!has(it, META)) {
    // can't set metadata to uncaught frozen object
    if (!isExtensible(it)) return true;
    // not necessary to add metadata
    if (!create) return false;
    // add missing metadata
    setMeta(it);
  // return hash weak collections IDs
  } return it[META].w;
};
// add metadata on freeze-family methods calling
var onFreeze = function (it) {
  if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
  return it;
};
var meta = module.exports = {
  KEY: META,
  NEED: false,
  fastKey: fastKey,
  getWeak: getWeak,
  onFreeze: onFreeze
};

},{"./_fails":67,"./_has":70,"./_is-object":77,"./_object-dp":87,"./_uid":117}],86:[function(require,module,exports){
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
var anObject = require('./_an-object');
var dPs = require('./_object-dps');
var enumBugKeys = require('./_enum-bug-keys');
var IE_PROTO = require('./_shared-key')('IE_PROTO');
var Empty = function () { /* empty */ };
var PROTOTYPE = 'prototype';

// Create object with fake `null` prototype: use iframe Object with cleared prototype
var createDict = function () {
  // Thrash, waste and sodomy: IE GC bug
  var iframe = require('./_dom-create')('iframe');
  var i = enumBugKeys.length;
  var lt = '<';
  var gt = '>';
  var iframeDocument;
  iframe.style.display = 'none';
  require('./_html').appendChild(iframe);
  iframe.src = 'javascript:'; // eslint-disable-line no-script-url
  // createDict = iframe.contentWindow.Object;
  // html.removeChild(iframe);
  iframeDocument = iframe.contentWindow.document;
  iframeDocument.open();
  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
  iframeDocument.close();
  createDict = iframeDocument.F;
  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
  return createDict();
};

module.exports = Object.create || function create(O, Properties) {
  var result;
  if (O !== null) {
    Empty[PROTOTYPE] = anObject(O);
    result = new Empty();
    Empty[PROTOTYPE] = null;
    // add "__proto__" for Object.getPrototypeOf polyfill
    result[IE_PROTO] = O;
  } else result = createDict();
  return Properties === undefined ? result : dPs(result, Properties);
};

},{"./_an-object":47,"./_dom-create":63,"./_enum-bug-keys":64,"./_html":72,"./_object-dps":88,"./_shared-key":108}],87:[function(require,module,exports){
var anObject = require('./_an-object');
var IE8_DOM_DEFINE = require('./_ie8-dom-define');
var toPrimitive = require('./_to-primitive');
var dP = Object.defineProperty;

exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {
  anObject(O);
  P = toPrimitive(P, true);
  anObject(Attributes);
  if (IE8_DOM_DEFINE) try {
    return dP(O, P, Attributes);
  } catch (e) { /* empty */ }
  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
  if ('value' in Attributes) O[P] = Attributes.value;
  return O;
};

},{"./_an-object":47,"./_descriptors":62,"./_ie8-dom-define":73,"./_to-primitive":116}],88:[function(require,module,exports){
var dP = require('./_object-dp');
var anObject = require('./_an-object');
var getKeys = require('./_object-keys');

module.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {
  anObject(O);
  var keys = getKeys(Properties);
  var length = keys.length;
  var i = 0;
  var P;
  while (length > i) dP.f(O, P = keys[i++], Properties[P]);
  return O;
};

},{"./_an-object":47,"./_descriptors":62,"./_object-dp":87,"./_object-keys":95}],89:[function(require,module,exports){
var pIE = require('./_object-pie');
var createDesc = require('./_property-desc');
var toIObject = require('./_to-iobject');
var toPrimitive = require('./_to-primitive');
var has = require('./_has');
var IE8_DOM_DEFINE = require('./_ie8-dom-define');
var gOPD = Object.getOwnPropertyDescriptor;

exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {
  O = toIObject(O);
  P = toPrimitive(P, true);
  if (IE8_DOM_DEFINE) try {
    return gOPD(O, P);
  } catch (e) { /* empty */ }
  if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
};

},{"./_descriptors":62,"./_has":70,"./_ie8-dom-define":73,"./_object-pie":96,"./_property-desc":100,"./_to-iobject":113,"./_to-primitive":116}],90:[function(require,module,exports){
// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
var toIObject = require('./_to-iobject');
var gOPN = require('./_object-gopn').f;
var toString = {}.toString;

var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
  ? Object.getOwnPropertyNames(window) : [];

var getWindowNames = function (it) {
  try {
    return gOPN(it);
  } catch (e) {
    return windowNames.slice();
  }
};

module.exports.f = function getOwnPropertyNames(it) {
  return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
};

},{"./_object-gopn":91,"./_to-iobject":113}],91:[function(require,module,exports){
// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
var $keys = require('./_object-keys-internal');
var hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');

exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
  return $keys(O, hiddenKeys);
};

},{"./_enum-bug-keys":64,"./_object-keys-internal":94}],92:[function(require,module,exports){
exports.f = Object.getOwnPropertySymbols;

},{}],93:[function(require,module,exports){
// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
var has = require('./_has');
var toObject = require('./_to-object');
var IE_PROTO = require('./_shared-key')('IE_PROTO');
var ObjectProto = Object.prototype;

module.exports = Object.getPrototypeOf || function (O) {
  O = toObject(O);
  if (has(O, IE_PROTO)) return O[IE_PROTO];
  if (typeof O.constructor == 'function' && O instanceof O.constructor) {
    return O.constructor.prototype;
  } return O instanceof Object ? ObjectProto : null;
};

},{"./_has":70,"./_shared-key":108,"./_to-object":115}],94:[function(require,module,exports){
var has = require('./_has');
var toIObject = require('./_to-iobject');
var arrayIndexOf = require('./_array-includes')(false);
var IE_PROTO = require('./_shared-key')('IE_PROTO');

module.exports = function (object, names) {
  var O = toIObject(object);
  var i = 0;
  var result = [];
  var key;
  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
  // Don't enum bug & hidden keys
  while (names.length > i) if (has(O, key = names[i++])) {
    ~arrayIndexOf(result, key) || result.push(key);
  }
  return result;
};

},{"./_array-includes":49,"./_has":70,"./_shared-key":108,"./_to-iobject":113}],95:[function(require,module,exports){
// 19.1.2.14 / 15.2.3.14 Object.keys(O)
var $keys = require('./_object-keys-internal');
var enumBugKeys = require('./_enum-bug-keys');

module.exports = Object.keys || function keys(O) {
  return $keys(O, enumBugKeys);
};

},{"./_enum-bug-keys":64,"./_object-keys-internal":94}],96:[function(require,module,exports){
exports.f = {}.propertyIsEnumerable;

},{}],97:[function(require,module,exports){
// most Object methods by ES6 should accept primitives
var $export = require('./_export');
var core = require('./_core');
var fails = require('./_fails');
module.exports = function (KEY, exec) {
  var fn = (core.Object || {})[KEY] || Object[KEY];
  var exp = {};
  exp[KEY] = exec(fn);
  $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);
};

},{"./_core":58,"./_export":66,"./_fails":67}],98:[function(require,module,exports){
var getKeys = require('./_object-keys');
var toIObject = require('./_to-iobject');
var isEnum = require('./_object-pie').f;
module.exports = function (isEntries) {
  return function (it) {
    var O = toIObject(it);
    var keys = getKeys(O);
    var length = keys.length;
    var i = 0;
    var result = [];
    var key;
    while (length > i) if (isEnum.call(O, key = keys[i++])) {
      result.push(isEntries ? [key, O[key]] : O[key]);
    } return result;
  };
};

},{"./_object-keys":95,"./_object-pie":96,"./_to-iobject":113}],99:[function(require,module,exports){
// all object keys, includes non-enumerable and symbols
var gOPN = require('./_object-gopn');
var gOPS = require('./_object-gops');
var anObject = require('./_an-object');
var Reflect = require('./_global').Reflect;
module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {
  var keys = gOPN.f(anObject(it));
  var getSymbols = gOPS.f;
  return getSymbols ? keys.concat(getSymbols(it)) : keys;
};

},{"./_an-object":47,"./_global":69,"./_object-gopn":91,"./_object-gops":92}],100:[function(require,module,exports){
module.exports = function (bitmap, value) {
  return {
    enumerable: !(bitmap & 1),
    configurable: !(bitmap & 2),
    writable: !(bitmap & 4),
    value: value
  };
};

},{}],101:[function(require,module,exports){
var hide = require('./_hide');
module.exports = function (target, src, safe) {
  for (var key in src) {
    if (safe && target[key]) target[key] = src[key];
    else hide(target, key, src[key]);
  } return target;
};

},{"./_hide":71}],102:[function(require,module,exports){
module.exports = require('./_hide');

},{"./_hide":71}],103:[function(require,module,exports){
'use strict';
// https://tc39.github.io/proposal-setmap-offrom/
var $export = require('./_export');
var aFunction = require('./_a-function');
var ctx = require('./_ctx');
var forOf = require('./_for-of');

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {
    var mapFn = arguments[1];
    var mapping, A, n, cb;
    aFunction(this);
    mapping = mapFn !== undefined;
    if (mapping) aFunction(mapFn);
    if (source == undefined) return new this();
    A = [];
    if (mapping) {
      n = 0;
      cb = ctx(mapFn, arguments[2], 2);
      forOf(source, false, function (nextItem) {
        A.push(cb(nextItem, n++));
      });
    } else {
      forOf(source, false, A.push, A);
    }
    return new this(A);
  } });
};

},{"./_a-function":44,"./_ctx":60,"./_export":66,"./_for-of":68}],104:[function(require,module,exports){
'use strict';
// https://tc39.github.io/proposal-setmap-offrom/
var $export = require('./_export');

module.exports = function (COLLECTION) {
  $export($export.S, COLLECTION, { of: function of() {
    var length = arguments.length;
    var A = Array(length);
    while (length--) A[length] = arguments[length];
    return new this(A);
  } });
};

},{"./_export":66}],105:[function(require,module,exports){
// Works with __proto__ only. Old v8 can't work with null proto objects.
/* eslint-disable no-proto */
var isObject = require('./_is-object');
var anObject = require('./_an-object');
var check = function (O, proto) {
  anObject(O);
  if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
};
module.exports = {
  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
    function (test, buggy, set) {
      try {
        set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);
        set(test, []);
        buggy = !(test instanceof Array);
      } catch (e) { buggy = true; }
      return function setPrototypeOf(O, proto) {
        check(O, proto);
        if (buggy) O.__proto__ = proto;
        else set(O, proto);
        return O;
      };
    }({}, false) : undefined),
  check: check
};

},{"./_an-object":47,"./_ctx":60,"./_is-object":77,"./_object-gopd":89}],106:[function(require,module,exports){
'use strict';
var global = require('./_global');
var core = require('./_core');
var dP = require('./_object-dp');
var DESCRIPTORS = require('./_descriptors');
var SPECIES = require('./_wks')('species');

module.exports = function (KEY) {
  var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];
  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
    configurable: true,
    get: function () { return this; }
  });
};

},{"./_core":58,"./_descriptors":62,"./_global":69,"./_object-dp":87,"./_wks":121}],107:[function(require,module,exports){
var def = require('./_object-dp').f;
var has = require('./_has');
var TAG = require('./_wks')('toStringTag');

module.exports = function (it, tag, stat) {
  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
};

},{"./_has":70,"./_object-dp":87,"./_wks":121}],108:[function(require,module,exports){
var shared = require('./_shared')('keys');
var uid = require('./_uid');
module.exports = function (key) {
  return shared[key] || (shared[key] = uid(key));
};

},{"./_shared":109,"./_uid":117}],109:[function(require,module,exports){
var global = require('./_global');
var SHARED = '__core-js_shared__';
var store = global[SHARED] || (global[SHARED] = {});
module.exports = function (key) {
  return store[key] || (store[key] = {});
};

},{"./_global":69}],110:[function(require,module,exports){
var toInteger = require('./_to-integer');
var defined = require('./_defined');
// true  -> String#at
// false -> String#codePointAt
module.exports = function (TO_STRING) {
  return function (that, pos) {
    var s = String(defined(that));
    var i = toInteger(pos);
    var l = s.length;
    var a, b;
    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
    a = s.charCodeAt(i);
    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
      ? TO_STRING ? s.charAt(i) : a
      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
  };
};

},{"./_defined":61,"./_to-integer":112}],111:[function(require,module,exports){
var toInteger = require('./_to-integer');
var max = Math.max;
var min = Math.min;
module.exports = function (index, length) {
  index = toInteger(index);
  return index < 0 ? max(index + length, 0) : min(index, length);
};

},{"./_to-integer":112}],112:[function(require,module,exports){
// 7.1.4 ToInteger
var ceil = Math.ceil;
var floor = Math.floor;
module.exports = function (it) {
  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
};

},{}],113:[function(require,module,exports){
// to indexed object, toObject with fallback for non-array-like ES3 strings
var IObject = require('./_iobject');
var defined = require('./_defined');
module.exports = function (it) {
  return IObject(defined(it));
};

},{"./_defined":61,"./_iobject":74}],114:[function(require,module,exports){
// 7.1.15 ToLength
var toInteger = require('./_to-integer');
var min = Math.min;
module.exports = function (it) {
  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
};

},{"./_to-integer":112}],115:[function(require,module,exports){
// 7.1.13 ToObject(argument)
var defined = require('./_defined');
module.exports = function (it) {
  return Object(defined(it));
};

},{"./_defined":61}],116:[function(require,module,exports){
// 7.1.1 ToPrimitive(input [, PreferredType])
var isObject = require('./_is-object');
// instead of the ES6 spec version, we didn't implement @@toPrimitive case
// and the second argument - flag - preferred type is a string
module.exports = function (it, S) {
  if (!isObject(it)) return it;
  var fn, val;
  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
  throw TypeError("Can't convert object to primitive value");
};

},{"./_is-object":77}],117:[function(require,module,exports){
var id = 0;
var px = Math.random();
module.exports = function (key) {
  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
};

},{}],118:[function(require,module,exports){
var isObject = require('./_is-object');
module.exports = function (it, TYPE) {
  if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
  return it;
};

},{"./_is-object":77}],119:[function(require,module,exports){
var global = require('./_global');
var core = require('./_core');
var LIBRARY = require('./_library');
var wksExt = require('./_wks-ext');
var defineProperty = require('./_object-dp').f;
module.exports = function (name) {
  var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
  if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
};

},{"./_core":58,"./_global":69,"./_library":84,"./_object-dp":87,"./_wks-ext":120}],120:[function(require,module,exports){
exports.f = require('./_wks');

},{"./_wks":121}],121:[function(require,module,exports){
var store = require('./_shared')('wks');
var uid = require('./_uid');
var Symbol = require('./_global').Symbol;
var USE_SYMBOL = typeof Symbol == 'function';

var $exports = module.exports = function (name) {
  return store[name] || (store[name] =
    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
};

$exports.store = store;

},{"./_global":69,"./_shared":109,"./_uid":117}],122:[function(require,module,exports){
var classof = require('./_classof');
var ITERATOR = require('./_wks')('iterator');
var Iterators = require('./_iterators');
module.exports = require('./_core').getIteratorMethod = function (it) {
  if (it != undefined) return it[ITERATOR]
    || it['@@iterator']
    || Iterators[classof(it)];
};

},{"./_classof":53,"./_core":58,"./_iterators":83,"./_wks":121}],123:[function(require,module,exports){
var anObject = require('./_an-object');
var get = require('./core.get-iterator-method');
module.exports = require('./_core').getIterator = function (it) {
  var iterFn = get(it);
  if (typeof iterFn != 'function') throw TypeError(it + ' is not iterable!');
  return anObject(iterFn.call(it));
};

},{"./_an-object":47,"./_core":58,"./core.get-iterator-method":122}],124:[function(require,module,exports){
'use strict';
var ctx = require('./_ctx');
var $export = require('./_export');
var toObject = require('./_to-object');
var call = require('./_iter-call');
var isArrayIter = require('./_is-array-iter');
var toLength = require('./_to-length');
var createProperty = require('./_create-property');
var getIterFn = require('./core.get-iterator-method');

$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {
  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
  from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
    var O = toObject(arrayLike);
    var C = typeof this == 'function' ? this : Array;
    var aLen = arguments.length;
    var mapfn = aLen > 1 ? arguments[1] : undefined;
    var mapping = mapfn !== undefined;
    var index = 0;
    var iterFn = getIterFn(O);
    var length, result, step, iterator;
    if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
    // if object isn't iterable or it's array with default iterator - use simple case
    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
        createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
      }
    } else {
      length = toLength(O.length);
      for (result = new C(length); length > index; index++) {
        createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
      }
    }
    result.length = index;
    return result;
  }
});

},{"./_create-property":59,"./_ctx":60,"./_export":66,"./_is-array-iter":75,"./_iter-call":78,"./_iter-detect":81,"./_to-length":114,"./_to-object":115,"./core.get-iterator-method":122}],125:[function(require,module,exports){
'use strict';
var addToUnscopables = require('./_add-to-unscopables');
var step = require('./_iter-step');
var Iterators = require('./_iterators');
var toIObject = require('./_to-iobject');

// 22.1.3.4 Array.prototype.entries()
// 22.1.3.13 Array.prototype.keys()
// 22.1.3.29 Array.prototype.values()
// 22.1.3.30 Array.prototype[@@iterator]()
module.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {
  this._t = toIObject(iterated); // target
  this._i = 0;                   // next index
  this._k = kind;                // kind
// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
}, function () {
  var O = this._t;
  var kind = this._k;
  var index = this._i++;
  if (!O || index >= O.length) {
    this._t = undefined;
    return step(1);
  }
  if (kind == 'keys') return step(0, index);
  if (kind == 'values') return step(0, O[index]);
  return step(0, [index, O[index]]);
}, 'values');

// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
Iterators.Arguments = Iterators.Array;

addToUnscopables('keys');
addToUnscopables('values');
addToUnscopables('entries');

},{"./_add-to-unscopables":45,"./_iter-define":80,"./_iter-step":82,"./_iterators":83,"./_to-iobject":113}],126:[function(require,module,exports){
'use strict';
var strong = require('./_collection-strong');
var validate = require('./_validate-collection');
var MAP = 'Map';

// 23.1 Map Objects
module.exports = require('./_collection')(MAP, function (get) {
  return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
  // 23.1.3.6 Map.prototype.get(key)
  get: function get(key) {
    var entry = strong.getEntry(validate(this, MAP), key);
    return entry && entry.v;
  },
  // 23.1.3.9 Map.prototype.set(key, value)
  set: function set(key, value) {
    return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);
  }
}, strong, true);

},{"./_collection":57,"./_collection-strong":55,"./_validate-collection":118}],127:[function(require,module,exports){
// 20.2.2.22 Math.log2(x)
var $export = require('./_export');

$export($export.S, 'Math', {
  log2: function log2(x) {
    return Math.log(x) / Math.LN2;
  }
});

},{"./_export":66}],128:[function(require,module,exports){
var $export = require('./_export');
// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
$export($export.S, 'Object', { create: require('./_object-create') });

},{"./_export":66,"./_object-create":86}],129:[function(require,module,exports){
var $export = require('./_export');
// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)
$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperties: require('./_object-dps') });

},{"./_descriptors":62,"./_export":66,"./_object-dps":88}],130:[function(require,module,exports){
var $export = require('./_export');
// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });

},{"./_descriptors":62,"./_export":66,"./_object-dp":87}],131:[function(require,module,exports){
// 19.1.2.14 Object.keys(O)
var toObject = require('./_to-object');
var $keys = require('./_object-keys');

require('./_object-sap')('keys', function () {
  return function keys(it) {
    return $keys(toObject(it));
  };
});

},{"./_object-keys":95,"./_object-sap":97,"./_to-object":115}],132:[function(require,module,exports){
// 19.1.2.15 Object.preventExtensions(O)
var isObject = require('./_is-object');
var meta = require('./_meta').onFreeze;

require('./_object-sap')('preventExtensions', function ($preventExtensions) {
  return function preventExtensions(it) {
    return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;
  };
});

},{"./_is-object":77,"./_meta":85,"./_object-sap":97}],133:[function(require,module,exports){

},{}],134:[function(require,module,exports){
// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
var dP = require('./_object-dp');
var $export = require('./_export');
var anObject = require('./_an-object');
var toPrimitive = require('./_to-primitive');

// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
$export($export.S + $export.F * require('./_fails')(function () {
  // eslint-disable-next-line no-undef
  Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });
}), 'Reflect', {
  defineProperty: function defineProperty(target, propertyKey, attributes) {
    anObject(target);
    propertyKey = toPrimitive(propertyKey, true);
    anObject(attributes);
    try {
      dP.f(target, propertyKey, attributes);
      return true;
    } catch (e) {
      return false;
    }
  }
});

},{"./_an-object":47,"./_export":66,"./_fails":67,"./_object-dp":87,"./_to-primitive":116}],135:[function(require,module,exports){
// 26.1.4 Reflect.deleteProperty(target, propertyKey)
var $export = require('./_export');
var gOPD = require('./_object-gopd').f;
var anObject = require('./_an-object');

$export($export.S, 'Reflect', {
  deleteProperty: function deleteProperty(target, propertyKey) {
    var desc = gOPD(anObject(target), propertyKey);
    return desc && !desc.configurable ? false : delete target[propertyKey];
  }
});

},{"./_an-object":47,"./_export":66,"./_object-gopd":89}],136:[function(require,module,exports){
// 26.1.14 Reflect.setPrototypeOf(target, proto)
var $export = require('./_export');
var setProto = require('./_set-proto');

if (setProto) $export($export.S, 'Reflect', {
  setPrototypeOf: function setPrototypeOf(target, proto) {
    setProto.check(target, proto);
    try {
      setProto.set(target, proto);
      return true;
    } catch (e) {
      return false;
    }
  }
});

},{"./_export":66,"./_set-proto":105}],137:[function(require,module,exports){
'use strict';
var strong = require('./_collection-strong');
var validate = require('./_validate-collection');
var SET = 'Set';

// 23.2 Set Objects
module.exports = require('./_collection')(SET, function (get) {
  return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
}, {
  // 23.2.3.1 Set.prototype.add(value)
  add: function add(value) {
    return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
  }
}, strong);

},{"./_collection":57,"./_collection-strong":55,"./_validate-collection":118}],138:[function(require,module,exports){
'use strict';
var $at = require('./_string-at')(true);

// 21.1.3.27 String.prototype[@@iterator]()
require('./_iter-define')(String, 'String', function (iterated) {
  this._t = String(iterated); // target
  this._i = 0;                // next index
// 21.1.5.2.1 %StringIteratorPrototype%.next()
}, function () {
  var O = this._t;
  var index = this._i;
  var point;
  if (index >= O.length) return { value: undefined, done: true };
  point = $at(O, index);
  this._i += point.length;
  return { value: point, done: false };
});

},{"./_iter-define":80,"./_string-at":110}],139:[function(require,module,exports){
'use strict';
// ECMAScript 6 symbols shim
var global = require('./_global');
var has = require('./_has');
var DESCRIPTORS = require('./_descriptors');
var $export = require('./_export');
var redefine = require('./_redefine');
var META = require('./_meta').KEY;
var $fails = require('./_fails');
var shared = require('./_shared');
var setToStringTag = require('./_set-to-string-tag');
var uid = require('./_uid');
var wks = require('./_wks');
var wksExt = require('./_wks-ext');
var wksDefine = require('./_wks-define');
var enumKeys = require('./_enum-keys');
var isArray = require('./_is-array');
var anObject = require('./_an-object');
var toIObject = require('./_to-iobject');
var toPrimitive = require('./_to-primitive');
var createDesc = require('./_property-desc');
var _create = require('./_object-create');
var gOPNExt = require('./_object-gopn-ext');
var $GOPD = require('./_object-gopd');
var $DP = require('./_object-dp');
var $keys = require('./_object-keys');
var gOPD = $GOPD.f;
var dP = $DP.f;
var gOPN = gOPNExt.f;
var $Symbol = global.Symbol;
var $JSON = global.JSON;
var _stringify = $JSON && $JSON.stringify;
var PROTOTYPE = 'prototype';
var HIDDEN = wks('_hidden');
var TO_PRIMITIVE = wks('toPrimitive');
var isEnum = {}.propertyIsEnumerable;
var SymbolRegistry = shared('symbol-registry');
var AllSymbols = shared('symbols');
var OPSymbols = shared('op-symbols');
var ObjectProto = Object[PROTOTYPE];
var USE_NATIVE = typeof $Symbol == 'function';
var QObject = global.QObject;
// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;

// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
var setSymbolDesc = DESCRIPTORS && $fails(function () {
  return _create(dP({}, 'a', {
    get: function () { return dP(this, 'a', { value: 7 }).a; }
  })).a != 7;
}) ? function (it, key, D) {
  var protoDesc = gOPD(ObjectProto, key);
  if (protoDesc) delete ObjectProto[key];
  dP(it, key, D);
  if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
} : dP;

var wrap = function (tag) {
  var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
  sym._k = tag;
  return sym;
};

var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
  return typeof it == 'symbol';
} : function (it) {
  return it instanceof $Symbol;
};

var $defineProperty = function defineProperty(it, key, D) {
  if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
  anObject(it);
  key = toPrimitive(key, true);
  anObject(D);
  if (has(AllSymbols, key)) {
    if (!D.enumerable) {
      if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
      it[HIDDEN][key] = true;
    } else {
      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
      D = _create(D, { enumerable: createDesc(0, false) });
    } return setSymbolDesc(it, key, D);
  } return dP(it, key, D);
};
var $defineProperties = function defineProperties(it, P) {
  anObject(it);
  var keys = enumKeys(P = toIObject(P));
  var i = 0;
  var l = keys.length;
  var key;
  while (l > i) $defineProperty(it, key = keys[i++], P[key]);
  return it;
};
var $create = function create(it, P) {
  return P === undefined ? _create(it) : $defineProperties(_create(it), P);
};
var $propertyIsEnumerable = function propertyIsEnumerable(key) {
  var E = isEnum.call(this, key = toPrimitive(key, true));
  if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
};
var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
  it = toIObject(it);
  key = toPrimitive(key, true);
  if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
  var D = gOPD(it, key);
  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
  return D;
};
var $getOwnPropertyNames = function getOwnPropertyNames(it) {
  var names = gOPN(toIObject(it));
  var result = [];
  var i = 0;
  var key;
  while (names.length > i) {
    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
  } return result;
};
var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
  var IS_OP = it === ObjectProto;
  var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
  var result = [];
  var i = 0;
  var key;
  while (names.length > i) {
    if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
  } return result;
};

// 19.4.1.1 Symbol([description])
if (!USE_NATIVE) {
  $Symbol = function Symbol() {
    if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
    var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
    var $set = function (value) {
      if (this === ObjectProto) $set.call(OPSymbols, value);
      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
      setSymbolDesc(this, tag, createDesc(1, value));
    };
    if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
    return wrap(tag);
  };
  redefine($Symbol[PROTOTYPE], 'toString', function toString() {
    return this._k;
  });

  $GOPD.f = $getOwnPropertyDescriptor;
  $DP.f = $defineProperty;
  require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;
  require('./_object-pie').f = $propertyIsEnumerable;
  require('./_object-gops').f = $getOwnPropertySymbols;

  if (DESCRIPTORS && !require('./_library')) {
    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
  }

  wksExt.f = function (name) {
    return wrap(wks(name));
  };
}

$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });

for (var es6Symbols = (
  // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
  'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);

for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);

$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
  // 19.4.2.1 Symbol.for(key)
  'for': function (key) {
    return has(SymbolRegistry, key += '')
      ? SymbolRegistry[key]
      : SymbolRegistry[key] = $Symbol(key);
  },
  // 19.4.2.5 Symbol.keyFor(sym)
  keyFor: function keyFor(sym) {
    if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
    for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
  },
  useSetter: function () { setter = true; },
  useSimple: function () { setter = false; }
});

$export($export.S + $export.F * !USE_NATIVE, 'Object', {
  // 19.1.2.2 Object.create(O [, Properties])
  create: $create,
  // 19.1.2.4 Object.defineProperty(O, P, Attributes)
  defineProperty: $defineProperty,
  // 19.1.2.3 Object.defineProperties(O, Properties)
  defineProperties: $defineProperties,
  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
  // 19.1.2.7 Object.getOwnPropertyNames(O)
  getOwnPropertyNames: $getOwnPropertyNames,
  // 19.1.2.8 Object.getOwnPropertySymbols(O)
  getOwnPropertySymbols: $getOwnPropertySymbols
});

// 24.3.2 JSON.stringify(value [, replacer [, space]])
$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
  var S = $Symbol();
  // MS Edge converts symbol values to JSON as {}
  // WebKit converts symbol values to JSON as null
  // V8 throws on boxed symbols
  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
})), 'JSON', {
  stringify: function stringify(it) {
    if (it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
    var args = [it];
    var i = 1;
    var replacer, $replacer;
    while (arguments.length > i) args.push(arguments[i++]);
    replacer = args[1];
    if (typeof replacer == 'function') $replacer = replacer;
    if ($replacer || !isArray(replacer)) replacer = function (key, value) {
      if ($replacer) value = $replacer.call(this, key, value);
      if (!isSymbol(value)) return value;
    };
    args[1] = replacer;
    return _stringify.apply($JSON, args);
  }
});

// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
// 19.4.3.5 Symbol.prototype[@@toStringTag]
setToStringTag($Symbol, 'Symbol');
// 20.2.1.9 Math[@@toStringTag]
setToStringTag(Math, 'Math', true);
// 24.3.3 JSON[@@toStringTag]
setToStringTag(global.JSON, 'JSON', true);

},{"./_an-object":47,"./_descriptors":62,"./_enum-keys":65,"./_export":66,"./_fails":67,"./_global":69,"./_has":70,"./_hide":71,"./_is-array":76,"./_library":84,"./_meta":85,"./_object-create":86,"./_object-dp":87,"./_object-gopd":89,"./_object-gopn":91,"./_object-gopn-ext":90,"./_object-gops":92,"./_object-keys":95,"./_object-pie":96,"./_property-desc":100,"./_redefine":102,"./_set-to-string-tag":107,"./_shared":109,"./_to-iobject":113,"./_to-primitive":116,"./_uid":117,"./_wks":121,"./_wks-define":119,"./_wks-ext":120}],140:[function(require,module,exports){
// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
require('./_set-collection-from')('Map');

},{"./_set-collection-from":103}],141:[function(require,module,exports){
// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
require('./_set-collection-of')('Map');

},{"./_set-collection-of":104}],142:[function(require,module,exports){
// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var $export = require('./_export');

$export($export.P + $export.R, 'Map', { toJSON: require('./_collection-to-json')('Map') });

},{"./_collection-to-json":56,"./_export":66}],143:[function(require,module,exports){
// https://github.com/tc39/proposal-object-values-entries
var $export = require('./_export');
var $entries = require('./_object-to-array')(true);

$export($export.S, 'Object', {
  entries: function entries(it) {
    return $entries(it);
  }
});

},{"./_export":66,"./_object-to-array":98}],144:[function(require,module,exports){
// https://github.com/tc39/proposal-object-getownpropertydescriptors
var $export = require('./_export');
var ownKeys = require('./_own-keys');
var toIObject = require('./_to-iobject');
var gOPD = require('./_object-gopd');
var createProperty = require('./_create-property');

$export($export.S, 'Object', {
  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
    var O = toIObject(object);
    var getDesc = gOPD.f;
    var keys = ownKeys(O);
    var result = {};
    var i = 0;
    var key, desc;
    while (keys.length > i) {
      desc = getDesc(O, key = keys[i++]);
      if (desc !== undefined) createProperty(result, key, desc);
    }
    return result;
  }
});

},{"./_create-property":59,"./_export":66,"./_object-gopd":89,"./_own-keys":99,"./_to-iobject":113}],145:[function(require,module,exports){
// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
require('./_set-collection-from')('Set');

},{"./_set-collection-from":103}],146:[function(require,module,exports){
// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
require('./_set-collection-of')('Set');

},{"./_set-collection-of":104}],147:[function(require,module,exports){
// https://github.com/DavidBruant/Map-Set.prototype.toJSON
var $export = require('./_export');

$export($export.P + $export.R, 'Set', { toJSON: require('./_collection-to-json')('Set') });

},{"./_collection-to-json":56,"./_export":66}],148:[function(require,module,exports){
require('./_wks-define')('asyncIterator');

},{"./_wks-define":119}],149:[function(require,module,exports){
require('./_wks-define')('observable');

},{"./_wks-define":119}],150:[function(require,module,exports){
require('./es6.array.iterator');
var global = require('./_global');
var hide = require('./_hide');
var Iterators = require('./_iterators');
var TO_STRING_TAG = require('./_wks')('toStringTag');

var DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +
  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +
  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +
  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +
  'TextTrackList,TouchList').split(',');

for (var i = 0; i < DOMIterables.length; i++) {
  var NAME = DOMIterables[i];
  var Collection = global[NAME];
  var proto = Collection && Collection.prototype;
  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
  Iterators[NAME] = Iterators.Array;
}

},{"./_global":69,"./_hide":71,"./_iterators":83,"./_wks":121,"./es6.array.iterator":125}],151:[function(require,module,exports){
'use strict';

var _defineProperty = require('babel-runtime/core-js/reflect/define-property');

var _defineProperty2 = _interopRequireDefault(_defineProperty);

var _preventExtensions = require('babel-runtime/core-js/object/prevent-extensions');

var _preventExtensions2 = _interopRequireDefault(_preventExtensions);

var _deleteProperty = require('babel-runtime/core-js/reflect/delete-property');

var _deleteProperty2 = _interopRequireDefault(_deleteProperty);

var _keys = require('babel-runtime/core-js/object/keys');

var _keys2 = _interopRequireDefault(_keys);

var _defineProperty3 = require('babel-runtime/core-js/object/define-property');

var _defineProperty4 = _interopRequireDefault(_defineProperty3);

var _getIterator2 = require('babel-runtime/core-js/get-iterator');

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _defineProperties = require('babel-runtime/core-js/object/define-properties');

var _defineProperties2 = _interopRequireDefault(_defineProperties);

var _map = require('babel-runtime/core-js/map');

var _map2 = _interopRequireDefault(_map);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var metadata = require('./metadata');

var _require = require('./calling-convention'),
    CC = _require.convention,
    makeCallTrampoline = _require.makeCallTrampoline,
    checkTrampolineError = _require.checkTrampolineError,
    convertToCParams = _require.convertToCParams;

var selfPointers = new _map2.default();
// We need to hook this function at startup, because hooking it seems to happen asynchronously
// (maybe because this is basically self-modifying code?) and we don't want to run into race-conditions.
var toCStringPtr = Module.findExportByName("libswiftFoundation.dylib", "_T0s14StringProtocolP10FoundationsAARzSS5IndexVADRtzlE01cA0Says4Int8VGSgSSACE8EncodingV5using_tF");
if (toCStringPtr) {
    Interceptor.attach(toCStringPtr, {
        onEnter: function onEnter() {
            if (selfPointers.has(this.threadId)) {
                this.context[CC.selfRegister] = selfPointers.get(this.threadId);
                selfPointers.delete(this.threadId);
            }
        }
    });
}
var dumpPtr = Module.findExportByName("libswiftCore.dylib", "_T0s4dumpxx_q_z2toSSSg4nameSi6indentSi8maxDepthSi0E5Itemsts16TextOutputStreamR_r0_lF");
var indirectResults = void 0;
if (dumpPtr && CC.indirectResultRegister !== undefined) {
    indirectResults = new _map2.default();
    Interceptor.attach(dumpPtr, {
        onEnter: function onEnter() {
            if (indirectResults.has(this.threadId)) {
                this.context[CC.indirectResultRegister] = indirectResults.get(this.threadId)[1];
                indirectResults.delete(this.threadId);
            }
        }
    });
}

function swiftToString(obj) {
    // TODO: debug crash on 32bit
    var type = obj.$type;
    var pointer = obj.$pointer;
    /*
     * built by disassembling the code for this snippet:
     *
        var str = String()
        dump(x, to: &str)
        let arr : [CChar] = str.cString(using: String.Encoding.utf8)!
        let ptr = UnsafePointer<CChar>(arr)
        strlen(ptr)
     */
    function __swift_destroy_boxed_opaque_existential_0(pointer) {
        var opaque = new metadata.OpaqueExistentialContainer(pointer);
        var type = opaque.type;
        var vwt = opaque.type.valueWitnessTable;
        if (vwt.flags.IsNonInline) {
            var _swift_release_ = new NativeFunction(Memory.readPointer(Swift._api._swift_release), 'void', ['pointer']);
            _swift_release_(opaque.fixedSizeBuffer0);
        } else {
            vwt.destroy(pointer, type._ptr);
        }
    }

    var SwiftString = Swift._typesByName.get("Swift.String");
    if (!SwiftString.canonicalType) SwiftString = SwiftString.withGenericParams();

    var dynamicType = void 0;

    var copy = Memory.alloc(4 * Process.pointerSize);
    var copyFn = void 0;
    var vwt = type.canonicalType.valueWitnessTable;
    if (type.kind === "Existential" && type.canonicalType.getRepresentation() === "Opaque") {
        dynamicType = Swift._api.swift_getDynamicType(pointer, type.canonicalType._ptr, 1);
        copyFn = vwt.initializeBufferWithCopyOfBuffer;
    } else {
        dynamicType = type.canonicalType._ptr;
        copyFn = vwt.initializeBufferWithCopy;
    }
    copyFn.call(vwt, copy, pointer, dynamicType);
    Memory.writePointer(copy.add(3 * Process.pointerSize), dynamicType);

    var stringResult = Memory.alloc(Process.pointerSize * 3);
    Memory.writePointer(stringResult, Swift._api._T0s19_emptyStringStorages6UInt32Vv);
    Memory.writePointer(stringResult.add(Process.pointerSize), ptr(0));
    Memory.writePointer(stringResult.add(2 * Process.pointerSize), ptr(0));

    var textOutputStreamWitnessTableForString = Swift._api._T0SSs16TextOutputStreamsWP;
    var Any = Swift._api.swift_getExistentialTypeMetadata(1, ptr(0), 0, ptr(0));

    var dump = Swift._api._T0s4dumpxx_q_z2toSSSg4nameSi6indentSi8maxDepthSi0E5Itemsts16TextOutputStreamR_r0_lF;

    var LONG_MAX = ptr(0).not().shr(1);

    var returnAlloc = Memory.alloc(4 * Process.pointerSize);
    // TODO: default arguments should in theory be retrieved via generator functions
    var params = [
    /*value*/copy,
    /*to*/stringResult,
    /*name*/ptr(0), ptr(0), ptr(0), 1, // nil
    /*indent*/ptr(0),
    /*maxDepth*/LONG_MAX,
    /*maxItems*/LONG_MAX,
    /*static type of `value`*/Any,
    /*static type of `to`*/SwiftString.canonicalType._ptr,
    /*how to use `to` as a TextOutputStream*/textOutputStreamWitnessTableForString];
    if (CC.indirectResultRegister === undefined) {
        // indirect return value is just another parameter
        params.unshift(returnAlloc);
    } else {
        // indirect return value is set by the installed hook
        indirectResults.set(threadId, returnAlloc);
    }

    dump.apply(null, params);

    // Destroy the return value (a copy of the existential container for the dumped value).
    __swift_destroy_boxed_opaque_existential_0(returnAlloc);

    var encoding = Memory.readPointer(Swift._api._T0SS10FoundationE8EncodingV4utf8ACfau());

    var witnessTableStringProtocol = Swift._api._T0SSs14StringProtocolsWP;
    var listener = void 0;
    var threadId = Process.getCurrentThreadId();
    var toCString = new NativeFunction(toCStringPtr, 'pointer', ['pointer', 'pointer', 'pointer']);

    selfPointers.set(threadId, stringResult);
    var array = toCString(encoding, SwiftString.canonicalType._ptr, witnessTableStringProtocol);

    // the `BridgeObject` this `[CChar]?` contains somewhere deep down is Opaque, so we can't use type
    // metadata to find this offset
    var str = Memory.readUtf8String(array.add(8 + 3 * Process.pointerSize));

    Swift._api.swift_unknownRelease(Memory.readPointer(stringResult.add(2 * Process.pointerSize)));
    Swift._api.swift_bridgeObjectRelease(array);

    return str;
}

function isClassType(t) {
    return t.kind === "Class" || t.kind === "Existential" && t.canonicalType.getRepresentation() === "Class";
}

function makeFunctionWrapper(type, pointer) {
    if (type.kind !== "Function") throw new TypeError("this value has a non-function type, so it cannot be called");

    return function () {
        var flags = type.functionFlags;

        for (var _len = arguments.length, argList = Array(_len), _key = 0; _key < _len; _key++) {
            argList[_key] = arguments[_key];
        }

        if (argList.length < flags.numArguments) {
            throw new TypeError("missing arguments: " + flags.numArguments + " arguments required");
        } else if (argList.length > flags.numArguments) {
            throw new TypeError("too many arguments: " + flags.numArguments + " arguments required");
        }

        if (flags.doesThrow) {
            throw new Error("calling a function that can throw is not yet supported"); // TODO
        }

        switch (flags.convention) {
            case metadata.FunctionMetadataConvention.Swift:
                {
                    if (params.length !== method.args.length) throw new Error("wrong number of parameters");
                    var converted = [];

                    // see NativeConventionSchema::getCoercionTypes
                    for (var i = 0; i < params.length; i++) {
                        // TODO: floats/doubles, vectors
                        // see classifyArgumentType in swift-clang/lib/CodeGen/TargetInfo.cpp
                        var _type = method.args[i].type;
                        var vwt = _type.canonicalType.valueWitnessTable;
                        if (vwt.size === 0) continue;

                        // TODO: verify these are the right conditions for indirect args
                        if (method.args[i].inout || vwt.flags.IsNonBitwiseTakable || vwt.size > CC.maxInlineArgument) {
                            var val = Memory.alloc(Process.pointerSize);
                            val.writePointer(method.args[i].$pointer);
                            // TODO: conversion from JS types
                            converted.push({ val: val, size: Process.pointerSize, stride: Process.pointerSize });
                        } else {
                            var _val = Memory.alloc(vwt.size);
                            if ("$pointer" in params[i] || !('fromJS' in _type) || !_type.fromJS(_val, params[i])) vwt.initializeWithCopy(_val, params[i].$pointer, _type.canonicalType._ptr);
                            converted.push({ val: _val, size: vwt.size, stide: vwt.stride });
                        }
                    }
                    var self = pointer;
                    var indirectReturn = false;
                    var cReturnType = 'void';
                    if (method.returnType) {
                        var _vwt = method.returnType.valueWitnessTable;
                        // TODO: verify these are the right conditions for indirect returns
                        if (_vwt.size > CC.maxInlineReturn || _vwt.flags.IsNonPOD) {
                            indirectReturn = true;
                            var _val2 = Memory.alloc(_vwt.size);
                            converted.unshift({ val: _val2, size: Process.pointerSize, stride: Process.pointerSize });
                        } else {
                            var alignedSize = _vwt.size + _vwt.stride;
                            var _cReturnType = [];
                            var maxVoluntaryInt = Process.pointerSize;
                            var _arr = [8, 4, 2, 1];
                            for (var _i = 0; _i < _arr.length; _i++) {
                                var size = _arr[_i];
                                // TODO: specify larger integers for int types larger than pointers
                                while (size <= maxVoluntaryInt && alignedSize > 0 && alignedSize % size === 0) {
                                    // TODO: floats/doubles, vectors
                                    _cReturnType.push('uint' + (size * 8).toString());
                                    alignedSize -= size;
                                }
                            }
                        }
                    }

                    var indirectResultPointer = undefined;
                    if (indirectReturn && CC.indirectResultRegister) indirectResultPointer = converted.shift()[0];

                    cParams = convertToCParams(params);

                    var trampoline = makeCallTrampoline(method.address, method.doesThrow, self, indirectResultPointer);
                    var trampolineFn = new NativeFunction(trampoline.callAddr, cReturnType, cArgTypes);
                    trampolineFn.apply(undefined, cParams);

                    var err = void 0;
                    if (method.doesThrow) {
                        err = checkTrampolineError();
                        if (err !== undefined) {
                            // TODO: swift_getErrorValue
                            throw new Error("handling errors not yet implemented");
                            return err;
                        }
                    }

                    var retVal = undefined;
                    if (method.returnType) {
                        var _vwt2 = method.returnType.valueWitnessTable;
                        var loc = void 0;
                        if (indirectReturn) {
                            loc = converted[0][0];
                        } else {
                            loc = Memory.alloc(_vwt2.size);
                            for (var _i2 = 0; _i2 < _vwt2.size; _i2 += Process.pointerSize) {
                                Memory.writePointer(loc.add(_i2), registerState[CC.returnRegisters[_i2]]);
                            }
                        }
                        if ('toJS' in method.returnType) retVal = field.type.toJS(loc);

                        if (retVal === undefined) retVal = makeWrapper(method.returnType, loc, true);else _vwt2.destroy(loc, method.returnType.canonicalType._ptr);
                    }
                    return retVal;
                }
            case metadata.FunctionMetadataConvention.Block:
                {
                    var block = new ObjC.Block(pointer);
                    return block.implementation.apply(block, params);
                }
            case metadata.FunctionMetadataConvention.Thin:
                throw new Error("calling thin functions not yet supported");
            case metadata.FunctionMetadataConvention.CFunctionPointer:
                {
                    var convertType = function convertType(swiftType, swiftOrJSVal) {
                        var fridaType = void 0,
                            jsVal = void 0;
                        jsVal = "toJS" in argType ? argType.toJS(swiftOrJSVal.$pointer) : swiftOrJSVal;
                        switch (argType.toString()) {
                            case "Builtin.Int8":
                            case "Swift.Int8":
                                fridaType = "int8";
                                break;
                            case "Builtin.UInt8":
                            case "Swift.UInt8":
                                fridaType = "uint8";
                                break;
                            case "Builtin.Int16":
                            case "Swift.Int16":
                                fridaType = "int16";
                                break;
                            case "Builtin.UInt16":
                            case "Swift.UInt16":
                                fridaType = "uint16";
                                break;
                            case "Builtin.Int32":
                            case "Swift.Int32":
                                fridaType = "int32";
                                break;
                            case "Builtin.UInt32":
                            case "Swift.UInt32":
                                fridaType = "uint32";
                                break;
                            case "Builtin.Int64":
                            case "Swift.Int64":
                                fridaType = "int64";
                                break;
                            case "Builtin.UInt64":
                            case "Swift.UInt64":
                                fridaType = "uint64";
                                break;
                            case "Swift.Double":
                                fridaType = "double";
                                break;
                            case "Swift.Float":
                                fridaType = "float";
                                break;
                            case "()":
                                fridaType = "void";
                                jsVal = undefined;
                                break;
                            default:
                                if (argType.nominalType && argType.nominalType.mangledName === "_T0SP") {
                                    fridaType = "pointer";
                                    if (swiftOrJsVal instanceof NativePointer) jsVal = swiftOrJsVal;else if (jsVal !== undefined) jsVal = Memory.readPointer(swiftOrJsVal.$pointer);
                                } else {
                                    throw new Error("don't know how to convert a '" + argType.toString() + "' to a C value!");
                                }
                        }

                        return { fridaType: fridaType, jsVal: jsVal };
                    };

                    var _params = [];
                    var fridaTypes = [];
                    var argTypes = type.getArguments();

                    for (var _i3 = 0; _i3 < flags.numArguments; _i3++) {
                        var res = convertType(argTypes[_i3], argList[_i3]);
                        if (res.jsVal === undefined && res.fridaType !== "void") {
                            throw new Error("argument " + _i3 + " must not be undefined");
                        }
                        fridaTypes.push(res.fridaType);
                        _params.push(res.jsVal);
                    }

                    var returnType = convertType(type.returnType, undefined);
                    var func = new NativeFunction(Memory.readPointer(pointer), returnType, fridaTypes);
                    return func.apply(undefined, _params);
                }
        }
    };
}

function escapeName(name, obj) {
    if (name.startsWith("$")) name = "$" + name;
    while (name in obj) {
        if (!name.startsWith("$")) name = "$" + name;
        name = "$" + name;
    }
    return obj;
}

function makeWrapper(type, pointer, owned) {
    if (!pointer || pointer.isNull()) {
        throw new Error("value can't be located at NULL");
    }

    var staticType = type;
    if ("$kind" in type) {
        // an ObjC type
        // TODO: check the `owned` variable
        return ObjC.Object(Memory.readPointer(pointer));
    }

    var wrapperObject = {};
    if (type.kind === "Function") {
        wrapperObject = makeFunctionWrapper(type, pointer);
    } else if (isClassType(type)) {
        var object = Memory.readPointer(pointer);
        var canonical = ObjC.api.object_getClass(object);
        type = Swift._typeFromCanonical(canonical);
    }

    wrapperObject.$staticType = staticType;
    wrapperObject.$type = type;
    wrapperObject.$pointer = pointer;

    wrapperObject.toString = swiftToString.bind(undefined, wrapperObject);

    if (isClassType(type)) {
        (0, _defineProperties2.default)(wrapperObject, {
            '$isa': {
                enumerable: true,
                get: function get() {
                    var object = Memory.readPointer(pointer);
                    return Memory.readPointer(object.add(0));
                }
            },
            '$retainCounts': {
                enumerable: true,
                get: function get() {
                    var object = Memory.readPointer(pointer);
                    return Swift._api.CFGetRetainCount(object);
                }
            }
        });
    }

    if ('enumCases' in type) {
        var enumCases = type.enumCases();
        if (enumCases.length === 1) {
            wrapperObject.$enumCase = 0;
        } else if (enumCases.length !== 0) {
            var numPayloads = type.nominalType.enum_.getNumPayloadCases();
            Object.defineProperty(wrapperObject, '$enumCase', {
                enumerable: true,
                get: function get() {
                    var tag = void 0;
                    if (numPayloads === 0) {
                        // a C-like enum: an integer just large enough to represent all cases
                        if (enumCases.length < 1 << 8) tag = Memory.readU8(pointer);else if (enumCases.length < 1 << 16) tag = Memory.readU16(pointer);else if (enumCases.length < 1 << 32) tag = Memory.readU32(pointer);else if (enumCases.length < 1 << 64) tag = Memory.readU64(pointer);else throw new Error("impossibly large number of enum cases");
                    } else if (numPayloads === 1) {
                        // single-payload enum: tag is after the value, or in spare bits if available
                        var opaqueVal = pointer;
                        var payloadType = enumCases[0].type.canonicalType._ptr;
                        tag = Swift._api.swift_getEnumCaseSinglePayload(opaqueVal, payloadType, enumCases.length - numPayloads);
                    } else {
                        // multi-payload enum:
                        // - all non-payload cases are collapsed into a single tag, secondary tag to
                        //   differentiate them is stored in place of value
                        // - tag is stored in spare bits shared by all values
                        // - all remaining bits of tag (that don't fit in spare bits) are appended to the value
                        var _opaqueVal = pointer;
                        tag = Swift._api.swift_getEnumCaseMultiPayload(_opaqueVal, type.nominalType._ptr);
                    }
                    // tag is in range [-ElementsWithPayload..ElementsWithNoPayload-1]
                    // but we want an index into the array returned by enumCases()
                    return tag + numPayloads;
                }
            });
            if (numPayloads > 0) {
                Object.defineProperty(wrapperObject, '$enumPayloadCopy', {
                    enumerable: true,
                    value: function value() {
                        var curCase = enumCases[this.$enumCase];
                        if (curCase.type === null) return undefined;

                        // TODO: Maybe we should copy the whole enum, and then remove the tag
                        // instead of removing the tag, copying the payload, then adding the tag back.

                        var enumVwt = type.canonicalType.valueWitnessTable;
                        var payloadVwt = curCase.type.canonicalType.valueWitnessTable;
                        enumVwt.destructiveProjectEnumData(pointer, type.canonicalType._ptr);

                        var payload = Memory.alloc(payloadVwt.size.toInt32());
                        var address = curCase.indirect ? Swift._api.swift_projectBox(pointer) : pointer;
                        payloadVwt.initializeWithCopy(payload, pointer, curCase.type.canonicalType._ptr);

                        enumVwt.destructiveInjectEnumTag(pointer, curCase.tag, type.canonicalType._ptr);

                        return makeWrapper(curCase.type, payload, true);
                    }
                });
            }
            // TODO: add a way to change current enum case + payload
        }
    }

    if ("fields" in type) {
        var _loop = function _loop() {
            if (_isArray) {
                if (_i4 >= _iterator.length) return 'break';
                _ref = _iterator[_i4++];
            } else {
                _i4 = _iterator.next();
                if (_i4.done) return 'break';
                _ref = _i4.value;
            }

            var field = _ref;

            var getAddr = function getAddr() {
                var addr = void 0;
                if (type.kind === "Struct") {
                    addr = pointer.add(field.offset);
                } else {
                    // Class
                    var _object = Memory.readPointer(pointer);
                    addr = _object.add(field.offset);
                }
                return addr;
            };
            var fieldName = escapeName(field.name, wrapperObject);

            (0, _defineProperty4.default)(wrapperObject, fieldName, {
                enumerable: true,
                get: function get() {
                    var addr = getAddr();
                    var pointer = addr;
                    if (field.weak) {
                        var strong = Swift._api.swift_weakLoadStrong(addr);
                        if (strong.isNull()) return null;
                        // weakLoadStrong() just incremented the strong reference count, undo that.
                        // If the user wants to keep this alive longer than right now, they need to manually increase
                        // the reference count for such a variable just like they'd have to for anything else.
                        // TODO: we probably should register a finalizer and release things there instead.
                        Swift._api.swift_release(strong);
                        pointer = strong;
                        // TODO: does this really work? I have a feeling we need to write this pointer to memory and pass that around.
                    }

                    if ("toJS" in field.type) {
                        var val = field.type.toJS(pointer);
                        if (val !== undefined) return val;
                    }
                    return new field.type(pointer);
                },
                set: function set(newVal) {
                    var addr = getAddr();
                    if (field.weak) {
                        Swift._api.swift_weakAssign(addr, newVal.$pointer);
                    } else {
                        var assigned = false;
                        if ("fromJS" in field.type && !("$pointer" in newVal)) assigned = field.type.fromJS(pointer, newVal);
                        if (!assigned) {
                            type.valueWitnessTable.assignWithCopy(addr, newVal.$pointer, newVal.$type.canonicalType._ptr);
                        }
                    }
                }
            });
        };

        for (var _iterator = type.fields(), _isArray = Array.isArray(_iterator), _i4 = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
            var _ref;

            var _ret = _loop();

            if (_ret === 'break') break;
        }
    }

    if (type.kind === "Existential" && type.canonicalType.getRepresentation() === "Opaque") {
        Object.defineProperty(wrapperObject, '$value', {
            enumerable: true,
            get: function get() {
                var cont = new metadata.OpaqueExistentialContainer(pointer);
                var dynType = Swift._typeFromCanonical(cont.type._ptr);
                if (isClassType(dynType) || !dynType.canonicalType.valueWitnessTable.isValueInline) {
                    return makeWrapper(dynType, pointer, false);
                } else {
                    return makeWrapper(dynType, cont.heapObject, false);
                }
            },
            set: function set(newVal) {
                var witnesses = [];
                var protocols = staticType.canonicalType.protocols.protocols;
                for (var i = 0; i < protocols.length; i++) {
                    var proto = protocols[i];
                    var conformance = Swift._api.swift_conformsToProtocol(newVal.$type.canonicalType._ptr, proto._ptr);
                    if (conformance.isNull()) throw new Error('this value does not implement the required protocol \'' + proto.name + '\'');
                    witnesses.push(conformance);
                }

                var cont = new metadata.OpaqueExistentialContainer(pointer);
                var oldVwt = cont.type.canonicalType.valueWitnessTable;
                // TODO: support assigning ObjC.Object
                if (isClassType(cont.type)) Swift._api.swift_release(cont.heapObject);else if (oldVwt.isValueInline) oldVwt.destroy(pointer);else oldVwt.destroy(cont.heapObject);

                var newVwt = newVal.$type.canonicalType.valueWitnessTable;
                newVwt.initializeBufferWithCopy(pointer, newVal.$pointer, newVal.$type.canonicalType._ptr);
                cont.type = newVal.$type;
                for (var _i5 = 0; _i5 < witnesses.length; _i5++) {
                    cont.setWitnessTable(_i5, witnesses[_i5]);
                }
            }
        });
    }

    if ("tupleElements" in type) {
        var cnt = 0;

        var _loop2 = function _loop2() {
            if (_isArray2) {
                if (_i6 >= _iterator2.length) return 'break';
                _ref2 = _iterator2[_i6++];
            } else {
                _i6 = _iterator2.next();
                if (_i6.done) return 'break';
                _ref2 = _i6.value;
            }

            var elem = _ref2;

            (0, _defineProperty4.default)(wrapperObject, cnt.toString(), {
                enumerable: true,
                get: function get() {
                    // TODO: call toJS() like struct/class fields
                    return elem.type(pointer.add(elem.offset));
                },
                set: function set(val) {
                    // TODO: call fromJS() like struct/class fields
                    wrapperObject[curCnt].$assignWithCopy(val);
                }
            });
            cnt++;
        };

        for (var _iterator2 = type.tupleElements(), _isArray2 = Array.isArray(_iterator2), _i6 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
            var _ref2;

            var _ret2 = _loop2();

            if (_ret2 === 'break') break;
        }
        cnt = 0;

        var _loop3 = function _loop3() {
            if (_isArray3) {
                if (_i7 >= _iterator3.length) return 'break';
                _ref3 = _iterator3[_i7++];
            } else {
                _i7 = _iterator3.next();
                if (_i7.done) return 'break';
                _ref3 = _i7.value;
            }

            var elem = _ref3;

            var curCnt = cnt;
            if (elem.label !== null) {
                (0, _defineProperty4.default)(wrapperObject, escapeName(elem.label, wrapperObject), {
                    enumerable: true,
                    get: function get() {
                        return wrapperObject[curCnt];
                    },
                    set: function set(val) {
                        wrapperObject[curCnt] = val;
                    }
                });
            }
            cnt++;
        };

        for (var _iterator3 = type.tupleElements(), _isArray3 = Array.isArray(_iterator3), _i7 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
            var _ref3;

            var _ret3 = _loop3();

            if (_ret3 === 'break') break;
        }
    }

    /*if ('_methods' in type) {
        for (let [name, method] of type._methods.entries()) {
            Object.defineProperty(wrapperObject, name, {
                enumerable: true,
                value(...params) {
                    return makeFunctionWrapper(method.type, method.address)(...params);
                },
            });
        }
    }*/

    var invalidateWrapper = function invalidateWrapper() {
        (0, _keys2.default)(wrapperObject).forEach(function (key) {
            return (0, _deleteProperty2.default)(wrapperObject, key);
        });
        pointer = undefined;
        type = undefined;
    };
    if (owned) {
        wrapperObject.$destroy = function () {
            type.canonicalType.valueWitnessTable._destroy(pointer, type.canonicalType._ptr);
            invalidateWrapper();
        };
        var destruct = function destruct() {
            try {
                if (pointer !== undefined) wrapperObject.$destroy();
            } catch (e) {
                console.log('unhandled error while cleaning up owned Swift value: ' + e);
            }
        };
        var oldFin = Duktape.fin(pointer);
        Duktape.fin(pointer, function (obj, heapDestruction) {
            // not calling destructor during heap destruction -- variables we require for this may already be gone
            if (!heapDestruction) destruct();
            oldFin(obj, heapDestruction);
        });
    }
    wrapperObject.$assignWithCopy = function (val) {
        if ("$kind" in val) {
            // ObjC type
            throw new Error("ObjC types not yet supported"); // TODO
        } else if ("fromJS" in type && !("$pointer" in val)) {
            type.fromJS(pointer, val);
            return this;
        } else {
            // TODO: check that types are compatible
            staticType.canonicalType.valueWitnessTable.assignWithCopy(pointer, val.$pointer, staticType.canonicalType._ptr);
            var newWrapper = makeWrapper(val.$type, pointer, owned);
            invalidateWrapper();
            return newWrapper;
        }
    };
    wrapperObject.$allocCopy = function () {
        var vwt = type.canonicalType.valueWitnessTable;
        var mem = Memory.alloc(vwt.size.toInt32());
        vwt.initializeWithCopy(mem, pointer, type.canonicalType._ptr);
        return makeWrapper(type, mem, true);
    };

    (0, _preventExtensions2.default)(wrapperObject);

    return wrapperObject;
}

function makeSwiftValue(type) {
    if (!type.canonicalType) {
        throw new Error("the type of a value must have a canonical type descriptor!");
    }

    var _SwiftValue = void 0;
    _SwiftValue = function SwiftValue(pointer) {
        return makeWrapper(_SwiftValue, pointer, false);
    };
    (0, _defineProperty2.default)(_SwiftValue, 'name', { value: type.toString() });

    return _SwiftValue;
}

module.exports = {
    makeSwiftValue: makeSwiftValue
};

},{"./calling-convention":1,"./metadata":6,"babel-runtime/core-js/get-iterator":8,"babel-runtime/core-js/map":10,"babel-runtime/core-js/object/define-properties":13,"babel-runtime/core-js/object/define-property":14,"babel-runtime/core-js/object/keys":17,"babel-runtime/core-js/object/prevent-extensions":18,"babel-runtime/core-js/reflect/define-property":19,"babel-runtime/core-js/reflect/delete-property":20}],152:[function(require,module,exports){
'use strict';

var _setPrototypeOf = require('babel-runtime/core-js/reflect/set-prototype-of');

var _setPrototypeOf2 = _interopRequireDefault(_setPrototypeOf);

var _getOwnPropertyDescriptors = require('babel-runtime/core-js/object/get-own-property-descriptors');

var _getOwnPropertyDescriptors2 = _interopRequireDefault(_getOwnPropertyDescriptors);

var _defineProperties = require('babel-runtime/core-js/object/define-properties');

var _defineProperties2 = _interopRequireDefault(_defineProperties);

var _getIterator2 = require('babel-runtime/core-js/get-iterator');

var _getIterator3 = _interopRequireDefault(_getIterator2);

var _map = require('babel-runtime/core-js/map');

var _map2 = _interopRequireDefault(_map);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

var metadata = require('./metadata');
var swiftValue = require('./swift-value');
var mangling = require('./mangling');

function strlen(pointer) {
    var i = void 0;
    for (i = 0; Memory.readU8(pointer.add(i)) !== 0; i++) {}
    return i;
}

var _leakedMemory = []; // some runtime functions take pointers that must remain valid forever

var typesByCanonical = new _map2.default();
var protocolTypes = new _map2.default();
function getOrMakeProtocolType(proto) {
    var existing = protocolTypes.get(proto._ptr.toString());
    if (existing) {
        return existing;
    }

    var arr = Memory.alloc(Process.pointerSize);
    Memory.writePointer(arr, proto._ptr);

    var canonical = Swift._api.swift_getExistentialTypeMetadata(metadata.ProtocolClassConstraint.Any,
    /*superClass*/ptr(0), /*numProtocols*/1, arr);
    canonical = new metadata.TargetMetadata(canonical);

    if (canonical.protocols.arrayLocation.toString() === arr.toString()) {
        _leakedMemory.push(arr);
    }

    var name = Swift.isSwiftName(proto.name) ? Swift.demangle(proto.name) : proto.name;
    var type = new Type(null, canonical, name);
    protocolTypes.set(proto._ptr.toString(), type);
    return type;
}

function Type(nominalType, canonicalType, name, accessFunction) {
    var _this = this;

    if (canonicalType && typesByCanonical.has(canonicalType._ptr.toString())) {
        var unique = typesByCanonical.get(canonicalType._ptr.toString());
        if (name && !unique.fixedName) unique.fixedName = name;
        return unique;
    }

    if (accessFunction) {
        if (nominalType || canonicalType || !name) throw new Error("type access function must only be provided if the type is not known");
        this.fixedName = name;
        this.accessFunction = accessFunction;
    }

    this.nominalType = nominalType;
    if (!nominalType && canonicalType) {
        this.nominalType = canonicalType.getNominalTypeDescriptor();
        if (canonicalType.kind === "Class") {
            var clsType = canonicalType;
            // ignore artificial subclasses
            while (this.nominalType === null && clsType.isTypeMetadata() && clsType.isArtificialSubclass() && clsType.superClass !== null) {
                clsType = clsType.superClass;
                this.nominalType = clsType.getNominalTypeDescriptor();
            }
        }
    }

    if (canonicalType && (canonicalType.kind === "Class" && canonicalType.isTypeMetadata() && !canonicalType.flags.UsesSwift1Refcounting || canonicalType.kind === "ObjCClassWrapper")) {
        this.toJS = function (pointer) {
            return ObjC.Object(Memory.readPointer(pointer));
        };
        this.fromJS = function (address, value) {
            Swift._api.objc_storeStrong(address, value);return true;
        };
        this.getSize = function getSize() {
            return Process.pointerSize;
        };
    }

    this.canonicalType = canonicalType;
    this.kind = canonicalType ? canonicalType.kind : accessFunction ? "Unknown" : null;

    if (this.nominalType && !canonicalType) accessFunction = this.nominalType.accessFunction;
    if (accessFunction) {
        this.withGenericParams = function withGenericParams() {
            for (var _len = arguments.length, params = Array(_len), _key = 0; _key < _len; _key++) {
                params[_key] = arguments[_key];
            }

            // when there is a generic parent, we don't know the number of generic parameters
            if (this.nominalType && !this.nominalType.genericParams.flags.HasGenericParent && params.length != this.nominalType.genericParams.numGenericRequirements) {
                throw new Error("wrong number of generic parameters");
            }

            var args = [];
            var names = [];
            for (var _iterator = params, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
                var _ref;

                if (_isArray) {
                    if (_i >= _iterator.length) break;
                    _ref = _iterator[_i++];
                } else {
                    _i = _iterator.next();
                    if (_i.done) break;
                    _ref = _i.value;
                }

                var param = _ref;

                if (param.isGeneric() || !param.canonicalType) throw new Error("generic type parameter needs all own type parameters filled!");
                args.push('pointer');
                names.push(param.toString());
            }
            var name = this.toString();
            if (names.length !== 0) name += "<" + names.join(", ") + ">";
            var accessFunc = new NativeFunction(accessFunction, 'pointer', args);
            var canonical = accessFunc.apply(null, params.map(function (t) {
                return t.canonicalType._ptr;
            }));
            return new Type(this.nominalType, new metadata.TargetMetadata(canonical), name);
        };
    }
    if (this.nominalType && canonicalType && (this.kind === "Enum" || this.kind === "Optional")) {
        this.enumCases = function enumCases() {
            var info = this.nominalType.enum_;
            var count = info.getNumCases();
            var payloadCount = info.getNumPayloadCases();
            var cases = [];
            var names = info.caseNames;
            var caseTypeAccessor = new NativeFunction(info.getCaseTypes, 'pointer', ['pointer']);
            var caseTypes = caseTypeAccessor(canonicalType._ptr);
            for (var i = 0; i < count; i++) {
                var type = null;
                var typeFlags = 0;
                if (i < payloadCount) {
                    type = Memory.readPointer(caseTypes.add(i * Process.pointerSize));
                    typeFlags = type.and(metadata.FieldTypeFlags.typeMask);
                    type = new metadata.TargetMetadata(type.and(~metadata.FieldTypeFlags.typeMask));
                }
                cases.push({
                    tag: i - payloadCount,
                    name: names === null ? null : Memory.readUtf8String(names),
                    type: type === null ? null : new Type(null, type, 'case ' + (i - payloadCount) + ' of ' + this),
                    indirect: (typeFlags & metadata.FieldTypeFlags.Indirect) === metadata.FieldTypeFlags.Indirect,
                    weak: (typeFlags & metadata.FieldTypeFlags.Weak) === metadata.FieldTypeFlags.Weak
                });
                names = names === null ? null : names.add(strlen(names) + 1);
            }
            return cases;
        };
    }
    if (["Class", "Struct"].indexOf(this.kind) !== -1 && canonicalType) {
        this.fields = function fields() {
            var results = [];
            var hierarchy = [canonicalType];
            // TODO: use getParentType()
            while (hierarchy[hierarchy.length - 1].superClass) {
                hierarchy.push(hierarchy[hierarchy.length - 1].superClass);
            }
            var offset = ptr(0);
            for (var i = hierarchy.length; i--;) {
                var canon = hierarchy[i];
                var nomin = ["Class", "Struct"].indexOf(canon.kind) != -1 ? canon.getNominalTypeDescriptor() : null;
                if (!nomin) continue;
                var info = nomin.getKind() === "Class" ? nomin.clas : nomin.struct;
                if (!info.hasFieldOffsetVector()) throw new Error("fields without offset vector not implemented");

                var fieldTypeAccessor = new NativeFunction(info.getFieldTypes, 'pointer', ['pointer']);
                var fieldTypes = fieldTypeAccessor(canon._ptr);

                var fieldName = info.fieldNames;
                var fieldOffsets = canon._ptr.add(info.fieldOffsetVectorOffset * Process.pointerSize);
                for (var j = 0; j < info.numFields; j++) {
                    var type = Memory.readPointer(fieldTypes.add(j * Process.pointerSize));
                    var typeFlags = type.and(metadata.FieldTypeFlags.typeMask);
                    type = new metadata.TargetMetadata(type.and(ptr(metadata.FieldTypeFlags.typeMask).not()));
                    var curOffset = Memory.readPointer(fieldOffsets.add(j * Process.pointerSize));
                    var fieldNameStr = Memory.readUtf8String(fieldName);

                    var weak = (typeFlags & metadata.FieldTypeFlags.Weak) === metadata.FieldTypeFlags.Weak;
                    var xtype = new Type(null, type, '?Unknown type of ' + this + '.' + fieldNameStr);
                    results.push({
                        name: fieldNameStr,
                        offset: offset.add(curOffset),
                        type: new Type(null, type, '?Unknown type of ' + this + '.' + fieldNameStr),
                        weak: (typeFlags & metadata.FieldTypeFlags.Weak) === metadata.FieldTypeFlags.Weak
                    });
                    fieldName = fieldName.add(strlen(fieldName) + 1);
                }
            }
            return results;
        };
    }
    if (this.kind === "Existential" && canonicalType) {
        this.protocols = function protocols() {
            return canonicalType.protocols.map(getOrMakeProtocolType);
        };
        this.combineWith = function combineWith(other) {
            if (other.kind !== "Existential") throw new Error("can only combine existential types with each other");
            var protos = canonicalType.protocols.concat(other.canonicalType.protocols);
            // TODO: this is wrong, at least for protocols defined in nested contexts (see TypeDecl::compare)
            protos.sort(function (p1, p2) {
                if (p1.name < p2.name) return -1;
                if (p1.name > p2.name) return 1;
                return p1._ptr.compare(p2._ptr);
            });
            for (var i = 1; i < protos.length; i++) {
                if (protos[i - 1]._ptr.toString() === protos[i]._ptr.toString()) {
                    protos.splice(i, 1);
                    i--;
                }
            }

            var arr = Memory.alloc(protos.length * Process.pointerSize);
            _leakedMemory.push(arr);
            var names = [];
            for (var _i2 = 0; _i2 < protos.length; _i2++) {
                Memory.writePointer(arr.add(_i2 * Process.pointerSize), protos[_i2]._ptr);
                names.push(protos[_i2].name);
            }

            var bound = canonicalType.isClassBounded() || other.canonicalType.isClassBounded() ? "Class" : "Any";
            bound = metadata.ProtocolClassConstraint[bound];

            var superClass = canonicalType.getSuperclassConstraint();
            superClass = superClass === null ? ptr(0) : superClass._ptr;

            var canon = Swift._api.swift_getExistentialTypeMetadata(bound, superClass, protos.length, arr);
            return new Type(null, new metadata.TargetMetadata(canon), names.join(" + "));
        };
        if (canonicalType.isClassBounded()) {
            this.isClassBounded = true;
            this.getSuperclassConstraint = function getSuperclassConstraint() {
                var superClass = canonicalType.getSuperclassConstraint();
                if (superClass) return new Type(null, superClass);
                return null;
            };
            this.withoutClassBound = function withoutClassBound() {
                var protocols = canonicalType.protocols;
                var canon = Swift._api.swift_getExistentialTypeMetadata(metadata.ProtocolClassConstraint.Any, ptr(0), protocols.length, protocols.arrayLocation);
                return new Type(null, new metadata.TargetMetadata(canon));
            };
        } else {
            this.isClassBounded = false;
            this.withClassBound = function withClassBound() {
                var protocols = canonicalType.protocols;
                var canon = Swift._api.swift_getExistentialTypeMetadata(metadata.ProtocolClassConstraint.Class, ptr(0), protocols.length, protocols.arrayLocation);
                return new Type(null, new metadata.TargetMetadata(canon));
            };
        }
        if (canonicalType.isObjC()) {
            this.isObjC = true;
        } else {
            this.isObjC = false;
            if (canonicalType.getSuperclassConstraint()) {
                this.withoutSuperclassConstraint = function withoutSuperclassConstraint() {
                    var protocols = canonicalType.protocols;
                    var canon = Swift._api.swift_getExistentialTypeMetadata(metadata.ProtocolClassConstraint.Class, ptr(0), protocols.length, protocols.arrayLocation);
                    return new Type(null, new metadata.TargetMetadata(canon));
                };
            } else {
                this.withSuperclassConstraint = function withSuperclassConstraint(superType) {
                    var protocols = canonicalType.protocols;
                    var canon = Swift._api.swift_getExistentialTypeMetadata(metadata.ProtocolClassConstraint.Class, superType.canonicalType._ptr, protocols.length, protocols.arrayLocation);
                    return new Type(null, new metadata.TargetMetadata(canon));
                };
            }
        }
    }
    if (this.kind === "Tuple") {
        this.tupleElements = function tupleElements() {
            var labels = canonicalType.labels;
            if (labels.isNull()) labels = null;else labels = Memory.readUtf8String(labels).split(" ");
            var infos = [];
            var elements = canonicalType.elements;
            for (var i = 0; i < canonicalType.numElements; i++) {
                infos.push({
                    label: labels && labels[i] ? labels[i] : null,
                    type: new Type(null, elements[i].type),
                    offset: elements[i].offset
                });
            }
            return infos;
        };
    }
    if (this.kind === "Function") {
        this.returnType = function returnType() {
            return new Type(null, canonicalType.resultType);
        };
        this.functionFlags = function functionFlags() {
            return canonicalType.flags;
        };
        this.getArguments = function getArguments() {
            return canonicalType.getArguments().map(function (arg) {
                return {
                    inout: arg.inout,
                    type: new Type(null, arg.type)
                };
            });
        };
    }
    if (this.kind == "Opaque") {
        if (!name) throw new Error("a name is required when creating Opaque types");
        this.fixedName = name;

        this.getCType = function getCType() {
            var knownTypes = {
                "Builtin.Int8": "int8",
                "Builtin.Int16": "int16",
                "Builtin.Int32": "int32",
                "Builtin.Int64": "int64",
                "Builtin.UInt8": "uint8",
                "Builtin.UInt16": "uint16",
                "Builtin.UInt32": "uint32",
                "Builtin.UInt64": "uint64",
                "Builtin.RawPointer": "pointer"
                // TODO: others (git grep -wE 'Builtin\.\w+' | grep -owE 'Builtin\.[A-Z]\w+' | sort -u)
            };
            return knownTypes[this.fixedName];
        };
        this.getSize = function getSize() {
            var knownSizes = {
                "Builtin.Int8": 1,
                "Builtin.Int16": 2,
                "Builtin.Int32": 4,
                "Builtin.Int64": 8,
                "Builtin.Int128": 16,
                "Builtin.Int256": 32,
                "Builtin.Int512": 64,
                "Builtin.UInt8": 1,
                "Builtin.UInt16": 2,
                "Builtin.UInt32": 4,
                "Builtin.UInt64": 8,
                "Builtin.UInt128": 16,
                "Builtin.UInt256": 32,
                "Builtin.UInt512": 64,
                "Builtin.RawPointer": Process.pointerSize
                // TODO: others (git grep -wE 'Builtin\.\w+' | grep -owE 'Builtin\.[A-Z]\w+' | sort -u)
            };
            return knownSizes[this.fixedName];
        };
        this.toJS = function toJS(pointer) {
            if (this.fixedName === "Builtin.RawPointer") {
                return Memory.readPointer(pointer);
            }

            var size = this.getSize();
            if (size === undefined || size > 8) return undefined;
            if (this.fixedName.indexOf("Builtin.Int") === 0) {
                return Memory['readS' + size * 8](pointer);
            } else if (this.fixedName.indexOf("Builtin.UInt") === 0) {
                return Memory['readU' + size * 8](pointer);
            }

            return undefined;
        };
        this.fromJS = function fromJS(address, value) {
            if (this.fixedName === "Builtin.RawPointer") {
                Memory.writePointer(address, value);
                return true;
            }

            var size = this.getSize();
            if (size === undefined || size > 8) return false;
            if (this.fixedName.indexOf("Builtin.Int") === 0) {
                Memory['writeS' + size * 8](address, value);
                return true;
            } else if (this.fixedName.indexOf("Builtin.UInt") === 0) {
                Memory['writeU' + size * 8](address, value);
                return true;
            }

            return false;
        };
    }
    if (canonicalType && this.kind === "Class") {
        // TODO: use getParentType()
        this.superClass = function superClass() {
            var canon = canonicalType.superClass;
            if (canon === null) return null;
            return new Type(null, canon, '?superClass of ' + this);
        };
    }

    if (canonicalType && (this.kind !== "Class" || canonicalType.isTypeMetadata())) {
        var size = Process.pointerSize; // TODO: Swift doesn't count the static overhead of classes here
        if (canonicalType.valueWitnessTable.flags.IsNonInline) size = canonicalType.valueWitnessTable.size;

        this.getSize = function () {
            return size;
        };

        if ("getGenericArgs" in canonicalType) {
            this.getGenericParams = function getGenericParams() {
                return canonicalType.getGenericArgs().map(function (t) {
                    if (t === null) return null;else {
                        return new Type(null, t);
                    }
                });
            };
        }
    }
    if (this.kind === "ObjCClassWrapper") {
        this.getObjCObject = function getObjCObject() {
            return ObjC.Object(canonicalType.class_);
        };
    }
    if (["ExistentialMetatype", "Metatype"].indexOf(this.kind) !== -1) {
        this.instanceType = function instanceType() {
            return new Type(null, canonicalType.instanceType);
        };
    }

    // TODO: implement me
    /*if (canonicalType && ["Class", "Struct", "Enum"].indexOf(this.kind) !== -1) {
        // This allows you to define a method on this type.
        this.defineMethod = function defineMethod(address, name, type) {
            // TODO: mutating or normal method?
            if (type.kind !== "Function")
                throw new Error("invalid type to act as method signature");
            this._methods.set(name, {'address': address, 'returnType': type.returnType(), 'args': type.getArguments(),
                'doesThrow': type.flags.doesThrow});
        };
        this._methods = new Map();
    }*/

    // due to the toString() this needs to happen last
    if (canonicalType) {
        switch (this.toString()) {
            case "Swift.String":
                this.fromJS = function (address, value) {
                    // TODO: fromJS needs a parameter telling it whether it is initializing or assigning
                    canonicalType.valueWitnessTable.destroy(address, canonicalType._ptr);
                    var cStr = Memory.allocUtf8String(value);
                    api.swift_stringFromUTF8InRawMemory(address, cStr, value.length);
                    return true;
                };
            case "Swift.Bool":
                this.toJS = function (address) {
                    return Memory.readU8(address) !== 0;
                };
                this.fromJS = function (address, value) {
                    Memory.writeU8(address, value ? 1 : 0);return true;
                };
                this.getSize = function getSize() {
                    return 1;
                };
                break;
            case "Swift.UInt":
                this.toJS = function (pointer) {
                    return Memory.readULong(pointer);
                };
                this.fromJS = function (pointer, value) {
                    Memory.writeULong(pointer, value);return true;
                };
                this.getSize = function () {
                    return Process.pointerSize;
                };
                break;
            case "Swift.Int":
                this.toJS = function (pointer) {
                    return Memory.readLong(pointer);
                };
                this.fromJS = function (pointer, value) {
                    Memory.writeLong(pointer, value);return true;
                };
                this.getSize = function () {
                    return Process.pointerSize;
                };
                break;
            case "Swift.Int8":
            case "Swift.Int16":
            case "Swift.Int32":
            case "Swift.Int64":
            case "Swift.Int128":
            case "Swift.Int256":
            case "Swift.Int512":
            case "Swift.UInt8":
            case "Swift.UInt16":
            case "Swift.UInt32":
            case "Swift.UInt64":
            case "Swift.UInt128":
            case "Swift.UInt256":
            case "Swift.UInt512":
            case "Swift.RawPointer":
                this.toJS = function (pointer) {
                    return _this.fields()[0].type.toJS(pointer);
                };
                this.fromJS = function (pointer, value) {
                    return _this.fields()[0].type.fromJS(pointer, value);
                };
                this.getSize = function () {
                    return _this.fields()[0].type.getSize();
                };
                break;
        }

        Object.defineProperty(this, 'Type', {
            enumerable: true,
            get: function get() {
                var meta = void 0;
                if (this.kind === "Existential" || this.kind === "ExistentialMetatype") {
                    meta = Swift._api.swift_getExistentialMetatypeMetadata(canonicalType._ptr);
                } else {
                    meta = Swift._api.swift_getMetatypeMetadata(canonicalType._ptr);
                }
                return new Type(null, new metadata.TargetMetadata(meta), this.toString() + ".Type");
            }
        });
    }

    if (!this.isGeneric()) {
        if (!canonicalType) {
            return this.withGenericParams();
        } else {
            var func = swiftValue.makeSwiftValue(this);
            (0, _defineProperties2.default)(func, (0, _getOwnPropertyDescriptors2.default)(this));
            (0, _setPrototypeOf2.default)(func, Type.prototype);
            typesByCanonical.set(this.canonicalType._ptr.toString(), func);
            return func;
        }
    }
}
Type.prototype = {
    constructor: Type,
    isGeneric: function isGeneric() {
        if (this.accessFunction) return true;

        if (!this.nominalType || this.canonicalType) return false;
        return this.nominalType.genericParams.isGeneric();
    },
    toString: function toString() {
        if ("_name" in this) return this._name;

        if (this.canonicalType) {
            var _Swift$_api$swift_get = Swift._api.swift_getTypeName(this.canonicalType._ptr, /* qualified? */1),
                pointer = _Swift$_api$swift_get[0],
                len = _Swift$_api$swift_get[1];

            var str = Memory.readUtf8String(pointer, len.toInt32());
            if (str.length !== 0 && str !== "<<< invalid type >>>") {
                this._name = str;
                return str;
            }
            switch (this.kind) {
                case "Tuple":
                    this._name = "(" + this.tupleElements().map(function (e) {
                        return (e.label === null ? "" : e.label + ": ") + e.type.toString();
                    }).join(", ") + ")";
                    return this._name;
                case "Function":
                    this._name = "@convention(" + metadata.FunctionConventionStrings[this.functionFlags().convention] + ") (" + this.getArguments().map(function (a) {
                        return (a.inout ? "inout " : "") + a.type.toString();
                    }).join(", ") + ") -> " + this.returnType().toString();
                    return this._name;
                case "ObjCClassWrapper":
                    this._name = Memory.readUtf8String(ObjC.api.class_getName(this.canonicalType.class_));
                    return this._name;
                case "ExistentialMetatype":
                case "Metatype":
                    this._name = this.instanceType().toString() + ".Type";
                    return this._name;
                case "ForeignClass":
                    this._name = Swift.demangle(mangling.MANGLING_PREFIX + "0" + this.canonicalType.name);
                    return this._name;
                case "Class":
                    if (this.canonicalType.isPureObjC()) {
                        this._name = Memory.readUtf8String(ObjC.api.class_getName(this.canonicalType._ptr));
                        return this._name;
                    }
                    break;
                case "Existential":
                    {
                        var protocols = this.canonicalType.protocols.map(function (p) {
                            return Swift.isSwiftName(p.name) ? Swift.demangle(p.name) : p.name;
                        });
                        var _str = protocols.join(" & ");
                        if (this.canonicalType.getSuperclassConstraint()) _str += " : " + new Type(null, this.canonicalType.getSuperclassConstraint()).toString();
                        this._name = _str;
                        return _str;
                    }
            }
        }

        if (this.nominalType) {
            var name = Swift.demangle(this.nominalType.mangledName);
            if (this.nominalType.genericParams.isGeneric()) {
                var params = [];
                if ("getGenericParams" in this) {
                    params = this.getGenericParams().map(function (arg) {
                        return arg.toString();
                    });
                } else {
                    if (this.nominalType.genericParams.flags.HasGenericParent) {
                        params.push("[inherited generic parameters]");
                    }
                    var cnt = this.nominalType.genericParams.numPrimaryParams;
                    for (var i = 0; i < cnt; i++) {
                        params.push("_T" + i);
                    }
                }
                name += "<" + params.join(", ") + ">";
            }
            this._name = name;
            return name;
        }

        if (this.fixedName) {
            this._name = this.fixedName;
            return this.fixedName;
        }
        //this._name = "<<< invalid type >>>" + this.canonicalType + this.nominalType;
        //return this._name;
        throw new Error('cannot get string representation for type without nominal or canonical type information');
    }
};

function findAllTypes(api) {
    var sizeAlloc = Memory.alloc(8);
    var __TEXT = Memory.allocUtf8String("__TEXT");

    var sectionNames = [Memory.allocUtf8String("__swift2_types"), Memory.allocUtf8String("__swift2_proto")];
    var recordSizes = [8, 16];
    var typesByName = new _map2.default();

    function getTypePrio(t) {
        if (t.canonicalType) return 0;
        if (t.nominalType) return 1;
        if (t.accessFunction) return 2;
        throw new Error("invalid state of type object");
    }
    var newTypes = [];
    function addType(t) {
        if (t === null) return;

        var name = t.toString();
        var other = typesByName.get(name);
        if (!other || getTypePrio(t) < getTypePrio(other)) {
            typesByName.set(name, t);
            newTypes.push(t);
        }
    }

    for (var _iterator2 = Process.enumerateModulesSync(), _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
        var _ref2;

        if (_isArray2) {
            if (_i3 >= _iterator2.length) break;
            _ref2 = _iterator2[_i3++];
        } else {
            _i3 = _iterator2.next();
            if (_i3.done) break;
            _ref2 = _i3.value;
        }

        var mod = _ref2;

        for (var section = 0; section < sectionNames.length; section++) {
            // we don't have to use the name _mh_execute_header to refer to the mach-o header -- it's the module header
            var pointer = api.getsectiondata(mod.base, __TEXT, sectionNames[section], sizeAlloc);
            if (pointer.isNull()) continue;

            var sectionSize = Memory.readULong(sizeAlloc);
            for (var i = 0; i < sectionSize; i += recordSizes[section]) {
                var record = void 0;
                var _proto = null;
                if (section === 0) {
                    record = new metadata.TargetTypeMetadataRecord(pointer.add(i));
                } else {
                    record = new metadata.TargetProtocolConformanceRecord(pointer.add(i));
                    _proto = getOrMakeProtocolType(record.protocol);
                    addType(_proto);
                }
                var nominalType = null;
                if (record.getTypeKind() === metadata.TypeMetadataRecordKind.UniqueNominalTypeDescriptor) nominalType = record.getNominalTypeDescriptor();

                var canonicalType = record.getCanonicalTypeMetadata(api);

                if (nominalType || canonicalType) {
                    addType(new Type(nominalType, canonicalType));
                } else {
                    console.log('metadata record without nominal or canonical type?! @' + pointer.add(i) + ' of section ' + section + ' in ' + mod.name + ' ' + record.getTypeKind() + ' ' + _proto);
                }
            }
        }

        // TODO: it kind of sucks that we rely on symbol information here.
        // we should see if there is some other way to find the nominal types for generic data types
        var METADATA_PREFIX = "type metadata for ";
        var METADATA_ACCESSOR_PREFIX = "type metadata accessor for ";
        var NOMINAL_PREFIX = "nominal type descriptor for ";
        for (var _iterator5 = Module.enumerateExportsSync(mod.name), _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : (0, _getIterator3.default)(_iterator5);;) {
            var _ref5;

            if (_isArray5) {
                if (_i6 >= _iterator5.length) break;
                _ref5 = _iterator5[_i6++];
            } else {
                _i6 = _iterator5.next();
                if (_i6.done) break;
                _ref5 = _i6.value;
            }

            var exp = _ref5;

            if (Swift.isSwiftName(exp.name)) {
                var demangled = Swift.demangle(exp.name);
                if (demangled.startsWith(METADATA_PREFIX)) {
                    var name = demangled.substr(METADATA_PREFIX.length);
                    // type metadata sometimes can have members at negative indices, so we need to
                    // iterate until we find something that looks like the beginning of a Metadata object
                    // (Sadly, that doesn't work for class metadata with ISA pointers, but it should be no
                    // problem to find ObjC metadata for such classes.)
                    for (var _i7 = 0; _i7 < 2; _i7++) {
                        var _ptr = exp.address.add(Process.pointerSize * _i7);
                        if (Memory.readPointer(_ptr).toString(10) in metadata.MetadataKind) {
                            addType(new Type(null, new metadata.TargetMetadata(_ptr), name));
                            break;
                        }
                    }
                } else if (demangled.startsWith(NOMINAL_PREFIX)) {
                    var _name = demangled.substr(NOMINAL_PREFIX.length);
                    addType(new Type(new metadata.TargetNominalTypeDescriptor(exp.address), null, _name));
                } else if (demangled.startsWith(METADATA_ACCESSOR_PREFIX)) {
                    var _name2 = demangled.substr(METADATA_ACCESSOR_PREFIX.length);
                    addType(new Type(null, null, _name2, exp.address));
                }
            }
        }
    }

    if (!typesByName.has("Any")) {
        var Any = Swift._api.swift_getExistentialTypeMetadata(metadata.ProtocolClassConstraint.Any, /*superClass*/ptr(0), /*numProtocols*/0, /*protcols*/ptr(0));
        Any = new Type(null, new metadata.TargetMetadata(Any), "Any");
        typesByName.set("Any", Any);
    }
    if (!typesByName.has("Swift.AnyObject")) {
        var AnyObject = Swift._api.swift_getExistentialTypeMetadata(metadata.ProtocolClassConstraint.Class, /*superClass*/ptr(0), /*numProtocols*/0, /*protcols*/ptr(0));
        AnyObject = new Type(null, new metadata.TargetMetadata(AnyObject), "Swift.AnyObject");
        typesByName.set("Swift.AnyObject", AnyObject);
    }
    if (!typesByName.has("Swift.AnyObject.Type")) {
        var _AnyObject = typesByName.get("Swift.AnyObject");
        var AnyClass = _AnyObject.Type;
        typesByName.set("Swift.AnyObject.Type", AnyClass);
        typesByName.set("Swift.AnyClass", AnyClass);
    }
    typesByName.set("()", Swift.makeTupleType([], []));
    typesByName.set("Void", typesByName.get("()"));

    while (newTypes.length) {
        var type = newTypes.pop();
        if ('enumCases' in type) type.enumCases().forEach(function (i) {
            return addType(i.type);
        });
        if ('fields' in type) type.fields().forEach(function (i) {
            return addType(i.type);
        });
        if ('tupleElements' in type) type.tupleElements().forEach(function (i) {
            return addType(i.type);
        });
        if ('getArguments' in type) type.getArguments().forEach(function (i) {
            return addType(i.type);
        });
        if ('returnType' in type) addType(type.returnType());
        if ('superClass' in type) addType(type.superClass());
        if ('instanceType' in type) addType(type.instanceType());
        if ('getGenericParams' in type) type.getGenericParams().forEach(addType);
        if ('getSuperclassConstraint' in type) addType(type.getSuperclassConstraint());
        if (type.kind === "Existential" && type.canonicalType) {
            for (var _iterator3 = type.canonicalType.protocols, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
                var _ref3;

                if (_isArray3) {
                    if (_i4 >= _iterator3.length) break;
                    _ref3 = _iterator3[_i4++];
                } else {
                    _i4 = _iterator3.next();
                    if (_i4.done) break;
                    _ref3 = _i4.value;
                }

                var proto = _ref3;

                addType(getOrMakeProtocolType(proto));
                for (var _iterator4 = proto.inheritedProtocols, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
                    var _ref4;

                    if (_isArray4) {
                        if (_i5 >= _iterator4.length) break;
                        _ref4 = _iterator4[_i5++];
                    } else {
                        _i5 = _iterator4.next();
                        if (_i5.done) break;
                        _ref4 = _i5.value;
                    }

                    var inherited = _ref4;

                    addType(getOrMakeProtocolType(inherited));
                }
            }
        }
    }

    return typesByName;
}

module.exports = {
    findAllTypes: findAllTypes,
    Type: Type
};

},{"./mangling":5,"./metadata":6,"./swift-value":151,"babel-runtime/core-js/get-iterator":8,"babel-runtime/core-js/map":10,"babel-runtime/core-js/object/define-properties":13,"babel-runtime/core-js/object/get-own-property-descriptors":16,"babel-runtime/core-js/reflect/set-prototype-of":21}]},{},[2])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJjYWxsaW5nLWNvbnZlbnRpb24uanMiLCJleGFtcGxlcy9jX2hlYWRlcl9nZW4vY19oZWFkZXJfZ2VuLmpzIiwiaW5kZXguanMiLCJsb2FkZXIuanMiLCJtYW5nbGluZy5qcyIsIm1ldGFkYXRhLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9hcnJheS9mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9nZXQtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL2pzb24vc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9tYXAuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL21hdGgvbG9nMi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2NyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9vYmplY3QvcHJldmVudC1leHRlbnNpb25zLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9yZWZsZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvcmVmbGVjdC9kZWxldGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3JlZmxlY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2NvcmUtanMvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvY29yZS1qcy9zeW1ib2wuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL3N5bWJvbC9pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvdHlwZW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9hcnJheS9mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9nZXQtaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL2pzb24vc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9tYXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL21hdGgvbG9nMi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2NyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0aWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvZW50cmllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2dldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL29iamVjdC9rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9vYmplY3QvcHJldmVudC1leHRlbnNpb25zLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9yZWZsZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vcmVmbGVjdC9kZWxldGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3JlZmxlY3Qvc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vc2V0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9mbi9zeW1ib2wvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L2ZuL3N5bWJvbC9pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYWRkLXRvLXVuc2NvcGFibGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19hcnJheS1pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktbWV0aG9kcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NsYXNzb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29sbGVjdGlvbi1zdHJvbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2NvbGxlY3Rpb24tdG8tanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29sbGVjdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fY3JlYXRlLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jdHguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19lbnVtLWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2V4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2Zvci1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hpZGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2h0bWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19tZXRhLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wbi1leHQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1nb3BuLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtZ29wcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtcGllLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19vYmplY3QtdG8tYXJyYXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX293bi1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3JlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXByb3RvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC1rZXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL190by1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL192YWxpZGF0ZS1jb2xsZWN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MtZXh0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL193a3MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYubWFwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5tYXRoLmxvZzIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYub2JqZWN0LmtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnJlZmxlY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5zZXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczYuc3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5tYXAuZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcubWFwLm9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5tYXAudG8tanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvZXM3Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc2V0Lm9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zZXQudG8tanNvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9lczcuc3ltYm9sLmFzeW5jLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwic3dpZnQtdmFsdWUuanMiLCJ0eXBlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBOztBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUEsQUFBSTtBQUNKLElBQUksUUFBQSxBQUFRLFNBQVIsQUFBaUIsV0FBVyxRQUFBLEFBQVEsYUFBeEMsQUFBcUQsVUFBVSxBQUMzRDtBQUNBOztzQkFBYSxBQUNLLEFBQ2Q7dUJBRlMsQUFFTSxBQUNmO2dDQUhTLEFBR2UsQUFDeEI7MkJBSlMsQUFJVSxLQUFLLEFBQ3hCO3lCQUFpQixJQUFJLFFBTFosQUFLb0IsYUFBYSxBQUMxQzswQkFOUyxBQU1TLEFBQ2xCO3lCQUFpQixRQVBSLEFBT2dCLEFBQ3pCO2dCQVJTLEFBUUQsQUFDUjt5QkFUSixBQUFhLEFBU1EsQUFFeEI7QUFYZ0IsQUFDVDtBQUhSLFdBYVcsUUFBQSxBQUFRLFNBQVIsQUFBaUIsU0FBUyxRQUFBLEFBQVEsYUFBdEMsQUFBbUQsVUFBVSxBQUNoRTtBQUNBOztzQkFBYSxBQUNLLEFBQ2Q7dUJBRlMsQUFFTSxBQUNmO2dDQUhTLEFBR2UsV0FBVyxBQUNuQzsyQkFKUyxBQUlVLElBQUksQUFDdkI7eUJBQWlCLElBQUksUUFMWixBQUtvQixhQUFhLEFBQzFDOzBCQU5TLEFBTVMsQUFDbEI7eUJBQWlCLFFBUFIsQUFPZ0IsQUFDekI7Z0JBUlMsQUFRRCxBQUNSO3lCQVRKLEFBQWEsQUFTUSxBQUV4QjtBQVhnQixBQUNUO0FBSEQsQ0FBQSxNQWFBLEFBQ0g7VUFBTSxJQUFBLEFBQUksTUFBVixBQUFNLEFBQVUsQUFDbkI7O0FBQ0Q7O0FBRUEsSUFBSSxTQUFKLEFBQWEs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Q1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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QUFJLGtCQUFKLEFBQXNCLE1BQ2xCLFFBQVEsS0FBUixBQUFRLEFBQUssQUFDakI7WUFBSSxzQkFBSixBQUEwQixNQUN0QixLQUFBLEFBQUssbUJBQUwsQUFBd0IsUUFBeEIsQUFBZ0MsQUFDcEM7WUFBSSw2QkFBSixBQUFpQyxNQUM3QixRQUFRLEtBQVIsQUFBUSxBQUFLLEFBQ2pCO1lBQUksS0FBQSxBQUFLLFNBQUwsQUFBYyxpQkFBaUIsS0FBbkMsQUFBd0MsZUFBZSxBQUNuRDtBQUFLLGtDQUFhLEtBQUEsQUFBSyxjQUF2QixBQUFxQztBQUFXLEFBQzVDOzs7Ozs7Ozs7OztvQkFESixBQUFTOzt3QkFDRyxzQkFBUixBQUFRLEFBQXNCLEFBQzlCO0FBQUssc0NBQWlCLE1BQXRCLEFBQTRCO0FBQW9CLEFBQzVDOzs7Ozs7Ozs7Ozt3QkFESixBQUFTOzs0QkFDRyxzQkFBUixBQUFRLEFBQXNCLEFBQ2pDO0FBQ0o7QUFDSjtBQUNKO0FBRUQ7O1dBQUEsQUFBTyxBQUNWOzs7QUFFRCxPQUFBLEFBQU87QUFBVSxBQUViO0FBRkosQUFBaUI7QUFBQSxBQUNiIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIifQ==
""")


def recv(message, data):
    if message['type'] == 'error':
        session.detach()
        print(message['description'], file=sys.stderr)
        print(message['stack'], file=sys.stderr)
        sys.exit(1)

def top_sort(dag):
    empty = set()
    no_incoming = set(dag.keys())
    rev_dag = {}
    for source_node, target_nodes in dag.items():
        for target_node in target_nodes:
            no_incoming.discard(target_node)
            rev_dag.setdefault(target_node, set()).add(source_node)
    while no_incoming:
        node = no_incoming.pop()
        yield node
        for target_node in list(dag.get(node, [])):
            rev_dag[target_node].remove(node)
            dag[node].remove(target_node)
            if not dag[node]:
                del dag[node]
            if not rev_dag[target_node]:
                del rev_dag[target_node]
                no_incoming.add(target_node)

    assert not rev_dag



def remove_generic(name):
    if not name.endswith(">"):
        return name

    closed = 1
    generic_params = []
    for i in range(len(name) -2, -1, -1):
        if name[i] == '>' and name[i-1] != '-':
            closed += 1
        elif name[i] == '<':
            closed -= 1

        if closed == 0:
            return name[:i]
    raise Exception("invalid type declaration: " + repr(name))


def print_header(message):
    generator = CGenerator()
    parser = CParser()

    def del_spaces(name):
        if name.startswith('(extension in '):
            idx = name.index('):')
            name = '_extension_in_' + name[14:idx] + "__" + name[idx+2:]

        # file private types
        if ' in _' in name:
            idx = name.index(' in _')
            end = name.index(')', idx)
            start = name.rindex('(', None, idx)
            namespace = name[:start]
            if '>' in namespace:
                namespace = mangle_name(namespace[:-1]) + '.'
            name = namespace + name[start+1:idx] + name[end+1:]
        return name

    def mangle_name(human):
        if human in ('void*', 'voidp', 'Metadata*'):
            return human
        if human == '()':
            return 'void'

        info = types[human]
        if 'getGenericParams' in info and info['getGenericParams']:
            name = remove_generic(human)
        else:
            name = human

        if name.startswith("Static #"):
            spl = name.split(' ', 4)
            return "_static_no" + spl[1][1:] + "_in_" + spl[3] + "__func" + str(hash(spl[4]))[1:]
        name = del_spaces(name)

        outp = f'swift_{info["kind"]}__'

        if info['kind'] == "Tuple":
            elems = []
            for e in info['tupleElements']:
                name = mangle_name(e['type'])
                if e['label']:
                    name += "__as_" + e['label']
                elems.append(name)
            outp += "with__" + "__and__".join(elems)
        elif info['kind'] == "Existential":
            protos = []
            for p in info['protocols']:
                protos.append(del_spaces(script.exports.demangle(p)).replace(".", "__"))
            if info['isClassBounded']:
                protos.append("Swift__AnyObject")
            outp += "conforming_to__" + "__and__".join(protos)
            if info.get('getSuperclassConstraint'):
                outp += "__inheriting_from_" + mangle_name(info['getSuperclassConstraint'])
        elif info['kind'] == 'Function':
            return "func_" + str(hash(name))[1:]
        else:
            outp += name.replace(".", "_")

        if 'getGenericParams' in info and info['getGenericParams']:
            gen_params = [mangle_name(param) for param in info['getGenericParams']]
            outp += "__of__" + "__and__".join(gen_params)

        return outp


    def make_decl(name, offset, type_name):
        nonlocal decls, pad_count, parser, prev_end

        if isinstance(offset, str):
            assert offset[:2] == '0x'
            offset = int(offset, 16)

        if prev_end < offset:
            pad_str = f"char _padding{pad_count}[{offset - prev_end}];"
            decls.append(parser.parse(pad_str).ext[0])
            pad_count += 1

        type_decl = TypeDecl(name.replace(".", "__"), None, IdentifierType([mangle_name(type_name)]))
        decls.append(Decl(None, None, None, None, type_decl, None, None))

        req_graph.setdefault(type_name, set()).add(parent_name)

        if offset != -1:
            size = pointer_size if type_name.endswith('*') else int(types[type_name]['size'], 16)
            prev_end = offset + size

    print("#include <stdint.h>")
    print("#pragma pack(1)")
    print("typedef void *voidp;")
    print("typedef struct Metadata_s Metadata;")
    types = json.loads(message)

    req_graph = {}
    ptr_types = {'void*', 'voidp', 'Metadata*'}
    ctypes = {}

    for name, info in types.items():
        pad_count = 0
        decls = []
        prev_end = 0
        ctype = None
        parent_name = name
        if info['kind'] == "Tuple":
            for i, elem in enumerate(info['tupleElements']):
                make_decl(elem['label'] or f'_{i}', elem['offset'], elem['type'])
            ctype = Struct(mangle_name(name) + "_s", decls)
        elif info['kind'] == "ObjCClassWrapper":
            print(f'typedef struct {mangle_name(name)}_s *{mangle_name(name)};')
        elif info['kind'] in ("Struct", "Class"):
            if info['kind'] == 'Class':
                make_decl('_isa', '0x0', 'Metadata*')
                #make_decl('_refCounts', hex(pointer_size), 'size_t')

            for i, field in enumerate(info['fields']):
                make_decl(field['name'], field['offset'], field['type'])
            ctype = Struct(mangle_name(name) + "_s", decls)

            if info['kind'] == 'Class':
                ctype = PtrDecl(None, ctype)
        elif info['kind'] == "Existential":
            if info['isClassBounded'] or info.get('getSuperclassConstraint'):  # class existential container
                make_decl(f'heap_object', -1, 'void*')
            else:  # opaque existential container
                union = "union { void *heapObject; void *fixedSizeBuffer[3]; };"
                decls.append(parser.parse(union).ext[0])
                make_decl("dynamicType", -1, "Metadata*")
            for i in range(info['witnessTableCount']):
                make_decl(f'_witnessTable{i + 1}', -1, 'void*')
            ctype = Struct(mangle_name(name) + "_s", decls)
        elif info['kind'] in ("Enum", "Optional"):
            if info['enumCases'] and info['enumCases'][0]['name'] is None:
                # C-like enum
                # we don't have case names or values, so just generate a typedef to an int type
                print(f"typedef uint{int(info['size'], 16) * 8}_t {mangle_name(name)};")
            elif len(info['enumCases']) == 0:
                ctype = Struct(mangle_name(name) + "_s", decls)
            elif len(info['enumCases']) == 1 and info['enumCases'][0]['type']:
                make_decl(info['enumCases'][0]['name'], 0, info['enumCases'][0]['type'])
                ctype = Struct(mangle_name(name) + "_s", decls)
            else:
                print(f'typedef struct {mangle_name(name)}_s {{ char _data[{info["size"]}]; }} {mangle_name(name)};')
        elif info['kind'] == 'Opaque':
            if 'getCType' in info:
                ctype_names = {
                    'pointer': 'void*',
                    'int8': 'int8_t',
                    'int16': 'int16_t',
                    'int32': 'int32_t',
                    'int64': 'int64_t',
                    'int64': 'int64_t',
                }
                print(f'typedef {ctype_names[info["getCType"]]} {mangle_name(name)};')
            elif name == 'Builtin.NativeObject':
                print(f'typedef void *{mangle_name(name)};')
            else:
                print(f'typedef char {mangle_name(name)}[{info["size"]}];')
        elif info['kind'] == 'Function':
            print(f"typedef void *func_{str(hash(name))[1:]};")  # TODO: proper names
        else:
            print(f'typedef char {mangle_name(name)}[{info["size"]}];')

        if ctype:
            type_decl = TypeDecl(mangle_name(name), None, ctype)
            ctypes[name] = type_decl
            type_decl_forward = Struct(mangle_name(name) + "_s", [])
            if isinstance(type_decl, PtrDecl):
                ptr_types.add(name)
                type_decl_forward = PtrDecl(None, type_decl_forward)
                print(generator.visit(Typedef(mangle_name(name), None, ['typedef'], type_decl_forward)) + ";")

    for name in ptr_types:
        req_graph.pop(name, None)

    for name in top_sort(req_graph):
        if name in ctypes:
            print(f"\n// {name}")
            print(generator.visit(Typedef(mangle_name(name), None, ['typedef'], ctypes[name])) + ";")

script.on('message', recv)
script.load()
pointer_size = script.exports.pointerSize()
print_header(script.exports.run())
session.detach()
sys.exit(0)
Share this script:
Twitter LinkedIn

Comments

Login or Sign up to leave a comment.
Loading comments...