package zip
{
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.events.EventDispatcher;
	import flash.events.ProgressEvent;
	import flash.filesystem.File;
	import flash.filesystem.FileMode;
	import flash.filesystem.FileStream;
	import flash.net.URLRequest;
	import flash.net.URLLoaderDataFormat;
	import flash.net.URLRequestMethod;
	import flash.net.URLLoader;
	import flash.net.URLStream;
	import flash.net.URLVariables;
	import flash.utils.ByteArray;
	import deng.fzip.FZip;
	import deng.fzip.FZipFile;
	import flash.events.ErrorEvent;

	public class ZIPResourceLoader extends EventDispatcher
	{
	    public var resourcesURL:String = "https://redagereborn.ru/resources.zip";
	    public var versionURL:String = "https://redagereborn.ru/version.txt";
	    public var localFilePath:String = File.applicationStorageDirectory.nativePath + File.separator + "resources.zip";
	    public var versionFile:File = new File(File.applicationStorageDirectory.nativePath + File.separator + "version.txt");
	    public var zipLoader:URLLoader = new URLLoader();
	    private var progressBar:ProgressBar;
		public static const PROGRESS_UPDATE:String = "progressUpdate";
		
	    public function ZIPResourceLoader(progressBar:ProgressBar)
	    {
			this.progressBar = progressBar;
	        zipLoader.dataFormat = URLLoaderDataFormat.TEXT;
	        zipLoader.addEventListener(Event.COMPLETE, onVersionLoaded);
	        zipLoader.addEventListener(IOErrorEvent.IO_ERROR, onVersionLoadError);
	        zipLoader.load(new URLRequest(versionURL));
	    }

	    public function onVersionLoaded(event:Event):void
	    {
	        var remoteVersion:Number = Number(zipLoader.data);

	        var versionLoader:URLLoader = new URLLoader();
	        versionLoader.dataFormat = URLLoaderDataFormat.TEXT;
	        versionLoader.addEventListener(Event.COMPLETE, onLocalVersionLoaded);
	        versionLoader.addEventListener(IOErrorEvent.IO_ERROR, onLocalVersionLoadError);
	        versionLoader.load(new URLRequest(versionFile.nativePath));

	        function onLocalVersionLoaded(event:Event):void {
	            var localVersion:Number = Number(versionLoader.data);
	            if (localVersion != remoteVersion) {
			        startDownloadProcess();
	            } else {
	                Alert.showMessage("Local version is up to date");
					   progressBar.progressBar.visible = false;
	                // Пропущен код для распаковки архива
	            }
	        }
			
		    function onLocalVersionLoadError(event:IOErrorEvent):void {
	            // Создаем новый файл version.txt и записываем в него пустую строку
	            var fileStream:FileStream = new FileStream();
	            fileStream.open(versionFile, FileMode.WRITE);
	            fileStream.writeUTFBytes("");
	            fileStream.close();
	            // Запускаем процесс загрузки и распаковки архива
	            startDownloadProcess();
	        }
	    }
	
	    public function onDownloadProgress(event:ProgressEvent):void 
	    {
	        progressBar.setProgress(event.bytesLoaded, event.bytesTotal);
	    } 
	
	    private function startDownloadProcess():void 
	    {
	        Alert.showMessage("Downloading resources.zip");
			progressBar.progressBar.visible = true;
	        var downloadStream:URLStream = new URLStream();
			downloadStream.addEventListener(ProgressEvent.PROGRESS, onDownloadProgress);
	        downloadStream.addEventListener(Event.COMPLETE, onDownloadComplete);
	        downloadStream.addEventListener(IOErrorEvent.IO_ERROR, onDownloadError);
	        downloadStream.load(new URLRequest(resourcesURL));
	    }
	
		public function onProgressUpdate(event:ProgressEvent):void 
		{
	        progressBar.progress = event.bytesLoaded / event.bytesTotal;
	        progressBar.updateProgressBar();
		}
	
	    public function onVersionLoadError(event:IOErrorEvent):void
	    {
			progressBar.progressBar.visible = false;
			progressBar.incilizationProgressBar();
	        Alert.showMessage("Failed to load version.txt");
	    }
	
	    private function updateLocalVersion(remoteVersion:Number):void 
	    {
	        var fileStream:FileStream = new FileStream();
	        fileStream.open(versionFile, FileMode.WRITE);
	        fileStream.writeUTFBytes(remoteVersion.toString());
	        fileStream.close();
	    }
		
	    public function onDownloadComplete(event:Event):void
	    {
	    	
			//var percent:Number = event.bytesLoaded / event.bytesTotal;
          	//progressBar.dispatchEvent(new ProgressEvent(ProgressEvent.PROGRESS, false, false, event.bytesLoaded, event.bytesTotal));
			
	        var downloadStream:URLStream = event.target as URLStream;
	        var fileBytes:ByteArray = new ByteArray();
	        downloadStream.readBytes(fileBytes);

	        var fileStream:FileStream = new FileStream();
	        fileStream.openAsync(new File(localFilePath), FileMode.WRITE);
	        fileStream.addEventListener(Event.CLOSE, onFileClosed);
	        fileStream.writeBytes(fileBytes, 0, fileBytes.length);
	        fileStream.close();
	    }
	
	    public function onDownloadError(event:IOErrorEvent):void
	    {
	        Alert.showMessage("Failed to download resources.zip");
	    }
	
	    private function onFileClosed(event:Event):void
	    {
	        var fileStream:FileStream = event.target as FileStream;
	        fileStream.removeEventListener(Event.CLOSE, onFileClosed);
	
	        var remoteVersion:Number = Number(zipLoader.data); // Получаем удаленную версию файла
	        updateLocalVersion(remoteVersion); // Обновляем локальную версию файла
	
	        extractLocalArchive();
	    }
	
	    public function extractLocalArchive():void
	    {
	        var resourcesFolder:File = new File(File.applicationStorageDirectory.nativePath + File.separator + "cache/resources");
	        if (resourcesFolder.exists && resourcesFolder.isDirectory)
	        {
	            resourcesFolder.deleteDirectoryAsync(true); // Асинхронное удаление папки “resources” с ее содержимым
	        }
	
	        var zipFile:FZip = new FZip();
	        zipFile.addEventListener(Event.COMPLETE, onZipLoaded);
	        zipFile.load(new URLRequest(localFilePath));
	    }
	
	    public function onZipLoaded(event:Event):void
	    {
	        var zipFile:FZip = event.target as FZip;
	
	        try {
	            // Определите обработчик события для zipFile.extractAsync, чтобы знать, когда архив полностью распакован
	            zipFile.extractAsync(onZipExtracted, null, true);
	        } catch (error:Error) {
	            Alert.showMessage("Failed to extract resources.zip: " + error.message + " (" + error.errorID + ")");
	        }
	    }
	
	    public function onZipExtracted(file:FZipFile, succeeded:Boolean):void
	    {
	        if (succeeded)
	        {
	            var targetFilePath:String = File.applicationStorageDirectory.nativePath + File.separator + "cache/resources" + File.separator + file.filename;
	            var targetFile:File = new File(targetFilePath);
	
	            if (file.filename.charAt(file.filename.length - 1) == "/") {
	                targetFile.createDirectoryAsync(); // Асинхронное создание папки
	            } else {
	                var targetFileStream:FileStream = new FileStream();
	                targetFileStream.addEventListener(Event.CLOSE, onTargetFileClosed);
	                targetFileStream.openAsync(targetFile, FileMode.WRITE);
	                targetFileStream.writeBytes(file.content);
	                targetFileStream.close();
	            }
	        } else {
	            Alert.showMessage("Failed to extract resources.zip");
	        }
	    }
	
	    public function onTargetFileClosed(event:Event):void
	    {
	        var targetFileStream:FileStream = event.target as FileStream;
	        targetFileStream.removeEventListener(Event.CLOSE, onTargetFileClosed);
	        // Выполняйте дополнительные действия, если требуется, когда файл распакован и поток записи закрыт
	    }
	}
}
 как исправить C:\Users\Alexander\Desktop\project\Preloader\src\zip\ZIPResourceLoader.as(161): col: 22 Error: Call to a possibly undefined method extractAsync through a reference with static type deng.fzip:FZip.
 Loading configuration file F:\sdk-flex\flex_sdk_4.6.0.23201\frameworks\air-config.xml
Loading configuration file C:\Users\Alexander\Desktop\project\Preloader\obj\PreloaderConfig.xml
Files changed: 0 Files affected: 3
	            zipFile.extractAsync(onZipExtracted, null, true);
	                    ^
C:\Users\Alexander\Desktop\project\Preloader\src\zip\ZIPResourceLoader.as(175): col: 29 Error: Call to a possibly undefined method createDirectoryAsync through a reference with static type flash.filesystem:File.
	                targetFile.createDirectoryAsync(); // Асинхронное создание папки
	                           ^
Build halted with errors (fcsh).