220 lines
34 KiB
JavaScript
220 lines
34 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.ToolsUtils = void 0;
|
|
const asset_importers_1 = require("./asset-importers");
|
|
class ToolsUtils {
|
|
static async inspectInstance(targetId, adaptNode = true) {
|
|
var _a, _b;
|
|
if (targetId === 'CurrentSceneGlobals') {
|
|
return this.inspectCurrentSceneSettings();
|
|
}
|
|
if (targetId === 'ProjectSettings') {
|
|
return {
|
|
uuid: 'ProjectSettings',
|
|
type: 'ProjectSettings',
|
|
props: await ((_a = asset_importers_1.ImporterManager.getInstance().getImporter('project-settings')) === null || _a === void 0 ? void 0 : _a.getProperties({})) || null,
|
|
assetInfo: { uuid: 'ProjectSettings', type: 'ProjectSettings', importer: 'project-settings' }
|
|
};
|
|
}
|
|
// Try Node
|
|
try {
|
|
const nodeDump = await Editor.Message.request('scene', 'query-node', targetId);
|
|
const props = this.convertDumpToProperties('node', nodeDump, adaptNode);
|
|
if (nodeDump) {
|
|
return {
|
|
uuid: targetId,
|
|
type: nodeDump.__type__ || 'cc.Node',
|
|
props: props,
|
|
assetInfo: null
|
|
};
|
|
}
|
|
}
|
|
catch (e) { }
|
|
// Try Component
|
|
try {
|
|
const compDump = await Editor.Message.request('scene', 'query-component', targetId);
|
|
if (compDump) {
|
|
const props = this.convertDumpToProperties('component', compDump.value || compDump);
|
|
return {
|
|
uuid: targetId,
|
|
type: compDump.type || 'cc.Component',
|
|
props: props,
|
|
assetInfo: null
|
|
};
|
|
}
|
|
}
|
|
catch (e) { }
|
|
// Try Asset
|
|
try {
|
|
const assetInfo = await Editor.Message.request('asset-db', 'query-asset-info', targetId);
|
|
const props = assetInfo ? await ((_b = asset_importers_1.ImporterManager.getInstance().getImporter(assetInfo.importer)) === null || _b === void 0 ? void 0 : _b.getProperties(assetInfo)) : null;
|
|
if (assetInfo) {
|
|
return {
|
|
uuid: targetId,
|
|
type: assetInfo.type,
|
|
props: props || null,
|
|
assetInfo: assetInfo
|
|
};
|
|
}
|
|
}
|
|
catch (e) {
|
|
console.warn('Failed to inspect asset:', e);
|
|
}
|
|
return null;
|
|
}
|
|
static async inspectCurrentSceneSettings() {
|
|
try {
|
|
const tree = await Editor.Message.request('scene', 'query-node-tree');
|
|
if (!tree || !tree.uuid) {
|
|
return null;
|
|
}
|
|
const sceneDump = await Editor.Message.request('scene', 'query-node', tree.uuid);
|
|
if (sceneDump && sceneDump._globals) {
|
|
const props = this.convertDumpToProperties('component', sceneDump._globals);
|
|
return {
|
|
uuid: tree.uuid,
|
|
type: 'cc.SceneGlobals',
|
|
props: props,
|
|
assetInfo: null
|
|
};
|
|
}
|
|
}
|
|
catch (e) {
|
|
console.warn('Failed to inspect CurrentSceneGlobals:', e);
|
|
}
|
|
return null;
|
|
}
|
|
static convertDumpToProperties(dumpType, dump, adaptNode = true) {
|
|
if (!dump)
|
|
return {};
|
|
const result = {};
|
|
if (typeof dump === 'object' && dump !== null) {
|
|
// Safe iteration for object
|
|
for (const key of Object.keys(dump)) {
|
|
const val = dump[key];
|
|
if (val) {
|
|
result[key] = val;
|
|
}
|
|
}
|
|
}
|
|
switch (dumpType) {
|
|
// Specific adjustments for Node
|
|
case 'node':
|
|
if (!adaptNode) {
|
|
break;
|
|
}
|
|
// Adapt __comps__ to show component UUIDs only
|
|
if (!('__comps__' in result)) {
|
|
throw new Error(`Missing __comps__ property for Node class.`);
|
|
}
|
|
const compsMap = result.__comps__.map(comp => { return { value: { id: comp.value.uuid.value } }; });
|
|
result['__comps__'] = { value: compsMap, extends: ['cc.Object'], type: 'cc.Component', isArray: true, tooltip: 'cc.Component is a basic type for component. Inspect specific component instance for it\'s definition. You can change actual instances properties via __comps__.i prefix of node' };
|
|
if (!('children' in result)) {
|
|
throw new Error(`Missing children property for Node class.`);
|
|
}
|
|
result['children'] = { value: [], type: 'cc.Node', isArray: true, readonly: true };
|
|
if (!('__type__' in result)) {
|
|
throw new Error(`Missing __type__ property for Node class.`);
|
|
}
|
|
result['__type__'] = { value: 'cc.Node', visible: false };
|
|
break;
|
|
case 'component':
|
|
// Inspector hides 'enabled' property for Components, but we need it
|
|
if ('enabled' in result && result.enabled &&
|
|
typeof result.enabled === 'object' && 'visible' in result.enabled) {
|
|
result.enabled.visible = true;
|
|
}
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
static unwrapProperties(properties) {
|
|
const result = {};
|
|
for (const [key, prop] of Object.entries(properties)) {
|
|
// Check if prop is null/undefined
|
|
if (prop === undefined || prop === null) {
|
|
result[key] = prop;
|
|
continue;
|
|
}
|
|
// Check if prop is IProperty (has value, type, default, etc)
|
|
if (typeof prop !== 'object') {
|
|
result[key] = prop;
|
|
continue;
|
|
}
|
|
// It is an object. Check if it looks like IProperty.
|
|
const p = prop;
|
|
let value = p.value;
|
|
// Skip invisible properties
|
|
if (p.visible === false) {
|
|
continue;
|
|
}
|
|
// If value is undefined, try default
|
|
if (value === undefined) {
|
|
value = p.default;
|
|
}
|
|
const isLikelyIProperty = 'type' in p || 'value' in p || 'default' in p || 'visible' in p;
|
|
if (!isLikelyIProperty) {
|
|
// It might be a nested object that is NOT wrapped (though rare in dump root)
|
|
if (Array.isArray(prop)) {
|
|
// Array of values?
|
|
result[key] = prop;
|
|
}
|
|
else {
|
|
// Nested object
|
|
result[key] = this.unwrapProperties(prop);
|
|
}
|
|
continue;
|
|
}
|
|
// Now 'value' holds the unwrapped value (or it's undefined/null).
|
|
// Recursive unpack if value is an object (nested IProperties)
|
|
if (value && typeof value === 'object') {
|
|
if (Array.isArray(value)) {
|
|
// Check if it's an array of IProperties
|
|
if (value.length > 0 && typeof value[0] === 'object' && value[0] &&
|
|
('type' in value[0] || 'value' in value[0] || 'default' in value[0])) {
|
|
// Recursively unwrap each element in the array
|
|
value = value.map((item) => {
|
|
// This item is efficiently an IProperty (or mostly likely).
|
|
let val = item.value;
|
|
if (val === undefined)
|
|
val = item.default;
|
|
// If it doesn't have value/default but is object, might be raw object?
|
|
if (val === undefined && !('type' in item))
|
|
val = item;
|
|
// Verify deeply nested
|
|
if (val && typeof val === 'object' && !Array.isArray(val)) {
|
|
// We need to verify if 'val' keys point to IProperties.
|
|
const keys = Object.keys(val);
|
|
if (keys.length > 0) {
|
|
// Check first key
|
|
const firstChild = val[keys[0]];
|
|
if (firstChild && typeof firstChild === 'object' &&
|
|
('type' in firstChild || 'value' in firstChild || 'default' in firstChild)) {
|
|
return this.unwrapProperties(val);
|
|
}
|
|
}
|
|
}
|
|
return val;
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
// Nested object (Struct). Check if it contains IProperties.
|
|
const keys = Object.keys(value);
|
|
if (keys.length > 0) {
|
|
const firstVal = value[keys[0]];
|
|
if (firstVal && typeof firstVal === 'object' &&
|
|
('type' in firstVal || 'value' in firstVal || 'default' in firstVal)) {
|
|
// It is a struct where values are IProperties
|
|
value = this.unwrapProperties(value);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
result[key] = value;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
exports.ToolsUtils = ToolsUtils;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbHMtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zb3VyY2UvdXRjcC91dGlscy90b29scy11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBb0Q7QUFJcEQsTUFBYSxVQUFVO0lBRW5CLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQWdCLEVBQUUsWUFBcUIsSUFBSTs7UUFDcEUsSUFBSSxRQUFRLEtBQUsscUJBQXFCLEVBQUUsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLFFBQVEsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2pDLE9BQU87Z0JBQ0gsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsSUFBSSxFQUFFLGlCQUFpQjtnQkFDdkIsS0FBSyxFQUFFLE1BQU0sQ0FBQSxNQUFBLGlDQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLDBDQUFFLGFBQWEsQ0FBQyxFQUFTLENBQUMsQ0FBQSxJQUFJLElBQUk7Z0JBQzVHLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFTO2FBQ3ZHLENBQUM7UUFDTixDQUFDO1FBRUQsV0FBVztRQUNYLElBQUksQ0FBQztZQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMvRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUV4RSxJQUFJLFFBQVEsRUFBRSxDQUFDO2dCQUNYLE9BQU87b0JBQ0gsSUFBSSxFQUFFLFFBQVE7b0JBQ2QsSUFBSSxFQUFF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QixDQUFDO0NBZ0NKO0FBelFELGdDQXlRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEltcG9ydGVyTWFuYWdlciB9IGZyb20gJy4vYXNzZXQtaW1wb3J0ZXJzJztcbmltcG9ydCB7IElOb2RlLCBJUHJvcGVydHksIElQcm9wZXJ0eVZhbHVlVHlwZSB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9zY2VuZS9AdHlwZXMvcHVibGljJztcbmltcG9ydCB7IEFzc2V0SW5mbyB9IGZyb20gJ0Bjb2Nvcy9jcmVhdG9yLXR5cGVzL2VkaXRvci9wYWNrYWdlcy9hc3NldC1kYi9AdHlwZXMvcHVibGljJztcblxuZXhwb3J0IGNsYXNzIFRvb2xzVXRpbHMge1xuXG4gICAgc3RhdGljIGFzeW5jIGluc3BlY3RJbnN0YW5jZSh0YXJnZXRJZDogc3RyaW5nLCBhZGFwdE5vZGU6IGJvb2xlYW4gPSB0cnVlKTogUHJvbWlzZTx7IHV1aWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB8IG51bGwsIGFzc2V0SW5mbzogQXNzZXRJbmZvIHwgbnVsbCB9IHwgbnVsbD4ge1xuICAgICAgICBpZiAodGFyZ2V0SWQgPT09ICdDdXJyZW50U2NlbmVHbG9iYWxzJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zcGVjdEN1cnJlbnRTY2VuZVNldHRpbmdzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0SWQgPT09ICdQcm9qZWN0U2V0dGluZ3MnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHV1aWQ6ICdQcm9qZWN0U2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdQcm9qZWN0U2V0dGluZ3MnLFxuICAgICAgICAgICAgICAgIHByb3BzOiBhd2FpdCBJbXBvcnRlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbXBvcnRlcigncHJvamVjdC1zZXR0aW5ncycpPy5nZXRQcm9wZXJ0aWVzKHt9IGFzIGFueSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBhc3NldEluZm86IHsgdXVpZDogJ1Byb2plY3RTZXR0aW5ncycsIHR5cGU6ICdQcm9qZWN0U2V0dGluZ3MnLCBpbXBvcnRlcjogJ3Byb2plY3Qtc2V0dGluZ3MnIH0gYXMgYW55XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJ5IE5vZGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVEdW1wID0gYXdhaXQgRWRpdG9yLk1lc3NhZ2UucmVxdWVzdCgnc2NlbmUnLCAncXVlcnktbm9kZScsIHRhcmdldElkKTtcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5jb252ZXJ0RHVtcFRvUHJvcGVydGllcygnbm9kZScsIG5vZGVEdW1wLCBhZGFwdE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAobm9kZUR1bXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB1dWlkOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogbm9kZUR1bXAuX190eXBlX18gfHwgJ2NjLk5vZGUnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGFzc2V0SW5mbzogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG5cbiAgICAgICAgLy8gVHJ5IENvbXBvbmVudFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29tcER1bXAgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1jb21wb25lbnQnLCB0YXJnZXRJZCk7XG4gICAgICAgICAgICBpZiAoY29tcER1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuY29udmVydER1bXBUb1Byb3BlcnRpZXMoJ2NvbXBvbmVudCcsIGNvbXBEdW1wLnZhbHVlIHx8IGNvbXBEdW1wKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHV1aWQ6IHRhcmdldElkLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBjb21wRHVtcC50eXBlIHx8ICdjYy5Db21wb25lbnQnLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogcHJvcHMsXG4gICAgICAgICAgICAgICAgICAgIGFzc2V0SW5mbzogbnVsbFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIFxuICAgICAgICAvLyBUcnkgQXNzZXRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICBjb25zdCBhc3NldEluZm8gPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdhc3NldC1kYicsICdxdWVyeS1hc3NldC1pbmZvJywgdGFyZ2V0SWQpO1xuICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gYXNzZXRJbmZvID8gYXdhaXQgSW1wb3J0ZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0SW1wb3J0ZXIoYXNzZXRJbmZvLmltcG9ydGVyKT8uZ2V0UHJvcGVydGllcyhhc3NldEluZm8pIDogbnVsbDtcbiAgICAgICAgICAgICBpZiAoYXNzZXRJbmZvKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICB1dWlkOiB0YXJnZXRJZCxcbiAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0SW5mby50eXBlLCBcbiAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBwcm9wcyB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgYXNzZXRJbmZvOiBhc3NldEluZm9cbiAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gaW5zcGVjdCBhc3NldDonLCBlKTsgfVxuXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBpbnNwZWN0Q3VycmVudFNjZW5lU2V0dGluZ3MoKTogUHJvbWlzZTx7IHV1aWQ6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wczogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSB8IG51bGwsIGFzc2V0SW5mbzogQXNzZXRJbmZvIHwgbnVsbCB9IHwgbnVsbD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdHJlZSA9IGF3YWl0IEVkaXRvci5NZXNzYWdlLnJlcXVlc3QoJ3NjZW5lJywgJ3F1ZXJ5LW5vZGUtdHJlZScpIGFzIGFueTtcbiAgICAgICAgICAgIGlmICghdHJlZSB8fCAhdHJlZS51dWlkKSB7XG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBzY2VuZUR1bXAgPSBhd2FpdCBFZGl0b3IuTWVzc2FnZS5yZXF1ZXN0KCdzY2VuZScsICdxdWVyeS1ub2RlJywgdHJlZS51dWlkKSBhcyBhbnk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzY2VuZUR1bXAgJiYgc2NlbmVEdW1wLl9nbG9iYWxzKSB7XG4gICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5jb252ZXJ0RHVtcFRvUHJvcGVydGllcygnY29tcG9uZW50Jywgc2NlbmVEdW1wLl9nbG9iYWxzKTtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgIHV1aWQ6IHRyZWUudXVpZCxcbiAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjYy5TY2VuZUdsb2JhbHMnLFxuICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgYXNzZXRJbmZvOiBudWxsXG4gICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGluc3BlY3QgQ3VycmVudFNjZW5lR2xvYmFsczonLCBlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb252ZXJ0RHVtcFRvUHJvcGVydGllcyhkdW1wVHlwZTogXCJub2RlXCIgfCBcImNvbXBvbmVudFwiLCBkdW1wOiBJTm9kZSB8IElQcm9wZXJ0eVZhbHVlVHlwZSB8IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlOyB9IHwgbnVsbCwgYWRhcHROb2RlOiBib29sZWFuID0gdHJ1ZSk6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlIH0ge1xuICAgICAgICBpZiAoIWR1bXApIHJldHVybiB7fTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHJlc3VsdDogeyBba2V5OiBzdHJpbmddOiBJUHJvcGVydHlWYWx1ZVR5cGUgfSA9IHt9O1xuICAgICAgICBpZiAodHlwZW9mIGR1bXAgPT09ICdvYmplY3QnICYmIGR1bXAgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAvLyBTYWZlIGl0ZXJhdGlvbiBmb3Igb2JqZWN0XG4gICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZHVtcCkpIHtcbiAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGR1bXAgYXMgYW55KVtrZXldO1xuICAgICAgICAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoZHVtcFR5cGUpIHtcbiAgICAgICAgICAgIC8vIFNwZWNpZmljIGFkanVzdG1lbnRzIGZvciBOb2RlXG4gICAgICAgICAgICBjYXNlICdub2RlJzpcbiAgICAgICAgICAgICAgICBpZiAoIWFkYXB0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRhcHQgX19jb21wc19fIHRvIHNob3cgY29tcG9uZW50IFVVSURzIG9ubHlcbiAgICAgICAgICAgICAgICBpZiAoISgnX19jb21wc19fJyBpbiByZXN1bHQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBfX2NvbXBzX18gcHJvcGVydHkgZm9yIE5vZGUgY2xhc3MuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBzTWFwID0gKHJlc3VsdC5fX2NvbXBzX18gYXMgSVByb3BlcnR5W10pLm1hcChjb21wID0+IHsgcmV0dXJuIHsgdmFsdWU6IHsgaWQ6IChjb21wLnZhbHVlIGFzIGFueSkudXVpZC52YWx1ZSB9IH19KTtcbiAgICAgICAgICAgICAgICByZXN1bHRbJ19fY29tcHNfXyddID0geyB2YWx1ZTogY29tcHNNYXAsIGV4dGVuZHM6IFsnY2MuT2JqZWN0J10sIHR5cGU6ICdjYy5Db21wb25lbnQnLCBpc0FycmF5OiB0cnVlLCB0b29sdGlwOiAnY2MuQ29tcG9uZW50IGlzIGEgYmFzaWMgdHlwZSBmb3IgY29tcG9uZW50LiBJbnNwZWN0IHNwZWNpZmljIGNvbXBvbmVudCBpbnN0YW5jZSBmb3IgaXRcXCdzIGRlZmluaXRpb24uIFlvdSBjYW4gY2hhbmdlIGFjdHVhbCBpbnN0YW5jZXMgcHJvcGVydGllcyB2aWEgX19jb21wc19fLmkgcHJlZml4IG9mIG5vZGUnIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoISgnY2hpbGRyZW4nIGluIHJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGNoaWxkcmVuIHByb3BlcnR5IGZvciBOb2RlIGNsYXNzLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRbJ2NoaWxkcmVuJ10gPSB7IHZhbHVlOiBbXSwgdHlwZTogJ2NjLk5vZGUnLCBpc0FycmF5OiB0cnVlLCByZWFkb25seTogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGlmICghKCdfX3R5cGVfXycgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgX190eXBlX18gcHJvcGVydHkgZm9yIE5vZGUgY2xhc3MuYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdFsnX190eXBlX18nXSA9IHsgdmFsdWU6ICdjYy5Ob2RlJywgdmlzaWJsZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgICAgICAgICAgLy8gSW5zcGVjdG9yIGhpZGVzICdlbmFibGVkJyBwcm9wZXJ0eSBmb3IgQ29tcG9uZW50cywgYnV0IHdlIG5lZWQgaXRcbiAgICAgICAgICAgICAgICBpZiAoJ2VuYWJsZWQnIGluIHJlc3VsdCAmJiByZXN1bHQuZW5hYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcmVzdWx0LmVuYWJsZWQgPT09ICdvYmplY3QnICYmICd2aXNpYmxlJyBpbiByZXN1bHQuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZW5hYmxlZC52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB1bndyYXBQcm9wZXJ0aWVzKHByb3BlcnRpZXM6IHsgW2tleTogc3RyaW5nXTogSVByb3BlcnR5VmFsdWVUeXBlIH0pOiBhbnkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuICAgICAgICBcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBwcm9wXSBvZiBPYmplY3QuZW50cmllcyhwcm9wZXJ0aWVzKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcHJvcCBpcyBudWxsL3VuZGVmaW5lZFxuICAgICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCB8fCBwcm9wID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBwcm9wIGlzIElQcm9wZXJ0eSAoaGFzIHZhbHVlLCB0eXBlLCBkZWZhdWx0LCBldGMpXG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gcHJvcDtcbiAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEl0IGlzIGFuIG9iamVjdC4gQ2hlY2sgaWYgaXQgbG9va3MgbGlrZSBJUHJvcGVydHkuXG4gICAgICAgICAgICBjb25zdCBwID0gcHJvcCBhcyBJUHJvcGVydHk7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBwLnZhbHVlO1xuXG4gICAgICAgICAgICAvLyBTa2lwIGludmlzaWJsZSBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAocC52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB2YWx1ZSBpcyB1bmRlZmluZWQsIHRyeSBkZWZhdWx0XG4gICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gcC5kZWZhdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc0xpa2VseUlQcm9wZXJ0eSA9ICd0eXBlJyBpbiBwIHx8ICd2YWx1ZScgaW4gcCB8fCAnZGVmYXVsdCcgaW4gcCB8fCAndmlzaWJsZScgaW4gcDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFpc0xpa2VseUlQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgICAvLyBJdCBtaWdodCBiZSBhIG5lc3RlZCBvYmplY3QgdGhhdCBpcyBOT1Qgd3JhcHBlZCAodGhvdWdoIHJhcmUgaW4gZHVtcCByb290KVxuICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wKSkge1xuICAgICAgICAgICAgICAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzP1xuICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBwcm9wOyBcbiAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy51bndyYXBQcm9wZXJ0aWVzKHByb3AgYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTm93ICd2YWx1ZScgaG9sZHMgdGhlIHVud3JhcHBlZCB2YWx1ZSAob3IgaXQncyB1bmRlZmluZWQvbnVsbCkuXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZSB1bnBhY2sgaWYgdmFsdWUgaXMgYW4gb2JqZWN0IChuZXN0ZWQgSVByb3BlcnRpZXMpXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQncyBhbiBhcnJheSBvZiBJUHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDAgJiYgdHlwZW9mIHZhbHVlWzBdID09PSAnb2JqZWN0JyAmJiB2YWx1ZVswXSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICgndHlwZScgaW4gdmFsdWVbMF0gfHwgJ3ZhbHVlJyBpbiB2YWx1ZVswXSB8fCAnZGVmYXVsdCcgaW4gdmFsdWVbMF0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgdW53cmFwIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLm1hcCgoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXRlbSBpcyBlZmZpY2llbnRseSBhbiBJUHJvcGVydHkgKG9yIG1vc3RseSBsaWtlbHkpLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsID0gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB2YWwgPSBpdGVtLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2Vzbid0IGhhdmUgdmFsdWUvZGVmYXVsdCBidXQgaXMgb2JqZWN0LCBtaWdodCBiZSByYXcgb2JqZWN0PyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkICYmICEoJ3R5cGUnIGluIGl0ZW0pKSB2YWwgPSBpdGVtO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBkZWVwbHkgbmVzdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdmVyaWZ5IGlmICd2YWwnIGtleXMgcG9pbnQgdG8gSVByb3BlcnRpZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmaXJzdCBrZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDaGlsZCA9IHZhbFtrZXlzWzBdXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q2hpbGQgJiYgdHlwZW9mIGZpcnN0Q2hpbGQgPT09ICdvYmplY3QnICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3R5cGUnIGluIGZpcnN0Q2hpbGQgfHwgJ3ZhbHVlJyBpbiBmaXJzdENoaWxkIHx8ICdkZWZhdWx0JyBpbiBmaXJzdENoaWxkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudW53cmFwUHJvcGVydGllcyh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgIC8vIE5lc3RlZCBvYmplY3QgKFN0cnVjdCkuIENoZWNrIGlmIGl0IGNvbnRhaW5zIElQcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgIGlmIChrZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFZhbCA9ICh2YWx1ZSBhcyBhbnkpW2tleXNbMF1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbCAmJiB0eXBlb2YgZmlyc3RWYWwgPT09ICdvYmplY3QnICYmIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndHlwZScgaW4gZmlyc3RWYWwgfHwgJ3ZhbHVlJyBpbiBmaXJzdFZhbCB8fCAnZGVmYXVsdCcgaW4gZmlyc3RWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0IGlzIGEgc3RydWN0IHdoZXJlIHZhbHVlcyBhcmUgSVByb3BlcnRpZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLnVud3JhcFByb3BlcnRpZXModmFsdWUgYXMgYW55KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuLypcbiAgICBzdGF0aWMgcmVzb2x2ZVByb3BlcnR5UGF0aChkYXRhOiBhbnksIHBhdGg6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIGlmICghcGF0aCB8fCAhZGF0YSkgcmV0dXJuIGRhdGE7XG4gICAgICAgIFxuICAgICAgICBsZXQgY3VycmVudCA9IGRhdGE7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgICAgICAgXG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT09IG51bGwgfHwgY3VycmVudCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdvYmplY3QnICYmIGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KHBhcnQpO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihpZHgpICYmIGN1cnJlbnRbaWR4XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbaWR4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY3VycmVudDtcbiAgICB9XG4gICAgICAgICovXG59XG4iXX0=
|