bug-14786: Addressing layered subresources in vkCmdCopyImage

commit: ad27e2b Attempt at naming consistency
diff --git a/include/vulkan.h b/include/vulkan.h
index 8bc8862..fd7d207 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -1179,7 +1179,7 @@
 typedef struct {
     VkExtent3D                                  maxExtent;
     uint32_t                                    maxMipLevels;
-    uint32_t                                    maxArraySize;
+    uint32_t                                    maxArrayLayers;
     VkSampleCountFlags                          sampleCounts;
     VkDeviceSize                                maxResourceSize;
 } VkImageFormatProperties;
@@ -1512,9 +1512,9 @@
 typedef struct {
     VkImageAspectFlags                          aspectMask;
     uint32_t                                    baseMipLevel;
-    uint32_t                                    mipLevels;
+    uint32_t                                    numLevels;
     uint32_t                                    baseArrayLayer;
-    uint32_t                                    arraySize;
+    uint32_t                                    numLayers;
 } VkImageSubresourceRange;
 
 typedef struct {
@@ -1952,8 +1952,8 @@
 typedef struct {
     VkImageAspectFlags                          aspect;
     uint32_t                                    mipLevel;
-    uint32_t                                    arrayLayer;
-    uint32_t                                    arraySize;
+    uint32_t                                    baseArrayLayer;
+    uint32_t                                    numLayers;
 } VkImageSubresourceCopy;
 
 typedef struct {
diff --git a/layers/image.cpp b/layers/image.cpp
index e40536a..a49ded8 100644
--- a/layers/image.cpp
+++ b/layers/image.cpp
@@ -400,12 +400,12 @@
             ss << "vkCreateImageView called with baseArrayLayer " << pCreateInfo->subresourceRange.baseArrayLayer << " for image " << pCreateInfo->image.handle << " that only has " << imageEntry->second->arraySize << " mip levels.";
             skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", ss.str().c_str());
         }
-        if (!pCreateInfo->subresourceRange.mipLevels) {
+        if (!pCreateInfo->subresourceRange.numLevels) {
             std::stringstream ss;
             ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.mipLevels.";
             skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", ss.str().c_str());
         }
-        if (!pCreateInfo->subresourceRange.arraySize) {
+        if (!pCreateInfo->subresourceRange.numLayers) {
             std::stringstream ss;
             ss << "vkCreateImageView called with 0 in pCreateInfo->subresourceRange.arraySize.";
             skipCall |= log_msg(device_data->report_data, VK_DBG_REPORT_ERROR_BIT, (VkDbgObjectType)0, 0, 0, IMAGE_VIEW_CREATE_ERROR, "IMAGE", ss.str().c_str());
diff --git a/tests/blit_tests.cpp b/tests/blit_tests.cpp
index e11c108..a1abc8c 100644
--- a/tests/blit_tests.cpp
+++ b/tests/blit_tests.cpp
@@ -94,7 +94,7 @@
 
         region.bufferOffset = offset;
         region.imageSubresource.mipLevel = lv;
-        region.imageSubresource.arrayLayer = 0;
+        region.imageSubresource.baseArrayLayer = 0;
         region.imageExtent = Image::extent(info_.extent, lv);
 
         if (info_.usage & VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) {
@@ -130,7 +130,7 @@
                 VkBufferImageCopy region = regions_[i];
 
                 region.bufferOffset += slice_pitch * slice;
-                region.imageSubresource.arrayLayer = slice;
+                region.imageSubresource.baseArrayLayer = slice;
                 regions_.push_back(region);
             }
         }
@@ -143,8 +143,8 @@
     VkDeviceSize offset = 0;
     for (std::vector<VkImageSubresourceRange>::const_iterator it = ranges.begin();
          it != ranges.end(); it++) {
-        for (uint32_t lv = 0; lv < it->mipLevels; lv++) {
-            for (uint32_t layer = 0; layer < it->arraySize; layer++) {
+        for (uint32_t lv = 0; lv < it->numLevels; lv++) {
+            for (uint32_t layer = 0; layer < it->numLayers; layer++) {
                 VkBufferImageCopy region = {};
                 region.bufferOffset = offset;
                 region.imageSubresource = Image::subresource(*it, lv, layer, 1);
@@ -276,7 +276,7 @@
     const unsigned char input[] = {
         HASH_BYTES(hash_salt_),
         HASH_BYTES(subres.mipLevel),
-        HASH_BYTES(subres.arrayLayer),
+        HASH_BYTES(subres.baseArrayLayer),
         HASH_BYTES(offset.x),
         HASH_BYTES(offset.y),
         HASH_BYTES(offset.z),
diff --git a/tests/image_tests.cpp b/tests/image_tests.cpp
index be4e012..6fd07b4 100644
--- a/tests/image_tests.cpp
+++ b/tests/image_tests.cpp
@@ -290,9 +290,9 @@
     viewInfo.channels.a = VK_CHANNEL_SWIZZLE_A;
 
     viewInfo.subresourceRange.baseArrayLayer = 0;
-    viewInfo.subresourceRange.arraySize = 1;
+    viewInfo.subresourceRange.numLayers = 1;
     viewInfo.subresourceRange.baseMipLevel = 0;
-    viewInfo.subresourceRange.mipLevels = 1;
+    viewInfo.subresourceRange.numLevels = 1;
     viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
 
     //    VkResult VKAPI vkCreateImageView(
diff --git a/tests/init.cpp b/tests/init.cpp
index 472b230..e5b18d8 100644
--- a/tests/init.cpp
+++ b/tests/init.cpp
@@ -456,9 +456,9 @@
     viewInfo.channels.a = VK_CHANNEL_SWIZZLE_A;
 
     viewInfo.subresourceRange.baseArrayLayer = 0;
-    viewInfo.subresourceRange.arraySize = 1;
+    viewInfo.subresourceRange.numLayers = 1;
     viewInfo.subresourceRange.baseMipLevel = 0;
-    viewInfo.subresourceRange.mipLevels = 1;
+    viewInfo.subresourceRange.numLevels = 1;
     viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
 
 //    VkResult VKAPI vkCreateImageView(
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 897134b..6ee949a 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -4343,9 +4343,9 @@
         image_view_create_info.image = image;
         image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
         image_view_create_info.format = tex_format;
-        image_view_create_info.subresourceRange.arraySize = 1;
+        image_view_create_info.subresourceRange.numLayers = 1;
         image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
-        image_view_create_info.subresourceRange.mipLevels = 1;
+        image_view_create_info.subresourceRange.numLevels = 1;
 
     VkImageView view;
     err = vkCreateImageView(m_device->device(), &image_view_create_info, &view);
@@ -4428,15 +4428,15 @@
     VkImageCopy copyRegion;
     copyRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     copyRegion.srcSubresource.mipLevel = 0;
-    copyRegion.srcSubresource.arrayLayer = 0;
-    copyRegion.srcSubresource.arraySize = 0;
+    copyRegion.srcSubresource.baseArrayLayer = 0;
+    copyRegion.srcSubresource.numLayers = 0;
     copyRegion.srcOffset.x = 0;
     copyRegion.srcOffset.y = 0;
     copyRegion.srcOffset.z = 0;
     copyRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     copyRegion.destSubresource.mipLevel = 0;
-    copyRegion.destSubresource.arrayLayer = 0;
-    copyRegion.destSubresource.arraySize = 0;
+    copyRegion.destSubresource.baseArrayLayer = 0;
+    copyRegion.destSubresource.numLayers = 0;
     copyRegion.destOffset.x = 0;
     copyRegion.destOffset.y = 0;
     copyRegion.destOffset.z = 0;
@@ -4534,15 +4534,15 @@
     VkImageCopy copyRegion;
     copyRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     copyRegion.srcSubresource.mipLevel = 0;
-    copyRegion.srcSubresource.arrayLayer = 0;
-    copyRegion.srcSubresource.arraySize = 0;
+    copyRegion.srcSubresource.baseArrayLayer = 0;
+    copyRegion.srcSubresource.numLayers = 0;
     copyRegion.srcOffset.x = 0;
     copyRegion.srcOffset.y = 0;
     copyRegion.srcOffset.z = 0;
     copyRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     copyRegion.destSubresource.mipLevel = 0;
-    copyRegion.destSubresource.arrayLayer = 0;
-    copyRegion.destSubresource.arraySize = 0;
+    copyRegion.destSubresource.baseArrayLayer = 0;
+    copyRegion.destSubresource.numLayers = 0;
     copyRegion.destOffset.x = 0;
     copyRegion.destOffset.y = 0;
     copyRegion.destOffset.z = 0;
@@ -4638,15 +4638,15 @@
     VkImageResolve resolveRegion;
     resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.srcSubresource.mipLevel = 0;
-    resolveRegion.srcSubresource.arrayLayer = 0;
-    resolveRegion.srcSubresource.arraySize = 0;
+    resolveRegion.srcSubresource.baseArrayLayer = 0;
+    resolveRegion.srcSubresource.numLayers = 0;
     resolveRegion.srcOffset.x = 0;
     resolveRegion.srcOffset.y = 0;
     resolveRegion.srcOffset.z = 0;
     resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.destSubresource.mipLevel = 0;
-    resolveRegion.destSubresource.arrayLayer = 0;
-    resolveRegion.destSubresource.arraySize = 0;
+    resolveRegion.destSubresource.baseArrayLayer = 0;
+    resolveRegion.destSubresource.numLayers = 0;
     resolveRegion.destOffset.x = 0;
     resolveRegion.destOffset.y = 0;
     resolveRegion.destOffset.z = 0;
@@ -4742,15 +4742,15 @@
     VkImageResolve resolveRegion;
     resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.srcSubresource.mipLevel = 0;
-    resolveRegion.srcSubresource.arrayLayer = 0;
-    resolveRegion.srcSubresource.arraySize = 0;
+    resolveRegion.srcSubresource.baseArrayLayer = 0;
+    resolveRegion.srcSubresource.numLayers = 0;
     resolveRegion.srcOffset.x = 0;
     resolveRegion.srcOffset.y = 0;
     resolveRegion.srcOffset.z = 0;
     resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.destSubresource.mipLevel = 0;
-    resolveRegion.destSubresource.arrayLayer = 0;
-    resolveRegion.destSubresource.arraySize = 0;
+    resolveRegion.destSubresource.baseArrayLayer = 0;
+    resolveRegion.destSubresource.numLayers = 0;
     resolveRegion.destOffset.x = 0;
     resolveRegion.destOffset.y = 0;
     resolveRegion.destOffset.z = 0;
@@ -4847,15 +4847,15 @@
     VkImageResolve resolveRegion;
     resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.srcSubresource.mipLevel = 0;
-    resolveRegion.srcSubresource.arrayLayer = 0;
-    resolveRegion.srcSubresource.arraySize = 0;
+    resolveRegion.srcSubresource.baseArrayLayer = 0;
+    resolveRegion.srcSubresource.numLayers = 0;
     resolveRegion.srcOffset.x = 0;
     resolveRegion.srcOffset.y = 0;
     resolveRegion.srcOffset.z = 0;
     resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.destSubresource.mipLevel = 0;
-    resolveRegion.destSubresource.arrayLayer = 0;
-    resolveRegion.destSubresource.arraySize = 0;
+    resolveRegion.destSubresource.baseArrayLayer = 0;
+    resolveRegion.destSubresource.numLayers = 0;
     resolveRegion.destOffset.x = 0;
     resolveRegion.destOffset.y = 0;
     resolveRegion.destOffset.z = 0;
@@ -4952,15 +4952,15 @@
     VkImageResolve resolveRegion;
     resolveRegion.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.srcSubresource.mipLevel = 0;
-    resolveRegion.srcSubresource.arrayLayer = 0;
-    resolveRegion.srcSubresource.arraySize = 0;
+    resolveRegion.srcSubresource.baseArrayLayer = 0;
+    resolveRegion.srcSubresource.numLayers = 0;
     resolveRegion.srcOffset.x = 0;
     resolveRegion.srcOffset.y = 0;
     resolveRegion.srcOffset.z = 0;
     resolveRegion.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
     resolveRegion.destSubresource.mipLevel = 0;
-    resolveRegion.destSubresource.arrayLayer = 0;
-    resolveRegion.destSubresource.arraySize = 0;
+    resolveRegion.destSubresource.baseArrayLayer = 0;
+    resolveRegion.destSubresource.numLayers = 0;
     resolveRegion.destOffset.x = 0;
     resolveRegion.destOffset.y = 0;
     resolveRegion.destOffset.z = 0;
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 0b77e65..2876d45 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -764,13 +764,13 @@
 
     VkImageCopy copy_region = {};
     copy_region.srcSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
-    copy_region.srcSubresource.arrayLayer = 0;
+    copy_region.srcSubresource.baseArrayLayer = 0;
     copy_region.srcSubresource.mipLevel = 0;
     copy_region.srcOffset.x = 0;
     copy_region.srcOffset.y = 0;
     copy_region.srcOffset.z = 0;
     copy_region.destSubresource.aspect = VK_IMAGE_ASPECT_COLOR_BIT;
-    copy_region.destSubresource.arrayLayer = 0;
+    copy_region.destSubresource.baseArrayLayer = 0;
     copy_region.destSubresource.mipLevel = 0;
     copy_region.destOffset.x = 0;
     copy_region.destOffset.y = 0;
@@ -825,9 +825,9 @@
     view.channels.a = VK_CHANNEL_SWIZZLE_A;
     view.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     view.subresourceRange.baseMipLevel = 0;
-    view.subresourceRange.mipLevels = 1;
+    view.subresourceRange.numLevels = 1;
     view.subresourceRange.baseArrayLayer = 0;
-    view.subresourceRange.arraySize = 1;
+    view.subresourceRange.numLayers = 1;
 
     /* create image */
     init(16, 16, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT, VK_IMAGE_TILING_OPTIMAL);
@@ -1387,9 +1387,9 @@
     VkImageSubresourceRange srRange = {};
     srRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     srRange.baseMipLevel = 0;
-    srRange.mipLevels = VK_REMAINING_MIP_LEVELS;
+    srRange.numLevels = VK_REMAINING_MIP_LEVELS;
     srRange.baseArrayLayer = 0;
-    srRange.arraySize = VK_REMAINING_ARRAY_LAYERS;
+    srRange.numLayers = VK_REMAINING_ARRAY_LAYERS;
 
     VkImageMemoryBarrier memory_barrier = {};
     memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
@@ -1419,9 +1419,9 @@
         VkImageSubresourceRange dsRange = {};
         dsRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
         dsRange.baseMipLevel = 0;
-        dsRange.mipLevels = VK_REMAINING_MIP_LEVELS;
+        dsRange.numLevels = VK_REMAINING_MIP_LEVELS;
         dsRange.baseArrayLayer = 0;
-        dsRange.arraySize = VK_REMAINING_ARRAY_LAYERS;
+        dsRange.numLayers = VK_REMAINING_ARRAY_LAYERS;
 
         // prepare the depth buffer for clear
 
@@ -1493,9 +1493,9 @@
     VkImageSubresourceRange srRange = {};
     srRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     srRange.baseMipLevel = 0;
-    srRange.mipLevels = VK_REMAINING_MIP_LEVELS;
+    srRange.numLevels = VK_REMAINING_MIP_LEVELS;
     srRange.baseArrayLayer = 0;
-    srRange.arraySize = VK_REMAINING_ARRAY_LAYERS;
+    srRange.numLayers = VK_REMAINING_ARRAY_LAYERS;
 
     VkImageMemoryBarrier memory_barrier = {};
     memory_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
@@ -1703,9 +1703,9 @@
     view_info.image = VK_NULL_HANDLE;
     view_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
     view_info.subresourceRange.baseMipLevel = 0;
-    view_info.subresourceRange.mipLevels = 1;
+    view_info.subresourceRange.numLevels = 1;
     view_info.subresourceRange.baseArrayLayer = 0;
-    view_info.subresourceRange.arraySize = 1;
+    view_info.subresourceRange.numLayers = 1;
     view_info.flags = 0;
     view_info.format = m_depth_stencil_fmt;
     view_info.image = handle();
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index 34f53c1..b1f6b66 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -610,7 +610,7 @@
 VkSubresourceLayout Image::subresource_layout(const VkImageSubresourceCopy &subrescopy) const
 {
     VkSubresourceLayout data;
-    VkImageSubresource subres = subresource(image_aspect(subrescopy.aspect), subrescopy.mipLevel, subrescopy.arrayLayer);
+    VkImageSubresource subres = subresource(image_aspect(subrescopy.aspect), subrescopy.mipLevel, subrescopy.baseArrayLayer);
     size_t size = sizeof(data);
     vkGetImageSubresourceLayout(device(), handle(), &subres, &data);
     if (size != sizeof(data))
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index f2ef822..09d8109 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -421,7 +421,7 @@
     static VkImageSubresourceCopy subresource(VkImageAspectFlagBits aspect, uint32_t mip_level, uint32_t array_layer, uint32_t array_size);
     static VkImageSubresourceCopy subresource(const VkImageSubresourceRange &range, uint32_t mip_level, uint32_t array_layer, uint32_t array_size);
     static VkImageSubresourceRange subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level, uint32_t mip_levels,
-                                                     uint32_t base_array_layer, uint32_t array_size);
+                                                     uint32_t base_array_layer, uint32_t num_layers);
     static VkImageSubresourceRange subresource_range(const VkImageCreateInfo &info, VkImageAspectFlags aspect_mask);
     static VkImageSubresourceRange subresource_range(const VkImageSubresource &subres);
 
@@ -693,8 +693,8 @@
     VkImageSubresourceCopy subres = {};
     subres.aspect = aspect;
     subres.mipLevel = mip_level;
-    subres.arrayLayer = array_layer;
-    subres.arraySize = array_size;
+    subres.baseArrayLayer = array_layer;
+    subres.numLayers = array_size;
     return subres;
 }
 
@@ -725,14 +725,14 @@
 }
 
 inline VkImageSubresourceRange Image::subresource_range(VkImageAspectFlags aspect_mask, uint32_t base_mip_level, uint32_t mip_levels,
-                                                        uint32_t base_array_layer, uint32_t array_size)
+                                                        uint32_t base_array_layer, uint32_t num_layers)
 {
     VkImageSubresourceRange range = {};
     range.aspectMask = aspect_mask;
     range.baseMipLevel = base_mip_level;
-    range.mipLevels = mip_levels;
+    range.numLevels = mip_levels;
     range.baseArrayLayer = base_array_layer;
-    range.arraySize = array_size;
+    range.numLayers = num_layers;
     return range;
 }
 
diff --git a/tests/vktestframework.cpp b/tests/vktestframework.cpp
index e61efb8..d960580 100644
--- a/tests/vktestframework.cpp
+++ b/tests/vktestframework.cpp
@@ -559,9 +559,9 @@
     memoryBarrier.destQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
     memoryBarrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
     memoryBarrier.subresourceRange.baseMipLevel = 0;
-    memoryBarrier.subresourceRange.mipLevels = 1;
+    memoryBarrier.subresourceRange.numLevels = 1;
     memoryBarrier.subresourceRange.baseArrayLayer = 0;
-    memoryBarrier.subresourceRange.arraySize = 1;
+    memoryBarrier.subresourceRange.numLayers = 1;
     memoryBarrier.image = m_buffers[m_current_buffer].image;
     VkImageMemoryBarrier *pmemory_barrier = &memoryBarrier;
     vkCmdPipelineBarrier(m_cmdbuf.handle(), VK_PIPELINE_STAGE_ALL_GPU_COMMANDS, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
@@ -957,9 +957,9 @@
         color_image_view.format = m_format;
         color_image_view.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
         color_image_view.subresourceRange.baseMipLevel = 0;
-        color_image_view.subresourceRange.mipLevels = 1;
+        color_image_view.subresourceRange.numLevels = 1;
         color_image_view.subresourceRange.baseArrayLayer = 0;
-        color_image_view.subresourceRange.arraySize = 1;
+        color_image_view.subresourceRange.numLayers = 1;
 
         m_buffers[i].image = swapchainImages[i];
 
@@ -1002,9 +1002,9 @@
     image_memory_barrier.image = image;
     image_memory_barrier.subresourceRange.aspectMask = aspectMask;
     image_memory_barrier.subresourceRange.baseMipLevel = 0;
-    image_memory_barrier.subresourceRange.mipLevels = 1;
+    image_memory_barrier.subresourceRange.numLevels = 1;
     image_memory_barrier.subresourceRange.baseArrayLayer = 0;
-    image_memory_barrier.subresourceRange.arraySize = 1;
+    image_memory_barrier.subresourceRange.numLayers = 1;
 
     if (new_image_layout == VK_IMAGE_LAYOUT_TRANSFER_DESTINATION_OPTIMAL) {
         /* Make sure anything that was copying from this image has completed */