コード例 #1
0
        public async Task Thumbnail_HappyFlowFileStreamResult_API_Test()
        {
            // Arrange
            var storage       = ArrangeStorage();
            var createAnImage = InsertSearchData();

            // Act
            // Create thumbnail in fake storage
            await new Thumbnail(storage, storage, new FakeIWebLogger()
                                ).CreateThumb(createAnImage.FilePath, createAnImage.FileHash);

            // Check if exist
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = controller.Thumbnail(createAnImage.FileHash, true) as FileStreamResult;

            // Thumbnail exist
            Assert.AreNotEqual(actionResult, null);
            var thumbnailAnswer = actionResult.ContentType;

            controller.Response.Headers.TryGetValue("x-filename", out var value);
            Assert.AreEqual(createAnImage.FileHash + ".jpg", value.ToString());

            Assert.AreEqual("image/jpeg", thumbnailAnswer);
            actionResult.FileStream.Dispose();             // for windows
        }
コード例 #2
0
        public void ListSizesByHash_IgnoreRaw()
        {
            var item = _query.AddItem(new FileIndexItem("/test123.arw")
            {
                FileHash = "91234567890123456789123451"
            });

            // Arrange
            var storage = new FakeIStorage(new List <string>(),
                                           new List <string> {
                "91234567890123456789123451"
            });

            // Check if exist
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = controller.ListSizesByHash("91234567890123456789123451") as JsonResult;

            // Thumbnail exist
            Assert.AreNotEqual(actionResult, null);

            Assert.AreEqual(210, controller.Response.StatusCode);

            _query.RemoveItem(item);
        }
コード例 #3
0
        public void ListSizesByHash_ExpectLarge()
        {
            var item = _query.AddItem(new FileIndexItem("/test123.jpg")
            {
                FileHash = "01234567890123456789123456"
            });

            // Arrange
            var storage = new FakeIStorage(new List <string>(),
                                           new List <string> {
                "01234567890123456789123456"
            });

            // Check if exist
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = controller.ListSizesByHash("01234567890123456789123456") as JsonResult;

            // Thumbnail exist
            Assert.AreNotEqual(actionResult, null);
            var thumbnailAnswer = actionResult.Value as ThumbnailSizesExistStatusModel;

            Assert.AreEqual(202, controller.Response.StatusCode);
            Assert.AreEqual(true, thumbnailAnswer.Large);
            Assert.AreEqual(false, thumbnailAnswer.ExtraLarge);
            Assert.AreEqual(false, thumbnailAnswer.TinyMeta);

            _query.RemoveItem(item);
        }
コード例 #4
0
        void OnProjectOpenButtonClick(Project project)
        {
            var projectData = UIStateManager.current.projectStateData;

            if (projectData.activeProject == project)
            {
                UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.OpenDialog, DialogType.None));
                //if the project already opened, just close landing screen

                return;
            }

            projectData.activeProject          = project;
            projectData.activeProjectThumbnail = ThumbnailController.LoadThumbnailForProject(project);

            if (UIStateManager.current.projectStateData.activeProject != Project.Empty)
            {
                // first close current Project if open
                UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetStatus, "Closing {UIStateManager.current.projectStateData.activeProject.name}..."));
                UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.CloseProject, UIStateManager.current.projectStateData.activeProject));
            }
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetStatus, $"Opening {projectData.activeProject.name}..."));
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.CloseAllDialogs, null));
            UIStateManager.current.Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.OpenProject, projectData));
        }
コード例 #5
0
        void InstantiateProjectItems(Project[] projects)
        {
            ClearProjectListItem();
            m_ScrollRect.verticalNormalizedPosition = 1;

            if (m_FetchingProjectsPanel.activeSelf)
            {
                m_FetchingProjectsPanel.SetActive(false);
            }

            Array.Sort(projects, (project1, project2) => project2.lastPublished.CompareTo(project1.lastPublished));
            foreach (var project in projects)
            {
                var listItem = Instantiate(m_ProjectListItemPrefab, m_ScrollViewContent.transform);
                listItem.gameObject.SetActive(true);
                listItem.InitProjectItem(project, ThumbnailController.LoadThumbnailForProject(project));

                listItem.projectItemClicked  += OnProjectOpenButtonClick;
                listItem.optionButtonClicked += OnProjectOptionButtonClick;
                m_ProjectListItems.Add(listItem);
            }

            m_ProjectListItemPrefab.gameObject.SetActive(false);

            FilterProjectList(m_CurrentFilterData);
        }
コード例 #6
0
        void OnProjectOpenButtonClick(Project project)
        {
            var projectData = UIStateManager.current.projectStateData;

            if (projectData.activeProject == project)
            {
                Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.OpenDialog, DialogType.None));
                //if the project already opened, just close landing screen
                return;
            }

            var navigationState = UIStateManager.current.stateData.navigationState;

            if (navigationState.navigationMode == NavigationMode.Walk)
            {
                UIStateManager.current.walkStateData.instruction.Cancel();
            }

            projectData.activeProject          = project;
            projectData.activeProjectThumbnail = ThumbnailController.LoadThumbnailForProject(project);

            if (UIStateManager.current.projectStateData.activeProject != Project.Empty)
            {
                // first close current Project if open
                Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetStatusMessage, "Closing {UIStateManager.current.projectStateData.activeProject.name}..."));
                Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.CloseProject, UIStateManager.current.projectStateData.activeProject));
            }
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetStatusMessage, $"Opening {projectData.activeProject.name}..."));
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.CloseAllDialogs, null));
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.OpenProject, projectData));
            Dispatcher.Dispatch(Payload <ActionTypes> .From(ActionTypes.SetMeasureToolOptions, MeasureToolStateData.defaultData));
        }
コード例 #7
0
        public async Task ByZoomFactor_InputBadRequest()
        {
            var storageSelector = new FakeSelectorStorage(ArrangeStorage());

            var controller   = new ThumbnailController(_query, storageSelector);;
            var actionResult = await controller.ByZoomFactor("../") as BadRequestResult;

            Assert.AreEqual(400, actionResult.StatusCode);
        }
コード例 #8
0
        public void Thumbnail_InputBadRequest()
        {
            var storageSelector = new FakeSelectorStorage(ArrangeStorage());

            var controller   = new ThumbnailController(_query, storageSelector);;
            var actionResult = controller.Thumbnail("../") as BadRequestResult;

            Assert.AreEqual(400, actionResult.StatusCode);
        }
コード例 #9
0
        public void Thumbnail_NonExistingFile_API_Test()
        {
            var controller = new ThumbnailController(_query, new FakeSelectorStorage());

            controller.ControllerContext.HttpContext = new DefaultHttpContext();
            var actionResult    = controller.Thumbnail("404filehash", false, true) as NotFoundObjectResult;
            var thumbnailAnswer = actionResult.StatusCode;

            Assert.AreEqual(404, thumbnailAnswer);
        }
コード例 #10
0
        public async Task ByZoomFactor_NonExistingFile_API_Test()
        {
            var controller = new ThumbnailController(_query, new FakeSelectorStorage());

            controller.ControllerContext.HttpContext = new DefaultHttpContext();
            var actionResult = await controller.ByZoomFactor("404filehash", 1) as NotFoundObjectResult;

            var thumbnailAnswer = actionResult.StatusCode;

            Assert.AreEqual(404, thumbnailAnswer);
        }
コード例 #11
0
        public void ThumbnailSmallOrTinyMeta_NotFound()
        {
            var storage    = new FakeIStorage();
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult    = controller.ThumbnailSmallOrTinyMeta("404filehash") as NotFoundObjectResult;
            var thumbnailAnswer = actionResult.StatusCode;

            Assert.AreEqual(404, thumbnailAnswer);
        }
コード例 #12
0
        void InstantiateButtons(Project[] projects)
        {
            Array.Sort(projects, (project1, project2) => project2.lastPublished.CompareTo(project1.lastPublished));
            foreach (var project in projects)
            {
                var listItem = Instantiate(m_ProjectListItemPrefab, m_ScrollViewContent.transform);
                listItem.gameObject.SetActive(true);
                listItem.InitProjectItem(project, ThumbnailController.LoadThumbnailForProject(project));

                listItem.projectItemClicked  += OnProjectSelectButtonClick;
                listItem.optionButtonClicked += OnProjectOptionButtonClick;
            }
        }
コード例 #13
0
        public SoftNetImageViewer()
        {
            InitializeComponent();

            //m_ImageDialog = new ImageDialog(new Size(0, 0));

            m_AddImageDelegate = new DelegateAddImage(this.AddImage);

            m_Controller          = new ThumbnailController();
            m_Controller.OnStart += new ThumbnailControllerEventHandler(m_Controller_OnStart);
            m_Controller.OnAdd   += new ThumbnailControllerEventHandler(m_Controller_OnAdd);
            m_Controller.OnEnd   += new ThumbnailControllerEventHandler(m_Controller_OnEnd);
        }
コード例 #14
0
        public VisorPrincipal()
        {
            InitializeComponent();

            this.buttonCancel.Enabled = false;

            m_ImageDialog = new ImageDialog();

            m_AddImageDelegate = new DelegateAddImage(this.AddImage);

            m_Controller = new ThumbnailController();
            m_Controller.OnStart += new ThumbnailControllerEventHandler(m_Controller_OnStart);
            m_Controller.OnAdd += new ThumbnailControllerEventHandler(m_Controller_OnAdd);
            m_Controller.OnEnd += new ThumbnailControllerEventHandler(m_Controller_OnEnd);
        }
コード例 #15
0
        public void Thumbnail_IsMissing_ButOriginalExist_butNoIsSingleItemFlag_API_Test()
        {
            // Photo exist in database but " + "isSingleItem flag is Missing
            var createAnImage = InsertSearchData();
            var storage       = ArrangeStorage();

            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult    = controller.Thumbnail(createAnImage.FileHash, false, true) as JsonResult;
            var thumbnailAnswer = actionResult.StatusCode;             // always null for some reason ?!

            Assert.AreEqual("Thumbnail is not ready yet", actionResult.Value);
        }
コード例 #16
0
        public void Thumbnail_GetExtraLargeSecondChoiceResult()
        {
            var storage = new FakeIStorage(new List <string> {
                "/"
            }, new List <string>
            {
                ThumbnailNameHelper.Combine("test", ThumbnailSize.ExtraLarge)
            });
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            controller.Thumbnail("test", true, false, false);

            controller.Response.Headers.TryGetValue("x-image-size", out var value);
            Assert.AreEqual(ThumbnailSize.ExtraLarge.ToString(), value.ToString());
        }
コード例 #17
0
        public void ThumbnailSmallOrTinyMeta_GetLargeResultWhenAllAreMissing()
        {
            var storage = new FakeIStorage(new List <string> {
                "/"
            }, new List <string>
            {
                ThumbnailNameHelper.Combine("test", ThumbnailSize.Large)
            });
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            controller.ThumbnailSmallOrTinyMeta("test");

            controller.Response.Headers.TryGetValue("x-image-size", out var value);
            Assert.AreEqual(ThumbnailSize.Large.ToString(), value.ToString());
        }
コード例 #18
0
        public void ListSizesByHash_NotFound()
        {
            // Arrange
            var storage = new FakeIStorage(new List <string>(),
                                           new List <string> {
                "01234567890123456789123456"
            });

            // Check if exist
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = controller.ListSizesByHash("01234567890123456789123456") as NotFoundObjectResult;

            Assert.AreNotEqual(actionResult, null);
            Assert.AreEqual(404, actionResult.StatusCode);
        }
コード例 #19
0
        public void ByZoomFactor_IgnoreRawFile()
        {
            var storageSelector = new FakeSelectorStorage(ArrangeStorage());

            var controller = new ThumbnailController(new FakeIQuery(
                                                         new List <FileIndexItem>
            {
                new FileIndexItem("/test.dng")
                {
                    FileHash = "hash1"
                }
            }), storageSelector);

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            controller.ByZoomFactor("hash1");

            Assert.AreEqual(210, controller.Response.StatusCode);
        }
コード例 #20
0
        public void Thumbnail_ShowOriginalImage_API_Test()
        {
            var createAnImage = InsertSearchData();
            var storage       = ArrangeStorage();

            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult    = controller.Thumbnail(createAnImage.FileHash, true) as FileStreamResult;
            var thumbnailAnswer = actionResult.ContentType;

            controller.Response.Headers.TryGetValue("x-filename", out var value);
            Assert.AreEqual("test.jpg", value.ToString());

            Assert.AreEqual("image/jpeg", thumbnailAnswer);

            actionResult.FileStream.Dispose();             // for windows
        }
コード例 #21
0
        public async Task ByZoomFactor_ShowOriginalImage_NoFileHash_API_Test()
        {
            InsertSearchData();
            var storage = ArrangeStorage();

            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = await controller.ByZoomFactor("____", 1, "/test.jpg") as FileStreamResult;

            var thumbnailAnswer = actionResult.ContentType;

            controller.Response.Headers.TryGetValue("x-filename", out var value);
            Assert.AreEqual("test.jpg", value.ToString());

            Assert.AreEqual("image/jpeg", thumbnailAnswer);

            await actionResult.FileStream.DisposeAsync();             // for windows
        }
コード例 #22
0
        public async Task ApiController_FloatingDatabaseFileTest_API_Test()
        {
            var item = await _query.AddItemAsync(new FileIndexItem
            {
                ParentDirectory = "/fakeImage/",
                FileName        = "fake.jpg",
                FileHash        = "0986524678765456786543",
                Id = 788,
            });

            var storage = ArrangeStorage();

            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult    = controller.Thumbnail(item.FileHash, false, true) as NotFoundObjectResult;
            var thumbnailAnswer = actionResult.StatusCode;

            Assert.AreEqual(404, thumbnailAnswer);
            await _query.RemoveItemAsync(item);
        }
コード例 #23
0
        public async Task Thumbnail_CorruptImage_NoContentResult_Test()
        {
            // Arrange
            var storage         = ArrangeStorage();
            var plainTextStream = new PlainTextFileHelper().StringToStream("CorruptImage");
            await storage.WriteStreamAsync(plainTextStream, ThumbnailNameHelper.Combine(
                                               "hash-corrupt-image", ThumbnailSize.ExtraLarge));

            await _query.AddItemAsync(new FileIndexItem("/test2.jpg"){ FileHash = "hash-corrupt-image" });

            // Act
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = controller.Thumbnail("hash-corrupt-image",
                                                    false, true) as NoContentResult;

            Assert.AreEqual(204, actionResult.StatusCode);

            // remove files + database item
            await _query.RemoveItemAsync(await _query.GetObjectByFilePathAsync("/test2.jpg"));
        }
コード例 #24
0
        private static async Task GenerateThumbnails()
        {
            if (!Program.Args.CreateResizedThumbnails)
            {
                Console.WriteLine("Could not [GenerateThumbnails] in cron - Resized thumbnails are disabled"); return;
            }
            if (Program.Args.CacheDir == null)
            {
                Console.WriteLine("Could not [GenerateThumbnails] in cron - No cache directory specified"); return;
            }

            LastCronGenerateThumbnails = DateTime.Now;

            var dirs   = (await Task.WhenAll(Program.Args.DataDirs.Select(async(_, i) => await Program.GetData(i)))).ToList();
            var videos = dirs.SelectMany(p => p.Videos.Values).ToList();

            foreach (var vid in videos)
            {
                if (vid.PathVideo == null)
                {
                    continue;
                }
                if (vid.PathThumbnail == null)
                {
                    continue;
                }

                var pathCache = ThumbnailController.GetThumbnailCachePath(vid.PathVideo);
                if (File.Exists(pathCache))
                {
                    continue;
                }

                JobRegistry.ThumbGenJobs.StartOrQueue((man) => new ThumbnailGenJob(man, vid, pathCache), false);
            }
        }
コード例 #25
0
        public void ListSizesByHash_AllExist_exceptTinyMeta()
        {
            var hash = "01234567890123456789123456";
            var item = _query.AddItem(new FileIndexItem("/test123.jpg")
            {
                FileHash = hash
            });

            // Arrange
            var storage = new FakeIStorage(new List <string>(),
                                           new List <string> {
                ThumbnailNameHelper.Combine(hash, ThumbnailSize.Large),
                ThumbnailNameHelper.Combine(hash, ThumbnailSize.Small),
                ThumbnailNameHelper.Combine(hash, ThumbnailSize.ExtraLarge),
            });

            // Check if exist
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = controller.ListSizesByHash(hash) as JsonResult;

            // Thumbnail exist
            Assert.AreNotEqual(actionResult, null);
            var thumbnailAnswer = actionResult.Value as ThumbnailSizesExistStatusModel;

            Assert.AreEqual(200, controller.Response.StatusCode);
            Assert.AreEqual(true, thumbnailAnswer.Large);
            Assert.AreEqual(true, thumbnailAnswer.ExtraLarge);
            Assert.AreEqual(true, thumbnailAnswer.Small);
            // > TinyMeta is optional and not needed
            Assert.AreEqual(false, thumbnailAnswer.TinyMeta);

            _query.RemoveItem(item);
        }
コード例 #26
0
        public async Task Thumbnail_HappyFlowDisplayJson_API_Test()
        {
            // Arrange
            var storage       = ArrangeStorage();
            var createAnImage = InsertSearchData();

            // Act
            // Create thumbnail in fake storage
            await new Thumbnail(storage, storage,
                                new FakeIWebLogger()).CreateThumb(createAnImage.FilePath, createAnImage.FileHash);

            // Check if exist
            var controller = new ThumbnailController(_query, new FakeSelectorStorage(storage));

            controller.ControllerContext.HttpContext = new DefaultHttpContext();

            var actionResult = controller.Thumbnail(createAnImage.FileHash, true, true) as JsonResult;

            // Thumbnail exist
            Assert.AreNotEqual(actionResult, null);
            var thumbnailAnswer = actionResult.Value as string;

            Assert.AreEqual("OK", thumbnailAnswer);
        }
コード例 #27
0
        private (JObject, string, string) ReadVideoDataRaw(string pathVideo)
        {
            var uid = "SHA256" + pathVideo.Sha256().Substring(0, 18);

            var dir = Path.GetDirectoryName(pathVideo);

            if (dir == null)
            {
                return(null, null, null);
            }

            var filenameVideo = Path.GetFileName(pathVideo);

            var filenameBase = Path.GetFileNameWithoutExtension(filenameVideo);

            var pathDesc = Path.Combine(dir, filenameBase + ".description");

            if (!_datafiles.Contains(pathDesc))
            {
                pathDesc = null;
            }

            var pathThumb = Program.ExtThumbnail.Select(ext => Path.Combine(dir, filenameBase + "." + ext)).FirstOrDefault(p => _datafiles.Contains(p));

            var pathSubs = _filesSubs
                           .Where(p => dir == Path.GetDirectoryName(p))
                           .Where(p => Path.GetFileName(p).EndsWith(".vtt"))
                           .Where(p => Path.GetFileName(p).StartsWith(filenameBase + "."))
                           .ToList();

            var vtitle = _spec.UseFilenameAsTitle ? Path.GetFileNameWithoutExtension(pathVideo) : Path.GetFileName(pathVideo);

            var vidData = new JObject
                          (
                new JProperty("meta", new JObject
                              (
                                  new JProperty("uid", uid),
                                  new JProperty("datadirindex", _index),

                                  new JProperty("directory", dir),

                                  new JProperty("filename_base", filenameBase),

                                  new JProperty("path_json", (object)null),
                                  new JProperty("path_toml", (object)null),
                                  new JProperty("path_description", pathDesc),
                                  new JProperty("path_video", pathVideo),
                                  new JProperty("path_video_abs", Path.GetFullPath(pathVideo)),
                                  new JProperty("path_thumbnail", pathThumb),
                                  new JProperty("paths_subtitle", new JObject(pathSubs.Select(p => new JProperty(Path.GetFileNameWithoutExtension(p).Substring(filenameBase.Length + 1), p)))),

                                  new JProperty("cache_file", VideoController.GetStreamCachePath(pathVideo)),
                                  new JProperty("cached", _cacheFiles.Contains(Path.GetFileName(VideoController.GetStreamCachePath(pathVideo)))),
                                  new JProperty("cached_video_fsize", _cacheFiles.Contains(Path.GetFileName(VideoController.GetStreamCachePath(pathVideo))) ? new FileInfo(VideoController.GetStreamCachePath(pathVideo)).Length : 0),

                                  new JProperty("previewscache_file", PreviewController.GetPreviewCachePath(pathVideo)),
                                  new JProperty("cached_previews", _cacheFiles.Contains(Path.GetFileName(PreviewController.GetPreviewCachePath(pathVideo)))),
                                  new JProperty("cached_preview_fsize", _cacheFiles.Contains(Path.GetFileName(PreviewController.GetPreviewCachePath(pathVideo))) ? new FileInfo(PreviewController.GetPreviewCachePath(pathVideo)).Length : 0),

                                  new JProperty("thumbnailcache_file", ThumbnailController.GetThumbnailCachePath(pathVideo)),
                                  new JProperty("cached_thumbnail", _cacheFiles.Contains(Path.GetFileName(ThumbnailController.GetThumbnailCachePath(pathVideo)))),
                                  new JProperty("cached_thumbnail_fsize", _cacheFiles.Contains(Path.GetFileName(ThumbnailController.GetThumbnailCachePath(pathVideo))) ? new FileInfo(ThumbnailController.GetThumbnailCachePath(pathVideo)).Length : 0),

                                  new JProperty("filesize", new FileInfo(pathVideo).Length)
                              )),
                new JProperty("data", new JObject
                              (
                                  new JProperty("title", vtitle),
                                  new JProperty("description", (pathDesc != null) ? File.ReadAllText(pathDesc) : null),
                                  new JProperty("info", new JObject())
                              ))
                          );

            return(vidData, dir, filenameBase);
        }