diff --git a/.cache/go-build/00/0024da22767241414731915c29d9e4de6bb2b8abcf549d4860f59f1b4c61dbbf-a b/.cache/go-build/00/0024da22767241414731915c29d9e4de6bb2b8abcf549d4860f59f1b4c61dbbf-a deleted file mode 100644 index 7551983..0000000 --- a/.cache/go-build/00/0024da22767241414731915c29d9e4de6bb2b8abcf549d4860f59f1b4c61dbbf-a +++ /dev/null @@ -1 +0,0 @@ -v1 0024da22767241414731915c29d9e4de6bb2b8abcf549d4860f59f1b4c61dbbf 616a72bbba0b377869eebb9044f5e420e82c8e2e28262b41e11c2a2ca5015682 2045 1775136286841974929 diff --git a/.cache/go-build/00/0042e993d6e8ff676791b010bb273cf1e056cd99dd7d327e981b313b2c181d6d-a b/.cache/go-build/00/0042e993d6e8ff676791b010bb273cf1e056cd99dd7d327e981b313b2c181d6d-a deleted file mode 100644 index 8d70a62..0000000 --- a/.cache/go-build/00/0042e993d6e8ff676791b010bb273cf1e056cd99dd7d327e981b313b2c181d6d-a +++ /dev/null @@ -1 +0,0 @@ -v1 0042e993d6e8ff676791b010bb273cf1e056cd99dd7d327e981b313b2c181d6d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286988393474 diff --git a/.cache/go-build/00/009240a0c59c6752409ca2925c7e3437da99a1cfdc46be3f5ad2bc1c5743ea2d-d b/.cache/go-build/00/009240a0c59c6752409ca2925c7e3437da99a1cfdc46be3f5ad2bc1c5743ea2d-d deleted file mode 100644 index 4916be3..0000000 Binary files a/.cache/go-build/00/009240a0c59c6752409ca2925c7e3437da99a1cfdc46be3f5ad2bc1c5743ea2d-d and /dev/null differ diff --git a/.cache/go-build/00/00ba9d1b93a3abe02a94ab05456d3e75deb0cf54bc6e14e0f1df552430322fac-d b/.cache/go-build/00/00ba9d1b93a3abe02a94ab05456d3e75deb0cf54bc6e14e0f1df552430322fac-d deleted file mode 100644 index 298a94b..0000000 Binary files a/.cache/go-build/00/00ba9d1b93a3abe02a94ab05456d3e75deb0cf54bc6e14e0f1df552430322fac-d and /dev/null differ diff --git a/.cache/go-build/00/00dedcbaf5dd36c49447863279d4bf0649eb1838d56074e8076fc688dff92fca-d b/.cache/go-build/00/00dedcbaf5dd36c49447863279d4bf0649eb1838d56074e8076fc688dff92fca-d deleted file mode 100644 index bdbf2c7..0000000 --- a/.cache/go-build/00/00dedcbaf5dd36c49447863279d4bf0649eb1838d56074e8076fc688dff92fca-d +++ /dev/null @@ -1 +0,0 @@ -./godebug.go diff --git a/.cache/go-build/00/00fd7202a0aa08cb14868e9b4216a9d0cac220b310510399fe189238e14451c8-a b/.cache/go-build/00/00fd7202a0aa08cb14868e9b4216a9d0cac220b310510399fe189238e14451c8-a deleted file mode 100644 index b69462f..0000000 --- a/.cache/go-build/00/00fd7202a0aa08cb14868e9b4216a9d0cac220b310510399fe189238e14451c8-a +++ /dev/null @@ -1 +0,0 @@ -v1 00fd7202a0aa08cb14868e9b4216a9d0cac220b310510399fe189238e14451c8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289050886439 diff --git a/.cache/go-build/01/0101014b510b4c2555774499c3c1f42f8d16bcb53bf1b58d956eea9a2ba1f5be-a b/.cache/go-build/01/0101014b510b4c2555774499c3c1f42f8d16bcb53bf1b58d956eea9a2ba1f5be-a deleted file mode 100644 index de38bdc..0000000 --- a/.cache/go-build/01/0101014b510b4c2555774499c3c1f42f8d16bcb53bf1b58d956eea9a2ba1f5be-a +++ /dev/null @@ -1 +0,0 @@ -v1 0101014b510b4c2555774499c3c1f42f8d16bcb53bf1b58d956eea9a2ba1f5be a66ad59a0327b6e67b37639f372370cee80eac5991229ebbecd90c91aba51e87 68528 1775136289321879343 diff --git a/.cache/go-build/02/0228e8c8f89db1a322d617e46969cef886b9a0ebea8b462907df092f9339a73c-d b/.cache/go-build/02/0228e8c8f89db1a322d617e46969cef886b9a0ebea8b462907df092f9339a73c-d deleted file mode 100644 index d66f965..0000000 Binary files a/.cache/go-build/02/0228e8c8f89db1a322d617e46969cef886b9a0ebea8b462907df092f9339a73c-d and /dev/null differ diff --git a/.cache/go-build/02/024d8853cd8bd66de4848e5c56e12e11b856640fd7ac72df7cd9df07021cfa03-d b/.cache/go-build/02/024d8853cd8bd66de4848e5c56e12e11b856640fd7ac72df7cd9df07021cfa03-d deleted file mode 100644 index 00cd4ca..0000000 Binary files a/.cache/go-build/02/024d8853cd8bd66de4848e5c56e12e11b856640fd7ac72df7cd9df07021cfa03-d and /dev/null differ diff --git a/.cache/go-build/02/02677ea53b5ccf9235e1592105befe4ddd1f18e76a4f463453b4323f1ec0c2be-a b/.cache/go-build/02/02677ea53b5ccf9235e1592105befe4ddd1f18e76a4f463453b4323f1ec0c2be-a deleted file mode 100644 index b67783b..0000000 --- a/.cache/go-build/02/02677ea53b5ccf9235e1592105befe4ddd1f18e76a4f463453b4323f1ec0c2be-a +++ /dev/null @@ -1 +0,0 @@ -v1 02677ea53b5ccf9235e1592105befe4ddd1f18e76a4f463453b4323f1ec0c2be a92ac68323fffdb2ba35bd17fc8f11c5973fc49233e9218b71d7991b8e69033b 152144 1775136289778677050 diff --git a/.cache/go-build/02/026ea4421214fcc424b21d42ac4a27aa52dcc9a54b0a628bf2df751e6f46bc81-d b/.cache/go-build/02/026ea4421214fcc424b21d42ac4a27aa52dcc9a54b0a628bf2df751e6f46bc81-d deleted file mode 100644 index 720e347..0000000 --- a/.cache/go-build/02/026ea4421214fcc424b21d42ac4a27aa52dcc9a54b0a628bf2df751e6f46bc81-d +++ /dev/null @@ -1,10 +0,0 @@ -./format.go -./format_rfc3339.go -./sleep.go -./sys_unix.go -./tick.go -./time.go -./zoneinfo.go -./zoneinfo_goroot.go -./zoneinfo_read.go -./zoneinfo_unix.go diff --git a/.cache/go-build/02/028b3b6ea59b39deb8f669c75785c3cc57bdf8214e85853e3e48ea3e93358885-a b/.cache/go-build/02/028b3b6ea59b39deb8f669c75785c3cc57bdf8214e85853e3e48ea3e93358885-a deleted file mode 100644 index 7d33aea..0000000 --- a/.cache/go-build/02/028b3b6ea59b39deb8f669c75785c3cc57bdf8214e85853e3e48ea3e93358885-a +++ /dev/null @@ -1 +0,0 @@ -v1 028b3b6ea59b39deb8f669c75785c3cc57bdf8214e85853e3e48ea3e93358885 7a29534d64dc2dd14c4341681a2217c55faf305f9253b665025f06b692b9a722 2293 1775136286919223475 diff --git a/.cache/go-build/02/02f8cd96e5c6500d0163971a1b79a4a2ae49ab30f8674852e5dcf786f145333c-a b/.cache/go-build/02/02f8cd96e5c6500d0163971a1b79a4a2ae49ab30f8674852e5dcf786f145333c-a deleted file mode 100644 index f029899..0000000 --- a/.cache/go-build/02/02f8cd96e5c6500d0163971a1b79a4a2ae49ab30f8674852e5dcf786f145333c-a +++ /dev/null @@ -1 +0,0 @@ -v1 02f8cd96e5c6500d0163971a1b79a4a2ae49ab30f8674852e5dcf786f145333c 901a115bbb89bb5c3042c15bebc8ae38a3ab053486a8bface4a3aff532db432a 64 1775136286962073955 diff --git a/.cache/go-build/03/0325eec9ba08111f1fed8b7dadbb8cbf485a54a0c1d49d4fe77418cb22b06d5d-a b/.cache/go-build/03/0325eec9ba08111f1fed8b7dadbb8cbf485a54a0c1d49d4fe77418cb22b06d5d-a deleted file mode 100644 index 20f999b..0000000 --- a/.cache/go-build/03/0325eec9ba08111f1fed8b7dadbb8cbf485a54a0c1d49d4fe77418cb22b06d5d-a +++ /dev/null @@ -1 +0,0 @@ -v1 0325eec9ba08111f1fed8b7dadbb8cbf485a54a0c1d49d4fe77418cb22b06d5d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289068278642 diff --git a/.cache/go-build/03/0338989dba85cee710029add71103ccc6b0cc889f0d6bc2759ef0e36d3f87ce9-a b/.cache/go-build/03/0338989dba85cee710029add71103ccc6b0cc889f0d6bc2759ef0e36d3f87ce9-a deleted file mode 100644 index d79ae41..0000000 --- a/.cache/go-build/03/0338989dba85cee710029add71103ccc6b0cc889f0d6bc2759ef0e36d3f87ce9-a +++ /dev/null @@ -1 +0,0 @@ -v1 0338989dba85cee710029add71103ccc6b0cc889f0d6bc2759ef0e36d3f87ce9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288657213658 diff --git a/.cache/go-build/03/033d11143aeeb9e45e66b122d569282ef0ba305aeddd3cd65e8881152b1e6966-d b/.cache/go-build/03/033d11143aeeb9e45e66b122d569282ef0ba305aeddd3cd65e8881152b1e6966-d deleted file mode 100644 index afd05af..0000000 Binary files a/.cache/go-build/03/033d11143aeeb9e45e66b122d569282ef0ba305aeddd3cd65e8881152b1e6966-d and /dev/null differ diff --git a/.cache/go-build/03/03453b32847dd923bbf42000334c530f91405364b7dfa5c86e71610aa3c9a832-a b/.cache/go-build/03/03453b32847dd923bbf42000334c530f91405364b7dfa5c86e71610aa3c9a832-a deleted file mode 100644 index d063a4a..0000000 --- a/.cache/go-build/03/03453b32847dd923bbf42000334c530f91405364b7dfa5c86e71610aa3c9a832-a +++ /dev/null @@ -1 +0,0 @@ -v1 03453b32847dd923bbf42000334c530f91405364b7dfa5c86e71610aa3c9a832 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775138184132034376 diff --git a/.cache/go-build/03/035fcba97240573da733ee4619a37660ecdda31d44fa766a99a7b9c6977202c2-a b/.cache/go-build/03/035fcba97240573da733ee4619a37660ecdda31d44fa766a99a7b9c6977202c2-a deleted file mode 100644 index 6bcc4a3..0000000 --- a/.cache/go-build/03/035fcba97240573da733ee4619a37660ecdda31d44fa766a99a7b9c6977202c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 035fcba97240573da733ee4619a37660ecdda31d44fa766a99a7b9c6977202c2 260a7f7596ac4595ea5021777e415596395ad34545c3ff3a36b76fe0515e5736 119882 1775137722082827323 diff --git a/.cache/go-build/04/049f8f8aeb7af8557ffae9e7731e41d1a7b9bf4bc710ff583326785044ed31a9-a b/.cache/go-build/04/049f8f8aeb7af8557ffae9e7731e41d1a7b9bf4bc710ff583326785044ed31a9-a deleted file mode 100644 index 5e6cc54..0000000 --- a/.cache/go-build/04/049f8f8aeb7af8557ffae9e7731e41d1a7b9bf4bc710ff583326785044ed31a9-a +++ /dev/null @@ -1 +0,0 @@ -v1 049f8f8aeb7af8557ffae9e7731e41d1a7b9bf4bc710ff583326785044ed31a9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288612590836 diff --git a/.cache/go-build/04/04b281e04d70ff68d86cdca524bbc25057c63880e17abd5ac80015b59ce43847-d b/.cache/go-build/04/04b281e04d70ff68d86cdca524bbc25057c63880e17abd5ac80015b59ce43847-d deleted file mode 100644 index 83a225a..0000000 Binary files a/.cache/go-build/04/04b281e04d70ff68d86cdca524bbc25057c63880e17abd5ac80015b59ce43847-d and /dev/null differ diff --git a/.cache/go-build/04/04b4509d27fd9c93eb33d9e8d80ff91f4a3bd31a7c7e2b9a77367d5c2f33aca8-d b/.cache/go-build/04/04b4509d27fd9c93eb33d9e8d80ff91f4a3bd31a7c7e2b9a77367d5c2f33aca8-d deleted file mode 100644 index 3c50242..0000000 --- a/.cache/go-build/04/04b4509d27fd9c93eb33d9e8d80ff91f4a3bd31a7c7e2b9a77367d5c2f33aca8-d +++ /dev/null @@ -1,7 +0,0 @@ -./deflate.go -./deflatefast.go -./dict_decoder.go -./huffman_bit_writer.go -./huffman_code.go -./inflate.go -./token.go diff --git a/.cache/go-build/04/04e1912ecd4c7fb4edd2435fe1bf5205c07ce80dd3ecf32837998d55775ee9a2-a b/.cache/go-build/04/04e1912ecd4c7fb4edd2435fe1bf5205c07ce80dd3ecf32837998d55775ee9a2-a deleted file mode 100644 index 23e8455..0000000 --- a/.cache/go-build/04/04e1912ecd4c7fb4edd2435fe1bf5205c07ce80dd3ecf32837998d55775ee9a2-a +++ /dev/null @@ -1 +0,0 @@ -v1 04e1912ecd4c7fb4edd2435fe1bf5205c07ce80dd3ecf32837998d55775ee9a2 fbf683cd1314637c28aaf4fb65205d990c459938c32673d6492b0a046c5a2483 12 1775136288524143622 diff --git a/.cache/go-build/05/059954e08fe611d5adcc4b180e83e3efc0d3eb0684c88233f4acb460a0e48d67-d b/.cache/go-build/05/059954e08fe611d5adcc4b180e83e3efc0d3eb0684c88233f4acb460a0e48d67-d deleted file mode 100644 index 7b97323..0000000 Binary files a/.cache/go-build/05/059954e08fe611d5adcc4b180e83e3efc0d3eb0684c88233f4acb460a0e48d67-d and /dev/null differ diff --git a/.cache/go-build/05/05f5e6492430b00f807e4629c6e4a53f3948fc9382f19898d1cc361b3b99ff9b-d b/.cache/go-build/05/05f5e6492430b00f807e4629c6e4a53f3948fc9382f19898d1cc361b3b99ff9b-d deleted file mode 100644 index 6e02bf9..0000000 --- a/.cache/go-build/05/05f5e6492430b00f807e4629c6e4a53f3948fc9382f19898d1cc361b3b99ff9b-d +++ /dev/null @@ -1,5 +0,0 @@ -./doc.go -./errors.go -./format.go -./print.go -./scan.go diff --git a/.cache/go-build/06/0639d9d2b83813f66c0923676d2e4d85b41d1de1b1f8f83f9355f7e52304e1d3-a b/.cache/go-build/06/0639d9d2b83813f66c0923676d2e4d85b41d1de1b1f8f83f9355f7e52304e1d3-a deleted file mode 100644 index d082c72..0000000 --- a/.cache/go-build/06/0639d9d2b83813f66c0923676d2e4d85b41d1de1b1f8f83f9355f7e52304e1d3-a +++ /dev/null @@ -1 +0,0 @@ -v1 0639d9d2b83813f66c0923676d2e4d85b41d1de1b1f8f83f9355f7e52304e1d3 4c6d059a949c49a25675e8fc4bb9764109940a419606c2e57c1d307c4e5c5a00 228614 1775136288517869788 diff --git a/.cache/go-build/06/06a45522df397b46b35bf32c99a6897f0e05a1628f940c5c48517ecab0a791ff-d b/.cache/go-build/06/06a45522df397b46b35bf32c99a6897f0e05a1628f940c5c48517ecab0a791ff-d deleted file mode 100644 index 05310ce..0000000 --- a/.cache/go-build/06/06a45522df397b46b35bf32c99a6897f0e05a1628f940c5c48517ecab0a791ff-d +++ /dev/null @@ -1 +0,0 @@ -./tabwriter.go diff --git a/.cache/go-build/06/06bce5bf4df33cb42ed779a28784c33596bb4494b3f63377dc8df001cd9e73b7-a b/.cache/go-build/06/06bce5bf4df33cb42ed779a28784c33596bb4494b3f63377dc8df001cd9e73b7-a deleted file mode 100644 index baf96ae..0000000 --- a/.cache/go-build/06/06bce5bf4df33cb42ed779a28784c33596bb4494b3f63377dc8df001cd9e73b7-a +++ /dev/null @@ -1 +0,0 @@ -v1 06bce5bf4df33cb42ed779a28784c33596bb4494b3f63377dc8df001cd9e73b7 9cd1c3bf0072aa0dccb28141565da849924ff9255f955bac9d3587a5da754b0b 10 1775136289935030972 diff --git a/.cache/go-build/07/07347c3fc3fabad4a23b5bfc2ae3320c230070520923747b2807ad995f3bb625-a b/.cache/go-build/07/07347c3fc3fabad4a23b5bfc2ae3320c230070520923747b2807ad995f3bb625-a deleted file mode 100644 index 6528395..0000000 --- a/.cache/go-build/07/07347c3fc3fabad4a23b5bfc2ae3320c230070520923747b2807ad995f3bb625-a +++ /dev/null @@ -1 +0,0 @@ -v1 07347c3fc3fabad4a23b5bfc2ae3320c230070520923747b2807ad995f3bb625 8c95275c33595db51a06588255fd228f58cc80407ad9f38acb1bdf106b7d2f4e 29830 1775136286933642035 diff --git a/.cache/go-build/07/07600cc46d6cccd87022cf13efce9335496f7d119a17b7090a515ca47e8e10e5-a b/.cache/go-build/07/07600cc46d6cccd87022cf13efce9335496f7d119a17b7090a515ca47e8e10e5-a deleted file mode 100644 index 58992a6..0000000 --- a/.cache/go-build/07/07600cc46d6cccd87022cf13efce9335496f7d119a17b7090a515ca47e8e10e5-a +++ /dev/null @@ -1 +0,0 @@ -v1 07600cc46d6cccd87022cf13efce9335496f7d119a17b7090a515ca47e8e10e5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288989313755 diff --git a/.cache/go-build/07/077c4c84129ee8b3bb95bdcaecd24bff550d8c7ecae971d146bf9590de7b41a9-d b/.cache/go-build/07/077c4c84129ee8b3bb95bdcaecd24bff550d8c7ecae971d146bf9590de7b41a9-d deleted file mode 100644 index 56ef65c..0000000 --- a/.cache/go-build/07/077c4c84129ee8b3bb95bdcaecd24bff550d8c7ecae971d146bf9590de7b41a9-d +++ /dev/null @@ -1 +0,0 @@ -./crypto.go diff --git a/.cache/go-build/07/07abd86d01b5a778b567fc49a8a06d9f80d9db944134cbb72177a19955f4a5a6-d b/.cache/go-build/07/07abd86d01b5a778b567fc49a8a06d9f80d9db944134cbb72177a19955f4a5a6-d deleted file mode 100644 index 730814c..0000000 --- a/.cache/go-build/07/07abd86d01b5a778b567fc49a8a06d9f80d9db944134cbb72177a19955f4a5a6-d +++ /dev/null @@ -1,2 +0,0 @@ -./expr.go -./vers.go diff --git a/.cache/go-build/07/07ee7968bf89e7ffa269fb7e52ee6336f2c8e939ba0d64d5d938deae48fd8698-a b/.cache/go-build/07/07ee7968bf89e7ffa269fb7e52ee6336f2c8e939ba0d64d5d938deae48fd8698-a deleted file mode 100644 index 072b687..0000000 --- a/.cache/go-build/07/07ee7968bf89e7ffa269fb7e52ee6336f2c8e939ba0d64d5d938deae48fd8698-a +++ /dev/null @@ -1 +0,0 @@ -v1 07ee7968bf89e7ffa269fb7e52ee6336f2c8e939ba0d64d5d938deae48fd8698 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288795547327 diff --git a/.cache/go-build/08/0861718a488caca51aae7a7d0501321354b2140b382da0fc18eaa5b64965c66a-a b/.cache/go-build/08/0861718a488caca51aae7a7d0501321354b2140b382da0fc18eaa5b64965c66a-a deleted file mode 100644 index bc03b77..0000000 --- a/.cache/go-build/08/0861718a488caca51aae7a7d0501321354b2140b382da0fc18eaa5b64965c66a-a +++ /dev/null @@ -1 +0,0 @@ -v1 0861718a488caca51aae7a7d0501321354b2140b382da0fc18eaa5b64965c66a 618850996b162c915ab19a7bfda0ebc6c7bacefafb87e83421bc4e91b80a955a 32700 1775137376773863279 diff --git a/.cache/go-build/08/087832261f11fa6e6fe4ec2160bd1580530b3ca62179bed9093beef47b6229f6-d b/.cache/go-build/08/087832261f11fa6e6fe4ec2160bd1580530b3ca62179bed9093beef47b6229f6-d deleted file mode 100644 index 5bf8eed..0000000 Binary files a/.cache/go-build/08/087832261f11fa6e6fe4ec2160bd1580530b3ca62179bed9093beef47b6229f6-d and /dev/null differ diff --git a/.cache/go-build/08/08940aa9a30b0610997c84b4640254e6190924f447c98ef7952d278db6371a60-d b/.cache/go-build/08/08940aa9a30b0610997c84b4640254e6190924f447c98ef7952d278db6371a60-d deleted file mode 100644 index d2138ee..0000000 Binary files a/.cache/go-build/08/08940aa9a30b0610997c84b4640254e6190924f447c98ef7952d278db6371a60-d and /dev/null differ diff --git a/.cache/go-build/08/089427758094599d6149a4a39dfca335bceab19163fac15cd283711639b97930-a b/.cache/go-build/08/089427758094599d6149a4a39dfca335bceab19163fac15cd283711639b97930-a deleted file mode 100644 index bc2cb77..0000000 --- a/.cache/go-build/08/089427758094599d6149a4a39dfca335bceab19163fac15cd283711639b97930-a +++ /dev/null @@ -1 +0,0 @@ -v1 089427758094599d6149a4a39dfca335bceab19163fac15cd283711639b97930 bb5b2e85baf0c28ab738c5566d95d72abf7f9785707e03197090ae91d56fdf53 84 1775136288666191404 diff --git a/.cache/go-build/09/092d9b978d7817d355ed4163930eeefcb9d5005e886cbb17d312e4a60f9f718f-d b/.cache/go-build/09/092d9b978d7817d355ed4163930eeefcb9d5005e886cbb17d312e4a60f9f718f-d deleted file mode 100644 index 7026a98..0000000 Binary files a/.cache/go-build/09/092d9b978d7817d355ed4163930eeefcb9d5005e886cbb17d312e4a60f9f718f-d and /dev/null differ diff --git a/.cache/go-build/09/094448649dac8d7c2adf5df3bee1dd8cf0a778eda6bec9f707c39346fb925835-a b/.cache/go-build/09/094448649dac8d7c2adf5df3bee1dd8cf0a778eda6bec9f707c39346fb925835-a deleted file mode 100644 index 6366261..0000000 --- a/.cache/go-build/09/094448649dac8d7c2adf5df3bee1dd8cf0a778eda6bec9f707c39346fb925835-a +++ /dev/null @@ -1 +0,0 @@ -v1 094448649dac8d7c2adf5df3bee1dd8cf0a778eda6bec9f707c39346fb925835 3a2247463477d7161e05902eae24cac571de58aeebaebc346c2861e077ee233c 9 1775136286936852237 diff --git a/.cache/go-build/09/098647ac1c0f9ca0b27d2e4b10bd51dcdbd393c7f41faf11a6ec3acc2b169254-a b/.cache/go-build/09/098647ac1c0f9ca0b27d2e4b10bd51dcdbd393c7f41faf11a6ec3acc2b169254-a deleted file mode 100644 index cbe36d0..0000000 --- a/.cache/go-build/09/098647ac1c0f9ca0b27d2e4b10bd51dcdbd393c7f41faf11a6ec3acc2b169254-a +++ /dev/null @@ -1 +0,0 @@ -v1 098647ac1c0f9ca0b27d2e4b10bd51dcdbd393c7f41faf11a6ec3acc2b169254 c8a06c5c7166faf9eacdf877d12e11f498558d8161b7bc2f8c43b08cb3e321e7 956 1775136286809409996 diff --git a/.cache/go-build/09/0993af324c0dc82bc42638ec042b5ec609cf6265c621747a5f0bbab965389933-d b/.cache/go-build/09/0993af324c0dc82bc42638ec042b5ec609cf6265c621747a5f0bbab965389933-d deleted file mode 100644 index d725529..0000000 Binary files a/.cache/go-build/09/0993af324c0dc82bc42638ec042b5ec609cf6265c621747a5f0bbab965389933-d and /dev/null differ diff --git a/.cache/go-build/09/09cf4f79afd593955da296ef5ee5be7c6379bca2a6f96e75e2c05e5a80850cc6-a b/.cache/go-build/09/09cf4f79afd593955da296ef5ee5be7c6379bca2a6f96e75e2c05e5a80850cc6-a deleted file mode 100644 index 20f914b..0000000 --- a/.cache/go-build/09/09cf4f79afd593955da296ef5ee5be7c6379bca2a6f96e75e2c05e5a80850cc6-a +++ /dev/null @@ -1 +0,0 @@ -v1 09cf4f79afd593955da296ef5ee5be7c6379bca2a6f96e75e2c05e5a80850cc6 8a2ea2358e1082374a018cea6a5b680f5ff4154abc73f6a08a2c59f055c8ab43 4206 1775136286940029399 diff --git a/.cache/go-build/09/09d403160f8b7c4dd12b143f356de9ef501055ebeae0f8cbd3a14ef53d3274ed-a b/.cache/go-build/09/09d403160f8b7c4dd12b143f356de9ef501055ebeae0f8cbd3a14ef53d3274ed-a deleted file mode 100644 index e7663bd..0000000 --- a/.cache/go-build/09/09d403160f8b7c4dd12b143f356de9ef501055ebeae0f8cbd3a14ef53d3274ed-a +++ /dev/null @@ -1 +0,0 @@ -v1 09d403160f8b7c4dd12b143f356de9ef501055ebeae0f8cbd3a14ef53d3274ed e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287001404103 diff --git a/.cache/go-build/0a/0a0079eba58f5da446252c53ef34ad2c81400a225d700c61a3ca7f59fb176157-a b/.cache/go-build/0a/0a0079eba58f5da446252c53ef34ad2c81400a225d700c61a3ca7f59fb176157-a deleted file mode 100644 index c6119b7..0000000 --- a/.cache/go-build/0a/0a0079eba58f5da446252c53ef34ad2c81400a225d700c61a3ca7f59fb176157-a +++ /dev/null @@ -1 +0,0 @@ -v1 0a0079eba58f5da446252c53ef34ad2c81400a225d700c61a3ca7f59fb176157 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184146114026 diff --git a/.cache/go-build/0a/0a15d307541706f239d6b561482a38faecf81f919a29f4bdaac4e0c0b04b1cf7-a b/.cache/go-build/0a/0a15d307541706f239d6b561482a38faecf81f919a29f4bdaac4e0c0b04b1cf7-a deleted file mode 100644 index 76ce37d..0000000 --- a/.cache/go-build/0a/0a15d307541706f239d6b561482a38faecf81f919a29f4bdaac4e0c0b04b1cf7-a +++ /dev/null @@ -1 +0,0 @@ -v1 0a15d307541706f239d6b561482a38faecf81f919a29f4bdaac4e0c0b04b1cf7 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288813628030 diff --git a/.cache/go-build/0a/0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa-d b/.cache/go-build/0a/0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa-d deleted file mode 100644 index 612b53e..0000000 Binary files a/.cache/go-build/0a/0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa-d and /dev/null differ diff --git a/.cache/go-build/0a/0a385777817f1c31ffb4eba1c70e25f03b9c3abfe28e9f26828b673bf6e7458c-a b/.cache/go-build/0a/0a385777817f1c31ffb4eba1c70e25f03b9c3abfe28e9f26828b673bf6e7458c-a deleted file mode 100644 index 261c473..0000000 --- a/.cache/go-build/0a/0a385777817f1c31ffb4eba1c70e25f03b9c3abfe28e9f26828b673bf6e7458c-a +++ /dev/null @@ -1 +0,0 @@ -v1 0a385777817f1c31ffb4eba1c70e25f03b9c3abfe28e9f26828b673bf6e7458c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289731653456 diff --git a/.cache/go-build/0a/0aac725dd04494e968d47fdff613ca928fd8cbe973ba374bdf81d32464cb55a0-a b/.cache/go-build/0a/0aac725dd04494e968d47fdff613ca928fd8cbe973ba374bdf81d32464cb55a0-a deleted file mode 100644 index c6bade5..0000000 --- a/.cache/go-build/0a/0aac725dd04494e968d47fdff613ca928fd8cbe973ba374bdf81d32464cb55a0-a +++ /dev/null @@ -1 +0,0 @@ -v1 0aac725dd04494e968d47fdff613ca928fd8cbe973ba374bdf81d32464cb55a0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184114167873 diff --git a/.cache/go-build/0a/0af6c119dfb70f4f8fc24e429bb217263807553cf540a0ca1e836aed3d89bccd-d b/.cache/go-build/0a/0af6c119dfb70f4f8fc24e429bb217263807553cf540a0ca1e836aed3d89bccd-d deleted file mode 100644 index 90845d0..0000000 --- a/.cache/go-build/0a/0af6c119dfb70f4f8fc24e429bb217263807553cf540a0ca1e836aed3d89bccd-d +++ /dev/null @@ -1 +0,0 @@ -./app.go diff --git a/.cache/go-build/0b/0b0e5e473d5a4a067943a17d71dd50cbede05251ca7e44402af0e4c897d7b923-a b/.cache/go-build/0b/0b0e5e473d5a4a067943a17d71dd50cbede05251ca7e44402af0e4c897d7b923-a deleted file mode 100644 index 1053928..0000000 --- a/.cache/go-build/0b/0b0e5e473d5a4a067943a17d71dd50cbede05251ca7e44402af0e4c897d7b923-a +++ /dev/null @@ -1 +0,0 @@ -v1 0b0e5e473d5a4a067943a17d71dd50cbede05251ca7e44402af0e4c897d7b923 ad1bfeec2a6874b03a35d51d9475306fadaf9e47528931ba1c662bf9d59c8e65 2472 1775136286826727828 diff --git a/.cache/go-build/0b/0b7d1d02bc4a0b6ebd0873ce8a3e114246d4e3f6ce603b0bccfa6a7900e44086-a b/.cache/go-build/0b/0b7d1d02bc4a0b6ebd0873ce8a3e114246d4e3f6ce603b0bccfa6a7900e44086-a deleted file mode 100644 index 6e35ec8..0000000 --- a/.cache/go-build/0b/0b7d1d02bc4a0b6ebd0873ce8a3e114246d4e3f6ce603b0bccfa6a7900e44086-a +++ /dev/null @@ -1 +0,0 @@ -v1 0b7d1d02bc4a0b6ebd0873ce8a3e114246d4e3f6ce603b0bccfa6a7900e44086 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287241177165 diff --git a/.cache/go-build/0b/0b8b4b5bd5a79553c576fe8ac89542dd905de1d14b8d4294d0adb4a7b0bbc61a-d b/.cache/go-build/0b/0b8b4b5bd5a79553c576fe8ac89542dd905de1d14b8d4294d0adb4a7b0bbc61a-d deleted file mode 100644 index 37f7f5a..0000000 Binary files a/.cache/go-build/0b/0b8b4b5bd5a79553c576fe8ac89542dd905de1d14b8d4294d0adb4a7b0bbc61a-d and /dev/null differ diff --git a/.cache/go-build/0b/0b8db2eaccf5883271240bd878947452b45e123b9edd54a65d988548f04ad64f-a b/.cache/go-build/0b/0b8db2eaccf5883271240bd878947452b45e123b9edd54a65d988548f04ad64f-a deleted file mode 100644 index fa33235..0000000 --- a/.cache/go-build/0b/0b8db2eaccf5883271240bd878947452b45e123b9edd54a65d988548f04ad64f-a +++ /dev/null @@ -1 +0,0 @@ -v1 0b8db2eaccf5883271240bd878947452b45e123b9edd54a65d988548f04ad64f 56995f9c740dc83b28ec992f2e0816149c996156faed15152fa291bc5439370c 80 1775136286969245360 diff --git a/.cache/go-build/0b/0ba6bc616dda3621cc01c4cd185616e5906cdfd7f44d5f966bce7619b69a57e2-d b/.cache/go-build/0b/0ba6bc616dda3621cc01c4cd185616e5906cdfd7f44d5f966bce7619b69a57e2-d deleted file mode 100644 index 6ce3092..0000000 --- a/.cache/go-build/0b/0ba6bc616dda3621cc01c4cd185616e5906cdfd7f44d5f966bce7619b69a57e2-d +++ /dev/null @@ -1,8 +0,0 @@ -./builder.go -./clone.go -./compare.go -./iter.go -./reader.go -./replace.go -./search.go -./strings.go diff --git a/.cache/go-build/0b/0bf38d4b50c0ddb6d18b6bb9dfb35a558a84bfb6068b9e52ccdd382c8c643ffd-d b/.cache/go-build/0b/0bf38d4b50c0ddb6d18b6bb9dfb35a558a84bfb6068b9e52ccdd382c8c643ffd-d deleted file mode 100644 index adf1fc9..0000000 --- a/.cache/go-build/0b/0bf38d4b50c0ddb6d18b6bb9dfb35a558a84bfb6068b9e52ccdd382c8c643ffd-d +++ /dev/null @@ -1,6 +0,0 @@ -./apply_manifest.go -./build.go -./chunk_validation.go -./compare.go -./extract.go -./pipeline_test.go diff --git a/.cache/go-build/0c/0c0d2406829b5192ef4513ac501de781ccf483eb95fb76bfc7b5674a7c1170eb-d b/.cache/go-build/0c/0c0d2406829b5192ef4513ac501de781ccf483eb95fb76bfc7b5674a7c1170eb-d deleted file mode 100644 index 9747531..0000000 --- a/.cache/go-build/0c/0c0d2406829b5192ef4513ac501de781ccf483eb95fb76bfc7b5674a7c1170eb-d +++ /dev/null @@ -1 +0,0 @@ -./hash.go diff --git a/.cache/go-build/0c/0c9fa99bb3f81431ee9ce34aa86369e2cda0906285789b5a983fd38dbc990d83-d b/.cache/go-build/0c/0c9fa99bb3f81431ee9ce34aa86369e2cda0906285789b5a983fd38dbc990d83-d deleted file mode 100644 index a1edfdc..0000000 Binary files a/.cache/go-build/0c/0c9fa99bb3f81431ee9ce34aa86369e2cda0906285789b5a983fd38dbc990d83-d and /dev/null differ diff --git a/.cache/go-build/0c/0ca0665358e7ca645272074e0e42cdc80f75fe4aa7d62ea0ff0d87602330cc60-d b/.cache/go-build/0c/0ca0665358e7ca645272074e0e42cdc80f75fe4aa7d62ea0ff0d87602330cc60-d deleted file mode 100644 index c25885b..0000000 --- a/.cache/go-build/0c/0ca0665358e7ca645272074e0e42cdc80f75fe4aa7d62ea0ff0d87602330cc60-d +++ /dev/null @@ -1,5 +0,0 @@ -./crc32.go -./crc32_amd64.go -./crc32_generic.go -./gen.go -./crc32_amd64.s diff --git a/.cache/go-build/0c/0ca4520be527ca56581aa3731ce3b547d305a643784791f3b365eca652684a95-d b/.cache/go-build/0c/0ca4520be527ca56581aa3731ce3b547d305a643784791f3b365eca652684a95-d deleted file mode 100644 index c764670..0000000 Binary files a/.cache/go-build/0c/0ca4520be527ca56581aa3731ce3b547d305a643784791f3b365eca652684a95-d and /dev/null differ diff --git a/.cache/go-build/0c/0ca70f4bd70d4e4ffbfcf178464c0689d8338c81ffd07d77cc07c974cc3aba93-a b/.cache/go-build/0c/0ca70f4bd70d4e4ffbfcf178464c0689d8338c81ffd07d77cc07c974cc3aba93-a deleted file mode 100644 index b918deb..0000000 --- a/.cache/go-build/0c/0ca70f4bd70d4e4ffbfcf178464c0689d8338c81ffd07d77cc07c974cc3aba93-a +++ /dev/null @@ -1 +0,0 @@ -v1 0ca70f4bd70d4e4ffbfcf178464c0689d8338c81ffd07d77cc07c974cc3aba93 0bf38d4b50c0ddb6d18b6bb9dfb35a558a84bfb6068b9e52ccdd382c8c643ffd 98 1775138184115912234 diff --git a/.cache/go-build/0c/0cb39880e744ca9cc46da86f513750cf0b891f4a5f00a1ac0a6ba26085bafb2f-a b/.cache/go-build/0c/0cb39880e744ca9cc46da86f513750cf0b891f4a5f00a1ac0a6ba26085bafb2f-a deleted file mode 100644 index cdb9198..0000000 --- a/.cache/go-build/0c/0cb39880e744ca9cc46da86f513750cf0b891f4a5f00a1ac0a6ba26085bafb2f-a +++ /dev/null @@ -1 +0,0 @@ -v1 0cb39880e744ca9cc46da86f513750cf0b891f4a5f00a1ac0a6ba26085bafb2f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289799338225 diff --git a/.cache/go-build/0c/0cbc6335bcd53c5d8a7dd3ade4604ebd8d08621213615b898c0c3da3ed2b2b49-a b/.cache/go-build/0c/0cbc6335bcd53c5d8a7dd3ade4604ebd8d08621213615b898c0c3da3ed2b2b49-a deleted file mode 100644 index 18f1a8d..0000000 --- a/.cache/go-build/0c/0cbc6335bcd53c5d8a7dd3ade4604ebd8d08621213615b898c0c3da3ed2b2b49-a +++ /dev/null @@ -1 +0,0 @@ -v1 0cbc6335bcd53c5d8a7dd3ade4604ebd8d08621213615b898c0c3da3ed2b2b49 e183e520898797ffac608954a715601882a93c2c8141d21cee36eabd5202237e 198 1775136286965633258 diff --git a/.cache/go-build/0c/0cc4f2a62b729d8465f901530872ba8106ce1712ee655d49426d71d1991733a5-d b/.cache/go-build/0c/0cc4f2a62b729d8465f901530872ba8106ce1712ee655d49426d71d1991733a5-d deleted file mode 100644 index 7228782..0000000 --- a/.cache/go-build/0c/0cc4f2a62b729d8465f901530872ba8106ce1712ee655d49426d71d1991733a5-d +++ /dev/null @@ -1,288 +0,0 @@ -# test log -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildThenExtract3168771211/001/src -stat /tmp/TestBuildThenExtract3168771211/001 -stat /tmp/TestBuildThenExtract3168771211/001/assets -stat /tmp/TestBuildThenExtract3168771211/001 -stat /tmp/TestBuildThenExtract3168771211/001/build -stat /tmp/TestBuildThenExtract3168771211/001 -open /tmp/TestBuildThenExtract3168771211/001/nwn-tool.json -stat /tmp/TestBuildThenExtract3168771211/001/src/module -stat /tmp/TestBuildThenExtract3168771211/001/src -open /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract3168771211/001/nwn-tool.json -stat /tmp/TestBuildThenExtract3168771211/001/src -stat /tmp/TestBuildThenExtract3168771211/001/assets -stat /tmp/TestBuildThenExtract3168771211/001/build -stat /tmp/TestBuildThenExtract3168771211/001/src -open /tmp/TestBuildThenExtract3168771211/001/src -open /tmp/TestBuildThenExtract3168771211/001/src/module -stat /tmp/TestBuildThenExtract3168771211/001/assets -open /tmp/TestBuildThenExtract3168771211/001/assets -open /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract3168771211/001/build/testmod.mod -open /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract3168771211/001/build/haks.json -stat /tmp/TestBuildThenExtract3168771211/001/build -open /tmp/TestBuildThenExtract3168771211/001/build -stat /tmp/TestBuildThenExtract3168771211/001/src -open /tmp/TestBuildThenExtract3168771211/001/src -open /tmp/TestBuildThenExtract3168771211/001/src/module -stat /tmp/TestBuildThenExtract3168771211/001/assets -open /tmp/TestBuildThenExtract3168771211/001/assets -open /tmp/TestBuildThenExtract3168771211/001/build/testmod.mod -stat /tmp/TestBuildThenExtract3168771211/001/src/module -open /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract3168771211/001/build -open /tmp/TestBuildThenExtract3168771211/001/build -stat /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract3168771211/001/src -open /tmp/TestBuildThenExtract3168771211/001/src -open /tmp/TestBuildThenExtract3168771211/001/src/module -stat /tmp/TestBuildThenExtract3168771211/001/assets -open /tmp/TestBuildThenExtract3168771211/001/assets -open /tmp/TestBuildThenExtract3168771211/001/build/testmod.mod -open /tmp/TestBuildThenExtract3168771211/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestExtractReadsHAKAssets2804807044/001/src -stat /tmp/TestExtractReadsHAKAssets2804807044/001 -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets -stat /tmp/TestExtractReadsHAKAssets2804807044/001 -stat /tmp/TestExtractReadsHAKAssets2804807044/001/build -stat /tmp/TestExtractReadsHAKAssets2804807044/001 -open /tmp/TestExtractReadsHAKAssets2804807044/001/nwn-tool.json -open /tmp/TestExtractReadsHAKAssets2804807044/001/nwn-tool.json -stat /tmp/TestExtractReadsHAKAssets2804807044/001/build -stat /tmp/TestExtractReadsHAKAssets2804807044/001/src -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets -stat /tmp/TestExtractReadsHAKAssets2804807044/001/src -open /tmp/TestExtractReadsHAKAssets2804807044/001/src -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets -open /tmp/TestExtractReadsHAKAssets2804807044/001/assets -open /tmp/TestExtractReadsHAKAssets2804807044/001/build/testmod.mod -open /tmp/TestExtractReadsHAKAssets2804807044/001/build/vfx.hak -open /tmp/TestExtractReadsHAKAssets2804807044/001/build/testmod.mod -stat /tmp/TestExtractReadsHAKAssets2804807044/001/build -open /tmp/TestExtractReadsHAKAssets2804807044/001/build -open /tmp/TestExtractReadsHAKAssets2804807044/001/build/vfx.hak -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets/plt -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets -open /tmp/TestExtractReadsHAKAssets2804807044/001/assets/plt/test_icon.plt -open /tmp/TestExtractReadsHAKAssets2804807044/001/assets/plt/test_icon.plt -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets/mdl -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets -open /tmp/TestExtractReadsHAKAssets2804807044/001/assets/mdl/test_vfx.mdl -open /tmp/TestExtractReadsHAKAssets2804807044/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets2804807044/001/assets/plt/test_icon.plt -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001 -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets/core -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001 -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001 -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets/core -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/core_01.hak -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/core_01.hak -stat /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs626257248/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/core -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/vfx -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001 -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/nwn-tool.json -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/nwn-tool.json -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/core -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/vfx -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build/haks.json -stat /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build/core.hak -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build/vfx.hak -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build/haks.json -open /tmp/TestBuildOrdersMultipleHAKGroups1438405147/001/build/haks.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/core -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/vfx -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001 -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/nwn-tool.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/nwn-tool.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/core -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/vfx -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/core_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/core_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/vfx_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/core_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/core_02.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/vfx_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically4147464344/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/core -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/vfx -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001 -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/nwn-tool.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/nwn-tool.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/core -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/vfx -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build/haks.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build/core.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build/vfx.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build/haks.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder104009154/001/build/haks.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/src -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001 -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/a -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001 -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/b -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/build -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001 -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/nwn-tool.json -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/a/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/b/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/nwn-tool.json -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/src -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/build -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/src -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/src -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/a -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/b -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/a/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/assets/core/b/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/build/haks.json -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/build -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK3662881195/001/build -open /tmp diff --git a/.cache/go-build/0c/0ce1b1d60f8a08833d55ed93fc8ee8fb07397702e6958b03f6f4ba7b55cc006d-d b/.cache/go-build/0c/0ce1b1d60f8a08833d55ed93fc8ee8fb07397702e6958b03f6f4ba7b55cc006d-d deleted file mode 100644 index 1d84fe4..0000000 --- a/.cache/go-build/0c/0ce1b1d60f8a08833d55ed93fc8ee8fb07397702e6958b03f6f4ba7b55cc006d-d +++ /dev/null @@ -1 +0,0 @@ -./table.go diff --git a/.cache/go-build/0c/0ceedf98546a396fdd29f9cae0027132f660bc66c3ea0d2a8607f6fbd8465af3-a b/.cache/go-build/0c/0ceedf98546a396fdd29f9cae0027132f660bc66c3ea0d2a8607f6fbd8465af3-a deleted file mode 100644 index eb61f89..0000000 --- a/.cache/go-build/0c/0ceedf98546a396fdd29f9cae0027132f660bc66c3ea0d2a8607f6fbd8465af3-a +++ /dev/null @@ -1 +0,0 @@ -v1 0ceedf98546a396fdd29f9cae0027132f660bc66c3ea0d2a8607f6fbd8465af3 c1eb3a2cfcbb59c3d72fb80010f1fa45dbe6fca1aa8782e29e0df409421fc070 10 1775136289055153792 diff --git a/.cache/go-build/0d/0d195f1e966b6068bde57be5aca4501879d9dd3af61471366daa56d86cbf884c-d b/.cache/go-build/0d/0d195f1e966b6068bde57be5aca4501879d9dd3af61471366daa56d86cbf884c-d deleted file mode 100644 index f4c2496..0000000 --- a/.cache/go-build/0d/0d195f1e966b6068bde57be5aca4501879d9dd3af61471366daa56d86cbf884c-d +++ /dev/null @@ -1,2 +0,0 @@ -./validator.go -./validator_test.go diff --git a/.cache/go-build/0d/0d36037fc34ae34afb52ed484f7acfee6ba84496d4ad15031ca02c3d9499f0d5-a b/.cache/go-build/0d/0d36037fc34ae34afb52ed484f7acfee6ba84496d4ad15031ca02c3d9499f0d5-a deleted file mode 100644 index bcd4118..0000000 --- a/.cache/go-build/0d/0d36037fc34ae34afb52ed484f7acfee6ba84496d4ad15031ca02c3d9499f0d5-a +++ /dev/null @@ -1 +0,0 @@ -v1 0d36037fc34ae34afb52ed484f7acfee6ba84496d4ad15031ca02c3d9499f0d5 9457597923e2b6b25e805a727d646192e1ccded92f3942e79b759e168350f372 4119 1775136286839530818 diff --git a/.cache/go-build/0d/0d65705a2f31a082961fb4fcdc604ca8b81d59693e766cff82cc5e84f558e73c-a b/.cache/go-build/0d/0d65705a2f31a082961fb4fcdc604ca8b81d59693e766cff82cc5e84f558e73c-a deleted file mode 100644 index f10606a..0000000 --- a/.cache/go-build/0d/0d65705a2f31a082961fb4fcdc604ca8b81d59693e766cff82cc5e84f558e73c-a +++ /dev/null @@ -1 +0,0 @@ -v1 0d65705a2f31a082961fb4fcdc604ca8b81d59693e766cff82cc5e84f558e73c dee90644e81503145a85419a3ee990c85110ea1a021b7f70bc962047b6bca985 44638 1775136365503567362 diff --git a/.cache/go-build/0d/0d710c62d52852122beead187f544ce65e61c7c8dcc02cde8d1c3692745b9029-a b/.cache/go-build/0d/0d710c62d52852122beead187f544ce65e61c7c8dcc02cde8d1c3692745b9029-a deleted file mode 100644 index 57fe3e9..0000000 --- a/.cache/go-build/0d/0d710c62d52852122beead187f544ce65e61c7c8dcc02cde8d1c3692745b9029-a +++ /dev/null @@ -1 +0,0 @@ -v1 0d710c62d52852122beead187f544ce65e61c7c8dcc02cde8d1c3692745b9029 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775136289847780949 diff --git a/.cache/go-build/0d/0d84a6af3940152c2cbb29a037b454cccf6a1e5329fa5f585c1a37571cde3cda-a b/.cache/go-build/0d/0d84a6af3940152c2cbb29a037b454cccf6a1e5329fa5f585c1a37571cde3cda-a deleted file mode 100644 index 418339d..0000000 --- a/.cache/go-build/0d/0d84a6af3940152c2cbb29a037b454cccf6a1e5329fa5f585c1a37571cde3cda-a +++ /dev/null @@ -1 +0,0 @@ -v1 0d84a6af3940152c2cbb29a037b454cccf6a1e5329fa5f585c1a37571cde3cda 7dc0d5503367e1f9bb024f6aec20f91a53dd4be8c644756e5334c97501aba37b 5252 1775136286826144628 diff --git a/.cache/go-build/0d/0db422adf9b0eb0f64887c1423f4efbbc0c9047ae6fcab18764d0138d92722a4-d b/.cache/go-build/0d/0db422adf9b0eb0f64887c1423f4efbbc0c9047ae6fcab18764d0138d92722a4-d deleted file mode 100644 index 96a95c4..0000000 Binary files a/.cache/go-build/0d/0db422adf9b0eb0f64887c1423f4efbbc0c9047ae6fcab18764d0138d92722a4-d and /dev/null differ diff --git a/.cache/go-build/0d/0dcd131cd9d1e1ec97b01a4e1842d14bb7c0290dd7cc8cb1f0c792bd99a84f22-a b/.cache/go-build/0d/0dcd131cd9d1e1ec97b01a4e1842d14bb7c0290dd7cc8cb1f0c792bd99a84f22-a deleted file mode 100644 index ca6fa68..0000000 --- a/.cache/go-build/0d/0dcd131cd9d1e1ec97b01a4e1842d14bb7c0290dd7cc8cb1f0c792bd99a84f22-a +++ /dev/null @@ -1 +0,0 @@ -v1 0dcd131cd9d1e1ec97b01a4e1842d14bb7c0290dd7cc8cb1f0c792bd99a84f22 6c604a3a11818aac2bb62d081840540d12a7057a91bfc24688357b9b7537890a 2721 1775136286945803614 diff --git a/.cache/go-build/0d/0de0699177f9dc387bc47f52a136769486c93dadeaad8dc2c74706fcbf30cae6-a b/.cache/go-build/0d/0de0699177f9dc387bc47f52a136769486c93dadeaad8dc2c74706fcbf30cae6-a deleted file mode 100644 index 17fdaea..0000000 --- a/.cache/go-build/0d/0de0699177f9dc387bc47f52a136769486c93dadeaad8dc2c74706fcbf30cae6-a +++ /dev/null @@ -1 +0,0 @@ -v1 0de0699177f9dc387bc47f52a136769486c93dadeaad8dc2c74706fcbf30cae6 a1ae7a67c6830981ced27b68132025d94bf38bd8e3ffe18d14fcbf88f1031388 67 1775136289277656931 diff --git a/.cache/go-build/0e/0e62a8010aab7f77666b9a4bed3b9eebbc161e8c6b781447eba7ee1484a63b01-d b/.cache/go-build/0e/0e62a8010aab7f77666b9a4bed3b9eebbc161e8c6b781447eba7ee1484a63b01-d deleted file mode 100644 index f2d48c9..0000000 Binary files a/.cache/go-build/0e/0e62a8010aab7f77666b9a4bed3b9eebbc161e8c6b781447eba7ee1484a63b01-d and /dev/null differ diff --git a/.cache/go-build/0e/0ea7545fe5587d2571bbc7999111e119d9bf538a0d547904aba54bc4a23daa79-a b/.cache/go-build/0e/0ea7545fe5587d2571bbc7999111e119d9bf538a0d547904aba54bc4a23daa79-a deleted file mode 100644 index 9177e38..0000000 --- a/.cache/go-build/0e/0ea7545fe5587d2571bbc7999111e119d9bf538a0d547904aba54bc4a23daa79-a +++ /dev/null @@ -1 +0,0 @@ -v1 0ea7545fe5587d2571bbc7999111e119d9bf538a0d547904aba54bc4a23daa79 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286958621243 diff --git a/.cache/go-build/0e/0ec63109e343eea06ad50e28c1acb83ae4d5a90b0457c648e07f4a8eaed5aa0b-d b/.cache/go-build/0e/0ec63109e343eea06ad50e28c1acb83ae4d5a90b0457c648e07f4a8eaed5aa0b-d deleted file mode 100644 index f3dc832..0000000 Binary files a/.cache/go-build/0e/0ec63109e343eea06ad50e28c1acb83ae4d5a90b0457c648e07f4a8eaed5aa0b-d and /dev/null differ diff --git a/.cache/go-build/0f/0f042ae694b61a575edf31a919ea4e5d4b6bd74a6e72039a930412c57a1263f9-d b/.cache/go-build/0f/0f042ae694b61a575edf31a919ea4e5d4b6bd74a6e72039a930412c57a1263f9-d deleted file mode 100644 index 990e66e..0000000 Binary files a/.cache/go-build/0f/0f042ae694b61a575edf31a919ea4e5d4b6bd74a6e72039a930412c57a1263f9-d and /dev/null differ diff --git a/.cache/go-build/0f/0f32a414bbd49d1c74d5927cbfa8754debbef99a3f54b97bead95ced8590aafc-a b/.cache/go-build/0f/0f32a414bbd49d1c74d5927cbfa8754debbef99a3f54b97bead95ced8590aafc-a deleted file mode 100644 index f7bbd05..0000000 --- a/.cache/go-build/0f/0f32a414bbd49d1c74d5927cbfa8754debbef99a3f54b97bead95ced8590aafc-a +++ /dev/null @@ -1 +0,0 @@ -v1 0f32a414bbd49d1c74d5927cbfa8754debbef99a3f54b97bead95ced8590aafc e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288409426030 diff --git a/.cache/go-build/0f/0f3caa3d1ee77b9490462af9d05d991efefe35c07eca12b1d49f2b85664ca712-d b/.cache/go-build/0f/0f3caa3d1ee77b9490462af9d05d991efefe35c07eca12b1d49f2b85664ca712-d deleted file mode 100644 index 84c15e4..0000000 Binary files a/.cache/go-build/0f/0f3caa3d1ee77b9490462af9d05d991efefe35c07eca12b1d49f2b85664ca712-d and /dev/null differ diff --git a/.cache/go-build/0f/0f3d1070dd8249af2e2fed5faf86c6c5eeaf5ca6c5096e94ade71c9d15e26605-a b/.cache/go-build/0f/0f3d1070dd8249af2e2fed5faf86c6c5eeaf5ca6c5096e94ade71c9d15e26605-a deleted file mode 100644 index 2f5be6f..0000000 --- a/.cache/go-build/0f/0f3d1070dd8249af2e2fed5faf86c6c5eeaf5ca6c5096e94ade71c9d15e26605-a +++ /dev/null @@ -1 +0,0 @@ -v1 0f3d1070dd8249af2e2fed5faf86c6c5eeaf5ca6c5096e94ade71c9d15e26605 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289148161399 diff --git a/.cache/go-build/0f/0f4a24d6b478529be392fc2ee9ca24d474d2b5ef94cd23fd70fe0df40d382b89-d b/.cache/go-build/0f/0f4a24d6b478529be392fc2ee9ca24d474d2b5ef94cd23fd70fe0df40d382b89-d deleted file mode 100644 index fc93994..0000000 Binary files a/.cache/go-build/0f/0f4a24d6b478529be392fc2ee9ca24d474d2b5ef94cd23fd70fe0df40d382b89-d and /dev/null differ diff --git a/.cache/go-build/0f/0f57dbda1867ab405271f7a2b18db01bffe943f8f007122f0f9f13f5e7615bb6-d b/.cache/go-build/0f/0f57dbda1867ab405271f7a2b18db01bffe943f8f007122f0f9f13f5e7615bb6-d deleted file mode 100644 index 4eeb9b6..0000000 --- a/.cache/go-build/0f/0f57dbda1867ab405271f7a2b18db01bffe943f8f007122f0f9f13f5e7615bb6-d +++ /dev/null @@ -1,2 +0,0 @@ -./exit.go -./log.go diff --git a/.cache/go-build/0f/0f66f56e86d321ce6d74b5df378185d68bf31b3d22d1b4c9188992fca32c97a4-a b/.cache/go-build/0f/0f66f56e86d321ce6d74b5df378185d68bf31b3d22d1b4c9188992fca32c97a4-a deleted file mode 100644 index 69b7a02..0000000 --- a/.cache/go-build/0f/0f66f56e86d321ce6d74b5df378185d68bf31b3d22d1b4c9188992fca32c97a4-a +++ /dev/null @@ -1 +0,0 @@ -v1 0f66f56e86d321ce6d74b5df378185d68bf31b3d22d1b4c9188992fca32c97a4 255f83943988313d0c19a84eb19e066e962b3d56903b2215da3eb5041325decb 191172 1775136289339983976 diff --git a/.cache/go-build/0f/0f68ef554d316771a31e401a740ca6f0fd7f539f0e5fc41de586869dd96ac13f-a b/.cache/go-build/0f/0f68ef554d316771a31e401a740ca6f0fd7f539f0e5fc41de586869dd96ac13f-a deleted file mode 100644 index c9201e3..0000000 --- a/.cache/go-build/0f/0f68ef554d316771a31e401a740ca6f0fd7f539f0e5fc41de586869dd96ac13f-a +++ /dev/null @@ -1 +0,0 @@ -v1 0f68ef554d316771a31e401a740ca6f0fd7f539f0e5fc41de586869dd96ac13f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288989589515 diff --git a/.cache/go-build/0f/0fa535e6ed53290ea20e4abd94ae7765aed86eb9288ef7cc7a04f987fb09fc99-a b/.cache/go-build/0f/0fa535e6ed53290ea20e4abd94ae7765aed86eb9288ef7cc7a04f987fb09fc99-a deleted file mode 100644 index b3f76fa..0000000 --- a/.cache/go-build/0f/0fa535e6ed53290ea20e4abd94ae7765aed86eb9288ef7cc7a04f987fb09fc99-a +++ /dev/null @@ -1 +0,0 @@ -v1 0fa535e6ed53290ea20e4abd94ae7765aed86eb9288ef7cc7a04f987fb09fc99 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286981876389 diff --git a/.cache/go-build/0f/0fbc9106a86131b92dbaeee01200b8bb320bdcf6ed6d0ed8344171ae3d194fe4-a b/.cache/go-build/0f/0fbc9106a86131b92dbaeee01200b8bb320bdcf6ed6d0ed8344171ae3d194fe4-a deleted file mode 100644 index 715207c..0000000 --- a/.cache/go-build/0f/0fbc9106a86131b92dbaeee01200b8bb320bdcf6ed6d0ed8344171ae3d194fe4-a +++ /dev/null @@ -1 +0,0 @@ -v1 0fbc9106a86131b92dbaeee01200b8bb320bdcf6ed6d0ed8344171ae3d194fe4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286924764479 diff --git a/.cache/go-build/0f/0ffee49cdd6b1079f517f89c00a77455244421b627a47ab93c67e803c3c3bcc2-a b/.cache/go-build/0f/0ffee49cdd6b1079f517f89c00a77455244421b627a47ab93c67e803c3c3bcc2-a deleted file mode 100644 index 10b7666..0000000 --- a/.cache/go-build/0f/0ffee49cdd6b1079f517f89c00a77455244421b627a47ab93c67e803c3c3bcc2-a +++ /dev/null @@ -1 +0,0 @@ -v1 0ffee49cdd6b1079f517f89c00a77455244421b627a47ab93c67e803c3c3bcc2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289740965643 diff --git a/.cache/go-build/10/10a6edbf25945293f192a62a026f23160d410e9fa724ab397af51aa640701ea2-d b/.cache/go-build/10/10a6edbf25945293f192a62a026f23160d410e9fa724ab397af51aa640701ea2-d deleted file mode 100644 index 20a5017..0000000 Binary files a/.cache/go-build/10/10a6edbf25945293f192a62a026f23160d410e9fa724ab397af51aa640701ea2-d and /dev/null differ diff --git a/.cache/go-build/10/10b2766ad3d487000ea1d7ebcffaf6017ff96e49e808c24b99634a8ae6c6db58-a b/.cache/go-build/10/10b2766ad3d487000ea1d7ebcffaf6017ff96e49e808c24b99634a8ae6c6db58-a deleted file mode 100644 index e3172c9..0000000 --- a/.cache/go-build/10/10b2766ad3d487000ea1d7ebcffaf6017ff96e49e808c24b99634a8ae6c6db58-a +++ /dev/null @@ -1 +0,0 @@ -v1 10b2766ad3d487000ea1d7ebcffaf6017ff96e49e808c24b99634a8ae6c6db58 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289377236273 diff --git a/.cache/go-build/10/10d04c804b514778aeeca42aee659174ed62d243b31164be8073a45d7571b0a9-a b/.cache/go-build/10/10d04c804b514778aeeca42aee659174ed62d243b31164be8073a45d7571b0a9-a deleted file mode 100644 index 8af300e..0000000 --- a/.cache/go-build/10/10d04c804b514778aeeca42aee659174ed62d243b31164be8073a45d7571b0a9-a +++ /dev/null @@ -1 +0,0 @@ -v1 10d04c804b514778aeeca42aee659174ed62d243b31164be8073a45d7571b0a9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184203604367 diff --git a/.cache/go-build/10/10d5ff49718ee96f10274f5a5a056c002c4b3a336e1672064567aba1099ec815-a b/.cache/go-build/10/10d5ff49718ee96f10274f5a5a056c002c4b3a336e1672064567aba1099ec815-a deleted file mode 100644 index eb6e544..0000000 --- a/.cache/go-build/10/10d5ff49718ee96f10274f5a5a056c002c4b3a336e1672064567aba1099ec815-a +++ /dev/null @@ -1 +0,0 @@ -v1 10d5ff49718ee96f10274f5a5a056c002c4b3a336e1672064567aba1099ec815 12d8ce9cfb87ff7bc28d8eef123113a2984a14c6b224ba0cb49f79a61ad49f53 39424 1775136286963192326 diff --git a/.cache/go-build/11/111733fd5e75a9e33c6305a02a8024690e038f13226e83835a4efa14cb4aae9d-d b/.cache/go-build/11/111733fd5e75a9e33c6305a02a8024690e038f13226e83835a4efa14cb4aae9d-d deleted file mode 100644 index e2464a2..0000000 Binary files a/.cache/go-build/11/111733fd5e75a9e33c6305a02a8024690e038f13226e83835a4efa14cb4aae9d-d and /dev/null differ diff --git a/.cache/go-build/11/11d979d517dc2e2823445c6ee7e75dc05393385d0d9d960124d2e9482334cf27-d b/.cache/go-build/11/11d979d517dc2e2823445c6ee7e75dc05393385d0d9d960124d2e9482334cf27-d deleted file mode 100644 index e8173e9..0000000 Binary files a/.cache/go-build/11/11d979d517dc2e2823445c6ee7e75dc05393385d0d9d960124d2e9482334cf27-d and /dev/null differ diff --git a/.cache/go-build/11/11dff7ace586f545130516f3eaa86cbcbdc5f017ea6c142c38dec0383c1cec5b-d b/.cache/go-build/11/11dff7ace586f545130516f3eaa86cbcbdc5f017ea6c142c38dec0383c1cec5b-d deleted file mode 100644 index 5a2a5ce..0000000 Binary files a/.cache/go-build/11/11dff7ace586f545130516f3eaa86cbcbdc5f017ea6c142c38dec0383c1cec5b-d and /dev/null differ diff --git a/.cache/go-build/11/11eec1146ebb81ba5c79a2292664c1fe618bc28b1ff74e8b3995c60c52b2d59d-a b/.cache/go-build/11/11eec1146ebb81ba5c79a2292664c1fe618bc28b1ff74e8b3995c60c52b2d59d-a deleted file mode 100644 index 53c7967..0000000 --- a/.cache/go-build/11/11eec1146ebb81ba5c79a2292664c1fe618bc28b1ff74e8b3995c60c52b2d59d-a +++ /dev/null @@ -1 +0,0 @@ -v1 11eec1146ebb81ba5c79a2292664c1fe618bc28b1ff74e8b3995c60c52b2d59d 6713882c19c16fb4920ef951b97a752ba9c06dd26529b6aee521da945a8e23af 30 1775136288781031626 diff --git a/.cache/go-build/12/1206af34b8f7b71ee1c104391ca0a485edd09ff5822ccb851bf36d81849cd9f0-a b/.cache/go-build/12/1206af34b8f7b71ee1c104391ca0a485edd09ff5822ccb851bf36d81849cd9f0-a deleted file mode 100644 index f5f5faa..0000000 --- a/.cache/go-build/12/1206af34b8f7b71ee1c104391ca0a485edd09ff5822ccb851bf36d81849cd9f0-a +++ /dev/null @@ -1 +0,0 @@ -v1 1206af34b8f7b71ee1c104391ca0a485edd09ff5822ccb851bf36d81849cd9f0 a50477db0fec6f281ae1e8cdeee0ad496146d54f9ad9b1fbb7b0e7dab2dc401c 136018 1775139398434807412 diff --git a/.cache/go-build/12/122e4af314b9fdec6961f1922c190501d0c730d041c33a2847bd4bbf171d7bab-a b/.cache/go-build/12/122e4af314b9fdec6961f1922c190501d0c730d041c33a2847bd4bbf171d7bab-a deleted file mode 100644 index 3ea0d2b..0000000 --- a/.cache/go-build/12/122e4af314b9fdec6961f1922c190501d0c730d041c33a2847bd4bbf171d7bab-a +++ /dev/null @@ -1 +0,0 @@ -v1 122e4af314b9fdec6961f1922c190501d0c730d041c33a2847bd4bbf171d7bab e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287052994690 diff --git a/.cache/go-build/12/122ebd2927d3e4f415db191e807cd671b12e79c21e218407c33725a29d69a560-a b/.cache/go-build/12/122ebd2927d3e4f415db191e807cd671b12e79c21e218407c33725a29d69a560-a deleted file mode 100644 index 9e5fc5b..0000000 --- a/.cache/go-build/12/122ebd2927d3e4f415db191e807cd671b12e79c21e218407c33725a29d69a560-a +++ /dev/null @@ -1 +0,0 @@ -v1 122ebd2927d3e4f415db191e807cd671b12e79c21e218407c33725a29d69a560 8121dfa68d928988536b28502f77e57bfbe0d36213150a77a6c9a6b45784954b 33 1775136289587698823 diff --git a/.cache/go-build/12/128414c83eaa2ffbcf644d4227804d66f76c012e192d5ad90a922b82a50baeca-d b/.cache/go-build/12/128414c83eaa2ffbcf644d4227804d66f76c012e192d5ad90a922b82a50baeca-d deleted file mode 100644 index f12350c..0000000 Binary files a/.cache/go-build/12/128414c83eaa2ffbcf644d4227804d66f76c012e192d5ad90a922b82a50baeca-d and /dev/null differ diff --git a/.cache/go-build/12/12d8ce9cfb87ff7bc28d8eef123113a2984a14c6b224ba0cb49f79a61ad49f53-d b/.cache/go-build/12/12d8ce9cfb87ff7bc28d8eef123113a2984a14c6b224ba0cb49f79a61ad49f53-d deleted file mode 100644 index d3033bf..0000000 Binary files a/.cache/go-build/12/12d8ce9cfb87ff7bc28d8eef123113a2984a14c6b224ba0cb49f79a61ad49f53-d and /dev/null differ diff --git a/.cache/go-build/13/130f87cd43846611ca60a4c7913da8ec0d8d64308a663976b8e967131630b6a3-a b/.cache/go-build/13/130f87cd43846611ca60a4c7913da8ec0d8d64308a663976b8e967131630b6a3-a deleted file mode 100644 index f6a59f4..0000000 --- a/.cache/go-build/13/130f87cd43846611ca60a4c7913da8ec0d8d64308a663976b8e967131630b6a3-a +++ /dev/null @@ -1 +0,0 @@ -v1 130f87cd43846611ca60a4c7913da8ec0d8d64308a663976b8e967131630b6a3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289740904793 diff --git a/.cache/go-build/13/132f05341bf64f480c4028f75f54882ac9df66713cd5c6ed2b4cb38c2b3c7ebf-d b/.cache/go-build/13/132f05341bf64f480c4028f75f54882ac9df66713cd5c6ed2b4cb38c2b3c7ebf-d deleted file mode 100644 index 6c83319..0000000 Binary files a/.cache/go-build/13/132f05341bf64f480c4028f75f54882ac9df66713cd5c6ed2b4cb38c2b3c7ebf-d and /dev/null differ diff --git a/.cache/go-build/13/1372cb4290b4b97d2c1c696aff0e09e1b55241dde44872e05498f3e95ae97927-a b/.cache/go-build/13/1372cb4290b4b97d2c1c696aff0e09e1b55241dde44872e05498f3e95ae97927-a deleted file mode 100644 index e6c3bca..0000000 --- a/.cache/go-build/13/1372cb4290b4b97d2c1c696aff0e09e1b55241dde44872e05498f3e95ae97927-a +++ /dev/null @@ -1 +0,0 @@ -v1 1372cb4290b4b97d2c1c696aff0e09e1b55241dde44872e05498f3e95ae97927 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184176090357 diff --git a/.cache/go-build/13/13bf772f284492f5007b5a0d394dd446b04a192f642866177ef43e368b36c90b-d b/.cache/go-build/13/13bf772f284492f5007b5a0d394dd446b04a192f642866177ef43e368b36c90b-d deleted file mode 100644 index 5cde47b..0000000 Binary files a/.cache/go-build/13/13bf772f284492f5007b5a0d394dd446b04a192f642866177ef43e368b36c90b-d and /dev/null differ diff --git a/.cache/go-build/14/1407a1a494f9ed3f0bc10635e652a9cdbca1da2d1040f187f71dc99c9186b5f0-a b/.cache/go-build/14/1407a1a494f9ed3f0bc10635e652a9cdbca1da2d1040f187f71dc99c9186b5f0-a deleted file mode 100644 index 67dbbfe..0000000 --- a/.cache/go-build/14/1407a1a494f9ed3f0bc10635e652a9cdbca1da2d1040f187f71dc99c9186b5f0-a +++ /dev/null @@ -1 +0,0 @@ -v1 1407a1a494f9ed3f0bc10635e652a9cdbca1da2d1040f187f71dc99c9186b5f0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288630670389 diff --git a/.cache/go-build/14/144d82c3d09c996e5c7d3584eda91b7d7ee18a8d22fa31626c830c60d7c32c50-a b/.cache/go-build/14/144d82c3d09c996e5c7d3584eda91b7d7ee18a8d22fa31626c830c60d7c32c50-a deleted file mode 100644 index e8a68fa..0000000 --- a/.cache/go-build/14/144d82c3d09c996e5c7d3584eda91b7d7ee18a8d22fa31626c830c60d7c32c50-a +++ /dev/null @@ -1 +0,0 @@ -v1 144d82c3d09c996e5c7d3584eda91b7d7ee18a8d22fa31626c830c60d7c32c50 691ef5801437bd0dcbe2338e0b1a77bf987b907b8f1cb83d85af6c360478dae2 2190 1775136286812578268 diff --git a/.cache/go-build/15/1579ddce15a908107b013f067d9496266480a9bc176da3f4e50dd3403bd2be44-d b/.cache/go-build/15/1579ddce15a908107b013f067d9496266480a9bc176da3f4e50dd3403bd2be44-d deleted file mode 100644 index 2fc0188..0000000 --- a/.cache/go-build/15/1579ddce15a908107b013f067d9496266480a9bc176da3f4e50dd3403bd2be44-d +++ /dev/null @@ -1,259 +0,0 @@ -# test log -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildThenExtract4100871842/001/src -stat /tmp/TestBuildThenExtract4100871842/001 -stat /tmp/TestBuildThenExtract4100871842/001/assets -stat /tmp/TestBuildThenExtract4100871842/001 -stat /tmp/TestBuildThenExtract4100871842/001/build -stat /tmp/TestBuildThenExtract4100871842/001 -open /tmp/TestBuildThenExtract4100871842/001/nwn-tool.json -stat /tmp/TestBuildThenExtract4100871842/001/src/module -stat /tmp/TestBuildThenExtract4100871842/001/src -open /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4100871842/001/nwn-tool.json -stat /tmp/TestBuildThenExtract4100871842/001/build -stat /tmp/TestBuildThenExtract4100871842/001/src -stat /tmp/TestBuildThenExtract4100871842/001/assets -stat /tmp/TestBuildThenExtract4100871842/001/src -open /tmp/TestBuildThenExtract4100871842/001/src -open /tmp/TestBuildThenExtract4100871842/001/src/module -stat /tmp/TestBuildThenExtract4100871842/001/assets -open /tmp/TestBuildThenExtract4100871842/001/assets -open /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4100871842/001/build/testmod.mod -open /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4100871842/001/build/haks.json -stat /tmp/TestBuildThenExtract4100871842/001/build -open /tmp/TestBuildThenExtract4100871842/001/build -stat /tmp/TestBuildThenExtract4100871842/001/src -open /tmp/TestBuildThenExtract4100871842/001/src -open /tmp/TestBuildThenExtract4100871842/001/src/module -stat /tmp/TestBuildThenExtract4100871842/001/assets -open /tmp/TestBuildThenExtract4100871842/001/assets -open /tmp/TestBuildThenExtract4100871842/001/build/testmod.mod -stat /tmp/TestBuildThenExtract4100871842/001/src/module -open /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract4100871842/001/build -open /tmp/TestBuildThenExtract4100871842/001/build -stat /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract4100871842/001/src -open /tmp/TestBuildThenExtract4100871842/001/src -open /tmp/TestBuildThenExtract4100871842/001/src/module -stat /tmp/TestBuildThenExtract4100871842/001/assets -open /tmp/TestBuildThenExtract4100871842/001/assets -open /tmp/TestBuildThenExtract4100871842/001/build/testmod.mod -open /tmp/TestBuildThenExtract4100871842/001/build/haks.json -stat /tmp/TestBuildThenExtract4100871842/001/build -open /tmp/TestBuildThenExtract4100871842/001/build -open /tmp/TestBuildThenExtract4100871842/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestExtractReadsHAKAssets2907221670/001/src -stat /tmp/TestExtractReadsHAKAssets2907221670/001 -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets -stat /tmp/TestExtractReadsHAKAssets2907221670/001 -stat /tmp/TestExtractReadsHAKAssets2907221670/001/build -stat /tmp/TestExtractReadsHAKAssets2907221670/001 -open /tmp/TestExtractReadsHAKAssets2907221670/001/nwn-tool.json -open /tmp/TestExtractReadsHAKAssets2907221670/001/nwn-tool.json -stat /tmp/TestExtractReadsHAKAssets2907221670/001/src -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets -stat /tmp/TestExtractReadsHAKAssets2907221670/001/build -stat /tmp/TestExtractReadsHAKAssets2907221670/001/src -open /tmp/TestExtractReadsHAKAssets2907221670/001/src -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets -open /tmp/TestExtractReadsHAKAssets2907221670/001/assets -open /tmp/TestExtractReadsHAKAssets2907221670/001/build/testmod.mod -open /tmp/TestExtractReadsHAKAssets2907221670/001/build/vfx.hak -open /tmp/TestExtractReadsHAKAssets2907221670/001/build/testmod.mod -stat /tmp/TestExtractReadsHAKAssets2907221670/001/build -open /tmp/TestExtractReadsHAKAssets2907221670/001/build -open /tmp/TestExtractReadsHAKAssets2907221670/001/build/vfx.hak -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets/plt -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets -open /tmp/TestExtractReadsHAKAssets2907221670/001/assets/plt/test_icon.plt -open /tmp/TestExtractReadsHAKAssets2907221670/001/assets/plt/test_icon.plt -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets/mdl -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets -open /tmp/TestExtractReadsHAKAssets2907221670/001/assets/mdl/test_vfx.mdl -open /tmp/TestExtractReadsHAKAssets2907221670/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets2907221670/001/assets/plt/test_icon.plt -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001 -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets/core -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001 -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001 -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets/core -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/core_01.hak -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/core_01.hak -stat /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs9888396/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/core -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/vfx -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001 -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/nwn-tool.json -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/nwn-tool.json -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/core -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/vfx -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build/haks.json -stat /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build/core.hak -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build/vfx.hak -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build/haks.json -open /tmp/TestBuildOrdersMultipleHAKGroups221226515/001/build/haks.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/core -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/vfx -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001 -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/nwn-tool.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/nwn-tool.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/core -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/vfx -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/core_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/core_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/vfx_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/core_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/core_02.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/vfx_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically745068297/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/core -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/vfx -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001 -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/nwn-tool.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/nwn-tool.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/core -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/vfx -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build/haks.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build/core.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build/vfx.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build/haks.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder3553218838/001/build/haks.json -open /tmp diff --git a/.cache/go-build/15/157e8385eb1164ca3689941bb3d6e23cdbb4d2e5703ad6dde72d00d5796deb94-d b/.cache/go-build/15/157e8385eb1164ca3689941bb3d6e23cdbb4d2e5703ad6dde72d00d5796deb94-d deleted file mode 100644 index 14ec3ff..0000000 --- a/.cache/go-build/15/157e8385eb1164ca3689941bb3d6e23cdbb4d2e5703ad6dde72d00d5796deb94-d +++ /dev/null @@ -1 +0,0 @@ -./labelset.go diff --git a/.cache/go-build/15/158da0ebe5bb2ef74bccd31092d594ba699566dc4bec723750feb08d0d9042a0-a b/.cache/go-build/15/158da0ebe5bb2ef74bccd31092d594ba699566dc4bec723750feb08d0d9042a0-a deleted file mode 100644 index 98d739f..0000000 --- a/.cache/go-build/15/158da0ebe5bb2ef74bccd31092d594ba699566dc4bec723750feb08d0d9042a0-a +++ /dev/null @@ -1 +0,0 @@ -v1 158da0ebe5bb2ef74bccd31092d594ba699566dc4bec723750feb08d0d9042a0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288985349532 diff --git a/.cache/go-build/15/15b5854f032c922d7298053e9c1493e162686576fb3d5ffef1518fae77303274-d b/.cache/go-build/15/15b5854f032c922d7298053e9c1493e162686576fb3d5ffef1518fae77303274-d deleted file mode 100644 index 6031b46..0000000 Binary files a/.cache/go-build/15/15b5854f032c922d7298053e9c1493e162686576fb3d5ffef1518fae77303274-d and /dev/null differ diff --git a/.cache/go-build/16/161b731356ee1500d44e39ee32d17956e2f26f49b5fa00a7cef068ee9f35475a-a b/.cache/go-build/16/161b731356ee1500d44e39ee32d17956e2f26f49b5fa00a7cef068ee9f35475a-a deleted file mode 100644 index fb9dcd3..0000000 --- a/.cache/go-build/16/161b731356ee1500d44e39ee32d17956e2f26f49b5fa00a7cef068ee9f35475a-a +++ /dev/null @@ -1 +0,0 @@ -v1 161b731356ee1500d44e39ee32d17956e2f26f49b5fa00a7cef068ee9f35475a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289011694321 diff --git a/.cache/go-build/16/16467476853de001f727beb6440361c37b10ffa1d55654ac2f3c1e75fe76e315-a b/.cache/go-build/16/16467476853de001f727beb6440361c37b10ffa1d55654ac2f3c1e75fe76e315-a deleted file mode 100644 index d19bddd..0000000 --- a/.cache/go-build/16/16467476853de001f727beb6440361c37b10ffa1d55654ac2f3c1e75fe76e315-a +++ /dev/null @@ -1 +0,0 @@ -v1 16467476853de001f727beb6440361c37b10ffa1d55654ac2f3c1e75fe76e315 168171c5a677af3141c2baf8c4bbbc67bb7cda8ec5771686ec4a2c305c2811cd 8554 1775136286910854249 diff --git a/.cache/go-build/16/165566167ffc24ceb8f58319e05580d09c40b6e7eca3f716a30f1f63bc336d58-d b/.cache/go-build/16/165566167ffc24ceb8f58319e05580d09c40b6e7eca3f716a30f1f63bc336d58-d deleted file mode 100644 index adc3741..0000000 Binary files a/.cache/go-build/16/165566167ffc24ceb8f58319e05580d09c40b6e7eca3f716a30f1f63bc336d58-d and /dev/null differ diff --git a/.cache/go-build/16/16654fe8a566f83a166366486e0f25e70d4d5a06ea79e558868479d28ea1f055-d b/.cache/go-build/16/16654fe8a566f83a166366486e0f25e70d4d5a06ea79e558868479d28ea1f055-d deleted file mode 100644 index c1d5924..0000000 --- a/.cache/go-build/16/16654fe8a566f83a166366486e0f25e70d4d5a06ea79e558868479d28ea1f055-d +++ /dev/null @@ -1,5 +0,0 @@ -./iter.go -./slices.go -./sort.go -./zsortanyfunc.go -./zsortordered.go diff --git a/.cache/go-build/16/166f153db0276187b60447cb3e3be3d402d3f33ae8a0a55a82ef5dff7777876d-a b/.cache/go-build/16/166f153db0276187b60447cb3e3be3d402d3f33ae8a0a55a82ef5dff7777876d-a deleted file mode 100644 index ac9c8b1..0000000 --- a/.cache/go-build/16/166f153db0276187b60447cb3e3be3d402d3f33ae8a0a55a82ef5dff7777876d-a +++ /dev/null @@ -1 +0,0 @@ -v1 166f153db0276187b60447cb3e3be3d402d3f33ae8a0a55a82ef5dff7777876d 42c7b9899336757c626a97b38b9e75e2a6c06315d12d8c7c478b7cc8e94e7305 149 1775136289723781211 diff --git a/.cache/go-build/16/168171c5a677af3141c2baf8c4bbbc67bb7cda8ec5771686ec4a2c305c2811cd-d b/.cache/go-build/16/168171c5a677af3141c2baf8c4bbbc67bb7cda8ec5771686ec4a2c305c2811cd-d deleted file mode 100644 index 4f9f2b6..0000000 Binary files a/.cache/go-build/16/168171c5a677af3141c2baf8c4bbbc67bb7cda8ec5771686ec4a2c305c2811cd-d and /dev/null differ diff --git a/.cache/go-build/16/1684a4b14d948e37c0a94d384296d623e8fae670f1903caff010b23641d338de-a b/.cache/go-build/16/1684a4b14d948e37c0a94d384296d623e8fae670f1903caff010b23641d338de-a deleted file mode 100644 index 20da480..0000000 --- a/.cache/go-build/16/1684a4b14d948e37c0a94d384296d623e8fae670f1903caff010b23641d338de-a +++ /dev/null @@ -1 +0,0 @@ -v1 1684a4b14d948e37c0a94d384296d623e8fae670f1903caff010b23641d338de ac24b812fb8bb5fcdd0073c67a612fb929d2f6d1225b3efa39028f3f5cc7ecd6 79 1775138184260958238 diff --git a/.cache/go-build/16/168a2bd4a93b16cfd69c85a044e705bc542ee3895b0eea5dffd02bc52c678477-a b/.cache/go-build/16/168a2bd4a93b16cfd69c85a044e705bc542ee3895b0eea5dffd02bc52c678477-a deleted file mode 100644 index e4b19b5..0000000 --- a/.cache/go-build/16/168a2bd4a93b16cfd69c85a044e705bc542ee3895b0eea5dffd02bc52c678477-a +++ /dev/null @@ -1 +0,0 @@ -v1 168a2bd4a93b16cfd69c85a044e705bc542ee3895b0eea5dffd02bc52c678477 4de4f43efff260261505dbed8c802100d697f57b72a5588a4e4e1e54b54d3981 881238 1775136289801131536 diff --git a/.cache/go-build/16/168e23d5afefdf98a00d4807c6e283725841aa069a29ce991e9bc63f11e3f2d6-a b/.cache/go-build/16/168e23d5afefdf98a00d4807c6e283725841aa069a29ce991e9bc63f11e3f2d6-a deleted file mode 100644 index 7bec63f..0000000 --- a/.cache/go-build/16/168e23d5afefdf98a00d4807c6e283725841aa069a29ce991e9bc63f11e3f2d6-a +++ /dev/null @@ -1 +0,0 @@ -v1 168e23d5afefdf98a00d4807c6e283725841aa069a29ce991e9bc63f11e3f2d6 d40e3d104d81d256c7a33c0feecdb2e57e6835346cef267147d73ebb97feff95 318 1775136289458164491 diff --git a/.cache/go-build/16/169d2c9e7fd5918347e58bbf71a2cf7bfbebe4a3a8bb898eb7c78f08713673d3-a b/.cache/go-build/16/169d2c9e7fd5918347e58bbf71a2cf7bfbebe4a3a8bb898eb7c78f08713673d3-a deleted file mode 100644 index 3a2e1cf..0000000 --- a/.cache/go-build/16/169d2c9e7fd5918347e58bbf71a2cf7bfbebe4a3a8bb898eb7c78f08713673d3-a +++ /dev/null @@ -1 +0,0 @@ -v1 169d2c9e7fd5918347e58bbf71a2cf7bfbebe4a3a8bb898eb7c78f08713673d3 e84c82c8ac6c7f5a0a08744979078e77b44ebdd1d855963def9e97ce70ba6bd7 135 1775136289532595294 diff --git a/.cache/go-build/16/16a293c8aad050bb03127ba699609fb4708a72f8c8365ee38cb7b69ec76926ac-d b/.cache/go-build/16/16a293c8aad050bb03127ba699609fb4708a72f8c8365ee38cb7b69ec76926ac-d deleted file mode 100644 index 80abf13..0000000 Binary files a/.cache/go-build/16/16a293c8aad050bb03127ba699609fb4708a72f8c8365ee38cb7b69ec76926ac-d and /dev/null differ diff --git a/.cache/go-build/16/16de9a23d8cebba59e827a87d980c337d09329f0fb8606aacdf0d88f9567f501-a b/.cache/go-build/16/16de9a23d8cebba59e827a87d980c337d09329f0fb8606aacdf0d88f9567f501-a deleted file mode 100644 index b8f0abc..0000000 --- a/.cache/go-build/16/16de9a23d8cebba59e827a87d980c337d09329f0fb8606aacdf0d88f9567f501-a +++ /dev/null @@ -1 +0,0 @@ -v1 16de9a23d8cebba59e827a87d980c337d09329f0fb8606aacdf0d88f9567f501 4e100d4aada388c5961b6cdfb2ceb007264a892259cc4e354962386d201a6fd1 27556 1775136287053908721 diff --git a/.cache/go-build/17/1718060f5349559113b3f823c502afb488612a17a53f910753c3d929e8da6325-d b/.cache/go-build/17/1718060f5349559113b3f823c502afb488612a17a53f910753c3d929e8da6325-d deleted file mode 100644 index d274797..0000000 Binary files a/.cache/go-build/17/1718060f5349559113b3f823c502afb488612a17a53f910753c3d929e8da6325-d and /dev/null differ diff --git a/.cache/go-build/17/171ef3c9b275b2e0577056b12ad614b806e673d5d221fe6a5bdaf73aa99ce05c-a b/.cache/go-build/17/171ef3c9b275b2e0577056b12ad614b806e673d5d221fe6a5bdaf73aa99ce05c-a deleted file mode 100644 index b69d7f0..0000000 --- a/.cache/go-build/17/171ef3c9b275b2e0577056b12ad614b806e673d5d221fe6a5bdaf73aa99ce05c-a +++ /dev/null @@ -1 +0,0 @@ -v1 171ef3c9b275b2e0577056b12ad614b806e673d5d221fe6a5bdaf73aa99ce05c 059954e08fe611d5adcc4b180e83e3efc0d3eb0684c88233f4acb460a0e48d67 7698 1775136286923086907 diff --git a/.cache/go-build/17/1722e39b2eec812fae3b211d6e60f4a433f0d07a5be681d4de36532e00aac03c-d b/.cache/go-build/17/1722e39b2eec812fae3b211d6e60f4a433f0d07a5be681d4de36532e00aac03c-d deleted file mode 100644 index 17d5ea0..0000000 --- a/.cache/go-build/17/1722e39b2eec812fae3b211d6e60f4a433f0d07a5be681d4de36532e00aac03c-d +++ /dev/null @@ -1,2 +0,0 @@ -./doc.go -./norace.go diff --git a/.cache/go-build/17/1724f24930d869451a78747806b2b12e11e4c2705e61d9a4e440feafac0356c5-a b/.cache/go-build/17/1724f24930d869451a78747806b2b12e11e4c2705e61d9a4e440feafac0356c5-a deleted file mode 100644 index 49c0750..0000000 --- a/.cache/go-build/17/1724f24930d869451a78747806b2b12e11e4c2705e61d9a4e440feafac0356c5-a +++ /dev/null @@ -1 +0,0 @@ -v1 1724f24930d869451a78747806b2b12e11e4c2705e61d9a4e440feafac0356c5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289154716633 diff --git a/.cache/go-build/17/174325e79b5e27561ab5cb42fdddeef42e9e544c5d93eed00870e304c5fbd66f-d b/.cache/go-build/17/174325e79b5e27561ab5cb42fdddeef42e9e544c5d93eed00870e304c5fbd66f-d deleted file mode 100644 index 6a29246..0000000 Binary files a/.cache/go-build/17/174325e79b5e27561ab5cb42fdddeef42e9e544c5d93eed00870e304c5fbd66f-d and /dev/null differ diff --git a/.cache/go-build/17/17a678fa7e0d1624a6c02dd3ded8901328144219dbbc15abaf150fec4c173d6b-d b/.cache/go-build/17/17a678fa7e0d1624a6c02dd3ded8901328144219dbbc15abaf150fec4c173d6b-d deleted file mode 100644 index 7d17d44..0000000 --- a/.cache/go-build/17/17a678fa7e0d1624a6c02dd3ded8901328144219dbbc15abaf150fec4c173d6b-d +++ /dev/null @@ -1,3 +0,0 @@ -./goarch.go -./goarch_amd64.go -./zgoarch_amd64.go diff --git a/.cache/go-build/18/180daccd9d9231d4ffa04d2116cc916cec7ddd18fee325a7adc1243bfcf940d9-d b/.cache/go-build/18/180daccd9d9231d4ffa04d2116cc916cec7ddd18fee325a7adc1243bfcf940d9-d deleted file mode 100644 index b8e9d56..0000000 Binary files a/.cache/go-build/18/180daccd9d9231d4ffa04d2116cc916cec7ddd18fee325a7adc1243bfcf940d9-d and /dev/null differ diff --git a/.cache/go-build/18/1878cfb19075d3df92e08f851a3d6e0c4d6d73a99ffc0822eea7731154b157c6-a b/.cache/go-build/18/1878cfb19075d3df92e08f851a3d6e0c4d6d73a99ffc0822eea7731154b157c6-a deleted file mode 100644 index aa942c8..0000000 --- a/.cache/go-build/18/1878cfb19075d3df92e08f851a3d6e0c4d6d73a99ffc0822eea7731154b157c6-a +++ /dev/null @@ -1 +0,0 @@ -v1 1878cfb19075d3df92e08f851a3d6e0c4d6d73a99ffc0822eea7731154b157c6 a46e53744ff729105f06091536a57c3c2a3d07cc5cb03c0cb70d7904cf54ef8a 4444 1775136286934973146 diff --git a/.cache/go-build/18/1886a80a5e2e61583ef25a21eb99eb35b3c03b2cbf985f8b2337445452d41d25-a b/.cache/go-build/18/1886a80a5e2e61583ef25a21eb99eb35b3c03b2cbf985f8b2337445452d41d25-a deleted file mode 100644 index c0308d1..0000000 --- a/.cache/go-build/18/1886a80a5e2e61583ef25a21eb99eb35b3c03b2cbf985f8b2337445452d41d25-a +++ /dev/null @@ -1 +0,0 @@ -v1 1886a80a5e2e61583ef25a21eb99eb35b3c03b2cbf985f8b2337445452d41d25 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288793325215 diff --git a/.cache/go-build/18/18c47bc2c9ee091c5a5c75116eb37257825c2622adbb4e62ea5fba00a0716cf6-a b/.cache/go-build/18/18c47bc2c9ee091c5a5c75116eb37257825c2622adbb4e62ea5fba00a0716cf6-a deleted file mode 100644 index 95f3324..0000000 --- a/.cache/go-build/18/18c47bc2c9ee091c5a5c75116eb37257825c2622adbb4e62ea5fba00a0716cf6-a +++ /dev/null @@ -1 +0,0 @@ -v1 18c47bc2c9ee091c5a5c75116eb37257825c2622adbb4e62ea5fba00a0716cf6 fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775139398497258847 diff --git a/.cache/go-build/18/18c75a436da22c045d0cd1581df491f9b30c98a95adfb4cc7a19b3ea979ad810-a b/.cache/go-build/18/18c75a436da22c045d0cd1581df491f9b30c98a95adfb4cc7a19b3ea979ad810-a deleted file mode 100644 index e9412c5..0000000 --- a/.cache/go-build/18/18c75a436da22c045d0cd1581df491f9b30c98a95adfb4cc7a19b3ea979ad810-a +++ /dev/null @@ -1 +0,0 @@ -v1 18c75a436da22c045d0cd1581df491f9b30c98a95adfb4cc7a19b3ea979ad810 009240a0c59c6752409ca2925c7e3437da99a1cfdc46be3f5ad2bc1c5743ea2d 7151 1775136286839054107 diff --git a/.cache/go-build/18/18ede9f69ed582ab27c366754dbc85c720753742baf19469e13f118387f7d8c6-d b/.cache/go-build/18/18ede9f69ed582ab27c366754dbc85c720753742baf19469e13f118387f7d8c6-d deleted file mode 100644 index 8bf7750..0000000 Binary files a/.cache/go-build/18/18ede9f69ed582ab27c366754dbc85c720753742baf19469e13f118387f7d8c6-d and /dev/null differ diff --git a/.cache/go-build/18/18f1502595b18d9137430ca6230d62b4b08336f2c4568cca7cbe6263c1c45a21-a b/.cache/go-build/18/18f1502595b18d9137430ca6230d62b4b08336f2c4568cca7cbe6263c1c45a21-a deleted file mode 100644 index 5fdedb0..0000000 --- a/.cache/go-build/18/18f1502595b18d9137430ca6230d62b4b08336f2c4568cca7cbe6263c1c45a21-a +++ /dev/null @@ -1 +0,0 @@ -v1 18f1502595b18d9137430ca6230d62b4b08336f2c4568cca7cbe6263c1c45a21 798b43fcc423376c304fcd417a4c417c64247e63f32b4cfb6304e168cff7e284 489490 1775136289481985428 diff --git a/.cache/go-build/19/1906a1eeebeaf6c3a92c1d887bda8ffbe48f782b31c5b31af1440a0644e08d3a-a b/.cache/go-build/19/1906a1eeebeaf6c3a92c1d887bda8ffbe48f782b31c5b31af1440a0644e08d3a-a deleted file mode 100644 index 4ab8a6f..0000000 --- a/.cache/go-build/19/1906a1eeebeaf6c3a92c1d887bda8ffbe48f782b31c5b31af1440a0644e08d3a-a +++ /dev/null @@ -1 +0,0 @@ -v1 1906a1eeebeaf6c3a92c1d887bda8ffbe48f782b31c5b31af1440a0644e08d3a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184047041965 diff --git a/.cache/go-build/19/193ae37ae79efab647839e3a670c65ba2539da0679f7e65beb2be7e92072662a-d b/.cache/go-build/19/193ae37ae79efab647839e3a670c65ba2539da0679f7e65beb2be7e92072662a-d deleted file mode 100644 index a3fac6a..0000000 Binary files a/.cache/go-build/19/193ae37ae79efab647839e3a670c65ba2539da0679f7e65beb2be7e92072662a-d and /dev/null differ diff --git a/.cache/go-build/19/19427374d2c61162340728d02da38160d28ceb7f4b2eb5038194977f85b5b719-d b/.cache/go-build/19/19427374d2c61162340728d02da38160d28ceb7f4b2eb5038194977f85b5b719-d deleted file mode 100644 index 4fd4cd7..0000000 Binary files a/.cache/go-build/19/19427374d2c61162340728d02da38160d28ceb7f4b2eb5038194977f85b5b719-d and /dev/null differ diff --git a/.cache/go-build/19/198599df32a35734851abf56e2d940e7cf9b25edbc5320a09c47ab01527fbbdb-a b/.cache/go-build/19/198599df32a35734851abf56e2d940e7cf9b25edbc5320a09c47ab01527fbbdb-a deleted file mode 100644 index 1154023..0000000 --- a/.cache/go-build/19/198599df32a35734851abf56e2d940e7cf9b25edbc5320a09c47ab01527fbbdb-a +++ /dev/null @@ -1 +0,0 @@ -v1 198599df32a35734851abf56e2d940e7cf9b25edbc5320a09c47ab01527fbbdb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288510730163 diff --git a/.cache/go-build/19/19b9dd0cdd479e2c992f5b31a1d405f00a9bb35127fc70b01c1fce2c6e38715a-d b/.cache/go-build/19/19b9dd0cdd479e2c992f5b31a1d405f00a9bb35127fc70b01c1fce2c6e38715a-d deleted file mode 100644 index acb3725..0000000 Binary files a/.cache/go-build/19/19b9dd0cdd479e2c992f5b31a1d405f00a9bb35127fc70b01c1fce2c6e38715a-d and /dev/null differ diff --git a/.cache/go-build/19/19fadaa6b43a2717cb7e20e68e89c01a110dbe0035640e2ea7cb59f624fa91dc-d b/.cache/go-build/19/19fadaa6b43a2717cb7e20e68e89c01a110dbe0035640e2ea7cb59f624fa91dc-d deleted file mode 100644 index 5511d2e..0000000 Binary files a/.cache/go-build/19/19fadaa6b43a2717cb7e20e68e89c01a110dbe0035640e2ea7cb59f624fa91dc-d and /dev/null differ diff --git a/.cache/go-build/1a/1a26102a1591c79c4895a1ae58f57f4b65496e0a735f2bf9b139159152bbfe98-d b/.cache/go-build/1a/1a26102a1591c79c4895a1ae58f57f4b65496e0a735f2bf9b139159152bbfe98-d deleted file mode 100644 index 1f61cdd..0000000 Binary files a/.cache/go-build/1a/1a26102a1591c79c4895a1ae58f57f4b65496e0a735f2bf9b139159152bbfe98-d and /dev/null differ diff --git a/.cache/go-build/1a/1a59aaf7359e29b2e15fa48388b2a40a12b38b450c711b4442b415115bba8ae9-d b/.cache/go-build/1a/1a59aaf7359e29b2e15fa48388b2a40a12b38b450c711b4442b415115bba8ae9-d deleted file mode 100644 index 9d8991b..0000000 Binary files a/.cache/go-build/1a/1a59aaf7359e29b2e15fa48388b2a40a12b38b450c711b4442b415115bba8ae9-d and /dev/null differ diff --git a/.cache/go-build/1a/1a82fe05ab97727f94dc07ccef1ddcbe6a9a52844240b6d23896da01033f02ee-a b/.cache/go-build/1a/1a82fe05ab97727f94dc07ccef1ddcbe6a9a52844240b6d23896da01033f02ee-a deleted file mode 100644 index 6957b85..0000000 --- a/.cache/go-build/1a/1a82fe05ab97727f94dc07ccef1ddcbe6a9a52844240b6d23896da01033f02ee-a +++ /dev/null @@ -1 +0,0 @@ -v1 1a82fe05ab97727f94dc07ccef1ddcbe6a9a52844240b6d23896da01033f02ee e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287115653655 diff --git a/.cache/go-build/1b/1b2fe64a01aca322d2d527b969c00e02d40871c96c04ad0da24e094192b4b86d-d b/.cache/go-build/1b/1b2fe64a01aca322d2d527b969c00e02d40871c96c04ad0da24e094192b4b86d-d deleted file mode 100644 index 81d19d4..0000000 Binary files a/.cache/go-build/1b/1b2fe64a01aca322d2d527b969c00e02d40871c96c04ad0da24e094192b4b86d-d and /dev/null differ diff --git a/.cache/go-build/1b/1b61c256b6800819b5c77c40d47a36060abf501ff82748ed5d713adfcd9a2ece-a b/.cache/go-build/1b/1b61c256b6800819b5c77c40d47a36060abf501ff82748ed5d713adfcd9a2ece-a deleted file mode 100644 index 0e1543f..0000000 --- a/.cache/go-build/1b/1b61c256b6800819b5c77c40d47a36060abf501ff82748ed5d713adfcd9a2ece-a +++ /dev/null @@ -1 +0,0 @@ -v1 1b61c256b6800819b5c77c40d47a36060abf501ff82748ed5d713adfcd9a2ece 40e28a547d4ae2abb929ec12322310827e526712a134ce26e3f8028c06fe2a94 118031 1775136286909432048 diff --git a/.cache/go-build/1b/1b87ce7992e0768b48f35ece0bc4cfd2399db5692dd6b55745e1120c0a5580d1-a b/.cache/go-build/1b/1b87ce7992e0768b48f35ece0bc4cfd2399db5692dd6b55745e1120c0a5580d1-a deleted file mode 100644 index 418d862..0000000 --- a/.cache/go-build/1b/1b87ce7992e0768b48f35ece0bc4cfd2399db5692dd6b55745e1120c0a5580d1-a +++ /dev/null @@ -1 +0,0 @@ -v1 1b87ce7992e0768b48f35ece0bc4cfd2399db5692dd6b55745e1120c0a5580d1 9d3fde395023b98f46cd831bbef39e8700a47bc32495e1cf57c9089e64c2fddf 930244 1775136289170449025 diff --git a/.cache/go-build/1b/1b9fbe37d01ded6a280ecb605083787d6c26ca159ffc51c4312ff2d0fe6c91a2-a b/.cache/go-build/1b/1b9fbe37d01ded6a280ecb605083787d6c26ca159ffc51c4312ff2d0fe6c91a2-a deleted file mode 100644 index 840d7e6..0000000 --- a/.cache/go-build/1b/1b9fbe37d01ded6a280ecb605083787d6c26ca159ffc51c4312ff2d0fe6c91a2-a +++ /dev/null @@ -1 +0,0 @@ -v1 1b9fbe37d01ded6a280ecb605083787d6c26ca159ffc51c4312ff2d0fe6c91a2 8011e9c53622e4ccba7d311ba870ce1ae1444a4269e0abb0ba08e9582806ae4f 23 1775136287041024302 diff --git a/.cache/go-build/1b/1bd0e7b814a828e09535fb001f8a91c34b4494f123abb888db0c224bd74ab91b-d b/.cache/go-build/1b/1bd0e7b814a828e09535fb001f8a91c34b4494f123abb888db0c224bd74ab91b-d deleted file mode 100644 index 19a559d..0000000 --- a/.cache/go-build/1b/1bd0e7b814a828e09535fb001f8a91c34b4494f123abb888db0c224bd74ab91b-d +++ /dev/null @@ -1 +0,0 @@ -./byteorder.go diff --git a/.cache/go-build/1b/1bd1b0bc64d1fc20f268c470b5d5eb8b36510fb5ffd948402fc7cdb6aee4e46c-d b/.cache/go-build/1b/1bd1b0bc64d1fc20f268c470b5d5eb8b36510fb5ffd948402fc7cdb6aee4e46c-d deleted file mode 100644 index 77e52a5..0000000 Binary files a/.cache/go-build/1b/1bd1b0bc64d1fc20f268c470b5d5eb8b36510fb5ffd948402fc7cdb6aee4e46c-d and /dev/null differ diff --git a/.cache/go-build/1b/1be1ef69613fd2aa81b320e013cb076128fae6cac23b071f3ebc3ea1980f2411-a b/.cache/go-build/1b/1be1ef69613fd2aa81b320e013cb076128fae6cac23b071f3ebc3ea1980f2411-a deleted file mode 100644 index b25978d..0000000 --- a/.cache/go-build/1b/1be1ef69613fd2aa81b320e013cb076128fae6cac23b071f3ebc3ea1980f2411-a +++ /dev/null @@ -1 +0,0 @@ -v1 1be1ef69613fd2aa81b320e013cb076128fae6cac23b071f3ebc3ea1980f2411 34a1ddc14337785e6ef83270d9ab2fa1c46bf87eb66a5738c8ac69d6b44c769a 2489298 1775136289309098014 diff --git a/.cache/go-build/1c/1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b-d b/.cache/go-build/1c/1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b-d deleted file mode 100644 index 40a63b8..0000000 --- a/.cache/go-build/1c/1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b-d +++ /dev/null @@ -1 +0,0 @@ -# test log diff --git a/.cache/go-build/1d/1d201d090c4b21d282a6de5fcf2030457f40bead0ba13d91a1746f78caa4a750-a b/.cache/go-build/1d/1d201d090c4b21d282a6de5fcf2030457f40bead0ba13d91a1746f78caa4a750-a deleted file mode 100644 index 0b60afe..0000000 --- a/.cache/go-build/1d/1d201d090c4b21d282a6de5fcf2030457f40bead0ba13d91a1746f78caa4a750-a +++ /dev/null @@ -1 +0,0 @@ -v1 1d201d090c4b21d282a6de5fcf2030457f40bead0ba13d91a1746f78caa4a750 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286933128744 diff --git a/.cache/go-build/1d/1dbdf7f3aa5e59a0f34437539c21624d80d6e7fe8b3b76f4a0065f7064e21f7e-a b/.cache/go-build/1d/1dbdf7f3aa5e59a0f34437539c21624d80d6e7fe8b3b76f4a0065f7064e21f7e-a deleted file mode 100644 index 541900f..0000000 --- a/.cache/go-build/1d/1dbdf7f3aa5e59a0f34437539c21624d80d6e7fe8b3b76f4a0065f7064e21f7e-a +++ /dev/null @@ -1 +0,0 @@ -v1 1dbdf7f3aa5e59a0f34437539c21624d80d6e7fe8b3b76f4a0065f7064e21f7e 6e7c31280d1e33d3041e347d9af8edd4c909a5f49c87f4fbb295262ee42d4c72 152448 1775137721898467681 diff --git a/.cache/go-build/1d/1dfb477d1d95cb2235abc01e98636872b8100328e92f223f059b4eb76fc1ad31-a b/.cache/go-build/1d/1dfb477d1d95cb2235abc01e98636872b8100328e92f223f059b4eb76fc1ad31-a deleted file mode 100644 index 8d27452..0000000 --- a/.cache/go-build/1d/1dfb477d1d95cb2235abc01e98636872b8100328e92f223f059b4eb76fc1ad31-a +++ /dev/null @@ -1 +0,0 @@ -v1 1dfb477d1d95cb2235abc01e98636872b8100328e92f223f059b4eb76fc1ad31 1e1cab71c7ec26658dc2da9a9e51a78ac604a06e74e4d3f1c69d49c1a11be6d5 133 1775136289068203862 diff --git a/.cache/go-build/1e/1e1cab71c7ec26658dc2da9a9e51a78ac604a06e74e4d3f1c69d49c1a11be6d5-d b/.cache/go-build/1e/1e1cab71c7ec26658dc2da9a9e51a78ac604a06e74e4d3f1c69d49c1a11be6d5-d deleted file mode 100644 index 2abe166..0000000 Binary files a/.cache/go-build/1e/1e1cab71c7ec26658dc2da9a9e51a78ac604a06e74e4d3f1c69d49c1a11be6d5-d and /dev/null differ diff --git a/.cache/go-build/1e/1e38694aa3d03e2def586e6e4a4fa13e898b7f6cdd828804b7066dbf9e4dbf1c-a b/.cache/go-build/1e/1e38694aa3d03e2def586e6e4a4fa13e898b7f6cdd828804b7066dbf9e4dbf1c-a deleted file mode 100644 index 43ede69..0000000 --- a/.cache/go-build/1e/1e38694aa3d03e2def586e6e4a4fa13e898b7f6cdd828804b7066dbf9e4dbf1c-a +++ /dev/null @@ -1 +0,0 @@ -v1 1e38694aa3d03e2def586e6e4a4fa13e898b7f6cdd828804b7066dbf9e4dbf1c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288699236338 diff --git a/.cache/go-build/1e/1e9a0a26091808c39b019f47cebdc7e73d2c088fdc1a162bcdaaf2c1faabeaa1-a b/.cache/go-build/1e/1e9a0a26091808c39b019f47cebdc7e73d2c088fdc1a162bcdaaf2c1faabeaa1-a deleted file mode 100644 index 62433dc..0000000 --- a/.cache/go-build/1e/1e9a0a26091808c39b019f47cebdc7e73d2c088fdc1a162bcdaaf2c1faabeaa1-a +++ /dev/null @@ -1 +0,0 @@ -v1 1e9a0a26091808c39b019f47cebdc7e73d2c088fdc1a162bcdaaf2c1faabeaa1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289731565126 diff --git a/.cache/go-build/1e/1ea964ebfa11a0ca7b78aaaae6c39c58d0f4e7b47329da387d83524dddbf272c-d b/.cache/go-build/1e/1ea964ebfa11a0ca7b78aaaae6c39c58d0f4e7b47329da387d83524dddbf272c-d deleted file mode 100644 index 0c2e4d4..0000000 Binary files a/.cache/go-build/1e/1ea964ebfa11a0ca7b78aaaae6c39c58d0f4e7b47329da387d83524dddbf272c-d and /dev/null differ diff --git a/.cache/go-build/1e/1ef70100fde543b21186b4f82bfabd8c79c81e915811474d5940d2a96f8455ed-a b/.cache/go-build/1e/1ef70100fde543b21186b4f82bfabd8c79c81e915811474d5940d2a96f8455ed-a deleted file mode 100644 index a8ab949..0000000 --- a/.cache/go-build/1e/1ef70100fde543b21186b4f82bfabd8c79c81e915811474d5940d2a96f8455ed-a +++ /dev/null @@ -1 +0,0 @@ -v1 1ef70100fde543b21186b4f82bfabd8c79c81e915811474d5940d2a96f8455ed 79945811085a9cd79738c8d41056d0073a22c1edd8c1acc0ab9345ff7a8c8363 117442 1775138184093604258 diff --git a/.cache/go-build/1e/1efe19943743a13c507a00b1ded5dfeaa5323649ac7ceff3324d17739eb48735-a b/.cache/go-build/1e/1efe19943743a13c507a00b1ded5dfeaa5323649ac7ceff3324d17739eb48735-a deleted file mode 100644 index 48229c5..0000000 --- a/.cache/go-build/1e/1efe19943743a13c507a00b1ded5dfeaa5323649ac7ceff3324d17739eb48735-a +++ /dev/null @@ -1 +0,0 @@ -v1 1efe19943743a13c507a00b1ded5dfeaa5323649ac7ceff3324d17739eb48735 b505b5d6cd46a414e800da118de6d53d2b6672c8b086256f423d95919f33371a 699 1775136286940795710 diff --git a/.cache/go-build/1f/1f42a2cb1cbdf6e3a885e3db686e39f011a19bd7d3badf17726aa39c6be88550-a b/.cache/go-build/1f/1f42a2cb1cbdf6e3a885e3db686e39f011a19bd7d3badf17726aa39c6be88550-a deleted file mode 100644 index d3b72e0..0000000 --- a/.cache/go-build/1f/1f42a2cb1cbdf6e3a885e3db686e39f011a19bd7d3badf17726aa39c6be88550-a +++ /dev/null @@ -1 +0,0 @@ -v1 1f42a2cb1cbdf6e3a885e3db686e39f011a19bd7d3badf17726aa39c6be88550 d85af71017f050c852c87c6541bd778cc363b542f39562516ec20a9218b92e75 45 1775136288523790612 diff --git a/.cache/go-build/1f/1f87f5b912422a7cbfca5ed8723a59db96b0ee3537dc35fbbf33f4eccb080ffc-a b/.cache/go-build/1f/1f87f5b912422a7cbfca5ed8723a59db96b0ee3537dc35fbbf33f4eccb080ffc-a deleted file mode 100644 index 878e72d..0000000 --- a/.cache/go-build/1f/1f87f5b912422a7cbfca5ed8723a59db96b0ee3537dc35fbbf33f4eccb080ffc-a +++ /dev/null @@ -1 +0,0 @@ -v1 1f87f5b912422a7cbfca5ed8723a59db96b0ee3537dc35fbbf33f4eccb080ffc 38dbd4d723e36f22dd91bf6c66e95e6bee27c6316ecde8ae167d754cbcd1dbea 3445 1775136286813353539 diff --git a/.cache/go-build/1f/1f9112ff9ae70adc0ed134ab11b866886e5a20ea2d01ee2a31676406b919cfb3-a b/.cache/go-build/1f/1f9112ff9ae70adc0ed134ab11b866886e5a20ea2d01ee2a31676406b919cfb3-a deleted file mode 100644 index fb71767..0000000 --- a/.cache/go-build/1f/1f9112ff9ae70adc0ed134ab11b866886e5a20ea2d01ee2a31676406b919cfb3-a +++ /dev/null @@ -1 +0,0 @@ -v1 1f9112ff9ae70adc0ed134ab11b866886e5a20ea2d01ee2a31676406b919cfb3 f3630e204441f7470575bc1f7d347fbf15e224a4e18bf33a043e60bae4ede315 5822 1775136289486702071 diff --git a/.cache/go-build/1f/1fcda11a67aa36d8b2b3f8334053d4a775468e8a66ba7182d30d8795ecc8eb0f-a b/.cache/go-build/1f/1fcda11a67aa36d8b2b3f8334053d4a775468e8a66ba7182d30d8795ecc8eb0f-a deleted file mode 100644 index 44ec397..0000000 --- a/.cache/go-build/1f/1fcda11a67aa36d8b2b3f8334053d4a775468e8a66ba7182d30d8795ecc8eb0f-a +++ /dev/null @@ -1 +0,0 @@ -v1 1fcda11a67aa36d8b2b3f8334053d4a775468e8a66ba7182d30d8795ecc8eb0f c431a1d2d6113fa808d23b99b1e3877306de855e7486654fab6d6f19a33f2c1e 341 1775136286804646523 diff --git a/.cache/go-build/20/202994a9af9679a19a9a951bfac4e1d9dc73b67ae4e7f4e77bea2c750b150ff5-d b/.cache/go-build/20/202994a9af9679a19a9a951bfac4e1d9dc73b67ae4e7f4e77bea2c750b150ff5-d deleted file mode 100644 index 2626f10..0000000 Binary files a/.cache/go-build/20/202994a9af9679a19a9a951bfac4e1d9dc73b67ae4e7f4e77bea2c750b150ff5-d and /dev/null differ diff --git a/.cache/go-build/20/20368056552005da628ba6475957642e5100f92f011518acb3f457bdcba791e8-a b/.cache/go-build/20/20368056552005da628ba6475957642e5100f92f011518acb3f457bdcba791e8-a deleted file mode 100644 index 92b55f1..0000000 --- a/.cache/go-build/20/20368056552005da628ba6475957642e5100f92f011518acb3f457bdcba791e8-a +++ /dev/null @@ -1 +0,0 @@ -v1 20368056552005da628ba6475957642e5100f92f011518acb3f457bdcba791e8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287130555586 diff --git a/.cache/go-build/20/203bbce3908528820ca7177733f58044d34abb3d200bdce602931cdc7b6fcf2b-a b/.cache/go-build/20/203bbce3908528820ca7177733f58044d34abb3d200bdce602931cdc7b6fcf2b-a deleted file mode 100644 index 4941a53..0000000 --- a/.cache/go-build/20/203bbce3908528820ca7177733f58044d34abb3d200bdce602931cdc7b6fcf2b-a +++ /dev/null @@ -1 +0,0 @@ -v1 203bbce3908528820ca7177733f58044d34abb3d200bdce602931cdc7b6fcf2b e685a55a0fd4dae821f0d73344a23da0621349e303542b988f277e5c43fecf80 109 1775136286966606308 diff --git a/.cache/go-build/20/203d4cae2c92714e3a18f59ace1513fe274a51ef02f717de07602d93df10b3d2-a b/.cache/go-build/20/203d4cae2c92714e3a18f59ace1513fe274a51ef02f717de07602d93df10b3d2-a deleted file mode 100644 index 162c1b1..0000000 --- a/.cache/go-build/20/203d4cae2c92714e3a18f59ace1513fe274a51ef02f717de07602d93df10b3d2-a +++ /dev/null @@ -1 +0,0 @@ -v1 203d4cae2c92714e3a18f59ace1513fe274a51ef02f717de07602d93df10b3d2 54c50e880b9e08830f0b47a94e010e1f27753f759b249c0f14a7f41e9f657dd4 544 1775136286845248962 diff --git a/.cache/go-build/20/20524186d016e59860a20ebde303d29555d385760b48f116df3192be6dd4810b-d b/.cache/go-build/20/20524186d016e59860a20ebde303d29555d385760b48f116df3192be6dd4810b-d deleted file mode 100644 index 85671fc..0000000 Binary files a/.cache/go-build/20/20524186d016e59860a20ebde303d29555d385760b48f116df3192be6dd4810b-d and /dev/null differ diff --git a/.cache/go-build/20/207a7c123953bc272a5a376a46373b18942d1219f48f2535d5205892a1e7a49a-a b/.cache/go-build/20/207a7c123953bc272a5a376a46373b18942d1219f48f2535d5205892a1e7a49a-a deleted file mode 100644 index b6dd0ab..0000000 --- a/.cache/go-build/20/207a7c123953bc272a5a376a46373b18942d1219f48f2535d5205892a1e7a49a-a +++ /dev/null @@ -1 +0,0 @@ -v1 207a7c123953bc272a5a376a46373b18942d1219f48f2535d5205892a1e7a49a 3c286eb86fb6273492b2b97583751bfbacf0b21bec6fe90ff5d67b932a711a1a 961970 1775136288522186451 diff --git a/.cache/go-build/20/208775b1e6d81bce3262d5b6a94507d522c4d42555dd4c37a4cd8f4efe08ec34-a b/.cache/go-build/20/208775b1e6d81bce3262d5b6a94507d522c4d42555dd4c37a4cd8f4efe08ec34-a deleted file mode 100644 index c104230..0000000 --- a/.cache/go-build/20/208775b1e6d81bce3262d5b6a94507d522c4d42555dd4c37a4cd8f4efe08ec34-a +++ /dev/null @@ -1 +0,0 @@ -v1 208775b1e6d81bce3262d5b6a94507d522c4d42555dd4c37a4cd8f4efe08ec34 326b3f8fd2d14f2d1d25d07a130e37da350ecfda147a10495cc88c549b8f24eb 124530 1775136289454288748 diff --git a/.cache/go-build/20/209d525971844cc35aa5b8ea756a7ceaa905c5ea42aefedd782d44c08113e248-a b/.cache/go-build/20/209d525971844cc35aa5b8ea756a7ceaa905c5ea42aefedd782d44c08113e248-a deleted file mode 100644 index a664e1d..0000000 --- a/.cache/go-build/20/209d525971844cc35aa5b8ea756a7ceaa905c5ea42aefedd782d44c08113e248-a +++ /dev/null @@ -1 +0,0 @@ -v1 209d525971844cc35aa5b8ea756a7ceaa905c5ea42aefedd782d44c08113e248 4427915dd2afda1129cdc20202b0962e9d9b021642dcc73f2be4cf0733c728ee 118722 1775136289420233473 diff --git a/.cache/go-build/20/20ae58d8a822583f601194b24b85ef2da01c1f0046f297e50149a00c7f632fea-a b/.cache/go-build/20/20ae58d8a822583f601194b24b85ef2da01c1f0046f297e50149a00c7f632fea-a deleted file mode 100644 index 31b5788..0000000 --- a/.cache/go-build/20/20ae58d8a822583f601194b24b85ef2da01c1f0046f297e50149a00c7f632fea-a +++ /dev/null @@ -1 +0,0 @@ -v1 20ae58d8a822583f601194b24b85ef2da01c1f0046f297e50149a00c7f632fea e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775141782757811562 diff --git a/.cache/go-build/20/20d8f5a799237f98b5a922dc0bbba47ebadedc93c66acce47b933425e31aa593-a b/.cache/go-build/20/20d8f5a799237f98b5a922dc0bbba47ebadedc93c66acce47b933425e31aa593-a deleted file mode 100644 index 364ccfc..0000000 --- a/.cache/go-build/20/20d8f5a799237f98b5a922dc0bbba47ebadedc93c66acce47b933425e31aa593-a +++ /dev/null @@ -1 +0,0 @@ -v1 20d8f5a799237f98b5a922dc0bbba47ebadedc93c66acce47b933425e31aa593 7c9a970d9382082b7c56eab97f0e61586d97b44ab9728adb5d24b9aa76683f23 1967 1775136286809778426 diff --git a/.cache/go-build/20/20dc3e43e7d02778869fa90103f60f9d1d7989094bbac57ba03f44f5f167fa58-a b/.cache/go-build/20/20dc3e43e7d02778869fa90103f60f9d1d7989094bbac57ba03f44f5f167fa58-a deleted file mode 100644 index 9b8604d..0000000 --- a/.cache/go-build/20/20dc3e43e7d02778869fa90103f60f9d1d7989094bbac57ba03f44f5f167fa58-a +++ /dev/null @@ -1 +0,0 @@ -v1 20dc3e43e7d02778869fa90103f60f9d1d7989094bbac57ba03f44f5f167fa58 c1c849123087f7a359775eae86055eebba095dd8f4fc0df78c19db16abf8cd60 6333 1775136286824867707 diff --git a/.cache/go-build/20/20ea81bf0563c6cf49bb34a416512c9e5fe098c25190e9901abcfbff0294a651-d b/.cache/go-build/20/20ea81bf0563c6cf49bb34a416512c9e5fe098c25190e9901abcfbff0294a651-d deleted file mode 100644 index 66e2f8b..0000000 Binary files a/.cache/go-build/20/20ea81bf0563c6cf49bb34a416512c9e5fe098c25190e9901abcfbff0294a651-d and /dev/null differ diff --git a/.cache/go-build/21/2107c46548dc41817274a588bfd4576a8f54494624c961518702e64429839522-a b/.cache/go-build/21/2107c46548dc41817274a588bfd4576a8f54494624c961518702e64429839522-a deleted file mode 100644 index 5759ace..0000000 --- a/.cache/go-build/21/2107c46548dc41817274a588bfd4576a8f54494624c961518702e64429839522-a +++ /dev/null @@ -1 +0,0 @@ -v1 2107c46548dc41817274a588bfd4576a8f54494624c961518702e64429839522 b7659636d1d7270998b53a634b1da9d377a6e16bc5c348fb1a54c591912ab37b 411878 1775136289951745634 diff --git a/.cache/go-build/21/21b0476bd6d067cf8c85a0593510ede33bf54a1e3ec32abdb188219e716517a3-a b/.cache/go-build/21/21b0476bd6d067cf8c85a0593510ede33bf54a1e3ec32abdb188219e716517a3-a deleted file mode 100644 index 36c32a2..0000000 --- a/.cache/go-build/21/21b0476bd6d067cf8c85a0593510ede33bf54a1e3ec32abdb188219e716517a3-a +++ /dev/null @@ -1 +0,0 @@ -v1 21b0476bd6d067cf8c85a0593510ede33bf54a1e3ec32abdb188219e716517a3 1a26102a1591c79c4895a1ae58f57f4b65496e0a735f2bf9b139159152bbfe98 7149 1775136286825901188 diff --git a/.cache/go-build/21/21d8381f08196ff6b76a984d4934dcb33ed5b124cc4fc04af3ee589a0428faa4-a b/.cache/go-build/21/21d8381f08196ff6b76a984d4934dcb33ed5b124cc4fc04af3ee589a0428faa4-a deleted file mode 100644 index ec1a706..0000000 --- a/.cache/go-build/21/21d8381f08196ff6b76a984d4934dcb33ed5b124cc4fc04af3ee589a0428faa4-a +++ /dev/null @@ -1 +0,0 @@ -v1 21d8381f08196ff6b76a984d4934dcb33ed5b124cc4fc04af3ee589a0428faa4 43c4af69dd2bd389aaaaeac1f3b9e24a849a2d0ab7c7f16dfbfad17ddf53d486 44 1775136286920894466 diff --git a/.cache/go-build/21/21faa15c5febcadadca5225fffd0292072de38e138bf5fe2ff635cc6450d7c4e-d b/.cache/go-build/21/21faa15c5febcadadca5225fffd0292072de38e138bf5fe2ff635cc6450d7c4e-d deleted file mode 100644 index e74e150..0000000 --- a/.cache/go-build/21/21faa15c5febcadadca5225fffd0292072de38e138bf5fe2ff635cc6450d7c4e-d +++ /dev/null @@ -1,3 +0,0 @@ -./chacha8.go -./chacha8_generic.go -./chacha8_amd64.s diff --git a/.cache/go-build/22/220c3eb368a151d62abea6651ea4c9d88bd44a713538b70de897ee21ff53529c-d b/.cache/go-build/22/220c3eb368a151d62abea6651ea4c9d88bd44a713538b70de897ee21ff53529c-d deleted file mode 100644 index bb6eaa7..0000000 --- a/.cache/go-build/22/220c3eb368a151d62abea6651ea4c9d88bd44a713538b70de897ee21ff53529c-d +++ /dev/null @@ -1,3 +0,0 @@ -./interface.go -./parser.go -./resolver.go diff --git a/.cache/go-build/22/2241a18eb9a954f296bbd4200cb7238c9a340406ef9cbc0c46c159338c73fc5f-a b/.cache/go-build/22/2241a18eb9a954f296bbd4200cb7238c9a340406ef9cbc0c46c159338c73fc5f-a deleted file mode 100644 index a102d50..0000000 --- a/.cache/go-build/22/2241a18eb9a954f296bbd4200cb7238c9a340406ef9cbc0c46c159338c73fc5f-a +++ /dev/null @@ -1 +0,0 @@ -v1 2241a18eb9a954f296bbd4200cb7238c9a340406ef9cbc0c46c159338c73fc5f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286991815806 diff --git a/.cache/go-build/22/22780831bb6dc0d02a816efea7fa019c37fcaa40405937286299bfb9bc679000-a b/.cache/go-build/22/22780831bb6dc0d02a816efea7fa019c37fcaa40405937286299bfb9bc679000-a deleted file mode 100644 index 6f878ef..0000000 --- a/.cache/go-build/22/22780831bb6dc0d02a816efea7fa019c37fcaa40405937286299bfb9bc679000-a +++ /dev/null @@ -1 +0,0 @@ -v1 22780831bb6dc0d02a816efea7fa019c37fcaa40405937286299bfb9bc679000 d0aae7c63c0f629645442578da902a58986aba21cdc55b5a75160f7e65d62220 672 1775136289171057755 diff --git a/.cache/go-build/22/2293db70ae4189c4a53fd8073c6e362764b6ccdbdac1db8c8595bb2cd6256db0-d b/.cache/go-build/22/2293db70ae4189c4a53fd8073c6e362764b6ccdbdac1db8c8595bb2cd6256db0-d deleted file mode 100644 index 88d9f16..0000000 Binary files a/.cache/go-build/22/2293db70ae4189c4a53fd8073c6e362764b6ccdbdac1db8c8595bb2cd6256db0-d and /dev/null differ diff --git a/.cache/go-build/22/229b086fff3b69b974439cc55c623c8a044c0fb1255149f5a0e9adb82c042db6-d b/.cache/go-build/22/229b086fff3b69b974439cc55c623c8a044c0fb1255149f5a0e9adb82c042db6-d deleted file mode 100644 index a727632..0000000 Binary files a/.cache/go-build/22/229b086fff3b69b974439cc55c623c8a044c0fb1255149f5a0e9adb82c042db6-d and /dev/null differ diff --git a/.cache/go-build/22/22d379f3052081c55bcd1e350b06f48c8ebe8ca04a0d7426c3182e8d8135cfd4-a b/.cache/go-build/22/22d379f3052081c55bcd1e350b06f48c8ebe8ca04a0d7426c3182e8d8135cfd4-a deleted file mode 100644 index fc1b245..0000000 --- a/.cache/go-build/22/22d379f3052081c55bcd1e350b06f48c8ebe8ca04a0d7426c3182e8d8135cfd4-a +++ /dev/null @@ -1 +0,0 @@ -v1 22d379f3052081c55bcd1e350b06f48c8ebe8ca04a0d7426c3182e8d8135cfd4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287150465060 diff --git a/.cache/go-build/22/22e2b58873e743d301a7deada9cb354fd8df3e1680bc00e8527254ce351a6504-a b/.cache/go-build/22/22e2b58873e743d301a7deada9cb354fd8df3e1680bc00e8527254ce351a6504-a deleted file mode 100644 index ee8398e..0000000 --- a/.cache/go-build/22/22e2b58873e743d301a7deada9cb354fd8df3e1680bc00e8527254ce351a6504-a +++ /dev/null @@ -1 +0,0 @@ -v1 22e2b58873e743d301a7deada9cb354fd8df3e1680bc00e8527254ce351a6504 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136290014034638 diff --git a/.cache/go-build/22/22e9c935db51d7211f3ae6845f212d1a3a3ed7cc665a333e6313885584b1b5dd-d b/.cache/go-build/22/22e9c935db51d7211f3ae6845f212d1a3a3ed7cc665a333e6313885584b1b5dd-d deleted file mode 100644 index 752a581..0000000 --- a/.cache/go-build/22/22e9c935db51d7211f3ae6845f212d1a3a3ed7cc665a333e6313885584b1b5dd-d +++ /dev/null @@ -1,4 +0,0 @@ -./swapper.go -./type.go -./value.go -./asm.s diff --git a/.cache/go-build/22/22f9172c96d60d6acec663866ecc1b88cfe7c54f0783c888dcc2b6793c2990e3-a b/.cache/go-build/22/22f9172c96d60d6acec663866ecc1b88cfe7c54f0783c888dcc2b6793c2990e3-a deleted file mode 100644 index a52da06..0000000 --- a/.cache/go-build/22/22f9172c96d60d6acec663866ecc1b88cfe7c54f0783c888dcc2b6793c2990e3-a +++ /dev/null @@ -1 +0,0 @@ -v1 22f9172c96d60d6acec663866ecc1b88cfe7c54f0783c888dcc2b6793c2990e3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184126440892 diff --git a/.cache/go-build/23/23446b7fe0929eafcf3aab1786c53dfb76840f440b877bffe98127556087c416-d b/.cache/go-build/23/23446b7fe0929eafcf3aab1786c53dfb76840f440b877bffe98127556087c416-d deleted file mode 100644 index 01d5160..0000000 --- a/.cache/go-build/23/23446b7fe0929eafcf3aab1786c53dfb76840f440b877bffe98127556087c416-d +++ /dev/null @@ -1,8 +0,0 @@ -./consts.go -./consts_norace.go -./intrinsics.go -./nih.go -./no_dit.go -./sys.go -./zversion.go -./empty.s diff --git a/.cache/go-build/23/237d802786db232a26c200ca02caa02251b822b160c29cd83ef16ba970439dd1-a b/.cache/go-build/23/237d802786db232a26c200ca02caa02251b822b160c29cd83ef16ba970439dd1-a deleted file mode 100644 index f0a31b4..0000000 --- a/.cache/go-build/23/237d802786db232a26c200ca02caa02251b822b160c29cd83ef16ba970439dd1-a +++ /dev/null @@ -1 +0,0 @@ -v1 237d802786db232a26c200ca02caa02251b822b160c29cd83ef16ba970439dd1 0d195f1e966b6068bde57be5aca4501879d9dd3af61471366daa56d86cbf884c 35 1775138184038633759 diff --git a/.cache/go-build/23/23d051e7d2531853a8b8ff09fa728476ee6c7748ced4ab69a134c90b097dedf4-d b/.cache/go-build/23/23d051e7d2531853a8b8ff09fa728476ee6c7748ced4ab69a134c90b097dedf4-d deleted file mode 100644 index 559e406..0000000 --- a/.cache/go-build/23/23d051e7d2531853a8b8ff09fa728476ee6c7748ced4ab69a134c90b097dedf4-d +++ /dev/null @@ -1 +0,0 @@ -./impl.go diff --git a/.cache/go-build/23/23f1f4495d041d96972cee5323db20863cee18c997e20c39e062086a69fbf717-a b/.cache/go-build/23/23f1f4495d041d96972cee5323db20863cee18c997e20c39e062086a69fbf717-a deleted file mode 100644 index e9f9d1a..0000000 --- a/.cache/go-build/23/23f1f4495d041d96972cee5323db20863cee18c997e20c39e062086a69fbf717-a +++ /dev/null @@ -1 +0,0 @@ -v1 23f1f4495d041d96972cee5323db20863cee18c997e20c39e062086a69fbf717 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289830257157 diff --git a/.cache/go-build/24/24a707fe4791bc4d2fb8307e28acbafafcfb58eb49caa1962365b857bf3e408a-a b/.cache/go-build/24/24a707fe4791bc4d2fb8307e28acbafafcfb58eb49caa1962365b857bf3e408a-a deleted file mode 100644 index 8b73f62..0000000 --- a/.cache/go-build/24/24a707fe4791bc4d2fb8307e28acbafafcfb58eb49caa1962365b857bf3e408a-a +++ /dev/null @@ -1 +0,0 @@ -v1 24a707fe4791bc4d2fb8307e28acbafafcfb58eb49caa1962365b857bf3e408a 10a6edbf25945293f192a62a026f23160d410e9fa724ab397af51aa640701ea2 1910786 1775136289726112402 diff --git a/.cache/go-build/24/24b901f67fdd991e8e38a99964c4433e2aef4d9d83b12a8a0b7146fcb172d3db-a b/.cache/go-build/24/24b901f67fdd991e8e38a99964c4433e2aef4d9d83b12a8a0b7146fcb172d3db-a deleted file mode 100644 index c6c9ede..0000000 --- a/.cache/go-build/24/24b901f67fdd991e8e38a99964c4433e2aef4d9d83b12a8a0b7146fcb172d3db-a +++ /dev/null @@ -1 +0,0 @@ -v1 24b901f67fdd991e8e38a99964c4433e2aef4d9d83b12a8a0b7146fcb172d3db 1bd0e7b814a828e09535fb001f8a91c34b4494f123abb888db0c224bd74ab91b 15 1775136286917619453 diff --git a/.cache/go-build/25/2504db93d2f28e6e09170315a1dc2d9162de950077c1a8ec20c4ba32c0e55367-d b/.cache/go-build/25/2504db93d2f28e6e09170315a1dc2d9162de950077c1a8ec20c4ba32c0e55367-d deleted file mode 100644 index 8b31fd3..0000000 Binary files a/.cache/go-build/25/2504db93d2f28e6e09170315a1dc2d9162de950077c1a8ec20c4ba32c0e55367-d and /dev/null differ diff --git a/.cache/go-build/25/25252f3aa143afe21d566228004bf90d7f9333d879bb19c52ddb46dc8f5365d9-d b/.cache/go-build/25/25252f3aa143afe21d566228004bf90d7f9333d879bb19c52ddb46dc8f5365d9-d deleted file mode 100644 index 3a8f857..0000000 Binary files a/.cache/go-build/25/25252f3aa143afe21d566228004bf90d7f9333d879bb19c52ddb46dc8f5365d9-d and /dev/null differ diff --git a/.cache/go-build/25/25311569cdb29e44963b8eda4dd7936aa6acfd408d2d64a3bd1825bb274954ad-a b/.cache/go-build/25/25311569cdb29e44963b8eda4dd7936aa6acfd408d2d64a3bd1825bb274954ad-a deleted file mode 100644 index 3f57bfc..0000000 --- a/.cache/go-build/25/25311569cdb29e44963b8eda4dd7936aa6acfd408d2d64a3bd1825bb274954ad-a +++ /dev/null @@ -1 +0,0 @@ -v1 25311569cdb29e44963b8eda4dd7936aa6acfd408d2d64a3bd1825bb274954ad 3ed397a86b9b39397e91b96faee138ea9590dc71a7946e64cbfca532bcdd39d2 13 1775136289586446332 diff --git a/.cache/go-build/25/255f83943988313d0c19a84eb19e066e962b3d56903b2215da3eb5041325decb-d b/.cache/go-build/25/255f83943988313d0c19a84eb19e066e962b3d56903b2215da3eb5041325decb-d deleted file mode 100644 index 8f9e90b..0000000 Binary files a/.cache/go-build/25/255f83943988313d0c19a84eb19e066e962b3d56903b2215da3eb5041325decb-d and /dev/null differ diff --git a/.cache/go-build/25/25cb6885b37374c34d4e1d50bc6cdf54148525f305b3834fcc34f09666be41e2-d b/.cache/go-build/25/25cb6885b37374c34d4e1d50bc6cdf54148525f305b3834fcc34f09666be41e2-d deleted file mode 100644 index abd810d..0000000 Binary files a/.cache/go-build/25/25cb6885b37374c34d4e1d50bc6cdf54148525f305b3834fcc34f09666be41e2-d and /dev/null differ diff --git a/.cache/go-build/25/25cba06039d08252bc6f6f4b083096d8edce48dcb917c07f4e4d7faa36f93bca-a b/.cache/go-build/25/25cba06039d08252bc6f6f4b083096d8edce48dcb917c07f4e4d7faa36f93bca-a deleted file mode 100644 index ef5670f..0000000 --- a/.cache/go-build/25/25cba06039d08252bc6f6f4b083096d8edce48dcb917c07f4e4d7faa36f93bca-a +++ /dev/null @@ -1 +0,0 @@ -v1 25cba06039d08252bc6f6f4b083096d8edce48dcb917c07f4e4d7faa36f93bca 0ec63109e343eea06ad50e28c1acb83ae4d5a90b0457c648e07f4a8eaed5aa0b 181 1775136288963168966 diff --git a/.cache/go-build/25/25cc3eb697808e962150312a12c90286e71772822eca2c5717ea75b4fa57cfbc-d b/.cache/go-build/25/25cc3eb697808e962150312a12c90286e71772822eca2c5717ea75b4fa57cfbc-d deleted file mode 100644 index a1cf9a4..0000000 --- a/.cache/go-build/25/25cc3eb697808e962150312a12c90286e71772822eca2c5717ea75b4fa57cfbc-d +++ /dev/null @@ -1,14 +0,0 @@ -./bytealg.go -./compare_native.go -./count_native.go -./equal_generic.go -./equal_native.go -./index_amd64.go -./index_native.go -./indexbyte_native.go -./lastindexbyte_generic.go -./compare_amd64.s -./count_amd64.s -./equal_amd64.s -./index_amd64.s -./indexbyte_amd64.s diff --git a/.cache/go-build/25/25d999ed219a49c26a58c9a2b771c1a3cef2ed2dcf408860438ecdffc5820be4-a b/.cache/go-build/25/25d999ed219a49c26a58c9a2b771c1a3cef2ed2dcf408860438ecdffc5820be4-a deleted file mode 100644 index b0575f4..0000000 --- a/.cache/go-build/25/25d999ed219a49c26a58c9a2b771c1a3cef2ed2dcf408860438ecdffc5820be4-a +++ /dev/null @@ -1 +0,0 @@ -v1 25d999ed219a49c26a58c9a2b771c1a3cef2ed2dcf408860438ecdffc5820be4 6673f85d4ca930185ebdd741a615fbf0fc26494c8657c9574baa94a74d257549 24 1775136289412688928 diff --git a/.cache/go-build/25/25ecf3f80c251bebd0d271a9eaf8a3f21b681f12c9c8be4d07ed05c3bf383c0d-a b/.cache/go-build/25/25ecf3f80c251bebd0d271a9eaf8a3f21b681f12c9c8be4d07ed05c3bf383c0d-a deleted file mode 100644 index 16e2721..0000000 --- a/.cache/go-build/25/25ecf3f80c251bebd0d271a9eaf8a3f21b681f12c9c8be4d07ed05c3bf383c0d-a +++ /dev/null @@ -1 +0,0 @@ -v1 25ecf3f80c251bebd0d271a9eaf8a3f21b681f12c9c8be4d07ed05c3bf383c0d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289398194718 diff --git a/.cache/go-build/25/25f66d679bbe67c0b28f68e7e51be35ae7f74b78528f9f12fc87d6b2292882fc-d b/.cache/go-build/25/25f66d679bbe67c0b28f68e7e51be35ae7f74b78528f9f12fc87d6b2292882fc-d deleted file mode 100644 index 6967ac2..0000000 Binary files a/.cache/go-build/25/25f66d679bbe67c0b28f68e7e51be35ae7f74b78528f9f12fc87d6b2292882fc-d and /dev/null differ diff --git a/.cache/go-build/26/260a7f7596ac4595ea5021777e415596395ad34545c3ff3a36b76fe0515e5736-d b/.cache/go-build/26/260a7f7596ac4595ea5021777e415596395ad34545c3ff3a36b76fe0515e5736-d deleted file mode 100644 index 434f7df..0000000 Binary files a/.cache/go-build/26/260a7f7596ac4595ea5021777e415596395ad34545c3ff3a36b76fe0515e5736-d and /dev/null differ diff --git a/.cache/go-build/26/261dbac730a396eb705b57fbcd7bfa572897603d057feb5ce7f67a323eba1742-a b/.cache/go-build/26/261dbac730a396eb705b57fbcd7bfa572897603d057feb5ce7f67a323eba1742-a deleted file mode 100644 index a96ad23..0000000 --- a/.cache/go-build/26/261dbac730a396eb705b57fbcd7bfa572897603d057feb5ce7f67a323eba1742-a +++ /dev/null @@ -1 +0,0 @@ -v1 261dbac730a396eb705b57fbcd7bfa572897603d057feb5ce7f67a323eba1742 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184256615705 diff --git a/.cache/go-build/26/264833a310819dbae89b9ddc272a33844d950b9fe626cc755e60a866eec0ce2b-a b/.cache/go-build/26/264833a310819dbae89b9ddc272a33844d950b9fe626cc755e60a866eec0ce2b-a deleted file mode 100644 index 979e45f..0000000 --- a/.cache/go-build/26/264833a310819dbae89b9ddc272a33844d950b9fe626cc755e60a866eec0ce2b-a +++ /dev/null @@ -1 +0,0 @@ -v1 264833a310819dbae89b9ddc272a33844d950b9fe626cc755e60a866eec0ce2b 18ede9f69ed582ab27c366754dbc85c720753742baf19469e13f118387f7d8c6 265 1775136286936193747 diff --git a/.cache/go-build/26/264f18ff71def3de54bb4d0b1eef4cf1052b6955dddb4b5ac85706d0a5e08c41-a b/.cache/go-build/26/264f18ff71def3de54bb4d0b1eef4cf1052b6955dddb4b5ac85706d0a5e08c41-a deleted file mode 100644 index 281dad2..0000000 --- a/.cache/go-build/26/264f18ff71def3de54bb4d0b1eef4cf1052b6955dddb4b5ac85706d0a5e08c41-a +++ /dev/null @@ -1 +0,0 @@ -v1 264f18ff71def3de54bb4d0b1eef4cf1052b6955dddb4b5ac85706d0a5e08c41 377fb9290326a21d1cf245d213930510485d0649bdaadf1ff223cfa6f19c6f53 73 1775137722029470775 diff --git a/.cache/go-build/26/266ce9ef8a5962ef021001ccb30be425be2f7b14a70484b7faa20947d14333c2-a b/.cache/go-build/26/266ce9ef8a5962ef021001ccb30be425be2f7b14a70484b7faa20947d14333c2-a deleted file mode 100644 index ea6dc5e..0000000 --- a/.cache/go-build/26/266ce9ef8a5962ef021001ccb30be425be2f7b14a70484b7faa20947d14333c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 266ce9ef8a5962ef021001ccb30be425be2f7b14a70484b7faa20947d14333c2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398430155989 diff --git a/.cache/go-build/26/268bec9b9339d7b6cbde6f853330b3d890f537ed9f04a025932b545014a0b61d-d b/.cache/go-build/26/268bec9b9339d7b6cbde6f853330b3d890f537ed9f04a025932b545014a0b61d-d deleted file mode 100644 index 1be823b..0000000 --- a/.cache/go-build/26/268bec9b9339d7b6cbde6f853330b3d890f537ed9f04a025932b545014a0b61d-d +++ /dev/null @@ -1,11 +0,0 @@ -./aes.go -./aes_asm.go -./aes_generic.go -./cast.go -./cbc.go -./cbc_noasm.go -./const.go -./ctr.go -./ctr_asm.go -./aes_amd64.s -./ctr_amd64.s diff --git a/.cache/go-build/26/2693a6572ed3dedf41bad0b4af9bbde1c199b8d62b9d446ce295b519766c1492-a b/.cache/go-build/26/2693a6572ed3dedf41bad0b4af9bbde1c199b8d62b9d446ce295b519766c1492-a deleted file mode 100644 index 9b690f9..0000000 --- a/.cache/go-build/26/2693a6572ed3dedf41bad0b4af9bbde1c199b8d62b9d446ce295b519766c1492-a +++ /dev/null @@ -1 +0,0 @@ -v1 2693a6572ed3dedf41bad0b4af9bbde1c199b8d62b9d446ce295b519766c1492 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398442906218 diff --git a/.cache/go-build/26/26ba55da7fa9e9b4b8a3494dd2a410744b31d92dd420cd3a0773359eadb16ac0-a b/.cache/go-build/26/26ba55da7fa9e9b4b8a3494dd2a410744b31d92dd420cd3a0773359eadb16ac0-a deleted file mode 100644 index ccbf851..0000000 --- a/.cache/go-build/26/26ba55da7fa9e9b4b8a3494dd2a410744b31d92dd420cd3a0773359eadb16ac0-a +++ /dev/null @@ -1 +0,0 @@ -v1 26ba55da7fa9e9b4b8a3494dd2a410744b31d92dd420cd3a0773359eadb16ac0 220c3eb368a151d62abea6651ea4c9d88bd44a713538b70de897ee21ff53529c 41 1775136289726379052 diff --git a/.cache/go-build/26/26c1c1237e6b50c0cacfa11583e112d4f58a8c14f225ed5fde6597103f90f6aa-d b/.cache/go-build/26/26c1c1237e6b50c0cacfa11583e112d4f58a8c14f225ed5fde6597103f90f6aa-d deleted file mode 100644 index 143643a..0000000 Binary files a/.cache/go-build/26/26c1c1237e6b50c0cacfa11583e112d4f58a8c14f225ed5fde6597103f90f6aa-d and /dev/null differ diff --git a/.cache/go-build/26/26d6bfea98d5a83cdab4b32b160ca07011d3582f04d08c32d83f0988f9c33241-a b/.cache/go-build/26/26d6bfea98d5a83cdab4b32b160ca07011d3582f04d08c32d83f0988f9c33241-a deleted file mode 100644 index 7604068..0000000 --- a/.cache/go-build/26/26d6bfea98d5a83cdab4b32b160ca07011d3582f04d08c32d83f0988f9c33241-a +++ /dev/null @@ -1 +0,0 @@ -v1 26d6bfea98d5a83cdab4b32b160ca07011d3582f04d08c32d83f0988f9c33241 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775137722150577021 diff --git a/.cache/go-build/26/26e14dd9b4a8c9a7ac81589c70ab1fb7e4d4ee96cfd768883e2bdaf0eee28101-a b/.cache/go-build/26/26e14dd9b4a8c9a7ac81589c70ab1fb7e4d4ee96cfd768883e2bdaf0eee28101-a deleted file mode 100644 index a75c66f..0000000 --- a/.cache/go-build/26/26e14dd9b4a8c9a7ac81589c70ab1fb7e4d4ee96cfd768883e2bdaf0eee28101-a +++ /dev/null @@ -1 +0,0 @@ -v1 26e14dd9b4a8c9a7ac81589c70ab1fb7e4d4ee96cfd768883e2bdaf0eee28101 e1cb7915fe3e844411bdc3bb4e3ec52420ee63e15cd8fa5acc81a2fb94343427 280604 1775136287031775565 diff --git a/.cache/go-build/27/271b62db0d25e7c5f5013fc17749bd1b186d11e045ab16e6ced6cf1aabe58a4a-a b/.cache/go-build/27/271b62db0d25e7c5f5013fc17749bd1b186d11e045ab16e6ced6cf1aabe58a4a-a deleted file mode 100644 index eed34b6..0000000 --- a/.cache/go-build/27/271b62db0d25e7c5f5013fc17749bd1b186d11e045ab16e6ced6cf1aabe58a4a-a +++ /dev/null @@ -1 +0,0 @@ -v1 271b62db0d25e7c5f5013fc17749bd1b186d11e045ab16e6ced6cf1aabe58a4a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286928607891 diff --git a/.cache/go-build/27/273d0818df1c68af64f275cb71a69bc078b26c3399dfb9814760a8b7526ed219-a b/.cache/go-build/27/273d0818df1c68af64f275cb71a69bc078b26c3399dfb9814760a8b7526ed219-a deleted file mode 100644 index 713d1f4..0000000 --- a/.cache/go-build/27/273d0818df1c68af64f275cb71a69bc078b26c3399dfb9814760a8b7526ed219-a +++ /dev/null @@ -1 +0,0 @@ -v1 273d0818df1c68af64f275cb71a69bc078b26c3399dfb9814760a8b7526ed219 6bd129fe34098ea42aea0962860c1c9d37c0e9f08d482a5dcdf10ac7936acee7 77 1775136286935656776 diff --git a/.cache/go-build/27/27950be934172238ed07b312b3bf6ccf75e59fb9b5c5042ee71639b85ca6273d-d b/.cache/go-build/27/27950be934172238ed07b312b3bf6ccf75e59fb9b5c5042ee71639b85ca6273d-d deleted file mode 100644 index ac04af7..0000000 --- a/.cache/go-build/27/27950be934172238ed07b312b3bf6ccf75e59fb9b5c5042ee71639b85ca6273d-d +++ /dev/null @@ -1,9 +0,0 @@ -./ast.go -./commentmap.go -./directive.go -./filter.go -./import.go -./print.go -./resolve.go -./scope.go -./walk.go diff --git a/.cache/go-build/27/279633ee051ccfda9b584834b083f68038f7cbccec9c897e1812f4544379a540-d b/.cache/go-build/27/279633ee051ccfda9b584834b083f68038f7cbccec9c897e1812f4544379a540-d deleted file mode 100644 index e8dbbd7..0000000 Binary files a/.cache/go-build/27/279633ee051ccfda9b584834b083f68038f7cbccec9c897e1812f4544379a540-d and /dev/null differ diff --git a/.cache/go-build/28/280af15a570090583556872c619418b5ea9a104c9169a636ff0c6410310b3bcd-a b/.cache/go-build/28/280af15a570090583556872c619418b5ea9a104c9169a636ff0c6410310b3bcd-a deleted file mode 100644 index da92fbd..0000000 --- a/.cache/go-build/28/280af15a570090583556872c619418b5ea9a104c9169a636ff0c6410310b3bcd-a +++ /dev/null @@ -1 +0,0 @@ -v1 280af15a570090583556872c619418b5ea9a104c9169a636ff0c6410310b3bcd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288780082406 diff --git a/.cache/go-build/28/285a978d88032ef0dc8b9b30cae432127273a838c411ca473e46c94c8b9cb392-d b/.cache/go-build/28/285a978d88032ef0dc8b9b30cae432127273a838c411ca473e46c94c8b9cb392-d deleted file mode 100644 index f97316a..0000000 --- a/.cache/go-build/28/285a978d88032ef0dc8b9b30cae432127273a838c411ca473e46c94c8b9cb392-d +++ /dev/null @@ -1,2 +0,0 @@ -./match.go -./path.go diff --git a/.cache/go-build/29/295041fe4924809bb5f6137476373eaa9091aea7edf71f5e1b2297dee1f4638b-a b/.cache/go-build/29/295041fe4924809bb5f6137476373eaa9091aea7edf71f5e1b2297dee1f4638b-a deleted file mode 100644 index 97a9f8f..0000000 --- a/.cache/go-build/29/295041fe4924809bb5f6137476373eaa9091aea7edf71f5e1b2297dee1f4638b-a +++ /dev/null @@ -1 +0,0 @@ -v1 295041fe4924809bb5f6137476373eaa9091aea7edf71f5e1b2297dee1f4638b 833d5b756d06d851dfd9c9f62afd2175a0bc0109f7e7e19abe173fd27f7d6b9a 16901 1775136290027063777 diff --git a/.cache/go-build/29/2992afcdd8efa0f6b9d62c7ae3217363e218fc04af42b7c729404a88f804a622-a b/.cache/go-build/29/2992afcdd8efa0f6b9d62c7ae3217363e218fc04af42b7c729404a88f804a622-a deleted file mode 100644 index 25b35f4..0000000 --- a/.cache/go-build/29/2992afcdd8efa0f6b9d62c7ae3217363e218fc04af42b7c729404a88f804a622-a +++ /dev/null @@ -1 +0,0 @@ -v1 2992afcdd8efa0f6b9d62c7ae3217363e218fc04af42b7c729404a88f804a622 61894afd790486ba93c623fce3be1deba3a4b95488bda16d70dbf06df13294c3 1300 1775136286920821836 diff --git a/.cache/go-build/29/299c145771b863c594023b7f114f3f3d0d8bacdc144840928a443162ab3f251f-a b/.cache/go-build/29/299c145771b863c594023b7f114f3f3d0d8bacdc144840928a443162ab3f251f-a deleted file mode 100644 index d5a7f7f..0000000 --- a/.cache/go-build/29/299c145771b863c594023b7f114f3f3d0d8bacdc144840928a443162ab3f251f-a +++ /dev/null @@ -1 +0,0 @@ -v1 299c145771b863c594023b7f114f3f3d0d8bacdc144840928a443162ab3f251f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289146597648 diff --git a/.cache/go-build/29/29b051b653a394836f379f6d79fca8395d130465de3003fbacf8d3cf9396f976-d b/.cache/go-build/29/29b051b653a394836f379f6d79fca8395d130465de3003fbacf8d3cf9396f976-d deleted file mode 100644 index 8342c70..0000000 --- a/.cache/go-build/29/29b051b653a394836f379f6d79fca8395d130465de3003fbacf8d3cf9396f976-d +++ /dev/null @@ -1,3 +0,0 @@ -./errors.go -./join.go -./wrap.go diff --git a/.cache/go-build/29/29d80a873c5277b7ef79057819edee21e63782cfe59dceb9f80d69a741706e3d-a b/.cache/go-build/29/29d80a873c5277b7ef79057819edee21e63782cfe59dceb9f80d69a741706e3d-a deleted file mode 100644 index b992087..0000000 --- a/.cache/go-build/29/29d80a873c5277b7ef79057819edee21e63782cfe59dceb9f80d69a741706e3d-a +++ /dev/null @@ -1 +0,0 @@ -v1 29d80a873c5277b7ef79057819edee21e63782cfe59dceb9f80d69a741706e3d 56256251b3ef6275504a2c55ff9be01e845eb6222f7e62a938077d33f2e33f8e 875 1775136286829498360 diff --git a/.cache/go-build/29/29f07991c7fd2a9378712564fc805f97b1725be97ceed9103e2bcd82f367ee60-a b/.cache/go-build/29/29f07991c7fd2a9378712564fc805f97b1725be97ceed9103e2bcd82f367ee60-a deleted file mode 100644 index 46b5c38..0000000 --- a/.cache/go-build/29/29f07991c7fd2a9378712564fc805f97b1725be97ceed9103e2bcd82f367ee60-a +++ /dev/null @@ -1 +0,0 @@ -v1 29f07991c7fd2a9378712564fc805f97b1725be97ceed9103e2bcd82f367ee60 ff0b7154a0cd7748866c10f25d5297a72ed9df33fe5d420037363abdd781afe2 2520 1775136286950399797 diff --git a/.cache/go-build/2a/2a0ba2730395bbb319d419377ec92e1f1a6abcec14e3bde574d5bd44f0952e70-a b/.cache/go-build/2a/2a0ba2730395bbb319d419377ec92e1f1a6abcec14e3bde574d5bd44f0952e70-a deleted file mode 100644 index 1e45619..0000000 --- a/.cache/go-build/2a/2a0ba2730395bbb319d419377ec92e1f1a6abcec14e3bde574d5bd44f0952e70-a +++ /dev/null @@ -1 +0,0 @@ -v1 2a0ba2730395bbb319d419377ec92e1f1a6abcec14e3bde574d5bd44f0952e70 6eb09056f12233d912516951528053a9cfc0b7d48d7a4ee0ae94dd7ae5165481 11870 1775136286948387935 diff --git a/.cache/go-build/2a/2ab94180a0e6f89c6248230bca447e81a99feec04fab97673e43f8188ba2b2c9-a b/.cache/go-build/2a/2ab94180a0e6f89c6248230bca447e81a99feec04fab97673e43f8188ba2b2c9-a deleted file mode 100644 index ec22b94..0000000 --- a/.cache/go-build/2a/2ab94180a0e6f89c6248230bca447e81a99feec04fab97673e43f8188ba2b2c9-a +++ /dev/null @@ -1 +0,0 @@ -v1 2ab94180a0e6f89c6248230bca447e81a99feec04fab97673e43f8188ba2b2c9 eac7e7da15a37795425fcc6752205fc450b442725b2fbffa54d67d68922a1aae 10 1775136288407605809 diff --git a/.cache/go-build/2a/2ae1a98b5dd35e504530e6b1e94e051b37451e0ec776d692468d4131bb1ca5bf-a b/.cache/go-build/2a/2ae1a98b5dd35e504530e6b1e94e051b37451e0ec776d692468d4131bb1ca5bf-a deleted file mode 100644 index 8d2fdb3..0000000 --- a/.cache/go-build/2a/2ae1a98b5dd35e504530e6b1e94e051b37451e0ec776d692468d4131bb1ca5bf-a +++ /dev/null @@ -1 +0,0 @@ -v1 2ae1a98b5dd35e504530e6b1e94e051b37451e0ec776d692468d4131bb1ca5bf e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398413495027 diff --git a/.cache/go-build/2b/2b2eeee1be7c0b5d52daa3f6fe1a9e0bf60bf6d02f9119e252cef409a586edae-d b/.cache/go-build/2b/2b2eeee1be7c0b5d52daa3f6fe1a9e0bf60bf6d02f9119e252cef409a586edae-d deleted file mode 100644 index 8c3c81f..0000000 Binary files a/.cache/go-build/2b/2b2eeee1be7c0b5d52daa3f6fe1a9e0bf60bf6d02f9119e252cef409a586edae-d and /dev/null differ diff --git a/.cache/go-build/2b/2b8604e1338bfdfe7e9d3ce8501470a463b4ef6fafdbc27937e3e54a64d94189-d b/.cache/go-build/2b/2b8604e1338bfdfe7e9d3ce8501470a463b4ef6fafdbc27937e3e54a64d94189-d deleted file mode 100644 index 1526c2b..0000000 Binary files a/.cache/go-build/2b/2b8604e1338bfdfe7e9d3ce8501470a463b4ef6fafdbc27937e3e54a64d94189-d and /dev/null differ diff --git a/.cache/go-build/2b/2bacc788351a287ce5181ca57ce8153ef2152d1c80bd92e35afead4e15f4b898-a b/.cache/go-build/2b/2bacc788351a287ce5181ca57ce8153ef2152d1c80bd92e35afead4e15f4b898-a deleted file mode 100644 index cf14789..0000000 --- a/.cache/go-build/2b/2bacc788351a287ce5181ca57ce8153ef2152d1c80bd92e35afead4e15f4b898-a +++ /dev/null @@ -1 +0,0 @@ -v1 2bacc788351a287ce5181ca57ce8153ef2152d1c80bd92e35afead4e15f4b898 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287052486130 diff --git a/.cache/go-build/2b/2bcc458e463447e4bdf03a77b2feaf9b8d147b8cee53ee0e360c68b4caf0c9ae-a b/.cache/go-build/2b/2bcc458e463447e4bdf03a77b2feaf9b8d147b8cee53ee0e360c68b4caf0c9ae-a deleted file mode 100644 index a4f2795..0000000 --- a/.cache/go-build/2b/2bcc458e463447e4bdf03a77b2feaf9b8d147b8cee53ee0e360c68b4caf0c9ae-a +++ /dev/null @@ -1 +0,0 @@ -v1 2bcc458e463447e4bdf03a77b2feaf9b8d147b8cee53ee0e360c68b4caf0c9ae e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289733525637 diff --git a/.cache/go-build/2b/2bf19efe3974543aa268ddd61b74bf8db8bcd7c9cccc05f50e1a99307c32d370-a b/.cache/go-build/2b/2bf19efe3974543aa268ddd61b74bf8db8bcd7c9cccc05f50e1a99307c32d370-a deleted file mode 100644 index fd907f0..0000000 --- a/.cache/go-build/2b/2bf19efe3974543aa268ddd61b74bf8db8bcd7c9cccc05f50e1a99307c32d370-a +++ /dev/null @@ -1 +0,0 @@ -v1 2bf19efe3974543aa268ddd61b74bf8db8bcd7c9cccc05f50e1a99307c32d370 34331c95f4aa922a20b0fdd5841f63c5bc6b569558334c4415692fbfe1fb666f 241754 1775137721888509294 diff --git a/.cache/go-build/2c/2c43fca548905a6aeb8cf20d857bd5f20da859dcfbeff364f4f6bd5dc180b01d-d b/.cache/go-build/2c/2c43fca548905a6aeb8cf20d857bd5f20da859dcfbeff364f4f6bd5dc180b01d-d deleted file mode 100644 index 9205b28..0000000 Binary files a/.cache/go-build/2c/2c43fca548905a6aeb8cf20d857bd5f20da859dcfbeff364f4f6bd5dc180b01d-d and /dev/null differ diff --git a/.cache/go-build/2c/2c4a03ce99b6413c0e42817b5479500e9a39fb8d0771954743450fa8a9bdbf42-d b/.cache/go-build/2c/2c4a03ce99b6413c0e42817b5479500e9a39fb8d0771954743450fa8a9bdbf42-d deleted file mode 100644 index 9a5078a..0000000 Binary files a/.cache/go-build/2c/2c4a03ce99b6413c0e42817b5479500e9a39fb8d0771954743450fa8a9bdbf42-d and /dev/null differ diff --git a/.cache/go-build/2c/2c5c5ea3fce990a5ca89ec970f97416d454bc7da2051ae9fb0be46c6e24a8408-a b/.cache/go-build/2c/2c5c5ea3fce990a5ca89ec970f97416d454bc7da2051ae9fb0be46c6e24a8408-a deleted file mode 100644 index 513428d..0000000 --- a/.cache/go-build/2c/2c5c5ea3fce990a5ca89ec970f97416d454bc7da2051ae9fb0be46c6e24a8408-a +++ /dev/null @@ -1 +0,0 @@ -v1 2c5c5ea3fce990a5ca89ec970f97416d454bc7da2051ae9fb0be46c6e24a8408 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289014561293 diff --git a/.cache/go-build/2c/2c642d168b7cb35dcfa251c952251dd552d5f90e9b68e9ca97a4e1c57a1d6295-d b/.cache/go-build/2c/2c642d168b7cb35dcfa251c952251dd552d5f90e9b68e9ca97a4e1c57a1d6295-d deleted file mode 100644 index 7aec5e1..0000000 Binary files a/.cache/go-build/2c/2c642d168b7cb35dcfa251c952251dd552d5f90e9b68e9ca97a4e1c57a1d6295-d and /dev/null differ diff --git a/.cache/go-build/2c/2cc68dbefab1f18957c5ce343546e36fb834b9962d377d0ff9c2dd5f6f35cd8b-a b/.cache/go-build/2c/2cc68dbefab1f18957c5ce343546e36fb834b9962d377d0ff9c2dd5f6f35cd8b-a deleted file mode 100644 index b220517..0000000 --- a/.cache/go-build/2c/2cc68dbefab1f18957c5ce343546e36fb834b9962d377d0ff9c2dd5f6f35cd8b-a +++ /dev/null @@ -1 +0,0 @@ -v1 2cc68dbefab1f18957c5ce343546e36fb834b9962d377d0ff9c2dd5f6f35cd8b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286993323198 diff --git a/.cache/go-build/2c/2cf0bf3257d0e2f66dcf8635e1c09d1d276e7936d1a3c6cc3bc5c03f455b4dfe-a b/.cache/go-build/2c/2cf0bf3257d0e2f66dcf8635e1c09d1d276e7936d1a3c6cc3bc5c03f455b4dfe-a deleted file mode 100644 index 64df0a8..0000000 --- a/.cache/go-build/2c/2cf0bf3257d0e2f66dcf8635e1c09d1d276e7936d1a3c6cc3bc5c03f455b4dfe-a +++ /dev/null @@ -1 +0,0 @@ -v1 2cf0bf3257d0e2f66dcf8635e1c09d1d276e7936d1a3c6cc3bc5c03f455b4dfe 456147c28ac2d518a6222612fb57cdc751f44a544802ca2143753307210eaec8 103082 1775136288582780454 diff --git a/.cache/go-build/2d/2d0a54aa63def8c507d00ae9c11f8a9bb6ebc2e078b4d7ed62a3d38e12022d56-a b/.cache/go-build/2d/2d0a54aa63def8c507d00ae9c11f8a9bb6ebc2e078b4d7ed62a3d38e12022d56-a deleted file mode 100644 index c6aa901..0000000 --- a/.cache/go-build/2d/2d0a54aa63def8c507d00ae9c11f8a9bb6ebc2e078b4d7ed62a3d38e12022d56-a +++ /dev/null @@ -1 +0,0 @@ -v1 2d0a54aa63def8c507d00ae9c11f8a9bb6ebc2e078b4d7ed62a3d38e12022d56 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288511166243 diff --git a/.cache/go-build/2d/2d4f61c4314f7a514c6904307a3b8b7abcf73b5bfa343c0ae415e6b0d0bbb649-a b/.cache/go-build/2d/2d4f61c4314f7a514c6904307a3b8b7abcf73b5bfa343c0ae415e6b0d0bbb649-a deleted file mode 100644 index b8724e7..0000000 --- a/.cache/go-build/2d/2d4f61c4314f7a514c6904307a3b8b7abcf73b5bfa343c0ae415e6b0d0bbb649-a +++ /dev/null @@ -1 +0,0 @@ -v1 2d4f61c4314f7a514c6904307a3b8b7abcf73b5bfa343c0ae415e6b0d0bbb649 193ae37ae79efab647839e3a670c65ba2539da0679f7e65beb2be7e92072662a 152 1775136289483240988 diff --git a/.cache/go-build/2d/2d5899d4df0756afb53579fea54720a1323b85e6bb0a53bdbc9ce46968396d4e-a b/.cache/go-build/2d/2d5899d4df0756afb53579fea54720a1323b85e6bb0a53bdbc9ce46968396d4e-a deleted file mode 100644 index da35a0c..0000000 --- a/.cache/go-build/2d/2d5899d4df0756afb53579fea54720a1323b85e6bb0a53bdbc9ce46968396d4e-a +++ /dev/null @@ -1 +0,0 @@ -v1 2d5899d4df0756afb53579fea54720a1323b85e6bb0a53bdbc9ce46968396d4e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289377135213 diff --git a/.cache/go-build/2d/2d69080c16d464d5efa822feb3b2a5bd4c18b2713206350a9b2a685dff2e0b0d-a b/.cache/go-build/2d/2d69080c16d464d5efa822feb3b2a5bd4c18b2713206350a9b2a685dff2e0b0d-a deleted file mode 100644 index 60c7785..0000000 --- a/.cache/go-build/2d/2d69080c16d464d5efa822feb3b2a5bd4c18b2713206350a9b2a685dff2e0b0d-a +++ /dev/null @@ -1 +0,0 @@ -v1 2d69080c16d464d5efa822feb3b2a5bd4c18b2713206350a9b2a685dff2e0b0d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287030937964 diff --git a/.cache/go-build/2d/2d95d52855b47e03aebf9afc2ab35c92390a1d01ff6e1c4ac7dc5b6e7b672d8d-d/nwn-tool b/.cache/go-build/2d/2d95d52855b47e03aebf9afc2ab35c92390a1d01ff6e1c4ac7dc5b6e7b672d8d-d/nwn-tool deleted file mode 100755 index cded20d..0000000 Binary files a/.cache/go-build/2d/2d95d52855b47e03aebf9afc2ab35c92390a1d01ff6e1c4ac7dc5b6e7b672d8d-d/nwn-tool and /dev/null differ diff --git a/.cache/go-build/2e/2e23d7fd369b249ffb281e8141243a3345173345422c6cf59a29bf7d8c8f5722-a b/.cache/go-build/2e/2e23d7fd369b249ffb281e8141243a3345173345422c6cf59a29bf7d8c8f5722-a deleted file mode 100644 index bf196b5..0000000 --- a/.cache/go-build/2e/2e23d7fd369b249ffb281e8141243a3345173345422c6cf59a29bf7d8c8f5722-a +++ /dev/null @@ -1 +0,0 @@ -v1 2e23d7fd369b249ffb281e8141243a3345173345422c6cf59a29bf7d8c8f5722 acbdb5ff2d7bb2d9a2bf2f14d4fe911b53299273daec8587855ce3db4839c280 25574 1775136287094761020 diff --git a/.cache/go-build/2e/2e2cc317cd0f8289027fc7cfd32c3bf0db14129dd7086b5d250977f080f6f23e-a b/.cache/go-build/2e/2e2cc317cd0f8289027fc7cfd32c3bf0db14129dd7086b5d250977f080f6f23e-a deleted file mode 100644 index 7d5108c..0000000 --- a/.cache/go-build/2e/2e2cc317cd0f8289027fc7cfd32c3bf0db14129dd7086b5d250977f080f6f23e-a +++ /dev/null @@ -1 +0,0 @@ -v1 2e2cc317cd0f8289027fc7cfd32c3bf0db14129dd7086b5d250977f080f6f23e 53354660680831bc9eb37d97fd8653bd7c602dd0ca07cbe6930abb039acf1b78 11792 1775136287079278839 diff --git a/.cache/go-build/2e/2e7390a069448e92bcceee8403d820a3f8f0be04b263917d51dacc203e83d6a2-d b/.cache/go-build/2e/2e7390a069448e92bcceee8403d820a3f8f0be04b263917d51dacc203e83d6a2-d deleted file mode 100644 index bfb087d..0000000 Binary files a/.cache/go-build/2e/2e7390a069448e92bcceee8403d820a3f8f0be04b263917d51dacc203e83d6a2-d and /dev/null differ diff --git a/.cache/go-build/2e/2e93e7614ba2387dfb507577d31057866575491706102466e295819a0763012f-a b/.cache/go-build/2e/2e93e7614ba2387dfb507577d31057866575491706102466e295819a0763012f-a deleted file mode 100644 index 62065dd..0000000 --- a/.cache/go-build/2e/2e93e7614ba2387dfb507577d31057866575491706102466e295819a0763012f-a +++ /dev/null @@ -1 +0,0 @@ -v1 2e93e7614ba2387dfb507577d31057866575491706102466e295819a0763012f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287090227167 diff --git a/.cache/go-build/2e/2ef666bee869c798740350779df3a85524f7785fd736cdff74dcc09ed4c83a1e-d b/.cache/go-build/2e/2ef666bee869c798740350779df3a85524f7785fd736cdff74dcc09ed4c83a1e-d deleted file mode 100644 index 399a824..0000000 Binary files a/.cache/go-build/2e/2ef666bee869c798740350779df3a85524f7785fd736cdff74dcc09ed4c83a1e-d and /dev/null differ diff --git a/.cache/go-build/2f/2f0b34c4aac2b4314569a9ce4b20df3bc5d879dab089cc4c7e6748483613225b-a b/.cache/go-build/2f/2f0b34c4aac2b4314569a9ce4b20df3bc5d879dab089cc4c7e6748483613225b-a deleted file mode 100644 index b49e04c..0000000 --- a/.cache/go-build/2f/2f0b34c4aac2b4314569a9ce4b20df3bc5d879dab089cc4c7e6748483613225b-a +++ /dev/null @@ -1 +0,0 @@ -v1 2f0b34c4aac2b4314569a9ce4b20df3bc5d879dab089cc4c7e6748483613225b 2c4a03ce99b6413c0e42817b5479500e9a39fb8d0771954743450fa8a9bdbf42 302 1775136286924144918 diff --git a/.cache/go-build/2f/2f4116f67c2953721a3ce5016b42e2fb412a7bb337106ccf31d32f71e650a641-d b/.cache/go-build/2f/2f4116f67c2953721a3ce5016b42e2fb412a7bb337106ccf31d32f71e650a641-d deleted file mode 100644 index a3f82ee..0000000 Binary files a/.cache/go-build/2f/2f4116f67c2953721a3ce5016b42e2fb412a7bb337106ccf31d32f71e650a641-d and /dev/null differ diff --git a/.cache/go-build/2f/2f4f67d80cafb46c560112a7a956aac8609f7654e0b7e66ceb70a63c8f581109-a b/.cache/go-build/2f/2f4f67d80cafb46c560112a7a956aac8609f7654e0b7e66ceb70a63c8f581109-a deleted file mode 100644 index 987d0b2..0000000 --- a/.cache/go-build/2f/2f4f67d80cafb46c560112a7a956aac8609f7654e0b7e66ceb70a63c8f581109-a +++ /dev/null @@ -1 +0,0 @@ -v1 2f4f67d80cafb46c560112a7a956aac8609f7654e0b7e66ceb70a63c8f581109 41988351f0bd3a7d7f1c09b7b5366c3343b2ea1520f8215539f8d1ea898bba1f 25 1775136289064696779 diff --git a/.cache/go-build/2f/2f51a6646db43b27e6fc004144b66a7006194c36aef91e2b17e6e002775420ff-d b/.cache/go-build/2f/2f51a6646db43b27e6fc004144b66a7006194c36aef91e2b17e6e002775420ff-d deleted file mode 100644 index 644c230..0000000 Binary files a/.cache/go-build/2f/2f51a6646db43b27e6fc004144b66a7006194c36aef91e2b17e6e002775420ff-d and /dev/null differ diff --git a/.cache/go-build/2f/2f52bbcad7f48f13b96bbb5c5b5b3b997123b92dbcb4337b47f141bf63ce56f9-d b/.cache/go-build/2f/2f52bbcad7f48f13b96bbb5c5b5b3b997123b92dbcb4337b47f141bf63ce56f9-d deleted file mode 100644 index 7016fa4..0000000 --- a/.cache/go-build/2f/2f52bbcad7f48f13b96bbb5c5b5b3b997123b92dbcb4337b47f141bf63ce56f9-d +++ /dev/null @@ -1,4 +0,0 @@ -./backtrack.go -./exec.go -./onepass.go -./regexp.go diff --git a/.cache/go-build/2f/2f714d211dbb47033389d1c48044a999da4050762fc89ce13f9a51c806349f0b-a b/.cache/go-build/2f/2f714d211dbb47033389d1c48044a999da4050762fc89ce13f9a51c806349f0b-a deleted file mode 100644 index 3a11f17..0000000 --- a/.cache/go-build/2f/2f714d211dbb47033389d1c48044a999da4050762fc89ce13f9a51c806349f0b-a +++ /dev/null @@ -1 +0,0 @@ -v1 2f714d211dbb47033389d1c48044a999da4050762fc89ce13f9a51c806349f0b 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775139398518715412 diff --git a/.cache/go-build/2f/2f78d8870fb7a7bf98ca288b9b046d652baeef8d9c962d2b0e591203a023dd77-d b/.cache/go-build/2f/2f78d8870fb7a7bf98ca288b9b046d652baeef8d9c962d2b0e591203a023dd77-d deleted file mode 100644 index ec6e0a8..0000000 Binary files a/.cache/go-build/2f/2f78d8870fb7a7bf98ca288b9b046d652baeef8d9c962d2b0e591203a023dd77-d and /dev/null differ diff --git a/.cache/go-build/2f/2f8e3464d953ebf2b2ba0616cbd79ade4864b7b9c1320b4d67387dae48f20b59-a b/.cache/go-build/2f/2f8e3464d953ebf2b2ba0616cbd79ade4864b7b9c1320b4d67387dae48f20b59-a deleted file mode 100644 index 66f328e..0000000 --- a/.cache/go-build/2f/2f8e3464d953ebf2b2ba0616cbd79ade4864b7b9c1320b4d67387dae48f20b59-a +++ /dev/null @@ -1 +0,0 @@ -v1 2f8e3464d953ebf2b2ba0616cbd79ade4864b7b9c1320b4d67387dae48f20b59 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287043237153 diff --git a/.cache/go-build/2f/2f9d8c1d84d05cc72eacfe78a0c036f54ef5969d330c699248c6fa1b6e9fca5b-a b/.cache/go-build/2f/2f9d8c1d84d05cc72eacfe78a0c036f54ef5969d330c699248c6fa1b6e9fca5b-a deleted file mode 100644 index a29052e..0000000 --- a/.cache/go-build/2f/2f9d8c1d84d05cc72eacfe78a0c036f54ef5969d330c699248c6fa1b6e9fca5b-a +++ /dev/null @@ -1 +0,0 @@ -v1 2f9d8c1d84d05cc72eacfe78a0c036f54ef5969d330c699248c6fa1b6e9fca5b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289366546985 diff --git a/.cache/go-build/2f/2ffde13bc5e5632cc19f84a235d4fdfbad539e317787efd63fc5bab0a38d3212-a b/.cache/go-build/2f/2ffde13bc5e5632cc19f84a235d4fdfbad539e317787efd63fc5bab0a38d3212-a deleted file mode 100644 index 2528041..0000000 --- a/.cache/go-build/2f/2ffde13bc5e5632cc19f84a235d4fdfbad539e317787efd63fc5bab0a38d3212-a +++ /dev/null @@ -1 +0,0 @@ -v1 2ffde13bc5e5632cc19f84a235d4fdfbad539e317787efd63fc5bab0a38d3212 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775141782705372144 diff --git a/.cache/go-build/30/301c39ea929d736813065f2639ee8019218f9fc55f6d7621dbb6c9a53b86e76e-a b/.cache/go-build/30/301c39ea929d736813065f2639ee8019218f9fc55f6d7621dbb6c9a53b86e76e-a deleted file mode 100644 index 3e6d1b6..0000000 --- a/.cache/go-build/30/301c39ea929d736813065f2639ee8019218f9fc55f6d7621dbb6c9a53b86e76e-a +++ /dev/null @@ -1 +0,0 @@ -v1 301c39ea929d736813065f2639ee8019218f9fc55f6d7621dbb6c9a53b86e76e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287090150377 diff --git a/.cache/go-build/30/3043ce50986321e03e8add7ad1f0b64c4a11a78b408c6da2fd8ae4f55cb4cd51-a b/.cache/go-build/30/3043ce50986321e03e8add7ad1f0b64c4a11a78b408c6da2fd8ae4f55cb4cd51-a deleted file mode 100644 index 3dee123..0000000 --- a/.cache/go-build/30/3043ce50986321e03e8add7ad1f0b64c4a11a78b408c6da2fd8ae4f55cb4cd51-a +++ /dev/null @@ -1 +0,0 @@ -v1 3043ce50986321e03e8add7ad1f0b64c4a11a78b408c6da2fd8ae4f55cb4cd51 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286983102840 diff --git a/.cache/go-build/30/30de3215fcee7d591d6742284b234aeed82f0c2ee461acd976e946477feea3fa-d b/.cache/go-build/30/30de3215fcee7d591d6742284b234aeed82f0c2ee461acd976e946477feea3fa-d deleted file mode 100644 index d0f84ce..0000000 --- a/.cache/go-build/30/30de3215fcee7d591d6742284b234aeed82f0c2ee461acd976e946477feea3fa-d +++ /dev/null @@ -1 +0,0 @@ -./synctest.go diff --git a/.cache/go-build/30/30ea2b33ca0687d78aeee7b458890ec235e5a92d29e87a87e1f3b049630be3d7-a b/.cache/go-build/30/30ea2b33ca0687d78aeee7b458890ec235e5a92d29e87a87e1f3b049630be3d7-a deleted file mode 100644 index 7c040b6..0000000 --- a/.cache/go-build/30/30ea2b33ca0687d78aeee7b458890ec235e5a92d29e87a87e1f3b049630be3d7-a +++ /dev/null @@ -1 +0,0 @@ -v1 30ea2b33ca0687d78aeee7b458890ec235e5a92d29e87a87e1f3b049630be3d7 3f3effd1e350a7d3d72da5fc13b4a60d0e684916d5cc47e34e52600c5d8677d9 561868 1775136288512530144 diff --git a/.cache/go-build/31/31362a36785527fd3f32bbb10982c2f66226b6b0365d7ce0561a8d727049177f-a b/.cache/go-build/31/31362a36785527fd3f32bbb10982c2f66226b6b0365d7ce0561a8d727049177f-a deleted file mode 100644 index 18dca61..0000000 --- a/.cache/go-build/31/31362a36785527fd3f32bbb10982c2f66226b6b0365d7ce0561a8d727049177f-a +++ /dev/null @@ -1 +0,0 @@ -v1 31362a36785527fd3f32bbb10982c2f66226b6b0365d7ce0561a8d727049177f 9f2188566fa3959df274876165d904adb42d95bde9121f0b0618ad3d5a813896 68 1775136288449096139 diff --git a/.cache/go-build/31/314d575d8152642f35ccb171e410be68c3cfd0d30086b96206f7ef9f9086f6dc-a b/.cache/go-build/31/314d575d8152642f35ccb171e410be68c3cfd0d30086b96206f7ef9f9086f6dc-a deleted file mode 100644 index 160b16a..0000000 --- a/.cache/go-build/31/314d575d8152642f35ccb171e410be68c3cfd0d30086b96206f7ef9f9086f6dc-a +++ /dev/null @@ -1 +0,0 @@ -v1 314d575d8152642f35ccb171e410be68c3cfd0d30086b96206f7ef9f9086f6dc e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289419870223 diff --git a/.cache/go-build/31/314de0ced46369fac7f06933206e4ff542734619b6a7ac3637c7129dc5271c8e-a b/.cache/go-build/31/314de0ced46369fac7f06933206e4ff542734619b6a7ac3637c7129dc5271c8e-a deleted file mode 100644 index 479c675..0000000 --- a/.cache/go-build/31/314de0ced46369fac7f06933206e4ff542734619b6a7ac3637c7129dc5271c8e-a +++ /dev/null @@ -1 +0,0 @@ -v1 314de0ced46369fac7f06933206e4ff542734619b6a7ac3637c7129dc5271c8e 00dedcbaf5dd36c49447863279d4bf0649eb1838d56074e8076fc688dff92fca 13 1775136288631675399 diff --git a/.cache/go-build/31/315dab63d50a2fb7ff7b7dd58b38d9643da19be6215c55134d3564359a05b554-a b/.cache/go-build/31/315dab63d50a2fb7ff7b7dd58b38d9643da19be6215c55134d3564359a05b554-a deleted file mode 100644 index 46853f8..0000000 --- a/.cache/go-build/31/315dab63d50a2fb7ff7b7dd58b38d9643da19be6215c55134d3564359a05b554-a +++ /dev/null @@ -1 +0,0 @@ -v1 315dab63d50a2fb7ff7b7dd58b38d9643da19be6215c55134d3564359a05b554 753ae4a0f3218999a9fa4e1cf5e7140b0cf888b4631aa1978f2159f53d491191 2874 1775136286816849291 diff --git a/.cache/go-build/31/317534f8ea017922fa3dbda21dc4192b09ab8c5a48ad5631999702f18f5ceb54-d b/.cache/go-build/31/317534f8ea017922fa3dbda21dc4192b09ab8c5a48ad5631999702f18f5ceb54-d deleted file mode 100644 index afd3943..0000000 --- a/.cache/go-build/31/317534f8ea017922fa3dbda21dc4192b09ab8c5a48ad5631999702f18f5ceb54-d +++ /dev/null @@ -1,3 +0,0 @@ -./goos.go -./unix.go -./zgoos_linux.go diff --git a/.cache/go-build/31/317eb63b2e05f388237dd37f51798ecc4a5d509be24ebadef9f076b9355abd46-a b/.cache/go-build/31/317eb63b2e05f388237dd37f51798ecc4a5d509be24ebadef9f076b9355abd46-a deleted file mode 100644 index bd7afa0..0000000 --- a/.cache/go-build/31/317eb63b2e05f388237dd37f51798ecc4a5d509be24ebadef9f076b9355abd46-a +++ /dev/null @@ -1 +0,0 @@ -v1 317eb63b2e05f388237dd37f51798ecc4a5d509be24ebadef9f076b9355abd46 0e62a8010aab7f77666b9a4bed3b9eebbc161e8c6b781447eba7ee1484a63b01 2979 1775136286816114261 diff --git a/.cache/go-build/32/320caebb2f67290208cb2f5d646d4ac128c9ba1817ad2ec3a4f557bde52f5bf1-a b/.cache/go-build/32/320caebb2f67290208cb2f5d646d4ac128c9ba1817ad2ec3a4f557bde52f5bf1-a deleted file mode 100644 index ae0c792..0000000 --- a/.cache/go-build/32/320caebb2f67290208cb2f5d646d4ac128c9ba1817ad2ec3a4f557bde52f5bf1-a +++ /dev/null @@ -1 +0,0 @@ -v1 320caebb2f67290208cb2f5d646d4ac128c9ba1817ad2ec3a4f557bde52f5bf1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289718073866 diff --git a/.cache/go-build/32/322aca18a13d9037c5ca3dfb2ad5e23e043e844044bcd4b902b31f0cba8cf349-d b/.cache/go-build/32/322aca18a13d9037c5ca3dfb2ad5e23e043e844044bcd4b902b31f0cba8cf349-d deleted file mode 100644 index e3268a9..0000000 Binary files a/.cache/go-build/32/322aca18a13d9037c5ca3dfb2ad5e23e043e844044bcd4b902b31f0cba8cf349-d and /dev/null differ diff --git a/.cache/go-build/32/322d9b03d2fd31a6b1e61775a63b1dbe19106d5dad9b200b71b4365ed2c8062c-a b/.cache/go-build/32/322d9b03d2fd31a6b1e61775a63b1dbe19106d5dad9b200b71b4365ed2c8062c-a deleted file mode 100644 index c9a4d6d..0000000 --- a/.cache/go-build/32/322d9b03d2fd31a6b1e61775a63b1dbe19106d5dad9b200b71b4365ed2c8062c-a +++ /dev/null @@ -1 +0,0 @@ -v1 322d9b03d2fd31a6b1e61775a63b1dbe19106d5dad9b200b71b4365ed2c8062c 077c4c84129ee8b3bb95bdcaecd24bff550d8c7ecae971d146bf9590de7b41a9 12 1775136288547591259 diff --git a/.cache/go-build/32/3263f040ee0db3b29630aaf96f2529f7967aa0a982c0d79366fef51e0d76a183-d b/.cache/go-build/32/3263f040ee0db3b29630aaf96f2529f7967aa0a982c0d79366fef51e0d76a183-d deleted file mode 100644 index 3956274..0000000 Binary files a/.cache/go-build/32/3263f040ee0db3b29630aaf96f2529f7967aa0a982c0d79366fef51e0d76a183-d and /dev/null differ diff --git a/.cache/go-build/32/3264a67d634503eed65dff32f46f0a9bd010c758f86794cc88af1d6c493fab01-a b/.cache/go-build/32/3264a67d634503eed65dff32f46f0a9bd010c758f86794cc88af1d6c493fab01-a deleted file mode 100644 index 739f700..0000000 --- a/.cache/go-build/32/3264a67d634503eed65dff32f46f0a9bd010c758f86794cc88af1d6c493fab01-a +++ /dev/null @@ -1 +0,0 @@ -v1 3264a67d634503eed65dff32f46f0a9bd010c758f86794cc88af1d6c493fab01 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289923341113 diff --git a/.cache/go-build/32/326b3f8fd2d14f2d1d25d07a130e37da350ecfda147a10495cc88c549b8f24eb-d b/.cache/go-build/32/326b3f8fd2d14f2d1d25d07a130e37da350ecfda147a10495cc88c549b8f24eb-d deleted file mode 100644 index c800791..0000000 Binary files a/.cache/go-build/32/326b3f8fd2d14f2d1d25d07a130e37da350ecfda147a10495cc88c549b8f24eb-d and /dev/null differ diff --git a/.cache/go-build/32/32990fd048ae5ebdc4c5c56d5dbfdeb895c29ef6fbf374c0630a9ca0d4bedfe2-a b/.cache/go-build/32/32990fd048ae5ebdc4c5c56d5dbfdeb895c29ef6fbf374c0630a9ca0d4bedfe2-a deleted file mode 100644 index 89ef059..0000000 --- a/.cache/go-build/32/32990fd048ae5ebdc4c5c56d5dbfdeb895c29ef6fbf374c0630a9ca0d4bedfe2-a +++ /dev/null @@ -1 +0,0 @@ -v1 32990fd048ae5ebdc4c5c56d5dbfdeb895c29ef6fbf374c0630a9ca0d4bedfe2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287036474768 diff --git a/.cache/go-build/32/329fe97586c75f41cfddefd0b68468092bfffde7ffb1bcf345a773e925f60ed3-a b/.cache/go-build/32/329fe97586c75f41cfddefd0b68468092bfffde7ffb1bcf345a773e925f60ed3-a deleted file mode 100644 index a422ba9..0000000 --- a/.cache/go-build/32/329fe97586c75f41cfddefd0b68468092bfffde7ffb1bcf345a773e925f60ed3-a +++ /dev/null @@ -1 +0,0 @@ -v1 329fe97586c75f41cfddefd0b68468092bfffde7ffb1bcf345a773e925f60ed3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139414330461992 diff --git a/.cache/go-build/32/32faf1ee11c9b01225d464b1c98669c3a189ca0cf6ed4b17d1ec6ebcde930237-a b/.cache/go-build/32/32faf1ee11c9b01225d464b1c98669c3a189ca0cf6ed4b17d1ec6ebcde930237-a deleted file mode 100644 index d2a3963..0000000 --- a/.cache/go-build/32/32faf1ee11c9b01225d464b1c98669c3a189ca0cf6ed4b17d1ec6ebcde930237-a +++ /dev/null @@ -1 +0,0 @@ -v1 32faf1ee11c9b01225d464b1c98669c3a189ca0cf6ed4b17d1ec6ebcde930237 486d02084f72970ca6a1d692f8f728abf199ac72cfb7875c9a17bbc7ddf16924 97386 1775136288463350129 diff --git a/.cache/go-build/32/32ffd95a567aeaa9a9d50e722942cc8153cdb3ccc7804fc01796e9ea5937db64-a b/.cache/go-build/32/32ffd95a567aeaa9a9d50e722942cc8153cdb3ccc7804fc01796e9ea5937db64-a deleted file mode 100644 index b9a2f6a..0000000 --- a/.cache/go-build/32/32ffd95a567aeaa9a9d50e722942cc8153cdb3ccc7804fc01796e9ea5937db64-a +++ /dev/null @@ -1 +0,0 @@ -v1 32ffd95a567aeaa9a9d50e722942cc8153cdb3ccc7804fc01796e9ea5937db64 67746ad597832bc4b47103cbe0d0fd90e2091657ee4948607b31bc9c4f1cbfd1 21 1775136288637554844 diff --git a/.cache/go-build/33/3339d79ce30d7636873151519d8657b87a9d51f308858fd6744b5daed677bdd7-d b/.cache/go-build/33/3339d79ce30d7636873151519d8657b87a9d51f308858fd6744b5daed677bdd7-d deleted file mode 100644 index d24426a..0000000 Binary files a/.cache/go-build/33/3339d79ce30d7636873151519d8657b87a9d51f308858fd6744b5daed677bdd7-d and /dev/null differ diff --git a/.cache/go-build/33/338c3d51d516521c31674419115bcc3a3416b0caffbc4af173fa7a7818cca9ef-d b/.cache/go-build/33/338c3d51d516521c31674419115bcc3a3416b0caffbc4af173fa7a7818cca9ef-d deleted file mode 100644 index a46e089..0000000 Binary files a/.cache/go-build/33/338c3d51d516521c31674419115bcc3a3416b0caffbc4af173fa7a7818cca9ef-d and /dev/null differ diff --git a/.cache/go-build/33/33f479f594b46f551fea9e86cfc90c47fba13cda19c4e811583152664302e472-a b/.cache/go-build/33/33f479f594b46f551fea9e86cfc90c47fba13cda19c4e811583152664302e472-a deleted file mode 100644 index a2a8dff..0000000 --- a/.cache/go-build/33/33f479f594b46f551fea9e86cfc90c47fba13cda19c4e811583152664302e472-a +++ /dev/null @@ -1 +0,0 @@ -v1 33f479f594b46f551fea9e86cfc90c47fba13cda19c4e811583152664302e472 5e1e7c4bb256ad421cd369951136f3629c2b4731901367734c02b324b570948b 665 1775136287073523285 diff --git a/.cache/go-build/33/33fa6062df7317a3effc89cefee318dddce22fb1ebf9a50c9b814ba1462a2321-a b/.cache/go-build/33/33fa6062df7317a3effc89cefee318dddce22fb1ebf9a50c9b814ba1462a2321-a deleted file mode 100644 index 32d6bd5..0000000 --- a/.cache/go-build/33/33fa6062df7317a3effc89cefee318dddce22fb1ebf9a50c9b814ba1462a2321-a +++ /dev/null @@ -1 +0,0 @@ -v1 33fa6062df7317a3effc89cefee318dddce22fb1ebf9a50c9b814ba1462a2321 59eab6bcf6268b724a0650ea96be415194cfa0016c4bd796d5ba360e3173531c 157 1775136286944266662 diff --git a/.cache/go-build/34/34090f3344a3c6aed288e710e7d649cded31fd6976cb5ccbfc9c26c79965aec8-a b/.cache/go-build/34/34090f3344a3c6aed288e710e7d649cded31fd6976cb5ccbfc9c26c79965aec8-a deleted file mode 100644 index f24be9c..0000000 --- a/.cache/go-build/34/34090f3344a3c6aed288e710e7d649cded31fd6976cb5ccbfc9c26c79965aec8-a +++ /dev/null @@ -1 +0,0 @@ -v1 34090f3344a3c6aed288e710e7d649cded31fd6976cb5ccbfc9c26c79965aec8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288821430095 diff --git a/.cache/go-build/34/34331c95f4aa922a20b0fdd5841f63c5bc6b569558334c4415692fbfe1fb666f-d b/.cache/go-build/34/34331c95f4aa922a20b0fdd5841f63c5bc6b569558334c4415692fbfe1fb666f-d deleted file mode 100644 index 18d7383..0000000 Binary files a/.cache/go-build/34/34331c95f4aa922a20b0fdd5841f63c5bc6b569558334c4415692fbfe1fb666f-d and /dev/null differ diff --git a/.cache/go-build/34/3468995d9918eb720c28ae55006cef32490c6607fdf6ee5f845313951b147d3b-a b/.cache/go-build/34/3468995d9918eb720c28ae55006cef32490c6607fdf6ee5f845313951b147d3b-a deleted file mode 100644 index 6d11ed2..0000000 --- a/.cache/go-build/34/3468995d9918eb720c28ae55006cef32490c6607fdf6ee5f845313951b147d3b-a +++ /dev/null @@ -1 +0,0 @@ -v1 3468995d9918eb720c28ae55006cef32490c6607fdf6ee5f845313951b147d3b c33eca565b4aeba4965f62cd2cdd8c6aa8473a0b05a48fb8577a0e2edbf1f05a 3231 1775136286811034217 diff --git a/.cache/go-build/34/348338998b6d7488606c4777d2caf58ea434e4c710038bdf2ab95fb941ba40a0-a b/.cache/go-build/34/348338998b6d7488606c4777d2caf58ea434e4c710038bdf2ab95fb941ba40a0-a deleted file mode 100644 index af2ebae..0000000 --- a/.cache/go-build/34/348338998b6d7488606c4777d2caf58ea434e4c710038bdf2ab95fb941ba40a0-a +++ /dev/null @@ -1 +0,0 @@ -v1 348338998b6d7488606c4777d2caf58ea434e4c710038bdf2ab95fb941ba40a0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287043318593 diff --git a/.cache/go-build/34/34a1ddc14337785e6ef83270d9ab2fa1c46bf87eb66a5738c8ac69d6b44c769a-d b/.cache/go-build/34/34a1ddc14337785e6ef83270d9ab2fa1c46bf87eb66a5738c8ac69d6b44c769a-d deleted file mode 100644 index bfcc1ec..0000000 Binary files a/.cache/go-build/34/34a1ddc14337785e6ef83270d9ab2fa1c46bf87eb66a5738c8ac69d6b44c769a-d and /dev/null differ diff --git a/.cache/go-build/34/34b0e91de4fbb5ff235a441530a7fb7f31e9665ba40dfb294ea12208a77f1880-d b/.cache/go-build/34/34b0e91de4fbb5ff235a441530a7fb7f31e9665ba40dfb294ea12208a77f1880-d deleted file mode 100644 index 20bbe63..0000000 Binary files a/.cache/go-build/34/34b0e91de4fbb5ff235a441530a7fb7f31e9665ba40dfb294ea12208a77f1880-d and /dev/null differ diff --git a/.cache/go-build/34/34fdc5e8cce021249cd5b49da0c01985c0cca411535b41fe72e61f3c73941ac1-a b/.cache/go-build/34/34fdc5e8cce021249cd5b49da0c01985c0cca411535b41fe72e61f3c73941ac1-a deleted file mode 100644 index 74f5b1b..0000000 --- a/.cache/go-build/34/34fdc5e8cce021249cd5b49da0c01985c0cca411535b41fe72e61f3c73941ac1-a +++ /dev/null @@ -1 +0,0 @@ -v1 34fdc5e8cce021249cd5b49da0c01985c0cca411535b41fe72e61f3c73941ac1 834439d2f90c4ea1d43e53d2c25876a7abfd77d7f84a0b02001ab3276b73e496 15 1775136289676430127 diff --git a/.cache/go-build/35/350a4a670de79b58b11991543d8381efd074a1b06ab30602972bf6fe40c99e1e-a b/.cache/go-build/35/350a4a670de79b58b11991543d8381efd074a1b06ab30602972bf6fe40c99e1e-a deleted file mode 100644 index ed50bdf..0000000 --- a/.cache/go-build/35/350a4a670de79b58b11991543d8381efd074a1b06ab30602972bf6fe40c99e1e-a +++ /dev/null @@ -1 +0,0 @@ -v1 350a4a670de79b58b11991543d8381efd074a1b06ab30602972bf6fe40c99e1e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287044135774 diff --git a/.cache/go-build/35/353dc21f7f8d19c1a2ef24929de39acf5835fd36eee19e50739387f68c26e094-a b/.cache/go-build/35/353dc21f7f8d19c1a2ef24929de39acf5835fd36eee19e50739387f68c26e094-a deleted file mode 100644 index 6de0fc6..0000000 --- a/.cache/go-build/35/353dc21f7f8d19c1a2ef24929de39acf5835fd36eee19e50739387f68c26e094-a +++ /dev/null @@ -1 +0,0 @@ -v1 353dc21f7f8d19c1a2ef24929de39acf5835fd36eee19e50739387f68c26e094 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286922340827 diff --git a/.cache/go-build/35/354e4e1e99f7a71b9168051ea7caa6571eeae55ff6f7128beed557ee0f499f27-a b/.cache/go-build/35/354e4e1e99f7a71b9168051ea7caa6571eeae55ff6f7128beed557ee0f499f27-a deleted file mode 100644 index 263406f..0000000 --- a/.cache/go-build/35/354e4e1e99f7a71b9168051ea7caa6571eeae55ff6f7128beed557ee0f499f27-a +++ /dev/null @@ -1 +0,0 @@ -v1 354e4e1e99f7a71b9168051ea7caa6571eeae55ff6f7128beed557ee0f499f27 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289085040914 diff --git a/.cache/go-build/35/35592471a2c3b3e6719311b2b72fcca0aa983022ddc9cac83ee651121a775359-a b/.cache/go-build/35/35592471a2c3b3e6719311b2b72fcca0aa983022ddc9cac83ee651121a775359-a deleted file mode 100644 index c82ef49..0000000 --- a/.cache/go-build/35/35592471a2c3b3e6719311b2b72fcca0aa983022ddc9cac83ee651121a775359-a +++ /dev/null @@ -1 +0,0 @@ -v1 35592471a2c3b3e6719311b2b72fcca0aa983022ddc9cac83ee651121a775359 e61f23676808285ff3e4243b264f1976022f70deb93947dd441e5f96ce475848 549 1775136286834084654 diff --git a/.cache/go-build/35/35856949c242a1678ce1319008b4b4c3d209e101b906327f6f0b540f75763d17-d b/.cache/go-build/35/35856949c242a1678ce1319008b4b4c3d209e101b906327f6f0b540f75763d17-d deleted file mode 100644 index 245d013..0000000 Binary files a/.cache/go-build/35/35856949c242a1678ce1319008b4b4c3d209e101b906327f6f0b540f75763d17-d and /dev/null differ diff --git a/.cache/go-build/35/35b6be57c6aafa4b49d9d77812cfa92e2da6ed40f680df539bc1c0949d20e3c8-a b/.cache/go-build/35/35b6be57c6aafa4b49d9d77812cfa92e2da6ed40f680df539bc1c0949d20e3c8-a deleted file mode 100644 index 0eb1112..0000000 --- a/.cache/go-build/35/35b6be57c6aafa4b49d9d77812cfa92e2da6ed40f680df539bc1c0949d20e3c8-a +++ /dev/null @@ -1 +0,0 @@ -v1 35b6be57c6aafa4b49d9d77812cfa92e2da6ed40f680df539bc1c0949d20e3c8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289356623188 diff --git a/.cache/go-build/35/35fe9744c00578a33cd246422fa3ebb1f04be67d7926eab44864af9a51d1449d-a b/.cache/go-build/35/35fe9744c00578a33cd246422fa3ebb1f04be67d7926eab44864af9a51d1449d-a deleted file mode 100644 index 0920314..0000000 --- a/.cache/go-build/35/35fe9744c00578a33cd246422fa3ebb1f04be67d7926eab44864af9a51d1449d-a +++ /dev/null @@ -1 +0,0 @@ -v1 35fe9744c00578a33cd246422fa3ebb1f04be67d7926eab44864af9a51d1449d 033d11143aeeb9e45e66b122d569282ef0ba305aeddd3cd65e8881152b1e6966 2176 1775136286805209183 diff --git a/.cache/go-build/36/36230313862f4dff00eaa64bb8373211961f77a72087e93b102c7917a33055cc-a b/.cache/go-build/36/36230313862f4dff00eaa64bb8373211961f77a72087e93b102c7917a33055cc-a deleted file mode 100644 index f257976..0000000 --- a/.cache/go-build/36/36230313862f4dff00eaa64bb8373211961f77a72087e93b102c7917a33055cc-a +++ /dev/null @@ -1 +0,0 @@ -v1 36230313862f4dff00eaa64bb8373211961f77a72087e93b102c7917a33055cc e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289887871538 diff --git a/.cache/go-build/36/368235b63f7442ce7aa9ccff187dffea021cbbf64c722a0eb230677cc14d9758-a b/.cache/go-build/36/368235b63f7442ce7aa9ccff187dffea021cbbf64c722a0eb230677cc14d9758-a deleted file mode 100644 index adec781..0000000 --- a/.cache/go-build/36/368235b63f7442ce7aa9ccff187dffea021cbbf64c722a0eb230677cc14d9758-a +++ /dev/null @@ -1 +0,0 @@ -v1 368235b63f7442ce7aa9ccff187dffea021cbbf64c722a0eb230677cc14d9758 fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775137721898573191 diff --git a/.cache/go-build/36/369a66e4830e66e12d6b15c0859e5cc2fd5ca4fb4639c957d30c7f8fd6204787-a b/.cache/go-build/36/369a66e4830e66e12d6b15c0859e5cc2fd5ca4fb4639c957d30c7f8fd6204787-a deleted file mode 100644 index 75ae98f..0000000 --- a/.cache/go-build/36/369a66e4830e66e12d6b15c0859e5cc2fd5ca4fb4639c957d30c7f8fd6204787-a +++ /dev/null @@ -1 +0,0 @@ -v1 369a66e4830e66e12d6b15c0859e5cc2fd5ca4fb4639c957d30c7f8fd6204787 04b4509d27fd9c93eb33d9e8d80ff91f4a3bd31a7c7e2b9a77367d5c2f33aca8 114 1775136289422354985 diff --git a/.cache/go-build/36/36c9192310b05a73992cc5e9c91a3c8467e4e37849c572664ef3ea32ed63c322-a b/.cache/go-build/36/36c9192310b05a73992cc5e9c91a3c8467e4e37849c572664ef3ea32ed63c322-a deleted file mode 100644 index 708695f..0000000 --- a/.cache/go-build/36/36c9192310b05a73992cc5e9c91a3c8467e4e37849c572664ef3ea32ed63c322-a +++ /dev/null @@ -1 +0,0 @@ -v1 36c9192310b05a73992cc5e9c91a3c8467e4e37849c572664ef3ea32ed63c322 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287018471406 diff --git a/.cache/go-build/36/36ce7e39faae2401872af0941378873d018d341c4e720980691ec3bb8c6cd5f2-a b/.cache/go-build/36/36ce7e39faae2401872af0941378873d018d341c4e720980691ec3bb8c6cd5f2-a deleted file mode 100644 index a99bc0d..0000000 --- a/.cache/go-build/36/36ce7e39faae2401872af0941378873d018d341c4e720980691ec3bb8c6cd5f2-a +++ /dev/null @@ -1 +0,0 @@ -v1 36ce7e39faae2401872af0941378873d018d341c4e720980691ec3bb8c6cd5f2 9106730d0748a572b5f0ca451dd37b4986ce06692970b53f177a4476123931bf 541178 1775136289368368346 diff --git a/.cache/go-build/37/37023bdef2d90a1ffa3689e5f89c4f0cc9360f7f6e072744be051a53e46a3a08-a b/.cache/go-build/37/37023bdef2d90a1ffa3689e5f89c4f0cc9360f7f6e072744be051a53e46a3a08-a deleted file mode 100644 index ce3b745..0000000 --- a/.cache/go-build/37/37023bdef2d90a1ffa3689e5f89c4f0cc9360f7f6e072744be051a53e46a3a08-a +++ /dev/null @@ -1 +0,0 @@ -v1 37023bdef2d90a1ffa3689e5f89c4f0cc9360f7f6e072744be051a53e46a3a08 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722028101264 diff --git a/.cache/go-build/37/3703af1bc4e11a89cfe03b4f50752aaa236b1c1fac6ddddd7ceaa51fa004a7f1-a b/.cache/go-build/37/3703af1bc4e11a89cfe03b4f50752aaa236b1c1fac6ddddd7ceaa51fa004a7f1-a deleted file mode 100644 index fc46fa0..0000000 --- a/.cache/go-build/37/3703af1bc4e11a89cfe03b4f50752aaa236b1c1fac6ddddd7ceaa51fa004a7f1-a +++ /dev/null @@ -1 +0,0 @@ -v1 3703af1bc4e11a89cfe03b4f50752aaa236b1c1fac6ddddd7ceaa51fa004a7f1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288636286473 diff --git a/.cache/go-build/37/3763a142faab284c6d1fe779e26cf3b9f52b72ff56c5ee7b3fadf44e829f91e5-a b/.cache/go-build/37/3763a142faab284c6d1fe779e26cf3b9f52b72ff56c5ee7b3fadf44e829f91e5-a deleted file mode 100644 index fccb713..0000000 --- a/.cache/go-build/37/3763a142faab284c6d1fe779e26cf3b9f52b72ff56c5ee7b3fadf44e829f91e5-a +++ /dev/null @@ -1 +0,0 @@ -v1 3763a142faab284c6d1fe779e26cf3b9f52b72ff56c5ee7b3fadf44e829f91e5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287017647035 diff --git a/.cache/go-build/37/3778b3a089ee69937dce1377ee71bbc088e50377efd6626801b91a1cae331fcc-a b/.cache/go-build/37/3778b3a089ee69937dce1377ee71bbc088e50377efd6626801b91a1cae331fcc-a deleted file mode 100644 index 975f272..0000000 --- a/.cache/go-build/37/3778b3a089ee69937dce1377ee71bbc088e50377efd6626801b91a1cae331fcc-a +++ /dev/null @@ -1 +0,0 @@ -v1 3778b3a089ee69937dce1377ee71bbc088e50377efd6626801b91a1cae331fcc 1a59aaf7359e29b2e15fa48388b2a40a12b38b450c711b4442b415115bba8ae9 2398 1775138183971866231 diff --git a/.cache/go-build/37/37791cc14db185621614e35087d3740c7423b0a125469869517eb1079251d38f-d b/.cache/go-build/37/37791cc14db185621614e35087d3740c7423b0a125469869517eb1079251d38f-d deleted file mode 100644 index 2da67f4..0000000 Binary files a/.cache/go-build/37/37791cc14db185621614e35087d3740c7423b0a125469869517eb1079251d38f-d and /dev/null differ diff --git a/.cache/go-build/37/377fb9290326a21d1cf245d213930510485d0649bdaadf1ff223cfa6f19c6f53-d b/.cache/go-build/37/377fb9290326a21d1cf245d213930510485d0649bdaadf1ff223cfa6f19c6f53-d deleted file mode 100644 index 4dc43a2..0000000 --- a/.cache/go-build/37/377fb9290326a21d1cf245d213930510485d0649bdaadf1ff223cfa6f19c6f53-d +++ /dev/null @@ -1 +0,0 @@ -ok gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/erf 0.001s diff --git a/.cache/go-build/37/3790a931eb3ac7d53f883ca86a14e7ddf166b4e501af41bbaa5ffab42179f4bb-a b/.cache/go-build/37/3790a931eb3ac7d53f883ca86a14e7ddf166b4e501af41bbaa5ffab42179f4bb-a deleted file mode 100644 index 2a1280a..0000000 --- a/.cache/go-build/37/3790a931eb3ac7d53f883ca86a14e7ddf166b4e501af41bbaa5ffab42179f4bb-a +++ /dev/null @@ -1 +0,0 @@ -v1 3790a931eb3ac7d53f883ca86a14e7ddf166b4e501af41bbaa5ffab42179f4bb 1718060f5349559113b3f823c502afb488612a17a53f910753c3d929e8da6325 6994 1775136288470178014 diff --git a/.cache/go-build/38/3883346c29ed4c9ce9a7af877a65ce6092aee15d56081ef6bd3b5c142ab2f7c8-d b/.cache/go-build/38/3883346c29ed4c9ce9a7af877a65ce6092aee15d56081ef6bd3b5c142ab2f7c8-d deleted file mode 100644 index e31044a..0000000 Binary files a/.cache/go-build/38/3883346c29ed4c9ce9a7af877a65ce6092aee15d56081ef6bd3b5c142ab2f7c8-d and /dev/null differ diff --git a/.cache/go-build/38/38dbd4d723e36f22dd91bf6c66e95e6bee27c6316ecde8ae167d754cbcd1dbea-d b/.cache/go-build/38/38dbd4d723e36f22dd91bf6c66e95e6bee27c6316ecde8ae167d754cbcd1dbea-d deleted file mode 100644 index 4c3ed0d..0000000 Binary files a/.cache/go-build/38/38dbd4d723e36f22dd91bf6c66e95e6bee27c6316ecde8ae167d754cbcd1dbea-d and /dev/null differ diff --git a/.cache/go-build/39/392cd4c374299c513918d8f1dc6979ea882fb4e3e72d434fc7f2f74cd4f4ba3c-a b/.cache/go-build/39/392cd4c374299c513918d8f1dc6979ea882fb4e3e72d434fc7f2f74cd4f4ba3c-a deleted file mode 100644 index 2fce2b1..0000000 --- a/.cache/go-build/39/392cd4c374299c513918d8f1dc6979ea882fb4e3e72d434fc7f2f74cd4f4ba3c-a +++ /dev/null @@ -1 +0,0 @@ -v1 392cd4c374299c513918d8f1dc6979ea882fb4e3e72d434fc7f2f74cd4f4ba3c db08b6b92a82b49d2f27b7c7c3c05500c9181adbf0d0dab9b589a7466ce8e339 515 1775136288525919544 diff --git a/.cache/go-build/39/3971cff38eccfa354b79e0499405b7de7fd80fcd1820a1863c1edf63e266fe65-a b/.cache/go-build/39/3971cff38eccfa354b79e0499405b7de7fd80fcd1820a1863c1edf63e266fe65-a deleted file mode 100644 index 1a75021..0000000 --- a/.cache/go-build/39/3971cff38eccfa354b79e0499405b7de7fd80fcd1820a1863c1edf63e266fe65-a +++ /dev/null @@ -1 +0,0 @@ -v1 3971cff38eccfa354b79e0499405b7de7fd80fcd1820a1863c1edf63e266fe65 666f7db8f5ab2f23d5afe3621c04400d89a91dd424474f5000de56c28d984cef 87 1775136288665293633 diff --git a/.cache/go-build/39/39dfa1169466316ac57705cf203b5c9ea48ab0b04a6672cc516d6e943effe690-d b/.cache/go-build/39/39dfa1169466316ac57705cf203b5c9ea48ab0b04a6672cc516d6e943effe690-d deleted file mode 100644 index 39d2e4b..0000000 Binary files a/.cache/go-build/39/39dfa1169466316ac57705cf203b5c9ea48ab0b04a6672cc516d6e943effe690-d and /dev/null differ diff --git a/.cache/go-build/39/39e897fc9f212f806a46f2ed8850ced800c07f7046cc5a781fc02b0ab97433ae-a b/.cache/go-build/39/39e897fc9f212f806a46f2ed8850ced800c07f7046cc5a781fc02b0ab97433ae-a deleted file mode 100644 index e8f1bc8..0000000 --- a/.cache/go-build/39/39e897fc9f212f806a46f2ed8850ced800c07f7046cc5a781fc02b0ab97433ae-a +++ /dev/null @@ -1 +0,0 @@ -v1 39e897fc9f212f806a46f2ed8850ced800c07f7046cc5a781fc02b0ab97433ae 0cc4f2a62b729d8465f901530872ba8106ce1712ee655d49426d71d1991733a5 19199 1775139398607854086 diff --git a/.cache/go-build/3a/3a036be3df0507212f5b1bc466b832eb4e90884a47c9ee5a6f5631ab7998c5fc-a b/.cache/go-build/3a/3a036be3df0507212f5b1bc466b832eb4e90884a47c9ee5a6f5631ab7998c5fc-a deleted file mode 100644 index 5322e7a..0000000 --- a/.cache/go-build/3a/3a036be3df0507212f5b1bc466b832eb4e90884a47c9ee5a6f5631ab7998c5fc-a +++ /dev/null @@ -1 +0,0 @@ -v1 3a036be3df0507212f5b1bc466b832eb4e90884a47c9ee5a6f5631ab7998c5fc 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775137376768052475 diff --git a/.cache/go-build/3a/3a2247463477d7161e05902eae24cac571de58aeebaebc346c2861e077ee233c-d b/.cache/go-build/3a/3a2247463477d7161e05902eae24cac571de58aeebaebc346c2861e077ee233c-d deleted file mode 100644 index 7078452..0000000 --- a/.cache/go-build/3a/3a2247463477d7161e05902eae24cac571de58aeebaebc346c2861e077ee233c-d +++ /dev/null @@ -1 +0,0 @@ -./cmp.go diff --git a/.cache/go-build/3a/3a65a42dab5faacb13b5f0ff7546fd2cc1b8fc4958221f17180a40eb2aafce1a-d b/.cache/go-build/3a/3a65a42dab5faacb13b5f0ff7546fd2cc1b8fc4958221f17180a40eb2aafce1a-d deleted file mode 100644 index 985bb44..0000000 --- a/.cache/go-build/3a/3a65a42dab5faacb13b5f0ff7546fd2cc1b8fc4958221f17180a40eb2aafce1a-d +++ /dev/null @@ -1,2 +0,0 @@ -./errors.go -./scanner.go diff --git a/.cache/go-build/3a/3a735d938bbcb536db458ba796f202037023feffbaf9a1e6ff8c7dd5b1666b3d-a b/.cache/go-build/3a/3a735d938bbcb536db458ba796f202037023feffbaf9a1e6ff8c7dd5b1666b3d-a deleted file mode 100644 index 3359f82..0000000 --- a/.cache/go-build/3a/3a735d938bbcb536db458ba796f202037023feffbaf9a1e6ff8c7dd5b1666b3d-a +++ /dev/null @@ -1 +0,0 @@ -v1 3a735d938bbcb536db458ba796f202037023feffbaf9a1e6ff8c7dd5b1666b3d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287081532191 diff --git a/.cache/go-build/3a/3af876e495e0153e622654d47da8548cf49904674273347a34fde3ab5f9c0168-a b/.cache/go-build/3a/3af876e495e0153e622654d47da8548cf49904674273347a34fde3ab5f9c0168-a deleted file mode 100644 index fca7b93..0000000 --- a/.cache/go-build/3a/3af876e495e0153e622654d47da8548cf49904674273347a34fde3ab5f9c0168-a +++ /dev/null @@ -1 +0,0 @@ -v1 3af876e495e0153e622654d47da8548cf49904674273347a34fde3ab5f9c0168 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289950618043 diff --git a/.cache/go-build/3b/3b1ddbd0c4088b398e7446686ef236c81e45ece6ea96ca4bd939a787f9f6ae4a-d b/.cache/go-build/3b/3b1ddbd0c4088b398e7446686ef236c81e45ece6ea96ca4bd939a787f9f6ae4a-d deleted file mode 100644 index 73aee85..0000000 --- a/.cache/go-build/3b/3b1ddbd0c4088b398e7446686ef236c81e45ece6ea96ca4bd939a787f9f6ae4a-d +++ /dev/null @@ -1,2 +0,0 @@ -./erf.go -./erf_test.go diff --git a/.cache/go-build/3b/3b47f302018086e8576ce03bc32644973b817c161a1083b66e8c75c2fa777302-a b/.cache/go-build/3b/3b47f302018086e8576ce03bc32644973b817c161a1083b66e8c75c2fa777302-a deleted file mode 100644 index a8215a9..0000000 --- a/.cache/go-build/3b/3b47f302018086e8576ce03bc32644973b817c161a1083b66e8c75c2fa777302-a +++ /dev/null @@ -1 +0,0 @@ -v1 3b47f302018086e8576ce03bc32644973b817c161a1083b66e8c75c2fa777302 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289833070549 diff --git a/.cache/go-build/3b/3ba0f45a1e3b75040af3ae6d624472365c2d4719bd1a5e922461d718a6488fe0-a b/.cache/go-build/3b/3ba0f45a1e3b75040af3ae6d624472365c2d4719bd1a5e922461d718a6488fe0-a deleted file mode 100644 index 1b67566..0000000 --- a/.cache/go-build/3b/3ba0f45a1e3b75040af3ae6d624472365c2d4719bd1a5e922461d718a6488fe0-a +++ /dev/null @@ -1 +0,0 @@ -v1 3ba0f45a1e3b75040af3ae6d624472365c2d4719bd1a5e922461d718a6488fe0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289960924470 diff --git a/.cache/go-build/3b/3bb631a173338746b554d6c8b63f49cc606a07638e310d8a617745948f1ec97d-a b/.cache/go-build/3b/3bb631a173338746b554d6c8b63f49cc606a07638e310d8a617745948f1ec97d-a deleted file mode 100644 index f4c252e..0000000 --- a/.cache/go-build/3b/3bb631a173338746b554d6c8b63f49cc606a07638e310d8a617745948f1ec97d-a +++ /dev/null @@ -1 +0,0 @@ -v1 3bb631a173338746b554d6c8b63f49cc606a07638e310d8a617745948f1ec97d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289932236190 diff --git a/.cache/go-build/3b/3bca12b24cf10260b0c407ee39ada5580d21b7d0b3778f9b622843261491e509-a b/.cache/go-build/3b/3bca12b24cf10260b0c407ee39ada5580d21b7d0b3778f9b622843261491e509-a deleted file mode 100644 index 2f993b7..0000000 --- a/.cache/go-build/3b/3bca12b24cf10260b0c407ee39ada5580d21b7d0b3778f9b622843261491e509-a +++ /dev/null @@ -1 +0,0 @@ -v1 3bca12b24cf10260b0c407ee39ada5580d21b7d0b3778f9b622843261491e509 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287086768934 diff --git a/.cache/go-build/3b/3bf936fbc3cc1f7cad1a8f72ac7fb7706f69c0ae82f757190ebea33f59023cb4-a b/.cache/go-build/3b/3bf936fbc3cc1f7cad1a8f72ac7fb7706f69c0ae82f757190ebea33f59023cb4-a deleted file mode 100644 index ad4fb24..0000000 --- a/.cache/go-build/3b/3bf936fbc3cc1f7cad1a8f72ac7fb7706f69c0ae82f757190ebea33f59023cb4-a +++ /dev/null @@ -1 +0,0 @@ -v1 3bf936fbc3cc1f7cad1a8f72ac7fb7706f69c0ae82f757190ebea33f59023cb4 7abaa6ac9412acb5c32c2639b078176eb890a682c85a4e44ce5dd4e9367abcb8 3649 1775136286931702563 diff --git a/.cache/go-build/3c/3c286eb86fb6273492b2b97583751bfbacf0b21bec6fe90ff5d67b932a711a1a-d b/.cache/go-build/3c/3c286eb86fb6273492b2b97583751bfbacf0b21bec6fe90ff5d67b932a711a1a-d deleted file mode 100644 index 6d326e5..0000000 Binary files a/.cache/go-build/3c/3c286eb86fb6273492b2b97583751bfbacf0b21bec6fe90ff5d67b932a711a1a-d and /dev/null differ diff --git a/.cache/go-build/3c/3c89807625db2b19dd2ef264ee80848686946965fe23bb1952145abbcb393224-a b/.cache/go-build/3c/3c89807625db2b19dd2ef264ee80848686946965fe23bb1952145abbcb393224-a deleted file mode 100644 index 92666bc..0000000 --- a/.cache/go-build/3c/3c89807625db2b19dd2ef264ee80848686946965fe23bb1952145abbcb393224-a +++ /dev/null @@ -1 +0,0 @@ -v1 3c89807625db2b19dd2ef264ee80848686946965fe23bb1952145abbcb393224 3263f040ee0db3b29630aaf96f2529f7967aa0a982c0d79366fef51e0d76a183 54046 1775136288547408499 diff --git a/.cache/go-build/3c/3cc9cf0fc44f345b7a09fe4ba437452246245be1a1ec49cba1c71e11b4d3cbe9-a b/.cache/go-build/3c/3cc9cf0fc44f345b7a09fe4ba437452246245be1a1ec49cba1c71e11b4d3cbe9-a deleted file mode 100644 index d216adc..0000000 --- a/.cache/go-build/3c/3cc9cf0fc44f345b7a09fe4ba437452246245be1a1ec49cba1c71e11b4d3cbe9-a +++ /dev/null @@ -1 +0,0 @@ -v1 3cc9cf0fc44f345b7a09fe4ba437452246245be1a1ec49cba1c71e11b4d3cbe9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288996354670 diff --git a/.cache/go-build/3d/3d3c63f18ac0e155ddcfb3d5efd2e9d0be8c9323554f7cf603fd9a2875ceb6e6-d b/.cache/go-build/3d/3d3c63f18ac0e155ddcfb3d5efd2e9d0be8c9323554f7cf603fd9a2875ceb6e6-d deleted file mode 100644 index 9a140c3..0000000 --- a/.cache/go-build/3d/3d3c63f18ac0e155ddcfb3d5efd2e9d0be8c9323554f7cf603fd9a2875ceb6e6-d +++ /dev/null @@ -1 +0,0 @@ -ok gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/gff 0.001s diff --git a/.cache/go-build/3d/3d65512eae049a5bde62b99a9acd6b889bb08ec97be37f1dad2aba11b0ea9eea-d b/.cache/go-build/3d/3d65512eae049a5bde62b99a9acd6b889bb08ec97be37f1dad2aba11b0ea9eea-d deleted file mode 100644 index 60d529f..0000000 --- a/.cache/go-build/3d/3d65512eae049a5bde62b99a9acd6b889bb08ec97be37f1dad2aba11b0ea9eea-d +++ /dev/null @@ -1,2 +0,0 @@ -./rand.go -./rand_getrandom.go diff --git a/.cache/go-build/3d/3df925500977a31c0261826c9e3938e5ba75c734aeb32ab83cee28747ef60e45-d b/.cache/go-build/3d/3df925500977a31c0261826c9e3938e5ba75c734aeb32ab83cee28747ef60e45-d deleted file mode 100644 index 4c9bc68..0000000 Binary files a/.cache/go-build/3d/3df925500977a31c0261826c9e3938e5ba75c734aeb32ab83cee28747ef60e45-d and /dev/null differ diff --git a/.cache/go-build/3e/3e3aeeb4b2caa9030e010790a70a3f87be3cb3d8a31b36f82f84411cc0a694b7-a b/.cache/go-build/3e/3e3aeeb4b2caa9030e010790a70a3f87be3cb3d8a31b36f82f84411cc0a694b7-a deleted file mode 100644 index 0b6235d..0000000 --- a/.cache/go-build/3e/3e3aeeb4b2caa9030e010790a70a3f87be3cb3d8a31b36f82f84411cc0a694b7-a +++ /dev/null @@ -1 +0,0 @@ -v1 3e3aeeb4b2caa9030e010790a70a3f87be3cb3d8a31b36f82f84411cc0a694b7 338c3d51d516521c31674419115bcc3a3416b0caffbc4af173fa7a7818cca9ef 19734 1775136286955128580 diff --git a/.cache/go-build/3e/3e519181c51cf93359f99344b475873a3eda241e32eaf22fd33b91c973899928-a b/.cache/go-build/3e/3e519181c51cf93359f99344b475873a3eda241e32eaf22fd33b91c973899928-a deleted file mode 100644 index 965d01f..0000000 --- a/.cache/go-build/3e/3e519181c51cf93359f99344b475873a3eda241e32eaf22fd33b91c973899928-a +++ /dev/null @@ -1 +0,0 @@ -v1 3e519181c51cf93359f99344b475873a3eda241e32eaf22fd33b91c973899928 9158a5d9d6442aa12fdb3adf3cb106077aa3a24f7dbd6de70df331cb63b4ed5c 135 1775136289491043554 diff --git a/.cache/go-build/3e/3e8d728685f76cacbe8566e833699c1582c97d32fb3cc84b6ab067e2750174dd-a b/.cache/go-build/3e/3e8d728685f76cacbe8566e833699c1582c97d32fb3cc84b6ab067e2750174dd-a deleted file mode 100644 index 8044d12..0000000 --- a/.cache/go-build/3e/3e8d728685f76cacbe8566e833699c1582c97d32fb3cc84b6ab067e2750174dd-a +++ /dev/null @@ -1 +0,0 @@ -v1 3e8d728685f76cacbe8566e833699c1582c97d32fb3cc84b6ab067e2750174dd fdc7b4a3bf33debb1ab1087076eaafb0d4a7118d583ef7f27ab3c97a28b6efad 571 1775136286949476546 diff --git a/.cache/go-build/3e/3e92768dd1005c4cd6e6e468b8c50af0cb4810d34320dc6e20189569eb4a5011-a b/.cache/go-build/3e/3e92768dd1005c4cd6e6e468b8c50af0cb4810d34320dc6e20189569eb4a5011-a deleted file mode 100644 index 969ad3e..0000000 --- a/.cache/go-build/3e/3e92768dd1005c4cd6e6e468b8c50af0cb4810d34320dc6e20189569eb4a5011-a +++ /dev/null @@ -1 +0,0 @@ -v1 3e92768dd1005c4cd6e6e468b8c50af0cb4810d34320dc6e20189569eb4a5011 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289420132973 diff --git a/.cache/go-build/3e/3ec496f7e72d60d66b2915f3cf8975bb94b79c4d57e08c3f65fedf46eb5d0339-d b/.cache/go-build/3e/3ec496f7e72d60d66b2915f3cf8975bb94b79c4d57e08c3f65fedf46eb5d0339-d deleted file mode 100644 index 78cadce..0000000 Binary files a/.cache/go-build/3e/3ec496f7e72d60d66b2915f3cf8975bb94b79c4d57e08c3f65fedf46eb5d0339-d and /dev/null differ diff --git a/.cache/go-build/3e/3ed397a86b9b39397e91b96faee138ea9590dc71a7946e64cbfca532bcdd39d2-d b/.cache/go-build/3e/3ed397a86b9b39397e91b96faee138ea9590dc71a7946e64cbfca532bcdd39d2-d deleted file mode 100644 index 1c477eb..0000000 --- a/.cache/go-build/3e/3ed397a86b9b39397e91b96faee138ea9590dc71a7946e64cbfca532bcdd39d2-d +++ /dev/null @@ -1 +0,0 @@ -./project.go diff --git a/.cache/go-build/3e/3efd7594a7806055623fd22524ff665c1548926279fc8b0ec64dcfcdabd70ccb-a b/.cache/go-build/3e/3efd7594a7806055623fd22524ff665c1548926279fc8b0ec64dcfcdabd70ccb-a deleted file mode 100644 index cd7dffd..0000000 --- a/.cache/go-build/3e/3efd7594a7806055623fd22524ff665c1548926279fc8b0ec64dcfcdabd70ccb-a +++ /dev/null @@ -1 +0,0 @@ -v1 3efd7594a7806055623fd22524ff665c1548926279fc8b0ec64dcfcdabd70ccb 0ca0665358e7ca645272074e0e42cdc80f75fe4aa7d62ea0ff0d87602330cc60 72 1775136288547947889 diff --git a/.cache/go-build/3f/3f30444b16331284bf1bb489e094b61012eb1bcffe4423cbb325c3caa0d9e29a-d b/.cache/go-build/3f/3f30444b16331284bf1bb489e094b61012eb1bcffe4423cbb325c3caa0d9e29a-d deleted file mode 100644 index 89e9c59..0000000 Binary files a/.cache/go-build/3f/3f30444b16331284bf1bb489e094b61012eb1bcffe4423cbb325c3caa0d9e29a-d and /dev/null differ diff --git a/.cache/go-build/3f/3f364b921f710b73045983d7e4cad6b341298c25d06e941526aaac05a4885242-d b/.cache/go-build/3f/3f364b921f710b73045983d7e4cad6b341298c25d06e941526aaac05a4885242-d deleted file mode 100644 index 8ae5da3..0000000 Binary files a/.cache/go-build/3f/3f364b921f710b73045983d7e4cad6b341298c25d06e941526aaac05a4885242-d and /dev/null differ diff --git a/.cache/go-build/3f/3f3effd1e350a7d3d72da5fc13b4a60d0e684916d5cc47e34e52600c5d8677d9-d b/.cache/go-build/3f/3f3effd1e350a7d3d72da5fc13b4a60d0e684916d5cc47e34e52600c5d8677d9-d deleted file mode 100644 index fc704c9..0000000 Binary files a/.cache/go-build/3f/3f3effd1e350a7d3d72da5fc13b4a60d0e684916d5cc47e34e52600c5d8677d9-d and /dev/null differ diff --git a/.cache/go-build/3f/3f51e44bdf86159a5187ad1b7d96140941a0ef86df7f651c804a4f1826eedb4f-a b/.cache/go-build/3f/3f51e44bdf86159a5187ad1b7d96140941a0ef86df7f651c804a4f1826eedb4f-a deleted file mode 100644 index 66c9c13..0000000 --- a/.cache/go-build/3f/3f51e44bdf86159a5187ad1b7d96140941a0ef86df7f651c804a4f1826eedb4f-a +++ /dev/null @@ -1 +0,0 @@ -v1 3f51e44bdf86159a5187ad1b7d96140941a0ef86df7f651c804a4f1826eedb4f e232397eea9075898b7608a802922f3efd41f0c0cb65927b7d105b4a767a4dd2 313194 1775136289087688876 diff --git a/.cache/go-build/3f/3f571d9614a659795e3b5a1e244d3499bca3f873510699825cd8ec999c5587fb-a b/.cache/go-build/3f/3f571d9614a659795e3b5a1e244d3499bca3f873510699825cd8ec999c5587fb-a deleted file mode 100644 index a5aaa8f..0000000 --- a/.cache/go-build/3f/3f571d9614a659795e3b5a1e244d3499bca3f873510699825cd8ec999c5587fb-a +++ /dev/null @@ -1 +0,0 @@ -v1 3f571d9614a659795e3b5a1e244d3499bca3f873510699825cd8ec999c5587fb ee6e207221f00142fde4703812ffcb28cb818d9c8d871a85e11f00368f74d11c 638906 1775136289502779152 diff --git a/.cache/go-build/3f/3f836028d33faa82c941dd6725466f75ecfa0cf9f7200649b8f3495efb530828-a b/.cache/go-build/3f/3f836028d33faa82c941dd6725466f75ecfa0cf9f7200649b8f3495efb530828-a deleted file mode 100644 index 0486684..0000000 --- a/.cache/go-build/3f/3f836028d33faa82c941dd6725466f75ecfa0cf9f7200649b8f3495efb530828-a +++ /dev/null @@ -1 +0,0 @@ -v1 3f836028d33faa82c941dd6725466f75ecfa0cf9f7200649b8f3495efb530828 58ba4841982a610e82263765dc7d78f5675f568a65bc52df8275282000b531b7 165 1775136288522592071 diff --git a/.cache/go-build/3f/3fa667ccf1be47383d3a3a506a3de8cfa8699ea976adebe15313e15335457085-d b/.cache/go-build/3f/3fa667ccf1be47383d3a3a506a3de8cfa8699ea976adebe15313e15335457085-d deleted file mode 100644 index f893986..0000000 Binary files a/.cache/go-build/3f/3fa667ccf1be47383d3a3a506a3de8cfa8699ea976adebe15313e15335457085-d and /dev/null differ diff --git a/.cache/go-build/3f/3fb6d8e6529b3daa4b5722df26b8f5c9c5a50aa1c794f589d29b4604378c6a80-a b/.cache/go-build/3f/3fb6d8e6529b3daa4b5722df26b8f5c9c5a50aa1c794f589d29b4604378c6a80-a deleted file mode 100644 index 4f890c3..0000000 --- a/.cache/go-build/3f/3fb6d8e6529b3daa4b5722df26b8f5c9c5a50aa1c794f589d29b4604378c6a80-a +++ /dev/null @@ -1 +0,0 @@ -v1 3fb6d8e6529b3daa4b5722df26b8f5c9c5a50aa1c794f589d29b4604378c6a80 fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775136289951908394 diff --git a/.cache/go-build/3f/3fe6c98a0d9f736a91ac79696e22312fcb0ebe2a635b54b4040544dbb5890633-a b/.cache/go-build/3f/3fe6c98a0d9f736a91ac79696e22312fcb0ebe2a635b54b4040544dbb5890633-a deleted file mode 100644 index 8a43d46..0000000 --- a/.cache/go-build/3f/3fe6c98a0d9f736a91ac79696e22312fcb0ebe2a635b54b4040544dbb5890633-a +++ /dev/null @@ -1 +0,0 @@ -v1 3fe6c98a0d9f736a91ac79696e22312fcb0ebe2a635b54b4040544dbb5890633 cb6ec31ba12ee598d6f2710b7b70ad34dfac056dba1ea212504b53f0cd977a99 2580 1775136286833812053 diff --git a/.cache/go-build/40/401e9c2620dba3ffdac27376c243fa418ecfb8421e3838aa99acff0e584d376f-d b/.cache/go-build/40/401e9c2620dba3ffdac27376c243fa418ecfb8421e3838aa99acff0e584d376f-d deleted file mode 100644 index 702511d..0000000 Binary files a/.cache/go-build/40/401e9c2620dba3ffdac27376c243fa418ecfb8421e3838aa99acff0e584d376f-d and /dev/null differ diff --git a/.cache/go-build/40/4061e0ca8abf510a314e5419f4373fa4b22620dfbd95cfbe68a67b2e00055ac5-a b/.cache/go-build/40/4061e0ca8abf510a314e5419f4373fa4b22620dfbd95cfbe68a67b2e00055ac5-a deleted file mode 100644 index 6b9abd9..0000000 --- a/.cache/go-build/40/4061e0ca8abf510a314e5419f4373fa4b22620dfbd95cfbe68a67b2e00055ac5-a +++ /dev/null @@ -1 +0,0 @@ -v1 4061e0ca8abf510a314e5419f4373fa4b22620dfbd95cfbe68a67b2e00055ac5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287053788881 diff --git a/.cache/go-build/40/40831a9cefdc2a9a64b6146f636cbe73ff7af60629a215a4217901438614d3c0-a b/.cache/go-build/40/40831a9cefdc2a9a64b6146f636cbe73ff7af60629a215a4217901438614d3c0-a deleted file mode 100644 index ae639fd..0000000 --- a/.cache/go-build/40/40831a9cefdc2a9a64b6146f636cbe73ff7af60629a215a4217901438614d3c0-a +++ /dev/null @@ -1 +0,0 @@ -v1 40831a9cefdc2a9a64b6146f636cbe73ff7af60629a215a4217901438614d3c0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721887352153 diff --git a/.cache/go-build/40/40b21f6cd67d2076da764aa6ac0e7c95f64a4040a71031f322f9c6a11363d352-a b/.cache/go-build/40/40b21f6cd67d2076da764aa6ac0e7c95f64a4040a71031f322f9c6a11363d352-a deleted file mode 100644 index 10d30fc..0000000 --- a/.cache/go-build/40/40b21f6cd67d2076da764aa6ac0e7c95f64a4040a71031f322f9c6a11363d352-a +++ /dev/null @@ -1 +0,0 @@ -v1 40b21f6cd67d2076da764aa6ac0e7c95f64a4040a71031f322f9c6a11363d352 0b8b4b5bd5a79553c576fe8ac89542dd905de1d14b8d4294d0adb4a7b0bbc61a 15833 1775136286848158404 diff --git a/.cache/go-build/40/40e28a547d4ae2abb929ec12322310827e526712a134ce26e3f8028c06fe2a94-d b/.cache/go-build/40/40e28a547d4ae2abb929ec12322310827e526712a134ce26e3f8028c06fe2a94-d deleted file mode 100644 index 8cc9eb9..0000000 Binary files a/.cache/go-build/40/40e28a547d4ae2abb929ec12322310827e526712a134ce26e3f8028c06fe2a94-d and /dev/null differ diff --git a/.cache/go-build/41/41988351f0bd3a7d7f1c09b7b5366c3343b2ea1520f8215539f8d1ea898bba1f-d b/.cache/go-build/41/41988351f0bd3a7d7f1c09b7b5366c3343b2ea1520f8215539f8d1ea898bba1f-d deleted file mode 100644 index 05c0117..0000000 --- a/.cache/go-build/41/41988351f0bd3a7d7f1c09b7b5366c3343b2ea1520f8215539f8d1ea898bba1f-d +++ /dev/null @@ -1,2 +0,0 @@ -./entropy.go -./sha384.go diff --git a/.cache/go-build/41/41b65faece4fa8594bd3b6e03cd787f3f3280feb6a4475f01f2a506cf8fac2d0-a b/.cache/go-build/41/41b65faece4fa8594bd3b6e03cd787f3f3280feb6a4475f01f2a506cf8fac2d0-a deleted file mode 100644 index 9ad0452..0000000 --- a/.cache/go-build/41/41b65faece4fa8594bd3b6e03cd787f3f3280feb6a4475f01f2a506cf8fac2d0-a +++ /dev/null @@ -1 +0,0 @@ -v1 41b65faece4fa8594bd3b6e03cd787f3f3280feb6a4475f01f2a506cf8fac2d0 3b1ddbd0c4088b398e7446686ef236c81e45ece6ea96ca4bd939a787f9f6ae4a 23 1775136289746013766 diff --git a/.cache/go-build/41/41dca8da5d033fb6683f7d94c0ea3d82c931fa0956296aa94a9e35aedf26eb3c-a b/.cache/go-build/41/41dca8da5d033fb6683f7d94c0ea3d82c931fa0956296aa94a9e35aedf26eb3c-a deleted file mode 100644 index eddbe28..0000000 --- a/.cache/go-build/41/41dca8da5d033fb6683f7d94c0ea3d82c931fa0956296aa94a9e35aedf26eb3c-a +++ /dev/null @@ -1 +0,0 @@ -v1 41dca8da5d033fb6683f7d94c0ea3d82c931fa0956296aa94a9e35aedf26eb3c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289644168074 diff --git a/.cache/go-build/42/428cfbb9e53293e0d93eac017cea4d1ef7122adda089162e00f13836ba6742f3-d b/.cache/go-build/42/428cfbb9e53293e0d93eac017cea4d1ef7122adda089162e00f13836ba6742f3-d deleted file mode 100644 index e764507..0000000 --- a/.cache/go-build/42/428cfbb9e53293e0d93eac017cea4d1ef7122adda089162e00f13836ba6742f3-d +++ /dev/null @@ -1 +0,0 @@ -./sha256.go diff --git a/.cache/go-build/42/42c7b9899336757c626a97b38b9e75e2a6c06315d12d8c7c478b7cc8e94e7305-d b/.cache/go-build/42/42c7b9899336757c626a97b38b9e75e2a6c06315d12d8c7c478b7cc8e94e7305-d deleted file mode 100644 index 2285de8..0000000 Binary files a/.cache/go-build/42/42c7b9899336757c626a97b38b9e75e2a6c06315d12d8c7c478b7cc8e94e7305-d and /dev/null differ diff --git a/.cache/go-build/43/43052fdfb9dfa1d824ed8ce7e9f2cf87795b1d5082ea4e65581766bb3ee1baa1-a b/.cache/go-build/43/43052fdfb9dfa1d824ed8ce7e9f2cf87795b1d5082ea4e65581766bb3ee1baa1-a deleted file mode 100644 index e004c18..0000000 --- a/.cache/go-build/43/43052fdfb9dfa1d824ed8ce7e9f2cf87795b1d5082ea4e65581766bb3ee1baa1-a +++ /dev/null @@ -1 +0,0 @@ -v1 43052fdfb9dfa1d824ed8ce7e9f2cf87795b1d5082ea4e65581766bb3ee1baa1 cbb65782ea9a7e36ab2640163187874545368e8127356742c909f6fab2d65e07 1238 1775136286949215636 diff --git a/.cache/go-build/43/434e26b82091625cbcf810b85463e5ace56fbdc0810c86c69b0e6ba2a0f692c3-d b/.cache/go-build/43/434e26b82091625cbcf810b85463e5ace56fbdc0810c86c69b0e6ba2a0f692c3-d deleted file mode 100644 index eee0039..0000000 --- a/.cache/go-build/43/434e26b82091625cbcf810b85463e5ace56fbdc0810c86c69b0e6ba2a0f692c3-d +++ /dev/null @@ -1,4 +0,0 @@ -./doc.go -./signal.go -./signal_unix.go -./sig.s diff --git a/.cache/go-build/43/43523a8aff39b3e2a89d7ff2bcb8d474d867735558ca55fe3c7948f32b28fa5b-a b/.cache/go-build/43/43523a8aff39b3e2a89d7ff2bcb8d474d867735558ca55fe3c7948f32b28fa5b-a deleted file mode 100644 index d48e003..0000000 --- a/.cache/go-build/43/43523a8aff39b3e2a89d7ff2bcb8d474d867735558ca55fe3c7948f32b28fa5b-a +++ /dev/null @@ -1 +0,0 @@ -v1 43523a8aff39b3e2a89d7ff2bcb8d474d867735558ca55fe3c7948f32b28fa5b 3ed397a86b9b39397e91b96faee138ea9590dc71a7946e64cbfca532bcdd39d2 13 1775137721851529297 diff --git a/.cache/go-build/43/436a967a63fdf5935400e92c73394746632963b1e680fe54557eb2e4af19ab7f-a b/.cache/go-build/43/436a967a63fdf5935400e92c73394746632963b1e680fe54557eb2e4af19ab7f-a deleted file mode 100644 index 0578950..0000000 --- a/.cache/go-build/43/436a967a63fdf5935400e92c73394746632963b1e680fe54557eb2e4af19ab7f-a +++ /dev/null @@ -1 +0,0 @@ -v1 436a967a63fdf5935400e92c73394746632963b1e680fe54557eb2e4af19ab7f 11dff7ace586f545130516f3eaa86cbcbdc5f017ea6c142c38dec0383c1cec5b 15584 1775136289064476729 diff --git a/.cache/go-build/43/4378ed459aca07536377847d012fc995e4ebea24df2388fd94f29aca245ec0d3-a b/.cache/go-build/43/4378ed459aca07536377847d012fc995e4ebea24df2388fd94f29aca245ec0d3-a deleted file mode 100644 index 2a88580..0000000 --- a/.cache/go-build/43/4378ed459aca07536377847d012fc995e4ebea24df2388fd94f29aca245ec0d3-a +++ /dev/null @@ -1 +0,0 @@ -v1 4378ed459aca07536377847d012fc995e4ebea24df2388fd94f29aca245ec0d3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288975203235 diff --git a/.cache/go-build/43/43c4af69dd2bd389aaaaeac1f3b9e24a849a2d0ab7c7f16dfbfad17ddf53d486-d b/.cache/go-build/43/43c4af69dd2bd389aaaaeac1f3b9e24a849a2d0ab7c7f16dfbfad17ddf53d486-d deleted file mode 100644 index b567be3..0000000 --- a/.cache/go-build/43/43c4af69dd2bd389aaaaeac1f3b9e24a849a2d0ab7c7f16dfbfad17ddf53d486-d +++ /dev/null @@ -1,3 +0,0 @@ -./bits.go -./bits_errors.go -./bits_tables.go diff --git a/.cache/go-build/44/440ec55ab9e4f7568d361d9d6d7cf6f976579010264c3d041a999aee469492ef-a b/.cache/go-build/44/440ec55ab9e4f7568d361d9d6d7cf6f976579010264c3d041a999aee469492ef-a deleted file mode 100644 index e1ba3e3..0000000 --- a/.cache/go-build/44/440ec55ab9e4f7568d361d9d6d7cf6f976579010264c3d041a999aee469492ef-a +++ /dev/null @@ -1 +0,0 @@ -v1 440ec55ab9e4f7568d361d9d6d7cf6f976579010264c3d041a999aee469492ef 99269d451c065c83b53c037f867d644b131ce91b2cd20f482ed31ff3583b7bcf 81 1775136288649377552 diff --git a/.cache/go-build/44/4427915dd2afda1129cdc20202b0962e9d9b021642dcc73f2be4cf0733c728ee-d b/.cache/go-build/44/4427915dd2afda1129cdc20202b0962e9d9b021642dcc73f2be4cf0733c728ee-d deleted file mode 100644 index d158849..0000000 Binary files a/.cache/go-build/44/4427915dd2afda1129cdc20202b0962e9d9b021642dcc73f2be4cf0733c728ee-d and /dev/null differ diff --git a/.cache/go-build/44/4466ffaa4b0e7cabf358b5a73d022a87aa2aca0a06652e7aa7e9d5606c80abd8-a b/.cache/go-build/44/4466ffaa4b0e7cabf358b5a73d022a87aa2aca0a06652e7aa7e9d5606c80abd8-a deleted file mode 100644 index 393610e..0000000 --- a/.cache/go-build/44/4466ffaa4b0e7cabf358b5a73d022a87aa2aca0a06652e7aa7e9d5606c80abd8-a +++ /dev/null @@ -1 +0,0 @@ -v1 4466ffaa4b0e7cabf358b5a73d022a87aa2aca0a06652e7aa7e9d5606c80abd8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289014665843 diff --git a/.cache/go-build/44/44bcc6612f1c9eeaeba5f0ec62db0048d08753badb92c1a98ac141f7c1d96321-d b/.cache/go-build/44/44bcc6612f1c9eeaeba5f0ec62db0048d08753badb92c1a98ac141f7c1d96321-d deleted file mode 100644 index e67a12e..0000000 Binary files a/.cache/go-build/44/44bcc6612f1c9eeaeba5f0ec62db0048d08753badb92c1a98ac141f7c1d96321-d and /dev/null differ diff --git a/.cache/go-build/45/454c6753bb849c2d3c84bdd3a1321bba82fea19a2445f26c23e1c823d0df3ead-a b/.cache/go-build/45/454c6753bb849c2d3c84bdd3a1321bba82fea19a2445f26c23e1c823d0df3ead-a deleted file mode 100644 index d7b6843..0000000 --- a/.cache/go-build/45/454c6753bb849c2d3c84bdd3a1321bba82fea19a2445f26c23e1c823d0df3ead-a +++ /dev/null @@ -1 +0,0 @@ -v1 454c6753bb849c2d3c84bdd3a1321bba82fea19a2445f26c23e1c823d0df3ead 0af6c119dfb70f4f8fc24e429bb217263807553cf540a0ca1e836aed3d89bccd 9 1775138184115904864 diff --git a/.cache/go-build/45/456147c28ac2d518a6222612fb57cdc751f44a544802ca2143753307210eaec8-d b/.cache/go-build/45/456147c28ac2d518a6222612fb57cdc751f44a544802ca2143753307210eaec8-d deleted file mode 100644 index 1a518a9..0000000 Binary files a/.cache/go-build/45/456147c28ac2d518a6222612fb57cdc751f44a544802ca2143753307210eaec8-d and /dev/null differ diff --git a/.cache/go-build/46/460a5cb6e8a22528ec0dc59ee4ccfde8ca40d0cbfb88956b6467b6c34ea4b634-a b/.cache/go-build/46/460a5cb6e8a22528ec0dc59ee4ccfde8ca40d0cbfb88956b6467b6c34ea4b634-a deleted file mode 100644 index 55ea536..0000000 --- a/.cache/go-build/46/460a5cb6e8a22528ec0dc59ee4ccfde8ca40d0cbfb88956b6467b6c34ea4b634-a +++ /dev/null @@ -1 +0,0 @@ -v1 460a5cb6e8a22528ec0dc59ee4ccfde8ca40d0cbfb88956b6467b6c34ea4b634 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289354219546 diff --git a/.cache/go-build/46/4634dc89281599056133403972c3650895c2de617fea206c8f17f575d3c99254-d b/.cache/go-build/46/4634dc89281599056133403972c3650895c2de617fea206c8f17f575d3c99254-d deleted file mode 100644 index eaeb702..0000000 Binary files a/.cache/go-build/46/4634dc89281599056133403972c3650895c2de617fea206c8f17f575d3c99254-d and /dev/null differ diff --git a/.cache/go-build/46/46499e90da467669f7d74924eed636f1ab5639f17f98bb30681638052a834028-a b/.cache/go-build/46/46499e90da467669f7d74924eed636f1ab5639f17f98bb30681638052a834028-a deleted file mode 100644 index 29fb889..0000000 --- a/.cache/go-build/46/46499e90da467669f7d74924eed636f1ab5639f17f98bb30681638052a834028-a +++ /dev/null @@ -1 +0,0 @@ -v1 46499e90da467669f7d74924eed636f1ab5639f17f98bb30681638052a834028 c2d56b5c32b1a69a794a07085f94e257f2eea94e27c6d618d185141c94c0c347 241 1775136286909970918 diff --git a/.cache/go-build/46/464c5a51773942c5647a106e3b8955e5b3ef3090e52cc24148fcc126d158bd1a-a b/.cache/go-build/46/464c5a51773942c5647a106e3b8955e5b3ef3090e52cc24148fcc126d158bd1a-a deleted file mode 100644 index 3ed9790..0000000 --- a/.cache/go-build/46/464c5a51773942c5647a106e3b8955e5b3ef3090e52cc24148fcc126d158bd1a-a +++ /dev/null @@ -1 +0,0 @@ -v1 464c5a51773942c5647a106e3b8955e5b3ef3090e52cc24148fcc126d158bd1a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288985196162 diff --git a/.cache/go-build/46/466011e46ca08e1717c1f6472f58d93f87e2ae923fce448e01169e91149fe326-a b/.cache/go-build/46/466011e46ca08e1717c1f6472f58d93f87e2ae923fce448e01169e91149fe326-a deleted file mode 100644 index 478de47..0000000 --- a/.cache/go-build/46/466011e46ca08e1717c1f6472f58d93f87e2ae923fce448e01169e91149fe326-a +++ /dev/null @@ -1 +0,0 @@ -v1 466011e46ca08e1717c1f6472f58d93f87e2ae923fce448e01169e91149fe326 3b1ddbd0c4088b398e7446686ef236c81e45ece6ea96ca4bd939a787f9f6ae4a 23 1775137721870680521 diff --git a/.cache/go-build/46/468f425d6c2187f18f8e263079f6d07a3111cdbd1c861ee23706b73a3397baf2-a b/.cache/go-build/46/468f425d6c2187f18f8e263079f6d07a3111cdbd1c861ee23706b73a3397baf2-a deleted file mode 100644 index 3accf8e..0000000 --- a/.cache/go-build/46/468f425d6c2187f18f8e263079f6d07a3111cdbd1c861ee23706b73a3397baf2-a +++ /dev/null @@ -1 +0,0 @@ -v1 468f425d6c2187f18f8e263079f6d07a3111cdbd1c861ee23706b73a3397baf2 9e1bee65f89a698fc16682af3859e63594ace3bb1c3359dd69f54430b6acb1ab 255 1775136286909958418 diff --git a/.cache/go-build/46/46b2238b6910b280cc7117086e6c70db944894173d5fd15e90fb6909a87ac5a9-d b/.cache/go-build/46/46b2238b6910b280cc7117086e6c70db944894173d5fd15e90fb6909a87ac5a9-d deleted file mode 100644 index 43c5b93..0000000 --- a/.cache/go-build/46/46b2238b6910b280cc7117086e6c70db944894173d5fd15e90fb6909a87ac5a9-d +++ /dev/null @@ -1,9 +0,0 @@ -./cast.go -./cmac.go -./ctrkdf.go -./gcm.go -./gcm_asm.go -./gcm_generic.go -./gcm_nonces.go -./ghash.go -./gcm_amd64.s diff --git a/.cache/go-build/47/47ca5f743267f9ce20acca61d1cef5a2decb9ca3b17d19f59f01a590b70e8b5c-d b/.cache/go-build/47/47ca5f743267f9ce20acca61d1cef5a2decb9ca3b17d19f59f01a590b70e8b5c-d deleted file mode 100644 index a6db68d..0000000 --- a/.cache/go-build/47/47ca5f743267f9ce20acca61d1cef5a2decb9ca3b17d19f59f01a590b70e8b5c-d +++ /dev/null @@ -1 +0,0 @@ -./sort.go diff --git a/.cache/go-build/47/47f28ff1e95772ca9c5871570f95a9ed1932da46dceb19da6a0f8544b8b688de-a b/.cache/go-build/47/47f28ff1e95772ca9c5871570f95a9ed1932da46dceb19da6a0f8544b8b688de-a deleted file mode 100644 index ef3abeb..0000000 --- a/.cache/go-build/47/47f28ff1e95772ca9c5871570f95a9ed1932da46dceb19da6a0f8544b8b688de-a +++ /dev/null @@ -1 +0,0 @@ -v1 47f28ff1e95772ca9c5871570f95a9ed1932da46dceb19da6a0f8544b8b688de d1463834d14211f70b2f0382100cfa3aab115f4e663057d7add5742fbf75ae5f 383294 1775136288697715247 diff --git a/.cache/go-build/48/484b68ebef09cbf40b78bbd8a4f4ba689e183e0a63b842eaeed013f7bcaee4dd-a b/.cache/go-build/48/484b68ebef09cbf40b78bbd8a4f4ba689e183e0a63b842eaeed013f7bcaee4dd-a deleted file mode 100644 index 8d949fd..0000000 --- a/.cache/go-build/48/484b68ebef09cbf40b78bbd8a4f4ba689e183e0a63b842eaeed013f7bcaee4dd-a +++ /dev/null @@ -1 +0,0 @@ -v1 484b68ebef09cbf40b78bbd8a4f4ba689e183e0a63b842eaeed013f7bcaee4dd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288646082570 diff --git a/.cache/go-build/48/486d02084f72970ca6a1d692f8f728abf199ac72cfb7875c9a17bbc7ddf16924-d b/.cache/go-build/48/486d02084f72970ca6a1d692f8f728abf199ac72cfb7875c9a17bbc7ddf16924-d deleted file mode 100644 index 398c270..0000000 Binary files a/.cache/go-build/48/486d02084f72970ca6a1d692f8f728abf199ac72cfb7875c9a17bbc7ddf16924-d and /dev/null differ diff --git a/.cache/go-build/48/487f50f99522370694bacaa5ab2ab25595514f56942875ecb670f1c14e38298a-a b/.cache/go-build/48/487f50f99522370694bacaa5ab2ab25595514f56942875ecb670f1c14e38298a-a deleted file mode 100644 index c20b18c..0000000 --- a/.cache/go-build/48/487f50f99522370694bacaa5ab2ab25595514f56942875ecb670f1c14e38298a-a +++ /dev/null @@ -1 +0,0 @@ -v1 487f50f99522370694bacaa5ab2ab25595514f56942875ecb670f1c14e38298a c68b2a8790a5f276525b78574a905bf3a4389b981a727dec9a3941b4a889c70a 10806 1775136286843327400 diff --git a/.cache/go-build/48/488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555-d b/.cache/go-build/48/488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555-d deleted file mode 100644 index 4b52586..0000000 --- a/.cache/go-build/48/488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555-d +++ /dev/null @@ -1 +0,0 @@ -./main.go diff --git a/.cache/go-build/48/48b650cf75f6e1fc1f96ff7b2d8f3bc3bbbf43ed79ec67f339173a68fc6b4c3c-a b/.cache/go-build/48/48b650cf75f6e1fc1f96ff7b2d8f3bc3bbbf43ed79ec67f339173a68fc6b4c3c-a deleted file mode 100644 index cfbeb88..0000000 --- a/.cache/go-build/48/48b650cf75f6e1fc1f96ff7b2d8f3bc3bbbf43ed79ec67f339173a68fc6b4c3c-a +++ /dev/null @@ -1 +0,0 @@ -v1 48b650cf75f6e1fc1f96ff7b2d8f3bc3bbbf43ed79ec67f339173a68fc6b4c3c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721919322546 diff --git a/.cache/go-build/48/48d82578881e69e848668baa34e1235e9670424ffc2d538d1a1cb24e116a174e-d b/.cache/go-build/48/48d82578881e69e848668baa34e1235e9670424ffc2d538d1a1cb24e116a174e-d deleted file mode 100644 index 8e55ea6..0000000 Binary files a/.cache/go-build/48/48d82578881e69e848668baa34e1235e9670424ffc2d538d1a1cb24e116a174e-d and /dev/null differ diff --git a/.cache/go-build/48/48dcffd6203ee541a43fb13c5d947b744abd96043f264561e19caefe279967a8-d b/.cache/go-build/48/48dcffd6203ee541a43fb13c5d947b744abd96043f264561e19caefe279967a8-d deleted file mode 100644 index 9b19c5e..0000000 --- a/.cache/go-build/48/48dcffd6203ee541a43fb13c5d947b744abd96043f264561e19caefe279967a8-d +++ /dev/null @@ -1 +0,0 @@ -./utf16.go diff --git a/.cache/go-build/48/48e9e3662cd82719fc33682fbf67156735ea1cced318fb1e96863a488bfd4c16-a b/.cache/go-build/48/48e9e3662cd82719fc33682fbf67156735ea1cced318fb1e96863a488bfd4c16-a deleted file mode 100644 index e5798fb..0000000 --- a/.cache/go-build/48/48e9e3662cd82719fc33682fbf67156735ea1cced318fb1e96863a488bfd4c16-a +++ /dev/null @@ -1 +0,0 @@ -v1 48e9e3662cd82719fc33682fbf67156735ea1cced318fb1e96863a488bfd4c16 a7302a8e979303e51bd8ad638c0b87437534d9c0307737771a596b436ae7bcce 901596 1775138184115776524 diff --git a/.cache/go-build/48/48eed3a264b36558d9c5a95347dca9a2f6c8a56492882e4e4e51fbe50fb7c19a-a b/.cache/go-build/48/48eed3a264b36558d9c5a95347dca9a2f6c8a56492882e4e4e51fbe50fb7c19a-a deleted file mode 100644 index 416b745..0000000 --- a/.cache/go-build/48/48eed3a264b36558d9c5a95347dca9a2f6c8a56492882e4e4e51fbe50fb7c19a-a +++ /dev/null @@ -1 +0,0 @@ -v1 48eed3a264b36558d9c5a95347dca9a2f6c8a56492882e4e4e51fbe50fb7c19a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289803035887 diff --git a/.cache/go-build/49/492a976ff4e44f40e91255ed01bf0b737194b588ca87be57f3a4acc540cf46bb-a b/.cache/go-build/49/492a976ff4e44f40e91255ed01bf0b737194b588ca87be57f3a4acc540cf46bb-a deleted file mode 100644 index a263af2..0000000 --- a/.cache/go-build/49/492a976ff4e44f40e91255ed01bf0b737194b588ca87be57f3a4acc540cf46bb-a +++ /dev/null @@ -1 +0,0 @@ -v1 492a976ff4e44f40e91255ed01bf0b737194b588ca87be57f3a4acc540cf46bb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287036393648 diff --git a/.cache/go-build/49/494ff78d7154d89969a617cfda5b0303272b8f5e9b559c75d959109f20563d51-d b/.cache/go-build/49/494ff78d7154d89969a617cfda5b0303272b8f5e9b559c75d959109f20563d51-d deleted file mode 100644 index 46113ec..0000000 Binary files a/.cache/go-build/49/494ff78d7154d89969a617cfda5b0303272b8f5e9b559c75d959109f20563d51-d and /dev/null differ diff --git a/.cache/go-build/49/495a4460c9c8b3bfebd936a85176b639f7d45fd6aba419dcbda77be75d979e8f-d b/.cache/go-build/49/495a4460c9c8b3bfebd936a85176b639f7d45fd6aba419dcbda77be75d979e8f-d deleted file mode 100644 index d883f03..0000000 Binary files a/.cache/go-build/49/495a4460c9c8b3bfebd936a85176b639f7d45fd6aba419dcbda77be75d979e8f-d and /dev/null differ diff --git a/.cache/go-build/49/49d8d1dae76655a2dabed81fa61b2247052b8ad021b3cfdf419b3b42d40853fe-a b/.cache/go-build/49/49d8d1dae76655a2dabed81fa61b2247052b8ad021b3cfdf419b3b42d40853fe-a deleted file mode 100644 index e9b73f7..0000000 --- a/.cache/go-build/49/49d8d1dae76655a2dabed81fa61b2247052b8ad021b3cfdf419b3b42d40853fe-a +++ /dev/null @@ -1 +0,0 @@ -v1 49d8d1dae76655a2dabed81fa61b2247052b8ad021b3cfdf419b3b42d40853fe 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775137722090158058 diff --git a/.cache/go-build/4a/4a57bdb08026a0a981c25f11c68d7c4ac0769435b6e0fdc2ece182a4b5df3510-a b/.cache/go-build/4a/4a57bdb08026a0a981c25f11c68d7c4ac0769435b6e0fdc2ece182a4b5df3510-a deleted file mode 100644 index 6213301..0000000 --- a/.cache/go-build/4a/4a57bdb08026a0a981c25f11c68d7c4ac0769435b6e0fdc2ece182a4b5df3510-a +++ /dev/null @@ -1 +0,0 @@ -v1 4a57bdb08026a0a981c25f11c68d7c4ac0769435b6e0fdc2ece182a4b5df3510 d5ab4266d0ffcdddd60ae7f69adbca0b12ea85d9d054bea41e534f3f4634f4e5 46 1775136289057971794 diff --git a/.cache/go-build/4a/4a6859027f3222e90b96fa18b668d73b4f170f642c671c0cb72d28b243e3c58f-a b/.cache/go-build/4a/4a6859027f3222e90b96fa18b668d73b4f170f642c671c0cb72d28b243e3c58f-a deleted file mode 100644 index d471a59..0000000 --- a/.cache/go-build/4a/4a6859027f3222e90b96fa18b668d73b4f170f642c671c0cb72d28b243e3c58f-a +++ /dev/null @@ -1 +0,0 @@ -v1 4a6859027f3222e90b96fa18b668d73b4f170f642c671c0cb72d28b243e3c58f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286929386602 diff --git a/.cache/go-build/4a/4a846659f16f2351be525dd9184f9e41e7644addb6b0ad620536e68a3fc0c756-a b/.cache/go-build/4a/4a846659f16f2351be525dd9184f9e41e7644addb6b0ad620536e68a3fc0c756-a deleted file mode 100644 index 9afa746..0000000 --- a/.cache/go-build/4a/4a846659f16f2351be525dd9184f9e41e7644addb6b0ad620536e68a3fc0c756-a +++ /dev/null @@ -1 +0,0 @@ -v1 4a846659f16f2351be525dd9184f9e41e7644addb6b0ad620536e68a3fc0c756 46b2238b6910b280cc7117086e6c70db944894173d5fd15e90fb6909a87ac5a9 112 1775136289341750707 diff --git a/.cache/go-build/4a/4a9a0636658dd83a7fe8efa93a03752310d966621280c53d2797089981436076-a b/.cache/go-build/4a/4a9a0636658dd83a7fe8efa93a03752310d966621280c53d2797089981436076-a deleted file mode 100644 index 8cb48b5..0000000 --- a/.cache/go-build/4a/4a9a0636658dd83a7fe8efa93a03752310d966621280c53d2797089981436076-a +++ /dev/null @@ -1 +0,0 @@ -v1 4a9a0636658dd83a7fe8efa93a03752310d966621280c53d2797089981436076 165566167ffc24ceb8f58319e05580d09c40b6e7eca3f716a30f1f63bc336d58 14170 1775136288413487933 diff --git a/.cache/go-build/4a/4acf8f9b45b63044e0cd667f0b6535dfb997be20e3a546cd0bf5731fa9348f15-a b/.cache/go-build/4a/4acf8f9b45b63044e0cd667f0b6535dfb997be20e3a546cd0bf5731fa9348f15-a deleted file mode 100644 index c991b06..0000000 --- a/.cache/go-build/4a/4acf8f9b45b63044e0cd667f0b6535dfb997be20e3a546cd0bf5731fa9348f15-a +++ /dev/null @@ -1 +0,0 @@ -v1 4acf8f9b45b63044e0cd667f0b6535dfb997be20e3a546cd0bf5731fa9348f15 fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775138184194484651 diff --git a/.cache/go-build/4a/4aeca7e731ffb3b2521f7fd077f5c1634e0d099ae02f1b0a594b59a9794eec27-a b/.cache/go-build/4a/4aeca7e731ffb3b2521f7fd077f5c1634e0d099ae02f1b0a594b59a9794eec27-a deleted file mode 100644 index b0748f6..0000000 --- a/.cache/go-build/4a/4aeca7e731ffb3b2521f7fd077f5c1634e0d099ae02f1b0a594b59a9794eec27-a +++ /dev/null @@ -1 +0,0 @@ -v1 4aeca7e731ffb3b2521f7fd077f5c1634e0d099ae02f1b0a594b59a9794eec27 35856949c242a1678ce1319008b4b4c3d209e101b906327f6f0b540f75763d17 5444 1775136286917870294 diff --git a/.cache/go-build/4b/4b40aa732601fec64980e4d56ee1ad507352a3d1ec27d413a994eb9b723e5b19-d b/.cache/go-build/4b/4b40aa732601fec64980e4d56ee1ad507352a3d1ec27d413a994eb9b723e5b19-d deleted file mode 100644 index 51220c5..0000000 Binary files a/.cache/go-build/4b/4b40aa732601fec64980e4d56ee1ad507352a3d1ec27d413a994eb9b723e5b19-d and /dev/null differ diff --git a/.cache/go-build/4b/4bcc5b5fe388bdc8b66c8d59b4afd5f7edd4e0dffe84bd6d9f290b08b4adabe6-a b/.cache/go-build/4b/4bcc5b5fe388bdc8b66c8d59b4afd5f7edd4e0dffe84bd6d9f290b08b4adabe6-a deleted file mode 100644 index 6b70a80..0000000 --- a/.cache/go-build/4b/4bcc5b5fe388bdc8b66c8d59b4afd5f7edd4e0dffe84bd6d9f290b08b4adabe6-a +++ /dev/null @@ -1 +0,0 @@ -v1 4bcc5b5fe388bdc8b66c8d59b4afd5f7edd4e0dffe84bd6d9f290b08b4adabe6 25cc3eb697808e962150312a12c90286e71772822eca2c5717ea75b4fa57cfbc 258 1775136287064944419 diff --git a/.cache/go-build/4b/4be812bc9dd653501b13397873515f98f11519af014a4dcf7e6174688344f6e7-a b/.cache/go-build/4b/4be812bc9dd653501b13397873515f98f11519af014a4dcf7e6174688344f6e7-a deleted file mode 100644 index abe8193..0000000 --- a/.cache/go-build/4b/4be812bc9dd653501b13397873515f98f11519af014a4dcf7e6174688344f6e7-a +++ /dev/null @@ -1 +0,0 @@ -v1 4be812bc9dd653501b13397873515f98f11519af014a4dcf7e6174688344f6e7 08940aa9a30b0610997c84b4640254e6190924f447c98ef7952d278db6371a60 3018 1775136286933211615 diff --git a/.cache/go-build/4c/4c1067a68aeaf4c6291f18e64d6e9c42e7ac444a7a53819aebeb96211416b24e-d b/.cache/go-build/4c/4c1067a68aeaf4c6291f18e64d6e9c42e7ac444a7a53819aebeb96211416b24e-d deleted file mode 100644 index fc627aa..0000000 Binary files a/.cache/go-build/4c/4c1067a68aeaf4c6291f18e64d6e9c42e7ac444a7a53819aebeb96211416b24e-d and /dev/null differ diff --git a/.cache/go-build/4c/4c6d059a949c49a25675e8fc4bb9764109940a419606c2e57c1d307c4e5c5a00-d b/.cache/go-build/4c/4c6d059a949c49a25675e8fc4bb9764109940a419606c2e57c1d307c4e5c5a00-d deleted file mode 100644 index 20342df..0000000 Binary files a/.cache/go-build/4c/4c6d059a949c49a25675e8fc4bb9764109940a419606c2e57c1d307c4e5c5a00-d and /dev/null differ diff --git a/.cache/go-build/4c/4c7d26d7e66b0f4b438309bea3e1b4b48d0d29e6ccceeb0aee8d5680896479d3-a b/.cache/go-build/4c/4c7d26d7e66b0f4b438309bea3e1b4b48d0d29e6ccceeb0aee8d5680896479d3-a deleted file mode 100644 index 3c1e975..0000000 --- a/.cache/go-build/4c/4c7d26d7e66b0f4b438309bea3e1b4b48d0d29e6ccceeb0aee8d5680896479d3-a +++ /dev/null @@ -1 +0,0 @@ -v1 4c7d26d7e66b0f4b438309bea3e1b4b48d0d29e6ccceeb0aee8d5680896479d3 5673782513dc090b5d53b5510a6fd00bfe833c6fdf369d1ee50a3eff1fcf4f9b 3618 1775136286922041637 diff --git a/.cache/go-build/4c/4c91fc0a57be83dd144d3a9e37118ca737f235fc6841d85f3b5ea37b7003e86e-d b/.cache/go-build/4c/4c91fc0a57be83dd144d3a9e37118ca737f235fc6841d85f3b5ea37b7003e86e-d deleted file mode 100644 index 68ba240..0000000 --- a/.cache/go-build/4c/4c91fc0a57be83dd144d3a9e37118ca737f235fc6841d85f3b5ea37b7003e86e-d +++ /dev/null @@ -1,5 +0,0 @@ -./cast.go -./sha256.go -./sha256block.go -./sha256block_amd64.go -./sha256block_amd64.s diff --git a/.cache/go-build/4c/4ca457402187c6359ca9e3edc65d775ee160dfd14219c98adde8f2a432bfbe4a-a b/.cache/go-build/4c/4ca457402187c6359ca9e3edc65d775ee160dfd14219c98adde8f2a432bfbe4a-a deleted file mode 100644 index 04e7912..0000000 --- a/.cache/go-build/4c/4ca457402187c6359ca9e3edc65d775ee160dfd14219c98adde8f2a432bfbe4a-a +++ /dev/null @@ -1 +0,0 @@ -v1 4ca457402187c6359ca9e3edc65d775ee160dfd14219c98adde8f2a432bfbe4a 1722e39b2eec812fae3b211d6e60f4a433f0d07a5be681d4de36532e00aac03c 21 1775136287066519650 diff --git a/.cache/go-build/4c/4cf090930390044d6381eea634778ab8f4a90ebc9b6f7cacbcdc8bb0220076ac-a b/.cache/go-build/4c/4cf090930390044d6381eea634778ab8f4a90ebc9b6f7cacbcdc8bb0220076ac-a deleted file mode 100644 index d643bd0..0000000 --- a/.cache/go-build/4c/4cf090930390044d6381eea634778ab8f4a90ebc9b6f7cacbcdc8bb0220076ac-a +++ /dev/null @@ -1 +0,0 @@ -v1 4cf090930390044d6381eea634778ab8f4a90ebc9b6f7cacbcdc8bb0220076ac e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288568739284 diff --git a/.cache/go-build/4d/4d03c76175c04b259c0f0c790f48f44744c45c8dba380c2f19a62a892b6702f4-a b/.cache/go-build/4d/4d03c76175c04b259c0f0c790f48f44744c45c8dba380c2f19a62a892b6702f4-a deleted file mode 100644 index a623eb2..0000000 --- a/.cache/go-build/4d/4d03c76175c04b259c0f0c790f48f44744c45c8dba380c2f19a62a892b6702f4-a +++ /dev/null @@ -1 +0,0 @@ -v1 4d03c76175c04b259c0f0c790f48f44744c45c8dba380c2f19a62a892b6702f4 087832261f11fa6e6fe4ec2160bd1580530b3ca62179bed9093beef47b6229f6 147 1775136289034158637 diff --git a/.cache/go-build/4d/4d2c5f21c1322f3bef333277bdcf0ec840f13ee0983340c1622ca37b618d63c6-d b/.cache/go-build/4d/4d2c5f21c1322f3bef333277bdcf0ec840f13ee0983340c1622ca37b618d63c6-d deleted file mode 100644 index 9dab9f1..0000000 Binary files a/.cache/go-build/4d/4d2c5f21c1322f3bef333277bdcf0ec840f13ee0983340c1622ca37b618d63c6-d and /dev/null differ diff --git a/.cache/go-build/4d/4d9137f8833562e2ef0a816c77556192858af60a14422b7339136139300be86e-a b/.cache/go-build/4d/4d9137f8833562e2ef0a816c77556192858af60a14422b7339136139300be86e-a deleted file mode 100644 index a9877e0..0000000 --- a/.cache/go-build/4d/4d9137f8833562e2ef0a816c77556192858af60a14422b7339136139300be86e-a +++ /dev/null @@ -1 +0,0 @@ -v1 4d9137f8833562e2ef0a816c77556192858af60a14422b7339136139300be86e c85ea04250f0900c207c9bdc1fe8978b9fd0610ae9182f66d5bbdccd49c39c88 305448 1775136289305384021 diff --git a/.cache/go-build/4d/4dd4b2424c67a70a1eccf532029b11cc7df6521cb39a5810cb9475be4faa6528-a b/.cache/go-build/4d/4dd4b2424c67a70a1eccf532029b11cc7df6521cb39a5810cb9475be4faa6528-a deleted file mode 100644 index 899b51a..0000000 --- a/.cache/go-build/4d/4dd4b2424c67a70a1eccf532029b11cc7df6521cb39a5810cb9475be4faa6528-a +++ /dev/null @@ -1 +0,0 @@ -v1 4dd4b2424c67a70a1eccf532029b11cc7df6521cb39a5810cb9475be4faa6528 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721882140659 diff --git a/.cache/go-build/4d/4de4f43efff260261505dbed8c802100d697f57b72a5588a4e4e1e54b54d3981-d b/.cache/go-build/4d/4de4f43efff260261505dbed8c802100d697f57b72a5588a4e4e1e54b54d3981-d deleted file mode 100644 index 55ea289..0000000 Binary files a/.cache/go-build/4d/4de4f43efff260261505dbed8c802100d697f57b72a5588a4e4e1e54b54d3981-d and /dev/null differ diff --git a/.cache/go-build/4e/4e0b53c524b3f2e4da1eb6c125b55570caf6d16f72a498f910abafd9926dd605-a b/.cache/go-build/4e/4e0b53c524b3f2e4da1eb6c125b55570caf6d16f72a498f910abafd9926dd605-a deleted file mode 100644 index 87f549b..0000000 --- a/.cache/go-build/4e/4e0b53c524b3f2e4da1eb6c125b55570caf6d16f72a498f910abafd9926dd605-a +++ /dev/null @@ -1 +0,0 @@ -v1 4e0b53c524b3f2e4da1eb6c125b55570caf6d16f72a498f910abafd9926dd605 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775137722020682178 diff --git a/.cache/go-build/4e/4e0e8b4290a8a0dc7909464667ec0b3a2672bb1f45038439eb8dfb5699598500-a b/.cache/go-build/4e/4e0e8b4290a8a0dc7909464667ec0b3a2672bb1f45038439eb8dfb5699598500-a deleted file mode 100644 index 88d7dc1..0000000 --- a/.cache/go-build/4e/4e0e8b4290a8a0dc7909464667ec0b3a2672bb1f45038439eb8dfb5699598500-a +++ /dev/null @@ -1 +0,0 @@ -v1 4e0e8b4290a8a0dc7909464667ec0b3a2672bb1f45038439eb8dfb5699598500 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289050146849 diff --git a/.cache/go-build/4e/4e100d4aada388c5961b6cdfb2ceb007264a892259cc4e354962386d201a6fd1-d b/.cache/go-build/4e/4e100d4aada388c5961b6cdfb2ceb007264a892259cc4e354962386d201a6fd1-d deleted file mode 100644 index 98451e1..0000000 Binary files a/.cache/go-build/4e/4e100d4aada388c5961b6cdfb2ceb007264a892259cc4e354962386d201a6fd1-d and /dev/null differ diff --git a/.cache/go-build/4e/4e39781cb960b222b08c0e6631a0570922ec268efe74c9ef9ec450e83bae660d-a b/.cache/go-build/4e/4e39781cb960b222b08c0e6631a0570922ec268efe74c9ef9ec450e83bae660d-a deleted file mode 100644 index 073cc60..0000000 --- a/.cache/go-build/4e/4e39781cb960b222b08c0e6631a0570922ec268efe74c9ef9ec450e83bae660d-a +++ /dev/null @@ -1 +0,0 @@ -v1 4e39781cb960b222b08c0e6631a0570922ec268efe74c9ef9ec450e83bae660d 3339d79ce30d7636873151519d8657b87a9d51f308858fd6744b5daed677bdd7 1161330 1775136289421876875 diff --git a/.cache/go-build/4e/4e59e06e36d3f28fabd874358470c40eea378b8a4757307c37715d2f2785afb5-a b/.cache/go-build/4e/4e59e06e36d3f28fabd874358470c40eea378b8a4757307c37715d2f2785afb5-a deleted file mode 100644 index 46fe031..0000000 --- a/.cache/go-build/4e/4e59e06e36d3f28fabd874358470c40eea378b8a4757307c37715d2f2785afb5-a +++ /dev/null @@ -1 +0,0 @@ -v1 4e59e06e36d3f28fabd874358470c40eea378b8a4757307c37715d2f2785afb5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288729137389 diff --git a/.cache/go-build/4e/4ea8f71aa629179dcc37be86a8d85bb6eaf90850f41cb72e8e5d9cd11f822218-d b/.cache/go-build/4e/4ea8f71aa629179dcc37be86a8d85bb6eaf90850f41cb72e8e5d9cd11f822218-d deleted file mode 100644 index a034a9d..0000000 Binary files a/.cache/go-build/4e/4ea8f71aa629179dcc37be86a8d85bb6eaf90850f41cb72e8e5d9cd11f822218-d and /dev/null differ diff --git a/.cache/go-build/4e/4eaf98a2e0ccbce41d17188cddf2d0869f02a9375ab648aa54cae7e5a1d8a28a-d b/.cache/go-build/4e/4eaf98a2e0ccbce41d17188cddf2d0869f02a9375ab648aa54cae7e5a1d8a28a-d deleted file mode 100644 index 82c1e34..0000000 --- a/.cache/go-build/4e/4eaf98a2e0ccbce41d17188cddf2d0869f02a9375ab648aa54cae7e5a1d8a28a-d +++ /dev/null @@ -1 +0,0 @@ -./check.go diff --git a/.cache/go-build/4e/4eb4ff8567eadab6aaae73170e7f5d4798d26445d41a43ff99da73d4bf197384-d b/.cache/go-build/4e/4eb4ff8567eadab6aaae73170e7f5d4798d26445d41a43ff99da73d4bf197384-d deleted file mode 100644 index 2e4ccbb..0000000 Binary files a/.cache/go-build/4e/4eb4ff8567eadab6aaae73170e7f5d4798d26445d41a43ff99da73d4bf197384-d and /dev/null differ diff --git a/.cache/go-build/4e/4eec9daad5b3f1289751ad607724669addc8fe85f0de1f080efddcc17ad1cb28-a b/.cache/go-build/4e/4eec9daad5b3f1289751ad607724669addc8fe85f0de1f080efddcc17ad1cb28-a deleted file mode 100644 index cb2de6d..0000000 --- a/.cache/go-build/4e/4eec9daad5b3f1289751ad607724669addc8fe85f0de1f080efddcc17ad1cb28-a +++ /dev/null @@ -1 +0,0 @@ -v1 4eec9daad5b3f1289751ad607724669addc8fe85f0de1f080efddcc17ad1cb28 ac2793276e994cc416474de95cee3f7fdcf4a07d56cd17d0de65ae6a0100b63e 20 1775136288730033450 diff --git a/.cache/go-build/4f/4f03450707c7c9210dc82a99250ed654092f427df0db69aa4fa9706f6189c6ff-a b/.cache/go-build/4f/4f03450707c7c9210dc82a99250ed654092f427df0db69aa4fa9706f6189c6ff-a deleted file mode 100644 index 6bb28cb..0000000 --- a/.cache/go-build/4f/4f03450707c7c9210dc82a99250ed654092f427df0db69aa4fa9706f6189c6ff-a +++ /dev/null @@ -1 +0,0 @@ -v1 4f03450707c7c9210dc82a99250ed654092f427df0db69aa4fa9706f6189c6ff e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289470820860 diff --git a/.cache/go-build/4f/4f910403db5bf28107b2c4e068b11230560081b62fa3bea460a3880e559e63cd-a b/.cache/go-build/4f/4f910403db5bf28107b2c4e068b11230560081b62fa3bea460a3880e559e63cd-a deleted file mode 100644 index cbb2b6e..0000000 --- a/.cache/go-build/4f/4f910403db5bf28107b2c4e068b11230560081b62fa3bea460a3880e559e63cd-a +++ /dev/null @@ -1 +0,0 @@ -v1 4f910403db5bf28107b2c4e068b11230560081b62fa3bea460a3880e559e63cd 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775138184207069320 diff --git a/.cache/go-build/4f/4fed1b2fee27a220616529c7235d344a1831e30e48f3f915be270f7907768591-a b/.cache/go-build/4f/4fed1b2fee27a220616529c7235d344a1831e30e48f3f915be270f7907768591-a deleted file mode 100644 index 135bfed..0000000 --- a/.cache/go-build/4f/4fed1b2fee27a220616529c7235d344a1831e30e48f3f915be270f7907768591-a +++ /dev/null @@ -1 +0,0 @@ -v1 4fed1b2fee27a220616529c7235d344a1831e30e48f3f915be270f7907768591 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288994059879 diff --git a/.cache/go-build/50/501ec53a1f5bfabc00d237bf9dd3134cad1ec2f77d61437e3ea56ae2567a1a9b-a b/.cache/go-build/50/501ec53a1f5bfabc00d237bf9dd3134cad1ec2f77d61437e3ea56ae2567a1a9b-a deleted file mode 100644 index a552aea..0000000 --- a/.cache/go-build/50/501ec53a1f5bfabc00d237bf9dd3134cad1ec2f77d61437e3ea56ae2567a1a9b-a +++ /dev/null @@ -1 +0,0 @@ -v1 501ec53a1f5bfabc00d237bf9dd3134cad1ec2f77d61437e3ea56ae2567a1a9b 5d502a0aeae97c72ff2a281d1d42ae6ed2b94034e58baf147f66f629fb6d90bc 2640 1775136286834908214 diff --git a/.cache/go-build/50/5042c8d9646d994a72664fbd947c6d6ae379308dacb77d3196d20512668a2f83-a b/.cache/go-build/50/5042c8d9646d994a72664fbd947c6d6ae379308dacb77d3196d20512668a2f83-a deleted file mode 100644 index 874788e..0000000 --- a/.cache/go-build/50/5042c8d9646d994a72664fbd947c6d6ae379308dacb77d3196d20512668a2f83-a +++ /dev/null @@ -1 +0,0 @@ -v1 5042c8d9646d994a72664fbd947c6d6ae379308dacb77d3196d20512668a2f83 56e6a51653f2207ae2de540b8e72e47073c38247374fce78f7bc8be3f1f1b706 199 1775136286816001431 diff --git a/.cache/go-build/50/504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3-d b/.cache/go-build/50/504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3-d deleted file mode 100644 index ee6937f..0000000 --- a/.cache/go-build/50/504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3-d +++ /dev/null @@ -1 +0,0 @@ -ok gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/pipeline 0.004s diff --git a/.cache/go-build/50/50746632d50e64568ba85275e157f3c03169576004e79ea52b9d1d2e881e3b2a-a b/.cache/go-build/50/50746632d50e64568ba85275e157f3c03169576004e79ea52b9d1d2e881e3b2a-a deleted file mode 100644 index 54483e6..0000000 --- a/.cache/go-build/50/50746632d50e64568ba85275e157f3c03169576004e79ea52b9d1d2e881e3b2a-a +++ /dev/null @@ -1 +0,0 @@ -v1 50746632d50e64568ba85275e157f3c03169576004e79ea52b9d1d2e881e3b2a 0af6c119dfb70f4f8fc24e429bb217263807553cf540a0ca1e836aed3d89bccd 9 1775136289801295316 diff --git a/.cache/go-build/50/50a48eb9b1a8b3e2c1446b02eefb881c053bfef9ba258979a6ac1755cdd3e95a-d b/.cache/go-build/50/50a48eb9b1a8b3e2c1446b02eefb881c053bfef9ba258979a6ac1755cdd3e95a-d deleted file mode 100644 index 29c0773..0000000 Binary files a/.cache/go-build/50/50a48eb9b1a8b3e2c1446b02eefb881c053bfef9ba258979a6ac1755cdd3e95a-d and /dev/null differ diff --git a/.cache/go-build/50/50dc4a9fc17a07795522a1c426d50dc174b1153199d50336f7b9a9df2de0bf7c-a b/.cache/go-build/50/50dc4a9fc17a07795522a1c426d50dc174b1153199d50336f7b9a9df2de0bf7c-a deleted file mode 100644 index a489c08..0000000 --- a/.cache/go-build/50/50dc4a9fc17a07795522a1c426d50dc174b1153199d50336f7b9a9df2de0bf7c-a +++ /dev/null @@ -1 +0,0 @@ -v1 50dc4a9fc17a07795522a1c426d50dc174b1153199d50336f7b9a9df2de0bf7c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289479561446 diff --git a/.cache/go-build/50/50fd77047059e82529c27d30f937f49a67214d4f553f9bc3d5dcbb5a5f08bba4-d b/.cache/go-build/50/50fd77047059e82529c27d30f937f49a67214d4f553f9bc3d5dcbb5a5f08bba4-d deleted file mode 100644 index 7cc9c26..0000000 Binary files a/.cache/go-build/50/50fd77047059e82529c27d30f937f49a67214d4f553f9bc3d5dcbb5a5f08bba4-d and /dev/null differ diff --git a/.cache/go-build/51/51665de8349d4447b5e0921bf0e3b95be5a8ff7d364281955f970038c90457d1-a b/.cache/go-build/51/51665de8349d4447b5e0921bf0e3b95be5a8ff7d364281955f970038c90457d1-a deleted file mode 100644 index 7009ef4..0000000 --- a/.cache/go-build/51/51665de8349d4447b5e0921bf0e3b95be5a8ff7d364281955f970038c90457d1-a +++ /dev/null @@ -1 +0,0 @@ -v1 51665de8349d4447b5e0921bf0e3b95be5a8ff7d364281955f970038c90457d1 19b9dd0cdd479e2c992f5b31a1d405f00a9bb35127fc70b01c1fce2c6e38715a 578 1775136286940540420 diff --git a/.cache/go-build/51/51b4ff23f890cc3ef9f0a06ebdb1b63f19e4f35091747e84934792452188f6a3-a b/.cache/go-build/51/51b4ff23f890cc3ef9f0a06ebdb1b63f19e4f35091747e84934792452188f6a3-a deleted file mode 100644 index 7d42271..0000000 --- a/.cache/go-build/51/51b4ff23f890cc3ef9f0a06ebdb1b63f19e4f35091747e84934792452188f6a3-a +++ /dev/null @@ -1 +0,0 @@ -v1 51b4ff23f890cc3ef9f0a06ebdb1b63f19e4f35091747e84934792452188f6a3 aa4a6b6b579cdd2446d417f49f7fc1efa8ec4e637095344a814ea63905a511f4 100 1775136289053542131 diff --git a/.cache/go-build/51/51b7a879448e5f8f179c1d3343e5118f32f6393299d5efe521757abc971003be-a b/.cache/go-build/51/51b7a879448e5f8f179c1d3343e5118f32f6393299d5efe521757abc971003be-a deleted file mode 100644 index dd6b26e..0000000 --- a/.cache/go-build/51/51b7a879448e5f8f179c1d3343e5118f32f6393299d5efe521757abc971003be-a +++ /dev/null @@ -1 +0,0 @@ -v1 51b7a879448e5f8f179c1d3343e5118f32f6393299d5efe521757abc971003be cc3e51fe05de07962dfea672ae2834e41e51b0129e2a4e626ee02611bd09e066 2316 1775136286943036282 diff --git a/.cache/go-build/51/51e7d4a8359c169861469439dcb401ea0ad499cae5a9440b1fd778fd7fa6ef58-a b/.cache/go-build/51/51e7d4a8359c169861469439dcb401ea0ad499cae5a9440b1fd778fd7fa6ef58-a deleted file mode 100644 index 262cb5c..0000000 --- a/.cache/go-build/51/51e7d4a8359c169861469439dcb401ea0ad499cae5a9440b1fd778fd7fa6ef58-a +++ /dev/null @@ -1 +0,0 @@ -v1 51e7d4a8359c169861469439dcb401ea0ad499cae5a9440b1fd778fd7fa6ef58 934898cfeea0e1e0676fac3384f1942ee6e0193016ee4a0ea2f5a16558ed2267 14752 1775136287081697901 diff --git a/.cache/go-build/52/528af710acc32f448844134572fbe2987c7f16019be1ddc1db43675b4f6bb44c-a b/.cache/go-build/52/528af710acc32f448844134572fbe2987c7f16019be1ddc1db43675b4f6bb44c-a deleted file mode 100644 index 250d684..0000000 --- a/.cache/go-build/52/528af710acc32f448844134572fbe2987c7f16019be1ddc1db43675b4f6bb44c-a +++ /dev/null @@ -1 +0,0 @@ -v1 528af710acc32f448844134572fbe2987c7f16019be1ddc1db43675b4f6bb44c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287071067773 diff --git a/.cache/go-build/52/52bb99828930bd949ab8584a992c8bec2d9d3ba11cede75c96f765e9985276ce-a b/.cache/go-build/52/52bb99828930bd949ab8584a992c8bec2d9d3ba11cede75c96f765e9985276ce-a deleted file mode 100644 index dd31879..0000000 --- a/.cache/go-build/52/52bb99828930bd949ab8584a992c8bec2d9d3ba11cede75c96f765e9985276ce-a +++ /dev/null @@ -1 +0,0 @@ -v1 52bb99828930bd949ab8584a992c8bec2d9d3ba11cede75c96f765e9985276ce 8732b79b259055524ca0c17606c417f5d696893d0001b6043cfeef9b7589a6ec 623070 1775136288637364273 diff --git a/.cache/go-build/52/52c62286a6965b62254b4f759fa2af79b5d381f62f0a40c8d0722712b0ffdc37-a b/.cache/go-build/52/52c62286a6965b62254b4f759fa2af79b5d381f62f0a40c8d0722712b0ffdc37-a deleted file mode 100644 index 04b5aec..0000000 --- a/.cache/go-build/52/52c62286a6965b62254b4f759fa2af79b5d381f62f0a40c8d0722712b0ffdc37-a +++ /dev/null @@ -1 +0,0 @@ -v1 52c62286a6965b62254b4f759fa2af79b5d381f62f0a40c8d0722712b0ffdc37 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775138184265880882 diff --git a/.cache/go-build/52/52e5bfa5984c52ac3d7e08dd65c542bd7f3c810b55e6cf408443ebbeab135b0b-a b/.cache/go-build/52/52e5bfa5984c52ac3d7e08dd65c542bd7f3c810b55e6cf408443ebbeab135b0b-a deleted file mode 100644 index 155c15d..0000000 --- a/.cache/go-build/52/52e5bfa5984c52ac3d7e08dd65c542bd7f3c810b55e6cf408443ebbeab135b0b-a +++ /dev/null @@ -1 +0,0 @@ -v1 52e5bfa5984c52ac3d7e08dd65c542bd7f3c810b55e6cf408443ebbeab135b0b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289837789262 diff --git a/.cache/go-build/52/52f9fb26179125179dc1db959db60f903ce2d01016b80265319bc867d3218d8e-a b/.cache/go-build/52/52f9fb26179125179dc1db959db60f903ce2d01016b80265319bc867d3218d8e-a deleted file mode 100644 index 0355321..0000000 --- a/.cache/go-build/52/52f9fb26179125179dc1db959db60f903ce2d01016b80265319bc867d3218d8e-a +++ /dev/null @@ -1 +0,0 @@ -v1 52f9fb26179125179dc1db959db60f903ce2d01016b80265319bc867d3218d8e 3d3c63f18ac0e155ddcfb3d5efd2e9d0be8c9323554f7cf603fd9a2875ceb6e6 73 1775136290022360284 diff --git a/.cache/go-build/53/53054495d8a3d814c628f1877493f9578cdaf85ba3ae116d4e620d8685cd8f31-a b/.cache/go-build/53/53054495d8a3d814c628f1877493f9578cdaf85ba3ae116d4e620d8685cd8f31-a deleted file mode 100644 index 3d1b149..0000000 --- a/.cache/go-build/53/53054495d8a3d814c628f1877493f9578cdaf85ba3ae116d4e620d8685cd8f31-a +++ /dev/null @@ -1 +0,0 @@ -v1 53054495d8a3d814c628f1877493f9578cdaf85ba3ae116d4e620d8685cd8f31 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288979234938 diff --git a/.cache/go-build/53/53060e473bed25936ac008ad22683048bacd9dedb953b8fdae58cb2a88680f12-a b/.cache/go-build/53/53060e473bed25936ac008ad22683048bacd9dedb953b8fdae58cb2a88680f12-a deleted file mode 100644 index 7c04c3b..0000000 --- a/.cache/go-build/53/53060e473bed25936ac008ad22683048bacd9dedb953b8fdae58cb2a88680f12-a +++ /dev/null @@ -1 +0,0 @@ -v1 53060e473bed25936ac008ad22683048bacd9dedb953b8fdae58cb2a88680f12 229b086fff3b69b974439cc55c623c8a044c0fb1255149f5a0e9adb82c042db6 27348 1775136286958808853 diff --git a/.cache/go-build/53/532525c24bb436f895d1bfbf3b319a9c31fa088699b380c75fdaebca810802d8-a b/.cache/go-build/53/532525c24bb436f895d1bfbf3b319a9c31fa088699b380c75fdaebca810802d8-a deleted file mode 100644 index c527a79..0000000 --- a/.cache/go-build/53/532525c24bb436f895d1bfbf3b319a9c31fa088699b380c75fdaebca810802d8-a +++ /dev/null @@ -1 +0,0 @@ -v1 532525c24bb436f895d1bfbf3b319a9c31fa088699b380c75fdaebca810802d8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289100235445 diff --git a/.cache/go-build/53/53354660680831bc9eb37d97fd8653bd7c602dd0ca07cbe6930abb039acf1b78-d b/.cache/go-build/53/53354660680831bc9eb37d97fd8653bd7c602dd0ca07cbe6930abb039acf1b78-d deleted file mode 100644 index 810232e..0000000 Binary files a/.cache/go-build/53/53354660680831bc9eb37d97fd8653bd7c602dd0ca07cbe6930abb039acf1b78-d and /dev/null differ diff --git a/.cache/go-build/53/533e1ad6d2c1fec6fea2e65761aeea847722a5efd15f7866fbd2538ef97d853a-a b/.cache/go-build/53/533e1ad6d2c1fec6fea2e65761aeea847722a5efd15f7866fbd2538ef97d853a-a deleted file mode 100644 index 90d41cc..0000000 --- a/.cache/go-build/53/533e1ad6d2c1fec6fea2e65761aeea847722a5efd15f7866fbd2538ef97d853a-a +++ /dev/null @@ -1 +0,0 @@ -v1 533e1ad6d2c1fec6fea2e65761aeea847722a5efd15f7866fbd2538ef97d853a 98acef255e1a1cac551a00fcd8f22760d1020a2b26503a11e90af60a8601e696 1227 1775136286810631817 diff --git a/.cache/go-build/53/533f45d502619c7f617a926d718190ea216cb39c6eda93663344177c69cd53bb-a b/.cache/go-build/53/533f45d502619c7f617a926d718190ea216cb39c6eda93663344177c69cd53bb-a deleted file mode 100644 index 7b89ea8..0000000 --- a/.cache/go-build/53/533f45d502619c7f617a926d718190ea216cb39c6eda93663344177c69cd53bb-a +++ /dev/null @@ -1 +0,0 @@ -v1 533f45d502619c7f617a926d718190ea216cb39c6eda93663344177c69cd53bb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289519647195 diff --git a/.cache/go-build/53/534f518efdde0639f04ce5995edf93505967f5b13e4c15533b718765ae74b503-a b/.cache/go-build/53/534f518efdde0639f04ce5995edf93505967f5b13e4c15533b718765ae74b503-a deleted file mode 100644 index ccfa37d..0000000 --- a/.cache/go-build/53/534f518efdde0639f04ce5995edf93505967f5b13e4c15533b718765ae74b503-a +++ /dev/null @@ -1 +0,0 @@ -v1 534f518efdde0639f04ce5995edf93505967f5b13e4c15533b718765ae74b503 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722014817444 diff --git a/.cache/go-build/53/535ed3487206223e150d594d4a08f58df597922d59139fa25bb15fb06bdf905a-a b/.cache/go-build/53/535ed3487206223e150d594d4a08f58df597922d59139fa25bb15fb06bdf905a-a deleted file mode 100644 index 16d01ef..0000000 --- a/.cache/go-build/53/535ed3487206223e150d594d4a08f58df597922d59139fa25bb15fb06bdf905a-a +++ /dev/null @@ -1 +0,0 @@ -v1 535ed3487206223e150d594d4a08f58df597922d59139fa25bb15fb06bdf905a c57be060ec648dd4a30517536339520007a04ce752b67b40b55f54a1a7df76b5 10 1775136286961867435 diff --git a/.cache/go-build/53/536057f20f42b0658dfd976ea469c670042dc7290473af34c01f15ceb499a062-d/nwn-tool b/.cache/go-build/53/536057f20f42b0658dfd976ea469c670042dc7290473af34c01f15ceb499a062-d/nwn-tool deleted file mode 100755 index ee97717..0000000 Binary files a/.cache/go-build/53/536057f20f42b0658dfd976ea469c670042dc7290473af34c01f15ceb499a062-d/nwn-tool and /dev/null differ diff --git a/.cache/go-build/53/536e9867a3ff93420dbc6f8d6a6f6aefecf3cae50e356431e2c21cac6c71fd83-a b/.cache/go-build/53/536e9867a3ff93420dbc6f8d6a6f6aefecf3cae50e356431e2c21cac6c71fd83-a deleted file mode 100644 index e02e348..0000000 --- a/.cache/go-build/53/536e9867a3ff93420dbc6f8d6a6f6aefecf3cae50e356431e2c21cac6c71fd83-a +++ /dev/null @@ -1 +0,0 @@ -v1 536e9867a3ff93420dbc6f8d6a6f6aefecf3cae50e356431e2c21cac6c71fd83 f763c5f0634d0bb362ff579f4998f86b61fbcde8f0ff94f88794162becc00599 2553 1775136286835994395 diff --git a/.cache/go-build/53/538c92bc3645b6804d0a3d28277fe4f05a5724715bfa6b5cf8a61cd05853dd7f-d b/.cache/go-build/53/538c92bc3645b6804d0a3d28277fe4f05a5724715bfa6b5cf8a61cd05853dd7f-d deleted file mode 100644 index cd6c52a..0000000 --- a/.cache/go-build/53/538c92bc3645b6804d0a3d28277fe4f05a5724715bfa6b5cf8a61cd05853dd7f-d +++ /dev/null @@ -1,3 +0,0 @@ -./binary.go -./native_endian_little.go -./varint.go diff --git a/.cache/go-build/54/5470d96a14d4156dab5fc11f2d22ab1c7d754afc82c96a00ac649c823a1dca26-d b/.cache/go-build/54/5470d96a14d4156dab5fc11f2d22ab1c7d754afc82c96a00ac649c823a1dca26-d deleted file mode 100644 index f0248a6..0000000 --- a/.cache/go-build/54/5470d96a14d4156dab5fc11f2d22ab1c7d754afc82c96a00ac649c823a1dca26-d +++ /dev/null @@ -1,4 +0,0 @@ -./cgroup.go -./cgroup_linux.go -./line_reader.go -./runtime.go diff --git a/.cache/go-build/54/54c50e880b9e08830f0b47a94e010e1f27753f759b249c0f14a7f41e9f657dd4-d b/.cache/go-build/54/54c50e880b9e08830f0b47a94e010e1f27753f759b249c0f14a7f41e9f657dd4-d deleted file mode 100644 index a5779b6..0000000 Binary files a/.cache/go-build/54/54c50e880b9e08830f0b47a94e010e1f27753f759b249c0f14a7f41e9f657dd4-d and /dev/null differ diff --git a/.cache/go-build/55/5507332a6594b851dbfbc2db2623d05b599ecb206839551ac05cfdcbf74da932-d b/.cache/go-build/55/5507332a6594b851dbfbc2db2623d05b599ecb206839551ac05cfdcbf74da932-d deleted file mode 100644 index 6506112..0000000 Binary files a/.cache/go-build/55/5507332a6594b851dbfbc2db2623d05b599ecb206839551ac05cfdcbf74da932-d and /dev/null differ diff --git a/.cache/go-build/55/553a18b22e6f09faf60a9c7001f237421a67d5b56dfe9e81055763f4e7aeeba0-a b/.cache/go-build/55/553a18b22e6f09faf60a9c7001f237421a67d5b56dfe9e81055763f4e7aeeba0-a deleted file mode 100644 index e176984..0000000 --- a/.cache/go-build/55/553a18b22e6f09faf60a9c7001f237421a67d5b56dfe9e81055763f4e7aeeba0-a +++ /dev/null @@ -1 +0,0 @@ -v1 553a18b22e6f09faf60a9c7001f237421a67d5b56dfe9e81055763f4e7aeeba0 ad38f6e2b28ea68354a7072d13501c3861b275a006433ac3ae5602997803feab 13 1775136287066454960 diff --git a/.cache/go-build/55/5542669663557eaa9883dad4fdd8d1946eb73838f2f19c047c4c7eb69513a5fb-a b/.cache/go-build/55/5542669663557eaa9883dad4fdd8d1946eb73838f2f19c047c4c7eb69513a5fb-a deleted file mode 100644 index 29c374a..0000000 --- a/.cache/go-build/55/5542669663557eaa9883dad4fdd8d1946eb73838f2f19c047c4c7eb69513a5fb-a +++ /dev/null @@ -1 +0,0 @@ -v1 5542669663557eaa9883dad4fdd8d1946eb73838f2f19c047c4c7eb69513a5fb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289487118031 diff --git a/.cache/go-build/55/5576b4f2528e164c267db10bbfc18202a2537037eefdde653349e4bd0a622e8d-a b/.cache/go-build/55/5576b4f2528e164c267db10bbfc18202a2537037eefdde653349e4bd0a622e8d-a deleted file mode 100644 index 6d24b9d..0000000 --- a/.cache/go-build/55/5576b4f2528e164c267db10bbfc18202a2537037eefdde653349e4bd0a622e8d-a +++ /dev/null @@ -1 +0,0 @@ -v1 5576b4f2528e164c267db10bbfc18202a2537037eefdde653349e4bd0a622e8d 1b2fe64a01aca322d2d527b969c00e02d40871c96c04ad0da24e094192b4b86d 258968 1775137721933720726 diff --git a/.cache/go-build/55/55b400cfb676a22d5edcc260560b372c7295568fb0abf5733a56fee857b9cdb9-a b/.cache/go-build/55/55b400cfb676a22d5edcc260560b372c7295568fb0abf5733a56fee857b9cdb9-a deleted file mode 100644 index 008ae66..0000000 --- a/.cache/go-build/55/55b400cfb676a22d5edcc260560b372c7295568fb0abf5733a56fee857b9cdb9-a +++ /dev/null @@ -1 +0,0 @@ -v1 55b400cfb676a22d5edcc260560b372c7295568fb0abf5733a56fee857b9cdb9 7855fb1eee635bbeee34f5f4f0cdbdf1347ef4f17dd0aff5957781035dfe299e 67726 1775136287105089477 diff --git a/.cache/go-build/55/55e37a86c8bff6af2092371e86ee3f24031cf42ffc7f8f1ab6f9c646248415e3-a b/.cache/go-build/55/55e37a86c8bff6af2092371e86ee3f24031cf42ffc7f8f1ab6f9c646248415e3-a deleted file mode 100644 index 01a2423..0000000 --- a/.cache/go-build/55/55e37a86c8bff6af2092371e86ee3f24031cf42ffc7f8f1ab6f9c646248415e3-a +++ /dev/null @@ -1 +0,0 @@ -v1 55e37a86c8bff6af2092371e86ee3f24031cf42ffc7f8f1ab6f9c646248415e3 39dfa1169466316ac57705cf203b5c9ea48ab0b04a6672cc516d6e943effe690 838202 1775136288920091266 diff --git a/.cache/go-build/55/55e50ba400c433f8aa298e488913ac22139e6324955e910ba29360efdee53347-a b/.cache/go-build/55/55e50ba400c433f8aa298e488913ac22139e6324955e910ba29360efdee53347-a deleted file mode 100644 index 059ac7c..0000000 --- a/.cache/go-build/55/55e50ba400c433f8aa298e488913ac22139e6324955e910ba29360efdee53347-a +++ /dev/null @@ -1 +0,0 @@ -v1 55e50ba400c433f8aa298e488913ac22139e6324955e910ba29360efdee53347 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721935456037 diff --git a/.cache/go-build/56/561ae74daef593dcd231fa3b52fe0ecbbc926a188986fa4b50940310f303e47b-a b/.cache/go-build/56/561ae74daef593dcd231fa3b52fe0ecbbc926a188986fa4b50940310f303e47b-a deleted file mode 100644 index 5b01949..0000000 --- a/.cache/go-build/56/561ae74daef593dcd231fa3b52fe0ecbbc926a188986fa4b50940310f303e47b-a +++ /dev/null @@ -1 +0,0 @@ -v1 561ae74daef593dcd231fa3b52fe0ecbbc926a188986fa4b50940310f303e47b e6832c62143e16a68667624a90d26dd170bccd7d00b08ed67e84cca298bdf1ed 10755 1775136286846166882 diff --git a/.cache/go-build/56/56256251b3ef6275504a2c55ff9be01e845eb6222f7e62a938077d33f2e33f8e-d b/.cache/go-build/56/56256251b3ef6275504a2c55ff9be01e845eb6222f7e62a938077d33f2e33f8e-d deleted file mode 100644 index e4673b9..0000000 Binary files a/.cache/go-build/56/56256251b3ef6275504a2c55ff9be01e845eb6222f7e62a938077d33f2e33f8e-d and /dev/null differ diff --git a/.cache/go-build/56/564aca7bd29d0f8d0a800bfb54410a306c1d2def96db6863cae13c7011dc366a-a b/.cache/go-build/56/564aca7bd29d0f8d0a800bfb54410a306c1d2def96db6863cae13c7011dc366a-a deleted file mode 100644 index 2531400..0000000 --- a/.cache/go-build/56/564aca7bd29d0f8d0a800bfb54410a306c1d2def96db6863cae13c7011dc366a-a +++ /dev/null @@ -1 +0,0 @@ -v1 564aca7bd29d0f8d0a800bfb54410a306c1d2def96db6863cae13c7011dc366a 8bb1d2921c77b0117ae1cae9ff8749958c6fc65959a5d73e52248e4bfbd73f54 943 1775136286919821335 diff --git a/.cache/go-build/56/5673782513dc090b5d53b5510a6fd00bfe833c6fdf369d1ee50a3eff1fcf4f9b-d b/.cache/go-build/56/5673782513dc090b5d53b5510a6fd00bfe833c6fdf369d1ee50a3eff1fcf4f9b-d deleted file mode 100644 index ad7a3b8..0000000 Binary files a/.cache/go-build/56/5673782513dc090b5d53b5510a6fd00bfe833c6fdf369d1ee50a3eff1fcf4f9b-d and /dev/null differ diff --git a/.cache/go-build/56/567d3bf7bcb30d5ac0cd4133d1a5f89eef94f91c4b208d1bbb2984b0b7b16d81-d b/.cache/go-build/56/567d3bf7bcb30d5ac0cd4133d1a5f89eef94f91c4b208d1bbb2984b0b7b16d81-d deleted file mode 100644 index f7179e1..0000000 Binary files a/.cache/go-build/56/567d3bf7bcb30d5ac0cd4133d1a5f89eef94f91c4b208d1bbb2984b0b7b16d81-d and /dev/null differ diff --git a/.cache/go-build/56/56995f9c740dc83b28ec992f2e0816149c996156faed15152fa291bc5439370c-d b/.cache/go-build/56/56995f9c740dc83b28ec992f2e0816149c996156faed15152fa291bc5439370c-d deleted file mode 100644 index 8a8d0a9..0000000 --- a/.cache/go-build/56/56995f9c740dc83b28ec992f2e0816149c996156faed15152fa291bc5439370c-d +++ /dev/null @@ -1,6 +0,0 @@ -./cpu.go -./cpu_x86.go -./cpu_x86_other.go -./datacache_x86.go -./cpu.s -./cpu_x86.s diff --git a/.cache/go-build/56/56cc252609e8d9b839a7a8f470a7449e3d33006af69014603c4c04de0e2aa34d-a b/.cache/go-build/56/56cc252609e8d9b839a7a8f470a7449e3d33006af69014603c4c04de0e2aa34d-a deleted file mode 100644 index c0deed6..0000000 --- a/.cache/go-build/56/56cc252609e8d9b839a7a8f470a7449e3d33006af69014603c4c04de0e2aa34d-a +++ /dev/null @@ -1 +0,0 @@ -v1 56cc252609e8d9b839a7a8f470a7449e3d33006af69014603c4c04de0e2aa34d f502da81ad708823cb5ea6c61b7f07f3b49cd9d264dff170551d11c9c7f2f4bb 21 1775136286919789015 diff --git a/.cache/go-build/56/56e6a51653f2207ae2de540b8e72e47073c38247374fce78f7bc8be3f1f1b706-d b/.cache/go-build/56/56e6a51653f2207ae2de540b8e72e47073c38247374fce78f7bc8be3f1f1b706-d deleted file mode 100644 index 11407c9..0000000 Binary files a/.cache/go-build/56/56e6a51653f2207ae2de540b8e72e47073c38247374fce78f7bc8be3f1f1b706-d and /dev/null differ diff --git a/.cache/go-build/57/570b02095f43fd8d2355d0cd8dcba7b97a56030361722232f89a1fa7f0a3f383-a b/.cache/go-build/57/570b02095f43fd8d2355d0cd8dcba7b97a56030361722232f89a1fa7f0a3f383-a deleted file mode 100644 index fd3adac..0000000 --- a/.cache/go-build/57/570b02095f43fd8d2355d0cd8dcba7b97a56030361722232f89a1fa7f0a3f383-a +++ /dev/null @@ -1 +0,0 @@ -v1 570b02095f43fd8d2355d0cd8dcba7b97a56030361722232f89a1fa7f0a3f383 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287065628469 diff --git a/.cache/go-build/57/57234ac536d0b8fe81eee88800848041280c61e7bc95989d6094d20f4b79293f-a b/.cache/go-build/57/57234ac536d0b8fe81eee88800848041280c61e7bc95989d6094d20f4b79293f-a deleted file mode 100644 index 221a3e4..0000000 --- a/.cache/go-build/57/57234ac536d0b8fe81eee88800848041280c61e7bc95989d6094d20f4b79293f-a +++ /dev/null @@ -1 +0,0 @@ -v1 57234ac536d0b8fe81eee88800848041280c61e7bc95989d6094d20f4b79293f d3f21047470b949bde25adaa11dec4f8bb3dad35cf0efe10be000340862891cb 93 1775136289422162015 diff --git a/.cache/go-build/57/57624e23bcdf1c3192203e8e6b34631b40d7c5ec3b7fedc5a3e7b391fe30aeda-a b/.cache/go-build/57/57624e23bcdf1c3192203e8e6b34631b40d7c5ec3b7fedc5a3e7b391fe30aeda-a deleted file mode 100644 index b5e2ea2..0000000 --- a/.cache/go-build/57/57624e23bcdf1c3192203e8e6b34631b40d7c5ec3b7fedc5a3e7b391fe30aeda-a +++ /dev/null @@ -1 +0,0 @@ -v1 57624e23bcdf1c3192203e8e6b34631b40d7c5ec3b7fedc5a3e7b391fe30aeda e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287031463935 diff --git a/.cache/go-build/57/576cd7839cd5d882d756c59571eb49680c709bdbd08efed0fd8cfa380cccd4c2-a b/.cache/go-build/57/576cd7839cd5d882d756c59571eb49680c709bdbd08efed0fd8cfa380cccd4c2-a deleted file mode 100644 index ccddf70..0000000 --- a/.cache/go-build/57/576cd7839cd5d882d756c59571eb49680c709bdbd08efed0fd8cfa380cccd4c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 576cd7839cd5d882d756c59571eb49680c709bdbd08efed0fd8cfa380cccd4c2 90541d1b02e6821db9ad9e6b3a1696bead823afd6400ab95872f9be8e2bb08b2 488178 1775136287139836572 diff --git a/.cache/go-build/57/577a17bff123b9997b00457bb0b05c5398f0f1d25013b8631bc254f45b68c7d4-a b/.cache/go-build/57/577a17bff123b9997b00457bb0b05c5398f0f1d25013b8631bc254f45b68c7d4-a deleted file mode 100644 index 3747973..0000000 --- a/.cache/go-build/57/577a17bff123b9997b00457bb0b05c5398f0f1d25013b8631bc254f45b68c7d4-a +++ /dev/null @@ -1 +0,0 @@ -v1 577a17bff123b9997b00457bb0b05c5398f0f1d25013b8631bc254f45b68c7d4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721906394037 diff --git a/.cache/go-build/57/577b3de719784dfc2adf0087db1063396acbd092a0a5dd1616f25d10ae7c236b-a b/.cache/go-build/57/577b3de719784dfc2adf0087db1063396acbd092a0a5dd1616f25d10ae7c236b-a deleted file mode 100644 index e9f0da7..0000000 --- a/.cache/go-build/57/577b3de719784dfc2adf0087db1063396acbd092a0a5dd1616f25d10ae7c236b-a +++ /dev/null @@ -1 +0,0 @@ -v1 577b3de719784dfc2adf0087db1063396acbd092a0a5dd1616f25d10ae7c236b 5470d96a14d4156dab5fc11f2d22ab1c7d754afc82c96a00ac649c823a1dca26 60 1775136287116026315 diff --git a/.cache/go-build/57/57a5ba412e08f1a12ebd2f8047f24979d6bd71023b7aa9a8c669bb8931b35983-a b/.cache/go-build/57/57a5ba412e08f1a12ebd2f8047f24979d6bd71023b7aa9a8c669bb8931b35983-a deleted file mode 100644 index f54f701..0000000 --- a/.cache/go-build/57/57a5ba412e08f1a12ebd2f8047f24979d6bd71023b7aa9a8c669bb8931b35983-a +++ /dev/null @@ -1 +0,0 @@ -v1 57a5ba412e08f1a12ebd2f8047f24979d6bd71023b7aa9a8c669bb8931b35983 00ba9d1b93a3abe02a94ab05456d3e75deb0cf54bc6e14e0f1df552430322fac 1812138 1775136288827684880 diff --git a/.cache/go-build/57/57b45529e80fa32d65c22fbfe379c215955b62032cadcafec20d8e6a85c22e7d-a b/.cache/go-build/57/57b45529e80fa32d65c22fbfe379c215955b62032cadcafec20d8e6a85c22e7d-a deleted file mode 100644 index bf8b725..0000000 --- a/.cache/go-build/57/57b45529e80fa32d65c22fbfe379c215955b62032cadcafec20d8e6a85c22e7d-a +++ /dev/null @@ -1 +0,0 @@ -v1 57b45529e80fa32d65c22fbfe379c215955b62032cadcafec20d8e6a85c22e7d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722141869835 diff --git a/.cache/go-build/57/57da820e94480e7f9a0348ceecb8947c26e1d30021ad8c1d7658cf10f8ce9c17-a b/.cache/go-build/57/57da820e94480e7f9a0348ceecb8947c26e1d30021ad8c1d7658cf10f8ce9c17-a deleted file mode 100644 index 034c86a..0000000 --- a/.cache/go-build/57/57da820e94480e7f9a0348ceecb8947c26e1d30021ad8c1d7658cf10f8ce9c17-a +++ /dev/null @@ -1 +0,0 @@ -v1 57da820e94480e7f9a0348ceecb8947c26e1d30021ad8c1d7658cf10f8ce9c17 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288785099079 diff --git a/.cache/go-build/57/57e07397aacc0d2fffb1c16e1a2bc5a744856e728557a204fa17b740b94b80aa-a b/.cache/go-build/57/57e07397aacc0d2fffb1c16e1a2bc5a744856e728557a204fa17b740b94b80aa-a deleted file mode 100644 index cf6653a..0000000 --- a/.cache/go-build/57/57e07397aacc0d2fffb1c16e1a2bc5a744856e728557a204fa17b740b94b80aa-a +++ /dev/null @@ -1 +0,0 @@ -v1 57e07397aacc0d2fffb1c16e1a2bc5a744856e728557a204fa17b740b94b80aa e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287046306675 diff --git a/.cache/go-build/57/57ec34987d4619a1b4eb939a59a06776e68171225f452d08df99dad2dda04f8d-a b/.cache/go-build/57/57ec34987d4619a1b4eb939a59a06776e68171225f452d08df99dad2dda04f8d-a deleted file mode 100644 index 6ddca48..0000000 --- a/.cache/go-build/57/57ec34987d4619a1b4eb939a59a06776e68171225f452d08df99dad2dda04f8d-a +++ /dev/null @@ -1 +0,0 @@ -v1 57ec34987d4619a1b4eb939a59a06776e68171225f452d08df99dad2dda04f8d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722082404043 diff --git a/.cache/go-build/58/580cb314e7e2076a49366679efae2c5b16914fa51623132290b1e004ceb34915-a b/.cache/go-build/58/580cb314e7e2076a49366679efae2c5b16914fa51623132290b1e004ceb34915-a deleted file mode 100644 index 037c181..0000000 --- a/.cache/go-build/58/580cb314e7e2076a49366679efae2c5b16914fa51623132290b1e004ceb34915-a +++ /dev/null @@ -1 +0,0 @@ -v1 580cb314e7e2076a49366679efae2c5b16914fa51623132290b1e004ceb34915 05f5e6492430b00f807e4629c6e4a53f3948fc9382f19898d1cc361b3b99ff9b 54 1775136289309726764 diff --git a/.cache/go-build/58/581a35d2b8d932f8fcea8e975e7186d380bdb855dcb3793fa7ba1a8580f76870-a b/.cache/go-build/58/581a35d2b8d932f8fcea8e975e7186d380bdb855dcb3793fa7ba1a8580f76870-a deleted file mode 100644 index 7d0487a..0000000 --- a/.cache/go-build/58/581a35d2b8d932f8fcea8e975e7186d380bdb855dcb3793fa7ba1a8580f76870-a +++ /dev/null @@ -1 +0,0 @@ -v1 581a35d2b8d932f8fcea8e975e7186d380bdb855dcb3793fa7ba1a8580f76870 6108a65a8a22a4978cd3c1f7d61f73a2944db05d66c5410e550498023ca203fd 21 1775136288762369703 diff --git a/.cache/go-build/58/5828ac7244bd16806048ba6efde4d9491f7cdcb9c0136c8a4f769b1fd62f2388-d b/.cache/go-build/58/5828ac7244bd16806048ba6efde4d9491f7cdcb9c0136c8a4f769b1fd62f2388-d deleted file mode 100644 index 9bff0cd..0000000 --- a/.cache/go-build/58/5828ac7244bd16806048ba6efde4d9491f7cdcb9c0136c8a4f769b1fd62f2388-d +++ /dev/null @@ -1,25 +0,0 @@ -./at.go -./at_fstatat.go -./at_sysnum_linux.go -./at_sysnum_newfstatat_linux.go -./constants.go -./copy_file_range_unix.go -./eaccess.go -./faccessat_syscall.go -./fcntl_unix.go -./getrandom.go -./getrandom_linux.go -./kernel_version_ge.go -./kernel_version_linux.go -./net.go -./nofollow_posix.go -./nonblocking_unix.go -./pidfd_linux.go -./renameat_sysnum_linux.go -./siginfo_linux.go -./siginfo_linux_other.go -./syscall.go -./sysnum_linux_amd64.go -./tcsetpgrp_linux.go -./utimes.go -./waitid_linux.go diff --git a/.cache/go-build/58/5833db740722ff43eba89cb0b98d7dfa5a6026752924c671d410ee1d85abe5ff-a b/.cache/go-build/58/5833db740722ff43eba89cb0b98d7dfa5a6026752924c671d410ee1d85abe5ff-a deleted file mode 100644 index 6b03676..0000000 --- a/.cache/go-build/58/5833db740722ff43eba89cb0b98d7dfa5a6026752924c671d410ee1d85abe5ff-a +++ /dev/null @@ -1 +0,0 @@ -v1 5833db740722ff43eba89cb0b98d7dfa5a6026752924c671d410ee1d85abe5ff 16654fe8a566f83a166366486e0f25e70d4d5a06ea79e558868479d28ea1f055 68 1775136288413848874 diff --git a/.cache/go-build/58/58af61de9be186c4ca35eb33926f747d2d8b69744bf4b33c85cb0985226662a3-d/debugcompare b/.cache/go-build/58/58af61de9be186c4ca35eb33926f747d2d8b69744bf4b33c85cb0985226662a3-d/debugcompare deleted file mode 100755 index 38d930f..0000000 Binary files a/.cache/go-build/58/58af61de9be186c4ca35eb33926f747d2d8b69744bf4b33c85cb0985226662a3-d/debugcompare and /dev/null differ diff --git a/.cache/go-build/58/58ba4841982a610e82263765dc7d78f5675f568a65bc52df8275282000b531b7-d b/.cache/go-build/58/58ba4841982a610e82263765dc7d78f5675f568a65bc52df8275282000b531b7-d deleted file mode 100644 index 25713a6..0000000 --- a/.cache/go-build/58/58ba4841982a610e82263765dc7d78f5675f568a65bc52df8275282000b531b7-d +++ /dev/null @@ -1,12 +0,0 @@ -./abi.go -./badlinkname.go -./deepequal.go -./float32reg_generic.go -./iter.go -./makefunc.go -./map.go -./swapper.go -./type.go -./value.go -./visiblefields.go -./asm_amd64.s diff --git a/.cache/go-build/59/591b1a3405325339fa136dbf78d3831e18662b00d7f0cbb086f96fcb61c2bf61-a b/.cache/go-build/59/591b1a3405325339fa136dbf78d3831e18662b00d7f0cbb086f96fcb61c2bf61-a deleted file mode 100644 index 70ccc06..0000000 --- a/.cache/go-build/59/591b1a3405325339fa136dbf78d3831e18662b00d7f0cbb086f96fcb61c2bf61-a +++ /dev/null @@ -1 +0,0 @@ -v1 591b1a3405325339fa136dbf78d3831e18662b00d7f0cbb086f96fcb61c2bf61 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775136289820468150 diff --git a/.cache/go-build/59/5944bd5198a3ff89aead25daf451d5b9a18fe00c96578d1bb06dd47496de481b-a b/.cache/go-build/59/5944bd5198a3ff89aead25daf451d5b9a18fe00c96578d1bb06dd47496de481b-a deleted file mode 100644 index bcb673d..0000000 --- a/.cache/go-build/59/5944bd5198a3ff89aead25daf451d5b9a18fe00c96578d1bb06dd47496de481b-a +++ /dev/null @@ -1 +0,0 @@ -v1 5944bd5198a3ff89aead25daf451d5b9a18fe00c96578d1bb06dd47496de481b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287035363808 diff --git a/.cache/go-build/59/59eab6bcf6268b724a0650ea96be415194cfa0016c4bd796d5ba360e3173531c-d b/.cache/go-build/59/59eab6bcf6268b724a0650ea96be415194cfa0016c4bd796d5ba360e3173531c-d deleted file mode 100644 index 3642ebe..0000000 Binary files a/.cache/go-build/59/59eab6bcf6268b724a0650ea96be415194cfa0016c4bd796d5ba360e3173531c-d and /dev/null differ diff --git a/.cache/go-build/5a/5a51d52f0d115d4f889fd1abc43fe2df8eb1387d971cb7cc390a97f300048da7-a b/.cache/go-build/5a/5a51d52f0d115d4f889fd1abc43fe2df8eb1387d971cb7cc390a97f300048da7-a deleted file mode 100644 index f1eea04..0000000 --- a/.cache/go-build/5a/5a51d52f0d115d4f889fd1abc43fe2df8eb1387d971cb7cc390a97f300048da7-a +++ /dev/null @@ -1 +0,0 @@ -v1 5a51d52f0d115d4f889fd1abc43fe2df8eb1387d971cb7cc390a97f300048da7 96a2fc230afe948f2d45aba4c86d68c40ec47fd342cb60ac1151437f1713c50e 213 1775136286909935508 diff --git a/.cache/go-build/5a/5a8d6343b94e0348c01c5f61150550402d109f5640c87dbdac9e93ce40a43e71-a b/.cache/go-build/5a/5a8d6343b94e0348c01c5f61150550402d109f5640c87dbdac9e93ce40a43e71-a deleted file mode 100644 index 574b457..0000000 --- a/.cache/go-build/5a/5a8d6343b94e0348c01c5f61150550402d109f5640c87dbdac9e93ce40a43e71-a +++ /dev/null @@ -1 +0,0 @@ -v1 5a8d6343b94e0348c01c5f61150550402d109f5640c87dbdac9e93ce40a43e71 3df925500977a31c0261826c9e3938e5ba75c734aeb32ab83cee28747ef60e45 2829 1775136286831815862 diff --git a/.cache/go-build/5b/5b0953aa5f1df6d4a604a01b8323bc0fd2a49476328fcf3b84f83a8a5d9531ba-a b/.cache/go-build/5b/5b0953aa5f1df6d4a604a01b8323bc0fd2a49476328fcf3b84f83a8a5d9531ba-a deleted file mode 100644 index dcd7eea..0000000 --- a/.cache/go-build/5b/5b0953aa5f1df6d4a604a01b8323bc0fd2a49476328fcf3b84f83a8a5d9531ba-a +++ /dev/null @@ -1 +0,0 @@ -v1 5b0953aa5f1df6d4a604a01b8323bc0fd2a49476328fcf3b84f83a8a5d9531ba e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289845133487 diff --git a/.cache/go-build/5b/5b5d17446d3c88d2626d4cf146a2ef5ee0901326cef51ee486a4d743d7c37a55-d b/.cache/go-build/5b/5b5d17446d3c88d2626d4cf146a2ef5ee0901326cef51ee486a4d743d7c37a55-d deleted file mode 100644 index f6815d3..0000000 Binary files a/.cache/go-build/5b/5b5d17446d3c88d2626d4cf146a2ef5ee0901326cef51ee486a4d743d7c37a55-d and /dev/null differ diff --git a/.cache/go-build/5b/5b66f17a0c567d8caec739f0b7f6b0a5d516f0580ecaede7993f14f0ac57fd0a-a b/.cache/go-build/5b/5b66f17a0c567d8caec739f0b7f6b0a5d516f0580ecaede7993f14f0ac57fd0a-a deleted file mode 100644 index 076c12c..0000000 --- a/.cache/go-build/5b/5b66f17a0c567d8caec739f0b7f6b0a5d516f0580ecaede7993f14f0ac57fd0a-a +++ /dev/null @@ -1 +0,0 @@ -v1 5b66f17a0c567d8caec739f0b7f6b0a5d516f0580ecaede7993f14f0ac57fd0a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288980216039 diff --git a/.cache/go-build/5b/5b69f9fe4639c2fe1c98c353de6ac0a337f24d30ca672e2dbb42c1e3492fd067-a b/.cache/go-build/5b/5b69f9fe4639c2fe1c98c353de6ac0a337f24d30ca672e2dbb42c1e3492fd067-a deleted file mode 100644 index 19e3d7e..0000000 --- a/.cache/go-build/5b/5b69f9fe4639c2fe1c98c353de6ac0a337f24d30ca672e2dbb42c1e3492fd067-a +++ /dev/null @@ -1 +0,0 @@ -v1 5b69f9fe4639c2fe1c98c353de6ac0a337f24d30ca672e2dbb42c1e3492fd067 7aeec01c48529a7fac39c309cb024984fbe3d9bf556f6ba0d6f66e890c941f50 2466 1775136286943661382 diff --git a/.cache/go-build/5c/5c328a48be06bc31b30619a81537ed0147606108672cda040cd568cb5b695d63-a b/.cache/go-build/5c/5c328a48be06bc31b30619a81537ed0147606108672cda040cd568cb5b695d63-a deleted file mode 100644 index 37f064d..0000000 --- a/.cache/go-build/5c/5c328a48be06bc31b30619a81537ed0147606108672cda040cd568cb5b695d63-a +++ /dev/null @@ -1 +0,0 @@ -v1 5c328a48be06bc31b30619a81537ed0147606108672cda040cd568cb5b695d63 d78ab6dd1d929f5d28a5fd753e5f37176695bd424d5fbdb169334657c8fde789 122 1775136287152833352 diff --git a/.cache/go-build/5c/5c69486cc122dc547e55feed0a06ed91655af40f6e92a6029669f9c147dc33fb-d b/.cache/go-build/5c/5c69486cc122dc547e55feed0a06ed91655af40f6e92a6029669f9c147dc33fb-d deleted file mode 100644 index e7e29f2..0000000 Binary files a/.cache/go-build/5c/5c69486cc122dc547e55feed0a06ed91655af40f6e92a6029669f9c147dc33fb-d and /dev/null differ diff --git a/.cache/go-build/5c/5c7f7c02e3e0061017de9e80d360b6e4b4380106414fa1ba9b632aeb48b41e14-d b/.cache/go-build/5c/5c7f7c02e3e0061017de9e80d360b6e4b4380106414fa1ba9b632aeb48b41e14-d deleted file mode 100644 index cb0f8d9..0000000 Binary files a/.cache/go-build/5c/5c7f7c02e3e0061017de9e80d360b6e4b4380106414fa1ba9b632aeb48b41e14-d and /dev/null differ diff --git a/.cache/go-build/5c/5cc9550e9a18b32da4dbca7372b6b0831def9b656e2242c2a669fc3205b5cdc6-a b/.cache/go-build/5c/5cc9550e9a18b32da4dbca7372b6b0831def9b656e2242c2a669fc3205b5cdc6-a deleted file mode 100644 index 3fced18..0000000 --- a/.cache/go-build/5c/5cc9550e9a18b32da4dbca7372b6b0831def9b656e2242c2a669fc3205b5cdc6-a +++ /dev/null @@ -1 +0,0 @@ -v1 5cc9550e9a18b32da4dbca7372b6b0831def9b656e2242c2a669fc3205b5cdc6 fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775136289951903784 diff --git a/.cache/go-build/5c/5ce45ea009363d791f725344bce44f86ec3a7339c41594c1955098e9a2339e2d-a b/.cache/go-build/5c/5ce45ea009363d791f725344bce44f86ec3a7339c41594c1955098e9a2339e2d-a deleted file mode 100644 index f03b7ca..0000000 --- a/.cache/go-build/5c/5ce45ea009363d791f725344bce44f86ec3a7339c41594c1955098e9a2339e2d-a +++ /dev/null @@ -1 +0,0 @@ -v1 5ce45ea009363d791f725344bce44f86ec3a7339c41594c1955098e9a2339e2d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287064311318 diff --git a/.cache/go-build/5d/5d11cc219a9ecc4e58fdec70b24395e311d1b1c7c1e7e0c806e67b018d9139f8-a b/.cache/go-build/5d/5d11cc219a9ecc4e58fdec70b24395e311d1b1c7c1e7e0c806e67b018d9139f8-a deleted file mode 100644 index 49c2890..0000000 --- a/.cache/go-build/5d/5d11cc219a9ecc4e58fdec70b24395e311d1b1c7c1e7e0c806e67b018d9139f8-a +++ /dev/null @@ -1 +0,0 @@ -v1 5d11cc219a9ecc4e58fdec70b24395e311d1b1c7c1e7e0c806e67b018d9139f8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398518812292 diff --git a/.cache/go-build/5d/5d3dcf0f2646a9a5b3ad72259f84ded84fec212d7d1425b31cece264242ad4ac-a b/.cache/go-build/5d/5d3dcf0f2646a9a5b3ad72259f84ded84fec212d7d1425b31cece264242ad4ac-a deleted file mode 100644 index 59bfa17..0000000 --- a/.cache/go-build/5d/5d3dcf0f2646a9a5b3ad72259f84ded84fec212d7d1425b31cece264242ad4ac-a +++ /dev/null @@ -1 +0,0 @@ -v1 5d3dcf0f2646a9a5b3ad72259f84ded84fec212d7d1425b31cece264242ad4ac b9f22cc075d99e31315a2499701dbc45a72eeee8cfe219b59a845178a03a1ef2 528 1775136286921915556 diff --git a/.cache/go-build/5d/5d502a0aeae97c72ff2a281d1d42ae6ed2b94034e58baf147f66f629fb6d90bc-d b/.cache/go-build/5d/5d502a0aeae97c72ff2a281d1d42ae6ed2b94034e58baf147f66f629fb6d90bc-d deleted file mode 100644 index 1726659..0000000 Binary files a/.cache/go-build/5d/5d502a0aeae97c72ff2a281d1d42ae6ed2b94034e58baf147f66f629fb6d90bc-d and /dev/null differ diff --git a/.cache/go-build/5d/5d7165ff73788239de6008c19df500b1217ba840ba1f1aadd286ad2a46f20984-a b/.cache/go-build/5d/5d7165ff73788239de6008c19df500b1217ba840ba1f1aadd286ad2a46f20984-a deleted file mode 100644 index 2d8d76c..0000000 --- a/.cache/go-build/5d/5d7165ff73788239de6008c19df500b1217ba840ba1f1aadd286ad2a46f20984-a +++ /dev/null @@ -1 +0,0 @@ -v1 5d7165ff73788239de6008c19df500b1217ba840ba1f1aadd286ad2a46f20984 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136290018804552 diff --git a/.cache/go-build/5d/5ddafd1ccb39e7ea27c0b9ae069b64cb8e91164371fcc9c5c52fb1784b5b3136-d b/.cache/go-build/5d/5ddafd1ccb39e7ea27c0b9ae069b64cb8e91164371fcc9c5c52fb1784b5b3136-d deleted file mode 100644 index 4f269ed..0000000 Binary files a/.cache/go-build/5d/5ddafd1ccb39e7ea27c0b9ae069b64cb8e91164371fcc9c5c52fb1784b5b3136-d and /dev/null differ diff --git a/.cache/go-build/5e/5e1e7c4bb256ad421cd369951136f3629c2b4731901367734c02b324b570948b-d b/.cache/go-build/5e/5e1e7c4bb256ad421cd369951136f3629c2b4731901367734c02b324b570948b-d deleted file mode 100644 index ce4ef85..0000000 --- a/.cache/go-build/5e/5e1e7c4bb256ad421cd369951136f3629c2b4731901367734c02b324b570948b-d +++ /dev/null @@ -1,58 +0,0 @@ -./abs.go -./acosh.go -./asin.go -./asinh.go -./atan.go -./atan2.go -./atanh.go -./bits.go -./cbrt.go -./const.go -./copysign.go -./dim.go -./dim_asm.go -./erf.go -./erfinv.go -./exp.go -./exp2_noasm.go -./exp_amd64.go -./exp_asm.go -./expm1.go -./floor.go -./floor_asm.go -./fma.go -./frexp.go -./gamma.go -./hypot.go -./hypot_asm.go -./j0.go -./j1.go -./jn.go -./ldexp.go -./lgamma.go -./log.go -./log10.go -./log1p.go -./log_asm.go -./logb.go -./mod.go -./modf.go -./nextafter.go -./pow.go -./pow10.go -./remainder.go -./signbit.go -./sin.go -./sincos.go -./sinh.go -./sqrt.go -./stubs.go -./tan.go -./tanh.go -./trig_reduce.go -./unsafe.go -./dim_amd64.s -./exp_amd64.s -./floor_amd64.s -./hypot_amd64.s -./log_amd64.s diff --git a/.cache/go-build/5e/5e1ee8d470215110711ad5f8944a37f1790de9b084d480e2bda4dbb6f00285d0-a b/.cache/go-build/5e/5e1ee8d470215110711ad5f8944a37f1790de9b084d480e2bda4dbb6f00285d0-a deleted file mode 100644 index 2f3bf5a..0000000 --- a/.cache/go-build/5e/5e1ee8d470215110711ad5f8944a37f1790de9b084d480e2bda4dbb6f00285d0-a +++ /dev/null @@ -1 +0,0 @@ -v1 5e1ee8d470215110711ad5f8944a37f1790de9b084d480e2bda4dbb6f00285d0 de26119803f18fe3796c51cdbee3890acf71fe86813733eb4611a4690d7d5573 2176 1775136286922385457 diff --git a/.cache/go-build/5e/5e982ff5b537e062623e683b987f3376fec6cc74f655344e4288ecddcb3d40bc-a b/.cache/go-build/5e/5e982ff5b537e062623e683b987f3376fec6cc74f655344e4288ecddcb3d40bc-a deleted file mode 100644 index 315a1b6..0000000 --- a/.cache/go-build/5e/5e982ff5b537e062623e683b987f3376fec6cc74f655344e4288ecddcb3d40bc-a +++ /dev/null @@ -1 +0,0 @@ -v1 5e982ff5b537e062623e683b987f3376fec6cc74f655344e4288ecddcb3d40bc 279633ee051ccfda9b584834b083f68038f7cbccec9c897e1812f4544379a540 2871 1775136286820174414 diff --git a/.cache/go-build/5e/5e9dbec244b7a9aeb491ed0090fea39113832d0689f09c98d35041747aca48dc-a b/.cache/go-build/5e/5e9dbec244b7a9aeb491ed0090fea39113832d0689f09c98d35041747aca48dc-a deleted file mode 100644 index c0c62d5..0000000 --- a/.cache/go-build/5e/5e9dbec244b7a9aeb491ed0090fea39113832d0689f09c98d35041747aca48dc-a +++ /dev/null @@ -1 +0,0 @@ -v1 5e9dbec244b7a9aeb491ed0090fea39113832d0689f09c98d35041747aca48dc 22e9c935db51d7211f3ae6845f212d1a3a3ed7cc665a333e6313885584b1b5dd 42 1775136288435326599 diff --git a/.cache/go-build/5e/5edba0df91400859e4d1ec42c9996ad452c61324057ace2124bf17c51c451ae6-a b/.cache/go-build/5e/5edba0df91400859e4d1ec42c9996ad452c61324057ace2124bf17c51c451ae6-a deleted file mode 100644 index 56a88e9..0000000 --- a/.cache/go-build/5e/5edba0df91400859e4d1ec42c9996ad452c61324057ace2124bf17c51c451ae6-a +++ /dev/null @@ -1 +0,0 @@ -v1 5edba0df91400859e4d1ec42c9996ad452c61324057ace2124bf17c51c451ae6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287049336138 diff --git a/.cache/go-build/5e/5ef862ab1c4857ab2e806e49c98e336c5d001ccb1fabad17663af3b89c775864-a b/.cache/go-build/5e/5ef862ab1c4857ab2e806e49c98e336c5d001ccb1fabad17663af3b89c775864-a deleted file mode 100644 index d597fa7..0000000 --- a/.cache/go-build/5e/5ef862ab1c4857ab2e806e49c98e336c5d001ccb1fabad17663af3b89c775864-a +++ /dev/null @@ -1 +0,0 @@ -v1 5ef862ab1c4857ab2e806e49c98e336c5d001ccb1fabad17663af3b89c775864 df4619ffa56a00831cc6272f42c3d20d4c30d952cb98997351d427545ea48efc 634 1775136286916094702 diff --git a/.cache/go-build/5f/5f008b5886c07568b275c4b921497db19ce7e4490a4e47b15855e294a2cf86c6-a b/.cache/go-build/5f/5f008b5886c07568b275c4b921497db19ce7e4490a4e47b15855e294a2cf86c6-a deleted file mode 100644 index b2a24ae..0000000 --- a/.cache/go-build/5f/5f008b5886c07568b275c4b921497db19ce7e4490a4e47b15855e294a2cf86c6-a +++ /dev/null @@ -1 +0,0 @@ -v1 5f008b5886c07568b275c4b921497db19ce7e4490a4e47b15855e294a2cf86c6 44bcc6612f1c9eeaeba5f0ec62db0048d08753badb92c1a98ac141f7c1d96321 10428 1775136286935108466 diff --git a/.cache/go-build/5f/5f2ece2cc0e0805600d133358b4a5764b1998fe1e7d28c97a2766c8f612d22c2-a b/.cache/go-build/5f/5f2ece2cc0e0805600d133358b4a5764b1998fe1e7d28c97a2766c8f612d22c2-a deleted file mode 100644 index 6ec1d5a..0000000 --- a/.cache/go-build/5f/5f2ece2cc0e0805600d133358b4a5764b1998fe1e7d28c97a2766c8f612d22c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 5f2ece2cc0e0805600d133358b4a5764b1998fe1e7d28c97a2766c8f612d22c2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287141806314 diff --git a/.cache/go-build/5f/5f306e5e16c33c1cdc255c77fb11b5a404113c924aef0d51903240f98d425b38-a b/.cache/go-build/5f/5f306e5e16c33c1cdc255c77fb11b5a404113c924aef0d51903240f98d425b38-a deleted file mode 100644 index 213c77b..0000000 --- a/.cache/go-build/5f/5f306e5e16c33c1cdc255c77fb11b5a404113c924aef0d51903240f98d425b38-a +++ /dev/null @@ -1 +0,0 @@ -v1 5f306e5e16c33c1cdc255c77fb11b5a404113c924aef0d51903240f98d425b38 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286997909141 diff --git a/.cache/go-build/5f/5f3d3fce1d3f6942d2681df60cfa9ec35e9a6cab842fd964ba3e1117845dc7ef-a b/.cache/go-build/5f/5f3d3fce1d3f6942d2681df60cfa9ec35e9a6cab842fd964ba3e1117845dc7ef-a deleted file mode 100644 index 8332d45..0000000 --- a/.cache/go-build/5f/5f3d3fce1d3f6942d2681df60cfa9ec35e9a6cab842fd964ba3e1117845dc7ef-a +++ /dev/null @@ -1 +0,0 @@ -v1 5f3d3fce1d3f6942d2681df60cfa9ec35e9a6cab842fd964ba3e1117845dc7ef 3d65512eae049a5bde62b99a9acd6b889bb08ec97be37f1dad2aba11b0ea9eea 30 1775136289309465004 diff --git a/.cache/go-build/5f/5f92fe075de9e839c9b482ad657215aad6326aef26a8493bee8dc9d9539ef8f1-d b/.cache/go-build/5f/5f92fe075de9e839c9b482ad657215aad6326aef26a8493bee8dc9d9539ef8f1-d deleted file mode 100644 index 2c77a35..0000000 --- a/.cache/go-build/5f/5f92fe075de9e839c9b482ad657215aad6326aef26a8493bee8dc9d9539ef8f1-d +++ /dev/null @@ -1,5 +0,0 @@ -./doc.go -./doc_64.go -./type.go -./value.go -./asm.s diff --git a/.cache/go-build/5f/5fb3d617b9840e3f7959289a631637779a79819a50f492581e26255731e8fa6e-a b/.cache/go-build/5f/5fb3d617b9840e3f7959289a631637779a79819a50f492581e26255731e8fa6e-a deleted file mode 100644 index 7f731a8..0000000 --- a/.cache/go-build/5f/5fb3d617b9840e3f7959289a631637779a79819a50f492581e26255731e8fa6e-a +++ /dev/null @@ -1 +0,0 @@ -v1 5fb3d617b9840e3f7959289a631637779a79819a50f492581e26255731e8fa6e 8e448f2c6906d0bd76f37a080ef301d2fa17a6c846f6ac1804c7ddb07f890b6d 1602 1775136286827187899 diff --git a/.cache/go-build/5f/5fd286df5f20290cb5ab6b7408620b6e8a8983b5863760cc908e478c2c93a04c-a b/.cache/go-build/5f/5fd286df5f20290cb5ab6b7408620b6e8a8983b5863760cc908e478c2c93a04c-a deleted file mode 100644 index ff64fb4..0000000 --- a/.cache/go-build/5f/5fd286df5f20290cb5ab6b7408620b6e8a8983b5863760cc908e478c2c93a04c-a +++ /dev/null @@ -1 +0,0 @@ -v1 5fd286df5f20290cb5ab6b7408620b6e8a8983b5863760cc908e478c2c93a04c 87136ed08f4a99cff0514f706a66fdd9995e654ea8b34b90e422986f9943bc62 1240436 1775136289163637730 diff --git a/.cache/go-build/5f/5fe15e6210fd735feaf32d9f32fd7b6b5e27e4d8e8fb386efc41dc058860c305-a b/.cache/go-build/5f/5fe15e6210fd735feaf32d9f32fd7b6b5e27e4d8e8fb386efc41dc058860c305-a deleted file mode 100644 index d8f1411..0000000 --- a/.cache/go-build/5f/5fe15e6210fd735feaf32d9f32fd7b6b5e27e4d8e8fb386efc41dc058860c305-a +++ /dev/null @@ -1 +0,0 @@ -v1 5fe15e6210fd735feaf32d9f32fd7b6b5e27e4d8e8fb386efc41dc058860c305 783a2aaa6c00baf62fe876c24f82e4e464827b0fda6601580699d0392194df8c 1208036 1775136289840724184 diff --git a/.cache/go-build/5f/5ff171d367e17b0bbf2e474b2eb0c0de5583349cd47c1f31eb9ffe9e0cf1b04c-a b/.cache/go-build/5f/5ff171d367e17b0bbf2e474b2eb0c0de5583349cd47c1f31eb9ffe9e0cf1b04c-a deleted file mode 100644 index 17610f7..0000000 --- a/.cache/go-build/5f/5ff171d367e17b0bbf2e474b2eb0c0de5583349cd47c1f31eb9ffe9e0cf1b04c-a +++ /dev/null @@ -1 +0,0 @@ -v1 5ff171d367e17b0bbf2e474b2eb0c0de5583349cd47c1f31eb9ffe9e0cf1b04c 494ff78d7154d89969a617cfda5b0303272b8f5e9b559c75d959109f20563d51 3630672 1775136289029802984 diff --git a/.cache/go-build/60/600e3db6039a81283064b696b6bda13e55178064c8ec9a331bff43363049ddeb-a b/.cache/go-build/60/600e3db6039a81283064b696b6bda13e55178064c8ec9a331bff43363049ddeb-a deleted file mode 100644 index 72f5e75..0000000 --- a/.cache/go-build/60/600e3db6039a81283064b696b6bda13e55178064c8ec9a331bff43363049ddeb-a +++ /dev/null @@ -1 +0,0 @@ -v1 600e3db6039a81283064b696b6bda13e55178064c8ec9a331bff43363049ddeb a7445f19ed8b0145ce1a5f11d80a5154072eb09138cff5b23bcc5acc51dc84f4 70522 1775136288497976234 diff --git a/.cache/go-build/60/6015cbe993378926fe1e410150ae541cb3eb2ed80ecae47d135b47d0c8fd4eed-d b/.cache/go-build/60/6015cbe993378926fe1e410150ae541cb3eb2ed80ecae47d135b47d0c8fd4eed-d deleted file mode 100644 index cb751ad..0000000 Binary files a/.cache/go-build/60/6015cbe993378926fe1e410150ae541cb3eb2ed80ecae47d135b47d0c8fd4eed-d and /dev/null differ diff --git a/.cache/go-build/60/6033bea675f493cff03775e928632626a8f553e60f9ecc5d0af0229814f353f5-d b/.cache/go-build/60/6033bea675f493cff03775e928632626a8f553e60f9ecc5d0af0229814f353f5-d deleted file mode 100644 index 6092353..0000000 Binary files a/.cache/go-build/60/6033bea675f493cff03775e928632626a8f553e60f9ecc5d0af0229814f353f5-d and /dev/null differ diff --git a/.cache/go-build/60/604a9152095a051610d80c22a7d10f967465ad6bd6fababbf70cf51c44ab51e9-a b/.cache/go-build/60/604a9152095a051610d80c22a7d10f967465ad6bd6fababbf70cf51c44ab51e9-a deleted file mode 100644 index 370400a..0000000 --- a/.cache/go-build/60/604a9152095a051610d80c22a7d10f967465ad6bd6fababbf70cf51c44ab51e9-a +++ /dev/null @@ -1 +0,0 @@ -v1 604a9152095a051610d80c22a7d10f967465ad6bd6fababbf70cf51c44ab51e9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136290012789587 diff --git a/.cache/go-build/61/6108a65a8a22a4978cd3c1f7d61f73a2944db05d66c5410e550498023ca203fd-d b/.cache/go-build/61/6108a65a8a22a4978cd3c1f7d61f73a2944db05d66c5410e550498023ca203fd-d deleted file mode 100644 index 15496a2..0000000 --- a/.cache/go-build/61/6108a65a8a22a4978cd3c1f7d61f73a2944db05d66c5410e550498023ca203fd-d +++ /dev/null @@ -1 +0,0 @@ -./execenv_default.go diff --git a/.cache/go-build/61/611333b6e0e9f3f6dd155b886debd7decd0cee8d533ce45e057452e54b50aaaa-d b/.cache/go-build/61/611333b6e0e9f3f6dd155b886debd7decd0cee8d533ce45e057452e54b50aaaa-d deleted file mode 100644 index 1ab0a87..0000000 --- a/.cache/go-build/61/611333b6e0e9f3f6dd155b886debd7decd0cee8d533ce45e057452e54b50aaaa-d +++ /dev/null @@ -1,8 +0,0 @@ -./compile.go -./doc.go -./op_string.go -./parse.go -./perl_groups.go -./prog.go -./regexp.go -./simplify.go diff --git a/.cache/go-build/61/616a72bbba0b377869eebb9044f5e420e82c8e2e28262b41e11c2a2ca5015682-d b/.cache/go-build/61/616a72bbba0b377869eebb9044f5e420e82c8e2e28262b41e11c2a2ca5015682-d deleted file mode 100644 index d153790..0000000 Binary files a/.cache/go-build/61/616a72bbba0b377869eebb9044f5e420e82c8e2e28262b41e11c2a2ca5015682-d and /dev/null differ diff --git a/.cache/go-build/61/618850996b162c915ab19a7bfda0ebc6c7bacefafb87e83421bc4e91b80a955a-d b/.cache/go-build/61/618850996b162c915ab19a7bfda0ebc6c7bacefafb87e83421bc4e91b80a955a-d deleted file mode 100644 index a5212a2..0000000 Binary files a/.cache/go-build/61/618850996b162c915ab19a7bfda0ebc6c7bacefafb87e83421bc4e91b80a955a-d and /dev/null differ diff --git a/.cache/go-build/61/61894afd790486ba93c623fce3be1deba3a4b95488bda16d70dbf06df13294c3-d b/.cache/go-build/61/61894afd790486ba93c623fce3be1deba3a4b95488bda16d70dbf06df13294c3-d deleted file mode 100644 index 81f609c..0000000 Binary files a/.cache/go-build/61/61894afd790486ba93c623fce3be1deba3a4b95488bda16d70dbf06df13294c3-d and /dev/null differ diff --git a/.cache/go-build/61/61a58218c9692da3490d3d1a4b78640dada47f7b4556cee8ca2e700ba8314e7c-d b/.cache/go-build/61/61a58218c9692da3490d3d1a4b78640dada47f7b4556cee8ca2e700ba8314e7c-d deleted file mode 100644 index e0b3834..0000000 Binary files a/.cache/go-build/61/61a58218c9692da3490d3d1a4b78640dada47f7b4556cee8ca2e700ba8314e7c-d and /dev/null differ diff --git a/.cache/go-build/61/61cc5cbe4d3e12b4342fcd53314cb370344217770d75f1758bd38ddf9ca43c7c-a b/.cache/go-build/61/61cc5cbe4d3e12b4342fcd53314cb370344217770d75f1758bd38ddf9ca43c7c-a deleted file mode 100644 index 88df537..0000000 --- a/.cache/go-build/61/61cc5cbe4d3e12b4342fcd53314cb370344217770d75f1758bd38ddf9ca43c7c-a +++ /dev/null @@ -1 +0,0 @@ -v1 61cc5cbe4d3e12b4342fcd53314cb370344217770d75f1758bd38ddf9ca43c7c 1ea964ebfa11a0ca7b78aaaae6c39c58d0f4e7b47329da387d83524dddbf272c 253 1775136286937134417 diff --git a/.cache/go-build/61/61e0130017c504975f46afe79500c56b8780b58d52f54bff74835403d4e3d8a8-a b/.cache/go-build/61/61e0130017c504975f46afe79500c56b8780b58d52f54bff74835403d4e3d8a8-a deleted file mode 100644 index a42880d..0000000 --- a/.cache/go-build/61/61e0130017c504975f46afe79500c56b8780b58d52f54bff74835403d4e3d8a8-a +++ /dev/null @@ -1 +0,0 @@ -v1 61e0130017c504975f46afe79500c56b8780b58d52f54bff74835403d4e3d8a8 e4feb59c82ba6f15b0a5eeea8b691635963356790da60ffe06d4cbca4f69010b 39 1775136286936148027 diff --git a/.cache/go-build/61/61ec3ef3a19b33bb19bfbf59fa05c1e7e726e70ffb3f796cfa486f540b59d95b-d b/.cache/go-build/61/61ec3ef3a19b33bb19bfbf59fa05c1e7e726e70ffb3f796cfa486f540b59d95b-d deleted file mode 100644 index f0f9165..0000000 Binary files a/.cache/go-build/61/61ec3ef3a19b33bb19bfbf59fa05c1e7e726e70ffb3f796cfa486f540b59d95b-d and /dev/null differ diff --git a/.cache/go-build/62/62681189671f295f9d265f7b3ecaca8622669986c36b79aa349c73085ab18b0b-d b/.cache/go-build/62/62681189671f295f9d265f7b3ecaca8622669986c36b79aa349c73085ab18b0b-d deleted file mode 100644 index 1c494cb..0000000 Binary files a/.cache/go-build/62/62681189671f295f9d265f7b3ecaca8622669986c36b79aa349c73085ab18b0b-d and /dev/null differ diff --git a/.cache/go-build/62/6278f579858a924e7bd39d6b0519e14f2c3b396939a83f72bbd95431655530ef-a b/.cache/go-build/62/6278f579858a924e7bd39d6b0519e14f2c3b396939a83f72bbd95431655530ef-a deleted file mode 100644 index b4fbb0c..0000000 --- a/.cache/go-build/62/6278f579858a924e7bd39d6b0519e14f2c3b396939a83f72bbd95431655530ef-a +++ /dev/null @@ -1 +0,0 @@ -v1 6278f579858a924e7bd39d6b0519e14f2c3b396939a83f72bbd95431655530ef 29b051b653a394836f379f6d79fca8395d130465de3003fbacf8d3cf9396f976 32 1775136288449068269 diff --git a/.cache/go-build/63/63134fafe684b0479e1e6c558e9c03693c7d12f9e4e6ca8854c90e4384eaa6c2-a b/.cache/go-build/63/63134fafe684b0479e1e6c558e9c03693c7d12f9e4e6ca8854c90e4384eaa6c2-a deleted file mode 100644 index 8374462..0000000 --- a/.cache/go-build/63/63134fafe684b0479e1e6c558e9c03693c7d12f9e4e6ca8854c90e4384eaa6c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 63134fafe684b0479e1e6c558e9c03693c7d12f9e4e6ca8854c90e4384eaa6c2 890c85674dfc58896d8d54cc5faaf101801bae45071454ef3f217ca8eca3c181 420414 1775136287071589724 diff --git a/.cache/go-build/63/631c215e7106bac4fddcd2cbf3ba3a348a85a755c96a5a55df6f7b8adb912305-a b/.cache/go-build/63/631c215e7106bac4fddcd2cbf3ba3a348a85a755c96a5a55df6f7b8adb912305-a deleted file mode 100644 index 1d935d9..0000000 --- a/.cache/go-build/63/631c215e7106bac4fddcd2cbf3ba3a348a85a755c96a5a55df6f7b8adb912305-a +++ /dev/null @@ -1 +0,0 @@ -v1 631c215e7106bac4fddcd2cbf3ba3a348a85a755c96a5a55df6f7b8adb912305 0ca4520be527ca56581aa3731ce3b547d305a643784791f3b365eca652684a95 525022 1775136288631588819 diff --git a/.cache/go-build/63/63742bc10f0999cdcabcf76eabe626823523eab67b201ac564c97194bbb9f5e8-d b/.cache/go-build/63/63742bc10f0999cdcabcf76eabe626823523eab67b201ac564c97194bbb9f5e8-d deleted file mode 100644 index 00507a3..0000000 Binary files a/.cache/go-build/63/63742bc10f0999cdcabcf76eabe626823523eab67b201ac564c97194bbb9f5e8-d and /dev/null differ diff --git a/.cache/go-build/63/63b3bf1ab5f2265134ce05343d11731e1006bdbbf306cfaf2f225111d957f402-a b/.cache/go-build/63/63b3bf1ab5f2265134ce05343d11731e1006bdbbf306cfaf2f225111d957f402-a deleted file mode 100644 index 95879e4..0000000 --- a/.cache/go-build/63/63b3bf1ab5f2265134ce05343d11731e1006bdbbf306cfaf2f225111d957f402-a +++ /dev/null @@ -1 +0,0 @@ -v1 63b3bf1ab5f2265134ce05343d11731e1006bdbbf306cfaf2f225111d957f402 17a678fa7e0d1624a6c02dd3ded8901328144219dbbc15abaf150fec4c173d6b 49 1775136286917318223 diff --git a/.cache/go-build/63/63e40dd4c8afe561e73de60cbce5cc7dfbe870557f0ae374b1befc7a58d0fb6d-a b/.cache/go-build/63/63e40dd4c8afe561e73de60cbce5cc7dfbe870557f0ae374b1befc7a58d0fb6d-a deleted file mode 100644 index a2b27d7..0000000 --- a/.cache/go-build/63/63e40dd4c8afe561e73de60cbce5cc7dfbe870557f0ae374b1befc7a58d0fb6d-a +++ /dev/null @@ -1 +0,0 @@ -v1 63e40dd4c8afe561e73de60cbce5cc7dfbe870557f0ae374b1befc7a58d0fb6d 7c4b1a6dd9483c0ec5a5d673b9708a46ea03b3813be44906d3795b21d6f42882 341854 1775136289412508828 diff --git a/.cache/go-build/64/6400ff98e669e1912927a1114c646d6efe8087c15d8882b56e95e31ae3ba2cf5-a b/.cache/go-build/64/6400ff98e669e1912927a1114c646d6efe8087c15d8882b56e95e31ae3ba2cf5-a deleted file mode 100644 index 331b308..0000000 --- a/.cache/go-build/64/6400ff98e669e1912927a1114c646d6efe8087c15d8882b56e95e31ae3ba2cf5-a +++ /dev/null @@ -1 +0,0 @@ -v1 6400ff98e669e1912927a1114c646d6efe8087c15d8882b56e95e31ae3ba2cf5 377fb9290326a21d1cf245d213930510485d0649bdaadf1ff223cfa6f19c6f53 73 1775136290022105494 diff --git a/.cache/go-build/64/64a11b73553b817f81d16885df0ef5a4022ccf15aa7507abcbf8e7283df0a9ad-a b/.cache/go-build/64/64a11b73553b817f81d16885df0ef5a4022ccf15aa7507abcbf8e7283df0a9ad-a deleted file mode 100644 index 9cb9f0d..0000000 --- a/.cache/go-build/64/64a11b73553b817f81d16885df0ef5a4022ccf15aa7507abcbf8e7283df0a9ad-a +++ /dev/null @@ -1 +0,0 @@ -v1 64a11b73553b817f81d16885df0ef5a4022ccf15aa7507abcbf8e7283df0a9ad e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722022394140 diff --git a/.cache/go-build/64/64bdcbf166627868d90e46c2756bf6f658185037822d25818e1f65533e007425-a b/.cache/go-build/64/64bdcbf166627868d90e46c2756bf6f658185037822d25818e1f65533e007425-a deleted file mode 100644 index 1f71014..0000000 --- a/.cache/go-build/64/64bdcbf166627868d90e46c2756bf6f658185037822d25818e1f65533e007425-a +++ /dev/null @@ -1 +0,0 @@ -v1 64bdcbf166627868d90e46c2756bf6f658185037822d25818e1f65533e007425 1579ddce15a908107b013f067d9496266480a9bc176da3f4e50dd3403bd2be44 16773 1775137722150437381 diff --git a/.cache/go-build/65/65118cf5e5279d561e03853fc8774c1f3f338d86808e531dec1338a4c2830244-a b/.cache/go-build/65/65118cf5e5279d561e03853fc8774c1f3f338d86808e531dec1338a4c2830244-a deleted file mode 100644 index d0e8cf8..0000000 --- a/.cache/go-build/65/65118cf5e5279d561e03853fc8774c1f3f338d86808e531dec1338a4c2830244-a +++ /dev/null @@ -1 +0,0 @@ -v1 65118cf5e5279d561e03853fc8774c1f3f338d86808e531dec1338a4c2830244 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184126544512 diff --git a/.cache/go-build/65/651653133544b35f6f97b832ad0a27a92227b531b6649346cc387abfbb4a7458-a b/.cache/go-build/65/651653133544b35f6f97b832ad0a27a92227b531b6649346cc387abfbb4a7458-a deleted file mode 100644 index 2c56ad9..0000000 --- a/.cache/go-build/65/651653133544b35f6f97b832ad0a27a92227b531b6649346cc387abfbb4a7458-a +++ /dev/null @@ -1 +0,0 @@ -v1 651653133544b35f6f97b832ad0a27a92227b531b6649346cc387abfbb4a7458 93376bbec60c19af886b71f7eae843bd04bb9aafec6139fb51f1f7be0b4ebe7a 627 1775136286804873853 diff --git a/.cache/go-build/65/65682fc4a853570ad6a6d612a32aa4f25db9fb86d8e5cfc79e651d73a0445cf3-d b/.cache/go-build/65/65682fc4a853570ad6a6d612a32aa4f25db9fb86d8e5cfc79e651d73a0445cf3-d deleted file mode 100644 index f6c82d1..0000000 --- a/.cache/go-build/65/65682fc4a853570ad6a6d612a32aa4f25db9fb86d8e5cfc79e651d73a0445cf3-d +++ /dev/null @@ -1,11 +0,0 @@ -./cond.go -./map.go -./mutex.go -./once.go -./oncefunc.go -./pool.go -./poolqueue.go -./runtime.go -./runtime2.go -./rwmutex.go -./waitgroup.go diff --git a/.cache/go-build/65/659ff469f81e3e34cf6be4bd983ef5954b6e8ea1fba8edd716f7026e58ccc39c-d b/.cache/go-build/65/659ff469f81e3e34cf6be4bd983ef5954b6e8ea1fba8edd716f7026e58ccc39c-d deleted file mode 100644 index 8027faa..0000000 Binary files a/.cache/go-build/65/659ff469f81e3e34cf6be4bd983ef5954b6e8ea1fba8edd716f7026e58ccc39c-d and /dev/null differ diff --git a/.cache/go-build/66/666f7db8f5ab2f23d5afe3621c04400d89a91dd424474f5000de56c28d984cef-d b/.cache/go-build/66/666f7db8f5ab2f23d5afe3621c04400d89a91dd424474f5000de56c28d984cef-d deleted file mode 100644 index 7ac56b6..0000000 --- a/.cache/go-build/66/666f7db8f5ab2f23d5afe3621c04400d89a91dd424474f5000de56c28d984cef-d +++ /dev/null @@ -1,7 +0,0 @@ -./cast.go -./hashes.go -./keccakf.go -./sha3.go -./sha3_amd64.go -./shake.go -./sha3_amd64.s diff --git a/.cache/go-build/66/6673f85d4ca930185ebdd741a615fbf0fc26494c8657c9574baa94a74d257549-d b/.cache/go-build/66/6673f85d4ca930185ebdd741a615fbf0fc26494c8657c9574baa94a74d257549-d deleted file mode 100644 index 06f326f..0000000 --- a/.cache/go-build/66/6673f85d4ca930185ebdd741a615fbf0fc26494c8657c9574baa94a74d257549-d +++ /dev/null @@ -1,2 +0,0 @@ -./doc.go -./notboring.go diff --git a/.cache/go-build/66/667d61eeaaa0abc811b448947ce5df055343000b8a2e6a1e1ba3aaf38bc32858-d b/.cache/go-build/66/667d61eeaaa0abc811b448947ce5df055343000b8a2e6a1e1ba3aaf38bc32858-d deleted file mode 100644 index b55d436..0000000 Binary files a/.cache/go-build/66/667d61eeaaa0abc811b448947ce5df055343000b8a2e6a1e1ba3aaf38bc32858-d and /dev/null differ diff --git a/.cache/go-build/66/66990eb58102bb3105fab0c11f859d8f327f69daededda80fa50f49c8d5eca23-a b/.cache/go-build/66/66990eb58102bb3105fab0c11f859d8f327f69daededda80fa50f49c8d5eca23-a deleted file mode 100644 index edf2bcf..0000000 --- a/.cache/go-build/66/66990eb58102bb3105fab0c11f859d8f327f69daededda80fa50f49c8d5eca23-a +++ /dev/null @@ -1 +0,0 @@ -v1 66990eb58102bb3105fab0c11f859d8f327f69daededda80fa50f49c8d5eca23 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775138184097918262 diff --git a/.cache/go-build/66/66b6626d757974ce811aca979a66dfe64284c5af7be560443ff6a8bca3adc6f4-a b/.cache/go-build/66/66b6626d757974ce811aca979a66dfe64284c5af7be560443ff6a8bca3adc6f4-a deleted file mode 100644 index 7a26aeb..0000000 --- a/.cache/go-build/66/66b6626d757974ce811aca979a66dfe64284c5af7be560443ff6a8bca3adc6f4-a +++ /dev/null @@ -1 +0,0 @@ -v1 66b6626d757974ce811aca979a66dfe64284c5af7be560443ff6a8bca3adc6f4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289155751474 diff --git a/.cache/go-build/66/66d81971f2b9479b49f3ef4282d62eed1b2a9ac414c4fac9840d7d72cd5e2332-a b/.cache/go-build/66/66d81971f2b9479b49f3ef4282d62eed1b2a9ac414c4fac9840d7d72cd5e2332-a deleted file mode 100644 index 2f88b1d..0000000 --- a/.cache/go-build/66/66d81971f2b9479b49f3ef4282d62eed1b2a9ac414c4fac9840d7d72cd5e2332-a +++ /dev/null @@ -1 +0,0 @@ -v1 66d81971f2b9479b49f3ef4282d62eed1b2a9ac414c4fac9840d7d72cd5e2332 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289305045611 diff --git a/.cache/go-build/67/6713882c19c16fb4920ef951b97a752ba9c06dd26529b6aee521da945a8e23af-d b/.cache/go-build/67/6713882c19c16fb4920ef951b97a752ba9c06dd26529b6aee521da945a8e23af-d deleted file mode 100644 index 9dcc8a5..0000000 --- a/.cache/go-build/67/6713882c19c16fb4920ef951b97a752ba9c06dd26529b6aee521da945a8e23af-d +++ /dev/null @@ -1,2 +0,0 @@ -./enforcement.go -./fips140.go diff --git a/.cache/go-build/67/6717f5044b4b4af967abe2f26ea9abb8e50a4d58b1690e0fa9dad24a4f71516e-a b/.cache/go-build/67/6717f5044b4b4af967abe2f26ea9abb8e50a4d58b1690e0fa9dad24a4f71516e-a deleted file mode 100644 index 1fd830a..0000000 --- a/.cache/go-build/67/6717f5044b4b4af967abe2f26ea9abb8e50a4d58b1690e0fa9dad24a4f71516e-a +++ /dev/null @@ -1 +0,0 @@ -v1 6717f5044b4b4af967abe2f26ea9abb8e50a4d58b1690e0fa9dad24a4f71516e 0bf38d4b50c0ddb6d18b6bb9dfb35a558a84bfb6068b9e52ccdd382c8c643ffd 98 1775139398415891749 diff --git a/.cache/go-build/67/671c44bf9e530a461857ffebd16cf2db982f4ba9c462a44bc2fe5537a3cfdf36-a b/.cache/go-build/67/671c44bf9e530a461857ffebd16cf2db982f4ba9c462a44bc2fe5537a3cfdf36-a deleted file mode 100644 index 8ba2111..0000000 --- a/.cache/go-build/67/671c44bf9e530a461857ffebd16cf2db982f4ba9c462a44bc2fe5537a3cfdf36-a +++ /dev/null @@ -1 +0,0 @@ -v1 671c44bf9e530a461857ffebd16cf2db982f4ba9c462a44bc2fe5537a3cfdf36 ae4b6a9e66a598876ce1f67dff1e14cb81f3b7e6826c99e8525c1ede83e81234 924 1775138183972237352 diff --git a/.cache/go-build/67/67746ad597832bc4b47103cbe0d0fd90e2091657ee4948607b31bc9c4f1cbfd1-d b/.cache/go-build/67/67746ad597832bc4b47103cbe0d0fd90e2091657ee4948607b31bc9c4f1cbfd1-d deleted file mode 100644 index c4e92b8..0000000 --- a/.cache/go-build/67/67746ad597832bc4b47103cbe0d0fd90e2091657ee4948607b31bc9c4f1cbfd1-d +++ /dev/null @@ -1,2 +0,0 @@ -./bufio.go -./scan.go diff --git a/.cache/go-build/67/67b6acb986c47cb3c0d9371d92abc5899377213d95165d46142a221d6a1fc613-a b/.cache/go-build/67/67b6acb986c47cb3c0d9371d92abc5899377213d95165d46142a221d6a1fc613-a deleted file mode 100644 index 493fb5f..0000000 --- a/.cache/go-build/67/67b6acb986c47cb3c0d9371d92abc5899377213d95165d46142a221d6a1fc613-a +++ /dev/null @@ -1 +0,0 @@ -v1 67b6acb986c47cb3c0d9371d92abc5899377213d95165d46142a221d6a1fc613 d93352206bc92124f0d9f2ac5dfe24548e892159a5074413a733b962c5432dc9 12 1775136288451579781 diff --git a/.cache/go-build/67/67eb3142602ec8c0ea92b8924df0fecea6907be970eb7dddeab4fd91e4dd8ddd-a b/.cache/go-build/67/67eb3142602ec8c0ea92b8924df0fecea6907be970eb7dddeab4fd91e4dd8ddd-a deleted file mode 100644 index bae66b8..0000000 --- a/.cache/go-build/67/67eb3142602ec8c0ea92b8924df0fecea6907be970eb7dddeab4fd91e4dd8ddd-a +++ /dev/null @@ -1 +0,0 @@ -v1 67eb3142602ec8c0ea92b8924df0fecea6907be970eb7dddeab4fd91e4dd8ddd 89cbb64e697ff2945c4df871a2a3645e4065bb5e9dea2b342a5ac9886c01821e 109930 1775136288795899487 diff --git a/.cache/go-build/68/680c0e7aa90d12a7b4fabd07ef9778a2120240242d6c401174b8a37c4996bc79-a b/.cache/go-build/68/680c0e7aa90d12a7b4fabd07ef9778a2120240242d6c401174b8a37c4996bc79-a deleted file mode 100644 index 2fe6a19..0000000 --- a/.cache/go-build/68/680c0e7aa90d12a7b4fabd07ef9778a2120240242d6c401174b8a37c4996bc79-a +++ /dev/null @@ -1 +0,0 @@ -v1 680c0e7aa90d12a7b4fabd07ef9778a2120240242d6c401174b8a37c4996bc79 da863cf9c8e3790f897a86e46520e26dda1496e4ba3a6cae8dd22df2caadaa3b 160586 1775136288569120105 diff --git a/.cache/go-build/68/681f0a997093c404fde555ab7813e0f0292fd60857a68746399ad611e393681d-a b/.cache/go-build/68/681f0a997093c404fde555ab7813e0f0292fd60857a68746399ad611e393681d-a deleted file mode 100644 index acda3a0..0000000 --- a/.cache/go-build/68/681f0a997093c404fde555ab7813e0f0292fd60857a68746399ad611e393681d-a +++ /dev/null @@ -1 +0,0 @@ -v1 681f0a997093c404fde555ab7813e0f0292fd60857a68746399ad611e393681d 20524186d016e59860a20ebde303d29555d385760b48f116df3192be6dd4810b 50608 1775137722026977403 diff --git a/.cache/go-build/68/685e74a3642ca7c099872d5346a4c630a3933e36f9d3a9721a4c872de11023df-a b/.cache/go-build/68/685e74a3642ca7c099872d5346a4c630a3933e36f9d3a9721a4c872de11023df-a deleted file mode 100644 index 0ea14ea..0000000 --- a/.cache/go-build/68/685e74a3642ca7c099872d5346a4c630a3933e36f9d3a9721a4c872de11023df-a +++ /dev/null @@ -1 +0,0 @@ -v1 685e74a3642ca7c099872d5346a4c630a3933e36f9d3a9721a4c872de11023df e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288463054709 diff --git a/.cache/go-build/68/686797c345e8171997651eb3fc079e5fb249dda8cca0d028da2de8062d060381-d b/.cache/go-build/68/686797c345e8171997651eb3fc079e5fb249dda8cca0d028da2de8062d060381-d deleted file mode 100644 index 422024f..0000000 --- a/.cache/go-build/68/686797c345e8171997651eb3fc079e5fb249dda8cca0d028da2de8062d060381-d +++ /dev/null @@ -1,7 +0,0 @@ -./cbc.go -./cfb.go -./cipher.go -./ctr.go -./gcm.go -./io.go -./ofb.go diff --git a/.cache/go-build/68/68c5de7c01d2649499d2b03f89df7f21479db5687a0e7378294bc01facf7a3e6-a b/.cache/go-build/68/68c5de7c01d2649499d2b03f89df7f21479db5687a0e7378294bc01facf7a3e6-a deleted file mode 100644 index 32f99cd..0000000 --- a/.cache/go-build/68/68c5de7c01d2649499d2b03f89df7f21479db5687a0e7378294bc01facf7a3e6-a +++ /dev/null @@ -1 +0,0 @@ -v1 68c5de7c01d2649499d2b03f89df7f21479db5687a0e7378294bc01facf7a3e6 9cd4ce3d13610edf9031d42b0e3f4c66f041fb02b42bc27d9b911f307f1caf7f 391420 1775136288701843850 diff --git a/.cache/go-build/69/6901a4ac2c2bd216c47f909db9fa51ad2b9100b5a85dccbffbc9ba0ed8207286-a b/.cache/go-build/69/6901a4ac2c2bd216c47f909db9fa51ad2b9100b5a85dccbffbc9ba0ed8207286-a deleted file mode 100644 index c2fde96..0000000 --- a/.cache/go-build/69/6901a4ac2c2bd216c47f909db9fa51ad2b9100b5a85dccbffbc9ba0ed8207286-a +++ /dev/null @@ -1 +0,0 @@ -v1 6901a4ac2c2bd216c47f909db9fa51ad2b9100b5a85dccbffbc9ba0ed8207286 f5af47691b4c804b373b947595ee26ab1bac9fe817cd4070f2411b2f1d9a4b78 11 1775136287031858995 diff --git a/.cache/go-build/69/691ef5801437bd0dcbe2338e0b1a77bf987b907b8f1cb83d85af6c360478dae2-d b/.cache/go-build/69/691ef5801437bd0dcbe2338e0b1a77bf987b907b8f1cb83d85af6c360478dae2-d deleted file mode 100644 index cc0a3da..0000000 Binary files a/.cache/go-build/69/691ef5801437bd0dcbe2338e0b1a77bf987b907b8f1cb83d85af6c360478dae2-d and /dev/null differ diff --git a/.cache/go-build/69/6933ad321b6a4f7e62cb7dde45c5792dfeddf11bd5448c659ff89c3d52eb398b-a b/.cache/go-build/69/6933ad321b6a4f7e62cb7dde45c5792dfeddf11bd5448c659ff89c3d52eb398b-a deleted file mode 100644 index e0f1cd1..0000000 --- a/.cache/go-build/69/6933ad321b6a4f7e62cb7dde45c5792dfeddf11bd5448c659ff89c3d52eb398b-a +++ /dev/null @@ -1 +0,0 @@ -v1 6933ad321b6a4f7e62cb7dde45c5792dfeddf11bd5448c659ff89c3d52eb398b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287049412838 diff --git a/.cache/go-build/6a/6a1780511fec10cc3bcd708c1e42620a1ffce464495fab602278c2d64e157abb-a b/.cache/go-build/6a/6a1780511fec10cc3bcd708c1e42620a1ffce464495fab602278c2d64e157abb-a deleted file mode 100644 index ed37ec6..0000000 --- a/.cache/go-build/6a/6a1780511fec10cc3bcd708c1e42620a1ffce464495fab602278c2d64e157abb-a +++ /dev/null @@ -1 +0,0 @@ -v1 6a1780511fec10cc3bcd708c1e42620a1ffce464495fab602278c2d64e157abb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287107236249 diff --git a/.cache/go-build/6a/6a45acde6765ec299bf963b72d88c8d662c54c986b4c4afbbda7150cfad37f47-a b/.cache/go-build/6a/6a45acde6765ec299bf963b72d88c8d662c54c986b4c4afbbda7150cfad37f47-a deleted file mode 100644 index 4c87f9b..0000000 --- a/.cache/go-build/6a/6a45acde6765ec299bf963b72d88c8d662c54c986b4c4afbbda7150cfad37f47-a +++ /dev/null @@ -1 +0,0 @@ -v1 6a45acde6765ec299bf963b72d88c8d662c54c986b4c4afbbda7150cfad37f47 e5067057ea25d47e75be9c244071d1088c17047bfe38df0a4b577d0e827f0e80 57 1775137721933893746 diff --git a/.cache/go-build/6a/6a58ef0e7cdcac2482c370441be7b55e10dc822c05a7b1a214c863dc137167d5-a b/.cache/go-build/6a/6a58ef0e7cdcac2482c370441be7b55e10dc822c05a7b1a214c863dc137167d5-a deleted file mode 100644 index d42d2f5..0000000 --- a/.cache/go-build/6a/6a58ef0e7cdcac2482c370441be7b55e10dc822c05a7b1a214c863dc137167d5-a +++ /dev/null @@ -1 +0,0 @@ -v1 6a58ef0e7cdcac2482c370441be7b55e10dc822c05a7b1a214c863dc137167d5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289011616891 diff --git a/.cache/go-build/6a/6a659d24c38f7e595d63920b430b6f3baf09df042eeb8f0bba0530a7af41abe9-a b/.cache/go-build/6a/6a659d24c38f7e595d63920b430b6f3baf09df042eeb8f0bba0530a7af41abe9-a deleted file mode 100644 index 6c43934..0000000 --- a/.cache/go-build/6a/6a659d24c38f7e595d63920b430b6f3baf09df042eeb8f0bba0530a7af41abe9-a +++ /dev/null @@ -1 +0,0 @@ -v1 6a659d24c38f7e595d63920b430b6f3baf09df042eeb8f0bba0530a7af41abe9 667d61eeaaa0abc811b448947ce5df055343000b8a2e6a1e1ba3aaf38bc32858 260 1775136289354150636 diff --git a/.cache/go-build/6a/6a6de06b24889b5c9a5ca05809a83065753561937afd43a1962a9dd7313294c2-a b/.cache/go-build/6a/6a6de06b24889b5c9a5ca05809a83065753561937afd43a1962a9dd7313294c2-a deleted file mode 100644 index bd6db6a..0000000 --- a/.cache/go-build/6a/6a6de06b24889b5c9a5ca05809a83065753561937afd43a1962a9dd7313294c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 6a6de06b24889b5c9a5ca05809a83065753561937afd43a1962a9dd7313294c2 50a48eb9b1a8b3e2c1446b02eefb881c053bfef9ba258979a6ac1755cdd3e95a 116946 1775136289961264380 diff --git a/.cache/go-build/6a/6aafa1264b663de5c1f2ea963f11032ee257f8d728eb5ca49da60ce12d845af0-a b/.cache/go-build/6a/6aafa1264b663de5c1f2ea963f11032ee257f8d728eb5ca49da60ce12d845af0-a deleted file mode 100644 index e606f8a..0000000 --- a/.cache/go-build/6a/6aafa1264b663de5c1f2ea963f11032ee257f8d728eb5ca49da60ce12d845af0-a +++ /dev/null @@ -1 +0,0 @@ -v1 6aafa1264b663de5c1f2ea963f11032ee257f8d728eb5ca49da60ce12d845af0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289050975639 diff --git a/.cache/go-build/6a/6ad7b872079d5c0111530e788a286435685305774b3bba82f146dfecd2e06f70-a b/.cache/go-build/6a/6ad7b872079d5c0111530e788a286435685305774b3bba82f146dfecd2e06f70-a deleted file mode 100644 index 51b03fa..0000000 --- a/.cache/go-build/6a/6ad7b872079d5c0111530e788a286435685305774b3bba82f146dfecd2e06f70-a +++ /dev/null @@ -1 +0,0 @@ -v1 6ad7b872079d5c0111530e788a286435685305774b3bba82f146dfecd2e06f70 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289721893459 diff --git a/.cache/go-build/6b/6b0d922ba04160123ffcceb27ec7d533efccf2d329837fe4ab54cca90ebddd01-a b/.cache/go-build/6b/6b0d922ba04160123ffcceb27ec7d533efccf2d329837fe4ab54cca90ebddd01-a deleted file mode 100644 index bc67a59..0000000 --- a/.cache/go-build/6b/6b0d922ba04160123ffcceb27ec7d533efccf2d329837fe4ab54cca90ebddd01-a +++ /dev/null @@ -1 +0,0 @@ -v1 6b0d922ba04160123ffcceb27ec7d533efccf2d329837fe4ab54cca90ebddd01 1a59aaf7359e29b2e15fa48388b2a40a12b38b450c711b4442b415115bba8ae9 2398 1775139398193333050 diff --git a/.cache/go-build/6b/6b2d77045bb500021d2b221c7208270a28d5f108ab2c69da17dd9dc60f40fdfb-a b/.cache/go-build/6b/6b2d77045bb500021d2b221c7208270a28d5f108ab2c69da17dd9dc60f40fdfb-a deleted file mode 100644 index 580a005..0000000 --- a/.cache/go-build/6b/6b2d77045bb500021d2b221c7208270a28d5f108ab2c69da17dd9dc60f40fdfb-a +++ /dev/null @@ -1 +0,0 @@ -v1 6b2d77045bb500021d2b221c7208270a28d5f108ab2c69da17dd9dc60f40fdfb 98008025876333837b7f968679e79e0e2faca6162f7164ececd5ca7f3d0ea304 2300 1775136286917993984 diff --git a/.cache/go-build/6b/6bba83520bfdb5e619f833c848a6c4f8d157eadc05aeff1b7f548c5d792e526d-a b/.cache/go-build/6b/6bba83520bfdb5e619f833c848a6c4f8d157eadc05aeff1b7f548c5d792e526d-a deleted file mode 100644 index 6932ced..0000000 --- a/.cache/go-build/6b/6bba83520bfdb5e619f833c848a6c4f8d157eadc05aeff1b7f548c5d792e526d-a +++ /dev/null @@ -1 +0,0 @@ -v1 6bba83520bfdb5e619f833c848a6c4f8d157eadc05aeff1b7f548c5d792e526d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287223938932 diff --git a/.cache/go-build/6b/6bd129fe34098ea42aea0962860c1c9d37c0e9f08d482a5dcdf10ac7936acee7-d b/.cache/go-build/6b/6bd129fe34098ea42aea0962860c1c9d37c0e9f08d482a5dcdf10ac7936acee7-d deleted file mode 100644 index d2d7692..0000000 --- a/.cache/go-build/6b/6bd129fe34098ea42aea0962860c1c9d37c0e9f08d482a5dcdf10ac7936acee7-d +++ /dev/null @@ -1,4 +0,0 @@ -./defs_linux.go -./defs_linux_amd64.go -./syscall_linux.go -./asm_linux_amd64.s diff --git a/.cache/go-build/6b/6bdcebcb032d88a485e27018452b54bd00e902cb1a8c03dfefffbf04f66d09f9-a b/.cache/go-build/6b/6bdcebcb032d88a485e27018452b54bd00e902cb1a8c03dfefffbf04f66d09f9-a deleted file mode 100644 index f09ec1b..0000000 --- a/.cache/go-build/6b/6bdcebcb032d88a485e27018452b54bd00e902cb1a8c03dfefffbf04f66d09f9-a +++ /dev/null @@ -1 +0,0 @@ -v1 6bdcebcb032d88a485e27018452b54bd00e902cb1a8c03dfefffbf04f66d09f9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289155180904 diff --git a/.cache/go-build/6b/6be4cab645a9c99dcbe0330e023eb22d544e562732af1fefb42dadd57caea8de-a b/.cache/go-build/6b/6be4cab645a9c99dcbe0330e023eb22d544e562732af1fefb42dadd57caea8de-a deleted file mode 100644 index 484591d..0000000 --- a/.cache/go-build/6b/6be4cab645a9c99dcbe0330e023eb22d544e562732af1fefb42dadd57caea8de-a +++ /dev/null @@ -1 +0,0 @@ -v1 6be4cab645a9c99dcbe0330e023eb22d544e562732af1fefb42dadd57caea8de f1e0a3c92a4bfe206898f1037be1c433aa07cba0ca74f7f319c4359d7a3ef741 204950 1775136288493784091 diff --git a/.cache/go-build/6c/6c604a3a11818aac2bb62d081840540d12a7057a91bfc24688357b9b7537890a-d b/.cache/go-build/6c/6c604a3a11818aac2bb62d081840540d12a7057a91bfc24688357b9b7537890a-d deleted file mode 100644 index 3734419..0000000 Binary files a/.cache/go-build/6c/6c604a3a11818aac2bb62d081840540d12a7057a91bfc24688357b9b7537890a-d and /dev/null differ diff --git a/.cache/go-build/6c/6c8e249b628b2538481eb2babd84f236d6e44c3ea9842b1c7381a3ff9b02c849-a b/.cache/go-build/6c/6c8e249b628b2538481eb2babd84f236d6e44c3ea9842b1c7381a3ff9b02c849-a deleted file mode 100644 index bc0ae72..0000000 --- a/.cache/go-build/6c/6c8e249b628b2538481eb2babd84f236d6e44c3ea9842b1c7381a3ff9b02c849-a +++ /dev/null @@ -1 +0,0 @@ -v1 6c8e249b628b2538481eb2babd84f236d6e44c3ea9842b1c7381a3ff9b02c849 833d5b756d06d851dfd9c9f62afd2175a0bc0109f7e7e19abe173fd27f7d6b9a 16901 1775136290027190508 diff --git a/.cache/go-build/6c/6c924fa6dee5bca7d9b032c7729bc48e04d180b4043449f4fe1e48fd7be34b6a-d b/.cache/go-build/6c/6c924fa6dee5bca7d9b032c7729bc48e04d180b4043449f4fe1e48fd7be34b6a-d deleted file mode 100644 index baa3ef3..0000000 Binary files a/.cache/go-build/6c/6c924fa6dee5bca7d9b032c7729bc48e04d180b4043449f4fe1e48fd7be34b6a-d and /dev/null differ diff --git a/.cache/go-build/6c/6cffcce12bbfbe419744116b99f6d641ea71a8682d6fd60baf2943a96bd84f2e-a b/.cache/go-build/6c/6cffcce12bbfbe419744116b99f6d641ea71a8682d6fd60baf2943a96bd84f2e-a deleted file mode 100644 index 582ba90..0000000 --- a/.cache/go-build/6c/6cffcce12bbfbe419744116b99f6d641ea71a8682d6fd60baf2943a96bd84f2e-a +++ /dev/null @@ -1 +0,0 @@ -v1 6cffcce12bbfbe419744116b99f6d641ea71a8682d6fd60baf2943a96bd84f2e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287225859014 diff --git a/.cache/go-build/6d/6d0d63d33d1b705ce6c973bf260bf1180405036812c83698c94b2a8a2f3f59f1-d b/.cache/go-build/6d/6d0d63d33d1b705ce6c973bf260bf1180405036812c83698c94b2a8a2f3f59f1-d deleted file mode 100644 index f14c11e..0000000 Binary files a/.cache/go-build/6d/6d0d63d33d1b705ce6c973bf260bf1180405036812c83698c94b2a8a2f3f59f1-d and /dev/null differ diff --git a/.cache/go-build/6d/6d3097ad820b2060546f426b07341a7ac692c76bbe55a568b88744c670c75688-a b/.cache/go-build/6d/6d3097ad820b2060546f426b07341a7ac692c76bbe55a568b88744c670c75688-a deleted file mode 100644 index c350de1..0000000 --- a/.cache/go-build/6d/6d3097ad820b2060546f426b07341a7ac692c76bbe55a568b88744c670c75688-a +++ /dev/null @@ -1 +0,0 @@ -v1 6d3097ad820b2060546f426b07341a7ac692c76bbe55a568b88744c670c75688 907e55d399c6bb3ccd60b74a3ef01fe5c95f29266db766a07c17e4ec2574c083 1600 1775136286814396100 diff --git a/.cache/go-build/6d/6d4a91a958d61a2bcf9c6d17a4c62f752b267814c495af46af25cfb45d30f181-d b/.cache/go-build/6d/6d4a91a958d61a2bcf9c6d17a4c62f752b267814c495af46af25cfb45d30f181-d deleted file mode 100644 index cc279b7..0000000 Binary files a/.cache/go-build/6d/6d4a91a958d61a2bcf9c6d17a4c62f752b267814c495af46af25cfb45d30f181-d and /dev/null differ diff --git a/.cache/go-build/6d/6d521182e5007bdba0c2a2063833da381fd377038042611d13927319e4956bb3-a b/.cache/go-build/6d/6d521182e5007bdba0c2a2063833da381fd377038042611d13927319e4956bb3-a deleted file mode 100644 index b0647b0..0000000 --- a/.cache/go-build/6d/6d521182e5007bdba0c2a2063833da381fd377038042611d13927319e4956bb3-a +++ /dev/null @@ -1 +0,0 @@ -v1 6d521182e5007bdba0c2a2063833da381fd377038042611d13927319e4956bb3 e4aa96e96fa7263e96482c7ef2fd51d96a7ac8d3d42016b33d9d4ee7c19721fb 286170 1775136287032938136 diff --git a/.cache/go-build/6d/6d94d72a2a248f073048143fdfbaa6d75fbffe584706bbd0da07e1b8e0bcaf9b-a b/.cache/go-build/6d/6d94d72a2a248f073048143fdfbaa6d75fbffe584706bbd0da07e1b8e0bcaf9b-a deleted file mode 100644 index 38e0206..0000000 --- a/.cache/go-build/6d/6d94d72a2a248f073048143fdfbaa6d75fbffe584706bbd0da07e1b8e0bcaf9b-a +++ /dev/null @@ -1 +0,0 @@ -v1 6d94d72a2a248f073048143fdfbaa6d75fbffe584706bbd0da07e1b8e0bcaf9b 94cbcfefa7ad018231f7bd78a3ee7c576e38b9d15982f7f4762bd1a970ddc74c 429048 1775136289124048402 diff --git a/.cache/go-build/6d/6de4c83901df908f92fef5465a80ee5f791596102ae6cbae77e5c3ef1318597b-a b/.cache/go-build/6d/6de4c83901df908f92fef5465a80ee5f791596102ae6cbae77e5c3ef1318597b-a deleted file mode 100644 index c2f1b3a..0000000 --- a/.cache/go-build/6d/6de4c83901df908f92fef5465a80ee5f791596102ae6cbae77e5c3ef1318597b-a +++ /dev/null @@ -1 +0,0 @@ -v1 6de4c83901df908f92fef5465a80ee5f791596102ae6cbae77e5c3ef1318597b faa6ed64e4fcc05c10716de470e71d526d2ad2ee5cd39908a9f0c1d8a0b7dbc1 961 1775136286925526889 diff --git a/.cache/go-build/6e/6e08903b6c49b29bc05003eb3ad8031b018f346c88ae5d221d2dbaf24a435251-a b/.cache/go-build/6e/6e08903b6c49b29bc05003eb3ad8031b018f346c88ae5d221d2dbaf24a435251-a deleted file mode 100644 index 7c78f62..0000000 --- a/.cache/go-build/6e/6e08903b6c49b29bc05003eb3ad8031b018f346c88ae5d221d2dbaf24a435251-a +++ /dev/null @@ -1 +0,0 @@ -v1 6e08903b6c49b29bc05003eb3ad8031b018f346c88ae5d221d2dbaf24a435251 9f93f235075090f20c67a6581cd76b936e91f1968e64a28111bdddc92c9cc219 58 1775136288463774289 diff --git a/.cache/go-build/6e/6e4d6ca4c13063e769833b2e755a575ad84ae005fcbacdc8a82ebffd349aadcd-a b/.cache/go-build/6e/6e4d6ca4c13063e769833b2e755a575ad84ae005fcbacdc8a82ebffd349aadcd-a deleted file mode 100644 index 525e574..0000000 --- a/.cache/go-build/6e/6e4d6ca4c13063e769833b2e755a575ad84ae005fcbacdc8a82ebffd349aadcd-a +++ /dev/null @@ -1 +0,0 @@ -v1 6e4d6ca4c13063e769833b2e755a575ad84ae005fcbacdc8a82ebffd349aadcd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289116373176 diff --git a/.cache/go-build/6e/6e7c31280d1e33d3041e347d9af8edd4c909a5f49c87f4fbb295262ee42d4c72-d b/.cache/go-build/6e/6e7c31280d1e33d3041e347d9af8edd4c909a5f49c87f4fbb295262ee42d4c72-d deleted file mode 100644 index 786634b..0000000 Binary files a/.cache/go-build/6e/6e7c31280d1e33d3041e347d9af8edd4c909a5f49c87f4fbb295262ee42d4c72-d and /dev/null differ diff --git a/.cache/go-build/6e/6eb09056f12233d912516951528053a9cfc0b7d48d7a4ee0ae94dd7ae5165481-d b/.cache/go-build/6e/6eb09056f12233d912516951528053a9cfc0b7d48d7a4ee0ae94dd7ae5165481-d deleted file mode 100644 index 1c1d9b8..0000000 Binary files a/.cache/go-build/6e/6eb09056f12233d912516951528053a9cfc0b7d48d7a4ee0ae94dd7ae5165481-d and /dev/null differ diff --git a/.cache/go-build/6e/6ed32b3e8bdf3c6adbfd8109fee0b3c69eaea24363392ab1b87525f7b3dd1886-a b/.cache/go-build/6e/6ed32b3e8bdf3c6adbfd8109fee0b3c69eaea24363392ab1b87525f7b3dd1886-a deleted file mode 100644 index 6515138..0000000 --- a/.cache/go-build/6e/6ed32b3e8bdf3c6adbfd8109fee0b3c69eaea24363392ab1b87525f7b3dd1886-a +++ /dev/null @@ -1 +0,0 @@ -v1 6ed32b3e8bdf3c6adbfd8109fee0b3c69eaea24363392ab1b87525f7b3dd1886 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288664103553 diff --git a/.cache/go-build/6f/6f454da3d9c97e63dbbc76818f3fb4dd06375fe7b7bb0d98ebef4780f332d18e-d b/.cache/go-build/6f/6f454da3d9c97e63dbbc76818f3fb4dd06375fe7b7bb0d98ebef4780f332d18e-d deleted file mode 100644 index 57fd755..0000000 --- a/.cache/go-build/6f/6f454da3d9c97e63dbbc76818f3fb4dd06375fe7b7bb0d98ebef4780f332d18e-d +++ /dev/null @@ -1,24 +0,0 @@ -./copy_file_range_linux.go -./copy_file_range_unix.go -./errno_unix.go -./fd.go -./fd_fsync_posix.go -./fd_mutex.go -./fd_poll_runtime.go -./fd_posix.go -./fd_unix.go -./fd_unixjs.go -./fd_writev_unix.go -./fstatat_unix.go -./hook_cloexec.go -./hook_unix.go -./iovec_unix.go -./sendfile.go -./sendfile_unix.go -./sock_cloexec.go -./sockopt.go -./sockopt_linux.go -./sockopt_unix.go -./sockoptip.go -./splice_linux.go -./writev.go diff --git a/.cache/go-build/6f/6fb2b7fca6db292b10b6f605b01097ead0cbc3ecf061f4bc88013bf46772fe19-a b/.cache/go-build/6f/6fb2b7fca6db292b10b6f605b01097ead0cbc3ecf061f4bc88013bf46772fe19-a deleted file mode 100644 index 63a4f12..0000000 --- a/.cache/go-build/6f/6fb2b7fca6db292b10b6f605b01097ead0cbc3ecf061f4bc88013bf46772fe19-a +++ /dev/null @@ -1 +0,0 @@ -v1 6fb2b7fca6db292b10b6f605b01097ead0cbc3ecf061f4bc88013bf46772fe19 0af6c119dfb70f4f8fc24e429bb217263807553cf540a0ca1e836aed3d89bccd 9 1775139398415907829 diff --git a/.cache/go-build/6f/6fcc1ab9025ea51a520c8c549c5f5a214f818882e82ef974e79856f768b30abe-a b/.cache/go-build/6f/6fcc1ab9025ea51a520c8c549c5f5a214f818882e82ef974e79856f768b30abe-a deleted file mode 100644 index f568679..0000000 --- a/.cache/go-build/6f/6fcc1ab9025ea51a520c8c549c5f5a214f818882e82ef974e79856f768b30abe-a +++ /dev/null @@ -1 +0,0 @@ -v1 6fcc1ab9025ea51a520c8c549c5f5a214f818882e82ef974e79856f768b30abe e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287071728374 diff --git a/.cache/go-build/70/70133e281031c7022f541793c3db86dca35c8185892ba86b90a134e409ed3e73-a b/.cache/go-build/70/70133e281031c7022f541793c3db86dca35c8185892ba86b90a134e409ed3e73-a deleted file mode 100644 index 6ecc5b4..0000000 --- a/.cache/go-build/70/70133e281031c7022f541793c3db86dca35c8185892ba86b90a134e409ed3e73-a +++ /dev/null @@ -1 +0,0 @@ -v1 70133e281031c7022f541793c3db86dca35c8185892ba86b90a134e409ed3e73 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287187391906 diff --git a/.cache/go-build/70/7042f2a57a7203f5fcedd065f1b3d6722bf83348a6739966383d28deb1f7ad5f-a b/.cache/go-build/70/7042f2a57a7203f5fcedd065f1b3d6722bf83348a6739966383d28deb1f7ad5f-a deleted file mode 100644 index b02d6c7..0000000 --- a/.cache/go-build/70/7042f2a57a7203f5fcedd065f1b3d6722bf83348a6739966383d28deb1f7ad5f-a +++ /dev/null @@ -1 +0,0 @@ -v1 7042f2a57a7203f5fcedd065f1b3d6722bf83348a6739966383d28deb1f7ad5f d78fc870752a5d80dd97aa8430c736a217613d2fcd5732043525238474f25ace 76 1775137721997991362 diff --git a/.cache/go-build/70/70507f1b9f2d9be6d457b836c912beeb5e8475c3e8256404e04faadfc4657bd6-d b/.cache/go-build/70/70507f1b9f2d9be6d457b836c912beeb5e8475c3e8256404e04faadfc4657bd6-d deleted file mode 100644 index 6de718f..0000000 Binary files a/.cache/go-build/70/70507f1b9f2d9be6d457b836c912beeb5e8475c3e8256404e04faadfc4657bd6-d and /dev/null differ diff --git a/.cache/go-build/70/70a02d1e0cc69f7a1c327425e281c99fcface916b9284af426766c9d25dcb24e-a b/.cache/go-build/70/70a02d1e0cc69f7a1c327425e281c99fcface916b9284af426766c9d25dcb24e-a deleted file mode 100644 index df8906c..0000000 --- a/.cache/go-build/70/70a02d1e0cc69f7a1c327425e281c99fcface916b9284af426766c9d25dcb24e-a +++ /dev/null @@ -1 +0,0 @@ -v1 70a02d1e0cc69f7a1c327425e281c99fcface916b9284af426766c9d25dcb24e 9832e5cdf3752595cb1514c0f6f64f09bee247847ba6dc6d0a1fa43e28c20ec5 803042 1775136287225255953 diff --git a/.cache/go-build/71/710bb5d6ffcec645c3fa0926bf2d0758e83ed8fef84e18b6daeb3581d6fb38c2-a b/.cache/go-build/71/710bb5d6ffcec645c3fa0926bf2d0758e83ed8fef84e18b6daeb3581d6fb38c2-a deleted file mode 100644 index 8f866d2..0000000 --- a/.cache/go-build/71/710bb5d6ffcec645c3fa0926bf2d0758e83ed8fef84e18b6daeb3581d6fb38c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 710bb5d6ffcec645c3fa0926bf2d0758e83ed8fef84e18b6daeb3581d6fb38c2 7a3264a50238aca98da337aee7dc033696338b37cefc83ec0ec5763222cced6b 2262 1775136286815085760 diff --git a/.cache/go-build/71/71d939afc6e0d2b4965766bee668d3bb7834c0b43985e41ccd33ca0897582ca1-a b/.cache/go-build/71/71d939afc6e0d2b4965766bee668d3bb7834c0b43985e41ccd33ca0897582ca1-a deleted file mode 100644 index a8085c9..0000000 --- a/.cache/go-build/71/71d939afc6e0d2b4965766bee668d3bb7834c0b43985e41ccd33ca0897582ca1-a +++ /dev/null @@ -1 +0,0 @@ -v1 71d939afc6e0d2b4965766bee668d3bb7834c0b43985e41ccd33ca0897582ca1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289501133021 diff --git a/.cache/go-build/72/7234e66cc0cbc2b8c8da31740c3a5fa703136deeb9b757ba2bfe6b9248495d03-a b/.cache/go-build/72/7234e66cc0cbc2b8c8da31740c3a5fa703136deeb9b757ba2bfe6b9248495d03-a deleted file mode 100644 index e67e2d2..0000000 --- a/.cache/go-build/72/7234e66cc0cbc2b8c8da31740c3a5fa703136deeb9b757ba2bfe6b9248495d03-a +++ /dev/null @@ -1 +0,0 @@ -v1 7234e66cc0cbc2b8c8da31740c3a5fa703136deeb9b757ba2bfe6b9248495d03 6f454da3d9c97e63dbbc76818f3fb4dd06375fe7b7bb0d98ebef4780f332d18e 407 1775136289054184132 diff --git a/.cache/go-build/72/723ea7b710b6363425c48b98897dee458dca0c6c5fc8560ab4346b20de38a136-a b/.cache/go-build/72/723ea7b710b6363425c48b98897dee458dca0c6c5fc8560ab4346b20de38a136-a deleted file mode 100644 index 1de9c95..0000000 --- a/.cache/go-build/72/723ea7b710b6363425c48b98897dee458dca0c6c5fc8560ab4346b20de38a136-a +++ /dev/null @@ -1 +0,0 @@ -v1 723ea7b710b6363425c48b98897dee458dca0c6c5fc8560ab4346b20de38a136 b0e55ed25f5c5d075a228075e993a38661836d6cd93f89cd248e14bff3f9d644 1283 1775136286827044269 diff --git a/.cache/go-build/72/7268825a631adbbde072cfbf30e0e8fc35078e90f1a38c9d4e53c206e2039f41-d b/.cache/go-build/72/7268825a631adbbde072cfbf30e0e8fc35078e90f1a38c9d4e53c206e2039f41-d deleted file mode 100644 index 4d4674e..0000000 --- a/.cache/go-build/72/7268825a631adbbde072cfbf30e0e8fc35078e90f1a38c9d4e53c206e2039f41-d +++ /dev/null @@ -1,2 +0,0 @@ -./gunzip.go -./gzip.go diff --git a/.cache/go-build/72/72689418ca60b5af60179143af25f8800f04f8ed61ff6026f6d5fea663dc5cfc-a b/.cache/go-build/72/72689418ca60b5af60179143af25f8800f04f8ed61ff6026f6d5fea663dc5cfc-a deleted file mode 100644 index 6678d6e..0000000 --- a/.cache/go-build/72/72689418ca60b5af60179143af25f8800f04f8ed61ff6026f6d5fea663dc5cfc-a +++ /dev/null @@ -1 +0,0 @@ -v1 72689418ca60b5af60179143af25f8800f04f8ed61ff6026f6d5fea663dc5cfc e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287028594393 diff --git a/.cache/go-build/72/726e07f2b50f19f81cee950333ad6fb3728284119c3073428fa60d3693dfdaa1-a b/.cache/go-build/72/726e07f2b50f19f81cee950333ad6fb3728284119c3073428fa60d3693dfdaa1-a deleted file mode 100644 index ded56ab..0000000 --- a/.cache/go-build/72/726e07f2b50f19f81cee950333ad6fb3728284119c3073428fa60d3693dfdaa1-a +++ /dev/null @@ -1 +0,0 @@ -v1 726e07f2b50f19f81cee950333ad6fb3728284119c3073428fa60d3693dfdaa1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287086655154 diff --git a/.cache/go-build/72/72716d653889573250a08e90f1af9f77ccdc6dca9b22880b3ea14f02db0c834b-a b/.cache/go-build/72/72716d653889573250a08e90f1af9f77ccdc6dca9b22880b3ea14f02db0c834b-a deleted file mode 100644 index c654e9d..0000000 --- a/.cache/go-build/72/72716d653889573250a08e90f1af9f77ccdc6dca9b22880b3ea14f02db0c834b-a +++ /dev/null @@ -1 +0,0 @@ -v1 72716d653889573250a08e90f1af9f77ccdc6dca9b22880b3ea14f02db0c834b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286921861516 diff --git a/.cache/go-build/72/72ce4f4ab52370078ef1a79a99d124856d345d7118793d68d474058b47eae05e-a b/.cache/go-build/72/72ce4f4ab52370078ef1a79a99d124856d345d7118793d68d474058b47eae05e-a deleted file mode 100644 index af37e0b..0000000 --- a/.cache/go-build/72/72ce4f4ab52370078ef1a79a99d124856d345d7118793d68d474058b47eae05e-a +++ /dev/null @@ -1 +0,0 @@ -v1 72ce4f4ab52370078ef1a79a99d124856d345d7118793d68d474058b47eae05e 092d9b978d7817d355ed4163930eeefcb9d5005e886cbb17d312e4a60f9f718f 7940 1775136286933642025 diff --git a/.cache/go-build/73/734fd31aeb5abee54cc2be9b674ae141905b1d7d8bcf93448d9463947ce4f4d2-a b/.cache/go-build/73/734fd31aeb5abee54cc2be9b674ae141905b1d7d8bcf93448d9463947ce4f4d2-a deleted file mode 100644 index 3822290..0000000 --- a/.cache/go-build/73/734fd31aeb5abee54cc2be9b674ae141905b1d7d8bcf93448d9463947ce4f4d2-a +++ /dev/null @@ -1 +0,0 @@ -v1 734fd31aeb5abee54cc2be9b674ae141905b1d7d8bcf93448d9463947ce4f4d2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139428913584502 diff --git a/.cache/go-build/73/7379fec483207b33e812b4a95e10930ece76cafd510ec6c69c70a9837c0884f3-a b/.cache/go-build/73/7379fec483207b33e812b4a95e10930ece76cafd510ec6c69c70a9837c0884f3-a deleted file mode 100644 index 5dd42a6..0000000 --- a/.cache/go-build/73/7379fec483207b33e812b4a95e10930ece76cafd510ec6c69c70a9837c0884f3-a +++ /dev/null @@ -1 +0,0 @@ -v1 7379fec483207b33e812b4a95e10930ece76cafd510ec6c69c70a9837c0884f3 f6060cd2cb84196f324d65bb025e416e605dadae8a7e1ba789f554fe58a29c55 356 1775136286819839173 diff --git a/.cache/go-build/73/73b5693caadb11d0fcfa6c82878c4295168a65d417abf5fb8dcff41e1bce6cb1-a b/.cache/go-build/73/73b5693caadb11d0fcfa6c82878c4295168a65d417abf5fb8dcff41e1bce6cb1-a deleted file mode 100644 index abb17ca..0000000 --- a/.cache/go-build/73/73b5693caadb11d0fcfa6c82878c4295168a65d417abf5fb8dcff41e1bce6cb1-a +++ /dev/null @@ -1 +0,0 @@ -v1 73b5693caadb11d0fcfa6c82878c4295168a65d417abf5fb8dcff41e1bce6cb1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139428952482020 diff --git a/.cache/go-build/73/73c3f09ec06f4b6548a1958683e153efcd112d485f59a89eee765a6b301608f0-a b/.cache/go-build/73/73c3f09ec06f4b6548a1958683e153efcd112d485f59a89eee765a6b301608f0-a deleted file mode 100644 index 7b4fa7e..0000000 --- a/.cache/go-build/73/73c3f09ec06f4b6548a1958683e153efcd112d485f59a89eee765a6b301608f0-a +++ /dev/null @@ -1 +0,0 @@ -v1 73c3f09ec06f4b6548a1958683e153efcd112d485f59a89eee765a6b301608f0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287025903541 diff --git a/.cache/go-build/73/73d1013b2483daaf40025b249abb6e330b0e9fc7f4c8ffc735943551344afe95-d b/.cache/go-build/73/73d1013b2483daaf40025b249abb6e330b0e9fc7f4c8ffc735943551344afe95-d deleted file mode 100644 index a56e32e..0000000 Binary files a/.cache/go-build/73/73d1013b2483daaf40025b249abb6e330b0e9fc7f4c8ffc735943551344afe95-d and /dev/null differ diff --git a/.cache/go-build/74/7410ad16f370a673ff27cab97bfefef869caa3d5314c3504be00b9c7c79eceed-a b/.cache/go-build/74/7410ad16f370a673ff27cab97bfefef869caa3d5314c3504be00b9c7c79eceed-a deleted file mode 100644 index 1def1b9..0000000 --- a/.cache/go-build/74/7410ad16f370a673ff27cab97bfefef869caa3d5314c3504be00b9c7c79eceed-a +++ /dev/null @@ -1 +0,0 @@ -v1 7410ad16f370a673ff27cab97bfefef869caa3d5314c3504be00b9c7c79eceed 19fadaa6b43a2717cb7e20e68e89c01a110dbe0035640e2ea7cb59f624fa91dc 24918 1775139461351909504 diff --git a/.cache/go-build/74/7436c4f5fb8bed0d68760fbc14f3ab2a1c075b5be03bf24af965b23c23aed393-a b/.cache/go-build/74/7436c4f5fb8bed0d68760fbc14f3ab2a1c075b5be03bf24af965b23c23aed393-a deleted file mode 100644 index 5449a7a..0000000 --- a/.cache/go-build/74/7436c4f5fb8bed0d68760fbc14f3ab2a1c075b5be03bf24af965b23c23aed393-a +++ /dev/null @@ -1 +0,0 @@ -v1 7436c4f5fb8bed0d68760fbc14f3ab2a1c075b5be03bf24af965b23c23aed393 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289113091644 diff --git a/.cache/go-build/74/744774468126b180fc0eea8aff96e926d2e93f4062386b54e6a1e9267da4eaba-a b/.cache/go-build/74/744774468126b180fc0eea8aff96e926d2e93f4062386b54e6a1e9267da4eaba-a deleted file mode 100644 index f8700ef..0000000 --- a/.cache/go-build/74/744774468126b180fc0eea8aff96e926d2e93f4062386b54e6a1e9267da4eaba-a +++ /dev/null @@ -1 +0,0 @@ -v1 744774468126b180fc0eea8aff96e926d2e93f4062386b54e6a1e9267da4eaba 93376bbec60c19af886b71f7eae843bd04bb9aafec6139fb51f1f7be0b4ebe7a 627 1775138183971095781 diff --git a/.cache/go-build/74/746038f16df4c4d101b5788219021872913fceb46990450745fbcf69d354f9d9-a b/.cache/go-build/74/746038f16df4c4d101b5788219021872913fceb46990450745fbcf69d354f9d9-a deleted file mode 100644 index 03fa090..0000000 --- a/.cache/go-build/74/746038f16df4c4d101b5788219021872913fceb46990450745fbcf69d354f9d9-a +++ /dev/null @@ -1 +0,0 @@ -v1 746038f16df4c4d101b5788219021872913fceb46990450745fbcf69d354f9d9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286989806935 diff --git a/.cache/go-build/74/749be57377560f62ce0d63767e5dec39f4718a9ffc76dfe819f57afd1d325714-a b/.cache/go-build/74/749be57377560f62ce0d63767e5dec39f4718a9ffc76dfe819f57afd1d325714-a deleted file mode 100644 index 83bca94..0000000 --- a/.cache/go-build/74/749be57377560f62ce0d63767e5dec39f4718a9ffc76dfe819f57afd1d325714-a +++ /dev/null @@ -1 +0,0 @@ -v1 749be57377560f62ce0d63767e5dec39f4718a9ffc76dfe819f57afd1d325714 ac24b812fb8bb5fcdd0073c67a612fb929d2f6d1225b3efa39028f3f5cc7ecd6 79 1775138184261089938 diff --git a/.cache/go-build/74/74ebd537f66caa7f9ee79c06f9b8309610e7f32cbcbd2d2a30b6645612909f57-d b/.cache/go-build/74/74ebd537f66caa7f9ee79c06f9b8309610e7f32cbcbd2d2a30b6645612909f57-d deleted file mode 100644 index afc13e3..0000000 Binary files a/.cache/go-build/74/74ebd537f66caa7f9ee79c06f9b8309610e7f32cbcbd2d2a30b6645612909f57-d and /dev/null differ diff --git a/.cache/go-build/74/74fd49e4e9c7b8339948f291ff1d1aec17f0f3a85dc3bf86c7f47258586cc9a4-a b/.cache/go-build/74/74fd49e4e9c7b8339948f291ff1d1aec17f0f3a85dc3bf86c7f47258586cc9a4-a deleted file mode 100644 index 5befe9f..0000000 --- a/.cache/go-build/74/74fd49e4e9c7b8339948f291ff1d1aec17f0f3a85dc3bf86c7f47258586cc9a4-a +++ /dev/null @@ -1 +0,0 @@ -v1 74fd49e4e9c7b8339948f291ff1d1aec17f0f3a85dc3bf86c7f47258586cc9a4 70507f1b9f2d9be6d457b836c912beeb5e8475c3e8256404e04faadfc4657bd6 443 1775136286949770156 diff --git a/.cache/go-build/75/750050e75cc81d2fb326e56db4cefa2ec0efa6df87ef3c1d6907859a8e43bec8-d b/.cache/go-build/75/750050e75cc81d2fb326e56db4cefa2ec0efa6df87ef3c1d6907859a8e43bec8-d deleted file mode 100644 index 15507cf..0000000 Binary files a/.cache/go-build/75/750050e75cc81d2fb326e56db4cefa2ec0efa6df87ef3c1d6907859a8e43bec8-d and /dev/null differ diff --git a/.cache/go-build/75/753ae4a0f3218999a9fa4e1cf5e7140b0cf888b4631aa1978f2159f53d491191-d b/.cache/go-build/75/753ae4a0f3218999a9fa4e1cf5e7140b0cf888b4631aa1978f2159f53d491191-d deleted file mode 100644 index d6317de..0000000 Binary files a/.cache/go-build/75/753ae4a0f3218999a9fa4e1cf5e7140b0cf888b4631aa1978f2159f53d491191-d and /dev/null differ diff --git a/.cache/go-build/75/756a02f86550896cab6522dccdad316e36f863aaee53a46dee8a6599f15c01a3-a b/.cache/go-build/75/756a02f86550896cab6522dccdad316e36f863aaee53a46dee8a6599f15c01a3-a deleted file mode 100644 index d5c2d85..0000000 --- a/.cache/go-build/75/756a02f86550896cab6522dccdad316e36f863aaee53a46dee8a6599f15c01a3-a +++ /dev/null @@ -1 +0,0 @@ -v1 756a02f86550896cab6522dccdad316e36f863aaee53a46dee8a6599f15c01a3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289123234321 diff --git a/.cache/go-build/76/7631f4c59a14f4a15a00dc48e5f20841d525007cbb6145f0795995c6194a1525-a b/.cache/go-build/76/7631f4c59a14f4a15a00dc48e5f20841d525007cbb6145f0795995c6194a1525-a deleted file mode 100644 index 03a1389..0000000 --- a/.cache/go-build/76/7631f4c59a14f4a15a00dc48e5f20841d525007cbb6145f0795995c6194a1525-a +++ /dev/null @@ -1 +0,0 @@ -v1 7631f4c59a14f4a15a00dc48e5f20841d525007cbb6145f0795995c6194a1525 846253744f6e7eeb857c924209fd444008e50ace3a6922ab155e057467cfdd17 3164 1775136286917168433 diff --git a/.cache/go-build/76/763ede75709e39969804c657713ec378ee2aee5f3bb26350a65cc38714d46034-d b/.cache/go-build/76/763ede75709e39969804c657713ec378ee2aee5f3bb26350a65cc38714d46034-d deleted file mode 100644 index 08354d9..0000000 Binary files a/.cache/go-build/76/763ede75709e39969804c657713ec378ee2aee5f3bb26350a65cc38714d46034-d and /dev/null differ diff --git a/.cache/go-build/76/76693e42b06f30b1f15b7b46e106fef62ef9d78ad7b0b7d046312877c4e639e6-a b/.cache/go-build/76/76693e42b06f30b1f15b7b46e106fef62ef9d78ad7b0b7d046312877c4e639e6-a deleted file mode 100644 index 34c201f..0000000 --- a/.cache/go-build/76/76693e42b06f30b1f15b7b46e106fef62ef9d78ad7b0b7d046312877c4e639e6-a +++ /dev/null @@ -1 +0,0 @@ -v1 76693e42b06f30b1f15b7b46e106fef62ef9d78ad7b0b7d046312877c4e639e6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286926059279 diff --git a/.cache/go-build/76/76751f11aa3860dc347162c421e768b7aa5d4ed2ebc3bb7c9aab4eb342d97ce7-a b/.cache/go-build/76/76751f11aa3860dc347162c421e768b7aa5d4ed2ebc3bb7c9aab4eb342d97ce7-a deleted file mode 100644 index ac42fc0..0000000 --- a/.cache/go-build/76/76751f11aa3860dc347162c421e768b7aa5d4ed2ebc3bb7c9aab4eb342d97ce7-a +++ /dev/null @@ -1 +0,0 @@ -v1 76751f11aa3860dc347162c421e768b7aa5d4ed2ebc3bb7c9aab4eb342d97ce7 e80fa97d0b1504a6a9a0ec29be1cf6598a900f8483fc139e9c3d7524223a152e 9 1775137721850084166 diff --git a/.cache/go-build/76/76a190657ccd0db4615b611531fbb450d13fbb39c0fbe2bc7fbedf902686667d-d b/.cache/go-build/76/76a190657ccd0db4615b611531fbb450d13fbb39c0fbe2bc7fbedf902686667d-d deleted file mode 100644 index 6812af1..0000000 --- a/.cache/go-build/76/76a190657ccd0db4615b611531fbb450d13fbb39c0fbe2bc7fbedf902686667d-d +++ /dev/null @@ -1 +0,0 @@ -./flag.go diff --git a/.cache/go-build/77/7702a634771dd36e89ef892c53bafad55d5ef088971d0ac9568e8a86cd6ab562-d b/.cache/go-build/77/7702a634771dd36e89ef892c53bafad55d5ef088971d0ac9568e8a86cd6ab562-d deleted file mode 100644 index 48e7117..0000000 Binary files a/.cache/go-build/77/7702a634771dd36e89ef892c53bafad55d5ef088971d0ac9568e8a86cd6ab562-d and /dev/null differ diff --git a/.cache/go-build/77/7708844f748e746f76f4da2b1fb88474afbdb77350fa1b146ba4a0a5544d0574-a b/.cache/go-build/77/7708844f748e746f76f4da2b1fb88474afbdb77350fa1b146ba4a0a5544d0574-a deleted file mode 100644 index 930afe9..0000000 --- a/.cache/go-build/77/7708844f748e746f76f4da2b1fb88474afbdb77350fa1b146ba4a0a5544d0574-a +++ /dev/null @@ -1 +0,0 @@ -v1 7708844f748e746f76f4da2b1fb88474afbdb77350fa1b146ba4a0a5544d0574 3d3c63f18ac0e155ddcfb3d5efd2e9d0be8c9323554f7cf603fd9a2875ceb6e6 73 1775136290022454244 diff --git a/.cache/go-build/77/7715cd3fa5587f610a8884198015b3cec0b6fa674b0d1d0c13bf539c580efa12-a b/.cache/go-build/77/7715cd3fa5587f610a8884198015b3cec0b6fa674b0d1d0c13bf539c580efa12-a deleted file mode 100644 index 48756e5..0000000 --- a/.cache/go-build/77/7715cd3fa5587f610a8884198015b3cec0b6fa674b0d1d0c13bf539c580efa12-a +++ /dev/null @@ -1 +0,0 @@ -v1 7715cd3fa5587f610a8884198015b3cec0b6fa674b0d1d0c13bf539c580efa12 3f364b921f710b73045983d7e4cad6b341298c25d06e941526aaac05a4885242 578256 1775136288518910749 diff --git a/.cache/go-build/77/7724c885d8a018cdb3fe0cc51ca5fd4b63d9048226125f727e035a30ad17f8f4-d b/.cache/go-build/77/7724c885d8a018cdb3fe0cc51ca5fd4b63d9048226125f727e035a30ad17f8f4-d deleted file mode 100644 index ac45be8..0000000 Binary files a/.cache/go-build/77/7724c885d8a018cdb3fe0cc51ca5fd4b63d9048226125f727e035a30ad17f8f4-d and /dev/null differ diff --git a/.cache/go-build/78/78103ac79c02bc3a95f8132325182752f98da04207776da7f68b9e66453e3eb1-a b/.cache/go-build/78/78103ac79c02bc3a95f8132325182752f98da04207776da7f68b9e66453e3eb1-a deleted file mode 100644 index 96489ef..0000000 --- a/.cache/go-build/78/78103ac79c02bc3a95f8132325182752f98da04207776da7f68b9e66453e3eb1-a +++ /dev/null @@ -1 +0,0 @@ -v1 78103ac79c02bc3a95f8132325182752f98da04207776da7f68b9e66453e3eb1 322aca18a13d9037c5ca3dfb2ad5e23e043e844044bcd4b902b31f0cba8cf349 6657 1775136286912785640 diff --git a/.cache/go-build/78/78200c95f76add2c08776142287bd0a44e61fe2f60026ee46c6e82213f63d208-a b/.cache/go-build/78/78200c95f76add2c08776142287bd0a44e61fe2f60026ee46c6e82213f63d208-a deleted file mode 100644 index 2579b47..0000000 --- a/.cache/go-build/78/78200c95f76add2c08776142287bd0a44e61fe2f60026ee46c6e82213f63d208-a +++ /dev/null @@ -1 +0,0 @@ -v1 78200c95f76add2c08776142287bd0a44e61fe2f60026ee46c6e82213f63d208 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184146030216 diff --git a/.cache/go-build/78/783a2aaa6c00baf62fe876c24f82e4e464827b0fda6601580699d0392194df8c-d b/.cache/go-build/78/783a2aaa6c00baf62fe876c24f82e4e464827b0fda6601580699d0392194df8c-d deleted file mode 100644 index dccc235..0000000 Binary files a/.cache/go-build/78/783a2aaa6c00baf62fe876c24f82e4e464827b0fda6601580699d0392194df8c-d and /dev/null differ diff --git a/.cache/go-build/78/7855fb1eee635bbeee34f5f4f0cdbdf1347ef4f17dd0aff5957781035dfe299e-d b/.cache/go-build/78/7855fb1eee635bbeee34f5f4f0cdbdf1347ef4f17dd0aff5957781035dfe299e-d deleted file mode 100644 index e586625..0000000 Binary files a/.cache/go-build/78/7855fb1eee635bbeee34f5f4f0cdbdf1347ef4f17dd0aff5957781035dfe299e-d and /dev/null differ diff --git a/.cache/go-build/78/78cd746a92ed3cac437f67d0295dcbaf596ca81979f6127302c7ec31895962d3-a b/.cache/go-build/78/78cd746a92ed3cac437f67d0295dcbaf596ca81979f6127302c7ec31895962d3-a deleted file mode 100644 index a7d249b..0000000 --- a/.cache/go-build/78/78cd746a92ed3cac437f67d0295dcbaf596ca81979f6127302c7ec31895962d3-a +++ /dev/null @@ -1 +0,0 @@ -v1 78cd746a92ed3cac437f67d0295dcbaf596ca81979f6127302c7ec31895962d3 e5e9ff618c1b3ff3da7ac8317afa4cd98bff49372c656c09816bff58f623ddb1 19341 1775138184265845212 diff --git a/.cache/go-build/78/78d9e6aa5b4f3afce0c9a943f163fb8326e3c5fed095e7ede85a959104c0cfa7-a b/.cache/go-build/78/78d9e6aa5b4f3afce0c9a943f163fb8326e3c5fed095e7ede85a959104c0cfa7-a deleted file mode 100644 index a28004d..0000000 --- a/.cache/go-build/78/78d9e6aa5b4f3afce0c9a943f163fb8326e3c5fed095e7ede85a959104c0cfa7-a +++ /dev/null @@ -1 +0,0 @@ -v1 78d9e6aa5b4f3afce0c9a943f163fb8326e3c5fed095e7ede85a959104c0cfa7 e5e9ff618c1b3ff3da7ac8317afa4cd98bff49372c656c09816bff58f623ddb1 19341 1775138184265748192 diff --git a/.cache/go-build/79/791199b6ec857bc425c2ed97e604468ce7e32074fd551441134a440658285c39-a b/.cache/go-build/79/791199b6ec857bc425c2ed97e604468ce7e32074fd551441134a440658285c39-a deleted file mode 100644 index 5f456aa..0000000 --- a/.cache/go-build/79/791199b6ec857bc425c2ed97e604468ce7e32074fd551441134a440658285c39-a +++ /dev/null @@ -1 +0,0 @@ -v1 791199b6ec857bc425c2ed97e604468ce7e32074fd551441134a440658285c39 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289633167826 diff --git a/.cache/go-build/79/792b7d35267ce4fb5e34288ea338d6d76ce7252ff88418bbc6cfc6ffbae802f2-a b/.cache/go-build/79/792b7d35267ce4fb5e34288ea338d6d76ce7252ff88418bbc6cfc6ffbae802f2-a deleted file mode 100644 index 379ba4c..0000000 --- a/.cache/go-build/79/792b7d35267ce4fb5e34288ea338d6d76ce7252ff88418bbc6cfc6ffbae802f2-a +++ /dev/null @@ -1 +0,0 @@ -v1 792b7d35267ce4fb5e34288ea338d6d76ce7252ff88418bbc6cfc6ffbae802f2 fc40abd0343f9a80c5b3dab549574858d22f9d70262ed2d3a847fdb54e3e303e 12 1775136288463677479 diff --git a/.cache/go-build/79/7952cb35378a9252c38c53ced5d24d88ad1f50f4868b0ec367f1ca2309d5e129-a b/.cache/go-build/79/7952cb35378a9252c38c53ced5d24d88ad1f50f4868b0ec367f1ca2309d5e129-a deleted file mode 100644 index e77c1d2..0000000 --- a/.cache/go-build/79/7952cb35378a9252c38c53ced5d24d88ad1f50f4868b0ec367f1ca2309d5e129-a +++ /dev/null @@ -1 +0,0 @@ -v1 7952cb35378a9252c38c53ced5d24d88ad1f50f4868b0ec367f1ca2309d5e129 ad4b54e9486893379616e0b191f238c839c864f2f2873152ab091e7cb338dffd 75350 1775136286993533758 diff --git a/.cache/go-build/79/798b43fcc423376c304fcd417a4c417c64247e63f32b4cfb6304e168cff7e284-d b/.cache/go-build/79/798b43fcc423376c304fcd417a4c417c64247e63f32b4cfb6304e168cff7e284-d deleted file mode 100644 index 977a0a8..0000000 Binary files a/.cache/go-build/79/798b43fcc423376c304fcd417a4c417c64247e63f32b4cfb6304e168cff7e284-d and /dev/null differ diff --git a/.cache/go-build/79/79945811085a9cd79738c8d41056d0073a22c1edd8c1acc0ab9345ff7a8c8363-d b/.cache/go-build/79/79945811085a9cd79738c8d41056d0073a22c1edd8c1acc0ab9345ff7a8c8363-d deleted file mode 100644 index 4f01173..0000000 Binary files a/.cache/go-build/79/79945811085a9cd79738c8d41056d0073a22c1edd8c1acc0ab9345ff7a8c8363-d and /dev/null differ diff --git a/.cache/go-build/79/79964c71109820f29167e6d46ad27ed5cc863afe68b6abf6d575c4015bafffb2-a b/.cache/go-build/79/79964c71109820f29167e6d46ad27ed5cc863afe68b6abf6d575c4015bafffb2-a deleted file mode 100644 index 4aed8f3..0000000 --- a/.cache/go-build/79/79964c71109820f29167e6d46ad27ed5cc863afe68b6abf6d575c4015bafffb2-a +++ /dev/null @@ -1 +0,0 @@ -v1 79964c71109820f29167e6d46ad27ed5cc863afe68b6abf6d575c4015bafffb2 f4b284b76bd5beb87d2ce6d7578052f25cc1cdeea4db1f1a2c5bf5c802aba7a2 1032592 1775137722072538955 diff --git a/.cache/go-build/7a/7a1c44a11969b2cde317a86d8fd7d7c53d1a5e460fc5c40662561c747e816144-d b/.cache/go-build/7a/7a1c44a11969b2cde317a86d8fd7d7c53d1a5e460fc5c40662561c747e816144-d deleted file mode 100644 index f4a0db0..0000000 --- a/.cache/go-build/7a/7a1c44a11969b2cde317a86d8fd7d7c53d1a5e460fc5c40662561c747e816144-d +++ /dev/null @@ -1 +0,0 @@ -./rtcov.go diff --git a/.cache/go-build/7a/7a1f72518b61beda61178a0f418dd22bd2d4fc1557bc153bcce663637bc0c316-a b/.cache/go-build/7a/7a1f72518b61beda61178a0f418dd22bd2d4fc1557bc153bcce663637bc0c316-a deleted file mode 100644 index f955856..0000000 --- a/.cache/go-build/7a/7a1f72518b61beda61178a0f418dd22bd2d4fc1557bc153bcce663637bc0c316-a +++ /dev/null @@ -1 +0,0 @@ -v1 7a1f72518b61beda61178a0f418dd22bd2d4fc1557bc153bcce663637bc0c316 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722022325600 diff --git a/.cache/go-build/7a/7a29534d64dc2dd14c4341681a2217c55faf305f9253b665025f06b692b9a722-d b/.cache/go-build/7a/7a29534d64dc2dd14c4341681a2217c55faf305f9253b665025f06b692b9a722-d deleted file mode 100644 index ba28027..0000000 Binary files a/.cache/go-build/7a/7a29534d64dc2dd14c4341681a2217c55faf305f9253b665025f06b692b9a722-d and /dev/null differ diff --git a/.cache/go-build/7a/7a3264a50238aca98da337aee7dc033696338b37cefc83ec0ec5763222cced6b-d b/.cache/go-build/7a/7a3264a50238aca98da337aee7dc033696338b37cefc83ec0ec5763222cced6b-d deleted file mode 100644 index e380db4..0000000 Binary files a/.cache/go-build/7a/7a3264a50238aca98da337aee7dc033696338b37cefc83ec0ec5763222cced6b-d and /dev/null differ diff --git a/.cache/go-build/7a/7a40b917e002f84132ea4e0fa91395cf342c09f3af5bd0a48caf30ccdd063620-a b/.cache/go-build/7a/7a40b917e002f84132ea4e0fa91395cf342c09f3af5bd0a48caf30ccdd063620-a deleted file mode 100644 index 4e1bee6..0000000 --- a/.cache/go-build/7a/7a40b917e002f84132ea4e0fa91395cf342c09f3af5bd0a48caf30ccdd063620-a +++ /dev/null @@ -1 +0,0 @@ -v1 7a40b917e002f84132ea4e0fa91395cf342c09f3af5bd0a48caf30ccdd063620 1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b 11 1775136290021998714 diff --git a/.cache/go-build/7a/7a469d317b138c22f6e66b17d222ed7f26968294a503ca97aef81a8f92571f84-d b/.cache/go-build/7a/7a469d317b138c22f6e66b17d222ed7f26968294a503ca97aef81a8f92571f84-d deleted file mode 100644 index 814ff7c..0000000 Binary files a/.cache/go-build/7a/7a469d317b138c22f6e66b17d222ed7f26968294a503ca97aef81a8f92571f84-d and /dev/null differ diff --git a/.cache/go-build/7a/7a5357958e3da7a0a403dbb914db6f2064743e6fbafee85ec8435d6e94f85ddd-d b/.cache/go-build/7a/7a5357958e3da7a0a403dbb914db6f2064743e6fbafee85ec8435d6e94f85ddd-d deleted file mode 100644 index d8de21f..0000000 Binary files a/.cache/go-build/7a/7a5357958e3da7a0a403dbb914db6f2064743e6fbafee85ec8435d6e94f85ddd-d and /dev/null differ diff --git a/.cache/go-build/7a/7a67e4929184b5aaeb5bc90ef3ae3a24a70c42b84a8833a309e146a8291cb0f7-a b/.cache/go-build/7a/7a67e4929184b5aaeb5bc90ef3ae3a24a70c42b84a8833a309e146a8291cb0f7-a deleted file mode 100644 index 4e92986..0000000 --- a/.cache/go-build/7a/7a67e4929184b5aaeb5bc90ef3ae3a24a70c42b84a8833a309e146a8291cb0f7-a +++ /dev/null @@ -1 +0,0 @@ -v1 7a67e4929184b5aaeb5bc90ef3ae3a24a70c42b84a8833a309e146a8291cb0f7 686797c345e8171997651eb3fc079e5fb249dda8cca0d028da2de8062d060381 65 1775136289383879527 diff --git a/.cache/go-build/7a/7abaa6ac9412acb5c32c2639b078176eb890a682c85a4e44ce5dd4e9367abcb8-d b/.cache/go-build/7a/7abaa6ac9412acb5c32c2639b078176eb890a682c85a4e44ce5dd4e9367abcb8-d deleted file mode 100644 index 902272b..0000000 Binary files a/.cache/go-build/7a/7abaa6ac9412acb5c32c2639b078176eb890a682c85a4e44ce5dd4e9367abcb8-d and /dev/null differ diff --git a/.cache/go-build/7a/7ae18ea94f3e95819fcc276dc25488115bb3a5e91a55981df72e7c3aea6e2c04-d b/.cache/go-build/7a/7ae18ea94f3e95819fcc276dc25488115bb3a5e91a55981df72e7c3aea6e2c04-d deleted file mode 100644 index 2fa5fe6..0000000 Binary files a/.cache/go-build/7a/7ae18ea94f3e95819fcc276dc25488115bb3a5e91a55981df72e7c3aea6e2c04-d and /dev/null differ diff --git a/.cache/go-build/7a/7aeec01c48529a7fac39c309cb024984fbe3d9bf556f6ba0d6f66e890c941f50-d b/.cache/go-build/7a/7aeec01c48529a7fac39c309cb024984fbe3d9bf556f6ba0d6f66e890c941f50-d deleted file mode 100644 index 7719190..0000000 Binary files a/.cache/go-build/7a/7aeec01c48529a7fac39c309cb024984fbe3d9bf556f6ba0d6f66e890c941f50-d and /dev/null differ diff --git a/.cache/go-build/7b/7b722d772f828763d8d618baabbeda6a8eaa9fda44a06a7668ec6eb46df186f2-a b/.cache/go-build/7b/7b722d772f828763d8d618baabbeda6a8eaa9fda44a06a7668ec6eb46df186f2-a deleted file mode 100644 index da8a57a..0000000 --- a/.cache/go-build/7b/7b722d772f828763d8d618baabbeda6a8eaa9fda44a06a7668ec6eb46df186f2-a +++ /dev/null @@ -1 +0,0 @@ -v1 7b722d772f828763d8d618baabbeda6a8eaa9fda44a06a7668ec6eb46df186f2 202994a9af9679a19a9a951bfac4e1d9dc73b67ae4e7f4e77bea2c750b150ff5 6308 1775136286841596909 diff --git a/.cache/go-build/7b/7b9eb3b6c06bd7a368f445922e0cc2ebe69f404415a1ed9062f543ea20fcc81b-a b/.cache/go-build/7b/7b9eb3b6c06bd7a368f445922e0cc2ebe69f404415a1ed9062f543ea20fcc81b-a deleted file mode 100644 index c1296ae..0000000 --- a/.cache/go-build/7b/7b9eb3b6c06bd7a368f445922e0cc2ebe69f404415a1ed9062f543ea20fcc81b-a +++ /dev/null @@ -1 +0,0 @@ -v1 7b9eb3b6c06bd7a368f445922e0cc2ebe69f404415a1ed9062f543ea20fcc81b a9dd1784d2ea5e2d8663e8c20d5a2d1966719be8a255dc47a7671aae62dab025 1062966 1775138184194362161 diff --git a/.cache/go-build/7b/7bee8f85327e2cd4692e9be28eee6ddf7840116f08b11ad96b33b6c597f6da7d-a b/.cache/go-build/7b/7bee8f85327e2cd4692e9be28eee6ddf7840116f08b11ad96b33b6c597f6da7d-a deleted file mode 100644 index 9eae176..0000000 --- a/.cache/go-build/7b/7bee8f85327e2cd4692e9be28eee6ddf7840116f08b11ad96b33b6c597f6da7d-a +++ /dev/null @@ -1 +0,0 @@ -v1 7bee8f85327e2cd4692e9be28eee6ddf7840116f08b11ad96b33b6c597f6da7d 0f4a24d6b478529be392fc2ee9ca24d474d2b5ef94cd23fd70fe0df40d382b89 291272 1775136289471632540 diff --git a/.cache/go-build/7c/7c1d301ca476f9cb48e3971c63965c6ceb96be20d2c256509ec2fb8b65895a94-a b/.cache/go-build/7c/7c1d301ca476f9cb48e3971c63965c6ceb96be20d2c256509ec2fb8b65895a94-a deleted file mode 100644 index 0f362ad..0000000 --- a/.cache/go-build/7c/7c1d301ca476f9cb48e3971c63965c6ceb96be20d2c256509ec2fb8b65895a94-a +++ /dev/null @@ -1 +0,0 @@ -v1 7c1d301ca476f9cb48e3971c63965c6ceb96be20d2c256509ec2fb8b65895a94 e85ab7aabcc3ce6206ababfe96d3e8fd6ea552ff9039c43265163f7989c1ab86 52 1775136289309911064 diff --git a/.cache/go-build/7c/7c45a7809906eea9f3d821c83dc97d00c8e60e5a09e1c5f6751f5845e201cdd3-a b/.cache/go-build/7c/7c45a7809906eea9f3d821c83dc97d00c8e60e5a09e1c5f6751f5845e201cdd3-a deleted file mode 100644 index 395b939..0000000 --- a/.cache/go-build/7c/7c45a7809906eea9f3d821c83dc97d00c8e60e5a09e1c5f6751f5845e201cdd3-a +++ /dev/null @@ -1 +0,0 @@ -v1 7c45a7809906eea9f3d821c83dc97d00c8e60e5a09e1c5f6751f5845e201cdd3 1579ddce15a908107b013f067d9496266480a9bc176da3f4e50dd3403bd2be44 16773 1775137722150543211 diff --git a/.cache/go-build/7c/7c4b1a6dd9483c0ec5a5d673b9708a46ea03b3813be44906d3795b21d6f42882-d b/.cache/go-build/7c/7c4b1a6dd9483c0ec5a5d673b9708a46ea03b3813be44906d3795b21d6f42882-d deleted file mode 100644 index 0fa45c5..0000000 Binary files a/.cache/go-build/7c/7c4b1a6dd9483c0ec5a5d673b9708a46ea03b3813be44906d3795b21d6f42882-d and /dev/null differ diff --git a/.cache/go-build/7c/7c5b31fe6511105bfe1cd62089f6c33127c6a87f9f6e662399c9d0d943238142-a b/.cache/go-build/7c/7c5b31fe6511105bfe1cd62089f6c33127c6a87f9f6e662399c9d0d943238142-a deleted file mode 100644 index 0a8a10d..0000000 --- a/.cache/go-build/7c/7c5b31fe6511105bfe1cd62089f6c33127c6a87f9f6e662399c9d0d943238142-a +++ /dev/null @@ -1 +0,0 @@ -v1 7c5b31fe6511105bfe1cd62089f6c33127c6a87f9f6e662399c9d0d943238142 98bb45d9462824f8575efc3cd5ce7d5b93a15713ed6cb1f0a55cac8c6ca9f9eb 100856 1775136288754363487 diff --git a/.cache/go-build/7c/7c9a970d9382082b7c56eab97f0e61586d97b44ab9728adb5d24b9aa76683f23-d b/.cache/go-build/7c/7c9a970d9382082b7c56eab97f0e61586d97b44ab9728adb5d24b9aa76683f23-d deleted file mode 100644 index f01e249..0000000 Binary files a/.cache/go-build/7c/7c9a970d9382082b7c56eab97f0e61586d97b44ab9728adb5d24b9aa76683f23-d and /dev/null differ diff --git a/.cache/go-build/7c/7ca3382516220aa434ddd220619a45be48c8a593ad60624b5619c97ae0217e0e-a b/.cache/go-build/7c/7ca3382516220aa434ddd220619a45be48c8a593ad60624b5619c97ae0217e0e-a deleted file mode 100644 index deab25c..0000000 --- a/.cache/go-build/7c/7ca3382516220aa434ddd220619a45be48c8a593ad60624b5619c97ae0217e0e-a +++ /dev/null @@ -1 +0,0 @@ -v1 7ca3382516220aa434ddd220619a45be48c8a593ad60624b5619c97ae0217e0e 7ff5ca707476daa36f725efcd8b3b0ee1ab30af048f8f0dc62266410e3bf5013 1671330 1775139428956283193 diff --git a/.cache/go-build/7c/7cbf46148bc208c3e4b9302dcd57fdfd8f634cdf0090e65613764aaed4ec4325-a b/.cache/go-build/7c/7cbf46148bc208c3e4b9302dcd57fdfd8f634cdf0090e65613764aaed4ec4325-a deleted file mode 100644 index aa30e10..0000000 --- a/.cache/go-build/7c/7cbf46148bc208c3e4b9302dcd57fdfd8f634cdf0090e65613764aaed4ec4325-a +++ /dev/null @@ -1 +0,0 @@ -v1 7cbf46148bc208c3e4b9302dcd57fdfd8f634cdf0090e65613764aaed4ec4325 6015cbe993378926fe1e410150ae541cb3eb2ed80ecae47d135b47d0c8fd4eed 329 1775136286934508065 diff --git a/.cache/go-build/7c/7cde0e4b82fbed78822a6a2e74fa51420e1705f27225a3be8318b1068810c2fe-a b/.cache/go-build/7c/7cde0e4b82fbed78822a6a2e74fa51420e1705f27225a3be8318b1068810c2fe-a deleted file mode 100644 index c112781..0000000 --- a/.cache/go-build/7c/7cde0e4b82fbed78822a6a2e74fa51420e1705f27225a3be8318b1068810c2fe-a +++ /dev/null @@ -1 +0,0 @@ -v1 7cde0e4b82fbed78822a6a2e74fa51420e1705f27225a3be8318b1068810c2fe 19427374d2c61162340728d02da38160d28ceb7f4b2eb5038194977f85b5b719 50608 1775136289831180867 diff --git a/.cache/go-build/7c/7ce97dc3569fdeb66be7094b2a4cdd42455c3d8ac0e1f2096a71ff8b1b1a1e63-a b/.cache/go-build/7c/7ce97dc3569fdeb66be7094b2a4cdd42455c3d8ac0e1f2096a71ff8b1b1a1e63-a deleted file mode 100644 index eef9e7e..0000000 --- a/.cache/go-build/7c/7ce97dc3569fdeb66be7094b2a4cdd42455c3d8ac0e1f2096a71ff8b1b1a1e63-a +++ /dev/null @@ -1 +0,0 @@ -v1 7ce97dc3569fdeb66be7094b2a4cdd42455c3d8ac0e1f2096a71ff8b1b1a1e63 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775136290027129477 diff --git a/.cache/go-build/7d/7d1a608f520acbe3f802e602c81e16263eea96dd56d1b220bd8e9ba275394b04-a b/.cache/go-build/7d/7d1a608f520acbe3f802e602c81e16263eea96dd56d1b220bd8e9ba275394b04-a deleted file mode 100644 index e92b986..0000000 --- a/.cache/go-build/7d/7d1a608f520acbe3f802e602c81e16263eea96dd56d1b220bd8e9ba275394b04-a +++ /dev/null @@ -1 +0,0 @@ -v1 7d1a608f520acbe3f802e602c81e16263eea96dd56d1b220bd8e9ba275394b04 3fa667ccf1be47383d3a3a506a3de8cfa8699ea976adebe15313e15335457085 876 1775136286836952096 diff --git a/.cache/go-build/7d/7d35c96c6c9183c8e659f6d19585c83213e4f1c88c877c4b57301e3241ea35c9-a b/.cache/go-build/7d/7d35c96c6c9183c8e659f6d19585c83213e4f1c88c877c4b57301e3241ea35c9-a deleted file mode 100644 index 06f6adc..0000000 --- a/.cache/go-build/7d/7d35c96c6c9183c8e659f6d19585c83213e4f1c88c877c4b57301e3241ea35c9-a +++ /dev/null @@ -1 +0,0 @@ -v1 7d35c96c6c9183c8e659f6d19585c83213e4f1c88c877c4b57301e3241ea35c9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287075111576 diff --git a/.cache/go-build/7d/7d67053998fd6cd5b68f060aff79d3e98d488b077aa0d48189f310b4e7b90764-a b/.cache/go-build/7d/7d67053998fd6cd5b68f060aff79d3e98d488b077aa0d48189f310b4e7b90764-a deleted file mode 100644 index 48584ee..0000000 --- a/.cache/go-build/7d/7d67053998fd6cd5b68f060aff79d3e98d488b077aa0d48189f310b4e7b90764-a +++ /dev/null @@ -1 +0,0 @@ -v1 7d67053998fd6cd5b68f060aff79d3e98d488b077aa0d48189f310b4e7b90764 7724c885d8a018cdb3fe0cc51ca5fd4b63d9048226125f727e035a30ad17f8f4 125864 1775136288718348561 diff --git a/.cache/go-build/7d/7d71811c059e94522cd820bc7e7109b3d4b050a447bda6333b8d0751db9badb9-d b/.cache/go-build/7d/7d71811c059e94522cd820bc7e7109b3d4b050a447bda6333b8d0751db9badb9-d deleted file mode 100644 index 20fd61b..0000000 Binary files a/.cache/go-build/7d/7d71811c059e94522cd820bc7e7109b3d4b050a447bda6333b8d0751db9badb9-d and /dev/null differ diff --git a/.cache/go-build/7d/7dc0d5503367e1f9bb024f6aec20f91a53dd4be8c644756e5334c97501aba37b-d b/.cache/go-build/7d/7dc0d5503367e1f9bb024f6aec20f91a53dd4be8c644756e5334c97501aba37b-d deleted file mode 100644 index 7f4aa58..0000000 Binary files a/.cache/go-build/7d/7dc0d5503367e1f9bb024f6aec20f91a53dd4be8c644756e5334c97501aba37b-d and /dev/null differ diff --git a/.cache/go-build/7d/7dcc946824f25847bd7cb532a087f14cf9a31ad30d1289c43df47ccbb5d0f3d9-a b/.cache/go-build/7d/7dcc946824f25847bd7cb532a087f14cf9a31ad30d1289c43df47ccbb5d0f3d9-a deleted file mode 100644 index ff8bcc5..0000000 --- a/.cache/go-build/7d/7dcc946824f25847bd7cb532a087f14cf9a31ad30d1289c43df47ccbb5d0f3d9-a +++ /dev/null @@ -1 +0,0 @@ -v1 7dcc946824f25847bd7cb532a087f14cf9a31ad30d1289c43df47ccbb5d0f3d9 b2b07dbfe469cb23f4cd07119a296c4095d21a94fe2c0060bf1a5dbc4ebab7cb 599 1775136286826371348 diff --git a/.cache/go-build/7d/7dff9354a1c40a7b1c9d3cb3c3a4f5a7e25c5fdb3fcc54a1c2101657bf7570da-d b/.cache/go-build/7d/7dff9354a1c40a7b1c9d3cb3c3a4f5a7e25c5fdb3fcc54a1c2101657bf7570da-d deleted file mode 100644 index 569266b..0000000 Binary files a/.cache/go-build/7d/7dff9354a1c40a7b1c9d3cb3c3a4f5a7e25c5fdb3fcc54a1c2101657bf7570da-d and /dev/null differ diff --git a/.cache/go-build/7e/7e51b503c6b8e10c2bec593fee05b8dcbbb5397c97fe3c5c336e76ab1adf4e9d-a b/.cache/go-build/7e/7e51b503c6b8e10c2bec593fee05b8dcbbb5397c97fe3c5c336e76ab1adf4e9d-a deleted file mode 100644 index 7db5e41..0000000 --- a/.cache/go-build/7e/7e51b503c6b8e10c2bec593fee05b8dcbbb5397c97fe3c5c336e76ab1adf4e9d-a +++ /dev/null @@ -1 +0,0 @@ -v1 7e51b503c6b8e10c2bec593fee05b8dcbbb5397c97fe3c5c336e76ab1adf4e9d c23df47e558760577ca85e209817b31837e69619fc642af359ac2b4728c8aca5 79 1775138184038647859 diff --git a/.cache/go-build/7e/7ed13d3168d101b5f683e84fb07ac54c70451afcc654c994971946b625e73312-a b/.cache/go-build/7e/7ed13d3168d101b5f683e84fb07ac54c70451afcc654c994971946b625e73312-a deleted file mode 100644 index 7879fe2..0000000 --- a/.cache/go-build/7e/7ed13d3168d101b5f683e84fb07ac54c70451afcc654c994971946b625e73312-a +++ /dev/null @@ -1 +0,0 @@ -v1 7ed13d3168d101b5f683e84fb07ac54c70451afcc654c994971946b625e73312 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289840674384 diff --git a/.cache/go-build/7e/7ed6d23c27053d185b43197d77e0d7776242319066194577836244720a5b0f71-a b/.cache/go-build/7e/7ed6d23c27053d185b43197d77e0d7776242319066194577836244720a5b0f71-a deleted file mode 100644 index 5d83514..0000000 --- a/.cache/go-build/7e/7ed6d23c27053d185b43197d77e0d7776242319066194577836244720a5b0f71-a +++ /dev/null @@ -1 +0,0 @@ -v1 7ed6d23c27053d185b43197d77e0d7776242319066194577836244720a5b0f71 2f4116f67c2953721a3ce5016b42e2fb412a7bb337106ccf31d32f71e650a641 3327 1775136286930581483 diff --git a/.cache/go-build/7e/7eff73f9b2e87e7216b595045e8b04ac084081515ed9bfb5408aa534368f0de6-a b/.cache/go-build/7e/7eff73f9b2e87e7216b595045e8b04ac084081515ed9bfb5408aa534368f0de6-a deleted file mode 100644 index de0831e..0000000 --- a/.cache/go-build/7e/7eff73f9b2e87e7216b595045e8b04ac084081515ed9bfb5408aa534368f0de6-a +++ /dev/null @@ -1 +0,0 @@ -v1 7eff73f9b2e87e7216b595045e8b04ac084081515ed9bfb5408aa534368f0de6 86f7dc9e6dc6becc415eac189766dab68a1028143574dc0092edfed8246aeb39 1820 1775136286835826895 diff --git a/.cache/go-build/7f/7f24f62b438b181c5ea8feb508d62d6793be9320c3e2c8218dfb548ae64d0d49-a b/.cache/go-build/7f/7f24f62b438b181c5ea8feb508d62d6793be9320c3e2c8218dfb548ae64d0d49-a deleted file mode 100644 index 09c70cc..0000000 --- a/.cache/go-build/7f/7f24f62b438b181c5ea8feb508d62d6793be9320c3e2c8218dfb548ae64d0d49-a +++ /dev/null @@ -1 +0,0 @@ -v1 7f24f62b438b181c5ea8feb508d62d6793be9320c3e2c8218dfb548ae64d0d49 fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775138184076349196 diff --git a/.cache/go-build/7f/7f3f2ec521d7bd7d6be234721783885ce98673029f5add11b942ed5077f94c92-a b/.cache/go-build/7f/7f3f2ec521d7bd7d6be234721783885ce98673029f5add11b942ed5077f94c92-a deleted file mode 100644 index eab59b6..0000000 --- a/.cache/go-build/7f/7f3f2ec521d7bd7d6be234721783885ce98673029f5add11b942ed5077f94c92-a +++ /dev/null @@ -1 +0,0 @@ -v1 7f3f2ec521d7bd7d6be234721783885ce98673029f5add11b942ed5077f94c92 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289366659545 diff --git a/.cache/go-build/7f/7f4718ffa5e20aa6fb4c4ef9bf90bc4373269155c1c2f687f19453e323eb8893-a b/.cache/go-build/7f/7f4718ffa5e20aa6fb4c4ef9bf90bc4373269155c1c2f687f19453e323eb8893-a deleted file mode 100644 index 6a6dce3..0000000 --- a/.cache/go-build/7f/7f4718ffa5e20aa6fb4c4ef9bf90bc4373269155c1c2f687f19453e323eb8893-a +++ /dev/null @@ -1 +0,0 @@ -v1 7f4718ffa5e20aa6fb4c4ef9bf90bc4373269155c1c2f687f19453e323eb8893 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398508679835 diff --git a/.cache/go-build/7f/7f529461558e5853a523c07cdee3f6b1fadee88649a1f35dec11bfbaeff201a2-a b/.cache/go-build/7f/7f529461558e5853a523c07cdee3f6b1fadee88649a1f35dec11bfbaeff201a2-a deleted file mode 100644 index 720c91f..0000000 --- a/.cache/go-build/7f/7f529461558e5853a523c07cdee3f6b1fadee88649a1f35dec11bfbaeff201a2-a +++ /dev/null @@ -1 +0,0 @@ -v1 7f529461558e5853a523c07cdee3f6b1fadee88649a1f35dec11bfbaeff201a2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287079079779 diff --git a/.cache/go-build/7f/7f83a2b6e00b57912317fbbbfa71f36df146a87291b3132b3d7e95fb205399b4-d b/.cache/go-build/7f/7f83a2b6e00b57912317fbbbfa71f36df146a87291b3132b3d7e95fb205399b4-d deleted file mode 100644 index 79c06d5..0000000 Binary files a/.cache/go-build/7f/7f83a2b6e00b57912317fbbbfa71f36df146a87291b3132b3d7e95fb205399b4-d and /dev/null differ diff --git a/.cache/go-build/7f/7f95d33c761c9685eafe192613ed6bd28d6399369ebc32d573c0adc04ace599b-a b/.cache/go-build/7f/7f95d33c761c9685eafe192613ed6bd28d6399369ebc32d573c0adc04ace599b-a deleted file mode 100644 index 5bdbc18..0000000 --- a/.cache/go-build/7f/7f95d33c761c9685eafe192613ed6bd28d6399369ebc32d573c0adc04ace599b-a +++ /dev/null @@ -1 +0,0 @@ -v1 7f95d33c761c9685eafe192613ed6bd28d6399369ebc32d573c0adc04ace599b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136365537527327 diff --git a/.cache/go-build/7f/7fe3dca6cb0b586bd4fc0d65dd0ba0e8ebed7452ebced585bbb3f437ffd3a714-a b/.cache/go-build/7f/7fe3dca6cb0b586bd4fc0d65dd0ba0e8ebed7452ebced585bbb3f437ffd3a714-a deleted file mode 100644 index 6402d4c..0000000 --- a/.cache/go-build/7f/7fe3dca6cb0b586bd4fc0d65dd0ba0e8ebed7452ebced585bbb3f437ffd3a714-a +++ /dev/null @@ -1 +0,0 @@ -v1 7fe3dca6cb0b586bd4fc0d65dd0ba0e8ebed7452ebced585bbb3f437ffd3a714 fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775136289951910594 diff --git a/.cache/go-build/7f/7ff5ca707476daa36f725efcd8b3b0ee1ab30af048f8f0dc62266410e3bf5013-d/inspect b/.cache/go-build/7f/7ff5ca707476daa36f725efcd8b3b0ee1ab30af048f8f0dc62266410e3bf5013-d/inspect deleted file mode 100755 index a920e2c..0000000 Binary files a/.cache/go-build/7f/7ff5ca707476daa36f725efcd8b3b0ee1ab30af048f8f0dc62266410e3bf5013-d/inspect and /dev/null differ diff --git a/.cache/go-build/80/8011e9c53622e4ccba7d311ba870ce1ae1444a4269e0abb0ba08e9582806ae4f-d b/.cache/go-build/80/8011e9c53622e4ccba7d311ba870ce1ae1444a4269e0abb0ba08e9582806ae4f-d deleted file mode 100644 index 1fbdc39..0000000 --- a/.cache/go-build/80/8011e9c53622e4ccba7d311ba870ce1ae1444a4269e0abb0ba08e9582806ae4f-d +++ /dev/null @@ -1,2 +0,0 @@ -./sig.go -./sig_amd64.s diff --git a/.cache/go-build/80/8051802d836fd76cdc8949444b34a1e43c6190e50700fbd11b32c7106055628c-a b/.cache/go-build/80/8051802d836fd76cdc8949444b34a1e43c6190e50700fbd11b32c7106055628c-a deleted file mode 100644 index 93101f3..0000000 --- a/.cache/go-build/80/8051802d836fd76cdc8949444b34a1e43c6190e50700fbd11b32c7106055628c-a +++ /dev/null @@ -1 +0,0 @@ -v1 8051802d836fd76cdc8949444b34a1e43c6190e50700fbd11b32c7106055628c ee5e79329901d3094e2ba154c2a9508b2fd872fa672574eb3a5bd0bbcb14a07b 7240 1775136288785289279 diff --git a/.cache/go-build/80/805c830c7728089eedcf7ff21d76a909ed1d189f12a71f280518f8369a836e41-a b/.cache/go-build/80/805c830c7728089eedcf7ff21d76a909ed1d189f12a71f280518f8369a836e41-a deleted file mode 100644 index ec3f5c8..0000000 --- a/.cache/go-build/80/805c830c7728089eedcf7ff21d76a909ed1d189f12a71f280518f8369a836e41-a +++ /dev/null @@ -1 +0,0 @@ -v1 805c830c7728089eedcf7ff21d76a909ed1d189f12a71f280518f8369a836e41 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286989725085 diff --git a/.cache/go-build/80/80709fbdce94adc3832ef18a84074b348c7df823769328a4dd857a7b04349552-a b/.cache/go-build/80/80709fbdce94adc3832ef18a84074b348c7df823769328a4dd857a7b04349552-a deleted file mode 100644 index dcac6d8..0000000 --- a/.cache/go-build/80/80709fbdce94adc3832ef18a84074b348c7df823769328a4dd857a7b04349552-a +++ /dev/null @@ -1 +0,0 @@ -v1 80709fbdce94adc3832ef18a84074b348c7df823769328a4dd857a7b04349552 cb0e3c5817a9e3cc3cb0d994a3f710365bfd1f90929d0ff3a745cca5f7c298e6 168 1775136286970941112 diff --git a/.cache/go-build/80/807b666639cac6aabe6c80c74c029fb92fe39be11dacbff74651992a6cf22a95-a b/.cache/go-build/80/807b666639cac6aabe6c80c74c029fb92fe39be11dacbff74651992a6cf22a95-a deleted file mode 100644 index 119d679..0000000 --- a/.cache/go-build/80/807b666639cac6aabe6c80c74c029fb92fe39be11dacbff74651992a6cf22a95-a +++ /dev/null @@ -1 +0,0 @@ -v1 807b666639cac6aabe6c80c74c029fb92fe39be11dacbff74651992a6cf22a95 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775137721923734649 diff --git a/.cache/go-build/80/80867782bff3796e792e9971ed6087e6831cc9cd4f5b3b17564375413139a862-a b/.cache/go-build/80/80867782bff3796e792e9971ed6087e6831cc9cd4f5b3b17564375413139a862-a deleted file mode 100644 index aea0211..0000000 --- a/.cache/go-build/80/80867782bff3796e792e9971ed6087e6831cc9cd4f5b3b17564375413139a862-a +++ /dev/null @@ -1 +0,0 @@ -v1 80867782bff3796e792e9971ed6087e6831cc9cd4f5b3b17564375413139a862 7d71811c059e94522cd820bc7e7109b3d4b050a447bda6333b8d0751db9badb9 142248 1775136287064648329 diff --git a/.cache/go-build/80/80caeddb1e88e48c440804202c661d8908ce083d1f3c0db544d634a6a448d12c-a b/.cache/go-build/80/80caeddb1e88e48c440804202c661d8908ce083d1f3c0db544d634a6a448d12c-a deleted file mode 100644 index 803cba7..0000000 --- a/.cache/go-build/80/80caeddb1e88e48c440804202c661d8908ce083d1f3c0db544d634a6a448d12c-a +++ /dev/null @@ -1 +0,0 @@ -v1 80caeddb1e88e48c440804202c661d8908ce083d1f3c0db544d634a6a448d12c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184073880484 diff --git a/.cache/go-build/80/80cb8158f655f33ebfe81a7915cd40e591873a7efad630685e3b1f5439268c19-d b/.cache/go-build/80/80cb8158f655f33ebfe81a7915cd40e591873a7efad630685e3b1f5439268c19-d deleted file mode 100644 index 98d46d2..0000000 --- a/.cache/go-build/80/80cb8158f655f33ebfe81a7915cd40e591873a7efad630685e3b1f5439268c19-d +++ /dev/null @@ -1 +0,0 @@ -./context.go diff --git a/.cache/go-build/80/80ce9caa3c0bb4407d6c6abde34f9c4bf3ad4c029f5387f8bc49a39368efd796-d b/.cache/go-build/80/80ce9caa3c0bb4407d6c6abde34f9c4bf3ad4c029f5387f8bc49a39368efd796-d deleted file mode 100644 index cee38f7..0000000 Binary files a/.cache/go-build/80/80ce9caa3c0bb4407d6c6abde34f9c4bf3ad4c029f5387f8bc49a39368efd796-d and /dev/null differ diff --git a/.cache/go-build/80/80defee16f4921a3c04f72b39133b5a9401a6f35d5acd76758bb7553bea19503-a b/.cache/go-build/80/80defee16f4921a3c04f72b39133b5a9401a6f35d5acd76758bb7553bea19503-a deleted file mode 100644 index 6191333..0000000 --- a/.cache/go-build/80/80defee16f4921a3c04f72b39133b5a9401a6f35d5acd76758bb7553bea19503-a +++ /dev/null @@ -1 +0,0 @@ -v1 80defee16f4921a3c04f72b39133b5a9401a6f35d5acd76758bb7553bea19503 34b0e91de4fbb5ff235a441530a7fb7f31e9665ba40dfb294ea12208a77f1880 258968 1775136289719282177 diff --git a/.cache/go-build/81/8107f172ea680f80972e0b850b7b8a107880c1cd7984b978f5557f88233ad816-a b/.cache/go-build/81/8107f172ea680f80972e0b850b7b8a107880c1cd7984b978f5557f88233ad816-a deleted file mode 100644 index f5655b0..0000000 --- a/.cache/go-build/81/8107f172ea680f80972e0b850b7b8a107880c1cd7984b978f5557f88233ad816-a +++ /dev/null @@ -1 +0,0 @@ -v1 8107f172ea680f80972e0b850b7b8a107880c1cd7984b978f5557f88233ad816 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287143134305 diff --git a/.cache/go-build/81/8121dfa68d928988536b28502f77e57bfbe0d36213150a77a6c9a6b45784954b-d b/.cache/go-build/81/8121dfa68d928988536b28502f77e57bfbe0d36213150a77a6c9a6b45784954b-d deleted file mode 100644 index 4d40e28..0000000 --- a/.cache/go-build/81/8121dfa68d928988536b28502f77e57bfbe0d36213150a77a6c9a6b45784954b-d +++ /dev/null @@ -1,3 +0,0 @@ -./binary.go -./json.go -./types.go diff --git a/.cache/go-build/81/8131a3833106b6d6f2e7c7e2dee518aecb0a0329fc29439657c0b176b9391632-a b/.cache/go-build/81/8131a3833106b6d6f2e7c7e2dee518aecb0a0329fc29439657c0b176b9391632-a deleted file mode 100644 index 49f9f4e..0000000 --- a/.cache/go-build/81/8131a3833106b6d6f2e7c7e2dee518aecb0a0329fc29439657c0b176b9391632-a +++ /dev/null @@ -1 +0,0 @@ -v1 8131a3833106b6d6f2e7c7e2dee518aecb0a0329fc29439657c0b176b9391632 c7efedb9584ca36a3a7a6a391f1500c0108ac050baab71217b0887cf70fa116a 934 1775136286951504528 diff --git a/.cache/go-build/81/8197844951f03ec8df9aa57e1b5db17f1f13bf2abe8ea8e644182f4e8784f78b-d b/.cache/go-build/81/8197844951f03ec8df9aa57e1b5db17f1f13bf2abe8ea8e644182f4e8784f78b-d deleted file mode 100644 index bf4ce33..0000000 Binary files a/.cache/go-build/81/8197844951f03ec8df9aa57e1b5db17f1f13bf2abe8ea8e644182f4e8784f78b-d and /dev/null differ diff --git a/.cache/go-build/82/82106c7806f2afd19467f458435f8a736889c297b6862cf37f029a67c02b909f-a b/.cache/go-build/82/82106c7806f2afd19467f458435f8a736889c297b6862cf37f029a67c02b909f-a deleted file mode 100644 index 863df03..0000000 --- a/.cache/go-build/82/82106c7806f2afd19467f458435f8a736889c297b6862cf37f029a67c02b909f-a +++ /dev/null @@ -1 +0,0 @@ -v1 82106c7806f2afd19467f458435f8a736889c297b6862cf37f029a67c02b909f 4634dc89281599056133403972c3650895c2de617fea206c8f17f575d3c99254 46910 1775136286905761575 diff --git a/.cache/go-build/82/82133cee250e3efc784484d7bf43c793da3742a5274229a1c4314cf2f62be089-a b/.cache/go-build/82/82133cee250e3efc784484d7bf43c793da3742a5274229a1c4314cf2f62be089-a deleted file mode 100644 index 2900a49..0000000 --- a/.cache/go-build/82/82133cee250e3efc784484d7bf43c793da3742a5274229a1c4314cf2f62be089-a +++ /dev/null @@ -1 +0,0 @@ -v1 82133cee250e3efc784484d7bf43c793da3742a5274229a1c4314cf2f62be089 04b281e04d70ff68d86cdca524bbc25057c63880e17abd5ac80015b59ce43847 40468 1775136286934017395 diff --git a/.cache/go-build/82/824d5df15870c94c0e14087c715269c77f2d6642eb46f1fdc5008185fab9e7e2-d b/.cache/go-build/82/824d5df15870c94c0e14087c715269c77f2d6642eb46f1fdc5008185fab9e7e2-d deleted file mode 100644 index 17908d4..0000000 --- a/.cache/go-build/82/824d5df15870c94c0e14087c715269c77f2d6642eb46f1fdc5008185fab9e7e2-d +++ /dev/null @@ -1,4 +0,0 @@ -./position.go -./serialize.go -./token.go -./tree.go diff --git a/.cache/go-build/83/831487b2e018bf6cbfcdc9749ea9aa82862b78b810f7a16f42d0fecc96414e4d-d b/.cache/go-build/83/831487b2e018bf6cbfcdc9749ea9aa82862b78b810f7a16f42d0fecc96414e4d-d deleted file mode 100644 index c855f24..0000000 Binary files a/.cache/go-build/83/831487b2e018bf6cbfcdc9749ea9aa82862b78b810f7a16f42d0fecc96414e4d-d and /dev/null differ diff --git a/.cache/go-build/83/833b742f51ac2cc89843975455d2ba869d1187477a3062e3dbd157ac132d79f5-a b/.cache/go-build/83/833b742f51ac2cc89843975455d2ba869d1187477a3062e3dbd157ac132d79f5-a deleted file mode 100644 index a7be3c3..0000000 --- a/.cache/go-build/83/833b742f51ac2cc89843975455d2ba869d1187477a3062e3dbd157ac132d79f5-a +++ /dev/null @@ -1 +0,0 @@ -v1 833b742f51ac2cc89843975455d2ba869d1187477a3062e3dbd157ac132d79f5 e171ad3b27fad13f49bc4ee36158ca2bde38ab7f7b6cce3136039518c4560266 19 1775136287040130731 diff --git a/.cache/go-build/83/833d5b756d06d851dfd9c9f62afd2175a0bc0109f7e7e19abe173fd27f7d6b9a-d b/.cache/go-build/83/833d5b756d06d851dfd9c9f62afd2175a0bc0109f7e7e19abe173fd27f7d6b9a-d deleted file mode 100644 index 1b68933..0000000 --- a/.cache/go-build/83/833d5b756d06d851dfd9c9f62afd2175a0bc0109f7e7e19abe173fd27f7d6b9a-d +++ /dev/null @@ -1,259 +0,0 @@ -# test log -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildThenExtract4063970593/001/src -stat /tmp/TestBuildThenExtract4063970593/001 -stat /tmp/TestBuildThenExtract4063970593/001/assets -stat /tmp/TestBuildThenExtract4063970593/001 -stat /tmp/TestBuildThenExtract4063970593/001/build -stat /tmp/TestBuildThenExtract4063970593/001 -open /tmp/TestBuildThenExtract4063970593/001/nwn-tool.json -stat /tmp/TestBuildThenExtract4063970593/001/src/module -stat /tmp/TestBuildThenExtract4063970593/001/src -open /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4063970593/001/nwn-tool.json -stat /tmp/TestBuildThenExtract4063970593/001/src -stat /tmp/TestBuildThenExtract4063970593/001/assets -stat /tmp/TestBuildThenExtract4063970593/001/build -stat /tmp/TestBuildThenExtract4063970593/001/src -open /tmp/TestBuildThenExtract4063970593/001/src -open /tmp/TestBuildThenExtract4063970593/001/src/module -stat /tmp/TestBuildThenExtract4063970593/001/assets -open /tmp/TestBuildThenExtract4063970593/001/assets -open /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4063970593/001/build/testmod.mod -open /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4063970593/001/build/haks.json -stat /tmp/TestBuildThenExtract4063970593/001/build -open /tmp/TestBuildThenExtract4063970593/001/build -stat /tmp/TestBuildThenExtract4063970593/001/src -open /tmp/TestBuildThenExtract4063970593/001/src -open /tmp/TestBuildThenExtract4063970593/001/src/module -stat /tmp/TestBuildThenExtract4063970593/001/assets -open /tmp/TestBuildThenExtract4063970593/001/assets -open /tmp/TestBuildThenExtract4063970593/001/build/testmod.mod -stat /tmp/TestBuildThenExtract4063970593/001/src/module -open /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract4063970593/001/build -open /tmp/TestBuildThenExtract4063970593/001/build -stat /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract4063970593/001/src -open /tmp/TestBuildThenExtract4063970593/001/src -open /tmp/TestBuildThenExtract4063970593/001/src/module -stat /tmp/TestBuildThenExtract4063970593/001/assets -open /tmp/TestBuildThenExtract4063970593/001/assets -open /tmp/TestBuildThenExtract4063970593/001/build/testmod.mod -open /tmp/TestBuildThenExtract4063970593/001/build/haks.json -stat /tmp/TestBuildThenExtract4063970593/001/build -open /tmp/TestBuildThenExtract4063970593/001/build -open /tmp/TestBuildThenExtract4063970593/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestExtractReadsHAKAssets1520178222/001/src -stat /tmp/TestExtractReadsHAKAssets1520178222/001 -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets -stat /tmp/TestExtractReadsHAKAssets1520178222/001 -stat /tmp/TestExtractReadsHAKAssets1520178222/001/build -stat /tmp/TestExtractReadsHAKAssets1520178222/001 -open /tmp/TestExtractReadsHAKAssets1520178222/001/nwn-tool.json -open /tmp/TestExtractReadsHAKAssets1520178222/001/nwn-tool.json -stat /tmp/TestExtractReadsHAKAssets1520178222/001/src -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets -stat /tmp/TestExtractReadsHAKAssets1520178222/001/build -stat /tmp/TestExtractReadsHAKAssets1520178222/001/src -open /tmp/TestExtractReadsHAKAssets1520178222/001/src -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets -open /tmp/TestExtractReadsHAKAssets1520178222/001/assets -open /tmp/TestExtractReadsHAKAssets1520178222/001/build/testmod.mod -open /tmp/TestExtractReadsHAKAssets1520178222/001/build/vfx.hak -open /tmp/TestExtractReadsHAKAssets1520178222/001/build/testmod.mod -stat /tmp/TestExtractReadsHAKAssets1520178222/001/build -open /tmp/TestExtractReadsHAKAssets1520178222/001/build -open /tmp/TestExtractReadsHAKAssets1520178222/001/build/vfx.hak -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets/plt -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets -open /tmp/TestExtractReadsHAKAssets1520178222/001/assets/plt/test_icon.plt -open /tmp/TestExtractReadsHAKAssets1520178222/001/assets/plt/test_icon.plt -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets/mdl -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets -open /tmp/TestExtractReadsHAKAssets1520178222/001/assets/mdl/test_vfx.mdl -open /tmp/TestExtractReadsHAKAssets1520178222/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets1520178222/001/assets/plt/test_icon.plt -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001 -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets/core -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001 -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001 -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets/core -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/core_01.hak -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/core_01.hak -stat /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs319770666/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/core -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/vfx -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001 -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/nwn-tool.json -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/nwn-tool.json -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/core -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/vfx -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build/haks.json -stat /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build/core.hak -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build/vfx.hak -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build/haks.json -open /tmp/TestBuildOrdersMultipleHAKGroups923491115/001/build/haks.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/core -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/vfx -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001 -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/nwn-tool.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/nwn-tool.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/core -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/vfx -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/core_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/core_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/vfx_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/core_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/core_02.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/vfx_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1672931726/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/core -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/vfx -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001 -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/nwn-tool.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/nwn-tool.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/core -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/vfx -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build/haks.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build/core.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build/vfx.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build/haks.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder2808277806/001/build/haks.json -open /tmp diff --git a/.cache/go-build/83/834439d2f90c4ea1d43e53d2c25876a7abfd77d7f84a0b02001ab3276b73e496-d b/.cache/go-build/83/834439d2f90c4ea1d43e53d2c25876a7abfd77d7f84a0b02001ab3276b73e496-d deleted file mode 100644 index 1d1e192..0000000 --- a/.cache/go-build/83/834439d2f90c4ea1d43e53d2c25876a7abfd77d7f84a0b02001ab3276b73e496-d +++ /dev/null @@ -1 +0,0 @@ -./validator.go diff --git a/.cache/go-build/83/836757cace1cb9625602a43c15d47ba2c2916dcdb25fb9161d011da0fd25c400-a b/.cache/go-build/83/836757cace1cb9625602a43c15d47ba2c2916dcdb25fb9161d011da0fd25c400-a deleted file mode 100644 index 38e5033..0000000 --- a/.cache/go-build/83/836757cace1cb9625602a43c15d47ba2c2916dcdb25fb9161d011da0fd25c400-a +++ /dev/null @@ -1 +0,0 @@ -v1 836757cace1cb9625602a43c15d47ba2c2916dcdb25fb9161d011da0fd25c400 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286997468521 diff --git a/.cache/go-build/83/838e7d6378ff88f3ccf84a9f4a4ab3c1ce1840cd2071ebf3abf1f2258609d747-a b/.cache/go-build/83/838e7d6378ff88f3ccf84a9f4a4ab3c1ce1840cd2071ebf3abf1f2258609d747-a deleted file mode 100644 index 230e7e1..0000000 --- a/.cache/go-build/83/838e7d6378ff88f3ccf84a9f4a4ab3c1ce1840cd2071ebf3abf1f2258609d747-a +++ /dev/null @@ -1 +0,0 @@ -v1 838e7d6378ff88f3ccf84a9f4a4ab3c1ce1840cd2071ebf3abf1f2258609d747 f82bb9f99109f07bee6926e290a034795497421be345d5b7c8da92e3024971a5 1960 1775136286943800112 diff --git a/.cache/go-build/83/83bce5f2c974987bca75747b4aab83d2d3e4ae927b87d1b82416d231df146520-a b/.cache/go-build/83/83bce5f2c974987bca75747b4aab83d2d3e4ae927b87d1b82416d231df146520-a deleted file mode 100644 index bd7e290..0000000 --- a/.cache/go-build/83/83bce5f2c974987bca75747b4aab83d2d3e4ae927b87d1b82416d231df146520-a +++ /dev/null @@ -1 +0,0 @@ -v1 83bce5f2c974987bca75747b4aab83d2d3e4ae927b87d1b82416d231df146520 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286991741046 diff --git a/.cache/go-build/83/83c49f5e4390b757fec6b3b4dd82049176e7f173f60c4058d9dd1ec7034ff212-a b/.cache/go-build/83/83c49f5e4390b757fec6b3b4dd82049176e7f173f60c4058d9dd1ec7034ff212-a deleted file mode 100644 index bb960c7..0000000 --- a/.cache/go-build/83/83c49f5e4390b757fec6b3b4dd82049176e7f173f60c4058d9dd1ec7034ff212-a +++ /dev/null @@ -1 +0,0 @@ -v1 83c49f5e4390b757fec6b3b4dd82049176e7f173f60c4058d9dd1ec7034ff212 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289113203604 diff --git a/.cache/go-build/83/83db2f14744f1a4046bc6d9d67da0ab8fcfe9ff2e5bc546130d4bae6918b2308-a b/.cache/go-build/83/83db2f14744f1a4046bc6d9d67da0ab8fcfe9ff2e5bc546130d4bae6918b2308-a deleted file mode 100644 index 4a6a408..0000000 --- a/.cache/go-build/83/83db2f14744f1a4046bc6d9d67da0ab8fcfe9ff2e5bc546130d4bae6918b2308-a +++ /dev/null @@ -1 +0,0 @@ -v1 83db2f14744f1a4046bc6d9d67da0ab8fcfe9ff2e5bc546130d4bae6918b2308 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289155611854 diff --git a/.cache/go-build/84/846253744f6e7eeb857c924209fd444008e50ace3a6922ab155e057467cfdd17-d b/.cache/go-build/84/846253744f6e7eeb857c924209fd444008e50ace3a6922ab155e057467cfdd17-d deleted file mode 100644 index e51dde5..0000000 Binary files a/.cache/go-build/84/846253744f6e7eeb857c924209fd444008e50ace3a6922ab155e057467cfdd17-d and /dev/null differ diff --git a/.cache/go-build/84/847ccfb4d1838679418cd33ff3d51dbf2f6cee4160c3f93c7db7b1c293f4d0ff-d b/.cache/go-build/84/847ccfb4d1838679418cd33ff3d51dbf2f6cee4160c3f93c7db7b1c293f4d0ff-d deleted file mode 100644 index 75046b8..0000000 Binary files a/.cache/go-build/84/847ccfb4d1838679418cd33ff3d51dbf2f6cee4160c3f93c7db7b1c293f4d0ff-d and /dev/null differ diff --git a/.cache/go-build/84/84f26fa123885e45e6d2d0f13f3cc570e2bd744136d41b134829addadc6d2e53-a b/.cache/go-build/84/84f26fa123885e45e6d2d0f13f3cc570e2bd744136d41b134829addadc6d2e53-a deleted file mode 100644 index 6f5687b..0000000 --- a/.cache/go-build/84/84f26fa123885e45e6d2d0f13f3cc570e2bd744136d41b134829addadc6d2e53-a +++ /dev/null @@ -1 +0,0 @@ -v1 84f26fa123885e45e6d2d0f13f3cc570e2bd744136d41b134829addadc6d2e53 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288996438700 diff --git a/.cache/go-build/85/85208ac023d1f73d5e8978aeccd11da12e56c8b31b15fcd176733cd2205486de-a b/.cache/go-build/85/85208ac023d1f73d5e8978aeccd11da12e56c8b31b15fcd176733cd2205486de-a deleted file mode 100644 index f6e611a..0000000 --- a/.cache/go-build/85/85208ac023d1f73d5e8978aeccd11da12e56c8b31b15fcd176733cd2205486de-a +++ /dev/null @@ -1 +0,0 @@ -v1 85208ac023d1f73d5e8978aeccd11da12e56c8b31b15fcd176733cd2205486de e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289339399226 diff --git a/.cache/go-build/85/852f44e861b7e2f3bf44198739b60e39fd6809958f346d89f38ffe2c12ffd85d-a b/.cache/go-build/85/852f44e861b7e2f3bf44198739b60e39fd6809958f346d89f38ffe2c12ffd85d-a deleted file mode 100644 index e044a5c..0000000 --- a/.cache/go-build/85/852f44e861b7e2f3bf44198739b60e39fd6809958f346d89f38ffe2c12ffd85d-a +++ /dev/null @@ -1 +0,0 @@ -v1 852f44e861b7e2f3bf44198739b60e39fd6809958f346d89f38ffe2c12ffd85d b6963e2cc4598f141216856ed74d43f37ea4d7456a7743962e2c1c375606f7ed 10932 1775136287052658500 diff --git a/.cache/go-build/85/852f8a8356f24c5a5c7b08c630dbf20eb70d6fd1da47c75801c39a134b012ecb-a b/.cache/go-build/85/852f8a8356f24c5a5c7b08c630dbf20eb70d6fd1da47c75801c39a134b012ecb-a deleted file mode 100644 index 38cc056..0000000 --- a/.cache/go-build/85/852f8a8356f24c5a5c7b08c630dbf20eb70d6fd1da47c75801c39a134b012ecb-a +++ /dev/null @@ -1 +0,0 @@ -v1 852f8a8356f24c5a5c7b08c630dbf20eb70d6fd1da47c75801c39a134b012ecb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287017720815 diff --git a/.cache/go-build/85/8547355ceb95364101f57a6c616593c653fc3400a62a5fc7434dcffa402e339e-a b/.cache/go-build/85/8547355ceb95364101f57a6c616593c653fc3400a62a5fc7434dcffa402e339e-a deleted file mode 100644 index 8cbb979..0000000 --- a/.cache/go-build/85/8547355ceb95364101f57a6c616593c653fc3400a62a5fc7434dcffa402e339e-a +++ /dev/null @@ -1 +0,0 @@ -v1 8547355ceb95364101f57a6c616593c653fc3400a62a5fc7434dcffa402e339e da877bc5eca127feabab5b836fcac5d8f1c369395aaeab9ceaf06933a0f0d31f 364 1775137721817059523 diff --git a/.cache/go-build/85/855efed075059448e680617361e5a59fda95ed2ad8868c1c615e0c1bf3c75da9-d b/.cache/go-build/85/855efed075059448e680617361e5a59fda95ed2ad8868c1c615e0c1bf3c75da9-d deleted file mode 100644 index 545294b..0000000 Binary files a/.cache/go-build/85/855efed075059448e680617361e5a59fda95ed2ad8868c1c615e0c1bf3c75da9-d and /dev/null differ diff --git a/.cache/go-build/85/85947105843c8d60a4c29afbcafc8dedd78b070510c2558f04fe9f2a2e99144a-a b/.cache/go-build/85/85947105843c8d60a4c29afbcafc8dedd78b070510c2558f04fe9f2a2e99144a-a deleted file mode 100644 index 9a898e9..0000000 --- a/.cache/go-build/85/85947105843c8d60a4c29afbcafc8dedd78b070510c2558f04fe9f2a2e99144a-a +++ /dev/null @@ -1 +0,0 @@ -v1 85947105843c8d60a4c29afbcafc8dedd78b070510c2558f04fe9f2a2e99144a 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775139398607929026 diff --git a/.cache/go-build/85/85cadff0262a9a0d6249500018c6f5d197a6231aec0db07da05ea46d8cc41e29-a b/.cache/go-build/85/85cadff0262a9a0d6249500018c6f5d197a6231aec0db07da05ea46d8cc41e29-a deleted file mode 100644 index 4842546..0000000 --- a/.cache/go-build/85/85cadff0262a9a0d6249500018c6f5d197a6231aec0db07da05ea46d8cc41e29-a +++ /dev/null @@ -1 +0,0 @@ -v1 85cadff0262a9a0d6249500018c6f5d197a6231aec0db07da05ea46d8cc41e29 76a190657ccd0db4615b611531fbb450d13fbb39c0fbe2bc7fbedf902686667d 10 1775136289422082535 diff --git a/.cache/go-build/85/85ce842846e0115a5614590e8ef527a348e850917e311a88d8478abddf8d1779-a b/.cache/go-build/85/85ce842846e0115a5614590e8ef527a348e850917e311a88d8478abddf8d1779-a deleted file mode 100644 index 0b44d8c..0000000 --- a/.cache/go-build/85/85ce842846e0115a5614590e8ef527a348e850917e311a88d8478abddf8d1779-a +++ /dev/null @@ -1 +0,0 @@ -v1 85ce842846e0115a5614590e8ef527a348e850917e311a88d8478abddf8d1779 317534f8ea017922fa3dbda21dc4192b09ab8c5a48ad5631999702f18f5ceb54 37 1775136286917717833 diff --git a/.cache/go-build/86/8605fb968f4d3bdb2f768af5a93746387e5853bd1cf58bb51c7ad9db5ecab5fd-a b/.cache/go-build/86/8605fb968f4d3bdb2f768af5a93746387e5853bd1cf58bb51c7ad9db5ecab5fd-a deleted file mode 100644 index eda761a..0000000 --- a/.cache/go-build/86/8605fb968f4d3bdb2f768af5a93746387e5853bd1cf58bb51c7ad9db5ecab5fd-a +++ /dev/null @@ -1 +0,0 @@ -v1 8605fb968f4d3bdb2f768af5a93746387e5853bd1cf58bb51c7ad9db5ecab5fd 831487b2e018bf6cbfcdc9749ea9aa82862b78b810f7a16f42d0fecc96414e4d 100338 1775136288793743425 diff --git a/.cache/go-build/86/869fdcd6c8936a68d20d8fece4797bccfcf8d0efc91eef75e1dbb1e8e8fd80ad-a b/.cache/go-build/86/869fdcd6c8936a68d20d8fece4797bccfcf8d0efc91eef75e1dbb1e8e8fd80ad-a deleted file mode 100644 index c965546..0000000 --- a/.cache/go-build/86/869fdcd6c8936a68d20d8fece4797bccfcf8d0efc91eef75e1dbb1e8e8fd80ad-a +++ /dev/null @@ -1 +0,0 @@ -v1 869fdcd6c8936a68d20d8fece4797bccfcf8d0efc91eef75e1dbb1e8e8fd80ad d474debdebcef9f3d16ac7bb9c45eba2d9bcd9ab9b481c45b5df23141e94f997 5187 1775136286936698067 diff --git a/.cache/go-build/86/86c50f82d928d5e07419b710520e80e5aa57319b70bb4bc4314ebe2f2f3e802c-a b/.cache/go-build/86/86c50f82d928d5e07419b710520e80e5aa57319b70bb4bc4314ebe2f2f3e802c-a deleted file mode 100644 index 9dc7935..0000000 --- a/.cache/go-build/86/86c50f82d928d5e07419b710520e80e5aa57319b70bb4bc4314ebe2f2f3e802c-a +++ /dev/null @@ -1 +0,0 @@ -v1 86c50f82d928d5e07419b710520e80e5aa57319b70bb4bc4314ebe2f2f3e802c fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422 15 1775137722072654236 diff --git a/.cache/go-build/86/86f7dc9e6dc6becc415eac189766dab68a1028143574dc0092edfed8246aeb39-d b/.cache/go-build/86/86f7dc9e6dc6becc415eac189766dab68a1028143574dc0092edfed8246aeb39-d deleted file mode 100644 index af91cba..0000000 Binary files a/.cache/go-build/86/86f7dc9e6dc6becc415eac189766dab68a1028143574dc0092edfed8246aeb39-d and /dev/null differ diff --git a/.cache/go-build/87/8703d50921795a0563957f70dc8439c2e5ffb363aa445e6757dd829d51a31364-d b/.cache/go-build/87/8703d50921795a0563957f70dc8439c2e5ffb363aa445e6757dd829d51a31364-d deleted file mode 100644 index 7588830..0000000 Binary files a/.cache/go-build/87/8703d50921795a0563957f70dc8439c2e5ffb363aa445e6757dd829d51a31364-d and /dev/null differ diff --git a/.cache/go-build/87/87136ed08f4a99cff0514f706a66fdd9995e654ea8b34b90e422986f9943bc62-d b/.cache/go-build/87/87136ed08f4a99cff0514f706a66fdd9995e654ea8b34b90e422986f9943bc62-d deleted file mode 100644 index c483ca3..0000000 Binary files a/.cache/go-build/87/87136ed08f4a99cff0514f706a66fdd9995e654ea8b34b90e422986f9943bc62-d and /dev/null differ diff --git a/.cache/go-build/87/8732b79b259055524ca0c17606c417f5d696893d0001b6043cfeef9b7589a6ec-d b/.cache/go-build/87/8732b79b259055524ca0c17606c417f5d696893d0001b6043cfeef9b7589a6ec-d deleted file mode 100644 index c854fa9..0000000 Binary files a/.cache/go-build/87/8732b79b259055524ca0c17606c417f5d696893d0001b6043cfeef9b7589a6ec-d and /dev/null differ diff --git a/.cache/go-build/87/874c7d9dba5c998e972e6dbc1b7826650d3060004ae2677702e900d00b085974-a b/.cache/go-build/87/874c7d9dba5c998e972e6dbc1b7826650d3060004ae2677702e900d00b085974-a deleted file mode 100644 index e0b221a..0000000 --- a/.cache/go-build/87/874c7d9dba5c998e972e6dbc1b7826650d3060004ae2677702e900d00b085974-a +++ /dev/null @@ -1 +0,0 @@ -v1 874c7d9dba5c998e972e6dbc1b7826650d3060004ae2677702e900d00b085974 25252f3aa143afe21d566228004bf90d7f9333d879bb19c52ddb46dc8f5365d9 527 1775136286845198042 diff --git a/.cache/go-build/87/879dcf6b46f6cb9abb0a2a708a2e1834051538c894128833cf0867e01b81bf0f-a b/.cache/go-build/87/879dcf6b46f6cb9abb0a2a708a2e1834051538c894128833cf0867e01b81bf0f-a deleted file mode 100644 index 3963957..0000000 --- a/.cache/go-build/87/879dcf6b46f6cb9abb0a2a708a2e1834051538c894128833cf0867e01b81bf0f-a +++ /dev/null @@ -1 +0,0 @@ -v1 879dcf6b46f6cb9abb0a2a708a2e1834051538c894128833cf0867e01b81bf0f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288517852238 diff --git a/.cache/go-build/87/87becfcbf85327ca30f05405947d066e52ee9d5e73cd4a7efc3115a4b4e429a7-a b/.cache/go-build/87/87becfcbf85327ca30f05405947d066e52ee9d5e73cd4a7efc3115a4b4e429a7-a deleted file mode 100644 index a70b589..0000000 --- a/.cache/go-build/87/87becfcbf85327ca30f05405947d066e52ee9d5e73cd4a7efc3115a4b4e429a7-a +++ /dev/null @@ -1 +0,0 @@ -v1 87becfcbf85327ca30f05405947d066e52ee9d5e73cd4a7efc3115a4b4e429a7 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289487798482 diff --git a/.cache/go-build/88/884e3cb97e9505ba0dbb0602b8a7f6d959471fe997efd9c1dc7f084e3a51efa9-a b/.cache/go-build/88/884e3cb97e9505ba0dbb0602b8a7f6d959471fe997efd9c1dc7f084e3a51efa9-a deleted file mode 100644 index 0d957ee..0000000 --- a/.cache/go-build/88/884e3cb97e9505ba0dbb0602b8a7f6d959471fe997efd9c1dc7f084e3a51efa9-a +++ /dev/null @@ -1 +0,0 @@ -v1 884e3cb97e9505ba0dbb0602b8a7f6d959471fe997efd9c1dc7f084e3a51efa9 824d5df15870c94c0e14087c715269c77f2d6642eb46f1fdc5008185fab9e7e2 50 1775136289422155415 diff --git a/.cache/go-build/88/885050daea4ca59615dc3d20424488d4b35c9356974e00c4bc02a99c9ffd4626-a b/.cache/go-build/88/885050daea4ca59615dc3d20424488d4b35c9356974e00c4bc02a99c9ffd4626-a deleted file mode 100644 index 3ada54a..0000000 --- a/.cache/go-build/88/885050daea4ca59615dc3d20424488d4b35c9356974e00c4bc02a99c9ffd4626-a +++ /dev/null @@ -1 +0,0 @@ -v1 885050daea4ca59615dc3d20424488d4b35c9356974e00c4bc02a99c9ffd4626 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286997340540 diff --git a/.cache/go-build/88/88b504d1071385e99c01032efa8bb60eccbffa399ea72329efbf1c677e449f4c-a b/.cache/go-build/88/88b504d1071385e99c01032efa8bb60eccbffa399ea72329efbf1c677e449f4c-a deleted file mode 100644 index 773c4c7..0000000 --- a/.cache/go-build/88/88b504d1071385e99c01032efa8bb60eccbffa399ea72329efbf1c677e449f4c-a +++ /dev/null @@ -1 +0,0 @@ -v1 88b504d1071385e99c01032efa8bb60eccbffa399ea72329efbf1c677e449f4c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287071140783 diff --git a/.cache/go-build/88/88c291f2c247d09a1bd1a9e7ce9919b75ac357b0caabd0f65da740dfd0572772-d b/.cache/go-build/88/88c291f2c247d09a1bd1a9e7ce9919b75ac357b0caabd0f65da740dfd0572772-d deleted file mode 100644 index 82ae787..0000000 Binary files a/.cache/go-build/88/88c291f2c247d09a1bd1a9e7ce9919b75ac357b0caabd0f65da740dfd0572772-d and /dev/null differ diff --git a/.cache/go-build/89/890c85674dfc58896d8d54cc5faaf101801bae45071454ef3f217ca8eca3c181-d b/.cache/go-build/89/890c85674dfc58896d8d54cc5faaf101801bae45071454ef3f217ca8eca3c181-d deleted file mode 100644 index 7656040..0000000 Binary files a/.cache/go-build/89/890c85674dfc58896d8d54cc5faaf101801bae45071454ef3f217ca8eca3c181-d and /dev/null differ diff --git a/.cache/go-build/89/8939ba572b2a587b98ca8b71713a961f165e07d217ffea19f17574af83f7ca14-a b/.cache/go-build/89/8939ba572b2a587b98ca8b71713a961f165e07d217ffea19f17574af83f7ca14-a deleted file mode 100644 index 9106fb3..0000000 --- a/.cache/go-build/89/8939ba572b2a587b98ca8b71713a961f165e07d217ffea19f17574af83f7ca14-a +++ /dev/null @@ -1 +0,0 @@ -v1 8939ba572b2a587b98ca8b71713a961f165e07d217ffea19f17574af83f7ca14 47ca5f743267f9ce20acca61d1cef5a2decb9ca3b17d19f59f01a590b70e8b5c 10 1775136289029988424 diff --git a/.cache/go-build/89/899e32da429f34c411e2287e578632246f36e16688002521b84ae3d02dbb2547-a b/.cache/go-build/89/899e32da429f34c411e2287e578632246f36e16688002521b84ae3d02dbb2547-a deleted file mode 100644 index ff42e0a..0000000 --- a/.cache/go-build/89/899e32da429f34c411e2287e578632246f36e16688002521b84ae3d02dbb2547-a +++ /dev/null @@ -1 +0,0 @@ -v1 899e32da429f34c411e2287e578632246f36e16688002521b84ae3d02dbb2547 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184037568218 diff --git a/.cache/go-build/89/89a6b4edc07056739f729bc648f1a4eb8ae4a0dd765f2a19568f0e6a8e4bcb28-a b/.cache/go-build/89/89a6b4edc07056739f729bc648f1a4eb8ae4a0dd765f2a19568f0e6a8e4bcb28-a deleted file mode 100644 index 79e5b11..0000000 --- a/.cache/go-build/89/89a6b4edc07056739f729bc648f1a4eb8ae4a0dd765f2a19568f0e6a8e4bcb28-a +++ /dev/null @@ -1 +0,0 @@ -v1 89a6b4edc07056739f729bc648f1a4eb8ae4a0dd765f2a19568f0e6a8e4bcb28 74ebd537f66caa7f9ee79c06f9b8309610e7f32cbcbd2d2a30b6645612909f57 31704 1775136286956756401 diff --git a/.cache/go-build/89/89b0e9ed76cbb385828adef9a19cb3170d1f83f265bc1dd52790e72a816cd34b-a b/.cache/go-build/89/89b0e9ed76cbb385828adef9a19cb3170d1f83f265bc1dd52790e72a816cd34b-a deleted file mode 100644 index 1d99acb..0000000 --- a/.cache/go-build/89/89b0e9ed76cbb385828adef9a19cb3170d1f83f265bc1dd52790e72a816cd34b-a +++ /dev/null @@ -1 +0,0 @@ -v1 89b0e9ed76cbb385828adef9a19cb3170d1f83f265bc1dd52790e72a816cd34b d4464508a691a9308d7797ba6b6349840a73c5d0b41ae2b0a73a416f53a577ac 116918 1775137721919813376 diff --git a/.cache/go-build/89/89cbb64e697ff2945c4df871a2a3645e4065bb5e9dea2b342a5ac9886c01821e-d b/.cache/go-build/89/89cbb64e697ff2945c4df871a2a3645e4065bb5e9dea2b342a5ac9886c01821e-d deleted file mode 100644 index 6c14972..0000000 Binary files a/.cache/go-build/89/89cbb64e697ff2945c4df871a2a3645e4065bb5e9dea2b342a5ac9886c01821e-d and /dev/null differ diff --git a/.cache/go-build/8a/8a07f7e0da2c2965acb0e873b22d40c52dbc77a21b3d6df04faf67daad77f80b-a b/.cache/go-build/8a/8a07f7e0da2c2965acb0e873b22d40c52dbc77a21b3d6df04faf67daad77f80b-a deleted file mode 100644 index 592e88e..0000000 --- a/.cache/go-build/8a/8a07f7e0da2c2965acb0e873b22d40c52dbc77a21b3d6df04faf67daad77f80b-a +++ /dev/null @@ -1 +0,0 @@ -v1 8a07f7e0da2c2965acb0e873b22d40c52dbc77a21b3d6df04faf67daad77f80b 2d95d52855b47e03aebf9afc2ab35c92390a1d01ff6e1c4ac7dc5b6e7b672d8d 2588834 1775141782763700416 diff --git a/.cache/go-build/8a/8a2ea2358e1082374a018cea6a5b680f5ff4154abc73f6a08a2c59f055c8ab43-d b/.cache/go-build/8a/8a2ea2358e1082374a018cea6a5b680f5ff4154abc73f6a08a2c59f055c8ab43-d deleted file mode 100644 index 62bac3b..0000000 Binary files a/.cache/go-build/8a/8a2ea2358e1082374a018cea6a5b680f5ff4154abc73f6a08a2c59f055c8ab43-d and /dev/null differ diff --git a/.cache/go-build/8a/8a7d43b8310e1b5f56f171c95b7d188294e3a23a69401ee05f6689962e1945f4-a b/.cache/go-build/8a/8a7d43b8310e1b5f56f171c95b7d188294e3a23a69401ee05f6689962e1945f4-a deleted file mode 100644 index 312370a..0000000 --- a/.cache/go-build/8a/8a7d43b8310e1b5f56f171c95b7d188294e3a23a69401ee05f6689962e1945f4-a +++ /dev/null @@ -1 +0,0 @@ -v1 8a7d43b8310e1b5f56f171c95b7d188294e3a23a69401ee05f6689962e1945f4 21faa15c5febcadadca5225fffd0292072de38e138bf5fe2ff635cc6450d7c4e 52 1775136286970736991 diff --git a/.cache/go-build/8a/8a8f4eaec6b82e61f441a393e8751393a1d624081341c5e06b42f12182311bfa-a b/.cache/go-build/8a/8a8f4eaec6b82e61f441a393e8751393a1d624081341c5e06b42f12182311bfa-a deleted file mode 100644 index 14e20c8..0000000 --- a/.cache/go-build/8a/8a8f4eaec6b82e61f441a393e8751393a1d624081341c5e06b42f12182311bfa-a +++ /dev/null @@ -1 +0,0 @@ -v1 8a8f4eaec6b82e61f441a393e8751393a1d624081341c5e06b42f12182311bfa 0f57dbda1867ab405271f7a2b18db01bffe943f8f007122f0f9f13f5e7615bb6 19 1775136288451590031 diff --git a/.cache/go-build/8a/8ac30b095f5a1f7bd611d28cc929cc25487976cfe18dbc3d3dfa9a33ed8cffbc-a b/.cache/go-build/8a/8ac30b095f5a1f7bd611d28cc929cc25487976cfe18dbc3d3dfa9a33ed8cffbc-a deleted file mode 100644 index 8abd4ac..0000000 --- a/.cache/go-build/8a/8ac30b095f5a1f7bd611d28cc929cc25487976cfe18dbc3d3dfa9a33ed8cffbc-a +++ /dev/null @@ -1 +0,0 @@ -v1 8ac30b095f5a1f7bd611d28cc929cc25487976cfe18dbc3d3dfa9a33ed8cffbc e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289154816264 diff --git a/.cache/go-build/8a/8ac5a7f4fe57678c406d2ee90d0b24366182395487c188706a6a5e615297bb8e-d b/.cache/go-build/8a/8ac5a7f4fe57678c406d2ee90d0b24366182395487c188706a6a5e615297bb8e-d deleted file mode 100644 index 0d394b7..0000000 Binary files a/.cache/go-build/8a/8ac5a7f4fe57678c406d2ee90d0b24366182395487c188706a6a5e615297bb8e-d and /dev/null differ diff --git a/.cache/go-build/8a/8ad6393f0ba3d430109ee2a9caa1e29e1887996745db958a2aeaf51ba40486f6-a b/.cache/go-build/8a/8ad6393f0ba3d430109ee2a9caa1e29e1887996745db958a2aeaf51ba40486f6-a deleted file mode 100644 index d0b1e2d..0000000 --- a/.cache/go-build/8a/8ad6393f0ba3d430109ee2a9caa1e29e1887996745db958a2aeaf51ba40486f6-a +++ /dev/null @@ -1 +0,0 @@ -v1 8ad6393f0ba3d430109ee2a9caa1e29e1887996745db958a2aeaf51ba40486f6 00dedcbaf5dd36c49447863279d4bf0649eb1838d56074e8076fc688dff92fca 13 1775136288522621361 diff --git a/.cache/go-build/8a/8adb667a9406e747fe3d0a32f571a110dd9f5816f02a19119e2c49e7f8256311-a b/.cache/go-build/8a/8adb667a9406e747fe3d0a32f571a110dd9f5816f02a19119e2c49e7f8256311-a deleted file mode 100644 index 2e19d0c..0000000 --- a/.cache/go-build/8a/8adb667a9406e747fe3d0a32f571a110dd9f5816f02a19119e2c49e7f8256311-a +++ /dev/null @@ -1 +0,0 @@ -v1 8adb667a9406e747fe3d0a32f571a110dd9f5816f02a19119e2c49e7f8256311 23446b7fe0929eafcf3aab1786c53dfb76840f440b877bffe98127556087c416 101 1775136286936302687 diff --git a/.cache/go-build/8a/8ae6e84e87eea377b17c4e54538134aeac6fed932599a2bb9bab8f1f8a13410b-d b/.cache/go-build/8a/8ae6e84e87eea377b17c4e54538134aeac6fed932599a2bb9bab8f1f8a13410b-d deleted file mode 100644 index f2785b0..0000000 Binary files a/.cache/go-build/8a/8ae6e84e87eea377b17c4e54538134aeac6fed932599a2bb9bab8f1f8a13410b-d and /dev/null differ diff --git a/.cache/go-build/8b/8b11b9bacc540831408cdf86aaca8906a4f789ba105cabc85d729eb20b44cdd4-a b/.cache/go-build/8b/8b11b9bacc540831408cdf86aaca8906a4f789ba105cabc85d729eb20b44cdd4-a deleted file mode 100644 index e4582a1..0000000 --- a/.cache/go-build/8b/8b11b9bacc540831408cdf86aaca8906a4f789ba105cabc85d729eb20b44cdd4-a +++ /dev/null @@ -1 +0,0 @@ -v1 8b11b9bacc540831408cdf86aaca8906a4f789ba105cabc85d729eb20b44cdd4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289382687297 diff --git a/.cache/go-build/8b/8b2c8721f67c96fc171c72710afb62e3d43bd29cc9e255655cb2cf3f7f3cea45-a b/.cache/go-build/8b/8b2c8721f67c96fc171c72710afb62e3d43bd29cc9e255655cb2cf3f7f3cea45-a deleted file mode 100644 index 4036394..0000000 --- a/.cache/go-build/8b/8b2c8721f67c96fc171c72710afb62e3d43bd29cc9e255655cb2cf3f7f3cea45-a +++ /dev/null @@ -1 +0,0 @@ -v1 8b2c8721f67c96fc171c72710afb62e3d43bd29cc9e255655cb2cf3f7f3cea45 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721894956688 diff --git a/.cache/go-build/8b/8b53bcba2bc0367650cef04b49781937606ad4401f31661bbdc72575c29986b2-a b/.cache/go-build/8b/8b53bcba2bc0367650cef04b49781937606ad4401f31661bbdc72575c29986b2-a deleted file mode 100644 index 67b333d..0000000 --- a/.cache/go-build/8b/8b53bcba2bc0367650cef04b49781937606ad4401f31661bbdc72575c29986b2-a +++ /dev/null @@ -1 +0,0 @@ -v1 8b53bcba2bc0367650cef04b49781937606ad4401f31661bbdc72575c29986b2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287040813212 diff --git a/.cache/go-build/8b/8ba344351c76bf8a3fb917a1c9eb729e8da83e66d16c58658da47d3f4591b832-a b/.cache/go-build/8b/8ba344351c76bf8a3fb917a1c9eb729e8da83e66d16c58658da47d3f4591b832-a deleted file mode 100644 index 3644606..0000000 --- a/.cache/go-build/8b/8ba344351c76bf8a3fb917a1c9eb729e8da83e66d16c58658da47d3f4591b832-a +++ /dev/null @@ -1 +0,0 @@ -v1 8ba344351c76bf8a3fb917a1c9eb729e8da83e66d16c58658da47d3f4591b832 ec49f2323f4e361d13d2fefbffeeebed6c8ac43006e0ce55ddab61be4366420b 551 1775136286910467568 diff --git a/.cache/go-build/8b/8bb1d2921c77b0117ae1cae9ff8749958c6fc65959a5d73e52248e4bfbd73f54-d b/.cache/go-build/8b/8bb1d2921c77b0117ae1cae9ff8749958c6fc65959a5d73e52248e4bfbd73f54-d deleted file mode 100644 index b5dc299..0000000 Binary files a/.cache/go-build/8b/8bb1d2921c77b0117ae1cae9ff8749958c6fc65959a5d73e52248e4bfbd73f54-d and /dev/null differ diff --git a/.cache/go-build/8b/8bd113649e8bfe5dd5b0d9f817f1f1b60f27467a3fe24374a77766a4f23da58a-a b/.cache/go-build/8b/8bd113649e8bfe5dd5b0d9f817f1f1b60f27467a3fe24374a77766a4f23da58a-a deleted file mode 100644 index ba14f7e..0000000 --- a/.cache/go-build/8b/8bd113649e8bfe5dd5b0d9f817f1f1b60f27467a3fe24374a77766a4f23da58a-a +++ /dev/null @@ -1 +0,0 @@ -v1 8bd113649e8bfe5dd5b0d9f817f1f1b60f27467a3fe24374a77766a4f23da58a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287141969484 diff --git a/.cache/go-build/8b/8bd715270f6c9caa63bd28a09a3f609b0ccc62ab3dd858c6ef8cdbcc05ec666e-a b/.cache/go-build/8b/8bd715270f6c9caa63bd28a09a3f609b0ccc62ab3dd858c6ef8cdbcc05ec666e-a deleted file mode 100644 index 794c70c..0000000 --- a/.cache/go-build/8b/8bd715270f6c9caa63bd28a09a3f609b0ccc62ab3dd858c6ef8cdbcc05ec666e-a +++ /dev/null @@ -1 +0,0 @@ -v1 8bd715270f6c9caa63bd28a09a3f609b0ccc62ab3dd858c6ef8cdbcc05ec666e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287150219190 diff --git a/.cache/go-build/8b/8bd916822b2a3eb28972b09977b4906acb1b6308852fd3e0024d1c1283d74d41-d/inspect b/.cache/go-build/8b/8bd916822b2a3eb28972b09977b4906acb1b6308852fd3e0024d1c1283d74d41-d/inspect deleted file mode 100755 index 07a40e5..0000000 Binary files a/.cache/go-build/8b/8bd916822b2a3eb28972b09977b4906acb1b6308852fd3e0024d1c1283d74d41-d/inspect and /dev/null differ diff --git a/.cache/go-build/8c/8c6bd3bd43dc7ef5bd810b831f989a8089e62e200923d73153999a174403b40f-a b/.cache/go-build/8c/8c6bd3bd43dc7ef5bd810b831f989a8089e62e200923d73153999a174403b40f-a deleted file mode 100644 index bcba88a..0000000 --- a/.cache/go-build/8c/8c6bd3bd43dc7ef5bd810b831f989a8089e62e200923d73153999a174403b40f-a +++ /dev/null @@ -1 +0,0 @@ -v1 8c6bd3bd43dc7ef5bd810b831f989a8089e62e200923d73153999a174403b40f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287188165577 diff --git a/.cache/go-build/8c/8c95275c33595db51a06588255fd228f58cc80407ad9f38acb1bdf106b7d2f4e-d b/.cache/go-build/8c/8c95275c33595db51a06588255fd228f58cc80407ad9f38acb1bdf106b7d2f4e-d deleted file mode 100644 index b7e476c..0000000 Binary files a/.cache/go-build/8c/8c95275c33595db51a06588255fd228f58cc80407ad9f38acb1bdf106b7d2f4e-d and /dev/null differ diff --git a/.cache/go-build/8c/8cb86c4b09abef2a77180b5144a0090d624ebe89fb399799580be68c796683b6-a b/.cache/go-build/8c/8cb86c4b09abef2a77180b5144a0090d624ebe89fb399799580be68c796683b6-a deleted file mode 100644 index de2b941..0000000 --- a/.cache/go-build/8c/8cb86c4b09abef2a77180b5144a0090d624ebe89fb399799580be68c796683b6-a +++ /dev/null @@ -1 +0,0 @@ -v1 8cb86c4b09abef2a77180b5144a0090d624ebe89fb399799580be68c796683b6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775141782712175839 diff --git a/.cache/go-build/8c/8cd41adbde842a2ab2ed5e5eb2739d958afb6612cc27f509735299628265a32c-a b/.cache/go-build/8c/8cd41adbde842a2ab2ed5e5eb2739d958afb6612cc27f509735299628265a32c-a deleted file mode 100644 index db2e1cd..0000000 --- a/.cache/go-build/8c/8cd41adbde842a2ab2ed5e5eb2739d958afb6612cc27f509735299628265a32c-a +++ /dev/null @@ -1 +0,0 @@ -v1 8cd41adbde842a2ab2ed5e5eb2739d958afb6612cc27f509735299628265a32c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721887971613 diff --git a/.cache/go-build/8c/8cd8f38a0f6181099c2938f23b7b6ab202d0c806478e5c39d692dd6c2a94ebf6-a b/.cache/go-build/8c/8cd8f38a0f6181099c2938f23b7b6ab202d0c806478e5c39d692dd6c2a94ebf6-a deleted file mode 100644 index 20f3698..0000000 --- a/.cache/go-build/8c/8cd8f38a0f6181099c2938f23b7b6ab202d0c806478e5c39d692dd6c2a94ebf6-a +++ /dev/null @@ -1 +0,0 @@ -v1 8cd8f38a0f6181099c2938f23b7b6ab202d0c806478e5c39d692dd6c2a94ebf6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288497577833 diff --git a/.cache/go-build/8c/8cfe63fd35dac339382800a1597452dfe628c7f5fdd2522f782ac57fbd8f9b8f-a b/.cache/go-build/8c/8cfe63fd35dac339382800a1597452dfe628c7f5fdd2522f782ac57fbd8f9b8f-a deleted file mode 100644 index 196ae78..0000000 --- a/.cache/go-build/8c/8cfe63fd35dac339382800a1597452dfe628c7f5fdd2522f782ac57fbd8f9b8f-a +++ /dev/null @@ -1 +0,0 @@ -v1 8cfe63fd35dac339382800a1597452dfe628c7f5fdd2522f782ac57fbd8f9b8f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287163136009 diff --git a/.cache/go-build/8d/8d59223399700c903d3107aaba198902c4d549916c195e78943bd6875115f020-a b/.cache/go-build/8d/8d59223399700c903d3107aaba198902c4d549916c195e78943bd6875115f020-a deleted file mode 100644 index 67aa04c..0000000 --- a/.cache/go-build/8d/8d59223399700c903d3107aaba198902c4d549916c195e78943bd6875115f020-a +++ /dev/null @@ -1 +0,0 @@ -v1 8d59223399700c903d3107aaba198902c4d549916c195e78943bd6875115f020 88c291f2c247d09a1bd1a9e7ce9919b75ac357b0caabd0f65da740dfd0572772 1728 1775136286919169365 diff --git a/.cache/go-build/8d/8d75b207567527ef4b8e9eceed25209c1009c117a8042d5672d1a629acf598e1-a b/.cache/go-build/8d/8d75b207567527ef4b8e9eceed25209c1009c117a8042d5672d1a629acf598e1-a deleted file mode 100644 index 508976b..0000000 --- a/.cache/go-build/8d/8d75b207567527ef4b8e9eceed25209c1009c117a8042d5672d1a629acf598e1-a +++ /dev/null @@ -1 +0,0 @@ -v1 8d75b207567527ef4b8e9eceed25209c1009c117a8042d5672d1a629acf598e1 c03800a08c0f3bc37d82cdff25b96202c924ccccb418e728fc17436cfde7aa6f 11 1775136287034864687 diff --git a/.cache/go-build/8d/8daaaf018c9f290dfe83d78f1ecdbe152c00553edd4dd29e4108cfa32e9cbe41-a b/.cache/go-build/8d/8daaaf018c9f290dfe83d78f1ecdbe152c00553edd4dd29e4108cfa32e9cbe41-a deleted file mode 100644 index 9b03a65..0000000 --- a/.cache/go-build/8d/8daaaf018c9f290dfe83d78f1ecdbe152c00553edd4dd29e4108cfa32e9cbe41-a +++ /dev/null @@ -1 +0,0 @@ -v1 8daaaf018c9f290dfe83d78f1ecdbe152c00553edd4dd29e4108cfa32e9cbe41 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289000294063 diff --git a/.cache/go-build/8d/8db6f9540189f2eae5145862f8bed26b0a2f4e0a606b8c902e3442fadad15898-a b/.cache/go-build/8d/8db6f9540189f2eae5145862f8bed26b0a2f4e0a606b8c902e3442fadad15898-a deleted file mode 100644 index 68a6933..0000000 --- a/.cache/go-build/8d/8db6f9540189f2eae5145862f8bed26b0a2f4e0a606b8c902e3442fadad15898-a +++ /dev/null @@ -1 +0,0 @@ -v1 8db6f9540189f2eae5145862f8bed26b0a2f4e0a606b8c902e3442fadad15898 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289411696787 diff --git a/.cache/go-build/8d/8dc4daa9b849cace43fc1093bbefda3718d864a209ae80549b11463787afef8c-a b/.cache/go-build/8d/8dc4daa9b849cace43fc1093bbefda3718d864a209ae80549b11463787afef8c-a deleted file mode 100644 index e9c382f..0000000 --- a/.cache/go-build/8d/8dc4daa9b849cace43fc1093bbefda3718d864a209ae80549b11463787afef8c-a +++ /dev/null @@ -1 +0,0 @@ -v1 8dc4daa9b849cace43fc1093bbefda3718d864a209ae80549b11463787afef8c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289146671408 diff --git a/.cache/go-build/8d/8dcd3d5447ffd4b31b2405879c55583e8db02990525db4fc9c5ee11be4291870-d b/.cache/go-build/8d/8dcd3d5447ffd4b31b2405879c55583e8db02990525db4fc9c5ee11be4291870-d deleted file mode 100644 index 1be2a8d..0000000 Binary files a/.cache/go-build/8d/8dcd3d5447ffd4b31b2405879c55583e8db02990525db4fc9c5ee11be4291870-d and /dev/null differ diff --git a/.cache/go-build/8d/8dfc3a5c7bd4a7863ae3eb37370291884a69a61ba3ac0640df3103646d3ff268-d b/.cache/go-build/8d/8dfc3a5c7bd4a7863ae3eb37370291884a69a61ba3ac0640df3103646d3ff268-d deleted file mode 100644 index d39d63a..0000000 Binary files a/.cache/go-build/8d/8dfc3a5c7bd4a7863ae3eb37370291884a69a61ba3ac0640df3103646d3ff268-d and /dev/null differ diff --git a/.cache/go-build/8e/8e448f2c6906d0bd76f37a080ef301d2fa17a6c846f6ac1804c7ddb07f890b6d-d b/.cache/go-build/8e/8e448f2c6906d0bd76f37a080ef301d2fa17a6c846f6ac1804c7ddb07f890b6d-d deleted file mode 100644 index 215f45f..0000000 Binary files a/.cache/go-build/8e/8e448f2c6906d0bd76f37a080ef301d2fa17a6c846f6ac1804c7ddb07f890b6d-d and /dev/null differ diff --git a/.cache/go-build/8e/8e7a17e8918812fa786bd38c5ac075e32cf483e7779704cc34f0bb214efdb453-a b/.cache/go-build/8e/8e7a17e8918812fa786bd38c5ac075e32cf483e7779704cc34f0bb214efdb453-a deleted file mode 100644 index 337b2ad..0000000 --- a/.cache/go-build/8e/8e7a17e8918812fa786bd38c5ac075e32cf483e7779704cc34f0bb214efdb453-a +++ /dev/null @@ -1 +0,0 @@ -v1 8e7a17e8918812fa786bd38c5ac075e32cf483e7779704cc34f0bb214efdb453 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398494130955 diff --git a/.cache/go-build/8e/8e8c765f0f1d94fd2717c21c60d43ee3382b85c571b572e6dca934ba01930956-a b/.cache/go-build/8e/8e8c765f0f1d94fd2717c21c60d43ee3382b85c571b572e6dca934ba01930956-a deleted file mode 100644 index 31ba7b0..0000000 --- a/.cache/go-build/8e/8e8c765f0f1d94fd2717c21c60d43ee3382b85c571b572e6dca934ba01930956-a +++ /dev/null @@ -1 +0,0 @@ -v1 8e8c765f0f1d94fd2717c21c60d43ee3382b85c571b572e6dca934ba01930956 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289161343978 diff --git a/.cache/go-build/8e/8eed480a0c608a7c3701e2d32f9e44993a6aabb42031390f5c3337b6d0e379e8-a b/.cache/go-build/8e/8eed480a0c608a7c3701e2d32f9e44993a6aabb42031390f5c3337b6d0e379e8-a deleted file mode 100644 index b226841..0000000 --- a/.cache/go-build/8e/8eed480a0c608a7c3701e2d32f9e44993a6aabb42031390f5c3337b6d0e379e8-a +++ /dev/null @@ -1 +0,0 @@ -v1 8eed480a0c608a7c3701e2d32f9e44993a6aabb42031390f5c3337b6d0e379e8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289840809254 diff --git a/.cache/go-build/8f/8f9860d43ed8a00f452a5724af24ebc18564970216d1511ea83a20cf773f8ed8-a b/.cache/go-build/8f/8f9860d43ed8a00f452a5724af24ebc18564970216d1511ea83a20cf773f8ed8-a deleted file mode 100644 index f1f7554..0000000 --- a/.cache/go-build/8f/8f9860d43ed8a00f452a5724af24ebc18564970216d1511ea83a20cf773f8ed8-a +++ /dev/null @@ -1 +0,0 @@ -v1 8f9860d43ed8a00f452a5724af24ebc18564970216d1511ea83a20cf773f8ed8 aa4e1c0b2e202c8c3d7db84eb03ae3c6f17ad5a80d729d1d93fc3545c1e81e47 101 1775136289422169485 diff --git a/.cache/go-build/8f/8fcc41dfe9c4f88d72809f09252a8d8b9827c235e834351499701c1d64409776-d b/.cache/go-build/8f/8fcc41dfe9c4f88d72809f09252a8d8b9827c235e834351499701c1d64409776-d deleted file mode 100644 index 1edddec..0000000 Binary files a/.cache/go-build/8f/8fcc41dfe9c4f88d72809f09252a8d8b9827c235e834351499701c1d64409776-d and /dev/null differ diff --git a/.cache/go-build/8f/8ffad5ad66a663fbe914dce4a92a0cae8acb7a07387fd3def30016b5675f82b5-a b/.cache/go-build/8f/8ffad5ad66a663fbe914dce4a92a0cae8acb7a07387fd3def30016b5675f82b5-a deleted file mode 100644 index d86aa84..0000000 --- a/.cache/go-build/8f/8ffad5ad66a663fbe914dce4a92a0cae8acb7a07387fd3def30016b5675f82b5-a +++ /dev/null @@ -1 +0,0 @@ -v1 8ffad5ad66a663fbe914dce4a92a0cae8acb7a07387fd3def30016b5675f82b5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288582324954 diff --git a/.cache/go-build/90/900337a7246f3cdecdb736b00c7852f0771319ef7f3bad3585706c9985dd6094-a b/.cache/go-build/90/900337a7246f3cdecdb736b00c7852f0771319ef7f3bad3585706c9985dd6094-a deleted file mode 100644 index ddeb59a..0000000 --- a/.cache/go-build/90/900337a7246f3cdecdb736b00c7852f0771319ef7f3bad3585706c9985dd6094-a +++ /dev/null @@ -1 +0,0 @@ -v1 900337a7246f3cdecdb736b00c7852f0771319ef7f3bad3585706c9985dd6094 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139461391250482 diff --git a/.cache/go-build/90/900e0fc58a519e7228d33c899857393b537650bc16fffef90c90c8bd3956162f-a b/.cache/go-build/90/900e0fc58a519e7228d33c899857393b537650bc16fffef90c90c8bd3956162f-a deleted file mode 100644 index dc2928f..0000000 --- a/.cache/go-build/90/900e0fc58a519e7228d33c899857393b537650bc16fffef90c90c8bd3956162f-a +++ /dev/null @@ -1 +0,0 @@ -v1 900e0fc58a519e7228d33c899857393b537650bc16fffef90c90c8bd3956162f 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775137721870747761 diff --git a/.cache/go-build/90/901a115bbb89bb5c3042c15bebc8ae38a3ab053486a8bface4a3aff532db432a-d b/.cache/go-build/90/901a115bbb89bb5c3042c15bebc8ae38a3ab053486a8bface4a3aff532db432a-d deleted file mode 100644 index 45a7d56..0000000 --- a/.cache/go-build/90/901a115bbb89bb5c3042c15bebc8ae38a3ab053486a8bface4a3aff532db432a-d +++ /dev/null @@ -1,5 +0,0 @@ -./casetables.go -./digit.go -./graphic.go -./letter.go -./tables.go diff --git a/.cache/go-build/90/903b6095c339341059326d83cf0251ed38bc5c612da04ca59d1ba8e7a6c57843-a b/.cache/go-build/90/903b6095c339341059326d83cf0251ed38bc5c612da04ca59d1ba8e7a6c57843-a deleted file mode 100644 index 5e006b0..0000000 --- a/.cache/go-build/90/903b6095c339341059326d83cf0251ed38bc5c612da04ca59d1ba8e7a6c57843-a +++ /dev/null @@ -1 +0,0 @@ -v1 903b6095c339341059326d83cf0251ed38bc5c612da04ca59d1ba8e7a6c57843 567d3bf7bcb30d5ac0cd4133d1a5f89eef94f91c4b208d1bbb2984b0b7b16d81 106638 1775136289398603188 diff --git a/.cache/go-build/90/9043b64e362b95fadde36d1561180a2036f59f585e4ec2952e37c9e6ebda9265-a b/.cache/go-build/90/9043b64e362b95fadde36d1561180a2036f59f585e4ec2952e37c9e6ebda9265-a deleted file mode 100644 index 3c57052..0000000 --- a/.cache/go-build/90/9043b64e362b95fadde36d1561180a2036f59f585e4ec2952e37c9e6ebda9265-a +++ /dev/null @@ -1 +0,0 @@ -v1 9043b64e362b95fadde36d1561180a2036f59f585e4ec2952e37c9e6ebda9265 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287028688133 diff --git a/.cache/go-build/90/90541d1b02e6821db9ad9e6b3a1696bead823afd6400ab95872f9be8e2bb08b2-d b/.cache/go-build/90/90541d1b02e6821db9ad9e6b3a1696bead823afd6400ab95872f9be8e2bb08b2-d deleted file mode 100644 index 31f2aaa..0000000 Binary files a/.cache/go-build/90/90541d1b02e6821db9ad9e6b3a1696bead823afd6400ab95872f9be8e2bb08b2-d and /dev/null differ diff --git a/.cache/go-build/90/907e55d399c6bb3ccd60b74a3ef01fe5c95f29266db766a07c17e4ec2574c083-d b/.cache/go-build/90/907e55d399c6bb3ccd60b74a3ef01fe5c95f29266db766a07c17e4ec2574c083-d deleted file mode 100644 index 45620b5..0000000 Binary files a/.cache/go-build/90/907e55d399c6bb3ccd60b74a3ef01fe5c95f29266db766a07c17e4ec2574c083-d and /dev/null differ diff --git a/.cache/go-build/90/90b81f0c529f0f14a7174191922eea0167922fe46b5805081cb9dc305817f746-a b/.cache/go-build/90/90b81f0c529f0f14a7174191922eea0167922fe46b5805081cb9dc305817f746-a deleted file mode 100644 index 42fd437..0000000 --- a/.cache/go-build/90/90b81f0c529f0f14a7174191922eea0167922fe46b5805081cb9dc305817f746-a +++ /dev/null @@ -1 +0,0 @@ -v1 90b81f0c529f0f14a7174191922eea0167922fe46b5805081cb9dc305817f746 8dcd3d5447ffd4b31b2405879c55583e8db02990525db4fc9c5ee11be4291870 393 1775136286833974844 diff --git a/.cache/go-build/90/90e74502d3bff81a605160796d253c8c23fa9961296ff803994f0174d2961ce7-a b/.cache/go-build/90/90e74502d3bff81a605160796d253c8c23fa9961296ff803994f0174d2961ce7-a deleted file mode 100644 index d8a88fa..0000000 --- a/.cache/go-build/90/90e74502d3bff81a605160796d253c8c23fa9961296ff803994f0174d2961ce7-a +++ /dev/null @@ -1 +0,0 @@ -v1 90e74502d3bff81a605160796d253c8c23fa9961296ff803994f0174d2961ce7 65682fc4a853570ad6a6d612a32aa4f25db9fb86d8e5cfc79e651d73a0445cf3 134 1775136288436656240 diff --git a/.cache/go-build/91/9106730d0748a572b5f0ca451dd37b4986ce06692970b53f177a4476123931bf-d b/.cache/go-build/91/9106730d0748a572b5f0ca451dd37b4986ce06692970b53f177a4476123931bf-d deleted file mode 100644 index d8290b5..0000000 Binary files a/.cache/go-build/91/9106730d0748a572b5f0ca451dd37b4986ce06692970b53f177a4476123931bf-d and /dev/null differ diff --git a/.cache/go-build/91/9158a5d9d6442aa12fdb3adf3cb106077aa3a24f7dbd6de70df331cb63b4ed5c-d b/.cache/go-build/91/9158a5d9d6442aa12fdb3adf3cb106077aa3a24f7dbd6de70df331cb63b4ed5c-d deleted file mode 100644 index 176bc56..0000000 --- a/.cache/go-build/91/9158a5d9d6442aa12fdb3adf3cb106077aa3a24f7dbd6de70df331cb63b4ed5c-d +++ /dev/null @@ -1,10 +0,0 @@ -./allocs.go -./benchmark.go -./cover.go -./example.go -./fuzz.go -./match.go -./newcover.go -./run_example.go -./testing.go -./testing_other.go diff --git a/.cache/go-build/91/917855d854c7a83ea2d6774e582006f05517f07bb1dc5f45333e6d74e3a0a8d3-a b/.cache/go-build/91/917855d854c7a83ea2d6774e582006f05517f07bb1dc5f45333e6d74e3a0a8d3-a deleted file mode 100644 index d7ad552..0000000 --- a/.cache/go-build/91/917855d854c7a83ea2d6774e582006f05517f07bb1dc5f45333e6d74e3a0a8d3-a +++ /dev/null @@ -1 +0,0 @@ -v1 917855d854c7a83ea2d6774e582006f05517f07bb1dc5f45333e6d74e3a0a8d3 2293db70ae4189c4a53fd8073c6e362764b6ccdbdac1db8c8595bb2cd6256db0 636 1775136286836203265 diff --git a/.cache/go-build/91/91b7106bf0aad0459ee95b966f07b8f5ece98950a44cd3c499744ac8d6cd7532-d b/.cache/go-build/91/91b7106bf0aad0459ee95b966f07b8f5ece98950a44cd3c499744ac8d6cd7532-d deleted file mode 100644 index 410125c..0000000 --- a/.cache/go-build/91/91b7106bf0aad0459ee95b966f07b8f5ece98950a44cd3c499744ac8d6cd7532-d +++ /dev/null @@ -1,198 +0,0 @@ -./alg.go -./arena.go -./asan0.go -./atomic_pointer.go -./badlinkname.go -./badlinkname_linux.go -./cgo.go -./cgo_mmap.go -./cgo_sigaction.go -./cgocall.go -./cgocallback.go -./cgocheck.go -./cgroup_linux.go -./chan.go -./checkptr.go -./compiler.go -./complex.go -./coro.go -./covercounter.go -./covermeta.go -./cpuflags.go -./cpuflags_amd64.go -./cpuprof.go -./cputicks.go -./create_file_unix.go -./debug.go -./debugcall.go -./debuglog.go -./debuglog_off.go -./defs_linux_amd64.go -./dit.go -./env_posix.go -./error.go -./extern.go -./fastlog2.go -./fastlog2table.go -./fds_unix.go -./fipsbypass.go -./float.go -./hash64.go -./heapdump.go -./hexdump.go -./histogram.go -./iface.go -./lfstack.go -./linkname.go -./linkname_shim.go -./linkname_unix.go -./list.go -./list_manual.go -./lock_futex.go -./lock_spinbit.go -./lockrank.go -./lockrank_off.go -./malloc.go -./malloc_generated.go -./malloc_stubs.go -./malloc_tables_generated.go -./map.go -./map_fast32.go -./map_fast64.go -./map_faststr.go -./mbarrier.go -./mbitmap.go -./mcache.go -./mcentral.go -./mcheckmark.go -./mcleanup.go -./mem.go -./mem_linux.go -./mem_nonsbrk.go -./metrics.go -./mfinal.go -./mfixalloc.go -./mgc.go -./mgclimit.go -./mgcmark.go -./mgcmark_greenteagc.go -./mgcpacer.go -./mgcscavenge.go -./mgcstack.go -./mgcsweep.go -./mgcwork.go -./mheap.go -./minmax.go -./mpagealloc.go -./mpagealloc_64bit.go -./mpagecache.go -./mpallocbits.go -./mprof.go -./mranges.go -./msan0.go -./msize.go -./mspanset.go -./mstats.go -./mwbbuf.go -./nbpipe_pipe2.go -./netpoll.go -./netpoll_epoll.go -./nonwindows_stub.go -./note_other.go -./os_linux.go -./os_linux64.go -./os_linux_generic.go -./os_linux_noauxv.go -./os_nonopenbsd.go -./os_unix.go -./panic.go -./pinner.go -./plugin.go -./preempt.go -./preempt_amd64.go -./preempt_nonwindows.go -./preempt_xreg.go -./print.go -./proc.go -./profbuf.go -./proflabel.go -./race0.go -./rand.go -./rdebug.go -./retry.go -./runtime.go -./runtime1.go -./runtime2.go -./runtime_boring.go -./runtime_clearenv.go -./rwmutex.go -./secret.go -./secret_asm.go -./security_linux.go -./security_unix.go -./select.go -./sema.go -./set_vma_name_linux.go -./signal_amd64.go -./signal_linux_amd64.go -./signal_unix.go -./sigqueue.go -./sigqueue_note.go -./sigtab_linux_generic.go -./slice.go -./softfloat64.go -./stack.go -./stkframe.go -./string.go -./stubs.go -./stubs2.go -./stubs3.go -./stubs_amd64.go -./stubs_linux.go -./stubs_nonwasm.go -./symtab.go -./symtabinl.go -./synctest.go -./sys_nonppc64x.go -./sys_x86.go -./tagptr.go -./tagptr_64bit.go -./test_amd64.go -./time.go -./time_nofake.go -./timeasm.go -./tls_stub.go -./trace.go -./traceallocfree.go -./traceback.go -./tracebuf.go -./tracecpu.go -./traceevent.go -./tracemap.go -./traceregion.go -./traceruntime.go -./tracestack.go -./tracestatus.go -./tracestring.go -./tracetime.go -./tracetype.go -./type.go -./unsafe.go -./utf8.go -./valgrind0.go -./vdso_elf64.go -./vdso_linux.go -./vdso_linux_amd64.go -./vgetrandom_linux.go -./write_err.go -./asm.s -./asm_amd64.s -./ints.s -./memclr_amd64.s -./memmove_amd64.s -./preempt_amd64.s -./rt0_linux_amd64.s -./secret_amd64.s -./sys_linux_amd64.s -./test_amd64.s -./time_linux_amd64.s diff --git a/.cache/go-build/91/91bbee79fc154386e543ade6cd2186b608e3858f158a09f7765ca6a8035e56bc-d b/.cache/go-build/91/91bbee79fc154386e543ade6cd2186b608e3858f158a09f7765ca6a8035e56bc-d deleted file mode 100644 index 5bce167..0000000 Binary files a/.cache/go-build/91/91bbee79fc154386e543ade6cd2186b608e3858f158a09f7765ca6a8035e56bc-d and /dev/null differ diff --git a/.cache/go-build/91/91f9f83536d6051dedf3a5d3af62d91893d75eb8baf1ccaa55ed293abc78dfda-a b/.cache/go-build/91/91f9f83536d6051dedf3a5d3af62d91893d75eb8baf1ccaa55ed293abc78dfda-a deleted file mode 100644 index b067d9e..0000000 --- a/.cache/go-build/91/91f9f83536d6051dedf3a5d3af62d91893d75eb8baf1ccaa55ed293abc78dfda-a +++ /dev/null @@ -1 +0,0 @@ -v1 91f9f83536d6051dedf3a5d3af62d91893d75eb8baf1ccaa55ed293abc78dfda d78fc870752a5d80dd97aa8430c736a217613d2fcd5732043525238474f25ace 76 1775136289802612217 diff --git a/.cache/go-build/92/9276f591db9d416e38ac6b396af464a7275c3101e9e51009cae04ce85b2e26fb-a b/.cache/go-build/92/9276f591db9d416e38ac6b396af464a7275c3101e9e51009cae04ce85b2e26fb-a deleted file mode 100644 index 1c0c066..0000000 --- a/.cache/go-build/92/9276f591db9d416e38ac6b396af464a7275c3101e9e51009cae04ce85b2e26fb-a +++ /dev/null @@ -1 +0,0 @@ -v1 9276f591db9d416e38ac6b396af464a7275c3101e9e51009cae04ce85b2e26fb 268bec9b9339d7b6cbde6f853330b3d890f537ed9f04a025932b545014a0b61d 134 1775136288780766116 diff --git a/.cache/go-build/92/928f4f8e42793c95c19d8308fc19c695f91b8a2c730ccf713fd60d6252db2677-a b/.cache/go-build/92/928f4f8e42793c95c19d8308fc19c695f91b8a2c730ccf713fd60d6252db2677-a deleted file mode 100644 index 79c88b1..0000000 --- a/.cache/go-build/92/928f4f8e42793c95c19d8308fc19c695f91b8a2c730ccf713fd60d6252db2677-a +++ /dev/null @@ -1 +0,0 @@ -v1 928f4f8e42793c95c19d8308fc19c695f91b8a2c730ccf713fd60d6252db2677 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289155625394 diff --git a/.cache/go-build/92/92a32c0f4cd48d943f1840424b59b22d919f540675145fc1387db56771a45be0-a b/.cache/go-build/92/92a32c0f4cd48d943f1840424b59b22d919f540675145fc1387db56771a45be0-a deleted file mode 100644 index bb82ef5..0000000 --- a/.cache/go-build/92/92a32c0f4cd48d943f1840424b59b22d919f540675145fc1387db56771a45be0-a +++ /dev/null @@ -1 +0,0 @@ -v1 92a32c0f4cd48d943f1840424b59b22d919f540675145fc1387db56771a45be0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287094571220 diff --git a/.cache/go-build/93/93376bbec60c19af886b71f7eae843bd04bb9aafec6139fb51f1f7be0b4ebe7a-d b/.cache/go-build/93/93376bbec60c19af886b71f7eae843bd04bb9aafec6139fb51f1f7be0b4ebe7a-d deleted file mode 100644 index 21ae0a7..0000000 Binary files a/.cache/go-build/93/93376bbec60c19af886b71f7eae843bd04bb9aafec6139fb51f1f7be0b4ebe7a-d and /dev/null differ diff --git a/.cache/go-build/93/934898cfeea0e1e0676fac3384f1942ee6e0193016ee4a0ea2f5a16558ed2267-d b/.cache/go-build/93/934898cfeea0e1e0676fac3384f1942ee6e0193016ee4a0ea2f5a16558ed2267-d deleted file mode 100644 index 3ad1eac..0000000 Binary files a/.cache/go-build/93/934898cfeea0e1e0676fac3384f1942ee6e0193016ee4a0ea2f5a16558ed2267-d and /dev/null differ diff --git a/.cache/go-build/93/93ca750d99ba93e0e1fa2b20411954a564208be12def40aa692361f5139ac979-a b/.cache/go-build/93/93ca750d99ba93e0e1fa2b20411954a564208be12def40aa692361f5139ac979-a deleted file mode 100644 index fe6fdb9..0000000 --- a/.cache/go-build/93/93ca750d99ba93e0e1fa2b20411954a564208be12def40aa692361f5139ac979-a +++ /dev/null @@ -1 +0,0 @@ -v1 93ca750d99ba93e0e1fa2b20411954a564208be12def40aa692361f5139ac979 27950be934172238ed07b312b3bf6ccf75e59fb9b5c5042ee71639b85ca6273d 109 1775136289532380344 diff --git a/.cache/go-build/93/93cbd81c4eca01b5dbf009f48739a4a96ca1f52cb26964c378c0e98ece4fa7a4-a b/.cache/go-build/93/93cbd81c4eca01b5dbf009f48739a4a96ca1f52cb26964c378c0e98ece4fa7a4-a deleted file mode 100644 index f529096..0000000 --- a/.cache/go-build/93/93cbd81c4eca01b5dbf009f48739a4a96ca1f52cb26964c378c0e98ece4fa7a4-a +++ /dev/null @@ -1 +0,0 @@ -v1 93cbd81c4eca01b5dbf009f48739a4a96ca1f52cb26964c378c0e98ece4fa7a4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398430294779 diff --git a/.cache/go-build/94/9457597923e2b6b25e805a727d646192e1ccded92f3942e79b759e168350f372-d b/.cache/go-build/94/9457597923e2b6b25e805a727d646192e1ccded92f3942e79b759e168350f372-d deleted file mode 100644 index f389dd7..0000000 Binary files a/.cache/go-build/94/9457597923e2b6b25e805a727d646192e1ccded92f3942e79b759e168350f372-d and /dev/null differ diff --git a/.cache/go-build/94/945c675e78e06cf27b06cf51d9fd4043748478d743c418ba558dcc5c3e92fb21-a b/.cache/go-build/94/945c675e78e06cf27b06cf51d9fd4043748478d743c418ba558dcc5c3e92fb21-a deleted file mode 100644 index fcd173f..0000000 --- a/.cache/go-build/94/945c675e78e06cf27b06cf51d9fd4043748478d743c418ba558dcc5c3e92fb21-a +++ /dev/null @@ -1 +0,0 @@ -v1 945c675e78e06cf27b06cf51d9fd4043748478d743c418ba558dcc5c3e92fb21 37791cc14db185621614e35087d3740c7423b0a125469869517eb1079251d38f 1032594 1775136289890235570 diff --git a/.cache/go-build/94/94a5ae2af6a4f73acc1d9e4dbcbb9dada20907bddce36287a4db5506b4c4e2bf-a b/.cache/go-build/94/94a5ae2af6a4f73acc1d9e4dbcbb9dada20907bddce36287a4db5506b4c4e2bf-a deleted file mode 100644 index 1bbb5f3..0000000 --- a/.cache/go-build/94/94a5ae2af6a4f73acc1d9e4dbcbb9dada20907bddce36287a4db5506b4c4e2bf-a +++ /dev/null @@ -1 +0,0 @@ -v1 94a5ae2af6a4f73acc1d9e4dbcbb9dada20907bddce36287a4db5506b4c4e2bf 750050e75cc81d2fb326e56db4cefa2ec0efa6df87ef3c1d6907859a8e43bec8 52460 1775136288664436383 diff --git a/.cache/go-build/94/94b12d584daa00b9748bd6c0bf49e4fd5752d753b06aa049ac0ccf9080a3dbd8-d b/.cache/go-build/94/94b12d584daa00b9748bd6c0bf49e4fd5752d753b06aa049ac0ccf9080a3dbd8-d deleted file mode 100644 index 389aafe..0000000 --- a/.cache/go-build/94/94b12d584daa00b9748bd6c0bf49e4fd5752d753b06aa049ac0ccf9080a3dbd8-d +++ /dev/null @@ -1,3 +0,0 @@ -./constant_time.go -./dit.go -./xor.go diff --git a/.cache/go-build/94/94cbcfefa7ad018231f7bd78a3ee7c576e38b9d15982f7f4762bd1a970ddc74c-d b/.cache/go-build/94/94cbcfefa7ad018231f7bd78a3ee7c576e38b9d15982f7f4762bd1a970ddc74c-d deleted file mode 100644 index f0d637e..0000000 Binary files a/.cache/go-build/94/94cbcfefa7ad018231f7bd78a3ee7c576e38b9d15982f7f4762bd1a970ddc74c-d and /dev/null differ diff --git a/.cache/go-build/95/95e265f95342f78c2be81ef32be33f5c2e3c1b5dfcad149943369b0ae7e03099-a b/.cache/go-build/95/95e265f95342f78c2be81ef32be33f5c2e3c1b5dfcad149943369b0ae7e03099-a deleted file mode 100644 index 8eb091a..0000000 --- a/.cache/go-build/95/95e265f95342f78c2be81ef32be33f5c2e3c1b5dfcad149943369b0ae7e03099-a +++ /dev/null @@ -1 +0,0 @@ -v1 95e265f95342f78c2be81ef32be33f5c2e3c1b5dfcad149943369b0ae7e03099 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398442809508 diff --git a/.cache/go-build/96/9620e942cbd9ebe1af89979f393c0e6c76133ab39786101109d62a2819b2bd5e-a b/.cache/go-build/96/9620e942cbd9ebe1af89979f393c0e6c76133ab39786101109d62a2819b2bd5e-a deleted file mode 100644 index 29594fe..0000000 --- a/.cache/go-build/96/9620e942cbd9ebe1af89979f393c0e6c76133ab39786101109d62a2819b2bd5e-a +++ /dev/null @@ -1 +0,0 @@ -v1 9620e942cbd9ebe1af89979f393c0e6c76133ab39786101109d62a2819b2bd5e 0c9fa99bb3f81431ee9ce34aa86369e2cda0906285789b5a983fd38dbc990d83 878 1775136286831459592 diff --git a/.cache/go-build/96/96421c5df9bfa5d3deca8df2ad62318356503d09d2e018c17195092cf47bf45e-a b/.cache/go-build/96/96421c5df9bfa5d3deca8df2ad62318356503d09d2e018c17195092cf47bf45e-a deleted file mode 100644 index bd2287e..0000000 --- a/.cache/go-build/96/96421c5df9bfa5d3deca8df2ad62318356503d09d2e018c17195092cf47bf45e-a +++ /dev/null @@ -1 +0,0 @@ -v1 96421c5df9bfa5d3deca8df2ad62318356503d09d2e018c17195092cf47bf45e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289367043065 diff --git a/.cache/go-build/96/9643ea5d5a6b35004366b815030ae49da6b7ddc5d4bec77788cb693847469d80-a b/.cache/go-build/96/9643ea5d5a6b35004366b815030ae49da6b7ddc5d4bec77788cb693847469d80-a deleted file mode 100644 index 2fb9d5a..0000000 --- a/.cache/go-build/96/9643ea5d5a6b35004366b815030ae49da6b7ddc5d4bec77788cb693847469d80-a +++ /dev/null @@ -1 +0,0 @@ -v1 9643ea5d5a6b35004366b815030ae49da6b7ddc5d4bec77788cb693847469d80 efad33a2faf7de947952496bad9b0741a4b562ade46cfb56cf55ed70869f0608 1883 1775138184260859898 diff --git a/.cache/go-build/96/964b7de8267ef54a7f05426680fbe2cb046da72fce9e75843f7f4d1c74f11b92-a b/.cache/go-build/96/964b7de8267ef54a7f05426680fbe2cb046da72fce9e75843f7f4d1c74f11b92-a deleted file mode 100644 index 120cfbf..0000000 --- a/.cache/go-build/96/964b7de8267ef54a7f05426680fbe2cb046da72fce9e75843f7f4d1c74f11b92-a +++ /dev/null @@ -1 +0,0 @@ -v1 964b7de8267ef54a7f05426680fbe2cb046da72fce9e75843f7f4d1c74f11b92 128414c83eaa2ffbcf644d4227804d66f76c012e192d5ad90a922b82a50baeca 5016 1775136286827381119 diff --git a/.cache/go-build/96/96650c9c3486d63f7bc61e1be80677a5f0666f834e5d7b3622e1dadbde78c53a-d b/.cache/go-build/96/96650c9c3486d63f7bc61e1be80677a5f0666f834e5d7b3622e1dadbde78c53a-d deleted file mode 100644 index b51b78f..0000000 Binary files a/.cache/go-build/96/96650c9c3486d63f7bc61e1be80677a5f0666f834e5d7b3622e1dadbde78c53a-d and /dev/null differ diff --git a/.cache/go-build/96/968c4c886108f34557f9d6281ef2e4fb601d2e7207d83ea7fbac21d3b7dfa852-a b/.cache/go-build/96/968c4c886108f34557f9d6281ef2e4fb601d2e7207d83ea7fbac21d3b7dfa852-a deleted file mode 100644 index 0d4d6fa..0000000 --- a/.cache/go-build/96/968c4c886108f34557f9d6281ef2e4fb601d2e7207d83ea7fbac21d3b7dfa852-a +++ /dev/null @@ -1 +0,0 @@ -v1 968c4c886108f34557f9d6281ef2e4fb601d2e7207d83ea7fbac21d3b7dfa852 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289186274636 diff --git a/.cache/go-build/96/96a2fc230afe948f2d45aba4c86d68c40ec47fd342cb60ac1151437f1713c50e-d b/.cache/go-build/96/96a2fc230afe948f2d45aba4c86d68c40ec47fd342cb60ac1151437f1713c50e-d deleted file mode 100644 index ca6fa44..0000000 Binary files a/.cache/go-build/96/96a2fc230afe948f2d45aba4c86d68c40ec47fd342cb60ac1151437f1713c50e-d and /dev/null differ diff --git a/.cache/go-build/96/96b04d027e5872e6037a1846e566ea8bf68b370ef5d7728cf8c38a8dee145eae-a b/.cache/go-build/96/96b04d027e5872e6037a1846e566ea8bf68b370ef5d7728cf8c38a8dee145eae-a deleted file mode 100644 index 2a985f7..0000000 --- a/.cache/go-build/96/96b04d027e5872e6037a1846e566ea8bf68b370ef5d7728cf8c38a8dee145eae-a +++ /dev/null @@ -1 +0,0 @@ -v1 96b04d027e5872e6037a1846e566ea8bf68b370ef5d7728cf8c38a8dee145eae 15b5854f032c922d7298053e9c1493e162686576fb3d5ffef1518fae77303274 212610 1775136288729818140 diff --git a/.cache/go-build/96/96c87e7a2aa204b6cf5c6f15c9f443d213ac9d946b50e711a2083e82f6252429-a b/.cache/go-build/96/96c87e7a2aa204b6cf5c6f15c9f443d213ac9d946b50e711a2083e82f6252429-a deleted file mode 100644 index e871c57..0000000 --- a/.cache/go-build/96/96c87e7a2aa204b6cf5c6f15c9f443d213ac9d946b50e711a2083e82f6252429-a +++ /dev/null @@ -1 +0,0 @@ -v1 96c87e7a2aa204b6cf5c6f15c9f443d213ac9d946b50e711a2083e82f6252429 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287008280988 diff --git a/.cache/go-build/97/97053fc18205119159b195efd4ed9d7cfa3bcd0d7e202d95aec77b0bbb82e485-a b/.cache/go-build/97/97053fc18205119159b195efd4ed9d7cfa3bcd0d7e202d95aec77b0bbb82e485-a deleted file mode 100644 index c5dea70..0000000 --- a/.cache/go-build/97/97053fc18205119159b195efd4ed9d7cfa3bcd0d7e202d95aec77b0bbb82e485-a +++ /dev/null @@ -1 +0,0 @@ -v1 97053fc18205119159b195efd4ed9d7cfa3bcd0d7e202d95aec77b0bbb82e485 7dff9354a1c40a7b1c9d3cb3c3a4f5a7e25c5fdb3fcc54a1c2101657bf7570da 220526 1775136288691809892 diff --git a/.cache/go-build/97/9706df775e98c32f0b7403fdd1d8a9d746bf6df78ab4dbafcc43698df060e92b-a b/.cache/go-build/97/9706df775e98c32f0b7403fdd1d8a9d746bf6df78ab4dbafcc43698df060e92b-a deleted file mode 100644 index 954fed9..0000000 --- a/.cache/go-build/97/9706df775e98c32f0b7403fdd1d8a9d746bf6df78ab4dbafcc43698df060e92b-a +++ /dev/null @@ -1 +0,0 @@ -v1 9706df775e98c32f0b7403fdd1d8a9d746bf6df78ab4dbafcc43698df060e92b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288979627798 diff --git a/.cache/go-build/97/977bfd538027c53f85cc8124d5dde06dc570085a512b856aef3de3f2551a0f37-a b/.cache/go-build/97/977bfd538027c53f85cc8124d5dde06dc570085a512b856aef3de3f2551a0f37-a deleted file mode 100644 index 5529fa0..0000000 --- a/.cache/go-build/97/977bfd538027c53f85cc8124d5dde06dc570085a512b856aef3de3f2551a0f37-a +++ /dev/null @@ -1 +0,0 @@ -v1 977bfd538027c53f85cc8124d5dde06dc570085a512b856aef3de3f2551a0f37 c782f7dcc93d922566b533fd60d6940b5b44fe96dcb7e8ae1fa71d9b760b862a 2768 1775136286931710013 diff --git a/.cache/go-build/97/97a073f6deef133fb526b715a2a54c5cac423dde542381a752617f67546e23bc-a b/.cache/go-build/97/97a073f6deef133fb526b715a2a54c5cac423dde542381a752617f67546e23bc-a deleted file mode 100644 index eb34192..0000000 --- a/.cache/go-build/97/97a073f6deef133fb526b715a2a54c5cac423dde542381a752617f67546e23bc-a +++ /dev/null @@ -1 +0,0 @@ -v1 97a073f6deef133fb526b715a2a54c5cac423dde542381a752617f67546e23bc 30de3215fcee7d591d6742284b234aeed82f0c2ee461acd976e946477feea3fa 14 1775136287066694080 diff --git a/.cache/go-build/97/97d04806549e6ea281038d43156f345073623096c986d55fb701a7b233f1696f-a b/.cache/go-build/97/97d04806549e6ea281038d43156f345073623096c986d55fb701a7b233f1696f-a deleted file mode 100644 index 61e2504..0000000 --- a/.cache/go-build/97/97d04806549e6ea281038d43156f345073623096c986d55fb701a7b233f1696f-a +++ /dev/null @@ -1 +0,0 @@ -v1 97d04806549e6ea281038d43156f345073623096c986d55fb701a7b233f1696f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287070522433 diff --git a/.cache/go-build/97/97e09a6ec9aa34ee913f1fa9d52007a9a09877b0ecfb4e2af2b6a3abe60cbc87-a b/.cache/go-build/97/97e09a6ec9aa34ee913f1fa9d52007a9a09877b0ecfb4e2af2b6a3abe60cbc87-a deleted file mode 100644 index 14ca5ec..0000000 --- a/.cache/go-build/97/97e09a6ec9aa34ee913f1fa9d52007a9a09877b0ecfb4e2af2b6a3abe60cbc87-a +++ /dev/null @@ -1 +0,0 @@ -v1 97e09a6ec9aa34ee913f1fa9d52007a9a09877b0ecfb4e2af2b6a3abe60cbc87 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721895066259 diff --git a/.cache/go-build/98/98008025876333837b7f968679e79e0e2faca6162f7164ececd5ca7f3d0ea304-d b/.cache/go-build/98/98008025876333837b7f968679e79e0e2faca6162f7164ececd5ca7f3d0ea304-d deleted file mode 100644 index 1a5a686..0000000 Binary files a/.cache/go-build/98/98008025876333837b7f968679e79e0e2faca6162f7164ececd5ca7f3d0ea304-d and /dev/null differ diff --git a/.cache/go-build/98/980b3cacdac3ed33d90e51bbc829f48679a9e0fd0344e6c91476e6a8e3ec92c2-a b/.cache/go-build/98/980b3cacdac3ed33d90e51bbc829f48679a9e0fd0344e6c91476e6a8e3ec92c2-a deleted file mode 100644 index b3ad64d..0000000 --- a/.cache/go-build/98/980b3cacdac3ed33d90e51bbc829f48679a9e0fd0344e6c91476e6a8e3ec92c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 980b3cacdac3ed33d90e51bbc829f48679a9e0fd0344e6c91476e6a8e3ec92c2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286925657099 diff --git a/.cache/go-build/98/9830d0837dca7fe21dcbd4d0d57e8872c5540c50fb40997fc446e0e43e7fdefb-a b/.cache/go-build/98/9830d0837dca7fe21dcbd4d0d57e8872c5540c50fb40997fc446e0e43e7fdefb-a deleted file mode 100644 index 67790c2..0000000 --- a/.cache/go-build/98/9830d0837dca7fe21dcbd4d0d57e8872c5540c50fb40997fc446e0e43e7fdefb-a +++ /dev/null @@ -1 +0,0 @@ -v1 9830d0837dca7fe21dcbd4d0d57e8872c5540c50fb40997fc446e0e43e7fdefb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288493115550 diff --git a/.cache/go-build/98/9832e5cdf3752595cb1514c0f6f64f09bee247847ba6dc6d0a1fa43e28c20ec5-d b/.cache/go-build/98/9832e5cdf3752595cb1514c0f6f64f09bee247847ba6dc6d0a1fa43e28c20ec5-d deleted file mode 100644 index 0b5674b..0000000 Binary files a/.cache/go-build/98/9832e5cdf3752595cb1514c0f6f64f09bee247847ba6dc6d0a1fa43e28c20ec5-d and /dev/null differ diff --git a/.cache/go-build/98/98acef255e1a1cac551a00fcd8f22760d1020a2b26503a11e90af60a8601e696-d b/.cache/go-build/98/98acef255e1a1cac551a00fcd8f22760d1020a2b26503a11e90af60a8601e696-d deleted file mode 100644 index b00ef6f..0000000 Binary files a/.cache/go-build/98/98acef255e1a1cac551a00fcd8f22760d1020a2b26503a11e90af60a8601e696-d and /dev/null differ diff --git a/.cache/go-build/98/98b8ab8430a6d18b6f0a0d3a7261266c00fa4a8d06119ee1c9f6a125ff3cf4a8-d b/.cache/go-build/98/98b8ab8430a6d18b6f0a0d3a7261266c00fa4a8d06119ee1c9f6a125ff3cf4a8-d deleted file mode 100644 index 77d323a..0000000 --- a/.cache/go-build/98/98b8ab8430a6d18b6f0a0d3a7261266c00fa4a8d06119ee1c9f6a125ff3cf4a8-d +++ /dev/null @@ -1,3 +0,0 @@ -./hashtriemap.go -./mutex.go -./runtime.go diff --git a/.cache/go-build/98/98bb45d9462824f8575efc3cd5ce7d5b93a15713ed6cb1f0a55cac8c6ca9f9eb-d b/.cache/go-build/98/98bb45d9462824f8575efc3cd5ce7d5b93a15713ed6cb1f0a55cac8c6ca9f9eb-d deleted file mode 100644 index 3f29671..0000000 Binary files a/.cache/go-build/98/98bb45d9462824f8575efc3cd5ce7d5b93a15713ed6cb1f0a55cac8c6ca9f9eb-d and /dev/null differ diff --git a/.cache/go-build/99/99269d451c065c83b53c037f867d644b131ce91b2cd20f482ed31ff3583b7bcf-d b/.cache/go-build/99/99269d451c065c83b53c037f867d644b131ce91b2cd20f482ed31ff3583b7bcf-d deleted file mode 100644 index 8c7baba..0000000 --- a/.cache/go-build/99/99269d451c065c83b53c037f867d644b131ce91b2cd20f482ed31ff3583b7bcf-d +++ /dev/null @@ -1,6 +0,0 @@ -./cast.go -./fips140.go -./indicator.go -./notasan.go -./notboring.go -./notpurego.go diff --git a/.cache/go-build/9a/9a434c1d68a1cf8c16e9c6b16fe47ca08a2dcda6ac79c9520c12200332d33759-d b/.cache/go-build/9a/9a434c1d68a1cf8c16e9c6b16fe47ca08a2dcda6ac79c9520c12200332d33759-d deleted file mode 100644 index 1b82588..0000000 Binary files a/.cache/go-build/9a/9a434c1d68a1cf8c16e9c6b16fe47ca08a2dcda6ac79c9520c12200332d33759-d and /dev/null differ diff --git a/.cache/go-build/9a/9a75d7b295dd5e1d8d75b00f95db9e6b5ab8198927a0359fe00ac0df7df712a2-a b/.cache/go-build/9a/9a75d7b295dd5e1d8d75b00f95db9e6b5ab8198927a0359fe00ac0df7df712a2-a deleted file mode 100644 index d5a6039..0000000 --- a/.cache/go-build/9a/9a75d7b295dd5e1d8d75b00f95db9e6b5ab8198927a0359fe00ac0df7df712a2-a +++ /dev/null @@ -1 +0,0 @@ -v1 9a75d7b295dd5e1d8d75b00f95db9e6b5ab8198927a0359fe00ac0df7df712a2 ef6d310a06181e3b9854fb7da820dd283d2e7499e7a9d463fe3d3a3aa750ba83 1312532 1775136289053289251 diff --git a/.cache/go-build/9a/9aa86547d0d28969767cba50f8209cf1044f176119628b25dc69ca310682e0d8-a b/.cache/go-build/9a/9aa86547d0d28969767cba50f8209cf1044f176119628b25dc69ca310682e0d8-a deleted file mode 100644 index d6ce003..0000000 --- a/.cache/go-build/9a/9aa86547d0d28969767cba50f8209cf1044f176119628b25dc69ca310682e0d8-a +++ /dev/null @@ -1 +0,0 @@ -v1 9aa86547d0d28969767cba50f8209cf1044f176119628b25dc69ca310682e0d8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721882254769 diff --git a/.cache/go-build/9b/9b11023611dc13ae8415ac991790dc349a7b17b570c506431f53c2db168c060c-a b/.cache/go-build/9b/9b11023611dc13ae8415ac991790dc349a7b17b570c506431f53c2db168c060c-a deleted file mode 100644 index 81a19f5..0000000 --- a/.cache/go-build/9b/9b11023611dc13ae8415ac991790dc349a7b17b570c506431f53c2db168c060c-a +++ /dev/null @@ -1 +0,0 @@ -v1 9b11023611dc13ae8415ac991790dc349a7b17b570c506431f53c2db168c060c 5507332a6594b851dbfbc2db2623d05b599ecb206839551ac05cfdcbf74da932 589906 1775136289645617535 diff --git a/.cache/go-build/9b/9b1e7c98a12c38153654a9e49f06c96fe261ec00efdc775923b9a733399c2b33-a b/.cache/go-build/9b/9b1e7c98a12c38153654a9e49f06c96fe261ec00efdc775923b9a733399c2b33-a deleted file mode 100644 index bd5627b..0000000 --- a/.cache/go-build/9b/9b1e7c98a12c38153654a9e49f06c96fe261ec00efdc775923b9a733399c2b33-a +++ /dev/null @@ -1 +0,0 @@ -v1 9b1e7c98a12c38153654a9e49f06c96fe261ec00efdc775923b9a733399c2b33 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289100109564 diff --git a/.cache/go-build/9b/9b4be9006141ddd80066545adb1434b130f17d434f614a999b7521eac2e0edbb-a b/.cache/go-build/9b/9b4be9006141ddd80066545adb1434b130f17d434f614a999b7521eac2e0edbb-a deleted file mode 100644 index eef2481..0000000 --- a/.cache/go-build/9b/9b4be9006141ddd80066545adb1434b130f17d434f614a999b7521eac2e0edbb-a +++ /dev/null @@ -1 +0,0 @@ -v1 9b4be9006141ddd80066545adb1434b130f17d434f614a999b7521eac2e0edbb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722090250388 diff --git a/.cache/go-build/9b/9b54c212aca30357a9018c32d9632d00463b7a88c11727610821cb4a5a108cee-a b/.cache/go-build/9b/9b54c212aca30357a9018c32d9632d00463b7a88c11727610821cb4a5a108cee-a deleted file mode 100644 index de6f68b..0000000 --- a/.cache/go-build/9b/9b54c212aca30357a9018c32d9632d00463b7a88c11727610821cb4a5a108cee-a +++ /dev/null @@ -1 +0,0 @@ -v1 9b54c212aca30357a9018c32d9632d00463b7a88c11727610821cb4a5a108cee e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286926847990 diff --git a/.cache/go-build/9b/9ba7b9fddef0e1075d4a8be30405bda2e53ed449111f8f888f1a52fd49a98caf-a b/.cache/go-build/9b/9ba7b9fddef0e1075d4a8be30405bda2e53ed449111f8f888f1a52fd49a98caf-a deleted file mode 100644 index bec77c2..0000000 --- a/.cache/go-build/9b/9ba7b9fddef0e1075d4a8be30405bda2e53ed449111f8f888f1a52fd49a98caf-a +++ /dev/null @@ -1 +0,0 @@ -v1 9ba7b9fddef0e1075d4a8be30405bda2e53ed449111f8f888f1a52fd49a98caf e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721935382627 diff --git a/.cache/go-build/9b/9bc4616a035001de78c2548ba93c2c8989dab408c52203c990d0eeb620fdce80-a b/.cache/go-build/9b/9bc4616a035001de78c2548ba93c2c8989dab408c52203c990d0eeb620fdce80-a deleted file mode 100644 index 32262b0..0000000 --- a/.cache/go-build/9b/9bc4616a035001de78c2548ba93c2c8989dab408c52203c990d0eeb620fdce80-a +++ /dev/null @@ -1 +0,0 @@ -v1 9bc4616a035001de78c2548ba93c2c8989dab408c52203c990d0eeb620fdce80 94b12d584daa00b9748bd6c0bf49e4fd5752d753b06aa049ac0ccf9080a3dbd8 37 1775136287094923360 diff --git a/.cache/go-build/9c/9c62fd66163a242e81032d9e63ac9f3f2cbd7edeb56ff0141b58e8bf940da1d0-a b/.cache/go-build/9c/9c62fd66163a242e81032d9e63ac9f3f2cbd7edeb56ff0141b58e8bf940da1d0-a deleted file mode 100644 index 8493fab..0000000 --- a/.cache/go-build/9c/9c62fd66163a242e81032d9e63ac9f3f2cbd7edeb56ff0141b58e8bf940da1d0-a +++ /dev/null @@ -1 +0,0 @@ -v1 9c62fd66163a242e81032d9e63ac9f3f2cbd7edeb56ff0141b58e8bf940da1d0 d995bb976462b547343ffa24e02da064943faa811f2ca02ebb7ee6453111ecc3 960 1775136286817061301 diff --git a/.cache/go-build/9c/9c69cb4858f6866d2055a01a97f46954b25cdb35b0eae2ada4e11e9e0a2e1ddb-a b/.cache/go-build/9c/9c69cb4858f6866d2055a01a97f46954b25cdb35b0eae2ada4e11e9e0a2e1ddb-a deleted file mode 100644 index 1254440..0000000 --- a/.cache/go-build/9c/9c69cb4858f6866d2055a01a97f46954b25cdb35b0eae2ada4e11e9e0a2e1ddb-a +++ /dev/null @@ -1 +0,0 @@ -v1 9c69cb4858f6866d2055a01a97f46954b25cdb35b0eae2ada4e11e9e0a2e1ddb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287030544764 diff --git a/.cache/go-build/9c/9cb9480b1cc8282da65b00bc7fdf4413b83748d4bea6c2856c08dab73989b927-d b/.cache/go-build/9c/9cb9480b1cc8282da65b00bc7fdf4413b83748d4bea6c2856c08dab73989b927-d deleted file mode 100644 index 0be4ff8..0000000 Binary files a/.cache/go-build/9c/9cb9480b1cc8282da65b00bc7fdf4413b83748d4bea6c2856c08dab73989b927-d and /dev/null differ diff --git a/.cache/go-build/9c/9cbbc5cdac9235096746ad51c6b8fce19c6651669d23875598a4a0320abcb8c1-a b/.cache/go-build/9c/9cbbc5cdac9235096746ad51c6b8fce19c6651669d23875598a4a0320abcb8c1-a deleted file mode 100644 index a8cdc07..0000000 --- a/.cache/go-build/9c/9cbbc5cdac9235096746ad51c6b8fce19c6651669d23875598a4a0320abcb8c1-a +++ /dev/null @@ -1 +0,0 @@ -v1 9cbbc5cdac9235096746ad51c6b8fce19c6651669d23875598a4a0320abcb8c1 8bd916822b2a3eb28972b09977b4906acb1b6308852fd3e0024d1c1283d74d41 1671330 1775136365541055199 diff --git a/.cache/go-build/9c/9cd1c3bf0072aa0dccb28141565da849924ff9255f955bac9d3587a5da754b0b-d b/.cache/go-build/9c/9cd1c3bf0072aa0dccb28141565da849924ff9255f955bac9d3587a5da754b0b-d deleted file mode 100644 index f97b880..0000000 --- a/.cache/go-build/9c/9cd1c3bf0072aa0dccb28141565da849924ff9255f955bac9d3587a5da754b0b-d +++ /dev/null @@ -1 +0,0 @@ -./deps.go diff --git a/.cache/go-build/9c/9cd4ce3d13610edf9031d42b0e3f4c66f041fb02b42bc27d9b911f307f1caf7f-d b/.cache/go-build/9c/9cd4ce3d13610edf9031d42b0e3f4c66f041fb02b42bc27d9b911f307f1caf7f-d deleted file mode 100644 index a219ec3..0000000 Binary files a/.cache/go-build/9c/9cd4ce3d13610edf9031d42b0e3f4c66f041fb02b42bc27d9b911f307f1caf7f-d and /dev/null differ diff --git a/.cache/go-build/9d/9d04db9e199009ef6aeeb5690a379e4ac6a05604a007ecd023b9e9911dbf1869-a b/.cache/go-build/9d/9d04db9e199009ef6aeeb5690a379e4ac6a05604a007ecd023b9e9911dbf1869-a deleted file mode 100644 index cc9ba6d..0000000 --- a/.cache/go-build/9d/9d04db9e199009ef6aeeb5690a379e4ac6a05604a007ecd023b9e9911dbf1869-a +++ /dev/null @@ -1 +0,0 @@ -v1 9d04db9e199009ef6aeeb5690a379e4ac6a05604a007ecd023b9e9911dbf1869 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289087057865 diff --git a/.cache/go-build/9d/9d2c9dd5c56d5503453f1ce809931e7e5ecf017cb2ee86be3f7da8c60c3ef202-a b/.cache/go-build/9d/9d2c9dd5c56d5503453f1ce809931e7e5ecf017cb2ee86be3f7da8c60c3ef202-a deleted file mode 100644 index 7298265..0000000 --- a/.cache/go-build/9d/9d2c9dd5c56d5503453f1ce809931e7e5ecf017cb2ee86be3f7da8c60c3ef202-a +++ /dev/null @@ -1 +0,0 @@ -v1 9d2c9dd5c56d5503453f1ce809931e7e5ecf017cb2ee86be3f7da8c60c3ef202 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288717848321 diff --git a/.cache/go-build/9d/9d3fde395023b98f46cd831bbef39e8700a47bc32495e1cf57c9089e64c2fddf-d b/.cache/go-build/9d/9d3fde395023b98f46cd831bbef39e8700a47bc32495e1cf57c9089e64c2fddf-d deleted file mode 100644 index 95f9fc7..0000000 Binary files a/.cache/go-build/9d/9d3fde395023b98f46cd831bbef39e8700a47bc32495e1cf57c9089e64c2fddf-d and /dev/null differ diff --git a/.cache/go-build/9d/9d44d1278c2686ab0a0763ab7a6b66af5d91f37c899f50dd7c413a888d5c9cec-a b/.cache/go-build/9d/9d44d1278c2686ab0a0763ab7a6b66af5d91f37c899f50dd7c413a888d5c9cec-a deleted file mode 100644 index 2bce51e..0000000 --- a/.cache/go-build/9d/9d44d1278c2686ab0a0763ab7a6b66af5d91f37c899f50dd7c413a888d5c9cec-a +++ /dev/null @@ -1 +0,0 @@ -v1 9d44d1278c2686ab0a0763ab7a6b66af5d91f37c899f50dd7c413a888d5c9cec eb61a8be47ce4f68dd02fe8807c93518ebcb215da6b855693067c2d1d24b8dc9 6532 1775136286931708093 diff --git a/.cache/go-build/9d/9d6c639572cc4c6bbdd785bbb9d6c919d99a26089785742302e2c461d2fbc4d6-a b/.cache/go-build/9d/9d6c639572cc4c6bbdd785bbb9d6c919d99a26089785742302e2c461d2fbc4d6-a deleted file mode 100644 index b221d40..0000000 --- a/.cache/go-build/9d/9d6c639572cc4c6bbdd785bbb9d6c919d99a26089785742302e2c461d2fbc4d6-a +++ /dev/null @@ -1 +0,0 @@ -v1 9d6c639572cc4c6bbdd785bbb9d6c919d99a26089785742302e2c461d2fbc4d6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184139761291 diff --git a/.cache/go-build/9d/9d83673731ad5e2841783bccdfe36f96b75ebca828e27c0a02773aab01ed330c-a b/.cache/go-build/9d/9d83673731ad5e2841783bccdfe36f96b75ebca828e27c0a02773aab01ed330c-a deleted file mode 100644 index 1a671c1..0000000 --- a/.cache/go-build/9d/9d83673731ad5e2841783bccdfe36f96b75ebca828e27c0a02773aab01ed330c-a +++ /dev/null @@ -1 +0,0 @@ -v1 9d83673731ad5e2841783bccdfe36f96b75ebca828e27c0a02773aab01ed330c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288628780937 diff --git a/.cache/go-build/9d/9d84787545df52a281ae040e4fabdfd7a1f2b27e62fd859f02192898ba9ad6c1-a b/.cache/go-build/9d/9d84787545df52a281ae040e4fabdfd7a1f2b27e62fd859f02192898ba9ad6c1-a deleted file mode 100644 index 03b7760..0000000 --- a/.cache/go-build/9d/9d84787545df52a281ae040e4fabdfd7a1f2b27e62fd859f02192898ba9ad6c1-a +++ /dev/null @@ -1 +0,0 @@ -v1 9d84787545df52a281ae040e4fabdfd7a1f2b27e62fd859f02192898ba9ad6c1 1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b 11 1775137722029323765 diff --git a/.cache/go-build/9d/9dd3178b57eb66cf22f684d9dac61941196407fcb9180e64f4213018661fca33-a b/.cache/go-build/9d/9dd3178b57eb66cf22f684d9dac61941196407fcb9180e64f4213018661fca33-a deleted file mode 100644 index d703b4a..0000000 --- a/.cache/go-build/9d/9dd3178b57eb66cf22f684d9dac61941196407fcb9180e64f4213018661fca33-a +++ /dev/null @@ -1 +0,0 @@ -v1 9dd3178b57eb66cf22f684d9dac61941196407fcb9180e64f4213018661fca33 26c1c1237e6b50c0cacfa11583e112d4f58a8c14f225ed5fde6597103f90f6aa 130096 1775136289830602347 diff --git a/.cache/go-build/9d/9de23832d9a99e9659faef869fff9495dd9314d7888bb2b1d6cae9266faaf329-a b/.cache/go-build/9d/9de23832d9a99e9659faef869fff9495dd9314d7888bb2b1d6cae9266faaf329-a deleted file mode 100644 index 755a433..0000000 --- a/.cache/go-build/9d/9de23832d9a99e9659faef869fff9495dd9314d7888bb2b1d6cae9266faaf329-a +++ /dev/null @@ -1 +0,0 @@ -v1 9de23832d9a99e9659faef869fff9495dd9314d7888bb2b1d6cae9266faaf329 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184139564771 diff --git a/.cache/go-build/9d/9dea180ccc24b4e731e5e144b9caad6d30ed2846f76b17c46b2db5b0924cf7a6-a b/.cache/go-build/9d/9dea180ccc24b4e731e5e144b9caad6d30ed2846f76b17c46b2db5b0924cf7a6-a deleted file mode 100644 index 3396e55..0000000 --- a/.cache/go-build/9d/9dea180ccc24b4e731e5e144b9caad6d30ed2846f76b17c46b2db5b0924cf7a6-a +++ /dev/null @@ -1 +0,0 @@ -v1 9dea180ccc24b4e731e5e144b9caad6d30ed2846f76b17c46b2db5b0924cf7a6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288470008694 diff --git a/.cache/go-build/9e/9e14399bf06da03dba976621f2a5d6331d13903b0c1564a8c69f04a33feb59f5-d b/.cache/go-build/9e/9e14399bf06da03dba976621f2a5d6331d13903b0c1564a8c69f04a33feb59f5-d deleted file mode 100644 index 9ec4aac..0000000 --- a/.cache/go-build/9e/9e14399bf06da03dba976621f2a5d6331d13903b0c1564a8c69f04a33feb59f5-d +++ /dev/null @@ -1 +0,0 @@ -./encoding.go diff --git a/.cache/go-build/9e/9e1bee65f89a698fc16682af3859e63594ace3bb1c3359dd69f54430b6acb1ab-d b/.cache/go-build/9e/9e1bee65f89a698fc16682af3859e63594ace3bb1c3359dd69f54430b6acb1ab-d deleted file mode 100644 index d833c18..0000000 Binary files a/.cache/go-build/9e/9e1bee65f89a698fc16682af3859e63594ace3bb1c3359dd69f54430b6acb1ab-d and /dev/null differ diff --git a/.cache/go-build/9e/9e230c296561fc69dc354f86d005b51d42c79c0d99590f28eade50b66a3ad563-a b/.cache/go-build/9e/9e230c296561fc69dc354f86d005b51d42c79c0d99590f28eade50b66a3ad563-a deleted file mode 100644 index 225a020..0000000 --- a/.cache/go-build/9e/9e230c296561fc69dc354f86d005b51d42c79c0d99590f28eade50b66a3ad563-a +++ /dev/null @@ -1 +0,0 @@ -v1 9e230c296561fc69dc354f86d005b51d42c79c0d99590f28eade50b66a3ad563 8ae6e84e87eea377b17c4e54538134aeac6fed932599a2bb9bab8f1f8a13410b 147600 1775136288613088726 diff --git a/.cache/go-build/9e/9e852b6b057a43ee008a818abecc11f1ba2da857462f6aa898ed88473a582916-a b/.cache/go-build/9e/9e852b6b057a43ee008a818abecc11f1ba2da857462f6aa898ed88473a582916-a deleted file mode 100644 index 633a6b7..0000000 --- a/.cache/go-build/9e/9e852b6b057a43ee008a818abecc11f1ba2da857462f6aa898ed88473a582916-a +++ /dev/null @@ -1 +0,0 @@ -v1 9e852b6b057a43ee008a818abecc11f1ba2da857462f6aa898ed88473a582916 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288914088631 diff --git a/.cache/go-build/9e/9e8c7389215f6d8e9d28e69384f519109dd52012fd2110f36e789f3f0eb03213-a b/.cache/go-build/9e/9e8c7389215f6d8e9d28e69384f519109dd52012fd2110f36e789f3f0eb03213-a deleted file mode 100644 index cacfd6d..0000000 --- a/.cache/go-build/9e/9e8c7389215f6d8e9d28e69384f519109dd52012fd2110f36e789f3f0eb03213-a +++ /dev/null @@ -1 +0,0 @@ -v1 9e8c7389215f6d8e9d28e69384f519109dd52012fd2110f36e789f3f0eb03213 536057f20f42b0658dfd976ea469c670042dc7290473af34c01f15ceb499a062 2572450 1775137376824753265 diff --git a/.cache/go-build/9e/9e9888ba5b02a3c0913e3d7e16839e15ef479f0562f02ed417f7593931d7cd4b-a b/.cache/go-build/9e/9e9888ba5b02a3c0913e3d7e16839e15ef479f0562f02ed417f7593931d7cd4b-a deleted file mode 100644 index df83f49..0000000 --- a/.cache/go-build/9e/9e9888ba5b02a3c0913e3d7e16839e15ef479f0562f02ed417f7593931d7cd4b-a +++ /dev/null @@ -1 +0,0 @@ -v1 9e9888ba5b02a3c0913e3d7e16839e15ef479f0562f02ed417f7593931d7cd4b 50fd77047059e82529c27d30f937f49a67214d4f553f9bc3d5dcbb5a5f08bba4 826 1775136286922430487 diff --git a/.cache/go-build/9f/9f2188566fa3959df274876165d904adb42d95bde9121f0b0618ad3d5a813896-d b/.cache/go-build/9f/9f2188566fa3959df274876165d904adb42d95bde9121f0b0618ad3d5a813896-d deleted file mode 100644 index b6fe38c..0000000 --- a/.cache/go-build/9f/9f2188566fa3959df274876165d904adb42d95bde9121f0b0618ad3d5a813896-d +++ /dev/null @@ -1,5 +0,0 @@ -./search.go -./slice.go -./sort.go -./zsortfunc.go -./zsortinterface.go diff --git a/.cache/go-build/9f/9f5d2304c0f92ad96c16363a8b2b0a9230f76f25c57c4e328d604a1f124ca47c-a b/.cache/go-build/9f/9f5d2304c0f92ad96c16363a8b2b0a9230f76f25c57c4e328d604a1f124ca47c-a deleted file mode 100644 index 371df48..0000000 --- a/.cache/go-build/9f/9f5d2304c0f92ad96c16363a8b2b0a9230f76f25c57c4e328d604a1f124ca47c-a +++ /dev/null @@ -1 +0,0 @@ -v1 9f5d2304c0f92ad96c16363a8b2b0a9230f76f25c57c4e328d604a1f124ca47c 024d8853cd8bd66de4848e5c56e12e11b856640fd7ac72df7cd9df07021cfa03 748462 1775136288630282218 diff --git a/.cache/go-build/9f/9f68bb3ea78bc4a78afec45ab551ef588fbe985010b90615d15a1f896d957779-a b/.cache/go-build/9f/9f68bb3ea78bc4a78afec45ab551ef588fbe985010b90615d15a1f896d957779-a deleted file mode 100644 index e82ac25..0000000 --- a/.cache/go-build/9f/9f68bb3ea78bc4a78afec45ab551ef588fbe985010b90615d15a1f896d957779-a +++ /dev/null @@ -1 +0,0 @@ -v1 9f68bb3ea78bc4a78afec45ab551ef588fbe985010b90615d15a1f896d957779 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287015581873 diff --git a/.cache/go-build/9f/9f7f1edbb7ded50da384d790a3b3ece2d0d3f9d1cfc28b846581bdc5e05a6c64-a b/.cache/go-build/9f/9f7f1edbb7ded50da384d790a3b3ece2d0d3f9d1cfc28b846581bdc5e05a6c64-a deleted file mode 100644 index bd9cf51..0000000 --- a/.cache/go-build/9f/9f7f1edbb7ded50da384d790a3b3ece2d0d3f9d1cfc28b846581bdc5e05a6c64-a +++ /dev/null @@ -1 +0,0 @@ -v1 9f7f1edbb7ded50da384d790a3b3ece2d0d3f9d1cfc28b846581bdc5e05a6c64 0c0d2406829b5192ef4513ac501de781ccf483eb95fb76bfc7b5674a7c1170eb 10 1775136288525266573 diff --git a/.cache/go-build/9f/9f93f235075090f20c67a6581cd76b936e91f1968e64a28111bdddc92c9cc219-d b/.cache/go-build/9f/9f93f235075090f20c67a6581cd76b936e91f1968e64a28111bdddc92c9cc219-d deleted file mode 100644 index 0bc77a7..0000000 --- a/.cache/go-build/9f/9f93f235075090f20c67a6581cd76b936e91f1968e64a28111bdddc92c9cc219-d +++ /dev/null @@ -1,5 +0,0 @@ -./bytealg.go -./doc.go -./isprint.go -./number.go -./quote.go diff --git a/.cache/go-build/9f/9fe7375d928d8ec0a769651a4e08a923c66e6af3aeb904ef425d961754beca8c-a b/.cache/go-build/9f/9fe7375d928d8ec0a769651a4e08a923c66e6af3aeb904ef425d961754beca8c-a deleted file mode 100644 index bf3f1fa..0000000 --- a/.cache/go-build/9f/9fe7375d928d8ec0a769651a4e08a923c66e6af3aeb904ef425d961754beca8c-a +++ /dev/null @@ -1 +0,0 @@ -v1 9fe7375d928d8ec0a769651a4e08a923c66e6af3aeb904ef425d961754beca8c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287057407193 diff --git a/.cache/go-build/README b/.cache/go-build/README deleted file mode 100644 index eeaef1c..0000000 --- a/.cache/go-build/README +++ /dev/null @@ -1,4 +0,0 @@ -This directory holds cached build artifacts from the Go build system. -Run "go clean -cache" if the directory is getting too large. -Run "go clean -fuzzcache" to delete the fuzz cache. -See go.dev to learn more about Go. diff --git a/.cache/go-build/a0/a03099b6ba59adce8fc0876eb016e297a7c86cd7db2defdd54dd727f653bb4d8-d b/.cache/go-build/a0/a03099b6ba59adce8fc0876eb016e297a7c86cd7db2defdd54dd727f653bb4d8-d deleted file mode 100644 index 54b8ac5..0000000 Binary files a/.cache/go-build/a0/a03099b6ba59adce8fc0876eb016e297a7c86cd7db2defdd54dd727f653bb4d8-d and /dev/null differ diff --git a/.cache/go-build/a0/a048e1458244ffc4cdb76afb3748ccf2af3baf40956ff93e9f5406d2a3a7e71f-a b/.cache/go-build/a0/a048e1458244ffc4cdb76afb3748ccf2af3baf40956ff93e9f5406d2a3a7e71f-a deleted file mode 100644 index 1489503..0000000 --- a/.cache/go-build/a0/a048e1458244ffc4cdb76afb3748ccf2af3baf40956ff93e9f5406d2a3a7e71f-a +++ /dev/null @@ -1 +0,0 @@ -v1 a048e1458244ffc4cdb76afb3748ccf2af3baf40956ff93e9f5406d2a3a7e71f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287025802811 diff --git a/.cache/go-build/a0/a07acb77de4fa3c974b9069b0374d097651ecca913e83167a700e59fc662e6ba-a b/.cache/go-build/a0/a07acb77de4fa3c974b9069b0374d097651ecca913e83167a700e59fc662e6ba-a deleted file mode 100644 index 65937e5..0000000 --- a/.cache/go-build/a0/a07acb77de4fa3c974b9069b0374d097651ecca913e83167a700e59fc662e6ba-a +++ /dev/null @@ -1 +0,0 @@ -v1 a07acb77de4fa3c974b9069b0374d097651ecca913e83167a700e59fc662e6ba 9e14399bf06da03dba976621f2a5d6331d13903b0c1564a8c69f04a33feb59f5 14 1775136286943837962 diff --git a/.cache/go-build/a0/a0c7689eb4afebee69bdd1cf4298a6e18b83f3655d5524d5d092c31af36813dc-a b/.cache/go-build/a0/a0c7689eb4afebee69bdd1cf4298a6e18b83f3655d5524d5d092c31af36813dc-a deleted file mode 100644 index ec64a68..0000000 --- a/.cache/go-build/a0/a0c7689eb4afebee69bdd1cf4298a6e18b83f3655d5524d5d092c31af36813dc-a +++ /dev/null @@ -1 +0,0 @@ -v1 a0c7689eb4afebee69bdd1cf4298a6e18b83f3655d5524d5d092c31af36813dc 07abd86d01b5a778b567fc49a8a06d9f80d9db944134cbb72177a19955f4a5a6 20 1775136288640973216 diff --git a/.cache/go-build/a1/a1ae7a67c6830981ced27b68132025d94bf38bd8e3ffe18d14fcbf88f1031388-d b/.cache/go-build/a1/a1ae7a67c6830981ced27b68132025d94bf38bd8e3ffe18d14fcbf88f1031388-d deleted file mode 100644 index 03d9d88..0000000 --- a/.cache/go-build/a1/a1ae7a67c6830981ced27b68132025d94bf38bd8e3ffe18d14fcbf88f1031388-d +++ /dev/null @@ -1,5 +0,0 @@ -./match.go -./path.go -./path_unix.go -./symlink.go -./symlink_unix.go diff --git a/.cache/go-build/a1/a1d88b39f399f92046bb00b6676cfe45831fd72d2e4ddf8182da46223293dc33-d b/.cache/go-build/a1/a1d88b39f399f92046bb00b6676cfe45831fd72d2e4ddf8182da46223293dc33-d deleted file mode 100644 index 05918cd..0000000 Binary files a/.cache/go-build/a1/a1d88b39f399f92046bb00b6676cfe45831fd72d2e4ddf8182da46223293dc33-d and /dev/null differ diff --git a/.cache/go-build/a2/a273089119100a03dbe2a9353a19eb3dde28cba3471a992f7055b87c4e6431d5-a b/.cache/go-build/a2/a273089119100a03dbe2a9353a19eb3dde28cba3471a992f7055b87c4e6431d5-a deleted file mode 100644 index 9f38c1e..0000000 --- a/.cache/go-build/a2/a273089119100a03dbe2a9353a19eb3dde28cba3471a992f7055b87c4e6431d5-a +++ /dev/null @@ -1 +0,0 @@ -v1 a273089119100a03dbe2a9353a19eb3dde28cba3471a992f7055b87c4e6431d5 847ccfb4d1838679418cd33ff3d51dbf2f6cee4160c3f93c7db7b1c293f4d0ff 581 1775137721817424473 diff --git a/.cache/go-build/a2/a291a0189b1bc79fbba0d708902f748eefe14257fde2b7ee1ec0b5a970a7cad2-a b/.cache/go-build/a2/a291a0189b1bc79fbba0d708902f748eefe14257fde2b7ee1ec0b5a970a7cad2-a deleted file mode 100644 index 75143be..0000000 --- a/.cache/go-build/a2/a291a0189b1bc79fbba0d708902f748eefe14257fde2b7ee1ec0b5a970a7cad2-a +++ /dev/null @@ -1 +0,0 @@ -v1 a291a0189b1bc79fbba0d708902f748eefe14257fde2b7ee1ec0b5a970a7cad2 7702a634771dd36e89ef892c53bafad55d5ef088971d0ac9568e8a86cd6ab562 4084 1775136286911115889 diff --git a/.cache/go-build/a2/a295270f91ff5d80028599ac556675169c32e3a1439067db639d069c12350d50-a b/.cache/go-build/a2/a295270f91ff5d80028599ac556675169c32e3a1439067db639d069c12350d50-a deleted file mode 100644 index 5059fd1..0000000 --- a/.cache/go-build/a2/a295270f91ff5d80028599ac556675169c32e3a1439067db639d069c12350d50-a +++ /dev/null @@ -1 +0,0 @@ -v1 a295270f91ff5d80028599ac556675169c32e3a1439067db639d069c12350d50 a34d7ca75bc21ad858bc7f670c43a0ccc6bb76f022dd1d601b0281c02c7d1ae3 600476 1775138184075816796 diff --git a/.cache/go-build/a2/a2e76d95959219f7719d29cb137281d5bbb2ea16f24777a0d3b5944bf56bc7b9-a b/.cache/go-build/a2/a2e76d95959219f7719d29cb137281d5bbb2ea16f24777a0d3b5944bf56bc7b9-a deleted file mode 100644 index 135784c..0000000 --- a/.cache/go-build/a2/a2e76d95959219f7719d29cb137281d5bbb2ea16f24777a0d3b5944bf56bc7b9-a +++ /dev/null @@ -1 +0,0 @@ -v1 a2e76d95959219f7719d29cb137281d5bbb2ea16f24777a0d3b5944bf56bc7b9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289000362743 diff --git a/.cache/go-build/a3/a3018bc80bbff44964500fdd87afc9bc865819fb5ea382c56f5bcf1d59d5793e-a b/.cache/go-build/a3/a3018bc80bbff44964500fdd87afc9bc865819fb5ea382c56f5bcf1d59d5793e-a deleted file mode 100644 index 99d93d3..0000000 --- a/.cache/go-build/a3/a3018bc80bbff44964500fdd87afc9bc865819fb5ea382c56f5bcf1d59d5793e-a +++ /dev/null @@ -1 +0,0 @@ -v1 a3018bc80bbff44964500fdd87afc9bc865819fb5ea382c56f5bcf1d59d5793e d170c02cc3412cbcb241fcb2745c74381b2b1b3768ca8d939e5ff535f1ebf79f 273 1775136286940323840 diff --git a/.cache/go-build/a3/a34d7ca75bc21ad858bc7f670c43a0ccc6bb76f022dd1d601b0281c02c7d1ae3-d b/.cache/go-build/a3/a34d7ca75bc21ad858bc7f670c43a0ccc6bb76f022dd1d601b0281c02c7d1ae3-d deleted file mode 100644 index b966853..0000000 Binary files a/.cache/go-build/a3/a34d7ca75bc21ad858bc7f670c43a0ccc6bb76f022dd1d601b0281c02c7d1ae3-d and /dev/null differ diff --git a/.cache/go-build/a3/a37a95d08b6901635c1856327126fdc1908adeaef3fc0214a64f211f3063643e-d b/.cache/go-build/a3/a37a95d08b6901635c1856327126fdc1908adeaef3fc0214a64f211f3063643e-d deleted file mode 100644 index b631f44..0000000 --- a/.cache/go-build/a3/a37a95d08b6901635c1856327126fdc1908adeaef3fc0214a64f211f3063643e-d +++ /dev/null @@ -1 +0,0 @@ -./cpu.go diff --git a/.cache/go-build/a3/a387dad9a686ea2a718ed1806f520c3d9df70b2e8f17c302f8d0aff076702c63-a b/.cache/go-build/a3/a387dad9a686ea2a718ed1806f520c3d9df70b2e8f17c302f8d0aff076702c63-a deleted file mode 100644 index cdfbaab..0000000 --- a/.cache/go-build/a3/a387dad9a686ea2a718ed1806f520c3d9df70b2e8f17c302f8d0aff076702c63-a +++ /dev/null @@ -1 +0,0 @@ -v1 a387dad9a686ea2a718ed1806f520c3d9df70b2e8f17c302f8d0aff076702c63 2c642d168b7cb35dcfa251c952251dd552d5f90e9b68e9ca97a4e1c57a1d6295 1158 1775136286925238529 diff --git a/.cache/go-build/a3/a38bc641e6336e37ff18183af455f0204c607c063c4f273f624382e614353100-a b/.cache/go-build/a3/a38bc641e6336e37ff18183af455f0204c607c063c4f273f624382e614353100-a deleted file mode 100644 index 6030f75..0000000 --- a/.cache/go-build/a3/a38bc641e6336e37ff18183af455f0204c607c063c4f273f624382e614353100-a +++ /dev/null @@ -1 +0,0 @@ -v1 a38bc641e6336e37ff18183af455f0204c607c063c4f273f624382e614353100 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722028016664 diff --git a/.cache/go-build/a4/a439cfea8ffb48e041fcac7cbcdf3c6429b1b36c9a84709f127965b1bb736e7d-a b/.cache/go-build/a4/a439cfea8ffb48e041fcac7cbcdf3c6429b1b36c9a84709f127965b1bb736e7d-a deleted file mode 100644 index 0b50691..0000000 --- a/.cache/go-build/a4/a439cfea8ffb48e041fcac7cbcdf3c6429b1b36c9a84709f127965b1bb736e7d-a +++ /dev/null @@ -1 +0,0 @@ -v1 a439cfea8ffb48e041fcac7cbcdf3c6429b1b36c9a84709f127965b1bb736e7d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287202246727 diff --git a/.cache/go-build/a4/a46e53744ff729105f06091536a57c3c2a3d07cc5cb03c0cb70d7904cf54ef8a-d b/.cache/go-build/a4/a46e53744ff729105f06091536a57c3c2a3d07cc5cb03c0cb70d7904cf54ef8a-d deleted file mode 100644 index 630a7db..0000000 Binary files a/.cache/go-build/a4/a46e53744ff729105f06091536a57c3c2a3d07cc5cb03c0cb70d7904cf54ef8a-d and /dev/null differ diff --git a/.cache/go-build/a4/a4bd2914aa4d2ccb517dacf5c349d48f6aa38fb727af12a23900f183f99b97ab-a b/.cache/go-build/a4/a4bd2914aa4d2ccb517dacf5c349d48f6aa38fb727af12a23900f183f99b97ab-a deleted file mode 100644 index c5289c9..0000000 --- a/.cache/go-build/a4/a4bd2914aa4d2ccb517dacf5c349d48f6aa38fb727af12a23900f183f99b97ab-a +++ /dev/null @@ -1 +0,0 @@ -v1 a4bd2914aa4d2ccb517dacf5c349d48f6aa38fb727af12a23900f183f99b97ab 96650c9c3486d63f7bc61e1be80677a5f0666f834e5d7b3622e1dadbde78c53a 1056862 1775136287152412641 diff --git a/.cache/go-build/a4/a4c05dee1104147558c670308cb3ce80fffeb7bed5a4e04a802643b86a06e0ea-a b/.cache/go-build/a4/a4c05dee1104147558c670308cb3ce80fffeb7bed5a4e04a802643b86a06e0ea-a deleted file mode 100644 index 81d35f5..0000000 --- a/.cache/go-build/a4/a4c05dee1104147558c670308cb3ce80fffeb7bed5a4e04a802643b86a06e0ea-a +++ /dev/null @@ -1 +0,0 @@ -v1 a4c05dee1104147558c670308cb3ce80fffeb7bed5a4e04a802643b86a06e0ea e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288989684425 diff --git a/.cache/go-build/a5/a50477db0fec6f281ae1e8cdeee0ad496146d54f9ad9b1fbb7b0e7dab2dc401c-d b/.cache/go-build/a5/a50477db0fec6f281ae1e8cdeee0ad496146d54f9ad9b1fbb7b0e7dab2dc401c-d deleted file mode 100644 index 0e6d9df..0000000 Binary files a/.cache/go-build/a5/a50477db0fec6f281ae1e8cdeee0ad496146d54f9ad9b1fbb7b0e7dab2dc401c-d and /dev/null differ diff --git a/.cache/go-build/a5/a54318c8045f03cf542bab592b61d5bc8dabcdf5e007bb06f95fcde60dd59614-a b/.cache/go-build/a5/a54318c8045f03cf542bab592b61d5bc8dabcdf5e007bb06f95fcde60dd59614-a deleted file mode 100644 index 2f36bbb..0000000 --- a/.cache/go-build/a5/a54318c8045f03cf542bab592b61d5bc8dabcdf5e007bb06f95fcde60dd59614-a +++ /dev/null @@ -1 +0,0 @@ -v1 a54318c8045f03cf542bab592b61d5bc8dabcdf5e007bb06f95fcde60dd59614 25cb6885b37374c34d4e1d50bc6cdf54148525f305b3834fcc34f09666be41e2 116918 1775136289961215820 diff --git a/.cache/go-build/a5/a587e42cf8814481a10e94b8ef9b29be4ac2069d22b7095d852afdc1a9bc1d03-a b/.cache/go-build/a5/a587e42cf8814481a10e94b8ef9b29be4ac2069d22b7095d852afdc1a9bc1d03-a deleted file mode 100644 index 6d57a5a..0000000 --- a/.cache/go-build/a5/a587e42cf8814481a10e94b8ef9b29be4ac2069d22b7095d852afdc1a9bc1d03-a +++ /dev/null @@ -1 +0,0 @@ -v1 a587e42cf8814481a10e94b8ef9b29be4ac2069d22b7095d852afdc1a9bc1d03 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722020199418 diff --git a/.cache/go-build/a5/a59f446d714cbe3a8526d7559110859af763b1d3c423f97a052608d30b8fe312-a b/.cache/go-build/a5/a59f446d714cbe3a8526d7559110859af763b1d3c423f97a052608d30b8fe312-a deleted file mode 100644 index a336183..0000000 --- a/.cache/go-build/a5/a59f446d714cbe3a8526d7559110859af763b1d3c423f97a052608d30b8fe312-a +++ /dev/null @@ -1 +0,0 @@ -v1 a59f446d714cbe3a8526d7559110859af763b1d3c423f97a052608d30b8fe312 6d4a91a958d61a2bcf9c6d17a4c62f752b267814c495af46af25cfb45d30f181 1798 1775136286832954803 diff --git a/.cache/go-build/a5/a5d641b294408e5abd3f48160d1d879643d78b5d6e05895ef8fbeeaa8556b8c1-a b/.cache/go-build/a5/a5d641b294408e5abd3f48160d1d879643d78b5d6e05895ef8fbeeaa8556b8c1-a deleted file mode 100644 index b735a20..0000000 --- a/.cache/go-build/a5/a5d641b294408e5abd3f48160d1d879643d78b5d6e05895ef8fbeeaa8556b8c1-a +++ /dev/null @@ -1 +0,0 @@ -v1 a5d641b294408e5abd3f48160d1d879643d78b5d6e05895ef8fbeeaa8556b8c1 e80fa97d0b1504a6a9a0ec29be1cf6598a900f8483fc139e9c3d7524223a152e 9 1775136289381039565 diff --git a/.cache/go-build/a5/a5dfaec9923f925c209e60f0ba920d762d0679d11462045def1855083217de5a-a b/.cache/go-build/a5/a5dfaec9923f925c209e60f0ba920d762d0679d11462045def1855083217de5a-a deleted file mode 100644 index 3a497d5..0000000 --- a/.cache/go-build/a5/a5dfaec9923f925c209e60f0ba920d762d0679d11462045def1855083217de5a-a +++ /dev/null @@ -1 +0,0 @@ -v1 a5dfaec9923f925c209e60f0ba920d762d0679d11462045def1855083217de5a e5067057ea25d47e75be9c244071d1088c17047bfe38df0a4b577d0e827f0e80 57 1775136289719519057 diff --git a/.cache/go-build/a6/a6056b8c8133fc35a189992e00ffb7e07e824b8d6671b23c9600237474c56a50-a b/.cache/go-build/a6/a6056b8c8133fc35a189992e00ffb7e07e824b8d6671b23c9600237474c56a50-a deleted file mode 100644 index dccfb8f..0000000 --- a/.cache/go-build/a6/a6056b8c8133fc35a189992e00ffb7e07e824b8d6671b23c9600237474c56a50-a +++ /dev/null @@ -1 +0,0 @@ -v1 a6056b8c8133fc35a189992e00ffb7e07e824b8d6671b23c9600237474c56a50 c9e606d004cc52dc1cdab23e1466ec305f9e53462c296e6eb2c3ee4595d0718f 195 1775136289519576764 diff --git a/.cache/go-build/a6/a64112fdeda46e513ec3e40cdfe70529540537e0d9ad275cfc318251ccae842c-a b/.cache/go-build/a6/a64112fdeda46e513ec3e40cdfe70529540537e0d9ad275cfc318251ccae842c-a deleted file mode 100644 index 41849f2..0000000 --- a/.cache/go-build/a6/a64112fdeda46e513ec3e40cdfe70529540537e0d9ad275cfc318251ccae842c-a +++ /dev/null @@ -1 +0,0 @@ -v1 a64112fdeda46e513ec3e40cdfe70529540537e0d9ad275cfc318251ccae842c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286983181000 diff --git a/.cache/go-build/a6/a664e3a4cd976e50a052e41aae690736e27821f71a918ac385927b4ad5ae56f3-a b/.cache/go-build/a6/a664e3a4cd976e50a052e41aae690736e27821f71a918ac385927b4ad5ae56f3-a deleted file mode 100644 index dac45d5..0000000 --- a/.cache/go-build/a6/a664e3a4cd976e50a052e41aae690736e27821f71a918ac385927b4ad5ae56f3-a +++ /dev/null @@ -1 +0,0 @@ -v1 a664e3a4cd976e50a052e41aae690736e27821f71a918ac385927b4ad5ae56f3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287107160509 diff --git a/.cache/go-build/a6/a66ad59a0327b6e67b37639f372370cee80eac5991229ebbecd90c91aba51e87-d b/.cache/go-build/a6/a66ad59a0327b6e67b37639f372370cee80eac5991229ebbecd90c91aba51e87-d deleted file mode 100644 index 567dc3d..0000000 Binary files a/.cache/go-build/a6/a66ad59a0327b6e67b37639f372370cee80eac5991229ebbecd90c91aba51e87-d and /dev/null differ diff --git a/.cache/go-build/a6/a682aa233e83363cd51e41fe87a3f2b56593396fb8a35c2d5dfa476d9b97d356-a b/.cache/go-build/a6/a682aa233e83363cd51e41fe87a3f2b56593396fb8a35c2d5dfa476d9b97d356-a deleted file mode 100644 index 8677b59..0000000 --- a/.cache/go-build/a6/a682aa233e83363cd51e41fe87a3f2b56593396fb8a35c2d5dfa476d9b97d356-a +++ /dev/null @@ -1 +0,0 @@ -v1 a682aa233e83363cd51e41fe87a3f2b56593396fb8a35c2d5dfa476d9b97d356 2b2eeee1be7c0b5d52daa3f6fe1a9e0bf60bf6d02f9119e252cef409a586edae 881238 1775137722002701476 diff --git a/.cache/go-build/a6/a6988937554812963b3e4ae0916be63613a8b6f02626d8341171f8e12ec424bc-a b/.cache/go-build/a6/a6988937554812963b3e4ae0916be63613a8b6f02626d8341171f8e12ec424bc-a deleted file mode 100644 index e87532b..0000000 --- a/.cache/go-build/a6/a6988937554812963b3e4ae0916be63613a8b6f02626d8341171f8e12ec424bc-a +++ /dev/null @@ -1 +0,0 @@ -v1 a6988937554812963b3e4ae0916be63613a8b6f02626d8341171f8e12ec424bc e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287030337724 diff --git a/.cache/go-build/a6/a6c6307bfb5cdd0a45fac0e0eb0f8d237299e7b8c87b0e11e10860fd30d15e91-d b/.cache/go-build/a6/a6c6307bfb5cdd0a45fac0e0eb0f8d237299e7b8c87b0e11e10860fd30d15e91-d deleted file mode 100644 index ddb5539..0000000 Binary files a/.cache/go-build/a6/a6c6307bfb5cdd0a45fac0e0eb0f8d237299e7b8c87b0e11e10860fd30d15e91-d and /dev/null differ diff --git a/.cache/go-build/a6/a6f23e145d744eb15a12bc68e3dba4d81c96e476031ee9dbf55c924afb76e58c-a b/.cache/go-build/a6/a6f23e145d744eb15a12bc68e3dba4d81c96e476031ee9dbf55c924afb76e58c-a deleted file mode 100644 index 39f6ba5..0000000 --- a/.cache/go-build/a6/a6f23e145d744eb15a12bc68e3dba4d81c96e476031ee9dbf55c924afb76e58c-a +++ /dev/null @@ -1 +0,0 @@ -v1 a6f23e145d744eb15a12bc68e3dba4d81c96e476031ee9dbf55c924afb76e58c 6c924fa6dee5bca7d9b032c7729bc48e04d180b4043449f4fe1e48fd7be34b6a 265 1775136286815215730 diff --git a/.cache/go-build/a7/a7302a8e979303e51bd8ad638c0b87437534d9c0307737771a596b436ae7bcce-d b/.cache/go-build/a7/a7302a8e979303e51bd8ad638c0b87437534d9c0307737771a596b436ae7bcce-d deleted file mode 100644 index 61ccaad..0000000 Binary files a/.cache/go-build/a7/a7302a8e979303e51bd8ad638c0b87437534d9c0307737771a596b436ae7bcce-d and /dev/null differ diff --git a/.cache/go-build/a7/a7445f19ed8b0145ce1a5f11d80a5154072eb09138cff5b23bcc5acc51dc84f4-d b/.cache/go-build/a7/a7445f19ed8b0145ce1a5f11d80a5154072eb09138cff5b23bcc5acc51dc84f4-d deleted file mode 100644 index d5fc81f..0000000 Binary files a/.cache/go-build/a7/a7445f19ed8b0145ce1a5f11d80a5154072eb09138cff5b23bcc5acc51dc84f4-d and /dev/null differ diff --git a/.cache/go-build/a7/a74cd15f49c88ae3fae19b661e6c5694a217a3dbcedf54b03af95b43ee465578-a b/.cache/go-build/a7/a74cd15f49c88ae3fae19b661e6c5694a217a3dbcedf54b03af95b43ee465578-a deleted file mode 100644 index 26653b5..0000000 --- a/.cache/go-build/a7/a74cd15f49c88ae3fae19b661e6c5694a217a3dbcedf54b03af95b43ee465578-a +++ /dev/null @@ -1 +0,0 @@ -v1 a74cd15f49c88ae3fae19b661e6c5694a217a3dbcedf54b03af95b43ee465578 b69f95e9670e9d19e4b7ff835e57c2e18bb5a072400b21db9b83d5720095ccb1 2343738 1775136289676098636 diff --git a/.cache/go-build/a7/a789eb23679bad0468ca30472da04f3ee126a5193862e13d2f45bccaa716ddea-d b/.cache/go-build/a7/a789eb23679bad0468ca30472da04f3ee126a5193862e13d2f45bccaa716ddea-d deleted file mode 100644 index 8f74454..0000000 Binary files a/.cache/go-build/a7/a789eb23679bad0468ca30472da04f3ee126a5193862e13d2f45bccaa716ddea-d and /dev/null differ diff --git a/.cache/go-build/a7/a79e84c5f6c3f099c3e13510d142ae3c4e7d24621f37bc916dfc7c4457b9f17b-d b/.cache/go-build/a7/a79e84c5f6c3f099c3e13510d142ae3c4e7d24621f37bc916dfc7c4457b9f17b-d deleted file mode 100644 index 1ef17b6..0000000 Binary files a/.cache/go-build/a7/a79e84c5f6c3f099c3e13510d142ae3c4e7d24621f37bc916dfc7c4457b9f17b-d and /dev/null differ diff --git a/.cache/go-build/a7/a7dd80cf8985a471bf85c54f721b69d25791202e2ec66bd557cd9edff4600c40-a b/.cache/go-build/a7/a7dd80cf8985a471bf85c54f721b69d25791202e2ec66bd557cd9edff4600c40-a deleted file mode 100644 index 1c97466..0000000 --- a/.cache/go-build/a7/a7dd80cf8985a471bf85c54f721b69d25791202e2ec66bd557cd9edff4600c40-a +++ /dev/null @@ -1 +0,0 @@ -v1 a7dd80cf8985a471bf85c54f721b69d25791202e2ec66bd557cd9edff4600c40 ee575944483fa0b726c8cc709aef6b17ec3219c863f2fed9550bec75838aaf2b 611 1775136286826141828 diff --git a/.cache/go-build/a8/a801f3432efb6576dd461fbf60468f02db9a64dc1bea167b1f9cf7db39244f0e-a b/.cache/go-build/a8/a801f3432efb6576dd461fbf60468f02db9a64dc1bea167b1f9cf7db39244f0e-a deleted file mode 100644 index 4bc6775..0000000 --- a/.cache/go-build/a8/a801f3432efb6576dd461fbf60468f02db9a64dc1bea167b1f9cf7db39244f0e-a +++ /dev/null @@ -1 +0,0 @@ -v1 a801f3432efb6576dd461fbf60468f02db9a64dc1bea167b1f9cf7db39244f0e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289427874659 diff --git a/.cache/go-build/a8/a84ec35df26485de111385d1f44ccfd2aec7a35a463e2f69ee406d4aa5691462-a b/.cache/go-build/a8/a84ec35df26485de111385d1f44ccfd2aec7a35a463e2f69ee406d4aa5691462-a deleted file mode 100644 index e5730cf..0000000 --- a/.cache/go-build/a8/a84ec35df26485de111385d1f44ccfd2aec7a35a463e2f69ee406d4aa5691462-a +++ /dev/null @@ -1 +0,0 @@ -v1 a84ec35df26485de111385d1f44ccfd2aec7a35a463e2f69ee406d4aa5691462 edf7bfe45e186c7d73eac5a90a537b0741151edc7043866d8b3a5aeb04458739 1230 1775136286822629865 diff --git a/.cache/go-build/a8/a881f0afc29ce53d001f555dd617f15c074a2263cebc04d790d2a99cf1720fad-a b/.cache/go-build/a8/a881f0afc29ce53d001f555dd617f15c074a2263cebc04d790d2a99cf1720fad-a deleted file mode 100644 index 6e8815a..0000000 --- a/.cache/go-build/a8/a881f0afc29ce53d001f555dd617f15c074a2263cebc04d790d2a99cf1720fad-a +++ /dev/null @@ -1 +0,0 @@ -v1 a881f0afc29ce53d001f555dd617f15c074a2263cebc04d790d2a99cf1720fad fbd3f0a0b1bcb06b94a210547b346183455be303d482240b6e3b775ad91141c1 29 1775136288463655049 diff --git a/.cache/go-build/a8/a8c464209acf966816f9989b0bcdd85c1e2567df54d844c27b8fbc2a77146266-a b/.cache/go-build/a8/a8c464209acf966816f9989b0bcdd85c1e2567df54d844c27b8fbc2a77146266-a deleted file mode 100644 index 42a6840..0000000 --- a/.cache/go-build/a8/a8c464209acf966816f9989b0bcdd85c1e2567df54d844c27b8fbc2a77146266-a +++ /dev/null @@ -1 +0,0 @@ -v1 a8c464209acf966816f9989b0bcdd85c1e2567df54d844c27b8fbc2a77146266 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289321539933 diff --git a/.cache/go-build/a8/a8eb59868c09c96a06af767bf43dd31544a6c55b9f5408cc6ae4165e1823cf50-a b/.cache/go-build/a8/a8eb59868c09c96a06af767bf43dd31544a6c55b9f5408cc6ae4165e1823cf50-a deleted file mode 100644 index acedbc4..0000000 --- a/.cache/go-build/a8/a8eb59868c09c96a06af767bf43dd31544a6c55b9f5408cc6ae4165e1823cf50-a +++ /dev/null @@ -1 +0,0 @@ -v1 a8eb59868c09c96a06af767bf43dd31544a6c55b9f5408cc6ae4165e1823cf50 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287187304236 diff --git a/.cache/go-build/a9/a92ac68323fffdb2ba35bd17fc8f11c5973fc49233e9218b71d7991b8e69033b-d b/.cache/go-build/a9/a92ac68323fffdb2ba35bd17fc8f11c5973fc49233e9218b71d7991b8e69033b-d deleted file mode 100644 index 980bb66..0000000 Binary files a/.cache/go-build/a9/a92ac68323fffdb2ba35bd17fc8f11c5973fc49233e9218b71d7991b8e69033b-d and /dev/null differ diff --git a/.cache/go-build/a9/a994d6e7a940c1c7ffe2a30bc24984a3d9cddfb1734e3cf1aead3a9b4994f9d5-a b/.cache/go-build/a9/a994d6e7a940c1c7ffe2a30bc24984a3d9cddfb1734e3cf1aead3a9b4994f9d5-a deleted file mode 100644 index d9c7602..0000000 --- a/.cache/go-build/a9/a994d6e7a940c1c7ffe2a30bc24984a3d9cddfb1734e3cf1aead3a9b4994f9d5-a +++ /dev/null @@ -1 +0,0 @@ -v1 a994d6e7a940c1c7ffe2a30bc24984a3d9cddfb1734e3cf1aead3a9b4994f9d5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289531736133 diff --git a/.cache/go-build/a9/a9dd1784d2ea5e2d8663e8c20d5a2d1966719be8a255dc47a7671aae62dab025-d b/.cache/go-build/a9/a9dd1784d2ea5e2d8663e8c20d5a2d1966719be8a255dc47a7671aae62dab025-d deleted file mode 100644 index 82e692e..0000000 Binary files a/.cache/go-build/a9/a9dd1784d2ea5e2d8663e8c20d5a2d1966719be8a255dc47a7671aae62dab025-d and /dev/null differ diff --git a/.cache/go-build/a9/a9e899e5fc92fddeea36ea3db22c4e646bc27563ed4759110972019701131872-a b/.cache/go-build/a9/a9e899e5fc92fddeea36ea3db22c4e646bc27563ed4759110972019701131872-a deleted file mode 100644 index e59b154..0000000 --- a/.cache/go-build/a9/a9e899e5fc92fddeea36ea3db22c4e646bc27563ed4759110972019701131872-a +++ /dev/null @@ -1 +0,0 @@ -v1 a9e899e5fc92fddeea36ea3db22c4e646bc27563ed4759110972019701131872 1bd0e7b814a828e09535fb001f8a91c34b4494f123abb888db0c224bd74ab91b 15 1775136287031101285 diff --git a/.cache/go-build/aa/aa19085ac442655dab82d545d94c10fbd97ca05e93cb78f7f1d544d9157e34e2-a b/.cache/go-build/aa/aa19085ac442655dab82d545d94c10fbd97ca05e93cb78f7f1d544d9157e34e2-a deleted file mode 100644 index ca7d745..0000000 --- a/.cache/go-build/aa/aa19085ac442655dab82d545d94c10fbd97ca05e93cb78f7f1d544d9157e34e2-a +++ /dev/null @@ -1 +0,0 @@ -v1 aa19085ac442655dab82d545d94c10fbd97ca05e93cb78f7f1d544d9157e34e2 bffc7e37f4520aeb5e9aa8860c7fd4a65dd19a9d0fda0f4f92eff4a6efaa1209 31 1775136286925131789 diff --git a/.cache/go-build/aa/aa4a6b6b579cdd2446d417f49f7fc1efa8ec4e637095344a814ea63905a511f4-d b/.cache/go-build/aa/aa4a6b6b579cdd2446d417f49f7fc1efa8ec4e637095344a814ea63905a511f4-d deleted file mode 100644 index 52e9589..0000000 --- a/.cache/go-build/aa/aa4a6b6b579cdd2446d417f49f7fc1efa8ec4e637095344a814ea63905a511f4-d +++ /dev/null @@ -1,9 +0,0 @@ -./format.go -./fs.go -./glob.go -./readdir.go -./readfile.go -./readlink.go -./stat.go -./sub.go -./walk.go diff --git a/.cache/go-build/aa/aa4e1c0b2e202c8c3d7db84eb03ae3c6f17ad5a80d729d1d93fc3545c1e81e47-d b/.cache/go-build/aa/aa4e1c0b2e202c8c3d7db84eb03ae3c6f17ad5a80d729d1d93fc3545c1e81e47-d deleted file mode 100644 index 8641f97..0000000 --- a/.cache/go-build/aa/aa4e1c0b2e202c8c3d7db84eb03ae3c6f17ad5a80d729d1d93fc3545c1e81e47-d +++ /dev/null @@ -1,7 +0,0 @@ -./annotation.go -./batch.go -./encoding.go -./flightrecorder.go -./recorder.go -./subscribe.go -./trace.go diff --git a/.cache/go-build/aa/aa6e82c3526f54e44eb0aaa75dc4bc2f04bffe31faf2fd10546c32625b882598-a b/.cache/go-build/aa/aa6e82c3526f54e44eb0aaa75dc4bc2f04bffe31faf2fd10546c32625b882598-a deleted file mode 100644 index 431fc52..0000000 --- a/.cache/go-build/aa/aa6e82c3526f54e44eb0aaa75dc4bc2f04bffe31faf2fd10546c32625b882598-a +++ /dev/null @@ -1 +0,0 @@ -v1 aa6e82c3526f54e44eb0aaa75dc4bc2f04bffe31faf2fd10546c32625b882598 c03800a08c0f3bc37d82cdff25b96202c924ccccb418e728fc17436cfde7aa6f 11 1775136289482111228 diff --git a/.cache/go-build/aa/aa80f7c3c13a057d0c3af7bc7532763439a3492764a401767577f961114ccbe4-a b/.cache/go-build/aa/aa80f7c3c13a057d0c3af7bc7532763439a3492764a401767577f961114ccbe4-a deleted file mode 100644 index 3ed8241..0000000 --- a/.cache/go-build/aa/aa80f7c3c13a057d0c3af7bc7532763439a3492764a401767577f961114ccbe4-a +++ /dev/null @@ -1 +0,0 @@ -v1 aa80f7c3c13a057d0c3af7bc7532763439a3492764a401767577f961114ccbe4 80ce9caa3c0bb4407d6c6abde34f9c4bf3ad4c029f5387f8bc49a39368efd796 240724 1775136289638606030 diff --git a/.cache/go-build/aa/aae430c1d3a1100099c4739eaf97d3ef91f42e33d681bb0362a38812206aa65b-a b/.cache/go-build/aa/aae430c1d3a1100099c4739eaf97d3ef91f42e33d681bb0362a38812206aa65b-a deleted file mode 100644 index f7c6f17..0000000 --- a/.cache/go-build/aa/aae430c1d3a1100099c4739eaf97d3ef91f42e33d681bb0362a38812206aa65b-a +++ /dev/null @@ -1 +0,0 @@ -v1 aae430c1d3a1100099c4739eaf97d3ef91f42e33d681bb0362a38812206aa65b d472c10032e185507ac1a7d04aa83db5caec9cd2d3fa00849bb173198a56329a 1506 1775136286952264498 diff --git a/.cache/go-build/aa/aae5f44dbfad485c7ae78509698209389ac67d94ef1c647dbd4e1ccaeeb7acab-a b/.cache/go-build/aa/aae5f44dbfad485c7ae78509698209389ac67d94ef1c647dbd4e1ccaeeb7acab-a deleted file mode 100644 index 0bdb5cc..0000000 --- a/.cache/go-build/aa/aae5f44dbfad485c7ae78509698209389ac67d94ef1c647dbd4e1ccaeeb7acab-a +++ /dev/null @@ -1 +0,0 @@ -v1 aae5f44dbfad485c7ae78509698209389ac67d94ef1c647dbd4e1ccaeeb7acab e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287117383836 diff --git a/.cache/go-build/ab/ab537d29a0a710e2db7c8cc6db3e3411b3d86ff290509b06b7472bc537742264-a b/.cache/go-build/ab/ab537d29a0a710e2db7c8cc6db3e3411b3d86ff290509b06b7472bc537742264-a deleted file mode 100644 index d0680fe..0000000 --- a/.cache/go-build/ab/ab537d29a0a710e2db7c8cc6db3e3411b3d86ff290509b06b7472bc537742264-a +++ /dev/null @@ -1 +0,0 @@ -v1 ab537d29a0a710e2db7c8cc6db3e3411b3d86ff290509b06b7472bc537742264 f545eea03c3b3918eb9ea8da640e4096bb88e737da8fe79b982282e391034a00 50 1775136288630510769 diff --git a/.cache/go-build/ab/ab67b830bfc6e7899a1a27794af8753da28727cb024ce5e8f14ea9db6e9838d4-a b/.cache/go-build/ab/ab67b830bfc6e7899a1a27794af8753da28727cb024ce5e8f14ea9db6e9838d4-a deleted file mode 100644 index 8cdd727..0000000 --- a/.cache/go-build/ab/ab67b830bfc6e7899a1a27794af8753da28727cb024ce5e8f14ea9db6e9838d4-a +++ /dev/null @@ -1 +0,0 @@ -v1 ab67b830bfc6e7899a1a27794af8753da28727cb024ce5e8f14ea9db6e9838d4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288753921967 diff --git a/.cache/go-build/ab/abeccc776b2fff818515fd9f48a96c06180d29dafaaacc695044ad8ccf1a794c-a b/.cache/go-build/ab/abeccc776b2fff818515fd9f48a96c06180d29dafaaacc695044ad8ccf1a794c-a deleted file mode 100644 index 41e2536..0000000 --- a/.cache/go-build/ab/abeccc776b2fff818515fd9f48a96c06180d29dafaaacc695044ad8ccf1a794c-a +++ /dev/null @@ -1 +0,0 @@ -v1 abeccc776b2fff818515fd9f48a96c06180d29dafaaacc695044ad8ccf1a794c 2b8604e1338bfdfe7e9d3ce8501470a463b4ef6fafdbc27937e3e54a64d94189 101070 1775136289116805016 diff --git a/.cache/go-build/ac/ac07aedbd2fc59b06c8871121dcd294ee19a819747515fd57a14f26c3ea706ba-a b/.cache/go-build/ac/ac07aedbd2fc59b06c8871121dcd294ee19a819747515fd57a14f26c3ea706ba-a deleted file mode 100644 index f68f2b8..0000000 --- a/.cache/go-build/ac/ac07aedbd2fc59b06c8871121dcd294ee19a819747515fd57a14f26c3ea706ba-a +++ /dev/null @@ -1 +0,0 @@ -v1 ac07aedbd2fc59b06c8871121dcd294ee19a819747515fd57a14f26c3ea706ba 5c7f7c02e3e0061017de9e80d360b6e4b4380106414fa1ba9b632aeb48b41e14 1713 1775136286936147687 diff --git a/.cache/go-build/ac/ac24b812fb8bb5fcdd0073c67a612fb929d2f6d1225b3efa39028f3f5cc7ecd6-d b/.cache/go-build/ac/ac24b812fb8bb5fcdd0073c67a612fb929d2f6d1225b3efa39028f3f5cc7ecd6-d deleted file mode 100644 index 3fc3ad5..0000000 --- a/.cache/go-build/ac/ac24b812fb8bb5fcdd0073c67a612fb929d2f6d1225b3efa39028f3f5cc7ecd6-d +++ /dev/null @@ -1 +0,0 @@ -ok gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/validator 0.001s diff --git a/.cache/go-build/ac/ac2793276e994cc416474de95cee3f7fdcf4a07d56cd17d0de65ae6a0100b63e-d b/.cache/go-build/ac/ac2793276e994cc416474de95cee3f7fdcf4a07d56cd17d0de65ae6a0100b63e-d deleted file mode 100644 index 9b97737..0000000 --- a/.cache/go-build/ac/ac2793276e994cc416474de95cee3f7fdcf4a07d56cd17d0de65ae6a0100b63e-d +++ /dev/null @@ -1,2 +0,0 @@ -./cast.go -./hmac.go diff --git a/.cache/go-build/ac/ac7e4b8c93fd9a25b5ca44b23043da88c5bcd13811ae3d200a2f4cedfbcee857-a b/.cache/go-build/ac/ac7e4b8c93fd9a25b5ca44b23043da88c5bcd13811ae3d200a2f4cedfbcee857-a deleted file mode 100644 index 51e102f..0000000 --- a/.cache/go-build/ac/ac7e4b8c93fd9a25b5ca44b23043da88c5bcd13811ae3d200a2f4cedfbcee857-a +++ /dev/null @@ -1 +0,0 @@ -v1 ac7e4b8c93fd9a25b5ca44b23043da88c5bcd13811ae3d200a2f4cedfbcee857 cf15b1b1b62920e2d2a58d8b2a9a4db08204d3d4bb7fa8c9ff4e617ff188286c 69422 1775136287053240890 diff --git a/.cache/go-build/ac/acbdb5ff2d7bb2d9a2bf2f14d4fe911b53299273daec8587855ce3db4839c280-d b/.cache/go-build/ac/acbdb5ff2d7bb2d9a2bf2f14d4fe911b53299273daec8587855ce3db4839c280-d deleted file mode 100644 index da43ee4..0000000 Binary files a/.cache/go-build/ac/acbdb5ff2d7bb2d9a2bf2f14d4fe911b53299273daec8587855ce3db4839c280-d and /dev/null differ diff --git a/.cache/go-build/ac/acebe7d22de108c8b02e0c1f95cb48a2adc3c8afc1082ba8dd08bb50c49f9fc1-d b/.cache/go-build/ac/acebe7d22de108c8b02e0c1f95cb48a2adc3c8afc1082ba8dd08bb50c49f9fc1-d deleted file mode 100644 index 22b08f9..0000000 Binary files a/.cache/go-build/ac/acebe7d22de108c8b02e0c1f95cb48a2adc3c8afc1082ba8dd08bb50c49f9fc1-d and /dev/null differ diff --git a/.cache/go-build/ad/ad1bfeec2a6874b03a35d51d9475306fadaf9e47528931ba1c662bf9d59c8e65-d b/.cache/go-build/ad/ad1bfeec2a6874b03a35d51d9475306fadaf9e47528931ba1c662bf9d59c8e65-d deleted file mode 100644 index 78c8c33..0000000 Binary files a/.cache/go-build/ad/ad1bfeec2a6874b03a35d51d9475306fadaf9e47528931ba1c662bf9d59c8e65-d and /dev/null differ diff --git a/.cache/go-build/ad/ad38cc3dd8a639cea774303f49619a5dd537aed6ed701dd35e0b4666cd9c47b4-a b/.cache/go-build/ad/ad38cc3dd8a639cea774303f49619a5dd537aed6ed701dd35e0b4666cd9c47b4-a deleted file mode 100644 index 74e3245..0000000 --- a/.cache/go-build/ad/ad38cc3dd8a639cea774303f49619a5dd537aed6ed701dd35e0b4666cd9c47b4-a +++ /dev/null @@ -1 +0,0 @@ -v1 ad38cc3dd8a639cea774303f49619a5dd537aed6ed701dd35e0b4666cd9c47b4 c1bfed6d292926359b852a922f96e0436644077a072300201e954d930749ff06 265 1775136286934563236 diff --git a/.cache/go-build/ad/ad38f6e2b28ea68354a7072d13501c3861b275a006433ac3ae5602997803feab-d b/.cache/go-build/ad/ad38f6e2b28ea68354a7072d13501c3861b275a006433ac3ae5602997803feab-d deleted file mode 100644 index e837129..0000000 --- a/.cache/go-build/ad/ad38f6e2b28ea68354a7072d13501c3861b275a006433ac3ae5602997803feab-d +++ /dev/null @@ -1 +0,0 @@ -./strings.go diff --git a/.cache/go-build/ad/ad4b54e9486893379616e0b191f238c839c864f2f2873152ab091e7cb338dffd-d b/.cache/go-build/ad/ad4b54e9486893379616e0b191f238c839c864f2f2873152ab091e7cb338dffd-d deleted file mode 100644 index f263c1f..0000000 Binary files a/.cache/go-build/ad/ad4b54e9486893379616e0b191f238c839c864f2f2873152ab091e7cb338dffd-d and /dev/null differ diff --git a/.cache/go-build/ad/ad7cfbe7258332cf779152655e241576601c74fe3f8a567adf48c30462ebb20b-a b/.cache/go-build/ad/ad7cfbe7258332cf779152655e241576601c74fe3f8a567adf48c30462ebb20b-a deleted file mode 100644 index e97f58f..0000000 --- a/.cache/go-build/ad/ad7cfbe7258332cf779152655e241576601c74fe3f8a567adf48c30462ebb20b-a +++ /dev/null @@ -1 +0,0 @@ -v1 ad7cfbe7258332cf779152655e241576601c74fe3f8a567adf48c30462ebb20b bea8ed1a649b76bff799833cfe90d66f21dea5a3748781d6aa7ce63d8cd86221 2278 1775136286921765156 diff --git a/.cache/go-build/ad/addf195c1ec70753d32aaac89f39c54ef8d1d36fc725877bbc24fdf50aa66ec0-a b/.cache/go-build/ad/addf195c1ec70753d32aaac89f39c54ef8d1d36fc725877bbc24fdf50aa66ec0-a deleted file mode 100644 index a9b9b67..0000000 --- a/.cache/go-build/ad/addf195c1ec70753d32aaac89f39c54ef8d1d36fc725877bbc24fdf50aa66ec0-a +++ /dev/null @@ -1 +0,0 @@ -v1 addf195c1ec70753d32aaac89f39c54ef8d1d36fc725877bbc24fdf50aa66ec0 834439d2f90c4ea1d43e53d2c25876a7abfd77d7f84a0b02001ab3276b73e496 15 1775138184000690562 diff --git a/.cache/go-build/ad/adfdb3daaecb70e72f6705df87f6ad2054c94b1b36763c18d9cbdf6d890485e0-a b/.cache/go-build/ad/adfdb3daaecb70e72f6705df87f6ad2054c94b1b36763c18d9cbdf6d890485e0-a deleted file mode 100644 index ba87868..0000000 --- a/.cache/go-build/ad/adfdb3daaecb70e72f6705df87f6ad2054c94b1b36763c18d9cbdf6d890485e0-a +++ /dev/null @@ -1 +0,0 @@ -v1 adfdb3daaecb70e72f6705df87f6ad2054c94b1b36763c18d9cbdf6d890485e0 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289028161693 diff --git a/.cache/go-build/ae/ae25cce64cfe70785b1de8f7361cd5ff59e1811ec9a0078cf9ce492cca9609f4-a b/.cache/go-build/ae/ae25cce64cfe70785b1de8f7361cd5ff59e1811ec9a0078cf9ce492cca9609f4-a deleted file mode 100644 index b1f30c8..0000000 --- a/.cache/go-build/ae/ae25cce64cfe70785b1de8f7361cd5ff59e1811ec9a0078cf9ce492cca9609f4-a +++ /dev/null @@ -1 +0,0 @@ -v1 ae25cce64cfe70785b1de8f7361cd5ff59e1811ec9a0078cf9ce492cca9609f4 401e9c2620dba3ffdac27376c243fa418ecfb8421e3838aa99acff0e584d376f 603840 1775136287203481818 diff --git a/.cache/go-build/ae/ae4b6a9e66a598876ce1f67dff1e14cb81f3b7e6826c99e8525c1ede83e81234-d b/.cache/go-build/ae/ae4b6a9e66a598876ce1f67dff1e14cb81f3b7e6826c99e8525c1ede83e81234-d deleted file mode 100644 index c7e38bb..0000000 Binary files a/.cache/go-build/ae/ae4b6a9e66a598876ce1f67dff1e14cb81f3b7e6826c99e8525c1ede83e81234-d and /dev/null differ diff --git a/.cache/go-build/ae/ae9848e063cd5b5fb34eb9e31ef3e5a009573993b61818d6048c072be9a6059d-a b/.cache/go-build/ae/ae9848e063cd5b5fb34eb9e31ef3e5a009573993b61818d6048c072be9a6059d-a deleted file mode 100644 index 9fd1c90..0000000 --- a/.cache/go-build/ae/ae9848e063cd5b5fb34eb9e31ef3e5a009573993b61818d6048c072be9a6059d-a +++ /dev/null @@ -1 +0,0 @@ -v1 ae9848e063cd5b5fb34eb9e31ef3e5a009573993b61818d6048c072be9a6059d 1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b 11 1775136290022418274 diff --git a/.cache/go-build/af/af1d64bec24a393646f5cad32128a428670f189b1507c22e79091da0b882610d-a b/.cache/go-build/af/af1d64bec24a393646f5cad32128a428670f189b1507c22e79091da0b882610d-a deleted file mode 100644 index 8d7bb7f..0000000 --- a/.cache/go-build/af/af1d64bec24a393646f5cad32128a428670f189b1507c22e79091da0b882610d-a +++ /dev/null @@ -1 +0,0 @@ -v1 af1d64bec24a393646f5cad32128a428670f189b1507c22e79091da0b882610d 611333b6e0e9f3f6dd155b886debd7decd0cee8d533ce45e057452e54b50aaaa 101 1775136288641142806 diff --git a/.cache/go-build/af/af2030ef840b461078732464162c63c68a4028672db60e57d64be3b901f655d6-a b/.cache/go-build/af/af2030ef840b461078732464162c63c68a4028672db60e57d64be3b901f655d6-a deleted file mode 100644 index d8fca8d..0000000 --- a/.cache/go-build/af/af2030ef840b461078732464162c63c68a4028672db60e57d64be3b901f655d6-a +++ /dev/null @@ -1 +0,0 @@ -v1 af2030ef840b461078732464162c63c68a4028672db60e57d64be3b901f655d6 7f83a2b6e00b57912317fbbbfa71f36df146a87291b3132b3d7e95fb205399b4 119882 1775136289961329980 diff --git a/.cache/go-build/af/af55715ec53e2a6f419a689398ed41344dea37edb981c79119a1417382a2e193-a b/.cache/go-build/af/af55715ec53e2a6f419a689398ed41344dea37edb981c79119a1417382a2e193-a deleted file mode 100644 index 3dc136f..0000000 --- a/.cache/go-build/af/af55715ec53e2a6f419a689398ed41344dea37edb981c79119a1417382a2e193-a +++ /dev/null @@ -1 +0,0 @@ -v1 af55715ec53e2a6f419a689398ed41344dea37edb981c79119a1417382a2e193 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288963333767 diff --git a/.cache/go-build/af/af8d4a4a9927b9163efb9df22cd1ecb1ad9422e824e598c4f74ffeb7a4eb1bab-a b/.cache/go-build/af/af8d4a4a9927b9163efb9df22cd1ecb1ad9422e824e598c4f74ffeb7a4eb1bab-a deleted file mode 100644 index 9c280ff..0000000 --- a/.cache/go-build/af/af8d4a4a9927b9163efb9df22cd1ecb1ad9422e824e598c4f74ffeb7a4eb1bab-a +++ /dev/null @@ -1 +0,0 @@ -v1 af8d4a4a9927b9163efb9df22cd1ecb1ad9422e824e598c4f74ffeb7a4eb1bab 659ff469f81e3e34cf6be4bd983ef5954b6e8ea1fba8edd716f7026e58ccc39c 707 1775136286837353506 diff --git a/.cache/go-build/af/af8f2e40bcd2252cff400bcb4985b22af9d7a867626371b4c651f0b7c3b9ff0a-a b/.cache/go-build/af/af8f2e40bcd2252cff400bcb4985b22af9d7a867626371b4c651f0b7c3b9ff0a-a deleted file mode 100644 index 3ae7258..0000000 --- a/.cache/go-build/af/af8f2e40bcd2252cff400bcb4985b22af9d7a867626371b4c651f0b7c3b9ff0a-a +++ /dev/null @@ -1 +0,0 @@ -v1 af8f2e40bcd2252cff400bcb4985b22af9d7a867626371b4c651f0b7c3b9ff0a fadd4287518b8dc8d60cf6eb03665702b13804a739459d6016bcb447cd239af1 9324 1775136286934831946 diff --git a/.cache/go-build/af/afa7ed273d59d2e1a5b057592de423dcbf9476ba56f05db5d6999a65c0637f0b-a b/.cache/go-build/af/afa7ed273d59d2e1a5b057592de423dcbf9476ba56f05db5d6999a65c0637f0b-a deleted file mode 100644 index 70fa7e1..0000000 --- a/.cache/go-build/af/afa7ed273d59d2e1a5b057592de423dcbf9476ba56f05db5d6999a65c0637f0b-a +++ /dev/null @@ -1 +0,0 @@ -v1 afa7ed273d59d2e1a5b057592de423dcbf9476ba56f05db5d6999a65c0637f0b 11d979d517dc2e2823445c6ee7e75dc05393385d0d9d960124d2e9482334cf27 40610 1775136287046917506 diff --git a/.cache/go-build/b0/b019c52c77e0bc32da40646d0f46a8ad8a4222955e9237186e273d778baaf336-a b/.cache/go-build/b0/b019c52c77e0bc32da40646d0f46a8ad8a4222955e9237186e273d778baaf336-a deleted file mode 100644 index 72ae87d..0000000 --- a/.cache/go-build/b0/b019c52c77e0bc32da40646d0f46a8ad8a4222955e9237186e273d778baaf336-a +++ /dev/null @@ -1 +0,0 @@ -v1 b019c52c77e0bc32da40646d0f46a8ad8a4222955e9237186e273d778baaf336 62681189671f295f9d265f7b3ecaca8622669986c36b79aa349c73085ab18b0b 1906 1775136286824389487 diff --git a/.cache/go-build/b0/b01a5dbb90a7da0a59b39f3442bbba455cd182ff509ecdf8e2475f6135376acc-d b/.cache/go-build/b0/b01a5dbb90a7da0a59b39f3442bbba455cd182ff509ecdf8e2475f6135376acc-d deleted file mode 100644 index 90d3e72..0000000 --- a/.cache/go-build/b0/b01a5dbb90a7da0a59b39f3442bbba455cd182ff509ecdf8e2475f6135376acc-d +++ /dev/null @@ -1,13 +0,0 @@ -./counters_supported.go -./coverage.go -./encoding.go -./fuzz.go -./mem.go -./minimize.go -./mutator.go -./mutators_byteslice.go -./pcg.go -./queue.go -./sys_posix.go -./trace.go -./worker.go diff --git a/.cache/go-build/b0/b03ddef0d12080a03dcce6ee99982e1c057caeb47eb82d1836786578946d2bef-a b/.cache/go-build/b0/b03ddef0d12080a03dcce6ee99982e1c057caeb47eb82d1836786578946d2bef-a deleted file mode 100644 index 952da1c..0000000 --- a/.cache/go-build/b0/b03ddef0d12080a03dcce6ee99982e1c057caeb47eb82d1836786578946d2bef-a +++ /dev/null @@ -1 +0,0 @@ -v1 b03ddef0d12080a03dcce6ee99982e1c057caeb47eb82d1836786578946d2bef 4eb4ff8567eadab6aaae73170e7f5d4798d26445d41a43ff99da73d4bf197384 526 1775136286822216345 diff --git a/.cache/go-build/b0/b0b2f7fd4670f9a771c8fd6614afe4032f84c4d96d7a49bacf812590d3f94220-d b/.cache/go-build/b0/b0b2f7fd4670f9a771c8fd6614afe4032f84c4d96d7a49bacf812590d3f94220-d deleted file mode 100644 index 4d2977c..0000000 Binary files a/.cache/go-build/b0/b0b2f7fd4670f9a771c8fd6614afe4032f84c4d96d7a49bacf812590d3f94220-d and /dev/null differ diff --git a/.cache/go-build/b0/b0da6ccddd9ede8d941fc1eac96b23e6ff9122d93856134f0dd1a6eaf62fd338-a b/.cache/go-build/b0/b0da6ccddd9ede8d941fc1eac96b23e6ff9122d93856134f0dd1a6eaf62fd338-a deleted file mode 100644 index 93c6a2c..0000000 --- a/.cache/go-build/b0/b0da6ccddd9ede8d941fc1eac96b23e6ff9122d93856134f0dd1a6eaf62fd338-a +++ /dev/null @@ -1 +0,0 @@ -v1 b0da6ccddd9ede8d941fc1eac96b23e6ff9122d93856134f0dd1a6eaf62fd338 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287159366916 diff --git a/.cache/go-build/b0/b0e55ed25f5c5d075a228075e993a38661836d6cd93f89cd248e14bff3f9d644-d b/.cache/go-build/b0/b0e55ed25f5c5d075a228075e993a38661836d6cd93f89cd248e14bff3f9d644-d deleted file mode 100644 index 4b5fa59..0000000 Binary files a/.cache/go-build/b0/b0e55ed25f5c5d075a228075e993a38661836d6cd93f89cd248e14bff3f9d644-d and /dev/null differ diff --git a/.cache/go-build/b1/b1188ea78a154c5f82a6aab20a774acffddfebb5a4ae9617da538514f553be3f-a b/.cache/go-build/b1/b1188ea78a154c5f82a6aab20a774acffddfebb5a4ae9617da538514f553be3f-a deleted file mode 100644 index e047f45..0000000 --- a/.cache/go-build/b1/b1188ea78a154c5f82a6aab20a774acffddfebb5a4ae9617da538514f553be3f-a +++ /dev/null @@ -1 +0,0 @@ -v1 b1188ea78a154c5f82a6aab20a774acffddfebb5a4ae9617da538514f553be3f badc552402e5038a97114eb05826075638c5d7c6aa664e8fcb91500263cae2eb 12512 1775136286933897245 diff --git a/.cache/go-build/b1/b18e53fb29f2d9d6a9dbda19fdd4d8ed918bf6f106bb2253531cf18f23edb161-a b/.cache/go-build/b1/b18e53fb29f2d9d6a9dbda19fdd4d8ed918bf6f106bb2253531cf18f23edb161-a deleted file mode 100644 index dda6ce0..0000000 --- a/.cache/go-build/b1/b18e53fb29f2d9d6a9dbda19fdd4d8ed918bf6f106bb2253531cf18f23edb161-a +++ /dev/null @@ -1 +0,0 @@ -v1 b18e53fb29f2d9d6a9dbda19fdd4d8ed918bf6f106bb2253531cf18f23edb161 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287005701496 diff --git a/.cache/go-build/b1/b1ec61dd387a46baf2b1ff6ec0fab543e2857c5bbbf9fe8a236ae0d0217338e8-a b/.cache/go-build/b1/b1ec61dd387a46baf2b1ff6ec0fab543e2857c5bbbf9fe8a236ae0d0217338e8-a deleted file mode 100644 index b49a77c..0000000 --- a/.cache/go-build/b1/b1ec61dd387a46baf2b1ff6ec0fab543e2857c5bbbf9fe8a236ae0d0217338e8-a +++ /dev/null @@ -1 +0,0 @@ -v1 b1ec61dd387a46baf2b1ff6ec0fab543e2857c5bbbf9fe8a236ae0d0217338e8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289148074629 diff --git a/.cache/go-build/b2/b2082796bafdeee1dce51ccfe61782081bddc0791961338021d365cf357cb6bd-a b/.cache/go-build/b2/b2082796bafdeee1dce51ccfe61782081bddc0791961338021d365cf357cb6bd-a deleted file mode 100644 index 75eb66f..0000000 --- a/.cache/go-build/b2/b2082796bafdeee1dce51ccfe61782081bddc0791961338021d365cf357cb6bd-a +++ /dev/null @@ -1 +0,0 @@ -v1 b2082796bafdeee1dce51ccfe61782081bddc0791961338021d365cf357cb6bd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286948170295 diff --git a/.cache/go-build/b2/b21621cbb9677b118c7601db542a6d5f67a315f812e26aed2f7d27b6728761a1-a b/.cache/go-build/b2/b21621cbb9677b118c7601db542a6d5f67a315f812e26aed2f7d27b6728761a1-a deleted file mode 100644 index 9b9e06a..0000000 --- a/.cache/go-build/b2/b21621cbb9677b118c7601db542a6d5f67a315f812e26aed2f7d27b6728761a1-a +++ /dev/null @@ -1 +0,0 @@ -v1 b21621cbb9677b118c7601db542a6d5f67a315f812e26aed2f7d27b6728761a1 0ba6bc616dda3621cc01c4cd185616e5906cdfd7f44d5f966bce7619b69a57e2 97 1775136288525167803 diff --git a/.cache/go-build/b2/b2321a1ecf57501675480fe5b4bc54007a5271f6b5d55b576e99603a7c9fce19-a b/.cache/go-build/b2/b2321a1ecf57501675480fe5b4bc54007a5271f6b5d55b576e99603a7c9fce19-a deleted file mode 100644 index f3869ad..0000000 --- a/.cache/go-build/b2/b2321a1ecf57501675480fe5b4bc54007a5271f6b5d55b576e99603a7c9fce19-a +++ /dev/null @@ -1 +0,0 @@ -v1 b2321a1ecf57501675480fe5b4bc54007a5271f6b5d55b576e99603a7c9fce19 58af61de9be186c4ca35eb33926f747d2d8b69744bf4b33c85cb0985226662a3 2191522 1775139461396758226 diff --git a/.cache/go-build/b2/b232498d64acbac2f187e30f0c0748e15b736f02a3d534f1e551aa3ad0da550f-a b/.cache/go-build/b2/b232498d64acbac2f187e30f0c0748e15b736f02a3d534f1e551aa3ad0da550f-a deleted file mode 100644 index e448215..0000000 --- a/.cache/go-build/b2/b232498d64acbac2f187e30f0c0748e15b736f02a3d534f1e551aa3ad0da550f-a +++ /dev/null @@ -1 +0,0 @@ -v1 b232498d64acbac2f187e30f0c0748e15b736f02a3d534f1e551aa3ad0da550f 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775136289802951657 diff --git a/.cache/go-build/b2/b2af29285386fa2c879697ca25715a838acb9447a5a56498029d143653ce8174-d b/.cache/go-build/b2/b2af29285386fa2c879697ca25715a838acb9447a5a56498029d143653ce8174-d deleted file mode 100644 index 0b55626..0000000 Binary files a/.cache/go-build/b2/b2af29285386fa2c879697ca25715a838acb9447a5a56498029d143653ce8174-d and /dev/null differ diff --git a/.cache/go-build/b2/b2b07dbfe469cb23f4cd07119a296c4095d21a94fe2c0060bf1a5dbc4ebab7cb-d b/.cache/go-build/b2/b2b07dbfe469cb23f4cd07119a296c4095d21a94fe2c0060bf1a5dbc4ebab7cb-d deleted file mode 100644 index ea97ee4..0000000 Binary files a/.cache/go-build/b2/b2b07dbfe469cb23f4cd07119a296c4095d21a94fe2c0060bf1a5dbc4ebab7cb-d and /dev/null differ diff --git a/.cache/go-build/b3/b322336476290e6b92eb3acb3eccc7479abac3429e1cb6aa4c1ed163aeb90db7-a b/.cache/go-build/b3/b322336476290e6b92eb3acb3eccc7479abac3429e1cb6aa4c1ed163aeb90db7-a deleted file mode 100644 index 65706db..0000000 --- a/.cache/go-build/b3/b322336476290e6b92eb3acb3eccc7479abac3429e1cb6aa4c1ed163aeb90db7-a +++ /dev/null @@ -1 +0,0 @@ -v1 b322336476290e6b92eb3acb3eccc7479abac3429e1cb6aa4c1ed163aeb90db7 0db422adf9b0eb0f64887c1423f4efbbc0c9047ae6fcab18764d0138d92722a4 901934 1775139398415754209 diff --git a/.cache/go-build/b3/b32bd280db6ae7bf91eb25829840d1f3725cfc008cebd843e5e019232b8fd35f-a b/.cache/go-build/b3/b32bd280db6ae7bf91eb25829840d1f3725cfc008cebd843e5e019232b8fd35f-a deleted file mode 100644 index fc101d4..0000000 --- a/.cache/go-build/b3/b32bd280db6ae7bf91eb25829840d1f3725cfc008cebd843e5e019232b8fd35f-a +++ /dev/null @@ -1 +0,0 @@ -v1 b32bd280db6ae7bf91eb25829840d1f3725cfc008cebd843e5e019232b8fd35f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289453673607 diff --git a/.cache/go-build/b3/b3b5ddc62d646ee67e43a89c003c14b4a67b1f641c0fb559b3c6ad8c633ca188-a b/.cache/go-build/b3/b3b5ddc62d646ee67e43a89c003c14b4a67b1f641c0fb559b3c6ad8c633ca188-a deleted file mode 100644 index 2ab9c26..0000000 --- a/.cache/go-build/b3/b3b5ddc62d646ee67e43a89c003c14b4a67b1f641c0fb559b3c6ad8c633ca188-a +++ /dev/null @@ -1 +0,0 @@ -v1 b3b5ddc62d646ee67e43a89c003c14b4a67b1f641c0fb559b3c6ad8c633ca188 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137376773677179 diff --git a/.cache/go-build/b3/b3c24184ebf4e4fab913224e6fcfc4884a796fd3e7555c2c3f25909ba6bef3c5-a b/.cache/go-build/b3/b3c24184ebf4e4fab913224e6fcfc4884a796fd3e7555c2c3f25909ba6bef3c5-a deleted file mode 100644 index 386d7e9..0000000 --- a/.cache/go-build/b3/b3c24184ebf4e4fab913224e6fcfc4884a796fd3e7555c2c3f25909ba6bef3c5-a +++ /dev/null @@ -1 +0,0 @@ -v1 b3c24184ebf4e4fab913224e6fcfc4884a796fd3e7555c2c3f25909ba6bef3c5 ff39147e564c56e09a27e785e4b8f146682969072a3793f9ebdc83c1158b2206 550 1775136286834055534 diff --git a/.cache/go-build/b3/b3dceefd7e0ae8020fa75f0e769e01f8db937585a3cbd9c113314d746492ac16-a b/.cache/go-build/b3/b3dceefd7e0ae8020fa75f0e769e01f8db937585a3cbd9c113314d746492ac16-a deleted file mode 100644 index 77c0fb4..0000000 --- a/.cache/go-build/b3/b3dceefd7e0ae8020fa75f0e769e01f8db937585a3cbd9c113314d746492ac16-a +++ /dev/null @@ -1 +0,0 @@ -v1 b3dceefd7e0ae8020fa75f0e769e01f8db937585a3cbd9c113314d746492ac16 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289027452622 diff --git a/.cache/go-build/b3/b3eaaadae5d60f001a62b9c0e3a38ca1b0675f415a16a53b94db57fd34051add-a b/.cache/go-build/b3/b3eaaadae5d60f001a62b9c0e3a38ca1b0675f415a16a53b94db57fd34051add-a deleted file mode 100644 index 6896ac8..0000000 --- a/.cache/go-build/b3/b3eaaadae5d60f001a62b9c0e3a38ca1b0675f415a16a53b94db57fd34051add-a +++ /dev/null @@ -1 +0,0 @@ -v1 b3eaaadae5d60f001a62b9c0e3a38ca1b0675f415a16a53b94db57fd34051add 834439d2f90c4ea1d43e53d2c25876a7abfd77d7f84a0b02001ab3276b73e496 15 1775137721888628304 diff --git a/.cache/go-build/b4/b4b9e85a3d1ed538a7867e9f55522611dded988fd413f1923511c5befc91354f-d b/.cache/go-build/b4/b4b9e85a3d1ed538a7867e9f55522611dded988fd413f1923511c5befc91354f-d deleted file mode 100644 index 8880140..0000000 --- a/.cache/go-build/b4/b4b9e85a3d1ed538a7867e9f55522611dded988fd413f1923511c5befc91354f-d +++ /dev/null @@ -1,14 +0,0 @@ -./atob.go -./atoc.go -./atof.go -./atofeisel.go -./atoi.go -./ctoa.go -./decimal.go -./deps.go -./ftoa.go -./ftoadbox.go -./ftoafixed.go -./itoa.go -./math.go -./pow10tab.go diff --git a/.cache/go-build/b4/b4f07cd8a0757cae0bc39355ea08c3674801eadcc225b1afdeed0f4dd7e92f82-d b/.cache/go-build/b4/b4f07cd8a0757cae0bc39355ea08c3674801eadcc225b1afdeed0f4dd7e92f82-d deleted file mode 100644 index 12461c5..0000000 --- a/.cache/go-build/b4/b4f07cd8a0757cae0bc39355ea08c3674801eadcc225b1afdeed0f4dd7e92f82-d +++ /dev/null @@ -1 +0,0 @@ -./unsafeheader.go diff --git a/.cache/go-build/b5/b505b5d6cd46a414e800da118de6d53d2b6672c8b086256f423d95919f33371a-d b/.cache/go-build/b5/b505b5d6cd46a414e800da118de6d53d2b6672c8b086256f423d95919f33371a-d deleted file mode 100644 index 4ce8b2d..0000000 Binary files a/.cache/go-build/b5/b505b5d6cd46a414e800da118de6d53d2b6672c8b086256f423d95919f33371a-d and /dev/null differ diff --git a/.cache/go-build/b5/b517ee20af88f49a331cfc211bf6561e715c46d7de701ee464e3ad54077c13ed-a b/.cache/go-build/b5/b517ee20af88f49a331cfc211bf6561e715c46d7de701ee464e3ad54077c13ed-a deleted file mode 100644 index 8485ef4..0000000 --- a/.cache/go-build/b5/b517ee20af88f49a331cfc211bf6561e715c46d7de701ee464e3ad54077c13ed-a +++ /dev/null @@ -1 +0,0 @@ -v1 b517ee20af88f49a331cfc211bf6561e715c46d7de701ee464e3ad54077c13ed e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286962971996 diff --git a/.cache/go-build/b5/b57217dcc6c08aac6f3d5fb44571617a0e80065b14128f937b9eb23fc80431f4-d b/.cache/go-build/b5/b57217dcc6c08aac6f3d5fb44571617a0e80065b14128f937b9eb23fc80431f4-d deleted file mode 100644 index 81d5e2d..0000000 Binary files a/.cache/go-build/b5/b57217dcc6c08aac6f3d5fb44571617a0e80065b14128f937b9eb23fc80431f4-d and /dev/null differ diff --git a/.cache/go-build/b5/b5c57c80f3b1e60f37bd8856d7c0c514546fcf7dc52dfb45330bc2ab2d8db3f8-d b/.cache/go-build/b5/b5c57c80f3b1e60f37bd8856d7c0c514546fcf7dc52dfb45330bc2ab2d8db3f8-d deleted file mode 100644 index 208a4aa..0000000 Binary files a/.cache/go-build/b5/b5c57c80f3b1e60f37bd8856d7c0c514546fcf7dc52dfb45330bc2ab2d8db3f8-d and /dev/null differ diff --git a/.cache/go-build/b6/b6107f5686fa278ff617ed388e9d9a6641b806a39eb0004eaabae4d283f9240d-a b/.cache/go-build/b6/b6107f5686fa278ff617ed388e9d9a6641b806a39eb0004eaabae4d283f9240d-a deleted file mode 100644 index 81611e9..0000000 --- a/.cache/go-build/b6/b6107f5686fa278ff617ed388e9d9a6641b806a39eb0004eaabae4d283f9240d-a +++ /dev/null @@ -1 +0,0 @@ -v1 b6107f5686fa278ff617ed388e9d9a6641b806a39eb0004eaabae4d283f9240d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289487193671 diff --git a/.cache/go-build/b6/b6963e2cc4598f141216856ed74d43f37ea4d7456a7743962e2c1c375606f7ed-d b/.cache/go-build/b6/b6963e2cc4598f141216856ed74d43f37ea4d7456a7743962e2c1c375606f7ed-d deleted file mode 100644 index 3df0446..0000000 Binary files a/.cache/go-build/b6/b6963e2cc4598f141216856ed74d43f37ea4d7456a7743962e2c1c375606f7ed-d and /dev/null differ diff --git a/.cache/go-build/b6/b69f95e9670e9d19e4b7ff835e57c2e18bb5a072400b21db9b83d5720095ccb1-d b/.cache/go-build/b6/b69f95e9670e9d19e4b7ff835e57c2e18bb5a072400b21db9b83d5720095ccb1-d deleted file mode 100644 index 6fbbcb6..0000000 Binary files a/.cache/go-build/b6/b69f95e9670e9d19e4b7ff835e57c2e18bb5a072400b21db9b83d5720095ccb1-d and /dev/null differ diff --git a/.cache/go-build/b6/b6a9fd2b3b33cac78310d9ddd0c89d49e1a1d4be0c3f7b937f6fc9ee109e0fb6-a b/.cache/go-build/b6/b6a9fd2b3b33cac78310d9ddd0c89d49e1a1d4be0c3f7b937f6fc9ee109e0fb6-a deleted file mode 100644 index a2c697d..0000000 --- a/.cache/go-build/b6/b6a9fd2b3b33cac78310d9ddd0c89d49e1a1d4be0c3f7b937f6fc9ee109e0fb6-a +++ /dev/null @@ -1 +0,0 @@ -v1 b6a9fd2b3b33cac78310d9ddd0c89d49e1a1d4be0c3f7b937f6fc9ee109e0fb6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722070111634 diff --git a/.cache/go-build/b6/b6dacb28fd04828801c21218031954e3642aeb82ec914949f29fb54ea6093864-a b/.cache/go-build/b6/b6dacb28fd04828801c21218031954e3642aeb82ec914949f29fb54ea6093864-a deleted file mode 100644 index 3755b00..0000000 --- a/.cache/go-build/b6/b6dacb28fd04828801c21218031954e3642aeb82ec914949f29fb54ea6093864-a +++ /dev/null @@ -1 +0,0 @@ -v1 b6dacb28fd04828801c21218031954e3642aeb82ec914949f29fb54ea6093864 c90f727b3df4d03f1e4cc72163e1ce9d79a10ff77a1ca2b8308ef07120b9920e 19 1775136286917731323 diff --git a/.cache/go-build/b7/b7217fb957037593497b164b5b4b49cf41d3a0a44bbb29d1714968e96f633545-a b/.cache/go-build/b7/b7217fb957037593497b164b5b4b49cf41d3a0a44bbb29d1714968e96f633545-a deleted file mode 100644 index 7cbb845..0000000 --- a/.cache/go-build/b7/b7217fb957037593497b164b5b4b49cf41d3a0a44bbb29d1714968e96f633545-a +++ /dev/null @@ -1 +0,0 @@ -v1 b7217fb957037593497b164b5b4b49cf41d3a0a44bbb29d1714968e96f633545 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287163025129 diff --git a/.cache/go-build/b7/b764573d128efcb7e38d3a40f636be2ff25d96a606874ac1d76937bde552c0a3-a b/.cache/go-build/b7/b764573d128efcb7e38d3a40f636be2ff25d96a606874ac1d76937bde552c0a3-a deleted file mode 100644 index da77a8f..0000000 --- a/.cache/go-build/b7/b764573d128efcb7e38d3a40f636be2ff25d96a606874ac1d76937bde552c0a3-a +++ /dev/null @@ -1 +0,0 @@ -v1 b764573d128efcb7e38d3a40f636be2ff25d96a606874ac1d76937bde552c0a3 1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b 11 1775136290022150154 diff --git a/.cache/go-build/b7/b7659636d1d7270998b53a634b1da9d377a6e16bc5c348fb1a54c591912ab37b-d b/.cache/go-build/b7/b7659636d1d7270998b53a634b1da9d377a6e16bc5c348fb1a54c591912ab37b-d deleted file mode 100644 index d11cb6a..0000000 Binary files a/.cache/go-build/b7/b7659636d1d7270998b53a634b1da9d377a6e16bc5c348fb1a54c591912ab37b-d and /dev/null differ diff --git a/.cache/go-build/b7/b7cb4e3b6bd92f6045b613125fbf838676d4f8b44dd16409d8ba4d6c22214594-a b/.cache/go-build/b7/b7cb4e3b6bd92f6045b613125fbf838676d4f8b44dd16409d8ba4d6c22214594-a deleted file mode 100644 index 077f935..0000000 --- a/.cache/go-build/b7/b7cb4e3b6bd92f6045b613125fbf838676d4f8b44dd16409d8ba4d6c22214594-a +++ /dev/null @@ -1 +0,0 @@ -v1 b7cb4e3b6bd92f6045b613125fbf838676d4f8b44dd16409d8ba4d6c22214594 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287040641101 diff --git a/.cache/go-build/b7/b7d6b1d9df4668b681cca27259df3820a0272a3e19c9427a0dd00f20c60b8dba-a b/.cache/go-build/b7/b7d6b1d9df4668b681cca27259df3820a0272a3e19c9427a0dd00f20c60b8dba-a deleted file mode 100644 index 89ad954..0000000 --- a/.cache/go-build/b7/b7d6b1d9df4668b681cca27259df3820a0272a3e19c9427a0dd00f20c60b8dba-a +++ /dev/null @@ -1 +0,0 @@ -v1 b7d6b1d9df4668b681cca27259df3820a0272a3e19c9427a0dd00f20c60b8dba 16a293c8aad050bb03127ba699609fb4708a72f8c8365ee38cb7b69ec76926ac 74532 1775137721887812713 diff --git a/.cache/go-build/b8/b8194f0aba708ede649ed3f5d8195839797d537039fdc1a728c9b07252d484c5-a b/.cache/go-build/b8/b8194f0aba708ede649ed3f5d8195839797d537039fdc1a728c9b07252d484c5-a deleted file mode 100644 index 491fa31..0000000 --- a/.cache/go-build/b8/b8194f0aba708ede649ed3f5d8195839797d537039fdc1a728c9b07252d484c5-a +++ /dev/null @@ -1 +0,0 @@ -v1 b8194f0aba708ede649ed3f5d8195839797d537039fdc1a728c9b07252d484c5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288997471111 diff --git a/.cache/go-build/b8/b8a1758971536b728212a71ccc054454d7942ef17af90e765ab987eb5c00f4c2-a b/.cache/go-build/b8/b8a1758971536b728212a71ccc054454d7942ef17af90e765ab987eb5c00f4c2-a deleted file mode 100644 index 5012791..0000000 --- a/.cache/go-build/b8/b8a1758971536b728212a71ccc054454d7942ef17af90e765ab987eb5c00f4c2-a +++ /dev/null @@ -1 +0,0 @@ -v1 b8a1758971536b728212a71ccc054454d7942ef17af90e765ab987eb5c00f4c2 e3ef2d4fdd056e2e637b1ac1a1a4dbfab39733a9387eb2aa2063f1b90a63e412 369 1775136286837201236 diff --git a/.cache/go-build/b8/b8bfd0da25296816b5ad2681f530dee5ff989984472333ef629c23bc8f8036a4-a b/.cache/go-build/b8/b8bfd0da25296816b5ad2681f530dee5ff989984472333ef629c23bc8f8036a4-a deleted file mode 100644 index 1ff2251..0000000 --- a/.cache/go-build/b8/b8bfd0da25296816b5ad2681f530dee5ff989984472333ef629c23bc8f8036a4-a +++ /dev/null @@ -1 +0,0 @@ -v1 b8bfd0da25296816b5ad2681f530dee5ff989984472333ef629c23bc8f8036a4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288459564926 diff --git a/.cache/go-build/b8/b8c1ad9fd320743baf6da07fafa2677462d16fa02c16331451209efcce967a57-a b/.cache/go-build/b8/b8c1ad9fd320743baf6da07fafa2677462d16fa02c16331451209efcce967a57-a deleted file mode 100644 index efb3812..0000000 --- a/.cache/go-build/b8/b8c1ad9fd320743baf6da07fafa2677462d16fa02c16331451209efcce967a57-a +++ /dev/null @@ -1 +0,0 @@ -v1 b8c1ad9fd320743baf6da07fafa2677462d16fa02c16331451209efcce967a57 61ec3ef3a19b33bb19bfbf59fa05c1e7e726e70ffb3f796cfa486f540b59d95b 2146 1775136286829353280 diff --git a/.cache/go-build/b8/b8c685c9dc9285263898837ee3f72dcdd84838416177ac9da9ec310b3055f62c-a b/.cache/go-build/b8/b8c685c9dc9285263898837ee3f72dcdd84838416177ac9da9ec310b3055f62c-a deleted file mode 100644 index 53c49b3..0000000 --- a/.cache/go-build/b8/b8c685c9dc9285263898837ee3f72dcdd84838416177ac9da9ec310b3055f62c-a +++ /dev/null @@ -1 +0,0 @@ -v1 b8c685c9dc9285263898837ee3f72dcdd84838416177ac9da9ec310b3055f62c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289960854460 diff --git a/.cache/go-build/b8/b8d485b0e98c7be00d0291736f7f7acccd05aa53cb42a4b7a93f3990ec7dc6f1-a b/.cache/go-build/b8/b8d485b0e98c7be00d0291736f7f7acccd05aa53cb42a4b7a93f3990ec7dc6f1-a deleted file mode 100644 index b32584a..0000000 --- a/.cache/go-build/b8/b8d485b0e98c7be00d0291736f7f7acccd05aa53cb42a4b7a93f3990ec7dc6f1-a +++ /dev/null @@ -1 +0,0 @@ -v1 b8d485b0e98c7be00d0291736f7f7acccd05aa53cb42a4b7a93f3990ec7dc6f1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288997398981 diff --git a/.cache/go-build/b9/b904bffdd9e0acd450b852ead515018b3a7cf637c6007cb3cf9c61524d382407-a b/.cache/go-build/b9/b904bffdd9e0acd450b852ead515018b3a7cf637c6007cb3cf9c61524d382407-a deleted file mode 100644 index 59a1b10..0000000 --- a/.cache/go-build/b9/b904bffdd9e0acd450b852ead515018b3a7cf637c6007cb3cf9c61524d382407-a +++ /dev/null @@ -1 +0,0 @@ -v1 b904bffdd9e0acd450b852ead515018b3a7cf637c6007cb3cf9c61524d382407 fdd2277a4e929754050f63108dff6513be6142893025e9b20230e635210ad86f 120420 1775138184203981387 diff --git a/.cache/go-build/b9/b94f1924a6fc8319cb41ba0a1e31bb3d0b3534d03cf35556c0506f2a689244d1-a b/.cache/go-build/b9/b94f1924a6fc8319cb41ba0a1e31bb3d0b3534d03cf35556c0506f2a689244d1-a deleted file mode 100644 index 2dc1050..0000000 --- a/.cache/go-build/b9/b94f1924a6fc8319cb41ba0a1e31bb3d0b3534d03cf35556c0506f2a689244d1-a +++ /dev/null @@ -1 +0,0 @@ -v1 b94f1924a6fc8319cb41ba0a1e31bb3d0b3534d03cf35556c0506f2a689244d1 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775139398608160416 diff --git a/.cache/go-build/b9/b9b69368a06acb70fa6b533db03d40c48d86e97ef0f0403248e0e9ba579f6e88-a b/.cache/go-build/b9/b9b69368a06acb70fa6b533db03d40c48d86e97ef0f0403248e0e9ba579f6e88-a deleted file mode 100644 index 9e9445a..0000000 --- a/.cache/go-build/b9/b9b69368a06acb70fa6b533db03d40c48d86e97ef0f0403248e0e9ba579f6e88-a +++ /dev/null @@ -1 +0,0 @@ -v1 b9b69368a06acb70fa6b533db03d40c48d86e97ef0f0403248e0e9ba579f6e88 1bd1b0bc64d1fc20f268c470b5d5eb8b36510fb5ffd948402fc7cdb6aee4e46c 97422 1775136286934492815 diff --git a/.cache/go-build/b9/b9f22cc075d99e31315a2499701dbc45a72eeee8cfe219b59a845178a03a1ef2-d b/.cache/go-build/b9/b9f22cc075d99e31315a2499701dbc45a72eeee8cfe219b59a845178a03a1ef2-d deleted file mode 100644 index 0c87dc6..0000000 --- a/.cache/go-build/b9/b9f22cc075d99e31315a2499701dbc45a72eeee8cfe219b59a845178a03a1ef2-d +++ /dev/null @@ -1,21 +0,0 @@ -./exp_arenas_off.go -./exp_boringcrypto_off.go -./exp_cgocheck2_off.go -./exp_dwarf5_off.go -./exp_fieldtrack_off.go -./exp_goroutineleakprofile_off.go -./exp_greenteagc_on.go -./exp_heapminimum512kib_off.go -./exp_jsonv2_off.go -./exp_loopvar_off.go -./exp_newinliner_off.go -./exp_preemptibleloops_off.go -./exp_randomizedheapbase64_on.go -./exp_regabiargs_on.go -./exp_regabiwrappers_on.go -./exp_runtimefreegc_off.go -./exp_runtimesecret_off.go -./exp_simd_off.go -./exp_sizespecializedmalloc_off.go -./exp_staticlockranking_off.go -./flags.go diff --git a/.cache/go-build/ba/ba4bd15911de16205ac8f4c29ce22e9cb4b7a8e5ebe146d7587269f4b112065a-a b/.cache/go-build/ba/ba4bd15911de16205ac8f4c29ce22e9cb4b7a8e5ebe146d7587269f4b112065a-a deleted file mode 100644 index 8881e27..0000000 --- a/.cache/go-build/ba/ba4bd15911de16205ac8f4c29ce22e9cb4b7a8e5ebe146d7587269f4b112065a-a +++ /dev/null @@ -1 +0,0 @@ -v1 ba4bd15911de16205ac8f4c29ce22e9cb4b7a8e5ebe146d7587269f4b112065a 8dfc3a5c7bd4a7863ae3eb37370291884a69a61ba3ac0640df3103646d3ff268 27728 1775136287075387596 diff --git a/.cache/go-build/ba/ba6b73b731386a149853536be9d158504c623a15efb022016f46aa2fee11c644-a b/.cache/go-build/ba/ba6b73b731386a149853536be9d158504c623a15efb022016f46aa2fee11c644-a deleted file mode 100644 index 54da9da..0000000 --- a/.cache/go-build/ba/ba6b73b731386a149853536be9d158504c623a15efb022016f46aa2fee11c644-a +++ /dev/null @@ -1 +0,0 @@ -v1 ba6b73b731386a149853536be9d158504c623a15efb022016f46aa2fee11c644 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289161450688 diff --git a/.cache/go-build/ba/ba95cdece7d24eeed04def67985ba5d695d43293b60da06cff3ab12b0c58ce8f-d b/.cache/go-build/ba/ba95cdece7d24eeed04def67985ba5d695d43293b60da06cff3ab12b0c58ce8f-d deleted file mode 100644 index b5247da..0000000 Binary files a/.cache/go-build/ba/ba95cdece7d24eeed04def67985ba5d695d43293b60da06cff3ab12b0c58ce8f-d and /dev/null differ diff --git a/.cache/go-build/ba/bad88b4bcfed094e4f8b4a3839b97efc0096618d12b6961a5633bd646448781f-a b/.cache/go-build/ba/bad88b4bcfed094e4f8b4a3839b97efc0096618d12b6961a5633bd646448781f-a deleted file mode 100644 index f9be592..0000000 --- a/.cache/go-build/ba/bad88b4bcfed094e4f8b4a3839b97efc0096618d12b6961a5633bd646448781f-a +++ /dev/null @@ -1 +0,0 @@ -v1 bad88b4bcfed094e4f8b4a3839b97efc0096618d12b6961a5633bd646448781f c17d162978a48bfca5178249aaf959beb38011bd1bf51630e3860d835cf103e7 179894 1775136289341353347 diff --git a/.cache/go-build/ba/badc552402e5038a97114eb05826075638c5d7c6aa664e8fcb91500263cae2eb-d b/.cache/go-build/ba/badc552402e5038a97114eb05826075638c5d7c6aa664e8fcb91500263cae2eb-d deleted file mode 100644 index 561ff2f..0000000 Binary files a/.cache/go-build/ba/badc552402e5038a97114eb05826075638c5d7c6aa664e8fcb91500263cae2eb-d and /dev/null differ diff --git a/.cache/go-build/bb/bb0e8ef46c548d6667762242d2a02aacde774a137954507aae8a00dea45d0d52-a b/.cache/go-build/bb/bb0e8ef46c548d6667762242d2a02aacde774a137954507aae8a00dea45d0d52-a deleted file mode 100644 index 10ca76f..0000000 --- a/.cache/go-build/bb/bb0e8ef46c548d6667762242d2a02aacde774a137954507aae8a00dea45d0d52-a +++ /dev/null @@ -1 +0,0 @@ -v1 bb0e8ef46c548d6667762242d2a02aacde774a137954507aae8a00dea45d0d52 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288979351998 diff --git a/.cache/go-build/bb/bb5b2e85baf0c28ab738c5566d95d72abf7f9785707e03197090ae91d56fdf53-d b/.cache/go-build/bb/bb5b2e85baf0c28ab738c5566d95d72abf7f9785707e03197090ae91d56fdf53-d deleted file mode 100644 index 93cf754..0000000 --- a/.cache/go-build/bb/bb5b2e85baf0c28ab738c5566d95d72abf7f9785707e03197090ae91d56fdf53-d +++ /dev/null @@ -1,5 +0,0 @@ -./cast.go -./sha512.go -./sha512block.go -./sha512block_amd64.go -./sha512block_amd64.s diff --git a/.cache/go-build/bb/bb75101db62e5dd74d2d53d642e0ddbb8e0fc8915a79348b2136c0295013f9af-a b/.cache/go-build/bb/bb75101db62e5dd74d2d53d642e0ddbb8e0fc8915a79348b2136c0295013f9af-a deleted file mode 100644 index ca30e95..0000000 --- a/.cache/go-build/bb/bb75101db62e5dd74d2d53d642e0ddbb8e0fc8915a79348b2136c0295013f9af-a +++ /dev/null @@ -1 +0,0 @@ -v1 bb75101db62e5dd74d2d53d642e0ddbb8e0fc8915a79348b2136c0295013f9af 73d1013b2483daaf40025b249abb6e330b0e9fc7f4c8ffc735943551344afe95 63590 1775136289085379064 diff --git a/.cache/go-build/bb/bbb2b5d6478238b3632073c8ae6fdca125a0871b0fcd2c8f474960e8faaa83b3-a b/.cache/go-build/bb/bbb2b5d6478238b3632073c8ae6fdca125a0871b0fcd2c8f474960e8faaa83b3-a deleted file mode 100644 index 4f2ea0c..0000000 --- a/.cache/go-build/bb/bbb2b5d6478238b3632073c8ae6fdca125a0871b0fcd2c8f474960e8faaa83b3-a +++ /dev/null @@ -1 +0,0 @@ -v1 bbb2b5d6478238b3632073c8ae6fdca125a0871b0fcd2c8f474960e8faaa83b3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289845046407 diff --git a/.cache/go-build/bb/bbc8505b3663bcbfe5dbfe31acdb6f0a2def0fdbea4fd2c2accddb650f5306fa-a b/.cache/go-build/bb/bbc8505b3663bcbfe5dbfe31acdb6f0a2def0fdbea4fd2c2accddb650f5306fa-a deleted file mode 100644 index 8ea13b4..0000000 --- a/.cache/go-build/bb/bbc8505b3663bcbfe5dbfe31acdb6f0a2def0fdbea4fd2c2accddb650f5306fa-a +++ /dev/null @@ -1 +0,0 @@ -v1 bbc8505b3663bcbfe5dbfe31acdb6f0a2def0fdbea4fd2c2accddb650f5306fa e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289531123093 diff --git a/.cache/go-build/bb/bbeb3b21e5513f3e1492362864870abcf3e47684959ff528cc85dec5d1332b61-a b/.cache/go-build/bb/bbeb3b21e5513f3e1492362864870abcf3e47684959ff528cc85dec5d1332b61-a deleted file mode 100644 index d379ed8..0000000 --- a/.cache/go-build/bb/bbeb3b21e5513f3e1492362864870abcf3e47684959ff528cc85dec5d1332b61-a +++ /dev/null @@ -1 +0,0 @@ -v1 bbeb3b21e5513f3e1492362864870abcf3e47684959ff528cc85dec5d1332b61 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775138184265790382 diff --git a/.cache/go-build/bc/bc90325eff345f7fbcf143694ee96a810b1644cffc1d0535d5885e2a32ee4ffd-d b/.cache/go-build/bc/bc90325eff345f7fbcf143694ee96a810b1644cffc1d0535d5885e2a32ee4ffd-d deleted file mode 100644 index 0c111d6..0000000 Binary files a/.cache/go-build/bc/bc90325eff345f7fbcf143694ee96a810b1644cffc1d0535d5885e2a32ee4ffd-d and /dev/null differ diff --git a/.cache/go-build/bc/bc96a8397c8a6ebc6dff7f0302c0e6e454c0871b0ed38a95c89ee2c209fdb717-a b/.cache/go-build/bc/bc96a8397c8a6ebc6dff7f0302c0e6e454c0871b0ed38a95c89ee2c209fdb717-a deleted file mode 100644 index d1f5999..0000000 --- a/.cache/go-build/bc/bc96a8397c8a6ebc6dff7f0302c0e6e454c0871b0ed38a95c89ee2c209fdb717-a +++ /dev/null @@ -1 +0,0 @@ -v1 bc96a8397c8a6ebc6dff7f0302c0e6e454c0871b0ed38a95c89ee2c209fdb717 5b5d17446d3c88d2626d4cf146a2ef5ee0901326cef51ee486a4d743d7c37a55 443812 1775136288511937144 diff --git a/.cache/go-build/bc/bc9af550e61cbf0aef118903df232e6a28b93435f8fb905bfefcfc841f53f766-a b/.cache/go-build/bc/bc9af550e61cbf0aef118903df232e6a28b93435f8fb905bfefcfc841f53f766-a deleted file mode 100644 index 6a3a535..0000000 --- a/.cache/go-build/bc/bc9af550e61cbf0aef118903df232e6a28b93435f8fb905bfefcfc841f53f766-a +++ /dev/null @@ -1 +0,0 @@ -v1 bc9af550e61cbf0aef118903df232e6a28b93435f8fb905bfefcfc841f53f766 3f30444b16331284bf1bb489e094b61012eb1bcffe4423cbb325c3caa0d9e29a 6938 1775136287044312294 diff --git a/.cache/go-build/bc/bccc474af7e055726ccd63ef4e8a3d06258429416e973f8cd9c39f17ddaff6df-a b/.cache/go-build/bc/bccc474af7e055726ccd63ef4e8a3d06258429416e973f8cd9c39f17ddaff6df-a deleted file mode 100644 index 533b9fd..0000000 --- a/.cache/go-build/bc/bccc474af7e055726ccd63ef4e8a3d06258429416e973f8cd9c39f17ddaff6df-a +++ /dev/null @@ -1 +0,0 @@ -v1 bccc474af7e055726ccd63ef4e8a3d06258429416e973f8cd9c39f17ddaff6df beef32386f7973c3eb2ab5cf8f1ac6cc55625b591614c9ea482ab472d8a2a42d 54 1775136289422122105 diff --git a/.cache/go-build/bc/bcd1cfc2c9275914c54eabf6080864adc3c915e61fb2b45591438311cf6bf28b-a b/.cache/go-build/bc/bcd1cfc2c9275914c54eabf6080864adc3c915e61fb2b45591438311cf6bf28b-a deleted file mode 100644 index cd4ac06..0000000 --- a/.cache/go-build/bc/bcd1cfc2c9275914c54eabf6080864adc3c915e61fb2b45591438311cf6bf28b-a +++ /dev/null @@ -1 +0,0 @@ -v1 bcd1cfc2c9275914c54eabf6080864adc3c915e61fb2b45591438311cf6bf28b 0228e8c8f89db1a322d617e46969cef886b9a0ebea8b462907df092f9339a73c 251 1775136286836073555 diff --git a/.cache/go-build/bd/bd2b1b14e4ea160ea05db1a06ef025dd2bfa3de6053c5ea2c7ce9e8d2930b281-a b/.cache/go-build/bd/bd2b1b14e4ea160ea05db1a06ef025dd2bfa3de6053c5ea2c7ce9e8d2930b281-a deleted file mode 100644 index 696142a..0000000 --- a/.cache/go-build/bd/bd2b1b14e4ea160ea05db1a06ef025dd2bfa3de6053c5ea2c7ce9e8d2930b281-a +++ /dev/null @@ -1 +0,0 @@ -v1 bd2b1b14e4ea160ea05db1a06ef025dd2bfa3de6053c5ea2c7ce9e8d2930b281 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287030255094 diff --git a/.cache/go-build/bd/bd67268e213a167ca9816552d889f6845f1ed2be58315883df5b1333714f2205-a b/.cache/go-build/bd/bd67268e213a167ca9816552d889f6845f1ed2be58315883df5b1333714f2205-a deleted file mode 100644 index b064443..0000000 --- a/.cache/go-build/bd/bd67268e213a167ca9816552d889f6845f1ed2be58315883df5b1333714f2205-a +++ /dev/null @@ -1 +0,0 @@ -v1 bd67268e213a167ca9816552d889f6845f1ed2be58315883df5b1333714f2205 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289486513961 diff --git a/.cache/go-build/bd/bdd145352918507f83ec4b9d02cbdc6468709854442b290cf4719e3bb155b128-a b/.cache/go-build/bd/bdd145352918507f83ec4b9d02cbdc6468709854442b290cf4719e3bb155b128-a deleted file mode 100644 index 0470f52..0000000 --- a/.cache/go-build/bd/bdd145352918507f83ec4b9d02cbdc6468709854442b290cf4719e3bb155b128-a +++ /dev/null @@ -1 +0,0 @@ -v1 bdd145352918507f83ec4b9d02cbdc6468709854442b290cf4719e3bb155b128 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289163662180 diff --git a/.cache/go-build/be/be15e996039349f0db5cede6442cecf5f4af03e813599894a605ad8d20348598-a b/.cache/go-build/be/be15e996039349f0db5cede6442cecf5f4af03e813599894a605ad8d20348598-a deleted file mode 100644 index 2b58a4b..0000000 --- a/.cache/go-build/be/be15e996039349f0db5cede6442cecf5f4af03e813599894a605ad8d20348598-a +++ /dev/null @@ -1 +0,0 @@ -v1 be15e996039349f0db5cede6442cecf5f4af03e813599894a605ad8d20348598 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722001134574 diff --git a/.cache/go-build/be/be29e7e1a6e4fd33a070883c2dd14ac3d6882d616a4a29dd28e8d9908e81f84f-a b/.cache/go-build/be/be29e7e1a6e4fd33a070883c2dd14ac3d6882d616a4a29dd28e8d9908e81f84f-a deleted file mode 100644 index 6d27ebf..0000000 --- a/.cache/go-build/be/be29e7e1a6e4fd33a070883c2dd14ac3d6882d616a4a29dd28e8d9908e81f84f-a +++ /dev/null @@ -1 +0,0 @@ -v1 be29e7e1a6e4fd33a070883c2dd14ac3d6882d616a4a29dd28e8d9908e81f84f e1f4928a75355573e92499d4ab842fde5cdc23fe7dc03967d6a4ca5c634ab18b 32 1775136289309450474 diff --git a/.cache/go-build/be/be760dfb7dd51dabd994918dc3b336f2ad8f7954e76625b0ba82c98ebcc8aecd-a b/.cache/go-build/be/be760dfb7dd51dabd994918dc3b336f2ad8f7954e76625b0ba82c98ebcc8aecd-a deleted file mode 100644 index e3c7b63..0000000 --- a/.cache/go-build/be/be760dfb7dd51dabd994918dc3b336f2ad8f7954e76625b0ba82c98ebcc8aecd-a +++ /dev/null @@ -1 +0,0 @@ -v1 be760dfb7dd51dabd994918dc3b336f2ad8f7954e76625b0ba82c98ebcc8aecd ff1edf7afed8f65a40658116496c134f04dd6afac4d7b1cb41c273e1d2bc84bd 59670 1775136287115817465 diff --git a/.cache/go-build/be/be8928a701d5c58370e87e073542eeceb30fb4e31c28fd334cf698ebacc401f2-a b/.cache/go-build/be/be8928a701d5c58370e87e073542eeceb30fb4e31c28fd334cf698ebacc401f2-a deleted file mode 100644 index 0caadcc..0000000 --- a/.cache/go-build/be/be8928a701d5c58370e87e073542eeceb30fb4e31c28fd334cf698ebacc401f2-a +++ /dev/null @@ -1 +0,0 @@ -v1 be8928a701d5c58370e87e073542eeceb30fb4e31c28fd334cf698ebacc401f2 c40ef652543c07b4996f48cdc01a7102d5c18b1759ce89332d9997f4632914ef 118588 1775136288699603158 diff --git a/.cache/go-build/be/bea8ed1a649b76bff799833cfe90d66f21dea5a3748781d6aa7ce63d8cd86221-d b/.cache/go-build/be/bea8ed1a649b76bff799833cfe90d66f21dea5a3748781d6aa7ce63d8cd86221-d deleted file mode 100644 index 6f124fd..0000000 Binary files a/.cache/go-build/be/bea8ed1a649b76bff799833cfe90d66f21dea5a3748781d6aa7ce63d8cd86221-d and /dev/null differ diff --git a/.cache/go-build/be/beef32386f7973c3eb2ab5cf8f1ac6cc55625b591614c9ea482ab472d8a2a42d-d b/.cache/go-build/be/beef32386f7973c3eb2ab5cf8f1ac6cc55625b591614c9ea482ab472d8a2a42d-d deleted file mode 100644 index a48a282..0000000 --- a/.cache/go-build/be/beef32386f7973c3eb2ab5cf8f1ac6cc55625b591614c9ea482ab472d8a2a42d-d +++ /dev/null @@ -1,5 +0,0 @@ -./garbage.go -./mod.go -./stack.go -./stubs.go -./debug.s diff --git a/.cache/go-build/bf/bf9fa88c9dd0bc7a2ef3cde6e26c96b8334691a2fe05dfa17a346bf1468624ae-a b/.cache/go-build/bf/bf9fa88c9dd0bc7a2ef3cde6e26c96b8334691a2fe05dfa17a346bf1468624ae-a deleted file mode 100644 index afad0b8..0000000 --- a/.cache/go-build/bf/bf9fa88c9dd0bc7a2ef3cde6e26c96b8334691a2fe05dfa17a346bf1468624ae-a +++ /dev/null @@ -1 +0,0 @@ -v1 bf9fa88c9dd0bc7a2ef3cde6e26c96b8334691a2fe05dfa17a346bf1468624ae e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287005820886 diff --git a/.cache/go-build/bf/bfb4c9ae23ae14c255e755bc8edc08f0569cac3054d0ef48f181e57c0224e73d-a b/.cache/go-build/bf/bfb4c9ae23ae14c255e755bc8edc08f0569cac3054d0ef48f181e57c0224e73d-a deleted file mode 100644 index de07273..0000000 --- a/.cache/go-build/bf/bfb4c9ae23ae14c255e755bc8edc08f0569cac3054d0ef48f181e57c0224e73d-a +++ /dev/null @@ -1 +0,0 @@ -v1 bfb4c9ae23ae14c255e755bc8edc08f0569cac3054d0ef48f181e57c0224e73d 4eaf98a2e0ccbce41d17188cddf2d0869f02a9375ab648aa54cae7e5a1d8a28a 11 1775136288754550797 diff --git a/.cache/go-build/bf/bffc7e37f4520aeb5e9aa8860c7fd4a65dd19a9d0fda0f4f92eff4a6efaa1209-d b/.cache/go-build/bf/bffc7e37f4520aeb5e9aa8860c7fd4a65dd19a9d0fda0f4f92eff4a6efaa1209-d deleted file mode 100644 index 3813507..0000000 --- a/.cache/go-build/bf/bffc7e37f4520aeb5e9aa8860c7fd4a65dd19a9d0fda0f4f92eff4a6efaa1209-d +++ /dev/null @@ -1,3 +0,0 @@ -./doc.go -./events.go -./spec.go diff --git a/.cache/go-build/bf/bffe2220e5c9dfd2d0fdee56a7cdfac01cf964275ee2a716b37f16f7d8c5b6bd-a b/.cache/go-build/bf/bffe2220e5c9dfd2d0fdee56a7cdfac01cf964275ee2a716b37f16f7d8c5b6bd-a deleted file mode 100644 index ecb4598..0000000 --- a/.cache/go-build/bf/bffe2220e5c9dfd2d0fdee56a7cdfac01cf964275ee2a716b37f16f7d8c5b6bd-a +++ /dev/null @@ -1 +0,0 @@ -v1 bffe2220e5c9dfd2d0fdee56a7cdfac01cf964275ee2a716b37f16f7d8c5b6bd a6c6307bfb5cdd0a45fac0e0eb0f8d237299e7b8c87b0e11e10860fd30d15e91 120420 1775139398509215786 diff --git a/.cache/go-build/c0/c01f01dfc6a00e39a1538f5c8e52a10ea9280af398d4b650a10f00f15c908f3c-a b/.cache/go-build/c0/c01f01dfc6a00e39a1538f5c8e52a10ea9280af398d4b650a10f00f15c908f3c-a deleted file mode 100644 index d62ca00..0000000 --- a/.cache/go-build/c0/c01f01dfc6a00e39a1538f5c8e52a10ea9280af398d4b650a10f00f15c908f3c-a +++ /dev/null @@ -1 +0,0 @@ -v1 c01f01dfc6a00e39a1538f5c8e52a10ea9280af398d4b650a10f00f15c908f3c 5ddafd1ccb39e7ea27c0b9ae069b64cb8e91164371fcc9c5c52fb1784b5b3136 1366 1775136286910613018 diff --git a/.cache/go-build/c0/c03800a08c0f3bc37d82cdff25b96202c924ccccb418e728fc17436cfde7aa6f-d b/.cache/go-build/c0/c03800a08c0f3bc37d82cdff25b96202c924ccccb418e728fc17436cfde7aa6f-d deleted file mode 100644 index cde55ad..0000000 --- a/.cache/go-build/c0/c03800a08c0f3bc37d82cdff25b96202c924ccccb418e728fc17436cfde7aa6f-d +++ /dev/null @@ -1 +0,0 @@ -./hooks.go diff --git a/.cache/go-build/c0/c0dc5756a2164edb4a488f0eec06d3f8a071cec545ea962680a25084c6c337b9-d b/.cache/go-build/c0/c0dc5756a2164edb4a488f0eec06d3f8a071cec545ea962680a25084c6c337b9-d deleted file mode 100644 index 15c7e00..0000000 --- a/.cache/go-build/c0/c0dc5756a2164edb4a488f0eec06d3f8a071cec545ea962680a25084c6c337b9-d +++ /dev/null @@ -1 +0,0 @@ -./fips140only.go diff --git a/.cache/go-build/c0/c0e1614f8555e3718a11cb6ec55ec3602a71502da62df0e2df8da4952e6b547d-a b/.cache/go-build/c0/c0e1614f8555e3718a11cb6ec55ec3602a71502da62df0e2df8da4952e6b547d-a deleted file mode 100644 index af6a027..0000000 --- a/.cache/go-build/c0/c0e1614f8555e3718a11cb6ec55ec3602a71502da62df0e2df8da4952e6b547d-a +++ /dev/null @@ -1 +0,0 @@ -v1 c0e1614f8555e3718a11cb6ec55ec3602a71502da62df0e2df8da4952e6b547d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289830955417 diff --git a/.cache/go-build/c1/c14a8755f6c79257d3c6c230be53a844ef4c6be650deb80b95624804d1c87be4-a b/.cache/go-build/c1/c14a8755f6c79257d3c6c230be53a844ef4c6be650deb80b95624804d1c87be4-a deleted file mode 100644 index 0143cc0..0000000 --- a/.cache/go-build/c1/c14a8755f6c79257d3c6c230be53a844ef4c6be650deb80b95624804d1c87be4-a +++ /dev/null @@ -1 +0,0 @@ -v1 c14a8755f6c79257d3c6c230be53a844ef4c6be650deb80b95624804d1c87be4 23d051e7d2531853a8b8ff09fa728476ee6c7748ced4ab69a134c90b097dedf4 10 1775136288637796364 diff --git a/.cache/go-build/c1/c1572292b73d96e9fee4e7b28782d885f42642d5450eb01a2ae9f3ade2fac20e-a b/.cache/go-build/c1/c1572292b73d96e9fee4e7b28782d885f42642d5450eb01a2ae9f3ade2fac20e-a deleted file mode 100644 index 11fcacd..0000000 --- a/.cache/go-build/c1/c1572292b73d96e9fee4e7b28782d885f42642d5450eb01a2ae9f3ade2fac20e-a +++ /dev/null @@ -1 +0,0 @@ -v1 c1572292b73d96e9fee4e7b28782d885f42642d5450eb01a2ae9f3ade2fac20e 9a434c1d68a1cf8c16e9c6b16fe47ca08a2dcda6ac79c9520c12200332d33759 130096 1775137722020484118 diff --git a/.cache/go-build/c1/c17d162978a48bfca5178249aaf959beb38011bd1bf51630e3860d835cf103e7-d b/.cache/go-build/c1/c17d162978a48bfca5178249aaf959beb38011bd1bf51630e3860d835cf103e7-d deleted file mode 100644 index 49615a6..0000000 Binary files a/.cache/go-build/c1/c17d162978a48bfca5178249aaf959beb38011bd1bf51630e3860d835cf103e7-d and /dev/null differ diff --git a/.cache/go-build/c1/c19edbf97adb970db814c5ba88dfbcc0036d01d6355f8fabb833779dd6466ed8-a b/.cache/go-build/c1/c19edbf97adb970db814c5ba88dfbcc0036d01d6355f8fabb833779dd6466ed8-a deleted file mode 100644 index ff4b090..0000000 --- a/.cache/go-build/c1/c19edbf97adb970db814c5ba88dfbcc0036d01d6355f8fabb833779dd6466ed8-a +++ /dev/null @@ -1 +0,0 @@ -v1 c19edbf97adb970db814c5ba88dfbcc0036d01d6355f8fabb833779dd6466ed8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289833151759 diff --git a/.cache/go-build/c1/c1bfed6d292926359b852a922f96e0436644077a072300201e954d930749ff06-d b/.cache/go-build/c1/c1bfed6d292926359b852a922f96e0436644077a072300201e954d930749ff06-d deleted file mode 100644 index a7c026d..0000000 Binary files a/.cache/go-build/c1/c1bfed6d292926359b852a922f96e0436644077a072300201e954d930749ff06-d and /dev/null differ diff --git a/.cache/go-build/c1/c1c849123087f7a359775eae86055eebba095dd8f4fc0df78c19db16abf8cd60-d b/.cache/go-build/c1/c1c849123087f7a359775eae86055eebba095dd8f4fc0df78c19db16abf8cd60-d deleted file mode 100644 index b1dcee1..0000000 Binary files a/.cache/go-build/c1/c1c849123087f7a359775eae86055eebba095dd8f4fc0df78c19db16abf8cd60-d and /dev/null differ diff --git a/.cache/go-build/c1/c1eb3a2cfcbb59c3d72fb80010f1fa45dbe6fca1aa8782e29e0df409421fc070-d b/.cache/go-build/c1/c1eb3a2cfcbb59c3d72fb80010f1fa45dbe6fca1aa8782e29e0df409421fc070-d deleted file mode 100644 index 10029f6..0000000 --- a/.cache/go-build/c1/c1eb3a2cfcbb59c3d72fb80010f1fa45dbe6fca1aa8782e29e0df409421fc070-d +++ /dev/null @@ -1 +0,0 @@ -./time.go diff --git a/.cache/go-build/c2/c22b3baf33820de447090b894bc72f7cc3f4b746dc997ac58e3d2cb09ec06c8c-a b/.cache/go-build/c2/c22b3baf33820de447090b894bc72f7cc3f4b746dc997ac58e3d2cb09ec06c8c-a deleted file mode 100644 index 9ada981..0000000 --- a/.cache/go-build/c2/c22b3baf33820de447090b894bc72f7cc3f4b746dc997ac58e3d2cb09ec06c8c-a +++ /dev/null @@ -1 +0,0 @@ -v1 c22b3baf33820de447090b894bc72f7cc3f4b746dc997ac58e3d2cb09ec06c8c 25f66d679bbe67c0b28f68e7e51be35ae7f74b78528f9f12fc87d6b2292882fc 101818 1775136289324288395 diff --git a/.cache/go-build/c2/c23df47e558760577ca85e209817b31837e69619fc642af359ac2b4728c8aca5-d b/.cache/go-build/c2/c23df47e558760577ca85e209817b31837e69619fc642af359ac2b4728c8aca5-d deleted file mode 100644 index 2f4283e..0000000 --- a/.cache/go-build/c2/c23df47e558760577ca85e209817b31837e69619fc642af359ac2b4728c8aca5-d +++ /dev/null @@ -1,5 +0,0 @@ -./apply_manifest.go -./build.go -./chunk_validation.go -./compare.go -./extract.go diff --git a/.cache/go-build/c2/c261ce6e2d012ca5b70d4c1792c48eaae191c0aa2edb2583a56cb7b457b736ab-a b/.cache/go-build/c2/c261ce6e2d012ca5b70d4c1792c48eaae191c0aa2edb2583a56cb7b457b736ab-a deleted file mode 100644 index 6720cf1..0000000 --- a/.cache/go-build/c2/c261ce6e2d012ca5b70d4c1792c48eaae191c0aa2edb2583a56cb7b457b736ab-a +++ /dev/null @@ -1 +0,0 @@ -v1 c261ce6e2d012ca5b70d4c1792c48eaae191c0aa2edb2583a56cb7b457b736ab e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288423158410 diff --git a/.cache/go-build/c2/c28725ae65cfa7411e03c404fee3ef0559860ac6ab00b451b943c8de988ab187-a b/.cache/go-build/c2/c28725ae65cfa7411e03c404fee3ef0559860ac6ab00b451b943c8de988ab187-a deleted file mode 100644 index 2fc3220..0000000 --- a/.cache/go-build/c2/c28725ae65cfa7411e03c404fee3ef0559860ac6ab00b451b943c8de988ab187-a +++ /dev/null @@ -1 +0,0 @@ -v1 c28725ae65cfa7411e03c404fee3ef0559860ac6ab00b451b943c8de988ab187 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289458238581 diff --git a/.cache/go-build/c2/c28ad573a0c0720e3768269767c1f31df5b2c4fc706c4bdfefedfaaabad3452a-a b/.cache/go-build/c2/c28ad573a0c0720e3768269767c1f31df5b2c4fc706c4bdfefedfaaabad3452a-a deleted file mode 100644 index 295c09a..0000000 --- a/.cache/go-build/c2/c28ad573a0c0720e3768269767c1f31df5b2c4fc706c4bdfefedfaaabad3452a-a +++ /dev/null @@ -1 +0,0 @@ -v1 c28ad573a0c0720e3768269767c1f31df5b2c4fc706c4bdfefedfaaabad3452a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184192054349 diff --git a/.cache/go-build/c2/c29816942a1d5ce650ab53460ae202549c42486d01811d1f5c17a7df6861a681-a b/.cache/go-build/c2/c29816942a1d5ce650ab53460ae202549c42486d01811d1f5c17a7df6861a681-a deleted file mode 100644 index 796aa98..0000000 --- a/.cache/go-build/c2/c29816942a1d5ce650ab53460ae202549c42486d01811d1f5c17a7df6861a681-a +++ /dev/null @@ -1 +0,0 @@ -v1 c29816942a1d5ce650ab53460ae202549c42486d01811d1f5c17a7df6861a681 91bbee79fc154386e543ade6cd2186b608e3858f158a09f7765ca6a8035e56bc 9352 1775136286947696055 diff --git a/.cache/go-build/c2/c2d56b5c32b1a69a794a07085f94e257f2eea94e27c6d618d185141c94c0c347-d b/.cache/go-build/c2/c2d56b5c32b1a69a794a07085f94e257f2eea94e27c6d618d185141c94c0c347-d deleted file mode 100644 index 6f6b9a2..0000000 Binary files a/.cache/go-build/c2/c2d56b5c32b1a69a794a07085f94e257f2eea94e27c6d618d185141c94c0c347-d and /dev/null differ diff --git a/.cache/go-build/c2/c2f7de294d26f61976cce5ac945c9f6de8dc196c87b9244e1435cc02a9a3b8b5-a b/.cache/go-build/c2/c2f7de294d26f61976cce5ac945c9f6de8dc196c87b9244e1435cc02a9a3b8b5-a deleted file mode 100644 index 762bee0..0000000 --- a/.cache/go-build/c2/c2f7de294d26f61976cce5ac945c9f6de8dc196c87b9244e1435cc02a9a3b8b5-a +++ /dev/null @@ -1 +0,0 @@ -v1 c2f7de294d26f61976cce5ac945c9f6de8dc196c87b9244e1435cc02a9a3b8b5 0f042ae694b61a575edf31a919ea4e5d4b6bd74a6e72039a930412c57a1263f9 105786 1775136286937906098 diff --git a/.cache/go-build/c3/c330ad7c8b239b9d38c95440fa43fc171f4f0fe4fee8bdc55c246c51643bb714-a b/.cache/go-build/c3/c330ad7c8b239b9d38c95440fa43fc171f4f0fe4fee8bdc55c246c51643bb714-a deleted file mode 100644 index f87c247..0000000 --- a/.cache/go-build/c3/c330ad7c8b239b9d38c95440fa43fc171f4f0fe4fee8bdc55c246c51643bb714-a +++ /dev/null @@ -1 +0,0 @@ -v1 c330ad7c8b239b9d38c95440fa43fc171f4f0fe4fee8bdc55c246c51643bb714 b5c57c80f3b1e60f37bd8856d7c0c514546fcf7dc52dfb45330bc2ab2d8db3f8 3391 1775136286827610159 diff --git a/.cache/go-build/c3/c33eca565b4aeba4965f62cd2cdd8c6aa8473a0b05a48fb8577a0e2edbf1f05a-d b/.cache/go-build/c3/c33eca565b4aeba4965f62cd2cdd8c6aa8473a0b05a48fb8577a0e2edbf1f05a-d deleted file mode 100644 index 3ca1a60..0000000 Binary files a/.cache/go-build/c3/c33eca565b4aeba4965f62cd2cdd8c6aa8473a0b05a48fb8577a0e2edbf1f05a-d and /dev/null differ diff --git a/.cache/go-build/c3/c3fd2da05fb02599f5bb8e907264609f73cd3bdb5f3178af9c14b3b544398a3a-a b/.cache/go-build/c3/c3fd2da05fb02599f5bb8e907264609f73cd3bdb5f3178af9c14b3b544398a3a-a deleted file mode 100644 index 973411e..0000000 --- a/.cache/go-build/c3/c3fd2da05fb02599f5bb8e907264609f73cd3bdb5f3178af9c14b3b544398a3a-a +++ /dev/null @@ -1 +0,0 @@ -v1 c3fd2da05fb02599f5bb8e907264609f73cd3bdb5f3178af9c14b3b544398a3a a37a95d08b6901635c1856327126fdc1908adeaef3fc0214a64f211f3063643e 9 1775136287065948329 diff --git a/.cache/go-build/c4/c40ef652543c07b4996f48cdc01a7102d5c18b1759ce89332d9997f4632914ef-d b/.cache/go-build/c4/c40ef652543c07b4996f48cdc01a7102d5c18b1759ce89332d9997f4632914ef-d deleted file mode 100644 index 7349b4f..0000000 Binary files a/.cache/go-build/c4/c40ef652543c07b4996f48cdc01a7102d5c18b1759ce89332d9997f4632914ef-d and /dev/null differ diff --git a/.cache/go-build/c4/c431a1d2d6113fa808d23b99b1e3877306de855e7486654fab6d6f19a33f2c1e-d b/.cache/go-build/c4/c431a1d2d6113fa808d23b99b1e3877306de855e7486654fab6d6f19a33f2c1e-d deleted file mode 100644 index a6acec3..0000000 Binary files a/.cache/go-build/c4/c431a1d2d6113fa808d23b99b1e3877306de855e7486654fab6d6f19a33f2c1e-d and /dev/null differ diff --git a/.cache/go-build/c4/c45e17c950185852249b055b4ea7aa19a6f3c65a409712a727fca3d22f941576-a b/.cache/go-build/c4/c45e17c950185852249b055b4ea7aa19a6f3c65a409712a727fca3d22f941576-a deleted file mode 100644 index f160477..0000000 --- a/.cache/go-build/c4/c45e17c950185852249b055b4ea7aa19a6f3c65a409712a727fca3d22f941576-a +++ /dev/null @@ -1 +0,0 @@ -v1 c45e17c950185852249b055b4ea7aa19a6f3c65a409712a727fca3d22f941576 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287225747094 diff --git a/.cache/go-build/c4/c4d88222fdd86c186f3f426e76a23ff7cbc75787a70651aeebd69c38372756c6-a b/.cache/go-build/c4/c4d88222fdd86c186f3f426e76a23ff7cbc75787a70651aeebd69c38372756c6-a deleted file mode 100644 index 3c72892..0000000 --- a/.cache/go-build/c4/c4d88222fdd86c186f3f426e76a23ff7cbc75787a70651aeebd69c38372756c6-a +++ /dev/null @@ -1 +0,0 @@ -v1 c4d88222fdd86c186f3f426e76a23ff7cbc75787a70651aeebd69c38372756c6 495a4460c9c8b3bfebd936a85176b639f7d45fd6aba419dcbda77be75d979e8f 2514 1775136286906863826 diff --git a/.cache/go-build/c4/c4df9fcf27d721ac8f34d863000e2208437f0e38c88ecff6af09291af65297d2-a b/.cache/go-build/c4/c4df9fcf27d721ac8f34d863000e2208437f0e38c88ecff6af09291af65297d2-a deleted file mode 100644 index e6e9953..0000000 --- a/.cache/go-build/c4/c4df9fcf27d721ac8f34d863000e2208437f0e38c88ecff6af09291af65297d2-a +++ /dev/null @@ -1 +0,0 @@ -v1 c4df9fcf27d721ac8f34d863000e2208437f0e38c88ecff6af09291af65297d2 2e7390a069448e92bcceee8403d820a3f8f0be04b263917d51dacc203e83d6a2 1379 1775136286826905669 diff --git a/.cache/go-build/c5/c571a2788e4da4321b41cebcfd1b5259de4a4b8b974d10fabbca6357202b9b54-d b/.cache/go-build/c5/c571a2788e4da4321b41cebcfd1b5259de4a4b8b974d10fabbca6357202b9b54-d deleted file mode 100644 index 21b0931..0000000 --- a/.cache/go-build/c5/c571a2788e4da4321b41cebcfd1b5259de4a4b8b974d10fabbca6357202b9b54-d +++ /dev/null @@ -1,4 +0,0 @@ -./binary.go -./json.go -./types.go -./binary_test.go diff --git a/.cache/go-build/c5/c57be060ec648dd4a30517536339520007a04ce752b67b40b55f54a1a7df76b5-d b/.cache/go-build/c5/c57be060ec648dd4a30517536339520007a04ce752b67b40b55f54a1a7df76b5-d deleted file mode 100644 index e20c519..0000000 --- a/.cache/go-build/c5/c57be060ec648dd4a30517536339520007a04ce752b67b40b55f54a1a7df76b5-d +++ /dev/null @@ -1 +0,0 @@ -./utf8.go diff --git a/.cache/go-build/c5/c58612355162261c55fc41763b712b8413dc0e0700dc2ebc50ad253966e05e76-a b/.cache/go-build/c5/c58612355162261c55fc41763b712b8413dc0e0700dc2ebc50ad253966e05e76-a deleted file mode 100644 index d8b8f29..0000000 --- a/.cache/go-build/c5/c58612355162261c55fc41763b712b8413dc0e0700dc2ebc50ad253966e05e76-a +++ /dev/null @@ -1 +0,0 @@ -v1 c58612355162261c55fc41763b712b8413dc0e0700dc2ebc50ad253966e05e76 5f92fe075de9e839c9b482ad657215aad6326aef26a8493bee8dc9d9539ef8f1 50 1775136286970617541 diff --git a/.cache/go-build/c5/c5e7be136be2990db563f53fe996bffc9f6bdad845685e99f17405df31508720-a b/.cache/go-build/c5/c5e7be136be2990db563f53fe996bffc9f6bdad845685e99f17405df31508720-a deleted file mode 100644 index 315398b..0000000 --- a/.cache/go-build/c5/c5e7be136be2990db563f53fe996bffc9f6bdad845685e99f17405df31508720-a +++ /dev/null @@ -1 +0,0 @@ -v1 c5e7be136be2990db563f53fe996bffc9f6bdad845685e99f17405df31508720 855efed075059448e680617361e5a59fda95ed2ad8868c1c615e0c1bf3c75da9 243818 1775136288831119482 diff --git a/.cache/go-build/c5/c5ee44d9904f59c3447cb51f5dd114b6e425bebd653a2aba632d39d22b8a2ae3-a b/.cache/go-build/c5/c5ee44d9904f59c3447cb51f5dd114b6e425bebd653a2aba632d39d22b8a2ae3-a deleted file mode 100644 index 760a675..0000000 --- a/.cache/go-build/c5/c5ee44d9904f59c3447cb51f5dd114b6e425bebd653a2aba632d39d22b8a2ae3-a +++ /dev/null @@ -1 +0,0 @@ -v1 c5ee44d9904f59c3447cb51f5dd114b6e425bebd653a2aba632d39d22b8a2ae3 7268825a631adbbde072cfbf30e0e8fc35078e90f1a38c9d4e53c206e2039f41 22 1775136289503030913 diff --git a/.cache/go-build/c6/c64e34a349b420c5f837aa3c0625fd97e5a43c73a5d287526a63c4ed3087c8d4-a b/.cache/go-build/c6/c64e34a349b420c5f837aa3c0625fd97e5a43c73a5d287526a63c4ed3087c8d4-a deleted file mode 100644 index 8593dbc..0000000 --- a/.cache/go-build/c6/c64e34a349b420c5f837aa3c0625fd97e5a43c73a5d287526a63c4ed3087c8d4-a +++ /dev/null @@ -1 +0,0 @@ -v1 c64e34a349b420c5f837aa3c0625fd97e5a43c73a5d287526a63c4ed3087c8d4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286934456965 diff --git a/.cache/go-build/c6/c65fb8bf57a1e0df963979f0f59714c5af14f7a3a987e8688a934f0f38c18af2-d b/.cache/go-build/c6/c65fb8bf57a1e0df963979f0f59714c5af14f7a3a987e8688a934f0f38c18af2-d deleted file mode 100644 index bcbb1c6..0000000 --- a/.cache/go-build/c6/c65fb8bf57a1e0df963979f0f59714c5af14f7a3a987e8688a934f0f38c18af2-d +++ /dev/null @@ -1,2 +0,0 @@ -./doc.go -./noasan.go diff --git a/.cache/go-build/c6/c68b2a8790a5f276525b78574a905bf3a4389b981a727dec9a3941b4a889c70a-d b/.cache/go-build/c6/c68b2a8790a5f276525b78574a905bf3a4389b981a727dec9a3941b4a889c70a-d deleted file mode 100644 index c2a1499..0000000 Binary files a/.cache/go-build/c6/c68b2a8790a5f276525b78574a905bf3a4389b981a727dec9a3941b4a889c70a-d and /dev/null differ diff --git a/.cache/go-build/c6/c6ddeafa11e07477f40eb1a741b4298f3ce745f43ee155a9b5ccf4a7af31a6c9-a b/.cache/go-build/c6/c6ddeafa11e07477f40eb1a741b4298f3ce745f43ee155a9b5ccf4a7af31a6c9-a deleted file mode 100644 index 038644e..0000000 --- a/.cache/go-build/c6/c6ddeafa11e07477f40eb1a741b4298f3ce745f43ee155a9b5ccf4a7af31a6c9-a +++ /dev/null @@ -1 +0,0 @@ -v1 c6ddeafa11e07477f40eb1a741b4298f3ce745f43ee155a9b5ccf4a7af31a6c9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722010312561 diff --git a/.cache/go-build/c7/c753df3491dae6f64a70bb11050feab265294686d3987fc2a6e6dfe889c92e25-a b/.cache/go-build/c7/c753df3491dae6f64a70bb11050feab265294686d3987fc2a6e6dfe889c92e25-a deleted file mode 100644 index 9d61b71..0000000 --- a/.cache/go-build/c7/c753df3491dae6f64a70bb11050feab265294686d3987fc2a6e6dfe889c92e25-a +++ /dev/null @@ -1 +0,0 @@ -v1 c753df3491dae6f64a70bb11050feab265294686d3987fc2a6e6dfe889c92e25 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289034227137 diff --git a/.cache/go-build/c7/c755593608434e8cbd7be3399b156c282e91bb1db876857bafd0b9052f69bbdc-a b/.cache/go-build/c7/c755593608434e8cbd7be3399b156c282e91bb1db876857bafd0b9052f69bbdc-a deleted file mode 100644 index f614807..0000000 --- a/.cache/go-build/c7/c755593608434e8cbd7be3399b156c282e91bb1db876857bafd0b9052f69bbdc-a +++ /dev/null @@ -1 +0,0 @@ -v1 c755593608434e8cbd7be3399b156c282e91bb1db876857bafd0b9052f69bbdc 2504db93d2f28e6e09170315a1dc2d9162de950077c1a8ec20c4ba32c0e55367 453 1775136286805716593 diff --git a/.cache/go-build/c7/c782f7dcc93d922566b533fd60d6940b5b44fe96dcb7e8ae1fa71d9b760b862a-d b/.cache/go-build/c7/c782f7dcc93d922566b533fd60d6940b5b44fe96dcb7e8ae1fa71d9b760b862a-d deleted file mode 100644 index a3de59a..0000000 Binary files a/.cache/go-build/c7/c782f7dcc93d922566b533fd60d6940b5b44fe96dcb7e8ae1fa71d9b760b862a-d and /dev/null differ diff --git a/.cache/go-build/c7/c7972423380bf6bdeb9b0dab9a084da92189c5b2fbcaed9a3511be5486f69dbc-a b/.cache/go-build/c7/c7972423380bf6bdeb9b0dab9a084da92189c5b2fbcaed9a3511be5486f69dbc-a deleted file mode 100644 index bcaeee5..0000000 --- a/.cache/go-build/c7/c7972423380bf6bdeb9b0dab9a084da92189c5b2fbcaed9a3511be5486f69dbc-a +++ /dev/null @@ -1 +0,0 @@ -v1 c7972423380bf6bdeb9b0dab9a084da92189c5b2fbcaed9a3511be5486f69dbc e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721923841749 diff --git a/.cache/go-build/c7/c7b4b85e1de820211d7b53ff8a4743a9fe11a634533adea6ca07b018f9139bca-a b/.cache/go-build/c7/c7b4b85e1de820211d7b53ff8a4743a9fe11a634533adea6ca07b018f9139bca-a deleted file mode 100644 index a783039..0000000 --- a/.cache/go-build/c7/c7b4b85e1de820211d7b53ff8a4743a9fe11a634533adea6ca07b018f9139bca-a +++ /dev/null @@ -1 +0,0 @@ -v1 c7b4b85e1de820211d7b53ff8a4743a9fe11a634533adea6ca07b018f9139bca e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139461351670094 diff --git a/.cache/go-build/c7/c7efedb9584ca36a3a7a6a391f1500c0108ac050baab71217b0887cf70fa116a-d b/.cache/go-build/c7/c7efedb9584ca36a3a7a6a391f1500c0108ac050baab71217b0887cf70fa116a-d deleted file mode 100644 index 314e8ff..0000000 Binary files a/.cache/go-build/c7/c7efedb9584ca36a3a7a6a391f1500c0108ac050baab71217b0887cf70fa116a-d and /dev/null differ diff --git a/.cache/go-build/c8/c807576f362020eec3e3c641352f4b6230276fd1bcf3a36b7d4fa26a3d57e368-a b/.cache/go-build/c8/c807576f362020eec3e3c641352f4b6230276fd1bcf3a36b7d4fa26a3d57e368-a deleted file mode 100644 index 376d2b4..0000000 --- a/.cache/go-build/c8/c807576f362020eec3e3c641352f4b6230276fd1bcf3a36b7d4fa26a3d57e368-a +++ /dev/null @@ -1 +0,0 @@ -v1 c807576f362020eec3e3c641352f4b6230276fd1bcf3a36b7d4fa26a3d57e368 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289718805197 diff --git a/.cache/go-build/c8/c8599a8888946679612dd9bb79676f54ac6f4cca7f8e3aee98bf0187c210afe5-a b/.cache/go-build/c8/c8599a8888946679612dd9bb79676f54ac6f4cca7f8e3aee98bf0187c210afe5-a deleted file mode 100644 index 622201d..0000000 --- a/.cache/go-build/c8/c8599a8888946679612dd9bb79676f54ac6f4cca7f8e3aee98bf0187c210afe5-a +++ /dev/null @@ -1 +0,0 @@ -v1 c8599a8888946679612dd9bb79676f54ac6f4cca7f8e3aee98bf0187c210afe5 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289304695311 diff --git a/.cache/go-build/c8/c85ea04250f0900c207c9bdc1fe8978b9fd0610ae9182f66d5bbdccd49c39c88-d b/.cache/go-build/c8/c85ea04250f0900c207c9bdc1fe8978b9fd0610ae9182f66d5bbdccd49c39c88-d deleted file mode 100644 index 56f5759..0000000 Binary files a/.cache/go-build/c8/c85ea04250f0900c207c9bdc1fe8978b9fd0610ae9182f66d5bbdccd49c39c88-d and /dev/null differ diff --git a/.cache/go-build/c8/c8a06c5c7166faf9eacdf877d12e11f498558d8161b7bc2f8c43b08cb3e321e7-d b/.cache/go-build/c8/c8a06c5c7166faf9eacdf877d12e11f498558d8161b7bc2f8c43b08cb3e321e7-d deleted file mode 100644 index 83c74b5..0000000 Binary files a/.cache/go-build/c8/c8a06c5c7166faf9eacdf877d12e11f498558d8161b7bc2f8c43b08cb3e321e7-d and /dev/null differ diff --git a/.cache/go-build/c8/c8e9e3b4d8bc3d484d7b53870e9aa84000b5d4ffd00cec18d2856054d7487742-a b/.cache/go-build/c8/c8e9e3b4d8bc3d484d7b53870e9aa84000b5d4ffd00cec18d2856054d7487742-a deleted file mode 100644 index bd5f630..0000000 --- a/.cache/go-build/c8/c8e9e3b4d8bc3d484d7b53870e9aa84000b5d4ffd00cec18d2856054d7487742-a +++ /dev/null @@ -1 +0,0 @@ -v1 c8e9e3b4d8bc3d484d7b53870e9aa84000b5d4ffd00cec18d2856054d7487742 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288696819836 diff --git a/.cache/go-build/c9/c90f727b3df4d03f1e4cc72163e1ce9d79a10ff77a1ca2b8308ef07120b9920e-d b/.cache/go-build/c9/c90f727b3df4d03f1e4cc72163e1ce9d79a10ff77a1ca2b8308ef07120b9920e-d deleted file mode 100644 index 2bc5a86..0000000 --- a/.cache/go-build/c9/c90f727b3df4d03f1e4cc72163e1ce9d79a10ff77a1ca2b8308ef07120b9920e-d +++ /dev/null @@ -1 +0,0 @@ -./profilerecord.go diff --git a/.cache/go-build/c9/c9b57955291c32f74c450dca069ddbe444ef59c95080a7aaad9f12837a82fa73-a b/.cache/go-build/c9/c9b57955291c32f74c450dca069ddbe444ef59c95080a7aaad9f12837a82fa73-a deleted file mode 100644 index 160f572..0000000 --- a/.cache/go-build/c9/c9b57955291c32f74c450dca069ddbe444ef59c95080a7aaad9f12837a82fa73-a +++ /dev/null @@ -1 +0,0 @@ -v1 c9b57955291c32f74c450dca069ddbe444ef59c95080a7aaad9f12837a82fa73 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287104757907 diff --git a/.cache/go-build/c9/c9e606d004cc52dc1cdab23e1466ec305f9e53462c296e6eb2c3ee4595d0718f-d b/.cache/go-build/c9/c9e606d004cc52dc1cdab23e1466ec305f9e53462c296e6eb2c3ee4595d0718f-d deleted file mode 100644 index 45124a5..0000000 Binary files a/.cache/go-build/c9/c9e606d004cc52dc1cdab23e1466ec305f9e53462c296e6eb2c3ee4595d0718f-d and /dev/null differ diff --git a/.cache/go-build/ca/ca0a81a120348cd3550aaae76246f928e76f7e6f836c1bbd0659d8b842d89744-a b/.cache/go-build/ca/ca0a81a120348cd3550aaae76246f928e76f7e6f836c1bbd0659d8b842d89744-a deleted file mode 100644 index 87ee93c..0000000 --- a/.cache/go-build/ca/ca0a81a120348cd3550aaae76246f928e76f7e6f836c1bbd0659d8b842d89744-a +++ /dev/null @@ -1 +0,0 @@ -v1 ca0a81a120348cd3550aaae76246f928e76f7e6f836c1bbd0659d8b842d89744 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287035084057 diff --git a/.cache/go-build/ca/ca123e1ed989b56657c273c609a50dace30d35735bb08c80cbe0765198e2fa40-a b/.cache/go-build/ca/ca123e1ed989b56657c273c609a50dace30d35735bb08c80cbe0765198e2fa40-a deleted file mode 100644 index 4065dcf..0000000 --- a/.cache/go-build/ca/ca123e1ed989b56657c273c609a50dace30d35735bb08c80cbe0765198e2fa40-a +++ /dev/null @@ -1 +0,0 @@ -v1 ca123e1ed989b56657c273c609a50dace30d35735bb08c80cbe0765198e2fa40 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184047119195 diff --git a/.cache/go-build/ca/ca495ea07ba417d86005269f8ba98d3af00591578b8451f15d7d4ddb31bcc4b1-a b/.cache/go-build/ca/ca495ea07ba417d86005269f8ba98d3af00591578b8451f15d7d4ddb31bcc4b1-a deleted file mode 100644 index 608aa49..0000000 --- a/.cache/go-build/ca/ca495ea07ba417d86005269f8ba98d3af00591578b8451f15d7d4ddb31bcc4b1-a +++ /dev/null @@ -1 +0,0 @@ -v1 ca495ea07ba417d86005269f8ba98d3af00591578b8451f15d7d4ddb31bcc4b1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184207155000 diff --git a/.cache/go-build/ca/cac558b03cfb306dbfa9ca978b4dcf23c928ac08a4ccf8548d015668dc201dd1-a b/.cache/go-build/ca/cac558b03cfb306dbfa9ca978b4dcf23c928ac08a4ccf8548d015668dc201dd1-a deleted file mode 100644 index 8f385ec..0000000 --- a/.cache/go-build/ca/cac558b03cfb306dbfa9ca978b4dcf23c928ac08a4ccf8548d015668dc201dd1-a +++ /dev/null @@ -1 +0,0 @@ -v1 cac558b03cfb306dbfa9ca978b4dcf23c928ac08a4ccf8548d015668dc201dd1 6033bea675f493cff03775e928632626a8f553e60f9ecc5d0af0229814f353f5 3353 1775136286948703046 diff --git a/.cache/go-build/ca/cac90ec757a737807a043ce13058c43cfca1501a5ba0dd0981fae9ecaf0e97f3-a b/.cache/go-build/ca/cac90ec757a737807a043ce13058c43cfca1501a5ba0dd0981fae9ecaf0e97f3-a deleted file mode 100644 index 3e792a1..0000000 --- a/.cache/go-build/ca/cac90ec757a737807a043ce13058c43cfca1501a5ba0dd0981fae9ecaf0e97f3-a +++ /dev/null @@ -1 +0,0 @@ -v1 cac90ec757a737807a043ce13058c43cfca1501a5ba0dd0981fae9ecaf0e97f3 8ac5a7f4fe57678c406d2ee90d0b24366182395487c188706a6a5e615297bb8e 14757000 1775136288435001509 diff --git a/.cache/go-build/cb/cb0e3c5817a9e3cc3cb0d994a3f710365bfd1f90929d0ff3a745cca5f7c298e6-d b/.cache/go-build/cb/cb0e3c5817a9e3cc3cb0d994a3f710365bfd1f90929d0ff3a745cca5f7c298e6-d deleted file mode 100644 index 1ef0625..0000000 --- a/.cache/go-build/cb/cb0e3c5817a9e3cc3cb0d994a3f710365bfd1f90929d0ff3a745cca5f7c298e6-d +++ /dev/null @@ -1,10 +0,0 @@ -./expand_amd64.go -./expand_reference.go -./filter.go -./filter_amd64.go -./scan_amd64.go -./scan_go.go -./scan_reference.go -./expand_amd64.s -./filter_amd64.s -./scan_amd64.s diff --git a/.cache/go-build/cb/cb40fe559904058236670cd1720e71ed84e87635675038ac52c91a9e6c57d769-a b/.cache/go-build/cb/cb40fe559904058236670cd1720e71ed84e87635675038ac52c91a9e6c57d769-a deleted file mode 100644 index db00799..0000000 --- a/.cache/go-build/cb/cb40fe559904058236670cd1720e71ed84e87635675038ac52c91a9e6c57d769-a +++ /dev/null @@ -1 +0,0 @@ -v1 cb40fe559904058236670cd1720e71ed84e87635675038ac52c91a9e6c57d769 0993af324c0dc82bc42638ec042b5ec609cf6265c621747a5f0bbab965389933 6752 1775136286919026024 diff --git a/.cache/go-build/cb/cb5536386df3278d9911a9dbb2588721792e3a290ea64219bbff63f0aa1e4208-d b/.cache/go-build/cb/cb5536386df3278d9911a9dbb2588721792e3a290ea64219bbff63f0aa1e4208-d deleted file mode 100644 index 986ae64..0000000 Binary files a/.cache/go-build/cb/cb5536386df3278d9911a9dbb2588721792e3a290ea64219bbff63f0aa1e4208-d and /dev/null differ diff --git a/.cache/go-build/cb/cb6ec31ba12ee598d6f2710b7b70ad34dfac056dba1ea212504b53f0cd977a99-d b/.cache/go-build/cb/cb6ec31ba12ee598d6f2710b7b70ad34dfac056dba1ea212504b53f0cd977a99-d deleted file mode 100644 index 11c2dcc..0000000 Binary files a/.cache/go-build/cb/cb6ec31ba12ee598d6f2710b7b70ad34dfac056dba1ea212504b53f0cd977a99-d and /dev/null differ diff --git a/.cache/go-build/cb/cb760196033378ce19e52ae98bbd9586cc562484dca831f9f73e2b05f837c3b6-a b/.cache/go-build/cb/cb760196033378ce19e52ae98bbd9586cc562484dca831f9f73e2b05f837c3b6-a deleted file mode 100644 index 3cd3482..0000000 --- a/.cache/go-build/cb/cb760196033378ce19e52ae98bbd9586cc562484dca831f9f73e2b05f837c3b6-a +++ /dev/null @@ -1 +0,0 @@ -v1 cb760196033378ce19e52ae98bbd9586cc562484dca831f9f73e2b05f837c3b6 5828ac7244bd16806048ba6efde4d9491f7cdcb9c0136c8a4f769b1fd62f2388 482 1775136288757759780 diff --git a/.cache/go-build/cb/cba4532f921fa47d7a54b5655e8ae469dd3985f1f949dab504125c0b422313c1-d b/.cache/go-build/cb/cba4532f921fa47d7a54b5655e8ae469dd3985f1f949dab504125c0b422313c1-d deleted file mode 100644 index 9f00664..0000000 Binary files a/.cache/go-build/cb/cba4532f921fa47d7a54b5655e8ae469dd3985f1f949dab504125c0b422313c1-d and /dev/null differ diff --git a/.cache/go-build/cb/cbb1b29bd60b2e65d4d6261de2d8b31b14b4ed52baa4b6bf5c87a330c71e46bf-a b/.cache/go-build/cb/cbb1b29bd60b2e65d4d6261de2d8b31b14b4ed52baa4b6bf5c87a330c71e46bf-a deleted file mode 100644 index 96007f0..0000000 --- a/.cache/go-build/cb/cbb1b29bd60b2e65d4d6261de2d8b31b14b4ed52baa4b6bf5c87a330c71e46bf-a +++ /dev/null @@ -1 +0,0 @@ -v1 cbb1b29bd60b2e65d4d6261de2d8b31b14b4ed52baa4b6bf5c87a330c71e46bf e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289018652236 diff --git a/.cache/go-build/cb/cbb65782ea9a7e36ab2640163187874545368e8127356742c909f6fab2d65e07-d b/.cache/go-build/cb/cbb65782ea9a7e36ab2640163187874545368e8127356742c909f6fab2d65e07-d deleted file mode 100644 index ee25476..0000000 Binary files a/.cache/go-build/cb/cbb65782ea9a7e36ab2640163187874545368e8127356742c909f6fab2d65e07-d and /dev/null differ diff --git a/.cache/go-build/cb/cbe0ce015b17dc7718180171f90874656fa68d1d711a6a0d23f77ce89235c5a1-a b/.cache/go-build/cb/cbe0ce015b17dc7718180171f90874656fa68d1d711a6a0d23f77ce89235c5a1-a deleted file mode 100644 index 920b145..0000000 --- a/.cache/go-build/cb/cbe0ce015b17dc7718180171f90874656fa68d1d711a6a0d23f77ce89235c5a1-a +++ /dev/null @@ -1 +0,0 @@ -v1 cbe0ce015b17dc7718180171f90874656fa68d1d711a6a0d23f77ce89235c5a1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721898019811 diff --git a/.cache/go-build/cb/cbf7be661fa5a442439113ff23eba22ec97b0ae9ad44ab9720673f35e92b915c-d b/.cache/go-build/cb/cbf7be661fa5a442439113ff23eba22ec97b0ae9ad44ab9720673f35e92b915c-d deleted file mode 100644 index 88e1def..0000000 Binary files a/.cache/go-build/cb/cbf7be661fa5a442439113ff23eba22ec97b0ae9ad44ab9720673f35e92b915c-d and /dev/null differ diff --git a/.cache/go-build/cc/cc201238d1883e2e3531e3919cd761052e5b7e1507db43c405eabfa1664d078a-a b/.cache/go-build/cc/cc201238d1883e2e3531e3919cd761052e5b7e1507db43c405eabfa1664d078a-a deleted file mode 100644 index 093c993..0000000 --- a/.cache/go-build/cc/cc201238d1883e2e3531e3919cd761052e5b7e1507db43c405eabfa1664d078a-a +++ /dev/null @@ -1 +0,0 @@ -v1 cc201238d1883e2e3531e3919cd761052e5b7e1507db43c405eabfa1664d078a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289740485012 diff --git a/.cache/go-build/cc/cc3e51fe05de07962dfea672ae2834e41e51b0129e2a4e626ee02611bd09e066-d b/.cache/go-build/cc/cc3e51fe05de07962dfea672ae2834e41e51b0129e2a4e626ee02611bd09e066-d deleted file mode 100644 index 5b5b791..0000000 Binary files a/.cache/go-build/cc/cc3e51fe05de07962dfea672ae2834e41e51b0129e2a4e626ee02611bd09e066-d and /dev/null differ diff --git a/.cache/go-build/cc/cc50222640f2416fc2193b0ae1dba5c55f9ce4311d25ebb8674ec9c85240b575-a b/.cache/go-build/cc/cc50222640f2416fc2193b0ae1dba5c55f9ce4311d25ebb8674ec9c85240b575-a deleted file mode 100644 index cfa075e..0000000 --- a/.cache/go-build/cc/cc50222640f2416fc2193b0ae1dba5c55f9ce4311d25ebb8674ec9c85240b575-a +++ /dev/null @@ -1 +0,0 @@ -v1 cc50222640f2416fc2193b0ae1dba5c55f9ce4311d25ebb8674ec9c85240b575 20ea81bf0563c6cf49bb34a416512c9e5fe098c25190e9901abcfbff0294a651 260 1775136286810773767 diff --git a/.cache/go-build/cc/cc5e3463696f69cbe6387753a02954fb0b97df708b4d55743898e4f73df5a27f-a b/.cache/go-build/cc/cc5e3463696f69cbe6387753a02954fb0b97df708b4d55743898e4f73df5a27f-a deleted file mode 100644 index 362507b..0000000 --- a/.cache/go-build/cc/cc5e3463696f69cbe6387753a02954fb0b97df708b4d55743898e4f73df5a27f-a +++ /dev/null @@ -1 +0,0 @@ -v1 cc5e3463696f69cbe6387753a02954fb0b97df708b4d55743898e4f73df5a27f 538c92bc3645b6804d0a3d28277fe4f05a5724715bfa6b5cf8a61cd05853dd7f 50 1775136289030011384 diff --git a/.cache/go-build/cc/cce0e009805ed1f94414189c831c647022ca67cee3e3943f5f7b2a3f3a82b9cd-d b/.cache/go-build/cc/cce0e009805ed1f94414189c831c647022ca67cee3e3943f5f7b2a3f3a82b9cd-d deleted file mode 100644 index 8a4abec..0000000 Binary files a/.cache/go-build/cc/cce0e009805ed1f94414189c831c647022ca67cee3e3943f5f7b2a3f3a82b9cd-d and /dev/null differ diff --git a/.cache/go-build/cd/cd3ce77f6b0d24768a1fda9e6f8222a612afa7ce09f542f1bbd062f85571972c-a b/.cache/go-build/cd/cd3ce77f6b0d24768a1fda9e6f8222a612afa7ce09f542f1bbd062f85571972c-a deleted file mode 100644 index 88bb19c..0000000 --- a/.cache/go-build/cd/cd3ce77f6b0d24768a1fda9e6f8222a612afa7ce09f542f1bbd062f85571972c-a +++ /dev/null @@ -1 +0,0 @@ -v1 cd3ce77f6b0d24768a1fda9e6f8222a612afa7ce09f542f1bbd062f85571972c 13bf772f284492f5007b5a0d394dd446b04a192f642866177ef43e368b36c90b 157258 1775136289532209443 diff --git a/.cache/go-build/cd/cdb47db7f2e4d2d545ec6d52bae20addeb02b52311304d33607715e4e5eb0619-a b/.cache/go-build/cd/cdb47db7f2e4d2d545ec6d52bae20addeb02b52311304d33607715e4e5eb0619-a deleted file mode 100644 index 3a263e7..0000000 --- a/.cache/go-build/cd/cdb47db7f2e4d2d545ec6d52bae20addeb02b52311304d33607715e4e5eb0619-a +++ /dev/null @@ -1 +0,0 @@ -v1 cdb47db7f2e4d2d545ec6d52bae20addeb02b52311304d33607715e4e5eb0619 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289340799887 diff --git a/.cache/go-build/cd/cdeb9bb42ba4dd2708b2a49871ad12d394bfe019bb4ec9484f4ec9482374139f-a b/.cache/go-build/cd/cdeb9bb42ba4dd2708b2a49871ad12d394bfe019bb4ec9484f4ec9482374139f-a deleted file mode 100644 index cd7227b..0000000 --- a/.cache/go-build/cd/cdeb9bb42ba4dd2708b2a49871ad12d394bfe019bb4ec9484f4ec9482374139f-a +++ /dev/null @@ -1 +0,0 @@ -v1 cdeb9bb42ba4dd2708b2a49871ad12d394bfe019bb4ec9484f4ec9482374139f 847ccfb4d1838679418cd33ff3d51dbf2f6cee4160c3f93c7db7b1c293f4d0ff 581 1775136286805128383 diff --git a/.cache/go-build/ce/ce4af2432caab1aec86d53bb0568052342efd8704f662d911f8bbfdf26aed69b-a b/.cache/go-build/ce/ce4af2432caab1aec86d53bb0568052342efd8704f662d911f8bbfdf26aed69b-a deleted file mode 100644 index b167189..0000000 --- a/.cache/go-build/ce/ce4af2432caab1aec86d53bb0568052342efd8704f662d911f8bbfdf26aed69b-a +++ /dev/null @@ -1 +0,0 @@ -v1 ce4af2432caab1aec86d53bb0568052342efd8704f662d911f8bbfdf26aed69b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288520481170 diff --git a/.cache/go-build/ce/ce633099c0e9eb119b460faef76c8c6560aa241dd1d7d5f21ca12da9b9b60ddd-a b/.cache/go-build/ce/ce633099c0e9eb119b460faef76c8c6560aa241dd1d7d5f21ca12da9b9b60ddd-a deleted file mode 100644 index 0f11a19..0000000 --- a/.cache/go-build/ce/ce633099c0e9eb119b460faef76c8c6560aa241dd1d7d5f21ca12da9b9b60ddd-a +++ /dev/null @@ -1 +0,0 @@ -v1 ce633099c0e9eb119b460faef76c8c6560aa241dd1d7d5f21ca12da9b9b60ddd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289911374015 diff --git a/.cache/go-build/ce/ce75bce4610e1b449fa0277758d2bfcfb1867a7c82e4c1c5506c2b15b338b493-a b/.cache/go-build/ce/ce75bce4610e1b449fa0277758d2bfcfb1867a7c82e4c1c5506c2b15b338b493-a deleted file mode 100644 index b19a004..0000000 --- a/.cache/go-build/ce/ce75bce4610e1b449fa0277758d2bfcfb1867a7c82e4c1c5506c2b15b338b493-a +++ /dev/null @@ -1 +0,0 @@ -v1 ce75bce4610e1b449fa0277758d2bfcfb1867a7c82e4c1c5506c2b15b338b493 b57217dcc6c08aac6f3d5fb44571617a0e80065b14128f937b9eb23fc80431f4 3850 1775136286814794820 diff --git a/.cache/go-build/ce/ce9cca7fafc15311b50d4849ef7658bad4111b160c975fa76bb7fa07551c098e-a b/.cache/go-build/ce/ce9cca7fafc15311b50d4849ef7658bad4111b160c975fa76bb7fa07551c098e-a deleted file mode 100644 index 1655f4c..0000000 --- a/.cache/go-build/ce/ce9cca7fafc15311b50d4849ef7658bad4111b160c975fa76bb7fa07551c098e-a +++ /dev/null @@ -1 +0,0 @@ -v1 ce9cca7fafc15311b50d4849ef7658bad4111b160c975fa76bb7fa07551c098e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289186192316 diff --git a/.cache/go-build/ce/ceab4240f1d9a0bec406c789d2264c5fa953faad82acafbaf764b7e5d6cf4788-a b/.cache/go-build/ce/ceab4240f1d9a0bec406c789d2264c5fa953faad82acafbaf764b7e5d6cf4788-a deleted file mode 100644 index 7f78bcb..0000000 --- a/.cache/go-build/ce/ceab4240f1d9a0bec406c789d2264c5fa953faad82acafbaf764b7e5d6cf4788-a +++ /dev/null @@ -1 +0,0 @@ -v1 ceab4240f1d9a0bec406c789d2264c5fa953faad82acafbaf764b7e5d6cf4788 63742bc10f0999cdcabcf76eabe626823523eab67b201ac564c97194bbb9f5e8 123982 1775136287057848044 diff --git a/.cache/go-build/ce/ceeeb99f99bbef4f3cc331b8d67030765c4bad3d11a65e4d0c692a8071c330dd-a b/.cache/go-build/ce/ceeeb99f99bbef4f3cc331b8d67030765c4bad3d11a65e4d0c692a8071c330dd-a deleted file mode 100644 index 4661a87..0000000 --- a/.cache/go-build/ce/ceeeb99f99bbef4f3cc331b8d67030765c4bad3d11a65e4d0c692a8071c330dd-a +++ /dev/null @@ -1 +0,0 @@ -v1 ceeeb99f99bbef4f3cc331b8d67030765c4bad3d11a65e4d0c692a8071c330dd 285a978d88032ef0dc8b9b30cae432127273a838c411ca473e46c94c8b9cb392 21 1775136288463678199 diff --git a/.cache/go-build/cf/cf15b1b1b62920e2d2a58d8b2a9a4db08204d3d4bb7fa8c9ff4e617ff188286c-d b/.cache/go-build/cf/cf15b1b1b62920e2d2a58d8b2a9a4db08204d3d4bb7fa8c9ff4e617ff188286c-d deleted file mode 100644 index 0f2d2b3..0000000 Binary files a/.cache/go-build/cf/cf15b1b1b62920e2d2a58d8b2a9a4db08204d3d4bb7fa8c9ff4e617ff188286c-d and /dev/null differ diff --git a/.cache/go-build/cf/cf65e482407ca791f63580f03b6c6d5e1fba81d730b6fd7baaef14ee4a7f804f-a b/.cache/go-build/cf/cf65e482407ca791f63580f03b6c6d5e1fba81d730b6fd7baaef14ee4a7f804f-a deleted file mode 100644 index ca965c7..0000000 --- a/.cache/go-build/cf/cf65e482407ca791f63580f03b6c6d5e1fba81d730b6fd7baaef14ee4a7f804f-a +++ /dev/null @@ -1 +0,0 @@ -v1 cf65e482407ca791f63580f03b6c6d5e1fba81d730b6fd7baaef14ee4a7f804f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398434301792 diff --git a/.cache/go-build/d0/d0774ec975e76809d21ad8740785e9fce673e8b845416d96cddb528a3876288b-a b/.cache/go-build/d0/d0774ec975e76809d21ad8740785e9fce673e8b845416d96cddb528a3876288b-a deleted file mode 100644 index 3208a90..0000000 --- a/.cache/go-build/d0/d0774ec975e76809d21ad8740785e9fce673e8b845416d96cddb528a3876288b-a +++ /dev/null @@ -1 +0,0 @@ -v1 d0774ec975e76809d21ad8740785e9fce673e8b845416d96cddb528a3876288b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289472048540 diff --git a/.cache/go-build/d0/d0aae7c63c0f629645442578da902a58986aba21cdc55b5a75160f7e65d62220-d b/.cache/go-build/d0/d0aae7c63c0f629645442578da902a58986aba21cdc55b5a75160f7e65d62220-d deleted file mode 100644 index 2a9ceec..0000000 --- a/.cache/go-build/d0/d0aae7c63c0f629645442578da902a58986aba21cdc55b5a75160f7e65d62220-d +++ /dev/null @@ -1,45 +0,0 @@ -./dir.go -./dir_unix.go -./dirent_linux.go -./eloop_other.go -./env.go -./error.go -./error_errno.go -./exec.go -./exec_linux.go -./exec_posix.go -./exec_unix.go -./executable.go -./executable_procfs.go -./file.go -./file_open_unix.go -./file_posix.go -./file_unix.go -./getwd.go -./path.go -./path_unix.go -./pidfd_linux.go -./pipe2_unix.go -./proc.go -./rawconn.go -./removeall_at.go -./removeall_unix.go -./root.go -./root_nonwindows.go -./root_openat.go -./root_unix.go -./stat.go -./stat_linux.go -./stat_unix.go -./statat.go -./statat_unix.go -./sticky_notbsd.go -./sys.go -./sys_linux.go -./sys_unix.go -./tempfile.go -./types.go -./types_unix.go -./wait_waitid.go -./zero_copy_linux.go -./zero_copy_posix.go diff --git a/.cache/go-build/d0/d0fdbd6ded9478f15156d3d4999a23b5d218143dd061ed9b675a8cbd43c2575b-a b/.cache/go-build/d0/d0fdbd6ded9478f15156d3d4999a23b5d218143dd061ed9b675a8cbd43c2575b-a deleted file mode 100644 index 420b24d..0000000 --- a/.cache/go-build/d0/d0fdbd6ded9478f15156d3d4999a23b5d218143dd061ed9b675a8cbd43c2575b-a +++ /dev/null @@ -1 +0,0 @@ -v1 d0fdbd6ded9478f15156d3d4999a23b5d218143dd061ed9b675a8cbd43c2575b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287015473633 diff --git a/.cache/go-build/d1/d1463834d14211f70b2f0382100cfa3aab115f4e663057d7add5742fbf75ae5f-d b/.cache/go-build/d1/d1463834d14211f70b2f0382100cfa3aab115f4e663057d7add5742fbf75ae5f-d deleted file mode 100644 index 0731a99..0000000 Binary files a/.cache/go-build/d1/d1463834d14211f70b2f0382100cfa3aab115f4e663057d7add5742fbf75ae5f-d and /dev/null differ diff --git a/.cache/go-build/d1/d170c02cc3412cbcb241fcb2745c74381b2b1b3768ca8d939e5ff535f1ebf79f-d b/.cache/go-build/d1/d170c02cc3412cbcb241fcb2745c74381b2b1b3768ca8d939e5ff535f1ebf79f-d deleted file mode 100644 index 84ac3dd..0000000 Binary files a/.cache/go-build/d1/d170c02cc3412cbcb241fcb2745c74381b2b1b3768ca8d939e5ff535f1ebf79f-d and /dev/null differ diff --git a/.cache/go-build/d1/d1cdc1162be66fc911abeb09958df53f0080788ff425ad4991173fcdae82ab46-a b/.cache/go-build/d1/d1cdc1162be66fc911abeb09958df53f0080788ff425ad4991173fcdae82ab46-a deleted file mode 100644 index 4126d59..0000000 --- a/.cache/go-build/d1/d1cdc1162be66fc911abeb09958df53f0080788ff425ad4991173fcdae82ab46-a +++ /dev/null @@ -1 +0,0 @@ -v1 d1cdc1162be66fc911abeb09958df53f0080788ff425ad4991173fcdae82ab46 7ae18ea94f3e95819fcc276dc25488115bb3a5e91a55981df72e7c3aea6e2c04 648622 1775136289836525151 diff --git a/.cache/go-build/d3/d371bfb1a23b70e152633195bdc3e82f5442ce3e642ba4c3f3d789ee09043982-a b/.cache/go-build/d3/d371bfb1a23b70e152633195bdc3e82f5442ce3e642ba4c3f3d789ee09043982-a deleted file mode 100644 index 96d5a39..0000000 --- a/.cache/go-build/d3/d371bfb1a23b70e152633195bdc3e82f5442ce3e642ba4c3f3d789ee09043982-a +++ /dev/null @@ -1 +0,0 @@ -v1 d371bfb1a23b70e152633195bdc3e82f5442ce3e642ba4c3f3d789ee09043982 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721933213156 diff --git a/.cache/go-build/d3/d3d1f7b0512e530498bd5b7d553c54acdf0ae7ee55145c830afffc4f7e09e220-a b/.cache/go-build/d3/d3d1f7b0512e530498bd5b7d553c54acdf0ae7ee55145c830afffc4f7e09e220-a deleted file mode 100644 index fb3a1c7..0000000 --- a/.cache/go-build/d3/d3d1f7b0512e530498bd5b7d553c54acdf0ae7ee55145c830afffc4f7e09e220-a +++ /dev/null @@ -1 +0,0 @@ -v1 d3d1f7b0512e530498bd5b7d553c54acdf0ae7ee55145c830afffc4f7e09e220 1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b 11 1775136290022236654 diff --git a/.cache/go-build/d3/d3dee2d5adcf0b09c09b63820baefcf11dd0e1b66f56943c4a6d2d26737de9da-a b/.cache/go-build/d3/d3dee2d5adcf0b09c09b63820baefcf11dd0e1b66f56943c4a6d2d26737de9da-a deleted file mode 100644 index 3455f01..0000000 --- a/.cache/go-build/d3/d3dee2d5adcf0b09c09b63820baefcf11dd0e1b66f56943c4a6d2d26737de9da-a +++ /dev/null @@ -1 +0,0 @@ -v1 d3dee2d5adcf0b09c09b63820baefcf11dd0e1b66f56943c4a6d2d26737de9da 5c69486cc122dc547e55feed0a06ed91655af40f6e92a6029669f9c147dc33fb 44638 1775139428914067593 diff --git a/.cache/go-build/d3/d3e102e9a06f43e706383fa308b506818cfd4feb10a82347ca5714a9bc75f52a-a b/.cache/go-build/d3/d3e102e9a06f43e706383fa308b506818cfd4feb10a82347ca5714a9bc75f52a-a deleted file mode 100644 index 8e1a654..0000000 --- a/.cache/go-build/d3/d3e102e9a06f43e706383fa308b506818cfd4feb10a82347ca5714a9bc75f52a-a +++ /dev/null @@ -1 +0,0 @@ -v1 d3e102e9a06f43e706383fa308b506818cfd4feb10a82347ca5714a9bc75f52a 2c43fca548905a6aeb8cf20d857bd5f20da859dcfbeff364f4f6bd5dc180b01d 1306864 1775136289721326939 diff --git a/.cache/go-build/d3/d3f21047470b949bde25adaa11dec4f8bb3dad35cf0efe10be000340862891cb-d b/.cache/go-build/d3/d3f21047470b949bde25adaa11dec4f8bb3dad35cf0efe10be000340862891cb-d deleted file mode 100644 index 0eb117e..0000000 --- a/.cache/go-build/d3/d3f21047470b949bde25adaa11dec4f8bb3dad35cf0efe10be000340862891cb-d +++ /dev/null @@ -1,8 +0,0 @@ -./decode.go -./encode.go -./fold.go -./indent.go -./scanner.go -./stream.go -./tables.go -./tags.go diff --git a/.cache/go-build/d4/d40e3d104d81d256c7a33c0feecdb2e57e6835346cef267147d73ebb97feff95-d b/.cache/go-build/d4/d40e3d104d81d256c7a33c0feecdb2e57e6835346cef267147d73ebb97feff95-d deleted file mode 100644 index 89a3005..0000000 Binary files a/.cache/go-build/d4/d40e3d104d81d256c7a33c0feecdb2e57e6835346cef267147d73ebb97feff95-d and /dev/null differ diff --git a/.cache/go-build/d4/d425e4902fc6ae67c8b8067de617db16592e966d39c41396b025988dd365fb42-a b/.cache/go-build/d4/d425e4902fc6ae67c8b8067de617db16592e966d39c41396b025988dd365fb42-a deleted file mode 100644 index 9adf037..0000000 --- a/.cache/go-build/d4/d425e4902fc6ae67c8b8067de617db16592e966d39c41396b025988dd365fb42-a +++ /dev/null @@ -1 +0,0 @@ -v1 d425e4902fc6ae67c8b8067de617db16592e966d39c41396b025988dd365fb42 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722014742804 diff --git a/.cache/go-build/d4/d4464508a691a9308d7797ba6b6349840a73c5d0b41ae2b0a73a416f53a577ac-d b/.cache/go-build/d4/d4464508a691a9308d7797ba6b6349840a73c5d0b41ae2b0a73a416f53a577ac-d deleted file mode 100644 index c4a0263..0000000 Binary files a/.cache/go-build/d4/d4464508a691a9308d7797ba6b6349840a73c5d0b41ae2b0a73a416f53a577ac-d and /dev/null differ diff --git a/.cache/go-build/d4/d472c10032e185507ac1a7d04aa83db5caec9cd2d3fa00849bb173198a56329a-d b/.cache/go-build/d4/d472c10032e185507ac1a7d04aa83db5caec9cd2d3fa00849bb173198a56329a-d deleted file mode 100644 index 9b3ba8b..0000000 Binary files a/.cache/go-build/d4/d472c10032e185507ac1a7d04aa83db5caec9cd2d3fa00849bb173198a56329a-d and /dev/null differ diff --git a/.cache/go-build/d4/d474debdebcef9f3d16ac7bb9c45eba2d9bcd9ab9b481c45b5df23141e94f997-d b/.cache/go-build/d4/d474debdebcef9f3d16ac7bb9c45eba2d9bcd9ab9b481c45b5df23141e94f997-d deleted file mode 100644 index f24be0e..0000000 Binary files a/.cache/go-build/d4/d474debdebcef9f3d16ac7bb9c45eba2d9bcd9ab9b481c45b5df23141e94f997-d and /dev/null differ diff --git a/.cache/go-build/d4/d478ea15ed27092424791860d6e6f594e2ec4defee82fee2200498367d31a8e2-a b/.cache/go-build/d4/d478ea15ed27092424791860d6e6f594e2ec4defee82fee2200498367d31a8e2-a deleted file mode 100644 index 8e89f40..0000000 --- a/.cache/go-build/d4/d478ea15ed27092424791860d6e6f594e2ec4defee82fee2200498367d31a8e2-a +++ /dev/null @@ -1 +0,0 @@ -v1 d478ea15ed27092424791860d6e6f594e2ec4defee82fee2200498367d31a8e2 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287088194485 diff --git a/.cache/go-build/d4/d47ccfacc062b42e8b03193979e49426375fbbdaf4b83040245ad15bc0b13840-a b/.cache/go-build/d4/d47ccfacc062b42e8b03193979e49426375fbbdaf4b83040245ad15bc0b13840-a deleted file mode 100644 index 3982a33..0000000 --- a/.cache/go-build/d4/d47ccfacc062b42e8b03193979e49426375fbbdaf4b83040245ad15bc0b13840-a +++ /dev/null @@ -1 +0,0 @@ -v1 d47ccfacc062b42e8b03193979e49426375fbbdaf4b83040245ad15bc0b13840 b01a5dbb90a7da0a59b39f3442bbba455cd182ff509ecdf8e2475f6135376acc 180 1775136289841137154 diff --git a/.cache/go-build/d5/d52738ae91f0ddd49dffc0c076ef65f0125b13ce56ee8082e03076888f2d247d-a b/.cache/go-build/d5/d52738ae91f0ddd49dffc0c076ef65f0125b13ce56ee8082e03076888f2d247d-a deleted file mode 100644 index d64eac1..0000000 --- a/.cache/go-build/d5/d52738ae91f0ddd49dffc0c076ef65f0125b13ce56ee8082e03076888f2d247d-a +++ /dev/null @@ -1 +0,0 @@ -v1 d52738ae91f0ddd49dffc0c076ef65f0125b13ce56ee8082e03076888f2d247d 48dcffd6203ee541a43fb13c5d947b744abd96043f264561e19caefe279967a8 11 1775136286947885685 diff --git a/.cache/go-build/d5/d595f068d1fcc6e1ac2f09abedfb61aac667a05b891c65787ccdd6aafb27ba13-d b/.cache/go-build/d5/d595f068d1fcc6e1ac2f09abedfb61aac667a05b891c65787ccdd6aafb27ba13-d deleted file mode 100644 index 5861884..0000000 Binary files a/.cache/go-build/d5/d595f068d1fcc6e1ac2f09abedfb61aac667a05b891c65787ccdd6aafb27ba13-d and /dev/null differ diff --git a/.cache/go-build/d5/d598ec9e24131c0f40710e68a2e35fd7728483cfcde5b4937381fee351088047-a b/.cache/go-build/d5/d598ec9e24131c0f40710e68a2e35fd7728483cfcde5b4937381fee351088047-a deleted file mode 100644 index ef1606b..0000000 --- a/.cache/go-build/d5/d598ec9e24131c0f40710e68a2e35fd7728483cfcde5b4937381fee351088047-a +++ /dev/null @@ -1 +0,0 @@ -v1 d598ec9e24131c0f40710e68a2e35fd7728483cfcde5b4937381fee351088047 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289028085993 diff --git a/.cache/go-build/d5/d5ab4266d0ffcdddd60ae7f69adbca0b12ea85d9d054bea41e534f3f4634f4e5-d b/.cache/go-build/d5/d5ab4266d0ffcdddd60ae7f69adbca0b12ea85d9d054bea41e534f3f4634f4e5-d deleted file mode 100644 index e1f23f4..0000000 --- a/.cache/go-build/d5/d5ab4266d0ffcdddd60ae7f69adbca0b12ea85d9d054bea41e534f3f4634f4e5-d +++ /dev/null @@ -1,3 +0,0 @@ -./path.go -./path_nonwindows.go -./path_unix.go diff --git a/.cache/go-build/d6/d60fb3db65f6a8d7cb5b5bfff0d13579f1adafe07770b479d5327f17d4237402-a b/.cache/go-build/d6/d60fb3db65f6a8d7cb5b5bfff0d13579f1adafe07770b479d5327f17d4237402-a deleted file mode 100644 index 272aae9..0000000 --- a/.cache/go-build/d6/d60fb3db65f6a8d7cb5b5bfff0d13579f1adafe07770b479d5327f17d4237402-a +++ /dev/null @@ -1 +0,0 @@ -v1 d60fb3db65f6a8d7cb5b5bfff0d13579f1adafe07770b479d5327f17d4237402 cba4532f921fa47d7a54b5655e8ae469dd3985f1f949dab504125c0b422313c1 851192 1775136288815730771 diff --git a/.cache/go-build/d6/d626a4dedb2b95887ce45502cbd052e0868f66ad081ad2fd663372f9c99c0b39-a b/.cache/go-build/d6/d626a4dedb2b95887ce45502cbd052e0868f66ad081ad2fd663372f9c99c0b39-a deleted file mode 100644 index 13341b0..0000000 --- a/.cache/go-build/d6/d626a4dedb2b95887ce45502cbd052e0868f66ad081ad2fd663372f9c99c0b39-a +++ /dev/null @@ -1 +0,0 @@ -v1 d626a4dedb2b95887ce45502cbd052e0868f66ad081ad2fd663372f9c99c0b39 0ce1b1d60f8a08833d55ed93fc8ee8fb07397702e6958b03f6f4ba7b55cc006d 11 1775136286917717843 diff --git a/.cache/go-build/d6/d668fde90f6ae6f08c40745e04f6d5371118ef357247726a412627e04559f442-a b/.cache/go-build/d6/d668fde90f6ae6f08c40745e04f6d5371118ef357247726a412627e04559f442-a deleted file mode 100644 index 10cb2aa..0000000 --- a/.cache/go-build/d6/d668fde90f6ae6f08c40745e04f6d5371118ef357247726a412627e04559f442-a +++ /dev/null @@ -1 +0,0 @@ -v1 d668fde90f6ae6f08c40745e04f6d5371118ef357247726a412627e04559f442 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289125056312 diff --git a/.cache/go-build/d7/d757cae01a00cf142635ee1babfd2bb0ee1b943662765db2b6fd64eeacc71a19-d b/.cache/go-build/d7/d757cae01a00cf142635ee1babfd2bb0ee1b943662765db2b6fd64eeacc71a19-d deleted file mode 100644 index 3d6cff7..0000000 Binary files a/.cache/go-build/d7/d757cae01a00cf142635ee1babfd2bb0ee1b943662765db2b6fd64eeacc71a19-d and /dev/null differ diff --git a/.cache/go-build/d7/d76d0392b418f17cd36f2c00c93e7f700e424f42a21df43a805d316c1fbf915d-a b/.cache/go-build/d7/d76d0392b418f17cd36f2c00c93e7f700e424f42a21df43a805d316c1fbf915d-a deleted file mode 100644 index 4084b02..0000000 --- a/.cache/go-build/d7/d76d0392b418f17cd36f2c00c93e7f700e424f42a21df43a805d316c1fbf915d-a +++ /dev/null @@ -1 +0,0 @@ -v1 d76d0392b418f17cd36f2c00c93e7f700e424f42a21df43a805d316c1fbf915d 9cb9480b1cc8282da65b00bc7fdf4413b83748d4bea6c2856c08dab73989b927 500 1775136286818542533 diff --git a/.cache/go-build/d7/d775f92331e6e5fcc00690f8a03eb433cbd5a3f8f9b90253360221c10018268d-a b/.cache/go-build/d7/d775f92331e6e5fcc00690f8a03eb433cbd5a3f8f9b90253360221c10018268d-a deleted file mode 100644 index 080d874..0000000 --- a/.cache/go-build/d7/d775f92331e6e5fcc00690f8a03eb433cbd5a3f8f9b90253360221c10018268d-a +++ /dev/null @@ -1 +0,0 @@ -v1 d775f92331e6e5fcc00690f8a03eb433cbd5a3f8f9b90253360221c10018268d e66415b97dc122c91b6c4dffdd8daa3e11a7cd992ed90c5c074777b44fa43915 55 1775136287052882510 diff --git a/.cache/go-build/d7/d78ab6dd1d929f5d28a5fd753e5f37176695bd424d5fbdb169334657c8fde789-d b/.cache/go-build/d7/d78ab6dd1d929f5d28a5fd753e5f37176695bd424d5fbdb169334657c8fde789-d deleted file mode 100644 index 49ded8f..0000000 --- a/.cache/go-build/d7/d78ab6dd1d929f5d28a5fd753e5f37176695bd424d5fbdb169334657c8fde789-d +++ /dev/null @@ -1,8 +0,0 @@ -./group.go -./map.go -./runtime.go -./runtime_fast32.go -./runtime_fast64.go -./runtime_faststr.go -./table.go -./table_debug.go diff --git a/.cache/go-build/d7/d78fc870752a5d80dd97aa8430c736a217613d2fcd5732043525238474f25ace-d b/.cache/go-build/d7/d78fc870752a5d80dd97aa8430c736a217613d2fcd5732043525238474f25ace-d deleted file mode 100644 index 86a5286..0000000 --- a/.cache/go-build/d7/d78fc870752a5d80dd97aa8430c736a217613d2fcd5732043525238474f25ace-d +++ /dev/null @@ -1,5 +0,0 @@ -./apply_manifest.go -./build.go -./compare.go -./extract.go -./pipeline_test.go diff --git a/.cache/go-build/d8/d8483e959c86807a51b25d3f282c0fe7e45f5ee1911835952480d17929f6d53f-a b/.cache/go-build/d8/d8483e959c86807a51b25d3f282c0fe7e45f5ee1911835952480d17929f6d53f-a deleted file mode 100644 index f776703..0000000 --- a/.cache/go-build/d8/d8483e959c86807a51b25d3f282c0fe7e45f5ee1911835952480d17929f6d53f-a +++ /dev/null @@ -1 +0,0 @@ -v1 d8483e959c86807a51b25d3f282c0fe7e45f5ee1911835952480d17929f6d53f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289019598287 diff --git a/.cache/go-build/d8/d85af71017f050c852c87c6541bd778cc363b542f39562516ec20a9218b92e75-d b/.cache/go-build/d8/d85af71017f050c852c87c6541bd778cc363b542f39562516ec20a9218b92e75-d deleted file mode 100644 index 079ceec..0000000 --- a/.cache/go-build/d8/d85af71017f050c852c87c6541bd778cc363b542f39562516ec20a9218b92e75-d +++ /dev/null @@ -1,4 +0,0 @@ -./buffer.go -./bytes.go -./iter.go -./reader.go diff --git a/.cache/go-build/d8/d86f844f7b0a7b1f4a911661094ea18afa46033f8453c4f28b2cd4b0e758b8e6-a b/.cache/go-build/d8/d86f844f7b0a7b1f4a911661094ea18afa46033f8453c4f28b2cd4b0e758b8e6-a deleted file mode 100644 index cdbfc03..0000000 --- a/.cache/go-build/d8/d86f844f7b0a7b1f4a911661094ea18afa46033f8453c4f28b2cd4b0e758b8e6-a +++ /dev/null @@ -1 +0,0 @@ -v1 d86f844f7b0a7b1f4a911661094ea18afa46033f8453c4f28b2cd4b0e758b8e6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287188085867 diff --git a/.cache/go-build/d9/d92346d7c0927cf6988fc012a78e8866730430022bdcbb0451a91faebf8b116a-a b/.cache/go-build/d9/d92346d7c0927cf6988fc012a78e8866730430022bdcbb0451a91faebf8b116a-a deleted file mode 100644 index 7f3068a..0000000 --- a/.cache/go-build/d9/d92346d7c0927cf6988fc012a78e8866730430022bdcbb0451a91faebf8b116a-a +++ /dev/null @@ -1 +0,0 @@ -v1 d92346d7c0927cf6988fc012a78e8866730430022bdcbb0451a91faebf8b116a 7a5357958e3da7a0a403dbb914db6f2064743e6fbafee85ec8435d6e94f85ddd 64572 1775136288780401466 diff --git a/.cache/go-build/d9/d92b8f9d18c2bfb5180957f59bb1da803ee1ff2363c488cdb5e9f94dd9010ec9-a b/.cache/go-build/d9/d92b8f9d18c2bfb5180957f59bb1da803ee1ff2363c488cdb5e9f94dd9010ec9-a deleted file mode 100644 index 3359e83..0000000 --- a/.cache/go-build/d9/d92b8f9d18c2bfb5180957f59bb1da803ee1ff2363c488cdb5e9f94dd9010ec9-a +++ /dev/null @@ -1 +0,0 @@ -v1 d92b8f9d18c2bfb5180957f59bb1da803ee1ff2363c488cdb5e9f94dd9010ec9 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184139644621 diff --git a/.cache/go-build/d9/d93352206bc92124f0d9f2ac5dfe24548e892159a5074413a733b962c5432dc9-d b/.cache/go-build/d9/d93352206bc92124f0d9f2ac5dfe24548e892159a5074413a733b962c5432dc9-d deleted file mode 100644 index 975507b..0000000 --- a/.cache/go-build/d9/d93352206bc92124f0d9f2ac5dfe24548e892159a5074413a733b962c5432dc9-d +++ /dev/null @@ -1 +0,0 @@ -./bisect.go diff --git a/.cache/go-build/d9/d95a51e322d6bdcefa96973449983b0e740c3d1ba4b5b0cccffefa1fb549981f-a b/.cache/go-build/d9/d95a51e322d6bdcefa96973449983b0e740c3d1ba4b5b0cccffefa1fb549981f-a deleted file mode 100644 index 8126922..0000000 --- a/.cache/go-build/d9/d95a51e322d6bdcefa96973449983b0e740c3d1ba4b5b0cccffefa1fb549981f-a +++ /dev/null @@ -1 +0,0 @@ -v1 d95a51e322d6bdcefa96973449983b0e740c3d1ba4b5b0cccffefa1fb549981f 111733fd5e75a9e33c6305a02a8024690e038f13226e83835a4efa14cb4aae9d 1425 1775136286830516631 diff --git a/.cache/go-build/d9/d98e5ede9c59198f052240a2ee3d0e800cf6e4d524398a5cfc1866c2cbbb5131-a b/.cache/go-build/d9/d98e5ede9c59198f052240a2ee3d0e800cf6e4d524398a5cfc1866c2cbbb5131-a deleted file mode 100644 index e031126..0000000 --- a/.cache/go-build/d9/d98e5ede9c59198f052240a2ee3d0e800cf6e4d524398a5cfc1866c2cbbb5131-a +++ /dev/null @@ -1 +0,0 @@ -v1 d98e5ede9c59198f052240a2ee3d0e800cf6e4d524398a5cfc1866c2cbbb5131 0af6c119dfb70f4f8fc24e429bb217263807553cf540a0ca1e836aed3d89bccd 9 1775137722002865336 diff --git a/.cache/go-build/d9/d995bb976462b547343ffa24e02da064943faa811f2ca02ebb7ee6453111ecc3-d b/.cache/go-build/d9/d995bb976462b547343ffa24e02da064943faa811f2ca02ebb7ee6453111ecc3-d deleted file mode 100644 index cab0d8b..0000000 Binary files a/.cache/go-build/d9/d995bb976462b547343ffa24e02da064943faa811f2ca02ebb7ee6453111ecc3-d and /dev/null differ diff --git a/.cache/go-build/d9/d9964a21892dfecddc4937ce57c9ce451204eb2ff0d79d72c2508d8ef7e66667-a b/.cache/go-build/d9/d9964a21892dfecddc4937ce57c9ce451204eb2ff0d79d72c2508d8ef7e66667-a deleted file mode 100644 index bacd3ec..0000000 --- a/.cache/go-build/d9/d9964a21892dfecddc4937ce57c9ce451204eb2ff0d79d72c2508d8ef7e66667-a +++ /dev/null @@ -1 +0,0 @@ -v1 d9964a21892dfecddc4937ce57c9ce451204eb2ff0d79d72c2508d8ef7e66667 7a469d317b138c22f6e66b17d222ed7f26968294a503ca97aef81a8f92571f84 213 1775136287159280686 diff --git a/.cache/go-build/da/da0d156fc663edd13baca8c0dbf17c7c7932fb6c8439ac492761fb59498813c5-a b/.cache/go-build/da/da0d156fc663edd13baca8c0dbf17c7c7932fb6c8439ac492761fb59498813c5-a deleted file mode 100644 index 529b4cb..0000000 --- a/.cache/go-build/da/da0d156fc663edd13baca8c0dbf17c7c7932fb6c8439ac492761fb59498813c5-a +++ /dev/null @@ -1 +0,0 @@ -v1 da0d156fc663edd13baca8c0dbf17c7c7932fb6c8439ac492761fb59498813c5 4b40aa732601fec64980e4d56ee1ad507352a3d1ec27d413a994eb9b723e5b19 87530 1775136288459957377 diff --git a/.cache/go-build/da/da29439238f2810ed792501fd73f9b595ac2529eca893898e3d0cf1487f36021-a b/.cache/go-build/da/da29439238f2810ed792501fd73f9b595ac2529eca893898e3d0cf1487f36021-a deleted file mode 100644 index 479d261..0000000 --- a/.cache/go-build/da/da29439238f2810ed792501fd73f9b595ac2529eca893898e3d0cf1487f36021-a +++ /dev/null @@ -1 +0,0 @@ -v1 da29439238f2810ed792501fd73f9b595ac2529eca893898e3d0cf1487f36021 cce0e009805ed1f94414189c831c647022ca67cee3e3943f5f7b2a3f3a82b9cd 125450 1775136287143428575 diff --git a/.cache/go-build/da/da4c55cb7495d9867f34f52dff3b892c5663f0ad6d49aad1f9b898f33d00512a-a b/.cache/go-build/da/da4c55cb7495d9867f34f52dff3b892c5663f0ad6d49aad1f9b898f33d00512a-a deleted file mode 100644 index d821b19..0000000 --- a/.cache/go-build/da/da4c55cb7495d9867f34f52dff3b892c5663f0ad6d49aad1f9b898f33d00512a-a +++ /dev/null @@ -1 +0,0 @@ -v1 da4c55cb7495d9867f34f52dff3b892c5663f0ad6d49aad1f9b898f33d00512a b4b9e85a3d1ed538a7867e9f55522611dded988fd413f1923511c5befc91354f 161 1775136286965209747 diff --git a/.cache/go-build/da/da64fe53d48ed17bb4d202d57ca4e67fecb94d9ac9875f28a25dcf12bde92f1b-a b/.cache/go-build/da/da64fe53d48ed17bb4d202d57ca4e67fecb94d9ac9875f28a25dcf12bde92f1b-a deleted file mode 100644 index bb13a1e..0000000 --- a/.cache/go-build/da/da64fe53d48ed17bb4d202d57ca4e67fecb94d9ac9875f28a25dcf12bde92f1b-a +++ /dev/null @@ -1 +0,0 @@ -v1 da64fe53d48ed17bb4d202d57ca4e67fecb94d9ac9875f28a25dcf12bde92f1b 7a1c44a11969b2cde317a86d8fd7d7c53d1a5e460fc5c40662561c747e816144 11 1775136286917965064 diff --git a/.cache/go-build/da/da863cf9c8e3790f897a86e46520e26dda1496e4ba3a6cae8dd22df2caadaa3b-d b/.cache/go-build/da/da863cf9c8e3790f897a86e46520e26dda1496e4ba3a6cae8dd22df2caadaa3b-d deleted file mode 100644 index 3c7d575..0000000 Binary files a/.cache/go-build/da/da863cf9c8e3790f897a86e46520e26dda1496e4ba3a6cae8dd22df2caadaa3b-d and /dev/null differ diff --git a/.cache/go-build/da/da877bc5eca127feabab5b836fcac5d8f1c369395aaeab9ceaf06933a0f0d31f-d b/.cache/go-build/da/da877bc5eca127feabab5b836fcac5d8f1c369395aaeab9ceaf06933a0f0d31f-d deleted file mode 100644 index 4c3c558..0000000 Binary files a/.cache/go-build/da/da877bc5eca127feabab5b836fcac5d8f1c369395aaeab9ceaf06933a0f0d31f-d and /dev/null differ diff --git a/.cache/go-build/da/da958b7052422eaa9220f371892d0bcc06f2f188d921cb35bc5a67ea3dd89fea-a b/.cache/go-build/da/da958b7052422eaa9220f371892d0bcc06f2f188d921cb35bc5a67ea3dd89fea-a deleted file mode 100644 index 92d3fad..0000000 --- a/.cache/go-build/da/da958b7052422eaa9220f371892d0bcc06f2f188d921cb35bc5a67ea3dd89fea-a +++ /dev/null @@ -1 +0,0 @@ -v1 da958b7052422eaa9220f371892d0bcc06f2f188d921cb35bc5a67ea3dd89fea 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775136290027234618 diff --git a/.cache/go-build/da/dadb87ccbafc685c7e8ec7c0ba2ff84dd8691414dd5bff5b0cbd93d3a3758912-a b/.cache/go-build/da/dadb87ccbafc685c7e8ec7c0ba2ff84dd8691414dd5bff5b0cbd93d3a3758912-a deleted file mode 100644 index 79acfb6..0000000 --- a/.cache/go-build/da/dadb87ccbafc685c7e8ec7c0ba2ff84dd8691414dd5bff5b0cbd93d3a3758912-a +++ /dev/null @@ -1 +0,0 @@ -v1 dadb87ccbafc685c7e8ec7c0ba2ff84dd8691414dd5bff5b0cbd93d3a3758912 cb5536386df3278d9911a9dbb2588721792e3a290ea64219bbff63f0aa1e4208 19238 1775136286934181555 diff --git a/.cache/go-build/db/db08b6b92a82b49d2f27b7c7c3c05500c9181adbf0d0dab9b589a7466ce8e339-d b/.cache/go-build/db/db08b6b92a82b49d2f27b7c7c3c05500c9181adbf0d0dab9b589a7466ce8e339-d deleted file mode 100644 index 8478bd7..0000000 --- a/.cache/go-build/db/db08b6b92a82b49d2f27b7c7c3c05500c9181adbf0d0dab9b589a7466ce8e339-d +++ /dev/null @@ -1,28 +0,0 @@ -./badlinkname_unix.go -./dirent.go -./env_unix.go -./exec_linux.go -./exec_unix.go -./flock_linux.go -./forkpipe2.go -./linkname_unix.go -./lsf_linux.go -./net.go -./netlink_linux.go -./rlimit.go -./rlimit_stub.go -./setuidgid_linux.go -./sockcmsg_linux.go -./sockcmsg_unix.go -./sockcmsg_unix_other.go -./syscall.go -./syscall_linux.go -./syscall_linux_amd64.go -./syscall_unix.go -./time_nofake.go -./timestruct.go -./zerrors_linux_amd64.go -./zsyscall_linux_amd64.go -./zsysnum_linux_amd64.go -./ztypes_linux_amd64.go -./asm_linux_amd64.s diff --git a/.cache/go-build/db/db8500456ac08aab7a426968876c659035271849411caafa32f64399699b0611-a b/.cache/go-build/db/db8500456ac08aab7a426968876c659035271849411caafa32f64399699b0611-a deleted file mode 100644 index a3fb1e8..0000000 --- a/.cache/go-build/db/db8500456ac08aab7a426968876c659035271849411caafa32f64399699b0611-a +++ /dev/null @@ -1 +0,0 @@ -v1 db8500456ac08aab7a426968876c659035271849411caafa32f64399699b0611 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287018543036 diff --git a/.cache/go-build/db/dbbcc24ea5edea3eeda03e63c9c048304976def917561c313ae23253a53f0bc4-a b/.cache/go-build/db/dbbcc24ea5edea3eeda03e63c9c048304976def917561c313ae23253a53f0bc4-a deleted file mode 100644 index 6aabd80..0000000 --- a/.cache/go-build/db/dbbcc24ea5edea3eeda03e63c9c048304976def917561c313ae23253a53f0bc4-a +++ /dev/null @@ -1 +0,0 @@ -v1 dbbcc24ea5edea3eeda03e63c9c048304976def917561c313ae23253a53f0bc4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184093119218 diff --git a/.cache/go-build/dc/dc269ecd7e558bd8b82be15392ec40318591e43e96fff88cf45adcb1724958ac-a b/.cache/go-build/dc/dc269ecd7e558bd8b82be15392ec40318591e43e96fff88cf45adcb1724958ac-a deleted file mode 100644 index be2fd3e..0000000 --- a/.cache/go-build/dc/dc269ecd7e558bd8b82be15392ec40318591e43e96fff88cf45adcb1724958ac-a +++ /dev/null @@ -1 +0,0 @@ -v1 dc269ecd7e558bd8b82be15392ec40318591e43e96fff88cf45adcb1724958ac 3a65a42dab5faacb13b5f0ff7546fd2cc1b8fc4958221f17180a40eb2aafce1a 25 1775136289486899831 diff --git a/.cache/go-build/dc/dccdda030c17bb2ded37f9c1f274bcb3f0faee527af700fb3688e02761ee7602-a b/.cache/go-build/dc/dccdda030c17bb2ded37f9c1f274bcb3f0faee527af700fb3688e02761ee7602-a deleted file mode 100644 index f21cdc3..0000000 --- a/.cache/go-build/dc/dccdda030c17bb2ded37f9c1f274bcb3f0faee527af700fb3688e02761ee7602-a +++ /dev/null @@ -1 +0,0 @@ -v1 dccdda030c17bb2ded37f9c1f274bcb3f0faee527af700fb3688e02761ee7602 b0b2f7fd4670f9a771c8fd6614afe4032f84c4d96d7a49bacf812590d3f94220 327 1775136286910140408 diff --git a/.cache/go-build/dc/dce87f01aba0c1e6a98f7be6d4a7c1c2449f6daf937cd85bc8109939b3e86bdb-a b/.cache/go-build/dc/dce87f01aba0c1e6a98f7be6d4a7c1c2449f6daf937cd85bc8109939b3e86bdb-a deleted file mode 100644 index af11bce..0000000 --- a/.cache/go-build/dc/dce87f01aba0c1e6a98f7be6d4a7c1c2449f6daf937cd85bc8109939b3e86bdb-a +++ /dev/null @@ -1 +0,0 @@ -v1 dce87f01aba0c1e6a98f7be6d4a7c1c2449f6daf937cd85bc8109939b3e86bdb 0cc4f2a62b729d8465f901530872ba8106ce1712ee655d49426d71d1991733a5 19199 1775139398608051586 diff --git a/.cache/go-build/dc/dcf71b1230869edd1d90da17582eea0f636e9e73c1c84cab685c7f663ffff277-a b/.cache/go-build/dc/dcf71b1230869edd1d90da17582eea0f636e9e73c1c84cab685c7f663ffff277-a deleted file mode 100644 index ee82431..0000000 --- a/.cache/go-build/dc/dcf71b1230869edd1d90da17582eea0f636e9e73c1c84cab685c7f663ffff277-a +++ /dev/null @@ -1 +0,0 @@ -v1 dcf71b1230869edd1d90da17582eea0f636e9e73c1c84cab685c7f663ffff277 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289467614317 diff --git a/.cache/go-build/dd/dd5428eb7b0912fc2b5998d51a61f6fdeb73ed30d32c8dec94d1763577e52044-a b/.cache/go-build/dd/dd5428eb7b0912fc2b5998d51a61f6fdeb73ed30d32c8dec94d1763577e52044-a deleted file mode 100644 index 73a037b..0000000 --- a/.cache/go-build/dd/dd5428eb7b0912fc2b5998d51a61f6fdeb73ed30d32c8dec94d1763577e52044-a +++ /dev/null @@ -1 +0,0 @@ -v1 dd5428eb7b0912fc2b5998d51a61f6fdeb73ed30d32c8dec94d1763577e52044 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287162934639 diff --git a/.cache/go-build/dd/dd919b08212e34850cdf22cfe83f69222d29bb48cd4083e723e0f28634f30168-d b/.cache/go-build/dd/dd919b08212e34850cdf22cfe83f69222d29bb48cd4083e723e0f28634f30168-d deleted file mode 100644 index abf555a..0000000 Binary files a/.cache/go-build/dd/dd919b08212e34850cdf22cfe83f69222d29bb48cd4083e723e0f28634f30168-d and /dev/null differ diff --git a/.cache/go-build/de/de26119803f18fe3796c51cdbee3890acf71fe86813733eb4611a4690d7d5573-d b/.cache/go-build/de/de26119803f18fe3796c51cdbee3890acf71fe86813733eb4611a4690d7d5573-d deleted file mode 100644 index a152417..0000000 Binary files a/.cache/go-build/de/de26119803f18fe3796c51cdbee3890acf71fe86813733eb4611a4690d7d5573-d and /dev/null differ diff --git a/.cache/go-build/de/de84e4a4173654d5f4f5ae75f1648de17ad6107f5e5713944cf1467f58beb92b-a b/.cache/go-build/de/de84e4a4173654d5f4f5ae75f1648de17ad6107f5e5713944cf1467f58beb92b-a deleted file mode 100644 index 1c7dfa5..0000000 --- a/.cache/go-build/de/de84e4a4173654d5f4f5ae75f1648de17ad6107f5e5713944cf1467f58beb92b-a +++ /dev/null @@ -1 +0,0 @@ -v1 de84e4a4173654d5f4f5ae75f1648de17ad6107f5e5713944cf1467f58beb92b a03099b6ba59adce8fc0876eb016e297a7c86cd7db2defdd54dd727f653bb4d8 49900 1775136287088661216 diff --git a/.cache/go-build/de/dee90644e81503145a85419a3ee990c85110ea1a021b7f70bc962047b6bca985-d b/.cache/go-build/de/dee90644e81503145a85419a3ee990c85110ea1a021b7f70bc962047b6bca985-d deleted file mode 100644 index e96ede7..0000000 Binary files a/.cache/go-build/de/dee90644e81503145a85419a3ee990c85110ea1a021b7f70bc962047b6bca985-d and /dev/null differ diff --git a/.cache/go-build/df/df3c83860c0a21d7993471bc125904c149efc4d4a5c507feabe8fe428e49bd50-a b/.cache/go-build/df/df3c83860c0a21d7993471bc125904c149efc4d4a5c507feabe8fe428e49bd50-a deleted file mode 100644 index f7d3301..0000000 --- a/.cache/go-build/df/df3c83860c0a21d7993471bc125904c149efc4d4a5c507feabe8fe428e49bd50-a +++ /dev/null @@ -1 +0,0 @@ -v1 df3c83860c0a21d7993471bc125904c149efc4d4a5c507feabe8fe428e49bd50 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286943517932 diff --git a/.cache/go-build/df/df4311cdbdd38ca8545723f1d6cb1fce328e5c3ecc89cf38470c5a22790f5594-d b/.cache/go-build/df/df4311cdbdd38ca8545723f1d6cb1fce328e5c3ecc89cf38470c5a22790f5594-d deleted file mode 100644 index 2756497..0000000 Binary files a/.cache/go-build/df/df4311cdbdd38ca8545723f1d6cb1fce328e5c3ecc89cf38470c5a22790f5594-d and /dev/null differ diff --git a/.cache/go-build/df/df4619ffa56a00831cc6272f42c3d20d4c30d952cb98997351d427545ea48efc-d b/.cache/go-build/df/df4619ffa56a00831cc6272f42c3d20d4c30d952cb98997351d427545ea48efc-d deleted file mode 100644 index 610544a..0000000 Binary files a/.cache/go-build/df/df4619ffa56a00831cc6272f42c3d20d4c30d952cb98997351d427545ea48efc-d and /dev/null differ diff --git a/.cache/go-build/df/df606d300bd5fb75a7d87f4650d7d4f5b36a4292d1194dd7abbdb12b0aa12d6e-d b/.cache/go-build/df/df606d300bd5fb75a7d87f4650d7d4f5b36a4292d1194dd7abbdb12b0aa12d6e-d deleted file mode 100644 index d835586..0000000 Binary files a/.cache/go-build/df/df606d300bd5fb75a7d87f4650d7d4f5b36a4292d1194dd7abbdb12b0aa12d6e-d and /dev/null differ diff --git a/.cache/go-build/df/dfbb2268803038eb8a5692454584089358d31fe42481cf6bcfe319677ebdb3fe-a b/.cache/go-build/df/dfbb2268803038eb8a5692454584089358d31fe42481cf6bcfe319677ebdb3fe-a deleted file mode 100644 index ee05595..0000000 --- a/.cache/go-build/df/dfbb2268803038eb8a5692454584089358d31fe42481cf6bcfe319677ebdb3fe-a +++ /dev/null @@ -1 +0,0 @@ -v1 dfbb2268803038eb8a5692454584089358d31fe42481cf6bcfe319677ebdb3fe e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289723853701 diff --git a/.cache/go-build/e0/e0d6cf8c7c0191e8256918f9da249b0af65952e2294d1ef7755ce7f7c28a7639-a b/.cache/go-build/e0/e0d6cf8c7c0191e8256918f9da249b0af65952e2294d1ef7755ce7f7c28a7639-a deleted file mode 100644 index 88d7a0b..0000000 --- a/.cache/go-build/e0/e0d6cf8c7c0191e8256918f9da249b0af65952e2294d1ef7755ce7f7c28a7639-a +++ /dev/null @@ -1 +0,0 @@ -v1 e0d6cf8c7c0191e8256918f9da249b0af65952e2294d1ef7755ce7f7c28a7639 98b8ab8430a6d18b6f0a0d3a7261266c00fa4a8d06119ee1c9f6a125ff3cf4a8 41 1775136287076029437 diff --git a/.cache/go-build/e1/e171ad3b27fad13f49bc4ee36158ca2bde38ab7f7b6cce3136039518c4560266-d b/.cache/go-build/e1/e171ad3b27fad13f49bc4ee36158ca2bde38ab7f7b6cce3136039518c4560266-d deleted file mode 100644 index d7c03d2..0000000 --- a/.cache/go-build/e1/e171ad3b27fad13f49bc4ee36158ca2bde38ab7f7b6cce3136039518c4560266-d +++ /dev/null @@ -1 +0,0 @@ -./constant_time.go diff --git a/.cache/go-build/e1/e183e520898797ffac608954a715601882a93c2c8141d21cee36eabd5202237e-d b/.cache/go-build/e1/e183e520898797ffac608954a715601882a93c2c8141d21cee36eabd5202237e-d deleted file mode 100644 index f76e6ba..0000000 --- a/.cache/go-build/e1/e183e520898797ffac608954a715601882a93c2c8141d21cee36eabd5202237e-d +++ /dev/null @@ -1,16 +0,0 @@ -./abi.go -./abi_amd64.go -./bounds.go -./compiletype.go -./escape.go -./funcpc.go -./iface.go -./map.go -./rangefuncconsts.go -./runtime.go -./stack.go -./switch.go -./symtab.go -./type.go -./abi_test.s -./stub.s diff --git a/.cache/go-build/e1/e1cb7915fe3e844411bdc3bb4e3ec52420ee63e15cd8fa5acc81a2fb94343427-d b/.cache/go-build/e1/e1cb7915fe3e844411bdc3bb4e3ec52420ee63e15cd8fa5acc81a2fb94343427-d deleted file mode 100644 index 63be9cb..0000000 Binary files a/.cache/go-build/e1/e1cb7915fe3e844411bdc3bb4e3ec52420ee63e15cd8fa5acc81a2fb94343427-d and /dev/null differ diff --git a/.cache/go-build/e1/e1d9bbfa8257fb4d74d35eafbcfc123bdf927569280087da413f9af56b01206e-a b/.cache/go-build/e1/e1d9bbfa8257fb4d74d35eafbcfc123bdf927569280087da413f9af56b01206e-a deleted file mode 100644 index c35228f..0000000 --- a/.cache/go-build/e1/e1d9bbfa8257fb4d74d35eafbcfc123bdf927569280087da413f9af56b01206e-a +++ /dev/null @@ -1 +0,0 @@ -v1 e1d9bbfa8257fb4d74d35eafbcfc123bdf927569280087da413f9af56b01206e a789eb23679bad0468ca30472da04f3ee126a5193862e13d2f45bccaa716ddea 3332 1775136286924946049 diff --git a/.cache/go-build/e1/e1f4928a75355573e92499d4ab842fde5cdc23fe7dc03967d6a4ca5c634ab18b-d b/.cache/go-build/e1/e1f4928a75355573e92499d4ab842fde5cdc23fe7dc03967d6a4ca5c634ab18b-d deleted file mode 100644 index 62d4583..0000000 --- a/.cache/go-build/e1/e1f4928a75355573e92499d4ab842fde5cdc23fe7dc03967d6a4ca5c634ab18b-d +++ /dev/null @@ -1,2 +0,0 @@ -./cpuinfo_linux.go -./sysinfo.go diff --git a/.cache/go-build/e2/e2208546a4ae5b5faddfbf51f2132e044ace9ce4658882d0fc19915d823faf0c-a b/.cache/go-build/e2/e2208546a4ae5b5faddfbf51f2132e044ace9ce4658882d0fc19915d823faf0c-a deleted file mode 100644 index 8cde8c5..0000000 --- a/.cache/go-build/e2/e2208546a4ae5b5faddfbf51f2132e044ace9ce4658882d0fc19915d823faf0c-a +++ /dev/null @@ -1 +0,0 @@ -v1 e2208546a4ae5b5faddfbf51f2132e044ace9ce4658882d0fc19915d823faf0c 06a45522df397b46b35bf32c99a6897f0e05a1628f940c5c48517ecab0a791ff 15 1775136289422505975 diff --git a/.cache/go-build/e2/e232397eea9075898b7608a802922f3efd41f0c0cb65927b7d105b4a767a4dd2-d b/.cache/go-build/e2/e232397eea9075898b7608a802922f3efd41f0c0cb65927b7d105b4a767a4dd2-d deleted file mode 100644 index 5b77684..0000000 Binary files a/.cache/go-build/e2/e232397eea9075898b7608a802922f3efd41f0c0cb65927b7d105b4a767a4dd2-d and /dev/null differ diff --git a/.cache/go-build/e2/e23596c86ecd0fd4542a6f6e93147b903dffe8abf9254b1780e9c1aa38ab43cd-a b/.cache/go-build/e2/e23596c86ecd0fd4542a6f6e93147b903dffe8abf9254b1780e9c1aa38ab43cd-a deleted file mode 100644 index 0b8b68d..0000000 --- a/.cache/go-build/e2/e23596c86ecd0fd4542a6f6e93147b903dffe8abf9254b1780e9c1aa38ab43cd-a +++ /dev/null @@ -1 +0,0 @@ -v1 e23596c86ecd0fd4542a6f6e93147b903dffe8abf9254b1780e9c1aa38ab43cd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286988476914 diff --git a/.cache/go-build/e2/e24f6bc1a95d3acc9630101865d9905bec9e0111f777218c7c148841ccd6454e-a b/.cache/go-build/e2/e24f6bc1a95d3acc9630101865d9905bec9e0111f777218c7c148841ccd6454e-a deleted file mode 100644 index 53c1cf0..0000000 --- a/.cache/go-build/e2/e24f6bc1a95d3acc9630101865d9905bec9e0111f777218c7c148841ccd6454e-a +++ /dev/null @@ -1 +0,0 @@ -v1 e24f6bc1a95d3acc9630101865d9905bec9e0111f777218c7c148841ccd6454e 2f78d8870fb7a7bf98ca288b9b046d652baeef8d9c962d2b0e591203a023dd77 252580 1775136289468565028 diff --git a/.cache/go-build/e2/e2a7d107b4a2b2976f6eeb06c93d3d80e9be4411f56c2d64d1ac443e10fae11d-a b/.cache/go-build/e2/e2a7d107b4a2b2976f6eeb06c93d3d80e9be4411f56c2d64d1ac443e10fae11d-a deleted file mode 100644 index 82c815f..0000000 --- a/.cache/go-build/e2/e2a7d107b4a2b2976f6eeb06c93d3d80e9be4411f56c2d64d1ac443e10fae11d-a +++ /dev/null @@ -1 +0,0 @@ -v1 e2a7d107b4a2b2976f6eeb06c93d3d80e9be4411f56c2d64d1ac443e10fae11d 504649b878849fb4374b709b081183712488f7c13359592dec3b0e7f8c9c76e3 78 1775137722150484261 diff --git a/.cache/go-build/e3/e30542ed7c1c98c95b3bc44ddeeda4e8a77d21c66c81736366f4c4b309af357a-a b/.cache/go-build/e3/e30542ed7c1c98c95b3bc44ddeeda4e8a77d21c66c81736366f4c4b309af357a-a deleted file mode 100644 index 8f29911..0000000 --- a/.cache/go-build/e3/e30542ed7c1c98c95b3bc44ddeeda4e8a77d21c66c81736366f4c4b309af357a-a +++ /dev/null @@ -1 +0,0 @@ -v1 e30542ed7c1c98c95b3bc44ddeeda4e8a77d21c66c81736366f4c4b309af357a c571a2788e4da4321b41cebcfd1b5259de4a4b8b974d10fabbca6357202b9b54 50 1775136289746027686 diff --git a/.cache/go-build/e3/e3238dea81ef235c51875239112921b1d98e4ec996ea93c7f8bd78b96399d813-a b/.cache/go-build/e3/e3238dea81ef235c51875239112921b1d98e4ec996ea93c7f8bd78b96399d813-a deleted file mode 100644 index 7a3188f..0000000 --- a/.cache/go-build/e3/e3238dea81ef235c51875239112921b1d98e4ec996ea93c7f8bd78b96399d813-a +++ /dev/null @@ -1 +0,0 @@ -v1 e3238dea81ef235c51875239112921b1d98e4ec996ea93c7f8bd78b96399d813 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775136365494881716 diff --git a/.cache/go-build/e3/e39176ff7545f87303205979f577fabc403ffe2a23c7f8d515b4778004eb2ff6-a b/.cache/go-build/e3/e39176ff7545f87303205979f577fabc403ffe2a23c7f8d515b4778004eb2ff6-a deleted file mode 100644 index d9e9377..0000000 --- a/.cache/go-build/e3/e39176ff7545f87303205979f577fabc403ffe2a23c7f8d515b4778004eb2ff6-a +++ /dev/null @@ -1 +0,0 @@ -v1 e39176ff7545f87303205979f577fabc403ffe2a23c7f8d515b4778004eb2ff6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184098020092 diff --git a/.cache/go-build/e3/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855-d b/.cache/go-build/e3/e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855-d deleted file mode 100644 index e69de29..0000000 diff --git a/.cache/go-build/e3/e3eeea04ed0ef204ae80e31823e425605fc525246db7b98e6cc90a61f82b4f42-a b/.cache/go-build/e3/e3eeea04ed0ef204ae80e31823e425605fc525246db7b98e6cc90a61f82b4f42-a deleted file mode 100644 index 0400ffa..0000000 --- a/.cache/go-build/e3/e3eeea04ed0ef204ae80e31823e425605fc525246db7b98e6cc90a61f82b4f42-a +++ /dev/null @@ -1 +0,0 @@ -v1 e3eeea04ed0ef204ae80e31823e425605fc525246db7b98e6cc90a61f82b4f42 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288413199673 diff --git a/.cache/go-build/e3/e3ef2d4fdd056e2e637b1ac1a1a4dbfab39733a9387eb2aa2063f1b90a63e412-d b/.cache/go-build/e3/e3ef2d4fdd056e2e637b1ac1a1a4dbfab39733a9387eb2aa2063f1b90a63e412-d deleted file mode 100644 index e852b1b..0000000 Binary files a/.cache/go-build/e3/e3ef2d4fdd056e2e637b1ac1a1a4dbfab39733a9387eb2aa2063f1b90a63e412-d and /dev/null differ diff --git a/.cache/go-build/e4/e44a4cd8d259b270260b9fc0153a8fc673b82aa9a9fdbec8ad155bf0d8115a3a-a b/.cache/go-build/e4/e44a4cd8d259b270260b9fc0153a8fc673b82aa9a9fdbec8ad155bf0d8115a3a-a deleted file mode 100644 index 0699114..0000000 --- a/.cache/go-build/e4/e44a4cd8d259b270260b9fc0153a8fc673b82aa9a9fdbec8ad155bf0d8115a3a-a +++ /dev/null @@ -1 +0,0 @@ -v1 e44a4cd8d259b270260b9fc0153a8fc673b82aa9a9fdbec8ad155bf0d8115a3a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286947439055 diff --git a/.cache/go-build/e4/e44ac96670ce3fbc2157489317adfe304187b7babf10b5b2b7988c03957a4043-a b/.cache/go-build/e4/e44ac96670ce3fbc2157489317adfe304187b7babf10b5b2b7988c03957a4043-a deleted file mode 100644 index cc6d1b9..0000000 --- a/.cache/go-build/e4/e44ac96670ce3fbc2157489317adfe304187b7babf10b5b2b7988c03957a4043-a +++ /dev/null @@ -1 +0,0 @@ -v1 e44ac96670ce3fbc2157489317adfe304187b7babf10b5b2b7988c03957a4043 dd919b08212e34850cdf22cfe83f69222d29bb48cd4083e723e0f28634f30168 955 1775136286919061404 diff --git a/.cache/go-build/e4/e46e435233f14f25ba0c385628d03cbee6fbb969de6ba81229010798391a9bf1-a b/.cache/go-build/e4/e46e435233f14f25ba0c385628d03cbee6fbb969de6ba81229010798391a9bf1-a deleted file mode 100644 index 702e874..0000000 --- a/.cache/go-build/e4/e46e435233f14f25ba0c385628d03cbee6fbb969de6ba81229010798391a9bf1-a +++ /dev/null @@ -1 +0,0 @@ -v1 e46e435233f14f25ba0c385628d03cbee6fbb969de6ba81229010798391a9bf1 0f3caa3d1ee77b9490462af9d05d991efefe35c07eca12b1d49f2b85664ca712 7678 1775136287066007550 diff --git a/.cache/go-build/e4/e4810c7bd519523e75576d5cf7beb5c5678992f70325fa621e887f0f817a71bd-a b/.cache/go-build/e4/e4810c7bd519523e75576d5cf7beb5c5678992f70325fa621e887f0f817a71bd-a deleted file mode 100644 index 1ead303..0000000 --- a/.cache/go-build/e4/e4810c7bd519523e75576d5cf7beb5c5678992f70325fa621e887f0f817a71bd-a +++ /dev/null @@ -1 +0,0 @@ -v1 e4810c7bd519523e75576d5cf7beb5c5678992f70325fa621e887f0f817a71bd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289027330512 diff --git a/.cache/go-build/e4/e4aa96e96fa7263e96482c7ef2fd51d96a7ac8d3d42016b33d9d4ee7c19721fb-d b/.cache/go-build/e4/e4aa96e96fa7263e96482c7ef2fd51d96a7ac8d3d42016b33d9d4ee7c19721fb-d deleted file mode 100644 index 34cd5f3..0000000 Binary files a/.cache/go-build/e4/e4aa96e96fa7263e96482c7ef2fd51d96a7ac8d3d42016b33d9d4ee7c19721fb-d and /dev/null differ diff --git a/.cache/go-build/e4/e4b700b4150c871178532dc8499b91745427aa06b710123f821bd7c002401d80-a b/.cache/go-build/e4/e4b700b4150c871178532dc8499b91745427aa06b710123f821bd7c002401d80-a deleted file mode 100644 index 8c638a8..0000000 --- a/.cache/go-build/e4/e4b700b4150c871178532dc8499b91745427aa06b710123f821bd7c002401d80-a +++ /dev/null @@ -1 +0,0 @@ -v1 e4b700b4150c871178532dc8499b91745427aa06b710123f821bd7c002401d80 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288517148047 diff --git a/.cache/go-build/e4/e4bbbbff5eed5cb3b333d55ca3276f8f5e89e80e326e0ff60d7113af7214ae1c-a b/.cache/go-build/e4/e4bbbbff5eed5cb3b333d55ca3276f8f5e89e80e326e0ff60d7113af7214ae1c-a deleted file mode 100644 index 145db5b..0000000 --- a/.cache/go-build/e4/e4bbbbff5eed5cb3b333d55ca3276f8f5e89e80e326e0ff60d7113af7214ae1c-a +++ /dev/null @@ -1 +0,0 @@ -v1 e4bbbbff5eed5cb3b333d55ca3276f8f5e89e80e326e0ff60d7113af7214ae1c 377fb9290326a21d1cf245d213930510485d0649bdaadf1ff223cfa6f19c6f53 73 1775137722029374055 diff --git a/.cache/go-build/e4/e4c23b1bd2e3d836ced76f0115e55d8b369b9519a49db9deb2358eff49539415-a b/.cache/go-build/e4/e4c23b1bd2e3d836ced76f0115e55d8b369b9519a49db9deb2358eff49539415-a deleted file mode 100644 index 73f79ad..0000000 --- a/.cache/go-build/e4/e4c23b1bd2e3d836ced76f0115e55d8b369b9519a49db9deb2358eff49539415-a +++ /dev/null @@ -1 +0,0 @@ -v1 e4c23b1bd2e3d836ced76f0115e55d8b369b9519a49db9deb2358eff49539415 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287030586104 diff --git a/.cache/go-build/e4/e4feb59c82ba6f15b0a5eeea8b691635963356790da60ffe06d4cbca4f69010b-d b/.cache/go-build/e4/e4feb59c82ba6f15b0a5eeea8b691635963356790da60ffe06d4cbca4f69010b-d deleted file mode 100644 index fb61e22..0000000 --- a/.cache/go-build/e4/e4feb59c82ba6f15b0a5eeea8b691635963356790da60ffe06d4cbca4f69010b-d +++ /dev/null @@ -1,3 +0,0 @@ -./malloc.go -./scan.go -./sizeclasses.go diff --git a/.cache/go-build/e5/e5067057ea25d47e75be9c244071d1088c17047bfe38df0a4b577d0e827f0e80-d b/.cache/go-build/e5/e5067057ea25d47e75be9c244071d1088c17047bfe38df0a4b577d0e827f0e80-d deleted file mode 100644 index da7ea27..0000000 --- a/.cache/go-build/e5/e5067057ea25d47e75be9c244071d1088c17047bfe38df0a4b577d0e827f0e80-d +++ /dev/null @@ -1,4 +0,0 @@ -./apply_manifest.go -./build.go -./compare.go -./extract.go diff --git a/.cache/go-build/e5/e5332d47ab3aa2f733cb04147ee38c2f3a2bab35154071adcc7703d7d6c6db3d-a b/.cache/go-build/e5/e5332d47ab3aa2f733cb04147ee38c2f3a2bab35154071adcc7703d7d6c6db3d-a deleted file mode 100644 index e668d30..0000000 --- a/.cache/go-build/e5/e5332d47ab3aa2f733cb04147ee38c2f3a2bab35154071adcc7703d7d6c6db3d-a +++ /dev/null @@ -1 +0,0 @@ -v1 e5332d47ab3aa2f733cb04147ee38c2f3a2bab35154071adcc7703d7d6c6db3d 180daccd9d9231d4ffa04d2116cc916cec7ddd18fee325a7adc1243bfcf940d9 1261 1775136286910465918 diff --git a/.cache/go-build/e5/e534c860b7a50b040d4f3108cacf265206b288c42b2688e036b3dafb9be8fc47-a b/.cache/go-build/e5/e534c860b7a50b040d4f3108cacf265206b288c42b2688e036b3dafb9be8fc47-a deleted file mode 100644 index ea6428d..0000000 --- a/.cache/go-build/e5/e534c860b7a50b040d4f3108cacf265206b288c42b2688e036b3dafb9be8fc47-a +++ /dev/null @@ -1 +0,0 @@ -v1 e534c860b7a50b040d4f3108cacf265206b288c42b2688e036b3dafb9be8fc47 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288986838613 diff --git a/.cache/go-build/e5/e53d84b74e4fe0c7d668a44492ac7d12c05ca2470fcf34a86b943c2f33f54f6b-a b/.cache/go-build/e5/e53d84b74e4fe0c7d668a44492ac7d12c05ca2470fcf34a86b943c2f33f54f6b-a deleted file mode 100644 index 3afe68f..0000000 --- a/.cache/go-build/e5/e53d84b74e4fe0c7d668a44492ac7d12c05ca2470fcf34a86b943c2f33f54f6b-a +++ /dev/null @@ -1 +0,0 @@ -v1 e53d84b74e4fe0c7d668a44492ac7d12c05ca2470fcf34a86b943c2f33f54f6b bc90325eff345f7fbcf143694ee96a810b1644cffc1d0535d5885e2a32ee4ffd 539170 1775138184038501249 diff --git a/.cache/go-build/e5/e58d505842d7bafdf6257beac60b1381246cddde1f3c638ce32d283a70c357f1-a b/.cache/go-build/e5/e58d505842d7bafdf6257beac60b1381246cddde1f3c638ce32d283a70c357f1-a deleted file mode 100644 index a44fd10..0000000 --- a/.cache/go-build/e5/e58d505842d7bafdf6257beac60b1381246cddde1f3c638ce32d283a70c357f1-a +++ /dev/null @@ -1 +0,0 @@ -v1 e58d505842d7bafdf6257beac60b1381246cddde1f3c638ce32d283a70c357f1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136365503365522 diff --git a/.cache/go-build/e5/e5d2060bd4715eae7861a58e7ff2b9a0fd4a1be4dd30c45e0847a22641db19bc-a b/.cache/go-build/e5/e5d2060bd4715eae7861a58e7ff2b9a0fd4a1be4dd30c45e0847a22641db19bc-a deleted file mode 100644 index 4ab599b..0000000 --- a/.cache/go-build/e5/e5d2060bd4715eae7861a58e7ff2b9a0fd4a1be4dd30c45e0847a22641db19bc-a +++ /dev/null @@ -1 +0,0 @@ -v1 e5d2060bd4715eae7861a58e7ff2b9a0fd4a1be4dd30c45e0847a22641db19bc acebe7d22de108c8b02e0c1f95cb48a2adc3c8afc1082ba8dd08bb50c49f9fc1 6787 1775136286844632661 diff --git a/.cache/go-build/e5/e5e1d26ed9b40d37b348f43c0a3cf4b5a0c12d5b7b57fa5c0ddc8349cb281115-a b/.cache/go-build/e5/e5e1d26ed9b40d37b348f43c0a3cf4b5a0c12d5b7b57fa5c0ddc8349cb281115-a deleted file mode 100644 index a1da8e8..0000000 --- a/.cache/go-build/e5/e5e1d26ed9b40d37b348f43c0a3cf4b5a0c12d5b7b57fa5c0ddc8349cb281115-a +++ /dev/null @@ -1 +0,0 @@ -v1 e5e1d26ed9b40d37b348f43c0a3cf4b5a0c12d5b7b57fa5c0ddc8349cb281115 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289471951210 diff --git a/.cache/go-build/e5/e5e9ff618c1b3ff3da7ac8317afa4cd98bff49372c656c09816bff58f623ddb1-d b/.cache/go-build/e5/e5e9ff618c1b3ff3da7ac8317afa4cd98bff49372c656c09816bff58f623ddb1-d deleted file mode 100644 index 6a37791..0000000 --- a/.cache/go-build/e5/e5e9ff618c1b3ff3da7ac8317afa4cd98bff49372c656c09816bff58f623ddb1-d +++ /dev/null @@ -1,291 +0,0 @@ -# test log -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildThenExtract50075816/001/src -stat /tmp/TestBuildThenExtract50075816/001 -stat /tmp/TestBuildThenExtract50075816/001/assets -stat /tmp/TestBuildThenExtract50075816/001 -stat /tmp/TestBuildThenExtract50075816/001/build -stat /tmp/TestBuildThenExtract50075816/001 -open /tmp/TestBuildThenExtract50075816/001/nwn-tool.json -stat /tmp/TestBuildThenExtract50075816/001/src/module -stat /tmp/TestBuildThenExtract50075816/001/src -open /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract50075816/001/nwn-tool.json -stat /tmp/TestBuildThenExtract50075816/001/assets -stat /tmp/TestBuildThenExtract50075816/001/build -stat /tmp/TestBuildThenExtract50075816/001/src -stat /tmp/TestBuildThenExtract50075816/001/src -open /tmp/TestBuildThenExtract50075816/001/src -open /tmp/TestBuildThenExtract50075816/001/src/module -stat /tmp/TestBuildThenExtract50075816/001/assets -open /tmp/TestBuildThenExtract50075816/001/assets -open /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract50075816/001/build/testmod.mod -open /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract50075816/001/build/haks.json -stat /tmp/TestBuildThenExtract50075816/001/build -open /tmp/TestBuildThenExtract50075816/001/build -stat /tmp/TestBuildThenExtract50075816/001/src -open /tmp/TestBuildThenExtract50075816/001/src -open /tmp/TestBuildThenExtract50075816/001/src/module -stat /tmp/TestBuildThenExtract50075816/001/assets -open /tmp/TestBuildThenExtract50075816/001/assets -open /tmp/TestBuildThenExtract50075816/001/build/testmod.mod -stat /tmp/TestBuildThenExtract50075816/001/src/module -open /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -open /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract50075816/001/build -open /tmp/TestBuildThenExtract50075816/001/build -stat /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -stat /tmp/TestBuildThenExtract50075816/001/src -open /tmp/TestBuildThenExtract50075816/001/src -open /tmp/TestBuildThenExtract50075816/001/src/module -stat /tmp/TestBuildThenExtract50075816/001/assets -open /tmp/TestBuildThenExtract50075816/001/assets -open /tmp/TestBuildThenExtract50075816/001/build/testmod.mod -open /tmp/TestBuildThenExtract50075816/001/build/haks.json -stat /tmp/TestBuildThenExtract50075816/001/build -open /tmp/TestBuildThenExtract50075816/001/build -open /tmp/TestBuildThenExtract50075816/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestExtractReadsHAKAssets1990996442/001/src -stat /tmp/TestExtractReadsHAKAssets1990996442/001 -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets -stat /tmp/TestExtractReadsHAKAssets1990996442/001 -stat /tmp/TestExtractReadsHAKAssets1990996442/001/build -stat /tmp/TestExtractReadsHAKAssets1990996442/001 -open /tmp/TestExtractReadsHAKAssets1990996442/001/nwn-tool.json -open /tmp/TestExtractReadsHAKAssets1990996442/001/nwn-tool.json -stat /tmp/TestExtractReadsHAKAssets1990996442/001/src -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets -stat /tmp/TestExtractReadsHAKAssets1990996442/001/build -stat /tmp/TestExtractReadsHAKAssets1990996442/001/src -open /tmp/TestExtractReadsHAKAssets1990996442/001/src -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets -open /tmp/TestExtractReadsHAKAssets1990996442/001/assets -open /tmp/TestExtractReadsHAKAssets1990996442/001/build/testmod.mod -open /tmp/TestExtractReadsHAKAssets1990996442/001/build/vfx.hak -open /tmp/TestExtractReadsHAKAssets1990996442/001/build/testmod.mod -stat /tmp/TestExtractReadsHAKAssets1990996442/001/build -open /tmp/TestExtractReadsHAKAssets1990996442/001/build -open /tmp/TestExtractReadsHAKAssets1990996442/001/build/vfx.hak -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets/plt -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets -open /tmp/TestExtractReadsHAKAssets1990996442/001/assets/plt/test_icon.plt -open /tmp/TestExtractReadsHAKAssets1990996442/001/assets/plt/test_icon.plt -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets/mdl -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets -open /tmp/TestExtractReadsHAKAssets1990996442/001/assets/mdl/test_vfx.mdl -open /tmp/TestExtractReadsHAKAssets1990996442/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets/mdl/test_vfx.mdl -stat /tmp/TestExtractReadsHAKAssets1990996442/001/assets/plt/test_icon.plt -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001 -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets/core -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001 -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001 -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/nwn-tool.json -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src/module -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets/core -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets/core/a.tga -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/assets/core/b.tga -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/core_01.hak -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/haks.json -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/core_01.hak -stat /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/core_02.hak -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/build/haks.json -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsConfiguredHAKs3345442862/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/core -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001 -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/vfx -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001 -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/nwn-tool.json -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/nwn-tool.json -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src/module -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/core -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/vfx -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/src/module/module.ifo.json -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/core/a.tga -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/assets/vfx/b.tga -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build/haks.json -stat /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build/core.hak -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build/vfx.hak -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build/haks.json -open /tmp/TestBuildOrdersMultipleHAKGroups2655676300/001/build/haks.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/core -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001 -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/vfx -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001 -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/nwn-tool.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/nwn-tool.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src/module -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/core -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/vfx -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/core/a.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/core/b.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/vfx/c.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/assets/vfx/d.tga -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/core_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/core_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/vfx_01.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/haks.json -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/core_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/core_02.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/vfx_01.hak -stat /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/vfx_02.hak -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/build/haks.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src/module/module.ifo.json -open /tmp/TestBuildSplitsMultipleHAKGroupsDeterministically1463460725/001/src/module/module.ifo.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/core -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001 -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/vfx -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001 -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/nwn-tool.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/nwn-tool.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src/module -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/core -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/vfx -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/src/module/module.ifo.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/core/core_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/assets/vfx/vfx_a.tga -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build/haks.json -stat /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build/core.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build/vfx.hak -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build/haks.json -open /tmp/TestBuildSkipsEmptyHAKGroupsInModuleOrder1905611339/001/build/haks.json -open /tmp -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/src -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001 -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/a -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001 -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/b -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/build -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001 -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/nwn-tool.json -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/a/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/b/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/nwn-tool.json -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/src -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/build -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/src -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/src -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/a -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/b -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/a/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/assets/core/b/shared.mdl -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/build/haks.json -stat /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/build -open /tmp/TestBuildHAKsFailsForDuplicateResourcesInSameHAK2636534656/001/build -open /tmp diff --git a/.cache/go-build/e6/e61f23676808285ff3e4243b264f1976022f70deb93947dd441e5f96ce475848-d b/.cache/go-build/e6/e61f23676808285ff3e4243b264f1976022f70deb93947dd441e5f96ce475848-d deleted file mode 100644 index 24a5d64..0000000 Binary files a/.cache/go-build/e6/e61f23676808285ff3e4243b264f1976022f70deb93947dd441e5f96ce475848-d and /dev/null differ diff --git a/.cache/go-build/e6/e647816996ce765d381a3448353856dd97d4363584455f594d5b0fe3f1cf0501-d b/.cache/go-build/e6/e647816996ce765d381a3448353856dd97d4363584455f594d5b0fe3f1cf0501-d deleted file mode 100644 index ef7e03d..0000000 Binary files a/.cache/go-build/e6/e647816996ce765d381a3448353856dd97d4363584455f594d5b0fe3f1cf0501-d and /dev/null differ diff --git a/.cache/go-build/e6/e66415b97dc122c91b6c4dffdd8daa3e11a7cd992ed90c5c074777b44fa43915-d b/.cache/go-build/e6/e66415b97dc122c91b6c4dffdd8daa3e11a7cd992ed90c5c074777b44fa43915-d deleted file mode 100644 index 1d73898..0000000 --- a/.cache/go-build/e6/e66415b97dc122c91b6c4dffdd8daa3e11a7cd992ed90c5c074777b44fa43915-d +++ /dev/null @@ -1,4 +0,0 @@ -./constant_time.go -./xor.go -./xor_asm.go -./xor_amd64.s diff --git a/.cache/go-build/e6/e6832c62143e16a68667624a90d26dd170bccd7d00b08ed67e84cca298bdf1ed-d b/.cache/go-build/e6/e6832c62143e16a68667624a90d26dd170bccd7d00b08ed67e84cca298bdf1ed-d deleted file mode 100644 index 66c1ccd..0000000 Binary files a/.cache/go-build/e6/e6832c62143e16a68667624a90d26dd170bccd7d00b08ed67e84cca298bdf1ed-d and /dev/null differ diff --git a/.cache/go-build/e6/e685a55a0fd4dae821f0d73344a23da0621349e303542b988f277e5c43fecf80-d b/.cache/go-build/e6/e685a55a0fd4dae821f0d73344a23da0621349e303542b988f277e5c43fecf80-d deleted file mode 100644 index 9629a3e..0000000 --- a/.cache/go-build/e6/e685a55a0fd4dae821f0d73344a23da0621349e303542b988f277e5c43fecf80-d +++ /dev/null @@ -1,8 +0,0 @@ -./atomic_amd64.go -./doc.go -./stubs.go -./types.go -./types_64bit.go -./unaligned.go -./xchg8.go -./atomic_amd64.s diff --git a/.cache/go-build/e6/e6b37e4ea80ca0a6675ecfb86d5a6ee92b4f1daafade93e1932df5e6f26a61b9-a b/.cache/go-build/e6/e6b37e4ea80ca0a6675ecfb86d5a6ee92b4f1daafade93e1932df5e6f26a61b9-a deleted file mode 100644 index 1e26a75..0000000 --- a/.cache/go-build/e6/e6b37e4ea80ca0a6675ecfb86d5a6ee92b4f1daafade93e1932df5e6f26a61b9-a +++ /dev/null @@ -1 +0,0 @@ -v1 e6b37e4ea80ca0a6675ecfb86d5a6ee92b4f1daafade93e1932df5e6f26a61b9 0a227589e982b6fd53730b98d7a9f6eea6c3de8f4fadcf047241cb59915131fa 807 1775136289911282955 diff --git a/.cache/go-build/e6/e6bf8111743963cf5f5b35cdcfb9bb731da311ae505c4d5e07335bbc21880fe4-a b/.cache/go-build/e6/e6bf8111743963cf5f5b35cdcfb9bb731da311ae505c4d5e07335bbc21880fe4-a deleted file mode 100644 index 2f58e38..0000000 --- a/.cache/go-build/e6/e6bf8111743963cf5f5b35cdcfb9bb731da311ae505c4d5e07335bbc21880fe4-a +++ /dev/null @@ -1 +0,0 @@ -v1 e6bf8111743963cf5f5b35cdcfb9bb731da311ae505c4d5e07335bbc21880fe4 efad33a2faf7de947952496bad9b0741a4b562ade46cfb56cf55ed70869f0608 1883 1775138184261025968 diff --git a/.cache/go-build/e7/e728580836e908b08b06bda972895b98ff1beab1b7878d8faf6b2469f1660756-a b/.cache/go-build/e7/e728580836e908b08b06bda972895b98ff1beab1b7878d8faf6b2469f1660756-a deleted file mode 100644 index 47338f4..0000000 --- a/.cache/go-build/e7/e728580836e908b08b06bda972895b98ff1beab1b7878d8faf6b2469f1660756-a +++ /dev/null @@ -1 +0,0 @@ -v1 e728580836e908b08b06bda972895b98ff1beab1b7878d8faf6b2469f1660756 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287051850889 diff --git a/.cache/go-build/e7/e72896ab6e965471de1e5974f0d9f367cae66603fec819ce7c6a3866821dc51a-a b/.cache/go-build/e7/e72896ab6e965471de1e5974f0d9f367cae66603fec819ce7c6a3866821dc51a-a deleted file mode 100644 index f98fcb6..0000000 --- a/.cache/go-build/e7/e72896ab6e965471de1e5974f0d9f367cae66603fec819ce7c6a3866821dc51a-a +++ /dev/null @@ -1 +0,0 @@ -v1 e72896ab6e965471de1e5974f0d9f367cae66603fec819ce7c6a3866821dc51a c23df47e558760577ca85e209817b31837e69619fc642af359ac2b4728c8aca5 79 1775139398343470197 diff --git a/.cache/go-build/e7/e7890ea0437891fca62204b04cf24b91615d738b317ba6f8b4d2e3c43a3909e1-a b/.cache/go-build/e7/e7890ea0437891fca62204b04cf24b91615d738b317ba6f8b4d2e3c43a3909e1-a deleted file mode 100644 index 8415cf1..0000000 --- a/.cache/go-build/e7/e7890ea0437891fca62204b04cf24b91615d738b317ba6f8b4d2e3c43a3909e1-a +++ /dev/null @@ -1 +0,0 @@ -v1 e7890ea0437891fca62204b04cf24b91615d738b317ba6f8b4d2e3c43a3909e1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288975098905 diff --git a/.cache/go-build/e7/e78e4d96e998f20336aff5cbb5e5b22ca59fd3076ea10adb77abe50277ad57dc-a b/.cache/go-build/e7/e78e4d96e998f20336aff5cbb5e5b22ca59fd3076ea10adb77abe50277ad57dc-a deleted file mode 100644 index d17cc26..0000000 --- a/.cache/go-build/e7/e78e4d96e998f20336aff5cbb5e5b22ca59fd3076ea10adb77abe50277ad57dc-a +++ /dev/null @@ -1 +0,0 @@ -v1 e78e4d96e998f20336aff5cbb5e5b22ca59fd3076ea10adb77abe50277ad57dc 91b7106bf0aad0459ee95b966f07b8f5ece98950a44cd3c499744ac8d6cd7532 2990 1775136287229732067 diff --git a/.cache/go-build/e7/e7ab92bb93e6eff449eb320f9e3378ed756a86dee3781c4205cfbf7374132b72-a b/.cache/go-build/e7/e7ab92bb93e6eff449eb320f9e3378ed756a86dee3781c4205cfbf7374132b72-a deleted file mode 100644 index c6651aa..0000000 --- a/.cache/go-build/e7/e7ab92bb93e6eff449eb320f9e3378ed756a86dee3781c4205cfbf7374132b72-a +++ /dev/null @@ -1 +0,0 @@ -v1 e7ab92bb93e6eff449eb320f9e3378ed756a86dee3781c4205cfbf7374132b72 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286998039471 diff --git a/.cache/go-build/e8/e80fa97d0b1504a6a9a0ec29be1cf6598a900f8483fc139e9c3d7524223a152e-d b/.cache/go-build/e8/e80fa97d0b1504a6a9a0ec29be1cf6598a900f8483fc139e9c3d7524223a152e-d deleted file mode 100644 index 465f5f6..0000000 --- a/.cache/go-build/e8/e80fa97d0b1504a6a9a0ec29be1cf6598a900f8483fc139e9c3d7524223a152e-d +++ /dev/null @@ -1 +0,0 @@ -./erf.go diff --git a/.cache/go-build/e8/e84b4e952c082392ec0d0d87a6e65e9f0b4369b73c7792f6ffc9eea06f4dc236-a b/.cache/go-build/e8/e84b4e952c082392ec0d0d87a6e65e9f0b4369b73c7792f6ffc9eea06f4dc236-a deleted file mode 100644 index eea3b59..0000000 --- a/.cache/go-build/e8/e84b4e952c082392ec0d0d87a6e65e9f0b4369b73c7792f6ffc9eea06f4dc236-a +++ /dev/null @@ -1 +0,0 @@ -v1 e84b4e952c082392ec0d0d87a6e65e9f0b4369b73c7792f6ffc9eea06f4dc236 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289064294329 diff --git a/.cache/go-build/e8/e84c82c8ac6c7f5a0a08744979078e77b44ebdd1d855963def9e97ce70ba6bd7-d b/.cache/go-build/e8/e84c82c8ac6c7f5a0a08744979078e77b44ebdd1d855963def9e97ce70ba6bd7-d deleted file mode 100644 index 16cb95a..0000000 --- a/.cache/go-build/e8/e84c82c8ac6c7f5a0a08744979078e77b44ebdd1d855963def9e97ce70ba6bd7-d +++ /dev/null @@ -1,11 +0,0 @@ -./elf.go -./label.go -./map.go -./pe.go -./pprof.go -./pprof_rusage.go -./proto.go -./proto_other.go -./protobuf.go -./protomem.go -./runtime.go diff --git a/.cache/go-build/e8/e85ab7aabcc3ce6206ababfe96d3e8fd6ea552ff9039c43265163f7989c1ab86-d b/.cache/go-build/e8/e85ab7aabcc3ce6206ababfe96d3e8fd6ea552ff9039c43265163f7989c1ab86-d deleted file mode 100644 index 4577ef9..0000000 --- a/.cache/go-build/e8/e85ab7aabcc3ce6206ababfe96d3e8fd6ea552ff9039c43265163f7989c1ab86-d +++ /dev/null @@ -1,4 +0,0 @@ -./exec.go -./exec_unix.go -./lookpath.go -./lp_unix.go diff --git a/.cache/go-build/e8/e881934cfd541e6c51ecb5395205cba58d4b3f19d349cc4e54c72e50f3720451-a b/.cache/go-build/e8/e881934cfd541e6c51ecb5395205cba58d4b3f19d349cc4e54c72e50f3720451-a deleted file mode 100644 index 1188c2f..0000000 --- a/.cache/go-build/e8/e881934cfd541e6c51ecb5395205cba58d4b3f19d349cc4e54c72e50f3720451-a +++ /dev/null @@ -1 +0,0 @@ -v1 e881934cfd541e6c51ecb5395205cba58d4b3f19d349cc4e54c72e50f3720451 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287071648244 diff --git a/.cache/go-build/e9/e90066540ceadcd0c3d569af5bae58c55c89afd47e399ed5005a94eaecc094d3-d b/.cache/go-build/e9/e90066540ceadcd0c3d569af5bae58c55c89afd47e399ed5005a94eaecc094d3-d deleted file mode 100644 index e50eacb..0000000 --- a/.cache/go-build/e9/e90066540ceadcd0c3d569af5bae58c55c89afd47e399ed5005a94eaecc094d3-d +++ /dev/null @@ -1,3 +0,0 @@ -./cast.go -./ctrdrbg.go -./rand.go diff --git a/.cache/go-build/e9/e90711e30deba4eb76a6ae6064279bc329fc551ecb882a5edbae3f314c407314-a b/.cache/go-build/e9/e90711e30deba4eb76a6ae6064279bc329fc551ecb882a5edbae3f314c407314-a deleted file mode 100644 index 13bc171..0000000 --- a/.cache/go-build/e9/e90711e30deba4eb76a6ae6064279bc329fc551ecb882a5edbae3f314c407314-a +++ /dev/null @@ -1 +0,0 @@ -v1 e90711e30deba4eb76a6ae6064279bc329fc551ecb882a5edbae3f314c407314 f2eb675f10fe0f573fdec735a93af277da012f1b41a41ee586df2aae6b24e8e9 9587 1775136286849566765 diff --git a/.cache/go-build/e9/e96b0e25e773871e7d662353c8cfd87d203eea0ed3d78288f8fbb9a76cfbcab3-a b/.cache/go-build/e9/e96b0e25e773871e7d662353c8cfd87d203eea0ed3d78288f8fbb9a76cfbcab3-a deleted file mode 100644 index b1ea219..0000000 --- a/.cache/go-build/e9/e96b0e25e773871e7d662353c8cfd87d203eea0ed3d78288f8fbb9a76cfbcab3-a +++ /dev/null @@ -1 +0,0 @@ -v1 e96b0e25e773871e7d662353c8cfd87d203eea0ed3d78288f8fbb9a76cfbcab3 174325e79b5e27561ab5cb42fdddeef42e9e544c5d93eed00870e304c5fbd66f 136018 1775138184131793496 diff --git a/.cache/go-build/e9/e9dcc8681a84ce51b0a371db86a03798e7512dd0ea2d17d9a384c967dbab3341-a b/.cache/go-build/e9/e9dcc8681a84ce51b0a371db86a03798e7512dd0ea2d17d9a384c967dbab3341-a deleted file mode 100644 index 04eae95..0000000 --- a/.cache/go-build/e9/e9dcc8681a84ce51b0a371db86a03798e7512dd0ea2d17d9a384c967dbab3341-a +++ /dev/null @@ -1 +0,0 @@ -v1 e9dcc8681a84ce51b0a371db86a03798e7512dd0ea2d17d9a384c967dbab3341 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775138184131350635 diff --git a/.cache/go-build/e9/e9f58904c16ac0eacfde5f47b0300de0ba84580543dff51726e0426bc34319c8-a b/.cache/go-build/e9/e9f58904c16ac0eacfde5f47b0300de0ba84580543dff51726e0426bc34319c8-a deleted file mode 100644 index 79361d2..0000000 --- a/.cache/go-build/e9/e9f58904c16ac0eacfde5f47b0300de0ba84580543dff51726e0426bc34319c8-a +++ /dev/null @@ -1 +0,0 @@ -v1 e9f58904c16ac0eacfde5f47b0300de0ba84580543dff51726e0426bc34319c8 428cfbb9e53293e0d93eac017cea4d1ef7122adda089162e00f13836ba6742f3 12 1775136289420382024 diff --git a/.cache/go-build/ea/ea83e0c9f8ca58742ba1e0f2a8667a8921d369e9db4805cadffdd6d02b9f1dfe-a b/.cache/go-build/ea/ea83e0c9f8ca58742ba1e0f2a8667a8921d369e9db4805cadffdd6d02b9f1dfe-a deleted file mode 100644 index de7dd5a..0000000 --- a/.cache/go-build/ea/ea83e0c9f8ca58742ba1e0f2a8667a8921d369e9db4805cadffdd6d02b9f1dfe-a +++ /dev/null @@ -1 +0,0 @@ -v1 ea83e0c9f8ca58742ba1e0f2a8667a8921d369e9db4805cadffdd6d02b9f1dfe e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289000376813 diff --git a/.cache/go-build/ea/ea8b62981ed82be385db46847d484582a3f3048f0050073ff93b625841087206-a b/.cache/go-build/ea/ea8b62981ed82be385db46847d484582a3f3048f0050073ff93b625841087206-a deleted file mode 100644 index 9ed7ff4..0000000 --- a/.cache/go-build/ea/ea8b62981ed82be385db46847d484582a3f3048f0050073ff93b625841087206-a +++ /dev/null @@ -1 +0,0 @@ -v1 ea8b62981ed82be385db46847d484582a3f3048f0050073ff93b625841087206 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287051932689 diff --git a/.cache/go-build/ea/eaaea5991dde284e90ce4516e92f755b6515833ce697fa0dbd285a4480b984f9-a b/.cache/go-build/ea/eaaea5991dde284e90ce4516e92f755b6515833ce697fa0dbd285a4480b984f9-a deleted file mode 100644 index b5fabd1..0000000 --- a/.cache/go-build/ea/eaaea5991dde284e90ce4516e92f755b6515833ce697fa0dbd285a4480b984f9-a +++ /dev/null @@ -1 +0,0 @@ -v1 eaaea5991dde284e90ce4516e92f755b6515833ce697fa0dbd285a4480b984f9 80cb8158f655f33ebfe81a7915cd40e591873a7efad630685e3b1f5439268c19 13 1775136289055093772 diff --git a/.cache/go-build/ea/eac7e7da15a37795425fcc6752205fc450b442725b2fbffa54d67d68922a1aae-d b/.cache/go-build/ea/eac7e7da15a37795425fcc6752205fc450b442725b2fbffa54d67d68922a1aae-d deleted file mode 100644 index 4cc1656..0000000 --- a/.cache/go-build/ea/eac7e7da15a37795425fcc6752205fc450b442725b2fbffa54d67d68922a1aae-d +++ /dev/null @@ -1 +0,0 @@ -./iter.go diff --git a/.cache/go-build/eb/eb2decd78b5a61acba69895c77f904722566f2094f0dee1478e3279738cf48b3-a b/.cache/go-build/eb/eb2decd78b5a61acba69895c77f904722566f2094f0dee1478e3279738cf48b3-a deleted file mode 100644 index c049146..0000000 --- a/.cache/go-build/eb/eb2decd78b5a61acba69895c77f904722566f2094f0dee1478e3279738cf48b3-a +++ /dev/null @@ -1 +0,0 @@ -v1 eb2decd78b5a61acba69895c77f904722566f2094f0dee1478e3279738cf48b3 2504db93d2f28e6e09170315a1dc2d9162de950077c1a8ec20c4ba32c0e55367 453 1775137721817838543 diff --git a/.cache/go-build/eb/eb61a8be47ce4f68dd02fe8807c93518ebcb215da6b855693067c2d1d24b8dc9-d b/.cache/go-build/eb/eb61a8be47ce4f68dd02fe8807c93518ebcb215da6b855693067c2d1d24b8dc9-d deleted file mode 100644 index d18a0b6..0000000 Binary files a/.cache/go-build/eb/eb61a8be47ce4f68dd02fe8807c93518ebcb215da6b855693067c2d1d24b8dc9-d and /dev/null differ diff --git a/.cache/go-build/eb/eb87f4b7d08373ae2382380cf4409600ca0824e94e95930b41101ae8f9a02fcb-a b/.cache/go-build/eb/eb87f4b7d08373ae2382380cf4409600ca0824e94e95930b41101ae8f9a02fcb-a deleted file mode 100644 index f407a14..0000000 --- a/.cache/go-build/eb/eb87f4b7d08373ae2382380cf4409600ca0824e94e95930b41101ae8f9a02fcb-a +++ /dev/null @@ -1 +0,0 @@ -v1 eb87f4b7d08373ae2382380cf4409600ca0824e94e95930b41101ae8f9a02fcb e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289163573190 diff --git a/.cache/go-build/eb/eb88dbfb5705c0585184e80105081abfe766c01b8c133614027393614f27e10b-a b/.cache/go-build/eb/eb88dbfb5705c0585184e80105081abfe766c01b8c133614027393614f27e10b-a deleted file mode 100644 index d8c56db..0000000 --- a/.cache/go-build/eb/eb88dbfb5705c0585184e80105081abfe766c01b8c133614027393614f27e10b-a +++ /dev/null @@ -1 +0,0 @@ -v1 eb88dbfb5705c0585184e80105081abfe766c01b8c133614027393614f27e10b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289733442447 diff --git a/.cache/go-build/ec/ec35ed135138d14a598f88c6742df9034ec296d8a7e03d0bb047307afc6eb293-a b/.cache/go-build/ec/ec35ed135138d14a598f88c6742df9034ec296d8a7e03d0bb047307afc6eb293-a deleted file mode 100644 index 3ff85d2..0000000 --- a/.cache/go-build/ec/ec35ed135138d14a598f88c6742df9034ec296d8a7e03d0bb047307afc6eb293-a +++ /dev/null @@ -1 +0,0 @@ -v1 ec35ed135138d14a598f88c6742df9034ec296d8a7e03d0bb047307afc6eb293 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289667449000 diff --git a/.cache/go-build/ec/ec38fe8488910e3496fdaa3b1a82aeae09e50a4739ec27bd10b5f3c1dd2a44a8-a b/.cache/go-build/ec/ec38fe8488910e3496fdaa3b1a82aeae09e50a4739ec27bd10b5f3c1dd2a44a8-a deleted file mode 100644 index dc80a74..0000000 --- a/.cache/go-build/ec/ec38fe8488910e3496fdaa3b1a82aeae09e50a4739ec27bd10b5f3c1dd2a44a8-a +++ /dev/null @@ -1 +0,0 @@ -v1 ec38fe8488910e3496fdaa3b1a82aeae09e50a4739ec27bd10b5f3c1dd2a44a8 6d0d63d33d1b705ce6c973bf260bf1180405036812c83698c94b2a8a2f3f59f1 2656598 1775136289745856906 diff --git a/.cache/go-build/ec/ec434dd6b409dd804ad40240b74b59c8a203c8bba9d1fa0d2dc924f0e36e041f-a b/.cache/go-build/ec/ec434dd6b409dd804ad40240b74b59c8a203c8bba9d1fa0d2dc924f0e36e041f-a deleted file mode 100644 index 3ea1d42..0000000 --- a/.cache/go-build/ec/ec434dd6b409dd804ad40240b74b59c8a203c8bba9d1fa0d2dc924f0e36e041f-a +++ /dev/null @@ -1 +0,0 @@ -v1 ec434dd6b409dd804ad40240b74b59c8a203c8bba9d1fa0d2dc924f0e36e041f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722026771843 diff --git a/.cache/go-build/ec/ec49f2323f4e361d13d2fefbffeeebed6c8ac43006e0ce55ddab61be4366420b-d b/.cache/go-build/ec/ec49f2323f4e361d13d2fefbffeeebed6c8ac43006e0ce55ddab61be4366420b-d deleted file mode 100644 index b3a5cec..0000000 Binary files a/.cache/go-build/ec/ec49f2323f4e361d13d2fefbffeeebed6c8ac43006e0ce55ddab61be4366420b-d and /dev/null differ diff --git a/.cache/go-build/ec/ec7133d0eafe66d2ed3c226cf8312ddd52562883a3d39d7b9a0591afd22b3bac-a b/.cache/go-build/ec/ec7133d0eafe66d2ed3c226cf8312ddd52562883a3d39d7b9a0591afd22b3bac-a deleted file mode 100644 index cc20886..0000000 --- a/.cache/go-build/ec/ec7133d0eafe66d2ed3c226cf8312ddd52562883a3d39d7b9a0591afd22b3bac-a +++ /dev/null @@ -1 +0,0 @@ -v1 ec7133d0eafe66d2ed3c226cf8312ddd52562883a3d39d7b9a0591afd22b3bac e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288547097059 diff --git a/.cache/go-build/ec/ec717d48a28de060f9b6669e43cf2f92887e847335d77a12bde8f6b854649476-a b/.cache/go-build/ec/ec717d48a28de060f9b6669e43cf2f92887e847335d77a12bde8f6b854649476-a deleted file mode 100644 index eafe55f..0000000 --- a/.cache/go-build/ec/ec717d48a28de060f9b6669e43cf2f92887e847335d77a12bde8f6b854649476-a +++ /dev/null @@ -1 +0,0 @@ -v1 ec717d48a28de060f9b6669e43cf2f92887e847335d77a12bde8f6b854649476 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287150309390 diff --git a/.cache/go-build/ec/ec9571cf66355be727aad2663b58c1d0c13f7a724c86f40facabff9d303b2c32-a b/.cache/go-build/ec/ec9571cf66355be727aad2663b58c1d0c13f7a724c86f40facabff9d303b2c32-a deleted file mode 100644 index 7f897f1..0000000 --- a/.cache/go-build/ec/ec9571cf66355be727aad2663b58c1d0c13f7a724c86f40facabff9d303b2c32-a +++ /dev/null @@ -1 +0,0 @@ -v1 ec9571cf66355be727aad2663b58c1d0c13f7a724c86f40facabff9d303b2c32 df606d300bd5fb75a7d87f4650d7d4f5b36a4292d1194dd7abbdb12b0aa12d6e 108076 1775136288646494210 diff --git a/.cache/go-build/ed/ed14c70aa6edee56bcf3a84ead87b1bcbb039c6ae4993032633aa7abd747b5eb-a b/.cache/go-build/ed/ed14c70aa6edee56bcf3a84ead87b1bcbb039c6ae4993032633aa7abd747b5eb-a deleted file mode 100644 index 97e21e9..0000000 --- a/.cache/go-build/ed/ed14c70aa6edee56bcf3a84ead87b1bcbb039c6ae4993032633aa7abd747b5eb-a +++ /dev/null @@ -1 +0,0 @@ -v1 ed14c70aa6edee56bcf3a84ead87b1bcbb039c6ae4993032633aa7abd747b5eb 4c91fc0a57be83dd144d3a9e37118ca737f235fc6841d85f3b5ea37b7003e86e 84 1775136288664717603 diff --git a/.cache/go-build/ed/edf7bfe45e186c7d73eac5a90a537b0741151edc7043866d8b3a5aeb04458739-d b/.cache/go-build/ed/edf7bfe45e186c7d73eac5a90a537b0741151edc7043866d8b3a5aeb04458739-d deleted file mode 100644 index 56298c4..0000000 Binary files a/.cache/go-build/ed/edf7bfe45e186c7d73eac5a90a537b0741151edc7043866d8b3a5aeb04458739-d and /dev/null differ diff --git a/.cache/go-build/ee/ee29a4f34531ed0d09a5732741b6da32e90845676d82dad3a94b9af43087c533-a b/.cache/go-build/ee/ee29a4f34531ed0d09a5732741b6da32e90845676d82dad3a94b9af43087c533-a deleted file mode 100644 index d61c98a..0000000 --- a/.cache/go-build/ee/ee29a4f34531ed0d09a5732741b6da32e90845676d82dad3a94b9af43087c533-a +++ /dev/null @@ -1 +0,0 @@ -v1 ee29a4f34531ed0d09a5732741b6da32e90845676d82dad3a94b9af43087c533 434e26b82091625cbcf810b85463e5ace56fbdc0810c86c69b0e6ba2a0f692c3 46 1775136289309661434 diff --git a/.cache/go-build/ee/ee575944483fa0b726c8cc709aef6b17ec3219c863f2fed9550bec75838aaf2b-d b/.cache/go-build/ee/ee575944483fa0b726c8cc709aef6b17ec3219c863f2fed9550bec75838aaf2b-d deleted file mode 100644 index cbff97c..0000000 Binary files a/.cache/go-build/ee/ee575944483fa0b726c8cc709aef6b17ec3219c863f2fed9550bec75838aaf2b-d and /dev/null differ diff --git a/.cache/go-build/ee/ee5e79329901d3094e2ba154c2a9508b2fd872fa672574eb3a5bd0bbcb14a07b-d b/.cache/go-build/ee/ee5e79329901d3094e2ba154c2a9508b2fd872fa672574eb3a5bd0bbcb14a07b-d deleted file mode 100644 index b53c3c6..0000000 Binary files a/.cache/go-build/ee/ee5e79329901d3094e2ba154c2a9508b2fd872fa672574eb3a5bd0bbcb14a07b-d and /dev/null differ diff --git a/.cache/go-build/ee/ee6e207221f00142fde4703812ffcb28cb818d9c8d871a85e11f00368f74d11c-d b/.cache/go-build/ee/ee6e207221f00142fde4703812ffcb28cb818d9c8d871a85e11f00368f74d11c-d deleted file mode 100644 index 9a78a67..0000000 Binary files a/.cache/go-build/ee/ee6e207221f00142fde4703812ffcb28cb818d9c8d871a85e11f00368f74d11c-d and /dev/null differ diff --git a/.cache/go-build/ee/eee4037c4de1f635fb802b24422f9de9b6ce027fad149682ae7d0019c412c787-a b/.cache/go-build/ee/eee4037c4de1f635fb802b24422f9de9b6ce027fad149682ae7d0019c412c787-a deleted file mode 100644 index 32f6d93..0000000 --- a/.cache/go-build/ee/eee4037c4de1f635fb802b24422f9de9b6ce027fad149682ae7d0019c412c787-a +++ /dev/null @@ -1 +0,0 @@ -v1 eee4037c4de1f635fb802b24422f9de9b6ce027fad149682ae7d0019c412c787 cbf7be661fa5a442439113ff23eba22ec97b0ae9ad44ab9720673f35e92b915c 531 1775136286846911593 diff --git a/.cache/go-build/ef/ef4bff852aaf65f4e99e414e51dbe46a80c35024aec1bb56a051140e9f4d15cb-a b/.cache/go-build/ef/ef4bff852aaf65f4e99e414e51dbe46a80c35024aec1bb56a051140e9f4d15cb-a deleted file mode 100644 index 3e561a6..0000000 --- a/.cache/go-build/ef/ef4bff852aaf65f4e99e414e51dbe46a80c35024aec1bb56a051140e9f4d15cb-a +++ /dev/null @@ -1 +0,0 @@ -v1 ef4bff852aaf65f4e99e414e51dbe46a80c35024aec1bb56a051140e9f4d15cb d595f068d1fcc6e1ac2f09abedfb61aac667a05b891c65787ccdd6aafb27ba13 275438 1775136289383535717 diff --git a/.cache/go-build/ef/ef6d310a06181e3b9854fb7da820dd283d2e7499e7a9d463fe3d3a3aa750ba83-d b/.cache/go-build/ef/ef6d310a06181e3b9854fb7da820dd283d2e7499e7a9d463fe3d3a3aa750ba83-d deleted file mode 100644 index 2a455c4..0000000 Binary files a/.cache/go-build/ef/ef6d310a06181e3b9854fb7da820dd283d2e7499e7a9d463fe3d3a3aa750ba83-d and /dev/null differ diff --git a/.cache/go-build/ef/ef98d82ca2ed8cfd0849385dde16d465724d4c4ee11fb78e272f9de7664aa965-a b/.cache/go-build/ef/ef98d82ca2ed8cfd0849385dde16d465724d4c4ee11fb78e272f9de7664aa965-a deleted file mode 100644 index 1a89274..0000000 --- a/.cache/go-build/ef/ef98d82ca2ed8cfd0849385dde16d465724d4c4ee11fb78e272f9de7664aa965-a +++ /dev/null @@ -1 +0,0 @@ -v1 ef98d82ca2ed8cfd0849385dde16d465724d4c4ee11fb78e272f9de7664aa965 4ea8f71aa629179dcc37be86a8d85bb6eaf90850f41cb72e8e5d9cd11f822218 618 1775136286818458162 diff --git a/.cache/go-build/ef/efa763ae3537f45cf74293fc3c88a64ff509642e7583e65ef8a24356d1a82aa9-a b/.cache/go-build/ef/efa763ae3537f45cf74293fc3c88a64ff509642e7583e65ef8a24356d1a82aa9-a deleted file mode 100644 index 9813547..0000000 --- a/.cache/go-build/ef/efa763ae3537f45cf74293fc3c88a64ff509642e7583e65ef8a24356d1a82aa9-a +++ /dev/null @@ -1 +0,0 @@ -v1 efa763ae3537f45cf74293fc3c88a64ff509642e7583e65ef8a24356d1a82aa9 f0ee9d7b8fbb0afac809cb6c46cee7fd3a68befdf643ccdd00533820a8926177 10 1775136286936293017 diff --git a/.cache/go-build/ef/efad33a2faf7de947952496bad9b0741a4b562ade46cfb56cf55ed70869f0608-d b/.cache/go-build/ef/efad33a2faf7de947952496bad9b0741a4b562ade46cfb56cf55ed70869f0608-d deleted file mode 100644 index 25199c1..0000000 --- a/.cache/go-build/ef/efad33a2faf7de947952496bad9b0741a4b562ade46cfb56cf55ed70869f0608-d +++ /dev/null @@ -1,26 +0,0 @@ -# test log -getenv GOTMPDIR -getenv TMPDIR -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/src -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001 -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets/low -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001 -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets/high -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/build -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001 -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/nwn-tool.json -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets/low/shared.mdl -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets/high/shared.mdl -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/nwn-tool.json -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/src -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/build -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/src -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/src -stat /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets/high -open /tmp/TestValidateProjectWarnsForCrossHAKDuplicateAssets1616898555/001/assets/low -open /tmp diff --git a/.cache/go-build/f0/f07e31ad7edecc57e4832162c9f34e9bc05bd8e4b1b7aa0bc9058393ca2e8f27-a b/.cache/go-build/f0/f07e31ad7edecc57e4832162c9f34e9bc05bd8e4b1b7aa0bc9058393ca2e8f27-a deleted file mode 100644 index 2cd6445..0000000 --- a/.cache/go-build/f0/f07e31ad7edecc57e4832162c9f34e9bc05bd8e4b1b7aa0bc9058393ca2e8f27-a +++ /dev/null @@ -1 +0,0 @@ -v1 f07e31ad7edecc57e4832162c9f34e9bc05bd8e4b1b7aa0bc9058393ca2e8f27 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137722111084583 diff --git a/.cache/go-build/f0/f0bc772f20f4271c4a994a7167e5748701cf9566ffbbb2f36e75a56c40092592-a b/.cache/go-build/f0/f0bc772f20f4271c4a994a7167e5748701cf9566ffbbb2f36e75a56c40092592-a deleted file mode 100644 index 1e24dd4..0000000 --- a/.cache/go-build/f0/f0bc772f20f4271c4a994a7167e5748701cf9566ffbbb2f36e75a56c40092592-a +++ /dev/null @@ -1 +0,0 @@ -v1 f0bc772f20f4271c4a994a7167e5748701cf9566ffbbb2f36e75a56c40092592 157e8385eb1164ca3689941bb3d6e23cdbb4d2e5703ad6dde72d00d5796deb94 14 1775136286922178487 diff --git a/.cache/go-build/f0/f0c94d83e98ad65b15192292a7906fdd2a40e7bc2ba2f0d2f9d7d0f587328e36-a b/.cache/go-build/f0/f0c94d83e98ad65b15192292a7906fdd2a40e7bc2ba2f0d2f9d7d0f587328e36-a deleted file mode 100644 index c2ea823..0000000 --- a/.cache/go-build/f0/f0c94d83e98ad65b15192292a7906fdd2a40e7bc2ba2f0d2f9d7d0f587328e36-a +++ /dev/null @@ -1 +0,0 @@ -v1 f0c94d83e98ad65b15192292a7906fdd2a40e7bc2ba2f0d2f9d7d0f587328e36 8fcc41dfe9c4f88d72809f09252a8d8b9827c235e834351499701c1d64409776 256816 1775136289531882413 diff --git a/.cache/go-build/f0/f0d2c4ea3941667f208ce3f47c1fcebeca55a7c581c4476ec00f624b2be3f322-a b/.cache/go-build/f0/f0d2c4ea3941667f208ce3f47c1fcebeca55a7c581c4476ec00f624b2be3f322-a deleted file mode 100644 index d935858..0000000 --- a/.cache/go-build/f0/f0d2c4ea3941667f208ce3f47c1fcebeca55a7c581c4476ec00f624b2be3f322-a +++ /dev/null @@ -1 +0,0 @@ -v1 f0d2c4ea3941667f208ce3f47c1fcebeca55a7c581c4476ec00f624b2be3f322 b2af29285386fa2c879697ca25715a838acb9447a5a56498029d143653ce8174 1366296 1775136289934879052 diff --git a/.cache/go-build/f0/f0ee9d7b8fbb0afac809cb6c46cee7fd3a68befdf643ccdd00533820a8926177-d b/.cache/go-build/f0/f0ee9d7b8fbb0afac809cb6c46cee7fd3a68befdf643ccdd00533820a8926177-d deleted file mode 100644 index 1cdaa62..0000000 --- a/.cache/go-build/f0/f0ee9d7b8fbb0afac809cb6c46cee7fd3a68befdf643ccdd00533820a8926177-d +++ /dev/null @@ -1 +0,0 @@ -./math.go diff --git a/.cache/go-build/f1/f132b36a057ec0ec54de1980a9cd78442cdfef350aac5ecceb8b6bcde5cafe3a-a b/.cache/go-build/f1/f132b36a057ec0ec54de1980a9cd78442cdfef350aac5ecceb8b6bcde5cafe3a-a deleted file mode 100644 index ee51fe1..0000000 --- a/.cache/go-build/f1/f132b36a057ec0ec54de1980a9cd78442cdfef350aac5ecceb8b6bcde5cafe3a-a +++ /dev/null @@ -1 +0,0 @@ -v1 f132b36a057ec0ec54de1980a9cd78442cdfef350aac5ecceb8b6bcde5cafe3a 2f51a6646db43b27e6fc004144b66a7006194c36aef91e2b17e6e002775420ff 24828 1775136289428126489 diff --git a/.cache/go-build/f1/f1a103d0ea6ae872e3e771b9f9014af1758e816c00d4ca4ee5db9c2c452b0bce-a b/.cache/go-build/f1/f1a103d0ea6ae872e3e771b9f9014af1758e816c00d4ca4ee5db9c2c452b0bce-a deleted file mode 100644 index 573a90c..0000000 --- a/.cache/go-build/f1/f1a103d0ea6ae872e3e771b9f9014af1758e816c00d4ca4ee5db9c2c452b0bce-a +++ /dev/null @@ -1 +0,0 @@ -v1 f1a103d0ea6ae872e3e771b9f9014af1758e816c00d4ca4ee5db9c2c452b0bce 48d82578881e69e848668baa34e1235e9670424ffc2d538d1a1cb24e116a174e 657 1775136286805240783 diff --git a/.cache/go-build/f1/f1dd3501278b588119493e603cb65661bb17e78b7b6ed3ceb3ebd36c8be39674-a b/.cache/go-build/f1/f1dd3501278b588119493e603cb65661bb17e78b7b6ed3ceb3ebd36c8be39674-a deleted file mode 100644 index fb8f1e1..0000000 --- a/.cache/go-build/f1/f1dd3501278b588119493e603cb65661bb17e78b7b6ed3ceb3ebd36c8be39674-a +++ /dev/null @@ -1 +0,0 @@ -v1 f1dd3501278b588119493e603cb65661bb17e78b7b6ed3ceb3ebd36c8be39674 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775139428904733346 diff --git a/.cache/go-build/f1/f1e0a3c92a4bfe206898f1037be1c433aa07cba0ca74f7f319c4359d7a3ef741-d b/.cache/go-build/f1/f1e0a3c92a4bfe206898f1037be1c433aa07cba0ca74f7f319c4359d7a3ef741-d deleted file mode 100644 index 6b350d4..0000000 Binary files a/.cache/go-build/f1/f1e0a3c92a4bfe206898f1037be1c433aa07cba0ca74f7f319c4359d7a3ef741-d and /dev/null differ diff --git a/.cache/go-build/f1/f1e96a077e76b289711a71539d22c1101d5c6f1589b92d67ec442e82acdc4e43-a b/.cache/go-build/f1/f1e96a077e76b289711a71539d22c1101d5c6f1589b92d67ec442e82acdc4e43-a deleted file mode 100644 index 6f2985e..0000000 --- a/.cache/go-build/f1/f1e96a077e76b289711a71539d22c1101d5c6f1589b92d67ec442e82acdc4e43-a +++ /dev/null @@ -1 +0,0 @@ -v1 f1e96a077e76b289711a71539d22c1101d5c6f1589b92d67ec442e82acdc4e43 2f52bbcad7f48f13b96bbb5c5b5b3b997123b92dbcb4337b47f141bf63ce56f9 50 1775136288816653322 diff --git a/.cache/go-build/f1/f1ebf20474712a19b61f27fc636223feed0eeed61e7920441341f66bdd4f7a04-a b/.cache/go-build/f1/f1ebf20474712a19b61f27fc636223feed0eeed61e7920441341f66bdd4f7a04-a deleted file mode 100644 index 70cf321..0000000 --- a/.cache/go-build/f1/f1ebf20474712a19b61f27fc636223feed0eeed61e7920441341f66bdd4f7a04-a +++ /dev/null @@ -1 +0,0 @@ -v1 f1ebf20474712a19b61f27fc636223feed0eeed61e7920441341f66bdd4f7a04 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775139398598655520 diff --git a/.cache/go-build/f2/f20742bcb5cf1371846729a3cf42a0ded4c653cc4b7df43d2e7020a3163e8acd-a b/.cache/go-build/f2/f20742bcb5cf1371846729a3cf42a0ded4c653cc4b7df43d2e7020a3163e8acd-a deleted file mode 100644 index 7011aa0..0000000 --- a/.cache/go-build/f2/f20742bcb5cf1371846729a3cf42a0ded4c653cc4b7df43d2e7020a3163e8acd-a +++ /dev/null @@ -1 +0,0 @@ -v1 f20742bcb5cf1371846729a3cf42a0ded4c653cc4b7df43d2e7020a3163e8acd 377fb9290326a21d1cf245d213930510485d0649bdaadf1ff223cfa6f19c6f53 73 1775136290022206644 diff --git a/.cache/go-build/f2/f2510baf84cc395ad16673ae54f259ae1fa2ed493878e3ba7b893ef1efc9b72f-a b/.cache/go-build/f2/f2510baf84cc395ad16673ae54f259ae1fa2ed493878e3ba7b893ef1efc9b72f-a deleted file mode 100644 index 3b8c613..0000000 --- a/.cache/go-build/f2/f2510baf84cc395ad16673ae54f259ae1fa2ed493878e3ba7b893ef1efc9b72f-a +++ /dev/null @@ -1 +0,0 @@ -v1 f2510baf84cc395ad16673ae54f259ae1fa2ed493878e3ba7b893ef1efc9b72f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287241285665 diff --git a/.cache/go-build/f2/f287f24836233697586be7004cfb5e0eea131763ea7dc1f0d5c6c3bca4c1c794-a b/.cache/go-build/f2/f287f24836233697586be7004cfb5e0eea131763ea7dc1f0d5c6c3bca4c1c794-a deleted file mode 100644 index ac26e66..0000000 --- a/.cache/go-build/f2/f287f24836233697586be7004cfb5e0eea131763ea7dc1f0d5c6c3bca4c1c794-a +++ /dev/null @@ -1 +0,0 @@ -v1 f287f24836233697586be7004cfb5e0eea131763ea7dc1f0d5c6c3bca4c1c794 e647816996ce765d381a3448353856dd97d4363584455f594d5b0fe3f1cf0501 50608 1775138184139926462 diff --git a/.cache/go-build/f2/f290c737d48de6482ceb015ebaaaa26a63cf443a3cfa1ab1b3a02568408ee646-a b/.cache/go-build/f2/f290c737d48de6482ceb015ebaaaa26a63cf443a3cfa1ab1b3a02568408ee646-a deleted file mode 100644 index bd58bf6..0000000 --- a/.cache/go-build/f2/f290c737d48de6482ceb015ebaaaa26a63cf443a3cfa1ab1b3a02568408ee646-a +++ /dev/null @@ -1 +0,0 @@ -v1 f290c737d48de6482ceb015ebaaaa26a63cf443a3cfa1ab1b3a02568408ee646 1cb5cbd31a583a82779f67546e3c58b7e2969e74f3e0c86eb4f739a26f072a1b 11 1775137722029435705 diff --git a/.cache/go-build/f2/f2d4ae222ab7f4b7d37da365aa66006fba014e15c6a5bfa7d23089f502672fb8-a b/.cache/go-build/f2/f2d4ae222ab7f4b7d37da365aa66006fba014e15c6a5bfa7d23089f502672fb8-a deleted file mode 100644 index ce86294..0000000 --- a/.cache/go-build/f2/f2d4ae222ab7f4b7d37da365aa66006fba014e15c6a5bfa7d23089f502672fb8-a +++ /dev/null @@ -1 +0,0 @@ -v1 f2d4ae222ab7f4b7d37da365aa66006fba014e15c6a5bfa7d23089f502672fb8 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721869708890 diff --git a/.cache/go-build/f2/f2eb675f10fe0f573fdec735a93af277da012f1b41a41ee586df2aae6b24e8e9-d b/.cache/go-build/f2/f2eb675f10fe0f573fdec735a93af277da012f1b41a41ee586df2aae6b24e8e9-d deleted file mode 100644 index b90fc58..0000000 Binary files a/.cache/go-build/f2/f2eb675f10fe0f573fdec735a93af277da012f1b41a41ee586df2aae6b24e8e9-d and /dev/null differ diff --git a/.cache/go-build/f3/f307e7866be44427b767a93f60ea71266085a0b94a19e7312594ae4023905e52-a b/.cache/go-build/f3/f307e7866be44427b767a93f60ea71266085a0b94a19e7312594ae4023905e52-a deleted file mode 100644 index 5c50b2c..0000000 --- a/.cache/go-build/f3/f307e7866be44427b767a93f60ea71266085a0b94a19e7312594ae4023905e52-a +++ /dev/null @@ -1 +0,0 @@ -v1 f307e7866be44427b767a93f60ea71266085a0b94a19e7312594ae4023905e52 8197844951f03ec8df9aa57e1b5db17f1f13bf2abe8ea8e644182f4e8784f78b 400718 1775136289126069553 diff --git a/.cache/go-build/f3/f3630e204441f7470575bc1f7d347fbf15e224a4e18bf33a043e60bae4ede315-d b/.cache/go-build/f3/f3630e204441f7470575bc1f7d347fbf15e224a4e18bf33a043e60bae4ede315-d deleted file mode 100644 index 2b6ea39..0000000 Binary files a/.cache/go-build/f3/f3630e204441f7470575bc1f7d347fbf15e224a4e18bf33a043e60bae4ede315-d and /dev/null differ diff --git a/.cache/go-build/f3/f3d3a856ff3d4c362384c18154af6a616e38f321499db7ad492ee33e876d93f2-a b/.cache/go-build/f3/f3d3a856ff3d4c362384c18154af6a616e38f321499db7ad492ee33e876d93f2-a deleted file mode 100644 index adf815e..0000000 --- a/.cache/go-build/f3/f3d3a856ff3d4c362384c18154af6a616e38f321499db7ad492ee33e876d93f2-a +++ /dev/null @@ -1 +0,0 @@ -v1 f3d3a856ff3d4c362384c18154af6a616e38f321499db7ad492ee33e876d93f2 a1d88b39f399f92046bb00b6676cfe45831fd72d2e4ddf8182da46223293dc33 70750 1775136288423405680 diff --git a/.cache/go-build/f3/f3ecae30086cbad5399c3c1f4863e3cdf2182c301ac346b89988d029fb286fb3-a b/.cache/go-build/f3/f3ecae30086cbad5399c3c1f4863e3cdf2182c301ac346b89988d029fb286fb3-a deleted file mode 100644 index b2d0212..0000000 --- a/.cache/go-build/f3/f3ecae30086cbad5399c3c1f4863e3cdf2182c301ac346b89988d029fb286fb3-a +++ /dev/null @@ -1 +0,0 @@ -v1 f3ecae30086cbad5399c3c1f4863e3cdf2182c301ac346b89988d029fb286fb3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287005569666 diff --git a/.cache/go-build/f4/f439c6fd1016d67545c8f2676d409789df4ac558389c94cfe851218da9b5d802-a b/.cache/go-build/f4/f439c6fd1016d67545c8f2676d409789df4ac558389c94cfe851218da9b5d802-a deleted file mode 100644 index f75c858..0000000 --- a/.cache/go-build/f4/f439c6fd1016d67545c8f2676d409789df4ac558389c94cfe851218da9b5d802-a +++ /dev/null @@ -1 +0,0 @@ -v1 f439c6fd1016d67545c8f2676d409789df4ac558389c94cfe851218da9b5d802 df4311cdbdd38ca8545723f1d6cb1fce328e5c3ecc89cf38470c5a22790f5594 38256 1775136289356916018 diff --git a/.cache/go-build/f4/f4b284b76bd5beb87d2ce6d7578052f25cc1cdeea4db1f1a2c5bf5c802aba7a2-d b/.cache/go-build/f4/f4b284b76bd5beb87d2ce6d7578052f25cc1cdeea4db1f1a2c5bf5c802aba7a2-d deleted file mode 100644 index e8ee51a..0000000 Binary files a/.cache/go-build/f4/f4b284b76bd5beb87d2ce6d7578052f25cc1cdeea4db1f1a2c5bf5c802aba7a2-d and /dev/null differ diff --git a/.cache/go-build/f4/f4d736f94e3c59f88d27acccef0ca921afc91eb61863cba90f4c110b3edefd07-a b/.cache/go-build/f4/f4d736f94e3c59f88d27acccef0ca921afc91eb61863cba90f4c110b3edefd07-a deleted file mode 100644 index e5d682c..0000000 --- a/.cache/go-build/f4/f4d736f94e3c59f88d27acccef0ca921afc91eb61863cba90f4c110b3edefd07-a +++ /dev/null @@ -1 +0,0 @@ -v1 f4d736f94e3c59f88d27acccef0ca921afc91eb61863cba90f4c110b3edefd07 61a58218c9692da3490d3d1a4b78640dada47f7b4556cee8ca2e700ba8314e7c 39124 1775136288657616478 diff --git a/.cache/go-build/f4/f4f15a0dfe73b7db74943b2a2f0438b2579e36ee7622d2a7900e441e795afc5d-a b/.cache/go-build/f4/f4f15a0dfe73b7db74943b2a2f0438b2579e36ee7622d2a7900e441e795afc5d-a deleted file mode 100644 index b7662d0..0000000 --- a/.cache/go-build/f4/f4f15a0dfe73b7db74943b2a2f0438b2579e36ee7622d2a7900e441e795afc5d-a +++ /dev/null @@ -1 +0,0 @@ -v1 f4f15a0dfe73b7db74943b2a2f0438b2579e36ee7622d2a7900e441e795afc5d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289168792374 diff --git a/.cache/go-build/f5/f502da81ad708823cb5ea6c61b7f07f3b49cd9d264dff170551d11c9c7f2f4bb-d b/.cache/go-build/f5/f502da81ad708823cb5ea6c61b7f07f3b49cd9d264dff170551d11c9c7f2f4bb-d deleted file mode 100644 index d01e8d5..0000000 --- a/.cache/go-build/f5/f502da81ad708823cb5ea6c61b7f07f3b49cd9d264dff170551d11c9c7f2f4bb-d +++ /dev/null @@ -1,2 +0,0 @@ -./doc.go -./nomsan.go diff --git a/.cache/go-build/f5/f545eea03c3b3918eb9ea8da640e4096bb88e737da8fe79b982282e391034a00-d b/.cache/go-build/f5/f545eea03c3b3918eb9ea8da640e4096bb88e737da8fe79b982282e391034a00-d deleted file mode 100644 index ac24012..0000000 --- a/.cache/go-build/f5/f545eea03c3b3918eb9ea8da640e4096bb88e737da8fe79b982282e391034a00-d +++ /dev/null @@ -1,5 +0,0 @@ -./exp.go -./normal.go -./rand.go -./rng.go -./zipf.go diff --git a/.cache/go-build/f5/f54901d5896c3075ac1363d3df22bd973fa3a3bfa4ae391b2e88faeab57a8c89-a b/.cache/go-build/f5/f54901d5896c3075ac1363d3df22bd973fa3a3bfa4ae391b2e88faeab57a8c89-a deleted file mode 100644 index 85c614f..0000000 --- a/.cache/go-build/f5/f54901d5896c3075ac1363d3df22bd973fa3a3bfa4ae391b2e88faeab57a8c89-a +++ /dev/null @@ -1 +0,0 @@ -v1 f54901d5896c3075ac1363d3df22bd973fa3a3bfa4ae391b2e88faeab57a8c89 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288830274341 diff --git a/.cache/go-build/f5/f55afd9a4f14853211522745c6bdfb71ef7abc4c889eb44e9806453eb839eba7-a b/.cache/go-build/f5/f55afd9a4f14853211522745c6bdfb71ef7abc4c889eb44e9806453eb839eba7-a deleted file mode 100644 index 4a122c3..0000000 --- a/.cache/go-build/f5/f55afd9a4f14853211522745c6bdfb71ef7abc4c889eb44e9806453eb839eba7-a +++ /dev/null @@ -1 +0,0 @@ -v1 f55afd9a4f14853211522745c6bdfb71ef7abc4c889eb44e9806453eb839eba7 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289847849749 diff --git a/.cache/go-build/f5/f5885fa60abded0fd59ad23cfa78ac0caa2339858ecb6ddc63809eae7cb4b81e-a b/.cache/go-build/f5/f5885fa60abded0fd59ad23cfa78ac0caa2339858ecb6ddc63809eae7cb4b81e-a deleted file mode 100644 index 2fc6e05..0000000 --- a/.cache/go-build/f5/f5885fa60abded0fd59ad23cfa78ac0caa2339858ecb6ddc63809eae7cb4b81e-a +++ /dev/null @@ -1 +0,0 @@ -v1 f5885fa60abded0fd59ad23cfa78ac0caa2339858ecb6ddc63809eae7cb4b81e 3883346c29ed4c9ce9a7af877a65ce6092aee15d56081ef6bd3b5c142ab2f7c8 1864 1775136286950964187 diff --git a/.cache/go-build/f5/f5a37e05b1ac45d6280152984ee1e3984bb9861e5126bda7aef6e0e85d09b82b-a b/.cache/go-build/f5/f5a37e05b1ac45d6280152984ee1e3984bb9861e5126bda7aef6e0e85d09b82b-a deleted file mode 100644 index 1cf0ee7..0000000 --- a/.cache/go-build/f5/f5a37e05b1ac45d6280152984ee1e3984bb9861e5126bda7aef6e0e85d09b82b-a +++ /dev/null @@ -1 +0,0 @@ -v1 f5a37e05b1ac45d6280152984ee1e3984bb9861e5126bda7aef6e0e85d09b82b 132f05341bf64f480c4028f75f54882ac9df66713cd5c6ed2b4cb38c2b3c7ebf 936 1775136289788832807 diff --git a/.cache/go-build/f5/f5af47691b4c804b373b947595ee26ab1bac9fe817cd4070f2411b2f1d9a4b78-d b/.cache/go-build/f5/f5af47691b4c804b373b947595ee26ab1bac9fe817cd4070f2411b2f1d9a4b78-d deleted file mode 100644 index 3e0c05b..0000000 --- a/.cache/go-build/f5/f5af47691b4c804b373b947595ee26ab1bac9fe817cd4070f2411b2f1d9a4b78-d +++ /dev/null @@ -1 +0,0 @@ -./alias.go diff --git a/.cache/go-build/f5/f5d36139f4a76b8ce2c3cb75f9dbc74c849e3664420a853291cc471358349ed3-a b/.cache/go-build/f5/f5d36139f4a76b8ce2c3cb75f9dbc74c849e3664420a853291cc471358349ed3-a deleted file mode 100644 index a430a7d..0000000 --- a/.cache/go-build/f5/f5d36139f4a76b8ce2c3cb75f9dbc74c849e3664420a853291cc471358349ed3-a +++ /dev/null @@ -1 +0,0 @@ -v1 f5d36139f4a76b8ce2c3cb75f9dbc74c849e3664420a853291cc471358349ed3 763ede75709e39969804c657713ec378ee2aee5f3bb26350a65cc38714d46034 106942 1775137721869972611 diff --git a/.cache/go-build/f6/f6060cd2cb84196f324d65bb025e416e605dadae8a7e1ba789f554fe58a29c55-d b/.cache/go-build/f6/f6060cd2cb84196f324d65bb025e416e605dadae8a7e1ba789f554fe58a29c55-d deleted file mode 100644 index 8cbfd47..0000000 Binary files a/.cache/go-build/f6/f6060cd2cb84196f324d65bb025e416e605dadae8a7e1ba789f554fe58a29c55-d and /dev/null differ diff --git a/.cache/go-build/f6/f6647ffb74edf4c722eef1363d056b35f8407a66d5ce341c4db0c3666c489ad4-a b/.cache/go-build/f6/f6647ffb74edf4c722eef1363d056b35f8407a66d5ce341c4db0c3666c489ad4-a deleted file mode 100644 index 60ce44a..0000000 --- a/.cache/go-build/f6/f6647ffb74edf4c722eef1363d056b35f8407a66d5ce341c4db0c3666c489ad4-a +++ /dev/null @@ -1 +0,0 @@ -v1 f6647ffb74edf4c722eef1363d056b35f8407a66d5ce341c4db0c3666c489ad4 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286927611261 diff --git a/.cache/go-build/f7/f71e474ace0a8f8c5ebfe5b63a182499f2450adc91aad7fd261243649c1e2e18-a b/.cache/go-build/f7/f71e474ace0a8f8c5ebfe5b63a182499f2450adc91aad7fd261243649c1e2e18-a deleted file mode 100644 index 8a666e4..0000000 --- a/.cache/go-build/f7/f71e474ace0a8f8c5ebfe5b63a182499f2450adc91aad7fd261243649c1e2e18-a +++ /dev/null @@ -1 +0,0 @@ -v1 f71e474ace0a8f8c5ebfe5b63a182499f2450adc91aad7fd261243649c1e2e18 026ea4421214fcc424b21d42ac4a27aa52dcc9a54b0a628bf2df751e6f46bc81 150 1775136288828039950 diff --git a/.cache/go-build/f7/f7375242cdc526306473c97a372ded6986ff2efd1bd6722fa0b5280b1601646a-a b/.cache/go-build/f7/f7375242cdc526306473c97a372ded6986ff2efd1bd6722fa0b5280b1601646a-a deleted file mode 100644 index dd9ae8d..0000000 --- a/.cache/go-build/f7/f7375242cdc526306473c97a372ded6986ff2efd1bd6722fa0b5280b1601646a-a +++ /dev/null @@ -1 +0,0 @@ -v1 f7375242cdc526306473c97a372ded6986ff2efd1bd6722fa0b5280b1601646a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289960982970 diff --git a/.cache/go-build/f7/f763c5f0634d0bb362ff579f4998f86b61fbcde8f0ff94f88794162becc00599-d b/.cache/go-build/f7/f763c5f0634d0bb362ff579f4998f86b61fbcde8f0ff94f88794162becc00599-d deleted file mode 100644 index f579129..0000000 Binary files a/.cache/go-build/f7/f763c5f0634d0bb362ff579f4998f86b61fbcde8f0ff94f88794162becc00599-d and /dev/null differ diff --git a/.cache/go-build/f7/f778326bf7b16df13bc74ee2094c4d2e148e906365dd91a31a80cc2b1702e010-a b/.cache/go-build/f7/f778326bf7b16df13bc74ee2094c4d2e148e906365dd91a31a80cc2b1702e010-a deleted file mode 100644 index a85efc0..0000000 --- a/.cache/go-build/f7/f778326bf7b16df13bc74ee2094c4d2e148e906365dd91a31a80cc2b1702e010-a +++ /dev/null @@ -1 +0,0 @@ -v1 f778326bf7b16df13bc74ee2094c4d2e148e906365dd91a31a80cc2b1702e010 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289788911567 diff --git a/.cache/go-build/f7/f7e4c782e436216181620589231287b177b9d2552e85b5070153eb743c8b35cc-d b/.cache/go-build/f7/f7e4c782e436216181620589231287b177b9d2552e85b5070153eb743c8b35cc-d deleted file mode 100644 index aa7df7a..0000000 Binary files a/.cache/go-build/f7/f7e4c782e436216181620589231287b177b9d2552e85b5070153eb743c8b35cc-d and /dev/null differ diff --git a/.cache/go-build/f7/f7e5fd2dc4dcc5b028923e3c8dd8a88821275c6afa7f50f13c5f3f8895ba133e-a b/.cache/go-build/f7/f7e5fd2dc4dcc5b028923e3c8dd8a88821275c6afa7f50f13c5f3f8895ba133e-a deleted file mode 100644 index efb4b57..0000000 --- a/.cache/go-build/f7/f7e5fd2dc4dcc5b028923e3c8dd8a88821275c6afa7f50f13c5f3f8895ba133e-a +++ /dev/null @@ -1 +0,0 @@ -v1 f7e5fd2dc4dcc5b028923e3c8dd8a88821275c6afa7f50f13c5f3f8895ba133e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287162953769 diff --git a/.cache/go-build/f7/f7fee73a2e8453247b517b190055aa0501127a7a7c601c8865bad12c7caa3ff7-a b/.cache/go-build/f7/f7fee73a2e8453247b517b190055aa0501127a7a7c601c8865bad12c7caa3ff7-a deleted file mode 100644 index 380831c..0000000 --- a/.cache/go-build/f7/f7fee73a2e8453247b517b190055aa0501127a7a7c601c8865bad12c7caa3ff7-a +++ /dev/null @@ -1 +0,0 @@ -v1 f7fee73a2e8453247b517b190055aa0501127a7a7c601c8865bad12c7caa3ff7 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289835075900 diff --git a/.cache/go-build/f8/f8193f89648ee1f86886d45033b6c762a12bf33713e5b3fc15bed941470ea70e-a b/.cache/go-build/f8/f8193f89648ee1f86886d45033b6c762a12bf33713e5b3fc15bed941470ea70e-a deleted file mode 100644 index 9a4eef6..0000000 --- a/.cache/go-build/f8/f8193f89648ee1f86886d45033b6c762a12bf33713e5b3fc15bed941470ea70e-a +++ /dev/null @@ -1 +0,0 @@ -v1 f8193f89648ee1f86886d45033b6c762a12bf33713e5b3fc15bed941470ea70e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286927585481 diff --git a/.cache/go-build/f8/f82bb9f99109f07bee6926e290a034795497421be345d5b7c8da92e3024971a5-d b/.cache/go-build/f8/f82bb9f99109f07bee6926e290a034795497421be345d5b7c8da92e3024971a5-d deleted file mode 100644 index ad9ffc4..0000000 Binary files a/.cache/go-build/f8/f82bb9f99109f07bee6926e290a034795497421be345d5b7c8da92e3024971a5-d and /dev/null differ diff --git a/.cache/go-build/f8/f83c07ae03c75b88d41d4d980be2513d5ef5ef1b417c9776ad5af10d16ec6e0c-a b/.cache/go-build/f8/f83c07ae03c75b88d41d4d980be2513d5ef5ef1b417c9776ad5af10d16ec6e0c-a deleted file mode 100644 index 55abd3e..0000000 --- a/.cache/go-build/f8/f83c07ae03c75b88d41d4d980be2513d5ef5ef1b417c9776ad5af10d16ec6e0c-a +++ /dev/null @@ -1 +0,0 @@ -v1 f83c07ae03c75b88d41d4d980be2513d5ef5ef1b417c9776ad5af10d16ec6e0c e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287138931062 diff --git a/.cache/go-build/f8/f8769999f83ec319ccf5643368cbc53e4c8c03df2352eb13fdf5ed3ac3c0ca48-a b/.cache/go-build/f8/f8769999f83ec319ccf5643368cbc53e4c8c03df2352eb13fdf5ed3ac3c0ca48-a deleted file mode 100644 index a3b15f1..0000000 --- a/.cache/go-build/f8/f8769999f83ec319ccf5643368cbc53e4c8c03df2352eb13fdf5ed3ac3c0ca48-a +++ /dev/null @@ -1 +0,0 @@ -v1 f8769999f83ec319ccf5643368cbc53e4c8c03df2352eb13fdf5ed3ac3c0ca48 ba95cdece7d24eeed04def67985ba5d695d43293b60da06cff3ab12b0c58ce8f 842742 1775136289489728103 diff --git a/.cache/go-build/f8/f88b59a1423031a4de3454f7edf80c574abd30454d09d7616015ae991aa70249-a b/.cache/go-build/f8/f88b59a1423031a4de3454f7edf80c574abd30454d09d7616015ae991aa70249-a deleted file mode 100644 index 6cf5106..0000000 --- a/.cache/go-build/f8/f88b59a1423031a4de3454f7edf80c574abd30454d09d7616015ae991aa70249-a +++ /dev/null @@ -1 +0,0 @@ -v1 f88b59a1423031a4de3454f7edf80c574abd30454d09d7616015ae991aa70249 b4f07cd8a0757cae0bc39355ea08c3674801eadcc225b1afdeed0f4dd7e92f82 18 1775136286917369673 diff --git a/.cache/go-build/f8/f8af786b4617d8152cf177c34ea5c00d4892b181afa0c44f2791d71a0491d226-a b/.cache/go-build/f8/f8af786b4617d8152cf177c34ea5c00d4892b181afa0c44f2791d71a0491d226-a deleted file mode 100644 index 207a852..0000000 --- a/.cache/go-build/f8/f8af786b4617d8152cf177c34ea5c00d4892b181afa0c44f2791d71a0491d226-a +++ /dev/null @@ -1 +0,0 @@ -v1 f8af786b4617d8152cf177c34ea5c00d4892b181afa0c44f2791d71a0491d226 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286981784639 diff --git a/.cache/go-build/f9/f9863c139f35d4de9b40c409cd891cb883a9bd91cfad5f614bf9c6cbc69b7d73-a b/.cache/go-build/f9/f9863c139f35d4de9b40c409cd891cb883a9bd91cfad5f614bf9c6cbc69b7d73-a deleted file mode 100644 index 5e231a8..0000000 --- a/.cache/go-build/f9/f9863c139f35d4de9b40c409cd891cb883a9bd91cfad5f614bf9c6cbc69b7d73-a +++ /dev/null @@ -1 +0,0 @@ -v1 f9863c139f35d4de9b40c409cd891cb883a9bd91cfad5f614bf9c6cbc69b7d73 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137376818651001 diff --git a/.cache/go-build/f9/f993f36cb9e212f329c87f8850bc85bfafd252cd9b570e03245e87d4bd4f8e4a-a b/.cache/go-build/f9/f993f36cb9e212f329c87f8850bc85bfafd252cd9b570e03245e87d4bd4f8e4a-a deleted file mode 100644 index 5829a8e..0000000 --- a/.cache/go-build/f9/f993f36cb9e212f329c87f8850bc85bfafd252cd9b570e03245e87d4bd4f8e4a-a +++ /dev/null @@ -1 +0,0 @@ -v1 f993f36cb9e212f329c87f8850bc85bfafd252cd9b570e03245e87d4bd4f8e4a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775137721906305747 diff --git a/.cache/go-build/f9/f9f772f43ee81e747468edd18ea8c36b1fda4ee55cf7d2f07b0875608265a756-a b/.cache/go-build/f9/f9f772f43ee81e747468edd18ea8c36b1fda4ee55cf7d2f07b0875608265a756-a deleted file mode 100644 index 7a83e66..0000000 --- a/.cache/go-build/f9/f9f772f43ee81e747468edd18ea8c36b1fda4ee55cf7d2f07b0875608265a756-a +++ /dev/null @@ -1 +0,0 @@ -v1 f9f772f43ee81e747468edd18ea8c36b1fda4ee55cf7d2f07b0875608265a756 488f59492c5d2acb89df6f7dd4adeb489e794f4c7f4b7099b1ce8bfd4bb76555 10 1775139461343687668 diff --git a/.cache/go-build/fa/fa3ba957b8b7e24f6e6fd6f6d75f624f3f464f94c1d4619ca7ca81aeab54f60f-a b/.cache/go-build/fa/fa3ba957b8b7e24f6e6fd6f6d75f624f3f464f94c1d4619ca7ca81aeab54f60f-a deleted file mode 100644 index d275385..0000000 --- a/.cache/go-build/fa/fa3ba957b8b7e24f6e6fd6f6d75f624f3f464f94c1d4619ca7ca81aeab54f60f-a +++ /dev/null @@ -1 +0,0 @@ -v1 fa3ba957b8b7e24f6e6fd6f6d75f624f3f464f94c1d4619ca7ca81aeab54f60f e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288691142232 diff --git a/.cache/go-build/fa/faa6356a35be54d7c1b11cd9f30c96195ffb0882f1aa595a4e7b01c4b8d78312-a b/.cache/go-build/fa/faa6356a35be54d7c1b11cd9f30c96195ffb0882f1aa595a4e7b01c4b8d78312-a deleted file mode 100644 index 85b886a..0000000 --- a/.cache/go-build/fa/faa6356a35be54d7c1b11cd9f30c96195ffb0882f1aa595a4e7b01c4b8d78312-a +++ /dev/null @@ -1 +0,0 @@ -v1 faa6356a35be54d7c1b11cd9f30c96195ffb0882f1aa595a4e7b01c4b8d78312 3ec496f7e72d60d66b2915f3cf8975bb94b79c4d57e08c3f65fedf46eb5d0339 428 1775136286935666946 diff --git a/.cache/go-build/fa/faa6ed64e4fcc05c10716de470e71d526d2ad2ee5cd39908a9f0c1d8a0b7dbc1-d b/.cache/go-build/fa/faa6ed64e4fcc05c10716de470e71d526d2ad2ee5cd39908a9f0c1d8a0b7dbc1-d deleted file mode 100644 index 65acfc5..0000000 Binary files a/.cache/go-build/fa/faa6ed64e4fcc05c10716de470e71d526d2ad2ee5cd39908a9f0c1d8a0b7dbc1-d and /dev/null differ diff --git a/.cache/go-build/fa/fadaad7e9416440fc414ccc4ed1c75cec218b5704793841b8d612cead144854b-a b/.cache/go-build/fa/fadaad7e9416440fc414ccc4ed1c75cec218b5704793841b8d612cead144854b-a deleted file mode 100644 index bc4bb50..0000000 --- a/.cache/go-build/fa/fadaad7e9416440fc414ccc4ed1c75cec218b5704793841b8d612cead144854b-a +++ /dev/null @@ -1 +0,0 @@ -v1 fadaad7e9416440fc414ccc4ed1c75cec218b5704793841b8d612cead144854b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289000449413 diff --git a/.cache/go-build/fa/fadd4287518b8dc8d60cf6eb03665702b13804a739459d6016bcb447cd239af1-d b/.cache/go-build/fa/fadd4287518b8dc8d60cf6eb03665702b13804a739459d6016bcb447cd239af1-d deleted file mode 100644 index 052c8e1..0000000 Binary files a/.cache/go-build/fa/fadd4287518b8dc8d60cf6eb03665702b13804a739459d6016bcb447cd239af1-d and /dev/null differ diff --git a/.cache/go-build/fb/fb01c04f22e645ca815fa05c79559a9ee525df0871e5d4061100ba56b82b8dff-a b/.cache/go-build/fb/fb01c04f22e645ca815fa05c79559a9ee525df0871e5d4061100ba56b82b8dff-a deleted file mode 100644 index 29be243..0000000 --- a/.cache/go-build/fb/fb01c04f22e645ca815fa05c79559a9ee525df0871e5d4061100ba56b82b8dff-a +++ /dev/null @@ -1 +0,0 @@ -v1 fb01c04f22e645ca815fa05c79559a9ee525df0871e5d4061100ba56b82b8dff 2ef666bee869c798740350779df3a85524f7785fd736cdff74dcc09ed4c83a1e 29654 1775136287117553866 diff --git a/.cache/go-build/fb/fb0efff6fbf0638e5ea407a86b3c6e0ee7820ccfa8c1599f639dcfdb062e220d-a b/.cache/go-build/fb/fb0efff6fbf0638e5ea407a86b3c6e0ee7820ccfa8c1599f639dcfdb062e220d-a deleted file mode 100644 index bf88379..0000000 --- a/.cache/go-build/fb/fb0efff6fbf0638e5ea407a86b3c6e0ee7820ccfa8c1599f639dcfdb062e220d-a +++ /dev/null @@ -1 +0,0 @@ -v1 fb0efff6fbf0638e5ea407a86b3c6e0ee7820ccfa8c1599f639dcfdb062e220d f7e4c782e436216181620589231287b177b9d2552e85b5070153eb743c8b35cc 2890 1775136286815049110 diff --git a/.cache/go-build/fb/fb3bb9d81a6680b6d9a18a72386b780f006c59411d4a975860d76992b1f15d99-a b/.cache/go-build/fb/fb3bb9d81a6680b6d9a18a72386b780f006c59411d4a975860d76992b1f15d99-a deleted file mode 100644 index 24fb62f..0000000 --- a/.cache/go-build/fb/fb3bb9d81a6680b6d9a18a72386b780f006c59411d4a975860d76992b1f15d99-a +++ /dev/null @@ -1 +0,0 @@ -v1 fb3bb9d81a6680b6d9a18a72386b780f006c59411d4a975860d76992b1f15d99 4d2c5f21c1322f3bef333277bdcf0ec840f13ee0983340c1622ca37b618d63c6 32700 1775141782712425109 diff --git a/.cache/go-build/fb/fb4cd615c5549b1e2bdf1b98facb908ed68af90a8c02cadb976e56f446bf63bc-a b/.cache/go-build/fb/fb4cd615c5549b1e2bdf1b98facb908ed68af90a8c02cadb976e56f446bf63bc-a deleted file mode 100644 index ed4c4de..0000000 --- a/.cache/go-build/fb/fb4cd615c5549b1e2bdf1b98facb908ed68af90a8c02cadb976e56f446bf63bc-a +++ /dev/null @@ -1 +0,0 @@ -v1 fb4cd615c5549b1e2bdf1b98facb908ed68af90a8c02cadb976e56f446bf63bc 8703d50921795a0563957f70dc8439c2e5ffb363aa445e6757dd829d51a31364 1003 1775136286805407143 diff --git a/.cache/go-build/fb/fb6fea268893c79acf568f576754976bc8d18ea573e64e1f5ae2bcd220025371-a b/.cache/go-build/fb/fb6fea268893c79acf568f576754976bc8d18ea573e64e1f5ae2bcd220025371-a deleted file mode 100644 index 8a9ece2..0000000 --- a/.cache/go-build/fb/fb6fea268893c79acf568f576754976bc8d18ea573e64e1f5ae2bcd220025371-a +++ /dev/null @@ -1 +0,0 @@ -v1 fb6fea268893c79acf568f576754976bc8d18ea573e64e1f5ae2bcd220025371 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286956514681 diff --git a/.cache/go-build/fb/fb856273852fdb372d5e36000dce464d30f5657747f76592cc0ab9103fe1442e-a b/.cache/go-build/fb/fb856273852fdb372d5e36000dce464d30f5657747f76592cc0ab9103fe1442e-a deleted file mode 100644 index ae128fc..0000000 --- a/.cache/go-build/fb/fb856273852fdb372d5e36000dce464d30f5657747f76592cc0ab9103fe1442e-a +++ /dev/null @@ -1 +0,0 @@ -v1 fb856273852fdb372d5e36000dce464d30f5657747f76592cc0ab9103fe1442e e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289016539135 diff --git a/.cache/go-build/fb/fbd3f0a0b1bcb06b94a210547b346183455be303d482240b6e3b775ad91141c1-d b/.cache/go-build/fb/fbd3f0a0b1bcb06b94a210547b346183455be303d482240b6e3b775ad91141c1-d deleted file mode 100644 index 84f6434..0000000 --- a/.cache/go-build/fb/fbd3f0a0b1bcb06b94a210547b346183455be303d482240b6e3b775ad91141c1-d +++ /dev/null @@ -1,3 +0,0 @@ -./io.go -./multi.go -./pipe.go diff --git a/.cache/go-build/fb/fbd92e222d5c80c836e2588a7ec6c5a48fc51ef16362a7607b49573105c1cfa1-a b/.cache/go-build/fb/fbd92e222d5c80c836e2588a7ec6c5a48fc51ef16362a7607b49573105c1cfa1-a deleted file mode 100644 index 1aeb2ad..0000000 --- a/.cache/go-build/fb/fbd92e222d5c80c836e2588a7ec6c5a48fc51ef16362a7607b49573105c1cfa1-a +++ /dev/null @@ -1 +0,0 @@ -v1 fbd92e222d5c80c836e2588a7ec6c5a48fc51ef16362a7607b49573105c1cfa1 a79e84c5f6c3f099c3e13510d142ae3c4e7d24621f37bc916dfc7c4457b9f17b 1063304 1775139398497032627 diff --git a/.cache/go-build/fb/fbf683cd1314637c28aaf4fb65205d990c459938c32673d6492b0a046c5a2483-d b/.cache/go-build/fb/fbf683cd1314637c28aaf4fb65205d990c459938c32673d6492b0a046c5a2483-d deleted file mode 100644 index 3a0ec28..0000000 --- a/.cache/go-build/fb/fbf683cd1314637c28aaf4fb65205d990c459938c32673d6492b0a046c5a2483-d +++ /dev/null @@ -1 +0,0 @@ -./base64.go diff --git a/.cache/go-build/fc/fc40abd0343f9a80c5b3dab549574858d22f9d70262ed2d3a847fdb54e3e303e-d b/.cache/go-build/fc/fc40abd0343f9a80c5b3dab549574858d22f9d70262ed2d3a847fdb54e3e303e-d deleted file mode 100644 index 007e739..0000000 --- a/.cache/go-build/fc/fc40abd0343f9a80c5b3dab549574858d22f9d70262ed2d3a847fdb54e3e303e-d +++ /dev/null @@ -1 +0,0 @@ -./errors.go diff --git a/.cache/go-build/fc/fc4378632774e4b117e9a72fa3e8054a7dc9c236df81033b38ab1126a96f0e10-a b/.cache/go-build/fc/fc4378632774e4b117e9a72fa3e8054a7dc9c236df81033b38ab1126a96f0e10-a deleted file mode 100644 index b74781f..0000000 --- a/.cache/go-build/fc/fc4378632774e4b117e9a72fa3e8054a7dc9c236df81033b38ab1126a96f0e10-a +++ /dev/null @@ -1 +0,0 @@ -v1 fc4378632774e4b117e9a72fa3e8054a7dc9c236df81033b38ab1126a96f0e10 4c1067a68aeaf4c6291f18e64d6e9c42e7ac444a7a53819aebeb96211416b24e 2783 1775136286930582253 diff --git a/.cache/go-build/fc/fc5784626da4a5f1ab08038a01b9f7f7461262fc0e9d8d600ee659fa3a867684-a b/.cache/go-build/fc/fc5784626da4a5f1ab08038a01b9f7f7461262fc0e9d8d600ee659fa3a867684-a deleted file mode 100644 index abe910d..0000000 --- a/.cache/go-build/fc/fc5784626da4a5f1ab08038a01b9f7f7461262fc0e9d8d600ee659fa3a867684-a +++ /dev/null @@ -1 +0,0 @@ -v1 fc5784626da4a5f1ab08038a01b9f7f7461262fc0e9d8d600ee659fa3a867684 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286929037492 diff --git a/.cache/go-build/fc/fc6521aae039b7c747cdfdce27f64907fb0b74e9aeeeddbd7d1f0c23a7004f42-a b/.cache/go-build/fc/fc6521aae039b7c747cdfdce27f64907fb0b74e9aeeeddbd7d1f0c23a7004f42-a deleted file mode 100644 index 4dca13f..0000000 --- a/.cache/go-build/fc/fc6521aae039b7c747cdfdce27f64907fb0b74e9aeeeddbd7d1f0c23a7004f42-a +++ /dev/null @@ -1 +0,0 @@ -v1 fc6521aae039b7c747cdfdce27f64907fb0b74e9aeeeddbd7d1f0c23a7004f42 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288700799609 diff --git a/.cache/go-build/fc/fc782bc7dd37e0b88f53208ee73cc6716a4045e14a9f77e5200b2765d5e2e77d-a b/.cache/go-build/fc/fc782bc7dd37e0b88f53208ee73cc6716a4045e14a9f77e5200b2765d5e2e77d-a deleted file mode 100644 index 6d37b05..0000000 --- a/.cache/go-build/fc/fc782bc7dd37e0b88f53208ee73cc6716a4045e14a9f77e5200b2765d5e2e77d-a +++ /dev/null @@ -1 +0,0 @@ -v1 fc782bc7dd37e0b88f53208ee73cc6716a4045e14a9f77e5200b2765d5e2e77d e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287001713554 diff --git a/.cache/go-build/fd/fd76f6c6340e0bac1c256c2fc9266f5b2a402db09ad9ef38a9c2c3a46186c0b3-a b/.cache/go-build/fd/fd76f6c6340e0bac1c256c2fc9266f5b2a402db09ad9ef38a9c2c3a46186c0b3-a deleted file mode 100644 index 2764b52..0000000 --- a/.cache/go-build/fd/fd76f6c6340e0bac1c256c2fc9266f5b2a402db09ad9ef38a9c2c3a46186c0b3-a +++ /dev/null @@ -1 +0,0 @@ -v1 fd76f6c6340e0bac1c256c2fc9266f5b2a402db09ad9ef38a9c2c3a46186c0b3 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136286954914420 diff --git a/.cache/go-build/fd/fdb66e988c5ae12db7ad6c14a5da8f900bc03df059d555517ae610f7ff0db24b-a b/.cache/go-build/fd/fdb66e988c5ae12db7ad6c14a5da8f900bc03df059d555517ae610f7ff0db24b-a deleted file mode 100644 index 7e89be1..0000000 --- a/.cache/go-build/fd/fdb66e988c5ae12db7ad6c14a5da8f900bc03df059d555517ae610f7ff0db24b-a +++ /dev/null @@ -1 +0,0 @@ -v1 fdb66e988c5ae12db7ad6c14a5da8f900bc03df059d555517ae610f7ff0db24b e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289483305389 diff --git a/.cache/go-build/fd/fdc7b4a3bf33debb1ab1087076eaafb0d4a7118d583ef7f27ab3c97a28b6efad-d b/.cache/go-build/fd/fdc7b4a3bf33debb1ab1087076eaafb0d4a7118d583ef7f27ab3c97a28b6efad-d deleted file mode 100644 index 3a486f1..0000000 Binary files a/.cache/go-build/fd/fdc7b4a3bf33debb1ab1087076eaafb0d4a7118d583ef7f27ab3c97a28b6efad-d and /dev/null differ diff --git a/.cache/go-build/fd/fdd2277a4e929754050f63108dff6513be6142893025e9b20230e635210ad86f-d b/.cache/go-build/fd/fdd2277a4e929754050f63108dff6513be6142893025e9b20230e635210ad86f-d deleted file mode 100644 index 8e939db..0000000 Binary files a/.cache/go-build/fd/fdd2277a4e929754050f63108dff6513be6142893025e9b20230e635210ad86f-d and /dev/null differ diff --git a/.cache/go-build/fe/fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422-d b/.cache/go-build/fe/fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422-d deleted file mode 100644 index 3d31ada..0000000 --- a/.cache/go-build/fe/fe0dd71062f84ebe3b488ef7e8471843663e425cb8aa9a556c713d77e51c7422-d +++ /dev/null @@ -1 +0,0 @@ -./_testmain.go diff --git a/.cache/go-build/fe/fe2b767c693e31a96d506e540b4a8793a799d2446b7230fe55274fafe0f85116-a b/.cache/go-build/fe/fe2b767c693e31a96d506e540b4a8793a799d2446b7230fe55274fafe0f85116-a deleted file mode 100644 index 8d4a782..0000000 --- a/.cache/go-build/fe/fe2b767c693e31a96d506e540b4a8793a799d2446b7230fe55274fafe0f85116-a +++ /dev/null @@ -1 +0,0 @@ -v1 fe2b767c693e31a96d506e540b4a8793a799d2446b7230fe55274fafe0f85116 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289323955625 diff --git a/.cache/go-build/fe/fe2d4827726bd6537eee43b15bf61da4d5c51ede5e8b7afa7346e31cc606b55a-a b/.cache/go-build/fe/fe2d4827726bd6537eee43b15bf61da4d5c51ede5e8b7afa7346e31cc606b55a-a deleted file mode 100644 index cd50f82..0000000 --- a/.cache/go-build/fe/fe2d4827726bd6537eee43b15bf61da4d5c51ede5e8b7afa7346e31cc606b55a-a +++ /dev/null @@ -1 +0,0 @@ -v1 fe2d4827726bd6537eee43b15bf61da4d5c51ede5e8b7afa7346e31cc606b55a e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289778187349 diff --git a/.cache/go-build/fe/fe96b5965b2e757f34e2db03cce39a38c0696fc621d4a25593176be5b5c38fff-a b/.cache/go-build/fe/fe96b5965b2e757f34e2db03cce39a38c0696fc621d4a25593176be5b5c38fff-a deleted file mode 100644 index 1d63f9f..0000000 --- a/.cache/go-build/fe/fe96b5965b2e757f34e2db03cce39a38c0696fc621d4a25593176be5b5c38fff-a +++ /dev/null @@ -1 +0,0 @@ -v1 fe96b5965b2e757f34e2db03cce39a38c0696fc621d4a25593176be5b5c38fff e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136288994149459 diff --git a/.cache/go-build/fe/fea47e7a162ce0f2d8b00bf19fbccd9495e4b3231dff8f7f0e01005aeca400d6-a b/.cache/go-build/fe/fea47e7a162ce0f2d8b00bf19fbccd9495e4b3231dff8f7f0e01005aeca400d6-a deleted file mode 100644 index 2e340df..0000000 --- a/.cache/go-build/fe/fea47e7a162ce0f2d8b00bf19fbccd9495e4b3231dff8f7f0e01005aeca400d6-a +++ /dev/null @@ -1 +0,0 @@ -v1 fea47e7a162ce0f2d8b00bf19fbccd9495e4b3231dff8f7f0e01005aeca400d6 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136287130654246 diff --git a/.cache/go-build/fe/fee3d073faedfc576e602120379040f621f2ceffeb2c28ea138f4847875ed252-a b/.cache/go-build/fe/fee3d073faedfc576e602120379040f621f2ceffeb2c28ea138f4847875ed252-a deleted file mode 100644 index ad6e2ec..0000000 --- a/.cache/go-build/fe/fee3d073faedfc576e602120379040f621f2ceffeb2c28ea138f4847875ed252-a +++ /dev/null @@ -1 +0,0 @@ -v1 fee3d073faedfc576e602120379040f621f2ceffeb2c28ea138f4847875ed252 c65fb8bf57a1e0df963979f0f59714c5af14f7a3a987e8688a934f0f38c18af2 21 1775136286918108964 diff --git a/.cache/go-build/ff/ff0b7154a0cd7748866c10f25d5297a72ed9df33fe5d420037363abdd781afe2-d b/.cache/go-build/ff/ff0b7154a0cd7748866c10f25d5297a72ed9df33fe5d420037363abdd781afe2-d deleted file mode 100644 index d78d26f..0000000 Binary files a/.cache/go-build/ff/ff0b7154a0cd7748866c10f25d5297a72ed9df33fe5d420037363abdd781afe2-d and /dev/null differ diff --git a/.cache/go-build/ff/ff1954b260d468f8ea1bce30b937a47db0f0218530d8db4259546e548bd9a4c9-a b/.cache/go-build/ff/ff1954b260d468f8ea1bce30b937a47db0f0218530d8db4259546e548bd9a4c9-a deleted file mode 100644 index d3bdb91..0000000 --- a/.cache/go-build/ff/ff1954b260d468f8ea1bce30b937a47db0f0218530d8db4259546e548bd9a4c9-a +++ /dev/null @@ -1 +0,0 @@ -v1 ff1954b260d468f8ea1bce30b937a47db0f0218530d8db4259546e548bd9a4c9 e90066540ceadcd0c3d569af5bae58c55c89afd47e399ed5005a94eaecc094d3 33 1775136289322099743 diff --git a/.cache/go-build/ff/ff1edf7afed8f65a40658116496c134f04dd6afac4d7b1cb41c273e1d2bc84bd-d b/.cache/go-build/ff/ff1edf7afed8f65a40658116496c134f04dd6afac4d7b1cb41c273e1d2bc84bd-d deleted file mode 100644 index 991a153..0000000 Binary files a/.cache/go-build/ff/ff1edf7afed8f65a40658116496c134f04dd6afac4d7b1cb41c273e1d2bc84bd-d and /dev/null differ diff --git a/.cache/go-build/ff/ff377aba3fa01552758c1d1e48433bc2aeb03dd9332a245ca903c9b8e25fe7a1-a b/.cache/go-build/ff/ff377aba3fa01552758c1d1e48433bc2aeb03dd9332a245ca903c9b8e25fe7a1-a deleted file mode 100644 index 4f45621..0000000 --- a/.cache/go-build/ff/ff377aba3fa01552758c1d1e48433bc2aeb03dd9332a245ca903c9b8e25fe7a1-a +++ /dev/null @@ -1 +0,0 @@ -v1 ff377aba3fa01552758c1d1e48433bc2aeb03dd9332a245ca903c9b8e25fe7a1 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 0 1775136289161348448 diff --git a/.cache/go-build/ff/ff39147e564c56e09a27e785e4b8f146682969072a3793f9ebdc83c1158b2206-d b/.cache/go-build/ff/ff39147e564c56e09a27e785e4b8f146682969072a3793f9ebdc83c1158b2206-d deleted file mode 100644 index cb551dc..0000000 Binary files a/.cache/go-build/ff/ff39147e564c56e09a27e785e4b8f146682969072a3793f9ebdc83c1158b2206-d and /dev/null differ diff --git a/.cache/go-build/ff/ffc49b63779db30a0b96c574fe91f2b95936c12c5049f5775494b5502d9a163d-a b/.cache/go-build/ff/ffc49b63779db30a0b96c574fe91f2b95936c12c5049f5775494b5502d9a163d-a deleted file mode 100644 index 0aebec5..0000000 --- a/.cache/go-build/ff/ffc49b63779db30a0b96c574fe91f2b95936c12c5049f5775494b5502d9a163d-a +++ /dev/null @@ -1 +0,0 @@ -v1 ffc49b63779db30a0b96c574fe91f2b95936c12c5049f5775494b5502d9a163d d757cae01a00cf142635ee1babfd2bb0ee1b943662765db2b6fd64eeacc71a19 32944 1775136286845064462 diff --git a/.cache/go-build/ff/ffd309b7c41fa5d57365196247a695fa9bd4a3f456fbc1369c0e05ec11a9169b-a b/.cache/go-build/ff/ffd309b7c41fa5d57365196247a695fa9bd4a3f456fbc1369c0e05ec11a9169b-a deleted file mode 100644 index 0a8eba2..0000000 --- a/.cache/go-build/ff/ffd309b7c41fa5d57365196247a695fa9bd4a3f456fbc1369c0e05ec11a9169b-a +++ /dev/null @@ -1 +0,0 @@ -v1 ffd309b7c41fa5d57365196247a695fa9bd4a3f456fbc1369c0e05ec11a9169b c0dc5756a2164edb4a488f0eec06d3f8a071cec545ea962680a25084c6c337b9 17 1775136289341981957 diff --git a/.cache/go-build/trim.txt b/.cache/go-build/trim.txt deleted file mode 100644 index 2c66bc7..0000000 --- a/.cache/go-build/trim.txt +++ /dev/null @@ -1 +0,0 @@ -1775136289 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 86ee85c..4eda75a 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ # Built tool output /tools/sow-toolkit /tools/sow-toolkit.exe +.bin/ # OS/editor noise .DS_Store diff --git a/README.md b/README.md index 1141977..1f14c30 100644 --- a/README.md +++ b/README.md @@ -37,10 +37,11 @@ tools/ built development binary output - `sow-assets` uses `sow-toolkit` for `build-haks` and validation - validation now fails early if duplicate asset resources would collide inside the same generated HAK - duplicate resources split across different HAK groups remain warnings because later HAK order can still override earlier content at runtime -- `sow-module` now also uses `sow-toolkit` for the early topdata bridge: +- `sow-module` now also uses `sow-toolkit` for topdata: - `validate-topdata` - `build-topdata` - `compare-topdata` + - `convert-topdata` During development, sibling repositories can point at `../sow-tools/tools/sow-toolkit`. For pinned releases, each consumer repo can instead carry its own copy at `tools/sow-toolkit`. @@ -57,15 +58,23 @@ Consumer repos can fetch those binaries into their local `tools/` directory with - `install-tool.sh` on Linux/macOS - `install-tool.ps1` on Windows -## TopData Migration +## TopData -The topdata rebuild is now staged in this repo. +The native topdata system is implemented in this repo and authored in `sow-module`. -Current state: +High-level ownership split: -- the new command surface exists in `sow-toolkit` -- `sow-module/topdata/` is the new long-term source home -- `build-topdata` currently bridges through the Python builder in `sow-dev` for authoritative output generation -- native Go merge/build parity is still a follow-up milestone +- `sow-tools` + - owns the `sow-toolkit` implementation + - owns topdata validation, build, compare, conversion, and dataset-resolution logic +- `sow-module` + - owns canonical topdata authored data under `topdata/data/` + - owns the user-facing topdata workflow scripts -See [TOPDATA_HANDOFF_2026-04-02.md](./TOPDATA_HANDOFF_2026-04-02.md) for the current handoff and migration notes. +For a human-readable front-to-back explanation of how the native topdata builder works +and how to use it, see: + +- [sow-module/topdata/README.md](../sow-module/topdata/README.md) + +Important topdata contracts still live here under `internal/topdata/` because they are +code-adjacent implementation contracts, not user workflow docs. diff --git a/TOPDATA_HANDOFF_2026-04-02.md b/TOPDATA_HANDOFF_2026-04-02.md deleted file mode 100644 index 490c1d0..0000000 --- a/TOPDATA_HANDOFF_2026-04-02.md +++ /dev/null @@ -1,197 +0,0 @@ -# TopData Rebuild Handoff - 2026-04-02 - -## Current State - -This handoff captures the first implementation milestone of the topdata rebuild. - -The migration direction is: - -- Python `2dabuilder` in `sow-dev` remains authoritative -- `sow-toolkit` now owns the new topdata command surface -- `sow-module` is the new long-term source home for migrated topdata content -- wiki generation, wiki deploy, and tophak packaging are still deferred - -Relevant commits from this milestone: - -- `sow-tools`: `d67b6e3` `Add topdata bridge commands and handoff` -- `sow-module`: `dfb7fd2` `Add topdata migration roots and wrappers` - -## Implemented In This Milestone - -### New `sow-toolkit` commands - -- `validate-topdata` -- `build-topdata` -- `compare-topdata` - -Current behavior: - -- `validate-topdata` validates the new `topdata/` source root in `sow-module` -- `build-topdata` currently uses the Python builder as a reference backend and writes outputs into `build/topdata/` -- `compare-topdata` rebuilds fresh reference output from Python and compares it against `build/topdata/` - -This is an intentional bridge: it preserves current production behavior while the deeper merge/build rules are audited and ported. - -Important implementation detail: - -- the Python builder is run from a copied temporary workspace, not in place from `sow-dev` -- this prevents the reference bridge from mutating repo-tracked state in `sow-dev` -- the copied bridge rewrites its default asset/staging roots to temp-local paths before running -- this was necessary because the Python builder also compiles `sow_top.hak` as a side effect of its normal build flow - -### New `sow-module` layout - -Recommended migration root now exists: - -```text -topdata/ - data/ - tlk/ - base_dialog.json -``` - -Generated outputs are expected under: - -```text -build/topdata/ - 2da/ - tlk/ -``` - -Current `sow-module` config now points at: - -- `topdata.source = "topdata"` -- `topdata.build = "build/topdata"` -- `topdata.reference_builder = "../sow-dev/tools/2dabuilder"` - -### Canonical compatibility validation - -The new validator already recognizes the current family of authoring shapes: - -- dataset `base.json` with `columns` + `rows` -- lockfiles as object maps of key -> numeric id -- module files using `entries` -- module files using `overrides` -- plain row files using `rows` -- TLK files with `entries` - -It is intentionally permissive for now: - -- legacy parseable shapes can still load -- warnings are used where a file is parseable but not canonical yet -- this keeps migration practical while still nudging toward a formal schema - -It does **not** yet rewrite or normalize files on disk. This milestone is validation and bridge-first, not migration automation. - -## What Was Verified - -The new bridge was verified on the real project, not only on unit tests. - -Verified successfully: - -- `go test ./...` in `sow-tools` -- `sow-toolkit validate-topdata` -- `sow-toolkit build-topdata` -- `sow-toolkit compare-topdata` - -Observed real output: - -- `build/topdata/2da` produced `113` generated `.2da` files -- `build/topdata/tlk` produced `1` TLK output -- `compare-topdata` passed against a fresh Python reference build - -This means the first milestone is not just scaffolding; it already gives `sow-module` a working topdata command surface backed by the authoritative Python builder. - -## Important Rules Captured So Far - -These behaviors are considered core and must be preserved in the eventual native compiler: - -- base fallback from `base.json` -- TLK fallback from `base_dialog.json` / TLK base data -- snippet files and grouped files both being valid -- grouped dataset families and plain tables both being valid -- lockfile-backed IDs -- ID allocation when a key has no existing lock entry -- “only override what we intentionally touch” -- deterministic output and deterministic compare behavior -- grouped dataset families such as `classes` -- plain-table handling alongside base+module datasets -- compatibility with both snippet files and grouped files - -## Current Rough Edges - -These are known limitations of the bridge and should be expected when resuming: - -- `build-topdata` and `compare-topdata` are slower than the future native implementation - - they currently create a temporary copied Python builder workspace - - they install the Python requirements into a temporary venv each run -- the bridge still mirrors the Python builder’s semantics, including the tophak side-effect path, but now safely sandboxed in temp space -- canonical schema validation is only partial so far - - enough to validate root shape families and obvious errors - - not enough yet to encode all dataset-specific rules -- migrated data has not actually been moved into `sow-module/topdata` yet beyond the new root placeholders - -## What Is Still Deferred - -- native Go merge/build parity for current Python rules -- shorthand expansion porting -- dataset-specific rule porting -- parity fixtures checked into `sow-tools` -- schema documentation for the canonical topdata JSON contract -- local wiki generation -- wiki deploy -- tophak packaging -- canonical normalize/export command - -## Suggested Next Steps - -1. Audit the current Python rules dataset-by-dataset, especially: - - `classes` - - `feat` - - `itemprops` - - TLK merge behavior -2. Write the canonical topdata JSON contract down explicitly. - - root object families - - row/entry/override forms - - keyed refs - - TLK refs - - lockfile expectations -3. Capture representative parity fixtures from the Python builder. -4. Replace the reference-backed `build-topdata` bridge with native Go build logic one dataset family at a time. -5. Add a normalize/migrate command once the canonical JSON contract is nailed down. -6. Only migrate wiki generation after compiler parity is stable. - -## Resume Commands - -From `sow-module`: - -```bash -../sow-tools/tools/sow-toolkit validate-topdata -../sow-tools/tools/sow-toolkit build-topdata -../sow-tools/tools/sow-toolkit compare-topdata -``` - -Or via the repo wrappers: - -```bash -./validate-topdata.sh -./build-topdata.sh -./compare-topdata.sh -``` - -Expected success output today: - -- `validate-topdata` prints `topdata validation: ok` -- `build-topdata` prints `mode: reference` and output directories under `build/topdata` -- `compare-topdata` prints `topdata compare: ok` - -## Related UX State - -Separate from topdata, the content repos already have: - -- auto-installing `sow-toolkit` wrappers -- Linux/macOS shell wrappers -- Windows PowerShell and `.cmd` wrappers -- simplified `START-HERE.md` docs in `sow-module` and `sow-assets` - -Windows still needs a real smoke test from an actual Windows machine. diff --git a/go.mod b/go.mod index 287e891..66cc59b 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,5 @@ module gitea.westgate.pw/ShadowsOverWestgate/sow-tools go 1.26.0 + +require golang.org/x/text v0.35.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b95faad --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8= +golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA= diff --git a/internal/app/app.go b/internal/app/app.go index 417a1fa..64a344e 100644 --- a/internal/app/app.go +++ b/internal/app/app.go @@ -71,14 +71,19 @@ var commands = []command{ }, { name: "build-topdata", - description: "Build topdata outputs into build/topdata using the reference builder bridge.", + description: "Build canonical topdata outputs from topdata/data into build/topdata.", run: runBuildTopData, }, { name: "compare-topdata", - description: "Compare built topdata outputs against fresh reference-builder output.", + description: "Rebuild topdata natively and compare the current build output against that fresh native result.", run: runCompareTopData, }, + { + name: "convert-topdata", + description: "Convert between 2DA and native topdata JSON/module formats.", + run: runConvertTopData, + }, } func Run(args []string) (int, error) { @@ -357,7 +362,7 @@ func runBuildTopData(ctx context) error { return err } - result, err := topdata.BuildReference(p, func(message string) { + result, err := topdata.Build(p, func(message string) { fmt.Fprintf(ctx.stdout, "[build-topdata] %s\n", message) }) if err != nil { @@ -379,7 +384,7 @@ func runCompareTopData(ctx context) error { return err } - result, err := topdata.CompareReference(p, func(message string) { + result, err := topdata.Compare(p, func(message string) { fmt.Fprintf(ctx.stdout, "[compare-topdata] %s\n", message) }) if err != nil { @@ -390,10 +395,20 @@ func runCompareTopData(ctx context) error { fmt.Fprintf(ctx.stdout, "mode: %s\n", result.Mode) fmt.Fprintf(ctx.stdout, "checked 2da files: %d\n", result.Compared2DA) fmt.Fprintf(ctx.stdout, "checked tlk files: %d\n", result.ComparedTLK) + fmt.Fprintf(ctx.stdout, "native-pass: %d\n", result.NativePass) + fmt.Fprintf(ctx.stdout, "not-yet-canonical: %d\n", result.NotYetCanonical) + fmt.Fprintf(ctx.stdout, "native-mismatch: %d\n", result.NativeMismatch) fmt.Fprintf(ctx.stdout, "topdata compare: ok\n") return nil } +func runConvertTopData(ctx context) error { + if len(ctx.args) < 2 { + return errors.New("usage: convert-topdata <2da-to-json|2da-to-module|json-to-2da> ...") + } + return topdata.RunConvertCommand(ctx.args[1:], ctx.stdout) +} + func loadProject(cwd string) (*project.Project, error) { root, err := project.FindRoot(cwd) if err != nil { diff --git a/internal/project/project.go b/internal/project/project.go index af5258c..2ef354b 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -36,9 +36,9 @@ type Config struct { } type ModuleConfig struct { - Name string `json:"name"` - ResRef string `json:"resref"` - Description string `json:"description"` + Name string `json:"name"` + ResRef string `json:"resref"` + Description string `json:"description"` HAKOrder []string `json:"hak_order"` } @@ -60,6 +60,7 @@ type TopDataConfig struct { Source string `json:"source"` Build string `json:"build"` ReferenceBuilder string `json:"reference_builder"` + Assets string `json:"assets"` } type Inventory struct { @@ -251,6 +252,37 @@ func (p *Project) TopDataReferenceBuilderDir() string { return filepath.Join(p.Root, ref) } +var knownAssetRepoNames = []string{"sow-assets", "nwn-assets", "assets"} + +func (p *Project) TopDataAssetsDir() string { + assets := strings.TrimSpace(p.Config.TopData.Assets) + if assets == "" { + return "" + } + if filepath.IsAbs(assets) { + return assets + } + absPath := filepath.Join(p.Root, assets) + if _, err := os.Stat(absPath); err == nil { + return absPath + } + relFromParent := filepath.Join(filepath.Dir(p.Root), assets) + if _, err := os.Stat(relFromParent); err == nil { + return relFromParent + } + absRoot := filepath.Clean(p.Root) + parentDir := filepath.Dir(absRoot) + if parentDir != absRoot { + for _, repoName := range knownAssetRepoNames { + siblingPath := filepath.Join(parentDir, repoName) + if _, err := os.Stat(siblingPath); err == nil { + return siblingPath + } + } + } + return absPath +} + func (i Inventory) Report() InventoryReport { return InventoryReport{ SourceFiles: len(i.SourceFiles), diff --git a/internal/project/project_test.go b/internal/project/project_test.go new file mode 100644 index 0000000..f17198e --- /dev/null +++ b/internal/project/project_test.go @@ -0,0 +1,88 @@ +package project + +import ( + "os" + "path/filepath" + "testing" +) + +func TestTopDataAssetsDirDiscoversSiblingRepo(t *testing.T) { + root := t.TempDir() + mkdirAll(t, filepath.Join(root, "src")) + mkdirAll(t, filepath.Join(root, "assets")) + mkdirAll(t, filepath.Join(root, "build")) + + parentDir := filepath.Dir(root) + siblingPath := filepath.Join(parentDir, "sow-assets") + mkdirAll(t, siblingPath) + mkdirAll(t, filepath.Join(siblingPath, "assets", "part", "belt")) + + proj := &Project{ + Root: root, + Config: Config{ + Module: ModuleConfig{Name: "Test", ResRef: "test"}, + Paths: PathConfig{Source: "src", Assets: "assets", Build: "build"}, + TopData: TopDataConfig{ + Assets: "sow-assets", + }, + }, + } + + result := proj.TopDataAssetsDir() + if result != siblingPath { + t.Errorf("expected %s, got %s", siblingPath, result) + } +} + +func TestTopDataAssetsDirPrefersExplicitConfig(t *testing.T) { + root := t.TempDir() + mkdirAll(t, filepath.Join(root, "src")) + mkdirAll(t, filepath.Join(root, "assets")) + mkdirAll(t, filepath.Join(root, "build")) + mkdirAll(t, filepath.Join(root, "custom-assets")) + + proj := &Project{ + Root: root, + Config: Config{ + Module: ModuleConfig{Name: "Test", ResRef: "test"}, + Paths: PathConfig{Source: "src", Assets: "assets", Build: "build"}, + TopData: TopDataConfig{ + Assets: "custom-assets", + }, + }, + } + + result := proj.TopDataAssetsDir() + expected := filepath.Join(root, "custom-assets") + if result != expected { + t.Errorf("expected %s, got %s", expected, result) + } +} + +func TestTopDataAssetsDirReturnsEmptyForNoConfig(t *testing.T) { + root := t.TempDir() + mkdirAll(t, filepath.Join(root, "src")) + mkdirAll(t, filepath.Join(root, "assets")) + mkdirAll(t, filepath.Join(root, "build")) + + proj := &Project{ + Root: root, + Config: Config{ + Module: ModuleConfig{Name: "Test", ResRef: "test"}, + Paths: PathConfig{Source: "src", Assets: "assets", Build: "build"}, + TopData: TopDataConfig{}, + }, + } + + result := proj.TopDataAssetsDir() + if result != "" { + t.Errorf("expected empty string, got %s", result) + } +} + +func mkdirAll(t *testing.T, path string) { + t.Helper() + if err := os.MkdirAll(path, 0o755); err != nil { + t.Fatalf("mkdir %s: %v", path, err) + } +} diff --git a/internal/topdata/AUTO-INCLUDE_EXISTING_PART_MODELS_IN_2DA_GENERATION_CONTRACT.md b/internal/topdata/AUTO-INCLUDE_EXISTING_PART_MODELS_IN_2DA_GENERATION_CONTRACT.md new file mode 100644 index 0000000..d9e29fa --- /dev/null +++ b/internal/topdata/AUTO-INCLUDE_EXISTING_PART_MODELS_IN_2DA_GENERATION_CONTRACT.md @@ -0,0 +1,127 @@ +# AI Agent Contract: Auto-Include Existing Part Models in 2DA Generation + +## Objective + +The native 2DA generation pipeline must automatically include existing part models already present in the **`sow-assets` repository** when building final parts tables. + +This behavior is required for parity with the current asset set and must not depend on manually authored entries for models that already exist in repository assets. + +--- + +## Source of Truth + +The native builder must obtain existing model information from the project-resolved +topdata assets root, which defaults to the sibling **`sow-assets` repository** when +`topdata.assets` is not explicitly configured. + +Repository-backed discovery is taken from: + +```text +sow-assets/assets/parts/**/*.mdl +``` + +The implementation may also accept the sibling repo's legacy `assets/part/` layout when +resolving the physical path, but it must not substitute non-project asset sources. + +--- + +## Required Scope + +Process existing `.mdl` files for these parts table categories only: + +- `belt` +- `bicep` +- `chest` +- `foot` +- `forearm` +- `leg` +- `neck` +- `pelvis` +- `robe` +- `shin` +- `shoulder` + +Dataset mapping rules: + +- `parts/legs` maps to asset category `leg` +- `parts/hand` remains unsupported and is not auto-generated + +The scan must recurse through subdirectories under each applicable category path. + +--- + +## Required Behavior + +### 1. Repository-backed discovery + +For each supported part category, scan the corresponding files under the resolved +topdata assets root and discover all existing `.mdl` files. + +### 2. Trailing numeric suffix extraction + +For each discovered `.mdl` filename: + +- inspect the filename stem +- extract the trailing numeric suffix, if one exists +- ignore files with no trailing numeric suffix for row-generation purposes + +### 3. Row generation + +If a trailing numeric suffix is present: + +- use that numeric suffix as the output row ID +- emit a row for that part model in the final generated 2DA + +### 4. Default emitted values + +For rows generated from discovered existing models, set: + +- `COSTMODIFIER = 0` +- `ACBONUS = 0.00` + +### 5. Override precedence + +If file-based overrides exist, they must take precedence over discovered defaults. + +That means: + +- repository discovery provides the baseline row presence and default values +- override data may replace or augment those values +- override data wins in any conflict + +--- + +## Non-Negotiable Requirements + +- The implementation must read model presence from the **project-resolved assets repo**, + not from assumption, hardcoded lists, or legacy output. +- Existing repository models with trailing numeric suffixes must be reflected in generated output even if they are not otherwise explicitly authored. +- Override application is mandatory and must win over auto-discovered defaults. +- This is replacement behavior for the native pipeline, not an optional enhancement. + +--- + +## Acceptance Criteria + +Implementation is correct only if all of the following are true: + +1. The builder scans the resolved `sow-assets` assets tree for part models. +2. Only the supported part categories are considered. +3. Files with trailing numeric suffixes generate corresponding 2DA rows. +4. The numeric suffix is used as the row ID. +5. Auto-generated rows default to: + - `COSTMODIFIER = 0` + - `ACBONUS = 0.00` + +6. File overrides are applied after discovery and take precedence. +7. The final output includes all eligible existing models present in the repository. + +--- + +## Implementation Directive + +When generating native parts 2DAs, first scan the project-resolved assets repo for +supported part models, collect existing supported part models by category, extract +trailing numeric suffixes from filenames, emit rows using those suffixes as row IDs +with default `COSTMODIFIER = 0` and `ACBONUS = 0.00`, then apply overrides with +override values taking precedence. diff --git a/internal/topdata/CLASS_FEAT_GLOBAL_INJECTS_CONTRACT.md b/internal/topdata/CLASS_FEAT_GLOBAL_INJECTS_CONTRACT.md new file mode 100644 index 0000000..b99656f --- /dev/null +++ b/internal/topdata/CLASS_FEAT_GLOBAL_INJECTS_CONTRACT.md @@ -0,0 +1,174 @@ +# Global Feat Injection — Specification + +## Objective + +Ensure the native class feat generation pipeline produces **functionally identical output** to the legacy system by applying deterministic global feat injections. + +--- + +## Requirements + +### R1 — Skill-based master feats + +For every **class skill**, inject: + +- `masterfeats:skillfocus` +- `masterfeats:greaterskillfocus` + +With properties: + +````json +{ + "GrantedOnLevel": "-1", + "List": "1", + "OnMenu": "0" +} + +--- + +### R2 — Spellcasting master feats + +If class core defines: + +- `"SpellCaster" = 1` + +Then inject: + +- `masterfeats:spellfocus` +- `masterfeats:greaterspellfocus` + +With properties: + +```json +{ + "GrantedOnLevel": "-1", + "List": "1", + "OnMenu": "0" +} +```` + +--- + +### R3 — Literacy rule + +Inject: + +- `feat:literate` + +**Only if**: + +- `feat:illiterate` is NOT present + +With properties: + +```json +{ + "GrantedOnLevel": "1", + "List": "3", + "OnMenu": "0" +} +``` + +--- + +### R4 — Default combat/menu feats + +Always inject: + +- `feat:offensivefighting` +- `feat:defensivefighting` +- `feat:horsemenu` + +With properties: + +```json +{ + "GrantedOnLevel": "1", + "List": "3", + "OnMenu": "1" +} +``` + +--- + +### R5 — Conditional combat feats + +Inject: + +- `feat:powerattack` +- `feat:combatexpertise` + +With properties: + +```json +{ + "GrantedOnLevel": "-1", + "List": "0", + "OnMenu": "1" +} +``` + +--- + +### R6 — Override precedence + +- Overrides MUST be applied after injection. +- Overrides MUST take precedence over injected defaults. +- Injection MUST NOT block or replace explicit override data. + +--- + +## Behavioral Rules + +### B1 — Output equivalence + +- The resulting feat set MUST match legacy output **in substance**. +- Exact row ordering and numeric IDs are NOT significant. + +### B2 — Deterministic inclusion + +- All injections MUST occur consistently for identical inputs. +- No randomness or order-dependent behavior is allowed. + +### B3 — Conditional correctness + +- `feat:literate` MUST NOT be injected if `feat:illiterate` exists. +- Spell focus feats MUST ONLY be injected when `"SpellCaster" = 1`. + +### B4 — Integration with pipeline + +- Injected feats MUST flow through the same processing stages as authored feats. +- They MUST be subject to: + - overrides + - deduplication + - final emission rules + +--- + +## Acceptance Criteria + +An implementation is considered correct if: + +1. **Parity** + - For any given class input, native output produces the same effective feats as legacy. + +2. **Injection coverage** + - All required feats (R1–R5) appear when conditions are met. + +3. **Exclusion correctness** + - No invalid injections occur (e.g., literacy conflict). + +4. **Override dominance** + - Any override affecting injected feats is correctly applied. + +5. **Stability** + - Repeated runs with identical input produce identical output. + +--- + +## Non-Negotiables + +- This is **parity-critical**, not a best-effort feature. +- Native pipeline MUST be capable of fully replacing legacy output. +- There MUST be **zero dependency** on legacy systems at runtime. +- Any deviation from legacy-equivalent output is a **defect**. diff --git a/internal/topdata/FAMILY_EXPANSION_CONTRACT.md b/internal/topdata/FAMILY_EXPANSION_CONTRACT.md new file mode 100644 index 0000000..9a7d3e1 --- /dev/null +++ b/internal/topdata/FAMILY_EXPANSION_CONTRACT.md @@ -0,0 +1,70 @@ +# Generic Family Expansion Contract + +Topdata now treats underscore expansion as a structural rule: + +- `parent_child` means `child` is an expansion of `parent` +- underscores are for family structure, not simulated spaces +- existing canonical keys still win when lock or TLK state already established them + +This is a global interpretation rule, not a wiki-only convention. + +## Identity + +- `weaponspecialization_club` + - parent: `weaponspecialization` + - child: `club` +- `gnome_rock` + - parent: `gnome` + - child: `rock` +- `toughness_10` + - parent: `toughness` + - child: `10` + +Standalone keys without an underscore are treated as a parent identity with no child. + +## Generated Family Files + +Canonical generated families declare: + +```json +{ + "family": "weapon_focus", + "family_key": "weaponfocus", + "template": "masterfeats:weaponfocus", + "child_source": { + "dataset": "baseitems", + "column": "WeaponFocusFeat" + } +} +``` + +Rules: + +- `family` is the authored family type +- `family_key` is the structural parent identity used in generated child keys +- `template` is optional for the primitive in general, but required by current + masterfeat-backed `feat` families +- `child_source.dataset` identifies the canonical dataset driving expansion +- `child_source.column` is used when expansion is gated by a non-null source field +- `child_source.predicate` is used when expansion depends on a named rule such as + accessibility + +## Row Metadata + +Generated rows can carry: + +```json +{ + "meta": { + "family": { + "parent": "weaponfocus", + "child": "club", + "source": "baseitems:club", + "template": "masterfeats:weaponfocus" + } + } +} +``` + +This metadata is builder-owned and does not affect emitted 2DA columns. It preserves +family structure for later phases without enabling wiki generation yet. diff --git a/internal/topdata/FEAT_GENERATED_FAMILIES_CONTRACT.md b/internal/topdata/FEAT_GENERATED_FAMILIES_CONTRACT.md new file mode 100644 index 0000000..5b0abd6 --- /dev/null +++ b/internal/topdata/FEAT_GENERATED_FAMILIES_CONTRACT.md @@ -0,0 +1,110 @@ +# `feat` Generated Families Contract + +Canonical authored paths: + +- `topdata/data/feat/base.json` +- `topdata/data/feat/lock.json` +- `topdata/data/feat/generated/skill_focus.json` +- `topdata/data/feat/generated/greater_skill_focus.json` +- `topdata/data/feat/generated/weapon_focus.json` +- `topdata/data/feat/generated/weapon_specialization.json` +- `topdata/data/feat/generated/greater_weapon_focus.json` +- `topdata/data/feat/generated/greater_weapon_specialization.json` +- `topdata/data/feat/generated/improved_critical.json` +- `topdata/data/feat/generated/overwhelming_critical.json` +- `topdata/data/feat/generated/proficiencies.json` +- `topdata/data/feat/modules/activecombat/core.json` +- `topdata/data/feat/modules/activecombat/specialattacks.json` +- `topdata/data/feat/modules/class/core.json` +- `topdata/data/feat/modules/combat/core.json` +- `topdata/data/feat/modules/defensive/core.json` +- `topdata/data/feat/modules/magical/core.json` +- `topdata/data/feat/modules/other/core.json` +- `topdata/data/feat/modules/proficiency/core.json` +- `topdata/data/feat/modules/racial/core.json` +- `topdata/data/feat/modules/removedandhidden/core.json` +- `topdata/data/feat/modules/skillfeat/affinity.json` +- `topdata/data/feat/modules/skillfeat/focus.json` +- `topdata/data/feat/modules/skillfeat/greaterfocus.json` +- `topdata/data/feat/modules/skillfeat/other.json` + +`skill_affinity` is no longer authored as a generated feat file. It is synthesized from +canonical `racialtypes` race grants. + +Compact family-expansion shape: + +```json +{ + "family": "skill_focus", + "family_key": "skillfocus", + "template": "masterfeats:skillfocus", + "child_source": { + "dataset": "skills", + "predicate": "accessible" + }, + "overrides": { + "skills:craft_alchemy": { + "ICON": "ife_foc_alchm" + } + } +} +``` + +Weapon family shape: + +```json +{ + "family": "weapon_focus", + "family_key": "weaponfocus", + "template": "masterfeats:weaponfocus", + "child_source": { + "dataset": "baseitems", + "column": "WeaponFocusFeat" + }, + "overrides": { + "baseitems:heavymace": { + "ICON": "ife_wepfoc_Lma" + } + } +} +``` + +Rules: + +- compact generated families are: + - `skill_focus` + - `greater_skill_focus` + - `weapon_focus` + - `weapon_specialization` + - `greater_weapon_focus` + - `greater_weapon_specialization` + - `improved_critical` + - `overwhelming_critical` + - `proficiencies` +- compact families must declare `template` +- compact families must also declare: + - `family_key` + - `child_source.dataset` +- weapon families must also declare `child_source.column` +- skill families use `child_source.predicate: "accessible"` to mean + `HideFromLevelUp != 1` +- compact `overrides` are keyed by source dataset key: + - `skills:*` for skill families + - `baseitems:*` for weapon families +- generated rows carry `meta.family` so the underscore family rule is preserved even + before wiki generation exists +- emitted feat keys must prefer existing canonical lock/TLK identities over newly + derived child spellings +- `proficiencies.json` is limited to the real masterfeat-backed `weaponproficiencycommoner_*` + family +- manual and irregular feat content continues to live under `feat/modules/` +- generated families and module-authored feats are merged into the same final `feat.2da` + pipeline and share inheritance, override, TLK, and family-metadata behavior + +Current rollout policy: + +- `feat.2da` still builds natively +- `feat.2da` is still excluded from `compare-topdata` output-catalog self-check coverage + via `compare_reference: false` +- manual and irregular feat families remain authored directly in modules rather than + compact generated-family files diff --git a/internal/topdata/INHERITANCE_CONTRACT.md b/internal/topdata/INHERITANCE_CONTRACT.md new file mode 100644 index 0000000..f4b16ec --- /dev/null +++ b/internal/topdata/INHERITANCE_CONTRACT.md @@ -0,0 +1,69 @@ +# Topdata Inheritance Contract + +Native topdata now supports two inheritance forms: + +## 1. Row Sugar Compatibility + +This is the existing narrow row helper: + +```json +{ + "PARENT": { "id": "custom:parent" }, + "inherit": { + "from": "PARENT", + "fields": ["VALUE", "ICON"] + } +} +``` + +It remains supported for row-local field copying. + +## 2. Generic Object Inheritance + +This is the new reusable primitive: + +```json +{ + "inherit": { + "ref": "masterfeats:skillfocus" + }, + "LABEL": "FEAT_SKILL_FOCUS_ATHLETICS" +} +``` + +Or for a nested object: + +```json +{ + "DETAILS": { + "inherit": { + "ref": "custom:parent", + "field": "DETAILS" + }, + "meta": { + "cost": "9" + } + } +} +``` + +## Rules + +- `inherit.ref` must use stable `dataset:key` identity. +- `inherit.field` is optional and selects an object-valued field on the target row. +- Generic inheritance can appear on any authored object, not only top-level rows. +- Merge precedence is `local overrides inherited`. +- Scalars replace inherited values. +- Arrays replace inherited values. +- Objects merge recursively unless the local object is an atomic topdata value object such as: + - TLK payloads + - row refs + - table refs +- Cycles fail the build. +- Missing targets fail the build. + +## Current Intended Consumer + +`feat` is the first dataset expected to use this primitive heavily, especially for +borrowing shared properties from `masterfeats` while keeping `feat`'s own dataset +contract and row model. diff --git a/internal/topdata/MASTERFEATS_CONTRACT.md b/internal/topdata/MASTERFEATS_CONTRACT.md new file mode 100644 index 0000000..d96adeb --- /dev/null +++ b/internal/topdata/MASTERFEATS_CONTRACT.md @@ -0,0 +1,70 @@ +# `masterfeats` Canonical Contract + +`masterfeats` is a stable native canonical family consumed directly by `feat` +generation, class-feat expansion, and inheritance/ref resolution. + +Current canonical scope: + +- dataset root: `topdata/data/masterfeats/` +- required files: + - `base.json` + - `lock.json` +- generated output: + - `masterfeats.2da` + +## `base.json` + +Canonical shape: + +```json +{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "..."], + "rows": [ + { + "id": 0, + "key": "masterfeats:weaponfocus", + "LABEL": "WeaponFocus", + "STRREF": "6490", + "DESCRIPTION": "436" + } + ] +} +``` + +Rules: + +- `output` must be exactly `masterfeats.2da` +- `columns` must include `LABEL`, `STRREF`, and `DESCRIPTION` +- every canonical row must have a non-empty `key` +- row keys must start with `masterfeats:` +- inline TLK payloads are allowed in `STRREF` and `DESCRIPTION` +- numeric/text references are both allowed where the native TLK compiler already supports them + +## `lock.json` + +Canonical shape: + +```json +{ + "masterfeats:weaponfocus": 0 +} +``` + +Rules: + +- every key must start with `masterfeats:` +- every value must be numeric +- the lockfile remains the canonical stable id source for authored keys + +## Module contributions + +This family continues to support the shared canonical module shapes already used by native +datasets: + +- `entries` +- `overrides` +- `rows` + +Those shapes are validated generically in `topdata.go`; this contract only adds the +family-specific guarantees for `masterfeats`. diff --git a/internal/topdata/PORTRAIT_METADATA_CONTRACT.md b/internal/topdata/PORTRAIT_METADATA_CONTRACT.md new file mode 100644 index 0000000..7ab7ce1 --- /dev/null +++ b/internal/topdata/PORTRAIT_METADATA_CONTRACT.md @@ -0,0 +1,125 @@ +# Portrait Metadata Contract + +## Objective + +Define the canonical behavior for portrait metadata embedded in topdata rows, enabling cross-dataset portrait injection into the portraits.2da table. + +--- + +## Portrait Metadata Shape + +Portrait metadata is embedded in row `meta.portrait`: + +```json +{ + "meta": { + "portrait": { + "resref": "nw2book1_", + "sex": 4, + "race": 10, + "inanimate_type": 4, + "plot": 0, + "low_gore": "****" + } + } +} +``` + +### Required Fields + +- `resref` — non-empty string identifying the portrait base resource reference + +### Optional Fields + +- `sex` — numeric or string value mapped to portraits.2da `Sex` column +- `race` — numeric or string value mapped to portraits.2da `Race` column +- `inanimate_type` — numeric or string value mapped to portraits.2da `InanimateType` column +- `plot` — numeric or string value mapped to portraits.2da `Plot` column +- `low_gore` — numeric or string value mapped to portraits.2da `LowGore` column + +Field names are case-insensitive with hyphen/underscore normalization: +- `inanimate_type` = `inanimate-type` = `InanimateType` + +--- + +## Merge Behavior + +### Identity Matching + +Portrait entries are matched by `resref`. When any row in any dataset carries `meta.portrait.resref`: + +1. If a portraits.2da row with matching `BaseResRef` already exists → merge into that row +2. If no matching row exists → create a new row with auto-generated identity `portraits:auto:` + +### Field Mapping + +Portrait metadata fields map to portraits.2da columns: + +| Metadata Key | 2DA Column | +|---|---| +| `resref` | `BaseResRef` | +| `sex` | `Sex` | +| `race` | `Race` | +| `inanimate_type` | `InanimateType` | +| `plot` | `Plot` | +| `low_gore` | `LowGore` | + +### Override Precedence + +- First contributor wins for each column +- If a column already has a non-null value, subsequent contributions are rejected if they differ +- Identical values (after normalization) are silently accepted +- Conflicting values produce a build error + +### Null-Like Values + +Missing fields and `nullValue` ("****") are treated as unset. They do not override existing values and are not considered conflicts. + +--- + +## Lock Data + +Auto-generated portrait rows are tracked in lock data with key pattern: + +``` +portraits:auto: +``` + +For example: `portraits:auto:nw2book1_` + +--- + +## Cross-Dataset Injection + +Any dataset may contribute portrait metadata. The build pipeline: + +1. Collects all datasets +2. Runs `mergePortraitMetadata()` after dataset collection +3. Injects portrait rows into the portraits.2da dataset +4. Updates lock data if new auto-generated rows were created + +This enables non-portrait datasets (e.g., placeables, genericdoors) to define portrait associations without modifying the portraits dataset directly. + +--- + +## Validation Rules + +1. `resref` is required — missing resref produces a parse error +2. Unknown metadata fields in `meta.portrait` produce a parse error +3. Unknown top-level keys in `meta` produce a parse error (allowed keys: `family`, `wiki`, `portrait`) +4. Conflicting portrait field values from different contributors produce a build error +5. Portrait metadata is excluded from emitted 2DA output — it exists only at authoring/build time + +--- + +## Acceptance Criteria + +Implementation is correct only if all of the following are true: + +1. Portrait metadata is parsed from `meta.portrait` with case-insensitive field names +2. Rows with portrait metadata inject into portraits.2da by `resref` matching +3. Auto-generated rows receive `portraits:auto:` lock keys +4. First-contributor-wins precedence is enforced per column +5. Conflicting values produce build errors with clear diagnostic messages +6. Portrait metadata does not leak into emitted 2DA column output +7. Lock data is persisted when new auto-generated rows are created diff --git a/internal/topdata/appearance_migrate.go b/internal/topdata/appearance_migrate.go new file mode 100644 index 0000000..1983194 --- /dev/null +++ b/internal/topdata/appearance_migrate.go @@ -0,0 +1,96 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyAppearance(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "appearance") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "appearance") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + moduleNames := []string{ + "cotblreaver.json", + "crawlingclaw.json", + "halfogre.json", + "zombieknight.json", + } + targetModulePaths := make([]string, 0, len(moduleNames)) + for _, name := range moduleNames { + targetModulePaths = append(targetModulePaths, filepath.Join(targetModulesDir, name)) + } + if fileExists(targetBasePath) && fileExists(targetLockPath) { + allModulesPresent := true + for _, path := range targetModulePaths { + if !fileExists(path) { + allModulesPresent = false + break + } + } + if allModulesPresent { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "appearance.2da" + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + moduleObjs := make([]map[string]any, 0, len(moduleNames)) + for _, name := range moduleNames { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", name)) + if err != nil { + return 0, err + } + moduleObjs = append(moduleObjs, obj) + } + + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + } + for i, path := range targetModulePaths { + writes = append(writes, struct { + path string + obj map[string]any + }{path: path, obj: moduleObjs[i]}) + } + + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} diff --git a/internal/topdata/armor_migrate.go b/internal/topdata/armor_migrate.go new file mode 100644 index 0000000..0bdfbdd --- /dev/null +++ b/internal/topdata/armor_migrate.go @@ -0,0 +1,160 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" + "sort" +) + +func importLegacyArmor(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "armor") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "armor") + targetPath := filepath.Join(targetDir, "armor.json") + if _, err := os.Stat(targetPath); err == nil { + obj, err := loadJSONObject(targetPath) + if err == nil && countLegacyTLKRefsInValue(obj) == 0 { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + rows, err := mergeArmorRows(baseObj, filepath.Join(legacyDir, "modules")) + if err != nil { + return 0, err + } + + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "base.json")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "lock.json")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "modules")); err != nil { + return 0, err + } + + out := map[string]any{ + "output": "armor.2da", + "columns": baseObj["columns"], + "rows": rows, + } + raw, err := json.MarshalIndent(out, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(targetPath, raw, 0o644); err != nil { + return 0, err + } + return 1, nil +} + +func mergeArmorRows(baseObj map[string]any, modulesDir string) ([]any, error) { + rawRows, ok := baseObj["rows"].([]any) + if !ok { + return nil, nil + } + + rows := make([]map[string]any, 0, len(rawRows)) + byID := map[int]map[string]any{} + for _, raw := range rawRows { + row, ok := deepCopyValue(raw).(map[string]any) + if !ok { + continue + } + delete(row, "key") + rawID, ok := row["id"] + if !ok { + continue + } + id, err := asInt(rawID) + if err != nil { + return nil, err + } + row["id"] = id + rows = append(rows, row) + byID[id] = row + } + + modulePaths, err := collectModulePaths(modulesDir) + if err != nil { + return nil, err + } + for _, path := range modulePaths { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + if entries, ok := obj["entries"].(map[string]any); ok { + for _, raw := range entries { + row, ok := deepCopyValue(raw).(map[string]any) + if !ok { + continue + } + delete(row, "key") + rawID, ok := row["id"] + if !ok { + continue + } + id, err := asInt(rawID) + if err != nil { + return nil, err + } + row["id"] = id + rows = append(rows, row) + byID[id] = row + } + } + if overrides, ok := obj["overrides"].([]any); ok { + for _, raw := range overrides { + override, ok := raw.(map[string]any) + if !ok { + continue + } + rawID, ok := override["id"] + if !ok { + continue + } + id, err := asInt(rawID) + if err != nil { + return nil, err + } + row := byID[id] + if row == nil { + continue + } + for key, value := range override { + if key == "id" || key == "key" || key == "_tlk" || isMetadataField(key) { + continue + } + row[key] = deepCopyValue(value) + } + } + } + } + + sort.Slice(rows, func(i, j int) bool { + return rows[i]["id"].(int) < rows[j]["id"].(int) + }) + out := make([]any, 0, len(rows)) + for _, row := range rows { + out = append(out, row) + } + return out, nil +} diff --git a/internal/topdata/base_dialog_migrate.go b/internal/topdata/base_dialog_migrate.go new file mode 100644 index 0000000..40ca883 --- /dev/null +++ b/internal/topdata/base_dialog_migrate.go @@ -0,0 +1,41 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyBaseDialog(referenceBuilderDir, sourceDir string) (int, error) { + legacyPath := filepath.Join(referenceBuilderDir, "tlk", "base.json") + if _, err := os.Stat(legacyPath); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetPath := filepath.Join(sourceDir, "base_dialog.json") + if fileExists(targetPath) { + current, err := loadJSONObject(targetPath) + if err == nil { + if entries, ok := current["entries"].(map[string]any); ok && len(entries) > 0 { + return 0, nil + } + } + } + + obj, err := loadJSONObject(legacyPath) + if err != nil { + return 0, err + } + raw, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(targetPath, raw, 0o644); err != nil { + return 0, err + } + return 1, nil +} diff --git a/internal/topdata/baseitems_migrate.go b/internal/topdata/baseitems_migrate.go new file mode 100644 index 0000000..e048b71 --- /dev/null +++ b/internal/topdata/baseitems_migrate.go @@ -0,0 +1,105 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyBaseitems(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "baseitems") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "baseitems") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + moduleNames := []string{ + "blunderbuss.json", + "coin.json", + "estoc.json", + "heavymace.json", + "maulandfalchion.json", + "ovr_baseitems.json", + "ovr_cloak255.json", + "ovr_helmet255.json", + "shortspear.json", + } + targetModulePaths := make([]string, 0, len(moduleNames)) + for _, name := range moduleNames { + targetModulePaths = append(targetModulePaths, filepath.Join(targetModulesDir, name)) + } + if fileExists(targetBasePath) && fileExists(targetLockPath) { + allModulesPresent := true + for _, path := range targetModulePaths { + if !fileExists(path) { + allModulesPresent = false + break + } + } + if allModulesPresent { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "baseitems.2da" + canonicalizeWikiMetadataDocument(baseObj) + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + moduleObjs := make([]map[string]any, 0, len(moduleNames)) + for _, name := range moduleNames { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", name)) + if err != nil { + return 0, err + } + canonicalizeWikiMetadataDocument(obj) + moduleObjs = append(moduleObjs, obj) + } + + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + } + for index, path := range targetModulePaths { + writes = append(writes, struct { + path string + obj map[string]any + }{ + path: path, + obj: moduleObjs[index], + }) + } + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} diff --git a/internal/topdata/classes_migrate.go b/internal/topdata/classes_migrate.go new file mode 100644 index 0000000..4443ab5 --- /dev/null +++ b/internal/topdata/classes_migrate.go @@ -0,0 +1,226 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" + "slices" + "strings" +) + +var legacyClassesPlainFamilies = []string{"feats", "skills", "savthr", "bfeat", "pres"} + +func importLegacyClasses(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + legacyRoot := filepath.Join(referenceBuilderDir, "data", "classes") + if _, err := os.Stat(legacyRoot); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetRoot := filepath.Join(dataDir, "classes") + if canonicalClassesPresent(targetRoot) { + return 0, nil + } + + coreCollected, plainCollected, err := collectLegacyClassesDatasets(legacyRoot) + if err != nil { + return 0, err + } + + tableKeyByOutput := map[string]string{} + for _, dataset := range plainCollected { + if dataset.TableKey == "" { + continue + } + registerLegacyClassesTableKey(tableKeyByOutput, dataset.TableKey, dataset.Dataset.OutputName) + } + + coreRows := make([]map[string]any, 0, len(coreCollected.Rows)) + for _, rawRow := range coreCollected.Rows { + row, ok := deepCopyValue(rawRow).(map[string]any) + if !ok { + continue + } + if legacyTLK != nil { + if _, _, err := inlineLegacyTLKValue(row, legacyTLK); err != nil { + return 0, err + } + } + rewriteLegacyClassesCoreRow(row, tableKeyByOutput) + coreRows = append(coreRows, row) + } + + if err := removePathIfExists(targetRoot); err != nil { + return 0, err + } + if err := os.MkdirAll(filepath.Join(targetRoot, "core"), 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + { + path: filepath.Join(targetRoot, "core", "base.json"), + obj: map[string]any{ + "output": coreCollected.Dataset.OutputName, + "columns": stringSliceToAny(coreCollected.Columns), + "rows": rowsToAny(coreRows), + }, + }, + { + path: filepath.Join(targetRoot, "core", "lock.json"), + obj: anyMapInt(coreCollected.LockData), + }, + } + + for _, collected := range plainCollected { + obj := map[string]any{ + "output": collected.Dataset.OutputName, + "columns": stringSliceToAny(collected.Columns), + "rows": rowsToAny(collected.Rows), + } + if strings.TrimSpace(collected.TableKey) != "" { + obj["key"] = collected.TableKey + } + writes = append(writes, struct { + path string + obj map[string]any + }{ + path: filepath.Join(dataDir, collected.Dataset.Name+".json"), + obj: obj, + }) + } + + for _, write := range writes { + if err := os.MkdirAll(filepath.Dir(write.path), 0o755); err != nil { + return 0, err + } + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + + return len(writes), nil +} + +func canonicalClassesPresent(targetRoot string) bool { + if !fileExists(filepath.Join(targetRoot, "core", "base.json")) || !fileExists(filepath.Join(targetRoot, "core", "lock.json")) { + return false + } + for _, family := range legacyClassesPlainFamilies { + ok, err := hasJSONFiles(filepath.Join(targetRoot, family)) + if err != nil || !ok { + return false + } + } + return true +} + +func collectLegacyClassesDatasets(legacyRoot string) (nativeCollectedDataset, []nativeCollectedDataset, error) { + coreCollected, err := collectBaseDataset(nativeDataset{ + Name: "classes/core", + BasePath: filepath.Join(legacyRoot, "core", "base.json"), + LockPath: filepath.Join(legacyRoot, "core", "lock.json"), + ModulesDir: filepath.Join(legacyRoot, "core", "modules"), + OutputName: "classes.2da", + Spec: specForDataset("classes"), + }) + if err != nil { + return nativeCollectedDataset{}, nil, err + } + coreCollected.Dataset.OutputName = "classes.2da" + + plainCollected := make([]nativeCollectedDataset, 0) + for _, family := range legacyClassesPlainFamilies { + familyDir := filepath.Join(legacyRoot, family) + entries, err := os.ReadDir(familyDir) + if err != nil { + if os.IsNotExist(err) { + continue + } + return nativeCollectedDataset{}, nil, err + } + for _, entry := range entries { + if entry.IsDir() || filepath.Ext(entry.Name()) != ".json" || strings.HasPrefix(entry.Name(), ".") || entry.Name() == "lock.json" { + continue + } + filePath := filepath.Join(familyDir, entry.Name()) + tableData, err := loadJSONObject(filePath) + if err != nil { + return nativeCollectedDataset{}, nil, err + } + outputName, _ := tableData["output"].(string) + if strings.TrimSpace(outputName) == "" { + outputName = strings.TrimSuffix(entry.Name(), filepath.Ext(entry.Name())) + ".2da" + } + collected, err := collectPlainDataset(nativeDataset{ + Name: filepath.ToSlash(filepath.Join("classes", family, strings.TrimSuffix(entry.Name(), filepath.Ext(entry.Name())))), + BasePath: filePath, + LockPath: filepath.Join(familyDir, "lock.json"), + OutputName: outputName, + Spec: specForDataset(filepath.ToSlash(filepath.Join("classes", family, strings.TrimSuffix(entry.Name(), filepath.Ext(entry.Name()))))), + }) + if err != nil { + return nativeCollectedDataset{}, nil, err + } + plainCollected = append(plainCollected, collected) + } + } + + slices.SortFunc(plainCollected, func(a, b nativeCollectedDataset) int { + return strings.Compare(a.Dataset.Name, b.Dataset.Name) + }) + return coreCollected, plainCollected, nil +} + +func registerLegacyClassesTableKey(tableKeyByOutput map[string]string, tableKey, outputName string) { + trimmedOutput := strings.TrimSpace(outputName) + if trimmedOutput != "" { + tableKeyByOutput[trimmedOutput] = tableKey + } + trimmedStem := strings.TrimSpace(outputStem(outputName)) + if trimmedStem != "" { + tableKeyByOutput[trimmedStem] = tableKey + } +} + +func rewriteLegacyClassesCoreRow(row map[string]any, tableKeyByOutput map[string]string) { + for _, field := range []string{"FeatsTable", "SavingThrowTable", "SkillsTable", "BonusFeatsTable", "PreReqTable"} { + tableKey := legacyClassesTableKeyForValue(row[field], tableKeyByOutput) + if tableKey == "" { + continue + } + row[field] = map[string]any{"table": tableKey} + } +} + +func legacyClassesTableKeyForValue(value any, tableKeyByOutput map[string]string) string { + switch typed := value.(type) { + case map[string]any: + tableKey, _ := typed["table"].(string) + return strings.TrimSpace(tableKey) + case string: + trimmed := strings.TrimSpace(typed) + if trimmed == "" || trimmed == nullValue { + return "" + } + if trimmed != strings.ToLower(trimmed) { + return "" + } + if tableKey, ok := tableKeyByOutput[trimmed]; ok { + return tableKey + } + return "" + default: + return "" + } +} diff --git a/internal/topdata/cloakmodel_migrate.go b/internal/topdata/cloakmodel_migrate.go new file mode 100644 index 0000000..d26bdbf --- /dev/null +++ b/internal/topdata/cloakmodel_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacyCloakmodel(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "cloakmodel", "cloakmodel.2da", nil) +} diff --git a/internal/topdata/convert.go b/internal/topdata/convert.go new file mode 100644 index 0000000..6222731 --- /dev/null +++ b/internal/topdata/convert.go @@ -0,0 +1,530 @@ +package topdata + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "os" + "path/filepath" + "regexp" + "sort" + "strconv" + "strings" + + "gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/project" +) + +type convertOptions struct { + Namespace string + KeyFields []string + CollisionMode string + BaseDialog string + Type string +} + +func RunConvertCommand(args []string, stdout io.Writer) error { + if len(args) == 0 || args[0] == "--help" || args[0] == "-h" { + printConvertUsage(stdout) + return nil + } + switch args[0] { + case "2da-to-json": + if len(args) > 1 && (args[1] == "--help" || args[1] == "-h") { + _, _ = fmt.Fprintln(stdout, "usage: convert-topdata 2da-to-json [flags] ") + return nil + } + opts, input, output, err := parseConvertArgs(args[1:], false) + if err != nil { + return err + } + data, err := parse2DAFile(input) + if err != nil { + return err + } + result, err := convert2DAToJSON(data, output, opts) + if err != nil { + return err + } + return writeJSONFile(output, result) + case "2da-to-module": + if len(args) > 1 && (args[1] == "--help" || args[1] == "-h") { + _, _ = fmt.Fprintln(stdout, "usage: convert-topdata 2da-to-module --namespace [--type entries|override] [flags] [output.json]") + return nil + } + opts, input, output, err := parseConvertArgs(args[1:], true) + if err != nil { + return err + } + data, err := parse2DAFile(input) + if err != nil { + return err + } + if opts.Type == "override" { + result := map[string]any{"overrides": toOverridesRows(data.Rows)} + if err := writeJSONFile(output, result); err != nil { + return err + } + _, _ = fmt.Fprintf(stdout, "converted overrides: %d\n", len(result["overrides"].([]map[string]any))) + return nil + } + result, skipped, err := convert2DAToModule(data, output, opts) + if err != nil { + return err + } + if err := writeJSONFile(output, result); err != nil { + return err + } + if skipped > 0 { + _, _ = fmt.Fprintf(stdout, "converted entries: %d, skipped unkeyed: %d\n", len(result["entries"].(map[string]any)), skipped) + return nil + } + _, _ = fmt.Fprintf(stdout, "converted entries: %d\n", len(result["entries"].(map[string]any))) + return nil + case "json-to-2da": + if len(args) > 1 && (args[1] == "--help" || args[1] == "-h") { + _, _ = fmt.Fprintln(stdout, "usage: convert-topdata json-to-2da ") + return nil + } + if len(args) != 3 { + return errors.New("usage: convert-topdata json-to-2da ") + } + data, err := readCanonicalJSON(args[1]) + if err != nil { + return err + } + return write2DAFile(data, args[2]) + default: + return fmt.Errorf("unknown convert-topdata subcommand %q", args[0]) + } +} + +func printConvertUsage(stdout io.Writer) { + _, _ = fmt.Fprintln(stdout, "usage: convert-topdata <2da-to-json|2da-to-module|json-to-2da> ...") + _, _ = fmt.Fprintln(stdout, "") + _, _ = fmt.Fprintln(stdout, "subcommands:") + _, _ = fmt.Fprintln(stdout, " 2da-to-json Convert a 2DA file into canonical JSON rows") + _, _ = fmt.Fprintln(stdout, " 2da-to-module Convert a 2DA file into module entries or override JSON") + _, _ = fmt.Fprintln(stdout, " json-to-2da Convert canonical JSON rows into a 2DA file") +} + +type parsed2DA struct { + Columns []string `json:"columns"` + Rows []map[string]any `json:"rows"` +} + +func parseConvertArgs(args []string, allowFormat bool) (convertOptions, string, string, error) { + opts := convertOptions{ + CollisionMode: "prompt", + Type: "entries", + } + positional := make([]string, 0, 2) + for index := 0; index < len(args); index++ { + arg := args[index] + switch arg { + case "--namespace": + index++ + if index >= len(args) { + return opts, "", "", errors.New("--namespace requires a value") + } + opts.Namespace = args[index] + case "--key-field": + index++ + if index >= len(args) { + return opts, "", "", errors.New("--key-field requires a value") + } + opts.KeyFields = append(opts.KeyFields, args[index]) + case "--collision": + index++ + if index >= len(args) { + return opts, "", "", errors.New("--collision requires a value") + } + opts.CollisionMode = args[index] + case "--base-dialog": + index++ + if index >= len(args) { + return opts, "", "", errors.New("--base-dialog requires a value") + } + opts.BaseDialog = args[index] + case "--format", "--type": + if !allowFormat { + return opts, "", "", fmt.Errorf("%s does not accept %s", positionalSafe(args), arg) + } + index++ + if index >= len(args) { + return opts, "", "", fmt.Errorf("%s requires a value", arg) + } + opts.Type = args[index] + default: + if strings.HasPrefix(arg, "--") { + return opts, "", "", fmt.Errorf("unknown flag %q", arg) + } + positional = append(positional, arg) + } + } + if allowFormat { + if strings.TrimSpace(opts.Namespace) == "" { + return opts, "", "", errors.New("2da-to-module requires --namespace") + } + if len(positional) < 1 || len(positional) > 2 { + return opts, "", "", errors.New("usage: convert-topdata 2da-to-module --namespace [--type entries|override] [flags] [output.json]") + } + } else if len(positional) != 2 { + return opts, "", "", errors.New("usage: convert-topdata 2da-to-json [flags] ") + } + if opts.CollisionMode == "prompt" { + opts.CollisionMode = "suffix" + } + if opts.CollisionMode != "suffix" && opts.CollisionMode != "error" { + return opts, "", "", fmt.Errorf("unsupported collision mode %q", opts.CollisionMode) + } + if allowFormat { + switch opts.Type { + case "entry": + opts.Type = "entries" + case "overrides": + opts.Type = "override" + } + if opts.Type != "entries" && opts.Type != "override" { + return opts, "", "", fmt.Errorf("unsupported module type %q", opts.Type) + } + output := "" + if len(positional) == 2 { + output = positional[1] + } else { + resolved, err := defaultModuleOutputPath(positional[0], opts) + if err != nil { + return opts, "", "", err + } + output = resolved + } + return opts, positional[0], output, nil + } + return opts, positional[0], positional[1], nil +} + +func positionalSafe(args []string) string { + if len(args) == 0 { + return "command" + } + return args[0] +} + +func parse2DAFile(path string) (parsed2DA, error) { + raw, err := os.ReadFile(path) + if err != nil { + return parsed2DA{}, err + } + lines := strings.Split(strings.ReplaceAll(string(raw), "\r\n", "\n"), "\n") + trimmed := make([]string, 0, len(lines)) + for _, line := range lines { + line = strings.TrimSpace(line) + if line != "" { + trimmed = append(trimmed, line) + } + } + if len(trimmed) < 2 || !strings.HasPrefix(trimmed[0], "2DA") { + return parsed2DA{}, errors.New("invalid 2DA file") + } + columns := split2DALine(trimmed[1]) + rows := make([]map[string]any, 0, max(0, len(trimmed)-2)) + for _, line := range trimmed[2:] { + fields := split2DALine(line) + if len(fields) == 0 { + continue + } + rowID, err := strconv.Atoi(fields[0]) + if err != nil { + return parsed2DA{}, fmt.Errorf("invalid 2DA row id %q", fields[0]) + } + row := map[string]any{"id": rowID} + for index, column := range columns { + if index+1 < len(fields) { + row[column] = smartConvertScalar(fields[index+1]) + continue + } + row[column] = nullValue + } + rows = append(rows, row) + } + return parsed2DA{Columns: columns, Rows: rows}, nil +} + +func split2DALine(line string) []string { + fields := make([]string, 0) + var current strings.Builder + inQuotes := false + for _, ch := range line { + switch { + case ch == '"': + inQuotes = !inQuotes + case !inQuotes && (ch == '\t' || ch == ' '): + if current.Len() > 0 { + fields = append(fields, current.String()) + current.Reset() + } + default: + current.WriteRune(ch) + } + } + if current.Len() > 0 { + fields = append(fields, current.String()) + } + return fields +} + +func smartConvertScalar(value string) any { + if value == "" { + return "" + } + if parsed, err := strconv.Atoi(value); err == nil { + return parsed + } + return value +} + +func convert2DAToJSON(data parsed2DA, outputPath string, opts convertOptions) (map[string]any, error) { + rows, err := assignConvertedRowKeys(data.Rows, outputPath, opts) + if err != nil { + return nil, err + } + outRows := make([]map[string]any, 0, len(rows)) + for _, row := range rows { + ordered := map[string]any{"id": row["id"]} + if key, ok := row["key"].(string); ok && key != "" { + ordered["key"] = key + } + for _, column := range data.Columns { + ordered[column] = row[column] + } + outRows = append(outRows, ordered) + } + return map[string]any{"columns": data.Columns, "rows": outRows}, nil +} + +func convert2DAToModule(data parsed2DA, outputPath string, opts convertOptions) (map[string]any, int, error) { + rows, err := assignConvertedRowKeys(data.Rows, outputPath, opts) + if err != nil { + return nil, 0, err + } + entries := map[string]any{} + skipped := 0 + for _, row := range rows { + key, _ := row["key"].(string) + if key == "" { + skipped++ + continue + } + entry := map[string]any{} + for _, column := range data.Columns { + value := row[column] + if format2DAValue(value) == nullValue { + continue + } + entry[column] = value + } + entries[key] = entry + } + return map[string]any{"entries": entries}, skipped, nil +} + +func toOverridesRows(rows []map[string]any) []map[string]any { + out := make([]map[string]any, 0, len(rows)) + for _, row := range rows { + override := map[string]any{"id": row["id"]} + keys := make([]string, 0, len(row)) + for key := range row { + if key == "id" || key == "key" { + continue + } + keys = append(keys, key) + } + sort.Strings(keys) + for _, key := range keys { + if format2DAValue(row[key]) == nullValue { + continue + } + override[key] = row[key] + } + out = append(out, override) + } + return out +} + +func assignConvertedRowKeys(rows []map[string]any, outputPath string, opts convertOptions) ([]map[string]any, error) { + namespace, profiles := inferConvertNamespace(outputPath, opts.Namespace) + out := make([]map[string]any, 0, len(rows)) + used := map[string]struct{}{} + for _, row := range rows { + cloned := cloneRowMap(row) + if namespace == "" { + out = append(out, cloned) + continue + } + key := convertedRowKey(cloned, namespace, profiles, opts.KeyFields) + if key == "" { + out = append(out, cloned) + continue + } + if _, ok := used[key]; ok { + if opts.CollisionMode == "error" { + return nil, fmt.Errorf("duplicate generated key %q", key) + } + key = fmt.Sprintf("%s_%v", key, cloned["id"]) + } + used[key] = struct{}{} + cloned["key"] = key + out = append(out, cloned) + } + return out, nil +} + +type convertKeyProfile struct { + Field string + Mode string +} + +func inferConvertNamespace(outputPath, override string) (string, []convertKeyProfile) { + if strings.TrimSpace(override) != "" { + return strings.TrimSpace(override), nil + } + normalized := filepath.ToSlash(outputPath) + prefixes := []struct { + Prefix string + Namespace string + Profiles []convertKeyProfile + }{ + {"data/itemprops/costtables/index/", "itemprops:costtable_index", []convertKeyProfile{{"Name", "literal"}, {"Label", "literal"}}}, + {"data/itemprops/paramtables/index/", "itemprops:paramtable_index", []convertKeyProfile{{"Name", "literal"}, {"Lable", "literal"}, {"TableResRef", "literal"}}}, + {"data/itemprops/defs/", "itempropdef", []convertKeyProfile{{"Name", "literal"}, {"Label", "literal"}}}, + {"data/itemprops/sets/", "itemprops", []convertKeyProfile{{"StringRef", "literal"}, {"Label", "literal"}}}, + {"data/appearance/", "appearance", []convertKeyProfile{{"STRING_REF", "literal"}, {"LABEL", "literal"}}}, + {"data/baseitems/", "baseitems", []convertKeyProfile{{"Name", "literal"}, {"Label", "literal"}}}, + {"data/feat/", "feat", []convertKeyProfile{{"FEAT", "literal"}, {"LABEL", "literal"}, {"Label", "literal"}}}, + {"data/spells/", "spells", []convertKeyProfile{{"Name", "literal"}, {"Label", "literal"}}}, + {"data/skills/", "skills", []convertKeyProfile{{"Name", "literal"}, {"Label", "literal"}}}, + {"data/portraits/", "portraits", []convertKeyProfile{{"BaseResRef", "literal"}, {"Label", "literal"}}}, + {"data/racialtypes/", "racialtypes", []convertKeyProfile{{"Name", "literal"}, {"Label", "literal"}}}, + {"data/damagetypes/", "damagetypes", []convertKeyProfile{{"Name", "literal"}, {"Label", "literal"}}}, + } + for _, prefix := range prefixes { + if strings.Contains(normalized, prefix.Prefix) { + return prefix.Namespace, prefix.Profiles + } + } + return "", nil +} + +var convertKeyWhitespace = regexp.MustCompile(`\s+`) +var convertKeyCleaner = regexp.MustCompile(`[^a-z0-9_]`) + +func convertedRowKey(row map[string]any, namespace string, profiles []convertKeyProfile, preferred []string) string { + candidates := make([]convertKeyProfile, 0, len(preferred)+len(profiles)) + for _, field := range preferred { + candidates = append(candidates, convertKeyProfile{Field: field, Mode: "literal"}) + } + candidates = append(candidates, profiles...) + if len(candidates) == 0 { + candidates = append(candidates, + convertKeyProfile{Field: "LABEL", Mode: "literal"}, + convertKeyProfile{Field: "Label", Mode: "literal"}, + convertKeyProfile{Field: "Name", Mode: "literal"}, + ) + } + for _, candidate := range candidates { + value, ok := row[candidate.Field] + if !ok { + continue + } + text := strings.TrimSpace(format2DAValue(value)) + if text == "" || text == nullValue { + continue + } + normalized := normalizeConvertedKeyText(text) + if normalized == "" { + continue + } + return namespace + ":" + normalized + } + return "" +} + +func normalizeConvertedKeyText(text string) string { + text = strings.TrimSpace(strings.ToLower(text)) + text = convertKeyWhitespace.ReplaceAllString(text, "_") + text = convertKeyCleaner.ReplaceAllString(text, "") + text = strings.Trim(text, "_") + return text +} + +func defaultModuleOutputPath(input string, opts convertOptions) (string, error) { + cwd, err := os.Getwd() + if err != nil { + return "", err + } + root, err := project.FindRoot(cwd) + if err != nil { + return "", errors.New("2da-to-module requires an explicit output path when not run inside a project root") + } + p, err := project.Load(root) + if err != nil { + return "", err + } + if !p.HasTopData() { + return "", errors.New("2da-to-module requires topdata to be configured when inferring an output path") + } + filename := strings.TrimSuffix(filepath.Base(input), filepath.Ext(input)) + ".json" + modulesDir := filepath.Join(p.TopDataSourceDir(), "data", filepath.FromSlash(opts.Namespace), "modules") + return filepath.Join(modulesDir, filename), nil +} + +func readCanonicalJSON(path string) (parsed2DA, error) { + raw, err := os.ReadFile(path) + if err != nil { + return parsed2DA{}, err + } + var payload struct { + Columns []string `json:"columns"` + Rows []map[string]any `json:"rows"` + } + if err := json.Unmarshal(raw, &payload); err != nil { + return parsed2DA{}, err + } + return parsed2DA{Columns: payload.Columns, Rows: payload.Rows}, nil +} + +func writeJSONFile(path string, payload any) error { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil && filepath.Dir(path) != "." { + return err + } + raw, err := json.MarshalIndent(payload, "", " ") + if err != nil { + return err + } + raw = append(raw, '\n') + return os.WriteFile(path, raw, 0o644) +} + +func write2DAFile(data parsed2DA, path string) error { + rows := make([]map[string]any, 0, len(data.Rows)) + for _, row := range data.Rows { + cloned := cloneRowMap(row) + if rowID, err := asInt(cloned["id"]); err == nil { + cloned["id"] = rowID + } + rows = append(rows, cloned) + } + sort.Slice(rows, func(i, j int) bool { + left, _ := asInt(rows[i]["id"]) + right, _ := asInt(rows[j]["id"]) + return left < right + }) + table := map[string]any{ + "columns": data.Columns, + "rows": rows, + } + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil && filepath.Dir(path) != "." { + return err + } + return write2DA(table, path, false) +} diff --git a/internal/topdata/creaturespeed_migrate.go b/internal/topdata/creaturespeed_migrate.go new file mode 100644 index 0000000..7771a4c --- /dev/null +++ b/internal/topdata/creaturespeed_migrate.go @@ -0,0 +1,145 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyCreaturespeed(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "creaturespeed") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "creaturespeed") + targetPath := filepath.Join(targetDir, "creaturespeed.json") + if _, err := os.Stat(targetPath); err == nil { + obj, err := loadJSONObject(targetPath) + if err == nil && countLegacyTLKRefsInValue(obj) == 0 { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + rows, err := mergeCreaturespeedRows(baseObj, filepath.Join(legacyDir, "modules")) + if err != nil { + return 0, err + } + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + + if err := removePathIfExists(filepath.Join(targetDir, "base.json")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "lock.json")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "modules")); err != nil { + return 0, err + } + + out := map[string]any{ + "output": "creaturespeed.2da", + "columns": baseObj["columns"], + "rows": rows, + } + + raw, err := json.MarshalIndent(out, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(targetPath, raw, 0o644); err != nil { + return 0, err + } + return 1, nil +} + +func mergeCreaturespeedRows(baseObj map[string]any, modulesDir string) ([]any, error) { + rawRows, ok := baseObj["rows"].([]any) + if !ok { + return nil, nil + } + rows := make([]map[string]any, 0, len(rawRows)) + byID := map[int]map[string]any{} + for _, raw := range rawRows { + row, ok := deepCopyValue(raw).(map[string]any) + if !ok { + continue + } + delete(row, "key") + rows = append(rows, row) + if rawID, ok := row["id"]; ok { + id, err := asInt(rawID) + if err != nil { + return nil, err + } + byID[id] = row + } + } + + modulePaths, err := collectModulePaths(modulesDir) + if err != nil { + return nil, err + } + for _, path := range modulePaths { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + overrideList, ok := obj["overrides"].([]any) + if !ok { + continue + } + for _, raw := range overrideList { + override, ok := raw.(map[string]any) + if !ok { + continue + } + rawID, ok := override["id"] + if !ok { + continue + } + id, err := asInt(rawID) + if err != nil { + return nil, err + } + row := byID[id] + if row == nil { + continue + } + for key, value := range override { + if key == "id" || key == "key" || key == "_tlk" { + continue + } + row[key] = deepCopyValue(value) + } + } + } + + out := make([]any, 0, len(rows)) + for _, row := range rows { + out = append(out, row) + } + return out, nil +} + +func removePathIfExists(path string) error { + if _, err := os.Stat(path); err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + return os.RemoveAll(path) +} diff --git a/internal/topdata/damagetypes_migrate.go b/internal/topdata/damagetypes_migrate.go new file mode 100644 index 0000000..6b55b4b --- /dev/null +++ b/internal/topdata/damagetypes_migrate.go @@ -0,0 +1,288 @@ +package topdata + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "sort" + "strings" +) + +func importLegacyDamagetypes(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyRoot := filepath.Join(referenceBuilderDir, "data", "damagetypes") + if _, err := os.Stat(legacyRoot); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "damagetypes", "registry") + targetPath := filepath.Join(targetDir, "types.json") + if _, err := os.Stat(targetPath); err == nil { + obj, err := loadJSONObject(targetPath) + if err == nil && countLegacyTLKRefsInValue(obj) == 0 { + return 0, nil + } + } + + coreBase, err := loadJSONObject(filepath.Join(legacyRoot, "core", "base.json")) + if err != nil { + return 0, err + } + groupBase, err := loadJSONObject(filepath.Join(legacyRoot, "groups", "base.json")) + if err != nil { + return 0, err + } + hitvisualBase, err := loadJSONObject(filepath.Join(legacyRoot, "hitvisual", "base.json")) + if err != nil { + return 0, err + } + coreModule, err := loadJSONObject(filepath.Join(legacyRoot, "core", "modules", "add_eos.json")) + if err != nil { + return 0, err + } + coreLock, err := loadLockfile(filepath.Join(legacyRoot, "core", "lock.json")) + if err != nil { + return 0, err + } + groupModule, err := loadJSONObject(filepath.Join(legacyRoot, "groups", "modules", "add_eos.json")) + if err != nil { + return 0, err + } + groupLock, err := loadLockfile(filepath.Join(legacyRoot, "groups", "lock.json")) + if err != nil { + return 0, err + } + hitvisualModule, err := loadJSONObject(filepath.Join(legacyRoot, "hitvisual", "modules", "add_eos.json")) + if err != nil { + return 0, err + } + hitvisualLock, err := loadLockfile(filepath.Join(legacyRoot, "hitvisual", "lock.json")) + if err != nil { + return 0, err + } + + rows, lockData, err := mergeLegacyDamagetypes(coreBase, groupBase, hitvisualBase, coreModule, coreLock, groupModule, groupLock, hitvisualModule, hitvisualLock) + if err != nil { + return 0, err + } + + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(dataDir, "damagetypes", "core")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(dataDir, "damagetypes", "groups")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(dataDir, "damagetypes", "hitvisual")); err != nil { + return 0, err + } + + typesOut := map[string]any{"rows": rows} + raw, err := json.MarshalIndent(typesOut, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(targetPath, raw, 0o644); err != nil { + return 0, err + } + if err := saveLockfile(filepath.Join(targetDir, damagetypesRegistryLock), lockData); err != nil { + return 0, err + } + return 2, nil +} + +func mergeLegacyDamagetypes(coreBase, groupBase, hitvisualBase, coreModule map[string]any, coreLock map[string]int, groupModule map[string]any, groupLock map[string]int, hitvisualModule map[string]any, hitvisualLock map[string]int) ([]map[string]any, map[string]int, error) { + coreRows, err := coerceRowMapSlice(coreBase["rows"]) + if err != nil { + return nil, nil, err + } + groupRows, err := coerceRowMapSlice(groupBase["rows"]) + if err != nil { + return nil, nil, err + } + hitRows, err := coerceRowMapSlice(hitvisualBase["rows"]) + if err != nil { + return nil, nil, err + } + groupByID := map[int]map[string]any{} + for _, row := range groupRows { + id, err := asInt(row["id"]) + if err != nil { + return nil, nil, err + } + groupByID[id] = row + } + hitByID := map[int]map[string]any{} + for _, row := range hitRows { + id, err := asInt(row["id"]) + if err != nil { + return nil, nil, err + } + hitByID[id] = row + } + + outRows := make([]map[string]any, 0, len(coreRows)) + lockData := map[string]int{} + for _, core := range coreRows { + id, err := asInt(core["id"]) + if err != nil { + return nil, nil, err + } + groupID, err := asInt(core["DamageTypeGroup"]) + if err != nil { + return nil, nil, err + } + group := groupByID[groupID] + if group == nil { + return nil, nil, fmt.Errorf("core id %d references missing group %d", id, groupID) + } + hit := hitByID[id] + if hit == nil { + return nil, nil, fmt.Errorf("core id %d is missing hitvisual row", id) + } + key := "damagetype:" + normalizeDamagetypeKey(core["Label"]) + lockData[key] = id + outRows = append(outRows, map[string]any{ + "key": key, + "id": id, + "label": deepCopyValue(core["Label"]), + "charsheet_strref": deepCopyValue(core["CharsheetStrref"]), + "damage_type_group": strconvString(groupID), + "damage_ranged_projectile": deepCopyValue(core["DamageRangedProjectile"]), + "group_label": deepCopyValue(group["Label"]), + "feedback_strref": deepCopyValue(group["FeedbackStrref"]), + "color_r": deepCopyValue(group["ColorR"]), + "color_g": deepCopyValue(group["ColorG"]), + "color_b": deepCopyValue(group["ColorB"]), + "visual_effect_id": deepCopyValue(hit["VisualEffectID"]), + "ranged_effect_id": deepCopyValue(hit["RangedEffectID"]), + }) + } + + coreEntries, err := coerceEntriesMap(coreModule["entries"]) + if err != nil { + return nil, nil, err + } + groupEntries, err := coerceEntriesMap(groupModule["entries"]) + if err != nil { + return nil, nil, err + } + hitEntries, err := coerceEntriesMap(hitvisualModule["entries"]) + if err != nil { + return nil, nil, err + } + + keys := make([]string, 0, len(coreEntries)) + for key := range coreEntries { + keys = append(keys, key) + } + sort.Slice(keys, func(i, j int) bool { + a := strings.TrimPrefix(keys[i], "damagetypes:") + b := strings.TrimPrefix(keys[j], "damagetypes:") + return a < b + }) + for _, coreKey := range keys { + core := coreEntries[coreKey] + suffix := strings.TrimPrefix(coreKey, "damagetypes:") + group := groupEntries["damagetypegroups:"+suffix] + if group == nil { + return nil, nil, fmt.Errorf("%s: missing matching group entry", coreKey) + } + hit := hitEntries["damagehitvisual:"+suffix] + if hit == nil { + return nil, nil, fmt.Errorf("%s: missing matching hitvisual entry", coreKey) + } + id, ok := coreLock[coreKey] + if !ok { + return nil, nil, fmt.Errorf("%s: missing core lock id", coreKey) + } + groupKey := "damagetypegroups:" + suffix + groupID, ok := groupLock[groupKey] + if !ok { + return nil, nil, fmt.Errorf("%s: missing group lock id", groupKey) + } + hitKey := "damagehitvisual:" + suffix + hitID, ok := hitvisualLock[hitKey] + if !ok { + return nil, nil, fmt.Errorf("%s: missing hitvisual lock id", hitKey) + } + if hitID != id { + return nil, nil, fmt.Errorf("%s: core id %d does not match hitvisual id %d", suffix, id, hitID) + } + key := "damagetype:" + suffix + lockData[key] = id + outRows = append(outRows, map[string]any{ + "key": key, + "id": id, + "label": deepCopyValue(core["Label"]), + "charsheet_strref": deepCopyValue(core["CharsheetStrref"]), + "damage_type_group": strconvString(groupID), + "damage_ranged_projectile": deepCopyValue(core["DamageRangedProjectile"]), + "group_label": deepCopyValue(group["Label"]), + "feedback_strref": deepCopyValue(group["FeedbackStrref"]), + "color_r": deepCopyValue(group["ColorR"]), + "color_g": deepCopyValue(group["ColorG"]), + "color_b": deepCopyValue(group["ColorB"]), + "visual_effect_id": deepCopyValue(hit["VisualEffectID"]), + "ranged_effect_id": deepCopyValue(hit["RangedEffectID"]), + }) + } + + sort.Slice(outRows, func(i, j int) bool { + return outRows[i]["id"].(int) < outRows[j]["id"].(int) + }) + return outRows, lockData, nil +} + +func coerceRowMapSlice(value any) ([]map[string]any, error) { + rawRows, ok := value.([]any) + if !ok { + return nil, fmt.Errorf("rows must be an array") + } + rows := make([]map[string]any, 0, len(rawRows)) + for _, raw := range rawRows { + row, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("row must be an object") + } + rows = append(rows, row) + } + return rows, nil +} + +func coerceEntriesMap(value any) (map[string]map[string]any, error) { + rawEntries, ok := value.(map[string]any) + if !ok { + return nil, fmt.Errorf("entries must be an object") + } + entries := make(map[string]map[string]any, len(rawEntries)) + for key, raw := range rawEntries { + row, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("entry %s must be an object", key) + } + entries[key] = row + } + return entries, nil +} + +func normalizeDamagetypeKey(value any) string { + text := strings.TrimSpace(strings.ToLower(format2DAValue(value))) + text = strings.TrimSuffix(text, "damage") + text = strings.ReplaceAll(text, " ", "") + text = strings.ReplaceAll(text, "_", "") + text = strings.ReplaceAll(text, "-", "") + return text +} + +func strconvString(v int) string { + return fmt.Sprintf("%d", v) +} diff --git a/internal/topdata/damagetypes_registry.go b/internal/topdata/damagetypes_registry.go new file mode 100644 index 0000000..69b9be3 --- /dev/null +++ b/internal/topdata/damagetypes_registry.go @@ -0,0 +1,243 @@ +package topdata + +import ( + "fmt" + "os" + "path/filepath" + "slices" + "strconv" + "strings" +) + +const ( + damagetypesRegistryDirName = "damagetypes/registry" + damagetypesRegistryLock = "lock.json" +) + +type damagetypesRegistry struct { + RootPath string + LockPath string + LockData map[string]int + Types []map[string]any +} + +func collectGeneratedRegistryDatasets(dataDir string) ([]nativeCollectedDataset, error) { + itempropsDatasets, err := collectItempropsRegistryDatasets(dataDir) + if err != nil { + return nil, err + } + damagetypeDatasets, err := collectDamagetypesRegistryDatasets(dataDir) + if err != nil { + return nil, err + } + racialtypesDatasets, err := collectRacialtypesRegistryDatasets(dataDir) + if err != nil { + return nil, err + } + out := make([]nativeCollectedDataset, 0, len(itempropsDatasets)+len(damagetypeDatasets)+len(racialtypesDatasets)) + out = append(out, itempropsDatasets...) + out = append(out, damagetypeDatasets...) + out = append(out, racialtypesDatasets...) + return out, nil +} + +func loadDamagetypesRegistry(dataDir string) (*damagetypesRegistry, error) { + root := filepath.Join(dataDir, filepath.FromSlash(damagetypesRegistryDirName)) + info, err := os.Stat(root) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + if !info.IsDir() { + return nil, fmt.Errorf("damagetypes registry root must be a directory: %s", root) + } + + lockData, err := loadLockfile(filepath.Join(root, damagetypesRegistryLock)) + if err != nil { + return nil, err + } + types, err := loadRegistryRows(filepath.Join(root, "types.json")) + if err != nil { + return nil, err + } + return &damagetypesRegistry{ + RootPath: root, + LockPath: filepath.Join(root, damagetypesRegistryLock), + LockData: lockData, + Types: types, + }, nil +} + +func collectDamagetypesRegistryDatasets(dataDir string) ([]nativeCollectedDataset, error) { + registry, err := loadDamagetypesRegistry(dataDir) + if err != nil { + return nil, err + } + if registry == nil { + return nil, nil + } + + typeIDs, lockModified, err := assignDamagetypeRegistryIDs(registry.Types, registry.LockData) + if err != nil { + return nil, err + } + if lockModified { + if err := saveLockfile(registry.LockPath, registry.LockData); err != nil { + return nil, err + } + } + + typeRowsSorted := slices.Clone(registry.Types) + slices.SortFunc(typeRowsSorted, func(a, b map[string]any) int { + return typeIDs[stringField(a, "key")] - typeIDs[stringField(b, "key")] + }) + + coreRows := make([]map[string]any, 0, len(typeRowsSorted)) + hitvisualRows := make([]map[string]any, 0, len(typeRowsSorted)) + groupRowsByID := map[int]map[string]any{} + groupOrder := make([]int, 0) + for _, row := range typeRowsSorted { + key := stringField(row, "key") + rowID := typeIDs[key] + + groupID, err := registryIntField(row, "damage_type_group") + if err != nil { + return nil, fmt.Errorf("%s: %w", key, err) + } + coreRows = append(coreRows, map[string]any{ + "id": rowID, + "key": key, + "Label": registryStringField(row, "label"), + "CharsheetStrref": deepCopyValue(row["charsheet_strref"]), + "DamageTypeGroup": strconv.Itoa(groupID), + "DamageRangedProjectile": registryNullableField(row, "damage_ranged_projectile"), + }) + hitvisualRows = append(hitvisualRows, map[string]any{ + "id": rowID, + "key": strings.Replace(key, "damagetype:", "damagehitvisual:", 1), + "Label": registryStringField(row, "label"), + "VisualEffectID": registryNullableField(row, "visual_effect_id"), + "RangedEffectID": registryNullableField(row, "ranged_effect_id"), + }) + + if _, ok := groupRowsByID[groupID]; !ok { + groupRowsByID[groupID] = map[string]any{ + "id": groupID, + "key": strings.Replace(key, "damagetype:", "damagetypegroup:", 1), + "Label": registryStringField(row, "group_label"), + "FeedbackStrref": deepCopyValue(row["feedback_strref"]), + "ColorR": registryNullableField(row, "color_r"), + "ColorG": registryNullableField(row, "color_g"), + "ColorB": registryNullableField(row, "color_b"), + } + groupOrder = append(groupOrder, groupID) + continue + } + existing := groupRowsByID[groupID] + for field, candidate := range map[string]any{ + "Label": registryStringField(row, "group_label"), + "FeedbackStrref": deepCopyValue(row["feedback_strref"]), + "ColorR": registryNullableField(row, "color_r"), + "ColorG": registryNullableField(row, "color_g"), + "ColorB": registryNullableField(row, "color_b"), + } { + if format2DAValue(existing[field]) != format2DAValue(candidate) { + return nil, fmt.Errorf("%s: conflicting group projection for DamageTypeGroup %d field %s", key, groupID, field) + } + } + } + slices.Sort(groupOrder) + groupRows := make([]map[string]any, 0, len(groupOrder)) + for _, id := range groupOrder { + groupRows = append(groupRows, groupRowsByID[id]) + } + + return []nativeCollectedDataset{ + newGeneratedDataset("damagetypes/registry/core", "damagetypes.2da", []string{"Label", "CharsheetStrref", "DamageTypeGroup", "DamageRangedProjectile"}, coreRows), + newGeneratedDataset("damagetypes/registry/groups", "damagetypegroups.2da", []string{"Label", "FeedbackStrref", "ColorR", "ColorG", "ColorB"}, groupRows), + newGeneratedDataset("damagetypes/registry/hitvisual", "damagehitvisual.2da", []string{"Label", "VisualEffectID", "RangedEffectID"}, hitvisualRows), + }, nil +} + +func assignDamagetypeRegistryIDs(rows []map[string]any, lockData map[string]int) (map[string]int, bool, error) { + ids := map[string]int{} + used := map[int]struct{}{} + for key, id := range lockData { + if strings.HasPrefix(key, "damagetype:") { + used[id] = struct{}{} + } + } + modified := false + for _, row := range rows { + key := stringField(row, "key") + if key == "" { + return nil, false, fmt.Errorf("registry row is missing key") + } + if !strings.HasPrefix(key, "damagetype:") { + return nil, false, fmt.Errorf("registry key %q must use prefix %q", key, "damagetype:") + } + if rawID, ok := row["id"]; ok { + id, err := asInt(rawID) + if err != nil { + return nil, false, fmt.Errorf("%s: invalid id: %w", key, err) + } + if existing, ok := lockData[key]; ok && existing != id { + return nil, false, fmt.Errorf("%s: explicit id %d does not match lock id %d", key, id, existing) + } + lockData[key] = id + ids[key] = id + used[id] = struct{}{} + modified = true + continue + } + if id, ok := lockData[key]; ok { + ids[key] = id + used[id] = struct{}{} + } + } + nextID := nextAvailableID(used) + for _, row := range rows { + key := stringField(row, "key") + if _, ok := ids[key]; ok { + continue + } + lockData[key] = nextID + ids[key] = nextID + used[nextID] = struct{}{} + nextID = nextAvailableID(used) + modified = true + } + return ids, modified, nil +} + +func registryStringField(row map[string]any, field string) string { + text := stringField(row, field) + if text == "" { + return nullValue + } + return text +} + +func registryNullableField(row map[string]any, field string) any { + value, ok := row[field] + if !ok { + return nullValue + } + switch typed := value.(type) { + case string: + if strings.TrimSpace(typed) == "" { + return nullValue + } + } + return deepCopyValue(value) +} + +func registryIntField(row map[string]any, field string) (int, error) { + value, ok := row[field] + if !ok { + return 0, fmt.Errorf("missing %s", field) + } + return asInt(value) +} diff --git a/internal/topdata/doortypes_migrate.go b/internal/topdata/doortypes_migrate.go new file mode 100644 index 0000000..234d868 --- /dev/null +++ b/internal/topdata/doortypes_migrate.go @@ -0,0 +1,99 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyDoortypes(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "doortypes") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "doortypes") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + moduleNames := []string{ + "add_pld01.json", + "add_sic11.json", + "add_tapr.json", + "add_tdm01.json", + "add_tdx01.json", + "add_tei01.json", + "add_tfm01.json", + } + targetModulePaths := make([]string, 0, len(moduleNames)) + for _, name := range moduleNames { + targetModulePaths = append(targetModulePaths, filepath.Join(targetModulesDir, name)) + } + if fileExists(targetBasePath) && fileExists(targetLockPath) { + allModulesPresent := true + for _, path := range targetModulePaths { + if !fileExists(path) { + allModulesPresent = false + break + } + } + if allModulesPresent { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "doortypes.2da" + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + moduleObjs := make([]map[string]any, 0, len(moduleNames)) + for _, name := range moduleNames { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", name)) + if err != nil { + return 0, err + } + moduleObjs = append(moduleObjs, obj) + } + + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + } + for i, path := range targetModulePaths { + writes = append(writes, struct { + path string + obj map[string]any + }{path: path, obj: moduleObjs[i]}) + } + + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} diff --git a/internal/topdata/family_expansion.go b/internal/topdata/family_expansion.go new file mode 100644 index 0000000..2a4a25d --- /dev/null +++ b/internal/topdata/family_expansion.go @@ -0,0 +1,139 @@ +package topdata + +import ( + "fmt" + "strings" +) + +type familyIdentity struct { + Parent string + Child string +} + +type familyExpansionSource struct { + Dataset string + Column string + Predicate string +} + +type familyExpansionSpec struct { + Family string + FamilyKey string + Template string + ChildSource familyExpansionSource +} + +func splitFamilyExpansionIdentity(text string) familyIdentity { + text = strings.TrimSpace(text) + if text == "" { + return familyIdentity{} + } + if idx := strings.Index(text, "_"); idx > 0 && idx < len(text)-1 { + return familyIdentity{ + Parent: text[:idx], + Child: text[idx+1:], + } + } + return familyIdentity{Parent: text} +} + +func parseFamilyExpansionSource(raw any) (familyExpansionSource, error) { + if raw == nil { + return familyExpansionSource{}, fmt.Errorf("child_source is required") + } + obj, ok := raw.(map[string]any) + if !ok { + return familyExpansionSource{}, fmt.Errorf("child_source must be an object") + } + dataset, ok := obj["dataset"].(string) + if !ok || strings.TrimSpace(dataset) == "" { + return familyExpansionSource{}, fmt.Errorf("child_source.dataset must be a non-empty string") + } + source := familyExpansionSource{ + Dataset: strings.TrimSpace(dataset), + } + if column, ok := obj["column"].(string); ok && strings.TrimSpace(column) != "" { + source.Column = strings.TrimSpace(column) + } + if predicate, ok := obj["predicate"].(string); ok && strings.TrimSpace(predicate) != "" { + source.Predicate = strings.TrimSpace(predicate) + } + return source, nil +} + +func parseFamilyExpansionSpec(path string, obj map[string]any) (familyExpansionSpec, error) { + family, ok := obj["family"].(string) + if !ok || strings.TrimSpace(family) == "" { + return familyExpansionSpec{}, fmt.Errorf("generated file %s: family must be a non-empty string", path) + } + familyKey, ok := obj["family_key"].(string) + if !ok || strings.TrimSpace(familyKey) == "" { + return familyExpansionSpec{}, fmt.Errorf("generated file %s: family_key must be a non-empty string", path) + } + template, ok := obj["template"].(string) + if !ok || strings.TrimSpace(template) == "" { + return familyExpansionSpec{}, fmt.Errorf("generated file %s: template must be a non-empty string", path) + } + source, err := parseFamilyExpansionSource(obj["child_source"]) + if err != nil { + return familyExpansionSpec{}, fmt.Errorf("generated file %s: %w", path, err) + } + return familyExpansionSpec{ + Family: strings.TrimSpace(family), + FamilyKey: strings.TrimSpace(familyKey), + Template: strings.TrimSpace(template), + ChildSource: source, + }, nil +} + +func familyMetadata(parent, child, source, template string) map[string]any { + meta := map[string]any{ + "parent": strings.TrimSpace(parent), + } + if strings.TrimSpace(child) != "" { + meta["child"] = strings.TrimSpace(child) + } + if strings.TrimSpace(source) != "" { + meta["source"] = strings.TrimSpace(source) + } + if strings.TrimSpace(template) != "" { + meta["template"] = strings.TrimSpace(template) + } + return map[string]any{"family": meta} +} + +func parseFamilyMetadata(raw any) (map[string]any, error) { + obj, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("must be an object") + } + parent, ok := obj["parent"].(string) + if !ok || strings.TrimSpace(parent) == "" { + return nil, fmt.Errorf("parent must be a non-empty string") + } + meta := map[string]any{ + "parent": strings.TrimSpace(parent), + } + if child, ok := obj["child"].(string); ok && strings.TrimSpace(child) != "" { + meta["child"] = strings.TrimSpace(child) + } + if source, ok := obj["source"].(string); ok && strings.TrimSpace(source) != "" { + meta["source"] = strings.TrimSpace(source) + } + if template, ok := obj["template"].(string); ok && strings.TrimSpace(template) != "" { + meta["template"] = strings.TrimSpace(template) + } + return meta, nil +} + +func childTokenFromExpandedKey(key, parent string) string { + key = strings.TrimSpace(key) + key = strings.TrimPrefix(key, "feat:") + if strings.HasPrefix(key, parent+"_") { + return strings.TrimPrefix(key, parent+"_") + } + if strings.HasPrefix(key, parent) { + return strings.TrimPrefix(key, parent) + } + return "" +} diff --git a/internal/topdata/feat_migrate.go b/internal/topdata/feat_migrate.go new file mode 100644 index 0000000..b7b48f1 --- /dev/null +++ b/internal/topdata/feat_migrate.go @@ -0,0 +1,64 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyFeat(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "feat") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + legacyBasePath := filepath.Join(legacyDir, "base.json") + if _, err := os.Stat(legacyBasePath); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "feat") + targetBasePath := filepath.Join(targetDir, "base.json") + var targetObj map[string]any + if _, err := os.Stat(targetBasePath); err == nil { + targetObj, err = loadJSONObject(targetBasePath) + if err != nil { + return 0, err + } + } else if !os.IsNotExist(err) { + return 0, err + } + if targetObj != nil { + if rows, ok := targetObj["rows"].([]any); ok && len(rows) > 0 { + return 0, nil + } + } + + baseObj, err := loadJSONObject(legacyBasePath) + if err != nil { + return 0, err + } + baseObj["output"] = "feat.2da" + baseObj["compare_reference"] = false + canonicalizeWikiMetadataDocument(baseObj) + + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + raw, err := json.MarshalIndent(baseObj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(targetBasePath, raw, 0o644); err != nil { + return 0, err + } + return 1, nil +} diff --git a/internal/topdata/genericdoors_migrate.go b/internal/topdata/genericdoors_migrate.go new file mode 100644 index 0000000..07f3c15 --- /dev/null +++ b/internal/topdata/genericdoors_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacyGenericdoors(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "genericdoors", "genericdoors.2da", nil) +} diff --git a/internal/topdata/itemprops_registry.go b/internal/topdata/itemprops_registry.go new file mode 100644 index 0000000..669adad --- /dev/null +++ b/internal/topdata/itemprops_registry.go @@ -0,0 +1,1214 @@ +package topdata + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "slices" + "strconv" + "strings" +) + +const ( + itempropsRegistryDirName = "itemprops/registry" + itempropsRegistryLock = "lock.json" +) + +var itempropsAvailabilityColumns = []string{ + "0_Melee", + "1_Ranged", + "2_Thrown", + "3_Staves", + "4_Rods", + "5_Ammo", + "6_Arm_Shld", + "7_Helm", + "8_Potions", + "9_Scrolls", + "10_Wands", + "11_Thieves", + "12_TrapKits", + "13_Hide", + "14_Claw", + "15_Misc_Uneq", + "16_Misc", + "17_No_Props", + "18_Containers", + "19_HealerKit", + "20_Torch", + "21_Glove", +} + +var itempropsAvailabilityAliases = map[string]string{ + "0_melee": "melee", + "1_ranged": "ranged", + "2_thrown": "thrown", + "3_staves": "staves", + "4_rods": "rods", + "5_ammo": "ammo", + "6_arm_shld": "arm_shld", + "7_helm": "helm", + "8_potions": "potions", + "9_scrolls": "scrolls", + "10_wands": "wands", + "11_thieves": "thieves", + "12_trapkits": "trapkits", + "13_hide": "hide", + "14_claw": "claw", + "15_misc_uneq": "misc_uneq", + "16_misc": "misc", + "17_no_props": "no_props", + "18_containers": "containers", + "19_healerkit": "healerkit", + "20_torch": "torch", + "21_glove": "glove", +} + +var itempropsAvailabilityToColumn = map[string]string{ + "melee": "0_Melee", + "ranged": "1_Ranged", + "thrown": "2_Thrown", + "staves": "3_Staves", + "rods": "4_Rods", + "ammo": "5_Ammo", + "arm_shld": "6_Arm_Shld", + "helm": "7_Helm", + "potions": "8_Potions", + "scrolls": "9_Scrolls", + "wands": "10_Wands", + "thieves": "11_Thieves", + "trapkits": "12_TrapKits", + "hide": "13_Hide", + "claw": "14_Claw", + "misc_uneq": "15_Misc_Uneq", + "misc": "16_Misc", + "no_props": "17_No_Props", + "containers": "18_Containers", + "healerkit": "19_HealerKit", + "torch": "20_Torch", + "glove": "21_Glove", +} + +type itempropsRegistry struct { + RootPath string + LockPath string + LockData map[string]int + Properties []map[string]any + CostModels []map[string]any + ParamModels []map[string]any + SubtypeModels []map[string]any +} + +func loadItempropsRegistry(dataDir string) (*itempropsRegistry, error) { + root := filepath.Join(dataDir, filepath.FromSlash(itempropsRegistryDirName)) + info, err := os.Stat(root) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + if !info.IsDir() { + return nil, fmt.Errorf("itemprops registry root must be a directory: %s", root) + } + + lockData, err := loadLockfile(filepath.Join(root, itempropsRegistryLock)) + if err != nil { + return nil, err + } + + properties, err := loadRegistryRows(filepath.Join(root, "properties.json")) + if err != nil { + return nil, err + } + costModels, err := loadRegistryRows(filepath.Join(root, "cost_models.json")) + if err != nil { + return nil, err + } + paramModels, err := loadRegistryRows(filepath.Join(root, "param_models.json")) + if err != nil { + return nil, err + } + subtypeModels, err := loadRegistryRows(filepath.Join(root, "subtype_models.json")) + if err != nil { + return nil, err + } + + return &itempropsRegistry{ + RootPath: root, + LockPath: filepath.Join(root, itempropsRegistryLock), + LockData: lockData, + Properties: properties, + CostModels: costModels, + ParamModels: paramModels, + SubtypeModels: subtypeModels, + }, nil +} + +func loadRegistryRows(path string) ([]map[string]any, error) { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + rawRows, ok := obj["rows"].([]any) + if !ok { + return nil, fmt.Errorf("%s: rows must be an array", path) + } + rows := make([]map[string]any, 0, len(rawRows)) + for index, raw := range rawRows { + row, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: row %d must be an object", path, index) + } + rows = append(rows, row) + } + return rows, nil +} + +func collectItempropsRegistryDatasets(dataDir string) ([]nativeCollectedDataset, error) { + registry, err := loadItempropsRegistry(dataDir) + if err != nil { + return nil, err + } + if registry == nil { + return nil, nil + } + + propertyIDs, lockModified, err := assignRegistryIDs(registry.Properties, registry.LockData, "itemprop:") + if err != nil { + return nil, err + } + costIDs, costModified, err := assignRegistryIDs(registry.CostModels, registry.LockData, "cost_models:") + if err != nil { + return nil, err + } + paramIDs, paramModified, err := assignRegistryIDs(registry.ParamModels, registry.LockData, "param_models:") + if err != nil { + return nil, err + } + lockModified = lockModified || costModified || paramModified + if lockModified { + if err := saveLockfile(registry.LockPath, registry.LockData); err != nil { + return nil, err + } + } + + subtypeByKey := map[string]map[string]any{} + for _, row := range registry.SubtypeModels { + key := stringField(row, "key") + if key != "" { + subtypeByKey[key] = row + } + } + costByKey := map[string]map[string]any{} + for _, row := range registry.CostModels { + key := stringField(row, "key") + if key != "" { + costByKey[key] = row + } + } + paramByKey := map[string]map[string]any{} + for _, row := range registry.ParamModels { + key := stringField(row, "key") + if key != "" { + paramByKey[key] = row + } + } + + datasets := make([]nativeCollectedDataset, 0) + itempropsRows := make([]map[string]any, 0, len(registry.Properties)) + itempropdefRows := make([]map[string]any, 0, len(registry.Properties)) + propertyRowsSorted := slices.Clone(registry.Properties) + slices.SortFunc(propertyRowsSorted, func(a, b map[string]any) int { + return propertyIDs[stringField(a, "key")] - propertyIDs[stringField(b, "key")] + }) + for _, property := range propertyRowsSorted { + key := stringField(property, "key") + rowID := propertyIDs[key] + + itempropsRow := map[string]any{ + "id": rowID, + "key": "itemprops:" + strings.TrimPrefix(key, "itemprop:"), + "StringRef": itempropsSetName(property), + "Label": itempropsSetLabel(property), + } + for _, column := range itempropsAvailabilityColumns { + itempropsRow[column] = nullValue + } + availability, err := canonicalAvailability(property) + if err != nil { + return nil, fmt.Errorf("%s: %w", key, err) + } + for _, group := range availability { + column := itempropsAvailabilityToColumn[group] + itempropsRow[column] = "1" + } + itempropsRows = append(itempropsRows, itempropsRow) + + subtypeResRef := nullValue + if subtypeKey, ok := refField(property["subtype"]); ok { + subtype, ok := subtypeByKey[subtypeKey] + if !ok { + return nil, fmt.Errorf("%s: unknown subtype ref %s", key, subtypeKey) + } + subtypeResRef = stringField(subtype, "table_resref") + if subtypeResRef == "" { + return nil, fmt.Errorf("%s: subtype model %s is missing table_resref", key, subtypeKey) + } + } + + costValue := nullValue + costRefID := nullValue + if rawCost, ok := property["cost"].(map[string]any); ok { + if value, ok := rawCost["value"]; ok { + costValue = formatRegistryScalar(value) + } + costRefKey, ok := refField(rawCost) + if ok { + id, ok := costIDs[costRefKey] + if !ok { + return nil, fmt.Errorf("%s: unknown cost ref %s", key, costRefKey) + } + costRefID = strconv.Itoa(id) + } + } + + paramRefID := nullValue + if paramKey, ok := refField(property["param"]); ok { + id, ok := paramIDs[paramKey] + if !ok { + return nil, fmt.Errorf("%s: unknown param ref %s", key, paramKey) + } + paramRefID = strconv.Itoa(id) + } + + itempropdefRows = append(itempropdefRows, map[string]any{ + "id": rowID, + "key": "itempropdef:" + strings.TrimPrefix(key, "itemprop:"), + "Name": deepCopyValue(property["name"]), + "Label": itempropsDefLabel(property), + "SubTypeResRef": subtypeResRef, + "Cost": costValue, + "CostTableResRef": costRefID, + "Param1ResRef": paramRefID, + "GameStrRef": deepCopyValue(property["property_text"]), + "Description": nullableRegistryField(property, "description"), + }) + } + + costRows := make([]map[string]any, 0, len(registry.CostModels)) + costRowsSorted := slices.Clone(registry.CostModels) + slices.SortFunc(costRowsSorted, func(a, b map[string]any) int { + return costIDs[stringField(a, "key")] - costIDs[stringField(b, "key")] + }) + for _, costModel := range costRowsSorted { + key := stringField(costModel, "key") + costRows = append(costRows, map[string]any{ + "id": costIDs[key], + "key": key, + "Name": stringField(costModel, "index_name"), + "Label": stringField(costModel, "label"), + "ClientLoad": formatRegistryScalar(costModel["client_load"]), + }) + } + + paramRows := make([]map[string]any, 0, len(registry.ParamModels)) + paramRowsSorted := slices.Clone(registry.ParamModels) + slices.SortFunc(paramRowsSorted, func(a, b map[string]any) int { + return paramIDs[stringField(a, "key")] - paramIDs[stringField(b, "key")] + }) + for _, paramModel := range paramRowsSorted { + key := stringField(paramModel, "key") + table, ok := paramModel["table"].(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: param model missing table", key) + } + paramRows = append(paramRows, map[string]any{ + "id": paramIDs[key], + "key": key, + "Name": nullableRegistryField(paramModel, "name"), + "Lable": stringField(paramModel, "label"), + "TableResRef": stringField(table, "resref"), + }) + } + + datasets = append(datasets, + newGeneratedDataset("itemprops/registry/itemprops", "itemprops.2da", itempropsAvailabilityColumnsWithMeta(), itempropsRows), + newGeneratedDataset("itemprops/registry/itempropdef", "itempropdef.2da", []string{"Name", "Label", "SubTypeResRef", "Cost", "CostTableResRef", "Param1ResRef", "GameStrRef", "Description"}, itempropdefRows), + newGeneratedDataset("itemprops/registry/costtable_index", "iprp_costtable.2da", []string{"Name", "Label", "ClientLoad"}, costRows), + newGeneratedDataset("itemprops/registry/paramtable_index", "iprp_paramtable.2da", []string{"Name", "Lable", "TableResRef"}, paramRows), + ) + + auxDatasets, err := collectItempropsAuxiliaryDatasets(registry.CostModels, "cost_models", "itemprops/registry/cost_models") + if err != nil { + return nil, err + } + datasets = append(datasets, auxDatasets...) + auxDatasets, err = collectItempropsAuxiliaryDatasets(registry.ParamModels, "param_models", "itemprops/registry/param_models") + if err != nil { + return nil, err + } + datasets = append(datasets, auxDatasets...) + auxDatasets, err = collectItempropsAuxiliaryDatasets(registry.SubtypeModels, "subtype_models", "itemprops/registry/subtype_models") + if err != nil { + return nil, err + } + datasets = append(datasets, auxDatasets...) + return datasets, nil +} + +func newGeneratedDataset(name, outputName string, columns []string, rows []map[string]any) nativeCollectedDataset { + return nativeCollectedDataset{ + Dataset: nativeDataset{ + Kind: nativeDatasetPlain, + Name: name, + OutputName: outputName, + Spec: specForDataset(name), + }, + Columns: columns, + Rows: rows, + LockData: map[string]int{}, + } +} + +func itempropsAvailabilityColumnsWithMeta() []string { + columns := append([]string{}, itempropsAvailabilityColumns...) + columns = append(columns, "StringRef", "Label") + return columns +} + +func collectItempropsAuxiliaryDatasets(models []map[string]any, keyPrefix, namePrefix string) ([]nativeCollectedDataset, error) { + out := make([]nativeCollectedDataset, 0) + for _, model := range models { + key := stringField(model, "key") + table, ok := model["table"].(map[string]any) + if !ok { + continue + } + if !strings.EqualFold(stringField(table, "ownership"), "owned") { + continue + } + outputName := stringField(table, "output") + if outputName == "" { + outputName = stringField(table, "resref") + ".2da" + } + rawColumns, ok := table["columns"].([]any) + if !ok { + return nil, fmt.Errorf("%s: owned table is missing columns", key) + } + columns := make([]string, 0, len(rawColumns)) + for _, rawColumn := range rawColumns { + column, ok := rawColumn.(string) + if !ok { + return nil, fmt.Errorf("%s: owned table columns must be strings", key) + } + columns = append(columns, column) + } + rawRows, ok := table["rows"].([]any) + if !ok { + return nil, fmt.Errorf("%s: owned table rows must be an array", key) + } + rows := make([]map[string]any, 0, len(rawRows)) + for index, rawRow := range rawRows { + row, ok := rawRow.(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: owned table row %d must be an object", key, index) + } + canonical, err := canonicalizeBaseRow(nativeDataset{Name: keyPrefix + "/" + strings.TrimPrefix(key, keyPrefix+":"), Spec: specForDataset("itemprops")}, columns, row, index) + if err != nil { + return nil, err + } + rows = append(rows, canonical) + } + out = append(out, newGeneratedDataset(namePrefix+"/"+strings.TrimPrefix(key, keyPrefix+":"), outputName, columns, rows)) + } + return out, nil +} + +func assignRegistryIDs(rows []map[string]any, lockData map[string]int, requiredPrefix string) (map[string]int, bool, error) { + ids := map[string]int{} + used := map[int]struct{}{} + for key, id := range lockData { + if strings.HasPrefix(key, requiredPrefix) { + used[id] = struct{}{} + } + } + modified := false + for _, row := range rows { + key := stringField(row, "key") + if key == "" { + return nil, false, fmt.Errorf("registry row is missing key") + } + if !strings.HasPrefix(key, requiredPrefix) { + return nil, false, fmt.Errorf("registry key %q must use prefix %q", key, requiredPrefix) + } + if id, ok := lockData[key]; ok { + ids[key] = id + used[id] = struct{}{} + continue + } + } + nextID := nextAvailableID(used) + for _, row := range rows { + key := stringField(row, "key") + if _, ok := ids[key]; ok { + continue + } + lockData[key] = nextID + ids[key] = nextID + used[nextID] = struct{}{} + nextID = nextAvailableID(used) + modified = true + } + return ids, modified, nil +} + +func canonicalAvailability(row map[string]any) ([]string, error) { + rawAvailability, ok := row["availability"] + if !ok { + return nil, nil + } + rawList, ok := rawAvailability.([]any) + if !ok { + return nil, fmt.Errorf("availability must be an array") + } + out := make([]string, 0, len(rawList)) + seen := map[string]struct{}{} + for _, raw := range rawList { + text, ok := raw.(string) + if !ok { + return nil, fmt.Errorf("availability values must be strings") + } + normalized := normalizeAvailabilityName(text) + if _, ok := itempropsAvailabilityToColumn[normalized]; !ok { + return nil, fmt.Errorf("unknown availability group %q", text) + } + if _, ok := seen[normalized]; ok { + continue + } + seen[normalized] = struct{}{} + out = append(out, normalized) + } + slices.Sort(out) + return out, nil +} + +func normalizeAvailabilityName(name string) string { + normalized := strings.TrimSpace(strings.ToLower(name)) + normalized = strings.ReplaceAll(normalized, " ", "_") + normalized = strings.ReplaceAll(normalized, "-", "_") + if alias, ok := itempropsAvailabilityAliases[normalized]; ok { + return alias + } + return normalized +} + +func refField(value any) (string, bool) { + if value == nil { + return "", false + } + refMap, ok := value.(map[string]any) + if !ok { + return "", false + } + rawRef, ok := refMap["ref"] + if !ok { + return "", false + } + text, ok := rawRef.(string) + return text, ok && strings.TrimSpace(text) != "" +} + +func stringField(obj map[string]any, field string) string { + raw, ok := obj[field] + if !ok || raw == nil { + return "" + } + switch typed := raw.(type) { + case string: + return typed + case float64: + if typed == float64(int64(typed)) { + return strconv.FormatInt(int64(typed), 10) + } + return strconv.FormatFloat(typed, 'f', -1, 64) + default: + return "" + } +} + +func nullableRegistryField(obj map[string]any, field string) any { + value, ok := obj[field] + if !ok || value == nil { + return nullValue + } + if text, ok := value.(string); ok && strings.TrimSpace(text) == "" { + return nullValue + } + return deepCopyValue(value) +} + +func itempropsDefLabel(obj map[string]any) string { + return stringField(obj, "label") +} + +func itempropsSetName(obj map[string]any) any { + if value, ok := obj["set_name"]; ok { + return deepCopyValue(value) + } + return deepCopyValue(obj["name"]) +} + +func itempropsSetLabel(obj map[string]any) string { + if label := stringField(obj, "set_label"); label != "" { + return label + } + return itempropsDefLabel(obj) +} + +func formatRegistryScalar(value any) string { + if value == nil { + return nullValue + } + switch typed := value.(type) { + case string: + if strings.TrimSpace(typed) == "" { + return nullValue + } + return typed + case float64: + if typed == float64(int64(typed)) { + return strconv.FormatInt(int64(typed), 10) + } + return strconv.FormatFloat(typed, 'f', -1, 64) + case int: + return strconv.Itoa(typed) + default: + return fmt.Sprint(typed) + } +} + +func deepCopyValue(value any) any { + raw, err := json.Marshal(value) + if err != nil { + return value + } + var out any + if err := json.Unmarshal(raw, &out); err != nil { + return value + } + return out +} + +func importLegacyItempropsRegistry(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + legacyDataDir := filepath.Join(referenceBuilderDir, "data") + registryDir := filepath.Join(dataDir, filepath.FromSlash(itempropsRegistryDirName)) + if _, err := os.Stat(filepath.Join(registryDir, "properties.json")); err == nil { + if refs, err := countLegacyTLKRefsInRegistry(registryDir); err == nil && refs == 0 { + return 0, nil + } + } + if _, err := os.Stat(filepath.Join(legacyDataDir, "itemprops")); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + defs, err := collectBaseDataset(nativeDataset{ + Name: "itemprops/defs", + BasePath: filepath.Join(legacyDataDir, "itemprops", "defs", "base.json"), + LockPath: filepath.Join(legacyDataDir, "itemprops", "defs", "lock.json"), + ModulesDir: filepath.Join(legacyDataDir, "itemprops", "defs", "modules"), + Spec: specForDataset("itemprops"), + }) + if err != nil { + return 0, err + } + sets, err := collectBaseDataset(nativeDataset{ + Name: "itemprops/sets", + BasePath: filepath.Join(legacyDataDir, "itemprops", "sets", "base.json"), + LockPath: filepath.Join(legacyDataDir, "itemprops", "sets", "lock.json"), + ModulesDir: filepath.Join(legacyDataDir, "itemprops", "sets", "modules"), + Spec: specForDataset("itemprops"), + }) + if err != nil { + return 0, err + } + costIndex, err := collectBaseDataset(nativeDataset{ + Name: "itemprops/costtables/index", + BasePath: filepath.Join(legacyDataDir, "itemprops", "costtables", "index", "base.json"), + LockPath: filepath.Join(legacyDataDir, "itemprops", "costtables", "index", "lock.json"), + ModulesDir: filepath.Join(legacyDataDir, "itemprops", "costtables", "index", "modules"), + Spec: specForDataset("itemprops"), + }) + if err != nil { + return 0, err + } + paramIndex, err := collectBaseDataset(nativeDataset{ + Name: "itemprops/paramtables/index", + BasePath: filepath.Join(legacyDataDir, "itemprops", "paramtables", "index", "base.json"), + LockPath: filepath.Join(legacyDataDir, "itemprops", "paramtables", "index", "lock.json"), + ModulesDir: filepath.Join(legacyDataDir, "itemprops", "paramtables", "index", "modules"), + Spec: specForDataset("itemprops"), + }) + if err != nil { + return 0, err + } + + ownedCostTables, err := collectLegacyOwnedItempropTables(filepath.Join(legacyDataDir, "itemprops", "costtables"), "index") + if err != nil { + return 0, err + } + ownedParamTables, err := collectLegacyOwnedItempropTables(filepath.Join(legacyDataDir, "itemprops", "paramtables"), "index") + if err != nil { + return 0, err + } + ownedSubtypeTables, err := collectLegacyOwnedItempropTables(filepath.Join(legacyDataDir, "itemprops", "subtypes"), "") + if err != nil && !os.IsNotExist(err) { + return 0, err + } + + setsByID := map[int]map[string]any{} + for _, row := range sets.Rows { + setsByID[row["id"].(int)] = row + } + costByID := map[int]map[string]any{} + for _, row := range costIndex.Rows { + costByID[row["id"].(int)] = row + } + paramByID := map[int]map[string]any{} + for _, row := range paramIndex.Rows { + paramByID[row["id"].(int)] = row + } + + registryLock := map[string]int{} + legacyKeyByID := map[string]string{} + if legacyTLK != nil { + for key, id := range legacyTLK.Lock { + legacyKeyByID[strconv.Itoa(id)] = key + } + } + properties := make([]map[string]any, 0, len(defs.Rows)) + subtypeRegistryByKey := map[string]map[string]any{} + for _, row := range defs.Rows { + rowID := row["id"].(int) + key := canonicalItempropPropertyKey(row) + registryLock[key] = rowID + + property := map[string]any{ + "key": key, + "label": row["Label"], + "name": deepCopyValue(row["Name"]), + "property_text": deepCopyValue(row["GameStrRef"]), + } + if description := nullableRegistryField(row, "Description"); description != nullValue { + property["description"] = description + } + if setRow, ok := setsByID[rowID]; ok { + property["availability"] = importLegacyAvailability(setRow) + if setName := nullableRegistryField(setRow, "StringRef"); setName != nullValue && setName != stringField(row, "Name") { + property["set_name"] = setName + } + if setLabel := stringField(setRow, "Label"); setLabel != "" && setLabel != stringField(row, "Label") { + property["set_label"] = setLabel + } + } else { + property["availability"] = []any{} + } + + if subtypeResRef := stringField(row, "SubTypeResRef"); subtypeResRef != "" && subtypeResRef != nullValue { + subtypeKey := canonicalModelKey("subtype_models", subtypeResRef) + property["subtype"] = map[string]any{"ref": subtypeKey} + if _, ok := subtypeRegistryByKey[subtypeKey]; !ok { + subtypeRegistryByKey[subtypeKey] = buildLegacySubtypeModel(subtypeKey, subtypeResRef, ownedSubtypeTables) + } + } + costValue := stringField(row, "Cost") + costID := stringField(row, "CostTableResRef") + if costValue != "" && costValue != nullValue || costID != "" && costID != nullValue { + cost := map[string]any{} + if costValue != "" && costValue != nullValue { + cost["value"] = costValue + } + if costID != "" && costID != nullValue { + id, err := strconv.Atoi(costID) + if err != nil { + return 0, err + } + costRow, ok := costByID[id] + if !ok { + return 0, fmt.Errorf("%s references missing cost table index %s", key, costID) + } + cost["ref"] = canonicalModelKey("cost_models", stringField(costRow, "Name")) + } + property["cost"] = cost + } + if paramID := stringField(row, "Param1ResRef"); paramID != "" && paramID != nullValue { + id, err := strconv.Atoi(paramID) + if err != nil { + return 0, err + } + paramRow, ok := paramByID[id] + if !ok { + return 0, fmt.Errorf("%s references missing param table index %s", key, paramID) + } + property["param"] = map[string]any{"ref": canonicalModelKey("param_models", stringField(paramRow, "TableResRef"))} + } + if legacyTLK != nil { + property["name"] = importLegacyStrrefValue(property["name"], key+".name", legacyTLK, legacyKeyByID) + property["property_text"] = importLegacyStrrefValue(property["property_text"], key+".property_text", legacyTLK, legacyKeyByID) + if description, ok := property["description"]; ok { + property["description"] = importLegacyStrrefValue(description, key+".description", legacyTLK, legacyKeyByID) + } + if updated, _, err := inlineLegacyTLKValue(property, legacyTLK); err != nil { + return 0, err + } else if updated { + // property updated in place + } + } + properties = append(properties, property) + } + + costModels := make([]map[string]any, 0, len(costIndex.Rows)) + for _, row := range costIndex.Rows { + key := canonicalModelKey("cost_models", stringField(row, "Name")) + registryLock[key] = row["id"].(int) + model := map[string]any{ + "key": key, + "index_name": row["Name"], + "label": row["Label"], + "client_load": row["ClientLoad"], + "table": buildLegacyOwnedModelTable(stringField(row, "Name"), ownedCostTables), + } + costModels = append(costModels, model) + } + + paramModels := make([]map[string]any, 0, len(paramIndex.Rows)) + for _, row := range paramIndex.Rows { + key := canonicalModelKey("param_models", stringField(row, "TableResRef")) + registryLock[key] = row["id"].(int) + model := map[string]any{ + "key": key, + "name": deepCopyValue(row["Name"]), + "label": row["Lable"], + "table": buildLegacyOwnedModelTable(stringField(row, "TableResRef"), ownedParamTables), + } + paramModels = append(paramModels, model) + } + + subtypeModels := make([]map[string]any, 0, len(subtypeRegistryByKey)) + for _, key := range sortedKeysAny(subtypeRegistryByKey) { + subtypeModels = append(subtypeModels, subtypeRegistryByKey[key]) + } + + writes := []struct { + path string + obj map[string]any + }{ + {filepath.Join(registryDir, "properties.json"), map[string]any{"rows": properties}}, + {filepath.Join(registryDir, "cost_models.json"), map[string]any{"rows": costModels}}, + {filepath.Join(registryDir, "param_models.json"), map[string]any{"rows": paramModels}}, + {filepath.Join(registryDir, "subtype_models.json"), map[string]any{"rows": subtypeModels}}, + {filepath.Join(registryDir, itempropsRegistryLock), anyMapInt(registryLock)}, + } + if err := os.MkdirAll(registryDir, 0o755); err != nil { + return 0, err + } + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} + +func countLegacyTLKRefsInRegistry(registryDir string) (int, error) { + paths, err := collectDataJSONPaths(registryDir) + if err != nil { + return 0, err + } + refs := 0 + for _, path := range paths { + obj, err := loadJSONObject(path) + if err != nil { + return 0, err + } + refs += countLegacyTLKRefsInValue(obj) + } + return refs, nil +} + +func collectLegacyOwnedItempropTables(root, skipDir string) (map[string]map[string]any, error) { + result := map[string]map[string]any{} + entries, err := os.ReadDir(root) + if err != nil { + return nil, err + } + for _, entry := range entries { + if !entry.IsDir() { + continue + } + if skipDir != "" && entry.Name() == skipDir { + continue + } + dir := filepath.Join(root, entry.Name()) + basePath := filepath.Join(dir, "base.json") + if _, err := os.Stat(basePath); err != nil { + continue + } + collected, err := collectBaseDataset(nativeDataset{ + Name: filepath.ToSlash(filepath.Join("itemprops", filepath.Base(root), entry.Name())), + BasePath: basePath, + LockPath: filepath.Join(dir, "lock.json"), + ModulesDir: filepath.Join(dir, "modules"), + Spec: specForDataset("itemprops"), + }) + if err != nil { + return nil, err + } + result[strings.ToLower(outputStem(collected.Dataset.OutputName))] = map[string]any{ + "ownership": "owned", + "resref": outputStem(collected.Dataset.OutputName), + "output": collected.Dataset.OutputName, + "columns": stringSliceToAny(collected.Columns), + "rows": rowsToAny(collected.Rows), + } + } + return result, nil +} + +func buildLegacySubtypeModel(key, resref string, owned map[string]map[string]any) map[string]any { + return map[string]any{ + "key": key, + "table_resref": resref, + "table": buildLegacyOwnedModelTable(resref, owned), + } +} + +func buildLegacyOwnedModelTable(resref string, owned map[string]map[string]any) map[string]any { + if table, ok := owned[strings.ToLower(resref)]; ok { + return table + } + return map[string]any{ + "ownership": "external", + "resref": resref, + } +} + +func canonicalItempropPropertyKey(row map[string]any) string { + if key := stringField(row, "key"); key != "" { + return "itemprop:" + strings.TrimPrefix(key, "itempropdef:") + } + return canonicalModelKey("itemprop", stringField(row, "Label")) +} + +func canonicalModelKey(prefix, source string) string { + normalized := strings.ToLower(strings.TrimSpace(source)) + normalized = strings.ReplaceAll(normalized, " ", "") + normalized = strings.ReplaceAll(normalized, "-", "") + normalized = strings.ReplaceAll(normalized, "_", "") + return prefix + ":" + normalized +} + +func importLegacyStrrefValue(value any, fallbackKey string, legacy *legacyTLKData, keyByID map[string]string) any { + if legacy == nil { + return value + } + if _, ok, _ := parseTLKPayload(value, true); ok { + return value + } + _ = keyByID + key := fallbackKey + entry, ok := legacy.Entries[key] + if !ok { + return value + } + payload := map[string]any{ + "key": key, + "text": entry.Text, + } + if entry.SoundResRef != "" { + payload["sound_resref"] = entry.SoundResRef + } + if entry.SoundLength != 0 { + payload["sound_length"] = entry.SoundLength + } + return map[string]any{"tlk": payload} +} + +func importLegacyAvailability(row map[string]any) []any { + out := make([]any, 0) + for _, column := range itempropsAvailabilityColumns { + value, ok := row[column] + if !ok { + continue + } + text := formatRegistryScalar(value) + if text != "1" { + continue + } + out = append(out, normalizeAvailabilityName(column)) + } + return out +} + +func anyMapInt(values map[string]int) map[string]any { + out := make(map[string]any, len(values)) + for key, value := range values { + out[key] = value + } + return out +} + +func stringSliceToAny(values []string) []any { + out := make([]any, 0, len(values)) + for _, value := range values { + out = append(out, value) + } + return out +} + +func rowsToAny(rows []map[string]any) []any { + out := make([]any, 0, len(rows)) + for _, row := range rows { + out = append(out, deepCopyValue(row)) + } + return out +} + +func sortedKeysAny(values map[string]map[string]any) []string { + out := make([]string, 0, len(values)) + for key := range values { + out = append(out, key) + } + slices.Sort(out) + return out +} + +func validateItempropsRegistryGraph(dataDir string, report *ValidationReport) { + registry, err := loadItempropsRegistry(dataDir) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(dataDir, filepath.FromSlash(itempropsRegistryDirName)), + Message: err.Error(), + }) + return + } + if registry == nil { + return + } + + seenPropertyKeys := map[string]struct{}{} + seenDefLabels := map[string]string{} + seenSetLabels := map[string]string{} + seenCostKeys := map[string]struct{}{} + seenParamKeys := map[string]struct{}{} + seenSubtypeKeys := map[string]string{} + ownedOutputs := map[string]string{} + + for _, row := range registry.CostModels { + key := stringField(row, "key") + if key == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "cost_models.json"), + Message: "cost model row is missing key", + }) + continue + } + if _, ok := seenCostKeys[key]; ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "cost_models.json"), + Message: fmt.Sprintf("duplicate cost model key %q", key), + }) + } + seenCostKeys[key] = struct{}{} + validateOwnedRegistryTable(filepath.Join(registry.RootPath, "cost_models.json"), key, row, ownedOutputs, report) + } + for _, row := range registry.ParamModels { + key := stringField(row, "key") + if key == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "param_models.json"), + Message: "param model row is missing key", + }) + continue + } + if _, ok := seenParamKeys[key]; ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "param_models.json"), + Message: fmt.Sprintf("duplicate param model key %q", key), + }) + } + seenParamKeys[key] = struct{}{} + validateOwnedRegistryTable(filepath.Join(registry.RootPath, "param_models.json"), key, row, ownedOutputs, report) + } + for _, row := range registry.SubtypeModels { + key := stringField(row, "key") + if key == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "subtype_models.json"), + Message: "subtype model row is missing key", + }) + continue + } + resref := stringField(row, "table_resref") + if existing, ok := seenSubtypeKeys[key]; ok { + if !strings.EqualFold(existing, resref) { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "subtype_models.json"), + Message: fmt.Sprintf("duplicate subtype model key %q", key), + }) + } + continue + } + seenSubtypeKeys[key] = resref + validateOwnedRegistryTable(filepath.Join(registry.RootPath, "subtype_models.json"), key, row, ownedOutputs, report) + } + for _, row := range registry.Properties { + key := stringField(row, "key") + if key == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: "property row is missing key", + }) + continue + } + if _, ok := seenPropertyKeys[key]; ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("duplicate property key %q", key), + }) + } + seenPropertyKeys[key] = struct{}{} + defLabel := itempropsDefLabel(row) + if defLabel == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("%s is missing label", key), + }) + } else if owner, ok := seenDefLabels[strings.ToLower(defLabel)]; ok && owner != key { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("generated itempropdef label collision between %q and %q", owner, key), + }) + } else { + seenDefLabels[strings.ToLower(defLabel)] = key + } + setLabel := itempropsSetLabel(row) + if setLabel == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("%s is missing itemprops set label", key), + }) + } else if owner, ok := seenSetLabels[strings.ToLower(setLabel)]; ok && owner != key { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("generated itemprops set label collision between %q and %q", owner, key), + }) + } else { + seenSetLabels[strings.ToLower(setLabel)] = key + } + if _, err := canonicalAvailability(row); err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("%s: %v", key, err), + }) + } + if subtypeKey, ok := refField(row["subtype"]); ok { + if _, exists := seenSubtypeKeys[subtypeKey]; !exists { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("%s: unknown subtype ref %s", key, subtypeKey), + }) + } + } + if rawCost, ok := row["cost"].(map[string]any); ok { + if costKey, ok := refField(rawCost); ok { + if _, exists := seenCostKeys[costKey]; !exists { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("%s: unknown cost ref %s", key, costKey), + }) + } + } + } + if paramKey, ok := refField(row["param"]); ok { + if _, exists := seenParamKeys[paramKey]; !exists { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(registry.RootPath, "properties.json"), + Message: fmt.Sprintf("%s: unknown param ref %s", key, paramKey), + }) + } + } + } +} + +func validateOwnedRegistryTable(path, key string, row map[string]any, ownedOutputs map[string]string, report *ValidationReport) { + table, ok := row["table"].(map[string]any) + if !ok { + return + } + if !strings.EqualFold(stringField(table, "ownership"), "owned") { + return + } + resref := stringField(table, "resref") + if resref == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s: owned table is missing resref", key), + }) + return + } + outputName := stringField(table, "output") + if outputName == "" { + outputName = resref + ".2da" + } + if owner, ok := ownedOutputs[strings.ToLower(outputName)]; ok && owner != key { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("owned table output collision between %q and %q", owner, key), + }) + } else { + ownedOutputs[strings.ToLower(outputName)] = key + } + if _, ok := table["columns"].([]any); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s: owned table columns must be an array", key), + }) + } + if _, ok := table["rows"].([]any); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s: owned table rows must be an array", key), + }) + } +} diff --git a/internal/topdata/legacy_dataset_migrate.go b/internal/topdata/legacy_dataset_migrate.go new file mode 100644 index 0000000..0037cbf --- /dev/null +++ b/internal/topdata/legacy_dataset_migrate.go @@ -0,0 +1,176 @@ +package topdata + +import ( + "encoding/json" + "io/fs" + "os" + "path/filepath" + "sort" + "strings" +) + +type legacyDatasetTransform func(relativePath string, obj map[string]any) + +func importLegacyDatasetMirror(referenceBuilderDir, dataDir, datasetName, outputName string, transform legacyDatasetTransform) (int, error) { + legacyDir := filepath.Join(referenceBuilderDir, "data", datasetName) + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, datasetName) + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + if outputName != "" { + baseObj["output"] = outputName + } + if transform != nil { + transform("base.json", baseObj) + } + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + if transform != nil { + transform("lock.json", lockObj) + } + + moduleRelPaths, err := collectJSONRelativePaths(filepath.Join(legacyDir, "modules")) + if err != nil { + return 0, err + } + + moduleObjs := make(map[string]map[string]any, len(moduleRelPaths)) + for _, relPath := range moduleRelPaths { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", relPath)) + if err != nil { + return 0, err + } + normalizedRel := filepath.ToSlash(relPath) + if transform != nil { + transform(filepath.ToSlash(filepath.Join("modules", normalizedRel)), obj) + } + moduleObjs[normalizedRel] = obj + } + + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + + updated := 0 + for _, write := range []struct { + path string + obj map[string]any + }{ + {path: filepath.Join(targetDir, "base.json"), obj: baseObj}, + {path: filepath.Join(targetDir, "lock.json"), obj: lockObj}, + } { + changed, err := writeJSONObjectIfChanged(write.path, write.obj) + if err != nil { + return 0, err + } + if changed { + updated++ + } + } + + targetModulesDir := filepath.Join(targetDir, "modules") + if len(moduleObjs) > 0 { + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + } + for relPath, obj := range moduleObjs { + targetPath := filepath.Join(targetModulesDir, filepath.FromSlash(relPath)) + if err := os.MkdirAll(filepath.Dir(targetPath), 0o755); err != nil { + return 0, err + } + changed, err := writeJSONObjectIfChanged(targetPath, obj) + if err != nil { + return 0, err + } + if changed { + updated++ + } + } + + staleModules, err := collectJSONRelativePaths(targetModulesDir) + if err != nil { + return 0, err + } + for _, relPath := range staleModules { + normalizedRel := filepath.ToSlash(relPath) + if _, ok := moduleObjs[normalizedRel]; ok { + continue + } + if err := os.Remove(filepath.Join(targetModulesDir, filepath.FromSlash(normalizedRel))); err != nil && !os.IsNotExist(err) { + return 0, err + } + updated++ + } + + return updated, nil +} + +func collectJSONRelativePaths(root string) ([]string, error) { + if _, err := os.Stat(root); err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + + var relPaths []string + err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + if !strings.EqualFold(filepath.Ext(d.Name()), ".json") { + return nil + } + relPath, err := filepath.Rel(root, path) + if err != nil { + return err + } + relPaths = append(relPaths, filepath.ToSlash(relPath)) + return nil + }) + if err != nil { + return nil, err + } + sort.Strings(relPaths) + return relPaths, nil +} + +func writeJSONObjectIfChanged(path string, obj map[string]any) (bool, error) { + raw, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return false, err + } + raw = append(raw, '\n') + + current, err := os.ReadFile(path) + if err == nil && string(current) == string(raw) { + return false, nil + } + if err != nil && !os.IsNotExist(err) { + return false, err + } + if err := os.WriteFile(path, raw, 0o644); err != nil { + return false, err + } + return true, nil +} + +func fileExists(path string) bool { + _, err := os.Stat(path) + return err == nil +} diff --git a/internal/topdata/loadscreens_migrate.go b/internal/topdata/loadscreens_migrate.go new file mode 100644 index 0000000..b0d6203 --- /dev/null +++ b/internal/topdata/loadscreens_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacyLoadscreens(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "loadscreens", "loadscreens.2da", nil) +} diff --git a/internal/topdata/masterfeats_migrate.go b/internal/topdata/masterfeats_migrate.go new file mode 100644 index 0000000..76bbe82 --- /dev/null +++ b/internal/topdata/masterfeats_migrate.go @@ -0,0 +1,237 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" + "strconv" +) + +func importLegacyMasterfeats(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + legacyDir := filepath.Join(referenceBuilderDir, "data", "feat", "masterfeats") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "masterfeats") + targetPath := filepath.Join(targetDir, "base.json") + legacyPlainPath := filepath.Join(targetDir, "masterfeats.json") + if _, err := os.Stat(targetPath); err == nil { + obj, err := loadJSONObject(targetPath) + if err == nil && countLegacyTLKRefsInValue(obj) == 0 { + return 0, nil + } + } + + collected, err := importLegacyMasterfeatsDataset(legacyDir) + if err != nil { + return 0, err + } + referenceIDs, err := collectReferenceLockIDs(filepath.Join(referenceBuilderDir, "data")) + if err != nil { + return 0, err + } + + rows := make([]any, 0, len(collected.Rows)) + for _, row := range collected.Rows { + copyRow, ok := deepCopyValue(row).(map[string]any) + if !ok { + continue + } + if legacyTLK != nil { + if _, _, err := inlineLegacyTLKValue(copyRow, legacyTLK); err != nil { + return 0, err + } + } + copyRow = rewriteImportedIDRefs(copyRow, referenceIDs) + rows = append(rows, copyRow) + } + + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + writes := []struct { + path string + obj map[string]any + }{ + { + path: targetPath, + obj: map[string]any{ + "output": collected.Dataset.OutputName, + "columns": stringSliceToAny(collected.Columns), + "rows": rows, + }, + }, + { + path: filepath.Join(targetDir, "lock.json"), + obj: anyMapInt(collected.LockData), + }, + } + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + updatedFiles := len(writes) + if err := os.Remove(legacyPlainPath); err == nil { + updatedFiles++ + } else if err != nil && !os.IsNotExist(err) { + return 0, err + } + return updatedFiles, nil +} + +func importLegacyMasterfeatsDataset(legacyDir string) (nativeCollectedDataset, error) { + dataset := nativeDataset{ + Name: "masterfeats", + BasePath: filepath.Join(legacyDir, "masterfeats.json"), + LockPath: filepath.Join(legacyDir, "lock.json"), + Spec: specForDataset("masterfeats"), + } + tableData, err := loadJSONObject(dataset.BasePath) + if err != nil { + return nativeCollectedDataset{}, err + } + columns, err := parseColumns(tableData, dataset.Name) + if err != nil { + return nativeCollectedDataset{}, err + } + rawRows, ok := tableData["rows"].([]any) + if !ok { + return nativeCollectedDataset{}, nil + } + lockData, err := loadLockfile(dataset.LockPath) + if err != nil { + return nativeCollectedDataset{}, err + } + usedIDs := map[int]struct{}{} + for _, rowID := range lockData { + usedIDs[rowID] = struct{}{} + } + + rows := make([]map[string]any, 0, len(rawRows)) + explicitID := make([]bool, 0, len(rawRows)) + for index, raw := range rawRows { + rowObj, ok := raw.(map[string]any) + if !ok { + continue + } + rowID := index + if value, ok := rowObj["id"]; ok { + parsed, err := asInt(value) + if err != nil { + return nativeCollectedDataset{}, err + } + rowID = parsed + } + row := map[string]any{"id": rowID} + for _, column := range columns { + row[column] = nullValue + } + for key, value := range rowObj { + switch key { + case "id": + case "key": + if keyText, ok := value.(string); ok && keyText != "" { + row["key"] = keyText + } + default: + columnName, ok := canonicalColumn(columns, key) + if !ok { + continue + } + row[columnName] = value + } + } + rows = append(rows, row) + _, hasExplicitID := rowObj["id"] + explicitID = append(explicitID, hasExplicitID) + if hasExplicitID { + usedIDs[rowID] = struct{}{} + } + } + + nextID := nextAvailableID(usedIDs) + lockModified := false + for index, row := range rows { + key, hasKey := row["key"].(string) + if hasKey && key != "" { + if lockedID, ok := lockData[key]; ok { + row["id"] = lockedID + continue + } + if explicitID[index] { + lockData[key] = row["id"].(int) + } else { + row["id"] = nextID + lockData[key] = nextID + usedIDs[nextID] = struct{}{} + nextID = nextAvailableID(usedIDs) + } + lockModified = true + continue + } + if !explicitID[index] { + row["id"] = index + } + } + if lockModified { + _ = lockModified + } + + return nativeCollectedDataset{ + Dataset: nativeDataset{ + Name: dataset.Name, + OutputName: "masterfeats.2da", + Columns: columns, + Spec: dataset.Spec, + }, + Columns: columns, + Rows: rows, + LockData: lockData, + }, nil +} + +func rewriteImportedIDRefs(value any, ids map[string]int) map[string]any { + row, ok := rewriteImportedIDRefsValue(value, ids).(map[string]any) + if !ok { + return map[string]any{} + } + return row +} + +func rewriteImportedIDRefsValue(value any, ids map[string]int) any { + switch typed := value.(type) { + case map[string]any: + if len(typed) == 1 { + if rawID, ok := typed["id"]; ok { + if key, ok := rawID.(string); ok { + if resolved, ok := ids[key]; ok { + return strconv.Itoa(resolved) + } + } + } + } + out := make(map[string]any, len(typed)) + for key, child := range typed { + out[key] = rewriteImportedIDRefsValue(child, ids) + } + return out + case []any: + out := make([]any, 0, len(typed)) + for _, child := range typed { + out = append(out, rewriteImportedIDRefsValue(child, ids)) + } + return out + default: + return value + } +} diff --git a/internal/topdata/metadata_wiki.go b/internal/topdata/metadata_wiki.go new file mode 100644 index 0000000..c836813 --- /dev/null +++ b/internal/topdata/metadata_wiki.go @@ -0,0 +1,188 @@ +package topdata + +import ( + "fmt" + "strings" +) + +func isNullLike(value any) bool { + if value == nil { + return true + } + text, ok := value.(string) + if !ok { + return false + } + return strings.TrimSpace(text) == nullValue +} + +func normalizeWikiMetadataKey(key string) string { + switch normalizeMetadataKey(key) { + case "reqfeats", "req_feats": + return "reqfeats" + case "generate", "wikigenerate": + return "generate" + case "canonical", "wikicanonical": + return "canonical" + case "status", "wikistatus": + return "status" + default: + return "" + } +} + +func legacyWikiMetadataField(key string) string { + switch normalizeMetadataKey(key) { + case "wikireqfeats": + return "reqfeats" + case "wikigenerate": + return "generate" + case "wikicanonical": + return "canonical" + case "wikistatus": + return "status" + default: + return "" + } +} + +func parseWikiMetadata(raw any) (map[string]any, error) { + obj, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("must be an object") + } + wiki := map[string]any{} + for key, value := range obj { + normalized := normalizeWikiMetadataKey(key) + if normalized == "" { + return nil, fmt.Errorf("unknown field %q", key) + } + if isNullLike(value) { + continue + } + wiki[normalized] = cloneAuthoringValue(value) + } + return wiki, nil +} + +func mergeMetadataMaps(base, overlay map[string]any) map[string]any { + if len(base) == 0 && len(overlay) == 0 { + return nil + } + out := map[string]any{} + for key, value := range base { + out[key] = cloneAuthoringValue(value) + } + for key, value := range overlay { + baseValue, hasBase := out[key] + baseMap, baseIsMap := baseValue.(map[string]any) + valueMap, valueIsMap := value.(map[string]any) + if hasBase && baseIsMap && valueIsMap { + out[key] = mergeMetadataMaps(baseMap, valueMap) + continue + } + out[key] = cloneAuthoringValue(value) + } + if len(out) == 0 { + return nil + } + return out +} + +func parseExistingMetadata(row map[string]any) (map[string]any, error) { + rawMeta, ok := lookupField(row, "meta") + if !ok { + return nil, nil + } + return parseRowMetadata(rawMeta) +} + +func setLegacyWikiMetadata(row map[string]any, field string, value any) error { + wikiKey := legacyWikiMetadataField(field) + if wikiKey == "" { + return nil + } + + meta, err := parseExistingMetadata(row) + if err != nil { + return err + } + if meta == nil { + meta = map[string]any{} + } + + wiki, _ := meta["wiki"].(map[string]any) + if wiki == nil { + wiki = map[string]any{} + } + + if isNullLike(value) { + delete(wiki, wikiKey) + } else { + wiki[wikiKey] = cloneAuthoringValue(value) + } + + if len(wiki) == 0 { + delete(meta, "wiki") + } else { + meta["wiki"] = wiki + } + if len(meta) == 0 { + delete(row, "meta") + } else { + row["meta"] = meta + } + return nil +} + +func canonicalizeWikiMetadataDocument(obj map[string]any) { + if rawColumns, ok := obj["columns"].([]any); ok { + filtered := make([]any, 0, len(rawColumns)) + for _, raw := range rawColumns { + column, ok := raw.(string) + if ok && isAuthoringOnlyField(column) { + continue + } + filtered = append(filtered, raw) + } + obj["columns"] = filtered + } + if rows, ok := obj["rows"].([]any); ok { + for _, raw := range rows { + row, ok := raw.(map[string]any) + if !ok { + continue + } + canonicalizeWikiMetadataRow(row) + } + } + if entries, ok := obj["entries"].(map[string]any); ok { + for _, raw := range entries { + row, ok := raw.(map[string]any) + if !ok { + continue + } + canonicalizeWikiMetadataRow(row) + } + } + if overrides, ok := obj["overrides"].([]any); ok { + for _, raw := range overrides { + row, ok := raw.(map[string]any) + if !ok { + continue + } + canonicalizeWikiMetadataRow(row) + } + } +} + +func canonicalizeWikiMetadataRow(row map[string]any) { + for _, field := range []string{"WIKIREQFEATS", "WIKIGENERATE", "WIKICANONICAL", "WIKISTATUS"} { + value, ok := row[field] + if !ok { + continue + } + _ = setLegacyWikiMetadata(row, field, value) + delete(row, field) + } +} diff --git a/internal/topdata/migrate.go b/internal/topdata/migrate.go new file mode 100644 index 0000000..4d5d65b --- /dev/null +++ b/internal/topdata/migrate.go @@ -0,0 +1,415 @@ +package topdata + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" + + "gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/project" +) + +type NormalizeResult struct { + StatePath string + ScannedFiles int + UpdatedFiles int + InlineValues int + RemainingFiles int + RemainingLegacyRefs int +} + +func NormalizeProject(p *project.Project) (NormalizeResult, error) { + if !p.HasTopData() { + return NormalizeResult{}, fmt.Errorf("topdata is not configured for this project") + } + + sourceDir := p.TopDataSourceDir() + dataDir := filepath.Join(sourceDir, "data") + migrationRoot := resolveMigrationInputRoot(sourceDir, p.TopDataReferenceBuilderDir()) + legacyTLK, err := loadLegacyTLK(filepath.Join(sourceDir, "tlk")) + if err != nil { + return NormalizeResult{}, err + } + if migrationRoot != "" { + migrationTLK, err := loadLegacyTLK(filepath.Join(migrationRoot, "tlk")) + if err != nil { + return NormalizeResult{}, err + } + legacyTLK = mergeLegacyTLK(migrationTLK, legacyTLK) + } + baseDialogImported, err := importLegacyBaseDialog(migrationRoot, sourceDir) + if err != nil { + return NormalizeResult{}, err + } + + itempropsImported, err := importLegacyItempropsRegistry(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + masterfeatsImported, err := importLegacyMasterfeats(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + featImported, err := importLegacyFeat(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + creaturespeedImported, err := importLegacyCreaturespeed(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + armorImported, err := importLegacyArmor(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + baseitemsImported, err := importLegacyBaseitems(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + damagetypesImported, err := importLegacyDamagetypes(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + skyboxesImported, err := importLegacySkyboxes(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + vfxPersistentImported, err := importLegacyVFXPersistent(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + loadscreensImported, err := importLegacyLoadscreens(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + progfxImported, err := importLegacyProgfx(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + genericdoorsImported, err := importLegacyGenericdoors(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + cloakmodelImported, err := importLegacyCloakmodel(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + repadjustImported, err := importLegacyRepadjust(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + wingmodelImported, err := importLegacyWingmodel(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + tailmodelImported, err := importLegacyTailmodel(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + doortypesImported, err := importLegacyDoortypes(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + visualeffectsImported, err := importLegacyVisualeffects(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + appearanceImported, err := importLegacyAppearance(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + placeablesImported, err := importLegacyPlaceables(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + rulesetImported, err := importLegacyRuleset(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + skillsImported, err := importLegacySkills(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + spellsImported, err := importLegacySpells(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + racialtypesImported, err := importLegacyRacialtypes(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + classesImported, err := importLegacyClasses(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + portraitsImported, err := importLegacyPortraits(migrationRoot, dataDir, legacyTLK) + if err != nil { + return NormalizeResult{}, err + } + + paths, err := collectDataJSONPaths(dataDir) + if err != nil { + return NormalizeResult{}, err + } + + result := NormalizeResult{ + StatePath: filepath.Join(sourceDir, tlkStateFile), + ScannedFiles: len(paths), + UpdatedFiles: baseDialogImported + itempropsImported + masterfeatsImported + featImported + creaturespeedImported + armorImported + baseitemsImported + damagetypesImported + skyboxesImported + vfxPersistentImported + loadscreensImported + progfxImported + genericdoorsImported + cloakmodelImported + repadjustImported + wingmodelImported + tailmodelImported + doortypesImported + visualeffectsImported + appearanceImported + placeablesImported + rulesetImported + skillsImported + spellsImported + racialtypesImported + classesImported + portraitsImported, + } + state, err := loadTLKState(result.StatePath) + if err != nil { + return result, err + } + if state.Entries == nil { + state.Entries = map[string]tlkStateMapping{} + } + if legacyTLK != nil && state.Language == "" { + state.Language = legacyTLK.Language + } + if legacyTLK != nil { + for key, id := range legacyTLK.Lock { + if _, ok := state.Entries[key]; !ok { + state.Entries[key] = tlkStateMapping{ID: id} + } + } + } + + if legacyTLK != nil { + for _, path := range paths { + updated, count, err := inlineLegacyTLKFile(path, legacyTLK) + if err != nil { + return result, err + } + if updated { + result.UpdatedFiles++ + result.InlineValues += count + } + } + } + + if err := saveTLKState(result.StatePath, state); err != nil { + return result, err + } + if err := removeLegacyTLKAuthoredInput(filepath.Join(sourceDir, "tlk")); err != nil { + return result, err + } + remainingFiles, remainingRefs, err := countLegacyTLKRefs(paths) + if err != nil { + return result, err + } + result.RemainingFiles = remainingFiles + result.RemainingLegacyRefs = remainingRefs + return result, nil +} + +func mergeLegacyTLK(base, override *legacyTLKData) *legacyTLKData { + if base == nil && override == nil { + return nil + } + merged := &legacyTLKData{ + Language: "en", + Entries: map[string]tlkEntryData{}, + Lock: map[string]int{}, + } + if base != nil { + if base.Language != "" { + merged.Language = base.Language + } + for key, entry := range base.Entries { + merged.Entries[key] = entry + } + for key, id := range base.Lock { + merged.Lock[key] = id + } + } + if override != nil { + if override.Language != "" { + merged.Language = override.Language + } + for key, entry := range override.Entries { + merged.Entries[key] = entry + } + for key, id := range override.Lock { + merged.Lock[key] = id + } + } + return merged +} + +func removeLegacyTLKAuthoredInput(tlkDir string) error { + modulesDir := filepath.Join(tlkDir, "modules") + if err := os.RemoveAll(modulesDir); err != nil { + return fmt.Errorf("remove %s: %w", modulesDir, err) + } + lockPath := filepath.Join(tlkDir, "lock.json") + if err := os.Remove(lockPath); err != nil && !os.IsNotExist(err) { + return fmt.Errorf("remove %s: %w", lockPath, err) + } + gitkeepPath := filepath.Join(tlkDir, ".gitkeep") + if err := os.Remove(gitkeepPath); err != nil && !os.IsNotExist(err) { + return fmt.Errorf("remove %s: %w", gitkeepPath, err) + } + if err := os.Remove(tlkDir); err != nil && !os.IsNotExist(err) { + if !strings.Contains(err.Error(), "directory not empty") { + return fmt.Errorf("remove %s: %w", tlkDir, err) + } + } + return nil +} + +func resolveMigrationInputRoot(sourceDir, referenceBuilderDir string) string { + if strings.TrimSpace(referenceBuilderDir) != "" { + return referenceBuilderDir + } + snapshotRoot := filepath.Join(sourceDir, "migration_snapshot") + if info, err := os.Stat(snapshotRoot); err == nil && info.IsDir() { + return snapshotRoot + } + return "" +} + +func inlineLegacyTLKFile(path string, legacy *legacyTLKData) (bool, int, error) { + obj, err := loadJSONObject(path) + if err != nil { + return false, 0, err + } + updated, count, err := inlineLegacyTLKValue(obj, legacy) + if err != nil { + return false, 0, err + } + if !updated { + return false, 0, nil + } + raw, err := json.MarshalIndent(obj, "", " ") + if err != nil { + return false, 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(path, raw, 0o644); err != nil { + return false, 0, err + } + return true, count, nil +} + +func inlineLegacyTLKValue(value any, legacy *legacyTLKData) (bool, int, error) { + switch typed := value.(type) { + case map[string]any: + if rawTLK, ok := typed["tlk"]; ok { + key, ok := rawTLK.(string) + if ok { + entry, ok := legacy.Entries[key] + if !ok { + return false, 0, nil + } + payload := map[string]any{ + "key": key, + "text": entry.Text, + } + if entry.SoundResRef != "" { + payload["sound_resref"] = entry.SoundResRef + } + if entry.SoundLength != 0 { + payload["sound_length"] = entry.SoundLength + } + typed["tlk"] = payload + return true, 1, nil + } + } + + updated := false + total := 0 + for key, child := range typed { + childUpdated, childCount, err := inlineLegacyTLKValue(child, legacy) + if err != nil { + return false, 0, err + } + if childUpdated { + typed[key] = child + updated = true + total += childCount + } + } + return updated, total, nil + case []any: + updated := false + total := 0 + for index, child := range typed { + childUpdated, childCount, err := inlineLegacyTLKValue(child, legacy) + if err != nil { + return false, 0, err + } + if childUpdated { + typed[index] = child + updated = true + total += childCount + } + } + return updated, total, nil + default: + return false, 0, nil + } +} + +func collectDataJSONPaths(dataDir string) ([]string, error) { + paths := make([]string, 0) + err := filepath.WalkDir(dataDir, func(path string, d os.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + if strings.HasSuffix(strings.ToLower(d.Name()), ".json") && d.Name() != "lock.json" { + paths = append(paths, path) + } + return nil + }) + if err != nil { + return nil, err + } + return paths, nil +} + +func countLegacyTLKRefs(paths []string) (int, int, error) { + files := 0 + refs := 0 + for _, path := range paths { + obj, err := loadJSONObject(path) + if err != nil { + return 0, 0, err + } + count := countLegacyTLKRefsInValue(obj) + if count == 0 { + continue + } + files++ + refs += count + } + return files, refs, nil +} + +func countLegacyTLKRefsInValue(value any) int { + switch typed := value.(type) { + case map[string]any: + total := 0 + if rawTLK, ok := typed["tlk"]; ok { + if _, ok := rawTLK.(string); ok { + total++ + } + } + for _, child := range typed { + total += countLegacyTLKRefsInValue(child) + } + return total + case []any: + total := 0 + for _, child := range typed { + total += countLegacyTLKRefsInValue(child) + } + return total + default: + return 0 + } +} diff --git a/internal/topdata/native.go b/internal/topdata/native.go new file mode 100644 index 0000000..caec790 --- /dev/null +++ b/internal/topdata/native.go @@ -0,0 +1,3851 @@ +package topdata + +import ( + "encoding/json" + "errors" + "fmt" + "io/fs" + "os" + "path/filepath" + "slices" + "strconv" + "strings" + + "gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/project" +) + +const nullValue = "****" + +type nativeDataset struct { + Kind nativeDatasetKind + Name string + RootPath string + BasePath string + LockPath string + ModulesDir string + GeneratedDir string + OutputName string + Spec datasetTextSpec + Columns []string + CompareReference bool +} + +type nativeDatasetKind string + +const ( + nativeDatasetBase nativeDatasetKind = "base" + nativeDatasetPlain nativeDatasetKind = "plain" +) + +type nativeCollectedDataset struct { + Dataset nativeDataset + Columns []string + Rows []map[string]any + LockData map[string]int + TableKey string +} + +type resolvedTable struct { + Key string + DatasetName string + OutputName string + OutputStem string + Columns []string + Rows []map[string]any + LockData map[string]int + Kind nativeDatasetKind +} + +type resolvedTableRegistry struct { + stemByKey map[string]string + tableByKey map[string]resolvedTable +} + +func newResolvedTableRegistry(collected []nativeCollectedDataset) (resolvedTableRegistry, error) { + registry := resolvedTableRegistry{ + stemByKey: map[string]string{}, + tableByKey: map[string]resolvedTable{}, + } + for _, collectedDataset := range collected { + if collectedDataset.TableKey == "" { + continue + } + key := collectedDataset.TableKey + if existing, ok := registry.tableByKey[key]; ok { + return resolvedTableRegistry{}, fmt.Errorf( + "duplicate table key %q for %s (%s) conflicts with %s (%s)", + key, + collectedDataset.Dataset.Name, + collectedDataset.Dataset.OutputName, + existing.DatasetName, + existing.OutputName, + ) + } + rows := make([]map[string]any, 0, len(collectedDataset.Rows)) + for _, row := range collectedDataset.Rows { + rows = append(rows, cloneRowMap(row)) + } + lockData := map[string]int{} + for lockKey, rowID := range collectedDataset.LockData { + lockData[lockKey] = rowID + } + registryTable := resolvedTable{ + Key: key, + DatasetName: collectedDataset.Dataset.Name, + OutputName: collectedDataset.Dataset.OutputName, + OutputStem: outputStem(collectedDataset.Dataset.OutputName), + Columns: append([]string(nil), collectedDataset.Columns...), + Rows: rows, + LockData: lockData, + Kind: collectedDataset.Dataset.Kind, + } + registry.stemByKey[key] = registryTable.OutputStem + registry.tableByKey[key] = registryTable + } + return registry, nil +} + +func (r resolvedTableRegistry) resolveTableByKey(key string) (resolvedTable, bool) { + table, ok := r.tableByKey[key] + return table, ok +} + +func cloneRowMap(row map[string]any) map[string]any { + if row == nil { + return nil + } + cloned := make(map[string]any, len(row)) + for key, value := range row { + cloned[key] = cloneAuthoringValue(value) + } + return cloned +} + +type legacyTLKData struct { + Language string + Entries map[string]tlkEntryData + Lock map[string]int +} + +func Build(p *project.Project, progress func(string)) (BuildResult, error) { + return BuildNative(p, progress) +} + +func BuildNative(p *project.Project, progress func(string)) (BuildResult, error) { + if progress == nil { + progress = func(string) {} + } + if !p.HasTopData() { + return BuildResult{}, errors.New("topdata is not configured for this project") + } + + report := ValidateProject(p) + if report.HasErrors() { + first := report.Diagnostics[0] + return BuildResult{}, fmt.Errorf("topdata validation failed with %d error(s): %s: %s", report.ErrorCount(), first.Path, first.Message) + } + return buildNativeUnchecked(p, progress) +} + +func buildNativeUnchecked(p *project.Project, progress func(string)) (BuildResult, error) { + if progress == nil { + progress = func(string) {} + } + sourceDir := p.TopDataSourceDir() + dataDir := filepath.Join(sourceDir, "data") + datasets, err := discoverNativeDatasets(dataDir) + if err != nil { + return BuildResult{}, err + } + registryDatasets, err := collectGeneratedRegistryDatasets(dataDir) + if err != nil { + return BuildResult{}, err + } + if len(datasets) == 0 && len(registryDatasets) == 0 { + return BuildResult{}, fmt.Errorf("no canonical topdata datasets were found in topdata/data") + } + + compiler, err := newTLKCompiler(sourceDir, nil) + if err != nil { + return BuildResult{}, err + } + + buildDir := p.TopDataBuildDir() + output2DA := filepath.Join(buildDir, "2da") + outputTLK := filepath.Join(buildDir, "tlk") + progress("Preparing native topdata build directories...") + if err := os.RemoveAll(buildDir); err != nil { + return BuildResult{}, fmt.Errorf("clean topdata build dir: %w", err) + } + if err := os.MkdirAll(output2DA, 0o755); err != nil { + return BuildResult{}, fmt.Errorf("create 2da output dir: %w", err) + } + if err := os.MkdirAll(outputTLK, 0o755); err != nil { + return BuildResult{}, fmt.Errorf("create tlk output dir: %w", err) + } + + progress("Building native topdata datasets...") + collected := make([]nativeCollectedDataset, 0, len(datasets)+len(registryDatasets)) + globalKeyToID := map[string]int{} + globalRowByKey := map[string]map[string]any{} + for _, dataset := range datasets { + collectedDataset, err := collectNativeDataset(dataset) + if err != nil { + return BuildResult{}, err + } + collected = append(collected, collectedDataset) + for key, rowID := range collectedDataset.LockData { + globalKeyToID[key] = rowID + } + for _, row := range collectedDataset.Rows { + if key, ok := row["key"].(string); ok && key != "" { + globalKeyToID[key] = row["id"].(int) + globalRowByKey[key] = row + } + } + } + for _, collectedDataset := range registryDatasets { + collected = append(collected, collectedDataset) + for key, rowID := range collectedDataset.LockData { + globalKeyToID[key] = rowID + } + for _, row := range collectedDataset.Rows { + if key, ok := row["key"].(string); ok && key != "" { + globalKeyToID[key] = row["id"].(int) + globalRowByKey[key] = row + } + } + } + + // Auto-include existing part models from the sow-assets repository + progress("Scanning for existing part models in sow-assets...") + assetsDir := p.TopDataAssetsDir() + if assetsDir != "" { + autogenerated, err := scanAutogeneratedParts(assetsDir) + if err != nil { + progress(fmt.Sprintf("Warning: failed to scan for autogenerated parts: %v", err)) + } else if autogenerated != nil { + collected = augmentWithAutogeneratedParts(collected, autogenerated) + progress("Augmented parts datasets with discovered models") + } + } + collected, err = applyPartOverrides(sourceDir, collected) + if err != nil { + return BuildResult{}, err + } + + tableRegistry, err := newResolvedTableRegistry(collected) + if err != nil { + return BuildResult{}, err + } + collected, err = mergePortraitMetadata(collected) + if err != nil { + return BuildResult{}, err + } + globalKeyToID = map[string]int{} + globalRowByKey = map[string]map[string]any{} + for _, collectedDataset := range collected { + for key, rowID := range collectedDataset.LockData { + globalKeyToID[key] = rowID + } + for _, row := range collectedDataset.Rows { + if key, ok := row["key"].(string); ok && key != "" { + globalKeyToID[key] = row["id"].(int) + globalRowByKey[key] = row + } + } + } + tableRegistry, err = newResolvedTableRegistry(collected) + if err != nil { + return BuildResult{}, err + } + supplementalKeyToID, err := collectSupplementalLockIDs(sourceDir, "") + if err != nil { + return BuildResult{}, err + } + for key, rowID := range supplementalKeyToID { + if _, ok := globalKeyToID[key]; ok { + continue + } + globalKeyToID[key] = rowID + } + + for _, dataset := range collected { + progress(fmt.Sprintf("Compiling %s -> %s", dataset.Dataset.Name, dataset.Dataset.OutputName)) + compiled, err := resolveNativeDataset(dataset, globalKeyToID, globalRowByKey, tableRegistry, compiler) + if err != nil { + return BuildResult{}, err + } + if err := write2DA(compiled, filepath.Join(output2DA, dataset.Dataset.OutputName), dataset.Dataset.Kind == nativeDatasetBase); err != nil { + return BuildResult{}, err + } + } + + filesTLK, err := compiler.finish(outputTLK) + if err != nil { + return BuildResult{}, err + } + files2DA, err := countFiles(output2DA) + if err != nil { + return BuildResult{}, err + } + + return BuildResult{ + Mode: "native", + Output2DADir: output2DA, + OutputTLKDir: outputTLK, + Files2DA: files2DA, + FilesTLK: filesTLK, + }, nil +} + +func discoverNativeDatasets(dataDir string) ([]nativeDataset, error) { + var datasets []nativeDataset + err := filepath.WalkDir(dataDir, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if !d.IsDir() { + return nil + } + if d.Name() == "modules" || d.Name() == "generated" { + return filepath.SkipDir + } + + rel, err := filepath.Rel(dataDir, path) + if err != nil { + return err + } + if rel == "." { + return nil + } + if filepath.ToSlash(rel) == "parts/overrides" { + return filepath.SkipDir + } + if filepath.ToSlash(rel) == itempropsRegistryDirName || filepath.ToSlash(rel) == damagetypesRegistryDirName || filepath.ToSlash(rel) == racialtypesRegistryDirName { + return filepath.SkipDir + } + + basePath := filepath.Join(path, "base.json") + if _, err := os.Stat(basePath); err == nil { + baseData, err := loadJSONObject(basePath) + if err != nil { + return err + } + outputName, _ := baseData["output"].(string) + if strings.TrimSpace(outputName) == "" { + outputName = filepath.Base(path) + ".2da" + } + datasets = append(datasets, nativeDataset{ + Kind: nativeDatasetBase, + Name: filepath.ToSlash(rel), + RootPath: path, + BasePath: basePath, + LockPath: filepath.Join(path, "lock.json"), + ModulesDir: filepath.Join(path, "modules"), + GeneratedDir: filepath.Join(path, "generated"), + OutputName: outputName, + Spec: specForDataset(filepath.ToSlash(rel)), + CompareReference: optionalBool(baseData["compare_reference"], true), + }) + return nil + } + + entries, err := os.ReadDir(path) + if err != nil { + return err + } + for _, entry := range entries { + if entry.IsDir() { + continue + } + name := entry.Name() + if strings.HasSuffix(strings.ToLower(name), ".json") && name != "lock.json" { + filePath := filepath.Join(path, name) + tableData, err := loadJSONObject(filePath) + if err != nil { + return err + } + outputName, _ := tableData["output"].(string) + if strings.TrimSpace(outputName) == "" { + outputName = strings.TrimSuffix(name, filepath.Ext(name)) + ".2da" + } + datasets = append(datasets, nativeDataset{ + Kind: nativeDatasetPlain, + Name: filepath.ToSlash(filepath.Join(rel, strings.TrimSuffix(name, filepath.Ext(name)))), + RootPath: path, + BasePath: filePath, + LockPath: filepath.Join(path, "lock.json"), + OutputName: outputName, + Spec: specForDataset(filepath.ToSlash(filepath.Join(rel, strings.TrimSuffix(name, filepath.Ext(name))))), + CompareReference: optionalBool(tableData["compare_reference"], true), + }) + } + } + return nil + }) + if err != nil { + return nil, err + } + + slices.SortFunc(datasets, func(a, b nativeDataset) int { + return strings.Compare(a.Name, b.Name) + }) + return datasets, nil +} + +func discoverNativeOutputCatalog(dataDir string) (map[string]string, error) { + datasets, err := discoverNativeDatasets(dataDir) + if err != nil { + return nil, err + } + registryDatasets, err := collectGeneratedRegistryDatasets(dataDir) + if err != nil { + return nil, err + } + catalog := make(map[string]string, len(datasets)+len(registryDatasets)) + for _, dataset := range datasets { + if !dataset.CompareReference { + continue + } + catalog[dataset.OutputName] = dataset.Name + } + for _, dataset := range registryDatasets { + catalog[dataset.Dataset.OutputName] = dataset.Dataset.Name + } + return catalog, nil +} + +func missingNativeOutputs(projectOutputs, referenceOutputs map[string]string) []string { + missing := make([]string, 0) + for outputName, datasetName := range referenceOutputs { + if _, ok := projectOutputs[outputName]; ok { + continue + } + missing = append(missing, fmt.Sprintf("%s (%s)", outputName, datasetName)) + } + slices.Sort(missing) + return missing +} + +func collectNativeDataset(dataset nativeDataset) (nativeCollectedDataset, error) { + switch dataset.Kind { + case nativeDatasetBase: + return collectBaseDataset(dataset) + case nativeDatasetPlain: + return collectPlainDataset(dataset) + default: + return nativeCollectedDataset{}, fmt.Errorf("unsupported native dataset kind %q", dataset.Kind) + } +} + +func collectBaseDataset(dataset nativeDataset) (nativeCollectedDataset, error) { + baseData, err := loadJSONObject(dataset.BasePath) + if err != nil { + return nativeCollectedDataset{}, err + } + + columns, err := parseColumns(baseData, dataset.Name) + if err != nil { + return nativeCollectedDataset{}, err + } + rawBaseRows, ok := baseData["rows"].([]any) + if !ok { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: rows must be an array", dataset.Name) + } + baseRowKeys := map[string]struct{}{} + for _, raw := range rawBaseRows { + rowObj, ok := raw.(map[string]any) + if !ok { + continue + } + key, ok := rowObj["key"].(string) + if !ok || key == "" { + continue + } + baseRowKeys[key] = struct{}{} + } + + lockData, err := loadLockfile(dataset.LockPath) + if err != nil { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + + rows := make([]map[string]any, 0, len(rawBaseRows)) + rowByID := map[int]map[string]any{} + rowByKey := map[string]map[string]any{} + usedIDs := map[int]struct{}{} + lockModified := false + + for _, rowID := range lockData { + usedIDs[rowID] = struct{}{} + } + for index, raw := range rawBaseRows { + rowObj, ok := raw.(map[string]any) + if !ok { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: row %d must be an object", dataset.Name, index) + } + row, err := canonicalizeBaseRow(dataset, columns, rowObj, index) + if err != nil { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + rows = append(rows, row) + rowID := row["id"].(int) + rowByID[rowID] = row + if key, ok := row["key"].(string); ok && key != "" { + rowByKey[key] = row + if lockData[key] != rowID { + lockData[key] = rowID + lockModified = true + } + } + usedIDs[rowID] = struct{}{} + } + + nextID := nextAvailableID(usedIDs) + applyModuleData := func(sourceLabel string, moduleData map[string]any) error { + if rawEntries, ok := moduleData["entries"]; ok { + entries, ok := rawEntries.(map[string]any) + if !ok { + return fmt.Errorf("dataset %s: entries in %s must be an object", dataset.Name, sourceLabel) + } + for _, key := range sortedKeys(entries) { + rawEntry, ok := entries[key].(map[string]any) + if !ok { + return fmt.Errorf("dataset %s: entry %q in %s must be an object", dataset.Name, key, sourceLabel) + } + if existing, ok := rowByKey[key]; ok { + candidate := map[string]any{} + for field, value := range existing { + candidate[field] = value + } + for field, value := range rawEntry { + if field == "id" || field == "key" || field == "_tlk" { + continue + } + if isMetadataField(field) { + meta, err := parseRowMetadata(value) + if err != nil { + return fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + if meta != nil { + existingMeta, _ := parseExistingMetadata(candidate) + candidate["meta"] = mergeMetadataMaps(existingMeta, meta) + } + continue + } + if isDeprecatedAuthoringOnlyField(dataset.Name, field) { + if err := setLegacyWikiMetadata(candidate, field, value); err != nil { + return fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + continue + } + columnName, ok := canonicalColumn(columns, field) + if !ok { + return fmt.Errorf("dataset %s: entry field %q is not a known column", dataset.Name, field) + } + candidate[columnName] = value + } + expanded, err := expandRowAuthoringSugar(dataset, columns, rawEntry, candidate) + if err != nil { + return err + } + keyChanged := updateOverrideRowKey(existing, expanded, rowByKey, lockData) + if keyChanged { + lockModified = true + } + for field, value := range expanded { + if field == "id" || field == "_tlk" { + continue + } + existing[field] = value + } + continue + } + rowID, ok := lockData[key] + if !ok { + rowID = nextID + lockData[key] = rowID + lockModified = true + usedIDs[rowID] = struct{}{} + nextID = nextAvailableID(usedIDs) + } + row, err := canonicalizeEntry(dataset, columns, rowID, key, rawEntry) + if err != nil { + return fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + rows = append(rows, row) + rowByID[rowID] = row + rowByKey[key] = row + } + } + + if rawOverrides, ok := moduleData["overrides"]; ok { + overrideList, ok := rawOverrides.([]any) + if !ok { + return fmt.Errorf("dataset %s: overrides in %s must be an array", dataset.Name, sourceLabel) + } + for index, rawOverride := range overrideList { + override, ok := rawOverride.(map[string]any) + if !ok { + return fmt.Errorf("dataset %s: override %d in %s must be an object", dataset.Name, index, sourceLabel) + } + row, err := resolveOverrideTarget(dataset.Name, override, rowByID, rowByKey) + if err != nil { + rawKey, hasKey := override["key"].(string) + rowID := 0 + hasRowID := false + if rawID, hasID := override["id"]; hasID { + parsedID, parseErr := asInt(rawID) + if parseErr != nil { + return fmt.Errorf("dataset %s: override id %v is not numeric", dataset.Name, rawID) + } + rowID = parsedID + hasRowID = true + } + if hasKey && rawKey != "" { + if lockedID, hasLockedID := lockData[rawKey]; hasLockedID { + rowID = lockedID + hasRowID = true + } else { + if !hasRowID { + rowID = nextID + hasRowID = true + nextID = nextAvailableID(usedIDs) + } + lockData[rawKey] = rowID + lockModified = true + } + } + if !hasRowID { + return err + } + usedIDs[rowID] = struct{}{} + row = map[string]any{"id": rowID} + if hasKey && rawKey != "" { + row["key"] = rawKey + } + rows = append(rows, row) + rowByID[rowID] = row + if hasKey && rawKey != "" { + rowByKey[rawKey] = row + } + } + candidate := map[string]any{} + for field, value := range row { + candidate[field] = value + } + for field, value := range override { + if field == "id" || field == "key" || field == "_tlk" { + continue + } + if isMetadataField(field) { + meta, err := parseRowMetadata(value) + if err != nil { + return fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + if meta != nil { + existingMeta, _ := parseExistingMetadata(candidate) + candidate["meta"] = mergeMetadataMaps(existingMeta, meta) + } + continue + } + if isDeprecatedAuthoringOnlyField(dataset.Name, field) { + if err := setLegacyWikiMetadata(candidate, field, value); err != nil { + return fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + continue + } + columnName, ok := canonicalColumn(columns, field) + if !ok { + if isDeprecatedAuthoringOnlyField(dataset.Name, field) { + continue + } + return fmt.Errorf("dataset %s: override field %q is not a known column", dataset.Name, field) + } + candidate[columnName] = value + } + if rawKey, ok := override["key"]; ok { + candidate["key"] = rawKey + } + expanded, err := expandRowAuthoringSugar(dataset, columns, override, candidate) + if err != nil { + return err + } + keyChanged := updateOverrideRowKey(row, expanded, rowByKey, lockData) + if keyChanged { + lockModified = true + } + for field, value := range expanded { + if field == "id" || field == "_tlk" { + continue + } + row[field] = value + } + } + } + return nil + } + + generatedModules, err := collectGeneratedModules(dataset, lockData) + if err != nil { + return nativeCollectedDataset{}, err + } + for _, module := range generatedModules { + if err := applyModuleData(module.Name, module.Data); err != nil { + return nativeCollectedDataset{}, err + } + } + + modulePaths, err := collectModulePaths(dataset.ModulesDir) + if err != nil { + return nativeCollectedDataset{}, err + } + for _, path := range modulePaths { + moduleData, err := loadJSONObject(path) + if err != nil { + return nativeCollectedDataset{}, err + } + if err := applyModuleData(path, moduleData); err != nil { + return nativeCollectedDataset{}, err + } + } + + if dataset.Name == "spells" { + normalizeCollectedSpellImpactScripts(rows, baseRowKeys) + } + + if lockModified { + if err := saveLockfile(dataset.LockPath, lockData); err != nil { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + } + + rows = dedupeCollectedRows(rows) + slices.SortFunc(rows, func(a, b map[string]any) int { + return a["id"].(int) - b["id"].(int) + }) + return nativeCollectedDataset{ + Dataset: dataset, + Columns: columns, + Rows: rows, + LockData: lockData, + }, nil +} + +func dedupeCollectedRows(rows []map[string]any) []map[string]any { + if len(rows) <= 1 { + return rows + } + seen := make(map[string]int, len(rows)) + out := make([]map[string]any, 0, len(rows)) + for _, row := range rows { + rowID, _ := row["id"].(int) + rowKey, _ := row["key"].(string) + if rowKey == "" { + out = append(out, row) + continue + } + identity := strconv.Itoa(rowID) + "\x00" + rowKey + if index, ok := seen[identity]; ok { + out[index] = row + continue + } + seen[identity] = len(out) + out = append(out, row) + } + return out +} + +type nativeGeneratedModule struct { + Name string + Data map[string]any +} + +func collectGeneratedModules(dataset nativeDataset, lockData map[string]int) ([]nativeGeneratedModule, error) { + if dataset.Name != "feat" { + return nil, nil + } + ctx, err := newFeatGeneratedContext(dataset, lockData) + if err != nil { + return nil, err + } + paths, err := collectModulePaths(dataset.GeneratedDir) + if err != nil { + return nil, err + } + modules := make([]nativeGeneratedModule, 0, len(paths)) + for _, path := range paths { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + family, _ := obj["family"].(string) + switch family { + case "skill_focus", + "greater_skill_focus", + "weapon_focus", + "weapon_specialization", + "greater_weapon_focus", + "greater_weapon_specialization", + "improved_critical", + "overwhelming_critical", + "proficiencies", + "special_attacks": + moduleData, err := buildFeatGeneratedModule(path, obj, ctx) + if err != nil { + return nil, err + } + modules = append(modules, nativeGeneratedModule{ + Name: path, + Data: moduleData, + }) + case "": + return nil, fmt.Errorf("dataset %s: generated file %s is missing family", dataset.Name, path) + default: + return nil, fmt.Errorf("dataset %s: generated file %s uses unsupported family %q", dataset.Name, path, family) + } + } + racialtypesModule, err := buildRacialtypesSkillAffinityModule(ctx) + if err != nil { + return nil, err + } + if racialtypesModule != nil { + modules = append(modules, nativeGeneratedModule{ + Name: filepath.Join(dataset.RootPath, "generated", "skill_affinity"), + Data: racialtypesModule, + }) + } + return modules, nil +} + +type featGeneratedContext struct { + sourceDir string + dataDir string + lockData map[string]int + supplementalID map[string]int + tlkStateKeys map[string]struct{} + existingFeat map[string]struct{} + datasets map[string]nativeDataset + rowsByDataset map[string]map[string]map[string]any +} + +type compactSourceOverride = map[string]map[string]any + +type featWeaponFamilySpec struct { + FamilyKey string + SourceColumn string + LabelPrefix string + ConstantPrefix string + NamePrefix string + AutoPrereqFamily1 string + AutoPrereqFamily2 string +} + +type affinityGrant struct { + featKey string + races []string +} + +var featWeaponFamilies = map[string]featWeaponFamilySpec{ + "weapon_focus": { + SourceColumn: "WeaponFocusFeat", + FamilyKey: "weaponfocus", + LabelPrefix: "FEAT_WEAPON_FOCUS", + ConstantPrefix: "FEAT_WEAPON_FOCUS", + NamePrefix: "Weapon Focus", + }, + "weapon_specialization": { + SourceColumn: "WeaponSpecializationFeat", + FamilyKey: "weaponspecialization", + LabelPrefix: "FEAT_WEAPON_SPECIALIZATION", + ConstantPrefix: "FEAT_WEAPON_SPECIALIZATION", + NamePrefix: "Weapon Specialization", + AutoPrereqFamily1: "weaponfocus", + }, + "greater_weapon_focus": { + SourceColumn: "EpicWeaponFocusFeat", + FamilyKey: "greaterweaponfocus", + LabelPrefix: "FEAT_GREATER_WEAPON_FOCUS", + ConstantPrefix: "FEAT_GREATER_WEAPON_FOCUS", + NamePrefix: "Greater Weapon Focus", + AutoPrereqFamily1: "weaponfocus", + }, + "greater_weapon_specialization": { + SourceColumn: "EpicWeaponSpecializationFeat", + FamilyKey: "greaterweaponspecialization", + LabelPrefix: "FEAT_GREATER_WEAPON_SPECIALIZATION", + ConstantPrefix: "FEAT_GREATER_WEAPON_SPECIALIZATION", + NamePrefix: "Greater Weapon Specialization", + AutoPrereqFamily1: "weaponspecialization", + AutoPrereqFamily2: "greaterweaponfocus", + }, + "improved_critical": { + SourceColumn: "WeaponImprovedCriticalFeat", + FamilyKey: "improvedcritical", + LabelPrefix: "FEAT_IMPROVED_CRITICAL", + ConstantPrefix: "FEAT_IMPROVED_CRITICAL", + NamePrefix: "Improved Critical", + AutoPrereqFamily1: "weaponfocus", + }, + "overwhelming_critical": { + SourceColumn: "EpicWeaponOverwhelmingCriticalFeat", + FamilyKey: "overwhelmingcritical", + LabelPrefix: "FEAT_EPIC_OVERWHELMING_CRITICAL", + ConstantPrefix: "FEAT_EPIC_OVERWHELMING_CRITICAL", + NamePrefix: "Overwhelming Critical", + AutoPrereqFamily2: "improvedcritical", + }, +} + +func newFeatGeneratedContext(dataset nativeDataset, lockData map[string]int) (*featGeneratedContext, error) { + sourceDir := filepath.Dir(filepath.Dir(dataset.RootPath)) + dataDir := filepath.Join(sourceDir, "data") + allDatasets, err := discoverNativeDatasets(dataDir) + if err != nil { + return nil, err + } + datasetMap := make(map[string]nativeDataset, len(allDatasets)) + for _, item := range allDatasets { + datasetMap[item.Name] = item + } + supplementalID, err := collectSupplementalLockIDs(sourceDir, "") + if err != nil { + return nil, err + } + tlkState, err := loadTLKState(filepath.Join(sourceDir, tlkStateFile)) + if err != nil { + return nil, err + } + tlkStateKeys := make(map[string]struct{}, len(tlkState.Entries)) + for key := range tlkState.Entries { + tlkStateKeys[key] = struct{}{} + } + lockCopy := make(map[string]int, len(lockData)) + for key, value := range lockData { + lockCopy[key] = value + } + existingFeat, err := collectExistingFeatKeys(filepath.Join(dataDir, "feat")) + if err != nil { + return nil, err + } + return &featGeneratedContext{ + sourceDir: sourceDir, + dataDir: dataDir, + lockData: lockCopy, + supplementalID: supplementalID, + tlkStateKeys: tlkStateKeys, + existingFeat: existingFeat, + datasets: datasetMap, + rowsByDataset: map[string]map[string]map[string]any{}, + }, nil +} + +func collectExistingFeatKeys(featDir string) (map[string]struct{}, error) { + keys := map[string]struct{}{} + baseObj, err := loadJSONObject(filepath.Join(featDir, "base.json")) + if err != nil { + return nil, err + } + if rawRows, ok := baseObj["rows"].([]any); ok { + for _, raw := range rawRows { + row, ok := raw.(map[string]any) + if !ok { + continue + } + if key, ok := row["key"].(string); ok && key != "" { + keys[key] = struct{}{} + } + } + } + modulePaths, err := collectModulePaths(filepath.Join(featDir, "modules")) + if err != nil { + return nil, err + } + for _, path := range modulePaths { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + if rawEntries, ok := obj["entries"].(map[string]any); ok { + for key := range rawEntries { + if key != "" { + keys[key] = struct{}{} + } + } + } + if rawOverrides, ok := obj["overrides"].([]any); ok { + for _, raw := range rawOverrides { + override, ok := raw.(map[string]any) + if !ok { + continue + } + if key, ok := override["key"].(string); ok && key != "" { + keys[key] = struct{}{} + } + } + } + } + return keys, nil +} + +func (c *featGeneratedContext) featKeyExists(key string) bool { + _, ok := c.existingFeat[key] + return ok +} + +func (c *featGeneratedContext) familyHasExistingRows(familyKey string) bool { + prefix := "feat:" + familyKey + "_" + for key := range c.existingFeat { + if strings.HasPrefix(key, prefix) { + return true + } + } + return false +} + +func (c *featGeneratedContext) datasetRows(name string) (map[string]map[string]any, error) { + if rows, ok := c.rowsByDataset[name]; ok { + return rows, nil + } + dataset, ok := c.datasets[name] + if !ok { + return nil, fmt.Errorf("generated feat family requires canonical dataset %q", name) + } + collected, err := collectNativeDataset(dataset) + if err != nil { + return nil, err + } + rows := make(map[string]map[string]any, len(collected.Rows)) + for _, row := range collected.Rows { + if key, ok := row["key"].(string); ok && key != "" { + rows[key] = row + } + } + c.rowsByDataset[name] = rows + return rows, nil +} + +func (c *featGeneratedContext) featID(key string, explicit any) (int, bool, error) { + if explicit != nil && explicit != nullValue { + parsed, err := featSourceID(explicit) + if err != nil { + return 0, false, err + } + if parsed > 0 { + return parsed, true, nil + } + } + if value, ok := c.lockData[key]; ok && value > 0 { + return value, true, nil + } + if value, ok := c.supplementalID[key]; ok && value > 0 { + return value, true, nil + } + return 0, false, nil +} + +func (c *featGeneratedContext) preferredGeneratedFeatKey(familyKey, sourceSlug string) string { + exact := "feat:" + familyKey + "_" + sourceSlug + target := normalizeKeyIdentity(sourceSlug) + for _, candidates := range []map[string]int{c.lockData, c.supplementalID} { + matches := make([]string, 0) + for key, value := range candidates { + if value <= 0 { + continue + } + if !strings.HasPrefix(key, "feat:"+familyKey+"_") { + continue + } + suffix := strings.TrimPrefix(key, "feat:"+familyKey+"_") + if normalizeKeyIdentity(suffix) == target { + matches = append(matches, key) + } + } + if best, ok := preferredExpandedKey(matches); ok { + return best + } + } + for _, candidates := range []map[string]int{c.lockData, c.supplementalID} { + if value, ok := candidates[exact]; ok && value > 0 { + return exact + } + } + stateMatches := make([]string, 0) + for key := range c.tlkStateKeys { + if !strings.HasPrefix(key, "feat:"+familyKey+"_") { + continue + } + suffix := strings.TrimPrefix(key, "feat:"+familyKey+"_") + suffix = strings.TrimSuffix(strings.TrimSuffix(suffix, ".name"), ".description") + if normalizeKeyIdentity(suffix) == target { + stateMatches = append(stateMatches, "feat:"+familyKey+"_"+suffix) + } + } + if best, ok := preferredExpandedKey(stateMatches); ok { + return best + } + return exact +} + +func preferredExpandedKey(matches []string) (string, bool) { + if len(matches) == 0 { + return "", false + } + best := matches[0] + for _, candidate := range matches[1:] { + best = betterExpandedKey(best, candidate) + } + return best, true +} + +func betterExpandedKey(a, b string) string { + aUnderscores := strings.Count(a, "_") + bUnderscores := strings.Count(b, "_") + if aUnderscores != bUnderscores { + if aUnderscores < bUnderscores { + return a + } + return b + } + if len(a) != len(b) { + if len(a) < len(b) { + return a + } + return b + } + if a <= b { + return a + } + return b +} + +func buildFeatGeneratedModule(path string, obj map[string]any, ctx *featGeneratedContext) (map[string]any, error) { + family, _ := obj["family"].(string) + switch family { + case "skill_focus", "greater_skill_focus": + return buildSkillFocusGeneratedModule(path, obj, ctx) + case "weapon_focus", + "weapon_specialization", + "greater_weapon_focus", + "greater_weapon_specialization", + "improved_critical", + "overwhelming_critical": + return buildWeaponFamilyGeneratedModule(path, obj, ctx) + case "proficiencies", "special_attacks": + return buildLegacyFeatGeneratedModule(path, obj) + default: + return nil, fmt.Errorf("generated feat file %s uses unsupported family %q", path, family) + } +} + +func buildLegacyFeatGeneratedModule(path string, obj map[string]any) (map[string]any, error) { + module := map[string]any{} + if rawEntries, ok := obj["entries"]; ok { + entries, ok := rawEntries.(map[string]any) + if !ok { + return nil, fmt.Errorf("generated feat file %s entries must be an object", path) + } + module["entries"] = entries + } + if rawOverrides, ok := obj["overrides"]; ok { + overrides, ok := rawOverrides.([]any) + if !ok { + return nil, fmt.Errorf("generated feat file %s overrides must be an array", path) + } + module["overrides"] = overrides + } + if len(module) == 0 { + return nil, fmt.Errorf("generated feat file %s must contain entries and/or overrides", path) + } + return module, nil +} + +func buildSkillFocusGeneratedModule(path string, obj map[string]any, ctx *featGeneratedContext) (map[string]any, error) { + spec, err := parseFamilyExpansionSpec(path, obj) + if err != nil { + return nil, err + } + overrides, err := parseCompactSourceOverrides(obj["overrides"]) + if err != nil { + return nil, fmt.Errorf("generated feat file %s: %w", path, err) + } + if spec.ChildSource.Dataset != "skills" { + return nil, fmt.Errorf("generated feat file %s: child_source.dataset must be skills", path) + } + skillRows, err := ctx.datasetRows("skills") + if err != nil { + return nil, err + } + + labelPrefix := "FEAT_SKILL_FOCUS" + namePrefix := "Skill Focus" + if spec.Family == "greater_skill_focus" { + labelPrefix = "FEAT_GREATER_SKILL_FOCUS" + namePrefix = "Greater Skill Focus" + } + + overrideList := make([]any, 0) + familyAllowlist := ctx.familyHasExistingRows(spec.FamilyKey) + for _, skillKey := range sortedStringMapKeys(skillRows) { + row := skillRows[skillKey] + if spec.ChildSource.Predicate == "accessible" && isHiddenSkill(row) { + continue + } + slug := strings.TrimPrefix(skillKey, "skills:") + featKey := ctx.preferredGeneratedFeatKey(spec.FamilyKey, slug) + childToken := childTokenFromExpandedKey(featKey, spec.FamilyKey) + labelSuffix := upperSnake(displayNameForSkill(row)) + rowID, hasID, err := ctx.featID(featKey, nil) + if err != nil { + return nil, fmt.Errorf("generated feat file %s: %w", path, err) + } + override := map[string]any{ + "key": featKey, + "MASTERFEAT": map[string]any{"id": spec.Template}, + "REQSKILL": map[string]any{"id": skillKey}, + "TOOLSCATEGORIES": "2", + "meta": familyMetadata(spec.FamilyKey, childToken, skillKey, spec.Template), + } + if hasID { + override["id"] = rowID + } + if familyAllowlist && !ctx.featKeyExists(featKey) { + continue + } + if !ctx.featKeyExists(featKey) { + override["LABEL"] = labelPrefix + "_" + labelSuffix + override["FEAT"] = map[string]any{ + "tlk": map[string]any{ + "key": featKey + ".name", + "text": fmt.Sprintf("%s (%s)", namePrefix, displayNameForSkill(row)), + }, + } + override["DESCRIPTION"] = map[string]any{"field": "DESCRIPTION", "ref": spec.Template} + override["ICON"] = map[string]any{"field": "ICON", "ref": spec.Template} + override["CRValue"] = map[string]any{"field": "CRValue", "ref": spec.Template} + override["ReqSkillMinRanks"] = map[string]any{"field": "ReqSkillMinRanks", "ref": spec.Template} + override["Constant"] = labelPrefix + "_" + labelSuffix + override["TOOLSCATEGORIES"] = "2" + override["ALLCLASSESCANUSE"] = map[string]any{"field": "ALLCLASSESCANUSE", "ref": spec.Template} + override["PreReqEpic"] = map[string]any{"field": "PreReqEpic", "ref": spec.Template} + override["ReqAction"] = map[string]any{"field": "ReqAction", "ref": spec.Template} + } + mergeGeneratedOverride(override, overrides[skillKey]) + overrideList = append(overrideList, override) + } + return map[string]any{"overrides": overrideList}, nil +} + +func buildWeaponFamilyGeneratedModule(path string, obj map[string]any, ctx *featGeneratedContext) (map[string]any, error) { + fileSpec, err := parseFamilyExpansionSpec(path, obj) + if err != nil { + return nil, err + } + spec, ok := featWeaponFamilies[fileSpec.Family] + if !ok { + return nil, fmt.Errorf("generated feat file %s uses unsupported weapon family %q", path, fileSpec.Family) + } + if fileSpec.ChildSource.Dataset != "baseitems" { + return nil, fmt.Errorf("generated feat file %s: child_source.dataset must be baseitems", path) + } + if fileSpec.ChildSource.Column == "" { + return nil, fmt.Errorf("generated feat file %s: child_source.column must be set", path) + } + overrides, err := parseCompactSourceOverrides(obj["overrides"]) + if err != nil { + return nil, fmt.Errorf("generated feat file %s: %w", path, err) + } + baseitemRows, err := ctx.datasetRows("baseitems") + if err != nil { + return nil, err + } + + overrideList := make([]any, 0) + for _, baseitemKey := range sortedStringMapKeys(baseitemRows) { + row := baseitemRows[baseitemKey] + rawID, ok := lookupField(row, fileSpec.ChildSource.Column) + if !ok || isNullishValue(rawID) { + continue + } + slug := strings.TrimPrefix(baseitemKey, "baseitems:") + featKey, rowID, hasID, err := ctx.resolveWeaponFeatIdentity(fileSpec.FamilyKey, slug, rawID) + if err != nil { + return nil, fmt.Errorf("generated feat file %s: %w", path, err) + } + childToken := childTokenFromExpandedKey(featKey, fileSpec.FamilyKey) + labelSuffix := upperSnake(displayNameForBaseitem(row)) + override := map[string]any{ + "key": featKey, + "MASTERFEAT": map[string]any{"id": fileSpec.Template}, + "TOOLSCATEGORIES": "1", + "meta": familyMetadata(fileSpec.FamilyKey, childToken, baseitemKey, fileSpec.Template), + } + if hasID { + override["id"] = rowID + } + if !ctx.featKeyExists(featKey) { + override["LABEL"] = spec.LabelPrefix + "_" + labelSuffix + override["FEAT"] = map[string]any{ + "tlk": map[string]any{ + "key": featKey + ".name", + "text": fmt.Sprintf("%s (%s)", spec.NamePrefix, displayNameForBaseitem(row)), + }, + } + override["DESCRIPTION"] = map[string]any{"field": "DESCRIPTION", "ref": fileSpec.Template} + override["ICON"] = map[string]any{"field": "ICON", "ref": fileSpec.Template} + override["MINATTACKBONUS"] = map[string]any{"field": "MINATTACKBONUS", "ref": fileSpec.Template} + override["ALLCLASSESCANUSE"] = map[string]any{"field": "ALLCLASSESCANUSE", "ref": fileSpec.Template} + override["PreReqEpic"] = map[string]any{"field": "PreReqEpic", "ref": fileSpec.Template} + override["ReqAction"] = map[string]any{"field": "ReqAction", "ref": fileSpec.Template} + override["TOOLSCATEGORIES"] = "1" + override["CRValue"] = map[string]any{"field": "CRValue", "ref": fileSpec.Template} + override["MinLevel"] = map[string]any{"field": "MinLevel", "ref": fileSpec.Template} + override["MinLevelClass"] = map[string]any{"field": "MinLevelClass", "ref": fileSpec.Template} + override["MINSTR"] = map[string]any{"field": "MINSTR", "ref": fileSpec.Template} + override["Constant"] = spec.ConstantPrefix + "_" + labelSuffix + } + if prereqKey, ok := weaponFamilyPrereqKey(ctx, row, slug, spec.AutoPrereqFamily1); ok { + override["PREREQFEAT1"] = map[string]any{"id": prereqKey} + } + if prereqKey, ok := weaponFamilyPrereqKey(ctx, row, slug, spec.AutoPrereqFamily2); ok { + override["PREREQFEAT2"] = map[string]any{"id": prereqKey} + } + mergeGeneratedOverride(override, overrides[baseitemKey]) + overrideList = append(overrideList, override) + } + return map[string]any{"overrides": overrideList}, nil +} + +func buildRacialtypesSkillAffinityModule(ctx *featGeneratedContext) (map[string]any, error) { + racesDir := filepath.Join(ctx.dataDir, "racialtypes", "registry", "races") + entries, err := os.ReadDir(racesDir) + if err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil, nil + } + return nil, err + } + grants := map[string]*affinityGrant{} + for _, entry := range entries { + if entry.IsDir() || filepath.Ext(entry.Name()) != ".json" { + continue + } + path := filepath.Join(racesDir, entry.Name()) + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + raceName := displayNameForRaceFile(obj) + rawFeats, ok := obj["feats"].([]any) + if !ok { + continue + } + for _, rawFeat := range rawFeats { + featObj, ok := rawFeat.(map[string]any) + if !ok { + continue + } + featKey, ok := extractRaceFeatKey(featObj) + if !ok || !isSkillAffinityFeatKey(featKey) { + continue + } + item := grants[featKey] + if item == nil { + item = &affinityGrant{featKey: featKey} + grants[featKey] = item + } + item.races = append(item.races, raceName) + } + } + if len(grants) == 0 { + return nil, nil + } + skillRows, err := ctx.datasetRows("skills") + if err != nil { + return nil, err + } + overrideList := make([]any, 0, len(grants)) + for _, featKey := range sortedGrantKeys(grants) { + grant := grants[featKey] + skillKey, bonus, err := parseSkillAffinityKey(featKey) + if err != nil { + return nil, err + } + skillKey = resolveAffinitySkillKey(skillRows, skillKey) + skillRow, ok := skillRows[skillKey] + skillName := affinitySkillDisplayName(featKey, skillKey) + if ok { + skillName = displayNameForSkill(skillRow) + } + rowID, hasID, err := ctx.featID(featKey, nil) + if err != nil { + return nil, err + } + races := dedupeAndSort(grant.races) + title := affinityTitleFromKey(featKey, skillName) + description := affinityDescription(skillName, bonus, races) + label := affinityLabel(featKey) + parent := "skillaffinity" + if bonus == 1 { + parent = "partialskillaffinity" + } + child := childTokenFromExpandedKey(featKey, parent) + override := map[string]any{ + "key": featKey, + "LABEL": label, + "FEAT": map[string]any{ + "tlk": map[string]any{ + "key": featKey + ".name", + "text": title, + }, + }, + "DESCRIPTION": map[string]any{ + "tlk": map[string]any{ + "key": featKey + ".description", + "text": description, + }, + }, + "ICON": "ife_racial", + "ALLCLASSESCANUSE": "0", + "TOOLSCATEGORIES": "6", + "PreReqEpic": "0", + "ReqAction": "1", + "Constant": label, + "meta": familyMetadata(parent, child, skillKey, ""), + } + if hasID { + override["id"] = rowID + } + overrideList = append(overrideList, override) + } + return map[string]any{"overrides": overrideList}, nil +} + +func affinitySkillDisplayName(featKey, skillKey string) string { + slug := strings.TrimPrefix(skillKey, "skills:") + if slug == "" { + slug = strings.TrimPrefix(strings.TrimPrefix(featKey, "feat:skillaffinity"), "feat:partialskillaffinity") + } + parts := strings.Fields(strings.ReplaceAll(strings.ReplaceAll(slug, "_", " "), "-", " ")) + for i, part := range parts { + if part == "" { + continue + } + parts[i] = strings.ToUpper(part[:1]) + part[1:] + } + return strings.Join(parts, " ") +} + +func requiredStringField(obj map[string]any, field string) (string, error) { + raw, ok := obj[field] + if !ok { + return "", fmt.Errorf("%s is required", field) + } + text, ok := raw.(string) + if !ok || strings.TrimSpace(text) == "" { + return "", fmt.Errorf("%s must be a non-empty string", field) + } + return strings.TrimSpace(text), nil +} + +func parseCompactSourceOverrides(raw any) (compactSourceOverride, error) { + if raw == nil { + return compactSourceOverride{}, nil + } + obj, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("overrides must be an object keyed by source dataset key") + } + result := make(compactSourceOverride, len(obj)) + for key, value := range obj { + item, ok := value.(map[string]any) + if !ok { + return nil, fmt.Errorf("override %q must be an object", key) + } + result[key] = item + } + return result, nil +} + +func sortedStringMapKeys[T any](items map[string]T) []string { + keys := make([]string, 0, len(items)) + for key := range items { + keys = append(keys, key) + } + slices.Sort(keys) + return keys +} + +func mergeGeneratedOverride(dst map[string]any, src map[string]any) { + if len(src) == 0 { + return + } + if name, ok := src["name"].(string); ok && strings.TrimSpace(name) != "" { + key, _ := dst["key"].(string) + dst["FEAT"] = map[string]any{ + "tlk": map[string]any{ + "key": key + ".name", + "text": strings.TrimSpace(name), + }, + } + } + if description, ok := src["description_text"].(string); ok && strings.TrimSpace(description) != "" { + key, _ := dst["key"].(string) + dst["DESCRIPTION"] = map[string]any{ + "tlk": map[string]any{ + "key": key + ".description", + "text": strings.TrimSpace(description), + }, + } + } + if icon, ok := src["icon"]; ok { + dst["ICON"] = icon + } + for field, value := range src { + switch field { + case "name", "description_text", "icon": + continue + default: + dst[field] = value + } + } +} + +func isHiddenSkill(row map[string]any) bool { + value, ok := lookupField(row, "HideFromLevelUp") + if !ok { + return false + } + switch typed := value.(type) { + case string: + return strings.TrimSpace(typed) == "1" + case int: + return typed == 1 + case float64: + return typed == 1 + default: + return false + } +} + +func displayNameForSkill(row map[string]any) string { + if text, ok := displayTextFromValue(row["Name"]); ok { + return text + } + if label, ok := row["Label"].(string); ok && strings.TrimSpace(label) != "" { + return normalizeDisplayName(strings.TrimSpace(label)) + } + if key, ok := row["key"].(string); ok { + return displayNameFromSlug(strings.TrimPrefix(key, "skills:")) + } + return "Unknown Skill" +} + +func displayNameForBaseitem(row map[string]any) string { + if text, ok := displayTextFromValue(row["Name"]); ok { + return text + } + if label, ok := row["label"].(string); ok && strings.TrimSpace(label) != "" { + return normalizeDisplayName(strings.TrimSpace(label)) + } + if key, ok := row["key"].(string); ok { + return displayNameFromSlug(strings.TrimPrefix(key, "baseitems:")) + } + return "Unknown Weapon" +} + +func displayNameForRaceFile(obj map[string]any) string { + core, ok := obj["core"].(map[string]any) + if ok { + if text, ok := displayTextFromValue(core["Name"]); ok { + return text + } + if label, ok := core["Label"].(string); ok && strings.TrimSpace(label) != "" { + return normalizeDisplayName(strings.TrimSpace(label)) + } + } + if key, ok := obj["key"].(string); ok { + return displayNameFromSlug(strings.TrimPrefix(key, "racialtypes:")) + } + return "Unknown Race" +} + +func displayTextFromValue(value any) (string, bool) { + switch typed := value.(type) { + case string: + if strings.TrimSpace(typed) == "" || isNumericText(typed) || typed == nullValue { + return "", false + } + return normalizeDisplayName(strings.TrimSpace(typed)), true + case map[string]any: + if tlk, ok := typed["tlk"].(map[string]any); ok { + if text, ok := tlk["text"].(string); ok && strings.TrimSpace(text) != "" { + return strings.TrimSpace(text), true + } + } + } + return "", false +} + +func isNumericText(text string) bool { + if strings.TrimSpace(text) == "" { + return false + } + for _, r := range text { + if r < '0' || r > '9' { + return false + } + } + return true +} + +func displayNameFromSlug(slug string) string { + text := strings.TrimSpace(slug) + text = strings.TrimPrefix(text, "knowledge") + if strings.HasPrefix(slug, "knowledge") { + remainder := strings.TrimPrefix(slug, "knowledge") + if remainder == "" { + return "Knowledge" + } + return "Knowledge (" + normalizeDisplayName(remainder) + ")" + } + if strings.HasPrefix(slug, "craft_") { + remainder := strings.TrimPrefix(slug, "craft_") + return "Craft (" + normalizeDisplayName(remainder) + ")" + } + return normalizeDisplayName(text) +} + +func normalizeDisplayName(text string) string { + text = strings.ReplaceAll(text, "_", " ") + text = splitCamelText(text) + parts := strings.Fields(text) + for index, part := range parts { + lower := strings.ToLower(part) + switch lower { + case "of", "and", "vs": + parts[index] = lower + default: + runes := []rune(lower) + if len(runes) == 0 { + continue + } + runes[0] = []rune(strings.ToUpper(string(runes[0])))[0] + parts[index] = string(runes) + } + } + return strings.Join(parts, " ") +} + +func splitCamelText(text string) string { + var out []rune + var prev rune + for index, r := range text { + if index > 0 && isCamelBoundary(prev, r) { + out = append(out, ' ') + } + out = append(out, r) + prev = r + } + return string(out) +} + +func isCamelBoundary(prev, current rune) bool { + return prev >= 'a' && prev <= 'z' && current >= 'A' && current <= 'Z' +} + +func upperSnake(text string) string { + normalized := normalizeDisplayName(text) + normalized = strings.ReplaceAll(normalized, "(", " ") + normalized = strings.ReplaceAll(normalized, ")", " ") + normalized = strings.ReplaceAll(normalized, "-", " ") + normalized = strings.Join(strings.Fields(normalized), "_") + return strings.ToUpper(normalized) +} + +func isNullishValue(value any) bool { + switch typed := value.(type) { + case nil: + return true + case string: + return strings.TrimSpace(typed) == "" || typed == nullValue + default: + return false + } +} + +func featSourceID(value any) (int, error) { + if isNullishValue(value) { + return 0, nil + } + switch typed := value.(type) { + case int: + return typed, nil + case float64: + return int(typed), nil + case string: + return asInt(typed) + default: + return 0, fmt.Errorf("cannot derive feat id from %T", value) + } +} + +func (c *featGeneratedContext) resolveWeaponFeatIdentity(familyKey, slug string, rawSource any) (string, int, bool, error) { + if rawSource != nil && rawSource != nullValue { + if parsedID, err := featSourceID(rawSource); err == nil && parsedID > 0 { + if existingKey, ok := c.preferredFeatKeyForID(familyKey, parsedID); ok { + return existingKey, parsedID, true, nil + } + } + } + if rawMap, ok := rawSource.(map[string]any); ok { + if ref, ok := rawMap["id"].(string); ok && strings.HasPrefix(ref, "feat:") { + rowID, hasID, err := c.featID(ref, nil) + return ref, rowID, hasID, err + } + } + featKey := c.preferredGeneratedFeatKey(familyKey, slug) + rowID, hasID, err := c.featID(featKey, rawSource) + return featKey, rowID, hasID, err +} + +func weaponFamilyPrereqKey(ctx *featGeneratedContext, baseitemRow map[string]any, slug, familyKey string) (string, bool) { + if familyKey == "" { + return "", false + } + column := weaponFamilySourceColumn(familyKey) + if column == "" { + return "", false + } + rawSource, ok := lookupField(baseitemRow, column) + if !ok || isNullishValue(rawSource) { + return "", false + } + featKey, _, _, err := ctx.resolveWeaponFeatIdentity(familyKey, slug, rawSource) + if err != nil { + return "", false + } + return featKey, true +} + +func weaponFamilySourceColumn(familyKey string) string { + for _, spec := range featWeaponFamilies { + if spec.FamilyKey == familyKey { + return spec.SourceColumn + } + } + return "" +} + +func (c *featGeneratedContext) preferredFeatKeyForID(familyKey string, rowID int) (string, bool) { + prefix := "feat:" + familyKey + type candidateBuckets struct { + familyExisting []string + otherExisting []string + familyLegacy []string + otherLegacy []string + familyOther []string + otherOther []string + } + + buckets := candidateBuckets{} + appendMatches := func(candidates map[string]int, legacy bool) { + for key, candidateID := range candidates { + if candidateID != rowID { + continue + } + inFamily := strings.HasPrefix(key, prefix) + exists := c.featKeyExists(key) + switch { + case exists && inFamily: + buckets.familyExisting = append(buckets.familyExisting, key) + case exists: + buckets.otherExisting = append(buckets.otherExisting, key) + case legacy && inFamily: + buckets.familyLegacy = append(buckets.familyLegacy, key) + case legacy: + buckets.otherLegacy = append(buckets.otherLegacy, key) + case inFamily: + buckets.familyOther = append(buckets.familyOther, key) + default: + buckets.otherOther = append(buckets.otherOther, key) + } + } + } + + appendMatches(c.lockData, false) + appendMatches(c.supplementalID, true) + + for _, group := range [][]string{ + buckets.familyExisting, + buckets.otherExisting, + buckets.otherLegacy, + buckets.familyLegacy, + buckets.familyOther, + buckets.otherOther, + } { + if best, ok := preferredExpandedKey(group); ok { + return best, true + } + } + return "", false +} + +func extractRaceFeatKey(obj map[string]any) (string, bool) { + value, ok := obj["FeatIndex"].(map[string]any) + if !ok { + return "", false + } + key, ok := value["id"].(string) + if !ok || !strings.HasPrefix(key, "feat:") { + return "", false + } + return key, true +} + +func isSkillAffinityFeatKey(key string) bool { + return strings.HasPrefix(key, "feat:skillaffinity") || strings.HasPrefix(key, "feat:partialskillaffinity") +} + +func parseSkillAffinityKey(featKey string) (string, int, error) { + switch { + case strings.HasPrefix(featKey, "feat:partialskillaffinity"): + return "skills:" + strings.TrimPrefix(featKey, "feat:partialskillaffinity"), 1, nil + case strings.HasPrefix(featKey, "feat:skillaffinity"): + return "skills:" + strings.TrimPrefix(featKey, "feat:skillaffinity"), 2, nil + default: + return "", 0, fmt.Errorf("unsupported skill affinity key %q", featKey) + } +} + +func resolveAffinitySkillKey(skillRows map[string]map[string]any, skillKey string) string { + if _, ok := skillRows[skillKey]; ok { + return skillKey + } + target := normalizeKeyIdentity(strings.TrimPrefix(skillKey, "skills:")) + for key := range skillRows { + if normalizeKeyIdentity(strings.TrimPrefix(key, "skills:")) == target { + return key + } + } + return skillKey +} + +func normalizeKeyIdentity(text string) string { + text = strings.ToLower(strings.TrimSpace(text)) + text = strings.ReplaceAll(text, "_", "") + text = strings.ReplaceAll(text, " ", "") + return text +} + +func affinityTitleFromKey(featKey, skillName string) string { + if strings.HasPrefix(featKey, "feat:partialskillaffinity") { + return fmt.Sprintf("Partial Skill Affinity (%s)", skillName) + } + return fmt.Sprintf("Skill Affinity (%s)", skillName) +} + +func affinityDescription(skillName string, bonus int, races []string) string { + return fmt.Sprintf("Gain a +%d racial bonus to %s checks. Prerequisites: %s.", bonus, skillName, strings.Join(races, ", ")) +} + +func affinityLabel(featKey string) string { + skillKey, _, err := parseSkillAffinityKey(featKey) + if err != nil { + return "FEAT_UNKNOWN_SKILL_AFFINITY" + } + skillSlug := strings.TrimPrefix(skillKey, "skills:") + if strings.HasPrefix(featKey, "feat:partialskillaffinity") { + return "FEAT_PARTIAL_SKILL_AFFINITY_" + upperSnake(displayNameFromSlug(skillSlug)) + } + return "FEAT_SKILL_AFFINITY_" + upperSnake(displayNameFromSlug(skillSlug)) +} + +func dedupeAndSort(items []string) []string { + seen := map[string]struct{}{} + out := make([]string, 0, len(items)) + for _, item := range items { + item = strings.TrimSpace(item) + if item == "" { + continue + } + if _, ok := seen[item]; ok { + continue + } + seen[item] = struct{}{} + out = append(out, item) + } + slices.Sort(out) + return out +} + +func sortedGrantKeys(items map[string]*affinityGrant) []string { + keys := make([]string, 0, len(items)) + for key := range items { + keys = append(keys, key) + } + slices.Sort(keys) + return keys +} + +func collectPlainDataset(dataset nativeDataset) (nativeCollectedDataset, error) { + tableData, err := loadJSONObject(dataset.BasePath) + if err != nil { + return nativeCollectedDataset{}, err + } + + columns, err := parseColumns(tableData, dataset.Name) + if err != nil { + return nativeCollectedDataset{}, err + } + rawRows, ok := tableData["rows"].([]any) + if !ok { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: rows must be an array", dataset.Name) + } + + lockData, err := loadLockfile(dataset.LockPath) + if err != nil { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + usedIDs := map[int]struct{}{} + for _, rowID := range lockData { + usedIDs[rowID] = struct{}{} + } + + rows := make([]map[string]any, 0, len(rawRows)) + lockModified := false + explicitID := make([]bool, 0, len(rawRows)) + for index, raw := range rawRows { + rowObj, ok := raw.(map[string]any) + if !ok { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: row %d must be an object", dataset.Name, index) + } + row, err := canonicalizeBaseRow(dataset, columns, rowObj, index) + if err != nil { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + rows = append(rows, row) + _, hasExplicitID := rowObj["id"] + explicitID = append(explicitID, hasExplicitID) + if hasExplicitID { + usedIDs[row["id"].(int)] = struct{}{} + } + } + + nextID := nextAvailableID(usedIDs) + for index, row := range rows { + key, hasKey := row["key"].(string) + if hasKey && key != "" { + if lockedID, ok := lockData[key]; ok { + row["id"] = lockedID + continue + } + if explicitID[index] { + lockData[key] = row["id"].(int) + } else { + row["id"] = nextID + lockData[key] = nextID + usedIDs[nextID] = struct{}{} + nextID = nextAvailableID(usedIDs) + } + lockModified = true + continue + } + if !explicitID[index] { + row["id"] = index + } + } + + if lockModified { + if err := saveLockfile(dataset.LockPath, lockData); err != nil { + return nativeCollectedDataset{}, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + } + + slices.SortFunc(rows, func(a, b map[string]any) int { + return a["id"].(int) - b["id"].(int) + }) + tableKey, _ := tableData["key"].(string) + return nativeCollectedDataset{ + Dataset: dataset, + Columns: columns, + Rows: rows, + LockData: lockData, + TableKey: tableKey, + }, nil +} + +func resolveNativeDataset(dataset nativeCollectedDataset, keyToID map[string]int, globalRowByKey map[string]map[string]any, tableRegistry resolvedTableRegistry, compiler *tlkCompiler) (map[string]any, error) { + rows := dataset.Rows + if strings.HasPrefix(filepath.ToSlash(dataset.Dataset.Name), "classes/feats/") { + classKey := "classes:" + dataset.Dataset.Name[strings.LastIndex(dataset.Dataset.Name, "/")+1:] + featSuccessors := buildFeatSuccessorsIndex(globalRowByKey, keyToID) + classSkills := buildClassSkillsIndex(tableRegistry, classKey) + expanded, err := expandClassesFeatRows(rows, keyToID, globalRowByKey, featSuccessors, classSkills, globalRowByKey) + if err != nil { + return nil, fmt.Errorf("dataset %s: %w", dataset.Dataset.Name, err) + } + rows = expanded + } + + dataset.Dataset.Columns = dataset.Columns + resolver := valueResolver{ + dataset: dataset.Dataset, + keyToID: keyToID, + rowByKey: globalRowByKey, + tableRegistry: tableRegistry, + compiler: compiler, + cache: map[string]map[string]tlkCompiledValue{}, + } + + resolvedRows := make([]map[string]any, 0, len(rows)) + for _, row := range rows { + resolved, err := resolver.resolveRow(row, nil) + if err != nil { + return nil, fmt.Errorf("dataset %s: %w", dataset.Dataset.Name, err) + } + resolvedRows = append(resolvedRows, resolved) + } + return map[string]any{ + "columns": dataset.Columns, + "rows": resolvedRows, + }, nil +} + +var ( + classFeatGlobalRows = []map[string]any{ + {"FeatIndex": map[string]any{"id": "feat:combatexpertise"}, "List": "0", "GrantedOnLevel": "-1", "OnMenu": "1"}, + {"FeatIndex": map[string]any{"id": "feat:powerattack"}, "List": "0", "GrantedOnLevel": "-1", "OnMenu": "1"}, + {"FeatIndex": map[string]any{"id": "feat:specialattacks"}, "List": "3", "GrantedOnLevel": "1", "OnMenu": "1"}, + {"FeatIndex": map[string]any{"id": "feat:throw"}, "List": "3", "GrantedOnLevel": "1", "OnMenu": "1"}, + {"FeatIndex": map[string]any{"id": "feat:grapple"}, "List": "3", "GrantedOnLevel": "1", "OnMenu": "1"}, + {"FeatIndex": map[string]any{"id": "feat:offensivefighting"}, "List": "3", "GrantedOnLevel": "1", "OnMenu": "1"}, + {"FeatIndex": map[string]any{"id": "feat:defensivefighting"}, "List": "3", "GrantedOnLevel": "1", "OnMenu": "1"}, + {"FeatIndex": map[string]any{"id": "feat:horsemenu"}, "List": "3", "GrantedOnLevel": "1", "OnMenu": "1"}, + } + classFeatClassSkillShorthandRows = []map[string]any{ + {"FeatIndex": map[string]any{"id": "masterfeats:skillfocus", "filter": "classskills"}, "List": "1", "GrantedOnLevel": "-1", "OnMenu": "0"}, + {"FeatIndex": map[string]any{"id": "masterfeats:greaterskillfocus", "filter": "classskills"}, "List": "1", "GrantedOnLevel": "12", "OnMenu": "0"}, + } +) + +func expandClassesFeatRows(rows []map[string]any, keyToID map[string]int, rowByKey map[string]map[string]any, featSuccessors map[string]string, classSkills map[string]bool, allRowByKey map[string]map[string]any) ([]map[string]any, error) { + + injected := make([]map[string]any, 0, len(classFeatGlobalRows)+len(classFeatClassSkillShorthandRows)) + existingRefIDs := make(map[string]struct{}, len(rows)) + for _, row := range rows { + featRef, ok := row["FeatIndex"].(map[string]any) + if !ok { + continue + } + refID, _ := featRef["id"].(string) + if refID == "" { + continue + } + existingRefIDs[refID] = struct{}{} + } + + for _, row := range classFeatGlobalRows { + featKey := row["FeatIndex"].(map[string]any)["id"].(string) + if _, exists := existingRefIDs[featKey]; exists { + continue + } + if _, exists := allRowByKey[featKey]; exists { + cloned := deepCopyValue(row).(map[string]any) + if label := lookupReferencedFeatLabel(featKey, allRowByKey); label != "" { + cloned["FeatLabel"] = label + } + injected = append(injected, cloned) + } + } + + hasClassSkills := classSkills != nil && len(classSkills) > 0 + for _, row := range classFeatClassSkillShorthandRows { + if !hasClassSkills { + continue + } + refID := row["FeatIndex"].(map[string]any)["id"].(string) + if _, exists := existingRefIDs[refID]; exists { + continue + } + rowItems, err := expandClassesFeatRow(row, keyToID, rowByKey, featSuccessors, classSkills) + if err != nil { + return nil, err + } + if len(rowItems) > 0 { + injected = append(injected, rowItems...) + } + } + + expanded := make([]map[string]any, 0, len(rows)) + for _, row := range rows { + rowItems, err := expandClassesFeatRow(row, keyToID, rowByKey, featSuccessors, classSkills) + if err != nil { + return nil, err + } + expanded = append(expanded, rowItems...) + } + + combined := make([]map[string]any, 0, len(injected)+len(expanded)) + combined = append(combined, injected...) + combined = append(combined, expanded...) + + for index, row := range combined { + row["id"] = index + } + return combined, nil +} + +func expandClassesFeatRow(row map[string]any, keyToID map[string]int, rowByKey map[string]map[string]any, featSuccessors map[string]string, classSkills map[string]bool) ([]map[string]any, error) { + featRef, ok := row["FeatIndex"].(map[string]any) + if !ok { + return []map[string]any{row}, nil + } + refKey, _ := featRef["id"].(string) + filterMode, _ := featRef["filter"].(string) + + switch { + case strings.HasPrefix(refKey, "feat:"): + if filterMode == "successors" { + return expandFeatSuccessors(refKey, row, featSuccessors, rowByKey) + } + cloned := deepCopyValue(row).(map[string]any) + if label := lookupReferencedFeatLabel(refKey, rowByKey); label != "" && isNullLikeValue(cloned["FeatLabel"]) { + cloned["FeatLabel"] = label + } + return []map[string]any{cloned}, nil + case strings.HasPrefix(refKey, "masterfeats:"): + masterfeatKey := refKey + children, err := expandMasterfeatChildren(masterfeatKey, row, keyToID, rowByKey) + if err != nil { + return nil, err + } + if filterMode == "classskills" { + if classSkills == nil || len(classSkills) == 0 { + return []map[string]any{}, nil + } + filtered := make([]map[string]any, 0, len(children)) + for _, child := range children { + featRef, ok := child["FeatIndex"].(map[string]any) + if !ok { + continue + } + featKey, _ := featRef["id"].(string) + featRow := rowByKey[featKey] + if featRow == nil { + continue + } + reqSkillKey := resolveReqSkill(featRow, keyToID) + if reqSkillKey == "" { + continue + } + if classSkills[reqSkillKey] { + filtered = append(filtered, child) + } + } + if len(filtered) == 0 { + return []map[string]any{}, nil + } + return filtered, nil + } + if len(children) == 0 { + return []map[string]any{row}, nil + } + return children, nil + default: + return []map[string]any{row}, nil + } +} + +func expandMasterfeatChildren(masterfeatKey string, row map[string]any, keyToID map[string]int, rowByKey map[string]map[string]any) ([]map[string]any, error) { + if _, ok := keyToID[masterfeatKey]; !ok { + return nil, fmt.Errorf("unknown masterfeat reference %q", masterfeatKey) + } + type match struct { + key string + id int + } + matches := make([]match, 0) + for key, featRow := range rowByKey { + if !strings.HasPrefix(key, "feat:") { + continue + } + if !rowReferencesMasterfeat(featRow, masterfeatKey, keyToID) { + continue + } + featID, ok := keyToID[key] + if !ok { + continue + } + matches = append(matches, match{key: key, id: featID}) + } + slices.SortFunc(matches, func(a, b match) int { + return a.id - b.id + }) + expanded := make([]map[string]any, 0, len(matches)) + for _, item := range matches { + cloned := deepCopyValue(row).(map[string]any) + cloned["FeatIndex"] = map[string]any{"id": item.key} + if label := lookupReferencedFeatLabel(item.key, rowByKey); label != "" { + cloned["FeatLabel"] = label + } + expanded = append(expanded, cloned) + } + return expanded, nil +} + +func rowReferencesMasterfeat(row map[string]any, masterfeatKey string, keyToID map[string]int) bool { + masterID, ok := keyToID[masterfeatKey] + if !ok { + return false + } + value, ok := row["MASTERFEAT"] + if !ok { + return false + } + switch typed := value.(type) { + case string: + return typed == strconv.Itoa(masterID) + case int: + return typed == masterID + case float64: + return int(typed) == masterID + case map[string]any: + if id, ok := typed["id"].(string); ok { + if id == masterfeatKey { + return true + } + if refID, ok := keyToID[id]; ok { + return refID == masterID + } + return id == "masterfeats:"+strconv.Itoa(masterID) + } + return false + default: + return false + } +} + +func lookupReferencedFeatLabel(featKey string, rowByKey map[string]map[string]any) string { + row, ok := rowByKey[featKey] + if !ok { + return "" + } + label, _ := row["LABEL"].(string) + return strings.TrimSpace(label) +} + +func isNullLikeValue(value any) bool { + switch typed := value.(type) { + case nil: + return true + case string: + trimmed := strings.TrimSpace(typed) + return trimmed == "" || trimmed == nullValue + default: + return false + } +} + +func buildFeatSuccessorsIndex(rowByKey map[string]map[string]any, keyToID map[string]int) map[string]string { + successors := make(map[string]string) + for key, row := range rowByKey { + if !strings.HasPrefix(key, "feat:") { + continue + } + successorKey := resolveFeatSuccessor(row, keyToID) + if successorKey != "" { + successors[key] = successorKey + } + } + return successors +} + +func resolveFeatSuccessor(row map[string]any, keyToID map[string]int) string { + value, ok := row["SUCCESSOR"] + if !ok { + return "" + } + switch typed := value.(type) { + case map[string]any: + if idValue, ok := typed["id"]; ok { + switch idTyped := idValue.(type) { + case string: + trimmed := strings.TrimSpace(idTyped) + if trimmed == "" || trimmed == nullValue || trimmed == "****" { + return "" + } + if id, err := strconv.Atoi(trimmed); err == nil { + for k, v := range keyToID { + if v == id && strings.HasPrefix(k, "feat:") { + return k + } + } + return "" + } + if strings.HasPrefix(trimmed, "feat:") { + return trimmed + } + return "feat:" + trimmed + case int: + for k, v := range keyToID { + if v == idTyped && strings.HasPrefix(k, "feat:") { + return k + } + } + return "" + case float64: + targetID := int(idTyped) + for k, v := range keyToID { + if v == targetID && strings.HasPrefix(k, "feat:") { + return k + } + } + return "" + } + } + return "" + case string: + trimmed := strings.TrimSpace(typed) + if trimmed == "" || trimmed == nullValue || trimmed == "****" { + return "" + } + if id, err := strconv.Atoi(trimmed); err == nil { + for k, v := range keyToID { + if v == id && strings.HasPrefix(k, "feat:") { + return k + } + } + return "" + } + if strings.HasPrefix(trimmed, "feat:") { + return trimmed + } + return "feat:" + trimmed + case int: + for k, v := range keyToID { + if v == typed && strings.HasPrefix(k, "feat:") { + return k + } + } + return "" + case float64: + targetID := int(typed) + for k, v := range keyToID { + if v == targetID && strings.HasPrefix(k, "feat:") { + return k + } + } + return "" + default: + return "" + } +} + +func buildClassSkillsIndex(tableRegistry resolvedTableRegistry, classKey string) map[string]bool { + skillDatasetKey := classKey + if !strings.HasPrefix(skillDatasetKey, "classes/skills:") { + skillDatasetKey = "classes/skills:" + strings.TrimPrefix(classKey, "classes:") + } + + table, ok := tableRegistry.resolveTableByKey(skillDatasetKey) + if !ok { + return nil + } + + skills := make(map[string]bool) + for _, rowMap := range table.Rows { + classSkill, _ := rowMap["ClassSkill"].(string) + if classSkill != "1" { + continue + } + skillIndex, ok := rowMap["SkillIndex"].(map[string]any) + if !ok { + continue + } + skillKey, _ := skillIndex["id"].(string) + if skillKey != "" { + skills[skillKey] = true + } + } + + if len(skills) == 0 { + return nil + } + return skills +} + +func expandFeatSuccessors(rootFeatKey string, row map[string]any, featSuccessors map[string]string, rowByKey map[string]map[string]any) ([]map[string]any, error) { + current := rootFeatKey + visited := make(map[string]bool) + var results []map[string]any + for { + if current == "" { + break + } + if visited[current] { + return nil, fmt.Errorf("successor chain cycles at %q", current) + } + visited[current] = true + if rowByKey[current] == nil { + break + } + cloned := deepCopyValue(row).(map[string]any) + cloned["FeatIndex"] = map[string]any{"id": current} + if label := lookupReferencedFeatLabel(current, rowByKey); label != "" { + cloned["FeatLabel"] = label + } + results = append(results, cloned) + current = featSuccessors[current] + } + if len(results) == 0 { + return []map[string]any{row}, nil + } + return results, nil +} + +func expandMasterfeatChildrenFiltered(masterfeatKey string, row map[string]any, keyToID map[string]int, rowByKey map[string]map[string]any, classSkills map[string]bool) ([]map[string]any, error) { + if classSkills == nil || len(classSkills) == 0 { + return []map[string]any{}, nil + } + children, err := expandMasterfeatChildren(masterfeatKey, row, keyToID, rowByKey) + if err != nil { + return nil, err + } + var filtered []map[string]any + for _, child := range children { + featRef, ok := child["FeatIndex"].(map[string]any) + if !ok { + continue + } + featKey, _ := featRef["id"].(string) + featRow := rowByKey[featKey] + if featRow == nil { + continue + } + reqSkillKey := resolveReqSkill(featRow, keyToID) + if reqSkillKey == "" { + continue + } + if classSkills[reqSkillKey] { + filtered = append(filtered, child) + } + } + return filtered, nil +} + +func extractClassKeyFromDatasetName(rowByKey map[string]map[string]any) string { + for key := range rowByKey { + if strings.HasPrefix(key, "classes:") { + return key + } + } + return "" +} + +func resolveReqSkill(row map[string]any, keyToID map[string]int) string { + value, ok := row["REQSKILL"] + if !ok { + return "" + } + switch typed := value.(type) { + case string: + trimmed := strings.TrimSpace(typed) + if trimmed == "" || trimmed == nullValue || trimmed == "****" { + return "" + } + if strings.HasPrefix(trimmed, "skills:") { + return trimmed + } + if resolved := lookupKeyByIDPrefix(keyToID, "skills:", trimmed); resolved != "" { + return resolved + } + return "skills:" + trimmed + case map[string]any: + if id, ok := typed["id"].(string); ok { + if id == "" || id == nullValue || id == "****" { + return "" + } + if strings.HasPrefix(id, "skills:") { + return id + } + if resolved := lookupKeyByIDPrefix(keyToID, "skills:", id); resolved != "" { + return resolved + } + return "skills:" + id + } + return "" + default: + return "" + } +} + +func lookupKeyByIDPrefix(keyToID map[string]int, prefix string, rawID string) string { + idValue, err := strconv.Atoi(strings.TrimSpace(rawID)) + if err != nil { + return "" + } + for key, existingID := range keyToID { + if existingID == idValue && strings.HasPrefix(key, prefix) { + return key + } + } + return "" +} + +type valueResolver struct { + dataset nativeDataset + keyToID map[string]int + rowByKey map[string]map[string]any + tableRegistry resolvedTableRegistry + compiler *tlkCompiler + cache map[string]map[string]tlkCompiledValue +} + +func (r *valueResolver) resolveTableByKey(key string) (resolvedTable, bool) { + return r.tableRegistry.resolveTableByKey(key) +} + +func (r *valueResolver) resolveRow(row map[string]any, stack []string) (map[string]any, error) { + effectiveRow, err := r.resolveInheritedObject(row, rowIdentity(r.dataset.Name, row), row, stack) + if err != nil { + return nil, err + } + out := map[string]any{ + "id": effectiveRow["id"], + } + for _, column := range rowColumns(effectiveRow, r.dataset.Columns) { + resolved, err := r.resolveField(effectiveRow, column, stack) + if err != nil { + return nil, err + } + out[column] = resolved.Value + } + return out, nil +} + +func (r *valueResolver) resolveField(row map[string]any, field string, stack []string) (tlkCompiledValue, error) { + rowKey := rowCacheIdentity(r.dataset.Name, row) + if r.cache[rowKey] == nil { + r.cache[rowKey] = map[string]tlkCompiledValue{} + } + if cached, ok := r.cache[rowKey][field]; ok { + return cached, nil + } + + stackKey := rowKey + "." + field + for _, existing := range stack { + if existing == stackKey { + return tlkCompiledValue{}, fmt.Errorf("cyclic row/field reference detected at %s", stackKey) + } + } + + value, ok := lookupField(row, field) + if !ok { + resolved := tlkCompiledValue{Value: nullValue} + r.cache[rowKey][field] = resolved + return resolved, nil + } + resolved, err := r.resolveValue(row, field, value, append(stack, stackKey)) + if err != nil { + return tlkCompiledValue{}, err + } + r.cache[rowKey][field] = resolved + return resolved, nil +} + +func (r *valueResolver) resolveValue(row map[string]any, field string, value any, stack []string) (tlkCompiledValue, error) { + if typed, ok := value.(map[string]any); ok { + merged, err := r.resolveInheritedObject(row, rowCacheIdentity(r.dataset.Name, row)+"."+field, typed, stack) + if err != nil { + return tlkCompiledValue{}, err + } + value = merged + } + if literal, ok := r.resolveLiteralFeatObject(row, field, value); ok { + return tlkCompiledValue{Value: literal}, nil + } + allowBare := columnMatchesSpec(r.dataset.Spec, field) + if payload, ok, err := parseTLKPayload(value, allowBare); err != nil { + return tlkCompiledValue{}, err + } else if ok { + return r.resolveTLKPayload(row, field, payload, stack) + } + + switch typed := value.(type) { + case map[string]any: + if refID, ok := typed["id"]; ok { + if refKey, ok := refID.(string); ok && strings.Contains(refKey, ":") { + id, ok := r.keyToID[refKey] + if !ok { + return tlkCompiledValue{}, fmt.Errorf("unknown key reference: %s (row=%s field=%s)", refKey, rowCacheIdentity(r.dataset.Name, row), field) + } + return tlkCompiledValue{Value: id}, nil + } + } + if refKey, ok := typed["ref"]; ok { + fieldValue, hasField := typed["field"] + refKeyString, okKey := refKey.(string) + fieldString, okField := fieldValue.(string) + if hasField && okKey && okField { + targetRow, ok := r.rowByKey[refKeyString] + if !ok { + return tlkCompiledValue{}, fmt.Errorf("unknown row reference: %s", refKeyString) + } + return r.resolveField(targetRow, fieldString, stack) + } + } + if tableValue, ok := typed["table"]; ok { + tableKey, ok := tableValue.(string) + if ok { + outputName, ok := r.tableRegistry.stemByKey[tableKey] + if !ok { + return tlkCompiledValue{}, fmt.Errorf("unknown table reference: %s", tableKey) + } + return tlkCompiledValue{Value: outputName}, nil + } + } + + resolved := map[string]any{} + for _, key := range sortedKeys(typed) { + item, err := r.resolveValue(row, key, typed[key], stack) + if err != nil { + return tlkCompiledValue{}, err + } + resolved[key] = item.Value + } + return tlkCompiledValue{Value: resolved}, nil + case []any: + resolved := make([]any, 0, len(typed)) + for _, item := range typed { + value, err := r.resolveValue(row, field, item, stack) + if err != nil { + return tlkCompiledValue{}, err + } + resolved = append(resolved, value.Value) + } + return tlkCompiledValue{Value: resolved}, nil + default: + return tlkCompiledValue{Value: typed}, nil + } +} + +func (r *valueResolver) resolveLiteralFeatObject(row map[string]any, field string, value any) (string, bool) { + if r.dataset.Name != "feat" { + return "", false + } + typed, ok := value.(map[string]any) + if !ok { + return "", false + } + if refID, ok := typed["id"].(string); ok && len(typed) == 1 && strings.Contains(refID, ":") { + if !shouldPreserveLiteralFeatIDObject(row, field, refID) { + return "", false + } + if _, exists := r.keyToID[refID]; !exists { + return "", false + } + return "{'id': '" + refID + "'}", true + } + if refKey, ok := typed["key"].(string); ok && len(typed) == 1 && strings.Contains(refKey, ":") { + if !shouldPreserveLiteralFeatKeyObject(field) { + return "", false + } + if _, exists := r.keyToID[refKey]; !exists && !isLegacyLiteralFeatKeyException(field, refKey) { + return "", false + } + return "{'key': '" + refKey + "'}", true + } + return "", false +} + +func shouldPreserveLiteralFeatKeyObject(field string) bool { + switch field { + case "SUCCESSOR", "PREREQFEAT1", "PREREQFEAT2": + return true + default: + return false + } +} + +func shouldPreserveLiteralFeatIDObject(row map[string]any, field, refID string) bool { + switch field { + case "MinLevelClass": + return shouldPreserveFeatMinLevelClass(row) + case "SUCCESSOR": + switch refID { + case "feat:weaponproficiencysimple": + return true + default: + return false + } + default: + return false + } +} + +func shouldPreserveFeatMinLevelClass(row map[string]any) bool { + rowKey, _ := row["key"].(string) + switch { + case strings.HasPrefix(rowKey, "feat:weaponfocus_"): + return true + case strings.HasPrefix(rowKey, "feat:weaponspecialization_"): + return true + case strings.HasPrefix(rowKey, "feat:greaterweaponfocus_"): + return true + case strings.HasPrefix(rowKey, "feat:greaterweaponspecialization_"): + return true + case strings.HasPrefix(rowKey, "feat:improvedcritical_"): + return true + case strings.HasPrefix(rowKey, "feat:overwhelmingcritical_"): + return true + case strings.HasPrefix(rowKey, "feat:epicweaponfocus_"): + return true + case strings.HasPrefix(rowKey, "feat:epicweaponspecialization_"): + return true + case rowKey == "masterfeats:weaponfocus": + return true + case rowKey == "masterfeats:weaponspecialization": + return true + case rowKey == "masterfeats:greaterweaponfocus": + return true + case rowKey == "masterfeats:greaterweaponspecialization": + return true + case rowKey == "masterfeats:improvedcritical": + return true + case rowKey == "masterfeats:overwhelmingcritical": + return true + default: + return false + } +} + +func isLegacyLiteralFeatKeyException(field, refKey string) bool { + if field != "SUCCESSOR" { + return false + } + switch refKey { + case "feat:improveddodge", "feat:improveduncannydodge": + return true + default: + return false + } +} + +func (r *valueResolver) resolveTLKPayload(row map[string]any, field string, payload parsedTLKPayload, stack []string) (tlkCompiledValue, error) { + if payload.Ref != "" { + targetRow, ok := r.rowByKey[payload.Ref] + if !ok { + return tlkCompiledValue{}, fmt.Errorf("unknown TLK ref row %s", payload.Ref) + } + resolved, err := r.resolveField(targetRow, payload.RefField, stack) + if err != nil { + return tlkCompiledValue{}, err + } + if resolved.TLKKey == "" { + switch resolved.Value.(type) { + case string, int, float64: + return resolved, nil + default: + return tlkCompiledValue{}, fmt.Errorf("TLK ref %s.%s does not resolve to TLK-backed text", payload.Ref, payload.RefField) + } + } + return resolved, nil + } + if payload.Text != "" { + key := payload.Key + if key == "" { + key = deriveAutoTLKKey(rowIdentity(r.dataset.Name, row), field) + } + return r.compiler.registerInline(key, tlkEntryData{ + Text: payload.Text, + SoundResRef: payload.SoundResRef, + SoundLength: payload.SoundLength, + }) + } + return r.compiler.resolveLegacyKey(payload.Key) +} + +func rowColumns(row map[string]any, ordered []string) []string { + columns := make([]string, 0, len(row)) + seen := map[string]struct{}{} + for _, key := range ordered { + if _, ok := row[key]; ok { + columns = append(columns, key) + seen[key] = struct{}{} + } + } + for key := range row { + if key == "id" || key == "key" || key == "__columns" || key == "inherit" || isMetadataField(key) { + continue + } + if _, ok := seen[key]; ok { + continue + } + columns = append(columns, key) + } + return columns +} + +func columnMatchesSpec(spec datasetTextSpec, field string) bool { + return roleForField(spec, field) == textRoleName || roleForField(spec, field) == textRoleDescription +} + +func rowIdentity(datasetName string, row map[string]any) string { + if key, ok := row["key"].(string); ok && key != "" { + return key + } + return fmt.Sprintf("%s:id:%d", datasetName, row["id"].(int)) +} + +func rowCacheIdentity(datasetName string, row map[string]any) string { + return rowIdentity(datasetName, row) +} + +func lookupField(row map[string]any, field string) (any, bool) { + if value, ok := row[field]; ok { + return value, true + } + for key, value := range row { + if strings.EqualFold(key, field) { + return value, true + } + } + return nil, false +} + +func parseColumns(baseData map[string]any, datasetName string) ([]string, error) { + rawColumns, ok := baseData["columns"].([]any) + if !ok { + return nil, fmt.Errorf("dataset %s: columns must be an array", datasetName) + } + columns := make([]string, 0, len(rawColumns)) + for _, raw := range rawColumns { + column, ok := raw.(string) + if !ok { + return nil, fmt.Errorf("dataset %s: columns must contain strings", datasetName) + } + if isDeprecatedAuthoringOnlyField(datasetName, column) || isMetadataField(column) { + continue + } + columns = append(columns, column) + } + return columns, nil +} + +func canonicalizeBaseRow(dataset nativeDataset, columns []string, raw map[string]any, index int) (map[string]any, error) { + rowID := index + if value, ok := raw["id"]; ok { + parsed, err := asInt(value) + if err != nil { + return nil, fmt.Errorf("row id %v is not numeric", value) + } + rowID = parsed + } + + row := map[string]any{"id": rowID} + for _, column := range columns { + row[column] = nullValue + } + for key, value := range raw { + switch key { + case "id", "_tlk": + case "key": + if value == nil { + continue + } + text, ok := value.(string) + if !ok { + return nil, fmt.Errorf("row key must be a string") + } + row["key"] = text + case "inherit": + row["inherit"] = value + default: + if isMetadataField(key) { + meta, err := parseRowMetadata(value) + if err != nil { + return nil, err + } + if meta != nil { + row["meta"] = meta + } + continue + } + if isDeprecatedAuthoringOnlyField(dataset.Name, key) { + if err := setLegacyWikiMetadata(row, key, value); err != nil { + return nil, err + } + continue + } + columnName, ok := canonicalColumn(columns, key) + if !ok { + if isDeprecatedAuthoringOnlyField(dataset.Name, key) { + continue + } + return nil, fmt.Errorf("unknown column %q", key) + } + row[columnName] = value + } + } + + return expandRowAuthoringSugar(dataset, columns, raw, row) +} + +func canonicalizeEntry(dataset nativeDataset, columns []string, rowID int, key string, raw map[string]any) (map[string]any, error) { + row := map[string]any{ + "id": rowID, + "key": key, + } + for _, column := range columns { + row[column] = nullValue + } + for field, value := range raw { + if field == "_tlk" { + continue + } + if field == "inherit" { + row["inherit"] = value + continue + } + if isMetadataField(field) { + meta, err := parseRowMetadata(value) + if err != nil { + return nil, err + } + if meta != nil { + row["meta"] = meta + } + continue + } + if isDeprecatedAuthoringOnlyField(dataset.Name, field) { + if err := setLegacyWikiMetadata(row, field, value); err != nil { + return nil, err + } + continue + } + columnName, ok := canonicalColumn(columns, field) + if !ok { + if isDeprecatedAuthoringOnlyField(dataset.Name, field) { + continue + } + return nil, fmt.Errorf("entry %q references unknown column %q", key, field) + } + row[columnName] = value + } + return expandRowAuthoringSugar(dataset, columns, raw, row) +} + +func isAuthoringOnlyField(name string) bool { + return strings.HasPrefix(strings.ToUpper(strings.TrimSpace(name)), "WIKI") +} + +func preserveLegacyWikiColumn(datasetName, field string) bool { + return filepath.ToSlash(strings.TrimSpace(datasetName)) == "classes/core" && + strings.EqualFold(strings.TrimSpace(field), "WIKIGENERATE") +} + +func isDeprecatedAuthoringOnlyField(datasetName, field string) bool { + return isAuthoringOnlyField(field) && !preserveLegacyWikiColumn(datasetName, field) +} + +func isMetadataField(name string) bool { + return strings.EqualFold(strings.TrimSpace(name), "meta") +} + +func expandRowAuthoringSugar(dataset nativeDataset, columns []string, source map[string]any, row map[string]any) (map[string]any, error) { + expanded, err := expandRowTLKSugar(dataset, columns, source, row) + if err != nil { + return nil, err + } + return expandRowInheritanceSugar(dataset, columns, source, expanded) +} + +func expandRowTLKSugar(dataset nativeDataset, columns []string, source map[string]any, row map[string]any) (map[string]any, error) { + rawTLK, ok := source["_tlk"] + if !ok { + return row, nil + } + tlkMap, ok := rawTLK.(map[string]any) + if !ok { + return nil, fmt.Errorf("dataset %s: _tlk must be an object", dataset.Name) + } + + out := map[string]any{} + for key, value := range row { + out[key] = value + } + for roleName, rawValue := range tlkMap { + var role textRole + switch strings.ToLower(roleName) { + case "name": + role = textRoleName + case "description": + role = textRoleDescription + default: + return nil, fmt.Errorf("dataset %s: unsupported _tlk role %q", dataset.Name, roleName) + } + column := columnForRole(columns, dataset.Spec, role) + if column == "" { + return nil, fmt.Errorf("dataset %s: _tlk.%s has no matching text column", dataset.Name, roleName) + } + if _, hasField := source[column]; hasField { + return nil, fmt.Errorf("dataset %s: cannot use _tlk.%s and field %s together", dataset.Name, roleName, column) + } + + switch typed := rawValue.(type) { + case string: + out[column] = map[string]any{"tlk": map[string]any{"text": typed}} + case map[string]any: + if _, ok := typed["tlk"]; ok { + out[column] = typed + } else { + out[column] = map[string]any{"tlk": typed} + } + default: + return nil, fmt.Errorf("dataset %s: _tlk.%s must be a string or object", dataset.Name, roleName) + } + } + return out, nil +} + +func expandRowInheritanceSugar(dataset nativeDataset, columns []string, source map[string]any, row map[string]any) (map[string]any, error) { + spec, ok, err := parseRowInheritanceSpec(source) + if err != nil { + return nil, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + if !ok { + return row, nil + } + + parentKey, err := resolveInheritanceParentKey(row, spec.From) + if err != nil { + return nil, fmt.Errorf("dataset %s: %w", dataset.Name, err) + } + + out := map[string]any{} + for key, value := range row { + out[key] = value + } + delete(out, "inherit") + for _, field := range spec.Fields { + columnName, ok := canonicalColumn(columns, field) + if !ok { + return nil, fmt.Errorf("inherit field %q is not a known column", field) + } + if rowFieldWasAuthored(source, columns, columnName, dataset.Spec) { + continue + } + if current, ok := lookupField(out, columnName); ok && current != nullValue { + continue + } + out[columnName] = map[string]any{ + "ref": parentKey, + "field": columnName, + } + } + return out, nil +} + +type rowInheritanceSpec struct { + From string + Fields []string +} + +type genericInheritanceSpec struct { + Ref string + Field string +} + +func parseRowInheritanceSpec(source map[string]any) (rowInheritanceSpec, bool, error) { + raw, ok := source["inherit"] + if !ok { + return rowInheritanceSpec{}, false, nil + } + obj, ok := raw.(map[string]any) + if !ok { + return rowInheritanceSpec{}, false, fmt.Errorf("inherit must be an object") + } + if _, hasRef := obj["ref"]; hasRef { + if _, hasFrom := obj["from"]; hasFrom { + return rowInheritanceSpec{}, false, fmt.Errorf("inherit cannot mix row sugar (from/fields) with object inheritance (ref)") + } + return rowInheritanceSpec{}, false, nil + } + rawFrom, ok := obj["from"] + if !ok { + return rowInheritanceSpec{}, false, fmt.Errorf("inherit.from is required") + } + from, ok := rawFrom.(string) + if !ok || strings.TrimSpace(from) == "" { + return rowInheritanceSpec{}, false, fmt.Errorf("inherit.from must be a non-empty string") + } + rawFields, ok := obj["fields"] + if !ok { + return rowInheritanceSpec{}, false, fmt.Errorf("inherit.fields is required") + } + fieldList, ok := rawFields.([]any) + if !ok || len(fieldList) == 0 { + return rowInheritanceSpec{}, false, fmt.Errorf("inherit.fields must be a non-empty array") + } + fields := make([]string, 0, len(fieldList)) + seen := map[string]struct{}{} + for _, rawField := range fieldList { + field, ok := rawField.(string) + if !ok || strings.TrimSpace(field) == "" { + return rowInheritanceSpec{}, false, fmt.Errorf("inherit.fields must contain non-empty strings") + } + normalized := strings.ToLower(field) + if _, exists := seen[normalized]; exists { + continue + } + seen[normalized] = struct{}{} + fields = append(fields, field) + } + return rowInheritanceSpec{From: from, Fields: fields}, true, nil +} + +func parseGenericInheritanceSpec(source map[string]any) (genericInheritanceSpec, bool, error) { + raw, ok := source["inherit"] + if !ok { + return genericInheritanceSpec{}, false, nil + } + obj, ok := raw.(map[string]any) + if !ok { + return genericInheritanceSpec{}, false, fmt.Errorf("inherit must be an object") + } + if _, hasFrom := obj["from"]; hasFrom { + if _, hasRef := obj["ref"]; hasRef { + return genericInheritanceSpec{}, false, fmt.Errorf("inherit cannot mix row sugar (from/fields) with object inheritance (ref)") + } + return genericInheritanceSpec{}, false, nil + } + rawRef, ok := obj["ref"] + if !ok { + return genericInheritanceSpec{}, false, fmt.Errorf("inherit.ref is required") + } + ref, ok := rawRef.(string) + if !ok || strings.TrimSpace(ref) == "" { + return genericInheritanceSpec{}, false, fmt.Errorf("inherit.ref must be a non-empty string") + } + spec := genericInheritanceSpec{Ref: strings.TrimSpace(ref)} + if rawField, ok := obj["field"]; ok { + field, ok := rawField.(string) + if !ok || strings.TrimSpace(field) == "" { + return genericInheritanceSpec{}, false, fmt.Errorf("inherit.field must be a non-empty string when present") + } + spec.Field = strings.TrimSpace(field) + } + return spec, true, nil +} + +func resolveInheritanceParentKey(row map[string]any, from string) (string, error) { + value, ok := lookupField(row, from) + if !ok { + return "", fmt.Errorf("inherit.from field %q was not found on row", from) + } + switch typed := value.(type) { + case string: + if strings.Contains(typed, ":") { + return typed, nil + } + case map[string]any: + if rawID, ok := typed["id"]; ok { + if key, ok := rawID.(string); ok && strings.Contains(key, ":") { + return key, nil + } + } + if rawRef, ok := typed["ref"]; ok { + if key, ok := rawRef.(string); ok && strings.Contains(key, ":") { + if _, hasField := typed["field"]; !hasField { + return key, nil + } + } + } + } + return "", fmt.Errorf("inherit.from field %q must resolve to a keyed parent row reference", from) +} + +func (r *valueResolver) resolveInheritedObject(ownerRow map[string]any, identity string, obj map[string]any, stack []string) (map[string]any, error) { + spec, ok, err := parseGenericInheritanceSpec(obj) + if err != nil { + return nil, err + } + + out := map[string]any{} + for key, value := range obj { + if key == "inherit" { + continue + } + out[key] = cloneAuthoringValue(value) + } + if !ok { + return out, nil + } + + marker := "inherit:" + identity + for _, existing := range stack { + if existing == marker { + return nil, fmt.Errorf("cyclic inheritance detected at %s", identity) + } + } + + parent, err := r.resolveGenericInheritanceTarget(ownerRow, spec, append(stack, marker)) + if err != nil { + return nil, err + } + return mergeInheritedMaps(parent, out), nil +} + +func (r *valueResolver) resolveGenericInheritanceTarget(ownerRow map[string]any, spec genericInheritanceSpec, stack []string) (map[string]any, error) { + targetRow, ok := r.rowByKey[spec.Ref] + if !ok { + return nil, fmt.Errorf("inherit target %q was not found", spec.Ref) + } + if spec.Field == "" { + return r.resolveInheritedObject(targetRow, spec.Ref, targetRow, stack) + } + value, ok := lookupField(targetRow, spec.Field) + if !ok { + return nil, fmt.Errorf("inherit target field %q was not found on %s", spec.Field, spec.Ref) + } + targetObj, ok := value.(map[string]any) + if !ok { + return nil, fmt.Errorf("inherit target %s.%s must resolve to an object", spec.Ref, spec.Field) + } + return r.resolveInheritedObject(targetRow, spec.Ref+"."+spec.Field, targetObj, stack) +} + +func mergeInheritedMaps(parent, local map[string]any) map[string]any { + out := map[string]any{} + for key, value := range parent { + out[key] = cloneAuthoringValue(value) + } + for key, value := range local { + if key == "inherit" { + continue + } + parentValue, hasParent := out[key] + if !hasParent { + out[key] = cloneAuthoringValue(value) + continue + } + out[key] = mergeInheritedValues(parentValue, value) + } + return out +} + +func mergeInheritedValues(parent, local any) any { + if isNullLike(local) { + return cloneAuthoringValue(parent) + } + localMap, localIsMap := local.(map[string]any) + parentMap, parentIsMap := parent.(map[string]any) + if localIsMap && parentIsMap && !isAtomicAuthoringMap(localMap) && !isAtomicAuthoringMap(parentMap) { + return mergeInheritedMaps(parentMap, localMap) + } + return cloneAuthoringValue(local) +} + +func isAtomicAuthoringMap(value map[string]any) bool { + for _, key := range []string{"tlk", "ref", "id", "table"} { + if _, ok := value[key]; ok { + return true + } + } + return false +} + +func cloneAuthoringValue(value any) any { + switch typed := value.(type) { + case map[string]any: + out := map[string]any{} + for key, item := range typed { + out[key] = cloneAuthoringValue(item) + } + return out + case []any: + out := make([]any, 0, len(typed)) + for _, item := range typed { + out = append(out, cloneAuthoringValue(item)) + } + return out + default: + return typed + } +} + +func rowFieldWasAuthored(source map[string]any, columns []string, field string, spec datasetTextSpec) bool { + if _, ok := source[field]; ok { + return true + } + for key := range source { + if canonical, ok := canonicalColumn(columns, key); ok && canonical == field { + return true + } + } + rawTLK, ok := source["_tlk"].(map[string]any) + if !ok { + return false + } + for roleName := range rawTLK { + var role textRole + switch strings.ToLower(roleName) { + case "name": + role = textRoleName + case "description": + role = textRoleDescription + default: + continue + } + column := columnForRole(columns, spec, role) + if column == field { + return true + } + } + return false +} + +func resolveOverrideTarget(datasetName string, override map[string]any, rowByID map[int]map[string]any, rowByKey map[string]map[string]any) (map[string]any, error) { + if rawID, ok := override["id"]; ok { + rowID, err := asInt(rawID) + if err != nil { + return nil, fmt.Errorf("dataset %s: override id %v is not numeric", datasetName, rawID) + } + row, ok := rowByID[rowID] + if !ok { + return nil, fmt.Errorf("dataset %s: override target id %d was not found", datasetName, rowID) + } + return row, nil + } + if rawKey, ok := override["key"]; ok { + key, ok := rawKey.(string) + if !ok || key == "" { + return nil, fmt.Errorf("dataset %s: override key must be a string", datasetName) + } + if key != "" { + row, ok := rowByKey[key] + if ok { + return row, nil + } + return nil, fmt.Errorf("dataset %s: override target key %q was not found", datasetName, key) + } + } + return nil, fmt.Errorf("dataset %s: override must specify id or key", datasetName) +} + +func updateOverrideRowKey(row map[string]any, expanded map[string]any, rowByKey map[string]map[string]any, lockData map[string]int) bool { + oldKey, _ := row["key"].(string) + newKeyValue, hasKey := expanded["key"] + if !hasKey { + return false + } + rowID, _ := row["id"].(int) + changed := false + if oldKey != "" { + if mapped, ok := rowByKey[oldKey]; ok { + mappedID, mappedHasID := mapped["id"].(int) + rowHasID := rowID != 0 || row["id"] != nil + if mappedHasID && rowHasID && mappedID == rowID { + delete(rowByKey, oldKey) + } + } + } + if newKeyValue == nil { + delete(row, "key") + if oldKey != "" { + delete(lockData, oldKey) + changed = true + } + return changed + } + newKey, ok := newKeyValue.(string) + if !ok || newKey == "" { + delete(row, "key") + if oldKey != "" { + delete(lockData, oldKey) + changed = true + } + return changed + } + if conflicting, ok := rowByKey[newKey]; ok && conflicting != nil { + conflictingID, conflictingHasID := conflicting["id"].(int) + rowHasID := rowID != 0 || row["id"] != nil + if !conflictingHasID || !rowHasID || conflictingID != rowID { + delete(conflicting, "key") + changed = true + } + } + row["key"] = newKey + rowByKey[newKey] = row + if oldKey != "" && oldKey != newKey { + delete(lockData, oldKey) + changed = true + } + if existingID, ok := lockData[newKey]; !ok || existingID != rowID { + lockData[newKey] = rowID + changed = true + } + return changed +} + +func normalizeCollectedSpellImpactScripts(rows []map[string]any, baseRowKeys map[string]struct{}) { + for _, row := range rows { + rowKey, ok := row["key"].(string) + if !ok || rowKey == "" { + continue + } + if _, ok := baseRowKeys[rowKey]; ok { + continue + } + rowID, ok := row["id"].(int) + if !ok { + continue + } + row["ImpactScript"] = fmt.Sprintf("ss_%d", rowID) + } +} + +func write2DA(data map[string]any, path string, denseRows bool) error { + columns, ok := data["columns"].([]string) + if !ok { + return fmt.Errorf("2da columns must be []string") + } + rows, ok := data["rows"].([]map[string]any) + if !ok { + return fmt.Errorf("2da rows must be []map[string]any") + } + + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return fmt.Errorf("create 2da output parent: %w", err) + } + + var builder strings.Builder + builder.WriteString("2DA V2.0\n\n") + builder.WriteString(strings.Join(columns, "\t")) + builder.WriteByte('\n') + nextID := 0 + for _, row := range rows { + rowID := row["id"].(int) + if denseRows { + for nextID < rowID { + builder.WriteString(strconv.Itoa(nextID)) + for range columns { + builder.WriteByte('\t') + builder.WriteString(nullValue) + } + builder.WriteByte('\n') + nextID++ + } + } + builder.WriteString(strconv.Itoa(rowID)) + for _, column := range columns { + builder.WriteByte('\t') + builder.WriteString(format2DAValue(row[column])) + } + builder.WriteByte('\n') + if denseRows { + nextID = rowID + 1 + } + } + return os.WriteFile(path, []byte(builder.String()), 0o644) +} + +func format2DAValue(value any) string { + switch typed := value.(type) { + case nil: + return nullValue + case string: + if typed == nullValue { + return typed + } + if strings.ContainsAny(typed, " \t\r\n") { + return strconv.Quote(typed) + } + return typed + case int: + return strconv.Itoa(typed) + case float64: + if typed == float64(int64(typed)) { + return strconv.FormatInt(int64(typed), 10) + } + return strconv.FormatFloat(typed, 'f', -1, 64) + case bool: + if typed { + return "1" + } + return "0" + default: + raw, err := json.Marshal(typed) + if err != nil { + return fmt.Sprint(typed) + } + text := string(raw) + if strings.ContainsAny(text, " \t\r\n") { + return strconv.Quote(text) + } + return text + } +} + +func outputStem(outputName string) string { + return strings.TrimSuffix(outputName, filepath.Ext(outputName)) +} + +func loadJSONObject(path string) (map[string]any, error) { + raw, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("read %s: %w", path, err) + } + var payload any + if err := json.Unmarshal(raw, &payload); err != nil { + return nil, fmt.Errorf("parse %s: %w", path, err) + } + obj, ok := payload.(map[string]any) + if !ok { + return nil, fmt.Errorf("%s must contain a JSON object", path) + } + return obj, nil +} + +func loadLockfile(path string) (map[string]int, error) { + lockData := map[string]int{} + if _, err := os.Stat(path); err != nil { + if errors.Is(err, os.ErrNotExist) { + return lockData, nil + } + return nil, err + } + + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + for key, value := range obj { + rowID, err := asInt(value) + if err != nil { + return nil, fmt.Errorf("lock entry %q is not numeric", key) + } + lockData[key] = rowID + } + return lockData, nil +} + +func saveLockfile(path string, lockData map[string]int) error { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return fmt.Errorf("create lockfile parent: %w", err) + } + raw, err := json.MarshalIndent(lockData, "", " ") + if err != nil { + return fmt.Errorf("marshal lockfile: %w", err) + } + raw = append(raw, '\n') + if err := os.WriteFile(path, raw, 0o644); err != nil { + return fmt.Errorf("write lockfile %s: %w", path, err) + } + return nil +} + +func loadLegacyTLK(root string) (*legacyTLKData, error) { + info, err := os.Stat(root) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + if !info.IsDir() { + return nil, fmt.Errorf("legacy tlk root must be a directory: %s", root) + } + + result := &legacyTLKData{ + Language: "en", + Entries: map[string]tlkEntryData{}, + Lock: map[string]int{}, + } + + lockPath := filepath.Join(root, "lock.json") + lockData, err := loadLockfile(lockPath) + if err != nil && !os.IsNotExist(err) { + return nil, err + } + for key, id := range lockData { + result.Lock[key] = id + } + + basePath := filepath.Join(root, "base.json") + if _, err := os.Stat(basePath); err == nil { + base, err := loadJSONObject(basePath) + if err != nil { + return nil, err + } + if language, ok := base["language"].(string); ok && language != "" { + result.Language = language + } + if entries, ok := base["entries"].(map[string]any); ok { + normalized, err := normalizeLegacyTLKEntries(entries) + if err != nil { + return nil, err + } + for key, entry := range normalized { + result.Entries[key] = entry + } + } + } + + modulesDir := filepath.Join(root, "modules") + modulePaths, err := collectModulePaths(modulesDir) + if err != nil { + if os.IsNotExist(err) { + return result, nil + } + return nil, err + } + for _, path := range modulePaths { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + entries, ok := obj["entries"].(map[string]any) + if !ok { + continue + } + normalized, err := normalizeLegacyTLKEntries(entries) + if err != nil { + return nil, fmt.Errorf("%s: %w", path, err) + } + for key, entry := range normalized { + result.Entries[key] = entry + } + } + return result, nil +} + +func normalizeLegacyTLKEntries(entries map[string]any) (map[string]tlkEntryData, error) { + normalized := map[string]tlkEntryData{} + for _, key := range sortedKeys(entries) { + value := entries[key] + switch typed := value.(type) { + case string: + normalized[key] = tlkEntryData{Text: typed} + case map[string]any: + if shouldExpandLegacyKey(key, typed) { + for _, subKey := range sortedKeys(typed) { + subObj, ok := typed[subKey].(map[string]any) + if !ok { + continue + } + entry, err := parseLegacyTLKLeaf(subObj) + if err != nil { + return nil, err + } + normalized[key+"."+subKey] = entry + } + continue + } + entry, err := parseLegacyTLKLeaf(typed) + if err != nil { + return nil, err + } + normalized[key] = entry + default: + return nil, fmt.Errorf("legacy TLK entry %q must be an object or string", key) + } + } + return normalized, nil +} + +func shouldExpandLegacyKey(key string, obj map[string]any) bool { + if strings.Contains(key[strings.LastIndex(key, ":")+1:], ".") { + return false + } + for _, value := range obj { + if _, ok := value.(map[string]any); ok { + return true + } + } + return false +} + +func parseLegacyTLKLeaf(obj map[string]any) (tlkEntryData, error) { + entry := tlkEntryData{} + if rawText, ok := obj["text"]; ok { + text, ok := rawText.(string) + if !ok { + return entry, fmt.Errorf("legacy TLK text must be a string") + } + entry.Text = text + } + if rawSound, ok := obj["sound_resref"]; ok { + sound, ok := rawSound.(string) + if !ok { + return entry, fmt.Errorf("legacy TLK sound_resref must be a string") + } + entry.SoundResRef = sound + } + if rawLength, ok := obj["sound_length"]; ok { + switch typed := rawLength.(type) { + case float64: + entry.SoundLength = float32(typed) + case int: + entry.SoundLength = float32(typed) + default: + return entry, fmt.Errorf("legacy TLK sound_length must be numeric") + } + } + return entry, nil +} + +func collectModulePaths(modulesDir string) ([]string, error) { + if _, err := os.Stat(modulesDir); err != nil { + if errors.Is(err, os.ErrNotExist) { + return nil, nil + } + return nil, err + } + var paths []string + err := filepath.WalkDir(modulesDir, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + if strings.HasSuffix(strings.ToLower(d.Name()), ".json") { + paths = append(paths, path) + } + return nil + }) + if err != nil { + return nil, err + } + slices.Sort(paths) + return paths, nil +} + +func canonicalColumn(columns []string, name string) (string, bool) { + for _, column := range columns { + if strings.EqualFold(column, name) { + return column, true + } + } + return "", false +} + +func optionalBool(value any, fallback bool) bool { + switch typed := value.(type) { + case bool: + return typed + case nil: + return fallback + default: + return fallback + } +} + +func asInt(value any) (int, error) { + switch typed := value.(type) { + case int: + return typed, nil + case int64: + return int(typed), nil + case float64: + return int(typed), nil + case json.Number: + n, err := typed.Int64() + return int(n), err + case string: + return strconv.Atoi(typed) + default: + return 0, fmt.Errorf("not an int") + } +} + +func nextAvailableID(used map[int]struct{}) int { + next := 0 + for { + if _, ok := used[next]; !ok { + return next + } + next++ + } +} + +func hasJSONFiles(root string) (bool, error) { + found := false + err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + if strings.HasSuffix(strings.ToLower(d.Name()), ".json") { + found = true + return fs.SkipAll + } + return nil + }) + if err != nil && !errors.Is(err, fs.SkipAll) { + return false, err + } + return found, nil +} + +func collectReferenceLockIDs(root string) (map[string]int, error) { + result := map[string]int{} + if _, err := os.Stat(root); err != nil { + if os.IsNotExist(err) { + return result, nil + } + return nil, err + } + err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() || d.Name() != "lock.json" { + return nil + } + lockData, err := loadLockfile(path) + if err != nil { + return err + } + for key, rowID := range lockData { + if _, exists := result[key]; !exists { + result[key] = rowID + } + } + return nil + }) + if err != nil { + return nil, err + } + return result, nil +} + +func collectSupplementalLockIDs(sourceDir, referenceBuilderDir string) (map[string]int, error) { + result := map[string]int{} + snapshotIDs, err := collectReferenceLockIDs(filepath.Join(sourceDir, "migration_snapshot", "data")) + if err != nil { + return nil, err + } + for key, rowID := range snapshotIDs { + result[key] = rowID + } + if strings.TrimSpace(referenceBuilderDir) == "" { + return result, nil + } + referenceIDs, err := collectReferenceLockIDs(filepath.Join(referenceBuilderDir, "data")) + if err != nil { + return nil, err + } + for key, rowID := range referenceIDs { + if _, ok := result[key]; ok { + continue + } + result[key] = rowID + } + return result, nil +} diff --git a/internal/topdata/parts_discovery.go b/internal/topdata/parts_discovery.go new file mode 100644 index 0000000..224c57b --- /dev/null +++ b/internal/topdata/parts_discovery.go @@ -0,0 +1,428 @@ +package topdata + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "regexp" + "slices" + "strconv" + "strings" +) + +// supportedPartCategories defines the part types that should be auto-discovered +// from the sow-assets repository. +var supportedPartCategories = []string{ + "belt", + "bicep", + "chest", + "foot", + "forearm", + "leg", + "neck", + "pelvis", + "robe", + "shin", + "shoulder", +} + +var partDatasetToAssetCategory = map[string]string{ + "belt": "belt", + "bicep": "bicep", + "chest": "chest", + "foot": "foot", + "forearm": "forearm", + "legs": "leg", + "neck": "neck", + "pelvis": "pelvis", + "robe": "robe", + "shin": "shin", + "shoulder": "shoulder", +} + +// trailingNumberRegex matches trailing digits at the end of a string +var trailingNumberRegex = regexp.MustCompile(`(\d+)$`) + +// isPartsDataset checks if a dataset name corresponds to a parts dataset +func isPartsDataset(datasetName string) bool { + // Check if the dataset is under parts/ directory + if strings.HasPrefix(datasetName, "parts/") { + return true + } + // Check if it's exactly a parts file (e.g., "parts/belt") + parts := strings.Split(datasetName, "/") + if len(parts) == 2 && parts[0] == "parts" { + return true + } + return false +} + +// extractPartCategory extracts the part category from a dataset name +// e.g., "parts/belt" -> "belt", "parts/bicep" -> "bicep" +func extractPartCategory(datasetName string) string { + parts := strings.Split(datasetName, "/") + if len(parts) >= 2 { + return parts[len(parts)-1] + } + return "" +} + +func partAssetCategoryForDataset(datasetName string) string { + category := extractPartCategory(datasetName) + if mapped, ok := partDatasetToAssetCategory[category]; ok { + return mapped + } + return category +} + +// isSupportedPartCategory checks if the given category is in the supported list +func isSupportedPartCategory(category string) bool { + for _, c := range supportedPartCategories { + if c == category { + return true + } + } + return false +} + +// extractTrailingNumericSuffix extracts the trailing numeric suffix from a filename stem +// e.g., "pfa0_belt018" -> 18, "pfa0_belt171" -> 171 +// Returns 0 and false if no trailing numeric suffix is found +func extractTrailingNumericSuffix(filenameStem string) (int, bool) { + matches := trailingNumberRegex.FindStringSubmatch(filenameStem) + if len(matches) < 2 { + return 0, false + } + num, err := strconv.Atoi(matches[1]) + if err != nil { + return 0, false + } + return num, true +} + +// DiscoveredPartModel represents a discovered model file with its row ID +type DiscoveredPartModel struct { + RowID int + Filename string +} + +// DiscoverPartModels scans the assets/part directory for .mdl files +// and returns a map of rowID -> default row data for the given category. +// The assetsDir should be the root assets directory (containing the part/ subdirectory). +func DiscoverPartModels(assetsDir string, category string) (map[int]*DiscoveredPartModel, error) { + result := make(map[int]*DiscoveredPartModel) + + if !isSupportedPartCategory(category) { + return result, nil + } + + partRoot, err := resolvePartsRoot(assetsDir) + if err != nil { + return nil, err + } + if partRoot == "" { + return result, nil + } + + // Construct the path to the part category directory + partDir := filepath.Join(partRoot, category) + + // Check if the directory exists + info, err := os.Stat(partDir) + if err != nil { + if os.IsNotExist(err) { + return result, nil + } + return nil, fmt.Errorf("failed to access part directory %s: %w", partDir, err) + } + if !info.IsDir() { + return nil, fmt.Errorf("part directory %s is not a directory", partDir) + } + + // Walk the directory and find .mdl files + err = filepath.Walk(partDir, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + if info.IsDir() { + return nil + } + + // Only process .mdl files + if !strings.HasSuffix(strings.ToLower(info.Name()), ".mdl") { + return nil + } + + // Extract the filename stem (without extension) + filenameStem := strings.TrimSuffix(info.Name(), filepath.Ext(info.Name())) + + // Extract trailing numeric suffix + rowID, hasSuffix := extractTrailingNumericSuffix(filenameStem) + if !hasSuffix { + return nil + } + + // Store the discovered model + if existing, ok := result[rowID]; ok { + // If we already have this row ID, keep the first one found (alphabetically) + if path < existing.Filename { + result[rowID] = &DiscoveredPartModel{ + RowID: rowID, + Filename: path, + } + } + } else { + result[rowID] = &DiscoveredPartModel{ + RowID: rowID, + Filename: path, + } + } + + return nil + }) + + if err != nil { + return nil, fmt.Errorf("failed to scan part directory %s: %w", partDir, err) + } + + return result, nil +} + +// CreateDefaultPartRow creates a default row for a discovered part model +func CreateDefaultPartRow(rowID int) map[string]any { + return map[string]any{ + "id": rowID, + "COSTMODIFIER": "0", + "ACBONUS": "0.00", + } +} + +func isUnsetPartValue(value any) bool { + switch typed := value.(type) { + case nil: + return true + case string: + return typed == "" || typed == "****" + } + return false +} + +func resolvePartsRoot(root string) (string, error) { + if strings.TrimSpace(root) == "" { + return "", nil + } + candidates := []string{ + filepath.Join(root, "assets", "parts"), + filepath.Join(root, "assets", "part"), + filepath.Join(root, "parts"), + filepath.Join(root, "part"), + } + for _, candidate := range candidates { + info, err := os.Stat(candidate) + if err == nil && info.IsDir() { + return candidate, nil + } + if err != nil && !os.IsNotExist(err) { + return "", fmt.Errorf("failed to access parts root %s: %w", candidate, err) + } + } + return "", nil +} + +// scanAutogeneratedParts scans the assets/part directory for all supported part categories +// and returns a map of category -> set of row IDs that should be auto-generated. +// The assetsDir parameter should be the path to the assets directory that contains the part/ subdirectory. +func scanAutogeneratedParts(assetsDir string) (map[string]map[int]struct{}, error) { + if assetsDir == "" { + return nil, nil + } + + result := make(map[string]map[int]struct{}) + + for _, category := range supportedPartCategories { + discovered, err := DiscoverPartModels(assetsDir, category) + if err != nil { + return nil, err + } + // Always include the category, even if no IDs were discovered + ids := make(map[int]struct{}, len(discovered)) + for rowID := range discovered { + ids[rowID] = struct{}{} + } + result[category] = ids + } + + return result, nil +} + +func loadPartOverrides(path string) ([]map[string]any, error) { + if _, err := os.Stat(path); err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + rawOverrides, ok := obj["overrides"] + if !ok { + return nil, nil + } + overrideList, ok := rawOverrides.([]any) + if !ok { + return nil, fmt.Errorf("%s: overrides must be an array", path) + } + overrides := make([]map[string]any, 0, len(overrideList)) + for index, rawOverride := range overrideList { + override, ok := rawOverride.(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: override %d must be an object", path, index) + } + overrides = append(overrides, override) + } + return overrides, nil +} + +func applyPartOverrides(sourceDir string, collected []nativeCollectedDataset) ([]nativeCollectedDataset, error) { + result := make([]nativeCollectedDataset, len(collected)) + copy(result, collected) + for i, dataset := range result { + if !strings.HasPrefix(dataset.Dataset.Name, "parts/") { + continue + } + category := extractPartCategory(dataset.Dataset.Name) + if category == "" { + continue + } + overridePath := filepath.Join(sourceDir, "data", "parts", "overrides", category+".json") + overrides, err := loadPartOverrides(overridePath) + if err != nil { + return nil, err + } + if len(overrides) == 0 { + continue + } + + rows := make([]map[string]any, len(dataset.Rows)) + rowByID := make(map[int]map[string]any, len(dataset.Rows)) + for index, row := range dataset.Rows { + cloned := cloneRowMap(row) + rows[index] = cloned + if rowID, ok := cloned["id"].(int); ok { + rowByID[rowID] = cloned + } + } + + for index, override := range overrides { + rawID, ok := override["id"] + if !ok { + return nil, fmt.Errorf("%s: override %d is missing id", overridePath, index) + } + rowID, err := asInt(rawID) + if err != nil { + return nil, fmt.Errorf("%s: override %d id is not numeric", overridePath, index) + } + row, ok := rowByID[rowID] + if !ok { + row = CreateDefaultPartRow(rowID) + rows = append(rows, row) + rowByID[rowID] = row + } + for field, value := range override { + if field == "id" { + continue + } + row[field] = normalizePartOverrideValue(value) + } + } + + slices.SortFunc(rows, func(a, b map[string]any) int { + idA := a["id"].(int) + idB := b["id"].(int) + return idA - idB + }) + result[i].Rows = rows + } + return result, nil +} + +func normalizePartOverrideValue(value any) any { + switch typed := value.(type) { + case float64: + if typed == float64(int(typed)) { + return strconv.Itoa(int(typed)) + } + case int: + return strconv.Itoa(typed) + case json.Number: + return typed.String() + } + return value +} + +// augmentWithAutogeneratedParts applies repository-backed discovery defaults. +// Missing discovered IDs are added with default values. Existing discovered rows +// retain authored values unless they still use placeholder values, in which case +// discovery activates them with engine-visible defaults. +func augmentWithAutogeneratedParts(collected []nativeCollectedDataset, autogenerated map[string]map[int]struct{}) []nativeCollectedDataset { + if len(autogenerated) == 0 { + return collected + } + + result := make([]nativeCollectedDataset, len(collected)) + copy(result, collected) + + for i, dataset := range collected { + category := partAssetCategoryForDataset(dataset.Dataset.Name) + if !isSupportedPartCategory(category) { + continue + } + + ids, ok := autogenerated[category] + if !ok || len(ids) == 0 { + continue + } + + // Build a map of existing row IDs. + existingRows := make(map[int]map[string]any, len(dataset.Rows)) + for _, row := range dataset.Rows { + if id, ok := row["id"].(int); ok { + existingRows[id] = row + } + } + + // Add rows for discovered IDs that don't already exist + newRows := make([]map[string]any, 0, len(dataset.Rows)) + newRows = append(newRows, dataset.Rows...) + + for rowID := range ids { + if row, exists := existingRows[rowID]; exists { + if isUnsetPartValue(row["COSTMODIFIER"]) { + row["COSTMODIFIER"] = "0" + } + if isUnsetPartValue(row["ACBONUS"]) { + row["ACBONUS"] = "0.00" + } + continue + } + if _, exists := existingRows[rowID]; !exists { + newRow := CreateDefaultPartRow(rowID) + newRows = append(newRows, newRow) + } + } + + // Sort rows by ID + slices.SortFunc(newRows, func(a, b map[string]any) int { + idA := a["id"].(int) + idB := b["id"].(int) + return idA - idB + }) + + result[i].Rows = newRows + } + + return result +} diff --git a/internal/topdata/placeables_migrate.go b/internal/topdata/placeables_migrate.go new file mode 100644 index 0000000..2535307 --- /dev/null +++ b/internal/topdata/placeables_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacyPlaceables(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "placeables", "placeables.2da", nil) +} diff --git a/internal/topdata/portraits_migrate.go b/internal/topdata/portraits_migrate.go new file mode 100644 index 0000000..45c97fc --- /dev/null +++ b/internal/topdata/portraits_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacyPortraits(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "portraits", "portraits.2da", nil) +} diff --git a/internal/topdata/portraits_native.go b/internal/topdata/portraits_native.go new file mode 100644 index 0000000..a88bd1f --- /dev/null +++ b/internal/topdata/portraits_native.go @@ -0,0 +1,223 @@ +package topdata + +import ( + "fmt" + "slices" + "strings" +) + +var portraitColumns = []string{"BaseResRef", "Sex", "Race", "InanimateType", "Plot", "LowGore"} + +func parseRowMetadata(raw any) (map[string]any, error) { + if raw == nil { + return nil, nil + } + obj, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("meta must be an object") + } + if len(obj) == 0 { + return map[string]any{}, nil + } + + meta := make(map[string]any, len(obj)) + for key, value := range obj { + switch normalizeMetadataKey(key) { + case "family": + family, err := parseFamilyMetadata(value) + if err != nil { + return nil, fmt.Errorf("meta.family: %w", err) + } + meta["family"] = family + case "wiki": + wiki, err := parseWikiMetadata(value) + if err != nil { + return nil, fmt.Errorf("meta.wiki: %w", err) + } + if len(wiki) > 0 { + meta["wiki"] = wiki + } + case "portrait": + portrait, err := parsePortraitMetadata(value) + if err != nil { + return nil, fmt.Errorf("meta.portrait: %w", err) + } + meta["portrait"] = portrait + default: + return nil, fmt.Errorf("unknown metadata key %q", key) + } + } + return meta, nil +} + +func parsePortraitMetadata(raw any) (map[string]any, error) { + obj, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("must be an object") + } + portrait := map[string]any{} + for key, value := range obj { + switch normalizeMetadataKey(key) { + case "resref": + text, ok := value.(string) + if !ok || strings.TrimSpace(text) == "" { + return nil, fmt.Errorf("resref must be a non-empty string") + } + portrait["resref"] = text + case "sex", "race", "inanimate_type", "plot", "low_gore": + portrait[normalizeMetadataKey(key)] = value + default: + return nil, fmt.Errorf("unknown field %q", key) + } + } + if _, ok := portrait["resref"]; !ok { + return nil, fmt.Errorf("resref is required") + } + return portrait, nil +} + +func normalizeMetadataKey(key string) string { + replacer := strings.NewReplacer("-", "_", " ", "_") + return strings.ToLower(replacer.Replace(strings.TrimSpace(key))) +} + +func portraitMetaFromRow(row map[string]any) (map[string]any, bool) { + rawMeta, ok := lookupField(row, "meta") + if !ok { + return nil, false + } + meta, ok := rawMeta.(map[string]any) + if !ok { + return nil, false + } + rawPortrait, ok := meta["portrait"] + if !ok { + return nil, false + } + portrait, ok := rawPortrait.(map[string]any) + if !ok { + return nil, false + } + return portrait, true +} + +func mergePortraitMetadata(collected []nativeCollectedDataset) ([]nativeCollectedDataset, error) { + portraitIndex := -1 + for i, dataset := range collected { + if dataset.Dataset.OutputName == "portraits.2da" || dataset.Dataset.Name == "portraits" { + portraitIndex = i + break + } + } + if portraitIndex < 0 { + return collected, nil + } + + portraits := collected[portraitIndex] + if len(portraits.Columns) == 0 { + portraits.Columns = append([]string(nil), portraitColumns...) + } + + rowByResref := map[string]map[string]any{} + usedIDs := map[int]struct{}{} + for _, row := range portraits.Rows { + rowID, ok := row["id"].(int) + if ok { + usedIDs[rowID] = struct{}{} + } + resref, _ := lookupField(row, "BaseResRef") + if text, ok := resref.(string); ok { + rowByResref[text] = row + } + } + for _, rowID := range portraits.LockData { + usedIDs[rowID] = struct{}{} + } + nextID := nextAvailableID(usedIDs) + lockModified := false + + for _, dataset := range collected { + for _, row := range dataset.Rows { + portrait, ok := portraitMetaFromRow(row) + if !ok { + continue + } + resref := portrait["resref"].(string) + target, ok := rowByResref[resref] + if !ok { + lockKey := "portraits:auto:" + resref + rowID, found := portraits.LockData[lockKey] + if !found { + rowID = nextID + portraits.LockData[lockKey] = rowID + lockModified = true + usedIDs[rowID] = struct{}{} + nextID = nextAvailableID(usedIDs) + } + target = map[string]any{ + "id": rowID, + "key": lockKey, + } + for _, column := range portraits.Columns { + target[column] = nullValue + } + target["BaseResRef"] = resref + portraits.Rows = append(portraits.Rows, target) + rowByResref[resref] = target + } + if err := applyPortraitContribution(target, portrait, rowIdentity(dataset.Dataset.Name, row)); err != nil { + return nil, err + } + } + } + + if lockModified && portraits.Dataset.LockPath != "" { + if err := saveLockfile(portraits.Dataset.LockPath, portraits.LockData); err != nil { + return nil, fmt.Errorf("dataset %s: %w", portraits.Dataset.Name, err) + } + } + + slices.SortFunc(portraits.Rows, func(a, b map[string]any) int { + return a["id"].(int) - b["id"].(int) + }) + collected[portraitIndex] = portraits + return collected, nil +} + +func applyPortraitContribution(target map[string]any, portrait map[string]any, source string) error { + mapping := map[string]string{ + "resref": "BaseResRef", + "sex": "Sex", + "race": "Race", + "inanimate_type": "InanimateType", + "plot": "Plot", + "low_gore": "LowGore", + } + for key, value := range portrait { + column, ok := mapping[normalizeMetadataKey(key)] + if !ok { + continue + } + current, _ := lookupField(target, column) + if current == nil || current == nullValue { + target[column] = value + continue + } + if normalizeComparableValue(current) == normalizeComparableValue(value) { + continue + } + return fmt.Errorf("portrait %q conflicts for column %s between existing value %v and contributor %s value %v", portrait["resref"], column, current, source, value) + } + return nil +} + +func normalizeComparableValue(value any) string { + switch typed := value.(type) { + case nil: + return nullValue + case string: + return typed + default: + return format2DAValue(typed) + } +} diff --git a/internal/topdata/progfx_migrate.go b/internal/topdata/progfx_migrate.go new file mode 100644 index 0000000..17ba8ff --- /dev/null +++ b/internal/topdata/progfx_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacyProgfx(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "progfx", "progfx.2da", nil) +} diff --git a/internal/topdata/racialtypes_migrate.go b/internal/topdata/racialtypes_migrate.go new file mode 100644 index 0000000..a012906 --- /dev/null +++ b/internal/topdata/racialtypes_migrate.go @@ -0,0 +1,282 @@ +package topdata + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "slices" + "strings" +) + +type legacyRacialtypesFeatTable struct { + Output string + Rows []map[string]any +} + +func importLegacyRacialtypes(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + if strings.TrimSpace(referenceBuilderDir) == "" { + return 0, nil + } + + legacyCoreDir := filepath.Join(referenceBuilderDir, "data", "racialtypes", "core") + legacyFeatsDir := filepath.Join(referenceBuilderDir, "data", "racialtypes", "feats") + if _, err := os.Stat(legacyCoreDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + if _, err := os.Stat(legacyFeatsDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetRoot := filepath.Join(dataDir, "racialtypes", "registry") + targetBasePath := filepath.Join(targetRoot, "base.json") + targetLockPath := filepath.Join(targetRoot, "lock.json") + targetRacesDir := filepath.Join(targetRoot, "races") + if fileExists(targetBasePath) && fileExists(targetLockPath) { + entries, err := os.ReadDir(targetRacesDir) + if err == nil { + raceFiles := 0 + for _, entry := range entries { + if !entry.IsDir() && strings.HasSuffix(strings.ToLower(entry.Name()), ".json") { + raceFiles++ + } + } + if raceFiles == 16 { + return 0, nil + } + } + } + + baseColumns, baseRows, lockData, raceRows, err := collectLegacyRacialtypesRegistry(legacyCoreDir, legacyFeatsDir, legacyTLK) + if err != nil { + return 0, err + } + + if err := removePathIfExists(filepath.Join(dataDir, "racialtypes", "core")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(dataDir, "racialtypes", "feats")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetRoot, "base_rows.json")); err != nil { + return 0, err + } + if err := removePathIfExists(targetRacesDir); err != nil { + return 0, err + } + if err := os.MkdirAll(targetRacesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj any + }{ + { + path: targetBasePath, + obj: map[string]any{ + "columns": stringSliceToAny(baseColumns), + "rows": rowsToAny(baseRows), + }, + }, + { + path: targetLockPath, + obj: anyMapInt(lockData), + }, + } + + raceKeys := make([]string, 0, len(raceRows)) + for key := range raceRows { + raceKeys = append(raceKeys, key) + } + slices.Sort(raceKeys) + for _, key := range raceKeys { + fileName := strings.TrimPrefix(key, "racialtypes:") + ".json" + writes = append(writes, struct { + path string + obj any + }{ + path: filepath.Join(targetRacesDir, fileName), + obj: raceRows[key], + }) + } + + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} + +func collectLegacyRacialtypesRegistry(coreDir, featsDir string, legacyTLK *legacyTLKData) ([]string, []map[string]any, map[string]int, map[string]map[string]any, error) { + coreCollected, err := collectBaseDataset(nativeDataset{ + Name: "racialtypes", + BasePath: filepath.Join(coreDir, "base.json"), + LockPath: filepath.Join(coreDir, "lock.json"), + ModulesDir: filepath.Join(coreDir, "modules"), + Spec: specForDataset("racialtypes"), + }) + if err != nil { + return nil, nil, nil, nil, err + } + + featTables, err := loadLegacyRacialtypesFeatTables(featsDir) + if err != nil { + return nil, nil, nil, nil, err + } + + baseRows := make([]map[string]any, 0) + raceRows := map[string]map[string]any{} + lockData := map[string]int{} + for key, id := range coreCollected.LockData { + if strings.HasPrefix(key, "racialtypes:") { + lockData[key] = id + } + } + + for _, collectedRow := range coreCollected.Rows { + row, ok := deepCopyValue(collectedRow).(map[string]any) + if !ok { + continue + } + if legacyTLK != nil { + if _, _, err := inlineLegacyTLKValue(row, legacyTLK); err != nil { + return nil, nil, nil, nil, err + } + } + key, _ := row["key"].(string) + if !strings.HasPrefix(key, "racialtypes:") { + assignRacialtypesBaseRowKey(row) + if key, _ := row["key"].(string); key != "" { + rowID, err := asInt(row["id"]) + if err != nil { + return nil, nil, nil, nil, err + } + lockData[key] = rowID + } + baseRows = append(baseRows, row) + continue + } + + delete(row, "id") + delete(row, "key") + + raceFile := map[string]any{ + "key": key, + "core": row, + } + if tableKey := extractRacialtypesFeatTableKey(row["FeatsTable"]); tableKey != "" { + table, ok := featTables[tableKey] + if !ok { + return nil, nil, nil, nil, fmt.Errorf("%s: unknown feat table %s", key, tableKey) + } + delete(row, "FeatsTable") + raceFile["feat_output"] = table.Output + raceFile["feats"] = rowsToAny(table.Rows) + } + raceRows[key] = raceFile + } + + slices.SortFunc(baseRows, func(a, b map[string]any) int { + left, _ := asInt(a["id"]) + right, _ := asInt(b["id"]) + return left - right + }) + return coreCollected.Columns, baseRows, lockData, raceRows, nil +} + +func loadLegacyRacialtypesFeatTables(featsDir string) (map[string]legacyRacialtypesFeatTable, error) { + entries, err := os.ReadDir(featsDir) + if err != nil { + return nil, err + } + + tables := map[string]legacyRacialtypesFeatTable{} + for _, entry := range entries { + if entry.IsDir() || filepath.Ext(entry.Name()) != ".json" { + continue + } + obj, err := loadJSONObject(filepath.Join(featsDir, entry.Name())) + if err != nil { + return nil, err + } + tableKey, _ := obj["key"].(string) + outputName, _ := obj["output"].(string) + rawRows, ok := obj["rows"].([]any) + if tableKey == "" || outputName == "" || !ok { + return nil, fmt.Errorf("%s: racialtypes feat table must define key, output, and rows", entry.Name()) + } + rows := make([]map[string]any, 0, len(rawRows)) + for index, raw := range rawRows { + row, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: row %d must be an object", entry.Name(), index) + } + rows = append(rows, row) + } + tables[tableKey] = legacyRacialtypesFeatTable{ + Output: outputName, + Rows: rows, + } + } + return tables, nil +} + +func extractRacialtypesFeatTableKey(value any) string { + obj, ok := value.(map[string]any) + if !ok { + return "" + } + tableKey, _ := obj["table"].(string) + return tableKey +} + +func assignRacialtypesBaseRowKey(row map[string]any) { + name, _ := row["Name"].(string) + if strings.TrimSpace(name) == "" || name == nullValue { + delete(row, "key") + return + } + label, _ := row["Label"].(string) + keySuffix := normalizeRacialtypesKeySuffix(label) + if keySuffix == "" { + delete(row, "key") + return + } + row["key"] = "racialtypes:" + keySuffix +} + +func normalizeRacialtypesKeySuffix(label string) string { + normalized := strings.ToLower(strings.TrimSpace(label)) + if normalized == "" { + return "" + } + var b strings.Builder + lastUnderscore := false + for _, ch := range normalized { + isAlphaNum := (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') + if isAlphaNum { + b.WriteRune(ch) + lastUnderscore = false + continue + } + if lastUnderscore { + continue + } + b.WriteByte('_') + lastUnderscore = true + } + return strings.Trim(b.String(), "_") +} diff --git a/internal/topdata/racialtypes_registry.go b/internal/topdata/racialtypes_registry.go new file mode 100644 index 0000000..1584d2a --- /dev/null +++ b/internal/topdata/racialtypes_registry.go @@ -0,0 +1,270 @@ +package topdata + +import ( + "fmt" + "io/fs" + "os" + "path/filepath" + "slices" + "strings" +) + +const ( + racialtypesRegistryDirName = "racialtypes/registry" + racialtypesRegistryLock = "lock.json" +) + +type racialtypesRegistry struct { + RootPath string + LockPath string + LockData map[string]int + BaseColumns []string + BaseRows []map[string]any + Races []map[string]any +} + +func loadRacialtypesRegistry(dataDir string) (*racialtypesRegistry, error) { + root := filepath.Join(dataDir, filepath.FromSlash(racialtypesRegistryDirName)) + info, err := os.Stat(root) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + if !info.IsDir() { + return nil, fmt.Errorf("racialtypes registry root must be a directory: %s", root) + } + + lockPath := filepath.Join(root, racialtypesRegistryLock) + lockData, err := loadLockfile(lockPath) + if err != nil { + return nil, err + } + + basePath := filepath.Join(root, "base.json") + baseObj, err := loadJSONObject(basePath) + if err != nil { + return nil, err + } + baseColumns, err := parseColumns(baseObj, "racialtypes/registry/core") + if err != nil { + return nil, err + } + rawBaseRows, ok := baseObj["rows"].([]any) + if !ok { + return nil, fmt.Errorf("%s: rows must be an array", basePath) + } + baseRows := make([]map[string]any, 0, len(rawBaseRows)) + for index, raw := range rawBaseRows { + row, ok := raw.(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: row %d must be an object", basePath, index) + } + baseRows = append(baseRows, row) + } + + raceRows, err := loadRacialtypesRegistryRaceRows(filepath.Join(root, "races")) + if err != nil { + return nil, err + } + + return &racialtypesRegistry{ + RootPath: root, + LockPath: lockPath, + LockData: lockData, + BaseColumns: baseColumns, + BaseRows: baseRows, + Races: raceRows, + }, nil +} + +func loadRacialtypesRegistryRaceRows(dir string) ([]map[string]any, error) { + info, err := os.Stat(dir) + if err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, err + } + if !info.IsDir() { + return nil, fmt.Errorf("racialtypes registry races path must be a directory: %s", dir) + } + + paths := make([]string, 0) + err = filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + if strings.HasSuffix(strings.ToLower(d.Name()), ".json") { + paths = append(paths, path) + } + return nil + }) + if err != nil { + return nil, err + } + slices.Sort(paths) + + rows := make([]map[string]any, 0, len(paths)) + for _, path := range paths { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + rows = append(rows, obj) + } + return rows, nil +} + +func collectRacialtypesRegistryDatasets(dataDir string) ([]nativeCollectedDataset, error) { + registry, err := loadRacialtypesRegistry(dataDir) + if err != nil { + return nil, err + } + if registry == nil { + return nil, nil + } + + lockModified, err := syncRacialtypesBaseLockData(registry.BaseRows, registry.LockData) + if err != nil { + return nil, err + } + raceIDs, raceLockModified, err := assignRegistryIDs(registry.Races, registry.LockData, "racialtypes:") + if err != nil { + return nil, err + } + lockModified = lockModified || raceLockModified + if lockModified { + if err := saveLockfile(registry.LockPath, registry.LockData); err != nil { + return nil, err + } + } + + coreDataset := nativeDataset{ + Kind: nativeDatasetBase, + Name: "racialtypes/registry/core", + OutputName: "racialtypes.2da", + Spec: specForDataset("racialtypes"), + } + featDataset := nativeDataset{ + Kind: nativeDatasetPlain, + Name: "racialtypes/registry/feats", + Spec: specForDataset("racialtypes"), + } + + coreRows := make([]map[string]any, 0, len(registry.BaseRows)+len(registry.Races)) + rowIDSeen := map[int]string{} + for index, raw := range registry.BaseRows { + row, err := canonicalizeBaseRow(coreDataset, registry.BaseColumns, raw, index) + if err != nil { + return nil, fmt.Errorf("racialtypes registry base row %d: %w", index, err) + } + rowID := row["id"].(int) + if existing, ok := rowIDSeen[rowID]; ok { + return nil, fmt.Errorf("racialtypes registry base row id %d conflicts with %s", rowID, existing) + } + rowIDSeen[rowID] = "base" + coreRows = append(coreRows, row) + } + + datasets := make([]nativeCollectedDataset, 0, 16) + for _, race := range registry.Races { + key := stringField(race, "key") + if key == "" { + return nil, fmt.Errorf("racialtypes registry row is missing key") + } + rowID, ok := raceIDs[key] + if !ok { + return nil, fmt.Errorf("racialtypes registry row %s is missing lock id", key) + } + if existing, ok := rowIDSeen[rowID]; ok { + return nil, fmt.Errorf("racialtypes registry row id %d for %s conflicts with %s", rowID, key, existing) + } + rowIDSeen[rowID] = key + + coreRaw, ok := race["core"].(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: core must be an object", key) + } + row, err := canonicalizeEntry(coreDataset, registry.BaseColumns, rowID, key, coreRaw) + if err != nil { + return nil, fmt.Errorf("%s: %w", key, err) + } + + featOutput, _ := race["feat_output"].(string) + if featOutput != "" { + row["FeatsTable"] = outputStem(featOutput) + } + coreRows = append(coreRows, row) + + if featOutput == "" { + continue + } + rawFeats, ok := race["feats"].([]any) + if !ok { + return nil, fmt.Errorf("%s: feats must be an array when feat_output is set", key) + } + featRows := make([]map[string]any, 0, len(rawFeats)) + for index, rawFeat := range rawFeats { + featRow, ok := rawFeat.(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: feat row %d must be an object", key, index) + } + row, err := canonicalizeBaseRow(featDataset, []string{"FeatLabel", "FeatIndex"}, featRow, index) + if err != nil { + return nil, fmt.Errorf("%s: feat row %d: %w", key, index, err) + } + featRows = append(featRows, row) + } + datasets = append(datasets, newGeneratedDataset( + "racialtypes/registry/"+strings.TrimPrefix(key, "racialtypes:"), + featOutput, + []string{"FeatLabel", "FeatIndex"}, + featRows, + )) + } + + slices.SortFunc(coreRows, func(a, b map[string]any) int { + return a["id"].(int) - b["id"].(int) + }) + slices.SortFunc(datasets, func(a, b nativeCollectedDataset) int { + return strings.Compare(a.Dataset.OutputName, b.Dataset.OutputName) + }) + + coreCollected := newGeneratedDataset("racialtypes/registry/core", "racialtypes.2da", registry.BaseColumns, coreRows) + out := make([]nativeCollectedDataset, 0, len(datasets)+1) + out = append(out, coreCollected) + out = append(out, datasets...) + return out, nil +} + +func syncRacialtypesBaseLockData(rows []map[string]any, lockData map[string]int) (bool, error) { + modified := false + for _, raw := range rows { + key := stringField(raw, "key") + if key == "" { + continue + } + rowID, ok := raw["id"] + if !ok { + return false, fmt.Errorf("racialtypes registry base row %s is missing id", key) + } + id, err := asInt(rowID) + if err != nil { + return false, fmt.Errorf("racialtypes registry base row %s has invalid id: %w", key, err) + } + if existing, ok := lockData[key]; ok { + if existing != id { + return false, fmt.Errorf("racialtypes registry base row %s id %d does not match lock id %d", key, id, existing) + } + continue + } + lockData[key] = id + modified = true + } + return modified, nil +} diff --git a/internal/topdata/repadjust_migrate.go b/internal/topdata/repadjust_migrate.go new file mode 100644 index 0000000..0a3bcc1 --- /dev/null +++ b/internal/topdata/repadjust_migrate.go @@ -0,0 +1,63 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyRepadjust(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "repadjust") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "repadjust") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + if fileExists(targetBasePath) && fileExists(targetLockPath) { + obj, err := loadJSONObject(targetBasePath) + if err == nil && countLegacyTLKRefsInValue(obj) == 0 { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "repadjust.2da" + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + } + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} diff --git a/internal/topdata/ruleset_migrate.go b/internal/topdata/ruleset_migrate.go new file mode 100644 index 0000000..ffb5d0c --- /dev/null +++ b/internal/topdata/ruleset_migrate.go @@ -0,0 +1,171 @@ +package topdata + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "sort" +) + +func importLegacyRuleset(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "ruleset") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "ruleset") + targetPath := filepath.Join(targetDir, "ruleset.json") + if _, err := os.Stat(targetPath); err == nil { + obj, err := loadJSONObject(targetPath) + if err == nil && countLegacyTLKRefsInValue(obj) == 0 { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + rows, err := mergeRulesetRows(baseObj, filepath.Join(legacyDir, "modules")) + if err != nil { + return 0, err + } + + if err := os.MkdirAll(targetDir, 0o755); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "base.json")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "lock.json")); err != nil { + return 0, err + } + if err := removePathIfExists(filepath.Join(targetDir, "modules")); err != nil { + return 0, err + } + + out := map[string]any{ + "output": "ruleset.2da", + "columns": baseObj["columns"], + "rows": rows, + } + raw, err := json.MarshalIndent(out, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(targetPath, raw, 0o644); err != nil { + return 0, err + } + return 1, nil +} + +func mergeRulesetRows(baseObj map[string]any, modulesDir string) ([]any, error) { + rawRows, ok := baseObj["rows"].([]any) + if !ok { + return nil, nil + } + + rows := make([]map[string]any, 0, len(rawRows)) + byLabel := map[string]map[string]any{} + for _, raw := range rawRows { + row, ok := deepCopyValue(raw).(map[string]any) + if !ok { + continue + } + delete(row, "key") + if rawID, ok := row["id"]; ok { + id, err := asInt(rawID) + if err != nil { + return nil, err + } + row["id"] = id + } + if label, ok := row["Label"].(string); ok && label != "" && label != "****" { + if _, exists := byLabel[label]; exists { + return nil, fmt.Errorf("duplicate ruleset label %q", label) + } + byLabel[label] = row + } + rows = append(rows, row) + } + + modulePaths, err := collectModulePaths(modulesDir) + if err != nil { + return nil, err + } + for _, path := range modulePaths { + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + overrideList, ok := obj["overrides"].([]any) + if !ok { + continue + } + for _, raw := range overrideList { + override, ok := raw.(map[string]any) + if !ok { + continue + } + matchObj, ok := override["match"].(map[string]any) + if !ok { + return nil, fmt.Errorf("%s: ruleset override is missing match object", path) + } + rawLabel, ok := matchObj["Label"] + if !ok { + return nil, fmt.Errorf("%s: ruleset override match is missing Label", path) + } + labels, err := normalizeRulesetMatchLabels(rawLabel) + if err != nil { + return nil, fmt.Errorf("%s: %w", path, err) + } + for _, label := range labels { + row, ok := byLabel[label] + if !ok { + return nil, fmt.Errorf("%s: ruleset override target label %q was not found", path, label) + } + for key, value := range override { + if key == "id" || key == "key" || key == "_tlk" || isMetadataField(key) || key == "match" { + continue + } + row[key] = deepCopyValue(value) + } + } + } + } + + sort.Slice(rows, func(i, j int) bool { + return rows[i]["id"].(int) < rows[j]["id"].(int) + }) + out := make([]any, 0, len(rows)) + for _, row := range rows { + out = append(out, row) + } + return out, nil +} + +func normalizeRulesetMatchLabels(raw any) ([]string, error) { + switch typed := raw.(type) { + case string: + return []string{typed}, nil + case []any: + out := make([]string, 0, len(typed)) + for _, item := range typed { + label, ok := item.(string) + if !ok { + return nil, fmt.Errorf("ruleset match.Label entries must be strings") + } + out = append(out, label) + } + return out, nil + default: + return nil, fmt.Errorf("ruleset match.Label must be a string or string array") + } +} diff --git a/internal/topdata/skills_migrate.go b/internal/topdata/skills_migrate.go new file mode 100644 index 0000000..01f168a --- /dev/null +++ b/internal/topdata/skills_migrate.go @@ -0,0 +1,140 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacySkills(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "skills") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "skills") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + moduleNames := []string{ + "add_athletics.json", + "add_disguise.json", + "add_linguistics.json", + "add_perception.json", + "add_scriptcraft.json", + "add_sensemotive.json", + "add_stealth.json", + "add_survival.json", + "add_userope.json", + filepath.Join("craft", "add_craftalchemy.json"), + filepath.Join("craft", "add_craftcooking.json"), + filepath.Join("craft", "add_craftjewelry.json"), + filepath.Join("craft", "add_craftleatherworking.json"), + filepath.Join("craft", "add_craftstonework.json"), + filepath.Join("craft", "add_crafttextiles.json"), + filepath.Join("craft", "ovr_craftarmorsmithing.json"), + filepath.Join("craft", "ovr_crafttinkering.json"), + filepath.Join("craft", "ovr_craftweaponsmithing.json"), + filepath.Join("craft", "ovr_craftwoodworking.json"), + filepath.Join("knowledge", "add_knowledgearcana.json"), + filepath.Join("knowledge", "add_knowledgearchitecture.json"), + filepath.Join("knowledge", "add_knowledgedungeoneering.json"), + filepath.Join("knowledge", "add_knowledgegeography.json"), + filepath.Join("knowledge", "add_knowledgehistory.json"), + filepath.Join("knowledge", "add_knowledgelocal.json"), + filepath.Join("knowledge", "add_knowledgenature.json"), + filepath.Join("knowledge", "add_knowledgenobility.json"), + filepath.Join("knowledge", "add_knowledgeplanar.json"), + filepath.Join("knowledge", "add_knowledgereligion.json"), + "ovr_acrobatics.json", + "ovr_animalhandling.json", + "ovr_appraise.json", + "ovr_concentration.json", + "ovr_disabledevice.json", + "ovr_heal.json", + "ovr_hiddenskills.json", + "ovr_influence.json", + "ovr_openlock.json", + "ovr_parry.json", + "ovr_searchtowis.json", + "ovr_sleightofhand.json", + "ovr_taunttointimidate.json", + "rmv_removedskills.json", + } + targetModulePaths := make([]string, 0, len(moduleNames)) + for _, name := range moduleNames { + targetModulePaths = append(targetModulePaths, filepath.Join(targetModulesDir, name)) + } + if fileExists(targetBasePath) && fileExists(targetLockPath) { + allModulesPresent := true + for _, path := range targetModulePaths { + if !fileExists(path) { + allModulesPresent = false + break + } + } + if allModulesPresent { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "skills.2da" + canonicalizeWikiMetadataDocument(baseObj) + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + moduleObjs := make([]map[string]any, 0, len(moduleNames)) + for _, name := range moduleNames { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", name)) + if err != nil { + return 0, err + } + canonicalizeWikiMetadataDocument(obj) + moduleObjs = append(moduleObjs, obj) + } + + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + } + for i, path := range targetModulePaths { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return 0, err + } + writes = append(writes, struct { + path string + obj map[string]any + }{path: path, obj: moduleObjs[i]}) + } + + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} diff --git a/internal/topdata/skyboxes_migrate.go b/internal/topdata/skyboxes_migrate.go new file mode 100644 index 0000000..6b09eb3 --- /dev/null +++ b/internal/topdata/skyboxes_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacySkyboxes(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "skyboxes", "skyboxes.2da", nil) +} diff --git a/internal/topdata/spells_migrate.go b/internal/topdata/spells_migrate.go new file mode 100644 index 0000000..1dca1f2 --- /dev/null +++ b/internal/topdata/spells_migrate.go @@ -0,0 +1,103 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacySpells(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "spells") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "spells") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + moduleNames := []string{ + "specialattacks.json", + "ovr_fixduplicates.json", + filepath.Join("bardicmusic", "fascinate.json"), + filepath.Join("bardicmusic", "inspirecompetence.json"), + filepath.Join("bardicmusic", "inspirecourage.json"), + filepath.Join("bardicmusic", "inspiregreatness.json"), + filepath.Join("bardicmusic", "inspireheroics.json"), + filepath.Join("bardicmusic", "songoffreedom.json"), + } + targetModulePaths := make([]string, 0, len(moduleNames)) + for _, name := range moduleNames { + targetModulePaths = append(targetModulePaths, filepath.Join(targetModulesDir, name)) + } + if fileExists(targetBasePath) && fileExists(targetLockPath) { + allModulesPresent := true + for _, path := range targetModulePaths { + if !fileExists(path) { + allModulesPresent = false + break + } + } + if allModulesPresent { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "spells.2da" + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + moduleObjs := make([]map[string]any, 0, len(moduleNames)) + for _, name := range moduleNames { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", name)) + if err != nil { + return 0, err + } + moduleObjs = append(moduleObjs, obj) + } + + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + } + for i, path := range targetModulePaths { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return 0, err + } + writes = append(writes, struct { + path string + obj map[string]any + }{path: path, obj: moduleObjs[i]}) + } + + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} diff --git a/internal/topdata/tailmodel_migrate.go b/internal/topdata/tailmodel_migrate.go new file mode 100644 index 0000000..4c44ee9 --- /dev/null +++ b/internal/topdata/tailmodel_migrate.go @@ -0,0 +1,86 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyTailmodel(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "tailmodel") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "tailmodel") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + targetModulePaths := []string{ + filepath.Join(targetModulesDir, "add.json"), + filepath.Join(targetModulesDir, "ovr_tailprefixes.json"), + } + if fileExists(targetBasePath) && fileExists(targetLockPath) { + allModulesPresent := true + for _, path := range targetModulePaths { + if !fileExists(path) { + allModulesPresent = false + break + } + } + if allModulesPresent { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "tailmodel.2da" + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + moduleNames := []string{"add.json", "ovr_tailprefixes.json"} + moduleObjs := make([]map[string]any, 0, len(moduleNames)) + for _, name := range moduleNames { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", name)) + if err != nil { + return 0, err + } + moduleObjs = append(moduleObjs, obj) + } + + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + {path: targetModulePaths[0], obj: moduleObjs[0]}, + {path: targetModulePaths[1], obj: moduleObjs[1]}, + } + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +} diff --git a/internal/topdata/tlk_native.go b/internal/topdata/tlk_native.go new file mode 100644 index 0000000..90efa34 --- /dev/null +++ b/internal/topdata/tlk_native.go @@ -0,0 +1,647 @@ +package topdata + +import ( + "encoding/binary" + "encoding/json" + "fmt" + "math" + "os" + "path/filepath" + "slices" + "strings" + + "golang.org/x/text/encoding/charmap" +) + +const ( + defaultTLKName = "sow_tlk.tlk" + tlkStateFile = ".tlk_state.json" + customTLKBase = 0x01000000 +) + +type textRole string + +const ( + textRoleName textRole = "name" + textRoleDescription textRole = "description" +) + +type datasetTextSpec struct { + NameFields []string + DescriptionFields []string +} + +var datasetTextSpecs = map[string]datasetTextSpec{ + "baseitems": { + NameFields: []string{"Name"}, + DescriptionFields: []string{"Description"}, + }, + "classes": { + NameFields: []string{"Short", "Name", "Plural", "Lower", "CLASS"}, + DescriptionFields: []string{"Description"}, + }, + "feat": { + NameFields: []string{"FEAT"}, + DescriptionFields: []string{"DESCRIPTION"}, + }, + "masterfeats": { + NameFields: []string{"STRREF"}, + DescriptionFields: []string{"DESCRIPTION"}, + }, + "itemprops": { + NameFields: []string{"Name", "StringRef"}, + DescriptionFields: []string{"Description", "GameStrRef"}, + }, + "racialtypes": { + NameFields: []string{"Name", "RACIALTYPE"}, + DescriptionFields: []string{"Description"}, + }, + "skills": { + NameFields: []string{"Name", "SKILL"}, + DescriptionFields: []string{"Description"}, + }, + "spells": { + NameFields: []string{"Name", "SPELL"}, + DescriptionFields: []string{"SpellDesc", "DESCRIPTION"}, + }, +} + +type tlkEntryData struct { + Text string + SoundResRef string + SoundLength float32 +} + +type tlkStateDocument struct { + Version int `json:"version"` + Language string `json:"language"` + Entries map[string]tlkStateMapping `json:"entries"` +} + +type tlkStateMapping struct { + ID int `json:"id"` + Retired bool `json:"retired,omitempty"` +} + +type tlkCompiledValue struct { + Value any + TLKKey string +} + +type tlkCompiler struct { + language string + statePath string + state tlkStateDocument + legacy map[string]tlkEntryData + active map[string]tlkEntryData + activeKeys map[string]struct{} + reservedByID map[int]string + nextID int +} + +func newTLKCompiler(sourceDir string, legacy *legacyTLKData) (*tlkCompiler, error) { + statePath := filepath.Join(sourceDir, tlkStateFile) + state, err := loadTLKState(statePath) + if err != nil { + return nil, err + } + baseDialog, err := loadBaseDialogData(filepath.Join(sourceDir, "base_dialog.json")) + if err != nil { + return nil, err + } + legacy = mergeLegacyTLK(baseDialog, legacy) + language := state.Language + if language == "" { + language = "en" + } + if legacy != nil && legacy.Language != "" { + if state.Language == "" { + language = legacy.Language + } + for key, id := range legacy.Lock { + if _, ok := state.Entries[key]; !ok { + state.Entries[key] = tlkStateMapping{ID: id} + } + } + } + + reserved := map[int]string{} + nextID := 0 + for key, entry := range state.Entries { + if owner, ok := reserved[entry.ID]; ok && owner != key { + return nil, fmt.Errorf("tlk state id collision between %q and %q", owner, key) + } + reserved[entry.ID] = key + if entry.ID >= nextID { + nextID = entry.ID + 1 + } + } + + compiler := &tlkCompiler{ + language: language, + statePath: statePath, + state: state, + legacy: map[string]tlkEntryData{}, + active: map[string]tlkEntryData{}, + activeKeys: map[string]struct{}{}, + reservedByID: reserved, + nextID: nextID, + } + if legacy != nil { + for key, entry := range legacy.Entries { + compiler.legacy[key] = entry + } + } + return compiler, nil +} + +func loadBaseDialogData(path string) (*legacyTLKData, error) { + if _, err := os.Stat(path); err != nil { + if os.IsNotExist(err) { + return nil, nil + } + return nil, fmt.Errorf("stat %s: %w", path, err) + } + obj, err := loadJSONObject(path) + if err != nil { + return nil, err + } + result := &legacyTLKData{ + Language: "en", + Entries: map[string]tlkEntryData{}, + Lock: map[string]int{}, + } + if language, ok := obj["language"].(string); ok && strings.TrimSpace(language) != "" { + result.Language = language + } + rawEntries, ok := obj["entries"] + if !ok { + return result, nil + } + entries, ok := rawEntries.(map[string]any) + if !ok { + return nil, fmt.Errorf("base_dialog.json entries must be an object") + } + normalized, err := normalizeLegacyTLKEntries(entries) + if err != nil { + return nil, err + } + for key, entry := range normalized { + result.Entries[key] = entry + } + return result, nil +} + +func loadTLKState(path string) (tlkStateDocument, error) { + doc := tlkStateDocument{ + Version: 1, + Entries: map[string]tlkStateMapping{}, + } + raw, err := os.ReadFile(path) + if err != nil { + if os.IsNotExist(err) { + return doc, nil + } + return doc, fmt.Errorf("read %s: %w", path, err) + } + if err := json.Unmarshal(raw, &doc); err != nil { + return doc, fmt.Errorf("parse %s: %w", path, err) + } + if doc.Version == 0 { + doc.Version = 1 + } + if doc.Entries == nil { + doc.Entries = map[string]tlkStateMapping{} + } + return doc, nil +} + +func saveTLKState(path string, doc tlkStateDocument) error { + doc.Version = 1 + if doc.Language == "" { + doc.Language = "en" + } + if doc.Entries == nil { + doc.Entries = map[string]tlkStateMapping{} + } + raw, err := json.MarshalIndent(doc, "", " ") + if err != nil { + return fmt.Errorf("marshal tlk state: %w", err) + } + raw = append(raw, '\n') + if err := os.WriteFile(path, raw, 0o644); err != nil { + return fmt.Errorf("write %s: %w", path, err) + } + return nil +} + +func (c *tlkCompiler) resolveLegacyKey(key string) (tlkCompiledValue, error) { + if _, ok := c.legacy[key]; !ok { + if active, ok := c.active[key]; ok { + return tlkCompiledValue{ + Value: c.customStrrefForKey(key), + TLKKey: key, + }, c.markActive(key, active) + } + if len(c.legacy) == 0 { + return tlkCompiledValue{}, fmt.Errorf("unknown TLK reference: %s (inline TLK text is required for native builds)", key) + } + return tlkCompiledValue{}, fmt.Errorf("unknown TLK reference: %s", key) + } + if err := c.markActive(key, c.legacy[key]); err != nil { + return tlkCompiledValue{}, err + } + return tlkCompiledValue{ + Value: c.customStrrefForKey(key), + TLKKey: key, + }, nil +} + +func (c *tlkCompiler) registerInline(key string, entry tlkEntryData) (tlkCompiledValue, error) { + if err := c.markActive(key, entry); err != nil { + return tlkCompiledValue{}, err + } + return tlkCompiledValue{ + Value: c.customStrrefForKey(key), + TLKKey: key, + }, nil +} + +func (c *tlkCompiler) customStrrefForKey(key string) int { + return customTLKBase + c.state.Entries[key].ID +} + +func (c *tlkCompiler) markActive(key string, entry tlkEntryData) error { + mapping, ok := c.state.Entries[key] + if !ok { + mapping = tlkStateMapping{ID: c.allocateID(), Retired: false} + c.state.Entries[key] = mapping + } + existing, ok := c.active[key] + if ok && existing != entry { + return fmt.Errorf("conflicting TLK content for key %q", key) + } + c.active[key] = entry + c.activeKeys[key] = struct{}{} + mapping.Retired = false + c.state.Entries[key] = mapping + return nil +} + +func (c *tlkCompiler) allocateID() int { + id := c.nextID + c.nextID++ + return id +} + +func (c *tlkCompiler) finish(outputDir string) (int, error) { + if err := os.MkdirAll(outputDir, 0o755); err != nil { + return 0, fmt.Errorf("create tlk output dir: %w", err) + } + + for key, mapping := range c.state.Entries { + if _, ok := c.activeKeys[key]; ok { + mapping.Retired = false + } else { + mapping.Retired = true + } + c.state.Entries[key] = mapping + } + pruneRetiredGeneratedFeatTLKEntries(c.state.Entries) + + if err := saveTLKState(c.statePath, c.state); err != nil { + return 0, err + } + + maxID := -1 + for key := range c.activeKeys { + id := c.state.Entries[key].ID + if id > maxID { + maxID = id + } + } + entries := make([]tlkEntryData, maxID+1) + for key := range c.activeKeys { + id := c.state.Entries[key].ID + entries[id] = c.active[key] + } + + if err := writeTLKBinary(filepath.Join(outputDir, defaultTLKName), entries, c.language); err != nil { + return 0, err + } + if maxID < 0 { + return 1, nil + } + return 1, nil +} + +var generatedFeatTLKPrefixes = []string{ + "feat:skillfocus_", + "feat:greaterskillfocus_", + "feat:weaponfocus_", + "feat:weaponspecialization_", + "feat:greaterweaponfocus_", + "feat:greaterweaponspecialization_", + "feat:improvedcritical_", + "feat:overwhelmingcritical_", + "feat:weaponproficiencycommoner_", +} + +func pruneRetiredGeneratedFeatTLKEntries(entries map[string]tlkStateMapping) { + for key, mapping := range entries { + if !mapping.Retired || !isRetiredGeneratedFeatTLKKey(key) { + continue + } + delete(entries, key) + } +} + +func isRetiredGeneratedFeatTLKKey(key string) bool { + if !strings.HasPrefix(key, "feat:") { + return false + } + for _, prefix := range generatedFeatTLKPrefixes { + if strings.HasPrefix(key, prefix) { + return true + } + } + return false +} + +func writeTLKBinary(path string, entries []tlkEntryData, language string) error { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { + return fmt.Errorf("create tlk output parent: %w", err) + } + file, err := os.Create(path) + if err != nil { + return fmt.Errorf("create tlk output: %w", err) + } + defer file.Close() + + langID, err := languageID(language) + if err != nil { + return err + } + + if _, err := file.Write([]byte("TLK V3.0")); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, uint32(langID)); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, uint32(len(entries))); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, uint32(20+len(entries)*40)); err != nil { + return err + } + + stringData := make([][]byte, len(entries)) + offset := 0 + for index, entry := range entries { + flags := uint32(0) + if entry.Text != "" { + flags |= 0x1 + } + if entry.SoundResRef != "" { + flags |= 0x2 + } + if entry.SoundLength != 0 { + flags |= 0x4 + } + encodedText, err := charmap.Windows1252.NewEncoder().Bytes([]byte(entry.Text)) + if err != nil { + return fmt.Errorf("encode tlk text at row %d: %w", index, err) + } + stringData[index] = encodedText + + soundBytes := make([]byte, 16) + if len(entry.SoundResRef) > 16 { + return fmt.Errorf("sound resref at row %d exceeds 16 characters", index) + } + copy(soundBytes, []byte(entry.SoundResRef)) + + if err := binary.Write(file, binary.LittleEndian, flags); err != nil { + return err + } + if _, err := file.Write(soundBytes); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, uint32(0)); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, uint32(0)); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, uint32(offset)); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, uint32(len(encodedText))); err != nil { + return err + } + if err := binary.Write(file, binary.LittleEndian, entry.SoundLength); err != nil { + return err + } + offset += len(encodedText) + } + + for _, encoded := range stringData { + if _, err := file.Write(encoded); err != nil { + return err + } + } + return nil +} + +func languageID(code string) (int, error) { + switch strings.ToLower(strings.TrimSpace(code)) { + case "", "en": + return 0, nil + case "fr": + return 1, nil + case "de": + return 2, nil + case "it": + return 3, nil + case "es": + return 4, nil + case "pl": + return 5, nil + default: + return 0, fmt.Errorf("unknown TLK language code %q", code) + } +} + +func specForDataset(name string) datasetTextSpec { + best := datasetTextSpecs[name] + bestLength := 0 + for prefix, spec := range datasetTextSpecs { + if name != prefix && !strings.HasPrefix(name, prefix+"/") { + continue + } + if len(prefix) <= bestLength { + continue + } + best = spec + bestLength = len(prefix) + } + return best +} + +func roleForField(spec datasetTextSpec, field string) textRole { + for _, candidate := range spec.NameFields { + if strings.EqualFold(candidate, field) { + return textRoleName + } + } + for _, candidate := range spec.DescriptionFields { + if strings.EqualFold(candidate, field) { + return textRoleDescription + } + } + return textRole(strings.ToLower(field)) +} + +func columnForRole(columns []string, spec datasetTextSpec, role textRole) string { + var candidates []string + switch role { + case textRoleName: + candidates = spec.NameFields + case textRoleDescription: + candidates = spec.DescriptionFields + default: + return "" + } + for _, candidate := range candidates { + if column, ok := canonicalColumn(columns, candidate); ok { + return column + } + } + return "" +} + +type parsedTLKPayload struct { + Key string + Text string + Ref string + RefField string + SoundResRef string + SoundLength float32 +} + +func parseTLKPayload(value any, allowBare bool) (parsedTLKPayload, bool, error) { + switch typed := value.(type) { + case map[string]any: + if rawTLK, ok := typed["tlk"]; ok { + if key, ok := rawTLK.(string); ok { + return parsedTLKPayload{Key: key}, true, nil + } + return parseTLKPayload(rawTLK, true) + } + if allowBare || hasNonRefTLKPayloadKeys(typed) { + if _, ok := typed["text"]; ok { + return buildParsedTLKPayload(typed) + } + if _, ok := typed["ref"]; ok { + return buildParsedTLKPayload(typed) + } + if _, ok := typed["key"]; ok { + return buildParsedTLKPayload(typed) + } + } + return parsedTLKPayload{}, false, nil + case string: + return parsedTLKPayload{}, false, nil + default: + return parsedTLKPayload{}, false, nil + } +} + +func hasNonRefTLKPayloadKeys(obj map[string]any) bool { + for _, key := range []string{"text", "key", "sound_resref", "sound_length"} { + if _, ok := obj[key]; ok { + return true + } + } + return false +} + +func buildParsedTLKPayload(obj map[string]any) (parsedTLKPayload, bool, error) { + payload := parsedTLKPayload{} + if rawKey, ok := obj["key"]; ok { + key, ok := rawKey.(string) + if !ok { + return payload, false, fmt.Errorf("tlk key must be a string") + } + payload.Key = key + } + if rawText, ok := obj["text"]; ok { + text, ok := rawText.(string) + if !ok { + return payload, false, fmt.Errorf("tlk text must be a string") + } + payload.Text = text + } + if rawRef, ok := obj["ref"]; ok { + ref, ok := rawRef.(string) + if !ok { + return payload, false, fmt.Errorf("tlk ref must be a string") + } + payload.Ref = ref + } + if rawField, ok := obj["field"]; ok { + field, ok := rawField.(string) + if !ok { + return payload, false, fmt.Errorf("tlk field must be a string") + } + payload.RefField = field + } + if rawSound, ok := obj["sound_resref"]; ok { + sound, ok := rawSound.(string) + if !ok { + return payload, false, fmt.Errorf("tlk sound_resref must be a string") + } + payload.SoundResRef = sound + } + if rawLength, ok := obj["sound_length"]; ok { + switch typed := rawLength.(type) { + case float64: + payload.SoundLength = float32(typed) + case int: + payload.SoundLength = float32(typed) + default: + return payload, false, fmt.Errorf("tlk sound_length must be numeric") + } + } + if payload.Ref != "" && payload.RefField == "" { + return payload, false, fmt.Errorf("tlk ref requires field") + } + if payload.Ref != "" && payload.Text != "" { + return payload, false, fmt.Errorf("tlk payload cannot contain both text and ref") + } + if payload.Ref == "" && payload.Text == "" && payload.Key == "" { + return payload, false, fmt.Errorf("tlk payload must contain text, ref, or key") + } + return payload, true, nil +} + +func deriveAutoTLKKey(rowIdentity string, field string) string { + fieldText := strings.ToLower(strings.TrimSpace(field)) + if fieldText == "" { + fieldText = "text" + } + return rowIdentity + "." + fieldText +} + +func sortedKeys[M ~map[string]V, V any](input M) []string { + keys := make([]string, 0, len(input)) + for key := range input { + keys = append(keys, key) + } + slices.Sort(keys) + return keys +} + +func almostEqualFloat32(a, b float32) bool { + return math.Abs(float64(a-b)) < 0.0001 +} diff --git a/internal/topdata/topdata.go b/internal/topdata/topdata.go index 1eb58d6..9239596 100644 --- a/internal/topdata/topdata.go +++ b/internal/topdata/topdata.go @@ -7,9 +7,9 @@ import ( "fmt" "io/fs" "os" - "os/exec" "path/filepath" "slices" + "strconv" "strings" "gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/project" @@ -65,17 +65,20 @@ func (r ValidationReport) WarningCount() int { } type BuildResult struct { - Mode string + Mode string Output2DADir string OutputTLKDir string - Files2DA int - FilesTLK int + Files2DA int + FilesTLK int } type CompareResult struct { - Mode string - Compared2DA int - ComparedTLK int + Mode string + Compared2DA int + ComparedTLK int + NativePass int + NotYetCanonical int + NativeMismatch int } func ValidateProject(p *project.Project) ValidationReport { @@ -109,10 +112,13 @@ func ValidateProject(p *project.Project) ValidationReport { } dataDir := filepath.Join(sourceDir, "data") + // Canonical topdata no longer requires a dedicated source tlk directory. + // When present, it is only validated for disallowed legacy module input. tlkDir := filepath.Join(sourceDir, "tlk") baseDialog := filepath.Join(sourceDir, "base_dialog.json") + statePath := filepath.Join(sourceDir, tlkStateFile) - for _, requiredDir := range []string{dataDir, tlkDir} { + for _, requiredDir := range []string{dataDir} { info, err := os.Stat(requiredDir) if err != nil { report.Diagnostics = append(report.Diagnostics, Diagnostic{ @@ -131,11 +137,48 @@ func ValidateProject(p *project.Project) ValidationReport { } } + if info, err := os.Stat(tlkDir); err == nil && info.IsDir() { + modulesDir := filepath.Join(tlkDir, "modules") + legacyModuleFiles := 0 + if moduleInfo, moduleErr := os.Stat(modulesDir); moduleErr == nil && moduleInfo.IsDir() { + _ = walkJSON(modulesDir, func(path string) { + legacyModuleFiles++ + report.Files++ + report.TLKFiles++ + _ = validateJSONFile(path, "tlk", &report) + }) + } else if moduleErr != nil && !errors.Is(moduleErr, os.ErrNotExist) { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: modulesDir, + Message: moduleErr.Error(), + }) + } + if legacyModuleFiles > 0 { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: modulesDir, + Message: "topdata/tlk/modules is no longer allowed for canonical authored input; inline TLK-in-data is required", + }) + } + if lockInfo, lockErr := os.Stat(filepath.Join(tlkDir, "lock.json")); lockErr == nil && !lockInfo.IsDir() { + report.Files++ + report.TLKFiles++ + _ = validateJSONFile(filepath.Join(tlkDir, "lock.json"), "tlk", &report) + } else if lockErr != nil && !errors.Is(lockErr, os.ErrNotExist) { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: filepath.Join(tlkDir, "lock.json"), + Message: lockErr.Error(), + }) + } + } + if _, err := os.Stat(baseDialog); err != nil { report.Diagnostics = append(report.Diagnostics, Diagnostic{ Severity: SeverityWarning, Path: baseDialog, - Message: "base_dialog.json is missing; migrated datasets may rely on reference builder fallback for now", + Message: "base_dialog.json is missing; dialog migration is not canonical yet", }) } else { report.Files++ @@ -149,27 +192,14 @@ func ValidateProject(p *project.Project) ValidationReport { report.DataFiles++ _ = validateJSONFile(path, "data", &report) }) - _ = walkJSON(tlkDir, func(path string) { + validateNativeOutputCatalog(dataDir, &report) + validateItempropsRegistryGraph(dataDir, &report) + if _, err := os.Stat(statePath); err == nil { report.Files++ - report.TLKFiles++ - _ = validateJSONFile(path, "tlk", &report) - }) - - refDir := p.TopDataReferenceBuilderDir() - if refDir == "" { - report.Diagnostics = append(report.Diagnostics, Diagnostic{ - Severity: SeverityWarning, - Path: project.ConfigFile, - Message: "topdata.reference_builder is not configured; build-topdata reference mode will be unavailable", - }) - } else { - if _, err := os.Stat(filepath.Join(refDir, "build.py")); err != nil { - report.Diagnostics = append(report.Diagnostics, Diagnostic{ - Severity: SeverityError, - Path: refDir, - Message: "reference builder does not contain build.py", - }) - } + _ = validateJSONFile(statePath, "state", &report) + } + if !report.HasErrors() { + validateNativeBuildability(p, &report) } return report @@ -211,8 +241,10 @@ func validateJSONFile(path, domain string, report *ValidationReport) error { validateDataObject(path, obj, report) case "tlk": validateTLKObject(path, obj, report) + case "state": + validateStateObject(path, obj, report) case "base_dialog": - // Parseability is enough for now; compatibility is still reference-backed. + validateBaseDialogObject(path, obj, report) } return nil } @@ -222,6 +254,36 @@ func validateDataObject(path string, obj map[string]any, report *ValidationRepor slashed := filepath.ToSlash(path) inModules := strings.Contains(slashed, "/modules/") + if strings.HasSuffix(slashed, "/data/masterfeats/base.json") { + validateMasterfeatsBaseFile(path, obj, report) + return + } + if strings.HasSuffix(slashed, "/data/masterfeats/lock.json") { + validateMasterfeatsLockFile(path, obj, report) + return + } + if strings.HasSuffix(slashed, "/data/feat/base.json") { + validateFeatBaseFile(path, obj, report) + return + } + if strings.HasSuffix(slashed, "/data/feat/lock.json") { + validateFeatLockFile(path, obj, report) + return + } + if strings.Contains(slashed, "/data/feat/generated/") { + validateFeatGeneratedFile(path, obj, report) + return + } + if strings.Contains(slashed, "/data/parts/overrides/") { + validateOverridesFile(path, obj, report) + return + } + + if strings.Contains(slashed, "/racialtypes/registry/races/") { + validateRacialtypesRegistryRaceFile(path, obj, report) + return + } + if base == "lock.json" { validateLockObject(path, obj, report) return @@ -262,36 +324,341 @@ func validateDataObject(path string, obj map[string]any, report *ValidationRepor }) } +func validateMasterfeatsBaseFile(path string, obj map[string]any, report *ValidationReport) { + validateRowsFile(path, obj, report, true) + + if output, ok := obj["output"]; !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "masterfeats base.json must contain output set to masterfeats.2da", + }) + } else if outputText, ok := output.(string); !ok || strings.TrimSpace(outputText) != "masterfeats.2da" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "masterfeats output must be masterfeats.2da", + }) + } + + columns := extractValidationColumns(obj) + for _, required := range []string{"LABEL", "STRREF", "DESCRIPTION"} { + if _, ok := canonicalColumn(columns, required); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("masterfeats base.json must include %s in columns", required), + }) + } + } + + rows, ok := obj["rows"].([]any) + if !ok { + return + } + for index, raw := range rows { + row, ok := raw.(map[string]any) + if !ok { + continue + } + key, ok := row["key"].(string) + if !ok || strings.TrimSpace(key) == "" { + continue + } + if !strings.HasPrefix(key, "masterfeats:") { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("masterfeats row %d key %q must start with masterfeats:", index, key), + }) + } + } +} + +func validateMasterfeatsLockFile(path string, obj map[string]any, report *ValidationReport) { + validateLockObject(path, obj, report) + for key := range obj { + if !strings.HasPrefix(key, "masterfeats:") { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("masterfeats lock key %q must start with masterfeats:", key), + }) + } + } +} + +func validateFeatBaseFile(path string, obj map[string]any, report *ValidationReport) { + validateRowsFile(path, obj, report, true) + + if output, ok := obj["output"]; !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "feat base.json must contain output set to feat.2da", + }) + } else if outputText, ok := output.(string); !ok || strings.TrimSpace(outputText) != "feat.2da" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "feat output must be feat.2da", + }) + } +} + +func validateFeatLockFile(path string, obj map[string]any, report *ValidationReport) { + validateLockObject(path, obj, report) + for key := range obj { + if !strings.HasPrefix(key, "feat:") { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("feat lock key %q must start with feat:", key), + }) + } + } +} + +func validateFeatGeneratedFile(path string, obj map[string]any, report *ValidationReport) { + family, ok := obj["family"].(string) + if !ok || strings.TrimSpace(family) == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "feat generated file must contain a non-empty family string", + }) + return + } + if !slices.Contains([]string{ + "skill_focus", + "greater_skill_focus", + "weapon_focus", + "weapon_specialization", + "greater_weapon_focus", + "greater_weapon_specialization", + "improved_critical", + "overwhelming_critical", + "proficiencies", + "special_attacks", + }, family) { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("unsupported feat generated family %q", family), + }) + return + } + switch family { + case "skill_focus", "greater_skill_focus": + validateFeatCompactGeneratorFile(path, obj, report, true) + case "weapon_focus", + "weapon_specialization", + "greater_weapon_focus", + "greater_weapon_specialization", + "improved_critical", + "overwhelming_critical": + validateFeatCompactGeneratorFile(path, obj, report, false) + default: + _, hasEntries := obj["entries"] + _, hasOverrides := obj["overrides"] + if !hasEntries && !hasOverrides { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "feat generated file must contain entries and/or overrides", + }) + return + } + if hasEntries { + validateEntriesFile(path, obj, report) + } + if hasOverrides { + validateOverridesFile(path, obj, report) + } + } +} + +func validateFeatCompactGeneratorFile(path string, obj map[string]any, report *ValidationReport, skillsDriven bool) { + familyKey, ok := obj["family_key"].(string) + if !ok || strings.TrimSpace(familyKey) == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "compact feat generated file must contain a non-empty family_key string", + }) + } + template, ok := obj["template"].(string) + if !ok || strings.TrimSpace(template) == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "compact feat generated file must contain a non-empty template string", + }) + } else if !strings.HasPrefix(template, "masterfeats:") { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "compact feat generated template must start with masterfeats:", + }) + } + childSource, err := parseFamilyExpansionSource(obj["child_source"]) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("compact feat generated file %v", err), + }) + return + } + if skillsDriven { + if childSource.Dataset != "skills" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "skill feat generated child_source.dataset must be skills", + }) + } + if raw, ok := obj["overrides"]; ok { + if _, ok := raw.(map[string]any); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "compact feat generated overrides must be an object keyed by skills:*", + }) + } + } + return + } + if childSource.Dataset != "baseitems" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "weapon feat generated child_source.dataset must be baseitems", + }) + } + if childSource.Column == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "weapon feat generated child_source.column must be a non-empty string", + }) + } + if raw, ok := obj["overrides"]; ok { + if _, ok := raw.(map[string]any); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "weapon feat generated overrides must be an object keyed by baseitems:*", + }) + } + } +} + +func validateRacialtypesRegistryRaceFile(path string, obj map[string]any, report *ValidationReport) { + key, ok := obj["key"] + if !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race file must contain a key field", + }) + } else if _, ok := key.(string); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race key must be a string", + }) + } + + core, ok := obj["core"] + if !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race file must contain a core object", + }) + } else if _, ok := core.(map[string]any); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race core must be a JSON object", + }) + } + + if rawOutput, ok := obj["feat_output"]; ok { + if _, ok := rawOutput.(string); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race feat_output must be a string", + }) + } + if rawFeats, ok := obj["feats"]; ok { + if _, ok := rawFeats.([]any); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race feats must be an array", + }) + } + } else { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race feat_output requires a feats array", + }) + } + return + } + + if _, ok := obj["feats"]; ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "racialtypes registry race feats requires feat_output", + }) + } +} + func validateTLKObject(path string, obj map[string]any, report *ValidationReport) { if filepath.Base(path) == "lock.json" { validateLockObject(path, obj, report) return } + validateLegacyDialogEntries(path, obj, report, "TLK") +} + +func validateBaseDialogObject(path string, obj map[string]any, report *ValidationReport) { + validateLegacyDialogEntries(path, obj, report, "base_dialog") +} + +func validateLegacyDialogEntries(path string, obj map[string]any, report *ValidationReport, label string) { entries, ok := obj["entries"] - if !ok { - report.Diagnostics = append(report.Diagnostics, Diagnostic{ - Severity: SeverityError, - Path: path, - Message: "TLK file must contain an entries object", - }) - return - } - if _, ok := entries.(map[string]any); !ok { - report.Diagnostics = append(report.Diagnostics, Diagnostic{ - Severity: SeverityError, - Path: path, - Message: "TLK entries must be a JSON object", - }) + if ok { + if _, ok := entries.(map[string]any); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s entries must be a JSON object", label), + }) + } } if language, ok := obj["language"]; ok { if _, ok := language.(string); !ok { report.Diagnostics = append(report.Diagnostics, Diagnostic{ Severity: SeverityError, Path: path, - Message: "TLK language must be a string when present", + Message: fmt.Sprintf("%s language must be a string when present", label), }) } } + if label == "TLK" && !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "TLK file must contain an entries object", + }) + } } func validateLockObject(path string, obj map[string]any, report *ValidationReport) { @@ -326,13 +693,30 @@ func validateRowsFile(path string, obj map[string]any, report *ValidationReport, Message: "rows must be a JSON array", }) } + if rowsList, ok := rows.([]any); ok { + validateRowCollection(path, obj, rowsList, report) + } if columns, ok := obj["columns"]; ok { - if _, ok := columns.([]any); !ok { + if list, ok := columns.([]any); !ok { report.Diagnostics = append(report.Diagnostics, Diagnostic{ Severity: SeverityError, Path: path, Message: "columns must be a JSON array when present", }) + } else { + for _, raw := range list { + column, ok := raw.(string) + if !ok { + continue + } + if isAuthoringOnlyField(column) && !preserveLegacyWikiColumnForPath(path, column) { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("deprecated wiki column %q must be moved into meta.wiki", column), + }) + } + } } } else if requireColumns { report.Diagnostics = append(report.Diagnostics, Diagnostic{ @@ -360,6 +744,25 @@ func validateEntriesFile(path string, obj map[string]any, report *ValidationRepo Message: "entries must be a JSON object", }) } + if entryMap, ok := entries.(map[string]any); ok { + for key, raw := range entryMap { + entry, ok := raw.(map[string]any) + if !ok { + continue + } + for field := range entry { + if isAuthoringOnlyField(field) && !preserveLegacyWikiColumnForPath(path, field) { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("entry %q uses deprecated wiki field %q; move it into meta.wiki", key, field), + }) + } + } + validateRowMetadata(path, fmt.Sprintf("entry %q", key), entry, report) + validateInlineTextUsage(path, key, entry, report) + } + } } func validateOverridesFile(path string, obj map[string]any, report *ValidationReport) { @@ -379,79 +782,370 @@ func validateOverridesFile(path string, obj map[string]any, report *ValidationRe Message: "overrides must be a JSON array", }) } + if overrideList, ok := overrides.([]any); ok { + container := map[string]any{"rows": overrideList} + validateRowCollection(path, container, overrideList, report) + } } -func BuildReference(p *project.Project, progress func(string)) (BuildResult, error) { - if progress == nil { - progress = func(string) {} +func validateStateObject(path string, obj map[string]any, report *ValidationReport) { + entries, ok := obj["entries"].(map[string]any) + if !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: "TLK state file must contain an entries object", + }) + return } - if !p.HasTopData() { - return BuildResult{}, errors.New("topdata is not configured for this project") - } - - report := ValidateProject(p) - if report.HasErrors() { - return BuildResult{}, fmt.Errorf("topdata validation failed with %d error(s)", report.ErrorCount()) - } - - refDir := p.TopDataReferenceBuilderDir() - if refDir == "" { - return BuildResult{}, errors.New("topdata.reference_builder is not configured") - } - - buildDir := p.TopDataBuildDir() - output2DA := filepath.Join(buildDir, "2da") - outputTLK := filepath.Join(buildDir, "tlk") - progress("Preparing topdata build directories...") - if err := os.RemoveAll(buildDir); err != nil { - return BuildResult{}, fmt.Errorf("clean topdata build dir: %w", err) - } - if err := os.MkdirAll(output2DA, 0o755); err != nil { - return BuildResult{}, fmt.Errorf("create 2da output dir: %w", err) - } - if err := os.MkdirAll(outputTLK, 0o755); err != nil { - return BuildResult{}, fmt.Errorf("create tlk output dir: %w", err) - } - - progress("Building topdata outputs through the Python reference builder...") - bridgeDir, cleanup, err := prepareReferenceBridge(refDir) - if err != nil { - return BuildResult{}, err - } - defer cleanup() - - cmd := exec.Command("python3", "build.py", "--out", output2DA, "--tlk-dir", outputTLK) - cmd.Dir = bridgeDir - var stderr bytes.Buffer - cmd.Stderr = &stderr - cmd.Stdout = ioDiscardProgress(progress) - if err := cmd.Run(); err != nil { - message := strings.TrimSpace(stderr.String()) - if message == "" { - message = err.Error() + ids := map[int]string{} + for key, raw := range entries { + entry, ok := raw.(map[string]any) + if !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("TLK state entry %q must be an object", key), + }) + continue } - return BuildResult{}, fmt.Errorf("reference builder failed: %s", message) + idValue, ok := entry["id"] + if !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("TLK state entry %q is missing id", key), + }) + continue + } + id, err := asInt(idValue) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("TLK state entry %q id must be numeric", key), + }) + continue + } + if other, ok := ids[id]; ok && other != key { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("TLK state id collision between %q and %q", other, key), + }) + } + ids[id] = key } - - files2DA, err := countFiles(output2DA) - if err != nil { - return BuildResult{}, err - } - filesTLK, err := countFiles(outputTLK) - if err != nil { - return BuildResult{}, err - } - - return BuildResult{ - Mode: "reference", - Output2DADir: output2DA, - OutputTLKDir: outputTLK, - Files2DA: files2DA, - FilesTLK: filesTLK, - }, nil } -func CompareReference(p *project.Project, progress func(string)) (CompareResult, error) { +func validateNativeOutputCatalog(dataDir string, report *ValidationReport) { + datasets, err := discoverNativeDatasets(dataDir) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: dataDir, + Message: err.Error(), + }) + return + } + registryDatasets, err := collectGeneratedRegistryDatasets(dataDir) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: dataDir, + Message: err.Error(), + }) + return + } + outputOwners := map[string]string{} + for _, dataset := range datasets { + recordNativeOutputOwner(dataset.OutputName, dataset.Name, outputOwners, report) + } + for _, dataset := range registryDatasets { + recordNativeOutputOwner(dataset.Dataset.OutputName, dataset.Dataset.Name, outputOwners, report) + } +} + +func recordNativeOutputOwner(outputName, owner string, outputOwners map[string]string, report *ValidationReport) { + if existing, ok := outputOwners[outputName]; ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: owner, + Message: fmt.Sprintf("duplicate 2da output %q also produced by %s", outputName, existing), + }) + return + } + outputOwners[outputName] = owner +} + +func validateNativeBuildability(p *project.Project, report *ValidationReport) { + dataDir := filepath.Join(p.TopDataSourceDir(), "data") + datasets, err := discoverNativeDatasets(dataDir) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: dataDir, + Message: err.Error(), + }) + return + } + registryDatasets, err := collectGeneratedRegistryDatasets(dataDir) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: dataDir, + Message: err.Error(), + }) + return + } + if len(datasets) == 0 && len(registryDatasets) == 0 { + return + } + tempBuild, err := os.MkdirTemp("", "sow-topdata-validate-*") + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: p.TopDataSourceDir(), + Message: fmt.Sprintf("create validation temp dir: %v", err), + }) + return + } + defer os.RemoveAll(tempBuild) + + clone := *p + clone.Config.TopData.Build = tempBuild + if _, err := buildNativeUnchecked(&clone, nil); err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: p.TopDataSourceDir(), + Message: fmt.Sprintf("native topdata buildability check failed: %v", err), + }) + } +} + +func validateRowCollection(path string, obj map[string]any, rows []any, report *ValidationReport) { + columns := extractValidationColumns(obj) + rowHasIdentity := func(row map[string]any, fallbackID int) (string, bool) { + if key, ok := row["key"].(string); ok && strings.TrimSpace(key) != "" { + return key, true + } + if _, ok := row["id"]; ok { + return fmt.Sprintf("id:%d", fallbackID), true + } + return "", false + } + + for index, raw := range rows { + row, ok := raw.(map[string]any) + if !ok { + continue + } + for key := range row { + if isAuthoringOnlyField(key) && !preserveLegacyWikiColumnForPath(path, key) { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("row %d uses deprecated wiki field %q; move it into meta.wiki", index, key), + }) + } + } + if _, hasTLK := row["_tlk"]; hasTLK { + if _, ok := rowHasIdentity(row, index); !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("row %d uses _tlk but has no resolvable identity", index), + }) + } + } + validateRowMetadata(path, fmt.Sprintf("row %d", index), row, report) + validateInheritanceUsage(path, fmt.Sprintf("row %d", index), row, columns, report) + validateGenericInheritanceObject(path, fmt.Sprintf("row %d", index), row, report) + validateInlineTextUsage(path, fmt.Sprintf("row %d", index), row, report) + } + _ = obj +} + +func validateRowMetadata(path, label string, row map[string]any, report *ValidationReport) { + rawMeta, ok := lookupField(row, "meta") + if !ok { + return + } + if _, err := parseRowMetadata(rawMeta); err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s meta: %v", label, err), + }) + } +} + +func extractValidationColumns(obj map[string]any) []string { + rawColumns, ok := obj["columns"].([]any) + if !ok { + return nil + } + columns := make([]string, 0, len(rawColumns)) + for _, raw := range rawColumns { + column, ok := raw.(string) + if !ok { + continue + } + columns = append(columns, column) + } + return columns +} + +func preserveLegacyWikiColumnForPath(path, field string) bool { + return strings.HasSuffix(filepath.ToSlash(path), "/data/classes/core/base.json") && + strings.EqualFold(strings.TrimSpace(field), "WIKIGENERATE") +} + +func validateInheritanceUsage(path, label string, row map[string]any, columns []string, report *ValidationReport) { + spec, ok, err := parseRowInheritanceSpec(row) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s inherit: %v", label, err), + }) + return + } + if !ok { + return + } + if _, ok := row[spec.From]; !ok { + found := false + for key := range row { + if strings.EqualFold(key, spec.From) { + found = true + break + } + } + if !found { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s inherit.from field %q was not found on row", label, spec.From), + }) + } + } + for _, field := range spec.Fields { + if len(columns) == 0 { + continue + } + if _, ok := canonicalColumn(columns, field); ok { + continue + } + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s inherit field %q is not a known column", label, field), + }) + } +} + +func validateGenericInheritanceObject(path, label string, value any, report *ValidationReport) { + switch typed := value.(type) { + case map[string]any: + spec, ok, err := parseGenericInheritanceSpec(typed) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s inherit: %v", label, err), + }) + } else if ok { + if !strings.Contains(spec.Ref, ":") { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s inherit.ref %q must use dataset:key identity", label, spec.Ref), + }) + } + } + for key, child := range typed { + if key == "inherit" { + continue + } + validateGenericInheritanceObject(path, label+"."+key, child, report) + } + case []any: + for index, child := range typed { + validateGenericInheritanceObject(path, fmt.Sprintf("%s[%d]", label, index), child, report) + } + } +} + +func validateInlineTextUsage(path, label string, obj map[string]any, report *ValidationReport) { + for key, value := range obj { + if key == "_tlk" { + typed, ok := value.(map[string]any) + if !ok { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s _tlk must be an object", label), + }) + continue + } + for role, roleValue := range typed { + if strings.ToLower(role) != "name" && strings.ToLower(role) != "description" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s _tlk role %q is not supported", label, role), + }) + continue + } + if _, _, err := parseTLKPayload(roleValue, true); err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s _tlk.%s: %v", label, role, err), + }) + } + } + continue + } + + allowBare := true + if typed, ok := value.(map[string]any); ok { + _, hasWrappedTLK := typed["tlk"] + if !hasWrappedTLK { + if _, hasRef := typed["ref"]; hasRef { + if _, hasText := typed["text"]; !hasText { + if _, hasKey := typed["key"]; !hasKey { + continue + } + } + } + allowBare = false + } + } + payload, ok, err := parseTLKPayload(value, allowBare) + if err != nil { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s %s: %v", label, key, err), + }) + continue + } + if !ok { + continue + } + if payload.Key == "" && payload.Text == "" && payload.Ref == "" { + report.Diagnostics = append(report.Diagnostics, Diagnostic{ + Severity: SeverityError, + Path: path, + Message: fmt.Sprintf("%s %s TLK payload is empty", label, key), + }) + } + } +} + +func Compare(p *project.Project, progress func(string)) (CompareResult, error) { if progress == nil { progress = func(string) {} } @@ -461,58 +1155,29 @@ func CompareReference(p *project.Project, progress func(string)) (CompareResult, if _, err := os.Stat(output2DA); err != nil { return CompareResult{}, fmt.Errorf("topdata build output missing: run build-topdata first") } - - tempDir, err := os.MkdirTemp("", "sow-topdata-compare-*") - if err != nil { - return CompareResult{}, fmt.Errorf("create compare temp dir: %w", err) - } - defer os.RemoveAll(tempDir) - - ref2DA := filepath.Join(tempDir, "2da") - refTLK := filepath.Join(tempDir, "tlk") - if err := os.MkdirAll(ref2DA, 0o755); err != nil { - return CompareResult{}, err - } - if err := os.MkdirAll(refTLK, 0o755); err != nil { - return CompareResult{}, err - } - - progress("Building fresh reference topdata outputs for comparison...") - bridgeDir, cleanup, err := prepareReferenceBridge(p.TopDataReferenceBuilderDir()) - if err != nil { - return CompareResult{}, err - } - defer cleanup() - - cmd := exec.Command("python3", "build.py", "--out", ref2DA, "--tlk-dir", refTLK) - cmd.Dir = bridgeDir - var stderr bytes.Buffer - cmd.Stderr = &stderr - cmd.Stdout = ioDiscardProgress(progress) - if err := cmd.Run(); err != nil { - message := strings.TrimSpace(stderr.String()) - if message == "" { - message = err.Error() - } - return CompareResult{}, fmt.Errorf("reference builder failed: %s", message) - } - - compared2DA, err := compareDirs(output2DA, ref2DA) - if err != nil { - return CompareResult{}, err - } - comparedTLK, err := compareDirs(outputTLK, refTLK) + compared2DA, comparedTLK, nativePass, nativeMismatch, err := compareNativeSelfCheck(p, output2DA, outputTLK, progress) if err != nil { return CompareResult{}, err } return CompareResult{ - Mode: "reference", - Compared2DA: compared2DA, - ComparedTLK: comparedTLK, + Mode: "native", + Compared2DA: compared2DA, + ComparedTLK: comparedTLK, + NativePass: nativePass, + NotYetCanonical: 0, + NativeMismatch: nativeMismatch, }, nil } +func BuildReference(p *project.Project, progress func(string)) (BuildResult, error) { + return BuildNative(p, progress) +} + +func CompareReference(p *project.Project, progress func(string)) (CompareResult, error) { + return Compare(p, progress) +} + func compareDirs(actualRoot, expectedRoot string) (int, error) { expectedFiles := make([]string, 0) err := filepath.WalkDir(expectedRoot, func(path string, d fs.DirEntry, err error) error { @@ -573,6 +1238,143 @@ func compareDirs(actualRoot, expectedRoot string) (int, error) { return len(expectedFiles), nil } +func compareNativeSelfCheck(p *project.Project, actual2DA, actualTLK string, progress func(string)) (int, int, int, int, error) { + if progress == nil { + progress = func(string) {} + } + projectOutputs, err := discoverNativeOutputCatalog(filepath.Join(p.TopDataSourceDir(), "data")) + if err != nil { + return 0, 0, 0, 0, err + } + if len(projectOutputs) == 0 { + return 0, 0, 0, 0, nil + } + + tempBuild, err := os.MkdirTemp("", "sow-topdata-native-compare-*") + if err != nil { + return 0, 0, 0, 0, fmt.Errorf("create native compare temp dir: %w", err) + } + defer os.RemoveAll(tempBuild) + + nativeProject := *p + nativeProject.Config.TopData.Build = tempBuild + nativeResult, err := buildNativeUnchecked(&nativeProject, nil) + if err != nil { + return 0, 0, 0, len(projectOutputs), nil + } + + pass := 0 + mismatch := 0 + for outputName := range projectOutputs { + actualBytes, err := os.ReadFile(filepath.Join(actual2DA, outputName)) + if err != nil { + mismatch++ + continue + } + expectedBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, outputName)) + if err != nil { + mismatch++ + continue + } + if bytes.Equal(normalize2DAForCompare(outputName, actualBytes), normalize2DAForCompare(outputName, expectedBytes)) { + pass++ + continue + } + mismatch++ + } + actual2DAFiles, err := listRelativeFiles(actual2DA) + if err != nil { + return 0, 0, 0, 0, err + } + expected2DAFiles, err := listRelativeFiles(nativeResult.Output2DADir) + if err != nil { + return 0, 0, 0, 0, err + } + if !slices.Equal(actual2DAFiles, expected2DAFiles) { + mismatch += symmetricDiffCount(actual2DAFiles, expected2DAFiles) + } + comparedTLK, tlkMismatch, err := compareExactDirFiles(actualTLK, nativeResult.OutputTLKDir) + if err != nil { + return 0, 0, 0, 0, err + } + mismatch += tlkMismatch + return len(projectOutputs), comparedTLK, pass, mismatch, nil +} + +func compareNativeCoverage(p *project.Project, actual2DA string, progress func(string)) (int, int, int, error) { + actualTLK := filepath.Join(filepath.Dir(actual2DA), "tlk") + compared2DA, _, pass, mismatch, err := compareNativeSelfCheck(p, actual2DA, actualTLK, progress) + if err != nil { + return 0, 0, 0, err + } + if compared2DA == 0 { + return 0, 0, mismatch, nil + } + return pass, 0, mismatch, nil +} + +func normalize2DAForCompare(outputName string, raw []byte) []byte { + text := strings.ReplaceAll(string(raw), "\r\n", "\n") + lines := strings.Split(text, "\n") + if len(lines) < 3 || !strings.HasPrefix(lines[0], "2DA V2.0") { + return raw + } + headerIndex := 2 + columns := strings.Split(lines[headerIndex], "\t") + keep := make([]int, 0, len(columns)) + filtered := make([]string, 0, len(columns)) + for index, column := range columns { + if isAuthoringOnlyField(column) { + continue + } + keep = append(keep, index) + filtered = append(filtered, column) + } + var builder strings.Builder + builder.WriteString(lines[0]) + builder.WriteByte('\n') + builder.WriteByte('\n') + builder.WriteString(strings.Join(filtered, "\t")) + builder.WriteByte('\n') + normalizedRows := make([][]string, 0, len(lines)) + for _, line := range lines[headerIndex+1:] { + if line == "" { + continue + } + fields := strings.Split(line, "\t") + if len(fields) == 0 { + continue + } + row := make([]string, 0, len(keep)) + for _, index := range keep { + if index+1 < len(fields) { + row = append(row, fields[index+1]) + } else { + row = append(row, nullValue) + } + } + normalizedRows = append(normalizedRows, row) + } + if shouldIgnore2DAPlacement(outputName) { + slices.SortFunc(normalizedRows, func(a, b []string) int { + return strings.Compare(strings.Join(a, "\x00"), strings.Join(b, "\x00")) + }) + } + for index, row := range normalizedRows { + builder.WriteString(strconv.Itoa(index)) + for _, value := range row { + builder.WriteByte('\t') + builder.WriteString(value) + } + builder.WriteByte('\n') + } + return []byte(builder.String()) +} + +func shouldIgnore2DAPlacement(outputName string) bool { + return strings.HasPrefix(outputName, "cls_feat_") && strings.HasSuffix(outputName, ".2da") +} + func walkJSON(root string, fn func(path string)) error { return filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { if err != nil { @@ -618,85 +1420,91 @@ func ioDiscardProgress(progress func(string)) *progressWriter { return &progressWriter{progress: progress} } -func prepareReferenceBridge(referenceBuilderDir string) (string, func(), error) { - tempRoot, err := os.MkdirTemp("", "sow-topdata-ref-*") - if err != nil { - return "", nil, fmt.Errorf("create reference bridge dir: %w", err) +func listRelativeFiles(root string) ([]string, error) { + files := make([]string, 0) + if _, err := os.Stat(root); err != nil { + if os.IsNotExist(err) { + return files, nil + } + return nil, err } - - cleanup := func() { - _ = os.RemoveAll(tempRoot) - } - - builderLink := filepath.Join(tempRoot, "tools", "2dabuilder") - if err := os.MkdirAll(filepath.Dir(builderLink), 0o755); err != nil { - cleanup() - return "", nil, fmt.Errorf("create reference bridge tools dir: %w", err) - } - if err := os.MkdirAll(filepath.Join(tempRoot, "assets"), 0o755); err != nil { - cleanup() - return "", nil, fmt.Errorf("create reference bridge assets dir: %w", err) - } - if err := os.MkdirAll(filepath.Join(tempRoot, "staging"), 0o755); err != nil { - cleanup() - return "", nil, fmt.Errorf("create reference bridge staging dir: %w", err) - } - if err := copyReferenceBuilder(referenceBuilderDir, builderLink); err != nil { - cleanup() - return "", nil, err - } - if err := rewriteBridgeDefaults(filepath.Join(builderLink, "build.py"), filepath.Join(tempRoot, "assets"), filepath.Join(tempRoot, "staging")); err != nil { - cleanup() - return "", nil, err - } - return builderLink, cleanup, nil -} - -func copyReferenceBuilder(src, dest string) error { - return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error { + err := filepath.WalkDir(root, func(path string, d fs.DirEntry, err error) error { if err != nil { return err } - rel, err := filepath.Rel(src, path) - if err != nil { - return err - } - if rel == "." { - return os.MkdirAll(dest, 0o755) - } - name := d.Name() if d.IsDir() { - if name == ".venv" || name == ".pytest_cache" || name == "__pycache__" { - return filepath.SkipDir - } - return os.MkdirAll(filepath.Join(dest, rel), 0o755) - } - if strings.HasSuffix(name, ".pyc") || name == "2dabuilder.log" { return nil } - target := filepath.Join(dest, rel) - info, err := d.Info() + rel, err := filepath.Rel(root, path) if err != nil { return err } - data, err := os.ReadFile(path) - if err != nil { - return err - } - return os.WriteFile(target, data, info.Mode()) + files = append(files, filepath.ToSlash(rel)) + return nil }) + if err != nil { + return nil, err + } + slices.Sort(files) + return files, nil } -func rewriteBridgeDefaults(buildScriptPath, assetsDir, stagingDir string) error { - raw, err := os.ReadFile(buildScriptPath) - if err != nil { - return fmt.Errorf("read bridge build.py: %w", err) +func symmetricDiffCount(left, right []string) int { + leftSet := map[string]struct{}{} + rightSet := map[string]struct{}{} + for _, item := range left { + leftSet[item] = struct{}{} } - text := string(raw) - text = strings.Replace(text, `DEFAULT_ASSETS_DIR = "../../assets"`, fmt.Sprintf("DEFAULT_ASSETS_DIR = %q", assetsDir), 1) - text = strings.Replace(text, `DEFAULT_STAGING_DIR = "../../staging"`, fmt.Sprintf("DEFAULT_STAGING_DIR = %q", stagingDir), 1) - if err := os.WriteFile(buildScriptPath, []byte(text), 0o644); err != nil { - return fmt.Errorf("rewrite bridge build.py defaults: %w", err) + for _, item := range right { + rightSet[item] = struct{}{} } - return nil + count := 0 + for item := range leftSet { + if _, ok := rightSet[item]; !ok { + count++ + } + } + for item := range rightSet { + if _, ok := leftSet[item]; !ok { + count++ + } + } + return count +} + +func compareExactDirFiles(actualRoot, expectedRoot string) (int, int, error) { + actualFiles, err := listRelativeFiles(actualRoot) + if err != nil { + return 0, 0, err + } + expectedFiles, err := listRelativeFiles(expectedRoot) + if err != nil { + return 0, 0, err + } + mismatch := 0 + if !slices.Equal(actualFiles, expectedFiles) { + mismatch += symmetricDiffCount(actualFiles, expectedFiles) + } + shared := make([]string, 0, len(expectedFiles)) + for _, rel := range expectedFiles { + if slices.Contains(actualFiles, rel) { + shared = append(shared, rel) + } + } + for _, rel := range shared { + actualBytes, err := os.ReadFile(filepath.Join(actualRoot, rel)) + if err != nil { + mismatch++ + continue + } + expectedBytes, err := os.ReadFile(filepath.Join(expectedRoot, rel)) + if err != nil { + mismatch++ + continue + } + if !bytes.Equal(actualBytes, expectedBytes) { + mismatch++ + } + } + return len(expectedFiles), mismatch, nil } diff --git a/internal/topdata/topdata_test.go b/internal/topdata/topdata_test.go index 09423bd..16b7810 100644 --- a/internal/topdata/topdata_test.go +++ b/internal/topdata/topdata_test.go @@ -1,88 +1,793 @@ package topdata import ( + "encoding/json" "os" "path/filepath" + "strings" "testing" "gitea.westgate.pw/ShadowsOverWestgate/sow-tools/internal/project" ) -func TestValidateProjectAcceptsCanonicalTopDataLayout(t *testing.T) { - root := t.TempDir() - mkdirAll(t, filepath.Join(root, "src")) - mkdirAll(t, filepath.Join(root, "assets")) - mkdirAll(t, filepath.Join(root, "build")) +func TestValidateProjectAcceptsInlineTLKSchema(t *testing.T) { + root := testProjectRoot(t) mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules")) - mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules")) writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") - writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{"output":"feat.2da","columns":["LABEL"],"rows":[{"id":0,"LABEL":"Feat","key":"feat:test"}]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [ + { + "id": 0, + "key": "feat:test", + "LABEL": "FEAT_TEST", + "_tlk": { + "name": "Test Feat", + "description": "Test Description" + } + } + ] +}`+"\n") writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0}`+"\n") - writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "entry.json"), `{"overrides":[{"id":0,"LABEL":"Feat"}]}`+"\n") - writeFile(t, filepath.Join(root, "topdata", "tlk", "base.json"), `{"language":"en","entries":{"feat:test.name":"Feat"}}`+"\n") - writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{"feat:test.name":0}`+"\n") mkdirAll(t, filepath.Join(root, "reference")) writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") - p := &project.Project{ - Root: root, - Config: project.Config{ - Module: project.ModuleConfig{Name: "Test", ResRef: "test"}, - Paths: project.PathConfig{Source: "src", Assets: "assets", Build: "build"}, - TopData: project.TopDataConfig{ - Source: "topdata", - Build: "build/topdata", - ReferenceBuilder: "reference", - }, - }, - } - - report := ValidateProject(p) + report := ValidateProject(testProject(root)) if report.HasErrors() { t.Fatalf("expected no topdata validation errors, got %#v", report.Diagnostics) } } -func TestBuildReferenceAndCompareReference(t *testing.T) { - root := t.TempDir() - mkdirAll(t, filepath.Join(root, "src")) - mkdirAll(t, filepath.Join(root, "assets")) - mkdirAll(t, filepath.Join(root, "build")) - mkdirAll(t, filepath.Join(root, "topdata", "data")) - mkdirAll(t, filepath.Join(root, "topdata", "tlk")) - writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") - mkdirAll(t, filepath.Join(root, "reference")) - writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 -import os, sys -out = None -tlk = None -args = sys.argv[1:] -for i, arg in enumerate(args): - if arg == "--out": - out = args[i + 1] - if arg == "--tlk-dir": - tlk = args[i + 1] -os.makedirs(out, exist_ok=True) -os.makedirs(tlk, exist_ok=True) -with open(os.path.join(out, "feat.2da"), "w", encoding="utf-8") as f: - f.write("2DA V2.0\n\n") -with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: - f.write(b"TLK") -`) +func TestResolvedTableRegistryRegistersConsistentTables(t *testing.T) { + collected := []nativeCollectedDataset{ + { + Dataset: nativeDataset{ + Kind: nativeDatasetPlain, + Name: "classes/savthr/fortitude_high", + OutputName: "cls_savthr_fort.2da", + }, + Columns: []string{"Level", "FortSave"}, + Rows: []map[string]any{ + {"id": 1, "Level": "1", "FortSave": "2"}, + }, + LockData: map[string]int{}, + TableKey: "classes/saves:fortitude", + }, + { + Dataset: nativeDataset{ + Kind: nativeDatasetPlain, + Name: "classes/bfeat/fighter", + OutputName: "cls_bfeat_fight.2da", + }, + Columns: []string{"Bonus"}, + Rows: []map[string]any{ + {"id": 1, "Bonus": "1"}, + }, + LockData: map[string]int{"classes:dummy": 99}, + TableKey: "classes/bonusfeats:fighter", + }, + } - p := &project.Project{ - Root: root, - Config: project.Config{ - Module: project.ModuleConfig{Name: "Test", ResRef: "test"}, - Paths: project.PathConfig{Source: "src", Assets: "assets", Build: "build"}, - TopData: project.TopDataConfig{ - Source: "topdata", - Build: "build/topdata", - ReferenceBuilder: "reference", + registry, err := newResolvedTableRegistry(collected) + if err != nil { + t.Fatalf("newResolvedTableRegistry failed: %v", err) + } + + saveTable, ok := registry.resolveTableByKey("classes/saves:fortitude") + if !ok { + t.Fatal("expected save table to resolve") + } + if saveTable.Key != "classes/saves:fortitude" || + saveTable.DatasetName != "classes/savthr/fortitude_high" || + saveTable.OutputName != "cls_savthr_fort.2da" || + saveTable.OutputStem != "cls_savthr_fort" || + saveTable.Kind != nativeDatasetPlain { + t.Fatalf("unexpected save table metadata: %#v", saveTable) + } + if len(saveTable.Columns) != 2 || len(saveTable.Rows) != 1 { + t.Fatalf("unexpected save table shape: %#v", saveTable) + } + + collected[0].Rows[0]["FortSave"] = "99" + if got := saveTable.Rows[0]["FortSave"]; got != "2" { + t.Fatalf("expected registry table rows to be cloned, got %v", got) + } + + bonusTable, ok := registry.resolveTableByKey("classes/bonusfeats:fighter") + if !ok { + t.Fatal("expected bonus feat table to resolve") + } + if bonusTable.OutputStem != "cls_bfeat_fight" || bonusTable.LockData["classes:dummy"] != 99 { + t.Fatalf("unexpected bonus feat table: %#v", bonusTable) + } +} + +func TestResolvedTableRegistryRejectsDuplicateKeys(t *testing.T) { + _, err := newResolvedTableRegistry([]nativeCollectedDataset{ + { + Dataset: nativeDataset{Name: "classes/skills/barbarian", OutputName: "cls_skill_barb.2da"}, + Columns: []string{"SkillLabel"}, + Rows: []map[string]any{{"id": 0, "SkillLabel": "Athletics"}}, + TableKey: "classes/skills:barbarian", + }, + { + Dataset: nativeDataset{Name: "classes/skills/barbarian_alt", OutputName: "cls_skill_barb_alt.2da"}, + Columns: []string{"SkillLabel"}, + Rows: []map[string]any{{"id": 0, "SkillLabel": "Ride"}}, + TableKey: "classes/skills:barbarian", + }, + }) + if err == nil || !strings.Contains(err.Error(), `duplicate table key "classes/skills:barbarian"`) { + t.Fatalf("expected duplicate table key error, got %v", err) + } +} + +func TestResolveNativeDatasetPreservesScalarTableReferenceBehavior(t *testing.T) { + tableRegistry, err := newResolvedTableRegistry([]nativeCollectedDataset{ + { + Dataset: nativeDataset{ + Kind: nativeDatasetPlain, + Name: "classes/skills/barbarian", + OutputName: "cls_skill_barb.2da", + }, + Columns: []string{"SkillLabel", "SkillIndex", "ClassSkill"}, + Rows: []map[string]any{ + {"id": 0, "SkillLabel": "Athletics", "SkillIndex": 47, "ClassSkill": "1"}, + }, + TableKey: "classes/skills:barbarian", + }, + }) + if err != nil { + t.Fatalf("newResolvedTableRegistry failed: %v", err) + } + + dataset := nativeCollectedDataset{ + Dataset: nativeDataset{ + Kind: nativeDatasetBase, + Name: "classes", + OutputName: "classes.2da", + Columns: []string{"Label", "SkillsTable"}, + }, + Columns: []string{"Label", "SkillsTable"}, + Rows: []map[string]any{ + { + "id": 0, + "key": "classes:barbarian", + "Label": "Barbarian", + "SkillsTable": map[string]any{"table": "classes/skills:barbarian"}, }, }, } + resolved, err := resolveNativeDataset( + dataset, + map[string]int{"classes:barbarian": 0}, + map[string]map[string]any{"classes:barbarian": dataset.Rows[0]}, + tableRegistry, + nil, + ) + if err != nil { + t.Fatalf("resolveNativeDataset failed: %v", err) + } + rows := resolved["rows"].([]map[string]any) + if got := rows[0]["SkillsTable"]; got != "cls_skill_barb" { + t.Fatalf("expected scalar table reference to resolve to output stem, got %v", got) + } +} + +func TestNormalizeProjectImportsLegacyClasses(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + + referenceRoot := filepath.Join(root, "reference") + mkdirAll(t, filepath.Join(referenceRoot, "data", "classes", "core", "modules")) + mkdirAll(t, filepath.Join(referenceRoot, "data", "classes", "feats")) + mkdirAll(t, filepath.Join(referenceRoot, "data", "classes", "skills")) + mkdirAll(t, filepath.Join(referenceRoot, "data", "classes", "savthr")) + mkdirAll(t, filepath.Join(referenceRoot, "data", "classes", "bfeat")) + mkdirAll(t, filepath.Join(referenceRoot, "tlk", "modules", "classes")) + + writeFile(t, filepath.Join(referenceRoot, "data", "classes", "core", "base.json"), `{ + "output": "classes.2da", + "columns": ["Label", "Description", "FeatsTable", "SavingThrowTable", "SkillsTable", "BonusFeatsTable", "PreReqTable"], + "rows": [ + { + "id": 4, + "key": "classes:fighter", + "Label": "Fighter", + "Description": "240", + "FeatsTable": "cls_feat_fight", + "SavingThrowTable": "cls_savthr_fort", + "SkillsTable": "cls_skill_fight", + "BonusFeatsTable": "cls_bfeat_fight", + "PreReqTable": "****" + }, + { + "id": 11, + "key": "classes:aberration", + "Label": "Aberration", + "Description": "241", + "FeatsTable": "CLS_FEAT_ABER", + "SavingThrowTable": "CLS_SAVTHR_WIZ", + "SkillsTable": "CLS_SKILL_FIGHT", + "BonusFeatsTable": "CLS_BFEAT_BARB", + "PreReqTable": "****" + } + ] +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "data", "classes", "core", "lock.json"), `{ + "classes:fighter": 4, + "classes:aberration": 11 +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "data", "classes", "core", "modules", "fighter.json"), `{ + "overrides": [ + { + "key": "classes:fighter", + "Description": { "tlk": "classes:fighter.description" } + } + ] +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "data", "classes", "feats", "fighter.json"), `{ + "key": "classes/feats:fighter", + "output": "cls_feat_fight.2da", + "columns": ["FeatIndex"], + "rows": [ + {"FeatIndex": {"id": "feat:literate"}} + ] +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "data", "classes", "skills", "fighter.json"), `{ + "key": "classes/skills:fighter", + "output": "cls_skill_fight.2da", + "columns": ["SkillIndex"], + "rows": [ + {"SkillIndex": {"id": "skills:spot"}} + ] +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "data", "classes", "savthr", "fortitude_high.json"), `{ + "key": "classes/saves:fortitude", + "output": "cls_savthr_fort.2da", + "columns": ["Level", "FortSave"], + "rows": [ + {"Level": "1", "FortSave": "2"} + ] +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "data", "classes", "bfeat", "fighter.json"), `{ + "key": "classes/bonusfeats:fighter", + "output": "cls_bfeat_fight.2da", + "columns": ["Bonus"], + "rows": [ + {"id": 1, "Bonus": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "tlk", "lock.json"), `{ + "classes:fighter.description": 1234 +}`+"\n") + writeFile(t, filepath.Join(referenceRoot, "tlk", "modules", "classes", "fighter.json"), `{ + "entries": { + "classes:fighter.description": { + "text": "Martial expert." + } + } +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "reference" + result, err := NormalizeProject(p) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles == 0 { + t.Fatal("expected classes import to write canonical files") + } + + coreObj := map[string]any{} + coreRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "classes", "core", "base.json")) + if err != nil { + t.Fatalf("read classes core: %v", err) + } + if err := json.Unmarshal(coreRaw, &coreObj); err != nil { + t.Fatalf("parse classes core: %v", err) + } + rows := coreObj["rows"].([]any) + row := rows[0].(map[string]any) + + description := row["Description"].(map[string]any)["tlk"].(map[string]any) + if description["key"] != "classes:fighter.description" || description["text"] != "Martial expert." { + t.Fatalf("unexpected inline TLK payload: %#v", description) + } + if table := row["FeatsTable"].(map[string]any)["table"]; table != "classes/feats:fighter" { + t.Fatalf("expected feats table ref rewrite, got %#v", row["FeatsTable"]) + } + if table := row["SavingThrowTable"].(map[string]any)["table"]; table != "classes/saves:fortitude" { + t.Fatalf("expected save table ref rewrite, got %#v", row["SavingThrowTable"]) + } + if table := row["SkillsTable"].(map[string]any)["table"]; table != "classes/skills:fighter" { + t.Fatalf("expected skills table ref rewrite, got %#v", row["SkillsTable"]) + } + if table := row["BonusFeatsTable"].(map[string]any)["table"]; table != "classes/bonusfeats:fighter" { + t.Fatalf("expected bonus feats table ref rewrite, got %#v", row["BonusFeatsTable"]) + } + monsterRow := rows[1].(map[string]any) + if got := monsterRow["SkillsTable"]; got != "CLS_SKILL_FIGHT" { + t.Fatalf("expected legacy uppercase monster table stem to remain literal, got %#v", got) + } + + state := tlkStateDocument{} + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", ".tlk_state.json")) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + if err := json.Unmarshal(stateRaw, &state); err != nil { + t.Fatalf("parse tlk state: %v", err) + } + if got := state.Entries["classes:fighter.description"].ID; got != 1234 { + t.Fatalf("expected preserved TLK state ID 1234, got %d", got) + } +} + +func TestBuildNativeSupportsClassesInlineTLKFields(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "classes", "core")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "core", "base.json"), `{ + "output": "classes.2da", + "columns": ["Label", "Short", "Name", "Plural", "Lower", "Description"], + "rows": [ + { + "id": 48, + "key": "classes:swashbuckler", + "Label": "Swashbuckler", + "Short": { "tlk": { "key": "classes:swashbuckler.short", "text": "Swa" } }, + "Name": { "tlk": { "key": "classes:swashbuckler.name", "text": "Swashbuckler" } }, + "Plural": { "tlk": { "key": "classes:swashbuckler.plural", "text": "Swashbucklers" } }, + "Lower": { "tlk": { "key": "classes:swashbuckler.lower", "text": "swashbuckler" } }, + "Description": { "tlk": { "key": "classes:swashbuckler.description", "text": "Agile duelist." } } + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "core", "lock.json"), `{ + "classes:swashbuckler": 48 +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + result, err := BuildNative(p, nil) + if err != nil { + report := ValidateProject(p) + t.Fatalf("BuildNative failed: %v\n%s", err, diagnosticsText(report.Diagnostics)) + } + + classesBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "classes.2da")) + if err != nil { + t.Fatalf("read classes.2da: %v", err) + } + classesText := string(classesBytes) + if !strings.Contains(classesText, "Label\tShort\tName\tPlural\tLower\tDescription\n") { + t.Fatalf("unexpected classes.2da header:\n%s", classesText) + } + if !strings.Contains(classesText, "48\tSwashbuckler\t16777216\t16777217\t16777218\t16777219\t16777220\n") { + t.Fatalf("expected compiled TLK strrefs in classes.2da, got:\n%s", classesText) + } +} + +func TestBuildNativePreservesClassesLegacyWikiGenerateColumn(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "classes", "core")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "core", "base.json"), `{ + "output": "classes.2da", + "columns": ["Label", "WIKIGENERATE", "SkipSpellSelection"], + "rows": [ + { + "id": 4, + "key": "classes:fighter", + "Label": "Fighter", + "WIKIGENERATE": "****", + "SkipSpellSelection": "0" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "core", "lock.json"), `{ + "classes:fighter": 4 +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + report := ValidateProject(p) + if report.HasErrors() { + t.Fatalf("expected classes/core legacy WIKIGENERATE compatibility, got %#v", report.Diagnostics) + } + + result, err := BuildNative(p, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + classesBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "classes.2da")) + if err != nil { + t.Fatalf("read classes.2da: %v", err) + } + classesText := string(classesBytes) + if !strings.Contains(classesText, "Label\tWIKIGENERATE\tSkipSpellSelection\n") { + t.Fatalf("expected classes.2da to keep WIKIGENERATE column, got:\n%s", classesText) + } + if !strings.Contains(classesText, "4\tFighter\t****\t0\n") { + t.Fatalf("expected classes.2da row to keep WIKIGENERATE value, got:\n%s", classesText) + } +} + +func TestBuildNativeExpandsClassesFeatMasterfeatRows(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "classes", "feats")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "feats", "acolyte.json"), `{ + "key": "classes/feats:acolyte", + "output": "cls_feat_acolyte.2da", + "columns": ["FeatLabel", "FeatIndex", "List", "GrantedOnLevel", "OnMenu"], + "rows": [ + {"FeatIndex": {"id": "feat:literate"}, "List": "3", "GrantedOnLevel": "1", "OnMenu": "0"}, + {"FeatIndex": {"id": "masterfeats:spellfocus"}, "List": "1", "GrantedOnLevel": "-1", "OnMenu": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION", "MASTERFEAT"], + "rows": [ + {"id": 35, "key": "feat:spellfocus_abjuration", "LABEL": "SpellFocusAbj", "FEAT": "425", "DESCRIPTION": "426", "MASTERFEAT": "3"}, + {"id": 36, "key": "feat:spellfocus_conjuration", "LABEL": "SpellFocusCon", "FEAT": "166", "DESCRIPTION": "427", "MASTERFEAT": "3"}, + {"id": 1135, "key": "feat:literate", "LABEL": "FEAT_LITERATE", "FEAT": "9000", "DESCRIPTION": "9001", "MASTERFEAT": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{ + "feat:spellfocus_abjuration": 35, + "feat:spellfocus_conjuration": 36, + "feat:literate": 1135 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON"], + "rows": [ + {"id": 3, "key": "masterfeats:spellfocus", "LABEL": "SpellFocus", "STRREF": "6490", "DESCRIPTION": "436", "ICON": "ife_skfoc"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{ + "masterfeats:spellfocus": 3 +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + result, err := BuildNative(p, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "cls_feat_acolyte.2da")) + if err != nil { + t.Fatalf("read cls_feat_acolyte.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "0\tFEAT_LITERATE\t1135\t3\t1\t0\n") { + t.Fatalf("expected direct feat row label fill, got:\n%s", text) + } + if !strings.Contains(text, "1\tSpellFocusAbj\t35\t1\t-1\t0\n") || !strings.Contains(text, "2\tSpellFocusCon\t36\t1\t-1\t0\n") { + t.Fatalf("expected masterfeat expansion rows, got:\n%s", text) + } +} + +func TestBuildNativeExpandsClassesFeatMasterfeatRowsWithFilter(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "classes", "feats")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "classes", "skills")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "feats", "fighter.json"), `{ + "key": "classes/feats:fighter", + "output": "cls_feat_fighter.2da", + "columns": ["FeatLabel", "FeatIndex", "List", "GrantedOnLevel", "OnMenu"], + "rows": [ + {"FeatIndex": {"id": "feat:toughness", "filter": "successors"}, "List": "1", "GrantedOnLevel": "-1", "OnMenu": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "skills", "fighter.json"), `{ + "key": "classes/skills:fighter", + "output": "cls_skill_fighter.2da", + "columns": ["SkillLabel", "SkillIndex", "ClassSkill"], + "rows": [ + {"key": "skills:athletics", "SkillLabel": "Athletics", "SkillIndex": {"id": "skills:athletics"}, "ClassSkill": "1"}, + {"key": "skills:persuade", "SkillLabel": "Persuade", "SkillIndex": {"id": "skills:persuade"}, "ClassSkill": "1"}, + {"key": "skills:alchemy", "SkillLabel": "Alchemy", "SkillIndex": {"id": "skills:alchemy"}, "ClassSkill": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION", "MASTERFEAT", "REQSKILL", "SUCCESSOR"], + "rows": [ + {"id": 1, "key": "feat:toughness", "LABEL": "Toughness", "FEAT": "100", "DESCRIPTION": "101", "MASTERFEAT": "****", "REQSKILL": "****", "SUCCESSOR": "feat:toughness_1"}, + {"id": 2, "key": "feat:toughness_1", "LABEL": "Toughness1", "FEAT": "102", "DESCRIPTION": "103", "MASTERFEAT": "****", "REQSKILL": "****", "SUCCESSOR": "feat:toughness_2"}, + {"id": 3, "key": "feat:toughness_2", "LABEL": "Toughness2", "FEAT": "104", "DESCRIPTION": "105", "MASTERFEAT": "****", "REQSKILL": "****", "SUCCESSOR": "****"}, + {"id": 10, "key": "feat:skillfocus_athletics", "LABEL": "SkillFocusAthletics", "FEAT": "200", "DESCRIPTION": "201", "MASTERFEAT": "4", "REQSKILL": "skills:athletics", "SUCCESSOR": "****"}, + {"id": 11, "key": "feat:skillfocus_persuade", "LABEL": "SkillFocusPersuade", "FEAT": "202", "DESCRIPTION": "203", "MASTERFEAT": "4", "REQSKILL": "skills:persuade", "SUCCESSOR": "****"}, + {"id": 12, "key": "feat:skillfocus_alchemy", "LABEL": "SkillFocusAlchemy", "FEAT": "203", "DESCRIPTION": "204", "MASTERFEAT": "4", "REQSKILL": "skills:alchemy", "SUCCESSOR": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{ + "feat:toughness": 1, + "feat:toughness_1": 2, + "feat:toughness_2": 3, + "feat:skillfocus_athletics": 10, + "feat:skillfocus_persuade": 11, + "feat:skillfocus_alchemy": 12 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON"], + "rows": [ + {"id": 4, "key": "masterfeats:skillfocus", "LABEL": "SkillFocus", "STRREF": "6493", "DESCRIPTION": "426", "ICON": "ife_skfoc"}, + {"id": 5, "key": "masterfeats:greaterskillfocus", "LABEL": "GreaterSkillFocus", "STRREF": "6494", "DESCRIPTION": "427", "ICON": "ife_grtskfoc"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{ + "masterfeats:skillfocus": 4, + "masterfeats:greaterskillfocus": 5 +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + result, err := BuildNative(p, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "cls_feat_fighter.2da")) + if err != nil { + t.Fatalf("read cls_feat_fighter.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "2\tToughness\t1\t1\t-1\t0\n") || !strings.Contains(text, "3\tToughness1\t2\t1\t-1\t0\n") || !strings.Contains(text, "4\tToughness2\t3\t1\t-1\t0\n") { + t.Fatalf("expected successor expansion, got:\n%s", text) + } +} + +func TestBuildNativeExpandsClassesFeatClassskillsFilter(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "classes", "feats")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "classes", "skills")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "feats", "fighter.json"), `{ + "key": "classes/feats:fighter", + "output": "cls_feat_fighter.2da", + "columns": ["FeatLabel", "FeatIndex", "List", "GrantedOnLevel", "OnMenu"], + "rows": [ + {"FeatIndex": {"id": "masterfeats:skillfocus", "filter": "classskills"}, "List": "1", "GrantedOnLevel": "-1", "OnMenu": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "classes", "skills", "fighter.json"), `{ + "key": "classes/skills:fighter", + "output": "cls_skill_fighter.2da", + "columns": ["SkillLabel", "SkillIndex", "ClassSkill"], + "rows": [ + {"key": "skills:athletics", "SkillLabel": "Athletics", "SkillIndex": {"id": "skills:athletics"}, "ClassSkill": "1"}, + {"key": "skills:persuade", "SkillLabel": "Persuade", "SkillIndex": {"id": "skills:persuade"}, "ClassSkill": "1"}, + {"key": "skills:alchemy", "SkillLabel": "Alchemy", "SkillIndex": {"id": "skills:alchemy"}, "ClassSkill": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION", "MASTERFEAT", "REQSKILL", "SUCCESSOR"], + "rows": [ + {"id": 10, "key": "feat:skillfocus_athletics", "LABEL": "SkillFocusAthletics", "FEAT": "200", "DESCRIPTION": "201", "MASTERFEAT": "4", "REQSKILL": "skills:athletics", "SUCCESSOR": "****"}, + {"id": 11, "key": "feat:skillfocus_persuade", "LABEL": "SkillFocusPersuade", "FEAT": "202", "DESCRIPTION": "203", "MASTERFEAT": "4", "REQSKILL": "skills:persuade", "SUCCESSOR": "****"}, + {"id": 12, "key": "feat:skillfocus_alchemy", "LABEL": "SkillFocusAlchemy", "FEAT": "203", "DESCRIPTION": "204", "MASTERFEAT": "4", "REQSKILL": "skills:alchemy", "SUCCESSOR": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{ + "feat:skillfocus_athletics": 10, + "feat:skillfocus_persuade": 11, + "feat:skillfocus_alchemy": 12 +}`+"\n") + /* CLASSKILLS_FILTER_TEST_INSERT_MARKER */ + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON"], + "rows": [ + {"id": 4, "key": "masterfeats:skillfocus", "LABEL": "SkillFocus", "STRREF": "6493", "DESCRIPTION": "426", "ICON": "ife_skfoc"}, + {"id": 5, "key": "masterfeats:greaterskillfocus", "LABEL": "GreaterSkillFocus", "STRREF": "6494", "DESCRIPTION": "427", "ICON": "ife_grtskfoc"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{ + "masterfeats:skillfocus": 4, + "masterfeats:greaterskillfocus": 5 +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + result, err := BuildNative(p, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "cls_feat_fighter.2da")) + if err != nil { + t.Fatalf("read cls_feat_fighter.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "SkillFocusAthletics") || !strings.Contains(text, "SkillFocusPersuade") { + t.Fatalf("expected classskill filter expansion (athletics + persuade), got:\n%s", text) + } + if strings.Contains(text, "SkillFocusAlchemy") { + t.Fatalf("expected alchemy to be filtered out (not a class skill), got:\n%s", text) + } +} + +func TestValidateProjectRejectsLegacyAuthoredTLKModules(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "feat")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [ + { + "id": 0, + "key": "feat:test", + "LABEL": "FEAT_TEST", + "FEAT": {"tlk": {"key": "feat:test.name", "text": "Test Feat"}}, + "DESCRIPTION": {"tlk": {"key": "feat:test.description", "text": "Test Description"}} + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "feat", "test.json"), `{"entries":{"feat:test.name":{"text":"Legacy name"}}}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatal("expected validation error for legacy authored TLK modules") + } + if !strings.Contains(diagnosticsText(report.Diagnostics), "topdata/tlk/modules is no longer allowed for canonical authored input") { + t.Fatalf("expected inline-TLK enforcement error, got:\n%s", diagnosticsText(report.Diagnostics)) + } +} + +func TestNormalizeProjectRemovesLegacyAuthoredTLKModules(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "feat")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [ + { + "id": 0, + "key": "feat:test", + "LABEL": "FEAT_TEST", + "FEAT": {"tlk": "feat:test.name"}, + "DESCRIPTION": {"tlk": "feat:test.description"} + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{"feat:test.name":9,"feat:test.description":10}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "feat", "test.json"), `{ + "entries": { + "feat:test.name": {"text": "Legacy Name"}, + "feat:test.description": {"text": "Legacy Description"} + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.RemainingLegacyRefs != 0 { + t.Fatalf("expected no remaining legacy refs, got %#v", result) + } + if _, err := os.Stat(filepath.Join(root, "topdata", "tlk", "modules")); !os.IsNotExist(err) { + t.Fatalf("expected legacy tlk/modules to be removed, got err=%v", err) + } + if _, err := os.Stat(filepath.Join(root, "topdata", "tlk", "lock.json")); !os.IsNotExist(err) { + t.Fatalf("expected legacy tlk/lock.json to be removed, got err=%v", err) + } + report := ValidateProject(testProject(root)) + if report.HasErrors() { + t.Fatalf("expected normalized project to validate cleanly, got:\n%s", diagnosticsText(report.Diagnostics)) + } +} + +func TestValidateProjectAcceptsCanonicalMasterfeatsContract(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON"], + "rows": [ + { + "id": 0, + "key": "masterfeats:weaponfocus", + "LABEL": "WeaponFocus", + "STRREF": "6490", + "DESCRIPTION": "436", + "ICON": "ife_wepfoc" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{ + "masterfeats:weaponfocus": 0 +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + report := ValidateProject(testProject(root)) + if report.HasErrors() { + t.Fatalf("expected no validation errors, got:\n%s", diagnosticsText(report.Diagnostics)) + } +} + +func TestValidateProjectRejectsInvalidMasterfeatsContract(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "STRREF"], + "rows": [ + { + "id": 0, + "key": "feat:weaponfocus", + "LABEL": "WeaponFocus", + "STRREF": "6490" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{ + "feat:weaponfocus": 0 +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatal("expected validation errors for invalid masterfeats contract") + } + text := diagnosticsText(report.Diagnostics) + for _, want := range []string{ + "masterfeats output must be masterfeats.2da", + "masterfeats base.json must include DESCRIPTION in columns", + `masterfeats row 0 key "feat:weaponfocus" must start with masterfeats:`, + `masterfeats lock key "feat:weaponfocus" must start with masterfeats:`, + } { + if !strings.Contains(text, want) { + t.Fatalf("expected validation message %q, got:\n%s", want, text) + } + } +} + +func TestBuildReferenceAndCompareReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{ + "output": "repadjust.2da", + "columns": ["LABEL"], + "rows": [{"id": 0, "LABEL": "TEST"}] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "lock.json"), "{}\n") + + p := testProject(root) + result, err := BuildReference(p, nil) if err != nil { t.Fatalf("BuildReference failed: %v", err) @@ -95,11 +800,7299 @@ with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: if err != nil { t.Fatalf("CompareReference failed: %v", err) } - if compare.Compared2DA != 1 || compare.ComparedTLK != 1 { + if compare.Mode != "native" || compare.NativeMismatch != 0 || compare.NativePass != 1 { t.Fatalf("unexpected compare result: %#v", compare) } } +func TestCompareReferenceHandlesMixedModeOutputListMismatch(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "parts")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "parts", "belt.json"), `{ + "output": "parts_belt.2da", + "columns": ["COSTMODIFIER"], + "rows": [{"id": 0, "COSTMODIFIER": "0"}] +}`+"\n") + + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + writeFile(t, filepath.Join(nativeResult.Output2DADir, "unexpected.2da"), "2DA V2.0\n\nLABEL\n0\tExtra\n") + + compare, err := CompareReference(testProject(root), nil) + if err != nil { + t.Fatalf("CompareReference failed: %v", err) + } + if compare.NativeMismatch == 0 { + t.Fatalf("unexpected mixed-mode compare result: %#v", compare) + } +} + +func TestBuildUsesNativeModeForInlineTLKAndWritesState(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [ + {"id": 0, "key": "feat:test", "LABEL": "FeatTest", "_tlk": {"name": "Base Name", "description": "Base Description"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0,"feat:module":5}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "module.json"), `{ + "entries": { + "feat:module": { + "LABEL": "Feat Module", + "_tlk": { + "name": {"ref": "feat:test", "field": "FEAT"}, + "description": {"text": "Module Description"} + } + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + if report := ValidateProject(testProject(root)); report.HasErrors() { + t.Fatalf("unexpected validation errors:\n%s", diagnosticsText(report.Diagnostics)) + } + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + if result.Mode != "native" { + t.Fatalf("expected native mode, got %#v", result) + } + if result.Files2DA != 1 || result.FilesTLK != 1 { + t.Fatalf("unexpected build result: %#v", result) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "feat.2da")) + if err != nil { + t.Fatalf("read native 2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "LABEL\tFEAT\tDESCRIPTION\n") || + !strings.Contains(text, "0\tFeatTest\t16777216\t16777217\n") || + !strings.Contains(text, "5\t\"Feat Module\"\t16777216\t16777218\n") { + t.Fatalf("unexpected 2da output:\n%s", string(got)) + } + + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + var state tlkStateDocument + if err := json.Unmarshal(stateRaw, &state); err != nil { + t.Fatalf("parse state: %v", err) + } + if state.Language != "en" { + t.Fatalf("unexpected state language: %#v", state) + } + if state.Entries["feat:test.feat"].ID != 0 || state.Entries["feat:test.description"].ID != 1 || state.Entries["feat:module.description"].ID != 2 { + t.Fatalf("unexpected state entries: %#v", state.Entries) + } + + if _, err := os.Stat(filepath.Join(result.OutputTLKDir, defaultTLKName)); err != nil { + t.Fatalf("expected tlk output: %v", err) + } +} + +func TestBuildPreservesTLKStateAcrossTextChanges(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "skills")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "base.json"), `{ + "output": "skills.2da", + "columns": ["Label", "Name", "Description"], + "rows": [ + {"id": 0, "key": "skills:athletics", "Label": "Athletics", "_tlk": {"name": "Athletics", "description": "Old text"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "lock.json"), `{"skills:athletics":0}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + p := testProject(root) + if _, err := Build(p, nil); err != nil { + t.Fatalf("first build failed: %v", err) + } + + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "base.json"), `{ + "output": "skills.2da", + "columns": ["Label", "Name", "Description"], + "rows": [ + {"id": 0, "key": "skills:athletics", "Label": "Athletics", "_tlk": {"name": "Athletics", "description": "New text"}} + ] +}`+"\n") + if _, err := Build(p, nil); err != nil { + t.Fatalf("second build failed: %v", err) + } + + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + var state tlkStateDocument + if err := json.Unmarshal(stateRaw, &state); err != nil { + t.Fatalf("parse state: %v", err) + } + if state.Entries["skills:athletics.name"].ID != 0 || state.Entries["skills:athletics.description"].ID != 1 { + t.Fatalf("unexpected stable IDs after rebuild: %#v", state.Entries) + } +} + +func TestBuildAutoTLKKeysUseLiteralColumnNamesForIDRowsAndPlainTables(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "skills")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "parts")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "base.json"), `{ + "output": "skills.2da", + "columns": ["Label", "Name", "Description"], + "rows": [ + {"id": 0, "Label": "Athletics", "Name": {"tlk": {"text": "Athletics"}}, "Description": {"tlk": {"text": "Athletics description"}}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "parts", "belt.json"), `{ + "output": "parts_belt.2da", + "columns": ["LABEL", "NAME"], + "rows": [ + {"key": "parts:belt:test", "LABEL": "BeltTest", "NAME": {"tlk": {"text": "Belt Name"}}} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + if _, err := Build(testProject(root), nil); err != nil { + t.Fatalf("Build failed: %v", err) + } + + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + var state tlkStateDocument + if err := json.Unmarshal(stateRaw, &state); err != nil { + t.Fatalf("parse state: %v", err) + } + idName, ok := state.Entries["skills:id:0.name"] + if !ok { + t.Fatalf("missing id-row name auto key: %#v", state.Entries) + } + idDescription, ok := state.Entries["skills:id:0.description"] + if !ok { + t.Fatalf("missing id-row description auto key: %#v", state.Entries) + } + plainName, ok := state.Entries["parts:belt:test.name"] + if !ok { + t.Fatalf("missing plain-table auto key: %#v", state.Entries) + } + if idName.ID == idDescription.ID || idName.ID == plainName.ID || idDescription.ID == plainName.ID { + t.Fatalf("expected distinct ids for auto-generated keys, got %#v", state.Entries) + } +} + +func TestBuildAutoTLKKeyConflictsFailClearly(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT"], + "rows": [ + {"id": 0, "key": "feat:test", "LABEL": "FeatTest", "_tlk": {"name": "Auto Name"}}, + {"id": 1, "key": "feat:other", "LABEL": "FeatOther", "FEAT": {"tlk": {"key": "feat:test.feat", "text": "Different Name"}}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0,"feat:other":1}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + _, err := Build(testProject(root), nil) + if err == nil || !strings.Contains(err.Error(), `conflicting TLK content for key "feat:test.feat"`) { + t.Fatalf("expected TLK conflict, got %v", err) + } +} + +func TestBuildRejectsLegacyAuthoredTLKRefs(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [ + {"id": 0, "key": "feat:test", "LABEL": "FeatTest", "FEAT": {"tlk": "feat:test.name"}, "DESCRIPTION": {"tlk": "feat:test.description"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + _, err := Build(testProject(root), nil) + if err == nil || !strings.Contains(err.Error(), "inline TLK text is required for native builds") { + t.Fatalf("expected legacy bare tlk ref failure, got %v", err) + } +} + +func TestBuildSupportsPlainTableDatasets(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "parts")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "parts", "belt.json"), `{ + "output": "parts_belt.2da", + "columns": ["COSTMODIFIER", "ACBONUS"], + "rows": [ + {"id": 0, "COSTMODIFIER": "0", "ACBONUS": "0.00"}, + {"key": "parts:belt:test", "COSTMODIFIER": "1", "ACBONUS": "0.25"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + if result.Mode != "native" { + t.Fatalf("expected native mode, got %#v", result) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "parts_belt.2da")) + if err != nil { + t.Fatalf("read 2da: %v", err) + } + want := "2DA V2.0\n\nCOSTMODIFIER\tACBONUS\n0\t0\t0.00\n1\t1\t0.25\n" + if string(got) != want { + t.Fatalf("unexpected plain-table output:\n%s", string(got)) + } + + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "parts", "lock.json")) + if err != nil { + t.Fatalf("read lockfile: %v", err) + } + if !strings.Contains(string(lockRaw), `"parts:belt:test": 1`) { + t.Fatalf("expected generated plain-table lock entry, got:\n%s", string(lockRaw)) + } +} + +func TestBuildSurfacesNativeFailuresWithoutReferenceFallback(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "broken")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "broken", "base.json"), `{ + "output": "broken.2da", + "columns": ["LABEL"], + "rows": [ + {"id": "bad", "LABEL": "Broken"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "broken", "lock.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + _, err := Build(testProject(root), nil) + if err == nil || !strings.Contains(err.Error(), "row id bad is not numeric") { + t.Fatalf("expected native build error, got %v", err) + } +} + +func TestBuildAppliesNonTLKOverrides(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "itemprops", "sets", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "sets", "base.json"), `{ + "output": "itemprops.2da", + "columns": ["0_Melee", "6_Arm_Shld", "StringRef", "Label"], + "rows": [ + {"id": 81, "0_Melee": "****", "6_Arm_Shld": "****", "StringRef": "58325", "Label": "Weight_Increase"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "sets", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "sets", "modules", "ovr_eos.json"), `{ + "overrides": [ + {"id": 81, "6_Arm_Shld": "1"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + if result.Mode != "native" { + t.Fatalf("expected native mode, got %#v", result) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "itemprops.2da")) + if err != nil { + t.Fatalf("read 2da: %v", err) + } + if !strings.Contains(string(got), "81\t****\t1\t58325\tWeight_Increase\n") { + t.Fatalf("expected override-applied row, got:\n%s", string(got)) + } +} + +func TestBuildFallsBackWhenProjectMigrationIsIncomplete(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "parts")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "parts", "belt.json"), `{ + "output": "parts_belt.2da", + "columns": ["COSTMODIFIER"], + "rows": [{"id": 0, "COSTMODIFIER": "0"}] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "parts")) + mkdirAll(t, filepath.Join(root, "reference", "data", "feat")) + writeFile(t, filepath.Join(root, "reference", "data", "parts", "belt.json"), `{ + "output": "parts_belt.2da", + "columns": ["COSTMODIFIER"], + "rows": [{"id": 0, "COSTMODIFIER": "0"}] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL"], + "rows": [{"id": 0, "LABEL": "Feat"}] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "parts_belt.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\\n\\nCOSTMODIFIER\\n0\\t0\\n") +with open(os.path.join(out, "feat.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\\n\\nLABEL\\n0\\tFeat\\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + if result.Mode != "native" { + t.Fatalf("expected native mode, got %#v", result) + } +} + +func TestNormalizeProjectInlinesLegacyTLKReferences(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "feat")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [ + {"id": 0, "key": "feat:test", "LABEL": "FeatTest", "FEAT": {"tlk": "feat:test.name"}, "DESCRIPTION": {"tlk": "feat:test.description"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{"feat:test.name":9,"feat:test.description":10}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "feat", "test.json"), `{ + "entries": { + "feat:test": { + "name": {"text": "Legacy Name"}, + "description": {"text": "Legacy Description"} + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles == 0 || result.InlineValues != 2 { + t.Fatalf("unexpected normalize result: %#v", result) + } + + normalized, err := os.ReadFile(filepath.Join(root, "topdata", "data", "feat", "base.json")) + if err != nil { + t.Fatalf("read normalized file: %v", err) + } + text := string(normalized) + if !strings.Contains(text, `"key": "feat:test.name"`) || !strings.Contains(text, `"text": "Legacy Name"`) { + t.Fatalf("expected inlined TLK payloads, got:\n%s", text) + } + + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read state: %v", err) + } + var state tlkStateDocument + if err := json.Unmarshal(stateRaw, &state); err != nil { + t.Fatalf("parse state: %v", err) + } + if state.Entries["feat:test.name"].ID != 9 || state.Entries["feat:test.description"].ID != 10 { + t.Fatalf("expected state seeded from legacy TLK lock, got %#v", state.Entries) + } +} + +func TestNormalizeProjectHandlesPlainTablesAndReportsRemainingRefs(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "feat")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION"], + "rows": [ + {"key": "masterfeats:test", "LABEL": "Test", "STRREF": {"tlk": "masterfeats:test.name"}, "DESCRIPTION": {"tlk": "masterfeats:test.description"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{"masterfeats:test.name":9,"masterfeats:test.description":10}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "feat", "masterfeats.json"), `{ + "entries": { + "masterfeats:test": { + "name": {"text": "Masterfeat Name"}, + "description": {"text": "Masterfeat Description"} + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.ScannedFiles != 1 || result.UpdatedFiles != 1 || result.InlineValues != 2 { + t.Fatalf("unexpected normalize result: %#v", result) + } + if result.RemainingFiles != 0 || result.RemainingLegacyRefs != 0 { + t.Fatalf("expected no remaining legacy refs, got %#v", result) + } + + normalized, err := os.ReadFile(filepath.Join(root, "topdata", "data", "masterfeats", "base.json")) + if err != nil { + t.Fatalf("read normalized file: %v", err) + } + text := string(normalized) + if !strings.Contains(text, `"text": "Masterfeat Name"`) || !strings.Contains(text, `"text": "Masterfeat Description"`) { + t.Fatalf("expected normalized inline TLK payloads, got:\n%s", text) + } +} + +func TestBuildSupportsCanonicalItempropsRegistry(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "itemprops", "registry")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "properties.json"), `{ + "rows": [ + { + "key": "itemprop:basearmorclass", + "label": "BaseArmorClass", + "name": {"tlk": {"key": "itemprops:basearmorclass.name", "text": "Base Armor Class"}}, + "property_text": {"tlk": {"key": "itemprops:basearmorclass.property_text", "text": "Base armor class"}}, + "availability": ["arm_shld"], + "cost": {"value": "0", "ref": "cost_models:iprpbaseaccost"} + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "cost_models.json"), `{ + "rows": [ + { + "key": "cost_models:iprpbaseaccost", + "index_name": "iprp_baseaccost", + "label": "IPRP_BASEACCOST", + "client_load": "0", + "table": { + "ownership": "owned", + "resref": "iprp_baseaccost", + "output": "iprp_baseaccost.2da", + "columns": ["Name", "Cost"], + "rows": [ + {"id": 0, "Name": "0", "Cost": "0"} + ] + } + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "param_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "subtype_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "lock.json"), `{"itemprop:basearmorclass":31,"cost_models:iprpbaseaccost":31}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + if report := ValidateProject(testProject(root)); report.HasErrors() { + t.Fatalf("unexpected validation errors:\n%s", diagnosticsText(report.Diagnostics)) + } + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + if result.Mode != "native" { + t.Fatalf("expected native mode, got %#v", result) + } + if result.Files2DA != 5 || result.FilesTLK != 1 { + t.Fatalf("unexpected build result: %#v", result) + } + + itempropsOut, err := os.ReadFile(filepath.Join(result.Output2DADir, "itemprops.2da")) + if err != nil { + t.Fatalf("read itemprops.2da: %v", err) + } + text := string(itempropsOut) + if !strings.Contains(text, "31\t****\t****\t****\t****\t****\t****\t1\t") || !strings.Contains(text, "\t16777216\tBaseArmorClass\n") { + t.Fatalf("unexpected itemprops.2da output:\n%s", text) + } + + defOut, err := os.ReadFile(filepath.Join(result.Output2DADir, "itempropdef.2da")) + if err != nil { + t.Fatalf("read itempropdef.2da: %v", err) + } + if !strings.Contains(string(defOut), "31\t16777216\tBaseArmorClass\t****\t0\t31\t****\t16777217\t****\n") { + t.Fatalf("unexpected itempropdef.2da output:\n%s", string(defOut)) + } + + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + if !strings.Contains(string(stateRaw), `"itemprops:basearmorclass.name"`) || !strings.Contains(string(stateRaw), `"itemprops:basearmorclass.property_text"`) { + t.Fatalf("expected itemprops TLK keys in state, got:\n%s", string(stateRaw)) + } +} + +func TestNormalizeProjectImportsLegacyItempropsRegistry(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "tlk", "modules", "itemprops")) + writeFile(t, filepath.Join(root, "reference", "tlk", "lock.json"), `{ + "itemprops:basearmorclass.name": 384, + "itemprops:basearmorclass.property_text": 385 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "modules", "itemprops", "add_itemprops.json"), `{ + "entries": { + "itemprops:basearmorclass.name": {"text": "Base Armor Class"}, + "itemprops:basearmorclass.property_text": {"text": "Base armor class"} + } +}`+"\n") + + refData := filepath.Join(root, "reference", "data", "itemprops") + mkdirAll(t, filepath.Join(refData, "defs", "modules")) + mkdirAll(t, filepath.Join(refData, "sets", "modules")) + mkdirAll(t, filepath.Join(refData, "costtables", "index", "modules")) + mkdirAll(t, filepath.Join(refData, "costtables", "baseaccost")) + mkdirAll(t, filepath.Join(refData, "paramtables", "index")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + writeFile(t, filepath.Join(refData, "defs", "base.json"), `{ + "output": "itempropdef.2da", + "columns": ["Name","Label","SubTypeResRef","Cost","CostTableResRef","Param1ResRef","GameStrRef","Description"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(refData, "defs", "lock.json"), `{"itempropdef:basearmorclass":31}`+"\n") + writeFile(t, filepath.Join(refData, "defs", "modules", "add_eos.json"), `{ + "entries": { + "itempropdef:basearmorclass": { + "Name": {"tlk": "itemprops:basearmorclass.name"}, + "Label": "BaseArmorClass", + "SubTypeResRef": "****", + "Cost": "0", + "CostTableResRef": "31", + "Param1ResRef": "****", + "GameStrRef": {"tlk": "itemprops:basearmorclass.property_text"}, + "Description": "****" + } + } +}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "base.json"), `{ + "output": "itemprops.2da", + "columns": ["0_Melee","1_Ranged","2_Thrown","3_Staves","4_Rods","5_Ammo","6_Arm_Shld","7_Helm","8_Potions","9_Scrolls","10_Wands","11_Thieves","12_TrapKits","13_Hide","14_Claw","15_Misc_Uneq","16_Misc","17_No_Props","18_Containers","19_HealerKit","20_Torch","21_Glove","StringRef","Label"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "lock.json"), `{"itemprops:basearmorclass":31}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "modules", "add_eos.json"), `{ + "entries": { + "itemprops:basearmorclass": { + "6_Arm_Shld": "1", + "StringRef": {"tlk": "itemprops:basearmorclass.name"}, + "Label": "BaseArmorClass" + } + } +}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "base.json"), `{ + "output": "iprp_costtable.2da", + "columns": ["Name","Label","ClientLoad"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "lock.json"), `{"itemprops:costtable_index:iprp_baseaccost":31}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "modules", "add_eos.json"), `{ + "entries": { + "itemprops:costtable_index:iprp_baseaccost": { + "Name": "iprp_baseaccost", + "Label": "IPRP_BASEACCOST", + "ClientLoad": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "baseaccost", "base.json"), `{ + "output": "iprp_baseaccost.2da", + "columns": ["Name","Cost"], + "rows": [{"id": 0, "Name": "0", "Cost": "0"}] +}`+"\n") + writeFile(t, filepath.Join(refData, "paramtables", "index", "base.json"), `{ + "output": "iprp_paramtable.2da", + "columns": ["Name","Lable","TableResRef"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(refData, "paramtables", "index", "lock.json"), `{} `+"\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 5 { + t.Fatalf("expected registry files to be imported, got %#v", result) + } + + propertiesRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "itemprops", "registry", "properties.json")) + if err != nil { + t.Fatalf("read properties.json: %v", err) + } + text := string(propertiesRaw) + if !strings.Contains(text, `"itemprop:basearmorclass"`) || !strings.Contains(text, `"text": "Base Armor Class"`) || !strings.Contains(text, `"availability": [`) { + t.Fatalf("unexpected imported properties.json:\n%s", text) + } + if strings.Contains(text, `"tlk": "itemprops:basearmorclass.name"`) { + t.Fatalf("expected imported itemprops TLK text to be fully inlined, got:\n%s", text) + } + + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "itemprops", "registry", "lock.json")) + if err != nil { + t.Fatalf("read registry lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"itemprop:basearmorclass": 31`) || !strings.Contains(string(lockRaw), `"cost_models:iprpbaseaccost": 31`) { + t.Fatalf("unexpected registry lock:\n%s", string(lockRaw)) + } + + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + if !strings.Contains(string(stateRaw), `"itemprops:basearmorclass.name"`) || !strings.Contains(string(stateRaw), `"id": 384`) { + t.Fatalf("expected imported itemprops ids to seed tlk state, got:\n%s", string(stateRaw)) + } +} + +func TestNormalizeProjectRefreshesLegacyItempropsRegistry(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "itemprops", "registry")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "properties.json"), `{ + "rows": [ + { + "key": "itemprop:basearmorclass", + "label": "BaseArmorClass", + "name": {"tlk": "itemprops:basearmorclass.name"}, + "property_text": {"tlk": "itemprops:basearmorclass.property_text"}, + "availability": ["arm_shld"], + "cost": {"value": "0", "ref": "cost_models:iprpbaseaccost"} + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "cost_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "param_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "subtype_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "lock.json"), `{} `+"\n") + mkdirAll(t, filepath.Join(root, "reference", "tlk", "modules", "itemprops")) + writeFile(t, filepath.Join(root, "reference", "tlk", "lock.json"), `{ + "itemprops:basearmorclass.name": 384, + "itemprops:basearmorclass.property_text": 385 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "modules", "itemprops", "add_itemprops.json"), `{ + "entries": { + "itemprops:basearmorclass.name": {"text": "Base Armor Class"}, + "itemprops:basearmorclass.property_text": {"text": "Base armor class"} + } +}`+"\n") + refData := filepath.Join(root, "reference", "data", "itemprops") + mkdirAll(t, filepath.Join(refData, "defs", "modules")) + mkdirAll(t, filepath.Join(refData, "sets", "modules")) + mkdirAll(t, filepath.Join(refData, "costtables", "index", "modules")) + mkdirAll(t, filepath.Join(refData, "costtables", "baseaccost")) + mkdirAll(t, filepath.Join(refData, "paramtables", "index")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + writeFile(t, filepath.Join(refData, "defs", "base.json"), `{"output":"itempropdef.2da","columns":["Name","Label","SubTypeResRef","Cost","CostTableResRef","Param1ResRef","GameStrRef","Description"],"rows":[]}`+"\n") + writeFile(t, filepath.Join(refData, "defs", "lock.json"), `{"itempropdef:basearmorclass":31}`+"\n") + writeFile(t, filepath.Join(refData, "defs", "modules", "add_eos.json"), `{"entries":{"itempropdef:basearmorclass":{"Name":{"tlk":"itemprops:basearmorclass.name"},"Label":"BaseArmorClass","SubTypeResRef":"****","Cost":"0","CostTableResRef":"31","Param1ResRef":"****","GameStrRef":{"tlk":"itemprops:basearmorclass.property_text"},"Description":"****"}}}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "base.json"), `{"output":"itemprops.2da","columns":["0_Melee","1_Ranged","2_Thrown","3_Staves","4_Rods","5_Ammo","6_Arm_Shld","7_Helm","8_Potions","9_Scrolls","10_Wands","11_Thieves","12_TrapKits","13_Hide","14_Claw","15_Misc_Uneq","16_Misc","17_No_Props","18_Containers","19_HealerKit","20_Torch","21_Glove","StringRef","Label"],"rows":[]}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "lock.json"), `{"itemprops:basearmorclass":31}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "modules", "add_eos.json"), `{"entries":{"itemprops:basearmorclass":{"6_Arm_Shld":"1","StringRef":{"tlk":"itemprops:basearmorclass.name"},"Label":"BaseArmorClass"}}}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "base.json"), `{"output":"iprp_costtable.2da","columns":["Name","Label","ClientLoad"],"rows":[]}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "lock.json"), `{"itemprops:costtable_index:iprp_baseaccost":31}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "modules", "add_eos.json"), `{"entries":{"itemprops:costtable_index:iprp_baseaccost":{"Name":"iprp_baseaccost","Label":"IPRP_BASEACCOST","ClientLoad":"0"}}}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "baseaccost", "base.json"), `{"output":"iprp_baseaccost.2da","columns":["Name","Cost"],"rows":[{"id":0,"Name":"0","Cost":"0"}]}`+"\n") + writeFile(t, filepath.Join(refData, "paramtables", "index", "base.json"), `{"output":"iprp_paramtable.2da","columns":["Name","Lable","TableResRef"],"rows":[]}`+"\n") + writeFile(t, filepath.Join(refData, "paramtables", "index", "lock.json"), `{} `+"\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 5 { + t.Fatalf("expected registry refresh, got %#v", result) + } + propertiesRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "itemprops", "registry", "properties.json")) + if err != nil { + t.Fatalf("read properties.json: %v", err) + } + if strings.Contains(string(propertiesRaw), `"tlk": "itemprops:basearmorclass.name"`) { + t.Fatalf("expected refreshed registry to inline TLK text, got:\n%s", string(propertiesRaw)) + } +} + +func TestNormalizeProjectPreservesItempropsSetProjectionDifferences(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "itemprops", "defs", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "data", "itemprops", "sets", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "data", "itemprops", "costtables", "index")) + mkdirAll(t, filepath.Join(root, "reference", "data", "itemprops", "paramtables", "index")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "defs", "base.json"), `{ + "output": "itempropdef.2da", + "columns": ["Name","Label","SubTypeResRef","Cost","CostTableResRef","Param1ResRef","GameStrRef","Description"], + "rows": [ + {"id":82,"key":"itempropdef:onhitcastspell","Name":"83400","Label":"OnHitCastSpell","SubTypeResRef":"IPRP_ONHITSPELL","Cost":"****","CostTableResRef":"26","Param1ResRef":"****","GameStrRef":"5512","Description":"1450"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "defs", "lock.json"), `{"itempropdef:onhitcastspell":82}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "sets", "base.json"), `{ + "output": "itemprops.2da", + "columns": ["0_Melee","1_Ranged","2_Thrown","3_Staves","4_Rods","5_Ammo","6_Arm_Shld","7_Helm","8_Potions","9_Scrolls","10_Wands","11_Thieves","12_TrapKits","13_Hide","14_Claw","15_Misc_Uneq","16_Misc","17_No_Props","18_Containers","19_HealerKit","20_Torch","21_Glove","StringRef","Label"], + "rows": [ + {"id":82,"0_Melee":"1","1_Ranged":"****","2_Thrown":"1","3_Staves":"1","4_Rods":"****","5_Ammo":"1","6_Arm_Shld":"1","7_Helm":"****","8_Potions":"****","9_Scrolls":"****","10_Wands":"****","11_Thieves":"****","12_TrapKits":"****","13_Hide":"1","14_Claw":"1","15_Misc_Uneq":"****","16_Misc":"****","17_No_Props":"****","18_Containers":"****","19_HealerKit":"****","20_Torch":"****","21_Glove":"1","StringRef":"723","Label":"On_Hit_Cast_Spell"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "sets", "lock.json"), `{"itemprops:onhitcastspell":82}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "costtables", "index", "base.json"), `{ + "output": "iprp_costtable.2da", + "columns": ["Name","Label","ClientLoad"], + "rows": [{"id":26,"Name":"iprp_spellcst","Label":"IPRP_SPELLCST","ClientLoad":"0"}] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "costtables", "index", "lock.json"), `{"cost_models:iprpspellcstr":26}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "paramtables", "index", "base.json"), `{"output":"iprp_paramtable.2da","columns":["Name","Lable","TableResRef"],"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "itemprops", "paramtables", "index", "lock.json"), `{} `+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + + propertiesRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "itemprops", "registry", "properties.json")) + if err != nil { + t.Fatalf("read properties.json: %v", err) + } + text := string(propertiesRaw) + for _, want := range []string{`"label": "OnHitCastSpell"`, `"set_label": "On_Hit_Cast_Spell"`, `"name": "83400"`, `"set_name": "723"`} { + if !strings.Contains(text, want) { + t.Fatalf("expected %s in imported registry, got:\n%s", want, text) + } + } +} + +func TestItempropsRegistryMatchesLegacyReferenceOutputs(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "tlk", "modules", "itemprops")) + writeFile(t, filepath.Join(root, "reference", "tlk", "lock.json"), `{ + "itemprops:basearmorclass.name": 384, + "itemprops:basearmorclass.property_text": 385, + "itemprops:maximumdexteritybonus.name": 386, + "itemprops:maximumdexteritybonus.property_text": 387, + "itemprops:armorcheckpenalty.name": 388, + "itemprops:armorcheckpenalty.property_text": 389 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "modules", "itemprops", "add_itemprops.json"), `{ + "entries": { + "itemprops:basearmorclass.name": {"text": "Base Armor Class"}, + "itemprops:basearmorclass.property_text": {"text": "Base Armor Class:"}, + "itemprops:maximumdexteritybonus.name": {"text": "Maximum Dexterity Bonus"}, + "itemprops:maximumdexteritybonus.property_text": {"text": "Maximum Dexterity Bonus:"}, + "itemprops:armorcheckpenalty.name": {"text": "Armor Check Penalty"}, + "itemprops:armorcheckpenalty.property_text": {"text": "Armor Check Penalty:"} + } +}`+"\n") + refData := filepath.Join(root, "reference", "data", "itemprops") + mkdirAll(t, filepath.Join(refData, "defs", "modules")) + mkdirAll(t, filepath.Join(refData, "sets", "modules")) + mkdirAll(t, filepath.Join(refData, "costtables", "index", "modules")) + mkdirAll(t, filepath.Join(refData, "costtables", "baseaccost")) + mkdirAll(t, filepath.Join(refData, "costtables", "maxdexcost")) + mkdirAll(t, filepath.Join(refData, "costtables", "accheckcost")) + mkdirAll(t, filepath.Join(refData, "paramtables", "index")) + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import json, os, sys +root = os.getcwd() +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +def write_table(src_rel): + with open(os.path.join(root, "data", src_rel), "r", encoding="utf-8") as f: + obj = json.load(f) + cols = obj["columns"] + rows = obj["rows"] + out_name = obj["output"] + with open(os.path.join(out, out_name), "w", encoding="utf-8") as f: + f.write("2DA V2.0\\n\\n") + f.write("\\t".join(cols) + "\\n") + for row in rows: + vals = [str(row.get("id", ""))] + for c in cols: + vals.append(str(row[c])) + f.write("\\t".join(vals) + "\\n") +for rel in [ + "itemprops/sets/base.json", + "itemprops/defs/base.json", + "itemprops/costtables/index/base.json", + "itemprops/paramtables/index/base.json", + "itemprops/costtables/baseaccost/base.json", + "itemprops/costtables/maxdexcost/base.json", + "itemprops/costtables/accheckcost/base.json", +]: + write_table(rel) +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`+"\n") + writeFile(t, filepath.Join(refData, "defs", "base.json"), `{ + "output": "itempropdef.2da", + "columns": ["Name","Label","SubTypeResRef","Cost","CostTableResRef","Param1ResRef","GameStrRef","Description"], + "rows": [ + {"id":31,"key":"itempropdef:basearmorclass","Name":{"tlk":"itemprops:basearmorclass.name"},"Label":"BaseArmorClass","SubTypeResRef":"****","Cost":"0","CostTableResRef":"31","Param1ResRef":"****","GameStrRef":{"tlk":"itemprops:basearmorclass.property_text"},"Description":"****"}, + {"id":32,"key":"itempropdef:maximumdexteritybonus","Name":{"tlk":"itemprops:maximumdexteritybonus.name"},"Label":"MaximumDexterityBonus","SubTypeResRef":"****","Cost":"0","CostTableResRef":"32","Param1ResRef":"****","GameStrRef":{"tlk":"itemprops:maximumdexteritybonus.property_text"},"Description":"****"}, + {"id":33,"key":"itempropdef:armorcheckpenalty","Name":{"tlk":"itemprops:armorcheckpenalty.name"},"Label":"ArmorCheckPenalty","SubTypeResRef":"****","Cost":"0","CostTableResRef":"33","Param1ResRef":"****","GameStrRef":{"tlk":"itemprops:armorcheckpenalty.property_text"},"Description":"****"} + ] +}`+"\n") + writeFile(t, filepath.Join(refData, "defs", "lock.json"), `{"itempropdef:basearmorclass":31,"itempropdef:maximumdexteritybonus":32,"itempropdef:armorcheckpenalty":33}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "base.json"), `{ + "output": "itemprops.2da", + "columns": ["0_Melee","1_Ranged","2_Thrown","3_Staves","4_Rods","5_Ammo","6_Arm_Shld","7_Helm","8_Potions","9_Scrolls","10_Wands","11_Thieves","12_TrapKits","13_Hide","14_Claw","15_Misc_Uneq","16_Misc","17_No_Props","18_Containers","19_HealerKit","20_Torch","21_Glove","StringRef","Label"], + "rows": [ + {"id":31,"key":"itemprops:basearmorclass","0_Melee":"****","1_Ranged":"****","2_Thrown":"****","3_Staves":"****","4_Rods":"****","5_Ammo":"****","6_Arm_Shld":"1","7_Helm":"****","8_Potions":"****","9_Scrolls":"****","10_Wands":"****","11_Thieves":"****","12_TrapKits":"****","13_Hide":"****","14_Claw":"****","15_Misc_Uneq":"****","16_Misc":"****","17_No_Props":"****","18_Containers":"****","19_HealerKit":"****","20_Torch":"****","21_Glove":"****","StringRef":{"tlk":"itemprops:basearmorclass.name"},"Label":"BaseArmorClass"}, + {"id":32,"key":"itemprops:maximumdexteritybonus","0_Melee":"****","1_Ranged":"****","2_Thrown":"****","3_Staves":"****","4_Rods":"****","5_Ammo":"****","6_Arm_Shld":"1","7_Helm":"****","8_Potions":"****","9_Scrolls":"****","10_Wands":"****","11_Thieves":"****","12_TrapKits":"****","13_Hide":"****","14_Claw":"****","15_Misc_Uneq":"****","16_Misc":"****","17_No_Props":"****","18_Containers":"****","19_HealerKit":"****","20_Torch":"****","21_Glove":"****","StringRef":{"tlk":"itemprops:maximumdexteritybonus.name"},"Label":"MaximumDexterityBonus"}, + {"id":33,"key":"itemprops:armorcheckpenalty","0_Melee":"****","1_Ranged":"****","2_Thrown":"****","3_Staves":"****","4_Rods":"****","5_Ammo":"****","6_Arm_Shld":"1","7_Helm":"****","8_Potions":"****","9_Scrolls":"****","10_Wands":"****","11_Thieves":"****","12_TrapKits":"****","13_Hide":"****","14_Claw":"****","15_Misc_Uneq":"****","16_Misc":"****","17_No_Props":"****","18_Containers":"****","19_HealerKit":"****","20_Torch":"****","21_Glove":"****","StringRef":{"tlk":"itemprops:armorcheckpenalty.name"},"Label":"ArmorCheckPenalty"} + ] +}`+"\n") + writeFile(t, filepath.Join(refData, "sets", "lock.json"), `{"itemprops:basearmorclass":31,"itemprops:maximumdexteritybonus":32,"itemprops:armorcheckpenalty":33}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "base.json"), `{ + "output": "iprp_costtable.2da", + "columns": ["Name","Label","ClientLoad"], + "rows": [ + {"id":31,"Name":"iprp_baseaccost","Label":"IPRP_BASEACCOST","ClientLoad":"0"}, + {"id":32,"Name":"iprp_maxdexcost","Label":"IPRP_MAXDEXCOST","ClientLoad":"0"}, + {"id":33,"Name":"iprp_accheckcost","Label":"IPRP_ACCHECKCOST","ClientLoad":"0"} + ] +}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "index", "lock.json"), `{"itemprops:costtable_index:iprp_baseaccost":31,"itemprops:costtable_index:iprp_maxdexcost":32,"itemprops:costtable_index:iprp_accheckcost":33}`+"\n") + writeFile(t, filepath.Join(refData, "paramtables", "index", "base.json"), `{"output":"iprp_paramtable.2da","columns":["Name","Lable","TableResRef"],"rows":[]}`+"\n") + writeFile(t, filepath.Join(refData, "paramtables", "index", "lock.json"), `{} `+"\n") + writeFile(t, filepath.Join(refData, "costtables", "baseaccost", "base.json"), `{"output":"iprp_baseaccost.2da","columns":["Name","Cost"],"rows":[{"id":0,"Name":"0","Cost":"0"}]}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "maxdexcost", "base.json"), `{"output":"iprp_maxdexcost.2da","columns":["Name","Cost"],"rows":[{"id":0,"Name":"0","Cost":"0"}]}`+"\n") + writeFile(t, filepath.Join(refData, "costtables", "accheckcost", "base.json"), `{"output":"iprp_accheckcost.2da","columns":["Name","Cost"],"rows":[{"id":0,"Name":"0","Cost":"0"}]}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + for _, outputName := range []string{"itemprops.2da", "itempropdef.2da", "iprp_costtable.2da", "iprp_paramtable.2da"} { + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, outputName)) + if err != nil { + t.Fatalf("read native %s: %v", outputName, err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, outputName)) + if err != nil { + t.Fatalf("read reference %s: %v", outputName, err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("output mismatch for %s\nnative:\n%s\nreference:\n%s", outputName, string(nativeBytes), string(referenceBytes)) + } + } + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + for _, want := range []string{`"itemprops:basearmorclass.name"`, `"itemprops:maximumdexteritybonus.name"`, `"itemprops:armorcheckpenalty.name"`} { + if !strings.Contains(string(stateRaw), want) { + t.Fatalf("expected %s in tlk state, got:\n%s", want, string(stateRaw)) + } + } +} + +func TestValidateProjectRejectsBrokenItempropsRegistryRefs(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "itemprops", "registry")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "properties.json"), `{ + "rows": [ + { + "key": "itemprop:test", + "label": "DuplicateLabel", + "name": {"tlk": {"text": "Test"}}, + "property_text": {"tlk": {"text": "Prop Text"}}, + "availability": ["not_a_group"], + "cost": {"ref": "cost_models:missing"}, + "param": {"ref": "param_models:missing"}, + "subtype": {"ref": "subtype_models:missing"} + }, + { + "key": "itemprop:test2", + "label": "DuplicateLabel", + "name": {"tlk": {"text": "Other"}}, + "property_text": {"tlk": {"text": "Other Prop"}} + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "cost_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "param_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "subtype_models.json"), `{"rows":[]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "itemprops", "registry", "lock.json"), `{} `+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatalf("expected validation errors, got %#v", report.Diagnostics) + } + joined := diagnosticsText(report.Diagnostics) + for _, want := range []string{ + "unknown availability group", + "unknown cost ref cost_models:missing", + "unknown param ref param_models:missing", + "unknown subtype ref subtype_models:missing", + "generated itempropdef label collision", + "generated itemprops set label collision", + } { + if !strings.Contains(joined, want) { + t.Fatalf("expected validation message %q, got:\n%s", want, joined) + } + } +} + +func TestValidateProjectRejectsInvalidInheritanceUsage(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "custom")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "example.json"), `{ + "output": "custom.2da", + "columns": ["LABEL", "PARENT", "VALUE"], + "rows": [ + { + "key": "custom:child", + "LABEL": "Child", + "inherit": { + "from": "PARENT", + "fields": ["VALUE", "MISSING"] + } + } + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatalf("expected validation errors, got %#v", report.Diagnostics) + } + joined := diagnosticsText(report.Diagnostics) + for _, want := range []string{ + `inherit.from field "PARENT" was not found on row`, + `inherit field "MISSING" is not a known column`, + } { + if !strings.Contains(joined, want) { + t.Fatalf("expected validation message %q, got:\n%s", want, joined) + } + } +} + +func TestBuildSupportsGenericInheritanceSugar(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "custom")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "example.json"), `{ + "output": "custom.2da", + "columns": ["LABEL", "PARENT", "VALUE", "ICON"], + "rows": [ + {"id": 0, "key": "custom:parent", "LABEL": "Parent", "VALUE": "7", "ICON": "parent_icon"}, + {"id": 1, "key": "custom:child", "LABEL": "Child", "PARENT": {"id": "custom:parent"}, "inherit": {"from": "PARENT", "fields": ["VALUE", "ICON"]}}, + {"id": 2, "key": "custom:override", "LABEL": "Override", "PARENT": {"id": "custom:parent"}, "VALUE": "9", "inherit": {"from": "PARENT", "fields": ["VALUE", "ICON"]}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "lock.json"), `{ + "custom:parent": 0, + "custom:child": 1, + "custom:override": 2 +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + if result.Mode != "native" { + t.Fatalf("expected native mode, got %#v", result) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "custom.2da")) + if err != nil { + t.Fatalf("read custom.2da: %v", err) + } + want := "2DA V2.0\n\nLABEL\tPARENT\tVALUE\tICON\n0\tParent\t****\t7\tparent_icon\n1\tChild\t0\t7\tparent_icon\n2\tOverride\t0\t9\tparent_icon\n" + if string(got) != want { + t.Fatalf("unexpected custom.2da output:\n%s", string(got)) + } +} + +func TestBuildRejectsUnresolvedInheritedParent(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "custom")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "example.json"), `{ + "output": "custom.2da", + "columns": ["LABEL", "PARENT", "VALUE"], + "rows": [ + {"id": 0, "key": "custom:child", "LABEL": "Child", "PARENT": {"field": "VALUE", "ref": "custom:parent"}, "inherit": {"from": "PARENT", "fields": ["VALUE"]}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "lock.json"), `{"custom:child":0}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + _, err := BuildNative(testProject(root), nil) + if err == nil || !strings.Contains(err.Error(), `inherit.from field "PARENT" must resolve to a keyed parent row reference`) { + t.Fatalf("expected inherit parent error, got %v", err) + } +} + +func TestValidateProjectRejectsInvalidGenericInheritanceUsage(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "custom")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "example.json"), `{ + "output": "custom.2da", + "columns": ["LABEL", "DETAILS"], + "rows": [ + { + "key": "custom:child", + "LABEL": "Child", + "DETAILS": { + "inherit": { + "ref": "not_a_key" + }, + "foo": "bar" + } + } + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatalf("expected validation errors, got %#v", report.Diagnostics) + } + joined := diagnosticsText(report.Diagnostics) + if !strings.Contains(joined, `inherit.ref "not_a_key" must use dataset:key identity`) { + t.Fatalf("expected generic inherit validation message, got:\n%s", joined) + } +} + +func TestBuildSupportsGenericNestedObjectInheritance(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "custom")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "example.json"), `{ + "output": "custom.2da", + "columns": ["LABEL", "DETAILS"], + "rows": [ + { + "id": 0, + "key": "custom:parent", + "LABEL": "Parent", + "DETAILS": { + "flags": ["base"], + "meta": { + "cost": "5", + "icon": "base_icon" + } + } + }, + { + "id": 1, + "key": "custom:child", + "LABEL": "Child", + "DETAILS": { + "inherit": { + "ref": "custom:parent", + "field": "DETAILS" + }, + "flags": ["local"], + "meta": { + "cost": "9" + } + } + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "lock.json"), `{ + "custom:parent": 0, + "custom:child": 1 +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "custom.2da")) + if err != nil { + t.Fatalf("read custom.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, `{"flags":["base"],"meta":{"cost":"5","icon":"base_icon"}}`) { + t.Fatalf("expected parent object in output, got:\n%s", text) + } + if !strings.Contains(text, `{"flags":["local"],"meta":{"cost":"9","icon":"base_icon"}}`) { + t.Fatalf("expected merged child object in output, got:\n%s", text) + } +} + +func TestBuildRejectsCyclicGenericInheritance(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "custom")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "example.json"), `{ + "output": "custom.2da", + "columns": ["LABEL", "VALUE"], + "rows": [ + { + "id": 0, + "key": "custom:a", + "LABEL": "A", + "inherit": { + "ref": "custom:b" + } + }, + { + "id": 1, + "key": "custom:b", + "LABEL": "B", + "inherit": { + "ref": "custom:a" + } + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "custom", "lock.json"), `{ + "custom:a": 0, + "custom:b": 1 +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + _, err := Build(testProject(root), nil) + if err == nil || !strings.Contains(err.Error(), "cyclic inheritance detected") { + t.Fatalf("expected cyclic inheritance error, got %v", err) + } +} + +func TestBuildSupportsFeatInheritanceFromMasterfeats(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "skills")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON", "PreReqEpic"], + "rows": [ + { + "id": 4, + "key": "masterfeats:skillfocus", + "LABEL": "SkillFocus", + "STRREF": {"tlk": {"key": "masterfeats:skillfocus.name", "text": "Skill Focus"}}, + "DESCRIPTION": {"tlk": {"key": "masterfeats:skillfocus.description", "text": "Choose a skill."}}, + "ICON": "ife_skfoc", + "PreReqEpic": "0" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{"masterfeats:skillfocus":4}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "base.json"), `{ + "output": "skills.2da", + "columns": ["Label", "Name", "Description"], + "rows": [ + {"id": 31, "key": "skills:athletics", "Label": "Athletics", "Name": {"tlk": {"key": "skills:athletics.name", "text": "Athletics"}}, "Description": {"tlk": {"key": "skills:athletics.description", "text": "Athletics description"}}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "lock.json"), `{"skills:athletics":31}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION", "ICON", "MASTERFEAT", "REQSKILL", "PreReqEpic"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:skillfocus_athletics":1158}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "skillfocus.json"), `{ + "entries": { + "feat:skillfocus_athletics": { + "inherit": { + "ref": "masterfeats:skillfocus" + }, + "LABEL": "FEAT_SKILL_FOCUS_ATHLETICS", + "FEAT": { + "tlk": { + "key": "feat:skillfocus_athletics.name", + "text": "Skill Focus: Athletics" + } + }, + "MASTERFEAT": { + "id": "masterfeats:skillfocus" + }, + "REQSKILL": { + "id": "skills:athletics" + } + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('reference should not run')\n") + + result, err := Build(testProject(root), nil) + if err != nil { + t.Fatalf("Build failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "feat.2da")) + if err != nil { + t.Fatalf("read feat.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "1158\tFEAT_SKILL_FOCUS_ATHLETICS\t16777216\t16777217\tife_skfoc\t4\t31\t0\n") { + t.Fatalf("expected inherited feat row, got:\n%s", text) + } +} + +func TestValidateProjectRejectsInvalidFeatGeneratedFile(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "generated")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:test":0}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "generated", "skill_focus.json"), `{ + "family": "skill_focus", + "family_key": "skillfocus", + "child_source": {"dataset":"skills","predicate":"accessible"}, + "overrides": {} +}`+"\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatal("expected validation errors for invalid feat generated file") + } + text := diagnosticsText(report.Diagnostics) + for _, want := range []string{ + "compact feat generated file must contain a non-empty template string", + } { + if !strings.Contains(text, want) { + t.Fatalf("expected diagnostic %q, got:\n%s", want, text) + } + } +} + +func writeFeatGeneratedHarness(t *testing.T, root string, generatedFiles map[string]string, lock map[string]int) { + t.Helper() + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "skills")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "baseitems")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "races")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "spells")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "generated")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON", "CRValue", "ReqSkillMinRanks", "MINATTACKBONUS", "SUCCESSOR", "ALLCLASSESCANUSE", "PreReqEpic", "ReqAction", "TOOLSCATEGORIES"], + "rows": [ + {"id": 4, "key": "masterfeats:skillfocus", "LABEL": "SkillFocus", "STRREF": {"tlk": {"key": "masterfeats:skillfocus.name", "text": "Skill Focus"}}, "DESCRIPTION": {"tlk": {"key": "masterfeats:skillfocus.description", "text": "Choose a skill."}}, "ICON": "ife_skfoc", "CRValue": "0.5", "ReqSkillMinRanks": "3"}, + {"id": 5, "key": "masterfeats:greaterskillfocus", "LABEL": "GreaterSkillFocus", "STRREF": {"tlk": {"key": "masterfeats:greaterskillfocus.name", "text": "Greater Skill Focus"}}, "DESCRIPTION": {"tlk": {"key": "masterfeats:greaterskillfocus.description", "text": "Choose a skill again."}}, "ICON": "ife_skfoc", "CRValue": "1", "ReqSkillMinRanks": "6"}, + {"id": 6, "key": "masterfeats:weaponfocus", "LABEL": "WeaponFocus", "STRREF": {"tlk": {"key": "masterfeats:weaponfocus.name", "text": "Weapon Focus"}}, "DESCRIPTION": {"tlk": {"key": "masterfeats:weaponfocus.description", "text": "Focus on one weapon."}}, "ICON": "ife_wepfoc", "CRValue": "1", "MINATTACKBONUS": "1", "ALLCLASSESCANUSE": "1", "PreReqEpic": "0", "ReqAction": "1", "TOOLSCATEGORIES": "1"}, + {"id": 7, "key": "masterfeats:improvedcritical", "LABEL": "ImprovedCritical", "STRREF": {"tlk": {"key": "masterfeats:improvedcritical.name", "text": "Improved Critical"}}, "DESCRIPTION": {"tlk": {"key": "masterfeats:improvedcritical.description", "text": "Improved critical threat."}}, "ICON": "ife_impcrit", "CRValue": "1", "MINATTACKBONUS": "8", "ALLCLASSESCANUSE": "1", "PreReqEpic": "0", "ReqAction": "1", "TOOLSCATEGORIES": "1"}, + {"id": 8, "key": "masterfeats:weaponproficiencycommoner", "LABEL": "WeaponProficiencyCommoner", "STRREF": {"tlk": {"key": "masterfeats:weaponproficiencycommoner.name", "text": "Commoner Weapon Proficiency"}}, "DESCRIPTION": {"tlk": {"key": "masterfeats:weaponproficiencycommoner.description", "text": "Simple commoner weapon proficiency."}}, "ICON": "ife_weppro", "CRValue": "0.2", "SUCCESSOR": "9", "ALLCLASSESCANUSE": "1", "PreReqEpic": "0", "ReqAction": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{"masterfeats:skillfocus":4,"masterfeats:greaterskillfocus":5,"masterfeats:weaponfocus":6,"masterfeats:improvedcritical":7,"masterfeats:weaponproficiencycommoner":8}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "base.json"), `{ + "output": "skills.2da", + "columns": ["Label", "Name", "Description", "Icon", "Untrained", "KeyAbility", "ArmorCheckPenalty", "AllClassesCanUse", "Category", "MaxCR", "Constant", "HostileSkill", "HideFromLevelUp"], + "rows": [ + {"id": 1, "key": "skills:concentration", "Label": "Concentration", "Name": "270", "Description": "345", "Icon": "isk_concen", "Untrained": "1", "KeyAbility": "CON", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_CONCENTRATION", "HostileSkill": "0", "HideFromLevelUp": "0"}, + {"id": 2, "key": "skills:athletics", "Label": "Athletics", "Name": "271", "Description": "346", "Icon": "isk_athletics", "Untrained": "1", "KeyAbility": "STR", "ArmorCheckPenalty": "1", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_ATHLETICS", "HostileSkill": "0", "HideFromLevelUp": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "lock.json"), `{"skills:concentration":1,"skills:athletics":2}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "base.json"), `{ + "output": "baseitems.2da", + "columns": ["label", "Name", "WeaponFocusFeat", "WeaponImprovedCriticalFeat", "WeaponSpecializationFeat", "EpicWeaponFocusFeat", "EpicWeaponSpecializationFeat", "EpicWeaponOverwhelmingCriticalFeat"], + "rows": [ + {"id": 1, "key": "baseitems:testclub", "label": "test_club", "Name": {"tlk": {"key": "baseitems:testclub.name", "text": "Test Club"}}, "WeaponFocusFeat": "3003", "WeaponImprovedCriticalFeat": "3004", "WeaponSpecializationFeat": "****", "EpicWeaponFocusFeat": "****", "EpicWeaponSpecializationFeat": "****", "EpicWeaponOverwhelmingCriticalFeat": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "lock.json"), `{"baseitems:testclub":1}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "base.json"), `{ + "columns": ["Label", "Name", "FeatsTable"], + "rows": [ + {"id": 7, "key": "racialtypes:beast", "Label": "Beast", "Name": "Beast", "FeatsTable": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "lock.json"), `{"racialtypes:beast":7,"racialtypes:testfolk":31}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "races", "testfolk.json"), `{ + "key": "racialtypes:testfolk", + "core": { + "Label": "Testfolk", + "Name": {"tlk": {"key": "racialtypes:testfolk.name", "text": "Testfolk"}} + }, + "feat_output": "race_feat_test.2da", + "feats": [ + {"FeatLabel": "SkillAffinityAthletics", "FeatIndex": {"id": "feat:skillaffinityathletics"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "base.json"), `{"output":"spells.2da","columns":["Label"],"rows":[{"id":10,"key":"spells:specialattacks","Label":"SpecialAttacks"}]}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "lock.json"), `{"spells:specialattacks":10}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "compare_reference": false, + "columns": [ + "LABEL","FEAT","DESCRIPTION","ICON","MINATTACKBONUS","MINSTR","MINDEX","MININT","MINWIS","MINCON","MINCHA", + "MINSPELLLVL","PREREQFEAT1","PREREQFEAT2","GAINMULTIPLE","EFFECTSSTACK","ALLCLASSESCANUSE","CATEGORY","MAXCR", + "SPELLID","SUCCESSOR","CRValue","USESPERDAY","MASTERFEAT","TARGETSELF","OrReqFeat0","OrReqFeat1","OrReqFeat2", + "OrReqFeat3","OrReqFeat4","REQSKILL","ReqSkillMinRanks","REQSKILL2","ReqSkillMinRanks2","Constant","TOOLSCATEGORIES", + "HostileFeat","MinLevel","MinLevelClass","MaxLevel","MinFortSave","PreReqEpic","ReqAction" + ], + "rows": [] +}`+"\n") + lockJSON, err := json.MarshalIndent(lock, "", " ") + if err != nil { + t.Fatalf("marshal feat lock: %v", err) + } + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), string(lockJSON)+"\n") + for name, content := range generatedFiles { + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "generated", name), content) + } +} + +func TestSplitFamilyExpansionIdentity(t *testing.T) { + got := splitFamilyExpansionIdentity("weaponspecialization_club") + if got.Parent != "weaponspecialization" || got.Child != "club" { + t.Fatalf("unexpected family identity: %#v", got) + } + got = splitFamilyExpansionIdentity("gnome") + if got.Parent != "gnome" || got.Child != "" { + t.Fatalf("unexpected standalone family identity: %#v", got) + } +} + +func TestParseRowMetadataSupportsFamilyMetadata(t *testing.T) { + meta, err := parseRowMetadata(map[string]any{ + "family": map[string]any{ + "parent": "weaponspecialization", + "child": "club", + "source": "baseitems:club", + "template": "masterfeats:weaponspecialization", + }, + }) + if err != nil { + t.Fatalf("parseRowMetadata: %v", err) + } + family, ok := meta["family"].(map[string]any) + if !ok { + t.Fatalf("expected family metadata, got %#v", meta) + } + if family["parent"] != "weaponspecialization" || family["child"] != "club" { + t.Fatalf("unexpected family metadata: %#v", family) + } +} + +func TestPreferredGeneratedFeatKeyReusesLegacyCompactChildToken(t *testing.T) { + ctx := &featGeneratedContext{ + lockData: map[string]int{"feat:skillfocus_craftalchemy": 42}, + supplementalID: map[string]int{}, + tlkStateKeys: map[string]struct{}{}, + } + got := ctx.preferredGeneratedFeatKey("skillfocus", "craft_alchemy") + if got != "feat:skillfocus_craftalchemy" { + t.Fatalf("expected reused compact family key, got %q", got) + } +} + +func TestPreferredGeneratedFeatKeyReusesLegacyTLKStateKey(t *testing.T) { + ctx := &featGeneratedContext{ + lockData: map[string]int{}, + supplementalID: map[string]int{}, + tlkStateKeys: map[string]struct{}{"feat:greaterskillfocus_craftalchemy.name": {}}, + } + got := ctx.preferredGeneratedFeatKey("greaterskillfocus", "craft_alchemy") + if got != "feat:greaterskillfocus_craftalchemy" { + t.Fatalf("expected reused tlk-state family key, got %q", got) + } +} + +func TestPruneRetiredGeneratedFeatTLKEntries(t *testing.T) { + entries := map[string]tlkStateMapping{ + "feat:skillfocus_craftalchemy.name": {ID: 10, Retired: true}, + "feat:weaponproficiencycommoner_club.description": {ID: 11, Retired: true}, + "feat:weaponfocus_club.name": {ID: 12, Retired: false}, + "feat:specialattacks.name": {ID: 13, Retired: true}, + "masterfeats:skillfocus.name": {ID: 14, Retired: true}, + } + + pruneRetiredGeneratedFeatTLKEntries(entries) + + if _, ok := entries["feat:skillfocus_craftalchemy.name"]; ok { + t.Fatal("expected retired generated skill focus TLK key to be pruned") + } + if _, ok := entries["feat:weaponproficiencycommoner_club.description"]; ok { + t.Fatal("expected retired generated proficiency TLK key to be pruned") + } + if _, ok := entries["feat:weaponfocus_club.name"]; !ok { + t.Fatal("expected active generated feat TLK key to be preserved") + } + if _, ok := entries["feat:specialattacks.name"]; !ok { + t.Fatal("expected manual specialattacks TLK key to be preserved") + } + if _, ok := entries["masterfeats:skillfocus.name"]; !ok { + t.Fatal("expected non-feat TLK key to be preserved") + } +} + +func TestBuildSupportsGeneratedFeatFamilies(t *testing.T) { + root := testProjectRoot(t) + writeFeatGeneratedHarness(t, root, map[string]string{ + "skill_focus.json": `{"family":"skill_focus","family_key":"skillfocus","template":"masterfeats:skillfocus","child_source":{"dataset":"skills","predicate":"accessible"},"overrides":{"skills:concentration":{"ICON":"ife_skfoc_override"}}}` + "\n", + "greater_skill_focus.json": `{"family":"greater_skill_focus","family_key":"greaterskillfocus","template":"masterfeats:greaterskillfocus","child_source":{"dataset":"skills","predicate":"accessible"}}` + "\n", + "weapon_focus.json": `{"family":"weapon_focus","family_key":"weaponfocus","template":"masterfeats:weaponfocus","child_source":{"dataset":"baseitems","column":"WeaponFocusFeat"},"overrides":{"baseitems:testclub":{"ICON":"ife_wepfoc_override"}}}` + "\n", + "improved_critical.json": `{"family":"improved_critical","family_key":"improvedcritical","template":"masterfeats:improvedcritical","child_source":{"dataset":"baseitems","column":"WeaponImprovedCriticalFeat"}}` + "\n", + "proficiencies.json": `{"family":"proficiencies","entries":{"feat:weaponproficiencycommoner_club":{"LABEL":"CommonerWeaponProficiencyCLUB","FEAT":{"tlk":{"key":"feat:weaponproficiencycommoner_club.name","text":"Commoner Weapon Proficiency (Club)"}},"DESCRIPTION":{"field":"DESCRIPTION","ref":"masterfeats:weaponproficiencycommoner"},"ICON":{"field":"ICON","ref":"masterfeats:weaponproficiencycommoner"},"MASTERFEAT":{"id":"masterfeats:weaponproficiencycommoner"},"SUCCESSOR":{"field":"SUCCESSOR","ref":"masterfeats:weaponproficiencycommoner"},"ALLCLASSESCANUSE":{"field":"ALLCLASSESCANUSE","ref":"masterfeats:weaponproficiencycommoner"},"PreReqEpic":{"field":"PreReqEpic","ref":"masterfeats:weaponproficiencycommoner"},"ReqAction":{"field":"ReqAction","ref":"masterfeats:weaponproficiencycommoner"},"CRValue":{"field":"CRValue","ref":"masterfeats:weaponproficiencycommoner"},"Constant":"FEAT_WEAPON_PROFICIENCY_COMMONER_CLUB"}}}` + "\n", + }, map[string]int{"feat:skillfocus_concentration": 173, "feat:greaterskillfocus_concentration": 589, "feat:skillaffinityathletics": 1253, "feat:weaponfocus_testclub": 3003, "feat:improvedcritical_testclub": 3004, "feat:weaponproficiencycommoner_club": 1123, "feat:specialattacks": 1187, "feat:improvedfeint": 1194}) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules", "activecombat")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules", "proficiency")) + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "activecombat", "specialattacks.json"), `{"entries":{"feat:specialattacks":{"LABEL":"FEAT_SPECIAL_ATTACKS","FEAT":{"tlk":{"key":"feat:specialattacks.name","text":"Special Attacks"}},"DESCRIPTION":{"tlk":{"key":"feat:specialattacks.description","text":"Access special attacks."}},"ICON":"ife_specialatk","CATEGORY":"22","HostileFeat":"1","MAXCR":"0","SPELLID":{"id":"spells:specialattacks"},"Constant":"FEAT_SPECIAL_ATTACKS","TOOLSCATEGORIES":"2","PreReqEpic":"0","ReqAction":"0"},"feat:improvedfeint":{"LABEL":"FEAT_IMPROVED_FEINT","FEAT":{"tlk":{"key":"feat:improvedfeint.name","text":"Improved Feint"}},"DESCRIPTION":{"tlk":{"key":"feat:improvedfeint.description","text":"Improve your feint."}},"ICON":"ife_feint","PREREQFEAT1":{"id":"feat:specialattacks"},"Constant":"FEAT_IMPROVED_FEINT","TOOLSCATEGORIES":{"field":"TOOLSCATEGORIES","ref":"feat:specialattacks"},"PreReqEpic":"0","ReqAction":"1"}}}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "proficiency", "standalone.json"), `{"entries":{"feat:towershieldproficiency":{"LABEL":"FEAT_TOWER_SHIELD_PROFICIENCY","FEAT":{"tlk":{"key":"feat:towershieldproficiency.name","text":"Tower Shield Proficiency"}},"DESCRIPTION":{"tlk":{"key":"feat:towershieldproficiency.description","text":"Use tower shields."}},"ICON":"ife_towshprof","PREREQFEAT1":{"id":"feat:shieldproficiency"},"Constant":"FEAT_TOWER_SHIELD_PROFICIENCY","ReqAction":"1","PreReqEpic":"0"}},"overrides":[{"key":"feat:shieldproficiency","id":32,"DESCRIPTION":{"tlk":{"key":"feat:shieldproficiency.description","text":"Use shields."}}}]}`+"\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative: %v", err) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "feat.2da")) + if err != nil { + t.Fatalf("read feat.2da: %v", err) + } + text := string(got) + for _, want := range []string{"FEAT_SKILL_FOCUS_CONCENTRATION", "FEAT_GREATER_SKILL_FOCUS_CONCENTRATION", "FEAT_SKILL_AFFINITY_ATHLETICS", "FEAT_WEAPON_FOCUS_TEST_CLUB", "FEAT_IMPROVED_CRITICAL_TEST_CLUB", "CommonerWeaponProficiencyCLUB", "FEAT_SPECIAL_ATTACKS", "FEAT_IMPROVED_FEINT", "FEAT_TOWER_SHIELD_PROFICIENCY", "ife_wepfoc_override"} { + if !strings.Contains(text, want) { + t.Fatalf("expected generated feat output to contain %q, got:\n%s", want, text) + } + } +} + +func TestBuildGeneratedFeatSpecialAttacksRequiresSpellsTarget(t *testing.T) { + root := testProjectRoot(t) + writeFeatGeneratedHarness(t, root, map[string]string{}, map[string]int{"feat:specialattacks": 1187}) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules", "activecombat")) + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "activecombat", "specialattacks.json"), `{"entries":{"feat:specialattacks":{"LABEL":"FEAT_SPECIAL_ATTACKS","FEAT":{"tlk":{"key":"feat:specialattacks.name","text":"Special Attacks"}},"DESCRIPTION":{"tlk":{"key":"feat:specialattacks.description","text":"Access special attacks."}},"ICON":"ife_specialatk","SPELLID":{"id":"spells:missing"},"Constant":"FEAT_SPECIAL_ATTACKS"}}}`+"\n") + _, err := BuildNative(testProject(root), nil) + if err == nil || !strings.Contains(err.Error(), "spells:missing") { + t.Fatalf("expected missing spells target error, got %v", err) + } +} + +func TestBuildGeneratedFeatSpecialAttacksRequiresSelfRefTarget(t *testing.T) { + root := testProjectRoot(t) + writeFeatGeneratedHarness(t, root, map[string]string{}, map[string]int{"feat:improvedfeint": 1194}) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat", "modules", "activecombat")) + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "modules", "activecombat", "specialattacks.json"), `{"entries":{"feat:improvedfeint":{"LABEL":"FEAT_IMPROVED_FEINT","FEAT":{"tlk":{"key":"feat:improvedfeint.name","text":"Improved Feint"}},"DESCRIPTION":{"tlk":{"key":"feat:improvedfeint.description","text":"Improve your feint."}},"ICON":"ife_feint","PREREQFEAT1":{"id":"feat:specialattacks"},"Constant":"FEAT_IMPROVED_FEINT"}}}`+"\n") + _, err := BuildNative(testProject(root), nil) + if err == nil || !strings.Contains(err.Error(), "feat:specialattacks") { + t.Fatalf("expected missing feat self-ref error, got %v", err) + } +} + +func TestBuildGeneratedFeatRequiresMasterfeatAndSkillTargets(t *testing.T) { + root := testProjectRoot(t) + writeFeatGeneratedHarness(t, root, map[string]string{ + "skill_focus.json": `{"family":"skill_focus","family_key":"skillfocus","template":"masterfeats:missing","child_source":{"dataset":"skills","predicate":"accessible"}}` + "\n", + }, map[string]int{"feat:skillfocus_concentration": 173}) + _, err := BuildNative(testProject(root), nil) + if err == nil { + t.Fatal("expected missing dependency error") + } + if !strings.Contains(err.Error(), "masterfeats:missing") { + t.Fatalf("expected error containing missing masterfeat target, got %v", err) + } +} + +func TestDiscoverNativeOutputCatalogSkipsCompareDisabledDataset(t *testing.T) { + root := t.TempDir() + mkdirAll(t, filepath.Join(root, "data", "feat")) + writeFile(t, filepath.Join(root, "data", "feat", "base.json"), `{ + "output": "feat.2da", + "compare_reference": false, + "columns": ["LABEL", "FEAT", "DESCRIPTION"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(root, "data", "feat", "lock.json"), `{"feat:test":0}`+"\n") + + catalog, err := discoverNativeOutputCatalog(filepath.Join(root, "data")) + if err != nil { + t.Fatalf("discoverNativeOutputCatalog: %v", err) + } + if _, ok := catalog["feat.2da"]; ok { + t.Fatalf("expected compare-disabled feat.2da to be excluded from coverage catalog") + } +} + +func TestNormalizeProjectImportsLegacyMasterfeats(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + + mkdirAll(t, filepath.Join(root, "reference", "data", "feat", "masterfeats")) + writeFile(t, filepath.Join(root, "reference", "data", "feat", "masterfeats", "masterfeats.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON", "SUCCESSOR"], + "rows": [ + {"id": 0, "key": "masterfeats:weaponfocus", "LABEL": "WeaponFocus", "STRREF": "6490", "DESCRIPTION": "436", "ICON": "ife_wepfoc"}, + {"key": "masterfeats:skillfocus", "LABEL": "SkillFocus", "STRREF": {"tlk": "masterfeats:skillfocus.name"}, "DESCRIPTION": {"tlk": "masterfeats:skillfocus.description"}, "ICON": "ife_skfoc"}, + {"id": 2, "LABEL": "DevastatingCrit", "STRREF": "83482", "DESCRIPTION": "3909", "ICON": "ife_X2DevCrit"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "feat", "masterfeats", "lock.json"), `{ + "masterfeats:weaponfocus": 0, + "masterfeats:skillfocus": 1 +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference", "tlk", "modules", "feat", "masterfeats")) + writeFile(t, filepath.Join(root, "reference", "tlk", "lock.json"), `{ + "masterfeats:skillfocus.name": 100, + "masterfeats:skillfocus.description": 101 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "modules", "feat", "masterfeats", "skillfocus.json"), `{ + "entries": { + "masterfeats:skillfocus": { + "name": {"text": "Skill Focus"}, + "description": {"text": "Choose a skill."} + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 2 { + t.Fatalf("expected imported masterfeats files, got %#v", result) + } + + raw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "masterfeats", "base.json")) + if err != nil { + t.Fatalf("read imported masterfeats: %v", err) + } + text := string(raw) + for _, want := range []string{ + `"STRREF": "6490"`, + `"DESCRIPTION": "436"`, + `"key": "masterfeats:skillfocus.name"`, + `"text": "Skill Focus"`, + `"key": "masterfeats:skillfocus.description"`, + `"text": "Choose a skill."`, + `"id": 1`, + } { + if !strings.Contains(text, want) { + t.Fatalf("expected imported masterfeats content %q, got:\n%s", want, text) + } + } + + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "masterfeats", "lock.json")) + if err != nil { + t.Fatalf("read imported lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"masterfeats:skillfocus": 1`) { + t.Fatalf("expected imported lock data, got:\n%s", string(lockRaw)) + } + + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", tlkStateFile)) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + if !strings.Contains(string(stateRaw), `"masterfeats:skillfocus.name"`) || !strings.Contains(string(stateRaw), `"id": 100`) { + t.Fatalf("expected seeded masterfeats tlk state, got:\n%s", string(stateRaw)) + } +} + +func TestBuildSupportsCanonicalMasterfeats(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "ICON", "SUCCESSOR"], + "rows": [ + {"id": 0, "key": "masterfeats:weaponfocus", "LABEL": "WeaponFocus", "STRREF": "6490", "DESCRIPTION": "436", "ICON": "ife_wepfoc"}, + {"id": 1, "key": "masterfeats:skillfocus", "LABEL": "SkillFocus", "STRREF": {"tlk": {"key": "masterfeats:skillfocus.name", "text": "Skill Focus"}}, "DESCRIPTION": {"tlk": {"key": "masterfeats:skillfocus.description", "text": "Choose a skill."}}, "ICON": "ife_skfoc"}, + {"id": 2, "key": "masterfeats:weaponproficiencycommoner", "LABEL": "CommonerWeaponProficiency", "STRREF": {"tlk": {"key": "masterfeats:weaponproficiencycommoner.name", "text": "Commoner Weapon Proficiency"}}, "DESCRIPTION": {"tlk": {"key": "masterfeats:weaponproficiencycommoner.description", "text": "Simple weapon training."}}, "SUCCESSOR": {"id": "feat:weaponproficiencysimple"}, "ICON": "ife_weppro_sim"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{ + "masterfeats:weaponfocus": 0, + "masterfeats:skillfocus": 1, + "masterfeats:weaponproficiencycommoner": 2 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:weaponproficiencysimple":7}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL"], + "rows": [ + {"id": 7, "key": "feat:weaponproficiencysimple", "LABEL": "WEAPON_PROFICIENCY_SIMPLE"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "masterfeats.2da")) + if err != nil { + t.Fatalf("read masterfeats.2da: %v", err) + } + want := "2DA V2.0\n\nLABEL\tSTRREF\tDESCRIPTION\tICON\tSUCCESSOR\n0\tWeaponFocus\t6490\t436\tife_wepfoc\t****\n1\tSkillFocus\t16777216\t16777217\tife_skfoc\t****\n2\tCommonerWeaponProficiency\t16777218\t16777219\tife_weppro_sim\t7\n" + if string(got) != want { + t.Fatalf("unexpected masterfeats.2da output:\n%s", string(got)) + } +} + +func TestNormalizeProjectImportsLegacyCreaturespeed(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "creaturespeed", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "base.json"), `{ + "output": "creaturespeed.2da", + "columns": ["Label", "Name", "2DAName", "WALKRATE", "RUNRATE"], + "rows": [ + {"key": "creaturespeed:pcmovement", "id": 0, "Label": "PC_Movement", "Name": "****", "2DAName": "PLAYER", "WALKRATE": "2.00", "RUNRATE": "4.00"}, + {"key": "creaturespeed:normal", "id": 4, "Label": "Normal", "Name": "2322", "2DAName": "NORM", "WALKRATE": "1.75", "RUNRATE": "3.50"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "lock.json"), `{"creaturespeed:normal":4}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "modules", "ovr_mobspeed.json"), `{ + "overrides": [ + {"key": "creaturespeed:normal", "id": 4, "WALKRATE": "2.00", "RUNRATE": "4.00"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 1 { + t.Fatalf("expected creaturespeed file to be imported, got %#v", result) + } + + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "creaturespeed", "creaturespeed.json")) + if err != nil { + t.Fatalf("read creaturespeed table: %v", err) + } + text := string(baseRaw) + for _, want := range []string{`"output": "creaturespeed.2da"`, `"Label": "Normal"`, `"WALKRATE": "2.00"`, `"RUNRATE": "4.00"`} { + if !strings.Contains(text, want) { + t.Fatalf("expected imported creaturespeed content %q, got:\n%s", want, text) + } + } + if strings.Contains(text, `"key": "creaturespeed:normal"`) { + t.Fatalf("did not expect creaturespeed keys in plain-table import, got:\n%s", text) + } + if _, err := os.Stat(filepath.Join(root, "topdata", "data", "creaturespeed", "lock.json")); !os.IsNotExist(err) { + t.Fatalf("expected no creaturespeed lock file, got err=%v", err) + } + if _, err := os.Stat(filepath.Join(root, "topdata", "data", "creaturespeed", "modules", "ovr_mobspeed.json")); !os.IsNotExist(err) { + t.Fatalf("expected no creaturespeed module file, got err=%v", err) + } +} + +func TestBuildSupportsCanonicalCreaturespeed(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "creaturespeed")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "creaturespeed", "creaturespeed.json"), `{ + "output": "creaturespeed.2da", + "columns": ["Label", "Name", "2DAName", "WALKRATE", "RUNRATE"], + "rows": [ + {"id": 0, "Label": "PC_Movement", "Name": "****", "2DAName": "PLAYER", "WALKRATE": "2.00", "RUNRATE": "4.00"}, + {"id": 4, "Label": "Normal", "Name": "2322", "2DAName": "NORM", "WALKRATE": "2.00", "RUNRATE": "4.00"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "creaturespeed.2da")) + if err != nil { + t.Fatalf("read creaturespeed.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "Label\tName\t2DAName\tWALKRATE\tRUNRATE\n") || + !strings.Contains(text, "0\tPC_Movement\t****\tPLAYER\t2.00\t4.00\n") || + !strings.Contains(text, "4\tNormal\t2322\tNORM\t2.00\t4.00\n") { + t.Fatalf("unexpected creaturespeed.2da output:\n%s", string(got)) + } +} + +func TestNormalizeProjectImportsLegacyArmor(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "armor", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "armor", "base.json"), `{ + "columns": ["ACBONUS", "DEXBONUS", "ACCHECK", "ARCANEFAILURE%", "WEIGHT", "COST", "DESCRIPTIONS", "BASEITEMSTATREF"], + "rows": [ + {"id": 0, "ACBONUS": "0", "DEXBONUS": "100", "ACCHECK": "0", "ARCANEFAILURE%": "0", "WEIGHT": "10", "COST": "1", "DESCRIPTIONS": "1727", "BASEITEMSTATREF": "5411"}, + {"id": 8, "ACBONUS": "8", "DEXBONUS": "1", "ACCHECK": "-8", "ARCANEFAILURE%": "45", "WEIGHT": "500", "COST": "1500", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "5441"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "armor", "lock.json"), `{"armor:ac9":9}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "armor", "modules", "add_12ac.json"), `{ + "entries": { + "armor:ac9": {"id": 9, "ACBONUS": "9", "DEXBONUS": "0", "ACCHECK": "-8", "ARCANEFAILURE%": "45", "WEIGHT": "650", "COST": "2400", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "****"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "armor", "modules", "ovr_statref.json"), `{ + "overrides": [ + {"id": 0, "BASEITEMSTATREF": "****"}, + {"id": 8, "BASEITEMSTATREF": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 1 { + t.Fatalf("expected armor file to be imported, got %#v", result) + } + + tableRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "armor", "armor.json")) + if err != nil { + t.Fatalf("read armor table: %v", err) + } + text := string(tableRaw) + for _, want := range []string{`"output": "armor.2da"`, `"id": 0`, `"BASEITEMSTATREF": "****"`, `"id": 9`, `"ACBONUS": "9"`} { + if !strings.Contains(text, want) { + t.Fatalf("expected imported armor content %q, got:\n%s", want, text) + } + } + if _, err := os.Stat(filepath.Join(root, "topdata", "data", "armor", "lock.json")); !os.IsNotExist(err) { + t.Fatalf("expected no armor lock file, got err=%v", err) + } + if _, err := os.Stat(filepath.Join(root, "topdata", "data", "armor", "modules")); !os.IsNotExist(err) { + t.Fatalf("expected no armor modules dir, got err=%v", err) + } +} + +func TestBuildSupportsCanonicalArmor(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "armor")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "armor", "armor.json"), `{ + "output": "armor.2da", + "columns": ["ACBONUS", "DEXBONUS", "ACCHECK", "ARCANEFAILURE%", "WEIGHT", "COST", "DESCRIPTIONS", "BASEITEMSTATREF"], + "rows": [ + {"id": 0, "ACBONUS": "0", "DEXBONUS": "100", "ACCHECK": "0", "ARCANEFAILURE%": "0", "WEIGHT": "10", "COST": "1", "DESCRIPTIONS": "1727", "BASEITEMSTATREF": "****"}, + {"id": 9, "ACBONUS": "9", "DEXBONUS": "0", "ACCHECK": "-8", "ARCANEFAILURE%": "45", "WEIGHT": "650", "COST": "2400", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "****"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "armor.2da")) + if err != nil { + t.Fatalf("read armor.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "ACBONUS\tDEXBONUS\tACCHECK\tARCANEFAILURE%\tWEIGHT\tCOST\tDESCRIPTIONS\tBASEITEMSTATREF\n") || + !strings.Contains(text, "0\t0\t100\t0\t0\t10\t1\t1727\t****\n") || + !strings.Contains(text, "9\t9\t0\t-8\t45\t650\t2400\t1736\t****\n") { + t.Fatalf("unexpected armor.2da output:\n%s", text) + } +} + +func TestBuildCanonicalArmorMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "armor", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "armor.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("ACBONUS\tDEXBONUS\tACCHECK\tARCANEFAILURE%\tWEIGHT\tCOST\tDESCRIPTIONS\tBASEITEMSTATREF\n") + f.write("0\t0\t100\t0\t0\t10\t1\t1727\t****\n") + f.write("1\t1\t8\t0\t5\t50\t5\t1728\t****\n") + f.write("2\t2\t6\t0\t10\t100\t10\t1729\t****\n") + f.write("3\t3\t4\t-1\t20\t150\t15\t1730\t****\n") + f.write("4\t4\t4\t-2\t20\t300\t100\t1731\t****\n") + f.write("5\t5\t2\t-5\t30\t400\t150\t1732\t****\n") + f.write("6\t6\t1\t-7\t40\t450\t200\t1733\t****\n") + f.write("7\t7\t1\t-7\t40\t500\t600\t1734\t****\n") + f.write("8\t8\t1\t-8\t45\t500\t1500\t1736\t****\n") + f.write("9\t9\t0\t-8\t45\t650\t2400\t1736\t****\n") + f.write("10\t10\t0\t-9\t50\t800\t5000\t1736\t****\n") + f.write("11\t11\t0\t-10\t55\t800\t7500\t1736\t****\n") + f.write("12\t12\t0\t-11\t60\t1250\t10000\t1736\t****\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "armor", "base.json"), `{ + "columns": ["ACBONUS", "DEXBONUS", "ACCHECK", "ARCANEFAILURE%", "WEIGHT", "COST", "DESCRIPTIONS", "BASEITEMSTATREF"], + "rows": [ + {"id": 0, "ACBONUS": "0", "DEXBONUS": "100", "ACCHECK": "0", "ARCANEFAILURE%": "0", "WEIGHT": "10", "COST": "1", "DESCRIPTIONS": "1727", "BASEITEMSTATREF": "5411"}, + {"id": 1, "ACBONUS": "1", "DEXBONUS": "8", "ACCHECK": "0", "ARCANEFAILURE%": "5", "WEIGHT": "50", "COST": "5", "DESCRIPTIONS": "1728", "BASEITEMSTATREF": "5432"}, + {"id": 2, "ACBONUS": "2", "DEXBONUS": "6", "ACCHECK": "0", "ARCANEFAILURE%": "10", "WEIGHT": "100", "COST": "10", "DESCRIPTIONS": "1729", "BASEITEMSTATREF": "5435"}, + {"id": 3, "ACBONUS": "3", "DEXBONUS": "4", "ACCHECK": "-1", "ARCANEFAILURE%": "20", "WEIGHT": "150", "COST": "15", "DESCRIPTIONS": "1730", "BASEITEMSTATREF": "5436"}, + {"id": 4, "ACBONUS": "4", "DEXBONUS": "4", "ACCHECK": "-2", "ARCANEFAILURE%": "20", "WEIGHT": "300", "COST": "100", "DESCRIPTIONS": "1731", "BASEITEMSTATREF": "5437"}, + {"id": 5, "ACBONUS": "5", "DEXBONUS": "2", "ACCHECK": "-5", "ARCANEFAILURE%": "30", "WEIGHT": "400", "COST": "150", "DESCRIPTIONS": "1732", "BASEITEMSTATREF": "5438"}, + {"id": 6, "ACBONUS": "6", "DEXBONUS": "1", "ACCHECK": "-7", "ARCANEFAILURE%": "40", "WEIGHT": "450", "COST": "200", "DESCRIPTIONS": "1733", "BASEITEMSTATREF": "5439"}, + {"id": 7, "ACBONUS": "7", "DEXBONUS": "1", "ACCHECK": "-7", "ARCANEFAILURE%": "40", "WEIGHT": "500", "COST": "600", "DESCRIPTIONS": "1734", "BASEITEMSTATREF": "5440"}, + {"id": 8, "ACBONUS": "8", "DEXBONUS": "1", "ACCHECK": "-8", "ARCANEFAILURE%": "45", "WEIGHT": "500", "COST": "1500", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "5441"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "armor", "lock.json"), `{"armor:ac9":9,"armor:ac10":10,"armor:ac11":11,"armor:ac12":12}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "armor", "modules", "add_12ac.json"), `{ + "entries": { + "armor:ac9": {"id": 9, "ACBONUS": "9", "DEXBONUS": "0", "ACCHECK": "-8", "ARCANEFAILURE%": "45", "WEIGHT": "650", "COST": "2400", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "****"}, + "armor:ac10": {"id": 10, "ACBONUS": "10", "DEXBONUS": "0", "ACCHECK": "-9", "ARCANEFAILURE%": "50", "WEIGHT": "800", "COST": "5000", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "****"}, + "armor:ac11": {"id": 11, "ACBONUS": "11", "DEXBONUS": "0", "ACCHECK": "-10", "ARCANEFAILURE%": "55", "WEIGHT": "800", "COST": "7500", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "****"}, + "armor:ac12": {"id": 12, "ACBONUS": "12", "DEXBONUS": "0", "ACCHECK": "-11", "ARCANEFAILURE%": "60", "WEIGHT": "1250", "COST": "10000", "DESCRIPTIONS": "1736", "BASEITEMSTATREF": "****"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "armor", "modules", "ovr_statref.json"), `{ + "overrides": [ + {"id": 0, "BASEITEMSTATREF": "****"}, + {"id": 1, "BASEITEMSTATREF": "****"}, + {"id": 2, "BASEITEMSTATREF": "****"}, + {"id": 3, "BASEITEMSTATREF": "****"}, + {"id": 4, "BASEITEMSTATREF": "****"}, + {"id": 5, "BASEITEMSTATREF": "****"}, + {"id": 6, "BASEITEMSTATREF": "****"}, + {"id": 7, "BASEITEMSTATREF": "****"}, + {"id": 8, "BASEITEMSTATREF": "****"} + ] +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "armor.2da")) + if err != nil { + t.Fatalf("read native armor.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "armor.2da")) + if err != nil { + t.Fatalf("read reference armor.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("armor output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyDamagetypesRegistry(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + for _, part := range []string{"core", "groups", "hitvisual"} { + mkdirAll(t, filepath.Join(root, "reference", "data", "damagetypes", part, "modules")) + } + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "core", "base.json"), `{ + "output": "damagetypes.2da", + "columns": ["Label", "CharsheetStrref", "DamageTypeGroup", "DamageRangedProjectile"], + "rows": [ + {"id": 0, "Label": "Bludgeoning", "CharsheetStrref": "58345", "DamageTypeGroup": "0", "DamageRangedProjectile": "0"}, + {"id": 12, "Label": "Base", "CharsheetStrref": "58301", "DamageTypeGroup": "0", "DamageRangedProjectile": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "groups", "base.json"), `{ + "output": "damagetypegroups.2da", + "columns": ["Label", "FeedbackStrref", "ColorR", "ColorG", "ColorB"], + "rows": [ + {"id": 0, "Label": "Physical", "FeedbackStrref": "5594", "ColorR": "255", "ColorG": "102", "ColorB": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "hitvisual", "base.json"), `{ + "output": "damagehitvisual.2da", + "columns": ["Label", "VisualEffectID", "RangedEffectID"], + "rows": [ + {"id": 0, "Label": "Bludgeoning", "VisualEffectID": "****", "RangedEffectID": "****"}, + {"id": 12, "Label": "Base", "VisualEffectID": "****", "RangedEffectID": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "core", "lock.json"), `{"damagetypes:psychic":13}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "groups", "lock.json"), `{"damagetypegroups:psychic":10}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "hitvisual", "lock.json"), `{"damagehitvisual:psychic":13}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "core", "modules", "add_eos.json"), `{ + "entries": { + "damagetypes:psychic": {"Label": "PsychicDamage", "CharsheetStrref": "70001", "DamageTypeGroup": "10", "DamageRangedProjectile": "0"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "groups", "modules", "add_eos.json"), `{ + "entries": { + "damagetypegroups:psychic": {"Label": "Psychic", "FeedbackStrref": "70011", "ColorR": "225", "ColorG": "117", "ColorB": "255"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "hitvisual", "modules", "add_eos.json"), `{ + "entries": { + "damagehitvisual:psychic": {"Label": "PsychicDamage", "VisualEffectID": "202", "RangedEffectID": "****"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 2 { + t.Fatalf("expected damagetypes registry files to be imported, got %#v", result) + } + + typesRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "damagetypes", "registry", "types.json")) + if err != nil { + t.Fatalf("read damagetypes registry: %v", err) + } + text := string(typesRaw) + for _, want := range []string{`"key": "damagetype:bludgeoning"`, `"group_label": "Physical"`, `"key": "damagetype:psychic"`, `"feedback_strref": "70011"`} { + if !strings.Contains(text, want) { + t.Fatalf("expected imported damagetypes content %q, got:\n%s", want, text) + } + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "damagetypes", "registry", "lock.json")) + if err != nil { + t.Fatalf("read damagetypes lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"damagetype:psychic": 13`) { + t.Fatalf("expected imported damagetypes lock ids, got:\n%s", string(lockRaw)) + } + for _, oldPath := range []string{ + filepath.Join(root, "topdata", "data", "damagetypes", "core"), + filepath.Join(root, "topdata", "data", "damagetypes", "groups"), + filepath.Join(root, "topdata", "data", "damagetypes", "hitvisual"), + } { + if _, err := os.Stat(oldPath); !os.IsNotExist(err) { + t.Fatalf("expected no legacy canonical damagetypes path %s, got err=%v", oldPath, err) + } + } +} + +func TestBuildSupportsCanonicalDamagetypesRegistry(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "damagetypes", "registry")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "damagetypes", "registry", "types.json"), `{ + "rows": [ + {"key": "damagetype:bludgeoning", "id": 0, "label": "Bludgeoning", "charsheet_strref": "58345", "damage_type_group": "0", "damage_ranged_projectile": "0", "group_label": "Physical", "feedback_strref": "5594", "color_r": "255", "color_g": "102", "color_b": "0", "visual_effect_id": "****", "ranged_effect_id": "****"}, + {"key": "damagetype:psychic", "id": 13, "label": "PsychicDamage", "charsheet_strref": "70001", "damage_type_group": "10", "damage_ranged_projectile": "0", "group_label": "Psychic", "feedback_strref": "70011", "color_r": "225", "color_g": "117", "color_b": "255", "visual_effect_id": "202", "ranged_effect_id": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "damagetypes", "registry", "lock.json"), `{"damagetype:bludgeoning":0,"damagetype:psychic":13}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + coreRaw, err := os.ReadFile(filepath.Join(result.Output2DADir, "damagetypes.2da")) + if err != nil { + t.Fatalf("read damagetypes.2da: %v", err) + } + groupRaw, err := os.ReadFile(filepath.Join(result.Output2DADir, "damagetypegroups.2da")) + if err != nil { + t.Fatalf("read damagetypegroups.2da: %v", err) + } + hitRaw, err := os.ReadFile(filepath.Join(result.Output2DADir, "damagehitvisual.2da")) + if err != nil { + t.Fatalf("read damagehitvisual.2da: %v", err) + } + if !strings.Contains(string(coreRaw), "0\tBludgeoning\t58345\t0\t0\n") || !strings.Contains(string(coreRaw), "13\tPsychicDamage\t70001\t10\t0\n") { + t.Fatalf("unexpected damagetypes.2da output:\n%s", string(coreRaw)) + } + if !strings.Contains(string(groupRaw), "0\tPhysical\t5594\t255\t102\t0\n") || !strings.Contains(string(groupRaw), "10\tPsychic\t70011\t225\t117\t255\n") { + t.Fatalf("unexpected damagetypegroups.2da output:\n%s", string(groupRaw)) + } + if !strings.Contains(string(hitRaw), "0\tBludgeoning\t****\t****\n") || !strings.Contains(string(hitRaw), "13\tPsychicDamage\t202\t****\n") { + t.Fatalf("unexpected damagehitvisual.2da output:\n%s", string(hitRaw)) + } +} + +func TestBuildCanonicalDamagetypesRegistryMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + for _, part := range []string{"core", "groups", "hitvisual"} { + mkdirAll(t, filepath.Join(root, "reference", "data", "damagetypes", part, "modules")) + } + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "damagetypes.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tCharsheetStrref\tDamageTypeGroup\tDamageRangedProjectile\n") + f.write("0\tBludgeoning\t58345\t0\t0\n") + f.write("1\tPiercing\t58341\t0\t0\n") + f.write("13\tPsychicDamage\t70001\t10\t0\n") +with open(os.path.join(out, "damagetypegroups.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tFeedbackStrref\tColorR\tColorG\tColorB\n") + f.write("0\tPhysical\t5594\t255\t102\t0\n") + f.write("1\tMagical\t5593\t204\t119\t255\n") + f.write("10\tPsychic\t70011\t225\t117\t255\n") +with open(os.path.join(out, "damagehitvisual.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tVisualEffectID\tRangedEffectID\n") + f.write("0\tBludgeoning\t****\t****\n") + f.write("1\tPiercing\t****\t****\n") + f.write("13\tPsychicDamage\t202\t****\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "core", "base.json"), `{ + "output": "damagetypes.2da", + "columns": ["Label", "CharsheetStrref", "DamageTypeGroup", "DamageRangedProjectile"], + "rows": [ + {"id": 0, "Label": "Bludgeoning", "CharsheetStrref": "58345", "DamageTypeGroup": "0", "DamageRangedProjectile": "0"}, + {"id": 1, "Label": "Piercing", "CharsheetStrref": "58341", "DamageTypeGroup": "0", "DamageRangedProjectile": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "groups", "base.json"), `{ + "output": "damagetypegroups.2da", + "columns": ["Label", "FeedbackStrref", "ColorR", "ColorG", "ColorB"], + "rows": [ + {"id": 0, "Label": "Physical", "FeedbackStrref": "5594", "ColorR": "255", "ColorG": "102", "ColorB": "0"}, + {"id": 1, "Label": "Magical", "FeedbackStrref": "5593", "ColorR": "204", "ColorG": "119", "ColorB": "255"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "hitvisual", "base.json"), `{ + "output": "damagehitvisual.2da", + "columns": ["Label", "VisualEffectID", "RangedEffectID"], + "rows": [ + {"id": 0, "Label": "Bludgeoning", "VisualEffectID": "****", "RangedEffectID": "****"}, + {"id": 1, "Label": "Piercing", "VisualEffectID": "****", "RangedEffectID": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "core", "lock.json"), `{"damagetypes:psychic":13}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "groups", "lock.json"), `{"damagetypegroups:psychic":10}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "hitvisual", "lock.json"), `{"damagehitvisual:psychic":13}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "core", "modules", "add_eos.json"), `{"entries":{"damagetypes:psychic":{"Label":"PsychicDamage","CharsheetStrref":"70001","DamageTypeGroup":"10","DamageRangedProjectile":"0"}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "groups", "modules", "add_eos.json"), `{"entries":{"damagetypegroups:psychic":{"Label":"Psychic","FeedbackStrref":"70011","ColorR":"225","ColorG":"117","ColorB":"255"}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "damagetypes", "hitvisual", "modules", "add_eos.json"), `{"entries":{"damagehitvisual:psychic":{"Label":"PsychicDamage","VisualEffectID":"202","RangedEffectID":"****"}}}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + for _, name := range []string{"damagetypes.2da", "damagetypegroups.2da", "damagehitvisual.2da"} { + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, name)) + if err != nil { + t.Fatalf("read native %s: %v", name, err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, name)) + if err != nil { + t.Fatalf("read reference %s: %v", name, err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("%s output mismatch\nnative:\n%s\nreference:\n%s", name, string(nativeBytes), string(referenceBytes)) + } + } +} + +func TestBuildCanonicalCreaturespeedMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "creaturespeed", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "creaturespeed.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tName\t2DAName\tWALKRATE\tRUNRATE\n") + f.write("0\tPC_Movement\t****\tPLAYER\t2.00\t4.00\n") + f.write("1\t****\t****\t****\t****\t****\n") + f.write("2\t****\t****\t****\t****\t****\n") + f.write("3\t****\t****\t****\t****\t****\n") + f.write("4\tNormal\t2322\tNORM\t2.00\t4.00\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "base.json"), `{ + "output": "creaturespeed.2da", + "columns": ["Label", "Name", "2DAName", "WALKRATE", "RUNRATE"], + "rows": [ + {"key": "creaturespeed:pcmovement", "id": 0, "Label": "PC_Movement", "Name": "****", "2DAName": "PLAYER", "WALKRATE": "2.00", "RUNRATE": "4.00"}, + {"key": "creaturespeed:normal", "id": 4, "Label": "Normal", "Name": "2322", "2DAName": "NORM", "WALKRATE": "1.75", "RUNRATE": "3.50"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "lock.json"), `{"creaturespeed:normal":4}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "modules", "ovr_mobspeed.json"), `{ + "overrides": [ + {"key": "creaturespeed:normal", "id": 4, "WALKRATE": "2.00", "RUNRATE": "4.00"} + ] +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "creaturespeed.2da")) + if err != nil { + t.Fatalf("read native creaturespeed.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "creaturespeed.2da")) + if err != nil { + t.Fatalf("read reference creaturespeed.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("creaturespeed output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacySkyboxes(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "skyboxes", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "base.json"), `{ + "output": "skyboxes.2da", + "columns": ["LABEL", "STRING_REF", "CYCLICAL", "DAWN", "DAY", "DUSK", "NIGHT"], + "rows": [ + {"id": 0, "LABEL": "(None)", "STRING_REF": "****", "CYCLICAL": "****", "DAWN": "****", "DAY": "****", "DUSK": "****", "NIGHT": "****"}, + {"id": 1, "LABEL": "Grass_Clear", "STRING_REF": "****", "CYCLICAL": "1", "DAWN": "Skyda_001", "DAY": "Sky_001", "DUSK": "Skyd_001", "NIGHT": "Skyn_001"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "lock.json"), `{ + "festerpot:id_7": 7 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "modules", "add_fpskies.json"), `{ + "entries": { + "festerpot:id_7": { + "LABEL": "Mountains", + "CYCLICAL": 1, + "DAWN": "CCS_01a", + "DAY": "CCS_01b", + "DUSK": "CCS_01c", + "NIGHT": "CCS_01d" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 3 { + t.Fatalf("expected skyboxes files to be imported, got %#v", result) + } + + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "skyboxes", "base.json"), + filepath.Join(root, "topdata", "data", "skyboxes", "lock.json"), + filepath.Join(root, "topdata", "data", "skyboxes", "modules", "add_fpskies.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported skyboxes path %s: %v", path, err) + } + } + + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "skyboxes", "lock.json")) + if err != nil { + t.Fatalf("read skyboxes lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"festerpot:id_7": 7`) { + t.Fatalf("expected imported skyboxes lock IDs, got:\n%s", string(lockRaw)) + } +} + +func TestBuildSupportsCanonicalSkyboxes(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "skyboxes", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skyboxes", "base.json"), `{ + "output": "skyboxes.2da", + "columns": ["LABEL", "STRING_REF", "CYCLICAL", "DAWN", "DAY", "DUSK", "NIGHT"], + "rows": [ + {"id": 0, "LABEL": "(None)", "STRING_REF": "****", "CYCLICAL": "****", "DAWN": "****", "DAY": "****", "DUSK": "****", "NIGHT": "****"}, + {"id": 1, "LABEL": "Grass_Clear", "STRING_REF": "****", "CYCLICAL": "1", "DAWN": "Skyda_001", "DAY": "Sky_001", "DUSK": "Skyd_001", "NIGHT": "Skyn_001"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skyboxes", "lock.json"), `{ + "festerpot:id_7": 7 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skyboxes", "modules", "add_fpskies.json"), `{ + "entries": { + "festerpot:id_7": { + "LABEL": "Mountains", + "CYCLICAL": 1, + "DAWN": "CCS_01a", + "DAY": "CCS_01b", + "DUSK": "CCS_01c", + "NIGHT": "CCS_01d" + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "skyboxes.2da")) + if err != nil { + t.Fatalf("read skyboxes.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "LABEL\tSTRING_REF\tCYCLICAL\tDAWN\tDAY\tDUSK\tNIGHT\n") || + !strings.Contains(text, "0\t(None)\t****\t****\t****\t****\t****\t****\n") || + !strings.Contains(text, "1\tGrass_Clear\t****\t1\tSkyda_001\tSky_001\tSkyd_001\tSkyn_001\n") || + !strings.Contains(text, "7\tMountains\t****\t1\tCCS_01a\tCCS_01b\tCCS_01c\tCCS_01d\n") { + t.Fatalf("unexpected skyboxes.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalSkyboxesMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "skyboxes", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "skyboxes.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("LABEL\tSTRING_REF\tCYCLICAL\tDAWN\tDAY\tDUSK\tNIGHT\n") + f.write("0\t(None)\t****\t****\t****\t****\t****\t****\n") + f.write("1\tGrass_Clear\t****\t1\tSkyda_001\tSky_001\tSkyd_001\tSkyn_001\n") + for i in range(2, 7): + f.write(f"{i}\t****\t****\t****\t****\t****\t****\t****\n") + f.write("7\tMountains\t****\t1\tCCS_01a\tCCS_01b\tCCS_01c\tCCS_01d\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "base.json"), `{ + "output": "skyboxes.2da", + "columns": ["LABEL", "STRING_REF", "CYCLICAL", "DAWN", "DAY", "DUSK", "NIGHT"], + "rows": [ + {"id": 0, "LABEL": "(None)", "STRING_REF": "****", "CYCLICAL": "****", "DAWN": "****", "DAY": "****", "DUSK": "****", "NIGHT": "****"}, + {"id": 1, "LABEL": "Grass_Clear", "STRING_REF": "****", "CYCLICAL": "1", "DAWN": "Skyda_001", "DAY": "Sky_001", "DUSK": "Skyd_001", "NIGHT": "Skyn_001"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "lock.json"), `{ + "festerpot:id_7": 7 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "modules", "add_fpskies.json"), `{ + "entries": { + "festerpot:id_7": { + "LABEL": "Mountains", + "CYCLICAL": 1, + "DAWN": "CCS_01a", + "DAY": "CCS_01b", + "DUSK": "CCS_01c", + "NIGHT": "CCS_01d" + } + } +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "skyboxes.2da")) + if err != nil { + t.Fatalf("read native skyboxes.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "skyboxes.2da")) + if err != nil { + t.Fatalf("read reference skyboxes.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("skyboxes output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestCompareNativeCoverageCountsPlainAndBaseDatasets(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "topdata", "data", "creaturespeed")) + writeFile(t, filepath.Join(root, "topdata", "data", "creaturespeed", "creaturespeed.json"), `{ + "output": "creaturespeed.2da", + "columns": ["Label", "Name", "2DAName", "WALKRATE", "RUNRATE"], + "rows": [ + {"id": 0, "Label": "PC_Movement", "Name": "****", "2DAName": "PLAYER", "WALKRATE": "2.00", "RUNRATE": "4.00"}, + {"id": 4, "Label": "Normal", "Name": "2322", "2DAName": "NORM", "WALKRATE": "2.00", "RUNRATE": "4.00"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "topdata", "data", "skyboxes", "modules")) + writeFile(t, filepath.Join(root, "topdata", "data", "skyboxes", "base.json"), `{ + "output": "skyboxes.2da", + "columns": ["LABEL", "STRING_REF", "CYCLICAL", "DAWN", "DAY", "DUSK", "NIGHT"], + "rows": [ + {"id": 0, "LABEL": "(None)", "STRING_REF": "****", "CYCLICAL": "****", "DAWN": "****", "DAY": "****", "DUSK": "****", "NIGHT": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skyboxes", "lock.json"), `{ + "festerpot:id_7": 7 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skyboxes", "modules", "add_fpskies.json"), `{ + "entries": { + "festerpot:id_7": { + "LABEL": "Mountains", + "CYCLICAL": 1, + "DAWN": "CCS_01a", + "DAY": "CCS_01b", + "DUSK": "CCS_01c", + "NIGHT": "CCS_01d" + } + } +}`+"\n") + + mkdirAll(t, filepath.Join(root, "reference", "data", "creaturespeed", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "base.json"), `{ + "output": "creaturespeed.2da", + "columns": ["Label", "Name", "2DAName", "WALKRATE", "RUNRATE"], + "rows": [ + {"key": "creaturespeed:pcmovement", "id": 0, "Label": "PC_Movement", "Name": "****", "2DAName": "PLAYER", "WALKRATE": "2.00", "RUNRATE": "4.00"}, + {"key": "creaturespeed:normal", "id": 4, "Label": "Normal", "Name": "2322", "2DAName": "NORM", "WALKRATE": "1.75", "RUNRATE": "3.50"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "lock.json"), `{"creaturespeed:normal":4}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "creaturespeed", "modules", "ovr_mobspeed.json"), `{ + "overrides": [ + {"key": "creaturespeed:normal", "id": 4, "WALKRATE": "2.00", "RUNRATE": "4.00"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "skyboxes", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "base.json"), `{ + "output": "skyboxes.2da", + "columns": ["LABEL", "STRING_REF", "CYCLICAL", "DAWN", "DAY", "DUSK", "NIGHT"], + "rows": [ + {"id": 0, "LABEL": "(None)", "STRING_REF": "****", "CYCLICAL": "****", "DAWN": "****", "DAY": "****", "DUSK": "****", "NIGHT": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "lock.json"), `{ + "festerpot:id_7": 7 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skyboxes", "modules", "add_fpskies.json"), `{ + "entries": { + "festerpot:id_7": { + "LABEL": "Mountains", + "CYCLICAL": 1, + "DAWN": "CCS_01a", + "DAY": "CCS_01b", + "DUSK": "CCS_01c", + "NIGHT": "CCS_01d" + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + pass, notYetCanonical, mismatch, err := compareNativeCoverage(testProject(root), nativeResult.Output2DADir, nil) + if err != nil { + t.Fatalf("compareNativeCoverage failed: %v", err) + } + if pass != 2 || notYetCanonical != 0 || mismatch != 0 { + t.Fatalf("unexpected coverage counts: pass=%d notYetCanonical=%d mismatch=%d", pass, notYetCanonical, mismatch) + } +} + +func TestNormalizeProjectImportsLegacyVFXPersistent(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "vfx_persistent", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "vfx_persistent", "base.json"), `{ + "output": "vfx_persistent.2da", + "columns": ["LABEL", "SHAPE", "RADIUS"], + "rows": [ + {"id": 0, "LABEL": "VFX_PER_FOGACID", "SHAPE": "C", "RADIUS": "5"}, + {"id": 46, "LABEL": "VFX_MOB_NIGHTMARE_SMOKE", "SHAPE": "C", "RADIUS": "1.5"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "vfx_persistent", "lock.json"), `{ + "vfx_persistent:blankradius5": 47, + "vfx_persistent:blankradius10": 48, + "vfx_persistent:blankradius15": 49, + "vfx_persistent:blankradius20": 50, + "vfx_persistent:blankradius25": 51, + "vfx_persistent:blankradius30": 52 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "vfx_persistent", "modules", "freeformaoes.json"), `{ + "entries": { + "vfx_persistent:blankradius5": {"LABEL": "VFX_PER_BLANK_RADIUS_5", "SHAPE": "C", "RADIUS": "5"}, + "vfx_persistent:blankradius10": {"LABEL": "VFX_PER_BLANK_RADIUS_10", "SHAPE": "C", "RADIUS": "5"}, + "vfx_persistent:blankradius15": {"LABEL": "VFX_PER_BLANK_RADIUS_15", "SHAPE": "C", "RADIUS": "15"}, + "vfx_persistent:blankradius20": {"LABEL": "VFX_PER_BLANK_RADIUS_20", "SHAPE": "C", "RADIUS": "20"}, + "vfx_persistent:blankradius25": {"LABEL": "VFX_PER_BLANK_RADIUS_25", "SHAPE": "C", "RADIUS": "25"}, + "vfx_persistent:blankradius30": {"LABEL": "VFX_PER_BLANK_RADIUS_30", "SHAPE": "C", "RADIUS": "30"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 2 { + t.Fatalf("expected vfx_persistent files to be imported, got %#v", result) + } + + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "vfx_persistent", "base.json"), + filepath.Join(root, "topdata", "data", "vfx_persistent", "lock.json"), + filepath.Join(root, "topdata", "data", "vfx_persistent", "modules", "freeformaoes.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported vfx_persistent path %s: %v", path, err) + } + } + + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "vfx_persistent", "lock.json")) + if err != nil { + t.Fatalf("read vfx_persistent lock: %v", err) + } + lockText := string(lockRaw) + if !strings.Contains(lockText, `"vfx_persistent:vfx_per_fogacid": 0`) || + !strings.Contains(lockText, `"vfx_persistent:vfx_mob_nightmare_smoke": 46`) || + !strings.Contains(lockText, `"vfx_persistent:blankradius5": 47`) || + !strings.Contains(lockText, `"vfx_persistent:blankradius10": 48`) || + !strings.Contains(lockText, `"vfx_persistent:blankradius30": 52`) { + t.Fatalf("expected imported vfx_persistent lock IDs, got:\n%s", lockText) + } + + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "vfx_persistent", "base.json")) + if err != nil { + t.Fatalf("read vfx_persistent base: %v", err) + } + baseText := string(baseRaw) + if !strings.Contains(baseText, `"key": "vfx_persistent:vfx_per_fogacid"`) || !strings.Contains(baseText, `"key": "vfx_persistent:vfx_mob_nightmare_smoke"`) { + t.Fatalf("expected imported vfx_persistent keys, got:\n%s", baseText) + } +} + +func TestNormalizeProjectRefreshesLegacyVFXPersistentLockFromSnapshot(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "vfx_persistent", "modules")) + mkdirAll(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "vfx_persistent", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "vfx_persistent", "base.json"), `{ + "output": "vfx_persistent.2da", + "columns": ["LABEL", "SHAPE", "RADIUS"], + "rows": [ + {"id": 0, "key": "vfx_persistent:vfx_per_fogacid", "LABEL": "VFX_PER_FOGACID", "SHAPE": "C", "RADIUS": "5"}, + {"id": 46, "key": "vfx_persistent:vfx_mob_nightmare_smoke", "LABEL": "VFX_MOB_NIGHTMARE_SMOKE", "SHAPE": "C", "RADIUS": "1.5"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "vfx_persistent", "lock.json"), `{ + "vfx_persistent:blankradius10": 47, + "vfx_persistent:blankradius15": 48, + "vfx_persistent:blankradius20": 49, + "vfx_persistent:blankradius25": 50, + "vfx_persistent:blankradius30": 51, + "vfx_persistent:blankradius5": 52 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "vfx_persistent", "modules", "freeformaoes.json"), `{"entries": {}}`+"\n") + + writeFile(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "vfx_persistent", "base.json"), `{ + "output": "vfx_persistent.2da", + "columns": ["LABEL", "SHAPE", "RADIUS"], + "rows": [ + {"id": 0, "LABEL": "VFX_PER_FOGACID", "SHAPE": "C", "RADIUS": "5"}, + {"id": 46, "LABEL": "VFX_MOB_NIGHTMARE_SMOKE", "SHAPE": "C", "RADIUS": "1.5"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "vfx_persistent", "lock.json"), `{ + "vfx_persistent:blankradius5": 47, + "vfx_persistent:blankradius10": 48, + "vfx_persistent:blankradius15": 49, + "vfx_persistent:blankradius20": 50, + "vfx_persistent:blankradius25": 51, + "vfx_persistent:blankradius30": 52 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "vfx_persistent", "modules", "freeformaoes.json"), `{ + "entries": { + "vfx_persistent:blankradius5": {"LABEL": "VFX_PER_BLANK_RADIUS_5", "SHAPE": "C", "RADIUS": "5"} + } +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + result, err := NormalizeProject(p) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 3 { + t.Fatalf("expected snapshot-backed vfx_persistent refresh, got %#v", result) + } + + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "vfx_persistent", "lock.json")) + if err != nil { + t.Fatalf("read vfx_persistent lock: %v", err) + } + lockText := string(lockRaw) + if !strings.Contains(lockText, `"vfx_persistent:blankradius5": 47`) || + !strings.Contains(lockText, `"vfx_persistent:blankradius10": 48`) || + !strings.Contains(lockText, `"vfx_persistent:blankradius30": 52`) { + t.Fatalf("expected refreshed snapshot lock IDs, got:\n%s", lockText) + } +} + +func TestBuildSupportsCanonicalVFXPersistent(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "vfx_persistent")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "vfx_persistent", "base.json"), `{ + "output": "vfx_persistent.2da", + "columns": ["LABEL", "SHAPE", "RADIUS"], + "rows": [ + {"id": 0, "key": "vfx_persistent:vfx_per_fogacid", "LABEL": "VFX_PER_FOGACID", "SHAPE": "C", "RADIUS": "5"}, + {"id": 46, "key": "vfx_persistent:vfx_mob_nightmare_smoke", "LABEL": "VFX_MOB_NIGHTMARE_SMOKE", "SHAPE": "C", "RADIUS": "1.5"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "vfx_persistent", "lock.json"), `{ + "vfx_persistent:vfx_per_fogacid": 0, + "vfx_persistent:vfx_mob_nightmare_smoke": 46 +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "vfx_persistent.2da")) + if err != nil { + t.Fatalf("read vfx_persistent.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "LABEL\tSHAPE\tRADIUS\n") || + !strings.Contains(text, "0\tVFX_PER_FOGACID\tC\t5\n") || + !strings.Contains(text, "46\tVFX_MOB_NIGHTMARE_SMOKE\tC\t1.5\n") { + t.Fatalf("unexpected vfx_persistent.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalVFXPersistentMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "vfx_persistent", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "vfx_persistent.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("LABEL\tSHAPE\tRADIUS\n") + f.write("0\tVFX_PER_FOGACID\tC\t5\n") + for i in range(1, 46): + f.write(f"{i}\t****\t****\t****\n") + f.write("46\tVFX_MOB_NIGHTMARE_SMOKE\tC\t1.5\n") + f.write("47\tVFX_PER_BLANK_RADIUS_5\tC\t5\n") + f.write("48\tVFX_PER_BLANK_RADIUS_10\tC\t5\n") + f.write("49\tVFX_PER_BLANK_RADIUS_15\tC\t15\n") + f.write("50\tVFX_PER_BLANK_RADIUS_20\tC\t20\n") + f.write("51\tVFX_PER_BLANK_RADIUS_25\tC\t25\n") + f.write("52\tVFX_PER_BLANK_RADIUS_30\tC\t30\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "vfx_persistent", "base.json"), `{ + "output": "vfx_persistent.2da", + "columns": ["LABEL", "SHAPE", "RADIUS"], + "rows": [ + {"id": 0, "LABEL": "VFX_PER_FOGACID", "SHAPE": "C", "RADIUS": "5"}, + {"id": 46, "LABEL": "VFX_MOB_NIGHTMARE_SMOKE", "SHAPE": "C", "RADIUS": "1.5"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "vfx_persistent", "lock.json"), `{ + "vfx_persistent:blankradius5": 47, + "vfx_persistent:blankradius10": 48, + "vfx_persistent:blankradius15": 49, + "vfx_persistent:blankradius20": 50, + "vfx_persistent:blankradius25": 51, + "vfx_persistent:blankradius30": 52 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "vfx_persistent", "modules", "freeformaoes.json"), `{ + "entries": { + "vfx_persistent:blankradius5": {"LABEL": "VFX_PER_BLANK_RADIUS_5", "SHAPE": "C", "RADIUS": "5"}, + "vfx_persistent:blankradius10": {"LABEL": "VFX_PER_BLANK_RADIUS_10", "SHAPE": "C", "RADIUS": "5"}, + "vfx_persistent:blankradius15": {"LABEL": "VFX_PER_BLANK_RADIUS_15", "SHAPE": "C", "RADIUS": "15"}, + "vfx_persistent:blankradius20": {"LABEL": "VFX_PER_BLANK_RADIUS_20", "SHAPE": "C", "RADIUS": "20"}, + "vfx_persistent:blankradius25": {"LABEL": "VFX_PER_BLANK_RADIUS_25", "SHAPE": "C", "RADIUS": "25"}, + "vfx_persistent:blankradius30": {"LABEL": "VFX_PER_BLANK_RADIUS_30", "SHAPE": "C", "RADIUS": "30"} + } +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "vfx_persistent.2da")) + if err != nil { + t.Fatalf("read native vfx_persistent.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "vfx_persistent.2da")) + if err != nil { + t.Fatalf("read reference vfx_persistent.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("vfx_persistent output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestBuildNativeRemovesStaleTopdataOutputs(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{ + "output": "repadjust.2da", + "columns": ["LABEL"], + "rows": [ + {"id": 0, "LABEL": "TEST"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "lock.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "build", "topdata", "2da")) + writeFile(t, filepath.Join(root, "build", "topdata", "2da", "stale.2da"), "stale\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + result, err := BuildNative(p, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + if _, err := os.Stat(filepath.Join(result.Output2DADir, "stale.2da")); !os.IsNotExist(err) { + t.Fatalf("expected stale topdata output to be removed, stat err=%v", err) + } +} + +func TestValidateAndBuildTopdataDoNotRequireReferenceBuilder(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{ + "output": "repadjust.2da", + "columns": ["LABEL"], + "rows": [ + {"id": 0, "LABEL": "TEST"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "lock.json"), "{}\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + + report := ValidateProject(p) + if report.HasErrors() { + t.Fatalf("expected validate to succeed without reference builder, got %#v", report.Diagnostics) + } + if strings.Contains(diagnosticsText(report.Diagnostics), "reference_builder") { + t.Fatalf("did not expect reference_builder validation diagnostic, got %#v", report.Diagnostics) + } + if _, err := BuildNative(p, nil); err != nil { + t.Fatalf("BuildNative failed without reference builder: %v", err) + } +} + +func TestCompareReferenceFailsClearlyWithoutReferenceBuilder(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{ + "output": "repadjust.2da", + "columns": ["LABEL"], + "rows": [ + {"id": 0, "LABEL": "TEST"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "lock.json"), "{}\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + if _, err := BuildNative(p, nil); err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + compare, err := CompareReference(p, nil) + if err != nil { + t.Fatalf("CompareReference failed: %v", err) + } + if compare.Mode != "native" || compare.NativeMismatch != 0 || compare.NativePass != 1 { + t.Fatalf("unexpected compare result without reference builder: %#v", compare) + } +} + +func TestNormalizeProjectImportsLegacyProgfx(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "progfx")) + writeFile(t, filepath.Join(root, "reference", "data", "progfx", "base.json"), `{ + "output": "progfx.2da", + "columns": ["Label", "Type", "Param1", "Param2", "Param3", "Param4", "Param5", "Param6", "Param7", "Param8"], + "rows": [ + {"id": 0, "Label": "****", "Type": "****", "Param1": "****", "Param2": "****", "Param3": "****", "Param4": "****", "Param5": "****", "Param6": "****", "Param7": "****", "Param8": "****"}, + {"id": 1300, "Label": "FreezeAnimations", "Type": "13", "Param1": "****", "Param2": "****", "Param3": "****", "Param4": "****", "Param5": "****", "Param6": "****", "Param7": "****", "Param8": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "progfx", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 2 { + t.Fatalf("expected progfx files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "progfx", "base.json"), + filepath.Join(root, "topdata", "data", "progfx", "lock.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported progfx path %s: %v", path, err) + } + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "progfx", "lock.json")) + if err != nil { + t.Fatalf("read progfx lock: %v", err) + } + if strings.TrimSpace(string(lockRaw)) != "{}" { + t.Fatalf("expected empty imported progfx lock, got:\n%s", string(lockRaw)) + } +} + +func TestBuildSupportsCanonicalProgfx(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "progfx")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "progfx", "base.json"), `{ + "output": "progfx.2da", + "columns": ["Label", "Type", "Param1", "Param2", "Param3", "Param4", "Param5", "Param6", "Param7", "Param8"], + "rows": [ + {"id": 0, "Label": "****", "Type": "****", "Param1": "****", "Param2": "****", "Param3": "****", "Param4": "****", "Param5": "****", "Param6": "****", "Param7": "****", "Param8": "****"}, + {"id": 1300, "Label": "FreezeAnimations", "Type": "13", "Param1": "****", "Param2": "****", "Param3": "****", "Param4": "****", "Param5": "****", "Param6": "****", "Param7": "****", "Param8": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "progfx", "lock.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "progfx.2da")) + if err != nil { + t.Fatalf("read progfx.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "Label\tType\tParam1\tParam2\tParam3\tParam4\tParam5\tParam6\tParam7\tParam8\n") || + !strings.Contains(text, "0\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\n") || + !strings.Contains(text, "1300\tFreezeAnimations\t13\t****\t****\t****\t****\t****\t****\t****\t****\n") { + t.Fatalf("unexpected progfx.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalProgfxMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "progfx")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "progfx.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tType\tParam1\tParam2\tParam3\tParam4\tParam5\tParam6\tParam7\tParam8\n") + f.write("0\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\n") + for i in range(1, 1300): + f.write(f"{i}\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\n") + f.write("1300\tFreezeAnimations\t13\t****\t****\t****\t****\t****\t****\t****\t****\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "progfx", "base.json"), `{ + "output": "progfx.2da", + "columns": ["Label", "Type", "Param1", "Param2", "Param3", "Param4", "Param5", "Param6", "Param7", "Param8"], + "rows": [ + {"id": 0, "Label": "****", "Type": "****", "Param1": "****", "Param2": "****", "Param3": "****", "Param4": "****", "Param5": "****", "Param6": "****", "Param7": "****", "Param8": "****"}, + {"id": 1300, "Label": "FreezeAnimations", "Type": "13", "Param1": "****", "Param2": "****", "Param3": "****", "Param4": "****", "Param5": "****", "Param6": "****", "Param7": "****", "Param8": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "progfx", "lock.json"), "{}\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "progfx.2da")) + if err != nil { + t.Fatalf("read native progfx.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "progfx.2da")) + if err != nil { + t.Fatalf("read reference progfx.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("progfx output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyRepadjust(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "repadjust")) + writeFile(t, filepath.Join(root, "reference", "data", "repadjust", "base.json"), `{ + "columns": ["LABEL", "PERSONALREP", "FACTIONREP", "WITFRIA", "WITFRIB", "WITFRIC", "WITNEUA", "WITNEUB", "WITNEUC", "WITENEA", "WITENEB", "WITENEC"], + "rows": [ + {"id": 0, "LABEL": "Attack", "PERSONALREP": "-100", "FACTIONREP": "-5", "WITFRIA": "-100", "WITFRIB": "-100", "WITFRIC": "0", "WITNEUA": "-5", "WITNEUB": "0", "WITNEUC": "0", "WITENEA": "0", "WITENEB": "0", "WITENEC": "0"}, + {"id": 3, "LABEL": "Help", "PERSONALREP": "0", "FACTIONREP": "0", "WITFRIA": "0", "WITFRIB": "0", "WITFRIC": "0", "WITNEUA": "0", "WITNEUB": "0", "WITNEUC": "0", "WITENEA": "0", "WITENEB": "0", "WITENEC": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "repadjust", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 2 { + t.Fatalf("expected repadjust files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "repadjust", "base.json"), + filepath.Join(root, "topdata", "data", "repadjust", "lock.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported repadjust path %s: %v", path, err) + } + } + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "repadjust", "base.json")) + if err != nil { + t.Fatalf("read repadjust base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "repadjust.2da"`) { + t.Fatalf("expected imported repadjust output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "repadjust", "lock.json")) + if err != nil { + t.Fatalf("read repadjust lock: %v", err) + } + if strings.TrimSpace(string(lockRaw)) != "{}" { + t.Fatalf("expected empty imported repadjust lock, got:\n%s", string(lockRaw)) + } +} + +func TestBuildSupportsCanonicalRepadjust(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "repadjust")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "base.json"), `{ + "output": "repadjust.2da", + "columns": ["LABEL", "PERSONALREP", "FACTIONREP", "WITFRIA", "WITFRIB", "WITFRIC", "WITNEUA", "WITNEUB", "WITNEUC", "WITENEA", "WITENEB", "WITENEC"], + "rows": [ + {"id": 0, "LABEL": "Attack", "PERSONALREP": "-100", "FACTIONREP": "-5", "WITFRIA": "-100", "WITFRIB": "-100", "WITFRIC": "0", "WITNEUA": "-5", "WITNEUB": "0", "WITNEUC": "0", "WITENEA": "0", "WITENEB": "0", "WITENEC": "0"}, + {"id": 3, "LABEL": "Help", "PERSONALREP": "0", "FACTIONREP": "0", "WITFRIA": "0", "WITFRIB": "0", "WITFRIC": "0", "WITNEUA": "0", "WITNEUB": "0", "WITNEUC": "0", "WITENEA": "0", "WITENEB": "0", "WITENEC": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "repadjust", "lock.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "repadjust.2da")) + if err != nil { + t.Fatalf("read repadjust.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "LABEL\tPERSONALREP\tFACTIONREP\tWITFRIA\tWITFRIB\tWITFRIC\tWITNEUA\tWITNEUB\tWITNEUC\tWITENEA\tWITENEB\tWITENEC\n") || + !strings.Contains(text, "0\tAttack\t-100\t-5\t-100\t-100\t0\t-5\t0\t0\t0\t0\t0\n") || + !strings.Contains(text, "3\tHelp\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n") { + t.Fatalf("unexpected repadjust.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalRepadjustMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "repadjust")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "repadjust.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("LABEL\tPERSONALREP\tFACTIONREP\tWITFRIA\tWITFRIB\tWITFRIC\tWITNEUA\tWITNEUB\tWITNEUC\tWITENEA\tWITENEB\tWITENEC\n") + f.write("0\tAttack\t-100\t-5\t-100\t-100\t0\t-5\t0\t0\t0\t0\t0\n") + f.write("1\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\n") + f.write("2\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\n") + f.write("3\tHelp\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\t0\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "repadjust", "base.json"), `{ + "output": "repadjust.2da", + "columns": ["LABEL", "PERSONALREP", "FACTIONREP", "WITFRIA", "WITFRIB", "WITFRIC", "WITNEUA", "WITNEUB", "WITNEUC", "WITENEA", "WITENEB", "WITENEC"], + "rows": [ + {"id": 0, "LABEL": "Attack", "PERSONALREP": "-100", "FACTIONREP": "-5", "WITFRIA": "-100", "WITFRIB": "-100", "WITFRIC": "0", "WITNEUA": "-5", "WITNEUB": "0", "WITNEUC": "0", "WITENEA": "0", "WITENEB": "0", "WITENEC": "0"}, + {"id": 3, "LABEL": "Help", "PERSONALREP": "0", "FACTIONREP": "0", "WITFRIA": "0", "WITFRIB": "0", "WITFRIC": "0", "WITNEUA": "0", "WITNEUB": "0", "WITNEUC": "0", "WITENEA": "0", "WITENEB": "0", "WITENEC": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "repadjust", "lock.json"), "{}\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "repadjust.2da")) + if err != nil { + t.Fatalf("read native repadjust.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "repadjust.2da")) + if err != nil { + t.Fatalf("read reference repadjust.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("repadjust output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyWingmodel(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "wingmodel", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "base.json"), `{ + "columns": ["LABEL", "MODEL", "ENVMAP"], + "rows": [ + {"key": "wingmodel:none", "id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"}, + {"key": "wingmodel:angel", "id": 2, "LABEL": "Angel", "MODEL": "c_angel", "ENVMAP": "default"}, + {"key": "wingmodel:greatsword", "id": 89, "LABEL": "Greatsword", "MODEL": "c_greatsword", "ENVMAP": "default"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "lock.json"), `{ + "wings:armoredangel": 90, + "wings:fallenangel": 91, + "wings:mephisto": 92, + "wingmodel:demon": 1, + "wingmodel:angel": 2 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "modules", "add.json"), `{ + "entries": { + "wings:armoredangel": { + "LABEL": "Armored Angel", + "MODEL": "c_armoredangel", + "ENVMAP": "default" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "modules", "ovr_wingprefixes.json"), `{ + "overrides": [ + {"key": "wingmodel:angel", "id": 2, "LABEL": "Wings: Angel"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 4 { + t.Fatalf("expected wingmodel files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "wingmodel", "base.json"), + filepath.Join(root, "topdata", "data", "wingmodel", "lock.json"), + filepath.Join(root, "topdata", "data", "wingmodel", "modules", "add.json"), + filepath.Join(root, "topdata", "data", "wingmodel", "modules", "ovr_wingprefixes.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported wingmodel path %s: %v", path, err) + } + } + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "wingmodel", "base.json")) + if err != nil { + t.Fatalf("read wingmodel base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "wingmodel.2da"`) { + t.Fatalf("expected imported wingmodel output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "wingmodel", "lock.json")) + if err != nil { + t.Fatalf("read wingmodel lock: %v", err) + } + lockText := string(lockRaw) + if !strings.Contains(lockText, `"wings:mephisto": 92`) || !strings.Contains(lockText, `"wingmodel:angel": 2`) { + t.Fatalf("expected imported wingmodel lock IDs, got:\n%s", lockText) + } +} + +func TestBuildSupportsCanonicalWingmodel(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "wingmodel", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "wingmodel", "base.json"), `{ + "output": "wingmodel.2da", + "columns": ["LABEL", "MODEL", "ENVMAP"], + "rows": [ + {"key": "wingmodel:none", "id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"}, + {"key": "wingmodel:angel", "id": 2, "LABEL": "Angel", "MODEL": "c_angel", "ENVMAP": "default"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "wingmodel", "lock.json"), `{ + "wings:armoredangel": 90, + "wingmodel:angel": 2 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "wingmodel", "modules", "add.json"), `{ + "entries": { + "wings:armoredangel": { + "LABEL": "Armored Angel", + "MODEL": "c_armoredangel", + "ENVMAP": "default" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "wingmodel", "modules", "ovr_wingprefixes.json"), `{ + "overrides": [ + {"key": "wingmodel:angel", "id": 2, "LABEL": "Wings: Angel"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "wingmodel.2da")) + if err != nil { + t.Fatalf("read wingmodel.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "LABEL\tMODEL\tENVMAP\n") || + !strings.Contains(text, "0\t(None)\t****\t****\n") || + !strings.Contains(text, "2\t\"Wings: Angel\"\tc_angel\tdefault\n") || + !strings.Contains(text, "90\t\"Armored Angel\"\tc_armoredangel\tdefault\n") { + t.Fatalf("unexpected wingmodel.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalWingmodelMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "wingmodel", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "wingmodel.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("LABEL\tMODEL\tENVMAP\n") + f.write("0\t(None)\t****\t****\n") + f.write("1\t****\t****\t****\n") + f.write("2\tWings: Angel\tc_angel\tdefault\n") + for i in range(3, 90): + f.write(f"{i}\t****\t****\t****\n") + f.write("90\tArmored Angel\tc_armoredangel\tdefault\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "base.json"), `{ + "output": "wingmodel.2da", + "columns": ["LABEL", "MODEL", "ENVMAP"], + "rows": [ + {"key": "wingmodel:none", "id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"}, + {"key": "wingmodel:angel", "id": 2, "LABEL": "Angel", "MODEL": "c_angel", "ENVMAP": "default"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "lock.json"), `{ + "wings:armoredangel": 90, + "wingmodel:angel": 2 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "modules", "add.json"), `{ + "entries": { + "wings:armoredangel": { + "LABEL": "Armored Angel", + "MODEL": "c_armoredangel", + "ENVMAP": "default" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "wingmodel", "modules", "ovr_wingprefixes.json"), `{ + "overrides": [ + {"key": "wingmodel:angel", "id": 2, "LABEL": "Wings: Angel"} + ] +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "wingmodel.2da")) + if err != nil { + t.Fatalf("read native wingmodel.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "wingmodel.2da")) + if err != nil { + t.Fatalf("read reference wingmodel.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("wingmodel output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyTailmodel(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + + mkdirAll(t, filepath.Join(root, "reference", "data", "tailmodel", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "base.json"), `{ + "columns": ["LABEL", "MODEL", "ENVMAP"], + "rows": [ + {"key": "tailmodel:none", "id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"}, + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Lizard", "MODEL": "c_tailliz", "ENVMAP": "default"}, + {"key": "tailmodel:dragonwhite", "id": 13, "LABEL": "Dragon, White", "MODEL": "c_tail_whi", "ENVMAP": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "lock.json"), `{ + "tails:taildemon": 5050, + "tails:taildemon2": 5051, + "tails:taildemon4": 5052, + "tails:tailfluff": 5053, + "tailmodel:lizard": 1, + "tailmodel:dragonwhite": 13 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "modules", "add.json"), `{ + "entries": { + "tails:taildemon": {"LABEL": "Tail: Demon", "MODEL": "c_taildemon", "ENVMAP": "default"}, + "tails:tailfluff": {"LABEL": "Tail: Demon, Fluffy", "MODEL": "c_tailfluff", "ENVMAP": "default"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "modules", "ovr_tailprefixes.json"), `{ + "overrides": [ + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Tail: Lizard"}, + {"key": "tailmodel:dragonwhite", "id": 13, "LABEL": "Tail: Dragon, White"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 4 { + t.Fatalf("expected tailmodel files to be imported, got %#v", result) + } + + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "tailmodel", "base.json"), + filepath.Join(root, "topdata", "data", "tailmodel", "lock.json"), + filepath.Join(root, "topdata", "data", "tailmodel", "modules", "add.json"), + filepath.Join(root, "topdata", "data", "tailmodel", "modules", "ovr_tailprefixes.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported tailmodel path %s: %v", path, err) + } + } + + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "tailmodel", "base.json")) + if err != nil { + t.Fatalf("read tailmodel base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "tailmodel.2da"`) { + t.Fatalf("expected imported tailmodel output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "tailmodel", "lock.json")) + if err != nil { + t.Fatalf("read tailmodel lock: %v", err) + } + lockText := string(lockRaw) + if !strings.Contains(lockText, `"tails:taildemon": 5050`) || !strings.Contains(lockText, `"tailmodel:dragonwhite": 13`) { + t.Fatalf("expected imported tailmodel lock IDs, got:\n%s", lockText) + } +} + +func TestBuildSupportsCanonicalTailmodel(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "tailmodel", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "base.json"), `{ + "output": "tailmodel.2da", + "columns": ["LABEL", "MODEL", "ENVMAP"], + "rows": [ + {"key": "tailmodel:none", "id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"}, + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Lizard", "MODEL": "c_tailliz", "ENVMAP": "default"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "lock.json"), `{ + "tails:taildemon": 5050, + "tailmodel:lizard": 1 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "modules", "add.json"), `{ + "entries": { + "tails:taildemon": {"LABEL": "Tail: Demon", "MODEL": "c_taildemon", "ENVMAP": "default"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "modules", "ovr_tailprefixes.json"), `{ + "overrides": [ + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Tail: Lizard"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "tailmodel.2da")) + if err != nil { + t.Fatalf("read tailmodel.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "LABEL\tMODEL\tENVMAP\n") || + !strings.Contains(text, "0\t(None)\t****\t****\n") || + !strings.Contains(text, "1\t\"Tail: Lizard\"\tc_tailliz\tdefault\n") || + !strings.Contains(text, "5050\t\"Tail: Demon\"\tc_taildemon\tdefault\n") { + t.Fatalf("unexpected tailmodel.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalTailmodelMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "tailmodel", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "data", "tailmodel", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "tailmodel.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("LABEL\tMODEL\tENVMAP\n") + f.write("0\t(None)\t****\t****\n") + f.write("1\t\"Tail: Lizard\"\tc_tailliz\tdefault\n") + for i in range(2, 5050): + f.write(f"{i}\t****\t****\t****\n") + f.write("5050\t\"Tail: Demon\"\tc_taildemon\tdefault\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "base.json"), `{ + "output": "tailmodel.2da", + "columns": ["LABEL", "MODEL", "ENVMAP"], + "rows": [ + {"key": "tailmodel:none", "id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"}, + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Lizard", "MODEL": "c_tailliz", "ENVMAP": "default"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "lock.json"), `{ + "tails:taildemon": 5050, + "tailmodel:lizard": 1 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "modules", "add.json"), `{ + "entries": { + "tails:taildemon": {"LABEL": "Tail: Demon", "MODEL": "c_taildemon", "ENVMAP": "default"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "tailmodel", "modules", "ovr_tailprefixes.json"), `{ + "overrides": [ + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Tail: Lizard"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "base.json"), `{ + "output": "tailmodel.2da", + "columns": ["LABEL", "MODEL", "ENVMAP"], + "rows": [ + {"key": "tailmodel:none", "id": 0, "LABEL": "(None)", "MODEL": "****", "ENVMAP": "****"}, + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Lizard", "MODEL": "c_tailliz", "ENVMAP": "default"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "lock.json"), `{ + "tails:taildemon": 5050, + "tailmodel:lizard": 1 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "modules", "add.json"), `{ + "entries": { + "tails:taildemon": {"LABEL": "Tail: Demon", "MODEL": "c_taildemon", "ENVMAP": "default"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "tailmodel", "modules", "ovr_tailprefixes.json"), `{ + "overrides": [ + {"key": "tailmodel:lizard", "id": 1, "LABEL": "Tail: Lizard"} + ] +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "tailmodel.2da")) + if err != nil { + t.Fatalf("read native tailmodel.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "tailmodel.2da")) + if err != nil { + t.Fatalf("read reference tailmodel.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("tailmodel output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyDoortypes(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + + mkdirAll(t, filepath.Join(root, "reference", "data", "doortypes", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "base.json"), `{ + "columns": ["Label", "Model", "TileSet", "TemplateResRef", "StringRefGame", "BlockSight", "VisibleModel", "SoundAppType"], + "rows": [ + {"id": 0, "Label": "Generic", "Model": "****", "TileSet": "****", "TemplateResRef": "****", "StringRefGame": "66717", "BlockSight": "****", "VisibleModel": "****", "SoundAppType": "****"}, + {"id": 1, "Label": "Wall1Door", "Model": "TTR_UDoor_01", "TileSet": "TTR01", "TemplateResRef": "nw_door_ttr_01", "StringRefGame": "63491", "BlockSight": "1", "VisibleModel": "1", "SoundAppType": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "lock.json"), `{ + "txpple:id_6000": 5200, + "ancarion:id_125": 5226, + "babayaga:id_1046": 5244 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_pld01.json"), `{ + "entries": { + "ancarion:id_125": {"Label": "CastleTrans", "Model": "pld_door_01", "TileSet": "PLD01", "TemplateResRef": "nw_door_ttr_15", "StringRefGame": 63520, "BlockSight": 0, "VisibleModel": 0} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_sic11.json"), `{ + "entries": { + "sens:id_1351": {"Label": "MulsantirGreat01", "Model": "door_mul01", "TileSet": "TNO01", "TemplateResRef": "nw_door_ttr_01", "StringRefGame": 5349, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 1} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_tapr.json"), `{ + "entries": { + "txpple:id_6000": {"Label": "Necropolis: Main Door", "Model": "mst01_door_01", "TileSet": "mst01", "TemplateResRef": "nw_door_metal", "StringRefGame": 66717, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 9} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_tdm01.json"), `{ + "entries": { + "projectq:id_5225": {"Label": "DungeonGate", "Model": "tdm02_sdoor_01", "TileSet": "TDM01", "TemplateResRef": "nw_door_ttr_01", "StringRefGame": 63491, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 1} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_tdx01.json"), `{ + "entries": { + "sixandzwerkules:id_1167": {"Label": "DungeonMechGate1", "Model": "tdx_door04", "TileSet": "TDX01", "TemplateResRef": "nw_door_ttr_03", "StringRefGame": 63537, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 3} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_tei01.json"), `{ + "entries": { + "zwerkules:id_1451": {"Label": "TEI01_StairTrans1", "Model": "tei_udoor01", "TileSet": "TEI01", "TemplateResRef": "nw_door_ttr_34", "StringRefGame": 5349, "BlockSight": 0, "VisibleModel": 0} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_tfm01.json"), `{ + "entries": { + "babayaga:id_1046": {"Label": "TFM01_BarnDoor", "Model": "tfm_udoor_06", "TileSet": "TFM01", "TemplateResRef": "nw_door_ttr_05", "StringRefGame": 5350, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 1} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 9 { + t.Fatalf("expected doortypes files to be imported, got %#v", result) + } + + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "doortypes", "base.json"), + filepath.Join(root, "topdata", "data", "doortypes", "lock.json"), + filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_pld01.json"), + filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_sic11.json"), + filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_tapr.json"), + filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_tdm01.json"), + filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_tdx01.json"), + filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_tei01.json"), + filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_tfm01.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported doortypes path %s: %v", path, err) + } + } + + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "doortypes", "base.json")) + if err != nil { + t.Fatalf("read doortypes base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "doortypes.2da"`) { + t.Fatalf("expected imported doortypes output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "doortypes", "lock.json")) + if err != nil { + t.Fatalf("read doortypes lock: %v", err) + } + lockText := string(lockRaw) + if !strings.Contains(lockText, `"txpple:id_6000": 5200`) || !strings.Contains(lockText, `"babayaga:id_1046": 5244`) { + t.Fatalf("expected imported doortypes lock IDs, got:\n%s", lockText) + } +} + +func TestBuildSupportsCanonicalDoortypes(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "doortypes", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "base.json"), `{ + "output": "doortypes.2da", + "columns": ["Label", "Model", "TileSet", "TemplateResRef", "StringRefGame", "BlockSight", "VisibleModel", "SoundAppType"], + "rows": [ + {"id": 0, "Label": "Generic", "Model": "****", "TileSet": "****", "TemplateResRef": "****", "StringRefGame": "66717", "BlockSight": "****", "VisibleModel": "****", "SoundAppType": "****"}, + {"id": 1, "Label": "Wall1Door", "Model": "TTR_UDoor_01", "TileSet": "TTR01", "TemplateResRef": "nw_door_ttr_01", "StringRefGame": "63491", "BlockSight": "1", "VisibleModel": "1", "SoundAppType": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "lock.json"), `{ + "txpple:id_6000": 5200 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_tapr.json"), `{ + "entries": { + "txpple:id_6000": {"Label": "Necropolis: Main Door", "Model": "mst01_door_01", "TileSet": "mst01", "TemplateResRef": "nw_door_metal", "StringRefGame": 66717, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 9} + } +}`+"\n") + for _, name := range []string{"add_pld01.json", "add_sic11.json", "add_tdm01.json", "add_tdx01.json", "add_tei01.json", "add_tfm01.json"} { + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "modules", name), `{"entries": {}}`+"\n") + } + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "doortypes.2da")) + if err != nil { + t.Fatalf("read doortypes.2da: %v", err) + } + if !strings.Contains(string(got), "Label\tModel\tTileSet\tTemplateResRef\tStringRefGame\tBlockSight\tVisibleModel\tSoundAppType\n") || + !strings.Contains(string(got), "0\tGeneric\t****\t****\t****\t66717\t****\t****\t****\n") || + !strings.Contains(string(got), "1\tWall1Door\tTTR_UDoor_01\tTTR01\tnw_door_ttr_01\t63491\t1\t1\t1\n") || + !strings.Contains(string(got), "5200\t\"Necropolis: Main Door\"\tmst01_door_01\tmst01\tnw_door_metal\t66717\t1\t1\t9\n") { + t.Fatalf("unexpected doortypes.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalDoortypesMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "doortypes", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "data", "doortypes", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "doortypes.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tModel\tTileSet\tTemplateResRef\tStringRefGame\tBlockSight\tVisibleModel\tSoundAppType\n") + f.write("0\tGeneric\t****\t****\t****\t66717\t****\t****\t****\n") + f.write("1\tWall1Door\tTTR_UDoor_01\tTTR01\tnw_door_ttr_01\t63491\t1\t1\t1\n") + for row_id in range(2, 5200): + f.write(f"{row_id}\t****\t****\t****\t****\t****\t****\t****\t****\n") + f.write("5200\t\"Necropolis: Main Door\"\tmst01_door_01\tmst01\tnw_door_metal\t66717\t1\t1\t9\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "base.json"), `{ + "output": "doortypes.2da", + "columns": ["Label", "Model", "TileSet", "TemplateResRef", "StringRefGame", "BlockSight", "VisibleModel", "SoundAppType"], + "rows": [ + {"id": 0, "Label": "Generic", "Model": "****", "TileSet": "****", "TemplateResRef": "****", "StringRefGame": "66717", "BlockSight": "****", "VisibleModel": "****", "SoundAppType": "****"}, + {"id": 1, "Label": "Wall1Door", "Model": "TTR_UDoor_01", "TileSet": "TTR01", "TemplateResRef": "nw_door_ttr_01", "StringRefGame": "63491", "BlockSight": "1", "VisibleModel": "1", "SoundAppType": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "lock.json"), `{ + "txpple:id_6000": 5200 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", "add_tapr.json"), `{ + "entries": { + "txpple:id_6000": {"Label": "Necropolis: Main Door", "Model": "mst01_door_01", "TileSet": "mst01", "TemplateResRef": "nw_door_metal", "StringRefGame": 66717, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 9} + } +}`+"\n") + for _, name := range []string{"add_pld01.json", "add_sic11.json", "add_tdm01.json", "add_tdx01.json", "add_tei01.json", "add_tfm01.json"} { + writeFile(t, filepath.Join(root, "reference", "data", "doortypes", "modules", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "base.json"), `{ + "output": "doortypes.2da", + "columns": ["Label", "Model", "TileSet", "TemplateResRef", "StringRefGame", "BlockSight", "VisibleModel", "SoundAppType"], + "rows": [ + {"id": 0, "Label": "Generic", "Model": "****", "TileSet": "****", "TemplateResRef": "****", "StringRefGame": "66717", "BlockSight": "****", "VisibleModel": "****", "SoundAppType": "****"}, + {"id": 1, "Label": "Wall1Door", "Model": "TTR_UDoor_01", "TileSet": "TTR01", "TemplateResRef": "nw_door_ttr_01", "StringRefGame": "63491", "BlockSight": "1", "VisibleModel": "1", "SoundAppType": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "lock.json"), `{ + "txpple:id_6000": 5200 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "modules", "add_tapr.json"), `{ + "entries": { + "txpple:id_6000": {"Label": "Necropolis: Main Door", "Model": "mst01_door_01", "TileSet": "mst01", "TemplateResRef": "nw_door_metal", "StringRefGame": 66717, "BlockSight": 1, "VisibleModel": 1, "SoundAppType": 9} + } +}`+"\n") + for _, name := range []string{"add_pld01.json", "add_sic11.json", "add_tdm01.json", "add_tdx01.json", "add_tei01.json", "add_tfm01.json"} { + writeFile(t, filepath.Join(root, "topdata", "data", "doortypes", "modules", name), `{"entries": {}}`+"\n") + } + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "doortypes.2da")) + if err != nil { + t.Fatalf("read native doortypes.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "doortypes.2da")) + if err != nil { + t.Fatalf("read reference doortypes.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("doortypes output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyVisualeffects(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + + mkdirAll(t, filepath.Join(root, "reference", "data", "visualeffects", "modules", "accessories")) + writeFile(t, filepath.Join(root, "reference", "data", "visualeffects", "base.json"), `{ + "columns": ["Label", "Type_FD", "OrientWithGround", "Imp_HeadCon_Node", "Imp_Impact_Node", "Imp_Root_S_Node", "Imp_Root_M_Node", "Imp_Root_L_Node", "Imp_Root_H_Node", "ProgFX_Impact", "SoundImpact", "ProgFX_Duration", "SoundDuration", "ProgFX_Cessation", "SoundCessastion", "Ces_HeadCon_Node", "Ces_Impact_Node", "Ces_Root_S_Node", "Ces_Root_M_Node", "Ces_Root_L_Node", "Ces_Root_H_Node", "ShakeType", "ShakeDelay", "ShakeDuration", "LowViolence", "LowQuality", "OrientWithObject"], + "rows": [ + {"key": "visualeffects:fnf_blinddeaf", "id": 18, "Label": "VFX_FNF_BLINDDEAF", "Type_FD": "F", "OrientWithGround": "0", "Imp_HeadCon_Node": "****", "Imp_Impact_Node": "****", "Imp_Root_S_Node": "****", "Imp_Root_M_Node": "****", "Imp_Root_L_Node": "****", "Imp_Root_H_Node": "****", "ProgFX_Impact": "****", "SoundImpact": "****", "ProgFX_Duration": "****", "SoundDuration": "****", "ProgFX_Cessation": "****", "SoundCessastion": "****", "Ces_HeadCon_Node": "****", "Ces_Impact_Node": "****", "Ces_Root_S_Node": "****", "Ces_Root_M_Node": "****", "Ces_Root_L_Node": "****", "Ces_Root_H_Node": "****", "ShakeType": "****", "ShakeDelay": "****", "ShakeDuration": "****", "LowViolence": "****", "LowQuality": "****", "OrientWithObject": "0"}, + {"key": "visualeffects:com_hitnegative", "id": 288, "Label": "VFX_COM_HIT_NEGATIVE", "Type_FD": "F", "OrientWithGround": "0", "Imp_HeadCon_Node": "****", "Imp_Impact_Node": "****", "Imp_Root_S_Node": "****", "Imp_Root_M_Node": "****", "Imp_Root_L_Node": "****", "Imp_Root_H_Node": "****", "ProgFX_Impact": "****", "SoundImpact": "old_sound", "ProgFX_Duration": "****", "SoundDuration": "****", "ProgFX_Cessation": "****", "SoundCessastion": "****", "Ces_HeadCon_Node": "****", "Ces_Impact_Node": "****", "Ces_Root_S_Node": "****", "Ces_Root_M_Node": "****", "Ces_Root_L_Node": "****", "Ces_Root_H_Node": "****", "ShakeType": "****", "ShakeDelay": "****", "ShakeDuration": "****", "LowViolence": "****", "LowQuality": "****", "OrientWithObject": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "visualeffects", "lock.json"), `{ + "visualeffects:chatbubble": 10100, + "visualeffects:headaccessory_antlers_l": 10101, + "visualeffects:vcm_hitmasscrit": 10125, + "visualeffects:com_hitnegative": 288, + "visualeffects:fnf_blinddeaf": 18 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "visualeffects", "modules", "chatbubble.json"), `{ + "entries": { + "visualeffects:chatbubble": { + "Label": "VFX_DUR_CHAT_BUBBLE", + "Type_FD": "D", + "OrientWithGround": "0", + "Imp_HeadCon_Node": "vdr_chatbubble", + "Imp_Impact_Node": "****", + "Imp_Root_S_Node": "****", + "Imp_Root_M_Node": "****", + "Imp_Root_L_Node": "****", + "Imp_Root_H_Node": "****", + "ProgFX_Impact": "****", + "SoundImpact": "****", + "ProgFX_Duration": "****", + "SoundDuration": "****", + "ProgFX_Cessation": "****", + "SoundCessastion": "****", + "Ces_HeadCon_Node": "****", + "Ces_Impact_Node": "****", + "Ces_Root_S_Node": "****", + "Ces_Root_M_Node": "****", + "Ces_Root_L_Node": "****", + "Ces_Root_H_Node": "****", + "ShakeType": "****", + "ShakeDelay": "****", + "ShakeDuration": "****", + "LowViolence": "****", + "LowQuality": "****", + "OrientWithObject": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "visualeffects", "modules", "add_onhitvfx.json"), `{ + "entries": { + "visualeffects:vcm_hitmasscrit": { + "Label": "VFX_COM_HIT_MASSIVE_CRITICALS", + "Type_FD": "F", + "OrientWithGround": 0, + "Imp_Impact_Node": "vcm_hitmasscrit", + "OrientWithObject": 0 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "visualeffects", "modules", "fix_comhitnegative.json"), `{ + "overrides": [ + {"key": "visualeffects:com_hitnegative", "id": 288, "SoundImpact": "scm_hitsmite"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "visualeffects", "modules", "ovr_lowqualitymodels.json"), `{ + "overrides": [ + {"key": "visualeffects:fnf_blinddeaf", "id": 18, "LowQuality": "vff_explblind_l"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "visualeffects", "modules", "accessories", "add_eos.json"), `{ + "entries": { + "visualeffects:headaccessory_antlers_l": { + "Label": "headaccessory_ANTLERS_L", + "Type_FD": "D", + "OrientWithGround": "0", + "Imp_HeadCon_Node": "hfx_antlers_l", + "Imp_Impact_Node": "****", + "Imp_Root_S_Node": "****", + "Imp_Root_M_Node": "****", + "Imp_Root_L_Node": "****", + "Imp_Root_H_Node": "****", + "ProgFX_Impact": "****", + "SoundImpact": "****", + "ProgFX_Duration": "****", + "SoundDuration": "****", + "ProgFX_Cessation": "****", + "SoundCessastion": "****", + "Ces_HeadCon_Node": "****", + "Ces_Impact_Node": "****", + "Ces_Root_S_Node": "****", + "Ces_Root_M_Node": "****", + "Ces_Root_L_Node": "****", + "Ces_Root_H_Node": "****", + "ShakeType": "****", + "ShakeDelay": "****", + "ShakeDuration": "****", + "LowViolence": "****", + "LowQuality": "****", + "OrientWithObject": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 6 { + t.Fatalf("expected visualeffects files to be imported, got %#v", result) + } + + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "visualeffects", "base.json"), + filepath.Join(root, "topdata", "data", "visualeffects", "lock.json"), + filepath.Join(root, "topdata", "data", "visualeffects", "modules", "add_onhitvfx.json"), + filepath.Join(root, "topdata", "data", "visualeffects", "modules", "chatbubble.json"), + filepath.Join(root, "topdata", "data", "visualeffects", "modules", "fix_comhitnegative.json"), + filepath.Join(root, "topdata", "data", "visualeffects", "modules", "ovr_lowqualitymodels.json"), + filepath.Join(root, "topdata", "data", "visualeffects", "modules", "accessories", "add_eos.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported visualeffects path %s: %v", path, err) + } + } + + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "visualeffects", "base.json")) + if err != nil { + t.Fatalf("read visualeffects base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "visualeffects.2da"`) { + t.Fatalf("expected imported visualeffects output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "visualeffects", "lock.json")) + if err != nil { + t.Fatalf("read visualeffects lock: %v", err) + } + lockText := string(lockRaw) + if !strings.Contains(lockText, `"visualeffects:chatbubble": 10100`) || !strings.Contains(lockText, `"visualeffects:headaccessory_antlers_l": 10101`) { + t.Fatalf("expected imported visualeffects lock IDs, got:\n%s", lockText) + } +} + +func TestBuildSupportsCanonicalVisualeffects(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "visualeffects", "modules", "accessories")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "visualeffects", "base.json"), `{ + "output": "visualeffects.2da", + "columns": ["Label", "Type_FD", "OrientWithGround", "Imp_HeadCon_Node", "Imp_Impact_Node", "Imp_Root_S_Node", "Imp_Root_M_Node", "Imp_Root_L_Node", "Imp_Root_H_Node", "ProgFX_Impact", "SoundImpact", "ProgFX_Duration", "SoundDuration", "ProgFX_Cessation", "SoundCessastion", "Ces_HeadCon_Node", "Ces_Impact_Node", "Ces_Root_S_Node", "Ces_Root_M_Node", "Ces_Root_L_Node", "Ces_Root_H_Node", "ShakeType", "ShakeDelay", "ShakeDuration", "LowViolence", "LowQuality", "OrientWithObject"], + "rows": [ + {"key": "visualeffects:fnf_blinddeaf", "id": 18, "Label": "VFX_FNF_BLINDDEAF", "Type_FD": "F", "OrientWithGround": "0", "Imp_HeadCon_Node": "****", "Imp_Impact_Node": "****", "Imp_Root_S_Node": "****", "Imp_Root_M_Node": "****", "Imp_Root_L_Node": "****", "Imp_Root_H_Node": "****", "ProgFX_Impact": "****", "SoundImpact": "****", "ProgFX_Duration": "****", "SoundDuration": "****", "ProgFX_Cessation": "****", "SoundCessastion": "****", "Ces_HeadCon_Node": "****", "Ces_Impact_Node": "****", "Ces_Root_S_Node": "****", "Ces_Root_M_Node": "****", "Ces_Root_L_Node": "****", "Ces_Root_H_Node": "****", "ShakeType": "****", "ShakeDelay": "****", "ShakeDuration": "****", "LowViolence": "****", "LowQuality": "****", "OrientWithObject": "0"}, + {"key": "visualeffects:com_hitnegative", "id": 288, "Label": "VFX_COM_HIT_NEGATIVE", "Type_FD": "F", "OrientWithGround": "0", "Imp_HeadCon_Node": "****", "Imp_Impact_Node": "****", "Imp_Root_S_Node": "****", "Imp_Root_M_Node": "****", "Imp_Root_L_Node": "****", "Imp_Root_H_Node": "****", "ProgFX_Impact": "****", "SoundImpact": "old_sound", "ProgFX_Duration": "****", "SoundDuration": "****", "ProgFX_Cessation": "****", "SoundCessastion": "****", "Ces_HeadCon_Node": "****", "Ces_Impact_Node": "****", "Ces_Root_S_Node": "****", "Ces_Root_M_Node": "****", "Ces_Root_L_Node": "****", "Ces_Root_H_Node": "****", "ShakeType": "****", "ShakeDelay": "****", "ShakeDuration": "****", "LowViolence": "****", "LowQuality": "****", "OrientWithObject": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "visualeffects", "lock.json"), `{ + "visualeffects:chatbubble": 10100, + "visualeffects:headaccessory_antlers_l": 10101, + "visualeffects:vcm_hitmasscrit": 10125, + "visualeffects:com_hitnegative": 288, + "visualeffects:fnf_blinddeaf": 18 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "visualeffects", "modules", "chatbubble.json"), `{ + "entries": { + "visualeffects:chatbubble": { + "Label": "VFX_DUR_CHAT_BUBBLE", + "Type_FD": "D", + "OrientWithGround": "0", + "Imp_HeadCon_Node": "vdr_chatbubble", + "Imp_Impact_Node": "****", + "Imp_Root_S_Node": "****", + "Imp_Root_M_Node": "****", + "Imp_Root_L_Node": "****", + "Imp_Root_H_Node": "****", + "ProgFX_Impact": "****", + "SoundImpact": "****", + "ProgFX_Duration": "****", + "SoundDuration": "****", + "ProgFX_Cessation": "****", + "SoundCessastion": "****", + "Ces_HeadCon_Node": "****", + "Ces_Impact_Node": "****", + "Ces_Root_S_Node": "****", + "Ces_Root_M_Node": "****", + "Ces_Root_L_Node": "****", + "Ces_Root_H_Node": "****", + "ShakeType": "****", + "ShakeDelay": "****", + "ShakeDuration": "****", + "LowViolence": "****", + "LowQuality": "****", + "OrientWithObject": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "visualeffects", "modules", "add_onhitvfx.json"), `{ + "entries": { + "visualeffects:vcm_hitmasscrit": { + "Label": "VFX_COM_HIT_MASSIVE_CRITICALS", + "Type_FD": "F", + "OrientWithGround": 0, + "Imp_Impact_Node": "vcm_hitmasscrit", + "OrientWithObject": 0 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "visualeffects", "modules", "fix_comhitnegative.json"), `{ + "overrides": [ + {"key": "visualeffects:com_hitnegative", "id": 288, "SoundImpact": "scm_hitsmite"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "visualeffects", "modules", "ovr_lowqualitymodels.json"), `{ + "overrides": [ + {"key": "visualeffects:fnf_blinddeaf", "id": 18, "LowQuality": "vff_explblind_l"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "visualeffects", "modules", "accessories", "add_eos.json"), `{ + "entries": { + "visualeffects:headaccessory_antlers_l": { + "Label": "headaccessory_ANTLERS_L", + "Type_FD": "D", + "OrientWithGround": "0", + "Imp_HeadCon_Node": "hfx_antlers_l", + "Imp_Impact_Node": "****", + "Imp_Root_S_Node": "****", + "Imp_Root_M_Node": "****", + "Imp_Root_L_Node": "****", + "Imp_Root_H_Node": "****", + "ProgFX_Impact": "****", + "SoundImpact": "****", + "ProgFX_Duration": "****", + "SoundDuration": "****", + "ProgFX_Cessation": "****", + "SoundCessastion": "****", + "Ces_HeadCon_Node": "****", + "Ces_Impact_Node": "****", + "Ces_Root_S_Node": "****", + "Ces_Root_M_Node": "****", + "Ces_Root_L_Node": "****", + "Ces_Root_H_Node": "****", + "ShakeType": "****", + "ShakeDelay": "****", + "ShakeDuration": "****", + "LowViolence": "****", + "LowQuality": "****", + "OrientWithObject": "0" + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "visualeffects.2da")) + if err != nil { + t.Fatalf("read visualeffects.2da: %v", err) + } + text := string(got) + for _, want := range []string{ + "18\tVFX_FNF_BLINDDEAF\tF\t0", + "288\tVFX_COM_HIT_NEGATIVE\tF\t0", + "10100\tVFX_DUR_CHAT_BUBBLE\tD\t0", + "10101\theadaccessory_ANTLERS_L\tD\t0", + "10125\tVFX_COM_HIT_MASSIVE_CRITICALS\tF\t0", + "scm_hitsmite", + "vff_explblind_l", + } { + if !strings.Contains(text, want) { + t.Fatalf("expected visualeffects.2da to contain %q, got:\n%s", want, text) + } + } +} + +func TestBuildCanonicalVisualeffectsMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "visualeffects", "modules", "accessories")) + mkdirAll(t, filepath.Join(root, "reference", "data", "visualeffects", "modules", "accessories")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "visualeffects.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tType_FD\tOrientWithGround\tImp_HeadCon_Node\tImp_Impact_Node\tImp_Root_S_Node\tImp_Root_M_Node\tImp_Root_L_Node\tImp_Root_H_Node\tProgFX_Impact\tSoundImpact\tProgFX_Duration\tSoundDuration\tProgFX_Cessation\tSoundCessastion\tCes_HeadCon_Node\tCes_Impact_Node\tCes_Root_S_Node\tCes_Root_M_Node\tCes_Root_L_Node\tCes_Root_H_Node\tShakeType\tShakeDelay\tShakeDuration\tLowViolence\tLowQuality\tOrientWithObject\n") + f.write("18\tVFX_FNF_BLINDDEAF\tF\t0\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\tvff_explblind_l\t0\n") + f.write("288\tVFX_COM_HIT_NEGATIVE\tF\t0\t****\t****\t****\t****\t****\t****\tscm_hitsmite\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t0\n") + f.write("10100\tVFX_DUR_CHAT_BUBBLE\tD\t0\tvdr_chatbubble\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t0\n") + f.write("10101\theadaccessory_ANTLERS_L\tD\t0\thfx_antlers_l\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t0\n") + f.write("10125\tVFX_COM_HIT_MASSIVE_CRITICALS\tF\t0\t****\tvcm_hitmasscrit\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t0\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`+"\n") + for _, target := range []string{"topdata", "reference"} { + writeFile(t, filepath.Join(root, target, "data", "visualeffects", "base.json"), `{ + "output": "visualeffects.2da", + "columns": ["Label", "Type_FD", "OrientWithGround", "Imp_HeadCon_Node", "Imp_Impact_Node", "Imp_Root_S_Node", "Imp_Root_M_Node", "Imp_Root_L_Node", "Imp_Root_H_Node", "ProgFX_Impact", "SoundImpact", "ProgFX_Duration", "SoundDuration", "ProgFX_Cessation", "SoundCessastion", "Ces_HeadCon_Node", "Ces_Impact_Node", "Ces_Root_S_Node", "Ces_Root_M_Node", "Ces_Root_L_Node", "Ces_Root_H_Node", "ShakeType", "ShakeDelay", "ShakeDuration", "LowViolence", "LowQuality", "OrientWithObject"], + "rows": [ + {"key": "visualeffects:fnf_blinddeaf", "id": 18, "Label": "VFX_FNF_BLINDDEAF", "Type_FD": "F", "OrientWithGround": "0", "Imp_HeadCon_Node": "****", "Imp_Impact_Node": "****", "Imp_Root_S_Node": "****", "Imp_Root_M_Node": "****", "Imp_Root_L_Node": "****", "Imp_Root_H_Node": "****", "ProgFX_Impact": "****", "SoundImpact": "****", "ProgFX_Duration": "****", "SoundDuration": "****", "ProgFX_Cessation": "****", "SoundCessastion": "****", "Ces_HeadCon_Node": "****", "Ces_Impact_Node": "****", "Ces_Root_S_Node": "****", "Ces_Root_M_Node": "****", "Ces_Root_L_Node": "****", "Ces_Root_H_Node": "****", "ShakeType": "****", "ShakeDelay": "****", "ShakeDuration": "****", "LowViolence": "****", "LowQuality": "****", "OrientWithObject": "0"}, + {"key": "visualeffects:com_hitnegative", "id": 288, "Label": "VFX_COM_HIT_NEGATIVE", "Type_FD": "F", "OrientWithGround": "0", "Imp_HeadCon_Node": "****", "Imp_Impact_Node": "****", "Imp_Root_S_Node": "****", "Imp_Root_M_Node": "****", "Imp_Root_L_Node": "****", "Imp_Root_H_Node": "****", "ProgFX_Impact": "****", "SoundImpact": "old_sound", "ProgFX_Duration": "****", "SoundDuration": "****", "ProgFX_Cessation": "****", "SoundCessastion": "****", "Ces_HeadCon_Node": "****", "Ces_Impact_Node": "****", "Ces_Root_S_Node": "****", "Ces_Root_M_Node": "****", "Ces_Root_L_Node": "****", "Ces_Root_H_Node": "****", "ShakeType": "****", "ShakeDelay": "****", "ShakeDuration": "****", "LowViolence": "****", "LowQuality": "****", "OrientWithObject": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, target, "data", "visualeffects", "lock.json"), `{ + "visualeffects:chatbubble": 10100, + "visualeffects:headaccessory_antlers_l": 10101, + "visualeffects:vcm_hitmasscrit": 10125, + "visualeffects:com_hitnegative": 288, + "visualeffects:fnf_blinddeaf": 18 +}`+"\n") + writeFile(t, filepath.Join(root, target, "data", "visualeffects", "modules", "chatbubble.json"), `{ + "entries": { + "visualeffects:chatbubble": { + "Label": "VFX_DUR_CHAT_BUBBLE", + "Type_FD": "D", + "OrientWithGround": "0", + "Imp_HeadCon_Node": "vdr_chatbubble", + "Imp_Impact_Node": "****", + "Imp_Root_S_Node": "****", + "Imp_Root_M_Node": "****", + "Imp_Root_L_Node": "****", + "Imp_Root_H_Node": "****", + "ProgFX_Impact": "****", + "SoundImpact": "****", + "ProgFX_Duration": "****", + "SoundDuration": "****", + "ProgFX_Cessation": "****", + "SoundCessastion": "****", + "Ces_HeadCon_Node": "****", + "Ces_Impact_Node": "****", + "Ces_Root_S_Node": "****", + "Ces_Root_M_Node": "****", + "Ces_Root_L_Node": "****", + "Ces_Root_H_Node": "****", + "ShakeType": "****", + "ShakeDelay": "****", + "ShakeDuration": "****", + "LowViolence": "****", + "LowQuality": "****", + "OrientWithObject": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, target, "data", "visualeffects", "modules", "add_onhitvfx.json"), `{ + "entries": { + "visualeffects:vcm_hitmasscrit": { + "Label": "VFX_COM_HIT_MASSIVE_CRITICALS", + "Type_FD": "F", + "OrientWithGround": 0, + "Imp_Impact_Node": "vcm_hitmasscrit", + "OrientWithObject": 0 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, target, "data", "visualeffects", "modules", "fix_comhitnegative.json"), `{ + "overrides": [ + {"key": "visualeffects:com_hitnegative", "id": 288, "SoundImpact": "scm_hitsmite"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, target, "data", "visualeffects", "modules", "ovr_lowqualitymodels.json"), `{ + "overrides": [ + {"key": "visualeffects:fnf_blinddeaf", "id": 18, "LowQuality": "vff_explblind_l"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, target, "data", "visualeffects", "modules", "accessories", "add_eos.json"), `{ + "entries": { + "visualeffects:headaccessory_antlers_l": { + "Label": "headaccessory_ANTLERS_L", + "Type_FD": "D", + "OrientWithGround": "0", + "Imp_HeadCon_Node": "hfx_antlers_l", + "Imp_Impact_Node": "****", + "Imp_Root_S_Node": "****", + "Imp_Root_M_Node": "****", + "Imp_Root_L_Node": "****", + "Imp_Root_H_Node": "****", + "ProgFX_Impact": "****", + "SoundImpact": "****", + "ProgFX_Duration": "****", + "SoundDuration": "****", + "ProgFX_Cessation": "****", + "SoundCessastion": "****", + "Ces_HeadCon_Node": "****", + "Ces_Impact_Node": "****", + "Ces_Root_S_Node": "****", + "Ces_Root_M_Node": "****", + "Ces_Root_L_Node": "****", + "Ces_Root_H_Node": "****", + "ShakeType": "****", + "ShakeDelay": "****", + "ShakeDuration": "****", + "LowViolence": "****", + "LowQuality": "****", + "OrientWithObject": "0" + } + } +}`+"\n") + } + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "visualeffects.2da")) + if err != nil { + t.Fatalf("read native visualeffects.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "visualeffects.2da")) + if err != nil { + t.Fatalf("read reference visualeffects.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("visualeffects output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyLoadscreens(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + mkdirAll(t, filepath.Join(root, "reference", "data", "loadscreens", "modules")) + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "base.json"), `{ + "columns": ["Label", "ScriptingName", "BMPResRef", "TileSet", "StrRef"], + "rows": [ + {"id": 0, "Label": "Random", "ScriptingName": "****", "BMPResRef": "****", "TileSet": "****", "StrRef": "63402"}, + {"id": 333, "Label": "Daggerford12", "ScriptingName": "AREA_TRANSITION_DAG_12", "BMPResRef": "LS_DAG_12", "TileSet": "TMS01", "StrRef": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "lock.json"), `{ + "loadscreens:vdungeon01": 334, + "loadscreens:tcd_01": 335, + "loadscreens:ori_01": 336, + "loadscreens:ori_02": 337, + "loadscreens:ori_03": 338, + "loadscreens:ori_04": 339, + "loadscreens:ori_05": 340 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "modules", "add_lsvd.json"), `{ + "entries": { + "loadscreens:vdungeon01": { + "Label": "VDungeon01", + "ScriptingName": "AREA_TRANSITION_VDUNGEON_01", + "BMPResRef": "LS_VD_01", + "TileSet": "TVD" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "modules", "add_ori.json"), `{ + "entries": { + "loadscreens:ori_01": { + "Label": "Bamboo", + "ScriptingName": "AREA_TRANSITION_RURAL_06", + "BMPResRef": "LS_Ori_01", + "TileSet": "TTR01" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "modules", "add_tcd01.json"), `{ + "entries": { + "loadscreens:tcd_01": { + "Label": "cd01", + "ScriptingName": "AREA_TRANSITION_CDUNGEON_01", + "BMPResRef": "ls_tcd_01", + "TileSet": "TCD01", + "StrRef": 68555 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 5 { + t.Fatalf("expected loadscreens files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "loadscreens", "base.json"), + filepath.Join(root, "topdata", "data", "loadscreens", "lock.json"), + filepath.Join(root, "topdata", "data", "loadscreens", "modules", "add_lsvd.json"), + filepath.Join(root, "topdata", "data", "loadscreens", "modules", "add_ori.json"), + filepath.Join(root, "topdata", "data", "loadscreens", "modules", "add_tcd01.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported loadscreens path %s: %v", path, err) + } + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "loadscreens", "lock.json")) + if err != nil { + t.Fatalf("read loadscreens lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"loadscreens:ori_05": 340`) { + t.Fatalf("expected imported loadscreens lock IDs, got:\n%s", string(lockRaw)) + } +} + +func TestBuildSupportsCanonicalLoadscreens(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "loadscreens", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "loadscreens", "base.json"), `{ + "columns": ["Label", "ScriptingName", "BMPResRef", "TileSet", "StrRef"], + "rows": [ + {"id": 0, "Label": "Random", "ScriptingName": "****", "BMPResRef": "****", "TileSet": "****", "StrRef": "63402"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "loadscreens", "lock.json"), `{ + "loadscreens:vdungeon01": 334 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "loadscreens", "modules", "add_lsvd.json"), `{ + "entries": { + "loadscreens:vdungeon01": { + "Label": "VDungeon01", + "ScriptingName": "AREA_TRANSITION_VDUNGEON_01", + "BMPResRef": "LS_VD_01", + "TileSet": "TVD" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "loadscreens", "modules", "add_ori.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "loadscreens", "modules", "add_tcd01.json"), `{"entries": {}}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "loadscreens.2da")) + if err != nil { + t.Fatalf("read loadscreens.2da: %v", err) + } + if !strings.Contains(string(got), "Label\tScriptingName\tBMPResRef\tTileSet\tStrRef\n") || + !strings.Contains(string(got), "0\tRandom\t****\t****\t****\t63402\n") || + !strings.Contains(string(got), "334\tVDungeon01\tAREA_TRANSITION_VDUNGEON_01\tLS_VD_01\tTVD\t****\n") { + t.Fatalf("unexpected loadscreens.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalLoadscreensMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "loadscreens", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "loadscreens.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tScriptingName\tBMPResRef\tTileSet\tStrRef\n") + f.write("0\tRandom\t****\t****\t****\t63402\n") + for row_id in range(1, 334): + f.write(f"{row_id}\t****\t****\t****\t****\t****\n") + f.write("334\tVDungeon01\tAREA_TRANSITION_VDUNGEON_01\tLS_VD_01\tTVD\t****\n") + f.write("335\tcd01\tAREA_TRANSITION_CDUNGEON_01\tls_tcd_01\tTCD01\t68555\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "base.json"), `{ + "columns": ["Label", "ScriptingName", "BMPResRef", "TileSet", "StrRef"], + "rows": [ + {"id": 0, "Label": "Random", "ScriptingName": "****", "BMPResRef": "****", "TileSet": "****", "StrRef": "63402"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "lock.json"), `{ + "loadscreens:vdungeon01": 334, + "loadscreens:tcd_01": 335 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "modules", "add_lsvd.json"), `{ + "entries": { + "loadscreens:vdungeon01": { + "Label": "VDungeon01", + "ScriptingName": "AREA_TRANSITION_VDUNGEON_01", + "BMPResRef": "LS_VD_01", + "TileSet": "TVD" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "modules", "add_ori.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "loadscreens", "modules", "add_tcd01.json"), `{ + "entries": { + "loadscreens:tcd_01": { + "Label": "cd01", + "ScriptingName": "AREA_TRANSITION_CDUNGEON_01", + "BMPResRef": "ls_tcd_01", + "TileSet": "TCD01", + "StrRef": 68555 + } + } +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "loadscreens.2da")) + if err != nil { + t.Fatalf("read native loadscreens.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "loadscreens.2da")) + if err != nil { + t.Fatalf("read reference loadscreens.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("loadscreens output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeImportsLegacyGenericdoors(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata")) + mkdirAll(t, filepath.Join(root, "reference", "data", "genericdoors", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "base.json"), `{ + "columns": ["Label", "StrRef", "ModelName", "BlockSight", "VisibleModel", "SoundAppType", "Name"], + "rows": [ + {"id": 0, "Label": "Wood_strong", "StrRef": "5349", "ModelName": "T_DOOR01", "BlockSight": "1", "VisibleModel": "1", "SoundAppType": "0", "Name": "63750"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "lock.json"), `{ + "babayaga:hs_door60": 3200, + "orientaltileset:t_Door12": 3202 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "modules", "add_mb017.json"), `{ + "entries": { + "babayaga:hs_door60": { + "Label": "Door60", + "StrRef": "****", + "ModelName": "hs_door60", + "BlockSight": "1", + "VisibleModel": "1", + "SoundAppType": "0", + "Name": "****" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "modules", "add_ori.json"), `{ + "entries": { + "orientaltileset:t_Door12": { + "Label": "Door12", + "StrRef": "5349", + "ModelName": "t_Door12", + "BlockSight": "1", + "VisibleModel": "1", + "SoundAppType": "0", + "Name": "14445" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 4 { + t.Fatalf("expected genericdoors files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "genericdoors", "base.json"), + filepath.Join(root, "topdata", "data", "genericdoors", "lock.json"), + filepath.Join(root, "topdata", "data", "genericdoors", "modules", "add_mb017.json"), + filepath.Join(root, "topdata", "data", "genericdoors", "modules", "add_ori.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported genericdoors path %s: %v", path, err) + } + } + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "genericdoors", "base.json")) + if err != nil { + t.Fatalf("read genericdoors base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "genericdoors.2da"`) { + t.Fatalf("expected imported genericdoors output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "genericdoors", "lock.json")) + if err != nil { + t.Fatalf("read genericdoors lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"orientaltileset:t_Door12": 3202`) { + t.Fatalf("expected imported genericdoors lock IDs, got:\n%s", string(lockRaw)) + } +} + +func TestBuildSupportsCanonicalGenericdoors(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "genericdoors", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "genericdoors", "base.json"), `{ + "output": "genericdoors.2da", + "columns": ["Label", "StrRef", "ModelName", "BlockSight", "VisibleModel", "SoundAppType", "Name"], + "rows": [ + {"id": 0, "Label": "Wood_strong", "StrRef": "5349", "ModelName": "T_DOOR01", "BlockSight": "1", "VisibleModel": "1", "SoundAppType": "0", "Name": "63750"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "genericdoors", "lock.json"), `{ + "babayaga:hs_door60": 3200 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "genericdoors", "modules", "add_mb017.json"), `{ + "entries": { + "babayaga:hs_door60": { + "Label": "Door60", + "StrRef": "****", + "ModelName": "hs_door60", + "BlockSight": "1", + "VisibleModel": "1", + "SoundAppType": "0", + "Name": "****" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "genericdoors", "modules", "add_ori.json"), `{"entries": {}}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "genericdoors.2da")) + if err != nil { + t.Fatalf("read genericdoors.2da: %v", err) + } + if !strings.Contains(string(got), "Label\tStrRef\tModelName\tBlockSight\tVisibleModel\tSoundAppType\tName\n") || + !strings.Contains(string(got), "0\tWood_strong\t5349\tT_DOOR01\t1\t1\t0\t63750\n") || + !strings.Contains(string(got), "3200\tDoor60\t****\ths_door60\t1\t1\t0\t****\n") { + t.Fatalf("unexpected genericdoors.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalGenericdoorsMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "genericdoors", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "genericdoors.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tStrRef\tModelName\tBlockSight\tVisibleModel\tSoundAppType\tName\n") + f.write("0\tWood_strong\t5349\tT_DOOR01\t1\t1\t0\t63750\n") + for row_id in range(1, 3200): + f.write(f"{row_id}\t****\t****\t****\t****\t****\t****\t****\n") + f.write("3200\tDoor60\t****\ths_door60\t1\t1\t0\t****\n") + f.write("3201\t****\t****\t****\t****\t****\t****\t****\n") + f.write("3202\tDoor12\t5349\tt_Door12\t1\t1\t0\t14445\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "base.json"), `{ + "columns": ["Label", "StrRef", "ModelName", "BlockSight", "VisibleModel", "SoundAppType", "Name"], + "rows": [ + {"id": 0, "Label": "Wood_strong", "StrRef": "5349", "ModelName": "T_DOOR01", "BlockSight": "1", "VisibleModel": "1", "SoundAppType": "0", "Name": "63750"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "lock.json"), `{ + "babayaga:hs_door60": 3200, + "orientaltileset:t_Door12": 3202 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "modules", "add_mb017.json"), `{ + "entries": { + "babayaga:hs_door60": { + "Label": "Door60", + "StrRef": "****", + "ModelName": "hs_door60", + "BlockSight": "1", + "VisibleModel": "1", + "SoundAppType": "0", + "Name": "****" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "genericdoors", "modules", "add_ori.json"), `{ + "entries": { + "orientaltileset:t_Door12": { + "Label": "Door12", + "StrRef": "5349", + "ModelName": "t_Door12", + "BlockSight": "1", + "VisibleModel": "1", + "SoundAppType": "0", + "Name": "14445" + } + } +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "genericdoors.2da")) + if err != nil { + t.Fatalf("read native genericdoors.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "genericdoors.2da")) + if err != nil { + t.Fatalf("read reference genericdoors.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("genericdoors output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyBaseitems(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata")) + mkdirAll(t, filepath.Join(root, "reference", "data", "baseitems", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "tlk")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "base.json"), `{ + "columns": ["Name", "label", "MaxRange"], + "rows": [ + {"key": "baseitems:shortsword", "id": 0, "Name": "106", "label": "shortsword", "MaxRange": "100"}, + {"key": "baseitems:helmet", "id": 17, "Name": "500", "label": "helmet", "MaxRange": "100"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "lock.json"), `{ + "baseitems:shortsword": 0, + "baseitems:helmet": 17, + "baseitems:coin": 113 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "blunderbuss.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "coin.json"), `{ + "entries": { + "baseitems:coin": { + "Name": { "tlk": "baseitems:coin.name" }, + "label": "Coin", + "MaxRange": "100" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "estoc.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "heavymace.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "ovr_baseitems.json"), `{ + "overrides": [ + {"key": "baseitems:shortsword", "id": 0, "label": "shortsword"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "ovr_cloak255.json"), `{"overrides": []}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "ovr_helmet255.json"), `{ + "overrides": [ + {"key": "baseitems:helmet", "id": 17, "MaxRange": "255"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "maulandfalchion.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "shortspear.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "base.json"), `{ + "language": "en", + "entries": { + "baseitems:coin.name": { "text": "Coin" } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "lock.json"), `{ + "baseitems:coin.name": 70000 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 10 { + t.Fatalf("expected baseitems files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "baseitems", "base.json"), + filepath.Join(root, "topdata", "data", "baseitems", "lock.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "blunderbuss.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "coin.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "estoc.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "heavymace.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "maulandfalchion.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "ovr_baseitems.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "ovr_cloak255.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "ovr_helmet255.json"), + filepath.Join(root, "topdata", "data", "baseitems", "modules", "shortspear.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported baseitems path %s: %v", path, err) + } + } + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "baseitems", "base.json")) + if err != nil { + t.Fatalf("read baseitems base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "baseitems.2da"`) { + t.Fatalf("expected imported baseitems output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "baseitems", "lock.json")) + if err != nil { + t.Fatalf("read baseitems lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"baseitems:coin": 113`) { + t.Fatalf("expected imported baseitems lock IDs, got:\n%s", string(lockRaw)) + } + moduleRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "baseitems", "modules", "coin.json")) + if err != nil { + t.Fatalf("read baseitems coin module: %v", err) + } + if !strings.Contains(string(moduleRaw), `"text": "Coin"`) { + t.Fatalf("expected imported baseitems module tlk to be inlined, got:\n%s", string(moduleRaw)) + } +} + +func TestBuildSupportsCanonicalBaseitems(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "baseitems", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "base.json"), `{ + "output": "baseitems.2da", + "columns": ["Name", "label", "MaxRange"], + "rows": [ + {"key": "baseitems:shortsword", "id": 0, "Name": "106", "label": "shortsword", "MaxRange": "100"}, + {"key": "baseitems:helmet", "id": 17, "Name": "500", "label": "helmet", "MaxRange": "100"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "lock.json"), `{ + "baseitems:shortsword": 0, + "baseitems:helmet": 17, + "baseitems:coin": 113 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "blunderbuss.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "coin.json"), `{ + "entries": { + "baseitems:coin": { + "Name": "Coin", + "label": "Coin", + "MaxRange": "100", + "meta": { + "wiki": { + "reqfeats": [{"id": "feat:weaponproficiencysimple"}] + } + } + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "estoc.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "heavymace.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "ovr_baseitems.json"), `{ + "overrides": [ + {"key": "baseitems:shortsword", "id": 0, "label": "shortsword"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "ovr_cloak255.json"), `{"overrides": []}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "ovr_helmet255.json"), `{ + "overrides": [ + {"key": "baseitems:helmet", "id": 17, "MaxRange": "255"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "modules", "shortspear.json"), `{"entries": {}}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "baseitems.2da")) + if err != nil { + t.Fatalf("read baseitems.2da: %v", err) + } + if !strings.Contains(string(got), "Name\tlabel\tMaxRange\n") || + !strings.Contains(string(got), "0\t106\tshortsword\t100\n") || + !strings.Contains(string(got), "17\t500\thelmet\t255\n") || + !strings.Contains(string(got), "113\tCoin\tCoin\t100\n") { + t.Fatalf("unexpected baseitems.2da output:\n%s", string(got)) + } + if strings.Contains(string(got), "WIKIREQFEATS") { + t.Fatalf("authoring-only WIKI fields leaked into baseitems.2da:\n%s", string(got)) + } +} + +func TestBuildUsesBaseDialogLegacyEntries(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "baseitems")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), `{ + "language": "en", + "entries": { + "baseitems:coin.name": {"text": "Coin"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "baseitems", "base.json"), `{ + "output": "baseitems.2da", + "columns": ["Name", "label"], + "rows": [ + {"key": "baseitems:coin", "id": 113, "Name": {"tlk": "baseitems:coin.name"}, "label": "Coin"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "baseitems.2da")) + if err != nil { + t.Fatalf("read baseitems.2da: %v", err) + } + if !strings.Contains(string(got), "113\t16777216\tCoin\n") { + t.Fatalf("expected base_dialog-backed strref in output, got:\n%s", string(got)) + } + stateRaw, err := os.ReadFile(filepath.Join(root, "topdata", ".tlk_state.json")) + if err != nil { + t.Fatalf("read tlk state: %v", err) + } + if !strings.Contains(string(stateRaw), `"baseitems:coin.name"`) { + t.Fatalf("expected base_dialog key to be tracked in tlk state, got:\n%s", string(stateRaw)) + } +} + +func TestNormalize2DAForCompareDropsDeprecatedWikiColumns(t *testing.T) { + input := []byte("2DA V2.0\n\nName\tWIKIGENERATE\tValue\n0\tCoin\t****\t100\n") + got := normalize2DAForCompare("test.2da", input) + expected := "2DA V2.0\n\nName\tValue\n0\tCoin\t100\n" + if string(got) != expected { + t.Fatalf("unexpected normalized 2da:\n%s", string(got)) + } +} + +func TestBuildOverridePrecedenceSuppressesBaseAndEntries(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "dense", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "base.json"), `{ + "output": "dense.2da", + "columns": ["Label", "Value"], + "rows": [ + {"key": "dense:base", "id": 0, "Label": "Base", "Value": "base"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "lock.json"), `{ + "dense:entry": 1 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "modules", "entries.json"), `{ + "entries": { + "dense:entry": { + "Label": "Entry", + "Value": "entry" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "modules", "overrides.json"), `{ + "overrides": [ + {"key": "dense:base", "Label": "Override", "Value": null}, + {"key": "dense:entry", "Label": "EntryOverride", "Value": null} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "dense.2da")) + if err != nil { + t.Fatalf("read dense.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "0\tOverride\t****\n") { + t.Fatalf("expected base row override to win and null out Value, got:\n%s", text) + } + if !strings.Contains(text, "1\tEntryOverride\t****\n") { + t.Fatalf("expected entry row override to win and null out Value, got:\n%s", text) + } +} + +func TestResolveOverrideTargetPrefersIDOverKey(t *testing.T) { + keyRow := map[string]any{"id": 192, "key": "feat:skillfocus_intimidate"} + idRow := map[string]any{"id": 916, "key": "feat:taunt"} + rowByID := map[int]map[string]any{ + 192: keyRow, + 916: idRow, + } + rowByKey := map[string]map[string]any{ + "feat:skillfocus_intimidate": keyRow, + "feat:taunt": idRow, + } + override := map[string]any{ + "key": "feat:skillfocus_intimidate", + "id": 916, + } + got, err := resolveOverrideTarget("feat", override, rowByID, rowByKey) + if err != nil { + t.Fatalf("resolveOverrideTarget failed: %v", err) + } + if got["id"] != 916 { + t.Fatalf("expected id-targeted row id 916, got %v", got["id"]) + } +} + +func TestBuildCanonicalBaseitemsMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "baseitems", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "tlk")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "baseitems.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\\n\\n") + f.write("Name\\tlabel\\tMaxRange\\n") + f.write("0\\t106\\tshortsword\\t100\\n") + for row_id in range(1, 17): + f.write(f"{row_id}\\t****\\t****\\t****\\n") + f.write("17\\t500\\thelmet\\t255\\n") + for row_id in range(18, 113): + f.write(f"{row_id}\\t****\\t****\\t****\\n") + f.write("113\\tCoin\\tCoin\\t100\\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "base.json"), `{ + "columns": ["Name", "label", "MaxRange"], + "rows": [ + {"key": "baseitems:shortsword", "id": 0, "Name": "106", "label": "shortsword", "MaxRange": "100"}, + {"key": "baseitems:helmet", "id": 17, "Name": "500", "label": "helmet", "MaxRange": "100"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "lock.json"), `{ + "baseitems:shortsword": 0, + "baseitems:helmet": 17, + "baseitems:coin": 113 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "blunderbuss.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "coin.json"), `{ + "entries": { + "baseitems:coin": { + "Name": { "tlk": "baseitems:coin.name" }, + "label": "Coin", + "MaxRange": "100" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "estoc.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "heavymace.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "ovr_baseitems.json"), `{ + "overrides": [ + {"key": "baseitems:shortsword", "id": 0, "label": "shortsword"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "ovr_cloak255.json"), `{"overrides": []}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "ovr_helmet255.json"), `{ + "overrides": [ + {"key": "baseitems:helmet", "id": 17, "MaxRange": "255"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "maulandfalchion.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "baseitems", "modules", "shortspear.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "base.json"), `{ + "language": "en", + "entries": { + "baseitems:coin.name": { "text": "Coin" } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "lock.json"), `{ + "baseitems:coin.name": 70000 +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "baseitems.2da")) + if err != nil { + t.Fatalf("read native baseitems.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "baseitems.2da")) + if err != nil { + t.Fatalf("read reference baseitems.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("baseitems output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestBuildUsesReferenceLockIDsForUnmigratedKeyRefs(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "masterfeats")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "base.json"), `{ + "output": "masterfeats.2da", + "columns": ["LABEL", "STRREF", "DESCRIPTION", "MinLevelClass"], + "rows": [ + {"id": 0, "key": "masterfeats:weaponspecialization", "LABEL": "WeaponSpecialization", "STRREF": "****", "DESCRIPTION": "****", "MinLevelClass": {"id": "classes:fighter"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "masterfeats", "lock.json"), `{"masterfeats:weaponspecialization":0}`+"\n") + mkdirAll(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "classes")) + writeFile(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "classes", "lock.json"), `{"classes:fighter":4}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "masterfeats.2da")) + if err != nil { + t.Fatalf("read masterfeats.2da: %v", err) + } + want := "2DA V2.0\n\nLABEL\tSTRREF\tDESCRIPTION\tMinLevelClass\n0\tWeaponSpecialization\t****\t****\t4\n" + if string(got) != want { + t.Fatalf("unexpected masterfeats.2da output:\n%s", string(got)) + } +} + +func TestNormalizeProjectImportsLegacyAppearanceAndPortraits(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "appearance", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "data", "portraits", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "base.json"), `{ + "columns": ["LABEL", "PORTRAIT"], + "rows": [ + {"key": "appearance:dwarf", "id": 0, "LABEL": "Dwarf", "PORTRAIT": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "lock.json"), `{ + "appearance:blacklagoonreaver": 15105, + "appearance:crawlingclaw": 15107, + "appearance:halfogre": 15108, + "appearance:zombieknight3": 15109, + "appearance:zombieknight4": 15110, + "appearance:blacklagoonreaverswimming": 15111 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "cotblreaver.json"), `{"entries":{"appearance:blacklagoonreaver":{"LABEL":"Black Lagoon Reaver","PORTRAIT":"po_cotbl"},"appearance:blacklagoonreaverswimming":{"LABEL":"Black Lagoon Reaver, Swimming","PORTRAIT":"po_cotbl"}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "crawlingclaw.json"), `{"entries":{"appearance:crawlingclaw":{"LABEL":"Crawling Claw","PORTRAIT":"po_cclaw"}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "halfogre.json"), `{"entries":{"appearance:halfogre":{"LABEL":"Half-Ogre","PORTRAIT":"****"}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "zombieknight.json"), `{"entries":{"appearance:zombieknight3":{"LABEL":"Zombie_Knight3","PORTRAIT":"po_zk"},"appearance:zombieknight4":{"LABEL":"Zombie_Knight4","PORTRAIT":"po_zk"}}}`+"\n") + + writeFile(t, filepath.Join(root, "reference", "data", "portraits", "base.json"), `{ + "columns": ["BaseResRef", "Sex", "Race", "InanimateType", "Plot", "LowGore"], + "rows": [ + {"id": 0, "BaseResRef": "****", "Sex": 4, "Race": "****", "InanimateType": "****", "Plot": "****", "LowGore": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "portraits", "lock.json"), `{ + "zarathustra:id_572": 16001, + "tiberiusmorguhn:zknight": 16002, + "shemsuheru:id_1513": 16003, + "cepnwn2lib:id_10041": 16004, + "ceporiental:id_3854": 16020 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "portraits", "modules", "add_cclaw.json"), `{"entries":{"zarathustra:id_572":{"BaseResRef":"cclaw_","Sex":4,"Race":10,"Plot":0}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "portraits", "modules", "add_cotblreaver.json"), `{"entries":{"shemsuheru:id_1513":{"BaseResRef":"cotbl_","Sex":4,"Race":15,"Plot":0}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "portraits", "modules", "add_nwn2lib.json"), `{"entries":{"cepnwn2lib:id_10041":{"BaseResRef":"nw2book1_","Sex":4,"InanimateType":4}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "portraits", "modules", "add_orientalplcs.json"), `{"entries":{"ceporiental:id_3854":{"BaseResRef":"ccc_adori01","Sex":4,"InanimateType":1}}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "portraits", "modules", "add_zknight.json"), `{"entries":{"tiberiusmorguhn:zknight":{"BaseResRef":"po_zk_","Sex":4,"Race":10,"Plot":0}}}`+"\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 13 { + t.Fatalf("expected appearance and portraits files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "appearance", "base.json"), + filepath.Join(root, "topdata", "data", "appearance", "lock.json"), + filepath.Join(root, "topdata", "data", "appearance", "modules", "cotblreaver.json"), + filepath.Join(root, "topdata", "data", "appearance", "modules", "crawlingclaw.json"), + filepath.Join(root, "topdata", "data", "appearance", "modules", "halfogre.json"), + filepath.Join(root, "topdata", "data", "appearance", "modules", "zombieknight.json"), + filepath.Join(root, "topdata", "data", "portraits", "base.json"), + filepath.Join(root, "topdata", "data", "portraits", "lock.json"), + filepath.Join(root, "topdata", "data", "portraits", "modules", "add_cclaw.json"), + filepath.Join(root, "topdata", "data", "portraits", "modules", "add_cotblreaver.json"), + filepath.Join(root, "topdata", "data", "portraits", "modules", "add_nwn2lib.json"), + filepath.Join(root, "topdata", "data", "portraits", "modules", "add_orientalplcs.json"), + filepath.Join(root, "topdata", "data", "portraits", "modules", "add_zknight.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported path %s: %v", path, err) + } + } + + appearanceBase, err := os.ReadFile(filepath.Join(root, "topdata", "data", "appearance", "base.json")) + if err != nil { + t.Fatalf("read appearance base: %v", err) + } + if !strings.Contains(string(appearanceBase), `"output": "appearance.2da"`) { + t.Fatalf("expected imported appearance output name, got:\n%s", string(appearanceBase)) + } + portraitsBase, err := os.ReadFile(filepath.Join(root, "topdata", "data", "portraits", "base.json")) + if err != nil { + t.Fatalf("read portraits base: %v", err) + } + if !strings.Contains(string(portraitsBase), `"output": "portraits.2da"`) { + t.Fatalf("expected imported portraits output name, got:\n%s", string(portraitsBase)) + } +} + +func TestBuildDenseGenerationDefaultsMissingColumnsAndPortraitFields(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "dense", "modules")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "plain")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "portraits")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "placeables")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "base.json"), `{ + "output": "dense.2da", + "columns": ["A", "B"], + "rows": [ + {"id": 0, "A": "base"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "lock.json"), `{"dense:add":1}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "modules", "add.json"), `{ + "entries": { + "dense:add": { + "A": "entry" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "plain", "table.json"), `{ + "output": "table.2da", + "columns": ["A", "B"], + "rows": [ + {"id": 0, "A": "plain"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "portraits", "base.json"), `{ + "output": "portraits.2da", + "columns": ["BaseResRef", "Sex", "Race", "InanimateType", "Plot", "LowGore"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "portraits", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "base.json"), `{ + "output": "placeables.2da", + "columns": ["Label"], + "rows": [ + { + "key": "placeables:bookshelf_special", + "id": 10, + "Label": "BookshelfSpecial", + "meta": { + "portrait": { + "resref": "nw2book1_", + "sex": 4, + "inanimate_type": 4 + } + } + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "lock.json"), `{"placeables:bookshelf_special":10}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + denseBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "dense.2da")) + if err != nil { + t.Fatalf("read dense.2da: %v", err) + } + if string(denseBytes) != "2DA V2.0\n\nA\tB\n0\tbase\t****\n1\tentry\t****\n" { + t.Fatalf("unexpected dense.2da output:\n%s", string(denseBytes)) + } + + plainBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "table.2da")) + if err != nil { + t.Fatalf("read table.2da: %v", err) + } + if string(plainBytes) != "2DA V2.0\n\nA\tB\n0\tplain\t****\n" { + t.Fatalf("unexpected table.2da output:\n%s", string(plainBytes)) + } + + portraitsBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "portraits.2da")) + if err != nil { + t.Fatalf("read portraits.2da: %v", err) + } + wantPortraits := "2DA V2.0\n\nBaseResRef\tSex\tRace\tInanimateType\tPlot\tLowGore\n0\tnw2book1_\t4\t****\t4\t****\t****\n" + if string(portraitsBytes) != wantPortraits { + t.Fatalf("unexpected portraits.2da output:\n%s", string(portraitsBytes)) + } + + placeablesBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "placeables.2da")) + if err != nil { + t.Fatalf("read placeables.2da: %v", err) + } + if !strings.Contains(string(placeablesBytes), "Label\n") || !strings.Contains(string(placeablesBytes), "10\tBookshelfSpecial\n") { + t.Fatalf("unexpected placeables.2da output:\n%s", string(placeablesBytes)) + } + if strings.Contains(string(placeablesBytes), "portrait") || strings.Contains(string(placeablesBytes), "meta") { + t.Fatalf("expected metadata to stay out of placeables.2da, got:\n%s", string(placeablesBytes)) + } +} + +func TestValidateProjectRejectsUnknownMetadataKey(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "placeables")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "base.json"), `{ + "output": "placeables.2da", + "columns": ["Label"], + "rows": [ + {"id": 0, "Label": "Shelf", "meta": {"unknown": {}}} + ] +}`+"\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatalf("expected metadata validation error, got %#v", report.Diagnostics) + } + if !strings.Contains(diagnosticsText(report.Diagnostics), `unknown metadata key "unknown"`) { + t.Fatalf("expected unknown metadata diagnostic, got:\n%s", diagnosticsText(report.Diagnostics)) + } +} + +func TestValidateProjectRejectsUnknownMetadataKeyCaseInsensitive(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "placeables")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "base.json"), `{ + "output": "placeables.2da", + "columns": ["Label"], + "rows": [ + {"id": 0, "Label": "Shelf", "Meta": {"unknown": {}}} + ] +}`+"\n") + + report := ValidateProject(testProject(root)) + if !report.HasErrors() { + t.Fatalf("expected metadata validation error, got %#v", report.Diagnostics) + } + if !strings.Contains(diagnosticsText(report.Diagnostics), `unknown metadata key "unknown"`) { + t.Fatalf("expected unknown metadata diagnostic, got:\n%s", diagnosticsText(report.Diagnostics)) + } +} + +func TestBuildNativeTreatsMetaCaseInsensitive(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "dense", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "base.json"), `{ + "output": "dense.2da", + "columns": ["Label"], + "rows": [ + {"id": 0, "Label": "Base", "Meta": {"wiki": {"status": "base"}}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "lock.json"), `{"dense:entry":1}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "dense", "modules", "entries.json"), `{ + "entries": { + "dense:entry": {"Label": "Entry", "Meta": {"wiki": {"status": "entry"}}} + }, + "overrides": [ + {"id": 0, "key": "dense:base", "Label": "BaseOverride", "Meta": {"wiki": {"status": "override"}}} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "dense.2da")) + if err != nil { + t.Fatalf("read dense.2da: %v", err) + } + if string(got) != "2DA V2.0\n\nLabel\n0\tBaseOverride\n1\tEntry\n" { + t.Fatalf("unexpected dense.2da output:\n%s", string(got)) + } + if strings.Contains(string(got), "meta") { + t.Fatalf("expected metadata to stay out of dense.2da, got:\n%s", string(got)) + } +} + +func TestBuildRejectsConflictingPortraitMetadata(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "portraits")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "placeables")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "genericdoors")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "portraits", "base.json"), `{ + "output": "portraits.2da", + "columns": ["BaseResRef", "Sex", "Race", "InanimateType", "Plot", "LowGore"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "portraits", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "base.json"), `{ + "output": "placeables.2da", + "columns": ["Label"], + "rows": [ + {"id": 1, "Label": "Shelf", "meta": {"portrait": {"resref": "nw2book1_", "sex": 4}}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "genericdoors", "base.json"), `{ + "output": "genericdoors.2da", + "columns": ["Label"], + "rows": [ + {"id": 2, "Label": "Door", "meta": {"portrait": {"resref": "nw2book1_", "sex": 1}}} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + _, err := BuildNative(testProject(root), nil) + if err == nil { + t.Fatalf("expected BuildNative to fail on conflicting portrait metadata") + } + if !strings.Contains(err.Error(), "conflicts for column Sex") { + t.Fatalf("expected portrait conflict error, got: %v", err) + } +} + +func TestBuildCanonicalAppearanceMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "appearance", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "appearance.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("LABEL\tPORTRAIT\n") + f.write("0\tDwarf\t****\n") + f.write("15105\tBlack Lagoon Reaver\tpo_cotbl\n") + f.write("15111\tBlack Lagoon Reaver, Swimming\tpo_cotbl\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "base.json"), `{ + "columns": ["LABEL", "PORTRAIT"], + "rows": [ + {"key": "appearance:dwarf", "id": 0, "LABEL": "Dwarf", "PORTRAIT": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "lock.json"), `{ + "appearance:blacklagoonreaver": 15105, + "appearance:blacklagoonreaverswimming": 15111 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "cotblreaver.json"), `{ + "entries": { + "appearance:blacklagoonreaver": {"LABEL": "Black Lagoon Reaver", "PORTRAIT": "po_cotbl"}, + "appearance:blacklagoonreaverswimming": {"LABEL": "Black Lagoon Reaver, Swimming", "PORTRAIT": "po_cotbl"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "crawlingclaw.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "halfogre.json"), `{"entries": {}}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "appearance", "modules", "zombieknight.json"), `{"entries": {}}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "appearance.2da")) + if err != nil { + t.Fatalf("read native appearance.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "appearance.2da")) + if err != nil { + t.Fatalf("read reference appearance.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("appearance output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacyPlaceables(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "placeables", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "base.json"), `{ + "columns": ["Label", "StrRef", "ModelName", "LightColor", "LightOffsetX", "LightOffsetY", "LightOffsetZ", "SoundAppType", "ShadowSize", "BodyBag", "LowGore", "Reflection", "Static"], + "rows": [ + {"key": "placeables:armoire", "id": 0, "Label": "Armoire", "StrRef": "5645", "ModelName": "PLC_A01", "SoundAppType": "13", "ShadowSize": "1", "BodyBag": "0", "Static": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "lock.json"), `{ + "placeables:armoire": 0, + "placeable:tmp_crappile01": 16500 +}`+"\n") + for _, name := range []string{ + "add_ccfeb2019plcs.json", + "add_cepcarpets.json", + "add_cepfloors.json", + "add_cepnwn2library.json", + "add_nwic.json", + "add_ori.json", + "add_sic11.json", + "add_tapr.json", + "add_tdfloors.json", + "add_undecals.json", + "add_witcher1.json", + "add_witcher2.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "modules", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "modules", "add_avernostragarbage.json"), `{ + "entries": { + "placeable:tmp_crappile01": { + "Label": "Decoration: Pile 1 (Avernostra)", + "ModelName": "tmp_crappile01", + "Static": 1 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "modules", "ovr_vanillaplcsorts.json"), `{ + "overrides": [ + {"key": "placeables:armoire", "id": 0, "Label": "Furniture: Armoire (Bioware)", "StrRef": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 16 { + t.Fatalf("expected placeables files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "placeables", "base.json"), + filepath.Join(root, "topdata", "data", "placeables", "lock.json"), + filepath.Join(root, "topdata", "data", "placeables", "modules", "add_avernostragarbage.json"), + filepath.Join(root, "topdata", "data", "placeables", "modules", "ovr_vanillaplcsorts.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported placeables path %s: %v", path, err) + } + } + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "placeables", "base.json")) + if err != nil { + t.Fatalf("read placeables base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "placeables.2da"`) { + t.Fatalf("expected imported placeables output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "placeables", "lock.json")) + if err != nil { + t.Fatalf("read placeables lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"placeable:tmp_crappile01": 16500`) { + t.Fatalf("expected imported placeables lock IDs, got:\n%s", string(lockRaw)) + } +} + +func TestNormalizeProjectImportsLegacyRuleset(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "ruleset", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "base.json"), `{ + "columns": ["Label", "Value"], + "rows": [ + {"id": 0, "Label": "****", "Value": "****"}, + {"id": 7, "Label": "CALLED_SHOT_TO_HIT_MODIFIER", "Value": "-4"}, + {"id": 21, "Label": "GOOD_AIM_MODIFIER", "Value": "1"}, + {"id": 100, "Label": "HASTE_DODGE_AC_INCREASE_AMOUNT", "Value": "0"}, + {"id": 101, "Label": "HASTED_SPELL_CONJURE_TIME_MODIFIER", "Value": "0.5f"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "modules", "ovr_single.json"), `{ + "overrides": [{"match": {"Label": "GOOD_AIM_MODIFIER"}, "Value": "2"}] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "modules", "ovr_array.json"), `{ + "overrides": [{"match": {"Label": ["HASTE_DODGE_AC_INCREASE_AMOUNT", "HASTED_SPELL_CONJURE_TIME_MODIFIER"]}, "Value": "1.0f"}] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 1 { + t.Fatalf("expected ruleset import, got %#v", result) + } + rulesetPath := filepath.Join(root, "topdata", "data", "ruleset", "ruleset.json") + if _, err := os.Stat(rulesetPath); err != nil { + t.Fatalf("expected imported ruleset file: %v", err) + } + if _, err := os.Stat(filepath.Join(root, "topdata", "data", "ruleset", "lock.json")); !os.IsNotExist(err) { + t.Fatalf("expected no ruleset lock file, got %v", err) + } + if _, err := os.Stat(filepath.Join(root, "topdata", "data", "ruleset", "modules")); !os.IsNotExist(err) { + t.Fatalf("expected no ruleset modules dir, got %v", err) + } + raw, err := os.ReadFile(rulesetPath) + if err != nil { + t.Fatalf("read ruleset: %v", err) + } + text := string(raw) + if !strings.Contains(text, `"output": "ruleset.2da"`) || + !strings.Contains(text, `"Label": "GOOD_AIM_MODIFIER"`) || + !strings.Contains(text, `"Value": "2"`) || + !strings.Contains(text, `"Label": "HASTED_SPELL_CONJURE_TIME_MODIFIER"`) || + !strings.Contains(text, `"Value": "1.0f"`) { + t.Fatalf("unexpected imported ruleset:\n%s", text) + } +} + +func TestBuildSupportsCanonicalRuleset(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "ruleset")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "ruleset", "ruleset.json"), `{ + "output": "ruleset.2da", + "columns": ["Label", "Value"], + "rows": [ + {"id": 0, "Label": "****", "Value": "****"}, + {"id": 21, "Label": "GOOD_AIM_MODIFIER", "Value": "2"}, + {"id": 100, "Label": "HASTE_DODGE_AC_INCREASE_AMOUNT", "Value": "1.0f"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "ruleset.2da")) + if err != nil { + t.Fatalf("read ruleset.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "Label\tValue\n") || + !strings.Contains(text, "21\tGOOD_AIM_MODIFIER\t2\n") || + !strings.Contains(text, "100\tHASTE_DODGE_AC_INCREASE_AMOUNT\t1.0f\n") { + t.Fatalf("unexpected ruleset.2da output:\n%s", text) + } +} + +func TestBuildCanonicalRulesetMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "ruleset", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "ruleset.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tValue\n") + f.write("0\t****\t****\n") + f.write("21\tGOOD_AIM_MODIFIER\t2\n") + f.write("100\tHASTE_DODGE_AC_INCREASE_AMOUNT\t1.0f\n") + f.write("101\tHASTED_SPELL_CONJURE_TIME_MODIFIER\t1.0f\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "base.json"), `{ + "columns": ["Label", "Value"], + "rows": [ + {"id": 0, "Label": "****", "Value": "****"}, + {"id": 21, "Label": "GOOD_AIM_MODIFIER", "Value": "1"}, + {"id": 100, "Label": "HASTE_DODGE_AC_INCREASE_AMOUNT", "Value": "0"}, + {"id": 101, "Label": "HASTED_SPELL_CONJURE_TIME_MODIFIER", "Value": "0.5f"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "lock.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "modules", "ovr_single.json"), `{ + "overrides": [{"match": {"Label": "GOOD_AIM_MODIFIER"}, "Value": "2"}] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "ruleset", "modules", "ovr_array.json"), `{ + "overrides": [{"match": {"Label": ["HASTE_DODGE_AC_INCREASE_AMOUNT", "HASTED_SPELL_CONJURE_TIME_MODIFIER"]}, "Value": "1.0f"}] +}`+"\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 1 { + t.Fatalf("expected ruleset import, got %#v", result) + } + if _, err := Build(testProject(root), nil); err != nil { + t.Fatalf("Build failed: %v", err) + } + compare, err := CompareReference(testProject(root), nil) + if err != nil { + t.Fatalf("CompareReference failed: %v", err) + } + if compare.NativeMismatch != 0 || compare.NativePass != 1 { + t.Fatalf("unexpected compare result: %#v", compare) + } +} + +func TestNormalizeProjectImportsLegacySkills(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "skills")) + mkdirAll(t, filepath.Join(root, "reference", "data", "skills", "modules", "craft")) + mkdirAll(t, filepath.Join(root, "reference", "data", "skills", "modules", "knowledge")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{ + "skills:athletics.name": 1000, + "skills:athletics.description": 1001, + "skills:craft_armorsmithing.name": 1002, + "skills:craft_armorsmithing.description": 1003, + "skills:knowledge_arcana.name": 1004 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "skills", "skills.json"), `{ + "entries": { + "skills:athletics.name": {"text": "Athletics"}, + "skills:athletics.description": {"text": "Athletics description"}, + "skills:craft_armorsmithing.name": {"text": "Craft Armor Smithing"}, + "skills:craft_armorsmithing.description": {"text": "Craft armor description"}, + "skills:knowledge_arcana.name": {"text": "Knowledge Arcana"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "base.json"), `{ + "columns": ["Label", "Name", "Description", "Icon", "Untrained", "KeyAbility", "ArmorCheckPenalty", "AllClassesCanUse", "Category", "MaxCR", "Constant", "HostileSkill", "HideFromLevelUp"], + "rows": [ + {"key": "skills:animalempathy", "id": 0, "Label": "AnimalEmpathy", "Name": "269", "Description": "344", "Icon": "isk_aniemp", "Untrained": "0", "KeyAbility": "CHA", "ArmorCheckPenalty": "0", "AllClassesCanUse": "0", "Category": "****", "MaxCR": "1", "Constant": "SKILL_ANIMAL_EMPATHY", "HostileSkill": "1", "HideFromLevelUp": "0"}, + {"key": "skills:concentration", "id": 1, "Label": "Concentration", "Name": "270", "Description": "345", "Icon": "isk_concen", "Untrained": "1", "KeyAbility": "CON", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_CONCENTRATION", "HostileSkill": "0", "HideFromLevelUp": "0"}, + {"key": "skills:discipline", "id": 3, "Label": "Discipline", "Name": "343", "Description": "347", "Icon": "isk_discipline", "Untrained": "1", "KeyAbility": "STR", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_DISCIPLINE", "HostileSkill": "0", "HideFromLevelUp": "0"}, + {"key": "skills:tumble", "id": 25, "Label": "Tumble", "Name": "280", "Description": "356", "Icon": "isk_tumble", "Untrained": "1", "KeyAbility": "DEX", "ArmorCheckPenalty": "1", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_TUMBLE", "HostileSkill": "0", "HideFromLevelUp": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "lock.json"), `{ + "skills:craft_armorsmithing": 25, + "skills:athletics": 28, + "skills:knowledge_arcana": 40 +}`+"\n") + for _, name := range []string{ + "add_disguise.json", + "add_linguistics.json", + "add_perception.json", + "add_scriptcraft.json", + "add_sensemotive.json", + "add_stealth.json", + "add_survival.json", + "add_userope.json", + "ovr_acrobatics.json", + "ovr_animalhandling.json", + "ovr_appraise.json", + "ovr_concentration.json", + "ovr_disabledevice.json", + "ovr_heal.json", + "ovr_hiddenskills.json", + "ovr_influence.json", + "ovr_openlock.json", + "ovr_parry.json", + "ovr_searchtowis.json", + "ovr_sleightofhand.json", + "ovr_taunttointimidate.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", name), `{"overrides": []}`+"\n") + } + for _, name := range []string{ + "add_craftalchemy.json", + "add_craftcooking.json", + "add_craftjewelry.json", + "add_craftleatherworking.json", + "add_craftstonework.json", + "add_crafttextiles.json", + "ovr_crafttinkering.json", + "ovr_craftweaponsmithing.json", + "ovr_craftwoodworking.json", + } { + payload := `{"entries": {}}` + if strings.HasPrefix(name, "ovr_") { + payload = `{"overrides": []}` + } + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "craft", name), payload+"\n") + } + for _, name := range []string{ + "add_knowledgearchitecture.json", + "add_knowledgedungeoneering.json", + "add_knowledgegeography.json", + "add_knowledgehistory.json", + "add_knowledgelocal.json", + "add_knowledgenature.json", + "add_knowledgenobility.json", + "add_knowledgeplanar.json", + "add_knowledgereligion.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "knowledge", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "add_athletics.json"), `{ + "entries": { + "skills:athletics": { + "Label": "Athletics", + "Name": {"tlk": "skills:athletics.name"}, + "Description": {"tlk": "skills:athletics.description"}, + "Icon": "isk_athletics", + "Untrained": "1", + "KeyAbility": "STR", + "ArmorCheckPenalty": "1", + "AllClassesCanUse": "1", + "Constant": "SKILL_ATHLETICS", + "HostileSkill": "0", + "HideFromLevelUp": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "craft", "ovr_craftarmorsmithing.json"), `{ + "overrides": [ + { + "key": "skills:craft_armorsmithing", + "id": 25, + "Label": "Craftarmorsmithing", + "Name": {"tlk": "skills:craft_armorsmithing.name"}, + "Description": {"tlk": "skills:craft_armorsmithing.description"}, + "Icon": "isk_x2carm", + "Untrained": "0", + "Constant": "SKILL_CRAFT_ARMORSMITHING", + "meta": {"wiki": {"status": "new"}}, + "HideFromLevelUp": "0" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "knowledge", "add_knowledgearcana.json"), `{ + "entries": { + "skills:knowledge_arcana": { + "Label": "Knowledgearcana", + "Name": {"tlk": "skills:knowledge_arcana.name"}, + "Icon": "isk_knarcana", + "Untrained": "1", + "KeyAbility": "INT", + "ArmorCheckPenalty": "0", + "AllClassesCanUse": "1", + "Constant": "SKILL_KNOWLEDGE_ARCANA", + "HostileSkill": "0", + "HideFromLevelUp": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "rmv_removedskills.json"), `{ + "overrides": [ + { + "key": null, + "id": 3, + "Label": "Discipline_REMOVED", + "Constant": "****", + "AllClassesCanUse": "0", + "HideFromLevelUp": "1" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 6 { + t.Fatalf("expected skills files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "skills", "base.json"), + filepath.Join(root, "topdata", "data", "skills", "lock.json"), + filepath.Join(root, "topdata", "data", "skills", "modules", "add_athletics.json"), + filepath.Join(root, "topdata", "data", "skills", "modules", "craft", "ovr_craftarmorsmithing.json"), + filepath.Join(root, "topdata", "data", "skills", "modules", "knowledge", "add_knowledgearcana.json"), + filepath.Join(root, "topdata", "data", "skills", "modules", "rmv_removedskills.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported skills path %s: %v", path, err) + } + } + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "skills", "base.json")) + if err != nil { + t.Fatalf("read skills base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "skills.2da"`) { + t.Fatalf("expected imported skills output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "skills", "lock.json")) + if err != nil { + t.Fatalf("read skills lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"skills:athletics": 28`) || !strings.Contains(string(lockRaw), `"skills:knowledge_arcana": 40`) { + t.Fatalf("expected imported skills lock ids, got:\n%s", string(lockRaw)) + } + moduleRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "skills", "modules", "add_athletics.json")) + if err != nil { + t.Fatalf("read skills athletics module: %v", err) + } + if !strings.Contains(string(moduleRaw), `"text": "Athletics"`) || !strings.Contains(string(moduleRaw), `"text": "Athletics description"`) { + t.Fatalf("expected normalized inline TLK payloads in athletics module, got:\n%s", string(moduleRaw)) + } + craftRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "skills", "modules", "craft", "ovr_craftarmorsmithing.json")) + if err != nil { + t.Fatalf("read skills craft override: %v", err) + } + if !strings.Contains(string(craftRaw), `"text": "Craft Armor Smithing"`) || !strings.Contains(string(craftRaw), `"text": "Craft armor description"`) { + t.Fatalf("expected normalized inline TLK payloads in craft override, got:\n%s", string(craftRaw)) + } +} + +func TestBuildSupportsCanonicalSkills(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "skills", "modules", "craft")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "skills", "modules", "knowledge")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "base.json"), `{ + "output": "skills.2da", + "columns": ["Label", "Name", "Description", "Icon", "Untrained", "KeyAbility", "ArmorCheckPenalty", "AllClassesCanUse", "Category", "MaxCR", "Constant", "HostileSkill", "HideFromLevelUp"], + "rows": [ + {"key": "skills:animalempathy", "id": 0, "Label": "AnimalEmpathy", "Name": "269", "Description": "344", "Icon": "isk_aniemp", "Untrained": "0", "KeyAbility": "CHA", "ArmorCheckPenalty": "0", "AllClassesCanUse": "0", "Category": "****", "MaxCR": "1", "Constant": "SKILL_ANIMAL_EMPATHY", "HostileSkill": "1", "HideFromLevelUp": "0"}, + {"key": "skills:concentration", "id": 1, "Label": "Concentration", "Name": "270", "Description": "345", "Icon": "isk_concen", "Untrained": "1", "KeyAbility": "CON", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_CONCENTRATION", "HostileSkill": "0", "HideFromLevelUp": "0"}, + {"key": "skills:discipline", "id": 3, "Label": "Discipline", "Name": "343", "Description": "347", "Icon": "isk_discipline", "Untrained": "1", "KeyAbility": "STR", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_DISCIPLINE", "HostileSkill": "0", "HideFromLevelUp": "0"}, + {"key": "skills:craft_armorsmithing", "id": 25, "Label": "Tumble", "Name": "280", "Description": "356", "Icon": "isk_tumble", "Untrained": "1", "KeyAbility": "DEX", "ArmorCheckPenalty": "1", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_TUMBLE", "HostileSkill": "0", "HideFromLevelUp": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "lock.json"), `{ + "skills:craft_armorsmithing": 25, + "skills:athletics": 28, + "skills:knowledge_arcana": 40 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "modules", "add_athletics.json"), `{ + "entries": { + "skills:athletics": { + "Label": "Athletics", + "Name": "1000", + "Description": "1001", + "Icon": "isk_athletics", + "Untrained": "1", + "KeyAbility": "STR", + "ArmorCheckPenalty": "1", + "AllClassesCanUse": "1", + "Constant": "SKILL_ATHLETICS", + "HostileSkill": "0", + "HideFromLevelUp": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "modules", "craft", "ovr_craftarmorsmithing.json"), `{ + "overrides": [ + { + "key": "skills:craft_armorsmithing", + "id": 25, + "Label": "Craftarmorsmithing", + "Name": "1002", + "Description": "1003", + "Icon": "isk_x2carm", + "Untrained": "0", + "Constant": "SKILL_CRAFT_ARMORSMITHING", + "meta": {"wiki": {"status": "new"}}, + "HideFromLevelUp": "0" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "modules", "knowledge", "add_knowledgearcana.json"), `{ + "entries": { + "skills:knowledge_arcana": { + "Label": "Knowledgearcana", + "Name": "1004", + "Icon": "isk_knarcana", + "Untrained": "1", + "KeyAbility": "INT", + "ArmorCheckPenalty": "0", + "AllClassesCanUse": "1", + "Constant": "SKILL_KNOWLEDGE_ARCANA", + "HostileSkill": "0", + "HideFromLevelUp": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "skills", "modules", "rmv_removedskills.json"), `{ + "overrides": [ + { + "key": null, + "id": 3, + "Label": "Discipline_REMOVED", + "Constant": "****", + "AllClassesCanUse": "0", + "HideFromLevelUp": "1" + } + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "skills.2da")) + if err != nil { + t.Fatalf("read skills.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "Label\tName\tDescription\tIcon") || + !strings.Contains(text, "3\tDiscipline_REMOVED\t343\t347\tisk_discipline\t1\tSTR\t0\t0\t****\t****\t****\t0\t1\n") || + !strings.Contains(text, "25\tCraftarmorsmithing\t1002\t1003\tisk_x2carm\t0\tDEX\t1\t1\t****\t****\tSKILL_CRAFT_ARMORSMITHING\t0\t0\n") || + !strings.Contains(text, "28\tAthletics\t1000\t1001\tisk_athletics\t1\tSTR\t1\t1\t****\t****\tSKILL_ATHLETICS\t0\t0\n") || + !strings.Contains(text, "40\tKnowledgearcana\t1004\t****\tisk_knarcana\t1\tINT\t0\t1\t****\t****\tSKILL_KNOWLEDGE_ARCANA\t0\t0\n") { + t.Fatalf("unexpected skills.2da output:\n%s", text) + } +} + +func TestBuildCanonicalSkillsMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "skills")) + mkdirAll(t, filepath.Join(root, "reference", "data", "skills", "modules", "craft")) + mkdirAll(t, filepath.Join(root, "reference", "data", "skills", "modules", "knowledge")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{ + "skills:athletics.name": 1000, + "skills:athletics.description": 1001, + "skills:craft_armorsmithing.name": 1002, + "skills:craft_armorsmithing.description": 1003, + "skills:knowledge_arcana.name": 1004 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "skills", "skills.json"), `{ + "entries": { + "skills:athletics.name": {"text": "Athletics"}, + "skills:athletics.description": {"text": "Athletics description"}, + "skills:craft_armorsmithing.name": {"text": "Craft Armor Smithing"}, + "skills:craft_armorsmithing.description": {"text": "Craft armor description"}, + "skills:knowledge_arcana.name": {"text": "Knowledge Arcana"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +cols = ["Label", "Name", "Description", "Icon", "Untrained", "KeyAbility", "ArmorCheckPenalty", "AllClassesCanUse", "Category", "MaxCR", "Constant", "HostileSkill", "HideFromLevelUp"] +with open(os.path.join(out, "skills.2da"), "w", encoding="utf-8") as f: + def emit(row_id, values): + row = {c: "****" for c in cols} + row.update(values) + f.write(str(row_id) + "\t" + "\t".join(row[c] for c in cols) + "\n") + f.write("2DA V2.0\n\n") + f.write("\t".join(cols) + "\n") + emit(0, {"Label": "AnimalEmpathy", "Name": "269", "Description": "344", "Icon": "isk_aniemp", "Untrained": "0", "KeyAbility": "CHA", "ArmorCheckPenalty": "0", "AllClassesCanUse": "0", "Category": "****", "MaxCR": "1", "Constant": "SKILL_ANIMAL_EMPATHY", "HostileSkill": "1", "HideFromLevelUp": "0"}) + emit(1, {"Label": "Concentration", "Name": "270", "Description": "345", "Icon": "isk_concen", "Untrained": "1", "KeyAbility": "CON", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_CONCENTRATION", "HostileSkill": "0", "HideFromLevelUp": "0"}) + emit(2, {}) + emit(3, {"Label": "Discipline_REMOVED", "Name": "343", "Description": "347", "Icon": "isk_discipline", "Untrained": "1", "KeyAbility": "STR", "ArmorCheckPenalty": "0", "AllClassesCanUse": "0", "Category": "****", "MaxCR": "****", "Constant": "****", "HostileSkill": "0", "HideFromLevelUp": "1"}) + for row_id in range(4, 25): + emit(row_id, {}) + emit(25, {"Label": "Craftarmorsmithing", "Name": "1002", "Description": "1003", "Icon": "isk_x2carm", "Untrained": "0", "KeyAbility": "DEX", "ArmorCheckPenalty": "1", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_CRAFT_ARMORSMITHING", "HostileSkill": "0", "HideFromLevelUp": "0"}) + emit(26, {}) + emit(27, {}) + emit(28, {"Label": "Athletics", "Name": "1000", "Description": "1001", "Icon": "isk_athletics", "Untrained": "1", "KeyAbility": "STR", "ArmorCheckPenalty": "1", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_ATHLETICS", "HostileSkill": "0", "HideFromLevelUp": "0"}) + for row_id in range(29, 40): + emit(row_id, {}) + emit(40, {"Label": "Knowledgearcana", "Name": "1004", "Description": "****", "Icon": "isk_knarcana", "Untrained": "1", "KeyAbility": "INT", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_KNOWLEDGE_ARCANA", "HostileSkill": "0", "HideFromLevelUp": "0"}) +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "skills", "base.json"), `{ + "columns": ["Label", "Name", "Description", "Icon", "Untrained", "KeyAbility", "ArmorCheckPenalty", "AllClassesCanUse", "Category", "MaxCR", "Constant", "HostileSkill", "HideFromLevelUp"], + "rows": [ + {"key": "skills:animalempathy", "id": 0, "Label": "AnimalEmpathy", "Name": "269", "Description": "344", "Icon": "isk_aniemp", "Untrained": "0", "KeyAbility": "CHA", "ArmorCheckPenalty": "0", "AllClassesCanUse": "0", "Category": "****", "MaxCR": "1", "Constant": "SKILL_ANIMAL_EMPATHY", "HostileSkill": "1", "HideFromLevelUp": "0"}, + {"key": "skills:concentration", "id": 1, "Label": "Concentration", "Name": "270", "Description": "345", "Icon": "isk_concen", "Untrained": "1", "KeyAbility": "CON", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_CONCENTRATION", "HostileSkill": "0", "HideFromLevelUp": "0"}, + {"key": "skills:discipline", "id": 3, "Label": "Discipline", "Name": "343", "Description": "347", "Icon": "isk_discipline", "Untrained": "1", "KeyAbility": "STR", "ArmorCheckPenalty": "0", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_DISCIPLINE", "HostileSkill": "0", "HideFromLevelUp": "0"}, + {"key": "skills:craft_armorsmithing", "id": 25, "Label": "Tumble", "Name": "280", "Description": "356", "Icon": "isk_tumble", "Untrained": "1", "KeyAbility": "DEX", "ArmorCheckPenalty": "1", "AllClassesCanUse": "1", "Category": "****", "MaxCR": "****", "Constant": "SKILL_TUMBLE", "HostileSkill": "0", "HideFromLevelUp": "0"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "lock.json"), `{ + "skills:craft_armorsmithing": 25, + "skills:athletics": 28, + "skills:knowledge_arcana": 40 +}`+"\n") + for _, name := range []string{ + "add_disguise.json", + "add_linguistics.json", + "add_perception.json", + "add_scriptcraft.json", + "add_sensemotive.json", + "add_stealth.json", + "add_survival.json", + "add_userope.json", + "ovr_acrobatics.json", + "ovr_animalhandling.json", + "ovr_appraise.json", + "ovr_concentration.json", + "ovr_disabledevice.json", + "ovr_heal.json", + "ovr_hiddenskills.json", + "ovr_influence.json", + "ovr_openlock.json", + "ovr_parry.json", + "ovr_searchtowis.json", + "ovr_sleightofhand.json", + "ovr_taunttointimidate.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", name), `{"overrides": []}`+"\n") + } + for _, name := range []string{ + "add_craftalchemy.json", + "add_craftcooking.json", + "add_craftjewelry.json", + "add_craftleatherworking.json", + "add_craftstonework.json", + "add_crafttextiles.json", + "ovr_crafttinkering.json", + "ovr_craftweaponsmithing.json", + "ovr_craftwoodworking.json", + } { + payload := `{"entries": {}}` + if strings.HasPrefix(name, "ovr_") { + payload = `{"overrides": []}` + } + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "craft", name), payload+"\n") + } + for _, name := range []string{ + "add_knowledgearchitecture.json", + "add_knowledgedungeoneering.json", + "add_knowledgegeography.json", + "add_knowledgehistory.json", + "add_knowledgelocal.json", + "add_knowledgenature.json", + "add_knowledgenobility.json", + "add_knowledgeplanar.json", + "add_knowledgereligion.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "knowledge", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "add_athletics.json"), `{ + "entries": { + "skills:athletics": { + "Label": "Athletics", + "Name": {"tlk": "skills:athletics.name"}, + "Description": {"tlk": "skills:athletics.description"}, + "Icon": "isk_athletics", + "Untrained": "1", + "KeyAbility": "STR", + "ArmorCheckPenalty": "1", + "AllClassesCanUse": "1", + "Constant": "SKILL_ATHLETICS", + "HostileSkill": "0", + "HideFromLevelUp": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "craft", "ovr_craftarmorsmithing.json"), `{ + "overrides": [ + { + "key": "skills:craft_armorsmithing", + "id": 25, + "Label": "Craftarmorsmithing", + "Name": {"tlk": "skills:craft_armorsmithing.name"}, + "Description": {"tlk": "skills:craft_armorsmithing.description"}, + "Icon": "isk_x2carm", + "Untrained": "0", + "Constant": "SKILL_CRAFT_ARMORSMITHING", + "meta": {"wiki": {"status": "new"}}, + "HideFromLevelUp": "0" + } + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "knowledge", "add_knowledgearcana.json"), `{ + "entries": { + "skills:knowledge_arcana": { + "Label": "Knowledgearcana", + "Name": {"tlk": "skills:knowledge_arcana.name"}, + "Icon": "isk_knarcana", + "Untrained": "1", + "KeyAbility": "INT", + "ArmorCheckPenalty": "0", + "AllClassesCanUse": "1", + "Constant": "SKILL_KNOWLEDGE_ARCANA", + "HostileSkill": "0", + "HideFromLevelUp": "0" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "skills", "modules", "rmv_removedskills.json"), `{ + "overrides": [ + { + "key": null, + "id": 3, + "Label": "Discipline_REMOVED", + "Constant": "****", + "AllClassesCanUse": "0", + "HideFromLevelUp": "1" + } + ] +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "skills.2da")) + if err != nil { + t.Fatalf("read native skills.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "skills.2da")) + if err != nil { + t.Fatalf("read reference skills.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("skills output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestNormalizeProjectImportsLegacySpells(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "spells")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "feat")) + mkdirAll(t, filepath.Join(root, "reference", "data", "spells", "modules", "bardicmusic")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{ + "spells:specialattacks.name": 525, + "feat:bardfascinate.name": 700, + "feat:bardfascinate.description": 701, + "feat:bardfascinate.alt": 702 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "spells", "specialattacks.json"), `{ + "entries": { + "spells:specialattacks.name": {"text": "Special Attacks"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "feat", "bardfascinate.json"), `{ + "entries": { + "feat:bardfascinate.name": {"text": "Fascinate"}, + "feat:bardfascinate.description": {"text": "Fascinate description"}, + "feat:bardfascinate.alt": {"text": "Alt message"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "base.json"), `{ + "columns": ["Label", "Name", "IconResRef", "School", "Range", "VS", "MetaMagic", "TargetType", "ImpactScript", "Bard", "Cleric", "Druid", "Paladin", "Ranger", "Wiz_Sorc", "Innate", "ConjTime", "ConjAnim", "ConjHeadVisual", "ConjHandVisual", "ConjGrndVisual", "ConjSoundVFX", "ConjSoundMale", "ConjSoundFemale", "CastAnim", "CastTime", "CastHeadVisual", "CastHandVisual", "CastGrndVisual", "CastSound", "Proj", "ProjModel", "ProjType", "ProjSpwnPoint", "ProjSound", "ProjOrientation", "ImmunityType", "ItemImmunity", "SubRadSpell1", "SubRadSpell2", "SubRadSpell3", "SubRadSpell4", "SubRadSpell5", "Category", "Master", "UserType", "SpellDesc", "UseConcentration", "SpontaneouslyCast", "AltMessage", "HostileSetting", "FeatID", "Counter1", "Counter2", "HasProjectile", "TargetShape", "TargetSizeX", "TargetSizeY", "TargetFlags", "SubRadSpell6", "SubRadSpell7", "SubRadSpell8"], + "rows": [ + {"key": "spells:blessweapon", "id": 7, "Label": "Bless_Weapon", "Name": "123", "Category": "8"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "lock.json"), `{ + "spells:specialattacks": 840, + "spells:disarm": 841, + "spells:bardfascinate": 849 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "specialattacks.json"), `{ + "entries": { + "spells:specialattacks": { + "Label": "SpecialAttacks", + "Name": {"tlk": "spells:specialattacks.name"}, + "Category": "22", + "FeatID": {"id": "feat:specialattacks"}, + "SubRadSpell1": {"id": "spells:disarm"} + }, + "spells:disarm": { + "Label": "Disarm", + "Name": {"tlk": "spells:disarm.name"}, + "FeatID": {"id": "feat:disarm"}, + "Master": {"id": "spells:specialattacks"}, + "Category": {"ref": "spells:specialattacks", "field": "Category"} + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "ovr_fixduplicates.json"), `{ + "overrides": [ + {"key": null, "id": 7, "Label": "Bless_Weapon_OLD"} + ] +}`+"\n") + for _, name := range []string{ + "inspirecompetence.json", + "inspirecourage.json", + "inspiregreatness.json", + "inspireheroics.json", + "songoffreedom.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "bardicmusic", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "bardicmusic", "fascinate.json"), `{ + "entries": { + "spells:bardfascinate": { + "Label": "Bard_Fascinate", + "Name": {"tlk": "feat:bardfascinate.name"}, + "SpellDesc": {"tlk": "feat:bardfascinate.description"}, + "FeatID": {"id": "feat:bardfascinate"}, + "AltMessage": {"tlk": "feat:bardfascinate.alt"}, + "Category": "2" + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := NormalizeProject(testProject(root)) + if err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + if result.UpdatedFiles < 10 { + t.Fatalf("expected spells files to be imported, got %#v", result) + } + for _, path := range []string{ + filepath.Join(root, "topdata", "data", "spells", "base.json"), + filepath.Join(root, "topdata", "data", "spells", "lock.json"), + filepath.Join(root, "topdata", "data", "spells", "modules", "specialattacks.json"), + filepath.Join(root, "topdata", "data", "spells", "modules", "ovr_fixduplicates.json"), + filepath.Join(root, "topdata", "data", "spells", "modules", "bardicmusic", "fascinate.json"), + } { + if _, err := os.Stat(path); err != nil { + t.Fatalf("expected imported spells path %s: %v", path, err) + } + } + baseRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "spells", "base.json")) + if err != nil { + t.Fatalf("read spells base: %v", err) + } + if !strings.Contains(string(baseRaw), `"output": "spells.2da"`) { + t.Fatalf("expected imported spells output name, got:\n%s", string(baseRaw)) + } + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "spells", "lock.json")) + if err != nil { + t.Fatalf("read spells lock: %v", err) + } + if !strings.Contains(string(lockRaw), `"spells:bardfascinate": 849`) || !strings.Contains(string(lockRaw), `"spells:specialattacks": 840`) { + t.Fatalf("expected imported spells lock ids, got:\n%s", string(lockRaw)) + } + moduleRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "spells", "modules", "bardicmusic", "fascinate.json")) + if err != nil { + t.Fatalf("read spells bardicmusic module: %v", err) + } + if !strings.Contains(string(moduleRaw), `"text": "Fascinate"`) || !strings.Contains(string(moduleRaw), `"text": "Alt message"`) { + t.Fatalf("expected normalized inline TLK payloads in bardicmusic module, got:\n%s", string(moduleRaw)) + } +} + +func TestBuildSupportsCanonicalSpells(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "spells", "modules", "bardicmusic")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL"], + "rows": [ + {"id": 1000, "key": "feat:specialattacks", "LABEL": "Special Attacks"}, + {"id": 1001, "key": "feat:disarm", "LABEL": "Disarm"}, + {"id": 1002, "key": "feat:bardfascinate", "LABEL": "Fascinate"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{"feat:specialattacks":1000,"feat:disarm":1001,"feat:bardfascinate":1002}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "base.json"), `{ + "output": "spells.2da", + "columns": ["Label", "Name", "IconResRef", "School", "Range", "VS", "MetaMagic", "TargetType", "ImpactScript", "Bard", "Cleric", "Druid", "Paladin", "Ranger", "Wiz_Sorc", "Innate", "ConjTime", "ConjAnim", "ConjHeadVisual", "ConjHandVisual", "ConjGrndVisual", "ConjSoundVFX", "ConjSoundMale", "ConjSoundFemale", "CastAnim", "CastTime", "CastHeadVisual", "CastHandVisual", "CastGrndVisual", "CastSound", "Proj", "ProjModel", "ProjType", "ProjSpwnPoint", "ProjSound", "ProjOrientation", "ImmunityType", "ItemImmunity", "SubRadSpell1", "SubRadSpell2", "SubRadSpell3", "SubRadSpell4", "SubRadSpell5", "Category", "Master", "UserType", "SpellDesc", "UseConcentration", "SpontaneouslyCast", "AltMessage", "HostileSetting", "FeatID", "Counter1", "Counter2", "HasProjectile", "TargetShape", "TargetSizeX", "TargetSizeY", "TargetFlags", "SubRadSpell6", "SubRadSpell7", "SubRadSpell8"], + "rows": [ + {"key": "spells:blessweapon", "id": 7, "Label": "Bless_Weapon", "Name": "123", "Category": "8"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "lock.json"), `{ + "spells:specialattacks": 840, + "spells:disarm": 841, + "spells:bardfascinate": 849 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "modules", "specialattacks.json"), `{ + "entries": { + "spells:specialattacks": { + "Label": "SpecialAttacks", + "Name": "500", + "Category": "22", + "FeatID": {"id": "feat:specialattacks"}, + "SubRadSpell1": {"id": "spells:disarm"} + }, + "spells:disarm": { + "Label": "Disarm", + "Name": "501", + "FeatID": {"id": "feat:disarm"}, + "Master": {"id": "spells:specialattacks"}, + "Category": {"ref": "spells:specialattacks", "field": "Category"} + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "modules", "ovr_fixduplicates.json"), `{ + "overrides": [ + {"key": null, "id": 7, "Label": "Bless_Weapon_OLD"} + ] +}`+"\n") + for _, name := range []string{ + "inspirecompetence.json", + "inspirecourage.json", + "inspiregreatness.json", + "inspireheroics.json", + "songoffreedom.json", + } { + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "modules", "bardicmusic", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "topdata", "data", "spells", "modules", "bardicmusic", "fascinate.json"), `{ + "entries": { + "spells:bardfascinate": { + "Label": "Bard_Fascinate", + "Name": "600", + "SpellDesc": "601", + "FeatID": {"id": "feat:bardfascinate"}, + "AltMessage": "602", + "Category": "2" + } + } +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "spells.2da")) + if err != nil { + t.Fatalf("read spells.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "Label\tName\tIconResRef") || + !strings.Contains(text, "7\tBless_Weapon_OLD\t123") || + !strings.Contains(text, "840\tSpecialAttacks\t500") || + !strings.Contains(text, "\t841\t") || + !strings.Contains(text, "\t22\t") || + !strings.Contains(text, "\t1000\t") || + !strings.Contains(text, "841\tDisarm\t501") || + !strings.Contains(text, "\t840\t") || + !strings.Contains(text, "\t1001\t") || + !strings.Contains(text, "849\tBard_Fascinate\t600") || + !strings.Contains(text, "\t601\t") || + !strings.Contains(text, "\t602\t") || + !strings.Contains(text, "\t1002\t") { + t.Fatalf("unexpected spells.2da output:\n%s", text) + } +} + +func TestBuildCanonicalSpellsMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "spells")) + mkdirAll(t, filepath.Join(root, "topdata", "tlk", "modules", "feat")) + mkdirAll(t, filepath.Join(root, "reference", "data", "spells", "modules", "bardicmusic")) + mkdirAll(t, filepath.Join(root, "reference", "data", "feat")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "lock.json"), `{ + "spells:specialattacks.name": 525, + "spells:disarm.name": 526, + "feat:bardfascinate.name": 700, + "feat:bardfascinate.description": 701, + "feat:bardfascinate.alt": 702 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "spells", "specialattacks.json"), `{ + "entries": { + "spells:specialattacks.name": {"text": "Special Attacks"}, + "spells:disarm.name": {"text": "Disarm"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "tlk", "modules", "feat", "bardfascinate.json"), `{ + "entries": { + "feat:bardfascinate.name": {"text": "Fascinate"}, + "feat:bardfascinate.description": {"text": "Fascinate description"}, + "feat:bardfascinate.alt": {"text": "Alt message"} + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "spells.2da"), "w", encoding="utf-8") as f: + cols = ["Label", "Name", "IconResRef", "School", "Range", "VS", "MetaMagic", "TargetType", "ImpactScript", "Bard", "Cleric", "Druid", "Paladin", "Ranger", "Wiz_Sorc", "Innate", "ConjTime", "ConjAnim", "ConjHeadVisual", "ConjHandVisual", "ConjGrndVisual", "ConjSoundVFX", "ConjSoundMale", "ConjSoundFemale", "CastAnim", "CastTime", "CastHeadVisual", "CastHandVisual", "CastGrndVisual", "CastSound", "Proj", "ProjModel", "ProjType", "ProjSpwnPoint", "ProjSound", "ProjOrientation", "ImmunityType", "ItemImmunity", "SubRadSpell1", "SubRadSpell2", "SubRadSpell3", "SubRadSpell4", "SubRadSpell5", "Category", "Master", "UserType", "SpellDesc", "UseConcentration", "SpontaneouslyCast", "AltMessage", "HostileSetting", "FeatID", "Counter1", "Counter2", "HasProjectile", "TargetShape", "TargetSizeX", "TargetSizeY", "TargetFlags", "SubRadSpell6", "SubRadSpell7", "SubRadSpell8"] + def emit(row_id, values): + row = {c: "****" for c in cols} + row.update(values) + f.write(str(row_id) + "\t" + "\t".join(row[c] for c in cols) + "\n") + f.write("2DA V2.0\n\n") + f.write("\t".join(cols) + "\n") + for row_id in range(0, 7): + emit(row_id, {}) + emit(7, {"Label": "Bless_Weapon_OLD", "Name": "123", "Category": "8"}) + for row_id in range(8, 840): + emit(row_id, {}) + emit(840, {"Label": "SpecialAttacks", "Name": "16777741", "SubRadSpell1": "841", "Category": "22", "FeatID": "1000"}) + emit(841, {"Label": "Disarm", "Name": "16777742", "Category": "22", "Master": "840", "FeatID": "1001"}) + for row_id in range(842, 849): + emit(row_id, {}) + emit(849, {"Label": "Bard_Fascinate", "Name": "16777916", "Category": "2", "SpellDesc": "16777917", "AltMessage": "16777918", "FeatID": "1002"}) +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL"], + "rows": [ + {"id": 1000, "key": "feat:specialattacks", "LABEL": "Special Attacks"}, + {"id": 1001, "key": "feat:disarm", "LABEL": "Disarm"}, + {"id": 1002, "key": "feat:bardfascinate", "LABEL": "Fascinate"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "feat", "lock.json"), `{"feat:specialattacks":1000,"feat:disarm":1001,"feat:bardfascinate":1002}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "base.json"), `{ + "columns": ["Label", "Name", "IconResRef", "School", "Range", "VS", "MetaMagic", "TargetType", "ImpactScript", "Bard", "Cleric", "Druid", "Paladin", "Ranger", "Wiz_Sorc", "Innate", "ConjTime", "ConjAnim", "ConjHeadVisual", "ConjHandVisual", "ConjGrndVisual", "ConjSoundVFX", "ConjSoundMale", "ConjSoundFemale", "CastAnim", "CastTime", "CastHeadVisual", "CastHandVisual", "CastGrndVisual", "CastSound", "Proj", "ProjModel", "ProjType", "ProjSpwnPoint", "ProjSound", "ProjOrientation", "ImmunityType", "ItemImmunity", "SubRadSpell1", "SubRadSpell2", "SubRadSpell3", "SubRadSpell4", "SubRadSpell5", "Category", "Master", "UserType", "SpellDesc", "UseConcentration", "SpontaneouslyCast", "AltMessage", "HostileSetting", "FeatID", "Counter1", "Counter2", "HasProjectile", "TargetShape", "TargetSizeX", "TargetSizeY", "TargetFlags", "SubRadSpell6", "SubRadSpell7", "SubRadSpell8"], + "rows": [ + {"key": "spells:blessweapon", "id": 7, "Label": "Bless_Weapon", "Name": "123", "Category": "8"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "lock.json"), `{ + "spells:specialattacks": 840, + "spells:disarm": 841, + "spells:bardfascinate": 849 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "specialattacks.json"), `{ + "entries": { + "spells:specialattacks": { + "Label": "SpecialAttacks", + "Name": {"tlk": "spells:specialattacks.name"}, + "Category": "22", + "UserType": "3", + "FeatID": {"id": "feat:specialattacks"}, + "SubRadSpell1": {"id": "spells:disarm"} + }, + "spells:disarm": { + "Label": "Disarm", + "Name": {"tlk": "spells:disarm.name"}, + "FeatID": {"id": "feat:disarm"}, + "Master": {"id": "spells:specialattacks"}, + "Category": {"ref": "spells:specialattacks", "field": "Category"}, + "UserType": {"ref": "spells:specialattacks", "field": "UserType"} + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "ovr_fixduplicates.json"), `{ + "overrides": [ + {"key": null, "id": 7, "Label": "Bless_Weapon_OLD"} + ] +}`+"\n") + for _, name := range []string{ + "inspirecompetence.json", + "inspirecourage.json", + "inspiregreatness.json", + "inspireheroics.json", + "songoffreedom.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "bardicmusic", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "reference", "data", "spells", "modules", "bardicmusic", "fascinate.json"), `{ + "entries": { + "spells:bardfascinate": { + "Label": "Bard_Fascinate", + "Name": {"tlk": "feat:bardfascinate.name"}, + "SpellDesc": {"tlk": "feat:bardfascinate.description"}, + "FeatID": {"id": "feat:bardfascinate"}, + "AltMessage": {"tlk": "feat:bardfascinate.alt"}, + "Category": "2" + } + } +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "spells.2da")) + if err != nil { + t.Fatalf("read native spells.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "spells.2da")) + if err != nil { + t.Fatalf("read reference spells.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("spells output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestBuildSupportsCanonicalPlaceables(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "placeables", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "base.json"), `{ + "output": "placeables.2da", + "columns": ["Label", "StrRef", "ModelName", "LightColor", "LightOffsetX", "LightOffsetY", "LightOffsetZ", "SoundAppType", "ShadowSize", "BodyBag", "LowGore", "Reflection", "Static"], + "rows": [ + {"key": "placeables:armoire", "id": 0, "Label": "Armoire", "StrRef": "5645", "ModelName": "PLC_A01", "SoundAppType": "13", "ShadowSize": "1", "BodyBag": "0", "Static": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "lock.json"), `{ + "placeables:armoire": 0, + "placeable:tmp_crappile01": 16500 +}`+"\n") + for _, name := range []string{ + "add_ccfeb2019plcs.json", + "add_cepcarpets.json", + "add_cepfloors.json", + "add_cepnwn2library.json", + "add_nwic.json", + "add_ori.json", + "add_sic11.json", + "add_tapr.json", + "add_tdfloors.json", + "add_undecals.json", + "add_witcher1.json", + "add_witcher2.json", + } { + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "modules", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "modules", "add_avernostragarbage.json"), `{ + "entries": { + "placeable:tmp_crappile01": { + "Label": "Decoration: Pile 1 (Avernostra)", + "ModelName": "tmp_crappile01", + "Static": 1 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "modules", "ovr_vanillaplcsorts.json"), `{ + "overrides": [ + {"key": "placeables:armoire", "id": 0, "Label": "Furniture: Armoire (Bioware)", "StrRef": "****"} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "placeables.2da")) + if err != nil { + t.Fatalf("read placeables.2da: %v", err) + } + if !strings.Contains(string(got), "Label\tStrRef\tModelName\tLightColor\tLightOffsetX\tLightOffsetY\tLightOffsetZ\tSoundAppType\tShadowSize\tBodyBag\tLowGore\tReflection\tStatic\n") || + !strings.Contains(string(got), "0\t\"Furniture: Armoire (Bioware)\"\t****\tPLC_A01") || + !strings.Contains(string(got), "\t13\t1\t0\t****\t****\t1\n") || + !strings.Contains(string(got), "16500\t\"Decoration: Pile 1 (Avernostra)\"\t****\ttmp_crappile01") { + t.Fatalf("unexpected placeables.2da output:\n%s", string(got)) + } +} + +func TestBuildCanonicalPlaceablesMatchesReference(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "placeables", "modules")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), `#!/usr/bin/env python3 +import os, sys +out = None +tlk = None +args = sys.argv[1:] +for i, arg in enumerate(args): + if arg == "--out": + out = args[i + 1] + if arg == "--tlk-dir": + tlk = args[i + 1] +os.makedirs(out, exist_ok=True) +os.makedirs(tlk, exist_ok=True) +with open(os.path.join(out, "placeables.2da"), "w", encoding="utf-8") as f: + f.write("2DA V2.0\n\n") + f.write("Label\tStrRef\tModelName\tLightColor\tLightOffsetX\tLightOffsetY\tLightOffsetZ\tSoundAppType\tShadowSize\tBodyBag\tLowGore\tReflection\tStatic\n") + f.write("0\t\"Furniture: Armoire (Bioware)\"\t****\tPLC_A01\t****\t****\t****\t****\t13\t1\t0\t****\t****\t1\n") + for row_id in range(1, 16500): + f.write(f"{row_id}\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\t****\n") + f.write("16500\t\"Decoration: Pile 1 (Avernostra)\"\t****\ttmp_crappile01\t****\t****\t****\t****\t****\t****\t****\t****\t1\n") +with open(os.path.join(tlk, "sow_tlk.tlk"), "wb") as f: + f.write(b"TLK") +`) + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "base.json"), `{ + "columns": ["Label", "StrRef", "ModelName", "LightColor", "LightOffsetX", "LightOffsetY", "LightOffsetZ", "SoundAppType", "ShadowSize", "BodyBag", "LowGore", "Reflection", "Static"], + "rows": [ + {"key": "placeables:armoire", "id": 0, "Label": "Armoire", "StrRef": "5645", "ModelName": "PLC_A01", "SoundAppType": "13", "ShadowSize": "1", "BodyBag": "0", "Static": "1"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "lock.json"), `{ + "placeables:armoire": 0, + "placeable:tmp_crappile01": 16500 +}`+"\n") + for _, name := range []string{ + "add_ccfeb2019plcs.json", + "add_cepcarpets.json", + "add_cepfloors.json", + "add_cepnwn2library.json", + "add_nwic.json", + "add_ori.json", + "add_sic11.json", + "add_tapr.json", + "add_tdfloors.json", + "add_undecals.json", + "add_witcher1.json", + "add_witcher2.json", + } { + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "modules", name), `{"entries": {}}`+"\n") + } + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "modules", "add_avernostragarbage.json"), `{ + "entries": { + "placeable:tmp_crappile01": { + "Label": "Decoration: Pile 1 (Avernostra)", + "ModelName": "tmp_crappile01", + "Static": 1 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "placeables", "modules", "ovr_vanillaplcsorts.json"), `{ + "overrides": [ + {"key": "placeables:armoire", "id": 0, "Label": "Furniture: Armoire (Bioware)", "StrRef": "****"} + ] +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + nativeResult, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + referenceResult, err := BuildReference(testProject(root), nil) + if err != nil { + t.Fatalf("BuildReference failed: %v", err) + } + nativeBytes, err := os.ReadFile(filepath.Join(nativeResult.Output2DADir, "placeables.2da")) + if err != nil { + t.Fatalf("read native placeables.2da: %v", err) + } + referenceBytes, err := os.ReadFile(filepath.Join(referenceResult.Output2DADir, "placeables.2da")) + if err != nil { + t.Fatalf("read reference placeables.2da: %v", err) + } + if string(nativeBytes) != string(referenceBytes) { + t.Fatalf("placeables output mismatch\nnative:\n%s\nreference:\n%s", string(nativeBytes), string(referenceBytes)) + } +} + +func TestBuildSupportsCanonicalPortraitsFromDatasetAndMetadata(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "portraits", "modules")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "placeables")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "portraits", "base.json"), `{ + "output": "portraits.2da", + "columns": ["BaseResRef", "Sex", "Race", "InanimateType", "Plot", "LowGore"], + "rows": [ + {"id": 0, "BaseResRef": "****", "Sex": 4} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "portraits", "lock.json"), `{"portraits:auto:nw2book1_":16004,"shemsuheru:id_1513":16003}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "portraits", "modules", "add_cotblreaver.json"), `{ + "entries": { + "shemsuheru:id_1513": { + "BaseResRef": "cotbl_", + "Sex": 4, + "Race": 15, + "Plot": 0 + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "placeables", "base.json"), `{ + "output": "placeables.2da", + "columns": ["Label"], + "rows": [ + {"id": 1, "Label": "Bookshelf", "meta": {"portrait": {"resref": "nw2book1_", "sex": 4, "inanimate_type": 4}}} + ] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + result, err := BuildNative(testProject(root), nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + got, err := os.ReadFile(filepath.Join(result.Output2DADir, "portraits.2da")) + if err != nil { + t.Fatalf("read portraits.2da: %v", err) + } + text := string(got) + if !strings.Contains(text, "BaseResRef\tSex\tRace\tInanimateType\tPlot\tLowGore\n") || + !strings.Contains(text, "0\t****\t4\t****\t****\t****\t****\n") || + !strings.Contains(text, "16003\tcotbl_\t4\t15\t****\t0\t****\n") || + !strings.Contains(text, "16004\tnw2book1_\t4\t****\t4\t****\t****\n") { + t.Fatalf("unexpected portraits.2da output:\n%s", string(got)) + } +} + +func TestNormalizeProjectImportsRacialtypesRegistry(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data")) + mkdirAll(t, filepath.Join(root, "reference", "data", "racialtypes", "core", "modules")) + mkdirAll(t, filepath.Join(root, "reference", "data", "racialtypes", "feats")) + mkdirAll(t, filepath.Join(root, "reference", "tlk", "modules", "racialtypes")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + writeFile(t, filepath.Join(root, "reference", "data", "racialtypes", "core", "base.json"), `{ + "output": "racialtypes.2da", + "columns": ["Label", "Name", "Appearance", "ToolsetDefaultClass", "FeatsTable", "Description"], + "rows": [ + {"id": 6, "Label": "Human", "Name": "34", "Appearance": "0", "ToolsetDefaultClass": "4", "FeatsTable": "RACE_FEAT_HUMAN", "Description": "****"}, + {"id": 7, "Label": "Beast", "Name": "527", "Appearance": "****", "ToolsetDefaultClass": "****", "FeatsTable": "****", "Description": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "racialtypes", "core", "lock.json"), `{ + "racialtypes:human": 6, + "racialtypes:tiefling": 31 +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "racialtypes", "core", "modules", "ovr_human.json"), `{ + "overrides": [ + {"key": "racialtypes:human", "id": 6, "Label": "Human", "Description": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "racialtypes", "core", "modules", "tiefling.json"), `{ + "entries": { + "racialtypes:tiefling": { + "Label": "Tiefling", + "Appearance": {"id": "appearance:human"}, + "ToolsetDefaultClass": {"id": "classes:rogue"}, + "FeatsTable": {"table": "racialtypes/feats:tiefling"}, + "Description": {"tlk": "racialtypes:tiefling.description"} + } + } +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "data", "racialtypes", "feats", "tiefling.json"), `{ + "key": "racialtypes/feats:tiefling", + "output": "race_feat_tief.2da", + "columns": ["FeatLabel", "FeatIndex"], + "rows": [ + {"FeatLabel": "Darkvision", "FeatIndex": {"id": "feat:darkvision"}} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "lock.json"), `{"racialtypes:tiefling.description": 100}`+"\n") + writeFile(t, filepath.Join(root, "reference", "tlk", "modules", "racialtypes", "tiefling.json"), `{ + "entries": { + "racialtypes:tiefling": { + "description": {"text": "Tiefling description"} + } + } +}`+"\n") + + if _, err := NormalizeProject(testProject(root)); err != nil { + t.Fatalf("NormalizeProject failed: %v", err) + } + + baseRowsRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "racialtypes", "registry", "base.json")) + if err != nil { + t.Fatalf("read base.json: %v", err) + } + baseText := string(baseRowsRaw) + if !strings.Contains(baseText, `"Label": "Beast"`) || !strings.Contains(baseText, `"key": "racialtypes:beast"`) { + t.Fatalf("expected keyed static core row scaffold, got:\n%s", baseText) + } + + lockRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "racialtypes", "registry", "lock.json")) + if err != nil { + t.Fatalf("read lock.json: %v", err) + } + if !strings.Contains(string(lockRaw), `"racialtypes:human": 6`) || !strings.Contains(string(lockRaw), `"racialtypes:tiefling": 31`) || !strings.Contains(string(lockRaw), `"racialtypes:beast": 7`) { + t.Fatalf("expected preserved lock ids, got:\n%s", string(lockRaw)) + } + + tieflingRaw, err := os.ReadFile(filepath.Join(root, "topdata", "data", "racialtypes", "registry", "races", "tiefling.json")) + if err != nil { + t.Fatalf("read tiefling.json: %v", err) + } + tieflingText := string(tieflingRaw) + if !strings.Contains(tieflingText, `"feat_output": "race_feat_tief.2da"`) || + !strings.Contains(tieflingText, `"text": "Tiefling description"`) || + !strings.Contains(tieflingText, `"FeatLabel": "Darkvision"`) { + t.Fatalf("unexpected tiefling registry row:\n%s", tieflingText) + } +} + +func TestBuildSupportsRacialtypesRegistryWithSnapshotClassIDs(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "appearance")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "feat")) + mkdirAll(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "races")) + mkdirAll(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "classes", "core")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "appearance", "base.json"), `{ + "output": "appearance.2da", + "columns": ["LABEL"], + "rows": [ + {"id": 0, "key": "appearance:human", "LABEL": "Human"}, + {"id": 1, "key": "appearance:elf", "LABEL": "Elf"}, + {"id": 2, "key": "appearance:halfogre", "LABEL": "Half-Ogre"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "appearance", "lock.json"), `{ + "appearance:human": 0, + "appearance:elf": 1, + "appearance:halfogre": 2 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "base.json"), `{ + "output": "feat.2da", + "columns": ["LABEL"], + "rows": [] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "feat", "lock.json"), `{ + "feat:darkvision": 77 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "migration_snapshot", "data", "classes", "core", "lock.json"), `{ + "classes:fighter": 4, + "classes:rogue": 8 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "base.json"), `{ + "columns": ["Label", "Appearance", "ToolsetDefaultClass", "FeatsTable"], + "rows": [ + {"id": 7, "key": "racialtypes:beast", "Label": "Beast", "Appearance": "****", "ToolsetDefaultClass": "****", "FeatsTable": "****"} + ] +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "lock.json"), `{ + "racialtypes:beast": 7, + "racialtypes:human": 6, + "racialtypes:tiefling": 31 +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "races", "human.json"), `{ + "key": "racialtypes:human", + "core": { + "Label": "Human", + "Appearance": {"id": "appearance:human"}, + "ToolsetDefaultClass": {"id": "classes:fighter"}, + "FeatsTable": "RACE_FEAT_HUMAN" + } +}`+"\n") + writeFile(t, filepath.Join(root, "topdata", "data", "racialtypes", "registry", "races", "tiefling.json"), `{ + "key": "racialtypes:tiefling", + "core": { + "Label": "Tiefling", + "Appearance": {"id": "appearance:human"}, + "ToolsetDefaultClass": {"id": "classes:rogue"} + }, + "feat_output": "race_feat_tief.2da", + "feats": [ + {"FeatLabel": "Darkvision", "FeatIndex": {"id": "feat:darkvision"}} + ] +}`+"\n") + + p := testProject(root) + p.Config.TopData.ReferenceBuilder = "" + result, err := BuildNative(p, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + coreBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "racialtypes.2da")) + if err != nil { + t.Fatalf("read racialtypes.2da: %v", err) + } + coreText := string(coreBytes) + if !strings.Contains(coreText, "Label\tAppearance\tToolsetDefaultClass\tFeatsTable\n") || + !strings.Contains(coreText, "6\tHuman\t0\t4\tRACE_FEAT_HUMAN\n") || + !strings.Contains(coreText, "31\tTiefling\t0\t8\trace_feat_tief\n") { + t.Fatalf("unexpected racialtypes.2da output:\n%s", coreText) + } + + featBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "race_feat_tief.2da")) + if err != nil { + t.Fatalf("read race_feat_tief.2da: %v", err) + } + if !strings.Contains(string(featBytes), "FeatLabel\tFeatIndex\n0\tDarkvision\t77\n") { + t.Fatalf("unexpected race_feat_tief.2da output:\n%s", string(featBytes)) + } +} + +func TestScanAutogeneratedParts(t *testing.T) { + root := t.TempDir() + mkdirAll(t, filepath.Join(root, "assets", "part", "belt")) + mkdirAll(t, filepath.Join(root, "assets", "part", "chest")) + writeFile(t, filepath.Join(root, "assets", "part", "belt", "pfa0_belt018.mdl"), "") + writeFile(t, filepath.Join(root, "assets", "part", "belt", "pfa0_belt171.mdl"), "") + writeFile(t, filepath.Join(root, "assets", "part", "belt", "pfa0_belt172.mdl"), "") + writeFile(t, filepath.Join(root, "assets", "part", "chest", "pfa0_chest081.mdl"), "") + writeFile(t, filepath.Join(root, "assets", "part", "chest", "pfa0_chest095.mdl"), "") + + result, err := scanAutogeneratedParts(filepath.Join(root, "assets")) + if err != nil { + t.Fatalf("scanAutogeneratedParts failed: %v", err) + } + + beltIDs, ok := result["belt"] + if !ok { + t.Fatal("expected belt category in result") + } + if len(beltIDs) != 3 { + t.Fatalf("expected 3 belt IDs, got %d", len(beltIDs)) + } + for _, id := range []int{18, 171, 172} { + if _, exists := beltIDs[id]; !exists { + t.Errorf("expected belt ID %d to exist", id) + } + } + + chestIDs, ok := result["chest"] + if !ok { + t.Fatal("expected chest category in result") + } + if len(chestIDs) != 2 { + t.Fatalf("expected 2 chest IDs, got %d", len(chestIDs)) + } + for _, id := range []int{81, 95} { + if _, exists := chestIDs[id]; !exists { + t.Errorf("expected chest ID %d to exist", id) + } + } +} + +func TestScanAutogeneratedPartsSkipsNonNumericSuffix(t *testing.T) { + root := t.TempDir() + mkdirAll(t, filepath.Join(root, "assets", "part", "belt")) + writeFile(t, filepath.Join(root, "assets", "part", "belt", "pfa0_beltABC.mdl"), "") + writeFile(t, filepath.Join(root, "assets", "part", "belt", "pfa0_belt_test.mdl"), "") + + result, err := scanAutogeneratedParts(root) + if err != nil { + t.Fatalf("scanAutogeneratedParts failed: %v", err) + } + + beltIDs, ok := result["belt"] + if !ok { + t.Fatal("expected belt category in result") + } + if len(beltIDs) != 0 { + t.Fatalf("expected 0 belt IDs (non-numeric suffixes), got %d", len(beltIDs)) + } +} + +func TestScanAutogeneratedPartsReturnsNilForEmptyPath(t *testing.T) { + result, err := scanAutogeneratedParts("") + if err != nil { + t.Fatalf("scanAutogeneratedParts failed: %v", err) + } + if result != nil { + t.Fatalf("expected nil result for empty path, got %v", result) + } +} + +func TestAugmentWithAutogeneratedParts(t *testing.T) { + collected := []nativeCollectedDataset{ + { + Dataset: nativeDataset{ + Name: "parts/belt", + OutputName: "parts_belt.2da", + }, + Columns: []string{"COSTMODIFIER", "ACBONUS"}, + Rows: []map[string]any{ + {"id": 0, "COSTMODIFIER": "1", "ACBONUS": "0.25"}, + }, + LockData: map[string]int{}, + }, + } + + autogenerated := map[string]map[int]struct{}{ + "belt": {18: {}, 171: {}, 172: {}}, + "chest": {81: {}}, + } + + result := augmentWithAutogeneratedParts(collected, autogenerated) + + if len(result) != 1 { + t.Fatalf("expected 1 dataset, got %d", len(result)) + } + beltDataset := result[0] + if len(beltDataset.Rows) != 4 { + t.Fatalf("expected 4 rows (1 existing + 3 autogenerated), got %d", len(beltDataset.Rows)) + } + + rowByID := make(map[int]map[string]any) + for _, row := range beltDataset.Rows { + id := row["id"].(int) + rowByID[id] = row + } + + if cost, ok := rowByID[0]["COSTMODIFIER"].(string); !ok || cost != "1" { + t.Errorf("expected existing row 0 to keep COSTMODIFIER=1, got %v", rowByID[0]["COSTMODIFIER"]) + } + + for _, id := range []int{18, 171, 172} { + row := rowByID[id] + if cost, ok := row["COSTMODIFIER"].(string); !ok || cost != "0" { + t.Errorf("expected autogenerated row %d to have COSTMODIFIER=0, got %v", id, row["COSTMODIFIER"]) + } + if ac, ok := row["ACBONUS"].(string); !ok || ac != "0.00" { + t.Errorf("expected autogenerated row %d to have ACBONUS=0.00, got %v", id, row["ACBONUS"]) + } + } +} + +func TestAugmentWithAutogeneratedPartsRespectsExistingIDs(t *testing.T) { + collected := []nativeCollectedDataset{ + { + Dataset: nativeDataset{ + Name: "parts/belt", + OutputName: "parts_belt.2da", + }, + Columns: []string{"COSTMODIFIER", "ACBONUS"}, + Rows: []map[string]any{ + {"id": 18, "COSTMODIFIER": "5", "ACBONUS": "1.00"}, + }, + LockData: map[string]int{}, + }, + } + + autogenerated := map[string]map[int]struct{}{ + "belt": {18: {}, 171: {}}, + } + + result := augmentWithAutogeneratedParts(collected, autogenerated) + + beltDataset := result[0] + if len(beltDataset.Rows) != 2 { + t.Fatalf("expected 2 rows (1 existing with ID 18, 1 autogenerated with ID 171), got %d", len(beltDataset.Rows)) + } + + rowByID := make(map[int]map[string]any) + for _, row := range beltDataset.Rows { + id := row["id"].(int) + rowByID[id] = row + } + + if cost, ok := rowByID[18]["COSTMODIFIER"].(string); !ok || cost != "5" { + t.Errorf("expected existing row 18 to keep COSTMODIFIER=5, got %v", rowByID[18]["COSTMODIFIER"]) + } + + if cost, ok := rowByID[171]["COSTMODIFIER"].(string); !ok || cost != "0" { + t.Errorf("expected autogenerated row 171 to have COSTMODIFIER=0, got %v", rowByID[171]["COSTMODIFIER"]) + } +} + +func TestAugmentWithAutogeneratedPartsSortsRows(t *testing.T) { + collected := []nativeCollectedDataset{ + { + Dataset: nativeDataset{ + Name: "parts/belt", + OutputName: "parts_belt.2da", + }, + Columns: []string{"COSTMODIFIER"}, + Rows: []map[string]any{ + {"id": 100, "COSTMODIFIER": "1"}, + }, + LockData: map[string]int{}, + }, + } + + autogenerated := map[string]map[int]struct{}{ + "belt": {18: {}, 171: {}}, + } + + result := augmentWithAutogeneratedParts(collected, autogenerated) + + beltDataset := result[0] + if len(beltDataset.Rows) != 3 { + t.Fatalf("expected 3 rows, got %d", len(beltDataset.Rows)) + } + + for i, row := range beltDataset.Rows { + expectedID := []int{18, 100, 171}[i] + if id := row["id"].(int); id != expectedID { + t.Errorf("expected row at index %d to have ID %d, got %d", i, expectedID, id) + } + } +} + +func TestBuildNativeWithAutogeneratedParts(t *testing.T) { + root := testProjectRoot(t) + mkdirAll(t, filepath.Join(root, "topdata", "data", "parts")) + writeFile(t, filepath.Join(root, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(root, "topdata", "data", "parts", "belt.json"), `{ + "output": "parts_belt.2da", + "columns": ["COSTMODIFIER", "ACBONUS"], + "rows": [{"id": 0, "COSTMODIFIER": "1", "ACBONUS": "0.25"}] +}`+"\n") + mkdirAll(t, filepath.Join(root, "reference")) + writeFile(t, filepath.Join(root, "reference", "build.py"), "print('ok')\n") + + mkdirAll(t, filepath.Join(root, "assets", "part", "belt")) + writeFile(t, filepath.Join(root, "assets", "part", "belt", "pfa0_belt018.mdl"), "") + writeFile(t, filepath.Join(root, "assets", "part", "belt", "pfa0_belt171.mdl"), "") + + proj := testProject(root) + proj.Config.TopData.Assets = filepath.Join(root, "assets") + + result, err := BuildNative(proj, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + partsBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "parts_belt.2da")) + if err != nil { + t.Fatalf("read parts_belt.2da: %v", err) + } + partsText := string(partsBytes) + + if !strings.Contains(partsText, "0\t1\t0.25") { + t.Errorf("expected existing row 0 to be preserved, got:\n%s", partsText) + } + if !strings.Contains(partsText, "18\t0\t0.00") { + t.Errorf("expected autogenerated row 18, got:\n%s", partsText) + } + if !strings.Contains(partsText, "171\t0\t0.00") { + t.Errorf("expected autogenerated row 171, got:\n%s", partsText) + } +} + +func TestBuildNativeWithSiblingAssetsRepo(t *testing.T) { + root := t.TempDir() + projRoot := filepath.Join(root, "project") + mkdirAll(t, filepath.Join(projRoot, "src")) + mkdirAll(t, filepath.Join(projRoot, "assets")) + mkdirAll(t, filepath.Join(projRoot, "build")) + mkdirAll(t, filepath.Join(projRoot, "topdata", "data", "parts")) + writeFile(t, filepath.Join(projRoot, "topdata", "base_dialog.json"), "{}\n") + writeFile(t, filepath.Join(projRoot, "topdata", "data", "parts", "belt.json"), `{ + "output": "parts_belt.2da", + "columns": ["COSTMODIFIER", "ACBONUS"], + "rows": [{"id": 0, "COSTMODIFIER": "1", "ACBONUS": "0.25"}] +}`+"\n") + mkdirAll(t, filepath.Join(projRoot, "reference")) + writeFile(t, filepath.Join(projRoot, "reference", "build.py"), "print('ok')\n") + + siblingAssets := filepath.Join(root, "sow-assets") + mkdirAll(t, filepath.Join(siblingAssets, "assets", "part", "belt")) + writeFile(t, filepath.Join(siblingAssets, "assets", "part", "belt", "pfa0_belt018.mdl"), "") + writeFile(t, filepath.Join(siblingAssets, "assets", "part", "belt", "pfa0_belt171.mdl"), "") + + proj := &project.Project{ + Root: projRoot, + Config: project.Config{ + Module: project.ModuleConfig{Name: "Test", ResRef: "test"}, + Paths: project.PathConfig{Source: "src", Assets: "assets", Build: "build"}, + TopData: project.TopDataConfig{ + Source: "topdata", + Build: "build/topdata", + Assets: "sow-assets", + }, + }, + } + + result, err := BuildNative(proj, nil) + if err != nil { + t.Fatalf("BuildNative failed: %v", err) + } + + partsBytes, err := os.ReadFile(filepath.Join(result.Output2DADir, "parts_belt.2da")) + if err != nil { + t.Fatalf("read parts_belt.2da: %v", err) + } + partsText := string(partsBytes) + + if !strings.Contains(partsText, "0\t1\t0.25") { + t.Errorf("expected existing row 0 to be preserved, got:\n%s", partsText) + } + if !strings.Contains(partsText, "18\t0\t0.00") { + t.Errorf("expected autogenerated row 18 from sibling repo, got:\n%s", partsText) + } + if !strings.Contains(partsText, "171\t0\t0.00") { + t.Errorf("expected autogenerated row 171 from sibling repo, got:\n%s", partsText) + } +} + +func diagnosticsText(diags []Diagnostic) string { + lines := make([]string, 0, len(diags)) + for _, diag := range diags { + lines = append(lines, diag.Message) + } + return strings.Join(lines, "\n") +} + +func testProjectRoot(t *testing.T) string { + t.Helper() + root := t.TempDir() + mkdirAll(t, filepath.Join(root, "src")) + mkdirAll(t, filepath.Join(root, "assets")) + mkdirAll(t, filepath.Join(root, "build")) + return root +} + +func testProject(root string) *project.Project { + return &project.Project{ + Root: root, + Config: project.Config{ + Module: project.ModuleConfig{Name: "Test", ResRef: "test"}, + Paths: project.PathConfig{Source: "src", Assets: "assets", Build: "build"}, + TopData: project.TopDataConfig{ + Source: "topdata", + Build: "build/topdata", + ReferenceBuilder: "reference", + }, + }, + } +} + func mkdirAll(t *testing.T, path string) { t.Helper() if err := os.MkdirAll(path, 0o755); err != nil { diff --git a/internal/topdata/vfx_persistent_migrate.go b/internal/topdata/vfx_persistent_migrate.go new file mode 100644 index 0000000..3057fe7 --- /dev/null +++ b/internal/topdata/vfx_persistent_migrate.go @@ -0,0 +1,198 @@ +package topdata + +import ( + "os" + "path/filepath" + "strings" +) + +func importLegacyVFXPersistent(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + if strings.TrimSpace(referenceBuilderDir) == "" { + return 0, nil + } + + legacyDir := filepath.Join(referenceBuilderDir, "data", "vfx_persistent") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "vfx_persistent") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + targetModulePath := filepath.Join(targetModulesDir, "freeformaoes.json") + if fileExists(targetBasePath) && fileExists(targetLockPath) && fileExists(targetModulePath) { + baseObj, baseErr := loadJSONObject(targetBasePath) + lockObj, lockErr := loadJSONObject(targetLockPath) + if baseErr == nil && lockErr == nil && vfxPersistentImportComplete(baseObj, lockObj) { + legacyModulePaths, err := collectJSONRelativePaths(filepath.Join(legacyDir, "modules")) + if err == nil { + targetModulePaths, err := collectJSONRelativePaths(targetModulesDir) + if err == nil && equalStringSlices(legacyModulePaths, targetModulePaths) { + return 0, nil + } + } + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + lockObj, err := synthesizeVFXPersistentKeys(baseObj) + if err != nil { + return 0, err + } + legacyLockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + for key, value := range legacyLockObj { + lockObj[key] = value + } + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + updated := 0 + for _, write := range []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + } { + changed, err := writeJSONObjectIfChanged(write.path, write.obj) + if err != nil { + return 0, err + } + if changed { + updated++ + } + } + + moduleRelPaths, err := collectJSONRelativePaths(filepath.Join(legacyDir, "modules")) + if err != nil { + return 0, err + } + for _, relPath := range moduleRelPaths { + moduleObj, err := loadJSONObject(filepath.Join(legacyDir, "modules", filepath.FromSlash(relPath))) + if err != nil { + return 0, err + } + targetPath := filepath.Join(targetModulesDir, filepath.FromSlash(relPath)) + if err := os.MkdirAll(filepath.Dir(targetPath), 0o755); err != nil { + return 0, err + } + changed, err := writeJSONObjectIfChanged(targetPath, moduleObj) + if err != nil { + return 0, err + } + if changed { + updated++ + } + } + + targetModulePaths, err := collectJSONRelativePaths(targetModulesDir) + if err != nil { + return 0, err + } + legacyModules := make(map[string]struct{}, len(moduleRelPaths)) + for _, relPath := range moduleRelPaths { + legacyModules[relPath] = struct{}{} + } + for _, relPath := range targetModulePaths { + if _, ok := legacyModules[relPath]; ok { + continue + } + if err := os.Remove(filepath.Join(targetModulesDir, filepath.FromSlash(relPath))); err != nil && !os.IsNotExist(err) { + return 0, err + } + updated++ + } + + return updated, nil +} + +func vfxPersistentImportComplete(baseObj, lockObj map[string]any) bool { + if !vfxPersistentRowsHaveKeys(baseObj) { + return false + } + expected := map[string]int{ + "vfx_persistent:blankradius5": 47, + "vfx_persistent:blankradius10": 48, + "vfx_persistent:blankradius15": 49, + "vfx_persistent:blankradius20": 50, + "vfx_persistent:blankradius25": 51, + "vfx_persistent:blankradius30": 52, + } + for key, want := range expected { + raw, ok := lockObj[key] + if !ok { + return false + } + got, err := asInt(raw) + if err != nil || got != want { + return false + } + } + return true +} + +func synthesizeVFXPersistentKeys(baseObj map[string]any) (map[string]any, error) { + rawRows, ok := baseObj["rows"].([]any) + if !ok { + return map[string]any{}, nil + } + lockObj := map[string]any{} + for _, raw := range rawRows { + row, ok := raw.(map[string]any) + if !ok { + continue + } + label, _ := row["LABEL"].(string) + if label == "" { + continue + } + key := "vfx_persistent:" + strings.ToLower(label) + row["key"] = key + if rawID, ok := row["id"]; ok { + lockObj[key] = rawID + } + } + return lockObj, nil +} + +func vfxPersistentRowsHaveKeys(baseObj map[string]any) bool { + rawRows, ok := baseObj["rows"].([]any) + if !ok { + return false + } + for _, raw := range rawRows { + row, ok := raw.(map[string]any) + if !ok { + return false + } + key, _ := row["key"].(string) + if key == "" { + return false + } + } + return true +} + +func equalStringSlices(left, right []string) bool { + if len(left) != len(right) { + return false + } + for i := range left { + if left[i] != right[i] { + return false + } + } + return true +} diff --git a/internal/topdata/visualeffects_migrate.go b/internal/topdata/visualeffects_migrate.go new file mode 100644 index 0000000..36a29aa --- /dev/null +++ b/internal/topdata/visualeffects_migrate.go @@ -0,0 +1,6 @@ +package topdata + +func importLegacyVisualeffects(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + return importLegacyDatasetMirror(referenceBuilderDir, dataDir, "visualeffects", "visualeffects.2da", nil) +} diff --git a/internal/topdata/wingmodel_migrate.go b/internal/topdata/wingmodel_migrate.go new file mode 100644 index 0000000..395d1bc --- /dev/null +++ b/internal/topdata/wingmodel_migrate.go @@ -0,0 +1,86 @@ +package topdata + +import ( + "encoding/json" + "os" + "path/filepath" +) + +func importLegacyWingmodel(referenceBuilderDir, dataDir string, legacyTLK *legacyTLKData) (int, error) { + _ = legacyTLK + + legacyDir := filepath.Join(referenceBuilderDir, "data", "wingmodel") + if _, err := os.Stat(legacyDir); err != nil { + if os.IsNotExist(err) { + return 0, nil + } + return 0, err + } + + targetDir := filepath.Join(dataDir, "wingmodel") + targetBasePath := filepath.Join(targetDir, "base.json") + targetLockPath := filepath.Join(targetDir, "lock.json") + targetModulesDir := filepath.Join(targetDir, "modules") + targetModulePaths := []string{ + filepath.Join(targetModulesDir, "add.json"), + filepath.Join(targetModulesDir, "ovr_wingprefixes.json"), + } + if fileExists(targetBasePath) && fileExists(targetLockPath) { + allModulesPresent := true + for _, path := range targetModulePaths { + if !fileExists(path) { + allModulesPresent = false + break + } + } + if allModulesPresent { + return 0, nil + } + } + + baseObj, err := loadJSONObject(filepath.Join(legacyDir, "base.json")) + if err != nil { + return 0, err + } + baseObj["output"] = "wingmodel.2da" + + lockObj, err := loadJSONObject(filepath.Join(legacyDir, "lock.json")) + if err != nil { + return 0, err + } + + moduleNames := []string{"add.json", "ovr_wingprefixes.json"} + moduleObjs := make([]map[string]any, 0, len(moduleNames)) + for _, name := range moduleNames { + obj, err := loadJSONObject(filepath.Join(legacyDir, "modules", name)) + if err != nil { + return 0, err + } + moduleObjs = append(moduleObjs, obj) + } + + if err := os.MkdirAll(targetModulesDir, 0o755); err != nil { + return 0, err + } + + writes := []struct { + path string + obj map[string]any + }{ + {path: targetBasePath, obj: baseObj}, + {path: targetLockPath, obj: lockObj}, + {path: targetModulePaths[0], obj: moduleObjs[0]}, + {path: targetModulePaths[1], obj: moduleObjs[1]}, + } + for _, write := range writes { + raw, err := json.MarshalIndent(write.obj, "", " ") + if err != nil { + return 0, err + } + raw = append(raw, '\n') + if err := os.WriteFile(write.path, raw, 0o644); err != nil { + return 0, err + } + } + return len(writes), nil +}