diff --git a/README.md b/README.md
index 58d7b2a..fdac44c 100644
--- a/README.md
+++ b/README.md
@@ -113,7 +113,7 @@ If you want to compare against an enum or a flag class in defined in `templates.
Decoded messages are displayed in the log pane, clicking one will show the request and
response for HTTP messages, and a human-friendly form for UDP messages. Some messages and
-fields have [special packers defined](https://github.com/SaladDais/Hippolyzer/blob/master/hippolyzer/lib/proxy/templates.py)
+fields have [special packers defined](https://github.com/SaladDais/Hippolyzer/blob/master/hippolyzer/lib/base/templates.py)
that will give a more human-readable form of enum or binary fields, with the original form beside or below it.
For example, an `AgentUpdate` message may show up in the log pane like:
@@ -323,7 +323,7 @@ If you are a viewer developer, please put them in a viewer.
[LGPLv3](https://www.gnu.org/licenses/lgpl-3.0.en.html). If you have a good reason why, I might dual license.
-This package [includes portions of the Second Life(TM) Viewer Artwork](https://github.com/SaladDais/Hippolyzer/tree/master/hippolyzer/lib/proxy/data),
+This package [includes portions of the Second Life(TM) Viewer Artwork](https://github.com/SaladDais/Hippolyzer/tree/master/hippolyzer/lib/base/data),
Copyright (C) 2008 Linden Research, Inc. The viewer artwork is licensed under the Creative Commons
Attribution-Share Alike 3.0 License.
diff --git a/addon_examples/horror_animator.py b/addon_examples/horror_animator.py
index 84ff034..85b0fda 100644
--- a/addon_examples/horror_animator.py
+++ b/addon_examples/horror_animator.py
@@ -16,7 +16,7 @@ from hippolyzer.lib.proxy.http_flow import HippoHTTPFlow
from hippolyzer.lib.proxy.message import ProxiedMessage
from hippolyzer.lib.proxy.region import ProxiedRegion
from hippolyzer.lib.proxy.sessions import Session, SessionManager
-from hippolyzer.lib.proxy.vfs import STATIC_VFS
+from hippolyzer.lib.base.vfs import STATIC_VFS
JOINT_REPLS = {
diff --git a/hippolyzer/lib/proxy/data/LICENSE-artwork.txt b/hippolyzer/lib/base/data/LICENSE-artwork.txt
similarity index 100%
rename from hippolyzer/lib/proxy/data/LICENSE-artwork.txt
rename to hippolyzer/lib/base/data/LICENSE-artwork.txt
diff --git a/hippolyzer/lib/proxy/data/static_data.db2 b/hippolyzer/lib/base/data/static_data.db2
similarity index 100%
rename from hippolyzer/lib/proxy/data/static_data.db2
rename to hippolyzer/lib/base/data/static_data.db2
diff --git a/hippolyzer/lib/proxy/data/static_index.db2 b/hippolyzer/lib/base/data/static_index.db2
similarity index 100%
rename from hippolyzer/lib/proxy/data/static_index.db2
rename to hippolyzer/lib/base/data/static_index.db2
diff --git a/hippolyzer/lib/proxy/templates.py b/hippolyzer/lib/base/templates.py
similarity index 58%
rename from hippolyzer/lib/proxy/templates.py
rename to hippolyzer/lib/base/templates.py
index 9cf0d82..a4a979c 100644
--- a/hippolyzer/lib/proxy/templates.py
+++ b/hippolyzer/lib/base/templates.py
@@ -1,3 +1,7 @@
+"""
+Serialization templates for structures used in LLUDP and HTTP bodies.
+"""
+
import abc
import dataclasses
import enum
@@ -1621,95 +1625,3 @@ class RetrieveNavMeshSrcSerializer(se.BaseHTTPSerializer):
# 15 bit window size, gzip wrapped
deser["navmesh_data"] = zlib.decompress(deser["navmesh_data"], wbits=15 | 32)
return deser
-
-
-@dataclasses.dataclass
-class CAPTemplate:
- cap_name: str
- method: str
- body: Any
- query: Set[str] = dataclasses.field(default_factory=set)
- path: str = ""
-
-
-# Cap request templates for message builder prefills
-CAP_TEMPLATES: List[CAPTemplate] = [
- CAPTemplate(cap_name='Seed', method='POST', body=b'\n\n\n \n \n\n', query=set()),
- CAPTemplate(cap_name='SimulatorFeatures', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='EventQueueGet', method='POST', body=b'\n\n\n\n', query=set()),
- CAPTemplate(cap_name='NavMeshGenerationStatus', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='AgentState', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='AgentPreferences', method='POST', body=b'\n\n\n\n', query=set()),
- CAPTemplate(cap_name='ExtEnvironment', method='GET', body=b'', query={'parcelid'}),
- CAPTemplate(cap_name='UpdateAgentLanguage', method='POST', body=b'\n\n\n language\n en\n language_is_public\n 1\n \n\n', query=set()),
- CAPTemplate(cap_name='DirectDelivery', method='GET', body=b'', query=set(), path="/listings"),
- CAPTemplate(cap_name='ViewerStats', method='POST', body=b'\n\n\n AgentPositionSnaps\n \n DisplayNamesEnabled\n \n DisplayNamesShowUsername\n \n MinimalSkin\n \n agent\n \n agents_in_view\n \n fps\n \n language\n \n mem_use\n \n meters_traveled\n \n ping\n \n regions_visited\n \n run_time\n \n sim_fps\n \n start_time\n \n version\n \n \n downloads\n \n mesh_kbytes\n \n object_kbytes\n \n texture_kbytes\n \n world_kbytes\n \n \n misc\n \n Version\n \n Vertex Buffers Enabled\n \n \n session_id\n \n stats\n \n failures\n \n dropped\n \n failed_resends\n \n invalid\n \n missing_updater\n \n off_circuit\n \n resent\n \n send_packet\n \n \n misc\n \n int_1\n \n int_2\n \n string_1\n \n string_2\n \n \n net\n \n in\n \n compressed_packets\n \n kbytes\n \n packets\n \n savings\n \n \n out\n \n compressed_packets\n \n kbytes\n \n packets\n \n savings\n \n \n \n voice\n \n connect_attempts\n \n connect_cycles\n \n connect_time\n \n establish_attempts\n \n establish_time\n \n provision_attempts\n \n provision_time\n \n \n \n system\n \n address_size\n \n cpu\n \n gl\n \n ati_offset_vertical_lines\n \n ati_old_driver\n \n debug_gpu\n \n gl_renderer\n \n gpu_vendor\n \n gpu_version\n \n has_anisotropic\n \n has_arb_env_combine\n \n has_ati_mem_info\n \n has_blend_func_separate\n \n has_compressed_textures\n \n has_cube_map\n \n has_debug_output\n \n has_depth_clamp\n \n has_draw_buffers\n \n has_flush_buffer_range\n \n has_fragment_shader\n \n has_framebuffer_object\n \n has_map_buffer_range\n \n has_mip_map_generation\n \n has_multitexture\n \n has_nvx_mem_info\n \n has_occlusion_query\n \n has_occlusion_query2\n \n has_pbuffer\n \n has_point_parameters\n \n has_requirements\n \n has_separate_specular_color\n \n has_shader_objects\n \n has_srgb_framebuffer\n \n has_srgb_texture\n \n has_sync\n \n has_texture_multisample\n \n has_texture_rectangle\n \n has_texture_srgb_decode\n \n has_timer_query\n \n has_transform_feedback\n \n has_vertex_array_object\n \n has_vertex_buffer_object\n \n has_vertex_shader\n \n is_ati\n \n is_gf2or4mx\n \n is_gf3\n \n is_gf_gfx\n \n is_intel\n \n is_nvidia\n \n max_color_texture_samples\n \n max_depth_texture_samples\n \n max_index_range\n \n max_integer_samples\n \n max_sample_mask_words\n \n max_samples\n \n max_texture_size\n \n max_vertex_range\n \n num_texture_image_units\n \n num_texture_units\n \n opengl_version\n \n vram\n \n \n gpu\n \n gpu_class\n \n gpu_vendor\n \n gpu_version\n \n mac_address\n \n opengl_version\n \n os\n \n ram\n \n serial_number\n \n shader_level\n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='GetDisplayNames', method='GET', body=b'', query={'ids'}),
- CAPTemplate(cap_name='FetchInventory2', method='POST', body=b'\n\n\n agent_id\n \n cap_name\n \n items\n \n \n item_id\n \n owner_id\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='FetchLib2', method='POST', body=b'\n\n\n agent_id\n \n cap_name\n \n items\n \n \n item_id\n \n owner_id\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='FetchInventoryDescendents2', method='POST', body=b'\n\n\n folders\n \n \n fetch_folders\n \n fetch_items\n \n folder_id\n \n owner_id\n \n sort_order\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='ProvisionVoiceAccountRequest', method='POST', body=b'\n\n\n\n', query=set()),
- CAPTemplate(cap_name='AvatarRenderInfo', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='ReadOfflineMsgs', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='MapImageService', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='RenderMaterials', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='AvatarRenderInfo', method='POST', body=b'\n\n\n agents\n \n \n \n tooComplex\n \n weight\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='ParcelVoiceInfoRequest', method='POST', body=b'\n\n\n\n', query=set()),
- CAPTemplate(cap_name='ProductInfoRequest', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='ObjectMedia', method='POST', body=b'\n\n\n object_id\n \n verb\n GET\n \n\n', query=set()),
- CAPTemplate(cap_name='GetObjectCost', method='POST', body=b'\n\n\n object_ids\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='GetObjectPhysicsData', method='POST', body=b'\n\n\n object_ids\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='RenderMaterials', method='PUT', body=b'\n\n\n Zipped\n \n \n\n', query=set()),
- CAPTemplate(cap_name='RenderMaterials', method='POST', body=b'\n\n\n Zipped\n \n \n\n', query=set()),
- CAPTemplate(cap_name='GetExperienceInfo', method='GET', body=b'', query={'public_id', 'page_size'}, path="/id/"),
- CAPTemplate(cap_name='LSLSyntax', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='GetCreatorExperiences', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='GetMetadata', method='POST', body=b'\n\n\n fields\n \n experience\n \n item-id\n \n object-id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='UpdateScriptTask', method='POST', body=b'\n\n\n experience\n \n is_script_running\n 1\n item_id\n \n target\n mono\n task_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='EstateAccess', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='RegionExperiences', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='SimConsoleAsync', method='POST', body=b'\n\n\n\n', query=set()),
- CAPTemplate(cap_name='FindExperienceByName', method='GET', body=b'', query={'query', 'page', 'page_size'}),
- CAPTemplate(cap_name='ViewerMetrics', method='POST', body=b'\n\n\n agent_id\n \n break\n \n duration\n \n initial\n \n message\n \n nearby\n \n cloud\n \n downloading\n \n full\n \n gray\n \n \n rez_status\n \n sequence\n \n session_id\n \n timers\n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n central_bake_version\n \n completed\n \n grid_x\n \n grid_y\n \n is_self\n \n is_using_server_bakes\n \n stats\n \n count\n \n max\n \n mean\n \n min\n \n std_dev\n \n \n timer_name\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='InventoryAPIv3', method='PATCH', body=b'\n\n\n name\n \n \n\n', query={'tid'}, path="/item/SOME_ID"),
- CAPTemplate(cap_name='RemoteParcelRequest', method='POST', body=b'\n\n\n location\n \n \n \n \n \n region_handle\n \n region_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='ParcelPropertiesUpdate', method='POST', body=b'\n\n \n local_id\n \n any_av_sounds\n true\n auth_buyer_id\n \n auto_scale\n 0\n category\n 0\n description\n \n flags\n AAAAAQ==\n group_av_sounds\n true\n group_id\n \n landing_type\n 2\n media_allow_navigate\n 1\n media_current_url\n \n media_desc\n \n media_height\n 0\n media_id\n \n media_loop\n 0\n media_prevent_camera_zoom\n 0\n media_type\n none/none\n media_url\n \n media_url_timeout\n 0.0\n media_width\n 0\n music_url\n \n name\n \n obscure_media\n false\n obscure_music\n false\n parcel_flags\n fiQASw==\n pass_hours\n 1.0\n pass_price\n 10\n sale_price\n 10000\n see_avs\n true\n snapshot_id\n \n user_location\n \n 0.0\n 0.0\n 0.0\n \n user_look_at\n \n 0.0\n 0.0\n 0.0\n \n \n\n', query=set()),
- CAPTemplate(cap_name='UpdateScriptAgent', method='POST', body=b'\n\n\n item_id\n \n target\n mono\n \n\n', query=set()),
- CAPTemplate(cap_name='NewFileAgentInventory', method='POST', body=b'\n\n\n asset_type\n \n description\n \n everyone_mask\n \n folder_id\n \n group_mask\n \n inventory_type\n \n name\n \n next_owner_mask\n \n \n\n', query=set()),
- CAPTemplate(cap_name='UpdateNotecardAgentInventory', method='POST', body=b'\n\n\n item_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='UpdateNotecardTaskInventory', method='POST', body=b'\n\n\n item_id\n \n task_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='UpdateGestureAgentInventory', method='POST', body=b'\n\n\n item_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='UpdateGestureTaskInventory', method='POST', body=b'\n\n\n item_id\n \n task_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='MeshUploadFlag', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='UntrustedSimulatorMessage', method='POST', body=b'\n\n\n message\n ChatFromViewer\n body\n \n AgentData\n \n \n AgentID\n \n SessionID\n \n \n \n ChatData\n \n \n Channel\n 0\n Message\n test \n Type\n 1\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='UpdateAvatarAppearance', method='POST', body=b'\n\n\n cof_version\n \n \n\n', query=set()),
- CAPTemplate(cap_name='ServerReleaseNotes', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='UserInfo', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='SendPostcard', method='POST', body=b'\n\n\n msg\n \n name\n \n pos-global\n \n \n \n \n \n subject\n \n to\n \n \n\n', query=set()),
- CAPTemplate(cap_name='GetAdminExperiences', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='GetExperiences', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='AgentExperiences', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='ExperiencePreferences', method='GET', body=b'', query={'SOME_ID'}),
- CAPTemplate(cap_name='IsExperienceAdmin', method='GET', body=b'', query={'experience_id'}),
- CAPTemplate(cap_name='UpdateExperience', method='POST', body=b'\n\n\n description\n \n extended_metadata\n \n group_id\n \n slurl\n \n \n\n', query=set()),
- CAPTemplate(cap_name='AttachmentResources', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='DispatchRegionInfo', method='POST', body=b'\n\n\n agent_limit\n \n allow_damage\n \n allow_land_resell\n \n allow_parcel_changes\n \n block_fly\n \n block_fly_over\n \n block_parcel_search\n \n block_terraform\n \n prim_bonus\n \n restrict_pushobject\n \n sim_access\n \n \n\n', query=set()),
- CAPTemplate(cap_name='AvatarPickerSearch', method='GET', body=b'', query={'names', 'page_size'}),
- CAPTemplate(cap_name='LandResources', method='POST', body=b'\n\n\n parcel_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='ResourceCostSelected', method='POST', body=b'\n\n\n selected_roots\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='GroupMemberData', method='POST', body=b'\n\n\n group_id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='GroupExperiences', method='GET', body=b'', query={'SOME_ID'}),
- CAPTemplate(cap_name='CopyInventoryFromNotecard', method='POST', body=b'\n\n\n callback-id\n \n folder-id\n \n item-id\n \n notecard-id\n \n object-id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='HomeLocation', method='POST', body=b'\n\n\n HomeLocation\n \n LocationId\n 1\n LocationLookAt\n \n X\n \n Y\n \n Z\n \n \n LocationPos\n \n X\n \n Y\n \n Z\n \n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='CharacterProperties', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='ObjectNavMeshProperties', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='TerrainNavMeshProperties', method='GET', body=b'', query=set()),
- CAPTemplate(cap_name='ObjectNavMeshProperties', method='PUT', body=b'\n\n\n \n \n A\n \n B\n \n C\n \n D\n \n navmesh_category\n \n phantom\n \n \n \n\n', query=set()),
- CAPTemplate(cap_name='RetrieveNavMeshSrc', method='POST', body=b'\n\n\n\n', query=set()),
- CAPTemplate(cap_name='MapLayer', method='POST', body=b'\n\n\n\n', query=set()),
- CAPTemplate(cap_name='GroupAPIv1', method='GET', body=b'', query={'group_id'}),
- CAPTemplate(cap_name='ChatSessionRequest', method='POST', body=b'\n\n\n method\n \n session-id\n \n \n\n', query=set()),
- CAPTemplate(cap_name='ViewerBenefits', method='GET', body=b'', query=set(), path=''),
- CAPTemplate(cap_name='SetDisplayName', method='POST', body=b'\n\n\n display_name\n \n OLD_DISPLAY_NAME\n NEW_DISPLAY_NAME\n \n \n\n', query=set(), path=''),
- CAPTemplate(cap_name='ObjectMediaNavigate', method='POST', body=b'\n\n\n current_url\n \n object_id\n \n texture_index\n \n \n\n', query=set(), path=''),
-]
diff --git a/hippolyzer/lib/proxy/vfs.py b/hippolyzer/lib/base/vfs.py
similarity index 93%
rename from hippolyzer/lib/proxy/vfs.py
rename to hippolyzer/lib/base/vfs.py
index 3354936..f37e360 100644
--- a/hippolyzer/lib/proxy/vfs.py
+++ b/hippolyzer/lib/base/vfs.py
@@ -4,7 +4,7 @@ from typing import *
import hippolyzer.lib.base.serialization as se
from hippolyzer.lib.base.datatypes import UUID
from hippolyzer.lib.base.helpers import get_resource_filename
-from hippolyzer.lib.proxy.templates import AssetType
+from hippolyzer.lib.base.templates import AssetType
@dataclasses.dataclass
@@ -63,5 +63,5 @@ class VFS:
return self._data_fh.read(block.size)
-_static_path = get_resource_filename("lib/proxy/data/static_index.db2")
+_static_path = get_resource_filename("lib/base/data/static_index.db2")
STATIC_VFS = VFS(_static_path)
diff --git a/setup.py b/setup.py
index 9a28f43..c05a811 100644
--- a/setup.py
+++ b/setup.py
@@ -63,9 +63,9 @@ setup(
'lib/base/message/data/message_template.msg',
'lib/base/message/data/message.xml',
'lib/base/network/data/ca-bundle.crt',
- 'lib/proxy/data/static_data.db2',
- 'lib/proxy/data/static_index.db2',
- 'lib/proxy/data/LICENSE-artwork.txt',
+ 'lib/base/data/static_data.db2',
+ 'lib/base/data/static_index.db2',
+ 'lib/base/data/LICENSE-artwork.txt',
],
},
entry_points={
diff --git a/tests/proxy/test_vfs.py b/tests/base/test_vfs.py
similarity index 87%
rename from tests/proxy/test_vfs.py
rename to tests/base/test_vfs.py
index 7fb2d47..615a736 100644
--- a/tests/proxy/test_vfs.py
+++ b/tests/base/test_vfs.py
@@ -1,7 +1,7 @@
import unittest
from hippolyzer.lib.base.datatypes import UUID
-from hippolyzer.lib.proxy.vfs import STATIC_VFS
+from hippolyzer.lib.base.vfs import STATIC_VFS
class StaticVFSTest(unittest.TestCase):