UNPKG

ts-gir

Version:
562 lines (465 loc) 92.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); require("core-js/modules/es.array.index-of"); require("core-js/modules/es.array.iterator"); require("core-js/modules/es.array.map"); require("core-js/modules/es.set"); require("core-js/modules/es.string.split"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _babelParserGenerator = _interopRequireDefault(require("babel-parser-generator")); var _lodash = _interopRequireDefault(require("lodash")); var _runtime = require("babel-plugin-ts-optchain/lib/runtime"); class GirTSGenerator extends _babelParserGenerator.default { constructor($namespace, userConfig, logger, moduleName = '') { super(); this.options = { plugins: ['jsx', 'typescript'], sourceType: 'module' }; this.imports = new Set(); this.isModule = false; this.moduleTypes = new Set(); this.renamed = { classes: {}, functions: {} }; this.$namespace = $namespace; this.userConfig = userConfig; this.logger = logger; this.moduleName = moduleName; this.isModule = !!moduleName.length; } build() { this.setModulesTypes(); this.buildModules(); this.buildImports(this.imports); } setModulesTypes() { let $constants = (0, _runtime.oc)(this.$namespace, ["constant"], []); if (!Array.isArray($constants)) { $constants = [$constants]; } let $enumerations = (0, _runtime.oc)(this.$namespace, ["enumeration"], []); if (!Array.isArray($enumerations)) { $enumerations = [$enumerations]; } let $aliases = (0, _runtime.oc)(this.$namespace, ["alias"], []); if (!Array.isArray($aliases)) $aliases = [$aliases]; let $unions = (0, _runtime.oc)(this.$namespace, ["union"], []); if (!Array.isArray($unions)) $unions = [$unions]; let $classes = (0, _runtime.oc)(this.$namespace, ["class"], []); if (!Array.isArray($classes)) $classes = [$classes]; let $records = (0, _runtime.oc)(this.$namespace, ["record"], []); if (!Array.isArray($records)) { $records = [$records]; } let $bitfields = (0, _runtime.oc)(this.$namespace, ["bitfield"], []); if (!Array.isArray($bitfields)) $bitfields = [$bitfields]; let $functions = (0, _runtime.oc)(this.$namespace, ["function"], []); if (!Array.isArray($functions)) { $functions = [$functions]; } let $callbacks = (0, _runtime.oc)(this.$namespace, ["callback"], []); if (!Array.isArray($callbacks)) { $callbacks = [$callbacks]; } $constants.forEach($constant => { this.moduleTypes.add($constant['@_name']); }); $aliases.forEach($alias => { this.moduleTypes.add($alias['@_name']); }); $unions.forEach($union => { this.moduleTypes.add($union['@_name']); }); $enumerations.forEach($enumeration => { this.moduleTypes.add($enumeration['@_name']); }); $classes.forEach($class => { this.moduleTypes.add($class['@_name']); }); $bitfields.forEach($bitfield => { this.moduleTypes.add($bitfield['@_name']); }); $records.forEach($record => { this.moduleTypes.add($record['@_name']); }); $functions.forEach($function => { this.moduleTypes.add($function['@_name']); }); $callbacks.forEach($callback => { this.moduleTypes.add($callback['@_name']); }); } buildModules(path = '') { const count = this.isModule ? this.append(`declare module '${this.moduleName}' {}`, path) : 0; this.buildConstantDeclarations((0, _runtime.oc)(this.$namespace, ["constant"], []), [path, this.isModule ? count - 1 : '']); this.buildEnumDeclarations((0, _runtime.oc)(this.$namespace, ["enumeration"], []), [path, this.isModule ? count - 1 : '']); this.buildEnumDeclarations((0, _runtime.oc)(this.$namespace, ["bitfield"], []), [path, this.isModule ? count - 1 : '']); this.buildTypeDeclarations((0, _runtime.oc)(this.$namespace, ["alias"], []), [path, this.isModule ? count - 1 : '']); this.buildTypeDeclarations((0, _runtime.oc)(this.$namespace, ["union"], []), [path, this.isModule ? count - 1 : '']); this.buildInterfaceDeclarations((0, _runtime.oc)(this.$namespace, ["interface"], []), [path, this.isModule ? count - 1 : '']); this.buildClassDeclarations((0, _runtime.oc)(this.$namespace, ["class"], []), [path, this.isModule ? count - 1 : '']); this.buildClassDeclarations((0, _runtime.oc)(this.$namespace, ["record"], []), [path, this.isModule ? count - 1 : '']); this.buildFunctionDeclarations((0, _runtime.oc)(this.$namespace, ["function"], []), [path, this.isModule ? count - 1 : '']); this.buildCallbackDeclarations((0, _runtime.oc)(this.$namespace, ["callback"], []), [path, this.isModule ? count - 1 : '']); } buildImports(imports, path = '') { imports.forEach(importName => { let importPath = this.userConfig.importMap[_lodash.default.kebabCase(importName)]; if (!importPath) importPath = `./${_lodash.default.kebabCase(importName)}`; this.prepend(`import * as ${importName} from '${importPath}'`, path); this.logger.warn(`importing '${importName}' from '${importPath}'`); }); } buildTypeDeclarations($aliasesOrUnions, path = '') { if (!Array.isArray($aliasesOrUnions)) $aliasesOrUnions = [$aliasesOrUnions]; $aliasesOrUnions.forEach($aliasOrUnion => { const typeName = $aliasOrUnion['@_name']; let types = $aliasOrUnion; if ($aliasOrUnion.field) { types = $aliasOrUnion.field; } if (!Array.isArray(types)) types = [types]; const typeString = _lodash.default.uniq(types.map(t => this.getType(t))).join(' | '); this.append(`export type ${typeName} = ${typeString}`, [path, this.isModule ? 'body.body' : '']); }); } buildEnumDeclarations($enumerations, path = '') { if (!Array.isArray($enumerations)) $enumerations = [$enumerations]; $enumerations.forEach($enumeration => { const enumName = $enumeration['@_name']; const count = this.append(`export enum ${enumName} {}`, [path, this.isModule ? 'body.body' : '']); this.buildEnumDeclarationMembers((0, _runtime.oc)($enumeration, ["member"], []), [path, this.isModule ? 'body.body' : '', count - 1]); }); } buildEnumDeclarationMembers($members, path = '') { if (!Array.isArray($members)) $members = [$members]; $members.forEach($member => { const identifierName = $member['@_c:identifier']; this.append(`enum E {${identifierName}}`, [path, 'declaration.members'], 'members.0'); }); } buildConstantDeclarations($constants, path = '') { if (!Array.isArray($constants)) $constants = [$constants]; $constants.forEach($constant => { const constantName = $constant['@_name']; const constantType = this.getType($constant); this.append(`export const ${constantName}: ${constantType};`, [path, this.isModule ? 'body.body' : '']); }); } buildFunctionDeclarations($functions, path = '') { if (!Array.isArray($functions)) $functions = [$functions]; $functions.forEach($function => { const returnType = this.getType($function['return-value']); let functionName = $function['@_name']; if (this.isReservedKeyword(functionName)) { functionName = `g_${functionName}`; this.renamed.functions[$function['@_name']] = functionName; this.logger.warn(`function '${$function['@_name']}' renamed to '${functionName}'`); } const count = this.append(`export function ${functionName}(): ${returnType}`, [path, this.isModule ? 'body.body' : '']); this.buildFunctionParams((0, _runtime.oc)($function, ["parameters", "parameter"], []), [path, this.isModule ? 'body.body' : '', count - 1, 'declaration.params']); }); } buildCallbackDeclarations($callbacks, path = '') { if (!Array.isArray($callbacks)) { this.logger.warn(`$callbacks is not an array: ${JSON.stringify($callbacks, null, 2)}`); return; } $callbacks.forEach($callback => { const returnType = this.getType($callback['return-value']); const callbackName = $callback['@_name']; const count = this.append(`export type ${callbackName} = () => ${returnType}`, [path, this.isModule ? 'body.body' : '']); this.buildFunctionParams((0, _runtime.oc)($callback, ["parameters", "parameter"], []), [path, this.isModule ? 'body.body' : '', count - 1, 'declaration.typeAnnotation.parameters']); }); } buildFunctionParams($parameters, path = '') { if (!Array.isArray($parameters)) $parameters = [$parameters]; let paramRequired = true; $parameters.forEach($parameter => { let paramName = this.safeWord($parameter['@_name']); let paramType = this.getType($parameter); if (paramName === 'arguments' || paramName === 'eval') { paramName = `_${paramName}`; paramRequired = !paramRequired ? false : $parameter['@_optional'] !== '1'; } else if (paramName === '...') { paramName = '...args'; paramRequired = true; paramType = this.getType($parameter, { isArray: true }); } if (paramType) { // TODO: some param types not supported this.append(`function f(${paramName}${paramRequired ? '' : '?'}: ${paramType}) {}`, path, 'params.0'); } }); } buildInterfaceDeclarations($interfaces, path = '') { if (!Array.isArray($interfaces)) $interfaces = [$interfaces]; return $interfaces.forEach($interface => { const interfaceName = $interface['@_name']; const count = this.append(`export interface ${interfaceName} {}`, [path, this.isModule ? 'body.body' : '']); this.buildPropertyDeclarations((0, _runtime.oc)($interface, ["property"], []), [path, this.isModule ? 'body.body' : '', count - 1], $interface); this.buildMethodDeclarations((0, _runtime.oc)($interface, ["method"], []), [path, this.isModule ? 'body.body' : '', count - 1], $interface); }); } buildClassDeclarations($classes, path = '') { if (!$classes.forEach) { return undefined; } return $classes.forEach($class => { let className = $class['@_name']; let parentClassName = $class['@_parent']; if (parentClassName) { const parentClassNameSplit = parentClassName.split('.'); if (parentClassNameSplit.length > 1 && parentClassNameSplit[0] !== this.$namespace['@_name']) { this.imports.add(parentClassNameSplit[0]); } } if (this.isReservedKeyword(className)) { this.logger.warn(`parent class '${className}' renamed to 'g_${className}'`); className = `g_${className}`; } if (this.isReservedKeyword(parentClassName)) { this.logger.warn(`parent class '${parentClassName}' renamed to 'g_${parentClassName}'`); parentClassName = `g_${parentClassName}`; } const count = this.append(`export class ${className} ${parentClassName ? `extends ${parentClassName} ` : ''}{}`, [path, this.isModule ? 'body.body' : '']); this.buildConstructorDeclaration((0, _runtime.oc)($class, ["constructor"], []), [path, this.isModule ? 'body.body' : '', count - 1]); this.buildPropertyDeclarations((0, _runtime.oc)($class, ["property"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class); this.buildPropertyDeclarations((0, _runtime.oc)($class, ["field"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class, true); this.buildMethodDeclarations((0, _runtime.oc)($class, ["method"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class); this.buildMethodDeclarations((0, _runtime.oc)($class, ['virtual-method'], []), [path, this.isModule ? 'body.body' : '', count - 1], $class); this.buildMethodDeclarations((0, _runtime.oc)($class, ["function"], []), [path, this.isModule ? 'body.body' : '', count - 1], $class, true); }); } getClassIdentifiers($class, recursive = true) { const result = {}; if (!$class) return result; const $parentClass = _lodash.default.find((0, _runtime.oc)(this.$namespace, ["class"], []), $namespaceClass => $namespaceClass['@_name'] === $class['@_parent'] && typeof $namespaceClass['@_name'] === 'object'); let $properties = (0, _runtime.oc)($class, ["property"], []); if (!Array.isArray($properties)) { $properties = [$properties]; } let $methods = (0, _runtime.oc)($class, ["method"], []); if (!Array.isArray($methods)) $methods = [$methods]; let $fields = (0, _runtime.oc)($class, ["field"], []); if (!Array.isArray($fields)) $fields = [$fields]; let $functions = (0, _runtime.oc)($class, ["function"], []); if (!Array.isArray($functions)) { $functions = [$functions]; } let $virtualMethods = (0, _runtime.oc)($class, ['virtual-method'], []); if (!Array.isArray($virtualMethods)) { $virtualMethods = [$virtualMethods]; } const parentClassIdentifiers = $parentClass ? Object.keys(this.getClassIdentifiers($parentClass)) : []; const identifiers = [...(recursive ? parentClassIdentifiers : []), ...$fields.map($field => $field['@_name']), ...$functions.map($function => $function['@_name']), ...$methods.map($method => $method['@_name']), ...$properties.map($property => $property['@_name']), ...$virtualMethods.map($method => $method['@_name'])]; identifiers.forEach(identifier => { result[identifier] = result[identifier] ? ++result[identifier] : 1; }); return result; } getParentClassIdentifiers($class, recursive = true) { if (!$class) return {}; const $parentClass = _lodash.default.find((0, _runtime.oc)(this.$namespace, ["class"], []), $namespaceClass => $namespaceClass['@_name'] === $class['@_parent']); if (!$parentClass) return {}; return this.getClassIdentifiers($parentClass, recursive); } buildMethodDeclarations($methods, path = '', $class, isStatic = false) { if (!Array.isArray($methods)) $methods = [$methods]; const parentClassIdentifiers = this.getParentClassIdentifiers($class); const classIdentifiers = this.getClassIdentifiers($class, false); $methods.forEach($method => { let methodName = $method['@_name']; if (this.isReservedKeyword(methodName) || methodName === 'constructor') { methodName = `g_${methodName}`; if ($class) { if (!this.renamed.classes[$class['@_name']]) { this.renamed.classes[$class['@_name']] = {}; } this.renamed.classes[$class['@_name']][$method['@_name']] = methodName; } this.logger.warn(`method '${$method['@_name']}' renamed to '${methodName}'${$class ? ` in class '${$class['@_name']}'` : ''}`); } else if (!methodName.length) { this.logger.warn(`empty method name${$class ? ` in class '${$class['@_name']}'` : ''}`); return true; } if (this.userConfig.ignoreDuplicates && (parentClassIdentifiers[methodName] || classIdentifiers[methodName] > 1)) { this.logger.warn(`duplicate method '${methodName}' ignored${$class ? ` in class '${$class['@_name']}'` : ''}`); } else { const duplicate = parentClassIdentifiers[methodName] || classIdentifiers[methodName] > 1; const returnType = this.getType($method['return-value']); if (duplicate) { this.append(`class Class {${isStatic ? 'static ' : ''}${methodName}(...args: any[]): any}`, [path, 'declaration.body.body'], 'body.body'); } else { const count = this.append(`class Class {${isStatic ? 'static ' : ''}${methodName}(): ${returnType}}`, [path, 'declaration.body.body'], 'body.body'); this.buildMethodDeclarationParams((0, _runtime.oc)($method, ["parameters", "parameter"], []), [path, 'declaration.body.body', count - 1]); } } return true; }); } buildConstructorDeclaration($constructors, path = '') { let $constructor = $constructors; if (Array.isArray($constructors)) { if ($constructors.length) { $constructor = $constructors[0]; } } if (!$constructor['@_name']) return; const count = this.append('class C {constructor()}', [path, 'declaration.body.body'], 'body.body.0'); this.buildFunctionParams((0, _runtime.oc)($constructor, ["parameters", "parameter"], []), [path, 'declaration.body.body', count - 1, 'params']); } buildMethodDeclarationParams($parameters, path = '') { if (!Array.isArray($parameters)) $parameters = [$parameters]; let paramRequired = true; $parameters.forEach($parameter => { let paramName = this.safeWord($parameter['@_name']); let paramType = this.getType($parameter); if (paramName === 'arguments' || paramName === 'eval') { paramName = `_${paramName}`; } else if (paramName === '...') { paramName = '...args'; paramRequired = true; paramType = this.getType($parameter, { isArray: true }); } paramRequired = !paramRequired ? false : $parameter['@_optional'] !== '1'; if (paramType && paramName !== '...') { // TODO: some param types not supported this.append(`function f(${paramName}${paramRequired ? '' : '?'}: ${paramType}) {}`, [path, 'params'], 'params.0'); } }); } buildPropertyDeclarations($properties, path = '', $class, isStatic = false) { if (!Array.isArray($properties)) $properties = [$properties]; const parentClassIdentifiers = this.getParentClassIdentifiers($class); const classIdentifiers = this.getClassIdentifiers($class, false); $properties.forEach($property => { let propertyName = $property['@_name']; if (this.isReservedKeyword(propertyName) || propertyName === 'constructor') { propertyName = `g_${propertyName}`; if ($class) { if (!this.renamed.classes[$class['@_name']]) { this.renamed.classes[$class['@_name']] = {}; } this.renamed.classes[$class['@_name']][$property['@_name']] = propertyName; } this.logger.warn(`property '${$property['@_name']}' renamed to '${propertyName}'${$class ? ` in class '${$class['@_name']}'` : ''}`); } if (this.userConfig.ignoreDuplicates && (parentClassIdentifiers[propertyName] || classIdentifiers[propertyName] > 1)) { this.logger.warn(`duplicate property '${propertyName}' ignored`); } else { const duplicate = parentClassIdentifiers[propertyName] || classIdentifiers[propertyName] > 1; const propertyType = this.getType($property); if (duplicate) { this.append(`class Class {${isStatic ? 'static ' : ''}${propertyName.indexOf('-') > -1 ? `'${propertyName}'` : propertyName}: any}`, [path, 'declaration.body.body'], 'body.body.0'); } else { this.append(`class Class {${isStatic ? 'static ' : ''}${propertyName.indexOf('-') > -1 ? `'${propertyName}'` : propertyName}: ${propertyType}}`, [path, 'declaration.body.body'], 'body.body.0'); } } }); } getType(girType, options = { isArray: null, nullable: null }) { let isArray = options.isArray, nullable = options.nullable; if (typeof isArray === 'undefined') isArray = null; if (typeof nullable === 'undefined') nullable = null; const girTypeStrict = girType; // TODO: some param types not supported let girTypeStr = ''; let knownType = null; if (typeof girTypeStrict !== 'string') { if (girTypeStrict.array) { if (isArray === null) isArray = true; girTypeStr = (0, _runtime.oc)(girTypeStrict, ["array", "type", '@_name'], '').toString(); nullable = (0, _runtime.oc)(girTypeStrict, ['@_nullable']) === '1' && (0, _runtime.oc)(girTypeStrict, ['@_optional']) !== '1'; } else if (girTypeStrict.callback) { const returnType = this.getType(girTypeStrict.callback['return-value']); const girTypescriptGenerator = new GirTSGenerator(this.$namespace, this.userConfig, this.logger, this.moduleName); girTypescriptGenerator.append(`type T = () => ${returnType}`, '', 'typeAnnotation'); girTypescriptGenerator.moduleTypes = this.moduleTypes; girTypescriptGenerator.buildFunctionParams((0, _runtime.oc)(girTypeStrict, ["callback", "parameters", "parameter"], []), ['0', 'parameters']); knownType = girTypescriptGenerator.generate(); } else if (girTypeStrict.type) { girTypeStr = (0, _runtime.oc)(girTypeStrict, ["type", '@_name'], '').toString(); nullable = (0, _runtime.oc)(girTypeStrict, ['@_nullable']) === '1' && (0, _runtime.oc)(girTypeStrict, ['@_optional']) !== '1'; } else { knownType = 'any'; } } if (isArray === null) isArray = false; if (nullable === null) nullable = false; girTypeStr = girTypeStr.split(' ').pop() || ''; if (!girTypeStr && !knownType) knownType = 'any'; let array = ''; if (isArray) array = '[]'; if (knownType) { if (knownType.indexOf(' ') > -1 && array.length) { knownType = `(${knownType})`; } knownType = `${knownType}${array}`; return knownType; } let tsType = { '': `any${array}`, double: `number${array}`, gboolean: `boolean${array}`, gchar: `number${array}`, gdouble: `number${array}`, gfloat: `number${array}`, gint16: `number${array}`, gint32: `number${array}`, gint64: `number${array}`, gint8: `number${array}`, gint: `number${array}`, glong: `number${array}`, gpointer: `object${array}`, gsize: `number${array}`, gssize: `number${array}`, guint16: `number${array}`, guint32: `number${array}`, guint64: `number${array}`, guint8: `number${array}`, guint: `number${array}`, gulong: `number${array}`, gunichar: `number${array}`, gushort: `number${array}`, long: `number${array}`, none: `void${array}`, object: `any${array}`, utf8: `string${array}`, va_list: `any${array}` }[girTypeStr]; if (!tsType) { const moduleName = this.$namespace['@_name']; let moduleType = girTypeStr; const girTypeStrSplit = girTypeStr.split('.'); if (girTypeStrSplit[0] === moduleName) { moduleType = girTypeStrSplit.pop() || girTypeStr; } if (this.moduleTypes.has(moduleType)) { tsType = moduleType + array; } else if (girTypeStrSplit.length > 1) { this.imports.add(girTypeStrSplit[0]); tsType = girTypeStr + array; } else { this.logger.warn(`unknown type '${moduleType}' set to 'any'`); tsType = `any${array}`; } } if (nullable) tsType = `${tsType} | null`; return tsType; } } exports.default = GirTSGenerator; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9HaXJUU0dlbmVyYXRvci50cyJdLCJuYW1lcyI6WyJHaXJUU0dlbmVyYXRvciIsIkJhYmVsUGFyc2VyR2VuZXJhdG9yIiwiY29uc3RydWN0b3IiLCIkbmFtZXNwYWNlIiwidXNlckNvbmZpZyIsImxvZ2dlciIsIm1vZHVsZU5hbWUiLCJvcHRpb25zIiwicGx1Z2lucyIsInNvdXJjZVR5cGUiLCJpbXBvcnRzIiwiU2V0IiwiaXNNb2R1bGUiLCJtb2R1bGVUeXBlcyIsInJlbmFtZWQiLCJjbGFzc2VzIiwiZnVuY3Rpb25zIiwibGVuZ3RoIiwiYnVpbGQiLCJzZXRNb2R1bGVzVHlwZXMiLCJidWlsZE1vZHVsZXMiLCJidWlsZEltcG9ydHMiLCIkY29uc3RhbnRzIiwib2MiLCJBcnJheSIsImlzQXJyYXkiLCIkZW51bWVyYXRpb25zIiwiJGFsaWFzZXMiLCIkdW5pb25zIiwiJGNsYXNzZXMiLCIkcmVjb3JkcyIsIiRiaXRmaWVsZHMiLCIkZnVuY3Rpb25zIiwiJGNhbGxiYWNrcyIsImZvckVhY2giLCIkY29uc3RhbnQiLCJhZGQiLCIkYWxpYXMiLCIkdW5pb24iLCIkZW51bWVyYXRpb24iLCIkY2xhc3MiLCIkYml0ZmllbGQiLCIkcmVjb3JkIiwiJGZ1bmN0aW9uIiwiJGNhbGxiYWNrIiwicGF0aCIsImNvdW50IiwiYXBwZW5kIiwiYnVpbGRDb25zdGFudERlY2xhcmF0aW9ucyIsImJ1aWxkRW51bURlY2xhcmF0aW9ucyIsImJ1aWxkVHlwZURlY2xhcmF0aW9ucyIsImJ1aWxkSW50ZXJmYWNlRGVjbGFyYXRpb25zIiwiYnVpbGRDbGFzc0RlY2xhcmF0aW9ucyIsImJ1aWxkRnVuY3Rpb25EZWNsYXJhdGlvbnMiLCJidWlsZENhbGxiYWNrRGVjbGFyYXRpb25zIiwiaW1wb3J0TmFtZSIsImltcG9ydFBhdGgiLCJpbXBvcnRNYXAiLCJfIiwia2ViYWJDYXNlIiwicHJlcGVuZCIsIndhcm4iLCIkYWxpYXNlc09yVW5pb25zIiwiJGFsaWFzT3JVbmlvbiIsInR5cGVOYW1lIiwidHlwZXMiLCJmaWVsZCIsInR5cGVTdHJpbmciLCJ1bmlxIiwibWFwIiwidCIsImdldFR5cGUiLCJqb2luIiwiZW51bU5hbWUiLCJidWlsZEVudW1EZWNsYXJhdGlvbk1lbWJlcnMiLCIkbWVtYmVycyIsIiRtZW1iZXIiLCJpZGVudGlmaWVyTmFtZSIsImNvbnN0YW50TmFtZSIsImNvbnN0YW50VHlwZSIsInJldHVyblR5cGUiLCJmdW5jdGlvbk5hbWUiLCJpc1Jlc2VydmVkS2V5d29yZCIsImJ1aWxkRnVuY3Rpb25QYXJhbXMiLCJKU09OIiwic3RyaW5naWZ5IiwiY2FsbGJhY2tOYW1lIiwiJHBhcmFtZXRlcnMiLCJwYXJhbVJlcXVpcmVkIiwiJHBhcmFtZXRlciIsInBhcmFtTmFtZSIsInNhZmVXb3JkIiwicGFyYW1UeXBlIiwiJGludGVyZmFjZXMiLCIkaW50ZXJmYWNlIiwiaW50ZXJmYWNlTmFtZSIsImJ1aWxkUHJvcGVydHlEZWNsYXJhdGlvbnMiLCJidWlsZE1ldGhvZERlY2xhcmF0aW9ucyIsInVuZGVmaW5lZCIsImNsYXNzTmFtZSIsInBhcmVudENsYXNzTmFtZSIsInBhcmVudENsYXNzTmFtZVNwbGl0Iiwic3BsaXQiLCJidWlsZENvbnN0cnVjdG9yRGVjbGFyYXRpb24iLCJnZXRDbGFzc0lkZW50aWZpZXJzIiwicmVjdXJzaXZlIiwicmVzdWx0IiwiJHBhcmVudENsYXNzIiwiZmluZCIsIiRuYW1lc3BhY2VDbGFzcyIsIiRwcm9wZXJ0aWVzIiwiJG1ldGhvZHMiLCIkZmllbGRzIiwiJHZpcnR1YWxNZXRob2RzIiwicGFyZW50Q2xhc3NJZGVudGlmaWVycyIsIk9iamVjdCIsImtleXMiLCJpZGVudGlmaWVycyIsIiRmaWVsZCIsIiRtZXRob2QiLCIkcHJvcGVydHkiLCJpZGVudGlmaWVyIiwiZ2V0UGFyZW50Q2xhc3NJZGVudGlmaWVycyIsImlzU3RhdGljIiwiY2xhc3NJZGVudGlmaWVycyIsIm1ldGhvZE5hbWUiLCJpZ25vcmVEdXBsaWNhdGVzIiwiZHVwbGljYXRlIiwiYnVpbGRNZXRob2REZWNsYXJhdGlvblBhcmFtcyIsIiRjb25zdHJ1Y3RvcnMiLCIkY29uc3RydWN0b3IiLCJwcm9wZXJ0eU5hbWUiLCJwcm9wZXJ0eVR5cGUiLCJpbmRleE9mIiwiZ2lyVHlwZSIsIm51bGxhYmxlIiwiZ2lyVHlwZVN0cmljdCIsImdpclR5cGVTdHIiLCJrbm93blR5cGUiLCJhcnJheSIsInRvU3RyaW5nIiwiY2FsbGJhY2siLCJnaXJUeXBlc2NyaXB0R2VuZXJhdG9yIiwiZ2VuZXJhdGUiLCJ0eXBlIiwicG9wIiwidHNUeXBlIiwiZG91YmxlIiwiZ2Jvb2xlYW4iLCJnY2hhciIsImdkb3VibGUiLCJnZmxvYXQiLCJnaW50MTYiLCJnaW50MzIiLCJnaW50NjQiLCJnaW50OCIsImdpbnQiLCJnbG9uZyIsImdwb2ludGVyIiwiZ3NpemUiLCJnc3NpemUiLCJndWludDE2IiwiZ3VpbnQzMiIsImd1aW50NjQiLCJndWludDgiLCJndWludCIsImd1bG9uZyIsImd1bmljaGFyIiwiZ3VzaG9ydCIsImxvbmciLCJub25lIiwib2JqZWN0IiwidXRmOCIsInZhX2xpc3QiLCJtb2R1bGVUeXBlIiwiZ2lyVHlwZVN0clNwbGl0IiwiaGFzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBRUE7O0FBMkJlLE1BQU1BLGNBQU4sU0FBNkJDLDZCQUE3QixDQUFrRDtBQWlCL0RDLEVBQUFBLFdBQVcsQ0FDRkMsVUFERSxFQUVGQyxVQUZFLEVBR0ZDLE1BSEUsRUFJRkMsVUFBVSxHQUFHLEVBSlgsRUFLVDtBQUNBO0FBREEsU0FyQkZDLE9BcUJFLEdBckJ1QjtBQUN2QkMsTUFBQUEsT0FBTyxFQUFFLENBQUMsS0FBRCxFQUFRLFlBQVIsQ0FEYztBQUV2QkMsTUFBQUEsVUFBVSxFQUFFO0FBRlcsS0FxQnZCO0FBQUEsU0FoQkZDLE9BZ0JFLEdBaEJxQixJQUFJQyxHQUFKLEVBZ0JyQjtBQUFBLFNBZEZDLFFBY0UsR0FkUyxLQWNUO0FBQUEsU0FaRkMsV0FZRSxHQVp5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