{"id":224027,"date":"2014-05-26T15:47:02","date_gmt":"2014-05-26T11:47:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=224027"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=224027","title":{"rendered":"<span class=\"post_title\">Steam FIles. \u0427\u0430\u0441\u0442\u044c 1 \u2014 GCF\/NCF<\/span>"},"content":{"rendered":"<div class=\"content html_format\">     \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/000\/dca\/198\/000dca198a459957c5d705d59a8bc514.png\" alt=\"Steam Logo\" align=\"left\"\/><br \/>  \u041a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b \u0432 <a href=\"http:\/\/habrahabr.ru\/post\/223961\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Steam, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043c\u043e\u0433\u043b\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c Anti-Steam \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u0443\u0442\u0451\u043c \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0437\u0433\u043e\u0432\u044b\u0445 \u0448\u0442\u0443\u0440\u043c\u043e\u0432.<br \/>  \u0424\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0430 GCF \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0438\u0433\u0440, \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 VALVE, \u0430 NCF \u2014 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u0421\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0437\u0430\u0449\u0438\u0442\u044b. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 NCF \u043e\u0442 GCF \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0430 \u0444\u0430\u0439\u043b\u044b, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u0438\u043c, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 (<i>&lt;\u043a\u0430\u0442\u0430\u043b\u043e\u0433 Steam&gt;\/SteamApps\/common\/&lt;\u0438\u043c\u044f \u0438\u0433\u0440\u044b&gt;<\/i>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0443 GCF, \u0430 \u0432\u0441\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 NCF \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u043e\u0441\u043b\u0435.<br \/>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0438\u043c\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0432\u043e\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0451 \u2014 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438). \u041d\u0430\u0447\u0430\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u0443\u0447\u043d\u044b\u043c \u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0445 \u043f\u043e\u043b\u0435\u0439. \u0421\u0430\u043c\u043e\u0435 \u00ab\u0432\u043a\u0443\u0441\u043d\u043e\u0435\u00bb \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445\u2026<br \/>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0437\u0434\u0435\u0441\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0434\u043e\u043c \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Steam. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u044b\u043b\u0430 \u043f\u043e\u0447\u0435\u0440\u043f\u043d\u0443\u0442\u0430 \u0438\u0437 <a href=\"http:\/\/wiki.singul4rity.com\/steam:filestructures:gcf\">\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432<\/a>, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0435\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043b \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043a\u0435\u0448\u0430 (\u0434\u0430\u0436\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u0430\u043c\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043d\u0430 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 HLLIB).<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h4>\u041e\u0431\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0444\u0430\u0439\u043b\u043e\u0432<\/h4>\n<p>  \u0424\u0430\u0439\u043b \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u0440\u0430\u0437\u0431\u0438\u0442 \u043d\u0430 2 \u0447\u0430\u0441\u0442\u0438 \u2014 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0440\u0430\u0437\u0431\u0438\u0442\u043e \u043d\u0430 \u0431\u043b\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0440\u0430\u0437\u0431\u0438\u0442\u044b \u043d\u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u043e 8\u043a\u0411, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u0430\u043c \u0438 \u0438\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445. \u0412\u0441\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043f\u043e\u043b\u044f, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0431\u0430\u0439\u0442\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 (\u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u2014 \u0447\u0430\u0441\u0442\u044c, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0430\u044f \u0437\u0430 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043c\u0451\u043d \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432).<br \/>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440:  <\/p>\n<ul>\n<li>FileHeader<\/li>\n<li>BlockAllocationTableHeader<\/li>\n<li>BlockAllocationTable[]<\/li>\n<li>FileAllocationTableHeader<\/li>\n<li>FileAllocationTable[]<\/li>\n<li>ManifestHeader<\/li>\n<li>Manifest[]<\/li>\n<li>FileNames<\/li>\n<li>HashTableKeys[]<\/li>\n<li>HashTableIndices[]<\/li>\n<li>MinimumFootprints[]<\/li>\n<li>UserConfig[]<\/li>\n<li>ManifestMapHeader<\/li>\n<li>ManifestMap[]<\/li>\n<li>ChecksumDataContainer<\/li>\n<li>FileIdChecksumTableHeader<\/li>\n<li>FileIdChecksums[]<\/li>\n<li>Checksums[]<\/li>\n<li>ChecksumSignature<\/li>\n<li>LatestApplicationVersion<\/li>\n<li>DataHeader<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435 \u0436\u0435, \u0447\u0442\u043e \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 \u2014 \u044d\u0442\u043e <i>ChecksumSignature<\/i>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0445\u0435\u0448\u0435\u043c \u0447\u0430\u0441\u0442\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0439 \u0437\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0444\u0430\u0439\u043b\u043e\u0432.<br \/>  \u0412\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u0434\u0430\u043b\u0435\u0435.<br \/>  \u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0447\u0438\u0442\u0430\u043b \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u0447\u0442\u043e \u0432\u0441\u0435 \u043f\u043e\u043b\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0441\u0435\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0442\u044b\u0440\u0451\u0445\u0431\u0430\u0439\u0442\u043d\u044b\u043c\u0438 \u0446\u0435\u043b\u044b\u043c\u0438 \u0447\u0438\u0441\u043b\u0430\u043c\u0438 (<b>uint32_t<\/b> \u0432 C++), \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043d\u0435 \u043e\u0433\u043e\u0432\u043e\u0440\u0435\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h5>FileHeader<\/h5>\n<p>  \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u0432\u0441\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f:  <\/p>\n<ul>\n<li>HeaderVersion<\/li>\n<li>CacheType<\/li>\n<li>FormatVersion<\/li>\n<li>ApplicationID<\/li>\n<li>ApplicationVersion<\/li>\n<li>IsMounted<\/li>\n<li>Dummy0<\/li>\n<li>FileSize<\/li>\n<li>ClusterSize<\/li>\n<li>ClusterCount<\/li>\n<li>Checksum<\/li>\n<\/ul>\n<p>  <i>HeaderVersion<\/i> \u2014 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u043d\u043e 0x00000001, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044f \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.<br \/>  <i>CacheType<\/i> \u2014 \u0440\u0430\u0432\u043d\u043e 0x00000001 \u0434\u043b\u044f GCF \u0438 0x00000002 \u0434\u043b\u044f NCF.<br \/>  <i>FormatVersion<\/i> \u2014 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u2014 6. \u041e\u043d\u0430 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0434\u0430\u043b\u0435\u0435.<br \/>  <i>ApplicationID<\/i> \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430 (AppID).<br \/>  <i>ApplicationVersion<\/i> \u2014 \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0421\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0435\u043c \u0437\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.<br \/>  <i>IsMounted<\/i> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 0x00000001, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0412 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0432\u043d\u043e 0x00000000.<br \/>  <i>Dummy0<\/i> \u2014 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0435\u0435 \u043f\u043e\u043b\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 0x00000000.<br \/>  <i>FileSize<\/i> \u2014 \u043e\u0431\u0449\u0438\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0430\u0435\u0442 4\u0413\u0431, \u0442\u043e \u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0440\u0430\u0437\u043d\u0438\u0446\u0443 <i>&lt;\u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430&gt;-ffffffff<\/i>, \u0430 \u0441\u0430\u043c \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 <br \/>  \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0438\u0445 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430.<br \/>  <i>ClusterSize<\/i> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c. \u0414\u043b\u044f GCF \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 0x00002000, \u0430 \u0434\u043b\u044f NCF \u2014 0x00000000.<br \/>  <i>ClusterCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u043c.<br \/>  <i>Checksum<\/i> \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:<\/p>\n<pre><code>UINT32 HeaderChecksum(UINT8 *lpData, int Size) { \tUINT32 Checksum = 0; \tfor (int i=0 ; i&lt;Size ; i++) \t\tChecksum += *(lpData++); \treturn Checksum; }<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0432\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0430 \u0432\u0442\u043e\u0440\u044b\u043c \u2014 \u0435\u0451 \u0440\u0430\u0437\u043c\u0435\u0440, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u044f <i>Checksum<\/i> (\u0442\u043e \u0435\u0441\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0430 4).<\/p>\n<h5>BlockAllocationTableHeader<\/h5>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u043b\u043e\u043a\u043e\u0432 (\u043d\u0435 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432!):  <\/p>\n<ul>\n<li>BlockCount<\/li>\n<li>BlocksUsed<\/li>\n<li>LastUsedBlock<\/li>\n<li>Dummy0<\/li>\n<li>Dummy1<\/li>\n<li>Dummy2<\/li>\n<li>Dummy3<\/li>\n<li>Checksum<\/li>\n<\/ul>\n<p>  <i>BlockCount<\/i> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u043b\u043e\u043a\u043e\u0432 \u0432 \u0444\u0430\u0439\u043b\u0435.<br \/>  <i>BlocksUsed<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0431\u043b\u043e\u043a\u043e\u0432. \u0412\u0441\u0435\u0433\u0434\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u043b\u043e\u043a\u043e\u0432. \u0415\u0441\u043b\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u0435\u0442\u0441\u044f \u043a \u043d\u0435\u043c\u0443 \u2014 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0432\u044b\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430 \u043f\u043e\u0434 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.<br \/>  <i>LastUsedBlock<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430.<br \/>  <i>Dummy0, Dummy1, Dummy2, Dummy2<\/i> \u2014 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 0x00000000.<br \/>  <i>Checksum<\/i> \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u0443\u043c\u043c\u0443 \u0432\u0441\u0435\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u043b\u0435\u0439.<\/p>\n<h5>BlockAllocationTable<\/h5>\n<p>  \u042f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043e\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 <i>BlockAllocationTableEntry<\/i>, \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0440\u0430\u0432\u043d\u043e \u043e\u0431\u0449\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0431\u043b\u043e\u043a\u043e\u0432 (<i>BlockAllocationTableHeader.BlockCount<\/i>):  <\/p>\n<ul>\n<li><b>uint16_t<\/b> Flags<\/li>\n<li><b>uint16_t<\/b> Dummy0<\/li>\n<li>FileDataOffset<\/li>\n<li>FileDataSize<\/li>\n<li>FirstClusterIndex<\/li>\n<li>NextBlockIndex<\/li>\n<li>PreviousBlockIndex<\/li>\n<li>ManifestIndex<\/li>\n<\/ul>\n<p>  <i>Flags<\/i> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u0444\u043b\u0430\u0433\u0438 \u0431\u043b\u043e\u043a\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043c\u0430\u0441\u043a\u0438:  <\/p>\n<ul>\n<li>0x8000 \u2014 \u0431\u043b\u043e\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f;<\/li>\n<li>0x4000 \u2014 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043f\u0438\u044f \u0444\u0430\u0439\u043b\u0430 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442;<\/li>\n<li>0x0004 \u2014 \u0431\u043b\u043e\u043a \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d;<\/li>\n<li>0x0002 \u2014 \u0431\u043b\u043e\u043a \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d \u0438 \u0441\u0436\u0430\u0442;<\/li>\n<li>0x0001 \u2014 \u0431\u043b\u043e\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043a\u0438\u0435 \u00ab\u0441\u044b\u0440\u044b\u0435\u00bb \u0434\u0430\u043d\u043d\u044b\u0435 (RAW).<\/li>\n<\/ul>\n<p>  <i>Dummy0<\/i> \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0435\u0435 \u043f\u043e\u043b\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 0x0000.<br \/>  <i>FileDataOffset<\/i> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0444\u0430\u0439\u043b\u0430, \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043e\u043d \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442.<br \/>  <i>FileDataSize<\/i> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0444\u0430\u0439\u043b\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0431\u043b\u043e\u043a\u0435.<br \/>  <i>FirstClusterIndex<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432.<br \/>  <i>NextBlockIndex<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>BlockAllocationTableHeader. BlockCount<\/i>, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0431\u043b\u043e\u043a \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430.<br \/>  <i>PreviousBlockIndex<\/i> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u0431\u043b\u043e\u043a\u0430 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435. \u0415\u0441\u043b\u0438 \u043e\u043d \u043f\u0435\u0440\u0432\u044b\u0439, \u0442\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>BlockAllocationTableHeader. BlockCount<\/i>.<br \/>  <i>ManifestIndex<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430.<br \/>  \u0418\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 <i>ManifestMap<\/i>.<\/p>\n<h5>FileAllocationTableHeader<\/h5>\n<p>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432:  <\/p>\n<ul>\n<li>ClusterCount<\/li>\n<li>FirstUnusedEntry<\/li>\n<li>IsLongTerminator<\/li>\n<li>Checksum<\/li>\n<\/ul>\n<p>  <i>ClusterCount<\/i> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0432\u043d\u043e\u0435 <i>FileHeader.ClusterCount<\/i>.<br \/>  <i>FirstUnusedEntry<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430.<br \/>  <i>IsLongTerminator<\/i> \u2014 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u044f\u0432\u043b\u044f\u044e\u0449\u0435\u0435\u0441\u044f \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u043a\u043e\u043d\u0446\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u0415\u0441\u043b\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 0x00000000, \u0442\u043e \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0x0000FFFF, \u0438\u043d\u0430\u0447\u0435 \u2014 0xFFFFFFFF.<br \/>  <i>Checksum<\/i> \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u041a\u0430\u043a \u0438 \u0434\u043b\u044f <i>BlockAllocationTableHeader<\/i>, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u0443\u043c\u043c\u043e\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.<\/p>\n<h5>FileAllocationTable<\/h5>\n<p>  \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f <i>FileAllocationTableHeader.ClusterCount<\/i> \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0442\u0438\u043f\u0430 <b>uint32_t<\/b>. \u041a\u0430\u0436\u0434\u0430\u044f \u044f\u0447\u0435\u0439\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0442\u043e\u0440\u0430 (\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 <i>FileAllocationTableHeader<\/i>, \u0435\u0441\u043b\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432 \u0446\u0435\u043f\u043e\u0447\u043a\u0435.<br \/>  \u0418\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u043c\u0435\u0440 \u0441\u0435\u043a\u0442\u043e\u0440\u0430.<\/p>\n<h5>ManifestHeader<\/h5>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:  <\/p>\n<ul>\n<li>HeaderVersion<\/li>\n<li>ApplicationID<\/li>\n<li>ApplicationVersion<\/li>\n<li>NodeCount<\/li>\n<li>FileCount<\/li>\n<li>CompressionBlockSize<\/li>\n<li>BinarySize<\/li>\n<li>NameSize<\/li>\n<li>HashTableKeyCount<\/li>\n<li>NumOfMinimumFootprintFiles<\/li>\n<li>NumOfUserConfigFiles<\/li>\n<li>Bitmask<\/li>\n<li>Fingerprint<\/li>\n<li>Checksum<\/li>\n<\/ul>\n<p>  <i>HeaderVersion<\/i> \u2014 \u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 0x00000004.<br \/>  <i>ApplicationID<\/i> \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430. \u0420\u0430\u0432\u0435\u043d <i>FileHeader.ApplicationID<\/i>.<br \/>  <i>ApplicationVersion<\/i> \u2014 \u0432\u0435\u0440\u0441\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u0420\u0430\u0432\u0435\u043d <i>FileHeader.ApplicationVersion<\/i>.<br \/>  <i>NodeCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430.<br \/>  <i>FileCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 (\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435\u0441\u044f \u0432 \u043a\u0435\u0448\u0435).<br \/>  <i>CompressionBlockSize<\/i> \u2014 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0436\u0430\u0442\u043e\u0433\u043e \u0431\u043b\u043e\u043a\u0430 (\u0435\u0433\u043e \u043d\u0435\u0441\u0436\u0430\u0442\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445).<br \/>  <i>BinarySize<\/i> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0434\u0430\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443).<br \/>  <i>NameSize<\/i> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0431\u043b\u043e\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0438\u043c\u0435\u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (\u0432 \u0431\u0430\u0439\u0442\u0430\u0445).<br \/>  <i>HashTableKeyCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0445\u0435\u0448\u0435\u0439.<br \/>  <i>NumOfMinimumFootprintFiles<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a).<br \/>  <i>NumOfUserConfigFiles<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435 \u043e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0433\u0440\u044b \u0438 \u0438\u043c\u0435\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u0439 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442.<br \/>  <i>Bitmask<\/i> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u043a\u0438. \u0412 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 0x00000000.<br \/>  <i>Fingerprint<\/i> \u2014 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430.<br \/>  <i>Checksum<\/i> \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430. \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 Adler32. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d \u043f\u043e\u0441\u043b\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432.<\/p>\n<h5>Manifest<\/h5>\n<p>  \u0414\u0435\u0440\u0435\u0432\u043e, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u043a\u0435\u0448\u0435. \u0420\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0440\u0430\u0432\u0435\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e <i>ManifestHeader.NodeCount<\/i>. \u0412\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438:  <\/p>\n<ul>\n<li>NameOffset<\/li>\n<li>CountOrSize<\/li>\n<li>FileId<\/li>\n<li>Attributes<\/li>\n<li>ParentIndex<\/li>\n<li>NextIndex<\/li>\n<li>ChildIndex<\/li>\n<\/ul>\n<p>  <i>NameOffset<\/i> \u2014 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u043d\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c \u0431\u043b\u043e\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>  <i>CountOrSize<\/i> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0414\u043b\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0440\u0430\u0432\u0435\u043d \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0430 \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u2014 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0444\u0430\u0439\u043b\u0430 (\u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u0438 \u0444\u0430\u0439\u043b\u0430, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u043c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u043c).<br \/>  <i>FileId<\/i> \u2014 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440 \u0444\u0430\u0439\u043b\u0430. \u0421\u043b\u0443\u0436\u0438\u0442 \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c.<br \/>  <i>Attributes<\/i> \u2014 \u0431\u0438\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u0438\u0437 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u0445):<\/p>\n<ul>\n<li>0x00004000 \u2014 \u0443\u0437\u0435\u043b \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u0430\u0439\u043b\u043e\u043c;<\/li>\n<li>0x00000100 \u2014 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b;<\/li>\n<li>0x00000001 \u2014 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b. \u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043f\u0438\u044f \u043d\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f.<\/li>\n<\/ul>\n<p>  <i>ParentIndex<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0414\u043b\u044f \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0432\u0435\u043d 0xFFFFFFFF.<br \/>  <i>NextIndex<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u0434\u0435\u0440\u0435\u0432\u0430.<br \/>  <i>ChildIndex<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0434\u043e\u0447\u0435\u0440\u043d\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<br \/>  \u0415\u0441\u043b\u0438 \u0434\u043b\u044f <i>NextIndex<\/i> \u0438 <i>ChildIndex<\/i> \u043d\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u0442\u043e \u043e\u043d\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0x00000000.<br \/>  \u0414\u0435\u0440\u0435\u0432\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439.<br \/>  \u0418\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u0435\u0440\u0435\u0432\u0430, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u043c\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c)<\/p>\n<h5>FileNames<\/h5>\n<p>  \u0411\u043b\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u0442\u0438\u043f\u0430 <b>char<\/b>, \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c <i>ManifestHeader.NameSize<\/i> \u0431\u0430\u0439\u0442. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9D%D1%83%D0%BB%D1%8C-%D1%82%D0%B5%D1%80%D0%BC%D0%B8%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B0\">\u043d\u0443\u043b\u044c-\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438<\/a>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0438\u043c\u0435\u043d\u0430\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c\u044b\u0445 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e, \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u2014 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0438\u043c\u0451\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0437\u0430\u0434\u0430\u0451\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c <i>Manifest[].NameOffset<\/i><\/p>\n<h5>HashTableKeys<\/h5>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u043c\u0451\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u0434\u043b\u044f <i>HashTableIndices<\/i>, \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u043c \u043e\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D0%B5%D1%88_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%94%D0%B6%D0%B5%D0%BD%D0%BA%D0%B8%D0%BD%D1%81%D0%B0\">\u0445\u0435\u0448-\u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0414\u0436\u0435\u043d\u043a\u0438\u043d\u0441\u0430<\/a> <a href=\"http:\/\/www.burtleburtle.net\/bob\/c\/lookup2.c\">lookup2<\/a> \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0445 \u043a \u043d\u0438\u0436\u043d\u0435\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043e \u043f\u0440\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.<\/p>\n<h5>HashTableIndices<\/h5>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0441\u044b\u043b\u0430\u044e\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 <i>ManifestHeader.NodeCount<\/i>.<\/p>\n<h5>MinimumFootprints<\/h5>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 <i>Manifest<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<h5>UserConfigs<\/h5>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 <i>Manifest<\/i>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0445\u0441\u044f \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<h5>ManifestMapHeader<\/h5>\n<p>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043a\u0430\u0440\u0442\u044b \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432:  <\/p>\n<ul>\n<li>HeaderVersion<\/li>\n<li>Dummy0<\/li>\n<\/ul>\n<p>  <i>HeaderVersion<\/i> \u2014 \u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u0420\u0430\u0432\u043d\u0430 0x00000001.<br \/>  <i>Dummy0<\/i> \u2014 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 0x00000000.<\/p>\n<h5>ManifestMap<\/h5>\n<p>  \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0441\u044b\u043b\u043e\u043a \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u043b\u043e\u043a (\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 <i>BlockAllocationTable<\/i>) \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0418\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u043e\u043c\u0435\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u043e\u0432. \u0414\u043b\u044f \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0445 \u0432 \u043a\u0435\u0448\u0435 (\u0438\u043c\u0435\u044e\u0449\u0438\u0445 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043b\u0438 \u0434\u043b\u044f NCF), \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u0440\u0430\u0432\u043d\u043e\u0435 <i>BlockAllocationTableHeader.BlockCount<\/i>.<\/p>\n<h5>ChecksumDataContainer<\/h5>\n<p>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0445\u0440\u0430\u043d\u044f\u0449\u0435\u0433\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b:  <\/p>\n<ul>\n<li>HeaderVersion<\/li>\n<li>ChecksumSize<\/li>\n<\/ul>\n<p>  <i>HeaderVersion<\/i> \u2014 \u0432\u0435\u0440\u0441\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u0420\u0430\u0432\u043d\u0430 0x00000001.<br \/>  <i>ChecksumSize<\/i> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430. \u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u043f\u043e <i>LatestApplicationVersion<\/i> \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<h5>FileIdChecksumTableHeader<\/h5>\n<p>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c:  <\/p>\n<ul>\n<li>FormatCode<\/li>\n<li>Dummy0<\/li>\n<li>FileIdCount<\/li>\n<li>ChecksumCount<\/li>\n<\/ul>\n<p>  <i>FormatCode<\/i> \u2014 \u043d\u0435\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430. \u0420\u0430\u0432\u043d\u0430 0x14893721.<br \/>  <i>Dummy0<\/i> \u2014 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0449\u0435\u0435 \u043f\u043e\u043b\u0435. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0x00000001.<br \/>  <i>FileIdCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <i>\u00ab\u044d\u043b\u0435\u043c\u0435\u043d\u0442-\u043f\u0435\u0440\u044b\u0439_\u0445\u0435\u0448\u00bb<\/i>.<br \/>  <i>ChecksumCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c.<\/p>\n<h5>FileIdChecksums<\/h5>\n<p>  \u0422\u0430\u0431\u043b\u0438\u0446\u0430, \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u0444\u0430\u0439\u043b\u044b \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c:  <\/p>\n<ul>\n<li>ChecksumCount<\/li>\n<li>FirstChecksumIndex<\/li>\n<\/ul>\n<p>  <i>ChecksumCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.<br \/>  <i>FirstChecksumIndex<\/i> \u2014 \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0432 \u0441\u043f\u0438\u0441\u043a\u0435.<br \/>  \u0418\u043d\u0434\u0435\u043a\u0441\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>Manifest[].FileId<\/i>.<\/p>\n<h5>Checksums<\/h5>\n<p>  \u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0434\u0441\u043f\u0438\u0441\u043a\u0438, \u043d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>FileIdChecksums[].FirstChecksumIndex<\/i>.<br \/>  \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443:<\/p>\n<pre><code>UINT32 Checksum(UINT8 *lpData, UINT32 uiSize) { \treturn (adler32(0, lpData, uiSize) ^ crc32(0, lpData, uiSize)); }<\/code><\/pre>\n<h5>ChecksumSignature<\/h5>\n<p>  \u0421\u0438\u0433\u043d\u0430\u0442\u0443\u0440\u0430 \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0445\u0435\u0448\u0430 \u0434\u043b\u044f \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u043f\u043e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0443 SHA-1 \u0438 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c <a href=\"https:\/\/en.wikipedia.org\/wiki\/PKCS_1\">RSASSA-PKCS1-v1_5<\/a>.<\/p>\n<h5>LatestApplicationVersion<\/h5>\n<p>  \u0414\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0435\u0440\u0441\u0438\u044e \u0431\u043b\u043e\u043a\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c. \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0434\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e.<\/p>\n<h5>DataHeader<\/h5>\n<p>  \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u0435\u0448\u0435:  <\/p>\n<ul>\n<li>ClusterCount<\/li>\n<li>ClusterSize<\/li>\n<li>FirstClusterOffset<\/li>\n<li>ClustersUsed<\/li>\n<li>Checksum<\/li>\n<\/ul>\n<p>  <i>ClusterCount<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u044e <i>FileHeader.ClusterCount<\/i>.<br \/>  <i>ClusterSize<\/i> \u2014 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u0435\u043a\u0442\u043e\u0440\u0430. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0440\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u044e <i>FileHeader.ClusterSize<\/i>.<br \/>  <i>FirstClusterOffset<\/i> \u2014 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u0444\u0430\u0439\u043b\u0430.<br \/>  <i>ClustersUsed<\/i> \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432. <br \/>  <i>Checksum<\/i> \u2014 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u0430\u044f \u0441\u0443\u043c\u043c\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430. \u0420\u0430\u0432\u043d\u0430 \u0441\u0443\u043c\u043c\u0435 \u043f\u0440\u0435\u0434\u0448\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043f\u043e\u043b\u0435\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u043e\u0433\u043b\u043e \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u0441\u044f. \u0412 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432\u0448\u0438\u0435\u0441\u044f \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043b\u0438\u0441\u044c \u0432 \u043a\u043e\u043d\u0435\u0446 \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0441\u0442\u0430 \u043f\u043e\u0434 \u0431\u0443\u0434\u0443\u0449\u0438\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b<\/h4>\n<p>  \u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0430\u043c\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u2014 \u0441\u0430\u043c\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u043a\u043e\u0434\u0430, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0433\u043e \u0441 \u044d\u0442\u0438\u043c\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u043c\u0438 \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c\u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u043d\u0430 \u043c\u043e\u0451\u043c <a href=\"https:\/\/github.com\/andreili\/steam_libs\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a>.<\/p>\n<h5>\u0420\u0430\u0441\u0447\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u0430<\/h5>\n<p>  \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 \u0440\u0430\u0432\u0435\u043d \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044e \u043f\u043e\u043b\u044f <i>Manifest[].CountOrSize<\/i>. \u041d\u043e \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0431\u043e\u043b\u0435\u0435 4\u0413\u0431 \u0442\u0430\u043a\u043e\u0439 \u043f\u0443\u0442\u044c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b VALVE \u043e\u0431\u043e\u0448\u043b\u0438 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043f\u0443\u0442\u0451\u043c: \u0434\u043b\u044f \u0444\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0431\u043e\u043b\u0435\u0435 2\u0413\u0431 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432 \u00ab1\u00bb \u0438 \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d (\u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e) \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0436\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u043f\u043e\u043b\u0435\u0439, \u043f\u043e\u043b\u0443\u0447\u0430\u044f \u0441\u0432\u043e\u0435\u043e\u0431\u0440\u0430\u0437\u043d\u0443\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443. \u0421\u0443\u043c\u043c\u0438\u0440\u0443\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 <i>Manifest[].CountOrSize<\/i> \u0438\u0437 \u0434\u0430\u043d\u043d\u043e\u0439 \u0446\u0435\u043f\u043e\u0447\u043a\u0438 \u043c\u044b \u0438 \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0435\u043c \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u043e\u0434 \u043f\u043e\u0434\u0441\u0447\u0451\u0442\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0444\u0430\u0439\u043b\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code>UINT64 CGCFFile::GetFileSize(UINT32 Item) { \tUINT64 res = lpManifest[Item].CountOrSize & 0x7FFFFFFF; \tif ((lpManifest[Item].CountOrSize & 0x80000000) != 0) \t{ \t\tfor (UINT32 i=0 ; i&lt;pManifestHeader-&gt;NodeCount ; i++) \t\t{ \t\t\tManifestNode *MN = &lpManifest[Item]; \t\t\tif (((MN-&gt;Attributes & 0x00004000) != 0) && (MN-&gt;ParentIndex == 0xFFFFFFFF) && \t\t\t\t(MN-&gt;NextIndex == 0xFFFFFFFF) && (MN-&gt;ChildIndex == 0xFFFFFFFF) && (MN-&gt;FileId == lpManifest[Item].FileId)) \t\t\t{ \t\t\t\tres += MN-&gt;CountOrSize &lt;&lt; 31; \t\t\t\tbreak; \t\t\t} \t\t} \t} \treturn res; }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0417\u0434\u0435\u0441\u044c \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u00ab\u0444\u0438\u043d\u0442 \u0443\u0448\u0430\u043c\u0438\u00bb, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u0432, \u0447\u0442\u043e \u0444\u0430\u0439\u043b\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0431\u043e\u043b\u0435\u0435 4\u0413\u0431 \u0432\u0441\u0451-\u0442\u0430\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u043a\u0435\u0448\u0430\u2026<\/p>\n<h5>\u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438<\/h5>\n<p>  \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u043c \u043d\u0430\u0434\u043e \u043d\u0430\u0439\u0442\u0438 \u0444\u0430\u0439\u043b \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u00abhl2\/maps\/background_01.bsp\u00bb. \u0412\u0441\u0435 \u0438\u043c\u0435\u043d\u0430 \u0443 \u043d\u0430\u0441 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0432 \u0434\u0440\u0435\u0432\u043e\u0432\u0438\u0434\u043d\u043e\u043c \u0432\u0438\u0434\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0443\u0442\u044c \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0435\u043c (\u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 &quot;\/&quot;). \u0417\u0430\u0442\u0435\u043c \u043c\u044b \u0438\u0449\u0435\u043c \u0443 \u043f\u043e\u0442\u043e\u043c\u043a\u043e\u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u00abhl2\u00bb. \u0423 \u043d\u0435\u0433\u043e \u2014 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u00abmaps\u00bb, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0442\u0435\u043c \u2014 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u00abbackground_01.bsp\u00bb. \u0414\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439 \u2014 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a, \u0434\u0430 \u0435\u0449\u0451 \u0438 \u043e\u0431\u0445\u043e\u0434 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443. \u0421\u043f\u043b\u043e\u0448\u043d\u044b\u0435 \u0437\u0430\u0442\u0440\u0430\u0442\u044b.<br \/>  \u0414\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u044b \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445 \u0435\u0441\u0442\u044c \u0445\u0435\u0448-\u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u0438\u0441\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0445\u0435\u0448\u0430<\/b><\/p>\n<div class=\"spoiler_text\"><b>C++<\/b>  <\/p>\n<pre><code>UINT32 CGCFFile::GetItem(char *Item) { \tint DelimiterPos = -1; \tfor (UINT32 i=0 ; i&lt;strlen(Item) ; i++) \t\tif (Item[i] == '\\\\') \t\t\tDelimiterPos = i; \tchar *FileName = &Item[++DelimiterPos]; \tUINT32 Hash = jenkinsLookupHash2((UINT8*)FileName, strlen(FileName), 1), \t\tHashIdx = Hash % pManifestHeader-&gt;HashTableKeyCount, \t\tHashFileIdx = lpHashTableKeys[HashIdx]; \tif (HashFileIdx == CACHE_INVALID_ITEM) \t\tif (strcmp(LowerCase(Item), Item) != 0) \t\t{ \t\t\tHash = jenkinsLookupHash2((UINT8*)LowerCase(Item), strlen(FileName), 1); \t\t\tHashIdx = Hash % pManifestHeader-&gt;HashTableKeyCount; \t\t\tHashFileIdx = lpHashTableKeys[HashIdx]; \t\t} \tif (HashFileIdx == CACHE_INVALID_ITEM) \t\treturn CACHE_INVALID_ITEM;  \tHashFileIdx -= pManifestHeader-&gt;HashTableKeyCount; \twhile (true) \t{ \t\tUINT32 Value = this-&gt;lpHashTableIndices[HashFileIdx]; \t\tUINT32 FileID = Value & 0x7FFFFFFF; \t\tif (strcmp(GetItemPath(FileID), Item) == 0) \t\t\treturn FileID; \t\tif ((Value & 0x80000000) == 0x80000000) \t\t\tbreak; \t\tHashFileIdx++; \t}  \treturn CACHE_INVALID_ITEM; }<\/code><\/pre>\n<p>  <b>Delphi<\/b>  <\/p>\n<pre><code class=\"delphi\">function TGCFFile.GetItemByPath(Path: string): integer; var   end_block: boolean;   Hash, HashIdx, HashValue: ulong;   FileID, HashFileIdx: integer;   PathEx: AnsiString; begin   result:=-1; {$IFDEF UNICODE}   PathEx:=Wide2Ansi(ExtractFileName(Path)); {$ELSE}   PathEx:=ExtractFileName(Path); {$ENDIF}   Hash:=jenkinsLookupHash2(@PathEx[1], Length(PathEx), 1);   HashIdx:=Hash mod fManifestHeader.HashTableKeyCount;   HashFileIdx:=lpHashTableKeys[HashIdx];   if HashFileIdx=-1 then   begin     if (LowerCase(Path)&lt;&gt;Path) then     begin {$IFDEF UNICODE}       Hash:=jenkinsLookupHash2(@LowerCaseAnsi(PathEx)[1], Length(PathEx), 1); {$ELSE}       Hash:=jenkinsLookupHash2(@LowerCase(PathEx)[1], Length(PathEx), 1); {$ENDIF}       HashIdx:=Hash mod fManifestHeader.HashTableKeyCount;       HashFileIdx:=lpHashTableKeys[HashIdx];       if HashFileIdx=-1 then         Exit;     end;   end;   dec(HashFileIdx, fManifestHeader.HashTableKeyCount);   repeat     HashValue:=lpHashTableIndices[HashFileIdx];     FileID:=HashValue and $7FFFFFFF;     end_block:= (HashValue and $80000000 = $80000000);     if CompareStr(ItemPath[FileID], Path)=0 then     begin       result:=FileID;       Exit;     end;     inc(HashFileIdx);   until end_block;    if (result=-1) and (LowerCase(Path)&lt;&gt;Path) then     result:=GetItemByPath(LowerCase(Path)); end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043a\u043e\u0434\u0430, \u0438\u0437 \u0432\u0441\u0435\u0433\u043e \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0443 \u043c\u044b \u0431\u0435\u0440\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0433\u043e \u0438\u043c\u044f \u0438 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0445\u0435\u0448 \u0434\u043b\u044f \u043d\u0435\u0433\u043e. \u0411\u0435\u0440\u0451\u043c \u043e\u0441\u0442\u0430\u0442\u043e\u043a \u043e\u0442 \u0446\u0435\u043b\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043d\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>ManifestHeader.HashTableKeyCount<\/i> \u2014 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <i>HashTableKeys<\/i>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0439 \u043b\u0438\u0431\u043e <b>0xffffffff<\/b> (\u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u0442\u0430\u043a\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430) \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <i>X+ManifestHeader.HashTableKeyCount<\/i>. \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c <i>X<\/i>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u043d\u043e\u043c\u0435\u0440\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 <i>HashTableIndices<\/i>, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442 \u043d\u0430 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0438\u043c\u044f \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c. \u0415\u0441\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u043b\u043e \u2014 \u0431\u0435\u0440\u0451\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u043d\u043e\u043c\u0435\u0440\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0440\u0430\u0432\u0435\u043d \u00ab0\u00bb.<br \/>  <i>\u041f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u043f\u0443\u0442\u0430\u043d\u043d\u043e, \u043d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a \u043e\u043d\u043e \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u2026 \u0412\u0438\u043d\u0438\u0442\u0435 \u0432 \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0439 \u043f\u0443\u0442\u0430\u043d\u0438\u0446\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 VALVE.<\/i><br \/>  \u0414\u0430\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u044f\u043c\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u2014 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0433\u0440\u044b \u0441 \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439-\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c Steam.dll, \u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0449\u0451 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440.<\/p>\n<h5>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u043d\u043e\u0433\u043e \u043f\u0443\u0442\u0438 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443<\/h5>\n<p>  \u0414\u0430\u043d\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c\u0443 \u2014 \u043f\u043e \u043d\u043e\u043c\u0435\u0440\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0439\u0442\u0438\u0441\u044c \u043f\u043e \u0434\u0435\u0440\u0435\u0432\u0443 \u0434\u043e \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0443<\/b><\/p>\n<div class=\"spoiler_text\"><b>C++<\/b>  <\/p>\n<pre><code>char *CGCFFile::GetItemPath(UINT32 Item) { \tsize_t len = strlen(&lpNames[lpManifest[Item].NameOffset]); \tUINT32 Idx = lpManifest[Item].ParentIndex; \twhile (Idx != CACHE_INVALID_ITEM) \t{ \t\tlen += strlen(&lpNames[lpManifest[Idx].NameOffset]) + 1; \t\tIdx= lpManifest[Idx].ParentIndex; \t} \tlen--;  \tchar *res = new char[len+1]; \tmemset(res, 0, len+1); \tsize_t l = strlen(&lpNames[lpManifest[Item].NameOffset]); \tmemcpy(&res[len-l], &lpNames[lpManifest[Item].NameOffset], l); \tlen -= strlen(&lpNames[lpManifest[Item].NameOffset]); \tres[--len] = '\\\\'; \tItem = lpManifest[Item].ParentIndex; \twhile ((Item != CACHE_INVALID_ITEM) && (Item != 0)) \t{ \t\tl = strlen(&lpNames[lpManifest[Item].NameOffset]); \t\tmemcpy(&res[len-l], &lpNames[lpManifest[Item].NameOffset], l); \t\tlen -= strlen(&lpNames[lpManifest[Item].NameOffset]); \t\tres[--len] = '\\\\'; \t\tItem = lpManifest[Item].ParentIndex; \t} \treturn res; }<\/code><\/pre>\n<p>  <b>Delphi<\/b>  <\/p>\n<pre><code class=\"delphi\">function TGCFFile.GetItemPath(Item: integer): string; var   res: AnsiString; begin   res:=pAnsiChar(@fNameTable[lpManifestNodes[Item].NameOffset+1]);   Item:=lpManifestNodes[Item].ParentIndex;   while (Item&gt;-1) do   begin     res:=pAnsiChar(@fNameTable[lpManifestNodes[Item].NameOffset+1])+'\\'+res;     Item:=lpManifestNodes[Item].ParentIndex;   end;   Delete(res, 1, 1); {$IFDEF UNICODE}   result:=Ansi2Wide(res); {$ELSE}   result:=res; {$ENDIF} end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <i>\u041a\u043e\u0434 \u0434\u043b\u044f Delphi \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0434\u043b\u044f C++ \u044f \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043a\u043b\u0430\u0441\u0441 std::string \u2014 \u043d\u0435 \u0437\u043d\u0430\u043b \u043f\u0440\u043e \u043d\u0435\u0433\u043e \u0442\u043e\u0433\u0434\u0430. \u0421 \u043d\u0438\u043c \u043a\u043e\u0434 \u0432\u044b\u0448\u0435\u043b \u0431\u044b \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u043e\u0440\u043e\u0447\u0435&#8230;<\/i><\/p>\n<h5>\u041f\u043e\u0442\u043e\u043a\u0438<\/h5>\n<p>  \u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0434\u043b\u044f \u0430\u0440\u0445\u0438\u0432\u043e-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0444\u0430\u0439\u043b\u043e\u0432 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0432 \u0441\u0435\u0431\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0444\u0430\u0439\u043b\u044b) \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u00ab\u043f\u043e\u0442\u043e\u043a-\u0432-\u043f\u043e\u0442\u043e\u043a\u0435\u00bb, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432 \u0430\u0440\u0445\u0438\u0432\u0435, \u043d\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044f \u0435\u0433\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u043a\u0435\u0448\u0435 <i>half-life.gcf<\/i> \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u0431\u044b\u043b \u0444\u0430\u0439\u043b <i>pak0.pak<\/i>, \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u0439\u0441\u044f \u0430\u0440\u0445\u0438\u0432\u043e\u043c. \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u043b \u0444\u0430\u0439\u043b <i>half-life.gcf<\/i>, \u0432 \u043d\u0451\u043c \u2014 <i>pak0.pak<\/i>. \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0447\u0438\u0442\u0430\u043b \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u2014 \u0431\u0435\u0437 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0434\u0430\u0436\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u0432\u0435\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043c\u043d\u043e\u044e \u0436\u0435 \u043e\u0431\u0451\u0440\u0442\u043a\u0438 \u043d\u0430\u0434 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u0442\u043e\u043a\u0430\u043c\u0438 (\u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u043c\u0438, \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 WindowsAPI).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0432 \u043a\u0435\u0448\u0435<\/b><\/p>\n<div class=\"spoiler_text\"><b>C++<\/b>  <\/p>\n<pre><code>CStream *CGCFFile::OpenFile(char* FileName, UINT8 Mode) { \tUINT32 Item = GetItem(FileName); \tif (Item == CACHE_INVALID_ITEM) \t\treturn NULL; \tif ((lpManifest[Item].Attributes & CACHE_FLAG_FILE) != CACHE_FLAG_FILE) \t\treturn NULL; \treturn OpenFile(Item, Mode); }  CStream *CGCFFile::OpenFile(UINT32 Item, UINT8 Mode) { \tStreamData *Data = new StreamData(); \tmemset(Data, 0, sizeof(StreamData)); \tData-&gt;Handle = (handle_t)Item; \tData-&gt;Package = this; \tData-&gt;Size = this-&gt;GetItemSize(Item).Size;  \tif (IsNCF) \t\tData-&gt;FileStream = (CStream*)new CStream(MakeStr(CommonPath, GetItemPath(Item)), Mode==CACHE_OPEN_WRITE); \telse \t\tBuildClustersTable(Item, &Data-&gt;Sectors);  \treturn new CStream(pStreamMethods, Data); }<\/code><\/pre>\n<p>  <b>Delphi<\/b>  <\/p>\n<pre><code class=\"delphi\">function TGCFFile.OpenFile(FileName: string; Access: byte): TStream; var   Item: integer; begin   result:=nil;   Item:=ItemByPath[FileName];   if (Item=-1) then     Exit;   if ((lpManifestNodes[Item].Attributes and HL_GCF_FLAG_FILE&lt;&gt;HL_GCF_FLAG_FILE) or    (ItemSize[Item].Size=0)) then     Exit;    result:=OpenFile(Item, Access); end;  function TGCFFile.OpenFile(Item: integer; Access: byte): TStream; var   res: TStream; begin   res:=TStream.CreateStreamOnStream(@StreamMethods);   res.Data.fHandle:=ulong(Item);   res.Data.Package:=self;   res.Data.fSize:=(res.Data.Package as TGCFFile).ItemSize[Item].Size;   res.Data.fPosition:=0;    if (IsNCF) then   begin     CommonPath:=IncludeTrailingPathDelimiter(CommonPath);     case Access of       ACCES_READ:         begin           res.Data.FileStream:=TStream.CreateReadFileStream(CommonPath+ItemPath[Item]);           res.Methods.fSetSiz:=StreamOnStream_SetSizeNULL;           res.Methods.fWrite:=StreamOnStream_WriteNULL;         end;       ACCES_WRITE:         begin           ForceDirectories(ExtractFilePath(CommonPath+ItemPath[Item]));           res.Data.FileStream:=TStream.CreateWriteFileStream(CommonPath+ItemPath[Item]);         end;       ACCES_READWRITE: res.Data.FileStream:=TStream.CreateReadWriteFileStream(CommonPath+ItemPath[Item]);     end;     res.Data.FileStream.Seek(0, spBegin);   end     else GCF_BuildClustersTable(Item, @res.Data.SectorsTable);    result:=res; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u2014 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0438 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043d\u0438\u0445 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0438\u0445 \u0442\u0435\u043b\u043e\u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0439.<\/p>\n<h5>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b<\/h5>\n<p>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043f\u043e\u0442\u043e\u043a\u0438, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u2014 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0442\u0430\u044e \u0444\u0430\u0439\u043b \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 (\u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c \u2014 32\u041a\u0431), \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e \u0434\u043b\u044f \u043d\u0438\u0445 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b \u0438 \u0441\u0432\u0435\u0440\u044f\u044e \u0438\u0445 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439 \u0435\u0433\u043e \u041a\u0421<\/b><\/p>\n<div class=\"spoiler_text\"><b>C++<\/b>  <\/p>\n<pre><code>UINT64 CGCFFile::ExtractFile(UINT32 Item, char *Dest, bool IsValidation) { \tCStream *fileIn = this-&gt;OpenFile(Item, CACHE_OPEN_READ), \t\t*fileOut; \tif (fileIn == NULL) \t\treturn 0; \tif (!IsValidation) \t{ \t\tif (DirectoryExists(Dest)) \t\t\tDest = MakeStr(IncludeTrailingPathDelimiter(Dest), GetItemName(Item)); \t\tfileOut = new CStream(Dest, true); \t\tif (fileOut-&gt;GetHandle() == INVALID_HANDLE_VALUE) \t\t\treturn 0; \t\tfileOut-&gt;SetSize(GetItemSize(Item).Size); \t}  \tUINT8 buf[CACHE_CHECKSUM_LENGTH]; \tUINT32 CheckSize = CACHE_CHECKSUM_LENGTH; \tUINT64 res = 0; \twhile ((fileIn-&gt;Position()&lt;fileIn-&gt;GetSize()) && (CheckSize == CACHE_CHECKSUM_LENGTH)) \t{ \t\tif (Stop) \t\t\tbreak; \t\tUINT32 CheckIdx = lpFileIDChecksum[lpManifest[Item].FileId].FirstChecksumIndex + ((fileIn-&gt;Position() & 0xffffffffffff8000) &gt;&gt; 15); \t\tCheckSize = (UINT32)fileIn-&gt;Read(buf, CheckSize);  \t\tUINT32 CheckFile = Checksum(buf, CheckSize), \t\t\tCheckFS = lpChecksum[CheckIdx]; \t\tif (CheckFile != CheckFS) \t\t{ \t\t\tbreak; \t\t} \t\telse if (!IsValidation) \t\t{ \t\t\tfileOut-&gt;Write(buf, CheckSize); \t\t}  \t\tres += CheckSize; \t} \tdelete fileIn; \tif (!IsValidation) \t\tdelete fileOut; \treturn res; }<\/code><\/pre>\n<p>  <b>Delphi<\/b>  <\/p>\n<pre><code class=\"delphi\">function TGCFFile.ExtractFile(Item: integer; Dest: string; IsValidation: boolean = false): int64; var   StreamF, StreamP: TStream;   CheckSize, CheckFile, CheckFS, CheckIdx: uint32_t;   buf: array of byte;   Size: int64; begin   result:=0;   StreamP:=OpenFile(Item, ACCES_READ);   if (StreamP=nil) then     Exit;    Size:=ItemSize[Item].Size;   if Assigned(OnProgress) then     OnProgress(ItemPath[Item], 0, Size, Data);   if Assigned(OnProgressObj) then     OnProgressObj(ItemPath[Item], 0, Size, Data);    StreamF:=nil;   if (not IsValidation) then   begin     if DirectoryExists(Dest) then       Dest:=IncludeTrailingPathDelimiter(Dest)+ExtractFileName(ItemName[Item]);     StreamF:=TStream.CreateWriteFileStream(Dest);     StreamF.Size:=ItemSize[Item].Size;     if StreamF.Handle=INVALID_HANDLE_VALUE then     begin       StreamF.Free;       Exit;     end;   end;    SetLength(buf, HL_GCF_CHECKSUM_LENGTH);   CheckSize:=HL_GCF_CHECKSUM_LENGTH;   while ((StreamP.Position&lt;StreamP.Size) and (CheckSize=HL_GCF_CHECKSUM_LENGTH)) do   begin     CheckIdx:=lpFileIdChecksumTableEntries[lpManifestNodes[Item].FileId].FirstChecksumIndex+      ((StreamP.Position and $ffffffffffff8000) shr 15);     CheckSize:=StreamP.Read(buf[0], HL_GCF_CHECKSUM_LENGTH);      CheckFile:=Checksum(@buf[0], CheckSize);     CheckFS:=lpChecksumEntries[CheckIdx];     if (CheckFile&lt;&gt;CheckFS) and (not IgnoreCheckError) then     begin       if Assigned(OnError) then         OnError(GetItemPath(Item), ERROR_CHECKSUM, Data);       if Assigned(OnErrorObj) then         OnErrorObj(GetItemPath(Item), ERROR_CHECKSUM, Data);       break;     end       else if (not IsValidation) then         StreamF.Write(buf[0], CheckSize);     inc(result, CheckSize);      if Assigned(OnProgress) then       OnProgress('', result, Size, Data);     if Assigned(OnProgressObj) then       OnProgressObj('', result, Size, Data);     if Stop then       break;   end;   SetLength(buf, 0);   StreamP.Free;   if (not IsValidation) then     StreamF.Free; end;<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  \u0412 \u043a\u043e\u0434\u0435 \u0434\u043b\u044f Delphi \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u2014 \u0432\u044b\u0437\u043e\u0432 callback-\u0444\u0443\u043d\u043a\u0446\u0438\u0439 <i>OnProgress, OnProgressObj<\/i>.<\/p>\n<h5>\u0414\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u043e\u0432<\/h5>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u0433\u0440\u044b \u043d\u0435\u0437\u0430\u0434\u043e\u043b\u0433\u043e \u0434\u043e \u0432\u044b\u0445\u043e\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435, \u0442\u043e \u0438\u0445 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u043b\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043e. \u0421 \u0432\u044b\u0445\u043e\u0434\u043e\u043c \u0438\u0433\u0440\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043a\u043b\u044e\u0447 \u0434\u043b\u044f \u0434\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0438 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u043c\u0430\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043a\u043e\u0434\u043e\u043c:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0435\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430<\/b><\/p>\n<div class=\"spoiler_text\"><b>C++<\/b>  <\/p>\n<pre><code>UCHAR IV[16] = {0}; void DecryptFileChunk(char *buf, UINT32 size, char *key) { \tAES_KEY aes_key; \tAES_set_decrypt_key((UCHAR*)key, 128, &aes_key); \tAES_cbc_encrypt((UCHAR*)buf, (UCHAR*)buf, size, &aes_key, IV, false); }  UINT64 CGCFFile::DecryptFile(UINT32 Item, char *key) { \tUINT64 res = 0; \tCStream *str = OpenFile(Item, CACHE_OPEN_READWRITE); \tif (str == NULL) \t\treturn 0; \tchar buf[CACHE_CHECKSUM_LENGTH], \t\tdec[CACHE_CHECKSUM_LENGTH]; \tUINT32 CheckSize = CACHE_CHECKSUM_LENGTH; \tINT32 CompSize, \t\tUncompSize, \t\tsz; \twhile ((str-&gt;Position() &lt; str-&gt;GetSize()) && (CheckSize == CACHE_CHECKSUM_LENGTH)) \t{ \t\tUINT32 CheckIdx = lpFileIDChecksum[lpManifest[Item].FileId].FirstChecksumIndex + \t\t\t((str-&gt;Position() & 0xffffffffffff8000) &gt;&gt; 15); \t\tINT32 CheckSize = (INT32)str-&gt;Read(buf, 8);  \t\tmemcpy(&CompSize, &buf[0], 4); \t\tmemcpy(&UncompSize, &buf[4], 4); \t\tif (((UINT32)UncompSize &gt; pManifestHeader-&gt;CompressionBlockSize) || (CompSize &gt; UncompSize) || (UncompSize &lt; -1) || (CompSize &lt; -1)) \t\t{ \t\t\t\/\/ Chunk is not compressed \t\t\tCheckSize = (UINT32)str-&gt;Read(&buf[8], CACHE_CHECKSUM_LENGTH-8); \t\t\tDecryptFileChunk(&buf[0], CheckSize, key); \t\t} \t\telse if (((UINT32)UncompSize &lt;= pManifestHeader-&gt;CompressionBlockSize) && (CompSize &lt;= UncompSize) && (UncompSize &gt; -1) || (CompSize &gt; -1)) \t\t{ \t\t\t\/\/ Chunk is compressed \t\t\tCheckSize = (UINT32)str-&gt;Read(&buf[8], UncompSize-8); \t\t\tINT32 CheckFile = UncompSize; \t\t\tif (CompSize%16 == 0) \t\t\t\tsz = CompSize; \t\t\telse \t\t\t\tsz = CompSize + 16 - (CompSize%16); \t\t\tmemcpy(dec, buf, sz); \t\t\tDecryptFileChunk(&dec[0], sz, key); \t\t\tuncompress((Bytef*)&buf[0], (uLongf*)&CheckFile, (Bytef*)&dec[0], sz); \t\t} \t\tstr-&gt;Seek(-CheckSize, USE_SEEK_CURRENT); \t\tstr-&gt;Write(&buf[0], CheckSize);  \t\tUINT32 Check1 = Checksum((UINT8*)&buf[0], CheckSize), \t\t\tCheck2 = lpChecksum[CheckIdx]; \t\tif (Check1 != Check2) \t\t\tbreak; \t\tres += CheckSize; \t}  \tlpManifest[Item].Attributes = lpManifest[Item].Attributes & (!CACHE_FLAG_ENCRYPTED); \treturn res; }<\/code><\/pre>\n<p>  <b>Delphi<\/b>  <\/p>\n<pre><code class=\"delphi\">const   IV: array[0..15] of byte = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);  procedure DecryptFileChunk(buf: pByte; ChunkSize: integer; Key: Pointer); var   AES: TCipher_Rijndael;   src: array[0..HL_GCF_CHECKSUM_LENGTH-1] of byte; begin   Move(buf^, src[0], HL_GCF_CHECKSUM_LENGTH);   AES:=TCipher_Rijndael.Create();   AES.Init(Key^, 16, IV[0], 16);   AES.Mode:=cmCFBx;   AES.Decode(src[0], buf^, ChunkSize);   AES.Free; end;  function TGCFFile.DecryptFile(Item: integer; Key: Pointer): int64; var   StreamP: TStream;   CheckSize, CheckFile, CheckFS, CheckIdx, sz: uint32_t;   buf: array of byte;   dec: array[0..HL_GCF_CHECKSUM_LENGTH] of byte;   CompSize, UncompSize: integer;   Size: int64; begin   result:=0;   StreamP:=OpenFile(Item, ACCES_READWRITE);   if (StreamP=nil) then     Exit;    Size:=ItemSize[Item].Size;   if Assigned(OnProgress) then     OnProgress(ItemName[Item], 0, Size, Data);   if Assigned(OnProgressObj) then     OnProgressObj(ItemName[Item], 0, Size, Data);    SetLength(buf, HL_GCF_CHECKSUM_LENGTH);   CheckSize:=HL_GCF_CHECKSUM_LENGTH;   while ((StreamP.Position&lt;StreamP.Size) and (CheckSize=HL_GCF_CHECKSUM_LENGTH)) do   begin     CheckIdx:=lpFileIdChecksumTableEntries[lpManifestNodes[Item].FileId].FirstChecksumIndex+      ((StreamP.Position and $ffffffffffff8000) shr 15);     CheckSize:=StreamP.Read(buf[0], 8);      Move(buf[0], CompSize, 4);     Move(buf[4], UncompSize, 4);     if (ulong(UncompSize)&gt;fManifestHeader.CompressionBlockSize) or (CompSize&gt;UncompSize) or (UncompSize&lt;-1) or (CompSize&lt;-1) then     begin       \/\/Chunk is not compressed!       CheckSize:=StreamP.Read(buf[8], HL_GCF_CHECKSUM_LENGTH-8);       DecryptFileChunk(@buf[0], CheckSize, Key);     end       else if ((ulong(UncompSize)&lt;=fManifestHeader.CompressionBlockSize) and (CompSize&lt;=UncompSize)) and ((UncompSize&gt;-1) and (CompSize&gt;-1)) then     begin       CheckSize:=StreamP.Read(buf[8], UncompSize-8);       CheckFile:=UncompSize;       \/\/Chunk is compressed!       if (CompSize mod 16=0) then sz:=CompSize         else sz:=CompSize+16-(CompSize mod 16);       Move(buf[8], dec[0], sz);       DecryptFileChunk(@dec[0], sz, Key);       uncompress(@buf[0], CheckFile, @dec[0], sz);     end;     StreamP.Seek(-CheckSize, spCurrent);     StreamP.Write(buf[0], CheckSize);       CheckFile:=Checksum(@buf[0], CheckSize);     CheckFS:=lpChecksumEntries[CheckIdx];     if (CheckFile&lt;&gt;CheckFS) and (not IgnoreCheckError) then     begin       if Assigned(OnError) then         OnError(GetItemPath(Item), ERROR_CHECKSUM, Data);       if Assigned(OnErrorObj) then         OnErrorObj(GetItemPath(Item), ERROR_CHECKSUM, Data);       break;     end;     inc(result, CheckSize);      \/\/StreamP.Position:=StreamP.Position+CheckSize;      if Assigned(OnProgress) then       OnProgress('', result, Size, Data);     if Assigned(OnProgressObj) then       OnProgressObj('', result, Size, Data);     if Stop then       break;   end;   lpManifestNodes[Item].Attributes:=lpManifestNodes[Item].Attributes and (not HL_GCF_FLAG_ENCRYPTED);   fIsChangeHeader[HEADER_MANIFEST_NODES]:=true;   SaveChanges();   SetLength(buf, 0); end;<\/code><\/pre>\n<\/div>\n<\/div>\n<h5>\u0420\u0430\u0441\u0447\u0435\u0442 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u043e\u0439 \u0441\u0443\u043c\u043c\u044b \u0434\u043b\u044f <i>ManifestHeader<\/i><\/h5>\n<p>  \u0414\u043b\u044f \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432:  <\/p>\n<ul>\n<li>ManifestHeader<\/li>\n<li>Manifest[]<\/li>\n<li>FileNames<\/li>\n<li>HashTableKeys[]<\/li>\n<li>HashTableIndices[]<\/li>\n<li>MinimumFootprints[]<\/li>\n<li>UserConfig[]<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0441\u0447\u0451\u0442\u043e\u043c \u041a\u0421 \u043e\u0431\u043d\u0443\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u043e\u043b\u044f:  <\/p>\n<ul>\n<li>ManifestHeader.Fingerprint<\/li>\n<li>ManifestHeader.Checksum<\/li>\n<\/ul>\n<p>  \u0421\u0430\u043c \u0440\u0430\u0441\u0447\u0451\u0442 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044e \u0445\u0435\u0448\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Adler-32\">Adler32<\/a> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440:<\/p>\n<p>  <b>Delphi<\/b>  <\/p>\n<pre><code class=\"delphi\">function ManifestChecksum(Header: pCache_ManifestHeader; entries, names, hashs, table, MFP, UCF: pByte): uint32_t; var   tmp1, tmp2: uint32; begin   tmp1:=Header.Fingerprint;   tmp2:=Header.Checksum;   Header.Fingerprint:=0;   Header.Checksum:=0;   result:=adler32(0, pAnsiChar(Header), sizeof(TCache_ManifestHeader));   result:=adler32(result, pAnsiChar(entries), sizeof(TCache_ManifestNode)*Header^.NodeCount);   result:=adler32(result, pAnsiChar(names), Header^.NameSize);   result:=adler32(result, pAnsiChar(hashs), sizeof(uint32)*Header^.HashTableKeyCount);   result:=adler32(result, pAnsiChar(table), sizeof(uint32)*Header^.NodeCount);   if Header^.NumOfMinimumFootprintFiles&gt;0 then     result:=adler32(result, pAnsiChar(MFP), sizeof(uint32)*Header^.NumOfMinimumFootprintFiles);   if Header^.NumOfUserConfigFiles&gt;0 then     result:=adler32(result, pAnsiChar(UCF), sizeof(uint32)*Header^.NumOfUserConfigFiles);   Header.Fingerprint:=tmp1;   Header.Checksum:=tmp2; end;<\/code><\/pre>\n<h4>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h4>\n<p>  \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043d\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0432 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0432\u0432\u0438\u0434\u0443 \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u043e\u0441\u0442\u0438 \u0438\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0445 \u043a\u0430\u0440\u0442 \u0437\u0430\u043d\u044f\u0442\u044b\u0445 \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043a\u0430\u0440\u0442\u044b \u0441\u0435\u043a\u0442\u043e\u0440\u043e\u0432, \u043f\u0435\u0440\u0435\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u044b \u0438 \u043c\u043d\u043e\u0433\u043e\u0435-\u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435) \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/andreili\/steam_libs\">\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438<\/a> (\u0442\u0430\u043c \u0436\u0435 \u043b\u0435\u0436\u0430\u0442 \u0438 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445). \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043a\u043e\u0434\u044b \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 (\u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043d\u0443\u0436\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0440\u0430\u0440\u0438\u0442\u0435\u0442\u044b&#8230;).<br \/>  \u041f\u0440\u0438\u043c\u0435\u0440\u043d\u0430\u044f \u0434\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u2014 \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 2011-\u043e\u0433\u043e \u0433\u043e\u0434\u0430.<\/p>\n<p>  <b>PS:<\/b> \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u043b\u043e \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u043b\u0430\u0431\u043e\u0440\u0430\u0442\u043e\u0440\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e \u043f\u0440\u0435\u0434\u043c\u0435\u0442\u0443 <i>\u041e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b<\/i> \u0432 \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0438\u0442\u0435\u0442\u0435 \u2014 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0441\u0438\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0437\u0430\u043f\u0438\u0441\u044c, \u0447\u0442\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u043e\u0432). \u041c\u043e\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0437\u0430 \u0432\u0441\u0451 \u0432\u0440\u0435\u043c\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u0431\u0440\u0430\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u0440\u0430\u0437\u0431\u0438\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0431\u043b\u043e\u043a\u0438 \u0438 \u0441\u0435\u043a\u0442\u043e\u0440\u0430 \u2014 \u0430 \u044d\u0442\u043e \u0431\u044b\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e-\u043d\u0430\u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0440\u0435\u0437\u0430\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0431\u0438\u0431\u0438\u043b\u043e\u0442\u0435\u043a\u0438 (\u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0445 \u0441\u0443\u043c\u043c). \u0414\u0430\u0436\u0435 \u0434\u0435\u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043a\u0435\u0448\u0430 \u044f \u0434\u043e\u043f\u0438\u0441\u0430\u043b \u0432 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0434\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b\u2026      \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/224027\/\"> http:\/\/habrahabr.ru\/post\/224027\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">     \t<img decoding=\"async\" src=\"http:\/\/habrastorage.org\/getpro\/habr\/post_images\/000\/dca\/198\/000dca198a459957c5d705d59a8bc514.png\" alt=\"Steam Logo\" align=\"left\"\/><br \/>  \u041a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043b \u0432 <a href=\"http:\/\/habrahabr.ru\/post\/223961\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a>, \u043d\u0430\u0447\u0438\u043d\u0430\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Steam, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043c\u043e\u0433\u043b\u043e \u043e\u0442\u043a\u0440\u044b\u0442\u044c Anti-Steam \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u043f\u0443\u0442\u0451\u043c \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043c\u043e\u0437\u0433\u043e\u0432\u044b\u0445 \u0448\u0442\u0443\u0440\u043c\u043e\u0432.<br \/>  \u0424\u0430\u0439\u043b\u044b \u0444\u043e\u0440\u043c\u0430\u0442\u0430 GCF \u0434\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u0435\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0438\u0433\u0440, \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0435\u0439 VALVE, \u0430 NCF \u2014 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445. \u0421\u0430\u043c\u0438 \u043f\u043e \u0441\u0435\u0431\u0435 \u044d\u0442\u0438 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0440\u0430\u0437 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0443\u0440\u043e\u0432\u043d\u044f\u043c\u0438 \u0437\u0430\u0449\u0438\u0442\u044b. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 NCF \u043e\u0442 GCF \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438, \u0430 \u0444\u0430\u0439\u043b\u044b, \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0430\u0449\u0438\u0435 \u0438\u043c, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 (<i>&lt;\u043a\u0430\u0442\u0430\u043b\u043e\u0433 Steam&gt;\/SteamApps\/common\/&lt;\u0438\u043c\u044f \u0438\u0433\u0440\u044b&gt;<\/i>). \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0443 GCF, \u0430 \u0432\u0441\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 NCF \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u043e\u0441\u043b\u0435.<br \/>  \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0437\u0431\u0435\u0440\u0443 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u043d\u0438\u043c\u0438 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0441\u0432\u043e\u0435\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 (\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043d\u0435\u0451 \u2014 \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438). \u041d\u0430\u0447\u0430\u043b\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u043a\u0443\u0447\u043d\u044b\u043c \u2014 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0445 \u043f\u043e\u043b\u0435\u0439. \u0421\u0430\u043c\u043e\u0435 \u00ab\u0432\u043a\u0443\u0441\u043d\u043e\u0435\u00bb \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043d\u0438\u0445\u2026<br \/>  \u0412\u0435\u0441\u044c \u043a\u043e\u0434, \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0437\u0434\u0435\u0441\u044c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043b\u043e\u0434\u043e\u043c \u0440\u0435\u0432\u0435\u0440\u0441-\u0438\u043d\u0436\u0438\u043d\u0438\u0440\u0438\u043d\u0433\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a Steam. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432 \u0431\u044b\u043b\u0430 \u043f\u043e\u0447\u0435\u0440\u043f\u043d\u0443\u0442\u0430 \u0438\u0437 <a href=\"http:\/\/wiki.singul4rity.com\/steam:filestructures:gcf\">\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432<\/a>, \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0435\u0451 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043b \u0438 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u043a\u0435\u0448\u0430 (\u0434\u0430\u0436\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u0430\u043c\u043e\u0439 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u0439 \u043d\u0430 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 HLLIB).  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-224027","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/224027","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=224027"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/224027\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=224027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=224027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=224027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}